# 对话顶部栏恢复与验收(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。 ```ts onTitleChange?: (nextTitle: string) => void | Promise onShare?: () => void | Promise 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/`,不与校准模式混算。 执行结果: ```powershell 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、协作项目和条件性编辑器入口,以及生产集成后的全状态验收。