重构: commands拆分conversation域(strategy单批1-2文件)

- 新建 commands/conversation.rs(336行, 8 conv IPC: create/list/switch/delete/rename/archive/set_pinned/export)
- commands/mod.rs 725→418行(删conv域 + pub mod conversation re-export三级透传)
- lib.rs invoke_handler + 前端零改动;F-09 batch4决策e保留(create不杀旧loop/switch删readonly)
主代兜底: cargo check --workspace 0 + test 98 + grep 8IPC/re-export印证
strategy: 单批1-2文件原子操作;进度 chat+conversation,余 provider/skills/config
This commit is contained in:
2026-06-19 03:19:48 +08:00
parent e6dbb14c5d
commit 86f6c9685b
4 changed files with 430 additions and 320 deletions

View File

@@ -433,3 +433,59 @@
`crates/df-storage/src/{models.rs,migrations.rs,crud/task_repo.rs,crud/settings.rs}` + `src-tauri/src/commands/{task.rs,ai/tool_registry.rs}` + 前端任务组件
---
### 💡 2026-06-19 新需求MCP Server·灵感来源·待实施
> 灵感来源:`9ffa5f15` DevFlow MCP Server对抗式评估 7.2/10推荐 with resources
> 评估关键结论技术切入点和研发性价比极佳ToolDefinition ↔ MCP schema 几乎一致,转换成本极低),但反方强度 0.78——暴露 delete_project 等破坏性操作缺乏鉴权/确认/回滚,外部 AI 幻觉可能导致不可逆误删。**必须在协议接入的同时做工具集安全降级**。
- [ ] **F-260619-02 [P2]****DevFlow MCP Server对外暴露任务/项目/灵感管理能力**。以 MCPModel Context Protocolserver 形式对外暴露 DevFlow 数据层工具,让外部 AI 客户端Claude Code / Cursor / Cline直接读写 DevFlow 的项目、任务、灵感数据。
**形态**:独立 stdio MCP server 子命令(方案 A`devflow mcp-server` 启动,应用未运行时也能被 Claude Code 拉起。
**协议实现**
- `initialize` → 返回 server info + capabilities(tools)
- `tools/list` → 从 AiToolRegistry::tool_definitions() 转换为 MCP Tool 格式
- `tools/call` → 路由到 handler返回 `content: [{ type: "text", text: JSON }]`
- 推荐用 rmcp官方 Rust SDK或最小化手写 JSON-RPC 2.0 over stdio
- MCP Tool schema 与现有 ToolDefinition 结构几乎一致name/description/parameters JSON Schema写一个 `tool_definition_to_mcp()` 转换函数即可
**工具集(首版只暴露数据层,不暴露文件系统工具)**
- 项目list_projects / get_project / create_project / update_project / delete_project / bind_directory
- 任务list_tasks / create_task / update_task / advance_task / delete_task
- 灵感list_ideas / create_idea / update_idea / delete_idea / evaluate_idea
- 工作流run_workflow首版只读/需确认)
- 其他list_trash / restore_project
**⚠️ 安全降级(对抗评估反方核心风险,必须同步实施)**
- **High 风险操作delete/purge/run_workflow默认拒绝** + 返回「请在 DevFlow 应用内执行」——防外部 AI 幻觉导致不可逆误删(反方强度 0.78 核心论点)
- Medium 风险操作create/update默认允许 + 日志审计(写 ai_tool_executions 表留痕)
- 可选 `--read-only` 标志仅暴露 list/get 工具
- **不暴露文件系统工具**read_file/write_file/delete_file 等),避免绕过应用内路径校验
- 仅 stdio / 127.0.0.1,不暴露网络
- 不引入 MCP 客户端功能DevFlow 只做 server
**数据库访问**
- stdio server 启动时打开同一 SQLite`app_data_dir/devflow.db``--db` 参数指定)
- **SQLite WAL 模式确认**:需确认 df-storage 已启用 WAL反方论点并发锁竞争未处理。若未启用 WAL首版要求关闭 DevFlow 再用 MCP server或 MCP server 只读连接
**配置与发现**
- `devflow mcp-server --print-config` 输出 Claude Code / Cursor 的 MCP 配置 JSON 片段
- Claude Code 接入:`claude mcp add devflow -- devflow.exe mcp-server`
**涉及文件**
- 新建 `crates/df-mcp/`Cargo.toml / src/{server.rs, tools.rs, protocol.rs}
- 修改 `src-tauri/src/main.rs`CLI 参数解析,`mcp-server` 子命令分支)
- 修改 `src-tauri/Cargo.toml`(加 df-mcp 依赖 + clap
- 可选:`ai_tools.rs` 把 handler 闭包抽为可独立复用函数
**验收标准**
1. Claude Code 配置后能 `list_projects` / `list_tasks` / `create_task` / `advance_task` 成功
2. 应用运行时 MCP server 也能读写WAL 并发安全)
3. High 风险操作delete/purge/run_workflow被拒绝并返回友好提示
4. `cargo check --workspace EXIT 0` + `cargo test -p df-mcp`(基础协议测试)
5. `devflow mcp-server --print-config` 输出正确配置片段
— 新建 `crates/df-mcp/` + `src-tauri/src/main.rs` + `src-tauri/Cargo.toml` + 可选 `crates/df-ai/src/ai_tools.rs`
---

