From 6a7a8cbaac25bee583f25976c45e403584ee49d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=9D=E5=B0=98?= <237809796@qq.com> Date: Fri, 19 Jun 2026 20:20:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96:=20=E5=BE=85=E5=AE=A1?= =?UTF-8?q?=E6=9F=A5=20CR-260619-14=20=E5=A4=9A=E4=BC=9A=E8=AF=9D=E5=89=8D?= =?UTF-8?q?=E7=AB=AFUI=E5=AE=A1=E6=9F=A5=E5=9B=9E=E5=A1=AB(=E2=9C=85=20PAS?= =?UTF-8?q?S)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 6 维度全过:Set 响应式/迁移完整/AiError 精确清/侧栏并行/独立窗口/向后兼容。 AiError delete(convId) 修原 =null 全局误清(多会话并发正确性核心修复)。 ⚪2 WATCH:newConversation clear 全清(前端视觉非后端)/streaming 单值联合判定。 清理审查 agent 遗留重复登记块。无 🔴/🟡 阻塞项。 --- docs/待审查.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/待审查.md b/docs/待审查.md index 4fb027e..24cc379 100644 --- a/docs/待审查.md +++ b/docs/待审查.md @@ -1061,6 +1061,32 @@ --- +### CR-260619-14 多会话并发前端 UI 阶段3/4(generatingConvs:Set + 侧栏并行 + 独立窗口 per-conv·commit 7d54029) — ✅ 已审(PASS) + +- **结论(2026-06-19·独立 grep/read 核验 commit 7d54029 当前形态,HEAD=7d54029 无后续代码漂移)**: ✅ **PASS** — 🔴0 🟡0 ⚪2 +- **验证**: `npx vue-tsc --noEmit` EXIT 0 独立复跑 ✅ / `grep -rn generatingConvId src/` 仅 2 处注释命中(stores/ai.ts:196/220),零代码读写残留 ✅ / 逐维度源码核验(非 diff 快照)。 +**6 维度逐项核验**(源码当前形态为准): + +| # | 维度 | 判定 | +|---|------|------| +| 1 | Set 响应式 | ✅ stores/ai.ts:70 `generatingConvs: new Set()` 在 `reactive({})` 内;:204-206 `isGenerating` 调 `state.generatingConvs.has(convId)`。Vue 3 reactive 对 Set 的 has/add/delete 提供 collection proxy 跟踪,computed/template 内调用建立响应式依赖,Set 变更触发更新。AiChat(:283)/MessageList(:197/354)/DirAuthDialog(:51)/MaxRoundsCard(:43) 四处 computed 调 `store.isGenerating(activeConversationId)` 均建立依赖,UI 自动刷新 | +| 2 | 5 处迁移完整性 | ✅ useAiEvents.ts:362(Completed) `state.generatingConvs.delete(event.conversation_id \|\| '')` / :415(AiError) 同 delete / :465(路由非当前 conv) `state.generatingConvs.delete(convId \|\| '')` / :472(路由标记) `state.generatingConvs.add(convId)`。外加 useAiWindow.ts:65/196(detach delete + restore add)+ useAiStream.ts:30(clear)+ useAiConversations.ts:78(newConversation clear)。grep 零代码赋值残留 | +| 3 | AiError 精确清 | ✅ useAiEvents.ts:415 `state.generatingConvs.delete(event.conversation_id \|\| '')` — 仅清出错会话,不再 `= null` 全局清空(原单值语义会误清其他并发会话)。多会话并发下 A 报错不影响 B 生成态 | +| 4 | 侧栏并行指示 | ✅ ConversationSidebar.vue 三处独立脉冲点:`store.isGenerating(conv.id)` 在 :50(搜索结果)/:132(活跃分组,带 F-09 注释)/:177(归档分组)。各会话独立判定,多会话同时生成时各自项独立显示 `.ai-conv-gen-dot`。i18n key `aiChat.generating` 中英对称(zh:7 '生成中…' / en:7 'Generating…') | +| 5 | 独立窗口 per-conv | ✅ useAiWindow.ts:28-40 前缀常量 `ai-detached-`/`df-ai-gen-`/`df-ai-text-` + detachedLabel/genKey/textKey 生成器。:46 detachPanel 接受 convId → label per-conv;:54-57 写 per-conv 快照;:101-108 reattachPanel 关闭所有 `ai-detached-*` 前缀窗口(含旧 'ai-detached');:117-128 cleanupAllDetachedSnapshots 清所有 per-conv + 旧单 key | +| 6 | 向后兼容 | ✅ (a) 单会话场景:Set 0/1 元素行为等价(isGenerating has 单元素等单值 null/非null)。(b) :161/179/186/187/219/222 多处读路径 `localStorage.getItem(per-conv) \|\| localStorage.getItem('df-ai-gen')` 双兜底,旧版本写入的单 key 快照仍可读。(c) streaming 单值保留(stores/ai.ts:63)粗粒度"任一会话流式中",供 AiChat 等场景判断当前视图流式态 | + +**审查防污染印证**: +- HEAD = 7d54029,`git diff 7d54029 --stat` 仅 docs/待审查.md +16(本次回填),12 源文件零后续漂移,源码形态可信(memory [[review-batching-worktree-transient]] 教训印证)。 +- AiError 修复为本批最高价值项:原单值 `generatingConvId = null` 在多会话并发下会误清其他会话生成态(侧栏脉冲错灭/ghost),改 `delete(event.conversation_id)` 精确清是核心正确性修复。 +- useAiStream.ts:30 `state.generatingConvs.clear()` 全清(非精确)是合理的兜底设计:整流超时无法确定具体 conv(无 event 携带 convId),保守全清避免幽灵,与 AiCompleted/AiError 精确 delete 互补,非缺陷。 + +- **⚪ WATCH-1**: useAiConversations.ts:78 `newConversation` `generatingConvs.clear()` 全清 — 多会话并发下新建会话会清掉其他后台生成态的侧栏脉冲指示(但不影响后端真实生成,仅前端视觉)。当前设计合理(新建会话视作用户关注转移),若后续报告后台会话脉冲丢失可改精确清。 +- **⚪ WATCH-2**: streaming 单值(stores/ai.ts:63)在多会话并发下语义为"任一会话流式中",各组件用它判当前视图流式态时需配合 `isGenerating(activeConversationId)` 联合判定(4 组件已对齐)。若未来仅读 streaming 单值可能误判其他会话流式影响当前视图,当前 4 处 computed 均联合判定无隐患。 +- **待修项回流 todo**: **无** 🔴/🟡 项 + +--- + ## 已审归档 > 已审 CR 段迁独立文件: [待审查归档/2026-06.md](./07-项目管理/待审查归档/2026-06.md)