6.7 KiB
对话渲染:从发布代码还原工程模块
后续已补齐 Mermaid、图片和路径点击接入,本文件记录前一批次;最新实现、证据和剩余差异见 图表、图片与文件。
本轮已将 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/ 已更新;本轮浏览器验证使用独立临时服务器,生产数据未改变。