9.8 KiB
表格引用与附件样式修复(2026-10-18)
本轮结果
对应此前核对报告的表格、文件、图片、资源/技能、发送后展示和混合状态,已完成本轮实现及限定范围验证。表格现在使用输入框内的“表格图标 + 会话表格”短标签;文件/图片/文件夹/技能共用原版标签规则;发送后与编辑态复用同一呈现。
本轮没有向模型发送真实消息、改变用户会话或强制重启用户应用;隔离验收的模型响应为受控数据。由于包含主进程与 preload 变更,用户当前窗口需保存草稿后完整重启,不能只依赖旧进程内的 renderer 重载。
原版来源与观察范围
- 沿用保留的 REA
ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb(既有记录为 WorkBuddy 5.8.3)与 CSSev_377c8790468b3c67dad8577aabb327f98d3140659f0fffdbabfcff5a40cc9e94(既有 WorkBuddy 5.8.2 CSS);未重新采集已有材料。 - 渲染器
src-DbE1_mgM.jsSHA-2566c6ce63c93854783270e855572797d75e536e3b8d4548410e31fe9d147e1feb4、宿主contexts-BMeWSUHk.jsSHA-2565f35b7489b107e21ef452c8ee88a95265756f6fc444841eef869228bbc44768b。 - CSS
src-CyXHA0IC.cssSHA-256a5e26b537bb50323aefbf25abddad52e288dd3868598be8d255d70886fe77cfe。 scripts/rea/recover-reference-tags.mjs校验固定 Evidence 与摘要,仅从保留正文恢复19个纯 SVG 函数及31条相关样式,保留原选择器及上级条件;不读取安装目录、连接目标协议或执行原版初始化器。- 表格实际宿主路径为
createTableMessageQuoteReference→createEmbeddedReference→displayAsPhrase;原InputBannerRail会过滤这些显示块,不能使用QuoteReferenceCard作为该表格的输入态。 - 本轮再由 REA 检查原有
9223端口,仍为provider_unavailable / endpoint_unreachable;没有擅自导航或重启 WorkBuddy。用户提供的短标签截图可作为结构对照,不能证明所有主题、动画和交互状态均已逐像素一致。
已实施
- 正确标签及原版资源。 新增
workbuddy/references/ContentReferenceTag.tsx、SourceReferenceIcons.tsx、source-reference-tags.css。文件类23px高、100px圆角、padding1px 8px、13px/500/21px、14px图标;表格使用真正的表格 SVG,标签固定为“会话表格”。历史preview中的 Markdown 不再进入标签、ARIA或 tooltip。 - 共同内容区。
ComposerControls移除三组框外附件/引用容器,把标签放到圆角.cr-input-container的内容编辑区;文件、图片、资源和技能不再各占一条外部横栏。原输入框圆角、工具栏、分支/权限/模型区域保留。 - 混排与键盘。 使用 Slate 的 inline void 节点承接带引用的内容,支持在当前光标位置插入、文本与多个标签混排、换行、IME保护、选择和键盘删除;最后一个标签移除后回到普通输入框时恢复光标和焦点。原文本输入兼容路径继续保留。富文本区域沿用此前输入高度上限200px,长文件名按源规则截断、折行。
- 真实内容与显示分离。 新增
UserContentBlock、shared/user-content.ts和可选ChatMessage/SendPayload.userContent,仅记录文本与实际引用的排列;附件、表格快照、资源和技能仍使用原来的真实载荷。主进程按实际集合校验身份、去重、拒绝虚构引用;布局不能替换提示词。发送、失败草稿恢复、编辑、重新生成、磁盘保存和重启恢复保留排列。裁剪首尾空白时同步调整布局。 - 发送后与编辑。
UserInlineContent在用户气泡内渲染同一套只读标签;移除气泡外文件名、常驻图片和原始 Markdown 标签。UserMessageEditor支持带引用的编辑,取消不改变原消息,提交只移除用户选中的引用;旧消息无需迁移数据即可恢复短标签。普通无引用消息的原有编辑验证仍通过。 - 悬停与图片。 默认隐藏移除按钮,悬停时在图标位置替换关闭图标;图片使用类型图标和名称,预加载成功后显示上限300×300的悬停预览,点击接既有图片查看器。资源使用文件/文件夹图标、名称和完整路径提示;技能接相应图标与同类标签。
- 逐项状态。 粘贴/拖放时立即插入每个文件的 processing 标签,显示原加载图标及
.7透明度;失败保留失败标签和原因。完成后在原位置替换为真实附件 ID;取消后即使暂存晚到也会清理,不进入发送载荷;失败项移除前禁止发送。 - 可用预览入口。 新增
attachments.preview(id),按已登记附件读取实际内容;右栏后续的完整 Markdown/代码读取仅允许这个已登记路径,重新核对附件 ID 与真实保存路径。其他工作区外路径继续拒绝。原生文件选择保留只读显示用途的sourcePath,缓存路径不冒充原始来源显示在标签提示里;粘贴文件没有来源路径时使用文件名。 - 发送边界。 修正只有资源或技能时被渲染器/主进程“空消息”判断静默忽略的问题;仍使用实际能力与资源校验。
- 错误验收纠正。 原
verify-quote-table.cjs变为新专项的兼容入口,不再断言“36px摘要横条/强调线/标签必须包含Markdown”为原版正确表现;保留表格菜单几何、来源、加入高亮、移除、IPC快照与历史验证。 - 预览主题与编辑归属。 截图复核发现深色附件预览为浅字白底;原版工作台正文暗色规则只识别
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回归。本轮未提交代码,保留全部原有和并行未提交修改。