Skip to content

feat(approval): 接入 K-brain 记住规则、拒绝说明与自动放行标记,去掉 3 分钟自动拒绝 - #1094

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

AlphaCatMeow merged 1 commit into
Stack-Cairn:v2-kbrianfrom
AlphaCatMeow:feat-kbrain-approval-data

Conversation

@AlphaCatMeow

@AlphaCatMeow AlphaCatMeow commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

K-brain beta.27(#1092 已锁定)给审批提供了记住规则、自动放行事件,并且等待审批不会超时;客户端此前不读这些数据,还会在 3 分钟后替用户拒绝。本 PR 是 LA-2 的数据通路部分(LA-2a):接上这些数据,去掉自动拒绝,并在工具行说明为什么没有弹审批。审批卡片 1/2/3、作用域选择与拒绝说明输入框在 LA-2b。

Closes #1093
Depends-On: none
Stack-Root: #1094

改动

  • 不再自动拒绝:K-brain 审批以 timeoutMs: null 挂起(以前 3 分钟后按拒绝落定),ToolApprovalBar 在没有截止时间时不显示倒计时,多项时只显示 1 / N。其他调用方与 AskUserQuestion 的 3 分钟不变。
  • 记住规则:KBrainPermissionRequest 读 shell 与 suggestion {rules, default_scope},进入审批存储并经 Gateway 同步参数(__toolApprovalRememberRules、__toolApprovalDefaultScope)给 WebUI。现有"本会话始终允许"显示真正要存的规则(以前显示首段命令,复合命令时与存下的不一致),有建议时以 allow_always + scope:"session" 发出;后端没有建议时仍发不带 scope 的 allow_always。
  • 决定附带信息:answerToolApproval / ToolApprovalBar.onDecide / WebUI bridge / chat_queue.tool_approval request_json 带 scope(仅有规则可记的 approve_session)与 reason(仅 deny,去空格、截 2000)。turn.ts 的 resolvePermission 发 scope/reason;K-brain 回 400(规则存不下,提示仍在等待)时重新询问,最多 3 次,不再取消整轮。
  • 自动放行标记:permission.auto_resolved 记入桌面存储 permissionAutoResolved.ts,并叠加到 Gateway 同步参数(__toolPermissionAutoResolved);两端适配器新增 usePermissionAutoResolved,ToolCallItem 三种标题样式(文件链接、紧凑、完整)都显示 ToolPermissionMarker:"只读,自动允许" / "按规则允许"(悬停显示规则)。标记只在内存中,重新加载历史后不显示。
  • 同步给 WebUI 的规则按序列化长度截到 2000 字(解释器命令的建议规则和命令一样长),桌面菜单显示截到 300 字;新合成参数加入 DISPLAY_SYNTHETIC_ARG_KEYS,不出现在参数展示里。

契约面

面 影响
桌面直连 读 suggestion/shell/auto_resolved;回答带 scope/reason;K-brain 审批不超时
Gateway 同步 新增三个 __ 合成参数;不带截止标记时不发 __toolApprovalDeadlineAt
WebUI 两处收集器 同一共享栏与读取函数,透传 scope/reason;旧桌面只读 decision,多出字段被忽略
旧 K-brain(无 suggestion) 行为与以前一致

截图(调试版真实客户端,已裁侧栏)

审批不显示倒计时(挂起近 4 分钟仍在):
no countdown

"本会话始终允许"写明要存的规则:
session menu

同一会话再次运行按规则放行:
rule marker

只读工具(含文件链接行 Read)标记:
read marker

验证

  • 基线:upstream/v2-kbrian ae6b136。
  • 静态:typecheck:ui / typecheck:gui / typecheck:webui 通过;改动文件转 LF 后 biome check --line-ending=lf 通过;node scripts/check-mirror.mjs 通过;git diff --check 通过。
  • 新增测试(先失败后通过):tools/tool-approval-remember(不超时、作用域与说明的落定规则;改前 6 个中 5 个失败)、providers/kbrain-permission-answer(shell/suggestion、scope/reason 发送、auto_resolved;改前 5 个中 4 个失败)、chat/kbrain-approval-remember(真实 K-brain SSE 下的会话轮次、Gateway overlay、WebUI 决定的 build/parse 与透传)、chat/kbrain-approval-ui(无截止不显示倒计时;三种工具行真实渲染标记,修复前文件链接行失败)。
  • 对抗复审 2 轮:第 1 轮 2 个 P2(同步规则无长度上限;K-brain 回 400 时整轮被取消),第 2 轮 1 个 P2(规则按原文而非序列化长度截断),均修复;复审回归 review-la2a-approval*.test.mjs 保留,全部通过。复核时另发现文件链接行未显示标记(原测试只数源码出现次数),已改为真实渲染测试并修复。
  • 全量(la-full-tests.mjs,8 批次全部运行):总计 4318,通过 4314,失败 3,跳过 1;3 个失败均为已登记环境问题(Rust 测试首次编译超过 180 秒上限;两个按 CWD 相对路径读源码的用例,在 crates/agent-gui 下重跑通过)。文件行标记修复在这次全量之后,修复后相关的 3 个测试文件 44 个用例与三项 typecheck 通过。
  • 真机(Windows 调试版 + 锁定的 beta.27 sidecar,normal 模式,经 MCP bridge 操作):git status 不弹审批并显示"只读,自动允许";hostname 弹审批且无倒计时,挂起近 4 分钟仍在;菜单显示"本会话始终允许 终端 · Bash(hostname:*)",选择后同会话再次运行显示"按规则允许",新会话重新询问;后端只写入一个会话规则文件 Bash(hostname:*)。Read/List/Glob/Grep 四行都显示标记(另用 KB-3 本地 sidecar 复跑同样显示)。用户已验收。
  • 未覆盖:WebUI 代为审批(桌面发起的运行不实时同步到 WebUI,WebUI 发起的运行仍由 Gateway 自动拒绝,见 LA-4),只有自动化测试;拒绝说明与项目/用户作用域在 LA-2b 有界面后再真机验证;WebUI 与 390 宽度没有截图(桌面窗口最小宽度 480,WebUI 端看不到桌面的实时审批,只能等 LA-4);Linux/macOS 只在 CI。

🤖 Generated with Claude Code

- K-brain 审批不设截止时间(timeoutMs: null),审批栏没有截止时间时不显示倒计时;
  其他调用方仍是 3 分钟
- permission.requested 的 shell、suggestion {rules, default_scope} 进入审批存储,
  同步给桌面审批栏与 WebUI;"本会话始终允许"写明要存的规则,并以 scope:"session"
  发出;后端没有建议规则时行为不变
- 审批决定带 scope(仅有规则可记的 approve_session)与 reason(仅 deny),
  桌面直连与 WebUI→Gateway→桌面两条路径都透传;K-brain 回 400(规则存不下、
  提示仍在等待)时重新询问,最多 3 次,不再取消整轮
- permission.auto_resolved 记入桌面存储并叠加到 Gateway 同步参数,工具行(含文件
  链接行)显示"只读,自动允许"/"按规则允许"
- 同步给 WebUI 的规则文本按序列化长度截到 2000 字,桌面菜单显示截到 300 字

Closes Stack-Cairn#1093

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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