跳到正文
FunCoding

搜索

搜索文档、Skill 和 MCP

Hook 权限决策

区分 preToolUse 与 permissionRequest,正确处理拒绝合并、退出码和超时。

权限 Hook 可以改变工具是否继续执行。需要区分正常返回的拒绝、命令崩溃、超时、HTTP 错误:它们不是统一的“失败就拒绝”。

preToolUse

处理器向 stdout 返回一个 JSON 对象,例如:

{
  "permissionDecision": "deny",
  "permissionDecisionReason": "This tool call is outside the configured workflow."
}

permissionDecision 接受 allow、deny、ask;deny 必须给出 reason。空输出回到默认行为。modifiedArgs 可提供替换工具参数的对象。

多个 preToolUse Hook 按顺序执行,只要任意一个拒绝,工具就被阻止。CLI 能显示询问时,用户拒绝还可附加反馈;云端无人回答,ask 按 deny 处理。

错误与超时

情况preToolUse 行为
command 返回 0 且有有效 JSON处理输出决策
command 返回非零,包括 2,或崩溃拒绝工具,即使 stdout 写了 allow
command 超时警告后回到正常权限流程
HTTP 网络错误、超时、非 2xx回到正常权限流程
无效或空的最终 JSON视为无输出,使用默认行为

超时对所有事件都是放行到常规流程的行为,包括管理员策略 Hooks。 这并不表示工具无条件执行,而是超时 Hook 不再提供拒绝决定;已有权限和沙箱仍适用。不能依赖慢速外部服务充当保证执行的强制检查。

permissionRequest

这个 CLI 事件发生在规则引擎、会话批准、自动批准或拒绝、用户弹窗之前,返回 allow / deny 可以短路通常流程。输出使用另一组字段:

{
  "behavior": "deny",
  "message": "The requested operation is not permitted by this workflow.",
  "interrupt": true
}

interrupt 与 deny 组合时停止智能体。空对象或无输出继续通常权限处理;command 退出码 2 合并成 deny,此时 stderr 不用作拒绝正文。

read 和 hook 权限类型在进入该 Hook 前已短路。多个 permissionRequest 的输出由后者覆盖前者,与 preToolUse 的“任意 deny 阻止”不同。

不能自动批准逃出沙箱

toolInput 中 requestSandboxBypass: true 表示请求脱离沙箱。permissionRequest 返回 allow 不会预批准这次逃逸,也不会跳过交互确认;deny 仍可阻止。该例外包括 Shell 请求在沙箱外执行,以及 web_fetch 请求被沙箱网络策略禁止的网址。

云端智能体的工具预批准,因此 permissionRequest 不触发或不起作用;云端需要程序化决策时使用 preToolUse。输出解析规则见Hook 输出。

托管 ask 规则

企业管理参考规定 managed permissions.ask 每次要求新的一次性人工批准,不能由 Hook、allow-all 或先前保存的批准满足。配置 permissionRequest 自动允许时,不应据常规 Hook 流程推断可以绕过托管 ask;具体限制见托管权限。