继续优化项目结构进一步改进文档更新与约束

This commit is contained in:
Yuuuu 2026-03-15 18:40:00 +08:00
parent 739e6947ea
commit 78f938791a
260 changed files with 641 additions and 1455 deletions

112
CLAUDE.md
View File

@ -34,8 +34,11 @@ AIProjectManger/
```text ```text
backend/ backend/
├── app/ ├── app/
│ ├── __init__.py # app 包入口(根目录轻量化后保留)
│ ├── api/ # 路由层(含 endpoints) │ ├── api/ # 路由层(含 endpoints)
│ ├── core/ # 配置、日志、核心能力 │ ├── core/ # 配置、日志、核心能力
│ │ └── startup/ # 启动阶段拆分模块(db guard/outbox/probe/warmup)
│ ├── deps.py # 共享依赖导出(get_db/AsyncSessionLocal)
│ ├── dependencies/ # 鉴权/租户等依赖注入 │ ├── dependencies/ # 鉴权/租户等依赖注入
│ ├── middleware/ # 请求中间件(审计上下文注入等) │ ├── middleware/ # 请求中间件(审计上下文注入等)
│ ├── models/ # SQLAlchemy 模型 │ ├── models/ # SQLAlchemy 模型
@ -53,25 +56,27 @@ backend/
│ ├── 20260311_expand_user_workload_ratio_precision.py # user_workloads.workload_ratio 精度扩容(10,2) │ ├── 20260311_expand_user_workload_ratio_precision.py # user_workloads.workload_ratio 精度扩容(10,2)
│ └── 20260311_add_conversation_sessions_table.py # 飞书多轮会话上下文持久化表 │ └── 20260311_add_conversation_sessions_table.py # 飞书多轮会话上下文持久化表
├── scripts/ # 后端运维/数据修复脚本 ├── scripts/ # 后端运维/数据修复脚本
│ └── backfill_orphan_signal_links.py # 回填孤立 signal 的 project_signal_links │ ├── backfill_orphan_signal_links.py # 回填孤立 signal 的 project_signal_links
│ ├── dev/ # 开发辅助脚本(check_users/seed_all)
│ └── legacy/ # 历史脚本(仅保留兼容参考,不作为主流程)
├── requirements.txt # Python 依赖 ├── requirements.txt # Python 依赖
├── Dockerfile ├── Dockerfile
└── (tests 已移除) └── (tests 已移除)
``` ```
- 新增:`backend/app/api/llm_providers.py`(AI 管家 LLM provider preset 配置读取接口) - 新增:`backend/app/api/llm_providers.py`(AI 管家 LLM provider preset 配置读取接口)
- 新增:`backend/app/services/ai_agent_kernel.py`(双 Agent 共享决策内核:复杂度路由/执行门控/修正识别) - 新增:`backend/app/services/ai_pmo_kernel/ai_agent_kernel.py`(双 Agent 共享决策内核:复杂度路由/执行门控/修正识别)
- 新增:`backend/app/utils/timezone.py`(统一北京时间工具:`now_cn_aware/now_cn_naive`) - 新增:`backend/app/utils/timezone.py`(统一北京时间工具:`now_cn_aware/now_cn_naive`)
- 新增:`backend/app/utils/audited_write.py`(写接口审计上下文、caller 归一、北京时间格式化) - 新增:`backend/app/utils/audited_write.py`(写接口审计上下文、caller 归一、北京时间格式化)
- 新增:`backend/app/middleware/audit_context.py`(请求级 trace/interface/caller 注入) - 新增:`backend/app/middleware/audit_context.py`(请求级 trace/interface/caller 注入)
- 新增:`backend/app/api/audit.py`(审计查询接口:`GET /audit/operations`) - 新增:`backend/app/api/audit.py`(审计查询接口:`GET /audit/operations`)
- 新增:`backend/app/services/audit_query_service.py`(operation_logs 过滤与序列化) - 新增:`backend/app/services/audit_query_service/service.py`(operation_logs 过滤与序列化)
- 新增:`backend/app/services/signal_source_repair_service.py`(脏信号源回填服务) - 新增:`backend/app/services/signal_source_repair_service.py`(脏信号源回填服务)
- 新增:`backend/alembic/versions/20260311_shift_all_timestamps_to_beijing.py`(全库历史时间 +8h,数据库默认时区切到 Asia/Shanghai) - 新增:`backend/alembic/versions/20260311_shift_all_timestamps_to_beijing.py`(全库历史时间 +8h,数据库默认时区切到 Asia/Shanghai)
- 新增:`backend/alembic/versions/20260312_add_signal_planner_fields.py`(signals 增加 planner 状态字段与索引) - 新增:`backend/alembic/versions/20260312_add_signal_planner_fields.py`(signals 增加 planner 状态字段与索引)
- 新增:`backend/app/services/signal_strategic_analysis_service.py`(Signal Planner 写回收口) - 新增:`backend/app/services/signal_planner/signal_strategic_analysis_service.py`(Signal Planner 写回收口)
- 新增:`backend/app/services/feishu_outbox_service.py`(复用 reply_hash 的 outbox 入队收口) - 新增:`backend/app/services/feishu_outbox/service.py`(复用 reply_hash 的 outbox 入队收口)
- 新增:`backend/app/services/signal_planner_service.py`(Signal Planner 异步分析服务) - 新增:`backend/app/services/signal_planner_service.py`(Signal Planner 异步分析服务)
- 新增:`backend/app/services/model_routing_service.py`(函数级模型路由配置服务) - 新增:`backend/app/services/model_routing/service.py`(函数级模型路由配置服务)
- 新增:`backend/app/services/task_brief_service.py`(增量任务包中心服务) - 新增:`backend/app/services/task_brief_service.py`(增量任务包中心服务)
- 新增:`backend/app/services/model_context_bundle_service.py`(双模型上下文组包/能力汇总/消费验证服务) - 新增:`backend/app/services/model_context_bundle_service.py`(双模型上下文组包/能力汇总/消费验证服务)
- 新增:`backend/app/api/model_routing.py`(模型路由配置接口) - 新增:`backend/app/api/model_routing.py`(模型路由配置接口)
@ -84,42 +89,42 @@ backend/
- 更新:`backend/app/services/signal_source_orchestration_service.py`(信号源 onboarding 规划与 worker 执行失败均 fail-fast,不再回退 heuristic/fallback 摘要) - 更新:`backend/app/services/signal_source_orchestration_service.py`(信号源 onboarding 规划与 worker 执行失败均 fail-fast,不再回退 heuristic/fallback 摘要)
- 更新:`backend/app/services/project_knowledge_graph.py`(新增 `ai_model -> governance_policy -> interface` 治理图谱同步能力,增量任务新增 `model_guardrails` 阶段) - 更新:`backend/app/services/project_knowledge_graph.py`(新增 `ai_model -> governance_policy -> interface` 治理图谱同步能力,增量任务新增 `model_guardrails` 阶段)
- 移除:`backend/.env.example`(配置模板统一到根目录 `.env.example`) - 移除:`backend/.env.example`(配置模板统一到根目录 `.env.example`)
- 新增:`backend/app/services/project_command_utils.py`(项目创建标题/描述提取与归一化辅助) - 新增:`backend/app/utils/project_command_utils.py`(项目创建标题/描述提取与归一化辅助)
- 新增:`backend/app/services/ai_pmo_intent_routing.py`(AI PMO 意图/路由常量与解析器收口,统一 `family.action` 路由映射) - 新增:`backend/app/services/ai_pmo_intent_routing.py`(AI PMO 意图/路由常量与解析器收口,统一 `family.action` 路由映射)
- 新增:`backend/app/services/ai_pmo_workflow_runtime.py`(AI PMO `ContextAssembler` + `WorkflowRegistry/WorkflowHandler` 运行时骨架) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_workflow_runtime.py`(AI PMO `ContextAssembler` + `WorkflowRegistry/WorkflowHandler` 运行时骨架)
- 新增:`backend/app/services/ai_pmo_decision_runtime.py`(AI PMO 决策脑层:`Strategic/Tactical/Simulation/ExecutionPolicy/DecisionEngine`) - 新增:`backend/app/services/ai_pmo_decision_runtime.py`(AI PMO 决策脑层:`Strategic/Tactical/Simulation/ExecutionPolicy/DecisionEngine`)
- 新增:`backend/app/services/ai_pmo_reply_renderer.py`(AI PMO 回执渲染出口 `ReplyRenderer`) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_reply_renderer.py`(AI PMO 回执渲染出口 `ReplyRenderer`)
- 新增:`backend/app/services/ai_pmo_typed_executor.py`(AI PMO typed 执行层组合入口) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_typed_executor.py`(AI PMO typed 执行层组合入口)
- 新增:`backend/app/services/ai_pmo_typed_executor_common.py`(TypedExecutor 共享常量/依赖) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_typed_executor_common.py`(TypedExecutor 共享常量/依赖)
- 新增:`backend/app/services/ai_pmo_typed_executor_mixins_parse.py`(TypedExecutor 解析与批量分析逻辑) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_typed_executor_mixins_parse.py`(TypedExecutor 解析与批量分析逻辑)
- 新增:`backend/app/services/ai_pmo_typed_executor_mixins_discovery.py`(TypedExecutor discover 候选上下文逻辑) - 新增:`backend/app/services/ai_pmo_typed_executor_mixins_discovery.py`(TypedExecutor discover 候选上下文逻辑)
- 新增:`backend/app/services/ai_pmo_typed_executor_mixins_execute.py`(TypedExecutor execute/create/source-onboard 落库逻辑) - 新增:`backend/app/services/ai_pmo_typed_executor_mixins_execute.py`(TypedExecutor execute/create/source-onboard 落库逻辑)
- 新增:`backend/app/services/ai_pmo_kernel_runtime.py`(AI PMO kernel 组合入口) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_runtime.py`(AI PMO kernel 组合入口)
- 新增:`backend/app/services/ai_pmo_kernel_common.py`(Kernel 共享常量/依赖) - 新增:`backend/app/services/ai_pmo_kernel_common.py`(Kernel 共享常量/依赖)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_ingress.py`(Kernel ingress 组合入口) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_ingress.py`(Kernel ingress 组合入口)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_ingress_flow.py`(Kernel 入站主流程编排) - 新增:`backend/app/services/ai_pmo_kernel_mixins_ingress_flow.py`(Kernel 入站主流程编排)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_ingress_storage.py`(Kernel 入站事件/工作项写入) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_ingress_storage.py`(Kernel 入站事件/工作项写入)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_ingress_render.py`(Kernel 入站结果组装与输出辅助) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_ingress_render.py`(Kernel 入站结果组装与输出辅助)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_world_model.py`(Kernel world-model 组合入口) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_world_model.py`(Kernel world-model 组合入口)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_world_model_core.py`(Kernel world-model 核心构建与缓存) - 新增:`backend/app/services/ai_pmo_kernel_mixins_world_model_core.py`(Kernel world-model 核心构建与缓存)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_world_model_session.py`(Kernel 会话继承与会话态维护) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_world_model_session.py`(Kernel 会话继承与会话态维护)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_world_model_aggregates.py`(Kernel 组合摘要构建器) - 新增:`backend/app/services/ai_pmo_kernel_mixins_world_model_aggregates.py`(Kernel 组合摘要构建器)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_intent.py`(Kernel intent 组合入口) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_intent.py`(Kernel intent 组合入口)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_intent_rules.py`(Kernel 规则意图与槽位守卫) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_intent_rules.py`(Kernel 规则意图与槽位守卫)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_intent_llm.py`(Kernel LLM 意图识别与仲裁) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_intent_llm.py`(Kernel LLM 意图识别与仲裁)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_intent_resolve.py`(Kernel 最终意图解析入口) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_intent_resolve.py`(Kernel 最终意图解析入口)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_followup.py`(Kernel followup 组合入口) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_followup.py`(Kernel followup 组合入口)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_followup_records.py`(followup 决策/计划/回执写入) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_followup_records.py`(followup 决策/计划/回执写入)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_followup_routing.py`(followup 候选定位与恢复分发) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_followup_routing.py`(followup 候选定位与恢复分发)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_followup_project_signal.py`(project_signal followup 组合入口) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_followup_project_signal.py`(project_signal followup 组合入口)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_followup_project_signal_actions.py`(project_signal commit/refresh/cancel 动作执行) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_followup_project_signal_actions.py`(project_signal commit/refresh/cancel 动作执行)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_followup_project_signal_resume.py`(project_signal 目标工作项恢复闭环) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_followup_project_signal_resume.py`(project_signal 目标工作项恢复闭环)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_followup_verification.py`(followup 执行校验与工具函数) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_followup_verification.py`(followup 执行校验与工具函数)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_closure.py`(Kernel closure 组合入口) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_closure.py`(Kernel closure 组合入口)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_closure_helpers.py`(Kernel 闭环通用归一化工具) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_closure_helpers.py`(Kernel 闭环通用归一化工具)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_closure_data.py`(Kernel 闭环历史上下文回放) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_closure_data.py`(Kernel 闭环历史上下文回放)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_closure_payload.py`(Kernel 闭环语义与来源上下文组装) - 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_closure_payload.py`(Kernel 闭环语义与来源上下文组装)
- 更新:`backend/app/services/ai_pmo_kernel_service.py`(兼容入口层,仅导出 `AIPMOKernelService`) - 移除:`backend/app/services/ai_pmo_kernel_service.py`(顶层兼容壳清理,统一改为 `backend/app/services/ai_pmo_kernel/` 子包)
- 新增:`backend/app/services/feishu_signal_pipeline/`(飞书信号管道按职责拆分的服务包,所有子文件 <= 300 行) - 新增:`backend/app/services/feishu_signal_pipeline/`(飞书信号管道按职责拆分的服务包,所有子文件 <= 300 行)
- 新增:`backend/app/services/feishu_signal_pipeline/service.py`(组合入口,按 mixin 聚合能力) - 新增:`backend/app/services/feishu_signal_pipeline/service.py`(组合入口,按 mixin 聚合能力)
- 新增:`backend/app/services/feishu_signal_pipeline/shared_core.py`、`shared_schema_utils.py`(共享常量/正则/Schema/工具函数拆分) - 新增:`backend/app/services/feishu_signal_pipeline/shared_core.py`、`shared_schema_utils.py`(共享常量/正则/Schema/工具函数拆分)
@ -151,11 +156,42 @@ backend/
- 新增:`backend/app/api/signals_api/`(signals 路由拆分为 list/create、ingest/fetch、feedback 子模块) - 新增:`backend/app/api/signals_api/`(signals 路由拆分为 list/create、ingest/fetch、feedback 子模块)
- 新增:`backend/app/api/wecom_api/`(wecom 路由拆分为 config/webhook/messaging 子模块) - 新增:`backend/app/api/wecom_api/`(wecom 路由拆分为 config/webhook/messaging 子模块)
- 新增:`backend/app/api/endpoints/skill_api/`(人员能力图谱路由拆分为 tags/bindings/workload/recommend 子模块) - 新增:`backend/app/api/endpoints/skill_api/`(人员能力图谱路由拆分为 tags/bindings/workload/recommend 子模块)
- 新增:`backend/app/api/ai_logs_utils.py`、`backend/app/api/signal_sources_models.py`、`backend/app/api/signal_sources_utils.py`(API 共享序列化/Schema/项目解析工具) - 更新:`backend/app/api/ai_logs.py`、`backend/app/api/ai_logs_utils.py` → `backend/app/api/ai_logs_api/routes.py`、`backend/app/api/ai_logs_api/helpers.py`(AI 日志 API 收敛到独立子包)
- 更新:`backend/app/api/signal_sources.py`、`backend/app/api/signal_sources_models.py`、`backend/app/api/signal_sources_utils.py` → `backend/app/api/signal_sources_api/routes.py`、`backend/app/api/signal_sources_api/schemas.py`、`backend/app/api/signal_sources_api/helpers.py`(信号源 API 收敛到独立子包)
- 更新:`backend/app/api/skill_tags.py`、`backend/app/api/skill_tags_contracts.py` → `backend/app/api/skill_tags_api/routes.py`、`backend/app/api/skill_tags_api/contracts.py`(技能标签 API 收敛到独立子包)
- 更新:`backend/app/api/router.py`、`backend/app/api/__init__.py`(直接引用 `*_api` 子模块路由,移除顶层兼容壳依赖)
- 移除:`backend/app/api/ai_pmo.py`、`backend/app/api/ai_steward.py`、`backend/app/api/model_capability.py`、`backend/app/api/projects.py`、`backend/app/api/rag.py`、`backend/app/api/sstc.py`、`backend/app/api/users.py`、`backend/app/api/feishu.py`、`backend/app/api/signals.py`、`backend/app/api/wecom.py`(顶层兼容壳清理)
- 更新:`backend/check_users.py`、`backend/seed_all.py`、`backend/init_db.py` → `backend/scripts/dev/check_users.py`、`backend/scripts/dev/seed_all.py`、`backend/scripts/legacy/init_db.py`(backend 根目录散落脚本归档)
- 新增:`backend/app/config/operation_catalog_core/`(operation catalog 按模型/构造器/领域条目拆分) - 新增:`backend/app/config/operation_catalog_core/`(operation catalog 按模型/构造器/领域条目拆分)
- 新增:`backend/app/dispatcher_rules.py`、`backend/app/events_models.py`、`backend/app/seed_projects_helpers.py`(规则/事件模型/seed helper 拆分) - 更新:`backend/app/dispatcher.py`、`backend/app/dispatcher_rules.py`(未被引用,按废弃文件移除)
- 新增:`backend/app/main_db_guard.py`、`backend/app/main_feishu_outbox.py`、`backend/app/main_warmup.py`、`backend/app/main_model_probe.py`(main 启动职责拆分) - 更新:`backend/app/seed_projects.py`、`backend/app/seed_projects_helpers.py` → `backend/app/utils/seed_projects.py`、`backend/app/utils/seed_projects_helpers.py`(示例数据初始化脚本归并到 utils)
- 更新:`backend/app/database.py`、`backend/app/events.py`、`backend/app/events_models.py`、`backend/app/websocket.py` → `backend/app/core/database.py`、`backend/app/core/events.py`、`backend/app/core/events_models.py`、`backend/app/core/websocket.py`(核心基础设施归并到 core)
- 更新:`backend/app/main_db_guard.py`、`backend/app/main_feishu_outbox.py`、`backend/app/main_warmup.py`、`backend/app/main_model_probe.py` → `backend/app/core/startup/`(启动阶段职责归并)
- 更新:`backend/app/state.py`(无引用,按废弃文件移除)
- 新增:`backend/app/__init__.py`、`backend/app/deps.py`(根目录仅保留 `__init__.py / main.py / deps.py`)
- 更新:`backend/app/services/` 顶层兼容壳批量清理(如 `ai_service.py/llm.py/scheduler_center.py/signal_capture.py/...`),统一改为直接引用对应子包(`ai_service_core/llm_service/scheduler_center_core/signal_capture_service/...`)
- 更新:移除 `backend/app/services/alignment_orchestrator.py` 空文件(无引用)
- 新增:`backend/app/services/ai_pmo_kernel_world_model_aggregates/`、`backend/app/services/ai_pmo_kernel_world_model_core/`、`backend/app/services/ai_pmo_kernel_common_core/`(kernel world-model/common 拆分) - 新增:`backend/app/services/ai_pmo_kernel_world_model_aggregates/`、`backend/app/services/ai_pmo_kernel_world_model_core/`、`backend/app/services/ai_pmo_kernel_common_core/`(kernel world-model/common 拆分)
- 更新:`backend/app/services/ai_pmo_kernel_runtime.py`、`backend/app/services/ai_agent_kernel.py`、`backend/app/services/ai_pmo_domain_workflow.py` 及 `backend/app/services/ai_pmo_kernel_mixins_*.py` → `backend/app/services/ai_pmo_kernel/`(AI PMO kernel 子包化,清理 services 根目录散落文件)
- 更新:`backend/app/services/ai_orchestration_run_service.py` → `backend/app/services/ai_orchestration_run/service.py`(编排运行账本服务子包化)
- 更新:`backend/app/services/ai_pmo_reply_renderer.py`、`backend/app/services/ai_pmo_review_service.py`、`backend/app/services/ai_pmo_typed_executor.py`、`backend/app/services/ai_pmo_typed_executor_common.py`、`backend/app/services/ai_pmo_typed_executor_mixins_parse.py`、`backend/app/services/ai_pmo_workflow_runtime.py` → `backend/app/services/ai_pmo_kernel/`(AI PMO 执行与回执运行时收敛到 kernel 子包)
- 更新:`backend/app/services/cost_optimization_service.py`、`backend/app/services/model_lifecycle_service.py` → `backend/app/services/model_capability/`(模型能力相关服务收敛)
- 更新:`backend/app/services/signal_strategic_analysis_service.py` → `backend/app/services/signal_planner/signal_strategic_analysis_service.py`(Signal Planner 分析写回服务归并)
- 移除:`backend/app/services/llm_client.py`(全仓库无引用,按废弃文件清理)
- 更新:`backend/app/services/analyzer.py`、`backend/app/services/fetcher.py` → `backend/app/services/signal_capture_service/impact_analyzer.py`、`backend/app/services/signal_capture_service/external_fetcher.py`(信号接入分析/抓取能力归并)
- 更新:`backend/app/services/plane.py` → `backend/app/services/integration_core/plane_service.py`(Plane 兼容服务归并到 integration_core)
- 更新:`backend/app/services/lark.py` → `backend/app/services/integration_core/lark_service.py`(Lark 兼容服务归并到 integration_core)
- 更新:`backend/app/services/workload_alert_service.py` → `backend/app/services/workload/workload_alert_service.py`(负载告警服务归并到 workload 子包)
- 更新:`backend/app/services/task_persistence.py`(兼容壳移除,统一直接引用 `backend/app/services/task_persistence_core/`)
- 更新:`backend/app/services/project_member_service.py` → `backend/app/services/project_member/service.py`(项目成员分配服务子包化)
- 更新:`backend/app/services/recipe_service.py` → `backend/app/services/recipe/service.py`(食谱服务子包化)
- 更新:`backend/app/services/model_routing_service.py` → `backend/app/services/model_routing/service.py`(模型路由服务子包化)
- 更新:`backend/app/services/prompt_profile_service.py` → `backend/app/services/prompt_profile/service.py`(Prompt 画像服务子包化)
- 更新:`backend/app/services/feishu_outbox_service.py` → `backend/app/services/feishu_outbox/service.py`(飞书 outbox 服务子包化)
- 更新:`backend/app/services/wecom_integration.py` → `backend/app/services/wecom/service.py`(企业微信集成服务子包化)
- 更新:`backend/app/services/skill_score_service.py` → `backend/app/services/skill/skill_score_service.py`(技能评分服务归并到 skill 子包)
- 更新:`backend/app/services/auth.py`、`backend/app/services/audit_query_service.py`、`backend/app/services/notification_service.py`、`backend/app/services/operation_catalog_service.py`、`backend/app/services/operation_log_service.py` → `backend/app/services/*/service.py`(同名服务子包化,`services` 根目录不再保留 `.py` 文件)
- 更新:`backend/app/services/` 根目录 `.py` 已清零(全部收敛到子包),仅保留目录化服务结构
## 5. 前端结构(`frontend/`) ## 5. 前端结构(`frontend/`)
```text ```text
@ -299,7 +335,7 @@ uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
- 配置读取类接口:参考 `backend/app/api/llm_providers.py`(`GET /ai-steward/llm/providers`) - 配置读取类接口:参考 `backend/app/api/llm_providers.py`(`GET /ai-steward/llm/providers`)
- AI Steward 指挥规划接口已移除:`POST /ai-steward/command/dispatch` - AI Steward 指挥规划接口已移除:`POST /ai-steward/command/dispatch`
- 项目删除接口(`DELETE /projects/{project_id}`):参考 `backend/app/api/projects.py`,先清理强依赖外键、再置空弱依赖外键、最后删除主记录(单事务提交) - 项目删除接口(`DELETE /projects/{project_id}`):参考 `backend/app/api/projects.py`,先清理强依赖外键、再置空弱依赖外键、最后删除主记录(单事务提交)
- 项目成员分配接口(`PUT /projects/{project_id}/members`):参考 `backend/app/api/projects.py` + `backend/app/services/project_member_service.py`,要求显式传入 `member_user_ids` 并写入 `user_projects` - 项目成员分配接口(`PUT /projects/{project_id}/members`):参考 `backend/app/api/projects.py` + `backend/app/services/project_member/service.py`,要求显式传入 `member_user_ids` 并写入 `user_projects`
- SSTC 总览接口(`GET /projects/{project_id}/sstc/overview`):`workload_health` 返回成员明细 `members[]`(姓名/角色/负载比例/状态)用于头部卡片展示 - SSTC 总览接口(`GET /projects/{project_id}/sstc/overview`):`workload_health` 返回成员明细 `members[]`(姓名/角色/负载比例/状态)用于头部卡片展示
- AI PMO 审批接口(`POST /ai-pmo/work-items/{work_item_id}/decision`):显式 `approve/reject`,`reject` 必须落 `ignored`(失效)并同步 `decision_records.final_outcome` - AI PMO 审批接口(`POST /ai-pmo/work-items/{work_item_id}/decision`):显式 `approve/reject`,`reject` 必须落 `ignored`(失效)并同步 `decision_records.final_outcome`
- AI PMO 审批接口补充:`approve + waiting_manual + project_id` 走“快速返回 + 后台继续执行”,避免前端长时间阻塞 - AI PMO 审批接口补充:`approve + waiting_manual + project_id` 走“快速返回 + 后台继续执行”,避免前端长时间阻塞

2
backend/app/__init__.py Normal file
View File

@ -0,0 +1,2 @@
"""PMFlow app package."""

View File

@ -4,20 +4,20 @@ API 路由模块
按业务域拆分路由,便于维护与扩展。 按业务域拆分路由,便于维护与扩展。
""" """
from .signals import router as signals_router from .signals_api import router as signals_router
from .feedbacks import router as feedbacks_router from .feedbacks import router as feedbacks_router
from .experiments import router as experiments_router from .experiments import router as experiments_router
from .context import router as context_router from .context import router as context_router
from .tasks import router as tasks_router from .tasks import router as tasks_router
from .webhooks import router as webhooks_router from .webhooks import router as webhooks_router
from .auth import router as auth_router from .auth import router as auth_router
from .users import router as users_router from .users_api import router as users_router
from .endpoints.skill import router as skill_router from .endpoints.skill import router as skill_router
from .sstc import router as sstc_router from .sstc_api import router as sstc_router
from .ai_steward import router as ai_steward_router from .ai_steward_api import router as ai_steward_router
from .feishu import router as feishu_router from .feishu_api import router as feishu_router
from .wecom import router as wecom_router from .wecom_api import router as wecom_router
from .model_capability import router as model_capability_router from .model_capability_api import router as model_capability_router
from .budget import router as budget_router from .budget import router as budget_router
from .scheduler import router as scheduler_router from .scheduler import router as scheduler_router
from .notifications import router as notifications_router from .notifications import router as notifications_router
@ -26,7 +26,7 @@ from .llm_providers import router as llm_providers_router
from .prompt_profiles import router as prompt_profiles_router from .prompt_profiles import router as prompt_profiles_router
from .knowledge_graph import router as knowledge_graph_router from .knowledge_graph import router as knowledge_graph_router
from .operation_catalog import router as operation_catalog_router from .operation_catalog import router as operation_catalog_router
from .ai_pmo import router as ai_pmo_router from .ai_pmo_api import router as ai_pmo_router
__all__ = [ __all__ = [
"signals_router", "signals_router",

View File

@ -1,5 +1,5 @@
from __future__ import annotations from __future__ import annotations
from .rag_api import router from .routes import router
__all__ = ["router"] __all__ = ["router"]

View File

@ -7,7 +7,7 @@ from typing import Any, Optional
from sqlalchemy import and_, func, or_, select, union_all from sqlalchemy import and_, func, or_, select, union_all
from ..models import AIProcessingLog, FeishuItem, ProjectSignalLink, ProjectSuggestion, Signal, WorkItem from ...models import AIProcessingLog, FeishuItem, ProjectSignalLink, ProjectSuggestion, Signal, WorkItem
def normalize_bullets(value: Any) -> list[str]: def normalize_bullets(value: Any) -> list[str]:

View File

@ -9,11 +9,11 @@ from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy import and_, case, func, select from sqlalchemy import and_, case, func, select
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ..core.response import success_response from ...core.response import success_response
from ..database import get_db from ...core.database import get_db
from ..dependencies.auth import get_current_user from ...dependencies.auth import get_current_user
from ..models import AIProcessingLog, User from ...models import AIProcessingLog, User
from .ai_logs_utils import apply_project_filter, serialize_log_detail, serialize_log_row from .helpers import apply_project_filter, serialize_log_detail, serialize_log_row
router = APIRouter(prefix="/ai-logs", tags=["AI Logs"]) router = APIRouter(prefix="/ai-logs", tags=["AI Logs"])

View File

@ -1,5 +0,0 @@
from __future__ import annotations
from .ai_pmo_api import router
__all__ = ["router"]

View File

@ -12,12 +12,12 @@ from sqlalchemy.ext.asyncio import AsyncSession
from ...core.logging import get_logger from ...core.logging import get_logger
from ...core.response import success_response from ...core.response import success_response
from ...database import AsyncSessionLocal, get_db from ...core.database import AsyncSessionLocal, get_db
from ...dependencies.auth import get_current_user from ...dependencies.auth import get_current_user
from ...dependencies.tenant import get_tenant_id from ...dependencies.tenant import get_tenant_id
from ...models import DecisionRecord, IngestEvent, PlanBundle, PortfolioSnapshot, Project, ReplyReceipt, User, WorkItem from ...models import DecisionRecord, IngestEvent, PlanBundle, PortfolioSnapshot, Project, ReplyReceipt, User, WorkItem
from ...services.ai_pmo_cadence_service import AIPMOCadenceService from ...services.ai_pmo_cadence import AIPMOCadenceService
from ...services.ai_pmo_kernel_service import AIPMOKernelService from ...services.ai_pmo_kernel import AIPMOKernelService
router = APIRouter(prefix="/ai-pmo", tags=["AI PMO"]) router = APIRouter(prefix="/ai-pmo", tags=["AI PMO"])
logger = get_logger(__name__) logger = get_logger(__name__)

View File

@ -1,5 +0,0 @@
from __future__ import annotations
from .ai_steward_api import router
__all__ = ["router"]

View File

@ -78,7 +78,7 @@ async def analyze_blocker(
当开发在代码注释中提到「这个接口达不到效果」时, 当开发在代码注释中提到「这个接口达不到效果」时,
AI 自动触发分析,推荐替代方案或生成代码片段 AI 自动触发分析,推荐替代方案或生成代码片段
""" """
from ..services.llm import LLMService from ...services.llm_service import LLMService
service = get_ai_steward_service(db) service = get_ai_steward_service(db)

View File

@ -181,8 +181,8 @@ async def sync_external_signal(
- GitHub commits/PRs - GitHub commits/PRs
- 浏览器标签页 - 浏览器标签页
""" """
from ..models import Signal from ...models import Signal
from ..services.ai_steward import get_ai_steward_service from ...services.ai_steward_service import get_ai_steward_service
service = get_ai_steward_service(db) service = get_ai_steward_service(db)
@ -200,7 +200,7 @@ async def sync_external_signal(
以 JSON 格式返回。""" 以 JSON 格式返回。"""
try: try:
from ..services.llm import LLMService from ...services.llm_service import LLMService
llm = LLMService() llm = LLMService()
response = await llm.generate( response = await llm.generate(
prompt, prompt,

View File

@ -18,7 +18,7 @@ async def get_cognitive_conflicts(
- 产品说"用户留存提升10%",开发实现的是"DAU提升10%" - 产品说"用户留存提升10%",开发实现的是"DAU提升10%"
- 双方没有争论,但目标不一致,AI 会主动识别并推送对齐提醒 - 双方没有争论,但目标不一致,AI 会主动识别并推送对齐提醒
""" """
from ..models import CognitiveConflict, TruthNode from ...models import CognitiveConflict, TruthNode
from sqlalchemy.future import select from sqlalchemy.future import select
query = select(CognitiveConflict).where( query = select(CognitiveConflict).where(
@ -162,7 +162,7 @@ async def resolve_cognitive_conflict(
AI 会生成解决方案建议,双方确认后标记为已解决 AI 会生成解决方案建议,双方确认后标记为已解决
""" """
from ..models import CognitiveConflict from ...models import CognitiveConflict
from sqlalchemy.future import select from sqlalchemy.future import select
result = await db.execute( result = await db.execute(
@ -199,7 +199,7 @@ async def check_task_charter_mismatch(
2. 技术选型是否符合约束 2. 技术选型是否符合约束
3. 是否偏离项目方向 3. 是否偏离项目方向
""" """
from ..models import Task, TruthNode from ...models import Task, TruthNode
from sqlalchemy.future import select from sqlalchemy.future import select
try: try:

View File

@ -18,7 +18,7 @@ async def get_ai_steward_stats(
- 自动解决的阻塞数 - 自动解决的阻塞数
- 节省的会议时间(小时) - 节省的会议时间(小时)
""" """
from ..models import Signal, CognitiveConflict from ...models import Signal, CognitiveConflict
from sqlalchemy import func, text from sqlalchemy import func, text
# 统计信号数量 # 统计信号数量
@ -75,7 +75,7 @@ async def get_ai_steward_stats(
active_blockers = blocker_result.scalar() or 0 active_blockers = blocker_result.scalar() or 0
# 活跃项目数 # 活跃项目数
from ..models import Project from ...models import Project
project_result = await db.execute( project_result = await db.execute(
select(func.count(Project.id)).where( select(func.count(Project.id)).where(
Project.tenant_id == tenant_id, Project.tenant_id == tenant_id,
@ -111,7 +111,7 @@ async def get_ai_config_suggestion(
根据团队现状,智能推荐应该优先配置哪些集成源 根据团队现状,智能推荐应该优先配置哪些集成源
""" """
from ..models import Integration, Project, Signal from ...models import Integration, Project, Signal
from sqlalchemy.future import select from sqlalchemy.future import select
from sqlalchemy import func from sqlalchemy import func

View File

@ -56,7 +56,7 @@ async def trigger_signal_workflow(
检查信号的 impact_score,如果超过阈值(0.85), 检查信号的 impact_score,如果超过阈值(0.85),
自动触发工作流来调整相关项目的优先级 自动触发工作流来调整相关项目的优先级
""" """
from ..models import Signal from ...models import Signal
from sqlalchemy.future import select from sqlalchemy.future import select
signal_result = await db.execute( signal_result = await db.execute(
@ -98,7 +98,7 @@ async def get_workflow_status(
显示最近触发的工作流及其结果 显示最近触发的工作流及其结果
""" """
from ..models import AICallLog from ...models import AICallLog
from sqlalchemy.future import select from sqlalchemy.future import select
# 获取最近的工作流记录 # 获取最近的工作流记录
@ -125,7 +125,7 @@ async def enable_auto_workflow(
- 任务阻塞检测 - 任务阻塞检测
- 认知冲突检测 - 认知冲突检测
""" """
from ..models import Project from ...models import Project
from sqlalchemy.future import select from sqlalchemy.future import select
project_result = await db.execute( project_result = await db.execute(

View File

@ -10,23 +10,23 @@ from sqlalchemy import and_, select
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ...core.response import success_response from ...core.response import success_response
from ...database import get_db from ...core.database import get_db
from ...dependencies.auth import get_current_user from ...dependencies.auth import get_current_user
from ...dependencies.permissions import require_manager_user from ...dependencies.permissions import require_manager_user
from ...dependencies.tenant import get_tenant_id from ...dependencies.tenant import get_tenant_id
from ...models import ProjectSignalLink, Signal, User from ...models import ProjectSignalLink, Signal, User
from ...schemas.rag import RAGAskRequest from ...schemas.rag import RAGAskRequest
from ...services.adaptive_rag_service import AdaptiveRAGService from ...services.adaptive_rag_service import AdaptiveRAGService
from ...services.ai_orchestration_run_service import AIOrchestrationRunService from ...services.ai_orchestration_run import AIOrchestrationRunService
from ...services.ai_steward import AIStewardService, get_ai_steward_service from ...services.ai_steward_service import AIStewardService, get_ai_steward_service
from ...services.blocker_detection import get_blocker_detection_service from ...services.blocker_detection_core import get_blocker_detection_service
from ...services.cognitive_conflict import get_cognitive_conflict_service from ...services.cognitive_conflict_core import get_cognitive_conflict_service
from ...services.daily_briefing import get_daily_briefing_service from ...services.daily_briefing_core import get_daily_briefing_service
from ...services.event_workflow import WorkflowEventType, get_event_workflow_engine from ...services.event_workflow_core import WorkflowEventType, get_event_workflow_engine
from ...services.feishu_outbox_service import FeishuOutboxService from ...services.feishu_outbox import FeishuOutboxService
from ...services.signal_capture import ProactiveSignalCaptureService from ...services.signal_capture_service import ProactiveSignalCaptureService
from ...services.signal_source_orchestration_service import SignalSourceOrchestrationService from ...services.signal_source_orchestration import SignalSourceOrchestrationService
from ...services.signal_source_repair_service import ( from ...services.signal_source_repair import (
SignalSourceRepairMissingSignalError, SignalSourceRepairMissingSignalError,
SignalSourceRepairService, SignalSourceRepairService,
SignalSourceRepairTimeoutError, SignalSourceRepairTimeoutError,

View File

@ -9,7 +9,7 @@ from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ..core.response import success_response from ..core.response import success_response
from ..database import get_db from ..core.database import get_db
from ..dependencies.auth import get_optional_current_user from ..dependencies.auth import get_optional_current_user
from ..dependencies.tenant import get_tenant_id from ..dependencies.tenant import get_tenant_id
from ..models import User from ..models import User

View File

@ -5,7 +5,7 @@ from fastapi.security import OAuth2PasswordRequestForm
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select from sqlalchemy.future import select
from ..database import get_db from ..core.database import get_db
from ..models import User, UserStatus from ..models import User, UserStatus
from ..schemas import UserLoginResponse from ..schemas import UserLoginResponse
from ..services.auth import AuthService from ..services.auth import AuthService

View File

@ -9,7 +9,7 @@ from sqlalchemy import and_, desc, select
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ..core.response import ErrorCode, error_response, success_response from ..core.response import ErrorCode, error_response, success_response
from ..database import get_db from ..core.database import get_db
from ..dependencies import get_tenant_id, get_current_user, require_roles from ..dependencies import get_tenant_id, get_current_user, require_roles
from ..models import Budget, BudgetAlert, User from ..models import Budget, BudgetAlert, User
from ..schemas.budget import ( from ..schemas.budget import (
@ -18,7 +18,7 @@ from ..schemas.budget import (
BudgetOverrideRequest, BudgetOverrideRequest,
BudgetUpdateRequest, BudgetUpdateRequest,
) )
from ..services.budget_enforcement_service import BudgetEnforcementService from ..services.budget_enforcement import BudgetEnforcementService
from ..utils.timezone import now_cn_naive from ..utils.timezone import now_cn_naive
router = APIRouter(prefix="/budget", tags=["budget"]) router = APIRouter(prefix="/budget", tags=["budget"])

View File

@ -4,11 +4,11 @@ from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select from sqlalchemy.future import select
from ..database import get_db from ..core.database import get_db
from ..dependencies.tenant import get_tenant_id from ..dependencies.tenant import get_tenant_id
from ..models import ContextNode from ..models import ContextNode
from ..schemas import ContextNodeCreate from ..schemas import ContextNodeCreate
from ..services.llm import llm_service from ..services.llm_service import llm_service
router = APIRouter(prefix="/context_nodes", tags=["context"]) router = APIRouter(prefix="/context_nodes", tags=["context"])

View File

@ -7,7 +7,7 @@ from typing import List
from fastapi import APIRouter, Depends, Query from fastapi import APIRouter, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ....database import get_db from ....core.database import get_db
from ....dependencies import get_current_user, get_tenant_id from ....dependencies import get_current_user, get_tenant_id
from ....models import User from ....models import User
from ....schemas.skill import ( from ....schemas.skill import (
@ -16,7 +16,7 @@ from ....schemas.skill import (
UserSkillBindingBatchUpdate, UserSkillBindingBatchUpdate,
UserSkillBindingResponse, UserSkillBindingResponse,
) )
from ....services import skill_service from ....services import skill as skill_service
from .shared import ensure_self_or_admin from .shared import ensure_self_or_admin
router = APIRouter() router = APIRouter()

View File

@ -7,14 +7,14 @@ from typing import Optional
from fastapi import APIRouter, Depends, Query from fastapi import APIRouter, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ....database import get_db from ....core.database import get_db
from ....dependencies import get_current_user, get_tenant_id from ....dependencies import get_current_user, get_tenant_id
from ....models import User from ....models import User
from ....schemas.skill import ( from ....schemas.skill import (
PersonnelRecommendationItem, PersonnelRecommendationItem,
PersonnelRecommendationResponse, PersonnelRecommendationResponse,
) )
from ....services import skill_service from ....services import skill as skill_service
router = APIRouter() router = APIRouter()

View File

@ -8,11 +8,11 @@ from uuid import UUID
from fastapi import APIRouter, Depends, HTTPException, Query, status from fastapi import APIRouter, Depends, HTTPException, Query, status
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ....database import get_db from ....core.database import get_db
from ....dependencies import get_current_user, get_tenant_id, require_roles from ....dependencies import get_current_user, get_tenant_id, require_roles
from ....models import User from ....models import User
from ....schemas.skill import SkillTagCreate, SkillTagResponse, SkillTagUpdate from ....schemas.skill import SkillTagCreate, SkillTagResponse, SkillTagUpdate
from ....services import skill_service from ....services import skill as skill_service
from .shared import skill_tag_to_response from .shared import skill_tag_to_response
router = APIRouter() router = APIRouter()

View File

@ -5,10 +5,10 @@ from __future__ import annotations
from fastapi import APIRouter, Depends, HTTPException, status from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ....database import get_db from ....core.database import get_db
from ....dependencies import get_current_user, get_tenant_id from ....dependencies import get_current_user, get_tenant_id
from ....models import User from ....models import User
from ....services import workload_service from ....services import workload as workload_service
from .shared import ensure_self_or_admin from .shared import ensure_self_or_admin
router = APIRouter() router = APIRouter()

View File

@ -4,7 +4,7 @@ from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select from sqlalchemy.future import select
from ..database import get_db from ..core.database import get_db
from ..models import Experiment from ..models import Experiment
from ..schemas import ExperimentCreate, ExperimentUpdate from ..schemas import ExperimentCreate, ExperimentUpdate

View File

@ -4,7 +4,7 @@ from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select from sqlalchemy.future import select
from ..database import get_db from ..core.database import get_db
from ..models import SignalFeedback from ..models import SignalFeedback
router = APIRouter(prefix="/feedbacks", tags=["feedbacks"]) router = APIRouter(prefix="/feedbacks", tags=["feedbacks"])

View File

@ -1,7 +0,0 @@
"""Feishu API router compatibility entrypoint."""
from __future__ import annotations
from .feishu_api import router
__all__ = ["router"]

View File

@ -6,13 +6,13 @@ from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select from sqlalchemy.future import select
from ...database import get_db from ...core.database import get_db
from ...dependencies.auth import get_current_user from ...dependencies.auth import get_current_user
from ...dependencies.tenant import get_tenant_id from ...dependencies.tenant import get_tenant_id
from ...models import Integration, User from ...models import Integration, User
from ...services.auth import has_any_role from ...services.auth import has_any_role
from ...services.feishu_integration import get_feishu_service from ...services.feishu_integration_service import get_feishu_service
from ...services.feishu_long_connection import get_feishu_long_connection_manager from ...services.feishu_long_connection_core import get_feishu_long_connection_manager
from .schemas import FeishuConfigRequest from .schemas import FeishuConfigRequest
router = APIRouter() router = APIRouter()

View File

@ -7,7 +7,7 @@ from fastapi import APIRouter, Depends, HTTPException
from ...dependencies.auth import get_current_user from ...dependencies.auth import get_current_user
from ...models import User from ...models import User
from ...services.auth import has_any_role from ...services.auth import has_any_role
from ...services.feishu_long_connection import get_feishu_long_connection_manager from ...services.feishu_long_connection_core import get_feishu_long_connection_manager
router = APIRouter() router = APIRouter()

View File

@ -5,11 +5,11 @@ from __future__ import annotations
from fastapi import APIRouter, Depends, HTTPException from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ...database import get_db from ...core.database import get_db
from ...dependencies.auth import get_current_user from ...dependencies.auth import get_current_user
from ...dependencies.tenant import get_tenant_id from ...dependencies.tenant import get_tenant_id
from ...models import User from ...models import User
from ...services.feishu_integration import get_feishu_service from ...services.feishu_integration_service import get_feishu_service
from .schemas import FeishuSendCardRequest, FeishuSendMessageRequest from .schemas import FeishuSendCardRequest, FeishuSendMessageRequest
router = APIRouter() router = APIRouter()

View File

@ -5,12 +5,12 @@ from __future__ import annotations
from fastapi import APIRouter, Depends, HTTPException from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ...database import get_db from ...core.database import get_db
from ...dependencies.auth import get_current_user from ...dependencies.auth import get_current_user
from ...dependencies.tenant import get_tenant_id from ...dependencies.tenant import get_tenant_id
from ...models import User from ...models import User
from ...services.feishu_integration import get_feishu_service from ...services.feishu_integration_service import get_feishu_service
from ...services.feishu_long_connection import get_feishu_long_connection_manager from ...services.feishu_long_connection_core import get_feishu_long_connection_manager
from .helpers import build_long_connection_failure from .helpers import build_long_connection_failure
router = APIRouter() router = APIRouter()

View File

@ -10,13 +10,13 @@ from pydantic import BaseModel, Field
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ..core.response import success_response from ..core.response import success_response
from ..database import get_db from ..core.database import get_db
from ..dependencies.auth import get_current_user from ..dependencies.auth import get_current_user
from ..dependencies.tenant import get_tenant_id from ..dependencies.tenant import get_tenant_id
from ..models import User from ..models import User
from ..services.auth import has_any_role from ..services.auth import has_any_role
from ..services.model_context_bundle_service import ModelContextBundleService from ..services.model_context_bundle import ModelContextBundleService
from ..services.project_knowledge_graph import ProjectKnowledgeGraphService from ..services.project_knowledge_graph_service import ProjectKnowledgeGraphService
router = APIRouter(prefix="/ai-steward/knowledge-graph", tags=["AI Steward"]) router = APIRouter(prefix="/ai-steward/knowledge-graph", tags=["AI Steward"])

View File

@ -9,12 +9,12 @@ from pydantic import BaseModel, Field
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ..core.response import success_response from ..core.response import success_response
from ..database import get_db from ..core.database import get_db
from ..dependencies.auth import get_current_user from ..dependencies.auth import get_current_user
from ..dependencies.tenant import get_tenant_id from ..dependencies.tenant import get_tenant_id
from ..models import User from ..models import User
from ..services.auth import has_any_role from ..services.auth import has_any_role
from ..services.llm import llm_service from ..services.llm_service import llm_service
router = APIRouter(prefix="/ai-steward/llm-engines", tags=["AI Steward"]) router = APIRouter(prefix="/ai-steward/llm-engines", tags=["AI Steward"])

View File

@ -1,5 +0,0 @@
from __future__ import annotations
from .model_capability_api import router
__all__ = ["router"]

View File

@ -8,7 +8,7 @@ from sqlalchemy import and_, select
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ...core.response import ErrorCode, error_response, success_response from ...core.response import ErrorCode, error_response, success_response
from ...database import get_db from ...core.database import get_db
from ...dependencies import get_current_user, get_tenant_id from ...dependencies import get_current_user, get_tenant_id
from ...models import Experiment, TruthNode, User from ...models import Experiment, TruthNode, User
from ...schemas.model_capability import ( from ...schemas.model_capability import (
@ -20,10 +20,10 @@ from ...schemas.model_capability import (
LifecycleImpactRequest, LifecycleImpactRequest,
ValidateMatchRequest, ValidateMatchRequest,
) )
from ...services.ai_service import get_ai_service from ...services.ai_service_core import get_ai_service
from ...services.cost_optimization_service import CostOptimizationService from ...services.model_capability.cost_optimization_service import CostOptimizationService
from ...services.experiment_sync_service import ExperimentSyncService from ...services.experiment_sync import ExperimentSyncService
from ...services.model_capability_service import ModelCapabilityService from ...services.model_capability import ModelCapabilityService
from ...services.model_lifecycle_service import ModelLifecycleService from ...services.model_capability.model_lifecycle_service import ModelLifecycleService
router = APIRouter(prefix="/model-capability", tags=["model-capability"]) router = APIRouter(prefix="/model-capability", tags=["model-capability"])

View File

@ -10,11 +10,11 @@ from pydantic import BaseModel, Field
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ..core.response import error_response, success_response from ..core.response import error_response, success_response
from ..database import get_db from ..core.database import get_db
from ..dependencies import get_current_user from ..dependencies import get_current_user
from ..models import User from ..models import User
from ..services.auth import has_any_role from ..services.auth import has_any_role
from ..services.model_routing_service import ModelRoutingService from ..services.model_routing import ModelRoutingService
from ..services.operation_log_service import log_operation from ..services.operation_log_service import log_operation
router = APIRouter(prefix="/model-routing", tags=["model_routing"]) router = APIRouter(prefix="/model-routing", tags=["model_routing"])

View File

@ -10,7 +10,7 @@ from sqlalchemy import and_, desc, func, select
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ..core.response import success_response from ..core.response import success_response
from ..database import get_db from ..core.database import get_db
from ..dependencies import get_current_user, get_tenant_id from ..dependencies import get_current_user, get_tenant_id
from ..models import Notification, User from ..models import Notification, User

View File

@ -1,5 +0,0 @@
from __future__ import annotations
from .projects_api import router
__all__ = ["router"]

View File

@ -9,7 +9,7 @@ from sqlalchemy import and_, delete, func, select, update
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ...database import get_db from ...core.database import get_db
from ...dependencies import get_current_user, get_tenant_id, require_roles from ...dependencies import get_current_user, get_tenant_id, require_roles
from ...models import ( from ...models import (
AIOrchestrationRun, AIOrchestrationRun,
@ -29,10 +29,10 @@ from ...models import (
UserProject, UserProject,
WorkItem, WorkItem,
) )
from ...services.ai_pmo_kernel_service import AIPMOKernelService from ...services.ai_pmo_kernel import AIPMOKernelService
from ...services.context_cache import context_cache_service from ...services.context_cache_service import context_cache_service
from ...services.operation_log_service import log_operation from ...services.operation_log_service import log_operation
from ...services.project_member_service import ( from ...services.project_member import (
ProjectMemberAssignmentError, ProjectMemberAssignmentError,
notify_member_assignment_failure, notify_member_assignment_failure,
replace_project_members, replace_project_members,

View File

@ -9,12 +9,12 @@ from pydantic import BaseModel, Field
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ..core.response import success_response from ..core.response import success_response
from ..database import get_db from ..core.database import get_db
from ..dependencies.auth import get_current_user from ..dependencies.auth import get_current_user
from ..dependencies.tenant import get_tenant_id from ..dependencies.tenant import get_tenant_id
from ..models import User from ..models import User
from ..services.auth import has_any_role from ..services.auth import has_any_role
from ..services.prompt_profile_service import prompt_profile_service from ..services.prompt_profile import prompt_profile_service
router = APIRouter(prefix="/ai-steward/prompt-profiles", tags=["AI Steward"]) router = APIRouter(prefix="/ai-steward/prompt-profiles", tags=["AI Steward"])

View File

@ -9,7 +9,7 @@ from fastapi import APIRouter, Depends, File, Form, HTTPException, Query, Respon
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ...core.response import success_response from ...core.response import success_response
from ...database import get_db from ...core.database import get_db
from ...dependencies.auth import get_current_user, require_roles from ...dependencies.auth import get_current_user, require_roles
from ...dependencies.tenant import get_tenant_id from ...dependencies.tenant import get_tenant_id
from ...models import User from ...models import User
@ -28,6 +28,6 @@ from ...schemas.rag import (
SymbolSyncRequest, SymbolSyncRequest,
) )
from ...services.adaptive_rag_service import AdaptiveRAGService from ...services.adaptive_rag_service import AdaptiveRAGService
from ...services.symbol_index_service import SymbolIndexService from ...services.symbol_index import SymbolIndexService
router = APIRouter(prefix="/rag", tags=["Adaptive RAG"]) router = APIRouter(prefix="/rag", tags=["Adaptive RAG"])

View File

@ -4,7 +4,7 @@ from typing import Optional
from fastapi import APIRouter, Depends, HTTPException, UploadFile, File from fastapi import APIRouter, Depends, HTTPException, UploadFile, File
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ..database import get_db from ..core.database import get_db
from ..dependencies.auth import get_current_tenant_id from ..dependencies.auth import get_current_tenant_id
from ..schemas.recipe import ( from ..schemas.recipe import (
RecipeCreate, RecipeCreate,
@ -13,7 +13,7 @@ from ..schemas.recipe import (
RecipeImageUploadRequest, RecipeImageUploadRequest,
RecipeAnalyzeCaloriesResponse, RecipeAnalyzeCaloriesResponse,
) )
from ..services.recipe_service import get_recipe_service from ..services.recipe import get_recipe_service
router = APIRouter(prefix="/recipes", tags=["食谱"]) router = APIRouter(prefix="/recipes", tags=["食谱"])

View File

@ -6,34 +6,34 @@ API 路由汇总
from fastapi import APIRouter from fastapi import APIRouter
from .signals import router as signals_router from .signals_api import router as signals_router
from .feedbacks import router as feedbacks_router from .feedbacks import router as feedbacks_router
from .experiments import router as experiments_router from .experiments import router as experiments_router
from .context import router as context_router from .context import router as context_router
from .tasks import router as tasks_router from .tasks import router as tasks_router
from .webhooks import router as webhooks_router from .webhooks import router as webhooks_router
from .auth import router as auth_router from .auth import router as auth_router
from .users import router as users_router from .users_api import router as users_router
from .endpoints.skill import router as skill_router from .endpoints.skill import router as skill_router
from .workloads import router as workloads_router from .workloads import router as workloads_router
from .skill_tags import router as skill_tags_router from .skill_tags_api import router as skill_tags_router
from .sstc import router as sstc_router from .sstc_api import router as sstc_router
from .projects import router as projects_router from .projects_api import router as projects_router
from .scheduler import router as scheduler_router from .scheduler import router as scheduler_router
from .ai_steward import router as ai_steward_router from .ai_steward_api import router as ai_steward_router
from .feishu import router as feishu_router from .feishu_api import router as feishu_router
from .wecom import router as wecom_router from .wecom_api import router as wecom_router
from .notifications import router as notifications_router from .notifications import router as notifications_router
from .llm_engines import router as llm_engines_router from .llm_engines import router as llm_engines_router
from .llm_providers import router as llm_providers_router from .llm_providers import router as llm_providers_router
from .ai_logs import router as ai_logs_router from .ai_logs_api import router as ai_logs_router
from .prompt_profiles import router as prompt_profiles_router from .prompt_profiles import router as prompt_profiles_router
from .rag import router as rag_router from .rag_api import router as rag_router
from .knowledge_graph import router as knowledge_graph_router from .knowledge_graph import router as knowledge_graph_router
from .recipes import router as recipes_router from .recipes import router as recipes_router
from .signal_sources import router as signal_sources_router from .signal_sources_api import router as signal_sources_router
from .operation_catalog import router as operation_catalog_router from .operation_catalog import router as operation_catalog_router
from .ai_pmo import router as ai_pmo_router from .ai_pmo_api import router as ai_pmo_router
from .audit import router as audit_router from .audit import router as audit_router
from .model_routing import router as model_routing_router from .model_routing import router as model_routing_router
from .task_briefs import router as task_briefs_router from .task_briefs import router as task_briefs_router

View File

@ -6,14 +6,14 @@ from fastapi import APIRouter, Depends
from sqlalchemy import and_, or_, select from sqlalchemy import and_, or_, select
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ..database import get_db from ..core.database import get_db
from ..dependencies import require_manager_user from ..dependencies import require_manager_user
from ..models import KnowledgeBaseDoc, Project, User from ..models import KnowledgeBaseDoc, Project, User
from ..services.adaptive_rag_service import AdaptiveRAGService from ..services.adaptive_rag_service import AdaptiveRAGService
from ..services.ai_pmo_cadence_service import AIPMOCadenceService from ..services.ai_pmo_cadence import AIPMOCadenceService
from ..services.project_knowledge_graph import ProjectKnowledgeGraphService from ..services.project_knowledge_graph_service import ProjectKnowledgeGraphService
from ..services.symbol_index_service import SymbolIndexService from ..services.symbol_index import SymbolIndexService
from ..services import workload_service from ..services import workload as workload_service
router = APIRouter(prefix="/scheduler", tags=["scheduler"]) router = APIRouter(prefix="/scheduler", tags=["scheduler"])

View File

@ -1,5 +1,5 @@
from __future__ import annotations from __future__ import annotations
from .sstc_api import router from .routes import router
__all__ = ["router"] __all__ = ["router"]

View File

@ -8,7 +8,7 @@ from fastapi import HTTPException
from sqlalchemy import or_, select from sqlalchemy import or_, select
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ..models import Project from ...models import Project
RECIPE_PROJECT_KEYWORDS = ("食谱", "recipe", "sstc") RECIPE_PROJECT_KEYWORDS = ("食谱", "recipe", "sstc")

View File

@ -9,12 +9,12 @@ from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy import select from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ..core.logging import get_logger from ...core.logging import get_logger
from ..database import get_db from ...core.database import get_db
from ..dependencies.tenant import get_tenant_id from ...dependencies.tenant import get_tenant_id
from ..models import ProjectSignalLink, Signal from ...models import ProjectSignalLink, Signal
from .signal_sources_models import RecipeBatchRequest, RecipeRecognitionRequest, RecipeRecognitionResponse from .schemas import RecipeBatchRequest, RecipeRecognitionRequest, RecipeRecognitionResponse
from .signal_sources_utils import resolve_target_project_id from .helpers import resolve_target_project_id
router = APIRouter(prefix="/signal-sources", tags=["Signal Sources"]) router = APIRouter(prefix="/signal-sources", tags=["Signal Sources"])
logger = get_logger(__name__) logger = get_logger(__name__)

View File

@ -1,7 +0,0 @@
"""信号相关 API 路由。"""
from __future__ import annotations
from .signals_api import router
__all__ = ["router"]

View File

@ -9,7 +9,7 @@ from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select from sqlalchemy.future import select
from ...database import get_db from ...core.database import get_db
from ...models import Signal, SignalFeedback from ...models import Signal, SignalFeedback
from ...schemas import SignalFeedbackCreate, SignalFeedbackResponse from ...schemas import SignalFeedbackCreate, SignalFeedbackResponse

View File

@ -8,15 +8,15 @@ from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select from sqlalchemy.future import select
from ...database import get_db from ...core.database import get_db
from ...dependencies.tenant import get_tenant_id from ...dependencies.tenant import get_tenant_id
from ...models import Signal from ...models import Signal
from ...schemas import SignalCreate, SignalPriority, classify_signal_priority from ...schemas import SignalCreate, SignalPriority, classify_signal_priority
from ...services.analyzer import analyze_impact from ...services.signal_capture_service.impact_analyzer import analyze_impact
from ...services.fetcher import fetch_hn_stories from ...services.signal_capture_service.external_fetcher import fetch_hn_stories
from ...services.lark import LarkService from ...services.integration_core.lark_service import LarkService
from ...services.llm import llm_service from ...services.llm_service import llm_service
from ...services.plane import plane_service from ...services.integration_core.plane_service import plane_service
router = APIRouter() router = APIRouter()
lark_service = LarkService() lark_service = LarkService()

View File

@ -9,7 +9,7 @@ from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select from sqlalchemy.future import select
from ...database import get_db from ...core.database import get_db
from ...models import Project, ProjectSignalLink, Signal from ...models import Project, ProjectSignalLink, Signal
from ...schemas import SignalCreate from ...schemas import SignalCreate

View File

@ -1,5 +1,5 @@
from __future__ import annotations from __future__ import annotations
from .users_api import router from .routes import router
__all__ = ["router"] __all__ = ["router"]

View File

@ -6,7 +6,7 @@ from typing import Optional
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from ..models import SkillTag from ...models import SkillTag
class SkillTagCreateRequest(BaseModel): class SkillTagCreateRequest(BaseModel):

View File

@ -6,14 +6,14 @@ from fastapi import APIRouter, Depends, HTTPException, Query, status
from sqlalchemy import and_, delete, func, select from sqlalchemy import and_, delete, func, select
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ..database import get_db from ...core.database import get_db
from ..dependencies import get_current_user, get_tenant_id, require_roles from ...dependencies import get_current_user, get_tenant_id, require_roles
from ..models import SkillTag, User, UserSkillBinding from ...models import SkillTag, User, UserSkillBinding
from ..services import skill_service from ...services import skill as skill_service
from ..services.ai_pmo_kernel_service import AIPMOKernelService from ...services.ai_pmo_kernel import AIPMOKernelService
from ..services.auth import has_any_role from ...services.auth import has_any_role
from ..utils.timezone import now_cn_naive from ...utils.timezone import now_cn_naive
from .skill_tags_contracts import ( from .contracts import (
SkillTagCreateRequest, SkillTagCreateRequest,
SkillTagUpdateRequest, SkillTagUpdateRequest,
UserSkillCreateRequest, UserSkillCreateRequest,

View File

@ -12,7 +12,7 @@ from sqlalchemy import and_, delete, select
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ...core.response import success_response from ...core.response import success_response
from ...database import get_db from ...core.database import get_db
from ...dependencies import get_current_user, require_project_member_or_manager from ...dependencies import get_current_user, require_project_member_or_manager
from ...models import ( from ...models import (
AICallLog, AICallLog,
@ -41,16 +41,17 @@ from ...schemas.sstc import (
TaskStatusPatchRequest, TaskStatusPatchRequest,
WorkloadOptimizeRequest, WorkloadOptimizeRequest,
) )
from ...services import skill_score_service, workload_service from ...services.skill import skill_score_service
from ...services.ai_pmo_kernel_service import AIPMOKernelService from ...services import workload as workload_service
from ...services.ai_service import AIService from ...services.ai_pmo_kernel import AIPMOKernelService
from ...services.ai_service_core import AIService
from ...services.auth import has_any_role from ...services.auth import has_any_role
from ...services.budget_enforcement_service import BudgetEnforcementService from ...services.budget_enforcement import BudgetEnforcementService
from ...services.feishu_integration import get_feishu_service from ...services.feishu_integration_service import get_feishu_service
from ...services.llm import llm_service from ...services.llm_service import llm_service
from ...services.operation_log_service import log_operation from ...services.operation_log_service import log_operation
from ...services.skill_service import recommend_personnel from ...services.skill import recommend_personnel
from ...services.sstc_service import ALIGNED_STATUSES, DONE_STATUSES, RELEASE_VERIFIED_STATUSES, SSTCService from ...services.sstc_service_core import ALIGNED_STATUSES, DONE_STATUSES, RELEASE_VERIFIED_STATUSES, SSTCService
from ...services.task_persistence import build_task_create_draft, persist_task from ...services.task_persistence_core import build_task_create_draft, persist_task
from ...utils.title import compact_title from ...utils.title import compact_title
from ...utils.timezone import CN_TZ, now_cn_aware, now_cn_naive from ...utils.timezone import CN_TZ, now_cn_aware, now_cn_naive

View File

@ -10,12 +10,12 @@ from pydantic import BaseModel, Field
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ..core.response import error_response, success_response from ..core.response import error_response, success_response
from ..database import get_db from ..core.database import get_db
from ..dependencies import get_current_user from ..dependencies import get_current_user
from ..models import User from ..models import User
from ..services.auth import has_any_role from ..services.auth import has_any_role
from ..services.operation_log_service import log_operation from ..services.operation_log_service import log_operation
from ..services.task_brief_service import TaskBriefService from ..services.task_brief import TaskBriefService
router = APIRouter(prefix="/task-briefs", tags=["task_briefs"]) router = APIRouter(prefix="/task-briefs", tags=["task_briefs"])

View File

@ -4,13 +4,13 @@ from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy import and_, select from sqlalchemy import and_, select
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ..database import get_db from ..core.database import get_db
from ..dependencies import get_current_user, require_manager_user from ..dependencies import get_current_user, require_manager_user
from ..models import Task, User, UserProject from ..models import Task, User, UserProject
from ..schemas import TaskBreakdownRequest, TaskBreakdownResponse from ..schemas import TaskBreakdownRequest, TaskBreakdownResponse
from ..services.llm import llm_service from ..services.llm_service import llm_service
from ..services.plane import plane_service from ..services.integration_core.plane_service import plane_service
from ..services.skill_service import recommend_personnel from ..services.skill import recommend_personnel
router = APIRouter(prefix="/tasks", tags=["tasks"]) router = APIRouter(prefix="/tasks", tags=["tasks"])

View File

@ -11,7 +11,7 @@ from sqlalchemy import and_, delete, func, or_, select, update
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ...database import get_db from ...core.database import get_db
from ...dependencies import ( from ...dependencies import (
get_current_active_user, get_current_active_user,
get_current_user, get_current_user,
@ -36,8 +36,8 @@ from ...schemas import (
UserStatusPatchRequest, UserStatusPatchRequest,
UserUpdate, UserUpdate,
) )
from ...services import skill_service from ...services import skill as skill_service
from ...services.ai_pmo_kernel_service import AIPMOKernelService from ...services.ai_pmo_kernel import AIPMOKernelService
from ...services.auth import AuthService from ...services.auth import AuthService
from ...services.operation_log_service import log_operation from ...services.operation_log_service import log_operation
from ...utils.timezone import now_cn_naive from ...utils.timezone import now_cn_naive

View File

@ -8,10 +8,10 @@ from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select from sqlalchemy.future import select
from ..database import get_db from ..core.database import get_db
from ..models import Signal from ..models import Signal
from ..services.llm import llm_service from ..services.llm_service import llm_service
from ..services.plane import plane_service from ..services.integration_core.plane_service import plane_service
from ..utils.timezone import now_cn_aware from ..utils.timezone import now_cn_aware
router = APIRouter(prefix="/webhooks", tags=["webhooks"]) router = APIRouter(prefix="/webhooks", tags=["webhooks"])

View File

@ -1,7 +0,0 @@
"""WeCom API compatibility module."""
from __future__ import annotations
from .wecom_api import router
__all__ = ["router"]

View File

@ -6,12 +6,12 @@ from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select from sqlalchemy.future import select
from ...database import get_db from ...core.database import get_db
from ...dependencies.auth import get_current_user from ...dependencies.auth import get_current_user
from ...dependencies.tenant import get_tenant_id from ...dependencies.tenant import get_tenant_id
from ...models import Integration, User from ...models import Integration, User
from ...services.auth import has_any_role from ...services.auth import has_any_role
from ...services.wecom_integration import get_wecom_service from ...services.wecom import get_wecom_service
from .schemas import WeComConfigRequest from .schemas import WeComConfigRequest
router = APIRouter() router = APIRouter()

View File

@ -5,11 +5,11 @@ from __future__ import annotations
from fastapi import APIRouter, Depends, HTTPException from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ...database import get_db from ...core.database import get_db
from ...dependencies.auth import get_current_user from ...dependencies.auth import get_current_user
from ...dependencies.tenant import get_tenant_id from ...dependencies.tenant import get_tenant_id
from ...models import User from ...models import User
from ...services.wecom_integration import get_wecom_service from ...services.wecom import get_wecom_service
from .schemas import WeComSendMessageRequest from .schemas import WeComSendMessageRequest
router = APIRouter() router = APIRouter()

View File

@ -7,8 +7,8 @@ import json
from fastapi import APIRouter, Depends, HTTPException, Request from fastapi import APIRouter, Depends, HTTPException, Request
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ...database import get_db from ...core.database import get_db
from ...services.wecom_integration import get_wecom_service from ...services.wecom import get_wecom_service
router = APIRouter() router = APIRouter()

View File

@ -8,7 +8,7 @@ from fastapi import APIRouter, Depends, HTTPException, Query
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ..database import get_db from ..core.database import get_db
from ..dependencies import ( from ..dependencies import (
get_current_user, get_current_user,
get_tenant_id, get_tenant_id,
@ -17,7 +17,7 @@ from ..dependencies import (
require_self_or_manager, require_self_or_manager,
) )
from ..models import User from ..models import User
from ..services import workload_service from ..services import workload as workload_service
router = APIRouter(prefix="/workloads", tags=["workloads"]) router = APIRouter(prefix="/workloads", tags=["workloads"])

View File

@ -16,10 +16,10 @@ from sqlalchemy.ext.asyncio import (
) )
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from .core.config import settings from .config import settings
from .core.logging import get_logger from .logging import get_logger
from .models import OperationLog from ..models import OperationLog
from .utils.audited_write import get_audit_context from ..utils.audited_write import get_audit_context
DATABASE_URL = settings.database_url DATABASE_URL = settings.database_url
logger = get_logger(__name__) logger = get_logger(__name__)

View File

@ -6,7 +6,7 @@ from dataclasses import dataclass, field
from enum import Enum from enum import Enum
from typing import Any, Optional from typing import Any, Optional
from .utils.timezone import now_cn_aware from ..utils.timezone import now_cn_aware
class EventType(Enum): class EventType(Enum):

View File

@ -4,8 +4,8 @@ from __future__ import annotations
import os import os
from .core.config import settings from ..config import settings
from .core.logging import get_logger from ..logging import get_logger
logger = get_logger(__name__) logger = get_logger(__name__)

View File

@ -7,10 +7,10 @@ from contextlib import suppress
import sqlalchemy as sa import sqlalchemy as sa
from .core.logging import get_logger from ..logging import get_logger
from .database import engine from ..database import engine
from .services.feishu_integration import dispatch_pending_feishu_replies from ...services.feishu_integration_service import dispatch_pending_feishu_replies
from .main_db_guard import normalize_dialect from .db_guard import normalize_dialect
logger = get_logger(__name__) logger = get_logger(__name__)

View File

@ -6,7 +6,7 @@ import asyncio
import os import os
import time import time
from .core.logging import get_logger from ..logging import get_logger
logger = get_logger(__name__) logger = get_logger(__name__)
@ -16,7 +16,7 @@ def startup_log(message: str, **fields) -> None:
async def probe_model_connectivity_on_startup() -> None: async def probe_model_connectivity_on_startup() -> None:
from .services.llm import llm_service from ...services.llm_service import llm_service
low_provider = str(os.getenv("LLM_ROUTING_LOW_PROVIDER", os.getenv("LLM_PROVIDER", "glm")) or "").strip() or "glm" low_provider = str(os.getenv("LLM_ROUTING_LOW_PROVIDER", os.getenv("LLM_PROVIDER", "glm")) or "").strip() or "glm"
low_model = str(os.getenv("LLM_ROUTING_LOW_MODEL", os.getenv("GLM_MODEL", "GLM-4.7")) or "").strip() or "GLM-4.7" low_model = str(os.getenv("LLM_ROUTING_LOW_MODEL", os.getenv("GLM_MODEL", "GLM-4.7")) or "").strip() or "GLM-4.7"

View File

@ -8,12 +8,12 @@ from datetime import datetime, timedelta
import sqlalchemy as sa import sqlalchemy as sa
from sqlalchemy.exc import OperationalError, ProgrammingError from sqlalchemy.exc import OperationalError, ProgrammingError
from .core.logging import get_logger from ..logging import get_logger
from .database import AsyncSessionLocal from ..database import AsyncSessionLocal
from .main_db_guard import is_missing_table_error from .db_guard import is_missing_table_error
from .models import Project, WorkItem from ...models import Project, WorkItem
from .services.ai_pmo_kernel_service import AIPMOKernelService from ...services.ai_pmo_kernel import AIPMOKernelService
from .utils.timezone import now_cn_aware from ...utils.timezone import now_cn_aware
logger = get_logger(__name__) logger = get_logger(__name__)
ACTIVE_PROJECT_STATUSES = ("active", "planning", "todo", "doing") ACTIVE_PROJECT_STATUSES = ("active", "planning", "todo", "doing")

View File

@ -11,7 +11,7 @@ import logging
from fastapi import WebSocket, WebSocketDisconnect from fastapi import WebSocket, WebSocketDisconnect
from enum import Enum from enum import Enum
from .utils.timezone import now_cn_aware, now_cn_naive from ..utils.timezone import now_cn_aware, now_cn_naive
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View File

@ -11,7 +11,7 @@ from fastapi.security import OAuth2PasswordBearer
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select from sqlalchemy.future import select
from ..database import get_db from ..core.database import get_db
from ..dependencies.tenant import get_tenant_id from ..dependencies.tenant import get_tenant_id
from ..models import User, UserStatus # noqa: E402 from ..models import User, UserStatus # noqa: E402
from ..services.auth import AuthService, has_any_role from ..services.auth import AuthService, has_any_role

View File

@ -8,7 +8,7 @@ from fastapi import Depends, HTTPException
from sqlalchemy import and_, select from sqlalchemy import and_, select
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ..database import get_db from ..core.database import get_db
from ..models import User, UserProject from ..models import User, UserProject
from ..services.auth import parse_role_values from ..services.auth import parse_role_values
from .auth import get_current_user from .auth import get_current_user

5
backend/app/deps.py Normal file
View File

@ -0,0 +1,5 @@
"""Shared FastAPI dependencies exposed at app package root."""
from .core.database import AsyncSessionLocal, get_db
__all__ = ["AsyncSessionLocal", "get_db"]

View File

@ -1,180 +0,0 @@
"""Neural Sync - Role Dispatcher。"""
from __future__ import annotations
import logging
import re
from typing import Any, Optional
from pydantic import BaseModel, Field
from .dispatcher_rules import ROLE_RULES, TECH_KEYWORDS, Role, RoutingRule
from .utils.timezone import now_cn_aware
logger = logging.getLogger(__name__)
class RoleRouter:
"""角色路由引擎。"""
ROLE_RULES: list[RoutingRule] = ROLE_RULES
TECH_KEYWORDS = TECH_KEYWORDS
def __init__(self):
self._compiled_patterns: dict[Role, list[re.Pattern]] = {}
for rule in self.ROLE_RULES:
patterns = [re.compile(pattern, re.IGNORECASE) for pattern in rule.patterns]
self._compiled_patterns[rule.role] = patterns
def route(
self,
signal_content: str,
analysis: Optional[dict[str, Any]] = None,
source: Optional[str] = None,
) -> tuple[Role, float, dict[str, Any]]:
analysis = analysis or {}
details = {
"matched_rules": [],
"scores": {},
"reasons": [],
}
if self._should_escalate_to_boss(analysis):
details["reasons"].append("触发老板决策阈值")
details["matched_rules"].append("threshold_check")
return Role.BOSS, 1.0, details
scores: dict[Role, float] = {rule.role: 0.0 for rule in self.ROLE_RULES}
content_lower = signal_content.lower()
for rule in self.ROLE_RULES:
keyword_score = sum(1 for kw in rule.keywords if kw.lower() in content_lower)
if keyword_score > 0:
scores[rule.role] += keyword_score * 0.3
details["scores"][f"{rule.role}_keywords"] = keyword_score
for rule in self.ROLE_RULES:
if rule.role in self._compiled_patterns:
pattern_score = sum(
1
for pattern in self._compiled_patterns[rule.role]
if pattern.search(signal_content)
)
if pattern_score > 0:
scores[rule.role] += pattern_score * 0.5
details["scores"][f"{rule.role}_patterns"] = pattern_score
for rule in self.ROLE_RULES:
trigger_score = sum(1 for trigger in rule.triggers if trigger.lower() in content_lower)
if trigger_score > 0:
scores[rule.role] += trigger_score * 0.7
details["scores"][f"{rule.role}_triggers"] = trigger_score
for rule in self.ROLE_RULES:
if scores[rule.role] > 0:
scores[rule.role] *= 1 + rule.priority * 0.01
max_role = Role.AI_ENGINEER
max_score = 0.0
for role, score in scores.items():
if score > max_score:
max_score = score
max_role = role
elif score == max_score and score > 0:
role_priority = 0
max_role_priority = 0
for rule in self.ROLE_RULES:
if rule.role == role:
role_priority = rule.priority
if rule.role == max_role:
max_role_priority = rule.priority
if role_priority > max_role_priority:
max_role = role
confidence = min(max_score / 3.0, 1.0) if max_score > 0 else 0.5
details["matched_rules"] = [
rule.name
for rule in self.ROLE_RULES
if scores[rule.role] > 0
]
details["final_scores"] = {role.value: score for role, score in scores.items()}
details["reasons"].append("基于关键词和模式匹配")
return max_role, confidence, details
def _should_escalate_to_boss(self, analysis: dict[str, Any]) -> bool:
dev_days = analysis.get("resource_cost", {}).get("dev_days", 0)
if dev_days >= 5:
return True
risk_level = analysis.get("risk_level", "")
if risk_level in ["CRITICAL", "HIGH"]:
return True
is_architecture = analysis.get("is_architecture_change", False)
if is_architecture:
return True
return False
def get_role_info(self, role: Role) -> dict[str, Any]:
for rule in self.ROLE_RULES:
if rule.role == role:
return {
"role": role.value,
"name": rule.name,
"description": rule.description,
"keywords": rule.keywords,
"priority": rule.priority,
}
return {}
def get_all_roles(self) -> list[dict[str, Any]]:
return [
{
"role": rule.role.value,
"name": rule.name,
"description": rule.description,
"priority": rule.priority,
}
for rule in sorted(self.ROLE_RULES, key=lambda item: -item.priority)
]
class RoutingResult(BaseModel):
"""路由结果模型。"""
role: str
confidence: float
details: dict[str, Any]
signal_id: Optional[str] = None
timestamp: float = Field(default_factory=lambda: now_cn_aware().timestamp())
_global_router: Optional[RoleRouter] = None
def get_router() -> RoleRouter:
"""获取全局路由器实例。"""
global _global_router
if _global_router is None:
_global_router = RoleRouter()
return _global_router
def route_signal(
signal_content: str,
analysis: Optional[dict[str, Any]] = None,
signal_id: Optional[str] = None,
) -> RoutingResult:
"""路由信号到对应角色。"""
router = get_router()
role, confidence, details = router.route(signal_content, analysis)
return RoutingResult(
role=role.value,
confidence=confidence,
details=details,
signal_id=signal_id,
)

View File

@ -1,179 +0,0 @@
"""Static rule definitions for role dispatcher."""
from __future__ import annotations
from dataclasses import dataclass, field
from enum import Enum
from typing import Any, Optional
class Role(str, Enum):
"""系统角色定义"""
BOSS = "boss"
AI_ENGINEER = "ai_engineer"
BACKEND = "backend"
FRONTEND = "frontend"
@dataclass
class RoutingRule:
"""路由规则定义"""
role: Role
name: str
description: str
triggers: list[str] = field(default_factory=list)
keywords: list[str] = field(default_factory=list)
patterns: list[str] = field(default_factory=list)
threshold: Optional[dict[str, Any]] = None
priority: int = 0
ROLE_RULES: list[RoutingRule] = [
RoutingRule(
role=Role.BOSS,
name="战略决策",
description="需要老板决策的高影响任务",
triggers=["cost_estimate", "architecture_change", "high_risk", "security"],
keywords=["预算", "架构", "安全", "风险", "审批", "决策"],
threshold={"dev_days": 5, "risk_level": ["CRITICAL", "HIGH"]},
priority=100,
),
RoutingRule(
role=Role.AI_ENGINEER,
name="AI 工程",
description="AI 模型和数据处理相关任务",
triggers=["prompt", "model", "embedding", "rag", "llm"],
keywords=[
"ollama",
"openai",
"claude",
"prompt",
"embedding",
"rag",
"llm",
"向量",
"模型",
"训练",
"数据清洗",
"token",
"context",
],
patterns=[r"(prompt|embedding|rag|llm|vector|model)", r"(ai|machine.?learning|ml)"],
priority=50,
),
RoutingRule(
role=Role.BACKEND,
name="后端开发",
description="API、数据库、爬虫等后端任务",
triggers=["api", "database", "crawler", "performance", "docker"],
keywords=[
"fastapi",
"sqlalchemy",
"postgres",
"sql",
"async",
"docker",
"kubernetes",
"redis",
"celery",
"爬虫",
"api",
"接口",
"数据库",
"后端",
"性能",
"缓存",
],
patterns=[
r"(api|endpoint|route)",
r"(sql|database|db)",
r"(docker|k8s|kubernetes)",
r"(async|await|celery)",
],
priority=30,
),
RoutingRule(
role=Role.FRONTEND,
name="前端开发",
description="UI、可视化、交互等前端任务",
triggers=["ui", "visualization", "interaction", "responsive", "chart"],
keywords=[
"vue",
"react",
"typescript",
"component",
"chart",
"echarts",
"d3",
"可视化",
"ui",
"ux",
"样式",
"动画",
"响应式",
"组件",
"交互",
"页面",
"布局",
],
patterns=[
r"(vue|react|tsx?|jsx?)",
r"(css|scss|tailwind)",
r"(component|props|emit)",
r"(chart|graph|visualization)",
],
priority=30,
),
]
TECH_KEYWORDS = {
"frontend": [
"vue",
"react",
"typescript",
"javascript",
"css",
"scss",
"tailwind",
"component",
"props",
"emit",
"template",
"style",
],
"backend": [
"fastapi",
"flask",
"django",
"sqlalchemy",
"postgres",
"mysql",
"redis",
"celery",
"async",
"await",
"docker",
"kubernetes",
"k8s",
"api",
"endpoint",
"route",
],
"ai": [
"llm",
"ollama",
"openai",
"claude",
"prompt",
"embedding",
"rag",
"vector",
"model",
"training",
"inference",
"token",
"context",
],
}

View File

@ -13,22 +13,22 @@ from .api.router import api_router
from .core.config import settings from .core.config import settings
from .core.logging import configure_logging, get_logger from .core.logging import configure_logging, get_logger
from .core.response import success_response from .core.response import success_response
from .database import AsyncSessionLocal, engine from .core.database import AsyncSessionLocal, engine
from .main_db_guard import check_database_dialect_guard from .core.startup.db_guard import check_database_dialect_guard
from .main_feishu_outbox import feishu_outbox_drain_loop from .core.startup.feishu_outbox import feishu_outbox_drain_loop
from .main_model_probe import probe_model_connectivity_on_startup, startup_log from .core.startup.model_probe import probe_model_connectivity_on_startup, startup_log
from .main_warmup import warmup_world_models from .core.startup.world_model_warmup import warmup_world_models
from .middleware import AuditContextMiddleware from .middleware import AuditContextMiddleware
from .services.ai_orchestration_run_service import AIOrchestrationRunService from .services.ai_orchestration_run import AIOrchestrationRunService
from .services.context_cache import register_context_cache_invalidation_hooks from .services.context_cache_service import register_context_cache_invalidation_hooks
from .services.feishu_long_connection import init_feishu_long_connection_manager from .services.feishu_long_connection_core import init_feishu_long_connection_manager
from .services.scheduler_center import ( from .services.scheduler_center_core import (
AIPMOCadenceScheduler, AIPMOCadenceScheduler,
KnowledgeGraphIncrementalScheduler, KnowledgeGraphIncrementalScheduler,
KnowledgeUrlRefreshScheduler, KnowledgeUrlRefreshScheduler,
WorkloadRecalcScheduler, WorkloadRecalcScheduler,
) )
from .services.skill_service import init_system_skill_tags from .services.skill import init_system_skill_tags
configure_logging(settings.debug) configure_logging(settings.debug)
logger = get_logger(__name__) logger = get_logger(__name__)

View File

@ -1,5 +0,0 @@
"""Adaptive RAG service compatibility module."""
from .adaptive_rag_service import AdaptiveRAGService
__all__ = ["AdaptiveRAGService"]

View File

@ -27,9 +27,9 @@ import httpx
from sqlalchemy import and_, bindparam, delete, func, or_, select, text from sqlalchemy import and_, bindparam, delete, func, or_, select, text
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ..config.ai_prompts import PROMPT_RAG_ANSWER, PROMPT_RAG_DB_PROJECT_QA, PROMPT_RAG_INTENT_CLASSIFICATION from ...config.ai_prompts import PROMPT_RAG_ANSWER, PROMPT_RAG_DB_PROJECT_QA, PROMPT_RAG_INTENT_CLASSIFICATION
from ..database import AsyncSessionLocal from ...core.database import AsyncSessionLocal
from ..models import ( from ...models import (
KnowledgeBaseChunk, KnowledgeBaseChunk,
KnowledgeBaseDoc, KnowledgeBaseDoc,
KGEvidence, KGEvidence,
@ -48,10 +48,10 @@ from ..models import (
UserProject, UserProject,
UserWorkload, UserWorkload,
) )
from .context_cache import context_cache_service from ..context_cache_service import context_cache_service
from .llm import LLMService from ..llm_service import LLMService
from .signal_source_orchestration_service import SignalSourceOrchestrationService from ..signal_source_orchestration import SignalSourceOrchestrationService
from .symbol_index_service import SymbolIndexService from ..symbol_index import SymbolIndexService
from ..utils.timezone import CN_TZ, now_cn_aware, now_cn_naive from ...utils.timezone import CN_TZ, now_cn_aware, now_cn_naive

View File

@ -0,0 +1,5 @@
"""Public exports for AI orchestration run services."""
from .service import AIOrchestrationRunService
__all__ = ["AIOrchestrationRunService"]

View File

@ -8,10 +8,10 @@ from typing import Any, Optional
from sqlalchemy import and_, select from sqlalchemy import and_, select
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from ..models import AIOrchestrationRun from ...models import AIOrchestrationRun
from ..utils.timezone import now_cn_naive from ...utils.timezone import now_cn_naive
def _utc_now_naive() -> datetime: def _utc_now_naive() -> datetime:
return now_cn_naive() return now_cn_naive()

View File

@ -1,5 +0,0 @@
"""Compatibility exports for AI PMO cadence service."""
from .ai_pmo_cadence import AIPMOCadenceService
__all__ = ["AIPMOCadenceService"]

View File

@ -5,7 +5,7 @@ from __future__ import annotations
import re import re
from typing import Any from typing import Any
from ..ai_pmo_intent_routing import ( from ..ai_pmo_intent import (
INTENT_FOLLOWUP_CONFIRM, INTENT_FOLLOWUP_CONFIRM,
INTENT_FOLLOWUP_CONTINUE, INTENT_FOLLOWUP_CONTINUE,
INTENT_PROJECT_CREATE, INTENT_PROJECT_CREATE,

View File

@ -1,21 +0,0 @@
"""Compatibility exports for AI PMO decision runtime."""
from .ai_pmo_decision import (
DecisionEngine,
ExecutionPolicyBrain,
SimulationEngine,
StrategicBrain,
TacticalBrain,
_normalize_workload_ratio,
_safe_int,
)
__all__ = [
"StrategicBrain",
"TacticalBrain",
"SimulationEngine",
"ExecutionPolicyBrain",
"DecisionEngine",
"_normalize_workload_ratio",
"_safe_int",
]

View File

@ -6,8 +6,8 @@ import re
from dataclasses import dataclass from dataclasses import dataclass
from typing import Any, Optional from typing import Any, Optional
from .project_command_utils import extract_project_create_title from ...utils.project_command_utils import extract_project_create_title
from .signal_source_orchestration_service import SignalSourceOrchestrationService from ..signal_source_orchestration import SignalSourceOrchestrationService
INTENT_QUERY = "query.read_only" INTENT_QUERY = "query.read_only"
INTENT_PROJECT_CREATE = "project.create" INTENT_PROJECT_CREATE = "project.create"

View File

@ -1,3 +0,0 @@
from __future__ import annotations
from .ai_pmo_intent import *

View File

@ -0,0 +1,19 @@
"""Public exports for AI PMO kernel package."""
from .ai_agent_kernel import (
build_decision_trace,
gate_execution,
resolve_correction,
select_intent_route,
)
from .ai_pmo_domain_workflow import SignalSourceDomainWorkflow
from .ai_pmo_kernel_runtime import AIPMOKernelService
__all__ = [
"AIPMOKernelService",
"SignalSourceDomainWorkflow",
"build_decision_trace",
"gate_execution",
"resolve_correction",
"select_intent_route",
]

View File

@ -6,7 +6,7 @@ from typing import Any, Optional
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from .signal_source_orchestration_service import SignalSourceOrchestrationService from ..signal_source_orchestration import SignalSourceOrchestrationService
class SignalSourceDomainWorkflow: class SignalSourceDomainWorkflow:

View File

@ -2,7 +2,7 @@
from __future__ import annotations from __future__ import annotations
from . import ai_pmo_kernel_common as _common from .. import ai_pmo_kernel_common_core as _common
for _name, _value in vars(_common).items(): for _name, _value in vars(_common).items():
if not _name.startswith("__"): if not _name.startswith("__"):

View File

@ -2,7 +2,7 @@
from __future__ import annotations from __future__ import annotations
from . import ai_pmo_kernel_common as _common from .. import ai_pmo_kernel_common_core as _common
for _name, _value in vars(_common).items(): for _name, _value in vars(_common).items():
if not _name.startswith("__"): if not _name.startswith("__"):

View File

@ -2,7 +2,7 @@
from __future__ import annotations from __future__ import annotations
from . import ai_pmo_kernel_common as _common from .. import ai_pmo_kernel_common_core as _common
for _name, _value in vars(_common).items(): for _name, _value in vars(_common).items():
if not _name.startswith("__"): if not _name.startswith("__"):

View File

@ -2,7 +2,7 @@
from __future__ import annotations from __future__ import annotations
from . import ai_pmo_kernel_common as _common from .. import ai_pmo_kernel_common_core as _common
for _name, _value in vars(_common).items(): for _name, _value in vars(_common).items():
if not _name.startswith("__"): if not _name.startswith("__"):

View File

@ -2,7 +2,7 @@
from __future__ import annotations from __future__ import annotations
from . import ai_pmo_kernel_common as _common from .. import ai_pmo_kernel_common_core as _common
for _name, _value in vars(_common).items(): for _name, _value in vars(_common).items():
if not _name.startswith("__"): if not _name.startswith("__"):

View File

@ -2,7 +2,7 @@
from __future__ import annotations from __future__ import annotations
from . import ai_pmo_kernel_common as _common from .. import ai_pmo_kernel_common_core as _common
for _name, _value in vars(_common).items(): for _name, _value in vars(_common).items():
if not _name.startswith("__"): if not _name.startswith("__"):

View File

@ -2,7 +2,7 @@
from __future__ import annotations from __future__ import annotations
from . import ai_pmo_kernel_common as _common from .. import ai_pmo_kernel_common_core as _common
for _name, _value in vars(_common).items(): for _name, _value in vars(_common).items():
if not _name.startswith("__"): if not _name.startswith("__"):

Some files were not shown because too many files have changed in this diff Show More