优化: 聊天体验批与Web规范合规

This commit is contained in:
lxy
2026-10-05 23:41:32 +08:00
parent 9e81182b4f
commit 28e6acbf3f
41 changed files with 1518 additions and 570 deletions
@@ -0,0 +1,209 @@
# todo 归档(2026-10-05)
> 本文件由 2026-10-05 归档拆批自动迁移:docs/todo.md 中经实测核验全完成的历史走查段。拆分判据=段内零未完成勾选项 + 标题无「未修/未核对」残余标注。
---
### 💡 2026-08-04 父子任务支持(✅ 已完成)
> 目标:完成父任务/子任务的完整支持(数据→后端→前端),UI/UX 重点设计。
> 详情:[04-功能迭代/父子任务支持设计-2026-08-04.md](./04-功能迭代/父子任务支持设计-2026-08-04.md)
- [x] **后端** ✅ 父聚合下沉 df-nodes 共享层(`recompute_parent_status`/`advance_task_with_parent`),IPC/AI 工具/MCP 三方统一;df-mcp create_task 支持 parent_id(1 级嵌套校验);delete_task 级联软删子任务(返回 `{ok,cascaded}`)
- [x] **前端** ✅ Tasks.vue 树形列表(折叠箭头+📑图标+子进度徽章 n/m+迷你进度条+缩进竖线圆点);新建弹窗「父任务」下拉(项目锁定);TaskDetail 父面包屑+子任务面板(进度条+快捷推进+添加子任务);i18n zh/en 双份
- [x] **核查** ✅ cargo check(df-nodes/df-mcp/src-tauri 三 crate) + vue-tsc 全部通过
### 💡 2026-06-27 对话上下文透明化(✅ 全部完成)
> 用户看不到 AI 接收到的上下文信息(目标钉扎/enrichment/system_prompt),导致行为不可理解。
- [x] **L1 目标可见** ✅ 对话顶部显示当前 pinned_goals 列表(TopBar.vue 🎯 图标,可查看/清理)
- [x] **L2 Enrichment 可见** ✅ @[项目] 发送前展开 enrichment 摘要(ChatInput.vue enrichment 预览面板,展开/收起/取消关联)
- [x] **L3 完整上下文** ✅ 可展开面板查看 system_prompt / augmentations(TopBar.vue 底部 context 面板)
### 🔧 2026-06-19 文件拆分升级(核验结论:全部完成)
> **2026-06-28 核验**:三项 God 文件拆分已全部完成:
> - **tool_registry.rs** ✅ 1091行单函数已拆为按域注册函数
> - **AiChat.vue** ✅ 4026→**767行**(已抽子组件)
> - **crud.rs** ✅ 2212→拆为 `crud/` 下11个文件
**P1 ToolCard 拆分(已核验完成)**
- [x] **REFACTOR-260619-04 [P1]** ✅ **ToolCard.vue 拆分完成**:
- ToolCard.vue 1527→**373行**
- `ToolResultBody.vue` + `useToolCardHeader.ts`(160行) + `useToolCardRender.ts`(45行)
- `useToolApproval.ts`(审批状态机独立,220行,B-260616-08 loading/挂起时长/toast 完整)
- `useToolCard.ts`(666行,通用工具函数) — 原 ToolCard 组件拆分的目标全部到位
**P2 暂缓(窗口未到/收益低)**
- [ ] **REFACTOR-260619-09 [P2 暂缓]** — **✅事实完成销账(2026-10-04 勘误)**:原 context.rs(1332)已拆为 context/{mod,sanitize,manager_tests}.rs 目录模块,条目过时。**新超标对象=context_helpers.rs(1733 行)**,拆分备勘已出(2026-10-04 [设计文档](./02-架构设计/专项设计/context-helpers拆分备勘-设计-2026-10-04.md),四批迁移+压缩热点殿后+触发条件=上下文管理批稳定后等用户指令) — `crates/df-ai/src/context_helpers.rs`
---
### 🔧 2026-06-19 ToolCard 同批/跨轮 UI 合并(子代理方案·其他会话实施·P1)
> 用户需求:AI 多轮 read_file(轮1×2 + 轮2×2)前端一排展开卡片("上面两个下面两个"),希望 UI 合并。后端 convert 已合并连续 tool_result(B-260619-03),前端展示层对齐。子代理分析:同批同类合并**已存在**(ToolCardList groupedToolCalls L92-110,calls>=2 显标题行+默认收起),**痛点是跨轮**(轮1/轮2 各独立 ToolCardList 实例→各成分组)。用户强调"谨慎不出错"。
- [x] **B-260619-04 [P1]** ✅ **ToolCard UI 合并方案 A 全部落地**:
- **现状(已查清)**:`ToolCardList.vue` groupedToolCalls 按 tc.name 全局聚合,calls>=2 显「[图标] 读取文件 [N] ▸」标题行 + 默认收起(initDefaultCollapse L139-147)。**同批 read_file×2 应已是折叠组**;用户「下面又两个」=下一轮新 message 的独立 ToolCardList 实例→第二个分组(跨轮未合并)。
- ✅ **步骤 ① 标题信息增强(已落地)**:groupFileSummary(group) 从 group.calls[].args.path 取前 2-3 个 shortPath 截断显示(“读取 2 个文件 · shortPath1 · shortPath2”),模板已渲染。
- ⏸️ **步骤 ③ 新轮到达自动收起旧轮**:当前跨轮收起未实现,保留作为低优先增量需求(需在 AiChat.vue watch messages 调 collapseCompletedGroups,风险中)。
- **不推荐方案 B**(跨轮全局合并,破坏 message 边界,审批/折叠重构高风险)/ **C**(纯视觉框,不解决占用)。
— `src/components/ToolCardList.vue`
---
### 🔍 2026-06-26 灵感模块诊断待办(合并推进·单任务)
> ✅ 全部修复完成(2026-06-27 核验)
- [x] **IDEA-FIX-10 [P2🟠]** — **前端 filter + 后端分页漏数据**。团队决策:`hot`/`pending` 保留前端 filter(扩多值属性过度设计);keyword/order_by 已下沉后端。✅ 关闭(2026-08-15:团队决策定案,无后续动作)
---
### 🔍 2026-07-17 aichat 对话功能深度走查待办
> 详单:[05-代码审查/aichat-对话功能走查-2026-07-17.md](./05-代码审查/aichat-对话功能走查-2026-07-17.md)
- [x] **AIC-FIX-17-P0-1** — 流式 watchdog legacy 路径 `convStates.clear()` 全局误杀 → `delete(state.activeConversationId)` ✅
- [x] **AIC-FIX-17-P0-2** — 审批计时器切/删会话不清 → switch/delete 入口 `clearAllApprovalTimers()` + 注释修正 ✅
- [x] **AIC-FIX-17-P1-1~11** ✅ 已销账(2026-08-15 核验,1 agent 全量核验 + 主代 4 项抽查源码属实):P1-1/3/4/5(queue/modelOverride/spans/_lastDelta per-conv,F-09 收尾)/ P1-2 drainQueue 互斥 `_drainingConvs` Set(useAiSend:274)/ P1-6 flushCurrentText 守卫 / P1-7 MessageItem 收敛仅 user 角色 / P1-8 _blockCache LRU 300+切会话 resetStreamCache / P1-9 指纹 watch 替代 deep / P1-10 approving 防重入前置(useToolApproval:133)/ P1-11 deleteConversation 相邻回落(useAiConversations:520)。余「MessageList 内联渲染组件化」「缓存主动失效」为优化空间非缺陷
- [x] **AIC-FIX-17-P2** ✅ 已销账(2026-08-15):7 条中 5 条核验为此前批次已修(ApprovalOverlay 响应式冷却/aiShared 对称收敛/flash watch/maximized 三元/emit 类型),2 条本批落地(tailSeq 注释与实现对齐 useStreamRenderer:142-196、isCompressing 单例补 known limitation 注释 useAiContext:28)
- [x] **AIC-FIX-17-根因** ✅ **2026-08-07 核验销账**(queue/modelOverride/审批/_lastDelta 均已 per-conv) — F-09 per-conv 收尾(queue / modelOverride / _approvalTimers / _lastDelta 单例化)
---
### 🔍 2026-08-09 TaskDetail 操作按钮缺陷走查(用户实测 + AI 深度审查)
> 用户反馈"产出部分只有标题空白",触发对 TaskDetail.vue 所有操作按钮的全量走查。覆盖模板/脚本/后端 advance_task / run_workflow 回调链路。共发现 10 项缺陷,按严重度 P0×2 / P1×4 / P2×4 分组。守 session-role-diagnose-only:本会话仅走查+登记,未实施代码。
>
> **✅ 2026-08-09 全部修复并核验销账**:主代理独立核查(vue-tsc EXIT 0 + diff 语义审)通过。补充说明:P1-4 核验当前代码已满足(advanceChild/setChildPriority 已含 `childMenuId.value = null`),仅销账未改;P1-5 实现位置优化为 watch(taskId)/refresh/handleAdvance 成功三入口调用 `resetWorkflowUi()`(load() 内不加,避免工作流推进中 df-data-changed 触发刷新误清进度面板);P2-10 描述编辑对齐 IdeaDetail 模式(有描述/空描述均可编辑,taskApi.update 落库)。验收标准 1-9 全部满足。
**涉及文件**:
- `src/views/TaskDetail.vue`(987 行,主要改动点)
- `src-tauri/src/commands/task.rs`(advance_task,仅参考)
- `src-tauri/src/commands/workflow.rs`(run_workflow 回调,仅参考)
- `crates/df-nodes/src/task_advance_node.rs`(advance_task_atomic,仅参考)
---
## 🔴 P0 缺陷(2 项,必须修)
### P0-1 双重推进竞态:工作流推进中手动推进按钮仍可用
- **位置**:TaskDetail.vue:48 vs :55
- **现状**:工作流按钮 `:disabled="wfAdvancing || advancing"`(检查两者),手动按钮 `:disabled="advancing"`(只检查 advancing)
- **问题**:`wfAdvancing=true` 时手动按钮仍可点 → 同时发起 `run_workflow`(回调 advance)+ 直调 `advance_task` 两个推进请求 → 第一个成功改 status,第二个 CAS 失败返回 Err → 前端显示红色错误,用户困惑"明明成功了为什么报错"
- **修复**:手动推进按钮 `:disabled` 加 `|| wfAdvancing`(1 行)
### P0-2 工作流推进与手动推进按钮语义重复(todo 状态双"开始")
- **位置**:TaskDetail.vue:45-57
- **现状**:todo 状态同时显示「工作流推进」+「开始」两个按钮,都推进到 in_progress
- **问题**:用户不知道该点哪个;设计意图是工作流推进会跑 AiNode 生成产出,手动"开始"只是纯改状态,但按钮文案没有区分
- **修复**:工作流推进按钮文案改为「AI 执行推进」或「工作流推进(含 AI 产出)」
---
## 🟠 P1 缺陷(4 项)
### P1-3 子任务快捷菜单不校验状态机合法性
- **位置**:TaskDetail.vue:286-296
- **现状**:`quickStatuses` 硬编码列出全部 6 态 [todo, in_progress, in_review, testing, done, blocked],不按子任务当前 status 过滤
- **问题**:todo 状态子任务的菜单显示 testing/done/in_review 等非法目标,点下去后端 can_transition 拒绝 → 红色错误
- **对比**:顶部手动推进按钮用 `ADVANCE_MAP` 严格按状态机过滤,子任务菜单却无此逻辑
- **修复**:子任务菜单复用 `ADVANCE_MAP[child.status]` 过滤合法目标
### P1-4 子任务操作后快捷菜单不关闭
- **位置**:TaskDetail.vue:326 advanceChild / :337 setChildPriority
- **现状**:操作完成后不 `childMenuId.value = null`
- **问题**:点了"推进到 done"或"改优先级"后菜单仍挂着悬浮
- **修复**:两函数操作完成后 `childMenuId.value = null`(2 处)
### P1-5 refresh/切任务后工作流进度/DAG 残留
- **位置**:TaskDetail.vue:619 load() 函数
- **现状**:load() 只重置 task/projects/ideas,不清 `wfExecId` / `wfDagJson` / `wfResult`
- **问题**:切任务或点 refresh 后右栏仍显示旧任务的工作流进度和 DAG
- **修复**:load() 开头加 `wfExecId.value = null; wfDagJson.value = ''; wfResult.value = null`(3 行)
### P1-6 手动推进后工作流进度面板不清空
- **位置**:TaskDetail.vue:470 handleAdvance
- **现状**:成功后只 `task.value = updated`,不清工作流相关 ref
- **问题**:手动推进后右栏仍显示旧工作流进度
- **修复**:handleAdvance 成功后清空 wfExecId/wfDagJson/wfResult
---
## 🟡 P2 缺陷(4 项)
### P2-7 子任务创建无长度/重名校验
- **位置**:TaskDetail.vue:365-381 confirmSubtask
- **现状**:标题只 `trim()` 判空,不校验长度上限/重名;成功路径不清 `errorMsg.value`
- **修复**:加长度上限(如 128 字)、同父重名校验、成功路径清 errorMsg
### P2-8 wfResult timer 生命周期不严谨
- **位置**:TaskDetail.vue:424 watch 回调
- **现状**:工作流完成后 setTimeout 3s 清 wfResult;切任务时 timer 仍在但 wfExecId 已清
- **影响**:低风险(最多多等 3s),但 timer 引用管理不严谨
- **修复**:load() 重置时清 `_wfResultTimer`
### P2-9 子任务页无"是子任务"提示
- **位置**:TaskDetail.vue:108(父面包屑)+ :133(子任务面板仅顶层显示)
- **现状**:子任务详情页结构与顶层任务几乎一样,只有顶部多一行父面包屑
- **修复**:加一行提示「该任务为子任务,隶属于:{parentTitle}」
### P2-10 空描述无编辑入口
- **位置**:TaskDetail.vue:68 `<section v-if="task.description">`
- **现状**:无描述时描述面板整块消失,无"添加描述"入口
- **修复**:无描述时显示空态 + "添加描述"入口
---
## 验收标准
1. 工作流推进中手动推进按钮禁用,无双重推进竞态
2. todo 状态两个按钮文案可区分(工作流推进 vs 纯手动开始)
3. 子任务快捷菜单只显示状态机合法目标
4. 子任务操作后菜单自动关闭
5. 切任务/refresh/手动推进后右栏工作流进度正确重置
6. 子任务创建有长度/重名校验,错误提示清晰
7. 子任务页有"是子任务"明确提示
8. 空描述有编辑入口
9. vue-tsc EXIT 0
---
**关联**:父任务「总览页 + 项目列表 UI/UX 优化(持续更新)」(id: 0115aea6-b423-482a-8a64-b793a66a0417)—— 本走查作为该任务的子任务延伸。
---
---
## 滞后勘误(2026-10-05 归档拆批时源码核验批注)
> 以下条目在迁移/核对时发现「文档标注」与「实际代码」不符,已按现场源码勘误。对应知识库条目:AI记忆与TODO状态滞后导致无效开发。
### 「2026-08-09 AI 自审/工作流推进链路缺陷」段(已迁本文件)
原段标题「三条推进链 100% 失败」已过时。核验(2026-10-05,任务 e9ab1729 销账记录 + 源码实证):
- **P0-A task_id 断裂** ✅ 已修:`workflow.rs:340` `obj.insert("task_id", tid)` 已注入 config,AiSelfReviewNode 可读任务
- **P0-B AiNode 缺 prompt** ✅ 已实现(超原方案):`ai_node.rs` AiNode 持 `db: Arc<Database>` 构造 + `ctx.config["task_id"]` 存在时 `TaskRepo.update_field(task_id,"output_json",json)` 自审结果落库;state.rs:755-765 build_registry 支持 agent 模式(AiAgentNode)
- **P0-C TaskDetail 无审批 UI** ✅ 已实现(归 DevFlow agent 审批重设计批):ApprovalPopup + ToolCard pending_approval 态 + 风险着色 + 高危二次确认(提交 2eea011)
- 单测 `update_field_writes_output_json`(ai_self_review_node.rs:356)锁定 output_json 白名单+写入
### 「aichat 切换/新建对话缺陷走查」段(2026-08-07)
- 段首注记「**CSW-P1-4 未修**」过时:该条目本体已标 ✅ 已修(2026-08-09 前端 round0 占位补回),仅段头汇总行未同步,保留时已核对无实际缺口
- CSW-P2-7 已销项(段尾已注记)
### 「aichat 可用性与交互成本研究」第二批 P2(2026-09-29)
- **R4 代码块复制 / V4 浮窗高风险二次确认** 两项已随 aichat 二批 P2 落地(2026-10-04,任务 8e29271f),该 P2 批次行 16 项中至少 2 项已完成,剩余项以现场核销为准(V8 草稿 per-conv/R3 长回复带量/I5 错误分类兜底/V7 排队时钟/R5+V9 检索 仍待批)
### 「devflow 集成 u-claw」接入实施条(2026-09-28)
- **ask_uclaw 工具 + 配置页** ✅ 已落地(2026-10-05,任务 5fb916ac):tools/uclaw.rs 470 行 + UclawPanel 设置面板 + i18n + 流式链补全,cargo test 685→693 passed
- 「per-conv channel_id 隔离」**不成立已勘误**(2026-10-05 源码终核):u-claw WS 渠道单 channel 单链,配置死 channel_id,run() 一次常驻链不走 chainPool;MVP 接受单链共享上下文语义,多实例隔离放 phase2
- 剩余:真机全链冒烟(runtime 验证,需 u-relay+u-claw 在线配合)