Files
ycode/docs/对话样式实对齐-2026-10-15.md

60 lines
8.6 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-15)
本轮先补齐 REA 的画面、布局和 SVG 采集,再把取得的原版 CSS 与组件结构接入 YCode。工作范围为对话区域样式,云端服务和子代理调度按用户要求暂后。
## 原版证据与能力
- WorkBuddy 5.8.2 / Electron 37.10.3 / Chrome 138.0.7204.251;沿用调试端口 9223,唯一选定原版 renderer 文件页面。
- 本地 REA 副本版本 `6.5.0-visual.1`,新增 `include_visuals`,默认关闭。公开入口 `npm run rea:visual:capture` 同时请求已加载 CSS 正文、PNG、计算样式及 SVG 几何属性。
- 原版画面 Evidence:`ev_dbd7b4f6304305b0428d19c891088806a09d05b33a1b69d7e7df95e22f3914f4`,归档 `.tmp/rea-css-evidence/<Evidence ID>.json`;导出 `.tmp/rea-visual-reference/workbuddy.png` 和 `layout.json`。
- 实际取得 1336×901 画面、828 个布局记录、189 个 SVG 节点(73 个 SVG 根)。布局记录含 27 个计算样式属性、节点关系和边界;不保留聊天正文和输入值。PNG 自身含原版当前可见对话,保留在本地。
- 采集由 REA provider 内部执行 `Page.getLayoutMetrics`、`DOMSnapshot.captureSnapshot`、`Page.captureScreenshot`;包装脚本只调用公开 REA CLI。没有导航、点击、重载原版或执行 renderer JavaScript,没有绕过 REA。
- 使用 view capture(`fromSurface:false`);surface capture 曾超时。采集有 30 秒超时。布局与截图是先后采样,不是原子快照,范围限当前可见页面,不代表全部交互状态。
CSS 沿用已校验的固定 Evidence `ev_377c8790468b3c67dad8577aabb327f98d3140659f0fffdbabfcff5a40cc9e94`。64 份正文共 5,946,566 字节;13 份匹配既有 ASAR 清单、2 份有差异,详情见 [CSS 采集修复](REA-CSS采集修复-2026-10-15.md)。生成器检查固定 Evidence、SHA 和选择器;不会把运行时正文冒称为与安装包逐字节相同。
## 已接入的变化
- 消息区域接回 `conversation-timeline`、`cr-message-list`、`cr-document` 和原版左右消息 frame 层级;限定 832px 列宽。用户气泡使用原版内容容器、段落样式和动作行定位。
- `source-styles.css` 从三个已采集 CSS 文件选择 389 条规则,覆盖主题、消息 frame、助手/用户内容、思考折叠、工具展开、计划、审批和消息动作。保留相关条件规则及动画 keyframe;只映射选择器和宿主结构,规则正文沿用原版。
- 思考与单个工具的展开内容保留在 DOM,通过原版 shell 的折叠样式切换,并为关闭区域补 `aria-hidden` 和 `inert`。计划接回标题、任务列表及状态图标的原版层级。
- 输入区接回原版 24px 外层留白、编辑区、56px 工具栏、24px 容器圆角、边框、阴影及禁用状态;按钮顺序为添加、权限,右侧为模型、语音、发送。对话页移除额外工作目录 footer,目录设置仍可由顶部设置进入;首页保留该入口。
- 问答浮层由 bundle 的 `ggdxn` CSS module 映射,共 79 条投影规则,恢复标题、分页、选项、复选框、自定义回答和 footer;放入 `conversation-input-area__custom-floating`,与输入框共用左右留白。选项恢复为原版 `div role="button"`,消除原生 button 默认居中;保留 Enter/空格激活,并用 `aria-pressed` 表达本地选中状态。
- 消息动作使用源图标;发送、麦克风、权限和当前重新生成图标由 REA 画面采集中的实际 SVG 节点恢复。问答图标取自该组件真实引用的定义,保留 Evidence、源摘要和 UTF-16 范围。
- 任务卡恢复 `TaskToolRenderer` 的 root/result/item/title/content 层级、默认展开状态和 40 条原版规则。清除 22 组旧 Task 选择器,避免旧 root 边框、子 span 的 12px/600 字重覆盖;键盘折叠与现有审批回调保留。该工作仅涉及卡片 UI。
- 审批选项箭头恢复实际 `yo → pl → uc → lc` 图标绑定及 16px 默认尺寸,替换文字 `>`。源码为 `contexts-BMeWSUHk.js` 和 `src-DPDj7_qD.js`,恢复器校验固定 runtime Evidence、两份 SHA、调用与导出关系。
- 命令视图定位到 `src-DbE1_mgM.js` 的 `ExecuteCommandView`(UTF-16 offset 1035987)及动态 `cr-` 前缀。命令标题、命令和合并 stdout/stderr 使用原版 div 结构及单色字体、换行、行高;本地包装用 `display:contents` 投射为原版内容容器的 flex 布局,消除旧 pre 背景和内边距。现有完整输出入口及 exit-code 提示保留,仍有结构扩展,未声称整体等价。
- 六档字体控制继续生效。原版 Slate 编辑区声明投射到现有 textarea;没有伪造 Slate 编辑器。现有 textarea 的 200px 高度上限保留,原版长输入上限仍未实测。
生成入口:
```powershell
npm run recover:conversation-styles
npm run recover:conversation-icons
node scripts/rea/recover-question-icons.mjs
```
上述生成器只处理既有 REA 导出。不要直接以更新后的“最新证据”别名覆盖固定 CSS manifest;需要更换基线时先复核生成器引用及差异。
## 验证与验收边界
同为 1336×901、默认字号,在 YCode 本地 fixture 读取浏览器最终计算值,与 REA 原版记录逐项比较:**28 项选定属性一致**。包含列宽与内边距、助手标题间距、用户气泡字体/行高/圆角/背景、输入框边框与阴影、编辑区留白、工具栏留白与间距、语音按钮圆角。报告 `.tmp/conversation-style-metrics.json` 同时保存预期值、实际值及节点尺寸。
助手名称、助手内容、文本块、用户气泡、输入宿主的 **5 个计算字体族字符串一致**,记录 `.tmp/conversation-style-font-metrics.json`。这不证明各 fallback 实际使用了相同字体文件,也不替代文字像素对照。
这次比较使用不同消息内容,是属性与几何抽查,**不能当作同状态的全图像素差通过**。原版当前画面没有问答、审批等全部状态;这些状态采用源 CSS/组件证据与本地交互回归,尚待原版同状态画面对照。
本轮 `npm run build`、样式及图标来源校验、`test:conversation`、`test:artifacts`、`test:font-size`(57 项断言)和 `test:rea-css` 均通过。浏览器验证了思考展开与收起、工具组/单项工具/完整输出展开、问答提交后继续、审批后继续、字号调整和长输入。长输入实测高度 200px、内容 scrollHeight 525px。
中断后恢复本地预览服务,另用独立的隐藏 Electron 测试窗口复验最终构建:仅加载 YCode localhost fixture,通过真实键盘事件选择第二个问答选项,确认回答被提交且回合继续;再确认审批后继续。控制台错误 0。问答浮层与输入框实测同为 784px、x=416,选项高 40px,文字 `text-align:start`。该验证不连接 WorkBuddy,不执行真实模型或文件写入。记录 `.tmp/conversation-style-final-ui.json`;可复验脚本 `.tmp/verify-conversation-style-final.cjs`。
续验还确认任务标题高 32px、行高 16px、字重 500、root 没有多余边框,键盘 Enter 可折叠并重新展开;工具组标题恢复 15px。命令头显示实际命令,命令/输出节点为 div,输出行高 18px、内边距 0、背景透明,测试输出完整保留。
最终截图 `.tmp/conversation-style-aligned-2026-10-15.png`(为展示完整消息,将任务卡收起并滚到消息顶部;该卡原版默认展开已独立验证);问答状态截图 `.tmp/conversation-question-aligned-2026-10-15.png`。截图在有限动画完成及实际 paint 后保存,并已人工查看。
仍未完整验收的样式范围包括:各类工具专用结果 renderer、任务详情卡、附件与产物详情、所有 hover/焦点/错误/流式状态、深色和不同字号的原版同状态画面、动效逐帧及长列表虚拟化。YCode 名称和当前测试消息不是原版内容;原生富文本编辑器行为尚未等价。后续应按状态补对照,不能据此次 28 项抽查宣称对话区已全量 1:1。
其中一项已定位的具体结构差异:同一 runtime 脚本的 `ReadFileView`(offset 1081144)返回 header-only 的 `ToolHeader`,以文件名链接和行号展示、发出 `tool.file.open`;YCode 仍在可展开卡片内显示文件正文。文件读取不是“CSS 无法取得”,需要继续接回共享 ToolHeader 结构,同时保留当前完整输出与文件打开契约。Web/MCP、文件列表等正文也没有因套入通用工具容器就完成验收。
全局 REA、注册配置及原版文件未修改;本地修复 manifest 记录 12 个变更模块并验证对应全局文件摘要保持不变。