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

93 lines
7.7 KiB
Markdown
Raw 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-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<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/`,不与校准模式混算。
执行结果:
```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、协作项目和条件性编辑器入口,以及生产集成后的全状态验收。