@within-7/minto 0.3.10 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Tool.js.map +2 -2
- package/dist/commands/agents/AgentsCommand.js +2 -2
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/ctx_viz.js +1 -1
- package/dist/commands/effort.js +87 -0
- package/dist/commands/effort.js.map +7 -0
- package/dist/commands/export.js +19 -9
- package/dist/commands/export.js.map +2 -2
- package/dist/commands/ide.js +18 -0
- package/dist/commands/ide.js.map +7 -0
- package/dist/commands/mcp-interactive.js +14 -8
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/memory.js +168 -0
- package/dist/commands/memory.js.map +7 -0
- package/dist/commands/model.js +45 -2
- package/dist/commands/model.js.map +2 -2
- package/dist/commands/outputStyle.js +64 -0
- package/dist/commands/outputStyle.js.map +7 -0
- package/dist/commands/plugin/utils.js +33 -1
- package/dist/commands/plugin/utils.js.map +2 -2
- package/dist/commands/plugin.js +10 -1
- package/dist/commands/plugin.js.map +2 -2
- package/dist/commands/refreshCommands.js +2 -0
- package/dist/commands/refreshCommands.js.map +2 -2
- package/dist/commands/review.js +51 -0
- package/dist/commands/review.js.map +7 -0
- package/dist/commands/terminalSetup.js +6 -0
- package/dist/commands/terminalSetup.js.map +2 -2
- package/dist/commands/undo.js +8 -0
- package/dist/commands/undo.js.map +2 -2
- package/dist/commands/vim.js +22 -0
- package/dist/commands/vim.js.map +7 -0
- package/dist/commands.js +12 -0
- package/dist/commands.js.map +2 -2
- package/dist/components/HighlightedCode.js +1 -0
- package/dist/components/HighlightedCode.js.map +2 -2
- package/dist/components/ModelSelector/ModelSelector.js +250 -143
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/PromptInput.js +21 -6
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/PulseLabel.js +44 -0
- package/dist/components/PulseLabel.js.map +7 -0
- package/dist/components/RequestStatusIndicator.js +1 -1
- package/dist/components/RequestStatusIndicator.js.map +1 -1
- package/dist/components/Spinner.js +12 -42
- package/dist/components/Spinner.js.map +3 -3
- package/dist/components/StartupStatus.js +57 -0
- package/dist/components/StartupStatus.js.map +7 -0
- package/dist/components/SubagentBlock.js +43 -6
- package/dist/components/SubagentBlock.js.map +2 -2
- package/dist/components/TabbedListView/TabBar.js +13 -8
- package/dist/components/TabbedListView/TabBar.js.map +2 -2
- package/dist/components/TabbedListView/TabbedListView.js +1 -1
- package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
- package/dist/components/TodoPanel.js +1 -1
- package/dist/components/TodoPanel.js.map +1 -1
- package/dist/components/ToolUseLoader.js +5 -0
- package/dist/components/ToolUseLoader.js.map +2 -2
- package/dist/components/TrustDialog.js +0 -2
- package/dist/components/TrustDialog.js.map +2 -2
- package/dist/components/messages/TaskInModuleView.js +1 -1
- package/dist/components/messages/TaskInModuleView.js.map +2 -2
- package/dist/components/messages/TaskToolMessage.js +1 -1
- package/dist/components/messages/TaskToolMessage.js.map +2 -2
- package/dist/components/messages/UserPromptMessage.js +6 -1
- package/dist/components/messages/UserPromptMessage.js.map +2 -2
- package/dist/constants/modelCapabilities.js +103 -18
- package/dist/constants/modelCapabilities.js.map +2 -2
- package/dist/constants/product.js +2 -0
- package/dist/constants/product.js.map +2 -2
- package/dist/constants/prompts/agentPrompt.js +30 -0
- package/dist/constants/prompts/agentPrompt.js.map +7 -0
- package/dist/constants/prompts/codeConventions.js +27 -0
- package/dist/constants/prompts/codeConventions.js.map +7 -0
- package/dist/constants/prompts/doingTasks.js +15 -0
- package/dist/constants/prompts/doingTasks.js.map +7 -0
- package/dist/constants/prompts/envInfo.js +17 -0
- package/dist/constants/prompts/envInfo.js.map +7 -0
- package/dist/constants/prompts/executingWithCare.js +17 -0
- package/dist/constants/prompts/executingWithCare.js.map +7 -0
- package/dist/constants/prompts/identity.js +10 -0
- package/dist/constants/prompts/identity.js.map +7 -0
- package/dist/constants/prompts/index.js +78 -0
- package/dist/constants/prompts/index.js.map +7 -0
- package/dist/constants/prompts/taskManagement.js +60 -0
- package/dist/constants/prompts/taskManagement.js.map +7 -0
- package/dist/constants/prompts/toneAndStyle.js +62 -0
- package/dist/constants/prompts/toneAndStyle.js.map +7 -0
- package/dist/constants/prompts/toolUsagePolicy.js +38 -0
- package/dist/constants/prompts/toolUsagePolicy.js.map +7 -0
- package/dist/constants/prompts.js +5 -176
- package/dist/constants/prompts.js.map +2 -2
- package/dist/constants/providerRegistry.js +235 -0
- package/dist/constants/providerRegistry.js.map +7 -0
- package/dist/constants/providers.js +35 -0
- package/dist/constants/providers.js.map +7 -0
- package/dist/context/PermissionContext.js +0 -1
- package/dist/context/PermissionContext.js.map +2 -2
- package/dist/context.js +87 -31
- package/dist/context.js.map +2 -2
- package/dist/core/backupHook.js +2 -2
- package/dist/core/backupHook.js.map +2 -2
- package/dist/core/config/defaults.js +4 -1
- package/dist/core/config/defaults.js.map +2 -2
- package/dist/core/config/schema.js +7 -1
- package/dist/core/config/schema.js.map +2 -2
- package/dist/core/costTracker.js +18 -0
- package/dist/core/costTracker.js.map +2 -2
- package/dist/core/index.js +0 -1
- package/dist/core/index.js.map +2 -2
- package/dist/core/tokenStatsManager.js +22 -4
- package/dist/core/tokenStatsManager.js.map +2 -2
- package/dist/entrypoints/cli.js +65 -84
- package/dist/entrypoints/cli.js.map +2 -2
- package/dist/hooks/useAgentTokenStats.js +1 -1
- package/dist/hooks/useAgentTokenStats.js.map +2 -2
- package/dist/hooks/useAgentTranscripts.js +2 -1
- package/dist/hooks/useAgentTranscripts.js.map +2 -2
- package/dist/hooks/useBackgroundShells.js +29 -0
- package/dist/hooks/useBackgroundShells.js.map +7 -0
- package/dist/hooks/useCanUseTool.js +1 -1
- package/dist/hooks/useCanUseTool.js.map +2 -2
- package/dist/hooks/useDeferredLoading.js +64 -0
- package/dist/hooks/useDeferredLoading.js.map +7 -0
- package/dist/hooks/useHookStatus.js +1 -1
- package/dist/hooks/useHookStatus.js.map +2 -2
- package/dist/hooks/useSessionTracking.js +55 -0
- package/dist/hooks/useSessionTracking.js.map +7 -0
- package/dist/hooks/useTerminalSize.js +21 -0
- package/dist/hooks/useTerminalSize.js.map +2 -2
- package/dist/hooks/useTextInput.js +1 -0
- package/dist/hooks/useTextInput.js.map +2 -2
- package/dist/hooks/useUnifiedCompletion.js +3 -2
- package/dist/hooks/useUnifiedCompletion.js.map +2 -2
- package/dist/i18n/locales/en.js +8 -9
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.js +8 -9
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/i18n/types.js.map +1 -1
- package/dist/messages.js +41 -17
- package/dist/messages.js.map +2 -2
- package/dist/permissions.js +94 -1
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +27 -19
- package/dist/query.js.map +2 -2
- package/dist/screens/REPL.js +83 -74
- package/dist/screens/REPL.js.map +2 -2
- package/dist/services/adapters/responsesAPI.js +6 -0
- package/dist/services/adapters/responsesAPI.js.map +2 -2
- package/dist/services/agentTeams/index.js +35 -0
- package/dist/services/agentTeams/index.js.map +7 -0
- package/dist/services/agentTeams/mailbox.js +114 -0
- package/dist/services/agentTeams/mailbox.js.map +7 -0
- package/dist/services/agentTeams/teamManager.js +149 -0
- package/dist/services/agentTeams/teamManager.js.map +7 -0
- package/dist/services/agentTeams/teamTaskStore.js +114 -0
- package/dist/services/agentTeams/teamTaskStore.js.map +7 -0
- package/dist/services/agentTeams/teammateSpawner.js +80 -0
- package/dist/services/agentTeams/teammateSpawner.js.map +7 -0
- package/dist/services/checkpointManager.js +16 -3
- package/dist/services/checkpointManager.js.map +2 -2
- package/dist/services/claude.js +19 -1728
- package/dist/services/claude.js.map +3 -3
- package/dist/services/gpt5ConnectionTest.js +4 -2
- package/dist/services/gpt5ConnectionTest.js.map +2 -2
- package/dist/services/hookExecutor.js +411 -127
- package/dist/services/hookExecutor.js.map +2 -2
- package/dist/services/llm/anthropicProvider.js +807 -0
- package/dist/services/llm/anthropicProvider.js.map +7 -0
- package/dist/services/llm/dispatch.js +218 -0
- package/dist/services/llm/dispatch.js.map +7 -0
- package/dist/services/llm/index.js +44 -0
- package/dist/services/llm/index.js.map +7 -0
- package/dist/services/llm/mintoContext.js +69 -0
- package/dist/services/llm/mintoContext.js.map +7 -0
- package/dist/services/llm/openaiProvider.js +622 -0
- package/dist/services/llm/openaiProvider.js.map +7 -0
- package/dist/services/llm/types.js +157 -0
- package/dist/services/llm/types.js.map +7 -0
- package/dist/services/mcpClient.js +183 -33
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/notifier.js +14 -0
- package/dist/services/notifier.js.map +2 -2
- package/dist/services/oauth.js +4 -2
- package/dist/services/oauth.js.map +2 -2
- package/dist/services/openai.js +66 -56
- package/dist/services/openai.js.map +3 -3
- package/dist/services/outputStyles.js +102 -21
- package/dist/services/outputStyles.js.map +2 -2
- package/dist/services/plugins/skillMarketplace.js +4 -1
- package/dist/services/plugins/skillMarketplace.js.map +2 -2
- package/dist/services/sentry.js +1 -1
- package/dist/services/sentry.js.map +2 -2
- package/dist/services/sessionMemory.js +16 -3
- package/dist/services/sessionMemory.js.map +2 -2
- package/dist/services/systemReminder.js +350 -3
- package/dist/services/systemReminder.js.map +2 -2
- package/dist/services/taskStore.js +19 -0
- package/dist/services/taskStore.js.map +2 -2
- package/dist/tools/ArchitectTool/ArchitectTool.js.map +1 -1
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +1 -1
- package/dist/tools/BashOutputTool/BashOutputTool.js.map +1 -1
- package/dist/tools/BashTool/BashTool.js +28 -0
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/FileEditTool/FileEditTool.js +1 -1
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileReadTool/FileReadTool.js +14 -0
- package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
- package/dist/tools/FileWriteTool/FileWriteTool.js +3 -1
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
- package/dist/tools/GlobTool/GlobTool.js.map +1 -1
- package/dist/tools/GrepTool/GrepTool.js.map +1 -1
- package/dist/tools/KillShellTool/KillShellTool.js.map +1 -1
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +2 -2
- package/dist/tools/LspTool/LspTool.js +11 -2
- package/dist/tools/LspTool/LspTool.js.map +2 -2
- package/dist/tools/MCPTool/MCPTool.js.map +1 -1
- package/dist/tools/MemoryReadTool/MemoryReadTool.js +2 -1
- package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +2 -1
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +1 -1
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +1 -1
- package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +1 -1
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +8 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +2 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
- package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +1 -1
- package/dist/tools/SlashCommandTool/SlashCommandTool.js +174 -18
- package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +3 -3
- package/dist/tools/TaskCreateTool/TaskCreateTool.js.map +1 -1
- package/dist/tools/TaskGetTool/TaskGetTool.js.map +1 -1
- package/dist/tools/TaskListTool/TaskListTool.js.map +1 -1
- package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +1 -1
- package/dist/tools/TaskStopTool/TaskStopTool.js.map +1 -1
- package/dist/tools/TaskTool/TaskTool.js +75 -5
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/tools/TaskTool/prompt.js +12 -6
- package/dist/tools/TaskTool/prompt.js.map +2 -2
- package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +1 -1
- package/dist/tools/ThinkTool/ThinkTool.js.map +1 -1
- package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +1 -1
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +1 -1
- package/dist/tools/WebSearchTool/WebSearchTool.js.map +1 -1
- package/dist/tools/WebSearchTool/searchProviders.js +2 -1
- package/dist/tools/WebSearchTool/searchProviders.js.map +2 -2
- package/dist/tools/lsTool/lsTool.js.map +2 -2
- package/dist/tools/lsTool/prompt.js.map +1 -1
- package/dist/tools.js +14 -3
- package/dist/tools.js.map +2 -2
- package/dist/types/PermissionMode.js +21 -1
- package/dist/types/PermissionMode.js.map +2 -2
- package/dist/types/agentTeams.js +1 -0
- package/dist/types/agentTeams.js.map +7 -0
- package/dist/types/hooks.js +8 -2
- package/dist/types/hooks.js.map +2 -2
- package/dist/types/plugin.js +1 -1
- package/dist/types/plugin.js.map +2 -2
- package/dist/utils/agentLoader.js +25 -3
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/animationManager.js +1 -1
- package/dist/utils/animationManager.js.map +2 -2
- package/dist/utils/ask.js +1 -1
- package/dist/utils/async.js +5 -1
- package/dist/utils/async.js.map +2 -2
- package/dist/utils/autoCompactCore.js +60 -0
- package/dist/utils/autoCompactCore.js.map +2 -2
- package/dist/utils/config.js +26 -128
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/configSchema.js +227 -0
- package/dist/utils/configSchema.js.map +7 -0
- package/dist/utils/debugLogger.js.map +2 -2
- package/dist/utils/env.js +4 -3
- package/dist/utils/env.js.map +2 -2
- package/dist/utils/envConfig.js +34 -0
- package/dist/utils/envConfig.js.map +3 -3
- package/dist/utils/gpt5.js +146 -0
- package/dist/utils/gpt5.js.map +7 -0
- package/dist/utils/hookManager.js +374 -140
- package/dist/utils/hookManager.js.map +2 -2
- package/dist/utils/markdown.js +47 -0
- package/dist/utils/markdown.js.map +2 -2
- package/dist/utils/memoizeWithTTL.js +25 -0
- package/dist/utils/memoizeWithTTL.js.map +7 -0
- package/dist/utils/model.js +34 -9
- package/dist/utils/model.js.map +2 -2
- package/dist/utils/pluginInstaller.js +34 -5
- package/dist/utils/pluginInstaller.js.map +2 -2
- package/dist/utils/pluginLoader.js +201 -32
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/safeFetch.js +45 -0
- package/dist/utils/safeFetch.js.map +7 -0
- package/dist/utils/skillLoader.js +59 -6
- package/dist/utils/skillLoader.js.map +2 -2
- package/dist/utils/streamingState.js +52 -0
- package/dist/utils/streamingState.js.map +7 -0
- package/dist/utils/style.js +6 -3
- package/dist/utils/style.js.map +2 -2
- package/dist/utils/teamConfig.js +9 -3
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/toolRiskClassification.js +0 -6
- package/dist/utils/toolRiskClassification.js.map +2 -2
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +7 -6
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/services/hookExecutor.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Hook Execution Engine\n *\n * Executes plugin hooks with bash command execution, JSON I/O,\n * and decision processing (approve/block/ask).\n *\n * Fully compatible with Claude Code CLI hooks specification.\n */\n\nimport { spawn } from 'child_process'\nimport { homedir } from 'os'\nimport { join } from 'path'\nimport { EventEmitter } from 'events'\nimport {\n HookEvent,\n HookInput,\n HookOutput,\n HookDecision,\n PreToolUseInput,\n PostToolUseInput,\n PostToolUseFailureInput,\n PermissionRequestInput,\n UserPromptSubmitInput,\n SessionStartInput,\n SessionEndInput,\n StopInput,\n SubagentStartInput,\n SubagentStopInput,\n NotificationInput,\n PreCompactInput,\n PostCompactInput,\n} from '../types/hooks'\nimport { LoadedHook, HookEvent as PluginHookEvent } from '../types/plugin'\nimport { getCwd } from '../utils/state'\nimport { logError } from '../utils/log'\n\n// Simple logging helpers\nconst logInfo = (msg: string) => {\n // Only log in debug mode to reduce noise\n if (process.env.DEBUG) console.log(`[INFO] ${msg}`)\n}\nconst logDebug = (msg: string, ...args: any[]) => {\n if (process.env.DEBUG) console.log(`[DEBUG] ${msg}`, ...args)\n}\n\n/**\n * Hook status event for verbose mode display\n */\nexport interface HookStatusEvent {\n /** Hook event type (PreToolUse, PostToolUse, etc.) */\n event: PluginHookEvent\n /** Tool name if applicable */\n toolName?: string\n /** Whether the hook succeeded */\n success: boolean\n /** Formatted status message */\n message: string\n /** Timestamp */\n timestamp: number\n /** Hook name */\n hookName: string\n}\n\n/**\n * Event emitter for hook status updates\n * Used by UI to display hook status in verbose mode\n */\nexport const hookStatusEmitter = new EventEmitter()\n\n/**\n * Format hook status message (like Claude Code: \"PreToolUse:Glob hook succeeded: Success\")\n */\nfunction formatHookStatusMessage(\n event: PluginHookEvent,\n toolName: string | undefined,\n hookName: string,\n success: boolean,\n errorMessage?: string,\n): string {\n const eventPart = toolName ? `${event}:${toolName}` : event\n const statusPart = success ? 'succeeded' : 'failed'\n const detailPart = success ? 'Success' : errorMessage || 'Error'\n return `${eventPart} hook ${statusPart}: ${detailPart}`\n}\n\n/**\n * Hook execution result\n */\nexport interface HookExecutionResult {\n success: boolean\n decision?: 'approve' | 'block' | 'ask'\n output?: HookOutput\n error?: string\n timedOut?: boolean\n}\n\n/**\n * Hook execution options\n */\nexport interface HookExecutionOptions {\n timeout?: number\n sessionId: string\n transcriptPath?: string\n pluginRoot: string\n}\n\n/**\n * Execute a hook with bash command\n */\nexport async function executeHook(\n hook: LoadedHook,\n input: HookInput,\n options: HookExecutionOptions,\n): Promise<HookExecutionResult> {\n // Only execute command-type hooks\n if (hook.config.type !== 'command' || !hook.config.command) {\n return {\n success: false,\n error: `Hook type \"${hook.config.type}\" not yet implemented`,\n }\n }\n\n const timeout = hook.config.timeout || options.timeout || 30000 // 30 seconds default\n\n // Extract tool name from input (needed for status events in both try and catch)\n const toolName =\n 'tool_name' in input ? (input.tool_name as string) : undefined\n\n try {\n logDebug(`Executing hook: ${hook.name}`)\n logDebug(`Command: ${hook.config.command}`)\n\n // Execute bash command with JSON input via stdin\n const result = await executeBashCommand(hook.config.command, input, {\n ...options,\n timeout,\n pluginRoot: options.pluginRoot,\n })\n\n if (result.timedOut) {\n logError(`Hook ${hook.name} timed out after ${timeout}ms`)\n const errorMsg = `Hook execution timed out after ${timeout}ms`\n hookStatusEmitter.emit('status', {\n event: hook.event,\n toolName,\n success: false,\n message: formatHookStatusMessage(\n hook.event,\n toolName,\n hook.name,\n false,\n errorMsg,\n ),\n timestamp: Date.now(),\n hookName: hook.name,\n } as HookStatusEvent)\n return {\n success: false,\n timedOut: true,\n error: errorMsg,\n }\n }\n\n if (result.error) {\n logError(`Hook ${hook.name} failed: ${result.error}`)\n hookStatusEmitter.emit('status', {\n event: hook.event,\n toolName,\n success: false,\n message: formatHookStatusMessage(\n hook.event,\n toolName,\n hook.name,\n false,\n result.error,\n ),\n timestamp: Date.now(),\n hookName: hook.name,\n } as HookStatusEvent)\n return {\n success: false,\n error: result.error,\n }\n }\n\n // Parse JSON output\n const output = parseHookOutput(result.stdout)\n\n if (!output) {\n // No output means hook executed successfully but didn't return decisions\n hookStatusEmitter.emit('status', {\n event: hook.event,\n toolName,\n success: true,\n message: formatHookStatusMessage(hook.event, toolName, hook.name, true),\n timestamp: Date.now(),\n hookName: hook.name,\n } as HookStatusEvent)\n return {\n success: true,\n }\n }\n\n logDebug(`Hook ${hook.name} output:`, output)\n\n // Emit success status event\n hookStatusEmitter.emit('status', {\n event: hook.event,\n toolName,\n success: true,\n message: formatHookStatusMessage(hook.event, toolName, hook.name, true),\n timestamp: Date.now(),\n hookName: hook.name,\n } as HookStatusEvent)\n\n return {\n success: true,\n decision: output.decision,\n output,\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n logError(`Hook ${hook.name} execution error: ${errorMsg}`)\n\n // Emit failure status event\n hookStatusEmitter.emit('status', {\n event: hook.event,\n toolName,\n success: false,\n message: formatHookStatusMessage(\n hook.event,\n toolName,\n hook.name,\n false,\n errorMsg,\n ),\n timestamp: Date.now(),\n hookName: hook.name,\n } as HookStatusEvent)\n\n return {\n success: false,\n error: errorMsg,\n }\n }\n}\n\n/**\n * Execute bash command with JSON stdin/stdout\n */\nasync function executeBashCommand(\n command: string,\n input: HookInput,\n options: {\n timeout: number\n sessionId: string\n transcriptPath?: string\n pluginRoot: string\n },\n): Promise<{\n stdout: string\n stderr: string\n error?: string\n timedOut?: boolean\n}> {\n return new Promise(resolve => {\n // Prepare environment variables\n const env = {\n ...process.env,\n CLAUDE_PLUGIN_ROOT: options.pluginRoot,\n CLAUDE_SESSION_ID: options.sessionId,\n CLAUDE_CWD: getCwd(),\n CLAUDE_TRANSCRIPT_PATH: options.transcriptPath || '',\n }\n\n // Spawn bash process\n const child = spawn('bash', ['-c', command], {\n env,\n cwd: getCwd(),\n })\n\n let stdout = ''\n let stderr = ''\n let timedOut = false\n\n // Set timeout\n const timer = setTimeout(() => {\n timedOut = true\n child.kill('SIGTERM')\n setTimeout(() => {\n if (!child.killed) {\n child.kill('SIGKILL')\n }\n }, 1000)\n }, options.timeout)\n\n // Collect stdout\n child.stdout?.on('data', data => {\n stdout += data.toString()\n })\n\n // Collect stderr\n child.stderr?.on('data', data => {\n stderr += data.toString()\n })\n\n // Handle completion\n child.on('close', code => {\n clearTimeout(timer)\n\n if (timedOut) {\n resolve({\n stdout: '',\n stderr: '',\n timedOut: true,\n })\n return\n }\n\n if (code !== 0 && code !== null) {\n resolve({\n stdout,\n stderr,\n error: `Command exited with code ${code}: ${stderr}`,\n })\n return\n }\n\n resolve({\n stdout,\n stderr,\n })\n })\n\n // Handle errors\n child.on('error', error => {\n clearTimeout(timer)\n resolve({\n stdout: '',\n stderr: '',\n error: `Failed to spawn process: ${error.message}`,\n })\n })\n\n // Send JSON input via stdin\n try {\n if (child.stdin) {\n child.stdin.write(JSON.stringify(input, null, 2))\n child.stdin.end()\n }\n } catch (error) {\n clearTimeout(timer)\n child.kill()\n resolve({\n stdout: '',\n stderr: '',\n error: `Failed to write to stdin: ${error instanceof Error ? error.message : String(error)}`,\n })\n }\n })\n}\n\n/**\n * Parse hook output JSON\n */\nfunction parseHookOutput(stdout: string): HookOutput | null {\n if (!stdout.trim()) {\n return null\n }\n\n try {\n // Try to extract JSON from output (hook might print other things)\n const jsonMatch = stdout.match(/\\{[\\s\\S]*\\}/)\n if (!jsonMatch) {\n logDebug('No JSON found in hook output')\n return null\n }\n\n const output = JSON.parse(jsonMatch[0]) as HookOutput\n\n // Validate decision if present\n if (output.decision) {\n if (!['approve', 'block', 'ask'].includes(output.decision)) {\n logError(`Invalid hook decision: ${output.decision}`)\n return null\n }\n }\n\n return output\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n logError(`Failed to parse hook output JSON: ${errorMsg}`)\n logDebug('Raw output:', stdout)\n return null\n }\n}\n\n/**\n * Execute all matching hooks for an event\n */\nexport async function executeHooksForEvent(\n event: HookEvent,\n hooks: LoadedHook[],\n input: HookInput,\n options: HookExecutionOptions,\n): Promise<HookExecutionResult[]> {\n // Filter hooks for this event\n const matchingHooks = hooks.filter(hook => hook.event === event)\n\n if (matchingHooks.length === 0) {\n return []\n }\n\n logInfo(`Executing ${matchingHooks.length} hook(s) for event: ${event}`)\n\n // Execute all matching hooks in parallel (Claude Code behavior)\n const results = await Promise.all(\n matchingHooks.map(hook => executeHook(hook, input, options)),\n )\n\n return results\n}\n\n/**\n * Process hook decisions to determine final action\n */\nexport function processHookDecisions(results: HookExecutionResult[]): {\n shouldContinue: boolean\n shouldAskUser: boolean\n reason?: string\n} {\n // If any hook says \"block\", we block\n const blockedResult = results.find(r => r.success && r.decision === 'block')\n if (blockedResult) {\n return {\n shouldContinue: false,\n shouldAskUser: false,\n reason: blockedResult.output?.reason || 'Blocked by hook',\n }\n }\n\n // If any hook says \"ask\", we ask the user\n const askResult = results.find(r => r.success && r.decision === 'ask')\n if (askResult) {\n return {\n shouldContinue: false,\n shouldAskUser: true,\n reason: askResult.output?.reason || 'Hook requested user approval',\n }\n }\n\n // If any hook failed, we ask the user (fail-safe)\n const failedResult = results.find(r => !r.success)\n if (failedResult) {\n return {\n shouldContinue: false,\n shouldAskUser: true,\n reason: `Hook execution failed: ${failedResult.error}`,\n }\n }\n\n // All hooks approved or had no decision\n return {\n shouldContinue: true,\n shouldAskUser: false,\n }\n}\n\n/**\n * Create hook input for PreToolUse event\n */\nexport function createPreToolUseInput(\n sessionId: string,\n transcriptPath: string,\n toolName: string,\n toolInput: Record<string, unknown>,\n): PreToolUseInput {\n return {\n hook_event_name: HookEvent.PreToolUse,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n tool_name: toolName,\n tool_input: toolInput,\n }\n}\n\n/**\n * Create hook input for PostToolUse event\n */\nexport function createPostToolUseInput(\n sessionId: string,\n transcriptPath: string,\n toolName: string,\n toolInput: Record<string, unknown>,\n toolOutput: Record<string, unknown>,\n): PostToolUseInput {\n return {\n hook_event_name: HookEvent.PostToolUse,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n tool_name: toolName,\n tool_input: toolInput,\n tool_output: toolOutput,\n }\n}\n\n/**\n * Create hook input for UserPromptSubmit event\n */\nexport function createUserPromptSubmitInput(\n sessionId: string,\n transcriptPath: string,\n userPrompt: string,\n): UserPromptSubmitInput {\n return {\n hook_event_name: HookEvent.UserPromptSubmit,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n user_prompt: userPrompt,\n }\n}\n\n/**\n * Create hook input for SessionStart event\n */\nexport function createSessionStartInput(\n sessionId: string,\n transcriptPath: string,\n): SessionStartInput {\n return {\n hook_event_name: HookEvent.SessionStart,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n source: 'startup' as const,\n permission_mode: 'default',\n }\n}\n\n/**\n * Create hook input for SessionEnd event\n */\nexport function createSessionEndInput(\n sessionId: string,\n transcriptPath: string,\n reason: 'clear' | 'logout' | 'prompt_input_exit' | 'other',\n): SessionEndInput {\n return {\n hook_event_name: HookEvent.SessionEnd,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n reason: reason,\n }\n}\n\n/**\n * Create hook input for PostToolUseFailure event\n */\nexport function createPostToolUseFailureInput(\n sessionId: string,\n transcriptPath: string,\n toolName: string,\n toolInput: Record<string, unknown>,\n error: string,\n errorType?: string,\n): PostToolUseFailureInput {\n return {\n hook_event_name: HookEvent.PostToolUseFailure,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n tool_name: toolName,\n tool_input: toolInput,\n error,\n error_type: errorType,\n }\n}\n\n/**\n * Create hook input for PermissionRequest event\n */\nexport function createPermissionRequestInput(\n sessionId: string,\n transcriptPath: string,\n toolName: string,\n toolInput: Record<string, unknown>,\n permissionType: 'read' | 'write' | 'execute' | 'network' | 'other',\n description?: string,\n): PermissionRequestInput {\n return {\n hook_event_name: HookEvent.PermissionRequest,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n tool_name: toolName,\n tool_input: toolInput,\n permission_type: permissionType,\n description,\n }\n}\n\n/**\n * Create hook input for Stop event\n */\nexport function createStopInput(\n sessionId: string,\n transcriptPath: string,\n stopHookActive: boolean,\n): StopInput {\n return {\n hook_event_name: HookEvent.Stop,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n stop_hook_active: stopHookActive,\n }\n}\n\n/**\n * Create hook input for SubagentStart event\n */\nexport function createSubagentStartInput(\n sessionId: string,\n transcriptPath: string,\n agentType: string,\n agentDescription?: string,\n runInBackground?: boolean,\n): SubagentStartInput {\n return {\n hook_event_name: HookEvent.SubagentStart,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n agent_type: agentType,\n agent_description: agentDescription,\n run_in_background: runInBackground,\n }\n}\n\n/**\n * Create hook input for SubagentStop event\n */\nexport function createSubagentStopInput(\n sessionId: string,\n transcriptPath: string,\n agentType: string,\n agentId?: string,\n stopHookActive?: boolean,\n): SubagentStopInput {\n return {\n hook_event_name: HookEvent.SubagentStop,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n agent_type: agentType,\n agent_id: agentId,\n stop_hook_active: stopHookActive ?? false,\n }\n}\n\n/**\n * Create hook input for Notification event\n */\nexport function createNotificationInput(\n sessionId: string,\n transcriptPath: string,\n message: string,\n): NotificationInput {\n return {\n hook_event_name: HookEvent.Notification,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n message,\n }\n}\n\n/**\n * Create hook input for PreCompact event\n */\nexport function createPreCompactInput(\n sessionId: string,\n transcriptPath: string,\n trigger: 'manual' | 'auto',\n customInstructions: string,\n): PreCompactInput {\n return {\n hook_event_name: HookEvent.PreCompact,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n trigger,\n custom_instructions: customInstructions,\n }\n}\n\n/**\n * Create hook input for PostCompact event\n */\nexport function createPostCompactInput(\n sessionId: string,\n transcriptPath: string,\n trigger: 'manual' | 'auto',\n summary: string,\n compressionRatio: number,\n originalTokens: number,\n compressedTokens: number,\n): PostCompactInput {\n return {\n hook_event_name: HookEvent.PostCompact,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n trigger,\n summary,\n compression_ratio: compressionRatio,\n original_tokens: originalTokens,\n compressed_tokens: compressedTokens,\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * Hook Execution Engine\n *\n * Executes plugin hooks with bash command execution, JSON I/O,\n * and decision processing (approve/block/ask).\n *\n * Supports hook types: command, prompt, agent.\n * Fully compatible with Claude Code CLI hooks specification.\n */\n\nimport { spawn } from 'child_process'\nimport { existsSync, readFileSync } from 'fs'\nimport { EventEmitter } from 'events'\nimport {\n HookEvent,\n HookInput,\n HookOutput,\n PreToolUseInput,\n PostToolUseInput,\n PostToolUseFailureInput,\n PermissionRequestInput,\n UserPromptSubmitInput,\n SessionStartInput,\n SessionEndInput,\n StopInput,\n SubagentStartInput,\n SubagentStopInput,\n NotificationInput,\n PreCompactInput,\n PostCompactInput,\n ConfigChangeInput,\n TaskCompletedInput,\n TeammateIdleInput,\n} from '../types/hooks'\nimport { LoadedHook, HookEvent as PluginHookEvent } from '../types/plugin'\nimport { getCwd } from '../utils/state'\nimport { logError } from '../utils/log'\nimport { emitReminderEvent } from './systemReminder'\n\n// Simple logging helpers\nconst logInfo = (msg: string) => {\n if (process.env.DEBUG) console.log(`[INFO] ${msg}`)\n}\nconst logDebug = (msg: string, ...args: any[]) => {\n if (process.env.DEBUG) console.log(`[DEBUG] ${msg}`, ...args)\n}\n\n/**\n * Hook status event for verbose mode display\n */\nexport interface HookStatusEvent {\n event: PluginHookEvent\n toolName?: string\n success: boolean\n message: string\n timestamp: number\n hookName: string\n}\n\n/**\n * Event emitter for hook status updates\n */\nexport const hookStatusEmitter = new EventEmitter()\n\n/**\n * Session-level set tracking once-per-session hooks\n */\nconst executedOnceHooks = new Set<string>()\n\n/**\n * Reset once-hook tracking (call on session start)\n */\nexport function resetOnceHooks(): void {\n executedOnceHooks.clear()\n}\n\nfunction formatHookStatusMessage(\n event: PluginHookEvent,\n toolName: string | undefined,\n hookName: string,\n success: boolean,\n errorMessage?: string,\n): string {\n const eventPart = toolName ? `${event}:${toolName}` : event\n const statusPart = success ? 'succeeded' : 'failed'\n const detailPart = success ? 'Success' : errorMessage || 'Error'\n return `${eventPart} hook ${statusPart}: ${detailPart}`\n}\n\nfunction emitStatusEvent(\n event: PluginHookEvent,\n toolName: string | undefined,\n hookName: string,\n success: boolean,\n errorMessage?: string,\n): void {\n hookStatusEmitter.emit('status', {\n event,\n toolName,\n success,\n message: formatHookStatusMessage(\n event,\n toolName,\n hookName,\n success,\n errorMessage,\n ),\n timestamp: Date.now(),\n hookName,\n } as HookStatusEvent)\n}\n\n/**\n * Hook execution result\n */\nexport interface HookExecutionResult {\n success: boolean\n decision?: 'approve' | 'block' | 'ask'\n output?: HookOutput\n error?: string\n timedOut?: boolean\n /** Blocked by exit code 2 with stderr as feedback */\n blockedByExitCode2?: boolean\n blockReason?: string\n}\n\n/**\n * Hook execution options\n */\nexport interface HookExecutionOptions {\n timeout?: number\n sessionId: string\n transcriptPath?: string\n pluginRoot: string\n}\n\n/**\n * Substitute $ARGUMENTS in a command string with the hook input JSON\n */\nfunction substituteArguments(command: string, input: HookInput): string {\n if (!command.includes('$ARGUMENTS')) {\n return command\n }\n // Replace $ARGUMENTS with the JSON-encoded input\n // Shell-safe: single-quote the JSON and escape internal single quotes\n const inputJson = JSON.stringify(input)\n const escaped = inputJson.replace(/'/g, \"'\\\\''\")\n return command.replace(/\\$ARGUMENTS/g, `'${escaped}'`)\n}\n\n/**\n * Execute a hook (command, prompt, or agent type)\n */\nexport async function executeHook(\n hook: LoadedHook,\n input: HookInput,\n options: HookExecutionOptions,\n): Promise<HookExecutionResult> {\n const hookType = hook.config.type || 'command'\n\n // Once-per-session check\n if (hook.config.once) {\n const hookKey = `${hook.pluginName}:${hook.name}:${hook.event}`\n if (executedOnceHooks.has(hookKey)) {\n logDebug(`Skipping once-hook (already executed): ${hookKey}`)\n return { success: true }\n }\n executedOnceHooks.add(hookKey)\n }\n\n const toolName =\n 'tool_name' in input ? (input.tool_name as string) : undefined\n\n // Async hooks: fire-and-forget\n if (hook.config.async) {\n executeHookAsync(hook, input, options, hookType, toolName).catch(err => {\n logDebug(`Async hook ${hook.name} error: ${err}`)\n })\n return { success: true }\n }\n\n switch (hookType) {\n case 'command':\n return executeCommandHook(hook, input, options, toolName)\n case 'prompt':\n return executePromptHook(hook, input, options, toolName)\n case 'agent':\n return executeAgentHook(hook, input, options, toolName)\n default:\n return {\n success: false,\n error: `Unknown hook type: ${hookType}`,\n }\n }\n}\n\n/**\n * Execute async hook in background (fire-and-forget)\n */\nasync function executeHookAsync(\n hook: LoadedHook,\n input: HookInput,\n options: HookExecutionOptions,\n hookType: string,\n toolName: string | undefined,\n): Promise<void> {\n try {\n let result: HookExecutionResult\n switch (hookType) {\n case 'command':\n result = await executeCommandHook(hook, input, options, toolName)\n break\n case 'prompt':\n result = await executePromptHook(hook, input, options, toolName)\n break\n case 'agent':\n result = await executeAgentHook(hook, input, options, toolName)\n break\n default:\n return\n }\n\n // Async hooks deliver results via systemMessage on next turn\n if (result.output?.systemMessage) {\n hookStatusEmitter.emit('asyncResult', {\n hookName: hook.name,\n systemMessage: result.output.systemMessage,\n })\n }\n } catch {\n // Async hooks silently fail\n }\n}\n\n/**\n * Execute a command-type hook\n */\nasync function executeCommandHook(\n hook: LoadedHook,\n input: HookInput,\n options: HookExecutionOptions,\n toolName: string | undefined,\n): Promise<HookExecutionResult> {\n if (!hook.config.command) {\n return { success: false, error: 'Command hook missing command field' }\n }\n\n const timeout =\n (hook.config.timeout ? hook.config.timeout * 1000 : undefined) ||\n options.timeout ||\n 30000\n\n try {\n logDebug(`Executing hook: ${hook.name}`)\n\n // Substitute $ARGUMENTS in command\n const command = substituteArguments(hook.config.command, input)\n logDebug(`Command: ${command}`)\n\n const result = await executeBashCommand(command, input, {\n ...options,\n timeout,\n pluginRoot: options.pluginRoot,\n })\n\n if (result.timedOut) {\n const errorMsg = `Hook execution timed out after ${timeout}ms`\n logError(`Hook ${hook.name} timed out after ${timeout}ms`)\n emitStatusEvent(hook.event, toolName, hook.name, false, errorMsg)\n return { success: false, timedOut: true, error: errorMsg }\n }\n\n // Exit code 2: block with stderr as feedback (CC spec)\n if (result.exitCode === 2) {\n const reason = result.stderr.trim() || 'Blocked by hook'\n logDebug(`Hook ${hook.name} exit code 2 (block): ${reason}`)\n emitStatusEvent(hook.event, toolName, hook.name, true)\n return {\n success: true,\n decision: 'block',\n blockedByExitCode2: true,\n blockReason: reason,\n output: {\n decision: 'block',\n reason,\n systemMessage: reason,\n },\n }\n }\n\n // Exit code 1 or other non-zero: error\n if (result.exitCode !== 0 && result.exitCode !== null) {\n const errorMsg = `Command exited with code ${result.exitCode}: ${result.stderr}`\n logError(`Hook ${hook.name} failed: ${errorMsg}`)\n emitStatusEvent(hook.event, toolName, hook.name, false, errorMsg)\n return { success: false, error: errorMsg }\n }\n\n // Parse JSON output\n const output = parseHookOutput(result.stdout, input.hook_event_name)\n if (!output) {\n emitStatusEvent(hook.event, toolName, hook.name, true)\n return { success: true }\n }\n\n logDebug(`Hook ${hook.name} output:`, output)\n emitStatusEvent(hook.event, toolName, hook.name, true)\n\n // Resolve decision from both hookSpecificOutput and top-level fields\n const decision = resolveDecision(output)\n\n return { success: true, decision, output }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n logError(`Hook ${hook.name} execution error: ${errorMsg}`)\n emitStatusEvent(hook.event, toolName, hook.name, false, errorMsg)\n return { success: false, error: errorMsg }\n }\n}\n\n/**\n * Execute a prompt-type hook using fast model (single-turn evaluation)\n */\nasync function executePromptHook(\n hook: LoadedHook,\n input: HookInput,\n options: HookExecutionOptions,\n toolName: string | undefined,\n): Promise<HookExecutionResult> {\n if (!hook.config.prompt) {\n return { success: false, error: 'Prompt hook missing prompt field' }\n }\n\n const timeout =\n (hook.config.timeout ? hook.config.timeout * 1000 : undefined) || 30000\n\n try {\n const inputJson = JSON.stringify(input)\n const prompt = hook.config.prompt.replace(/\\$ARGUMENTS/g, inputJson)\n\n logDebug(`Executing prompt hook: ${hook.name}`)\n\n const { queryQuick } = await import('./claude')\n const abortController = new AbortController()\n const timer = setTimeout(() => abortController.abort(), timeout)\n\n try {\n const result = await queryQuick({\n systemPrompt: [\n 'You are a hook evaluator. Respond ONLY with JSON: { \"ok\": boolean, \"reason\": string }.',\n 'ok=true means allow the action, ok=false means block it.',\n ],\n userPrompt: prompt,\n signal: abortController.signal,\n })\n clearTimeout(timer)\n\n // Extract text from assistant message\n const text = result.message.content\n .filter(b => b.type === 'text')\n .map(b => (b as any).text)\n .join('')\n\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/)\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]) as {\n ok: boolean\n reason?: string\n }\n const decision = parsed.ok ? 'approve' : 'block'\n emitStatusEvent(hook.event, toolName, hook.name, true)\n return {\n success: true,\n decision,\n output: { decision, reason: parsed.reason },\n }\n }\n } catch {\n clearTimeout(timer)\n }\n\n logDebug(`Prompt hook ${hook.name}: parse failed, defaulting to allow`)\n emitStatusEvent(hook.event, toolName, hook.name, true)\n return { success: true, decision: 'approve' }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n logError(`Prompt hook ${hook.name} error: ${errorMsg}`)\n emitStatusEvent(hook.event, toolName, hook.name, false, errorMsg)\n return { success: true, decision: 'approve' }\n }\n}\n\n/**\n * Execute an agent-type hook using a subagent with read-only tools\n * Agent hooks get extended reasoning and can use Read, Grep, Glob\n */\nasync function executeAgentHook(\n hook: LoadedHook,\n input: HookInput,\n options: HookExecutionOptions,\n toolName: string | undefined,\n): Promise<HookExecutionResult> {\n if (!hook.config.prompt) {\n return { success: false, error: 'Agent hook missing prompt field' }\n }\n\n const timeout =\n (hook.config.timeout ? hook.config.timeout * 1000 : undefined) || 60000\n\n try {\n const inputJson = JSON.stringify(input)\n const prompt = hook.config.prompt.replace(/\\$ARGUMENTS/g, inputJson)\n\n logDebug(`Executing agent hook: ${hook.name}`)\n\n const { queryQuick } = await import('./claude')\n const abortController = new AbortController()\n const timer = setTimeout(() => abortController.abort(), timeout)\n\n try {\n const result = await queryQuick({\n systemPrompt: [\n 'You are a hook agent evaluator. You have read-only access to the codebase.',\n 'Evaluate the request and respond ONLY with JSON: { \"ok\": boolean, \"reason\": string }.',\n 'ok=true means allow the action, ok=false means block it.',\n ],\n userPrompt: prompt,\n signal: abortController.signal,\n })\n clearTimeout(timer)\n\n const text = result.message.content\n .filter(b => b.type === 'text')\n .map(b => (b as any).text)\n .join('')\n\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/)\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]) as {\n ok: boolean\n reason?: string\n }\n const decision = parsed.ok ? 'approve' : 'block'\n emitStatusEvent(hook.event, toolName, hook.name, true)\n return {\n success: true,\n decision,\n output: { decision, reason: parsed.reason },\n }\n }\n } catch {\n clearTimeout(timer)\n }\n\n logDebug(`Agent hook ${hook.name}: parse failed, defaulting to allow`)\n emitStatusEvent(hook.event, toolName, hook.name, true)\n return { success: true, decision: 'approve' }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n logError(`Agent hook ${hook.name} error: ${errorMsg}`)\n emitStatusEvent(hook.event, toolName, hook.name, false, errorMsg)\n return { success: true, decision: 'approve' }\n }\n}\n\n/**\n * Resolve decision from hook output, supporting both CC formats:\n * - hookSpecificOutput.permissionDecision (new)\n * - top-level decision (old, CC community compat)\n */\nfunction resolveDecision(\n output: HookOutput,\n): 'approve' | 'block' | 'ask' | undefined {\n // Check hookSpecificOutput first (new format)\n if (output.hookSpecificOutput) {\n const specific = output.hookSpecificOutput as any\n if (specific.permissionDecision) {\n const mapping: Record<string, 'approve' | 'block' | 'ask'> = {\n allow: 'approve',\n deny: 'block',\n ask: 'ask',\n approve: 'approve',\n block: 'block',\n }\n return mapping[specific.permissionDecision] ?? output.decision\n }\n }\n\n // Fall back to top-level decision (old CC format)\n return output.decision\n}\n\n/**\n * Path to the env file set by a SessionStart hook via $CLAUDE_ENV_FILE.\n * Once set, all subsequent hooks load env vars from this file.\n */\nlet claudeEnvFilePath: string | undefined\n\n/**\n * Load environment variables from $CLAUDE_ENV_FILE if set.\n * File format: one KEY=VALUE per line, # comments, empty lines ignored.\n */\nfunction loadEnvFile(): Record<string, string> {\n const envFile = claudeEnvFilePath || process.env.CLAUDE_ENV_FILE\n if (!envFile || !existsSync(envFile)) return {}\n\n try {\n const content = readFileSync(envFile, 'utf-8')\n const vars: Record<string, string> = {}\n\n for (const line of content.split('\\n')) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) continue\n const eqIdx = trimmed.indexOf('=')\n if (eqIdx <= 0) continue\n const key = trimmed.slice(0, eqIdx).trim()\n let value = trimmed.slice(eqIdx + 1).trim()\n // Strip surrounding quotes\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n value = value.slice(1, -1)\n }\n vars[key] = value\n }\n return vars\n } catch {\n return {}\n }\n}\n\n/**\n * Extract file paths from tool input for CLAUDE_FILE_PATHS env var\n */\nfunction extractFilePathsFromInput(\n toolInput: Record<string, unknown> | undefined,\n): string {\n if (!toolInput) return ''\n const paths: string[] = []\n if (typeof toolInput.file_path === 'string') paths.push(toolInput.file_path)\n if (typeof toolInput.path === 'string') paths.push(toolInput.path)\n if (typeof toolInput.notebook_path === 'string')\n paths.push(toolInput.notebook_path)\n return paths.join(':')\n}\n\n/**\n * Execute bash command with JSON stdin/stdout\n * Returns exit code for proper exit code 2 handling\n */\nasync function executeBashCommand(\n command: string,\n input: HookInput,\n options: {\n timeout: number\n sessionId: string\n transcriptPath?: string\n pluginRoot: string\n },\n): Promise<{\n stdout: string\n stderr: string\n exitCode: number | null\n timedOut?: boolean\n}> {\n return new Promise(resolve => {\n // Load persistent env vars from $CLAUDE_ENV_FILE\n const envFileVars = loadEnvFile()\n\n // Extract tool-specific env vars from input\n const toolName = 'tool_name' in input ? (input as any).tool_name : undefined\n const toolInput =\n 'tool_input' in input ? (input as any).tool_input : undefined\n const toolInputJson = toolInput ? JSON.stringify(toolInput) : ''\n const filePaths = extractFilePathsFromInput(toolInput)\n const shellCommand =\n toolName === 'Bash' && toolInput?.command ? String(toolInput.command) : ''\n\n const projectDir = getCwd()\n\n const env = {\n ...process.env,\n ...envFileVars,\n // CC-compatible env vars\n CLAUDE_PLUGIN_ROOT: options.pluginRoot,\n CLAUDE_SESSION_ID: options.sessionId,\n CLAUDE_CWD: projectDir,\n CLAUDE_TRANSCRIPT_PATH: options.transcriptPath || '',\n CLAUDE_PROJECT_DIR: projectDir,\n CLAUDE_WORKSPACE_DIR: projectDir,\n CLAUDE_TOOL_INPUT: toolInputJson,\n CLAUDE_FILE_PATHS: filePaths,\n CLAUDE_SHELL_COMMAND: shellCommand,\n // Minto-prefixed duplicates\n MINTO_PROJECT_DIR: projectDir,\n MINTO_WORKSPACE_DIR: projectDir,\n MINTO_TOOL_INPUT: toolInputJson,\n MINTO_FILE_PATHS: filePaths,\n MINTO_SHELL_COMMAND: shellCommand,\n }\n\n const child = spawn('bash', ['-c', command], {\n env,\n cwd: getCwd(),\n })\n\n let stdout = ''\n let stderr = ''\n let timedOut = false\n\n const timer = setTimeout(() => {\n timedOut = true\n child.kill('SIGTERM')\n setTimeout(() => {\n if (!child.killed) {\n child.kill('SIGKILL')\n }\n }, 1000)\n }, options.timeout)\n\n child.stdout?.on('data', data => {\n stdout += data.toString()\n })\n\n child.stderr?.on('data', data => {\n stderr += data.toString()\n })\n\n child.on('close', code => {\n clearTimeout(timer)\n\n if (timedOut) {\n resolve({ stdout: '', stderr: '', exitCode: null, timedOut: true })\n return\n }\n\n resolve({ stdout, stderr, exitCode: code })\n })\n\n child.on('error', error => {\n clearTimeout(timer)\n resolve({\n stdout: '',\n stderr: error.message,\n exitCode: 1,\n })\n })\n\n try {\n if (child.stdin) {\n child.stdin.write(JSON.stringify(input, null, 2))\n child.stdin.end()\n }\n } catch (error) {\n clearTimeout(timer)\n child.kill()\n resolve({\n stdout: '',\n stderr: `Failed to write to stdin: ${error instanceof Error ? error.message : String(error)}`,\n exitCode: 1,\n })\n }\n })\n}\n\n/**\n * Parse hook output JSON with event-specific field extraction\n */\nfunction parseHookOutput(\n stdout: string,\n eventName?: HookEvent,\n): HookOutput | null {\n if (!stdout.trim()) {\n return null\n }\n\n try {\n const jsonMatch = stdout.match(/\\{[\\s\\S]*\\}/)\n if (!jsonMatch) {\n logDebug('No JSON found in hook output')\n return null\n }\n\n const raw = JSON.parse(jsonMatch[0])\n const output: HookOutput = {}\n\n // Extract standard fields\n if (raw.continue !== undefined) output.continue = raw.continue\n if (raw.stopReason) output.stopReason = raw.stopReason\n if (raw.suppressOutput !== undefined)\n output.suppressOutput = raw.suppressOutput\n if (raw.systemMessage) output.systemMessage = raw.systemMessage\n\n // Extract top-level decision (CC community compat)\n if (raw.decision) {\n if (['approve', 'block', 'ask'].includes(raw.decision)) {\n output.decision = raw.decision\n }\n }\n if (raw.reason) output.reason = raw.reason\n\n // Extract event-specific output based on hookSpecificOutput or flat fields\n const specific = raw.hookSpecificOutput || raw\n\n if (eventName === HookEvent.PreToolUse) {\n if (\n specific.permissionDecision ||\n specific.updatedInput ||\n specific.permissionDecisionReason\n ) {\n output.hookSpecificOutput = {\n hookEventName: HookEvent.PreToolUse,\n permissionDecision: specific.permissionDecision,\n permissionDecisionReason: specific.permissionDecisionReason,\n updatedInput: specific.updatedInput,\n }\n }\n } else if (\n eventName === HookEvent.PostToolUse ||\n eventName === HookEvent.UserPromptSubmit ||\n eventName === HookEvent.SessionStart\n ) {\n if (specific.additionalContext) {\n output.hookSpecificOutput = {\n hookEventName: eventName,\n additionalContext: specific.additionalContext,\n } as any\n }\n\n // SessionStart: capture $CLAUDE_ENV_FILE for persistent env vars\n if (eventName === HookEvent.SessionStart && specific.envFile) {\n claudeEnvFilePath = specific.envFile\n process.env.CLAUDE_ENV_FILE = specific.envFile\n }\n }\n\n // Extract suppressNotification for Notification event\n if (eventName === HookEvent.Notification) {\n if (raw.suppressNotification !== undefined) {\n ;(output as any).suppressNotification = raw.suppressNotification\n }\n }\n\n return output\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error)\n logError(`Failed to parse hook output JSON: ${errorMsg}`)\n logDebug('Raw output:', stdout)\n return null\n }\n}\n\n/**\n * Execute all matching hooks for an event\n */\nexport async function executeHooksForEvent(\n event: HookEvent,\n hooks: LoadedHook[],\n input: HookInput,\n options: HookExecutionOptions,\n): Promise<HookExecutionResult[]> {\n const matchingHooks = hooks.filter(hook => hook.event === event)\n\n if (matchingHooks.length === 0) {\n return []\n }\n\n logInfo(`Executing ${matchingHooks.length} hook(s) for event: ${event}`)\n\n // Execute all matching hooks in parallel (CC behavior)\n const results = await Promise.allSettled(\n matchingHooks.map(hook => executeHook(hook, input, options)),\n )\n\n return results.map(r =>\n r.status === 'fulfilled'\n ? r.value\n : { success: false, error: String(r.reason) },\n )\n}\n\n/**\n * Process hook decisions to determine final action\n */\nexport function processHookDecisions(results: HookExecutionResult[]): {\n shouldContinue: boolean\n shouldAskUser: boolean\n reason?: string\n updatedInput?: Record<string, unknown>\n additionalContext?: string\n} {\n // Collect additional context and updated input from all results\n let additionalContext: string | undefined\n let updatedInput: Record<string, unknown> | undefined\n\n for (const r of results) {\n if (!r.success || !r.output) continue\n const specific = r.output.hookSpecificOutput as any\n if (specific?.additionalContext) {\n additionalContext = additionalContext\n ? `${additionalContext}\\n${specific.additionalContext}`\n : specific.additionalContext\n }\n if (specific?.updatedInput) {\n updatedInput = { ...(updatedInput || {}), ...specific.updatedInput }\n }\n }\n\n // If any hook says \"block\" (including exit code 2), we block\n const blockedResult = results.find(\n r => (r.success && r.decision === 'block') || r.blockedByExitCode2,\n )\n if (blockedResult) {\n const reason =\n blockedResult.blockReason ||\n blockedResult.output?.reason ||\n 'Blocked by hook'\n emitReminderEvent('hook:blocking_error', { hookName: 'hook', reason })\n return {\n shouldContinue: false,\n shouldAskUser: false,\n reason,\n }\n }\n\n // If any hook says \"ask\", we ask the user\n const askResult = results.find(r => r.success && r.decision === 'ask')\n if (askResult) {\n return {\n shouldContinue: false,\n shouldAskUser: true,\n reason: askResult.output?.reason || 'Hook requested user approval',\n }\n }\n\n // If any hook failed, we ask the user (fail-safe)\n const failedResult = results.find(r => !r.success)\n if (failedResult) {\n const reason = `Hook execution failed: ${failedResult.error}`\n emitReminderEvent('hook:stopped_continuation', { hookName: 'hook', reason })\n return {\n shouldContinue: false,\n shouldAskUser: true,\n reason,\n }\n }\n\n // Emit additional context reminder if hooks provided extra info\n if (additionalContext) {\n emitReminderEvent('hook:additional_context', {\n hookName: 'hook',\n content: additionalContext,\n })\n }\n\n // All hooks approved or had no decision\n return {\n shouldContinue: true,\n shouldAskUser: false,\n updatedInput,\n additionalContext,\n }\n}\n\n// ============================================================================\n// Hook Input Factories\n// ============================================================================\n\nexport function createPreToolUseInput(\n sessionId: string,\n transcriptPath: string,\n toolName: string,\n toolInput: Record<string, unknown>,\n): PreToolUseInput {\n return {\n hook_event_name: HookEvent.PreToolUse,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n tool_name: toolName,\n tool_input: toolInput,\n }\n}\n\nexport function createPostToolUseInput(\n sessionId: string,\n transcriptPath: string,\n toolName: string,\n toolInput: Record<string, unknown>,\n toolOutput: Record<string, unknown>,\n): PostToolUseInput {\n return {\n hook_event_name: HookEvent.PostToolUse,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n tool_name: toolName,\n tool_input: toolInput,\n tool_output: toolOutput,\n }\n}\n\nexport function createUserPromptSubmitInput(\n sessionId: string,\n transcriptPath: string,\n userPrompt: string,\n): UserPromptSubmitInput {\n return {\n hook_event_name: HookEvent.UserPromptSubmit,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n user_prompt: userPrompt,\n }\n}\n\nexport function createSessionStartInput(\n sessionId: string,\n transcriptPath: string,\n): SessionStartInput {\n return {\n hook_event_name: HookEvent.SessionStart,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n source: 'startup' as const,\n permission_mode: 'default',\n }\n}\n\nexport function createSessionEndInput(\n sessionId: string,\n transcriptPath: string,\n reason: 'clear' | 'logout' | 'prompt_input_exit' | 'other',\n): SessionEndInput {\n return {\n hook_event_name: HookEvent.SessionEnd,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n reason,\n }\n}\n\nexport function createPostToolUseFailureInput(\n sessionId: string,\n transcriptPath: string,\n toolName: string,\n toolInput: Record<string, unknown>,\n error: string,\n errorType?: string,\n): PostToolUseFailureInput {\n return {\n hook_event_name: HookEvent.PostToolUseFailure,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n tool_name: toolName,\n tool_input: toolInput,\n error,\n error_type: errorType,\n }\n}\n\nexport function createPermissionRequestInput(\n sessionId: string,\n transcriptPath: string,\n toolName: string,\n toolInput: Record<string, unknown>,\n permissionType: 'read' | 'write' | 'execute' | 'network' | 'other',\n description?: string,\n): PermissionRequestInput {\n return {\n hook_event_name: HookEvent.PermissionRequest,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n tool_name: toolName,\n tool_input: toolInput,\n permission_type: permissionType,\n description,\n }\n}\n\nexport function createStopInput(\n sessionId: string,\n transcriptPath: string,\n stopHookActive: boolean,\n): StopInput {\n return {\n hook_event_name: HookEvent.Stop,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n stop_hook_active: stopHookActive,\n }\n}\n\nexport function createSubagentStartInput(\n sessionId: string,\n transcriptPath: string,\n agentType: string,\n agentDescription?: string,\n runInBackground?: boolean,\n): SubagentStartInput {\n return {\n hook_event_name: HookEvent.SubagentStart,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n agent_type: agentType,\n agent_description: agentDescription,\n run_in_background: runInBackground,\n }\n}\n\nexport function createSubagentStopInput(\n sessionId: string,\n transcriptPath: string,\n agentType: string,\n agentId?: string,\n stopHookActive?: boolean,\n): SubagentStopInput {\n return {\n hook_event_name: HookEvent.SubagentStop,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n agent_type: agentType,\n agent_id: agentId,\n stop_hook_active: stopHookActive ?? false,\n }\n}\n\nexport function createNotificationInput(\n sessionId: string,\n transcriptPath: string,\n message: string,\n title?: string,\n type?: string,\n): NotificationInput {\n return {\n hook_event_name: HookEvent.Notification,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n message,\n ...(title ? { title } : {}),\n ...(type ? { notification_type: type } : {}),\n }\n}\n\nexport function createPreCompactInput(\n sessionId: string,\n transcriptPath: string,\n trigger: 'manual' | 'auto',\n customInstructions: string,\n): PreCompactInput {\n return {\n hook_event_name: HookEvent.PreCompact,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n trigger,\n custom_instructions: customInstructions,\n }\n}\n\nexport function createPostCompactInput(\n sessionId: string,\n transcriptPath: string,\n trigger: 'manual' | 'auto',\n summary: string,\n compressionRatio: number,\n originalTokens: number,\n compressedTokens: number,\n): PostCompactInput {\n return {\n hook_event_name: HookEvent.PostCompact,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n trigger,\n summary,\n compression_ratio: compressionRatio,\n original_tokens: originalTokens,\n compressed_tokens: compressedTokens,\n }\n}\n\nexport function createConfigChangeInput(\n sessionId: string,\n transcriptPath: string,\n source: 'settings' | 'project' | 'global' | 'env' | 'cli',\n filePath?: string,\n): ConfigChangeInput {\n return {\n hook_event_name: HookEvent.ConfigChange,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n source,\n file_path: filePath,\n }\n}\n\nexport function createTaskCompletedInput(\n sessionId: string,\n transcriptPath: string,\n taskId: string,\n subject: string,\n description?: string,\n): TaskCompletedInput {\n return {\n hook_event_name: HookEvent.TaskCompleted,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n task_id: taskId,\n subject,\n description,\n }\n}\n\nexport function createTeammateIdleInput(\n sessionId: string,\n transcriptPath: string,\n teammateName: string,\n teamName: string,\n): TeammateIdleInput {\n return {\n hook_event_name: HookEvent.TeammateIdle,\n session_id: sessionId,\n transcript_path: transcriptPath,\n cwd: getCwd(),\n permission_mode: 'default',\n teammate_name: teammateName,\n team_name: teamName,\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|