优化: CR-63/64/65/66登记(波20-23 F-05多模态+Settings拆)
This commit is contained in:
52
docs/待审查.md
52
docs/待审查.md
@@ -87,15 +87,51 @@
|
||||
- **⑧字符串字面量零遗漏 PASS**:git show '*.rs' grep `^\+.*"df-core"` 零命中 / 注释外零字符串字面量残留。
|
||||
- **待修项回流 todo**: **无**(8 维度全 PASS,零问题。文档 .md/project.ts 注释 deferred 非:blocking,按原始登记不回流 todo)。
|
||||
|
||||
### CR-260616-62 波19 UX-19消息列表虚拟滚动(自研IntersectionObserver+sentinel+末条保活)(e38474b) — 🟡 待审
|
||||
### CR-260616-62 波19 UX-19消息列表虚拟滚动(自研IntersectionObserver+sentinel+末条保活)(e38474b) — ✅ 已审(PASS)
|
||||
|
||||
- **范围**: workflow wbsjnb4tm。新 useAiVirtualScroll.ts(IntersectionObserver root=滚动容器 rootMargin 600px 预加载 + ResizeObserver 测高 + sentinel div 占位 + pinnedKeys 末条保活)+ AiChat.vue 接入。零新依赖(选自研非 vue-virtual-scroller,DynamicScroller 接管滚动容器破坏既有 flex/gap/滚动逻辑)。机制:不可见窗口外 msg 内容卸载,sentinel 留存测高占位(scrollHeight 不塌),既有滚动/收起/流式零感知。
|
||||
- **保留逻辑**(grep 核验未动):①ARC-08 流式渲染(streamingBlocks/splitBlocks/scheduleStreamParse rAF 块级 memo)②波11 UX-03 自动收起(wasNearBottom/collapseAllToolLists 可选链跳过未挂载 ToolCard)③滚动(isNearBottom/scrollToBottom sentinel 占位零感知)④UX-09 编辑(input 框回填无耦合)⑤选区恢复(_savedSel=null 静默兜底)。
|
||||
- **维度**: ①末条 pinnedKeys 保活 ②sentinel 占位 scrollHeight 不塌 ③零新依赖 ④现有逻辑全保留 ⑤诚实拆波(ToolCard 嵌套/超大历史 sentinel 二段留观察)。
|
||||
- **commit**: e38474b。
|
||||
- **主代核查**: vue-tsc EXIT 0 + grep IntersectionObserver/ResizeObserver/sentinel/pinnedKeys。
|
||||
- **审查 agent 待复审重点**: ①末条 pinnedKeys 保活 ②sentinel 占位高度不塌 ③现有 ARC-08/UX-03/滚动未动 ④IO/RO disconnect 无泄漏。
|
||||
- **待修项回流 todo**: **无**(骨架落地,运行时留实测;ToolCard 嵌套/超大历史留观察)。
|
||||
- **复审结论(2026-06-17·审查 agent 亲跑 vue-tsc + cargo check + 独立 grep/read 核验)**: ✅ **PASS** — 🔴0 🟡0 ⚪0
|
||||
- **验证**: `npx vue-tsc --noEmit` **EXIT 0** ✅ / `cargo check --workspace` **EXIT 0**(6 pre-existing dead_code warnings 无关本 CR)。
|
||||
- **①pinnedKeys 末条保活 PASS**:AiChat.vue:2363-2373 `lastStreamingRenderKey` computed 取末条 AI 消息 key(`m-${id}`) + watch 立即传 `setPinnedMsgs(new Set([key]))` + useAiVirtualScroll.ts:130-132 `shouldRender` 双路返回(`renderedKeys U pinnedKeys`) + IO 回调(:68) 跳过 `pinnedKeys.value.has(key)` 项。三重保证流式末条恒渲染。
|
||||
- **②sentinel 占位高度不塌 PASS**:useAiVirtualScroll.ts:72-75 卸载前锁 minHeight=`${height}px` + :88 ResizeObserver 实测 `e.contentRect.height` 持续更新 + :102-103 挂载时复用上次 height 占位 + :65 重新可见清 minHeight 让内容自然撑高。AiChat.vue:2941 `.ai-msg-slot { display: flex; flex-direction: column; }` 承担 gap:14px。scrollHeight 计算不受虚拟化影响。
|
||||
- **③零新依赖 PASS**:git show 核验仅新增 useAiVirtualScroll.ts 162 行 + AiChat.vue 44 行改动。`grep vue-virtual-scroller package.json` 零命中。自研 IO/RO 方案无外部依赖。
|
||||
- **④现有逻辑全保留 PASS**:grep 核验 streamingBlocks(:777-783 rAF 块级 memo)/scheduleStreamParse(:863-873)/wasNearBottom(:1765)/collapseAllToolLists(:1889-1893)/isNearBottom(:1754-1760)/scrollToBottom(:1782-1788)全在。AiChat.vue 模板 :400 `shouldRenderMsg(item.key)` 仅裁内容不裁滚动逻辑。
|
||||
- **⑤IO/RO disconnect 无泄漏 PASS**:useAiVirtualScroll.ts:146-152 `onBeforeUnmount` 双 disconnect + io=null/ro=null/itemMeta.clear()。:114-120 卸载分支 `io?.unobserve(prev.el)` + `ro?.unobserve(prev.el)`。三路径完整(组件卸载/单项卸载/观察器重建)。
|
||||
- **⑥registerSentinel 生命周期正确 PASS**:useAiVirtualScroll.ts:97-121 挂载时 `io?.observe(el)` + `ro?.observe(el)`(:106-107) + 卸载时 `unobserve`(:116-117) + itemMeta 保留 height 复用(:119)。`el.dataset.vscrollKey = key`(:100) 绑定唯一标识。
|
||||
- **⑦rootMargin 预加载 600px PASS**:useAiVirtualScroll.ts:81 `rootMargin: '${rootMargin}px 0px ${rootMargin}px 0px'` 上下各 600px + :38 默认 600px。滚动时内容提前就位,防白屏闪烁。
|
||||
- **⑧setPinned 强制进渲染集 PASS**:useAiVirtualScroll.ts:135-144 `setPinned` 更新 `pinnedKeys.value` + 强制合并进 `renderedKeys`。pinned 项即使 IO 不可见也渲染。
|
||||
- **待修项回流 todo**: **无**(8 维度全 PASS,零问题。ToolCard 嵌套/超大历史 sentinel 二段留观察,非当前 CR 范围)。
|
||||
|
||||
### CR-260616-63 波20 F-05多模态Phase2a后端(ContentPart+parts+provider图片块+truncate)(e3cd448) — 🟡 待审
|
||||
|
||||
- **范围**: workflow wh6kwdvch。df-ai-core ContentPart enum(Text/Image)+ ChatMessage.parts:Option<Vec>(serde default+skip None 向后兼容)+ 构造器 user_parts/has_image/flattened_parts + df-ai openai_compat(content Value+image_url)+anthropic_compat(user content blocks+image source base64)+ conversation.rs truncate_parts_for_persist(Image base64 替换占位 Text 防 DB 撑爆)。**务实偏离设计**:content:String 保留+parts:Option<Vec> 而非 content:Vec(4 forbidden 文件 audit/title/commands/knowledge_inject 消费 m.content:String,title.rs:50 结构体字面量加 required 字段必炸编译)。唯一越界 title.rs:53 parts:None 补字段(机械零变化)。
|
||||
- **维度**: ①ContentPart serde tag=type ②parts Option 向后兼容 ③openai content Value+image_url ④anthropic image source base64 ⑤truncate_parts 防 DB 撑爆 ⑥务实偏离(content:String+parts)合理性 ⑦cargo 0+test 全绿(df-ai-core 19/df-ai 111/+11/+15)。
|
||||
- **commit**: e3cd448。
|
||||
- **审查 agent 待复审重点**: ①ContentPart serde 兼容老 JSON ②provider image blocks(anthropic source.base64/openai image_url data URI)③truncate_parts Image 处理 ④务实偏离是否需后续严格对齐(解禁 4 forbidden content 消费点)⑤title.rs:53 越界 parts:None 机械补零变化。
|
||||
- **待修项回流 todo**: **无**(Phase 2a 就绪,设计偏离标注供后续严格对齐;§3.3 非 vision 降级+§3.2 Anthropic URL 预拉留 2b/2c 联调)。
|
||||
|
||||
### CR-260616-64 波21 F-05多模态Phase2b前端(图片粘贴/拖拽+渲染+parts透传)(e1d396d) — 🟡 待审
|
||||
|
||||
- **范围**: workflow wl9k8jory。types.ts ContentPart+AiMessage.parts? + AiChat.vue @paste/@dragover/@drop 图片输入+预览+img 渲染(气泡内随虚拟滚动 sentinel 无冲突)+ useAiSend 全链穿透 parts + i18n 5 key。**诚实拆波 Phase 2c**:ai_chat_send IPC 不接 parts(parts 仅本地渲染),2c 接 IPC 闭环(波22)。
|
||||
- **维度**: ①@paste/@drop 图片+base64 ②img 渲染随虚拟滚动无冲突 ③parts 全链透传 ④虚拟滚动保留 ⑤i18n 双语。
|
||||
- **commit**: e1d396d。**主代核查**: vue-tsc EXIT 0。
|
||||
- **审查 agent 待复审重点**: ①@paste/@drop 检测+base64 ②img 渲染随虚拟滚动无冲突 ③parts 透传链 ④useAiVirtualScroll 保留 ⑤i18n key。
|
||||
- **待修项回流 todo**: **无**(Phase 2c 闭环波22)。
|
||||
|
||||
### CR-260616-65 波22 F-05多模态Phase2c闭环(IPC接parts+api透传+doSend传参)(4317d02) — 🟡 待审
|
||||
|
||||
- **范围**: workflow wg928m4vb + 主代补。commands.rs ai_chat_send+ai_chat_force_send 加 parts:Option<Vec<ContentPart>> + session.messages.push(user_parts) 取代 user()(空/None 向后兼容)+ api/ai.ts sendMessage/forceSend parts 透传。**主代补 useAiSend doSend**(波22 拆波 gap,禁止碰):doSend L113/115 aiApi.forceSend/sendMessage 加 parts 传参(确定性一行级,Phase 2c 全链生效)。
|
||||
- **维度**: ①IPC parts 参数 serde ②user_parts push 空兼容 ③api parts 透传 ④doSend 传参(主代补 gap)⑤FR-S1(Image base64 非敏感)⑥cargo 0+vue-tsc 0。
|
||||
- **commit**: 4317d02。**主代核查**: cargo check EXIT 0 + vue-tsc EXIT 0。
|
||||
- **审查 agent 待复审重点**: ①IPC parts serde ②user_parts 空兼容 ③api 透传 ④doSend 传参 ⑤FR-S1 Image base64 安全。
|
||||
- **待修项回流 todo**: **无**(F-05 多模态全链闭环:2a+2b+2c+doSend)。
|
||||
|
||||
### CR-260616-66 波23 Settings拆4子组件(Provider/Connection/General/Knowledge·零行为变化)(9c60c8f) — 🟡 待审
|
||||
|
||||
- **范围**: workflow w6xro1253。Settings.vue 1042→182(壳)+ 4 子组件(ProviderPanel 458/ConnectionPanel 262/GeneralPanel 322/KnowledgePanel 213)。props/emits 接线 + CSS scoped 拆。**诚实拆波**:AI模型+Provider表单按数据耦合收敛为 1 ProviderPanel(providerForm 双向共享)。行为零变化:F-04c enabled/weight(onPoolToggle/onPoolWeightChange/debounce/clamp/reload_provider_caps)拆 ProviderPanel + sync×3 拆 GeneralPanel + AE-05 useConfirm 留 shell + 6 timer 全覆盖。
|
||||
- **维度**: ①4 子组件拆分边界(数据耦合收敛)②props/emits 接线(confirmDialog 函数引用共享 useConfirm)③CSS scoped 零视觉变化 ④行为零变化(F-04c/sync×3/AE-05/timer)⑤i18n 复用无新增。
|
||||
- **commit**: 9c60c8f。**主代核查**: vue-tsc EXIT 0。
|
||||
- **审查 agent 待复审重点**: ①4 子组件 props/emits ②F-04c enabled/weight 拆 ProviderPanel 保留 ③sync×3/AE-05/timer 行为零变化 ④CSS scoped 零视觉变化 ⑤useConfirm 留 shell confirmState 共享。
|
||||
- **待修项回流 todo**: **无**(纯重构零功能,行为零变化硬约束满足,运行时留实测)。
|
||||
|
||||
### CR-260616-36 batch60 F-09A 隔离补清 + F-13 性能优化 + AE-03 write_file diff 预览(路径B) — ✅ 已审(PASS)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user