# v0.5.12 > 本版本一条主线:editor-lsp-foundation 的 **Phase 4 收尾**——把 CLI agent 的文件编辑(Edit / Write / NotebookEdit / MultiEdit 工具)实时桥接到桌面工作区面板。AI 改文件的瞬间,工作区文件树 / 诊断刷新,正在编辑的同名 buffer 自动浮出 agent-source 冲突 banner。完成后 v0.5.12 闭合 47-task editor-lsp-foundation spec 的全部产品工作。 ## 新功能 ### Agent 文件编辑桥(Phase 4) - **agent 编辑实时反映到桌面工作区**(#29)。当 CLI agent 的 Edit / Write / NotebookEdit / MultiEdit 工具成功完成时,桌面 chatStore 立即触发 `workspacePanelStore.notifyAgentFileEdit(sessionId, absolutePath)`: - 工作区面板若打开则刷新 `loadStatus`,文件树 / changed 列表 / LSP 错误数都拉到最新; - 任何已打开 buffer 若路径匹配(按段边界后缀匹配,Windows `\` 与 POSIX `/` 都正常归一),就被标上 `source: 'agent'` 冲突 banner,沿用 Phase 2 已有的 Reload / Keep mine / Open conflict view 三按钮路径——AI 永远不会静默覆盖用户未保存的改动。 - **不动 vendored upstream 文件编辑工具**。CLI 侧的 FileEditTool / FileWriteTool 是从 upstream Anthropic CLI vendored 来的,`ToolUseContext` 没有 `sessionId`,从 CLI 进程 import server WS 模块也会引入跨进程依赖。本 PR 不碰它们一行——agent 的工具流(`tool_use_complete` + `tool_result`)已经把 `sessionId` / `toolName` / `input` / `isError` 都送到桌面,桌面 chatStore 自己识别这是文件编辑工具并消费。同 store 里 `TodoWrite -> useCLITaskStore`、`TASK_TOOL_NAMES -> refreshTasks` 用的是同一种 bridge pattern。 - **健壮的边界**: - 工具 `tool_result.isError === true` 时不触发——失败的编辑不影响磁盘内容; - 同 toolUseId 收到重复 `tool_result` 只 fire 一次(pending 表 consume 即删); - 已有冲突 banner 的 buffer 不被新 agent 事件覆盖(保留用户已经看到的 banner); - path 匹配走 `endsWith('/' + bufferPath)` 边界,避免 `foobar.ts` 误匹配 `bar.ts`; - `disconnect` / `clearMessages` / new-session 三处都清掉 pending 表,无泄漏。 ## 改进 - 无(本版本是 Phase 4 单一 PR)。 ## 修复 - 无。 ## 范围 - chatStore 桥接:`desktop/src/stores/chatStore.ts`(+`FILE_EDIT_TOOL_NAMES` / `extractEditedFilePath` / `rememberPendingFileEdit` / `consumePendingFileEdit` / `clearPendingFileEdits`、wire 到 `tool_use_complete` / `tool_result` 与 3 处 cleanup)、`desktop/src/stores/chatStore.test.ts`(+6)。 - workspacePanelStore agent 来源:`desktop/src/stores/workspacePanelStore.ts`(+`notifyAgentFileEdit` / `AGENT_EDIT_SENTINEL_HASH` / `normalizeAgentEditPath` / `agentEditMatchesBufferPath`)、`desktop/src/stores/workspacePanelStore.test.ts`(+6)。 ## 验证 - 桌面 `bun run lint`(`tsc --noEmit`)✅ - 桌面 `bun run test src/stores/workspacePanelStore.test.ts`:30 / 30(24 → 30,+6 agent edit 用例)✅ - 桌面 `bun run test src/stores/chatStore.test.ts`:112 / 112(106 → 112,+6 bridge 用例)✅ - 桌面 `bun run build`:✅ - 桌面 `bun run check:bundle-budget`:+2.41 KB gz vs 基线 3299.76 KB(97.59 KB headroom 剩余)✅ - 独立 verification subagent 跑了 build / lint / 两套 test / bundle 预算 / 9 个 ad-hoc helper edge case(Unicode 路径、trailing slash、identical absolute、deeper suffix mismatch):全 PASS。 ## 升级注意 - **零破坏**。Phase 4 只新增桌面 store 行为,不改 CLI 工具、不改 server,不改任何 vendored upstream 代码。已有 user-source 冲突 banner 与原子保存路径行为完全保留。 - **agent 编辑反馈仅在工作区面板打开时刷新文件树**——关闭面板时不发后台请求;下次打开会拉一次最新状态。 - **路径匹配是 path suffix 而非 inode**。极少数情况下,monorepo 内多个 workspace 同名文件可能误触发——按 spec 设计这是可接受的(误报最多就是多刷一次 banner,永远不会丢数据)。 ## editor-lsp-foundation 全景 v0.5.11 + v0.5.12 联合闭合 `.kiro/specs/editor-lsp-foundation/` 的 47 task: | Phase | 内容 | PR | Release | |---|---|---|---| | Phase 1 | 默认 'all' 视图 | #23 | v0.5.11 | | Phase 2 | CodeMirror 编辑器 + 原子保存 + 冲突 banner | #24 | v0.5.11 | | Phase 3 | LspManager + LspStatusIndicator | #26 | v0.5.11 | | Phase 4 | agent 编辑桥 | **#29** | **v0.5.12** | | Phase 5 | Solo lspErrorCount 信号 | #27 | v0.5.11 | | 收尾 | release notes + spec 关闭 | (本 PR) | v0.5.12 | 剩余的"WorkspaceEditor 接入 WorkspacePanel header"与"production LspClientFactory 包 typescript-language-server"是 spec 范围外的下一阶段工作——前 5 phase 把所有底座组件铺好,集成到 panel 是单独的小 PR。