Files
ycode/docs/源码还原-对话渲染-2026-10-15.md

66 lines
6.7 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.
# 对话渲染:从发布代码还原工程模块
后续已补齐 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/` 已更新;本轮浏览器验证使用独立临时服务器,生产数据未改变。