Unclear Exactly which hook-raised asks a PermissionRequest hook is now allowed to approve is not established.
What
A hook is a command you or a plugin set up to run automatically at certain moments. PreToolUse hooks run before a tool is used and can block it; PermissionRequest hooks run when a tool use needs a permission decision. This release changes how their answers combine:
PreToolUseandPermissionRequesthook decisions (allow, ask or deny) are now routed through atool.checkpath in a permission engine, and handlers can answer for the engine.- A plugin's
tool.checkdeny no longer always blocks. If the tool is not a protected one, the original check is recomputed, and if that would have asked you, you get an ask with arefusalattached instead. Before, the plugin's result was used directly. - An ask raised by a hook can now carry
hooksMayAllowandrefusal, and aPermissionRequesthook may now allow such an ask, under strict checks. Before, that hook could only deny. Headless and no-prompt runs, where nobody can answer, consult hooks before denying. - The prompt for a blocked browser action now sets
hooksMayAllowto false, next topersonOnlyanddefaultToNo, so hooks cannot approve it. - A new
hookAskFloorsetting keeps a hook's ask in place, and stops hook-approved automatic allowing, when asandboxOverrideapplies. - The auto mode decision record gains
skippedOnAllowRule. - The error log text now reads 'PermissionRequest hook failed before a hook's ask for', replacing 'PermissionRequest hook failed before an ask of a person for'.
Why
Hook and plugin authors should check their setups: a plugin deny may now show you a prompt instead of an outright block, and a PermissionRequest hook can now approve asks that other hooks raised. Some prompts, such as blocked browser actions, remain for a person only.
Exactly which hook-raised asks a PermissionRequest hook is now allowed to approve is not established.