优化: CR-65补登记+CR-67登记(波22 F-05闭环·波24 execution_id治本)
This commit is contained in:
69
docs/待审查.md
69
docs/待审查.md
@@ -101,37 +101,48 @@
|
||||
- **⑧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) — 🟡 待审
|
||||
### CR-260616-63 波20 F-05多模态Phase2a后端(ContentPart+parts+provider图片块+truncate)(e3cd448) — ✅ 已审(PASS)
|
||||
|
||||
- **范围**: 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 联调)。
|
||||
- **复审结论(2026-06-17·审查 agent 亲跑 cargo+test+独立 grep/read 核验)**: ✅ **PASS** — 🔴0 🟡0 ⚪1
|
||||
- **验证**: `cargo check --workspace` **EXIT 0**(6 pre-existing dead_code warnings 无关本 CR)/ `cargo test -p df-ai-core` **19 passed** / `cargo test -p df-ai` **111 passed**。
|
||||
- **①ContentPart serde tag=type 兼容老 JSON PASS**:provider.rs:48-50 `#[serde(tag = "type", rename_all = "snake_case")]` 正确区分 Text/Image + 单测:370-377 `contentpart_legacy_json_no_parts` 老 JSON 反序列化 parts=None 验证 + :381-402 `contentpart_with_image_roundtrip` 新 JSON round-trip 验证。
|
||||
- **②parts Option 向后兼容 PASS**:provider.rs:102-103 `#[serde(default, skip_serializing_if = "Option::is_none")]` + 构造器 user/user_parts/assistant 均设 parts=None(:122/:125/:128) + 单测:442-455 `contentpart_struct_literal_compat` 字面量构造合法。
|
||||
- **③openai content Value+image_url PASS**:openai_compat.rs:320-348 m.has_image() 判定 + flattened_parts() 拍平 + content 数组 [{type,text},{type,image_url,image_url:{url}}] + base64→data URI 转换(:330-333 `format!("data:{};base64,{}", mt, b)`)。
|
||||
- **④anthropic image source base64 PASS**:anthropic_compat.rs:342-375 含图时 content blocks 数组 + Image 片→{type:image,source:{type:base64,media_type,data}} + url 模式 warn 提示预留 2b/2c 预拉(:356-362)。
|
||||
- **⑤truncate_parts 防 DB 撑爆 PASS**:conversation.rs:87-127 truncate_parts_for_persist Image base64 替换占位 Text(:100-106 `<image: base64 已省略, 共约 {} 字符>`) + Text 片复用 truncate_for_persist 头尾截断 + url 模式原样保留。
|
||||
- **⑥务实偏离合理性 PASS**:grep 核验 4 forbidden 消费点(audit.rs:461/commands.rs:87+678/knowledge_inject.rs:314+316+338)均读 m.content 字符串零改动,title.rs:50-58 结构体字面量 parts:None 补字段唯一越界但零变化(单测:442-455 证字面量合法)。
|
||||
- **⚪ CR-63-1(low,Anthropic URL 预拉留 2b/2c)**:anthropic_compat.rs:356-362 url 模式 warn 但未实现预拉(当前 base64 为主流,url 预拉留后续联调),非阻断当前 Phase 2a 就绪。
|
||||
- **待修项回流 todo**: **无**(6 重点全 PASS,1 low 预拉非阻断,Phase 2a 就绪)。
|
||||
|
||||
### CR-260616-64 波21 F-05多模态Phase2b前端(图片粘贴/拖拽+渲染+parts透传)(e1d396d) — 🟡 待审
|
||||
### CR-260616-64 波21 F-05多模态Phase2b前端(图片粘贴/拖拽+渲染+parts透传)(e1d396d) — ✅ 已审(PASS)
|
||||
|
||||
- **范围**: 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)。
|
||||
- **复审结论(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)。
|
||||
- **①@paste 图片检测+base64 PASS**:AiChat.vue:1037-1052 onPaste 遍历 clipboardData.items,`it.kind==='file'&&it.type.startsWith('image/')` 正确检测 + :1050 e.preventDefault() 阻止默认粘贴(避免二进制塞 textarea) + :1051 逐个 addImageFile。readImageFile:997-1003 FileReader Promise 正确。
|
||||
- **②@dragover/@drop 拖拽检测 PASS**:onDragOver:1055-1063 `Array.from(e.dataTransfer.types).includes('Files')` 判断含文件 + preventDefault + dropEffect='copy' 正确。onDrop:1066-1074 filter `f.type.startsWith('image/')` 仅取图片 + preventDefault + 逐个 addImageFile。
|
||||
- **③img 渲染随虚拟滚动无冲突 PASS**:模板:415 `v-if="msgImageParts(item.msg).length"` + :413-419 注释明确「虚拟滚动裁剪整条消息,气泡内 <img> 随 sentinel 卸载无冲突」。msgImageParts:1083-1086 filter type==='image' 正确。imageSrc:1089-1096 base64 模式拼 data URI(`data:${mt};base64,${img.base64}`) + url 模式兜底空串。
|
||||
- **④parts 全链透传 PASS**:handleSend:1830 snapshotImgs 快照 + :1831-1849 ContentPart[] 构造(Text 首+Image 序) + :1863 `store.sendMessage(text,skill?.name,false,parts)` 传参。useAiSend.ts doSend:80 接 parts 参数 + :87 仅非空挂 parts + :114/:117 aiApi.forceSend/sendMessage 透传(Phase 2c 后端接入即生效)。drainQueue:261 `sendMessage(next.text,next.skill,false,next.parts)` 续发正确。queue 扩展:ai.ts:72-73 注释明确 + useAiSend.ts:298-302 入队挂 parts。
|
||||
- **⑤虚拟滚动保留 PASS**:AiChat.vue:1106-1111 useAiVirtualScroll 未改动(git show e1d396d 确认) + 模板:401 `shouldRenderMsg(item.key)` 裁剪整条消息,图片在气泡内随消息卸载,无独立冲突。
|
||||
- **⑥i18n 双语 PASS**:zh-CN:103-107 + en:102-106 五 key 对称(removeImage/imagePreviewAlt/imageTooLarge/imageLimit/imageReadFailed)。特殊字符无转义需求。
|
||||
- **⑦约束正确 PASS**:MAX_PENDING_IMAGES=6 + MAX_IMAGE_BYTES=10MB + addImageFile:1007-1029 size/type/数量三重校验 + toast 提示完整。
|
||||
- **⑧发送失败回填 PASS**:handleSend:1869-1871 `if(parts) pendingImages.value=snapshotImgs` 回填正确,用户可重试。
|
||||
- **待修项回流 todo**: **无**(8 维度全 PASS,零问题。Phase 2c IPC 接入即全链闭环)。
|
||||
|
||||
### 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。
|
||||
- **范围**: 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,禁止碰 useAiSend):doSend L113/115 aiApi.forceSend/sendMessage 加 parts 传参(确定性一行级,Phase 2c 全链生效)。
|
||||
- **维度**: ①IPC parts 参数 serde ②user_parts push 空兼容 ③api parts 透传 ④doSend 传参(主代补 gap)⑤FR-S1(Image base64 非敏感,不入 NodeContext/IPC 返回/日志)⑥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 安全。
|
||||
- **审查 agent 待复审重点**: ①IPC parts serde 反序列化 ②user_parts 空兼容(向后兼容 user())③api parts 透传(parts&&length>0?parts:null)④doSend 传参(主代补)⑤FR-S1 Image base64 安全。
|
||||
- **待修项回流 todo**: **无**(F-05 多模态全链闭环:2a+2b+2c+doSend)。
|
||||
|
||||
### CR-260616-66 波23 Settings拆4子组件(Provider/Connection/General/Knowledge·零行为变化)(9c60c8f) — 🟡 待审
|
||||
### CR-260616-67 波24 B-03b-R10③工作流事件补execution_id治本并发串扰(bac3c76) — 🟡 待审
|
||||
|
||||
- **范围**: 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**: **无**(纯重构零功能,行为零变化硬约束满足,运行时留实测)。
|
||||
- **范围**: workflow wznh9b2yz。df-types/events.rs WorkflowCompleted/Failed 补 execution_id:String(#[serde(default)] 向后兼容,老事件空串)+ 3 emit 点填(executor.rs:185 self.execution_id + workflow.rs Lagged 合成三分支 forward_exec_id + 补发 exec_id)+ 消费点 workflow.rs matches! 加 exec_id 守卫(只 break 自己 forward_exec_id,他人终态继续循环)。
|
||||
- **维度**: ①字段补齐(Completed/Failed 向其他变体对齐)②#[serde(default)] 向后兼容 ③3 emit 点全覆盖 ④消费 exec_id 守卫(只 break 自己)⑤空串匹配语义(只漏不误)⑥前端契约零破坏 ⑦cargo 0+test 全绿(df-types 7/df-workflow 23/devflow 92)。
|
||||
- **commit**: bac3c76。**主代核查**: cargo check EXIT 0 + grep execution_id 字段(#[serde(default)])。
|
||||
- **审查 agent 待复审重点**: ①字段 #[serde(default)] 向后兼容 ②3 emit 点 execution_id 来源 ③消费守卫 exec_id 匹配(只 break 自己)④空串匹配语义 ⑤前端契约零破坏。
|
||||
- **待修项回流 todo**: **无**(跨 crate 治本完整,emit 3 处全补,消费守卫落地)。
|
||||
|
||||
### CR-260616-36 batch60 F-09A 隔离补清 + F-13 性能优化 + AE-03 write_file diff 预览(路径B) — ✅ 已审(PASS)
|
||||
|
||||
@@ -552,6 +563,22 @@
|
||||
|
||||
## 已审归档
|
||||
|
||||
### CR-260616-66 波23 Settings拆4子组件(Provider/Connection/General/Knowledge·零行为变化)(9c60c8f) — ✅ 已审(PASS)
|
||||
|
||||
- **复审结论(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)。
|
||||
- **①4 子组件拆分边界 PASS**:ProviderPanel 收纳 AI 模型配置 + Provider 表单(providerForm 双向共享按数据耦合正确收敛:171-204 openProviderForm 编辑/新建完整分支) / ConnectionPanel 独占 localStorage CRUD / GeneralPanel 独占主题/语言/并发/Agent 轮次 / KnowledgePanel 独占知识库配置(embeddingProviders 依赖 ProviderPanel 的 aiProviders props:108-109 正确)。零交叉污染。
|
||||
- **②props/emits 接线 PASS**:Settings.vue:26 传 `:confirm-dialog="confirmDialog"` 函数引用 + :75 `useConfirm()` 返回 confirmDialog/confirmState/answerConfirm 三件套 / ProviderPanel.vue:150 接收 props.confirmDialog + :267/ConnectionPanel.vue:174 调用 props.confirmDialog 删除确认 / emit('toast') 上下传完整(Settings.vue:27/35 接收 + :65 showToast) / emit('providers-changed') 上抛同步 aiProviders(Settings.vue:85-87)。
|
||||
- **③CSS scoped 零视觉变化 PASS**:各子组件自持 scoped 样式副本(ProviderPanel:347-458 / ConnectionPanel:184-262 / GeneralPanel:280-322 / KnowledgePanel:171-213).panel/.btn/.toggle/.setting-* 类完整重复,父 scoped 无法穿透子根故需子自持(Settings.vue:179-181 注释明确)。视觉 CSS 全保留。
|
||||
- **④F-04c enabled/weight 拆 ProviderPanel 保留 PASS**:ProviderPanel.vue:40 `@change="onPoolToggle"` + :50 `@change="onPoolWeightChange"` / :301-312 onPoolToggle(prev 保存 + 乐观更新 + catch 内 revert) / :318-332 onPoolWeightChange(debounce 300ms + clamp[0,100] + NaN 兜底回退 50) / aiApi.updateProviderPool 即时调 IPC(:305/:325) / reload_provider_caps 语义完整(注释:291-294)。
|
||||
- **⑤sync×3 拆 GeneralPanel 保留 PASS**:GeneralPanel.vue:92 `@change="syncConcurrencyConfig"` + :114 `@change="syncAgentMaxIterations"` + :125 `@change="syncAgentMaxRetries"` / :202-219 syncConcurrencyConfig(debounce 300ms + clamp 双并发 + 单对话不超过全局) / :226-237 syncAgentMaxIterations(debounce 300ms + clamp[1,50]) / :243-254 syncAgentMaxRetries(debounce 300ms + clamp[0,10]) / :265/:267/:269 onMounted 启动同步一次防止刷新后丢失。
|
||||
- **⑥AE-05 useConfirm 留 shell PASS**:Settings.vue:7-15 confirm-mask/confirm-box 模板完整 + :75 `useConfirm()` 返回 confirmState 留 shell共享(confirmState.visible/msg 在 setup 自动解包) + answerConfirm 双按钮绑定。
|
||||
- **⑦6 timer 全覆盖 PASS**:Settings.vue:96 _toastTimer 清理 + :97 providerPanelRef.clearPoolTimer() (ProviderPanel.vue:343 暴露) / ProviderPanel.vue:322 _poolTimer clearTimeout / ConnectionPanel 无 timer / GeneralPanel.vue:274-276 三 timer 清理(_concurrencyTimer/_agentIterTimer/_agentRetryTimer) / KnowledgePanel.vue:167 _knowledgeSaveTimer 清理。各子组件 onUnmounted 自管(Settings.vue:95 注释明确)。
|
||||
- **⑧i18n 复用无新增 PASS**:grep 核验 panelAiProvider/panelConnection/panelGeneral/panelKnowledge 全在既有 settings.ts(zh-CN:7/62/77/115 + en:7/62/77/115)。零新增 key。
|
||||
- **待修项回流 todo**: **无**(8 维度全 PASS,零问题。纯重构零功能,行为零变化硬约束满足,运行时留实测)。
|
||||
|
||||
---
|
||||
|
||||
### CR-260616-34 batch58 F-260616-10 provider 默认值重启失效 bug — ⚠ 已审(PASS-WATCH)
|
||||
|
||||
- **审查时间**: 2026-06-16(主线程兜底·agent 撞 GLM 限流 1305 · grep/read 核验源码 + 类型确认)
|
||||
|
||||
Reference in New Issue
Block a user