View File

@@ -875,7 +875,7 @@
- **待修项回流 todo**: **无** 🔴 项(batch8 本身 PASS 无回归) · 🟡 **1 项跨批遗留**(BUG-260619-06-cross-batch L0 clear 致冷启动审批丢失·**归属批2+ 非 batch8**·方案 A `retain(!recovered)` 推荐·供主代/用户评估是否修,非 batch8 审查必修)
### CR-260619-07 F-09 batch4 启用多会话上线(决策e真并发·前后端·agent f09-batch4·commit d899c58) — 🟡 待审
### CR-260619-07 F-09 batch4 启用多会话上线(决策e真并发·前后端·agent f09-batch4·commit d899c58) — ✅ 已审(PASS·⚪2·巡检 2026-06-19 独立 grep/read 核验)
- **范围**(前后端大改,F-09 上线):IPC 签名加 conv_id(ai_is_generating/ai_chat_send/ai_chat_force_send/ai_chat_stop + 内部移除 active 一致性校验)+ 删 switch readonly(决策 e)+ 删 ai_conversation_create 强制结束旧 loop + 删双写桥接/顶层字段(messages/generating/stop_flag/notify/iteration_used/agent_language/model_override/session_trust 全删,per_conv 唯一真相源)+ 删双写代码(全模块)+ pending_approvals retain 目标 conv + finalize_pending_placeholders 按 conv_id + 前端(api/ai.ts+useAiSend/useAiWindow)传 conv_id。保留 session_state(SW 预留标 allow)+ readonly(前端不读)。
- **审查要点**:① IPC 签名 conv_id 前端传参(api/ai.ts/useAiSend/useAiWindow);② 删 readonly 后 switch 生成中可切(决策 e)+ 后台 conv 跳过 reload;③ 顶层字段全删(per_conv 唽一)+ 双写清理完整(grep 顶层引用 0);④ conv_id 上下文一致(前端 activeConversationId);⑤ pending_approvals retain 目标 conv(不误杀他 conv);⑥ switch reload 边界;⑦ 保留项(session_state/readonly)合理(零调用方预留按用户指导保留)。
@@ -883,6 +883,31 @@
- **⚠️ 双会话回归留用户验收**:开 A 跑→切 B 发→A 后台不退出不污染 B;审批/max 续跑跨会话。后端 per_conv 隔离 + 事件 conversation_id 路由保障。
- **关联**:F-09 完整(batch1-8+batch4 上线)。
**复审结论(2026-06-19·巡检独立 grep/read 核验源码当前形态 + 决策e 真并发对抗分析·commit d899c58)**: ✅ **PASS** — 🔴0 🟡0 ⚪2
**7 审查要点逐项核验(file:line 佐证)**:
| # | 要点 | 佐证 | 判定 |
|---|---|---|---|
| ① | IPC conv_id 前端传参 | `api/ai.ts`:sendMessage/forceSend/regenerate/edit/continue/stop/ai_is_generating 全加 conversationId;`useAiSend.ts`:doSend :125/127 传 `state.activeConversationId`、regenerate :174-183/edit :244-252 有 `if(!convId)` null 保护 | ✅ |
| ② | 删 readonly 后台 conv 可切 | `agentic.rs:546` loop 退出判据 `!per_conv.contains_key(&conv_id)`(conv 存在性,非 active 一致性);:539-541 注释「旧 loop 跑自己 conv 不污染他人,active 切换不让退出」 | ✅ |
| ③ | 顶层字段全删 + 双写清理 | grep `session.generating/messages/stop_flag/notify/iteration_used/agent_language/model_override/session_trust` 全命中**注释**(agentic.rs:400/993、mod.rs:474 等),无实际顶层读写代码(cargo check 0 印证) | ✅ |
| ④ | conv_id 上下文一致 | `run_agentic_loop:338` conv_id 入参快照,全程 `session.conv(&conv_id)`;`try_continue_agent_loop:1075` 显式 conv_id 入参(:1214 注释「active_conversation_id 字段移除,改入参 conv_id」);loop 内 grep active_conversation_id **无实际读写** | ✅ |
| ⑤ | pending_approvals retain 目标 conv | switchConversation(`mod.rs:482`)/deleteConversation(:526)/ai_chat_clear(`chat.rs:536`)/ai_chat_stop(:895/1015)全 `retain(... != target)`,不误杀他 conv,保护 restore 重建链路(注释 :480-481) | ✅ |
| ⑥ | conv_id=null fallback | `ai_is_generating:178-182`(null→fallback active→空返 false)/`ai_chat_send:218-233`(null→active→懒创建 new_id)/`ai_chat_stop:994-998`(空返 Ok) | ✅ |
| ⑦ | ai_continue/stop_loop 移除 active 校验 | `chat.rs:1094/1129` 实际只 `conv_read(&conv_id).generating` 校验,**无 active 一致性**(决策e 落地) | ✅ |
**对抗核验印证(防污染)**:
- **CR-06 修复延续 ✅(关键)**:`lib.rs:62 session.pending_approvals.retain(|_,a| !a.recovered)` 在 batch4 后**仍保留**(:59-62 注释「BUG-260619-06 修复」)。batch4 删顶层 generating 双写复位(:45)+ 删 active 兜底(顶层退役后无意义),但 retain 修复完整保留 → 上轮审 CR-06 的 🔴 未被新批破坏。
- **决策e 真并发核心 ✅**:loop 退出判据 conv 存在性(:546)+ loop conv_id 快照不读 active(:348/368)+ guard/stop_flag/notify/messages 全 per_conv(:97/1100/1135)+ 事件 emit 全带 conversation_id → A 后台 loop 切 B 不退出不污染,设计契约与 switchConversation retain 一致。
- 主代自审 PASS + cargo check 0 + test 98,独立核验源码形态印证(非信声明)。决策e 真并发时序保障经多维度交叉(前端传参/后端 fallback/loop 快照/退出判据/retain 路由)成立。
**⚪ low(2)**:
1. **注释过时(6 处,功能正确但误导维护)**:`agentic.rs:400`(model_override「入参←session」→ 实为函数入参)/`:993`(session.iteration_used→ 实为 per_conv)/`chat.rs:1079`(session.iteration_used→per_conv)/`:1082-1083`&`:1117-1118`(ai_continue/stop_loop 文档注释「校验 active 一致性」→ batch4 已移除)/`mod.rs:474`(批2 迁移说明残留)。建议批量更新对齐 batch4 per_conv 化 + 移除 active 校验。
2. **双会话实机验收(CR-07 :883 已声明)**:开 A 跑→切 B 发→A 后台不退出不污染 B;审批/max 续跑跨会话。后端 per_conv 隔离 + 事件 conversation_id 路由 + loop 退出判据 conv 存在性已核验保障,真并发时序(两 conv 同时 loop + provider pool/llm_concurrency 竞争)需实机验收。
- **待修项回流 todo**: **无** 🔴/🟡 项
---
## 已审归档