@@ -439,6 +439,10 @@ export function registerNativeHookRelay(
439439 relayId,
440440 generation : registration . generation ,
441441 event,
442+ preToolUseUnavailable :
443+ event === "pre_tool_use" && ! nativeHookRelayEventHasLocalWork ( registration , event )
444+ ? "noop"
445+ : undefined ,
442446 nice : params . command ?. nice ,
443447 timeoutMs : params . command ?. timeoutMs ,
444448 executable : params . command ?. executable ,
@@ -517,6 +521,7 @@ export function buildNativeHookRelayCommand(params: {
517521 relayId : string ;
518522 generation ?: string ;
519523 event : NativeHookRelayEvent ;
524+ preToolUseUnavailable ?: "noop" ;
520525 timeoutMs ?: number ;
521526 executable ?: string ;
522527 nice ?: number | false ;
@@ -541,6 +546,9 @@ export function buildNativeHookRelayCommand(params: {
541546 ...( params . generation ? [ "--generation" , params . generation ] : [ ] ) ,
542547 "--event" ,
543548 params . event ,
549+ ...( params . event === "pre_tool_use" && params . preToolUseUnavailable
550+ ? [ "--pre-tool-use-unavailable" , params . preToolUseUnavailable ]
551+ : [ ] ) ,
544552 "--timeout" ,
545553 String ( timeoutMs ) ,
546554 ] ) ;
@@ -752,13 +760,20 @@ export async function invokeNativeHookRelayBridge(
752760export function renderNativeHookRelayUnavailableResponse ( params : {
753761 provider : unknown ;
754762 event : unknown ;
763+ preToolUseUnavailable ?: unknown ;
755764 message ?: string ;
756765} ) : NativeHookRelayProcessResponse {
757766 const provider = readNativeHookRelayProvider ( params . provider ) ;
758767 const event = readNativeHookRelayEvent ( params . event ) ;
759768 const adapter = getNativeHookRelayProviderAdapter ( provider ) ;
760769 const message = params . message ?. trim ( ) || "Native hook relay unavailable" ;
761770 if ( event === "pre_tool_use" ) {
771+ // The standalone CLI cannot reconstruct the originating registration after
772+ // relay lookup fails, so unavailable PreToolUse must fail closed unless the
773+ // generated command explicitly recorded that no before-tool policy existed.
774+ if ( params . preToolUseUnavailable === "noop" ) {
775+ return adapter . renderNoopResponse ( event ) ;
776+ }
762777 return adapter . renderPreToolUseBlockResponse ( message ) ;
763778 }
764779 if ( event === "permission_request" ) {
0 commit comments