From 9962e177109708d6669072914963af209deb6b41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=9D=E5=B0=98?= <237809796@qq.com> Date: Tue, 29 Sep 2026 14:59:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=A1=A3:=20=E4=B8=8A=E4=B8=8B?= =?UTF-8?q?=E6=96=87=E7=AE=A1=E7=90=86=E6=B4=BE=E5=B7=A5=E4=B8=8E=E5=86=B3?= =?UTF-8?q?=E7=AD=96=E5=8D=95+UIUX=E4=B8=89=E7=BB=B4=E8=B5=B0=E6=9F=A5?= =?UTF-8?q?=E6=8A=A5=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ichat上下文管理-派工与决策单-2026-09-29.md | 122 ++++++++++++++++++ .../整体UIUX三维走查-2026-09-29.md | 102 +++++++++++++++ 2 files changed, 224 insertions(+) create mode 100644 docs/02-架构设计/专项设计/aichat上下文管理-派工与决策单-2026-09-29.md create mode 100644 docs/05-代码审查/整体UIUX三维走查-2026-09-29.md diff --git a/docs/02-架构设计/专项设计/aichat上下文管理-派工与决策单-2026-09-29.md b/docs/02-架构设计/专项设计/aichat上下文管理-派工与决策单-2026-09-29.md new file mode 100644 index 0000000..a00a810 --- /dev/null +++ b/docs/02-架构设计/专项设计/aichat上下文管理-派工与决策单-2026-09-29.md @@ -0,0 +1,122 @@ +# aichat 上下文管理 — 派工与决策单 + +> 日期: 2026-09-29 | 统筹: AI-Ops | 编码: devflow bot | 决策: 用户 +> 依据: 《05-代码审查/aichat知识库与记忆走查-2026-09-29.md》(代码事实已于 09-29 二次实核,全部成立) +> 分工约定: 可信度高的批次 devflow bot 直接按单执行;决策卡(C1-C4)等用户拍板后转派工。 + +--- + +## 一、确定性批次(可信度高,直接派工) + +### B0 提交固化(前置,最先做) + +工作区 22 文件 +699 行(T4/T5 生产侧 + G2 破坏性回环检测 + provider 温度覆盖 + 前端工具卡折叠)已过编译门禁未提交。 + +- 操作: 按主题拆分提交(禁一提交混多类型): ①T4/T5 WorkingContext+工作流 DAG 注入 ②G2 破坏性回环检测+温度覆盖 ③前端工具卡折叠与交互 +- 验收: `git log --oneline -3` 三笔提交各自主题单一;`cargo check --workspace` 0 错误 +- 风险: 无(纯固化,不改行为) + +### B1 知识检索关键词化(原 P0-1) + +整句 LIKE 命中≈0(`crates/df-storage/src/crud/idea_repo.rs:642` 用 `%末条用户消息全文%` 匹配短语标题)。 + +- 操作: `KnowledgeRepo::search` 入口前加关键词抽取(零依赖: 按标点/空白切分 + 停用词过滤 + 长度≥2 保留,取前 5-8 个词),SQL 改多条件 OR(`title LIKE ?kw1 OR content LIKE ?kw1 OR ...`),任一词命中即入选,reuse_count 排序不变 +- 边界: 关键词抽取放 df-storage 侧纯函数+单测;调用方 `knowledge_inject.rs:364-384` 传参不变(仍传整句,抽取在 repo 内做,后续语义检索接入时上游复用) +- 验收: ①`cargo test -p df-storage` 含新单测(中文句子→关键词列表) ②手动: 取真实会话一条用户消息原文检索,改造前 0 命中的知识现在能命中 +- 回滚: 单函数回退,2 处 + +### B2 视图裁剪补滚动摘要(原 P0-3) + +超预算淘汰单元无声丢弃(`crates/df-ai/src/context/mod.rs:216-227` 只打 `context_trimmed` 日志)。 + +- 操作: 裁剪发生时,把被淘汰单元压成一条滚动补偿摘要(零依赖先做关键词级: 每个被淘汰单元取 user 消息首句+工具名聚合),以 system 附加块注入发送视图(如 `[早前摘要] 本会话已处理: ...`),不落 session.messages(与"裁剪只动发送副本"铁律一致);后续可升级为 T3 JSON 卡片复用 +- 验收: ①单测: 超预算裁剪后返回视图首部含摘要块,`self.messages` 全量不变 ②手动: 大会话触发 `context_trimmed` 日志后,下轮请求 system 含摘要 +- 回滚: 摘要块生成处加开关或删拼接,1 处 + +### B3 存量测试修复(4 个挂) + +`anthropic_compat::anthropic_full_stream_accumulates_usage`(assert usage.is_none() 失败)等 4 个,疑似 6bafdcd 流式 usage 语义变更后断言未同步。 + +- 操作: 先核实 4 个失败根因是"断言过期"而非"行为回归",是则同步断言;发现真回归则修复行为并单独说明 +- 验收: `cargo test --workspace` 全绿 +- 风险: 低(只动测试;若发现真回归先报告再动) + +### B4 candidate 自动晋升机制(原 P0-2,机制先行) + +962 条存量知识全 `status='candidate'`,检索只认 `published`(`idea_repo.rs:651`),断链铁证。 + +- 操作: ①存量一次性晋升: SQL 将现有 candidate 按 confidence=high 晋升(971 行已有按 confidence 语义排序的先例) ②增量机制: 自动提炼产物 confidence=high 直接 published / medium 保持 candidate+reuse_count≥N 自动晋升 / low 留审核;阈值走配置带开关,默认值等 C3 拍板(未拍板前默认保守: 全部保持现状,只做存量 high 晋升) +- 验收: 存量晋升后 `SELECT status, count(*) FROM knowledges GROUP BY status` 分布合理;普通对话自动注入从空转变为有产出 +- 互踩标注: 本批与 B1 同文件 knowledge_inject.rs(不同段: B1 动检索 364-384,本批动提炼/晋升 441+),**串行执行,先 B1 后 B4** + +### B5 LLM 知识工具注册(P1,可后置) + +`tool_registry.rs` 73 工具无 knowledge 注册;df-mcp 的 search/insert_knowledge 只服务外部客户端。 + +- 操作: tool_registry 注册 `search_knowledge`/`insert_knowledge`,实现复用 df-mcp 同逻辑(检索走 B1 改造后的关键词检索;写入产出现有 candidate 通道,受 B4 晋升机制管辖) +- 验收: agentic 会话内让 agent "查一下关于 X 的知识"能调到工具并返回;`cargo test --workspace` 绿 +- 依赖: B1(检索质量)、B4(写入通道闭环);建议排在最后 + +**执行顺序**: B0 → B1 → B2/B3(可并行,零文件交集) → B4 → B5。每批独立提交,带验收证据。 + +--- + +## 二、决策卡(决策性问题,等用户拍板) + +### C1 跨会话召回(L3)走轻还是重 + +- 背景: L3 现为零召回(新会话全空),是"丢历史"主观感受最大来源,但完全是空壳无现成代码。 +- 选项: **A 轻量** — 项目级记忆: 复用知识表 `source_project` 字段(已有未用)+会话结束提炼进知识库(B5 工具成为跨会话通道),改动小,1-2 批派工; **B 重量** — 对齐 u-claw 分身养成层四层架构(L1 轮内/L2 跨轮/L3 跨会话/L4 跨重启+目标快照机制),体系完整但工程量大数倍,且 u-claw 铁律"L3 召回严禁进 system prompt(走工具按需查)"需一并继承。 +- 建议: 先 A 后 B——A 是 B5 的自然延伸(基建已铺),用 3 个月自用期验证 A 是否够用再决定要不要 B。 + +### C2 语义检索默认开与"数据不出门"定位冲突 + +- 背景: 混合检索代码已存在(knowledge_inject.rs:231-287 双信号加权),但 embedding 需调外部 API——把知识内容发出去,与 pivot 定位"本地优先,数据不出门"直接冲突。 +- 选项: **A 维持默认关**(关键词化后 LIKE 够用,需要语义时用户自行配 embedding); **B 引入本地 embedding**(如 ONNX 本地模型,零外呼但引依赖+占资源); **C 默认开+明确告知**(接受数据出门,定位让步)。 +- 建议: A。中文关键词化后 LIKE 命中率可解决大头,先跑起来看真实命中率再议。 + +### C3 candidate 晋升把关策略默认值 + +- 选项: **A 全自动**(high 直接 published,零人工); **B 阈值+开关**(默认 high 自动/medium 复用晋升,提供保守开关回到全人工); **C 保留人工审核为默认**。 +- 建议: B。C2 未决前 candidate 质量未经验证,默认值定保守些,开关给激进留门。(B4 机制先行不阻塞,等此拍板定默认值) + +### C4 图片默认上传外部域名(9-28#17,可用性报告单列) + +- 背景: 图片处理链路默认传外部域名,涉开源边界(工具代码零业务信息铁律)与隐私定位双重问题。 +- 建议: 倾向改手动确认+默认本地处理;需用户对开源边界表态后转派工。 + +--- + +## 二B、UI/UX 扩展批(2026-09-29 增补,依据《05-代码审查/整体UIUX三维走查-2026-09-29.md》) + +> 三维走查结论: 08-02 基线 P0/P1 已全部修复清零;增量集中在可靠性竞态/假成功、视觉 token 漂移、AI 触点空白。 + +### U 系(可靠性+易用性,确定性高,直接派工) + +- **U1 反馈真实性与竞态守卫**(走查#1-6+#14+#15,8 条): Knowledge 创建失败仍弹成功 toast(:384 补 `if (!r) return`)、AuditLog 翻页竞态(:289 补 seq 守卫)、TaskDrawer 切任务慢响应覆盖(:249 捕获 taskId 校验)、GitChanges 双源竞态+三处静默 catch(:352 seq+moduleId 双校验)、回收站 purge 双击(:83 busy 禁用)、灵感状态切换零反馈(:452 补 catch)、FileExplorer 失败仅 console(:464/529/545 补 Message)、Dashboard 故障渲染成空态(:81 消费 store.error 补 banner)。修法模式已给,照抄各页已有守卫先例 +- **U2 溢出与可见性**(纯 CSS 低风险,#7-10): FilePreview diff 长行改 pre-wrap、TaskDetail/TaskOutputCard 宽表格补 overflow-x、ConfirmDialog 加 overflow-wrap:anywhere、global.css 滚动条色抽 --df-scrollbar token+light 覆写 +- **U3 视觉 token 收敛**(#11-13): 阶段徽章 6 色(ProjectDetail:1430/ProjectCard:140)、优先级色(Tasks:1247/TaskDetail:877/TaskBatchBar:272)、git untracked #999(GitChanges:671/FilePreview:658)全部对齐已有 --df-* token,延续 9753a6f 收敛工作 +- **U4 小清理**(易用性 3 条): Tasks.vue:828 alert 换 ConfirmDialog+i18n、FileExplorerDetached 坏参数补错误态、router /dev/x6 加 DEV 守卫 +- 执行顺序: U1 → U2/U3 可并行(文件少交集,U2 动 FilePreview 与 U3 同文件注意先后) → U4 随批。每批 vue-tsc+手动验证对应页面 + +### S 系(智能化触点,接线类确定性高先做) + +- **S1 知识库「立即提炼」按钮**: 后端/API/store 三层全就绪零调用(knowledge_extract_now 已注册,stores/knowledge.ts:191),Knowledge 收件箱头部加按钮+embedding failed 批量重试入口。**纯接线** +- **S2 想法批量评估接线**: evaluate_ideas_batch(idea.rs:318)闲置,Ideas 过滤栏加「批量评估 pending」,复用 IdeaDetail 渲染。**纯接线** +- **S3 业务页带上下文开 AI 面板**(最大架构缺口): useAiPanel.openWithAugmentation({kind,id}) 预填 @提及+模板,复用 augmentation/resolvers.rs;TaskDetail 先落「AI 分析」首个按钮。中等工作量 +- **S4 AI 触点通用组件**: 统一入口样式/失败提示/结果卡槽,与 S3 同批落(否则每页复制新样式) + +### A 系(授权体验,用户需求) + +- **A1 「信任所有目录」总开关**: `check_file_tool_auth`(audit/path_auth.rs)读 Settings KV,bypass 开启时 NeedsAuth→Authorized;Settings AI 面板加开关;开启时对话区常驻横幅「授权已放行」防静默裸奔。**黑名单保留硬拒**(凭据目录自保护,见决策 D2) + +### 新增决策卡 + +- **D1 智能化功能取舍**: S 系接线类(S1/S2)已派工;产品类空白待拍板优先级 — 工作流失败 AI 诊断/Dashboard AI 周报(真实进度替换硬编码映射表)/任务推进风险检查/对话转任务草稿/项目健康度。建议先做「Dashboard 进度真实化」(非 AI 也该修,constants/project.ts:52-59 硬编码百分比)再挑 1-2 个 AI 触点 +- **D2 授权总开关是否连黑名单一起放行**: 建议否(黑名单是 .ssh/.aws/凭据自保护非体验问题);若确要全放,须二次确认+风险自担提示 + +## 三、留痕 + +- 本单与走查报告、执行计划(上下文管理演进-执行计划-2026-07-20.md,T1-T5)构成同一工作线的三层文档: 设计→诊断→派工。 +- UI/UX 走查依据: 《05-代码审查/整体UIUX三维走查-2026-09-29.md》(三路子代理+主代理抽查核验 4 条属实)。 +- 各批完成后在 docs/todo.md 对应条目销账,验收证据(命令+结果)写进提交 body。 diff --git a/docs/05-代码审查/整体UIUX三维走查-2026-09-29.md b/docs/05-代码审查/整体UIUX三维走查-2026-09-29.md new file mode 100644 index 0000000..442f142 --- /dev/null +++ b/docs/05-代码审查/整体UIUX三维走查-2026-09-29.md @@ -0,0 +1,102 @@ +# DevFlow 整体 UI/UX 三维走查 — 易用 / 智能 / 可靠 + +> 日期: 2026-09-29 | 统筹: AI-Ops | 方法: 3 路只读子代理并行走查 + 主代理抽查核验 +> 范围: 非 aichat 全部页面(aichat 区已有 09-28/09-29 两轮 56 项覆盖,不重复) +> 核验: 主代理对高严重度条目抽查 4 条(Knowledge 假成功 toast/阶段徽章硬编码/AiHome 空占位/extractNow 零调用),全部属实 +> 派工: 修复批次与决策项见《02-架构设计/专项设计/aichat上下文管理-派工与决策单-2026-09-29.md》第二部分(UI/UX 扩展节) + +--- + +## 一、易用性维度 + +### 基线核对: 08-02《UIUX扩展审查》P0+P1 共 12 项全部已修 ✅ + +| 项 | 证据 | +|----|------| +| P0 project.rs 空if块 | 7f0edce,现 6 处 return Err(project.rs:172/288/380/494/558/813) | +| P0 git.rs exec_git 返 success+NO_WINDOW | git.rs:87-90 (String,bool);:48-60 creation_flags | +| P0 module.rs NO_WINDOW | module.rs:629-634(同 7f0edce) | +| P0 DependencyGraph 环高亮 | :346-348 cycleNodes 经 renderGraph 注入,4df91ed 深化防环 | +| P0 FileExplorer closeDropdown | :422-423 closest('.module-dropdown') | +| P0 Tasks 快捷菜单 | :923 document click 监听 | +| P1 统计源解耦 | f736f43,stores/project.ts:111-117 独立 COUNT 通道 | +| P1 长 AI 文本折叠 | 9e85cad,MessageList/ConflictResolver/HelpRequiredCard/ToolResultBody 四处 | +| P1 AuditLog 后端筛选+total | audit/record.rs:222-249 WHERE+COUNT | +| P1 usePersistedRef | composable 存在,五页接入 | +| P1 审批体系一致 | 13ecd7e/4860505 浮窗计时+四键统一+拒绝确认+失败 toast | +| P1 git status 缓存 | 5a92e60,module.rs:354-383 TTL 缓存 | + +**结论**: 08-02 基线 P0/P1 已清零,P2 打磨随近期提交消化大半。易用性存量债已还清。 + +### 易用性增量(3 条) + +1. **原生 alert 残留+绕过 i18n**: Tasks.vue:828 `alert('请选择项目')` — Tauri webview 原生弹窗,项目已自建 ConfirmDialog 就是为此,全 views 仅剩此一处 +2. **分离窗口坏参数无错误态**: FileExplorerDetached.vue:4-6 `?projectId=` 缺失时永远 spinner,无错误/空态 +3. **dev 路由进生产**: router/index.ts:69-72 `/dev/x6` 无 `import.meta.env.DEV` 守卫 + +其余抽查良好: 删除均有 ConfirmDialog、表单有防双击、详情页有返回路径。 + +## 二、智能化维度(AI 触点盘点) + +### 触点地图要点(13 页面) + +- **有触点**: TaskDetail(AI 执行推进+TaskOutputCard+自审)、Projects(AI 扫描填表+批量导入 LLM)、Ideas(对抗式评估)、Knowledge(被动收件箱)、Settings(AI 配置齐全)、ApprovalPopup(审批本身) +- **零触点**: Tasks(全页手工,无一处 AI)、Dashboard(纯 SQL 计数)、AuditLog(纯分页)、AiHome(**空占位 div,讽刺:AI 首页零内容**) +- **架构缺口**: AiChat 不接收业务上下文 props(AiChat.vue:150-152 仅 detached),业务页对 75 个注册工具零触达;唯一上下文通道是用户手打 @提及 + +### 空白发现(按 价值×成本 排序,前 5) + +1. **知识库「立即提炼」按钮**: 后端链路全就绪零调用 — `knowledge_extract_now` 已注册(lib.rs:483)/api 已封装(stores/knowledge.ts:191)/views 零引用(grep 实证 0)。自动提炼每会话仅 1 次且失败静默。**纯接线活** +2. **想法批量对抗评估**: `evaluate_ideas_batch`(idea.rs:318)已实现,前端无任何调用。Ideas 过滤栏加批量入口即可。**纯接线活** +3. **业务页带上下文开 AI 面板**(最大架构缺口): useAiPanel 暴露 `openWithAugmentation({kind:'task',id})` 预填 @提及+指令模板,复用 augmentation/resolvers.rs 解析链。解锁「就此任务问 AI」全场景 +4. **工作流失败 AI 诊断**: 失败仅静态文案,后端已有 failed_node 结构化信息(workflow.rs:411-430)无人消费。失败旁加「AI 诊断」发会话分析 +5. **Dashboard AI 洞察位**: 统计纯本地计数,项目进度是硬编码映射表(constants/project.ts:52-59 planning=20%/in_progress=55%);AI 工具 get_project_timeline 已能答"上周做了什么"但无产品出口。加 AI 周报卡 + +其余: 任务推进前风险检查(复用 AiSelfReviewNode)/对话转任务草稿(create_task 工具+idea 关联已有)/项目健康度真实化(先用 count 通道替换映射表,不必 AI)。 + +### 交互一致性 + +AI 触点至少四套范式并存: 入口(🤖 ghost 按钮/accent 实心/header primary/无入口)、失败提示(内联 warning/eval-error/error-banner/自管 toast)各页各异。建议抽「AI 触点」通用组件统一,否则每个新 AI 功能都在复制新样式。 + +## 三、可靠性维度(15 条,按严重度) + +### 数据错(成功假象/竞态/重复提交) + +1. **Knowledge 新建失败仍弹成功 toast 且丢表单** views/Knowledge.vue:384-393 — store.create 吞错返 null,视图不检查返回值直接关弹窗+success(对照 Projects.vue:304 有 `if (!r) return` 守卫) +2. **AuditLog 翻页竞态** views/AuditLog.vue:289 — load() 无序号守卫,prevPage/nextPage 无 loading 拦截,慢旧响应覆盖新页数据 +3. **TaskDrawer 切任务慢响应覆盖** components/task/TaskDrawer.vue:249-258 — 常驻挂载+watch taskId 触发 load 无守卫,A 数据盖到 B 上 +4. **GitChanges 双触发源竞态+失败静默清空** components/project/GitChanges.vue:352 — watch(moduleId)+watch(refreshKey) 并发,旧响应晚到覆盖;:371/:421/:439 三处 catch 静默 +5. **回收站恢复/彻底删除无 pending 禁用** views/Projects.vue:83-84 — 双击同帧两次 purge(不可逆级联物理删) +6. **灵感状态切换失败零反馈** views/Ideas.vue:452 — 无 try/catch 成 unhandled rejection,badge 静默回弹(同文件其他操作有 catch,此处漏网) + +### 布局破 + +7. **Diff 长行静默裁剪不可滚动** components/project/FilePreview.vue:1063-1067 — `white-space:pre; overflow:hidden` flex min-width 归零,diff 核心信息不可读 +8. **Markdown 宽表格被裁** views/TaskDetail.vue:916 + TaskOutputCard.vue:93-97 — ai-md.css:59 约定滚动交各页容器,AiChat 加了这两处没加 +9. **ConfirmDialog 长路径溢出** components/ConfirmDialog.vue:82-86 — 360px 弹窗无 word-break,Windows 反斜杠路径画出去 +10. **浅色主题滚动条隐身** styles/global.css:132-133 — 白色低透明 thumb 硬编码,light 无 override + +### 视觉契约破坏(硬编码绕过 token) + +11. **任务阶段徽章 6 色 Material 硬编码** views/ProjectDetail.vue:1430-1436 — 浅色主题下 #64b5f6/#ffc107 对比度塌陷;ProjectCard.vue:140 同款 +12. **优先级色零散硬编码** views/Tasks.vue:1247 + TaskDetail.vue:877 + TaskBatchBar.vue:272-273(Element 调色板 #67c23a 非 --df-success) +13. **git untracked 绕过已定义 token** GitChanges.vue:671 + FilePreview.vue:658 — `#999` 而 `--df-git-untracked` 就定义在 global.css:47 +14. **FileExplorer 增删/扫描失败仅 console** components/project/FileExplorer.vue:529/545/464 — 无任何 UI 反馈(同款操作 ProjectDetail:812 有 Message.error) +15. **Dashboard 加载失败渲染成空数据假象** views/Dashboard.vue:81-94 — store 吞错写 state.error,页面与两面板均不消费,故障时显示"暂无灵感"+统计归零 + +### 干净面(实测确认,无需担心) + +stores 层序号守卫(project/tasks/knowledge)与审批链(_approvalInFlight/processingId/submitting)防御完整;看板拖拽/批量动作/双击防护完整;渐变 10 处均 token 填充无违规;FileTree 77 处 hex 为 SVG 图标品牌色合法。 + +--- + +## 四、专项: AI 工具授权目录体验(用户需求 2026-09-29) + +用户实测痛点(截图实证): agent 任务中被路径授权拦截(微信目录属白名单外/敏感路径),工具执行失败,体验中断。 + +现状体系(audit/path_auth.rs): 三层判定 — 黑名单硬拒(Denied,不挂起)/白名单外挂起(NeedsAuth→DirAuthDialog 四级授权 once/session/always/deny)/白名单放行(Authorized)。 + +需求: 加「一键放行」总开关。设计建议(已可派工,细节见派工单 A1): +- 开关落点: `check_file_tool_auth` 读 Settings KV,bypass 开启时 NeedsAuth→Authorized 直通 +- **黑名单保留硬拒**(安全自保护: .ssh/.aws/凭据目录防 AI 误读,与体验无关) — 是否连黑名单一起放行作为子决策 D2 +- UI 显眼性: 开启时对话区常驻横幅「授权已放行」,防静默裸奔(对齐 claude code bypassPermissions 红条先例)