优化: 波8待办销账(F-15阶段3+AE-04)+CR-51登记+B-260617-01入待决策
This commit is contained in:
16
docs/todo.md
16
docs/todo.md
@@ -59,6 +59,18 @@
|
||||
- [ ] B-260616-11 [P2] — **AI 消息 `-`/`+` 列表/diff 无视觉效果**。marked 实测两个出口:①裸 `-`/`+` 混用 → GFM 要求同列表标记一致,marked 拆成**两个独立 `<ul>`** 且 `-`/`+` 被 eat 当 marker(用户看到的符号消失,两个分离单项列表);②```diff 代码块 → `<pre><code class="language-diff">` **无 hljs 高亮**(ai-md.css 未集成 highlight.js),`-`/`+` 字面纯文本无红绿。根因层 marked 行为合规,缺的是 **diff 高亮集成 + 裸 diff 文本识别**。改动(待定):①集成 hljs 覆盖 ```diff(关联已知待办「aichat交互体验改进方案-2026-06-14」2.2 代码块高亮)②裸 `-`/`+` diff 文本预处理识别。— src/composables/useMarkdown.ts + src/styles/ai-md.css。**②子项已修(第㉖批 2026-06-16·主代理直修)**:useMarkdown.ts L40-41 import diff + L63 registerLanguage('diff', diff)(16→17 语言),```diff 代码块经 highlightCode getLanguage('diff') 命中 → hljs-addition/deletion token class → github-dark.css 红绿。**①子项仍②类待复现**:裸 -/+ 文本预处理识别(需确认 AI 实际输出格式)。**batch58 可行性评估结论(2026-06-16·workflow w2dw65maz·Agent C 仅评估未改码)**:推荐**方案A**(renderMd/parseBlockNoCache 前 `wrapNakedDiff` 正则检测连续 ≥2 行 ±开头→包裹 ```diff 围栏,复用已就绪 hljs diff 红绿样式零额外 CSS);方案B(CSS ::before 注入)**否决**(marked 已 eat 掉原始 ±符号,li 内文本信息丢失无法区分);方案C(marked custom tokenizer)**否决**(侵入 marked 内部收益不优于 A)。守卫:纯 `-` 列表(普通 ul)不触发+必须含 `+` 行混排。**暂缓实施**:需求前提(AI 实际输出格式)未验证,不同 LLM 输出 diff 格式差异大(围栏/裸行/自然语言描述),盲目做可能解决不存在的问题;确认需求后 0.5 批次(~40-60 行+测试)。vue-tsc exit 0。
|
||||
- [x] ✅(第㉗批 2026-06-16·workflow) B-260616-19 [P2] — **知识库详情窄屏标题挤压成竖线(一行一字)**。三因子叠加(Knowledge.vue):①`.kn-layout` grid `grid-template-columns: 360px 1fr`(L567)——左列表死钉 360px、右详情 `1fr` 拿剩余,**无响应式断点**;窗口窄(如总宽 500px,减 padding 40+gap)详情列塌缩到 ~80px 甚至更小。②`.detail-title`(L625)`font-size:18px` + `word-break:break-word` —— 窄列里中文每字宽度 > 列宽,逐字换行 → 竖线化。③`.detail-actions`(L626)`flex-shrink:0` —— 编辑/发布/拒绝 3 按钮不缩,优先占位,把 `.detail-title-row`(`flex:1`) 挤到零头。`.kn-detail-panel`(L570-576) 无 `min-width` 兜底。改动(待定):①grid 列宽改 `minmax(240px,360px) 1fr` + `@media (max-width:760px)` 切单列(`grid-template-columns:1fr`,列表详情上下堆叠);②详情面板加 `min-width:0` 配合标题行 `min-width` 防塌缩;③可选标题字号响应式降级(18px→15px)。— src/views/Knowledge.vue。**低风险纯 CSS**,无逻辑/i18n/数据变动。
|
||||
|
||||
### 🔧 2026-06-17 实测发现 bug(审批流程三连)
|
||||
|
||||
> 用户实测:AI 对话中让 AI 创建任务并推进状态 → AI 调 `run_workflow(task_id, target_status)` → 审批卡片渲染 → 用户点批准 → handler 返回 Err → LLM 重试循环。
|
||||
|
||||
- [ ] B-260617-01 [P1] — **run_workflow 作为 AI 工具无法执行 + 无意义重试 + 审批混淆**。三个关联问题:
|
||||
- **问题 1**:`run_workflow` handler(tool_registry.rs:530-546)仅持有 `db: Arc<Database>`,无法访问 `AppHandle/State`(registry/event_bus/workflows Repo),返回 `Err("run_workflow 工具需经 Tauri IPC 执行...")`。审批通过后 `ai_approve`(commands.rs:329)调 `ai_tools.execute()` → handler 必然 Err → `audit_status="failed"` → 错误信息作为 tool_result 回传 LLM。工作流实际未执行,任务状态未推进。
|
||||
- **问题 2**:handler Err → tool_result=错误提示 → LLM 认为失败 → 重试(1/4) → 同结果循环。工具定义未标 `no_retry`,浪费 token + 用户反复审批。
|
||||
- **问题 3**:前端渲染的是 AI 工具审批(tool_call pending_approval),非工作流 HumanNode 审批。用户批准后工作流引擎从未启动,HumanNode 审批节点从未到达。
|
||||
- **修复方向**:**方案 A(推荐)**:前端拦截 — `ai_approve` 中识别 `run_workflow` tool_call → 不走 `ai_tools.execute` → 直接 `invoke('run_workflow', {task_id, target_status})` → 结果回填 tool_result。**方案 B**:后端注入 State — `build_ai_tool_registry` 传入 `AppHandle` 使 handler 可直接执行。问题 2/3 随 A 自动消解。
|
||||
- **代码定位**:tool_registry.rs:530-546(handler 返 Err)/ audit.rs:590-630(High risk 进 pending)/ commands.rs:329-334(ai_approve execute→Err→failed)/ agentic.rs:503-508(pending_count>0 暂停循环)
|
||||
— src-tauri/src/commands/ai/{tool_registry,audit,commands,agentic}.rs + src/composables/ai/useAiSend.ts
|
||||
|
||||
### 🔧 2026-06-16 aichat 工具卡片重复渲染排查(仅分析·未实施)
|
||||
|
||||
> 排查性质(session-role-diagnose-only),走查定位根因 + 记录待办,未改代码。
|
||||
@@ -102,7 +114,7 @@
|
||||
- [x] ✅(波2·2026-06-16·w76d81dno+主代核查,vue-tsc,决策a逐条续发) UX-260616-05 [P1] — **打断按钮只停当前回复 + 队列保留续发(不清队列)**。用户需求:发送队列有消息时,打断按钮应只打断当前回复,并把队列中的多条消息一并发送给后续对话。现状:`stopChat`(useAiSend.ts:365-370) L368 `state.queue = []` **清空队列** → 用户生成中排队的消息随打断被**静默丢弃**。技术底座已就绪(已核后端):`stopChat`→`aiApi.stopChat`→后端 `stop_flag.load`(agentic.rs:178)→收尾 `save_conversation`(:185 已生成文本入库)+emit **`AiCompleted`**(agentic.rs:190,注释明确「保证前端收事件时后端已可接下一条,发送队列续发不被拒」)→前端 `ai-drain-queue`→`drainQueue`(useAiSend.ts:228) shift 队首续发。**最小修复(确定)**:删 stopChat L368 `state.queue=[]`,打断后 AiCompleted 自然触发 drainQueue 续发队首;当前未完成回复已入库(:185)保留为截断回复,无需额外处理。**决策点(待定)——「队列多条一并发送」语义**:**(a) 逐条续发**(删清队列即可,零改 drainQueue,AiCompleted 链式触发每条,保各条上下文独立)vs **(b) 合并成一条消息**(队列多条 text 拼接送,需改 drainQueue 为 bulkDrain 或合并 text 调一次 sendMessage)。**倾向 (a)**(逐条保上下文独立+零改链路;"一并"理解为「都送出不丢弃」非字面合并),**待用户确认**。— src/composables/ai/useAiSend.ts(stopChat:365 + drainQueue:228) + 后端 agentic.rs(:178/:190 stop 收尾 emit AiCompleted 已就绪)。
|
||||
- [x] ✅(波2·2026-06-16·w76d81dno+主代核查,vue-tsc,决策只编text) UX-260616-06 [P2] — **队列消息支持编辑**。用户需求:队列中的消息支持编辑。现状:队列 UI(AiChat.vue:511-516) 每项只有 × 删除(cancelQueued:353),无编辑入口;队列项结构 `{ text, skill?, enqueuedAt }`(stores/ai.ts:70)。**改动(纯前端低风险)**:队列项加「编辑」按钮 → 点击切 inline input(单行 textarea)→ 回车/失焦写回 `state.queue[idx].text`、ESC 取消;新增 `editQueued(index, newText)`(useAiSend.ts) splice 写回 + store 导出 + composable return。**决策点(待定)**:skill 是否可编辑(**倾向只编 text**——skill 来自发送时技能联想,编辑态不暴露 skill 改,简化交互)。i18n 补 edit/save/cancel key。— src/components/AiChat.vue(:511-516 队列项 UI + .ai-queue-item CSS:2856) + src/composables/ai/useAiSend.ts(editQueued 新增) + stores/ai.ts + i18n。
|
||||
- [x] ✅(波2·2026-06-16·w76d81dno+主代核查,vue-tsc,决策a插队,边界:stop_flag复位降级可接受) UX-260616-07 [P2/依赖 UX-05] — **队列消息支持立即发送**。用户需求:队列中的消息支持立即发送。现状:队列项只能 × 删除或等 drainQueue 串行轮到,无插队。**决策点(待定)——「立即发送」语义**:**(a) 插队=打断当前+立即发这条**(splice 出该项→stopChat→sendMessage 该条;复用 UX-05 stop→AiCompleted→drain 链路,当前未完成回复走 stop 截断保留)vs **(b) 移到队首等当前完成优先**(splice 出→unshift 队首,drainQueue 下一轮先发它,不打断当前)。**倾向 (a)**("立即"字面=马上发,且复用 UX-05 链路;但须注意 splice 后调 stopChat 已不清队列(UX-05),避免已发送项重复入队)。**待 UX-05 打断语义定后同批设计**(共享 stop+drain 链路)。— src/components/AiChat.vue(:511-516 队列项加「立即发送」按钮) + src/composables/ai/useAiSend.ts(sendQueuedNow 新增)。
|
||||
- [ ] F-260616-15 [P1] — **AI Chat 上下文管理增强:会话分段 + 手动压缩 + 智能裁剪**。三个子需求,详见 [F-15-上下文管理增强设计-2026-06-16.md](./02-架构设计/F-15-上下文管理增强设计-2026-06-16.md)。**阶段1 基础部分 ✅(波3·8a142c2 is_active 白名单+push token 修正)**;阶段1 剩余 ✅(波5·63bff8b compress_prompt四段式+compress_via_llm+context 9辅助方法,幂等/单向不可逆/纯函数/零行为变化,df-ai 107pass);阶段2 手动功能 ✅(波6·4194842+主代核查,cargo0err+vue-tsc0+devflow79pass,2 IPC ai_chat_clear_context/compress_context+3事件 AiContextCleared/AiCompressing/AiCompressed+前端2按钮+status分组渲染+useAiContext composable,clear标archived_segment不删DB/compress LLM失败不阻塞);阶段3 自动(loop压缩+事件)待波7。
|
||||
- [ ] F-260616-15 [P1] — **AI Chat 上下文管理增强:会话分段 + 手动压缩 + 智能裁剪**。三个子需求,详见 [F-15-上下文管理增强设计-2026-06-16.md](./02-架构设计/F-15-上下文管理增强设计-2026-06-16.md)。**阶段1 基础部分 ✅(波3·8a142c2 is_active 白名单+push token 修正)**;阶段1 剩余 ✅(波5·63bff8b compress_prompt四段式+compress_via_llm+context 9辅助方法,幂等/单向不可逆/纯函数/零行为变化,df-ai 107pass);阶段2 手动功能 ✅(波6·4194842+主代核查,cargo0err+vue-tsc0+devflow79pass,2 IPC ai_chat_clear_context/compress_context+3事件 AiContextCleared/AiCompressing/AiCompressed+前端2按钮+status分组渲染+useAiContext composable,clear标archived_segment不删DB/compress LLM失败不阻塞);阶段3 自动 ✅(波8·0202b51+主代核查,cargo0err+vue-tsc0+devflow79pass,loop顶部检测budget×0.6+压缩+降级原裁剪,set_compressing成对,延迟mutate失败零副作用)。**F-15 全阶段完成 ✅**。
|
||||
|
||||
**核心问题**:① `ai_chat_clear` 全删 DB 消息不可回溯 ② `build_for_request` 超预算直接丢弃旧消息零保留(`agentic.rs:226` `_trimmed` 被忽略) ③ 无压缩能力。
|
||||
|
||||
@@ -614,7 +626,7 @@
|
||||
|
||||
**P1 — 增强控制力**
|
||||
|
||||
- [ ] AE-2025-04 [P1] — **会话级授权(Session Trust)**。替代原"全局宽松模式"。核心:信任是上下文相关的——同一会话内用户批准过某类操作后,后续同类操作自动放行;换会话清空重审。模型:AiSession 加 `session_trust: HashSet<TrustKey>`(内存态,随会话销毁);TrustKey 按操作+目标范围粒度(如 `Write { dir: "src/" }`、`Execute { dir: workspace }`)。流程:首次操作→pending_approval 用户批准→记录 TrustKey → 同会话后续同类操作命中则自动放行(消息流显示轻量提示 `🔓 自动放行: write_file(xxx)`)。**白名单收紧决策**:纯读取(list_*/read_*/list_directory)始终自动放行;创建/修改/绑定/覆盖写入/高危全部需审批或会话级授权放行(bind_directory 归类为修改操作;write_file 覆盖写入已出事故不放行)。**首批实现**:write_file + run_command(写→跑→看→改闭环最高频连续操作);create/update 后续按需加。改动:①`mod.rs` AiSession 加 session_trust 字段 + TrustKey enum ②`audit.rs` process_tool_calls 审批前查 session_trust 命中则跳过 pending ③审批通过时写 session_trust ④前端自动放行操作显示轻量 toast 提示。关联 AE-05(High 二次确认: 会话级授权的操作是否也需二次确认? 建议: 首次审批走二次确认,后续自动放行跳过)。预估 1.5 天 — src-tauri/src/commands/ai/(mod.rs|audit.rs) + src/components/AiChat.vue — **设计决策(2026-06-16)**: 目录级粒度(非文件级)、仅写+执行首批、Webhook 未来走独立 execution_token 链路不影响本设计
|
||||
- [x] ✅(波8·6ec191e+主代核查,cargo0err+vue-tsc0+devflow79pass) AE-2025-04 [P1] — **会话级授权(Session Trust)**。替代原"全局宽松模式"。核心:信任是上下文相关的——同一会话内用户批准过某类操作后,后续同类操作自动放行;换会话清空重审。模型:AiSession 加 `session_trust: HashSet<TrustKey>`(内存态,随会话销毁);TrustKey 按操作+目标范围粒度(如 `Write { dir: "src/" }`、`Execute { dir: workspace }`)。流程:首次操作→pending_approval 用户批准→记录 TrustKey → 同会话后续同类操作命中则自动放行(消息流显示轻量提示 `🔓 自动放行: write_file(xxx)`)。**白名单收紧决策**:纯读取(list_*/read_*/list_directory)始终自动放行;创建/修改/绑定/覆盖写入/高危全部需审批或会话级授权放行(bind_directory 归类为修改操作;write_file 覆盖写入已出事故不放行)。**首批实现**:write_file + run_command(写→跑→看→改闭环最高频连续操作);create/update 后续按需加。改动:①`mod.rs` AiSession 加 session_trust 字段 + TrustKey enum ②`audit.rs` process_tool_calls 审批前查 session_trust 命中则跳过 pending ③审批通过时写 session_trust ④前端自动放行操作显示轻量 toast 提示。关联 AE-05(High 二次确认: 会话级授权的操作是否也需二次确认? 建议: 首次审批走二次确认,后续自动放行跳过)。预估 1.5 天 — src-tauri/src/commands/ai/(mod.rs|audit.rs) + src/components/AiChat.vue — **设计决策(2026-06-16)**: 目录级粒度(非文件级)、仅写+执行首批、Webhook 未来走独立 execution_token 链路不影响本设计
|
||||
- [x] AE-2025-05 ✅(第⑲批 2026-06-16) — ~~High 二次确认~~ onApprove async:approved&&HIGH_RISK_TOOLS.has(tc.name)(delete_task/delete_project/restore_project/purge_project/delete_file/run_command 6 工具白名单,后端不回传 risk 故按名判定)→await confirmDialog(highRiskConfirmMsg)在 approving 置 true 前,!ok return 不进 loading 态可重试;拒绝路径不加确认(无害);approving loading+130s 兜底(B-260616-08)原样保留。每卡独立 useConfirm 实例不串台。i18n confirmHighDelete/Exec/Generic zh/en 对称。vue-tsc 0 err。TODO:后端回传 risk_level 后改读字段免维护白名单 — src/components/ToolCard.vue
|
||||
- [x] AE-2025-06 ✅(第⑲批 2026-06-16) — ~~审批超时自动 reject~~ 纯前端定时器 APPROVAL_TIMEOUT_MS=5min(useAiSend.ts Map<id,timer>+start/clear/clearAll 三函数);启动挂 AiApprovalRequired(非 approveToolCall,agent 修正正确:审批开始是事件点非点击末态);Completed/ApprovalResult(!approved) clear 单条;onStreamTimeout 经 Tauri 事件总线 emit ai-approval-clear-timers→useAiEvents listen clearAll(破循环依赖 useAiStream 不能 import useAiSend);stopListener 卸载清;超时调 ai_approve(id,false)+push 系统错误消息(⚰ i18n ai.approvalTimeout)。vue-tsc 0 err。TODO:Settings 可配(toast 跨层接线改 push 消息参照 onStreamTimeout 模式,未碰 Settings god file)。行为变更但决策已定。原:pending_approval 超时自动 reject(默认 5 分钟),防对话永久卡死。**决策:纯前端定时器**(审批依赖页面交互,页面关闭 auto-reject 合理;不改后端)。超时后 toast 提示「⚰ 审批超时,已自动拒绝: {tool_name}({reason})」+ 调 ai_approve(id, false)。Settings 可配超时常量(3/5/10min)。**范围限定**:仅覆盖人工审批场景。未来 Webhook/外部集成走独立 `execution_token` 预鉴权链路(不经过 pending_approvals),不影响本设计。预估 0.5 天 — src/composables/ai/useAiSend.ts + src/views/Settings.vue
|
||||
|
||||
|
||||
16
docs/待决策.md
16
docs/待决策.md
@@ -25,6 +25,22 @@
|
||||
|
||||
## 当前队列
|
||||
|
||||
### ③类 — 产品取舍(有 a/b/c 决策点,核心待拍板)
|
||||
|
||||
#### B-260617-01 run_workflow 作为 AI 工具无法执行 + 无意义重试 + 审批混淆
|
||||
- **背景**:2026-06-17 实测发现,AI 对话中调用 `run_workflow(task_id, target_status)` 推进任务状态,审批通过后 handler 返回 Err 提示字符串(`tool_registry.rs:530-546`),`ai_approve`(`commands.rs:329-334`)将其包成 `"failed"` tool_result 回传 LLM → LLM 认为失败 → 重试(1/4) → 又进审批 → 循环。三个关联问题:
|
||||
- **问题 1**:run_workflow handler 仅持有 `db: Arc<Database>`,无法访问 `AppHandle/State`(registry/event_bus/workflows Repo),返回 Err 提示前端走 IPC。但 `ai_approve` 审批通过后直接 `ai_tools.execute()` 调 handler → 必然 Err。
|
||||
- **问题 2**:handler Err → tool_result = 错误提示 → LLM 重试 → 同结果循环(工具定义未标 `no_retry`)。
|
||||
- **问题 3**:前端渲染的是 AI 工具审批(tool_call pending),非工作流 HumanNode 审批。用户批准后工作流引擎从未启动。
|
||||
- **决策点**:run_workflow 审批通过后如何真正执行工作流?
|
||||
- **选项**:
|
||||
- a: **前端拦截**(`ai_approve` 中识别 `run_workflow` → 不走 `ai_tools.execute` → 直接 `invoke('run_workflow', {task_id, target_status})` → 结果回填 tool_result)
|
||||
- b: **后端注入 State**(`build_ai_tool_registry` 传入 `AppHandle` 使 handler 可直接执行,改 state.rs + tool_registry 签名)
|
||||
- c: **从 AI 工具移除 run_workflow**(仅保留 advance_task 推进状态,工作流由用户手动在前端触发)
|
||||
- **推荐**:**a 前端拦截**(改动最小,`ai_approve` 一处分支即可;方案 b 需改 tool_registry 签名链路较长;方案 c 退回手动不符合 AI 驱动目标)。问题 2/3 随 a 自动消解。
|
||||
- **关联**:todo B-260617-01 / tool_registry.rs:530-546 / commands.rs:329-334 / audit.rs:590-630
|
||||
- **状态**:🟡 待决
|
||||
|
||||
### ⏸️ 暂缓(待条件触发)
|
||||
|
||||
#### T-260614-11 条件表达式引擎升级
|
||||
|
||||
20
docs/待审查.md
20
docs/待审查.md
@@ -337,6 +337,26 @@
|
||||
- ⑨**useAiConversations status 透传**:switchConversation mapper 透传 status 字段(archived_segment/compressed 落 AiMessage 供渲染折叠),types.ts 未含此字段经 cast 读写闭环。
|
||||
- **⚠️ 已知设计取舍(backend 自报,记审查项)**:clear_context 经 messages_mut() 改 status 后,ContextManager.history_tokens(私有字段无 setter)不立即扣减 archived 段 token(与 compress_old_messages 路径不同,compress 内部扣 token)。后果:history_tokens 短暂偏高,build_for_request 超预算裁剪可能比实际更早触发,属保守方向(不超发)不劣化安全性。代码注释已标注口径。
|
||||
|
||||
### CR-260616-51 波8 F-15阶段3 agentic loop自动压缩(0202b51) + AE-2025-04会话级授权(6ec191e) — 🟡 待审
|
||||
|
||||
- **范围**: 2 agent 并行 workflow wigdmq5s4,文件域零重叠(阶段3 独占 agentic.rs;AE-04 独占 mod.rs/audit.rs/commands.rs/tool_registry.rs/AiChat.vue/useAiEvents.ts/types.ts/i18n×2)。
|
||||
- **commit**: 0202b51(阶段3)+ 6ec191e(AE-04)。分 2 commit(语义清,功能不同)。
|
||||
- **主代核查(2026-06-17)**: cargo check --workspace EXIT 0(6 warning 全 pre-existing dead_code)/ npx vue-tsc --noEmit EXIT 0(零输出)/ cargo test -p devflow --lib **79 passed**(无回归)/ grep 核验形态(阶段3 loop 顶部压缩分支 + set_compressing 成对 + AE-04 TrustKey/session_trust/audit 查 trust/ai_approve 写 trust)。
|
||||
- **审查 agent 待复审重点**:
|
||||
- ①**阶段3 loop 语义不变**:agentic.rs loop 顶部加压缩检测分支(L259-374),主 loop 迭代/stream/重试/tool_calls/converge 零改动。压缩是 build_for_request 前预处理。
|
||||
- ②**阶段3 触发条件**:`budget*6/10 < history_tokens`(0.6 阈值整数比避浮点)+ protect_start>0 + has_compressible_messages(protect_start)。
|
||||
- ③**阶段3 防重入 + 成对**:prev_compressing 守卫(L280)+ set_compressing(true)(L303)↔ 三出口 false(L340 成功/L355 noop/L361 Err)。成对覆盖所有分支。
|
||||
- ④**阶段3 延迟 mutate(成功才改)**:先取 active 克隆 → LLM 出摘要 → 成功才 compress_old_messages(标 compressed+扣 token)+ insert_at(摘要)。失败零副作用(消息状态/token 完全不变)。理由:history_tokens 私有无 setter,失败回滚 token 不精确;延迟 mutate 语义最干净。
|
||||
- ⑤**阶段3 降级**:LLM 失败/空摘要 → set_compressing(false)+ emit AiError(message 不含 api_key)+ 继续走原 build_for_request 裁剪(不阻塞 loop)。
|
||||
- ⑥**阶段3 emit conversation_id 路由**:AiCompressing(L298)/AiCompressed(L348)/AiError(L367)三处均 Some(conv_id)。
|
||||
- ⑦**AE-04 TrustKey 设计**:mod.rs:201 enum Write{dir}/Execute{dir}(目录级,derive Hash/Eq)+ trust_key_for(:215 write_file→Write 父目录/run_command→Execute working_dir)+ 首批仅 write_file/run_command 命中(其余 None 走原审批)。
|
||||
- ⑧**AE-04 session_trust 内存态**:HashSet<TrustKey>(mod.rs:346),new 初值空(:363),换会话(create/switch)clear(commands.rs:1161/1241)重审,不落库。
|
||||
- ⑨**AE-04 audit 查 trust**:audit.rs:568 process_tool_calls 审批前(Med/High 进 pending 前)查 session_trust.contains 命中 → 直接执行(非复用缓存,与 F-05 去重不同)+ emit AiToolAutoApproved(:587)+ Completed + audit decided_by=auto_trust(:613)留痕 + continue 跳过 pending + 二次确认。
|
||||
- ⑩**AE-04 ai_approve 写 trust**:commands.rs:294-295 用户批准时 trust_key_for 命中 → session_trust.insert(下次同类自动放行)。
|
||||
- ⑪**AE-04 前端 toast 桥接**:AiToolAutoApproved 后端 emit → useAiEvents case(types.ts union)→ emit ai-tool-auto-approved-toast 事件总线 → AiChat.vue listen 弹 info toast(🔓 自动放行),非审批气泡避免干扰。
|
||||
- ⑫**AE-04 FR-S1**:TrustKey 只含 tool+dir,不含 api_key/文件内容/命令串(mod.rs:189 注释)。
|
||||
- **待修项回流 todo**: **无**(核心 grep+test+构建全 PASS;阶段3 延迟 mutate 口径 + AE-04 目录级粒度为设计取舍非 bug)。
|
||||
|
||||
---
|
||||
|
||||
## 已审归档
|
||||
|
||||
Reference in New Issue
Block a user