Skip to content

feat(chat): 双端对齐 Composer 工具栏与上下文计量#158

Open
GreyGunG wants to merge 2 commits into
Stack-Cairn:mainfrom
GreyGunG:feat/chat-composer-toolbar
Open

feat(chat): 双端对齐 Composer 工具栏与上下文计量#158
GreyGunG wants to merge 2 commits into
Stack-Cairn:mainfrom
GreyGunG:feat/chat-composer-toolbar

Conversation

@GreyGunG

Copy link
Copy Markdown

关联

Closes #157

摘要

桌面端 GUIGateway WebUI 对齐增强 ChatComposerBar 输入区工具栏,并补齐上下文计量、导出与压缩相关边界处理。

功能

  • 上下文占用:展示估算用量 / 比例,支持 usage 观测锚点(含 total_tokens snake_case)
  • 手动压缩(桌面端):运行锁、Gateway running 快照、中止清理、失败提示不重复
  • 导出 Markdown:完整历史水合;busy / 未加载完 / 离线 has_more 时拒绝静默缺页导出
  • 附件:剪贴板图片、截图(桌面);上传目标锁定防止切会话串台
  • 更多菜单:会话费用、清空草稿、Prompt 模板、窄屏 overflow

双端文件

区域 主要路径
GUI ChatComposerBar.tsxChatPage.tsxcontextUsage / conversationExport / clipboardCapturecompaction/controller
WebUI 对应 ChatComposerBarGatewayApp、同名 lib 模块
i18n 中英文 chat.toolbar.*

测试

  • 新增/更新:clipboard-capturecontext-usageconversation-exportcompaction-controller 等单测
  • 本地曾跑 GUI / WebUI 相关 npm test(composer 相关用例通过)

审查说明

  • 基于最新 main(含楼层导航等既有能力)移植,避免整树覆盖
  • WebUI 手动压缩仍按「仅桌面可用」策略(工具栏提示)
  • Codex(CPA / gpt-5.6-sol)审核:0×P0 / 0×P1

自检清单

Greygun added 2 commits July 20, 2026 11:40
为桌面 GUI 与 Gateway WebUI 统一增强 ChatComposerBar:
上下文占用、手动压缩(桌面)、Markdown 导出、剪贴板/截图附件、
会话费用与更多菜单;并补齐 usage 锚点、离线/未完整历史导出保护与单测。

Closes Stack-Cairn#157
修复 GUI / WebUI 的 biome format 与 import 排序错误,使 CI lint 通过。
@su-fen

su-fen commented Jul 20, 2026

Copy link
Copy Markdown
Member

Review:暂不能直接合入(分支自身质量不错,但有 2 个合并阻塞项 + 1 个镜像纪律问题)

先说好的:在 PR 分支上双端测试全绿(GUI 1075 / WebUI 368)、tsc 与 biome 干净,i18n 37 个新键 zh/en 双端完全对齐;上传目标锁、手动压缩的 run lock / abort / prune 降级、导出的 busy / hydrating / has_more 拒绝保护都做得很细。

阻塞项

1. 与当前 main 有合并冲突

PR 基于 924f1d9,落后 main 6 个提交。之后合入的 9db1d0f#159 composer 展开按钮)改了同样的文件,git merge-tree 确认两端 ChatComposerBar.tsx 均冲突:

  • crates/agent-gui/src/pages/chat/components/ChatComposerBar.tsx
  • crates/agent-gateway/web/src/pages/chat/ChatComposerBar.tsx

展开按钮涉及 FLIP 动画、高度上报冻结等不变量密集代码,rebase 时需要把两个工具栏改动手工织合(双端各一份),请务必保住展开功能的行为。

2. 自动合并产物有隐性编译错误(icons.tsx 重复导出)

main 已为展开按钮在 web 端 icons.tsx 添加了 Minimize2,本 PR(压缩图标)也添加了同名导出。git 合并该文件不报冲突,但产物会出现两条 export const Minimize2(重复声明,tsc 直接报错)。解决冲突时请一并去重;GUI 端 icons 无此问题。

3. 镜像文件在本 PR 内已经分叉(conversationExport.ts)

两端 lib/chat/conversationExport.ts 不是字节一致:pushContextBlocksFromRound 的 usage 锚点挂载策略和 toolResult 输出顺序完全相反(GUI 版把 usage 挂到轮次末尾、web 版挂到 assistant 消息上并把 toolResult 后置),两边注释还互相矛盾。且:

  • GUI 端这两个 transcript-row 函数实际是死代码(GUI 用真实会话消息估算),新增单测测的恰是死代码变体;
  • web 端真正在用的变体反而没有任何测试;
  • 三个新 lib 文件(contextUsage / clipboardCapture / conversationExport)都没加进 scripts/mirror-manifest.json,CI mirror check 因此"通过"了实际已漂移的文件。

请统一两端实现为同一份代码、加入 manifest,并给 web 在用的路径补测试。

非阻塞建议

  • customHeaders 类型回退compaction/types.ts 删除了 customHeaders 字段——这是 main 上 263889d(7/19,自定义请求头支持,已在本 PR 基点内)刚加的,等于悄悄回退了该改动。目前行为无变化(bindTurn 从未传该字段),但把"压缩摘要请求缺自定义头"固化了。建议恢复该字段。
  • WebUI busy 期 1s 全量轮询:流式期间每秒对全部 transcript rows 做 flatten + 对所有工具参数/结果 JSON.stringify,长会话下开销可观。1 Hz 且不在渲染路径上尚可接受,留意即可。
  • 桌面端截图/剪贴板走 Web APIgetDisplayMedia / navigator.clipboard.read),在 Tauri WKWebView 上的支持情况存疑,虽有优雅降级,建议桌面端实机验证功能真的可用。
  • 成功提示复用了 "warning" 级 toast(NotifyItem 只有 warning/error 两级),小 UX 瑕疵,可后续统一。

结论

请:① rebase 到最新 main,解决两端 ChatComposerBar 冲突并去重 web icons 的 Minimize2;② 统一 conversationExport.ts 两端实现并加入 mirror-manifest、补 web 侧测试;③ 恢复 compaction types 的 customHeaders。完成后重跑双端测试即可再审合入。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(chat): 双端 Composer 工具栏(上下文占用 / 压缩 / 导出 / 附件)

3 participants