# 对话渲染:从发布代码还原工程模块 后续已补齐 Mermaid、图片和路径点击接入,本文件记录前一批次;最新实现、证据和剩余差异见 [图表、图片与文件](对话区域-图表图片文件-2026-10-15.md)。 本轮已将 REA 取得的 WorkBuddy 渲染实现还原成独立 TypeScript/TSX 模块,并接入 YCode 实际消息界面。上一轮约 600 行的自写 token→React 渲染器已被薄适配层替换;产品现在沿用原版的主要执行顺序: `源码预处理 → MarkdownIt token/缓存 → HTML → React 组件替换 → 已完成内容分组缓存`。 ## 原版证据 原版查看仍全部通过 REA。本轮复用 runtime Evidence `ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb` 的完整导出,校验选定脚本 SHA-256 后,在导出内容上进行 AST 格式化与定义分拆。没有用本地脚本直接提取 ASAR,也没有执行捕获的原版 bundle。 新增 REA 静态分析仅选择 `renderer/assets/src-DbE1_mgM.js`:父记录 `ev_98115d00e9c653dfe18ef7e3a9b3027d0566f18f8f312035872ee78f90233462`,摘要 `ev_fa709aa1ea2f2e28b9fa6b5c9d21cd49835859dfe2abbac255dfe5190e16fb66`。该文件解析成功,读取 1968427 字节、遍历 415338 个 AST 节点,无解析失败。其余 11388 个来源文件未分析,语义图受 6000 节点预算限制;不能据此宣称完成全应用依赖恢复。ASAR 的已有完整性矛盾继续保留,未作原因推断。 脚本身份:`src-DbE1_mgM.js` / SHA-256 `6c6ce63c93854783270e855572797d75e536e3b8d4548410e31fe9d147e1feb4`。 | 原版定义或包含区间(UTF-16、右端不含) | 工程落点 | | --- | --- | | CJK `[624883,626500)` | `workbuddy/markdown/cjk.ts` | | metadata、raw HTML、linkify 的 Gf/ep 初始化器及 `[648032,649516)` | `code-fence.ts`、`html-fallback.ts`、`linkify.ts` | | `initMarkdownIt` `[656816,659240)` 及 math/Prism 包含初始化器 `[652022,659243)` | `parser.ts`、`languages.ts`、`math.ts` | | provider `[718666,718860)` | `context.tsx` | | CodeLikeBox 包含初始化器 `[718885,719202)`;Copy `[719311,720135)`;CodeBlock `[720136,721212)` | `components/CodeBlock.tsx` | | MathInline `[731414,731499)`;MathBlock `[731500,731728)` | `ReactMarkdown.tsx` | | OpacityText `[798343,798513)` | `ReactMarkdown.tsx` | | finished emphasis/XML helpers `[806993,809247)`;主 renderer 包含初始化器 `[818611,827154)` | `source-projection.ts`、`ReactMarkdown.tsx` | | boundary/cache 包含区间 `[812685,816842)`;grouping `[818332,818478)` | `incremental.ts` | 工程目录为 `src/renderer/src/workbuddy/`。模块接口、适配边界见其中 README;具体 assignment 的原始范围保存在 `.tmp/rea-chat-recovered/manifest.json`。该派生材料包含 309 个顶层声明片段和 90 个实际赋值定义,仅用作阅读依据,不进入产品构建。 REA 的自动 Wakaru 恢复工具要求 Linux x64,当前工作区是 Windows。本轮使用已由 REA 获取的代码,通过 AST 分拆和人工类型化完成工程还原,没有为此安装或切换宿主环境。 ## 相比上一轮补齐或纠正 - CJK:原版扫描算法与当前 `markdown-it-cjk-friendly@3.0.0` 不同,已恢复原版算法并移除该插件依赖。 - 标题:恢复只处理等号 Setext 标题的特殊 `lheading` 规则。 - 流式提示:按原版先切最后 6 个 UTF-16 单元,再按字符生成 token;寻找最后一个符合条件的文字子 token,遇到末尾 fence 停止。OpacityText 使用 `0.1 × level` 固定透明度,移除上一轮推测的定时动画。 - 内容处理:恢复模型协议 XML 清理、LaTeX `\[...\]` / `\(...\)` 转换、引号强调修正、完成后的 escaped/residual emphasis 修复。 - 解析与缓存:恢复安全前缀边界、引用定义和数学块的禁用条件、map/id 重排、前缀 loadingDot 撤销及顶层分组缓存。 - 代码:恢复原版 wrapper/header/content/pre 层级。复制接收原始代码,显示接收渲染后的 children,两者独立;语言 class 保留解析器实际输出。文件点击必须有 handler。 - Prism:恢复 24 个懒加载入口、别名、依赖顺序与加载完成通知,包含 C++、PHP、TSX、Scala 等;加载完成后重渲染高亮。 - 数学:原版 KaTeX 模块显示版本 0.16.47,已锁定该版本;补齐行内、块级、集合宏及 latex fence。文档型或无效 LaTeX 回退代码块。 - 表格:使用原版 token 的 `data-content`,在末尾表格仍生成时禁用引用,完成后启用;保留 LF 和无终止换行规则。 ## 验证 | 验证 | 结果与范围 | | --- | --- | | `npm run build` | 类型检查、实际渲染产物及懒加载 chunk 构建通过 | | `npm run test:recovered` | 5 个套件通过:还原 parser、21 项源投影、代码组件契约、流式缓存、数学/回退/状态规则 | | 流式缓存验证 | 9 种输入的 402 个逐字前缀;268 次缓存复用,与完整重解析的 HTML 和行号 map 一致,缓存前缀未被污染 | | `npm run test:markdown` | 30 项集成渲染检查通过;按源码修正 UTF-16、class、语言输出和静态 span 的预期 | | `npm run test:chat` | 消息顺序、发送状态、23 项工具适配检查通过,确认渲染器替换没有破坏共享契约 | | YCode 浏览器离线样本 | 3 处公式、1 个公式块、22 个代码高亮 token、文件 L12-L15、复制成功反馈、表格源码进入草稿并聚焦;模型协议 payload 不可见 | | 1334×901、960×640 视口 | 无页面横向溢出;小视口代码框宽 592px;未使用原版截图作对照 | UI 样本位于 `scripts/fixtures/source-recovery.mjs`。截图 `.tmp/chat-source-recovery-2026-10-15.png` 为实际构建产物的离线样本。测试假桥不写入用户会话、不请求模型,也不改变系统剪贴板。浏览器测试还发现并修复了测试服务器使用字符串替换注入 fixture 时,将 `$$` 意外缩为 `$` 的问题;已改用 replacement callback,生产渲染器不涉及该注入路径。 ## 尚未还原与未验证 工程还原已覆盖上述执行链和模块,尚未证明原作者的完整工程结构、全部依赖版本和全部渲染状态都已恢复。Mermaid 仍使用代码回退;敏感投影、图片桥接/预览、文件宿主操作、宽度感知、全部 tooltip/icon/theme CSS 等仍需继续逐项还原。 原版像素采集仍受 REA `target_not_allowed` 限制;组件 class 和层级有源码依据,当前样式中的 token、边框与几何还不能宣称像素 1:1。OMP 的真实 ready/重启上下文验证仍是上一轮记录的未通过项,本轮没有改变这一结论。 没有重启当前 WorkBuddy 或 YCode 原生窗口。`out/` 已更新;本轮浏览器验证使用独立临时服务器,生产数据未改变。