第十三节 工具权限与审批

AVL Code 通过工具权限策略对每一次工具调用做精细化管控。

13.1 三态权限

每个工具都可以设置为:

  • 启用:直接放行。
  • 询问:每次调用前弹窗审批。
  • 禁用:直接拒绝。

可按工作模式独立配置;常见做法:execute 模式启用写工具,plan 模式禁用所有写工具。三态对子代理同样生效(禁用工具在子代理侧一并拿不到),插件 / 外部服务卸载后残留的工具配置会被自动清理。

13.2 调用前审批

当一个被标记为「询问」的工具即将执行时:

  1. 桌面端弹出审批弹窗,展示工具名、入参与影响范围。
  2. 你可以选择:
    • 允许(仅本次)
    • 始终允许:把"工具+参数模式"加入白名单。
    • 拒绝
  3. 弹窗带 30 秒倒计时,超时未响应按「拒绝」处理。

13.2.1 无限制模式(高级)

输入区模式滑块右侧有一个盾牌开关,专给清楚自己在做什么的高级用户用。开启前先过一道风险确认弹窗(含 5 秒冷静期 — 确认按钮先禁用并倒计时「请仔细阅读风险提示 5s…」,归零才能点,期间按 Enter 也不触发),开启后红色危险态常驻提醒,关闭即时生效。

作用域:按会话独立、纯内存、重启即清,不会悄悄留着。

开启后解除三类日常摩擦

摩擦 开启后
工具批准 跳过批准弹窗(不再逐个 ask / 拒绝 / 延后),工具直接执行
命令白名单 fs.exec 不再受命令白名单限制,任意命令可执行
网络访问 web.fetch / web.bing 不再过滤内网 / 环回 / 链路本地地址

始终保留的硬底线(不受开关影响):

  • samples/ 沙箱隔离
  • rm -rf 等破坏性命令的参数校验
  • 危险注入黑名单(fork 炸弹 / 写 /etc / curl|sh / eval
  • http(s) 协议白名单

斜杠命令快捷开关 — 也可在输入框直接敲:

  • /unrestricted(或中文别名 /无限)— 切换当前会话的无限制模式。开启时同样过 5 秒冷静期的风险确认弹窗,关闭即时生效。中文别名在命令菜单与 /help 里隐藏(避免重复行),但键入回车仍可执行。

无护栏区间的消息标识:无限制模式期间产生的连续消息会以浅色边框整体圈出,起止一目了然,事后回看能一眼分辨哪些内容是在无护栏状态下生成的;关闭开关后边框当场收口,模式未结束时不会提前打「结束」界标。子代理可按需递归继承该模式,继承产生的消息同样带标识。

13.3 白名单匹配

「始终允许」的匹配粒度可在 设置 → Hooks → 自动批准 中调整:

  • 仅本次(最严)
  • 同工具同参数
  • 同工具任何参数
  • 整个工作区放行(最松)

13.4 多端审批

同一条审批请求会同时出现在桌面弹窗与已绑定的远程通道(如微信);首个应答生效,其余端的后续回复会被提示已应答。另有一条容易混淆的规则:拒绝 > 挂起 > 询问 > 允许 的优先级排序属于 Hook 层 — 同一次评估中多个 Hook 返回的权限决策按它合并,与多端应答无关。

13.5 远程审批

如果你已绑定微信通道,所有 询问 类审批都会同步推送到对应聊天,你可以在微信里用一行命令完成审批:

/approve <审批号>      # 允许本次
/always  <审批号>      # 始终允许
/deny    <审批号>      # 拒绝

桌面侧弹窗会同步消失,整条任务自动续跑。

13.6 留痕

审批决策不落独立审计存储:仅「始终允许」写入工作区级授权文件 hook-approvals.yaml(记录授权指纹与决策时间),可在 设置 → Hooks 查看与撤销;「仅本次允许」与「拒绝」只作用于当次调用,不留存记录。