# 对话区域:图表、图片与文件 本轮将 REA 已取得的 Mermaid、Markdown 图片、路径检测与点击处理还原为工程模块,接入实际消息渲染。图表不再只有代码回退,图片能够打开预览,文件标题和行内路径能够调用本地文件预览。当前对话区域仍未完成全部 1:1 验收。 ## 原版依据 原版为 WorkBuddy 5.8.2。所有原版实现仍只通过 REA 查看;本轮在既有 REA runtime Evidence `ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb` 的完整导出上阅读、校验并进行 AST 分拆,没有直接读取原版安装文件,也没有执行捕获的 bundle。 主发布脚本 `renderer/assets/src-DbE1_mgM.js`,SHA-256 `6c6ce63c93854783270e855572797d75e536e3b8d4548410e31fe9d147e1feb4`。下表区间为 UTF-16、右端不含。 | 证据范围 | 工程落点 | | --- | --- | | 图片 URL 校验/解析 `[721231,721551)`,MarkdownImage `[721564,722288)` | `workbuddy/images/image-url.ts`、`MarkdownImage.tsx` | | 路径点击 `[722904,723374)`,路径检测 `[723580,724687)`,缓存/解析 `[724997,726485)`,InlineCode `[727268,728626)` | `workbuddy/paths/` | | SVG/PNG 导出 `[731747,733169)` | `workbuddy/mermaid/svg.ts` | | MermaidToolbar `[783052,784820)`、渲染器 `[787685,788850)`、render hook `[790284,792838)`、pan/zoom `[793017,794596)`、组件 `[795642,798306)` | `workbuddy/mermaid/` | | activation `[785013,785362)`、可见性 `[789143,789531)`、宽度发布 `[804434,805229)` | `mermaid/visibility.ts`、`width.ts` | 图片单文件查看器来自同次 REA 导出的 `image-preview-component-BgOcW3Xe.js`,SHA-256 `6720317ba018215f96a87d966b08c0d0aa74c26d2298d5fd95f71e8ff2e04e59`,提供适应/原始大小、缩放、拖动、镜像、左转、关闭和下载控件依据。保留的 339 份脚本中未找到 URL 列表图片查看器的完整实现;上一张/下一张及键盘切换是明确的本地适配。 `npm run recover:chat-reference` 的派生输出现有 541 个声明片段、164 个赋值定义;其输入必须是既有 REA 导出,不连接原版。本轮尝试 REA ASAR extraction 因缺少 unpacked companion `cli/node_modules/koffi/build/koffi/darwin_arm64/koffi.node` 失败,未用其他采集渠道绕过。 ## 接入行为 - Mermaid:恢复源码清理、串行渲染队列、64 项/8 MiB 缓存、取消与过期结果处理、SVG ID 重映射、代码/图表标签、明暗主题、缩放/适应、SVG/PNG 导出,以及 300 ms 加载淡出。可见性观察保留 320px margin 和首次可见后保持激活;宽度首次发布或变化至少 16px,360 ms leading/trailing debounce 后由 rAF 发布。宽度相关图表保留 420 ms 重渲染等待。 - 图片:恢复异步 URL 解析、取消过期请求、加载/失败替代文字、图片顺序与点击索引。预览提供缩放、适应/原始大小、拖动、旋转、镜像、下载、Escape 与切图;切图重置变换,下载失败显示错误。 - 路径:恢复文件/目录/符号候选与 `#L4-L7` 行号解析、显示截断、请求缓存和并发去重。点击时再次向宿主确认实际类型,更新缓存/组件状态后打开;失败变为 unknown,阻止旧路径继续打开。保留原版检测边界,例如裸 `src/` 不匹配候选;`src` 可在宿主确认目录后高亮。 - 宿主:新增 preload/IPC 资源契约,读取工作区文件/目录和图片,提供带行号的只读预览及 native save dialog 下载。代码标题直接传递文件和行号。文件读取检查解析后真实路径;文本上限 2 MiB、图片 20 MiB、通用下载 32 MiB。下载 MIME 接受原版 SVG 导出的 charset 参数。 文件预览面板、资源 IPC、URL 列表预览及其错误反馈是 YCode 宿主适配,并不等于恢复了原版编辑器实现。图表下载菜单保留捕获代码的 hover 开启、离开关闭、click toggle 组合;首次鼠标进入后点击会关闭菜单,这是现有源码的行为,没有擅自修正为另一种交互。 ## 验证结果 | 验证 | 结果与范围 | | --- | --- | | `npm run build` | 类型检查与 main/preload/renderer 实际构建通过 | | `npm run test:media` | Mermaid 缓存/队列/取消/清理/SVG 引用,图片 URL/索引/失败下载,23 项路径检查通过 | | `npm run test:resources` | 真临时目录、行号、目录、file/local-file 图片、junction 越界拒绝、HTTP 图片读取通过;加载实际 IPC 注册函数,native dialog 替身下验证取消和 SVG/PNG 文件写入;SVG MIME 含 charset | | `npm run test:markdown`、`npm run test:recovered` | 集成渲染及 5 个源码恢复套件通过,包含 402 个流式前缀和 268 次缓存复用 | | `npm run test:chat`、`npm run test:persistence` | 消息/工具输出/状态与实际 IPC 到会话文件的持久化检查通过 | | 构建产物的离线浏览器 | 有效图表 ready、无效图表 error 后可看源码;zoom matrix 改变;主题切换;SVG 与 PNG 导出 payload(PNG 有正确文件头);第二张图片直接打开为 2/2,缩放/旋转/镜像、键盘切换重置、下载、Escape;行内路径及代码标题打开文件并高亮 4–7 行;目录项可打开文件 | | 默认 1280×720 / 960×640 | 无页面横向溢出;小窗口图表框 594px,图片预览索引正确;测试后恢复窗口尺寸 | 离线 fixture 为 `scripts/fixtures/dialogue-media.mjs`,假桥不请求模型、不读写用户会话。浏览器下载验证的是导出内容送达桥接的结果,native dialog 并未由浏览器调用;实际文件写入另由 IPC 回归测试覆盖。没有重启正在运行的 WorkBuddy 或 YCode 原生窗口。 截图:`.tmp/dialogue-media-2026-10-15.png`、`.tmp/dialogue-image-preview-2026-10-15.png`,均是自有构建产物,不能当作原版对照图。 ## 尚需继续 原版像素采集仍受 REA `target_not_allowed` 限制,尚无并排像素验收。Mermaid 采用固定 11.17.2、svg-pan-zoom 3.6.2,原版这两个依赖的精确版本未知;Mermaid eager/lazy 的原版配置默认值未取得,当前默认 lazy。图标、tooltip、主题 CSS、native 文件编辑/符号跳转、URL 列表查看器仍有适配差异,observer 时序只验证了实现与可见渲染结果,没有测量毫秒级一致性。 敏感信息投影、全部工具/审批/产物状态及完整对话交互仍需补齐。OMP 真实 ready/重启上下文尚未通过,沿用前轮结论。以上已实现与验证范围不能用来宣称对话区域或整个应用已经 1:1 完成。