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

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
backend/
├── app/
│ ├── __init__.py # app 包入口(根目录轻量化后保留)
│ ├── api/ # 路由层(含 endpoints)
│ ├── core/ # 配置、日志、核心能力
│ │ └── startup/ # 启动阶段拆分模块(db guard/outbox/probe/warmup)
│ ├── deps.py # 共享依赖导出(get_db/AsyncSessionLocal)
│ ├── dependencies/ # 鉴权/租户等依赖注入
│ ├── middleware/ # 请求中间件(审计上下文注入等)
│ ├── models/ # SQLAlchemy 模型
@ -53,25 +56,27 @@ backend/
│ ├── 20260311_expand_user_workload_ratio_precision.py # user_workloads.workload_ratio 精度扩容(10,2)
│ └── 20260311_add_conversation_sessions_table.py # 飞书多轮会话上下文持久化表
├── 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 依赖
├── Dockerfile
└── (tests 已移除)
```
- 新增:`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/audited_write.py`(写接口审计上下文、caller 归一、北京时间格式化)
- 新增:`backend/app/middleware/audit_context.py`(请求级 trace/interface/caller 注入)
- 新增:`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/alembic/versions/20260311_shift_all_timestamps_to_beijing.py`(全库历史时间 +8h,数据库默认时区切到 Asia/Shanghai)
- 新增:`backend/alembic/versions/20260312_add_signal_planner_fields.py`(signals 增加 planner 状态字段与索引)
- 新增:`backend/app/services/signal_strategic_analysis_service.py`(Signal Planner 写回收口)
- 新增:`backend/app/services/feishu_outbox_service.py`(复用 reply_hash 的 outbox 入队收口)
- 新增:`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/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/model_context_bundle_service.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/project_knowledge_graph.py`(新增 `ai_model -> governance_policy -> interface` 治理图谱同步能力,增量任务新增 `model_guardrails` 阶段)
- 移除:`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_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_reply_renderer.py`(AI PMO 回执渲染出口 `ReplyRenderer`)
- 新增:`backend/app/services/ai_pmo_typed_executor.py`(AI PMO typed 执行层组合入口)
- 新增:`backend/app/services/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_reply_renderer.py`(AI PMO 回执渲染出口 `ReplyRenderer`)
- 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_typed_executor.py`(AI PMO typed 执行层组合入口)
- 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_typed_executor_common.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_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_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_storage.py`(Kernel 入站事件/工作项写入)
- 新增:`backend/app/services/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_ingress_storage.py`(Kernel 入站事件/工作项写入)
- 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_ingress_render.py`(Kernel 入站结果组装与输出辅助)
- 新增:`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_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_intent.py`(Kernel intent 组合入口)
- 新增:`backend/app/services/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_mixins_intent_resolve.py`(Kernel 最终意图解析入口)
- 新增:`backend/app/services/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_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_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_mixins_followup_verification.py`(followup 执行校验与工具函数)
- 新增:`backend/app/services/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_mixins_closure_data.py`(Kernel 闭环历史上下文回放)
- 新增:`backend/app/services/ai_pmo_kernel_mixins_closure_payload.py`(Kernel 闭环语义与来源上下文组装)
- 更新:`backend/app/services/ai_pmo_kernel_service.py`(兼容入口层,仅导出 `AIPMOKernelService`)
- 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_intent.py`(Kernel intent 组合入口)
- 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_intent_rules.py`(Kernel 规则意图与槽位守卫)
- 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_intent_llm.py`(Kernel LLM 意图识别与仲裁)
- 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_intent_resolve.py`(Kernel 最终意图解析入口)
- 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_followup.py`(Kernel followup 组合入口)
- 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_followup_records.py`(followup 决策/计划/回执写入)
- 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_followup_routing.py`(followup 候选定位与恢复分发)
- 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_followup_project_signal.py`(project_signal followup 组合入口)
- 新增:`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/ai_pmo_kernel_mixins_followup_project_signal_resume.py`(project_signal 目标工作项恢复闭环)
- 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_followup_verification.py`(followup 执行校验与工具函数)
- 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_closure.py`(Kernel closure 组合入口)
- 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_closure_helpers.py`(Kernel 闭环通用归一化工具)
- 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_closure_data.py`(Kernel 闭环历史上下文回放)
- 新增:`backend/app/services/ai_pmo_kernel/ai_pmo_kernel_mixins_closure_payload.py`(Kernel 闭环语义与来源上下文组装)
- 移除:`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/service.py`(组合入口,按 mixin 聚合能力)
- 新增:`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/wecom_api/`(wecom 路由拆分为 config/webhook/messaging 子模块)
- 新增:`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/dispatcher_rules.py`、`backend/app/events_models.py`、`backend/app/seed_projects_helpers.py`(规则/事件模型/seed helper 拆分)
- 新增:`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/dispatcher.py`、`backend/app/dispatcher_rules.py`(未被引用,按废弃文件移除)
- 更新:`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_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/`)
```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`)
- AI Steward 指挥规划接口已移除:`POST /ai-steward/command/dispatch`
- 项目删除接口(`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[]`(姓名/角色/负载比例/状态)用于头部卡片展示
- 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` 走“快速返回 + 后台继续执行”,避免前端长时间阻塞

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 .experiments import router as experiments_router
from .context import router as context_router
from .tasks import router as tasks_router
from .webhooks import router as webhooks_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 .sstc import router as sstc_router
from .ai_steward import router as ai_steward_router
from .feishu import router as feishu_router
from .wecom import router as wecom_router
from .model_capability import router as model_capability_router
from .sstc_api import router as sstc_router
from .ai_steward_api import router as ai_steward_router
from .feishu_api import router as feishu_router
from .wecom_api import router as wecom_router
from .model_capability_api import router as model_capability_router
from .budget import router as budget_router
from .scheduler import router as scheduler_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 .knowledge_graph import router as knowledge_graph_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__ = [
"signals_router",

View File

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

View File

@ -7,7 +7,7 @@ from typing import Any, Optional
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]:

View File

@ -9,11 +9,11 @@ from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy import and_, case, func, select
from sqlalchemy.ext.asyncio import AsyncSession
from ..core.response import success_response
from ..database import get_db
from ..dependencies.auth import get_current_user
from ..models import AIProcessingLog, User
from .ai_logs_utils import apply_project_filter, serialize_log_detail, serialize_log_row
from ...core.response import success_response
from ...core.database import get_db
from ...dependencies.auth import get_current_user
from ...models import AIProcessingLog, User
from .helpers import apply_project_filter, serialize_log_detail, serialize_log_row
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.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.tenant import get_tenant_id
from ...models import DecisionRecord, IngestEvent, PlanBundle, PortfolioSnapshot, Project, ReplyReceipt, User, WorkItem
from ...services.ai_pmo_cadence_service import AIPMOCadenceService
from ...services.ai_pmo_kernel_service import AIPMOKernelService
from ...services.ai_pmo_cadence import AIPMOCadenceService
from ...services.ai_pmo_kernel import AIPMOKernelService
router = APIRouter(prefix="/ai-pmo", tags=["AI PMO"])
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 自动触发分析,推荐替代方案或生成代码片段
"""
from ..services.llm import LLMService
from ...services.llm_service import LLMService
service = get_ai_steward_service(db)

View File

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

View File

@ -18,7 +18,7 @@ async def get_cognitive_conflicts(
- 产品说"用户留存提升10%",开发实现的是"DAU提升10%"
- 双方没有争论,但目标不一致,AI 会主动识别并推送对齐提醒
"""
from ..models import CognitiveConflict, TruthNode
from ...models import CognitiveConflict, TruthNode
from sqlalchemy.future import select
query = select(CognitiveConflict).where(
@ -162,7 +162,7 @@ async def resolve_cognitive_conflict(
AI 会生成解决方案建议,双方确认后标记为已解决
"""
from ..models import CognitiveConflict
from ...models import CognitiveConflict
from sqlalchemy.future import select
result = await db.execute(
@ -199,7 +199,7 @@ async def check_task_charter_mismatch(
2. 技术选型是否符合约束
3. 是否偏离项目方向
"""
from ..models import Task, TruthNode
from ...models import Task, TruthNode
from sqlalchemy.future import select
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
# 统计信号数量
@ -75,7 +75,7 @@ async def get_ai_steward_stats(
active_blockers = blocker_result.scalar() or 0
# 活跃项目数
from ..models import Project
from ...models import Project
project_result = await db.execute(
select(func.count(Project.id)).where(
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 import func

View File

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

View File

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

View File

@ -9,7 +9,7 @@ from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.ext.asyncio import AsyncSession
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.tenant import get_tenant_id
from ..models import User

View File

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

View File

@ -9,7 +9,7 @@ from sqlalchemy import and_, desc, select
from sqlalchemy.ext.asyncio import AsyncSession
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 ..models import Budget, BudgetAlert, User
from ..schemas.budget import (
@ -18,7 +18,7 @@ from ..schemas.budget import (
BudgetOverrideRequest,
BudgetUpdateRequest,
)
from ..services.budget_enforcement_service import BudgetEnforcementService
from ..services.budget_enforcement import BudgetEnforcementService
from ..utils.timezone import now_cn_naive
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.future import select
from ..database import get_db
from ..core.database import get_db
from ..dependencies.tenant import get_tenant_id
from ..models import ContextNode
from ..schemas import ContextNodeCreate
from ..services.llm import llm_service
from ..services.llm_service import llm_service
router = APIRouter(prefix="/context_nodes", tags=["context"])

View File

@ -7,7 +7,7 @@ from typing import List
from fastapi import APIRouter, Depends, Query
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 ....models import User
from ....schemas.skill import (
@ -16,7 +16,7 @@ from ....schemas.skill import (
UserSkillBindingBatchUpdate,
UserSkillBindingResponse,
)
from ....services import skill_service
from ....services import skill as skill_service
from .shared import ensure_self_or_admin
router = APIRouter()

View File

@ -7,14 +7,14 @@ from typing import Optional
from fastapi import APIRouter, Depends, Query
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 ....models import User
from ....schemas.skill import (
PersonnelRecommendationItem,
PersonnelRecommendationResponse,
)
from ....services import skill_service
from ....services import skill as skill_service
router = APIRouter()

View File

@ -8,11 +8,11 @@ from uuid import UUID
from fastapi import APIRouter, Depends, HTTPException, Query, status
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 ....models import User
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
router = APIRouter()

View File

@ -5,10 +5,10 @@ from __future__ import annotations
from fastapi import APIRouter, Depends, HTTPException, status
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 ....models import User
from ....services import workload_service
from ....services import workload as workload_service
from .shared import ensure_self_or_admin
router = APIRouter()

View File

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

View File

@ -4,7 +4,7 @@ from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from ..database import get_db
from ..core.database import get_db
from ..models import SignalFeedback
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.future import select
from ...database import get_db
from ...core.database import get_db
from ...dependencies.auth import get_current_user
from ...dependencies.tenant import get_tenant_id
from ...models import Integration, User
from ...services.auth import has_any_role
from ...services.feishu_integration import get_feishu_service
from ...services.feishu_long_connection import get_feishu_long_connection_manager
from ...services.feishu_integration_service import get_feishu_service
from ...services.feishu_long_connection_core import get_feishu_long_connection_manager
from .schemas import FeishuConfigRequest
router = APIRouter()

View File

@ -7,7 +7,7 @@ from fastapi import APIRouter, Depends, HTTPException
from ...dependencies.auth import get_current_user
from ...models import User
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()

View File

@ -5,11 +5,11 @@ from __future__ import annotations
from fastapi import APIRouter, Depends, HTTPException
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.tenant import get_tenant_id
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
router = APIRouter()

View File

@ -5,12 +5,12 @@ from __future__ import annotations
from fastapi import APIRouter, Depends, HTTPException
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.tenant import get_tenant_id
from ...models import User
from ...services.feishu_integration import get_feishu_service
from ...services.feishu_long_connection import get_feishu_long_connection_manager
from ...services.feishu_integration_service import get_feishu_service
from ...services.feishu_long_connection_core import get_feishu_long_connection_manager
from .helpers import build_long_connection_failure
router = APIRouter()

View File

@ -10,13 +10,13 @@ from pydantic import BaseModel, Field
from sqlalchemy.ext.asyncio import AsyncSession
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.tenant import get_tenant_id
from ..models import User
from ..services.auth import has_any_role
from ..services.model_context_bundle_service import ModelContextBundleService
from ..services.project_knowledge_graph import ProjectKnowledgeGraphService
from ..services.model_context_bundle import ModelContextBundleService
from ..services.project_knowledge_graph_service import ProjectKnowledgeGraphService
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 ..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.tenant import get_tenant_id
from ..models import User
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"])

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 ...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 ...models import Experiment, TruthNode, User
from ...schemas.model_capability import (
@ -20,10 +20,10 @@ from ...schemas.model_capability import (
LifecycleImpactRequest,
ValidateMatchRequest,
)
from ...services.ai_service import get_ai_service
from ...services.cost_optimization_service import CostOptimizationService
from ...services.experiment_sync_service import ExperimentSyncService
from ...services.model_capability_service import ModelCapabilityService
from ...services.model_lifecycle_service import ModelLifecycleService
from ...services.ai_service_core import get_ai_service
from ...services.model_capability.cost_optimization_service import CostOptimizationService
from ...services.experiment_sync import ExperimentSyncService
from ...services.model_capability import ModelCapabilityService
from ...services.model_capability.model_lifecycle_service import ModelLifecycleService
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 ..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 ..models import User
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
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 ..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 ..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.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 ...models import (
AIOrchestrationRun,
@ -29,10 +29,10 @@ from ...models import (
UserProject,
WorkItem,
)
from ...services.ai_pmo_kernel_service import AIPMOKernelService
from ...services.context_cache import context_cache_service
from ...services.ai_pmo_kernel import AIPMOKernelService
from ...services.context_cache_service import context_cache_service
from ...services.operation_log_service import log_operation
from ...services.project_member_service import (
from ...services.project_member import (
ProjectMemberAssignmentError,
notify_member_assignment_failure,
replace_project_members,

View File

@ -9,12 +9,12 @@ from pydantic import BaseModel, Field
from sqlalchemy.ext.asyncio import AsyncSession
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.tenant import get_tenant_id
from ..models import User
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"])

View File

@ -9,7 +9,7 @@ from fastapi import APIRouter, Depends, File, Form, HTTPException, Query, Respon
from sqlalchemy.ext.asyncio import AsyncSession
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.tenant import get_tenant_id
from ...models import User
@ -28,6 +28,6 @@ from ...schemas.rag import (
SymbolSyncRequest,
)
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"])

View File

@ -4,7 +4,7 @@ from typing import Optional
from fastapi import APIRouter, Depends, HTTPException, UploadFile, File
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 ..schemas.recipe import (
RecipeCreate,
@ -13,7 +13,7 @@ from ..schemas.recipe import (
RecipeImageUploadRequest,
RecipeAnalyzeCaloriesResponse,
)
from ..services.recipe_service import get_recipe_service
from ..services.recipe import get_recipe_service
router = APIRouter(prefix="/recipes", tags=["食谱"])

View File

@ -6,34 +6,34 @@ API 路由汇总
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 .experiments import router as experiments_router
from .context import router as context_router
from .tasks import router as tasks_router
from .webhooks import router as webhooks_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 .workloads import router as workloads_router
from .skill_tags import router as skill_tags_router
from .sstc import router as sstc_router
from .projects import router as projects_router
from .skill_tags_api import router as skill_tags_router
from .sstc_api import router as sstc_router
from .projects_api import router as projects_router
from .scheduler import router as scheduler_router
from .ai_steward import router as ai_steward_router
from .feishu import router as feishu_router
from .wecom import router as wecom_router
from .ai_steward_api import router as ai_steward_router
from .feishu_api import router as feishu_router
from .wecom_api import router as wecom_router
from .notifications import router as notifications_router
from .llm_engines import router as llm_engines_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 .rag import router as rag_router
from .rag_api import router as rag_router
from .knowledge_graph import router as knowledge_graph_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 .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 .model_routing import router as model_routing_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.ext.asyncio import AsyncSession
from ..database import get_db
from ..core.database import get_db
from ..dependencies import require_manager_user
from ..models import KnowledgeBaseDoc, Project, User
from ..services.adaptive_rag_service import AdaptiveRAGService
from ..services.ai_pmo_cadence_service import AIPMOCadenceService
from ..services.project_knowledge_graph import ProjectKnowledgeGraphService
from ..services.symbol_index_service import SymbolIndexService
from ..services import workload_service
from ..services.ai_pmo_cadence import AIPMOCadenceService
from ..services.project_knowledge_graph_service import ProjectKnowledgeGraphService
from ..services.symbol_index import SymbolIndexService
from ..services import workload as workload_service
router = APIRouter(prefix="/scheduler", tags=["scheduler"])

View File

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

View File

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

View File

@ -9,12 +9,12 @@ from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from ..core.logging import get_logger
from ..database import get_db
from ..dependencies.tenant import get_tenant_id
from ..models import ProjectSignalLink, Signal
from .signal_sources_models import RecipeBatchRequest, RecipeRecognitionRequest, RecipeRecognitionResponse
from .signal_sources_utils import resolve_target_project_id
from ...core.logging import get_logger
from ...core.database import get_db
from ...dependencies.tenant import get_tenant_id
from ...models import ProjectSignalLink, Signal
from .schemas import RecipeBatchRequest, RecipeRecognitionRequest, RecipeRecognitionResponse
from .helpers import resolve_target_project_id
router = APIRouter(prefix="/signal-sources", tags=["Signal Sources"])
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.future import select
from ...database import get_db
from ...core.database import get_db
from ...models import Signal, SignalFeedback
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.future import select
from ...database import get_db
from ...core.database import get_db
from ...dependencies.tenant import get_tenant_id
from ...models import Signal
from ...schemas import SignalCreate, SignalPriority, classify_signal_priority
from ...services.analyzer import analyze_impact
from ...services.fetcher import fetch_hn_stories
from ...services.lark import LarkService
from ...services.llm import llm_service
from ...services.plane import plane_service
from ...services.signal_capture_service.impact_analyzer import analyze_impact
from ...services.signal_capture_service.external_fetcher import fetch_hn_stories
from ...services.integration_core.lark_service import LarkService
from ...services.llm_service import llm_service
from ...services.integration_core.plane_service import plane_service
router = APIRouter()
lark_service = LarkService()

View File

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

View File

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

View File

@ -6,7 +6,7 @@ from typing import Optional
from pydantic import BaseModel, Field
from ..models import SkillTag
from ...models import SkillTag
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.ext.asyncio import AsyncSession
from ..database import get_db
from ..dependencies import get_current_user, get_tenant_id, require_roles
from ..models import SkillTag, User, UserSkillBinding
from ..services import skill_service
from ..services.ai_pmo_kernel_service import AIPMOKernelService
from ..services.auth import has_any_role
from ..utils.timezone import now_cn_naive
from .skill_tags_contracts import (
from ...core.database import get_db
from ...dependencies import get_current_user, get_tenant_id, require_roles
from ...models import SkillTag, User, UserSkillBinding
from ...services import skill as skill_service
from ...services.ai_pmo_kernel import AIPMOKernelService
from ...services.auth import has_any_role
from ...utils.timezone import now_cn_naive
from .contracts import (
SkillTagCreateRequest,
SkillTagUpdateRequest,
UserSkillCreateRequest,

View File

@ -12,7 +12,7 @@ from sqlalchemy import and_, delete, select
from sqlalchemy.ext.asyncio import AsyncSession
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 ...models import (
AICallLog,
@ -41,16 +41,17 @@ from ...schemas.sstc import (
TaskStatusPatchRequest,
WorkloadOptimizeRequest,
)
from ...services import skill_score_service, workload_service
from ...services.ai_pmo_kernel_service import AIPMOKernelService
from ...services.ai_service import AIService
from ...services.skill import skill_score_service
from ...services import workload as workload_service
from ...services.ai_pmo_kernel import AIPMOKernelService
from ...services.ai_service_core import AIService
from ...services.auth import has_any_role
from ...services.budget_enforcement_service import BudgetEnforcementService
from ...services.feishu_integration import get_feishu_service
from ...services.llm import llm_service
from ...services.budget_enforcement import BudgetEnforcementService
from ...services.feishu_integration_service import get_feishu_service
from ...services.llm_service import llm_service
from ...services.operation_log_service import log_operation
from ...services.skill_service import recommend_personnel
from ...services.sstc_service import ALIGNED_STATUSES, DONE_STATUSES, RELEASE_VERIFIED_STATUSES, SSTCService
from ...services.task_persistence import build_task_create_draft, persist_task
from ...services.skill import recommend_personnel
from ...services.sstc_service_core import ALIGNED_STATUSES, DONE_STATUSES, RELEASE_VERIFIED_STATUSES, SSTCService
from ...services.task_persistence_core import build_task_create_draft, persist_task
from ...utils.title import compact_title
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 ..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 ..models import User
from ..services.auth import has_any_role
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"])

View File

@ -4,13 +4,13 @@ from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy import and_, select
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 ..models import Task, User, UserProject
from ..schemas import TaskBreakdownRequest, TaskBreakdownResponse
from ..services.llm import llm_service
from ..services.plane import plane_service
from ..services.skill_service import recommend_personnel
from ..services.llm_service import llm_service
from ..services.integration_core.plane_service import plane_service
from ..services.skill import recommend_personnel
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.ext.asyncio import AsyncSession
from ...database import get_db
from ...core.database import get_db
from ...dependencies import (
get_current_active_user,
get_current_user,
@ -36,8 +36,8 @@ from ...schemas import (
UserStatusPatchRequest,
UserUpdate,
)
from ...services import skill_service
from ...services.ai_pmo_kernel_service import AIPMOKernelService
from ...services import skill as skill_service
from ...services.ai_pmo_kernel import AIPMOKernelService
from ...services.auth import AuthService
from ...services.operation_log_service import log_operation
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.future import select
from ..database import get_db
from ..core.database import get_db
from ..models import Signal
from ..services.llm import llm_service
from ..services.plane import plane_service
from ..services.llm_service import llm_service
from ..services.integration_core.plane_service import plane_service
from ..utils.timezone import now_cn_aware
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.future import select
from ...database import get_db
from ...core.database import get_db
from ...dependencies.auth import get_current_user
from ...dependencies.tenant import get_tenant_id
from ...models import Integration, User
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
router = APIRouter()

View File

@ -5,11 +5,11 @@ from __future__ import annotations
from fastapi import APIRouter, Depends, HTTPException
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.tenant import get_tenant_id
from ...models import User
from ...services.wecom_integration import get_wecom_service
from ...services.wecom import get_wecom_service
from .schemas import WeComSendMessageRequest
router = APIRouter()

View File

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

View File

@ -8,7 +8,7 @@ from fastapi import APIRouter, Depends, HTTPException, Query
from pydantic import BaseModel, Field
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,
@ -17,7 +17,7 @@ from ..dependencies import (
require_self_or_manager,
)
from ..models import User
from ..services import workload_service
from ..services import workload as workload_service
router = APIRouter(prefix="/workloads", tags=["workloads"])

View File

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

View File

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

View File

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

View File

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

View File

@ -6,7 +6,7 @@ import asyncio
import os
import time
from .core.logging import get_logger
from ..logging import get_logger
logger = get_logger(__name__)
@ -16,7 +16,7 @@ def startup_log(message: str, **fields) -> 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_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
from sqlalchemy.exc import OperationalError, ProgrammingError
from .core.logging import get_logger
from .database import AsyncSessionLocal
from .main_db_guard import is_missing_table_error
from .models import Project, WorkItem
from .services.ai_pmo_kernel_service import AIPMOKernelService
from .utils.timezone import now_cn_aware
from ..logging import get_logger
from ..database import AsyncSessionLocal
from .db_guard import is_missing_table_error
from ...models import Project, WorkItem
from ...services.ai_pmo_kernel import AIPMOKernelService
from ...utils.timezone import now_cn_aware
logger = get_logger(__name__)
ACTIVE_PROJECT_STATUSES = ("active", "planning", "todo", "doing")

View File

@ -11,7 +11,7 @@ import logging
from fastapi import WebSocket, WebSocketDisconnect
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__)

View File

@ -11,7 +11,7 @@ from fastapi.security import OAuth2PasswordBearer
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from ..database import get_db
from ..core.database import get_db
from ..dependencies.tenant import get_tenant_id
from ..models import User, UserStatus # noqa: E402
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.ext.asyncio import AsyncSession
from ..database import get_db
from ..core.database import get_db
from ..models import User, UserProject
from ..services.auth import parse_role_values
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.logging import configure_logging, get_logger
from .core.response import success_response
from .database import AsyncSessionLocal, engine
from .main_db_guard import check_database_dialect_guard
from .main_feishu_outbox import feishu_outbox_drain_loop
from .main_model_probe import probe_model_connectivity_on_startup, startup_log
from .main_warmup import warmup_world_models
from .core.database import AsyncSessionLocal, engine
from .core.startup.db_guard import check_database_dialect_guard
from .core.startup.feishu_outbox import feishu_outbox_drain_loop
from .core.startup.model_probe import probe_model_connectivity_on_startup, startup_log
from .core.startup.world_model_warmup import warmup_world_models
from .middleware import AuditContextMiddleware
from .services.ai_orchestration_run_service import AIOrchestrationRunService
from .services.context_cache import register_context_cache_invalidation_hooks
from .services.feishu_long_connection import init_feishu_long_connection_manager
from .services.scheduler_center import (
from .services.ai_orchestration_run import AIOrchestrationRunService
from .services.context_cache_service import register_context_cache_invalidation_hooks
from .services.feishu_long_connection_core import init_feishu_long_connection_manager
from .services.scheduler_center_core import (
AIPMOCadenceScheduler,
KnowledgeGraphIncrementalScheduler,
KnowledgeUrlRefreshScheduler,
WorkloadRecalcScheduler,
)
from .services.skill_service import init_system_skill_tags
from .services.skill import init_system_skill_tags
configure_logging(settings.debug)
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.ext.asyncio import AsyncSession
from ..config.ai_prompts import PROMPT_RAG_ANSWER, PROMPT_RAG_DB_PROJECT_QA, PROMPT_RAG_INTENT_CLASSIFICATION
from ..database import AsyncSessionLocal
from ..models import (
from ...config.ai_prompts import PROMPT_RAG_ANSWER, PROMPT_RAG_DB_PROJECT_QA, PROMPT_RAG_INTENT_CLASSIFICATION
from ...core.database import AsyncSessionLocal
from ...models import (
KnowledgeBaseChunk,
KnowledgeBaseDoc,
KGEvidence,
@ -48,10 +48,10 @@ from ..models import (
UserProject,
UserWorkload,
)
from .context_cache import context_cache_service
from .llm import LLMService
from .signal_source_orchestration_service import SignalSourceOrchestrationService
from .symbol_index_service import SymbolIndexService
from ..context_cache_service import context_cache_service
from ..llm_service import LLMService
from ..signal_source_orchestration import SignalSourceOrchestrationService
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.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:
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
from typing import Any
from ..ai_pmo_intent_routing import (
from ..ai_pmo_intent import (
INTENT_FOLLOWUP_CONFIRM,
INTENT_FOLLOWUP_CONTINUE,
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 typing import Any, Optional
from .project_command_utils import extract_project_create_title
from .signal_source_orchestration_service import SignalSourceOrchestrationService
from ...utils.project_command_utils import extract_project_create_title
from ..signal_source_orchestration import SignalSourceOrchestrationService
INTENT_QUERY = "query.read_only"
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 .signal_source_orchestration_service import SignalSourceOrchestrationService
from ..signal_source_orchestration import SignalSourceOrchestrationService
class SignalSourceDomainWorkflow:

View File

@ -2,7 +2,7 @@
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():
if not _name.startswith("__"):

View File

@ -2,7 +2,7 @@
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():
if not _name.startswith("__"):

View File

@ -2,7 +2,7 @@
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():
if not _name.startswith("__"):

View File

@ -2,7 +2,7 @@
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():
if not _name.startswith("__"):

View File

@ -2,7 +2,7 @@
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():
if not _name.startswith("__"):

View File

@ -2,7 +2,7 @@
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():
if not _name.startswith("__"):

View File

@ -2,7 +2,7 @@
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():
if not _name.startswith("__"):

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