| 7716 | ${g6({continue:"boolean (optional)",suppressOutput:"boolean (optional)",stopReason:"string (optional)",decision:'"approve" | "block" (optional)',reason:"string (optional)",systemMessage:"string (optional)",permissionDecision:'"allow" | "deny" | "ask" (optional)',hookSpecificOutput:{"for PreToolUse":{hookEventName:'"PreToolUse"',permissionDecision:'"allow" | "deny" | "ask" (optional)',permissionDecisionReason:"string (optional)",updatedInput:"object (optional) - Modified tool input to use"},"for UserPromptSubmit":{hookEventName:'"UserPromptSubmit"',additionalContext:"string (required)"},"for PostToolUse":{hookEventName:'"PostToolUse"',additionalContext:"string (optional)"}}},null,2)}`;return N(z),{plainText:q,validationError:z}}catch(_){return N(`Failed to parse hook output as JSON: ${_}`),{plainText:q}}}function VgK(q){let K=q.trim();if(K===""){let _=lS6().safeParse({});if(_.success)return N("HTTP hook returned empty body, treating as empty JSON object"),{json:_.data}}if(!K.startsWith("{")){let _=`HTTP hook must return JSON, but got non-JSON response body: ${K.length>200?K.slice(0,200)+"…":K}`;return N(_),{validationError:_}}try{let _=vgK(K);if("json"in _)return _;return N(_.validationError),_}catch(_){let z=`HTTP hook must return valid JSON, but parsing failed: ${_}`;return N(z),{validationError:z}}}function A_7({json:q,command:K,hookName:_,toolUseID:z,hookEvent:Y,expectedHookEvent:$,stdout:A,stderr:O,exitCode:w,durationMs:j}){let H={},J=q;if(J.continue===!1){if(H.preventContinuation=!0,J.stopReason)H.stopReason=J.stopReason}if(q.decision)switch(q.decision){case"approve":H.permissionBehavior="allow";break;case"block":H.permissionBehavior="deny",H.blockingError={blockingError:q.reason||"Blocked by hook",command:K};break;default:throw Error(`Unknown hook decision type: ${q.decision}. Valid types are: approve, block`)}if(q.systemMessage)H.systemMessage=q.systemMessage;if(q.hookSpecificOutput?.hookEventName==="PreToolUse"&&q.hookSpecificOutput.permissionDecision)switch(q.hookSpecificOutput.permissionDecision){case"allow":H.permissionBehavior="allow";break;case"deny":H.permissionBehavior="deny",H.blockingError={blockingError:q.reason||"Blocked by hook",command:K};break;case"ask":H.permissionBehavior="ask";break;default:throw Error(`Unknown hook permissionDecision type: ${q.hookSpecificOutput.permissionDecision}. Valid types are: allow, deny, ask`)}if(H.permissionBehavior!==void 0&&q.reason!==void 0)H.hookPermissionDecisionReason=q.reason;if(q.hookSpecificOutput){if($&&q.hookSpecificOutput.hookEventName!==$)throw Error(`Hook returned incorrect event name: expected '${$}' but got '${q.hookSpecificOutput.hookEventName}'. Full stdout: ${g6(q,null,2)}`);switch(q.hookSpecificOutput.hookEventName){case"PreToolUse":if(q.hookSpecificOutput.permissionDecision)switch(q.hookSpecificOutput.permissionDecision){case"allow":H.permissionBehavior="allow";break;case"deny":H.permissionBehavior="deny",H.blockingError={blockingError:q.hookSpecificOutput.permissionDecisionReason||q.reason||"Blocked by hook",command:K};break;case"ask":H.permissionBehavior="ask";break}if(H.hookPermissionDecisionReason=q.hookSpecificOutput.permissionDecisionReason,q.hookSpecificOutput.updatedInput)H.updatedInput=q.hookSpecificOutput.updatedInput;H.additionalContext=q.hookSpecificOutput.additionalContext;break;case"UserPromptSubmit":H.additionalContext=q.hookSpecificOutput.additionalContext;break;case"SessionStart":if(H.additionalContext=q.hookSpecificOutput.additionalContext,H.initialUserMessage=q.hookSpecificOutput.initialUserMessage,"watchPaths"in q.hookSpecificOutput&&q.hookSpecificOutput.watchPaths)H.watchPaths=q.hookSpecificOutput.watchPaths;break;case"Setup":H.additionalContext=q.hookSpecificOutput.additionalContext;break;case"SubagentStart":H.additionalContext=q.hookSpecificOutput.additionalContext;break;case"PostToolUse":if(H.additionalContext=q.hookSpecificOutput.additionalContext,q.hookSpecificOutput.updatedMCPToolOutput)H.updatedMCPToolOutput=q.hookSpecificOutput.updatedMCPToolOutput;break;case"PostToolUseFailure":H.additionalContext=q.hookSpecificOutput.additionalContext;break;case"PermissionDenied":H.retry=q.hookSpecificOutput.retry;break;case"PermissionRequest":if(q.hookSpecificOutput.decision){if(H.permissionRequestResult=q.hookSpecificOutput.decision,H.permissionBehavior=q.hookSpecificOutput.decision.behavior==="allow"?"allow":"deny",q.hookSpecificOutput.decision.behavior==="allow"&&q.hookSpecificOutput.decision.updatedInput)H.updatedInput=q.hookSpecificOutput.decision.updatedInput}break;case"Elicitation":if(q.hookSpecificOutput.action){if(H.elicitationResponse={action:q.hookSpecificOutput.action,content:q.hookSpecificOutput.content},q.hookSpecificOutput.action==="decline")H.blockingError={blockingError:q.reason||"Elicitation denied by hook",command:K}}break;case"ElicitationResult":if(q.hookSpecificOutput.action){if(H.elicitationResultResponse={action:q.hookSpecificOutput.action,content:q.hookSpecificOutput.content},q.hookSpecificOutput.action==="decline")H.blockingError={blockingError:q.reason||"Elicitation result blocked by hook",command:K}}break}}return{...H,message:H.blockingError?V4({type:"hook_blocking_error",hookName:_,toolUseID:z,hookEvent:Y,blockingError:H.blockingError}):V4({type:"hook_success",hookName:_,toolUseID:z,hookEvent:Y,content:"",stdout:A,stderr:O,exitCode:w,command:K,durationMs:j})}}async function hQ8(q,K,_,z,Y,$,A,O,w,j,H,J){let M=K==="SessionStart"||K==="Setup"||K==="SessionEnd",X=Date.now(),P,W=!1,D=Z1()==="windows",f=q.shell??zD6,G=f==="powershell",Z=D&&!G?(n)=>ff(n):(n)=>n,T=Fz(),v=q.command,V;if(O){if(!await u5(O))throw Error(`Plugin directory does not exist: ${O}`+(w?` (${w} — run /plugin to reinstall)`:""));let n=Z(O);if(v=v.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g,()=>n),w){let l=Z(ei(w));v=v.replace(/\$\{CLAUDE_PLUGIN_DATA\}/g,()=>l)}if(w)V=VG(w),v=kk6(v,V)}if(D&&!G&&v.trim().match(/\.sh(\s|$|")/)){if(!v.trim().startsWith("bash "))v=`bash ${v}`}let E=!G&&process.env.CLAUDE_CODE_SHELL_PREFIX?JI8(process.env.CLAUDE_CODE_SHELL_PREFIX,v):v,S=q.timeout?q.timeout*1000:PO,R={...Ym(),CLAUDE_PROJECT_DIR:Z(T)};if(O){if(R.CLAUDE_PLUGIN_ROOT=Z(O),w)R.CLAUDE_PLUGIN_DATA=Z(ei(w))}if(V)for(let[n,l]of Object.entries(V)){let A6=n.replace(/[^A-Za-z0-9_]/g,"_").toUpperCase();R[`CLAUDE_PLUGIN_OPTION_${A6}`]=String(l)}if(j)R.CLAUDE_PLUGIN_ROOT=Z(j);if(!G&&(K==="SessionStart"||K==="Setup"||K==="CwdChanged"||K==="FileChanged")&&A!==void 0)R.CLAUDE_ENV_FILE=await p5K(K,A);let x=Z8(),I=await u5(x)?x:r1();if(I!==x)N(`Hooks: cwd ${x} not found, falling back to original cwd`,{level:"warn"});let B;if(f==="powershell"){let n=await Pa();if(!n)throw Error(`Hook "${q.command}" has shell: 'powershell' but no PowerShell executable (pwsh or powershell) was found on PATH. Install PowerShell, or remove "shell": "powershell" to use bash.`);B=ZgK(n,Ta1(E),{env:R,cwd:I,windowsHide:!0})}else{let n=D?X41():!0;B=ZgK(E,[],{env:R,cwd:I,shell:n,windowsHide:!0})}let p=new JO(`hook_${B.pid}`,null),C=WI8(B,Y,S,p),g=!1,F=!1;if((q.async||q.asyncRewake)&&!H){let n=`async_hook_${B.pid}`;if(N(`Hooks: Config-based async hook, backgrounding process ${n}`),B.stdin.write(z+` |
| 7717 | `,"utf8"),B.stdin.end(),F=!0,GgK({processId:n,hookId:$,shellCommand:C,asyncResponse:{async:!0,asyncTimeout:S},hookEvent:K,hookName:_,command:q.command,asyncRewake:q.asyncRewake,pluginId:w}))return{stdout:"",stderr:"",output:"",status:0,backgrounded:!0}}let U="",c="",K6="";B.stdout.setEncoding("utf8"),B.stderr.setEncoding("utf8");let t=!1,q6=null,e=new Promise((n)=>{q6=n}),i=new Set,$6=Promise.resolve(),M6="";B.stdout.on("data",(n)=>{if(U+=n,K6+=n,J){M6+=n;let l=M6.split(` |