Skip to content

feat(checkpoint): 回退点迁移到用户气泡行内按钮(对齐 Claude Code) - #524

Merged
su-fen merged 2 commits into
mainfrom
feat/checkpoint-rewind-per-message
Aug 17, 2026
Merged

feat(checkpoint): 回退点迁移到用户气泡行内按钮(对齐 Claude Code)#524
su-fen merged 2 commits into
mainfrom
feat/checkpoint-rewind-per-message

Conversation

@su-fen

@su-fen su-fen commented Aug 17, 2026

Copy link
Copy Markdown
Member

Closes #523

概要

代码回退入口从聊天页右上角 History 下拉菜单迁移到每个用户气泡下的行内 Undo 按钮,对齐 Claude Code 的每消息回退交互;WebUI 同步打通该能力(此前 P2 缺口)。

变更

身份链:turnId = 用户消息 ID

  • useSendChatTurn 发送时调用新命令 checkpoint_begin_turn,以 pendingUserMessage.id 写入 kind:"turn" 轮次边界记录,并经 checkpointTurnId 传入 runAgentConversationTurn(缺失才回退 crypto.randomUUID())。
  • 零文件改动的轮也是合法回退点(回退语义 = 撤销该轮及之后的一切改动);旧的 file_count>0 过滤已删除。
  • 行内按钮经 messageRef.messageId 命中该轮检查点。

共享真源 agent-ui/lib/chat/checkpointRewind.tsx

  • CheckpointRewindProvider:确认弹窗、预览统计、TOCTOU expected 回传、错误/部分完成提示全部集中于此;两端只注入各自的 CheckpointRewindClient 传输层。
  • 回调走 latest-ref(宿主内联传参不会导致流式期间全量用户行重渲染);列表加载带 epoch 代际号防慢响应乱序;切会话立即清空(分支复制保留消息 ID,防旧轮错配)。
  • 按钮渲染内聚在共享 TranscriptUserMessageActions,调用方只传 rewindTurnId
  • 回退完成通知文案单一真源 formatCheckpointRewoundNotification:零计数不展示、NBSP 钉住数字与量词防折行、问题项收进括号尾注、英文单复数修正。

WebUI 通道

  • proto 新增 CheckpointRequest(GatewayEnvelope 98)/ CheckpointResponse(AgentEnvelope 103,result_json 直通)。
  • guard vetCheckpoint 按 action 分档校验(list 禁带 turn_seq/roots/expected;diff/rewind 必带 turn_seq;roots ≤64、expected ≤10000)。
  • 桌面端 gateway_bridge::handle_checkpoint 复用同一批 checkpoint 命令;响应经 AwaitUnaryResponse 原样中继,Go 侧零额外接线。
  • WebUI 授权根解析仅在 activeWorkspaceProjectPath === displayedConversationWorkdir 时附加 active/write grants。

其他

  • 桌面传输层文件 CheckpointRewindMenu.tsxDesktopCheckpointRewindProvider.tsx(git mv,名实一致)。
  • i18n 新增 chat.rewindCode / chat.rewindUnavailable

测试

  • Rust checkpoint:42/42 通过(新增 turn 边界 3 例:零文件边界稳定、零文件轮回退后续改动、边界记录不产生文件回退条目)
  • Go pbws guard:通过(新增合法 3 形态 + 非法 8 形态用例)
  • web adapters:587 通过(新增 checkpoint 三 action 往返编解码)
  • GUI:1909 通过;两端 tsc --noEmit 与 biome 干净;check-ui-boundaries 通过

Screenshots / preview

image image

已知边界

  • 检查点仅覆盖 Write/Edit/Delete 文件工具;Bash 等 shell 写入不在回退范围(确认弹窗内已提示)。
  • 压缩摘要里的 fileLedger 持久化在历史中,回退后仍列出曾触碰路径(账本语义为"曾被触碰",不断言当前内容,不在本 PR 范围)。

右上角 History 下拉菜单移除,每条用户消息下新增行内 Undo 按钮作为回退点;
WebUI 同步获得回退能力(此前 P2 缺口)。

- turnId 改为用户消息 ID:发送管线经 checkpoint_begin_turn 写入 kind:"turn"
  边界记录,零文件轮也是合法回退点;行内按钮按 messageRef.messageId 命中该轮
- 共享真源 agent-ui/lib/chat/checkpointRewind.tsx:Provider(确认弹窗/预览/
  TOCTOU expected 回传/结果提示)+ useCheckpointRewindAction;回调走 latest-ref
  防流式期间全量用户行重渲染,列表加载带 epoch 防慢响应乱序,切会话即清空
- 按钮渲染内聚共享 TranscriptUserMessageActions,调用方只传 rewindTurnId;
  回退完成通知文案单一真源 formatCheckpointRewoundNotification(零计数不展示、
  NBSP 钉住数字量词、问题项收进括号尾注)
- WebUI 通道:proto CheckpointRequest/Response 直通臂(GatewayEnvelope 98 /
  AgentEnvelope 103),guard vetCheckpoint 按 action 分档校验,桌面端
  gateway_bridge 复用同一批 checkpoint 命令
- 桌面传输层 CheckpointRewindMenu.tsx 重命名为 DesktopCheckpointRewindProvider.tsx

测试:Rust checkpoint 42 通过(新增 turn 边界 3 例)、Go guard 通过、
web 587 / GUI 1909 通过、两端 tsc/biome 干净。

Closes #523
@StackCairn
StackCairn marked this pull request as draft August 17, 2026 07:07
@github-actions

github-actions Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

PR governance checks passed. Awaiting human review.

@su-fen
su-fen marked this pull request as ready for review August 17, 2026 07:22
@StackCairn
StackCairn marked this pull request as draft August 17, 2026 07:22
@su-fen
su-fen marked this pull request as ready for review August 17, 2026 07:26
@su-fen
su-fen merged commit 7b9d6fa into main Aug 17, 2026
11 of 12 checks passed
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.

检查点回退入口迁移:右上角菜单 → 用户气泡行内按钮(对齐 Claude Code)

1 participant