Skip to content

feat(approval): 审批卡片按 Claude Code 简化,拒绝后光标回到输入框 - #1106

Merged
AlphaCatMeow merged 1 commit into
Stack-Cairn:v2-kbrianfrom
AlphaCatMeow:feat-approval-card-cc
Nov 1, 2026
Merged

AlphaCatMeow merged 1 commit into
Stack-Cairn:v2-kbrianfrom
AlphaCatMeow:feat-approval-card-cc

Conversation

@AlphaCatMeow

@AlphaCatMeow AlphaCatMeow commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

LA-2b(#1098)的审批卡片比 Claude Code 多了两样东西:「允许并记住」的作用域下拉,和单独的「拒绝并说明」按钮加输入框。Claude Code 的审批只有三个选项,拒绝后直接在输入框里告诉模型接下来怎么做。本 PR 把卡片改成和 Claude Code 一样,并且拒绝后把光标还给输入框。

Closes #1105
Depends-On: none
Stack-Root: #1106

改动

位置 内容
ToolApprovalBar.tsx 去掉作用域下拉。按 2 记到 defaultScope(后端 suggestion.default_scope),卡片上写明「记住:<规则> · 本项目」。去掉「拒绝并说明」和说明输入框,Esc 与 3 都是拒绝。1 或回车仍然是允许本次,▾ 里的全部允许、全部拒绝不变。卡片挂载时,如果焦点在有草稿的输入框里,就不抢焦点
ChatComposerBar.tsx 审批栏外面包一层 display: contents 的容器。审批栏消失时,只有光标原本在审批栏上,并且现在落在 body,才调用 composerRef.focus()。光标是否在审批栏上,靠原生 focusin/focusout 和捕获阶段的 pointerdown 判断。输入卡片有草稿时带上 data-composer-draft
文案 删掉 denyWithReason、denyReasonPlaceholder、rememberScope,两种语言的 key 仍然一致
测试 删掉已经不存在的说明框 IME 测试,卡片测试改写成新行为

后端接口和协议没有改动:reason 和 scope 的数据通路还保留着,只是卡片不再提供这两个入口。改作用域、删除规则走「设置 → 权限」(#1102 / #1104)。

截图(调试版真实客户端)

桌面 1280:
gui 1280

桌面 480:
gui 480

WebUI 390:
webui 390

验证

项 做法 结果
基线 upstream/v2-kbrian 8a578a0 —
先失败的测试 tool-approval-card:没有作用域下拉,2 记到 defaultScope;3 和 Esc 一样拒绝,卡片上没有说明框。composer-approval-focus-return:审批栏消失后输入框拿回光标,用户把光标移到别处时不抢 写好时 4 条失败,实现后通过
对抗复审第 1 轮 独立子代理,用真实的 ChatComposerBar、MentionComposer 和 ToolApprovalBar 1 个 P1:拒绝后用户在输入框里继续输入,下一张审批卡会抢走焦点,输入的 2 或回车被当成对这张卡的回答。1 个 P2:审批栏在用户正操作别的窗格时消失,也会把光标拉回这个窗格。都已修复
对抗复审第 2 轮 新增 7 条测试,覆盖发送后的焦点时序、卸载后的 blur、Tab 离开、多张卡排队、▾ 菜单 未发现阻止合并的问题;审批与输入框相关测试 130/130
全量 la-full-tests 8 个批次全部跑完 4368 条:通过 4364,失败 3,跳过 1。这 3 条都在已知环境失败清单里:Rust 测试首次编译超过 180 秒上限;另外两条按 CWD 相对路径读源码,在 crates/agent-gui 下重跑能通过
WebUI 全部测试 pnpm --filter @liveagent/gateway-webui test 318/318
静态检查 typecheck ×3、biome(LF)、check-mirror.mjs、git diff --check 通过
真机:卡片 Windows 调试版,「始终询问」模式,桌面 1280 和 480 卡片显示「记住:Bash(…) · 本项目」,没有下拉,也没有说明框
真机:2 按 2 规则写进项目规则文件,作用域为本项目,命令正常执行。测试用的规则已经清理掉
真机:拒绝后接着说 按 3 拒绝,再在输入框里输入「不要用 node,直接心算……」并发送 卡片消失,光标回到输入框;模型按新指令回答了 184
真机:WebUI 390 由 WebUI 发起会话,等审批卡片出现后按 3 卡片出现时拿到焦点;按 3 拒绝后光标回到输入框;没有横向溢出
真机发现的回归 第 1 轮修完后,在 WebView2 上复验 卡片是在自己的挂载 effect 里调用 focus 的,这时外层容器的 React onFocus 不会触发,拒绝后光标不再回到输入框(jsdom 里测不出来)。改用原生 focusin/focusout 后,真机复验恢复正常
用户验收 — 通过

未覆盖:

  • P1 在真机上的完整路径:需要模型在两次工具调用之间停顿几秒才能触发,真机上很难稳定复现。实测那次模型并行发出两个调用,第二张卡直接接上,属于排队情况,表现符合预期。P1 本身由组件测试覆盖,测试里用的是真实的编辑器和卡片。
  • macOS(WebKit):有草稿、卡片没抢到焦点时,后续按键会落到哪里,没有在真机上确认。
  • Linux 和 macOS 只在 CI 上跑过。

🤖 Generated with Claude Code

- 去掉「允许并记住」的作用域下拉:2 记到后端给的默认作用域,卡片写明
  「记住:<规则> · 本项目」;改作用域或删除规则到「设置 → 权限」。
- 去掉「拒绝并说明」按钮和卡片上的说明框:Esc 与 3 都是拒绝。
- 审批栏消失时,光标原本在审批栏上才还给输入框,用户可直接写下一步;
  用原生 focusin/focusout 跟踪(卡片在挂载 effect 里聚焦时 React onFocus 不触发)。
- 输入框有未发送草稿时,新来的审批卡片不抢焦点,草稿里的 2 或回车不会被当成回答。

Closes Stack-Cairn#1105

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@AlphaCatMeow
AlphaCatMeow merged commit 6086c69 into Stack-Cairn:v2-kbrian Nov 1, 2026
12 of 13 checks passed
@AlphaCatMeow
AlphaCatMeow deleted the feat-approval-card-cc branch November 1, 2026 21:20
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.

1 participant