( toolUseContext: ToolUseContext, tool: Tool, processedInput: Record<string, unknown>, toolUseID: string, messageId: string, requestId: string | undefined, mcpServerType: McpServerType, mcpServerBaseUrl: string | undefined, )
| 433 | } |
| 434 | |
| 435 | export async function* runPreToolUseHooks( |
| 436 | toolUseContext: ToolUseContext, |
| 437 | tool: Tool, |
| 438 | processedInput: Record<string, unknown>, |
| 439 | toolUseID: string, |
| 440 | messageId: string, |
| 441 | requestId: string | undefined, |
| 442 | mcpServerType: McpServerType, |
| 443 | mcpServerBaseUrl: string | undefined, |
| 444 | ): AsyncGenerator< |
| 445 | | { |
| 446 | type: 'message' |
| 447 | message: MessageUpdateLazy< |
| 448 | AttachmentMessage | ProgressMessage<HookProgress> |
| 449 | > |
| 450 | } |
| 451 | | { type: 'hookPermissionResult'; hookPermissionResult: PermissionResult } |
| 452 | | { type: 'hookUpdatedInput'; updatedInput: Record<string, unknown> } |
| 453 | | { type: 'preventContinuation'; shouldPreventContinuation: boolean } |
| 454 | | { type: 'stopReason'; stopReason: string } |
| 455 | | { |
| 456 | type: 'additionalContext' |
| 457 | message: MessageUpdateLazy<AttachmentMessage> |
| 458 | } |
| 459 | // stop execution |
| 460 | | { type: 'stop' } |
| 461 | > { |
| 462 | const hookStartTime = Date.now() |
| 463 | try { |
| 464 | const appState = toolUseContext.getAppState() |
| 465 | |
| 466 | for await (const result of executePreToolHooks( |
| 467 | tool.name, |
| 468 | toolUseID, |
| 469 | processedInput, |
| 470 | toolUseContext, |
| 471 | appState.toolPermissionContext.mode, |
| 472 | toolUseContext.abortController.signal, |
| 473 | undefined, // timeoutMs - use default |
| 474 | toolUseContext.requestPrompt, |
| 475 | tool.getToolUseSummary?.(processedInput), |
| 476 | )) { |
| 477 | try { |
| 478 | if (result.message) { |
| 479 | yield { type: 'message', message: { message: result.message } } |
| 480 | } |
| 481 | if (result.blockingError) { |
| 482 | const denialMessage = getPreToolHookBlockingMessage( |
| 483 | `PreToolUse:${tool.name}`, |
| 484 | result.blockingError, |
| 485 | ) |
| 486 | yield { |
| 487 | type: 'hookPermissionResult', |
| 488 | hookPermissionResult: { |
| 489 | behavior: 'deny', |
| 490 | message: denialMessage, |
| 491 | decisionReason: { |
| 492 | type: 'hook', |
no test coverage detected