7.7 KiB
对话顶部栏恢复与验收(2026-10-16)
已新增独立 SourceChatHeader.tsx、SVG/词典引用、原CSS与adapter;未修改 ChatPane/App。主上下文负责生产接线。
来源与行为
原版版本5.8.2,Windows,1336×901,现有“开始新会话”会话。全部原版操作均由本地REA public CLI执行:点击已有会话、收起右栏、打开搜索、标题hover/edit/Escape、恢复首页。没有发送消息、输入原标题新值、保存设置或测试原上游。
| 状态 | REA Evidence | 保存位置 |
|---|---|---|
| 会话/right open稳定 | ev_ab07d4f968450f9756929b9b1d222b7ab577061b6a758543cbd02addb358ba5e |
.tmp/rea-chat-header-static-20261016/ |
| 收起右栏、打开搜索 | ev_36d8218d7eea31c60378195344a4b6cf30d68a8add12bbeb6dc5815c42b4c80d |
.tmp/rea-chat-header-actions-20261016/ |
| 搜索稳定主图、标题hover/editor帧、Escape取消 | ev_f500fa72e1dd63e3bfa44ca550866653b70f5031100075f3bae25b6baa36ce19 |
.tmp/rea-chat-header-title-20261016/ |
| right closed稳定主图、恢复首页帧 | ev_38cca1ac66606ab07fb495035e3509f5c4d8ec3e5e2b74d0fdcfcfadb120da3b |
.tmp/rea-chat-header-final-20261016/ |
REA视觉结果的主PNG/layout是probe前状态,frame-*才是动作后状态;恢复首页使用最后一个probe frame,不能将其主图当作首页。
原版稳定会话顶部栏不含设置齿轮。right open时只有搜索、分享(各32×32,gap4,共68×32);right closed时增加右栏按钮(共104×32)。主栏高64px,原token文件 :root 的56px被 body[data-electron-desktop=true] 的64px覆盖;恢复脚本保留了桌面token覆盖与height<=400px时的40px规则。
标题hover显示真实编辑SVG;输入自动选中;Enter/blur提交trim后的非空新值;Escape取消。原源码 WorkBuddyTopBar 还有受环境/会话条件控制的编辑器、协作项目、历史提问入口,不能全部默认显示。当前源会话没有编辑器或历史提问入口;本组件只在显式提供promptList时显示历史提问,不把本地workspace cwd当作协作项目breadcrumb。
搜索是当前对话内容搜索,不是会话列表搜索。原版展开300×32输入框,初始无counter;keyword非空显示一基计数,零命中0/0;Enter下一项、Shift+Enter上一项、Escape关闭。搜索结果实际扫描/滚动/高亮由主上下文接入真实消息宿主;组件只负责受控UI,不伪造命中。
文件与接口
src/renderer/src/components/SourceChatHeader.tsx:默认导出组件,导出SourceChatHeaderProps、SourceChatHeaderSearch、SourceChatHeaderPromptList。SourceChatHeaderIcons.tsx:8个原SVG纯定义,无原模块初始化。source-chat-header-reference.ts:13个原中文labels。source-chat-header-recovered.css:178条原规则,保留顺序与media父条件;独立desktop token闭包。原.cb-chat-search-hit规则保持可供消息宿主使用。source-chat-header.css:原版继承字体/13px/normal/antialiased与原生input字体的有限adapter。scripts/rea/recover-chat-header-reference.mjs:仅消费固定REA脚本/CSS,验证SHA后生成上述引用;manifest在.tmp/chat-header-reference/manifest.json。scripts/rea/probe-chat-header-*.json:本次原版受控动作。scripts/verify-chat-header-parity.cjs、scripts/compare-chat-header-pixels.py:独立原生fixture和校准像素对比。
基础Props为 title, rightVisible, onToggleRight();onOpenSettings?保留父接口兼容,但不生成原版不存在的齿轮。workspaceName?为归属元数据,不主动改成项目breadcrumb。
onTitleChange?: (nextTitle: string) => void | Promise<void>
onShare?: () => void | Promise<void>
shareLabel?: string
onActionError?: (error: unknown) => void
search?: {
open: boolean; keyword: string; hitCount: number; activeIndex: number // 0基
onOpen(): void; onClose(): void; onKeywordChange(keyword: string): void
onPrev(): void; onNext(): void
}
未配置真实search/share宿主时按钮禁用。若分享只支持本地导出,应传诚实的 shareLabel,不能冒充WorkBuddy云端分享。标题保存错误可reject并由onActionError交给宿主;组件退出编辑、重置草稿,不谎报保存成功。可选promptList含真实items/requestId与必需onJumpToMessage;没有数据不显示入口。
原搜索高亮来自 src-CBaV_A3S.css:普通background #c5eee0、foreground #1f8c67;current background #4ecba0、foreground #fff、glow 0 0 0 2px #4ecba04d。这些都保留原 --cb-search-* 变量。CSS Highlights只能等价承接bg/fg;原mark的radius2、padding0 1px、glow与transition不能直接通过Highlight伪元素完整重现,应另记差异。
恢复来源:脚本REA ev_717fa5e846e64d67ac19c8925d121bff632c0d3aefb3603b10858559cabb2dcb,CSS REA ev_377c8790468b3c67dad8577aabb327f98d3140659f0fffdbabfcff5a40cc9e94。具体JS/CSS文件SHA、SVG绑定和offset均在生成manifest中固定。
原生几何与像素结果
原生fixture使用真正DOM pointer/keyboard事件;所有host回调由隔离fixture控制,不能把本测试当作生产搜索/rename/share业务已通过。
closed/open/search/edit状态几何与固定原版逐项一致:
- closed topbar
[284.28125,30,1051.703125,64];open[284.28125,30,691.703125,64]。 - 标题
[308.28125,50,80,24],16px/600/24px/#000,声明字体一致。 - closed actions
[1215.984375,46,104,32];open[891.984375,46,68,32]。 - search
[947.984375,46,300,32],input194×32、nav/close24×24。 - 原标题editor
[308.28125,50,203,24]。
根据既有原REA ev_af6ce1805f575a49d9b37b7d391a07a77a90219a12eb2148cb25930a00da963c 的渲染环境证据,增加唯一校准模式:普通窗口 showInactive、任何await前disableHardwareAcceleration、use-angle=swiftshader、disable-gpu-compositing、Page.captureScreenshot(fromSurface:true,captureBeyondViewport:false)。本机实际GPU复核为 ANGLE_SWIFTSHADER、(gl=egl-angle,angle=swiftshader)、gpu_compositing=disabled_software。
| 固定区域 | 比较像素 | 不同像素 | 最大通道差 |
|---|---|---|---|
| 标题 | 1920 | 0 | 0 |
| 搜索按钮 | 1056 | 0 | 0 |
| 分享按钮 | 1056 | 21 | 15 |
| 右栏按钮 | 1056 | 27 | 5 |
| 整个稳定topbar声明区域 | 67264 | 48 | 15 |
| search(只mask原生caret列72px;空query无counter) | 9560 | 0 | 0 |
| editor已选中原标题 | 4896 | 0 | 0 |
校准后标题和editor字形已零差,不能再将这些区域差异笼统归因于字体环境。首次search差异来自pointer停在展开后的close按钮造成hover;匹配REA的neutral pointer状态后归零。剩余48像素集中在分享/右栏SVG曲线与transform边缘;原SVG路径/transform恢复自固定源码、颜色/控件几何一致,边缘采样差异原因尚未确证,没有调容差、替换原像素或宣称整栏零差。
原图/候选SHA、具体差异坐标与RGBA、diff图在 .tmp/chat-header-native-swiftshader-20261016/{report.json,pixels.json,*-diff.png}。普通offscreen图也保存在 .tmp/chat-header-native-20261016/,不与校准模式混算。
执行结果:
node scripts/rea/recover-chat-header-reference.mjs
node_modules/.bin/electron.cmd scripts/verify-chat-header-parity.cjs --visible-swiftshader
& 'C:/Users/Administrator/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/python.exe' scripts/compare-chat-header-pixels.py
npx tsc --noEmit
均通过,原生console errors0。余项:48个SVG边缘像素、原自绘tooltip/快捷键提示(目前使用native title)、promptList原运行时、Mac/compact/dark、协作项目和条件性编辑器入口,以及生产集成后的全状态验收。