Skip to content

feat(ai): WPS 前后端契约命名双轨迁移(doc_*/editor_command 与 wps_* 并行) - #192

Merged
zeweihan merged 1 commit into
masterfrom
claude/wps-contract-dual-migration-9d55f5
Jul 24, 2026
Merged

feat(ai): WPS 前后端契约命名双轨迁移(doc_*/editor_command 与 wps_* 并行)#192
zeweihan merged 1 commit into
masterfrom
claude/wps-contract-dual-migration-9d55f5

Conversation

@zeweihan

Copy link
Copy Markdown
Owner

概要

Phase 3 遗留项:把 WPS 时代的前后端契约命名迁到新名,双轨并行一个发布周期后再摘旧名(本 PR 只落双轨,不摘旧名)。登记于 docs/AI_ARCHITECTURE.md §编辑器前后端契约。

迁移映射

契约 新名(主) 旧名(双轨保留)
SSE 流式写入事件 doc_stream_data wps_stream_data
client_action 命令载荷 tool: "editor_command" tool: "wps_command"
client_action 打开/刷新 doc_open_file / doc_reload_file wps_open_file / wps_reload_file
同步打开命令 doc_open_file_sync wps_open_file_sync
结果回调路由 POST /api/ai/agent/editor-result /wps-result(路由别名)

双轨机制(顺序即契约)

后端对每条指令按新名在前、旧名在后各发一份(SSE 单连接有序);前端凭"先见新名"置闩锁判定新后端,此后丢弃所有旧名事件。新旧后端 × 新旧前端四种搭配下,每条指令都恰好执行一次。

一并清理的前端零散遗留

  • VariablePanel.getWps prop → getEditor
  • ChatInterface.vue wps-tip-* / wps-link-text CSS 类 → doc-tip-* / doc-link-text

明确不动(存量数据契约,另立迁移方案)

ProjectFile.wpsFileId(含 DB 列与 API JSON 字段)、存储前缀 wps-files/write_docx 返回键 wps_file_idFeatureNotConfiguredException"wps" 标识。

验收(AI_ARCHITECTURE.md 门槛全过)

  • ✅ backend mvn test 全绿(JDK 21)
  • ✅ frontend npm run check:emits
  • Electron 桌面端真机三链路实测(dev Electron + CDP):
    • AI 打开文档:后端日志 Sent doc_open_file + 编辑器随即拉取文件内容
    • 查找替换修订:editor_command/wps_command 双发各 1 次 → 去重后仅执行 1 次 → 新路由 /editor-result 200 → Completed editor action: success=true
    • 流式写入新文档:doc_open_file_sync 同步打开往返成功,流式产物中验收标记恰好出现一次(若去重失效每个 token 会写两遍)
  • ✅ 双 e2e:test:lowa-e2e 33/33,test:app-e2e 29 步全过、0 异常信号

实测中发现的存量问题(与本迁移无关,已建独立任务)

  • <tool_code> 文本工具调用的位置参数不映射 → doc_find_replace 收到 null 参数 NPE
  • 自动保存疑似在文档未加载完成时用空文档覆盖存量文件

🤖 Generated with Claude Code

Phase 3 遗留项落地(docs/AI_ARCHITECTURE.md §编辑器前后端契约):

后端双发(新名在前、旧名在后,顺序即契约):
- SSE 流式写入:doc_stream_data + wps_stream_data(AgentOrchestrator)
- client_action 命令:tool editor_command + wps_command,同 requestId;
  同步打开 action doc_open_file_sync ↔ 旧名 wps_open_file_sync 映射(EditorBridgeService)
- client_action 打开/刷新:doc_open_file / doc_reload_file + wps_*(sendDualNamedAction)
- 结果回调路由:/api/ai/agent/editor-result 新路由,/wps-result 保留别名(EditorResultController)

前端双听 + 去重闩锁(project-overview handleClientAction):
- 一旦见到任一新名即判定新后端(SSE 单连接有序),此后丢弃所有旧名事件,
  新旧后端×新旧前端四种搭配下每条指令都恰好执行一次
- sendEditorResult 改发新路由 /editor-result

前端零散 WPS 遗留清理:
- VariablePanel getWps prop → getEditor(绑定点/局部变量/注释同步)
- ChatInterface wps-tip-*/wps-link-text CSS 类 → doc-tip-*/doc-link-text

文档:AI_ARCHITECTURE.md 契约表改双轨状态并勾掉 Phase 3 待办(留摘旧名项);
ai_agent_dev.md §2.2 事件字典改为实际契约(移除已不存在的 wps_write)。

明确不动(存量数据,另立迁移方案):ProjectFile.wpsFileId、wps-files/ 存储前缀、
write_docx 的 wps_file_id 键、FeatureNotConfiguredException "wps" 标识。

验收:backend mvn test 全绿(JDK 21);npm run check:emits 过;
Electron 真机三链路实测通过——AI 打开文档(后端 Sent doc_open_file + 编辑器拉流)、
查找替换修订(双发各 1 次/去重后执行 1 次/新路由 200/success=true)、
流式写入新文档(产物标记恰出现一次,无双写);
双 e2e:test:lowa-e2e 33/33,test:app-e2e 29 步全过 0 异常。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@zeweihan
zeweihan merged commit f16820e into master Jul 24, 2026
4 checks passed
@zeweihan
zeweihan deleted the claude/wps-contract-dual-migration-9d55f5 branch July 24, 2026 08:44
zeweihan added a commit that referenced this pull request Aug 27, 2026
- 未登录空态改品牌欢迎卡,替代一句红字(#192)
- 语言切换改地球 SVG 图标 + 目标语言缩写(#193)
- 账户菜单展示身份与 AI 额度,删「连接与高级设置」入口(#194)
- 历史与模型改常驻 pill,不再收进 + 二级菜单(#195)
- 项目下拉支持新建项目(POST /api/projects,BLANK 类型)(#196)
- 助手气泡轻量 Markdown 渲染 + 段间空行折叠 + 前导空白裁剪
  + 吸底守卫(距底 48px 内才跟随流式滚动)(#197)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant