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

8.6 KiB
Raw Blame History

对话样式与调试画面采集(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 采集修复。生成器检查固定 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 高度上限保留,原版长输入上限仍未实测。

生成入口:

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 个变更模块并验证对应全局文件摘要保持不变。