({
toolUseID,
hook,
hookEvent,
hookInput,
signal,
hookIndex,
toolUseContext,
}: {
toolUseID: string
hook: HookCallback
hookEvent: HookEvent
hookInput: HookInput
signal: AbortSignal
hookIndex?: number
toolUseContext?: ToolUseContext
})
| 5006 | } |
| 5007 | |
| 5008 | async function executeHookCallback({ |
| 5009 | toolUseID, |
| 5010 | hook, |
| 5011 | hookEvent, |
| 5012 | hookInput, |
| 5013 | signal, |
| 5014 | hookIndex, |
| 5015 | toolUseContext, |
| 5016 | }: { |
| 5017 | toolUseID: string |
| 5018 | hook: HookCallback |
| 5019 | hookEvent: HookEvent |
| 5020 | hookInput: HookInput |
| 5021 | signal: AbortSignal |
| 5022 | hookIndex?: number |
| 5023 | toolUseContext?: ToolUseContext |
| 5024 | }): Promise<HookResult> { |
| 5025 | // Create context for callbacks that need state access |
| 5026 | const context = toolUseContext |
| 5027 | ? { |
| 5028 | getAppState: toolUseContext.getAppState, |
| 5029 | updateAttributionState: toolUseContext.updateAttributionState, |
| 5030 | } |
| 5031 | : undefined |
| 5032 | const json = await hook.callback( |
| 5033 | hookInput, |
| 5034 | toolUseID, |
| 5035 | signal, |
| 5036 | hookIndex, |
| 5037 | context, |
| 5038 | ) |
| 5039 | if (isAsyncHookJSONOutput(json)) { |
| 5040 | return { |
| 5041 | outcome: 'success', |
| 5042 | hook, |
| 5043 | } |
| 5044 | } |
| 5045 | |
| 5046 | const processed = processHookJSONOutput({ |
| 5047 | json, |
| 5048 | command: 'callback', |
| 5049 | // TODO: If the hook came from a plugin, use the full path to the plugin for easier debugging |
| 5050 | hookName: `${hookEvent}:Callback`, |
| 5051 | toolUseID, |
| 5052 | hookEvent, |
| 5053 | expectedHookEvent: hookEvent, |
| 5054 | // Callbacks don't have stdout/stderr/exitCode |
| 5055 | stdout: undefined, |
| 5056 | stderr: undefined, |
| 5057 | exitCode: undefined, |
| 5058 | }) |
| 5059 | return { |
| 5060 | ...processed, |
| 5061 | outcome: 'success', |
| 5062 | hook, |
| 5063 | } |
| 5064 | } |
| 5065 |
no test coverage detected