Files
ycode/docs/表格与附件样式修复-2026-10-18.md

69 lines
9.8 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.
# 表格引用与附件样式修复(2026-10-18)
## 本轮结果
对应[此前核对报告](表格与附件样式核对-2026-10-18.md)的表格、文件、图片、资源/技能、发送后展示和混合状态,已完成本轮实现及限定范围验证。表格现在使用输入框内的“表格图标 + 会话表格”短标签;文件/图片/文件夹/技能共用原版标签规则;发送后与编辑态复用同一呈现。
本轮没有向模型发送真实消息、改变用户会话或强制重启用户应用;隔离验收的模型响应为受控数据。由于包含主进程与 preload 变更,用户当前窗口需保存草稿后完整重启,不能只依赖旧进程内的 renderer 重载。
## 原版来源与观察范围
- 沿用保留的 REA `ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb`(既有记录为 WorkBuddy 5.8.3)与 CSS `ev_377c8790468b3c67dad8577aabb327f98d3140659f0fffdbabfcff5a40cc9e94`(既有 WorkBuddy 5.8.2 CSS);未重新采集已有材料。
- 渲染器 `src-DbE1_mgM.js` SHA-256 `6c6ce63c93854783270e855572797d75e536e3b8d4548410e31fe9d147e1feb4`、宿主 `contexts-BMeWSUHk.js` SHA-256 `5f35b7489b107e21ef452c8ee88a95265756f6fc444841eef869228bbc44768b`。
- CSS `src-CyXHA0IC.css` SHA-256 `a5e26b537bb50323aefbf25abddad52e288dd3868598be8d255d70886fe77cfe`。
- `scripts/rea/recover-reference-tags.mjs` 校验固定 Evidence 与摘要,仅从保留正文恢复19个纯 SVG 函数及31条相关样式,保留原选择器及上级条件;不读取安装目录、连接目标协议或执行原版初始化器。
- 表格实际宿主路径为 `createTableMessageQuoteReference` → `createEmbeddedReference` → `displayAsPhrase`;原 `InputBannerRail` 会过滤这些显示块,不能使用 `QuoteReferenceCard` 作为该表格的输入态。
- 本轮再由 REA 检查原有 `9223` 端口,仍为 `provider_unavailable / endpoint_unreachable`;没有擅自导航或重启 WorkBuddy。用户提供的短标签截图可作为结构对照,不能证明所有主题、动画和交互状态均已逐像素一致。
## 已实施
1. **正确标签及原版资源。** 新增 `workbuddy/references/ContentReferenceTag.tsx`、`SourceReferenceIcons.tsx`、`source-reference-tags.css`。文件类23px高、100px圆角、padding `1px 8px`、13px/500/21px、14px图标;表格使用真正的表格 SVG,标签固定为“会话表格”。历史 `preview` 中的 Markdown 不再进入标签、ARIA或 tooltip。
2. **共同内容区。** `ComposerControls` 移除三组框外附件/引用容器,把标签放到圆角 `.cr-input-container` 的内容编辑区;文件、图片、资源和技能不再各占一条外部横栏。原输入框圆角、工具栏、分支/权限/模型区域保留。
3. **混排与键盘。** 使用 Slate 的 inline void 节点承接带引用的内容,支持在当前光标位置插入、文本与多个标签混排、换行、IME保护、选择和键盘删除;最后一个标签移除后回到普通输入框时恢复光标和焦点。原文本输入兼容路径继续保留。富文本区域沿用此前输入高度上限200px,长文件名按源规则截断、折行。
4. **真实内容与显示分离。** 新增 `UserContentBlock`、`shared/user-content.ts` 和可选 `ChatMessage/SendPayload.userContent`,仅记录文本与实际引用的排列;附件、表格快照、资源和技能仍使用原来的真实载荷。主进程按实际集合校验身份、去重、拒绝虚构引用;布局不能替换提示词。发送、失败草稿恢复、编辑、重新生成、磁盘保存和重启恢复保留排列。裁剪首尾空白时同步调整布局。
5. **发送后与编辑。** `UserInlineContent` 在用户气泡内渲染同一套只读标签;移除气泡外文件名、常驻图片和原始 Markdown 标签。`UserMessageEditor` 支持带引用的编辑,取消不改变原消息,提交只移除用户选中的引用;旧消息无需迁移数据即可恢复短标签。普通无引用消息的原有编辑验证仍通过。
6. **悬停与图片。** 默认隐藏移除按钮,悬停时在图标位置替换关闭图标;图片使用类型图标和名称,预加载成功后显示上限300×300的悬停预览,点击接既有图片查看器。资源使用文件/文件夹图标、名称和完整路径提示;技能接相应图标与同类标签。
7. **逐项状态。** 粘贴/拖放时立即插入每个文件的 processing 标签,显示原加载图标及`.7`透明度;失败保留失败标签和原因。完成后在原位置替换为真实附件 ID;取消后即使暂存晚到也会清理,不进入发送载荷;失败项移除前禁止发送。
8. **可用预览入口。** 新增 `attachments.preview(id)`,按已登记附件读取实际内容;右栏后续的完整 Markdown/代码读取仅允许这个已登记路径,重新核对附件 ID 与真实保存路径。其他工作区外路径继续拒绝。原生文件选择保留只读显示用途的 `sourcePath`,缓存路径不冒充原始来源显示在标签提示里;粘贴文件没有来源路径时使用文件名。
9. **发送边界。** 修正只有资源或技能时被渲染器/主进程“空消息”判断静默忽略的问题;仍使用实际能力与资源校验。
10. **错误验收纠正。** 原 `verify-quote-table.cjs` 变为新专项的兼容入口,不再断言“36px摘要横条/强调线/标签必须包含Markdown”为原版正确表现;保留表格菜单几何、来源、加入高亮、移除、IPC快照与历史验证。
11. **预览主题与编辑归属。** 截图复核发现深色附件预览为浅字白底;原版工作台正文暗色规则只识别 `root.dark/cb-dark`,YCode使用`data-theme`。在工作台局部补相同规则的主题标志映射及`--wb-sidebar-bg`绑定,浅深色实际内容均可见;编辑中的资源分类同时传入所属会话,避免工作目录不同导致文件夹被误认成未知文件。
## 验证
最终隔离应用报告:`.tmp/reference-content-tufTSn/report.json`,**44项通过,renderer错误0**。使用实际构建的 YCode、preload、文件系统与正常附件暂存;仅模型回复、两个受控失败/延迟文件为测试替身。
覆盖:原表格菜单与高亮、23px/14px标签几何、输入框内边界、悬停移除、移除后重新添加、键盘删除及焦点、文字中间插入、文件/图片粘贴、拖放、文件夹识别、图片悬停、失败、处理中、取消后晚到清理、浅深色、长文件名与窄窗口折行、发送后的排列与完整引用快照、真实右栏附件预览、图片查看器、编辑取消/提交及旧数据兼容。
重要截图均已实际检查:
- `.tmp/reference-content-tufTSn/table-draft-light.png`
- `.tmp/reference-content-tufTSn/mixed-light.png`
- `.tmp/reference-content-tufTSn/mixed-narrow-dark.png`
- `.tmp/reference-content-tufTSn/file-preview.png`
- `.tmp/reference-content-tufTSn/file-preview-light.png`
- `.tmp/reference-content-tufTSn/edit-dark.png`
代码与主进程验证:
- `npm run build`:最终通过(含后来工作区新增的原生沙箱构建、typecheck及Electron构建),日志 `.tmp/reference-build-final.log`。此前一次构建因并发占用原生exe出现LNK1104,后来占用解除后通过,没有改动沙箱实现或回退并行工作。
- `npm run test:references`:通过,覆盖多行/Unicode/相邻引用顺序、元数据校验、裁剪、历史标签、只读与源图标族。
- `npm run test:chat`:通过;新增编辑裁剪后排列与资源/技能单独发送验证。
- `npm run test:persistence`:通过。
- `npm run test:conversation-ipc`:通过;新增真实原子保存/新实例恢复排列、表格快照保留、附件预览、虚构ID拒绝、元数据路径覆盖拒绝和未登记工作区外路径拒绝。
- `node scripts/verify-user-message-edit.cjs`:通过,报告 `.tmp/edit-5P9kn7/`。
- 专项消息SSR、流式状态栏与完成折叠回归通过。`npm run test:conversation` 总命令仍失败于本轮未修改的沙箱工具运行断言:`execute_command('echo SHOULD_NOT_RUN')` 预期拒绝、当前返回成功;日志 `.tmp/reference-conversation-final.log`。不能宣称整个对话总回归已通过,也没有为通过测试而改掉沙箱断言。
- 本轮相关已跟踪文件的 `git -c core.whitespace=cr-at-eol diff --check` 通过。
## 保留限制
- **完整1:1未验收。** 原版调试端口当前不可达,未取得同尺寸、相同内容的全状态逐像素帧;跨版本静态声明、用户截图及本地专项通过不能替代这项验收。
- 图片、文本/Markdown/代码预览已实测;Office/PDF等二进制专用查看器继续受现有预览能力限制,不能以标签图标对齐宣称这些查看器已复刻。
- 粘贴/拖放的逐文件处理状态已验证;当前原生选择器接口一次返回已暂存的附件列表,其内部每个文件的准备进度未改成事件流。
- 带引用的全文撤销/重做、富格式剪贴板携带原引用块、多窗口草稿和原版全部动画尚未做完整等价验收。
- 本轮新增的 Slate四个包均锁定版本。安装时使用 `--legacy-peer-deps` 是为保留工作区已有 `electron-vite@5` 与 `vite@8` 的 peer 冲突;未强制更换现有构建栈。新增包为 `slate@0.143.0`、`slate-react@0.142.0`、`slate-dom@0.142.0`、`slate-history@0.140.0`,已通过实际应用及构建验证;不声称原版使用相同包版本。
## 文件范围与交接
主要文件:新增 `src/shared/user-content.ts`、`workbuddy/references/*`;调整 `ComposerControls`、`ChatPane`、`MessageBubble`、`MessageQuoteTag`、`UserMessageEditor`、工作台局部主题adapter、chat store、共享类型/IPC、主进程回合服务、附件服务与preload;新增恢复脚本和引用专项,扩充chat store/IPC回归。本轮未提交代码,保留全部原有和并行未提交修改。