(
toolName: string,
toolUseID: string,
toolInput: ToolInput,
toolUseContext: ToolUseContext,
permissionMode?: string,
signal?: AbortSignal,
timeoutMs: number = TOOL_HOOK_EXECUTION_TIMEOUT_MS,
requestPrompt?: (
sourceName: string,
toolInputSummary?: string | null,
) => (request: PromptRequest) => Promise<PromptResponse>,
toolInputSummary?: string | null,
)
| 3478 | * @returns Async generator that yields progress messages and returns blocking errors |
| 3479 | */ |
| 3480 | export async function* executePreToolHooks<ToolInput>( |
| 3481 | toolName: string, |
| 3482 | toolUseID: string, |
| 3483 | toolInput: ToolInput, |
| 3484 | toolUseContext: ToolUseContext, |
| 3485 | permissionMode?: string, |
| 3486 | signal?: AbortSignal, |
| 3487 | timeoutMs: number = TOOL_HOOK_EXECUTION_TIMEOUT_MS, |
| 3488 | requestPrompt?: ( |
| 3489 | sourceName: string, |
| 3490 | toolInputSummary?: string | null, |
| 3491 | ) => (request: PromptRequest) => Promise<PromptResponse>, |
| 3492 | toolInputSummary?: string | null, |
| 3493 | ): AsyncGenerator<AggregatedHookResult> { |
| 3494 | const appState = toolUseContext.getAppState() |
| 3495 | const sessionId = toolUseContext.agentId ?? getSessionId() |
| 3496 | if (!hasHookForEvent('PreToolUse', appState, sessionId)) { |
| 3497 | return |
| 3498 | } |
| 3499 | |
| 3500 | logForDebugging(`executePreToolHooks called for tool: ${toolName}`, { |
| 3501 | level: 'verbose', |
| 3502 | }) |
| 3503 | |
| 3504 | const hookInput: PreToolUseHookInput = { |
| 3505 | ...createBaseHookInput(permissionMode, undefined, toolUseContext), |
| 3506 | hook_event_name: 'PreToolUse', |
| 3507 | tool_name: toolName, |
| 3508 | tool_input: toolInput, |
| 3509 | tool_use_id: toolUseID, |
| 3510 | } |
| 3511 | |
| 3512 | yield* executeHooks({ |
| 3513 | hookInput, |
| 3514 | toolUseID, |
| 3515 | matchQuery: toolName, |
| 3516 | signal, |
| 3517 | timeoutMs, |
| 3518 | toolUseContext, |
| 3519 | requestPrompt, |
| 3520 | toolInputSummary, |
| 3521 | }) |
| 3522 | } |
| 3523 | |
| 3524 | /** |
| 3525 | * Execute post-tool hooks if configured |
no test coverage detected