Files
ycode/docs/source-chat-header-2026-10-16.md

7.7 KiB
Raw Permalink Blame History

对话顶部栏恢复与验收(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、协作项目和条件性编辑器入口,以及生产集成后的全状态验收。