62 lines
8.1 KiB
Markdown
62 lines
8.1 KiB
Markdown
# 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 补齐审批、提问和文件产物的状态契约。
|