Files
ycode/docs/复刻进展-2026-10-15.md

62 lines
8.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# WorkBuddy 复刻进展:对话正文与工具过程
> 本文保留第一批实现记录。后续已经从 REA 发布代码还原工程模块,替换自写 Markdown 渲染层并补齐数学、流式缓存等,最新记录见 [源码还原:对话渲染](源码还原-对话渲染-2026-10-15.md)。下文 CJK 插件、Unicode 6 字符提示、数学未实现等条目为当时状态。
目标仍是 WorkBuddy 5.8.2 的视觉、交互和功能 1:1。本轮完成一批可由现有证据支持的客户端实现;不以构建成功或离线样本代替原版逐场景验收。
## 原版依据与采集方式
所有 WorkBuddy 实现查看均通过 REA。本轮通过 `inspect_electron_page(include_script_sources: true)` 获取原版运行时脚本;返回内容超过 MCP 传输预算后,通过 REA 导出证据,再对导出结果进行本地筛选。没有直接读取 ASAR 业务代码,也没有用 CDP、浏览器 evaluate 或 computer-use 绕过 REA。
- REA Evidence:`ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb`。
- 选定脚本:`renderer/assets/src-DbE1_mgM.js`,SHA-256 `6c6ce63c93854783270e855572797d75e536e3b8d4548410e31fe9d147e1feb4`。
- 完整导出 `.tmp/rea-current-evidence.json`;筛选结果 `.tmp/rea-runtime-scripts.json`;带来源、摘要与偏移的片段 `.tmp/rea-chat-reference.json`。这些是本地证据材料,不进入产品构建。
- 目标身份、ASAR 摘要及完整性矛盾沿用接手与重新评估记录;没有将完整性不符推断为功能故障。
确认的静态实现包含:MarkdownIt 的 `html:false / linkify:true / breaks:true`,关闭模糊邮箱和域名识别,CJK 分隔规则,Prism,代码复制与 2000ms 成功反馈,特定代码语言别名,文件/行号 fence 元数据,表格源码切片与添加到对话动作,以及默认收起的工具过程组件。它们支持重建对应规则,但不证明所有动态路径与像素都已一致。
## 已实现
| 范围 | 实际行为 |
| --- | --- |
| Markdown 正文 | 标题、段落、换行、强调、删除线、行内代码、引用、分隔线、嵌套列表、禁用的任务复选框、表格和代码块;采用与证据相同的解析器和 CJK 插件 |
| HTML 回退 | 普通标签移除并保留文本;危险容器及内容抑制;br 换行、u 下划线;代码中的 HTML 保留为字面内容 |
| 代码块 | Prism 常用语言高亮,未知语言纯文本回退;js/ts/py/txt 显示名保留;仅归一化已确认的别名;复制保留 token 中的空白与结尾换行;2 秒反馈 |
| 文件元数据 | 支持 `lang:start:end:path`、`start:end:path`、`lang:start-end:path`;Windows/Unix basename、完整路径 title、L 行号及扩展名推断;当前无文件跳转处理器,因此使用非点击 span |
| 表格引用 | 保留对齐,横向滚动;添加到对话时取得解析器行范围对应的源码,CRLF 归一化为 LF,省略终止换行;追加到草稿并聚焦输入框 |
| 流式正文 | 末尾最多 6 个 Unicode 字符的加载提示;不会把 fence 代码作为该提示处理 |
| 消息顺序 | 新增 `MessagePart`,主进程与渲染器共用事件归约,保留文本→工具→文本顺序,保存和重新读取后顺序一致 |
| 工具过程 | 默认收起,展开参数与完整文本输出,复制全文;保留 running/ok/error/cancelled、实际耗时和取消前输出;600 字摘要与全文分开存储 |
| OMP 工具适配 | 根级 toolCallId/toolName/args、结构化文本结果、isError、仅 id 的更新/结束;partialResult 作为当前快照替换,空最终结果可清空旧进度 |
| 发送与阅读 | 防重复发送;暂存 IPC 返回 runId 前的事件;失败恢复草稿;阅读上方内容时停止强制滚到底部;修正首条消息命名和回退循环历史快照 |
| 会话保存 | 并发首次加载共享 Promise;写入按快照排队,唯一临时文件后原子替换;流式内容约 100ms 合并保存,终态等待在途保存后写入,完成事件在终态保存后发送;写入失败可恢复队列 |
| 内核生命周期 | 每个 YCode 会话固定 `userData/omp-sessions/session-<encoded id>.jsonl`;指定 `--resume` 与 `--session-dir`;切换工作目录先释放旧进程;退出/错误清除当前实例;删除等待进程及回合收尾后仅移除所属 transcript;正常退出等待内核和回合保存 |
新模块为 `src/shared/message-parts.ts`、`src/main/message-checkpoint.ts`、`src/renderer/src/components/MarkdownContent.tsx` 和 `src/renderer/src/styles/markdown.css`;相关类型、IPC、内核、存储、对话状态和组件已集成。新旧 transcript 不做伪造转换:旧会话丢失的工具时序无法从合并正文恢复;旧 YCode-only 历史不会被拼成一条假用户消息灌入 OMP。
## 验证结果
| 命令或观察 | 结果及范围 |
| --- | --- |
| `npm run build` | 类型检查及主进程/preload/渲染器构建通过 |
| `npm run test:markdown` | 30 项规则通过:结构、HTML、CJK、链接、表格源码、代码空白、标签、文件行号元数据等;SSR 验证,不验证真实系统剪贴板 |
| `npm run test:chat` | 消息顺序、发送状态及 23 项工具输出适配检查通过;假内核/假上游 |
| `npm run test:persistence` | 真实 IPC 和会话存储配合假内核通过;检查磁盘中的流式快照、全文、顺序、取消终态、首条标题及回退历史 |
| `npm run test:sessions` | 并发创建/更新、磁盘 JSON 与 IPC 一致、冷加载、强制写入失败后的清理和恢复通过 |
| `npm run test:omp` | 29 项回合终态、取消、错误、监听清理及 IPC 取消落盘检查通过;假内核 |
| `npm run test:omp-session` | 10 项持久/临时启动参数、建目录、退出顺序、监听清理及 1500ms 强制结束检查通过;假子进程 |
| `npm run smoke` | 17 项既有回退网关、工具与取消检查通过;本地假上游 |
YCode 自身使用离线 UI fixture 验证:默认收起/展开、1626 字工具输出末尾标记、复制反馈、文本/工具 DOM 顺序、表格添加到草稿与焦点、代码空白、表格对齐、任务复选框和 HTML 回退。复制由测试桥接记录,未改用户系统剪贴板。1334×901 与 960×640 视口未发现横向溢出;段落和列表字号一致。截图为 `.tmp/chat-parity-2026-10-15.png`,仅展示 YCode 离线数据;浏览器截图的缩放清晰度有限,不能用于像素差分。
## 明确未通过的部分
- **原版像素对照仍未通过。** REA 对原版 file 页面结构和脚本可观察,但截图调用被 `target_not_allowed` 拒绝;没有绕过限制获取原版截图。字体、颜色、间距、工具卡细节及动效尚不能宣称完整 1:1。
- **OMP 真实恢复仍未通过。** 本机 OMP v18.6.3 在隔离、无提示词的测试中,指定不存在的 resume 路径可生成 450 字节、两条元数据的会话文件;未收到 ready,发送单条 get_state 探针也未收到帧。代码仍按既有协议等待 ready;未验证真实模型回合或重启后的上下文。没有读取或修改密钥/profile,也没有提交真实模型提示词。
- Markdown 仍有未覆盖项:完整 Prism 语言集、数学公式、Mermaid/ECharts、原版图片桥接与图片交互、文件跳转等。当前 CSP 限制远程图片,失败显示回退内容;不将这些写成已完成。
- OMP 多文本块之间暂按换行拼接,未知对象文本回退上限 16000 字符;二进制/图片不塞进文字输出。审批、提问、产物、子任务及全部未知协议分支仍需证据和适配。
- 单运行会话限制、账号/通知/空间、侧栏导航、权限、语音和右栏占位等差距仍在完整 1:1 目标范围内。
- 流式保存降低中断损失,不保证断电零丢失;异常退出可能只保存到最近快照,旧 streaming 状态的恢复策略尚待补齐。
没有重启当前 YCode 或 WorkBuddy 窗口。`out/` 已更新;当前运行的 YCode 主进程将在下一次正常启动时加载这些修改。下一批优先解决真实 OMP 就绪/恢复验证,并通过 REA 补齐审批、提问和文件产物的状态契约。