@within-7/minto 0.3.9 → 0.4.0
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 +461 -657
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/agents/types.js +1 -0
- package/dist/commands/agents/types.js.map +2 -2
- package/dist/commands/agents/utils/fileOperations.js +96 -36
- package/dist/commands/agents/utils/fileOperations.js.map +3 -3
- package/dist/commands/agents/utils/index.js +3 -1
- package/dist/commands/agents/utils/index.js.map +2 -2
- package/dist/commands/context.js +54 -23
- package/dist/commands/context.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 +684 -94
- 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/language.js +19 -46
- package/dist/commands/language.js.map +2 -2
- package/dist/commands/mcp-interactive.js +425 -217
- 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 +457 -65
- 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/permissions.js +75 -49
- package/dist/commands/permissions.js.map +2 -2
- package/dist/commands/plugin/utils.js +33 -1
- package/dist/commands/plugin/utils.js.map +2 -2
- package/dist/commands/plugin.js +891 -185
- package/dist/commands/plugin.js.map +3 -3
- package/dist/commands/refreshCommands.js +2 -0
- package/dist/commands/refreshCommands.js.map +2 -2
- package/dist/commands/resume.js +1 -1
- package/dist/commands/resume.js.map +1 -1
- package/dist/commands/review.js +51 -0
- package/dist/commands/review.js.map +7 -0
- package/dist/commands/sandbox.js +168 -70
- package/dist/commands/sandbox.js.map +2 -2
- package/dist/commands/setup.js +593 -107
- package/dist/commands/setup.js.map +2 -2
- package/dist/commands/stats.js +188 -131
- package/dist/commands/stats.js.map +2 -2
- package/dist/commands/status.js +75 -13
- package/dist/commands/status.js.map +2 -2
- package/dist/commands/terminalSetup.js +6 -0
- package/dist/commands/terminalSetup.js.map +2 -2
- package/dist/commands/undo.js +146 -174
- 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/Help.js +165 -32
- package/dist/components/Help.js.map +2 -2
- package/dist/components/HighlightedCode.js +1 -0
- package/dist/components/HighlightedCode.js.map +2 -2
- package/dist/components/InfoPanel/InfoPanel.js +123 -0
- package/dist/components/InfoPanel/InfoPanel.js.map +7 -0
- package/dist/components/InfoPanel/index.js +5 -0
- package/dist/components/InfoPanel/index.js.map +7 -0
- package/dist/components/InfoPanel/types.js +1 -0
- package/dist/components/InfoPanel/types.js.map +7 -0
- package/dist/components/ModelSelector/BrandTextInput.js +43 -0
- package/dist/components/ModelSelector/BrandTextInput.js.map +7 -0
- package/dist/components/ModelSelector/ModelSelector.js +590 -565
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/ModelSelector/WizardContainer.js +45 -0
- package/dist/components/ModelSelector/WizardContainer.js.map +7 -0
- package/dist/components/ModelSelector/index.js +1 -3
- package/dist/components/ModelSelector/index.js.map +2 -2
- package/dist/components/PromptInput.js +26 -11
- 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/SimpleSelector/SimpleSelector.js +154 -0
- package/dist/components/SimpleSelector/SimpleSelector.js.map +7 -0
- package/dist/components/SimpleSelector/index.js +5 -0
- package/dist/components/SimpleSelector/index.js.map +7 -0
- package/dist/components/SimpleSelector/types.js +1 -0
- package/dist/components/SimpleSelector/types.js.map +7 -0
- 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/StatusOverlayContent.js +21 -0
- package/dist/components/StatusOverlayContent.js.map +7 -0
- package/dist/components/SubagentBlock.js +43 -6
- package/dist/components/SubagentBlock.js.map +2 -2
- package/dist/components/TabbedListView/ScrollableList.js +31 -5
- package/dist/components/TabbedListView/ScrollableList.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 +123 -48
- 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 +29 -0
- package/dist/core/backupHook.js.map +7 -0
- package/dist/core/config/defaults.js +11 -2
- package/dist/core/config/defaults.js.map +2 -2
- package/dist/core/config/schema.js +21 -3
- package/dist/core/config/schema.js.map +2 -2
- package/dist/core/costTracker.js +18 -16
- 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/cost-tracker.js +0 -16
- package/dist/cost-tracker.js.map +2 -2
- package/dist/entrypoints/bootstrap.js +3 -1
- package/dist/entrypoints/bootstrap.js.map +2 -2
- package/dist/entrypoints/cli.js +81 -68
- 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 +299 -1
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.js +300 -2
- 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/customCommands.js +30 -8
- package/dist/services/customCommands.js.map +2 -2
- 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/lspServers.js +1 -1
- package/dist/services/plugins/lspServers.js.map +2 -2
- package/dist/services/plugins/pluginRuntime.js +2 -1
- package/dist/services/plugins/pluginRuntime.js.map +2 -2
- package/dist/services/plugins/pluginValidation.js +10 -3
- package/dist/services/plugins/pluginValidation.js.map +2 -2
- package/dist/services/plugins/skillMarketplace.js +20 -9
- 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 +367 -9
- 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 +8 -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 +10 -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 +7 -0
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js +2 -0
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
- 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 +84 -11
- 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 +3 -5
- package/dist/types/plugin.js.map +2 -2
- package/dist/utils/agentHookExecutor.js +1 -4
- package/dist/utils/agentHookExecutor.js.map +2 -2
- package/dist/utils/agentLoader.js +91 -15
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/agentMemory.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/claudeCodeSync.js +439 -0
- package/dist/utils/claudeCodeSync.js.map +7 -0
- package/dist/utils/config.js +27 -151
- 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/execFileNoThrow.js +2 -1
- package/dist/utils/execFileNoThrow.js.map +2 -2
- 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/marketplaceManager.js +80 -43
- package/dist/utils/marketplaceManager.js.map +2 -2
- package/dist/utils/memoizeWithTTL.js +25 -0
- package/dist/utils/memoizeWithTTL.js.map +7 -0
- package/dist/utils/messages.js +2 -2
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/model.js +34 -9
- package/dist/utils/model.js.map +2 -2
- package/dist/utils/pluginInstaller.js +68 -29
- package/dist/utils/pluginInstaller.js.map +2 -2
- package/dist/utils/pluginLoader.js +249 -57
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/repoFetcher.js +110 -0
- package/dist/utils/repoFetcher.js.map +7 -0
- package/dist/utils/safeFetch.js +45 -0
- package/dist/utils/safeFetch.js.map +7 -0
- package/dist/utils/skillLoader.js +77 -12
- 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/stringSubstitution.js +4 -5
- package/dist/utils/stringSubstitution.js.map +2 -2
- package/dist/utils/style.js +6 -3
- package/dist/utils/style.js.map +2 -2
- package/dist/utils/teamConfig.js +162 -16
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/terminal.js +1 -1
- package/dist/utils/terminal.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
|
@@ -8,7 +8,8 @@ const duckDuckGoSearchProvider = {
|
|
|
8
8
|
{
|
|
9
9
|
headers: {
|
|
10
10
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
|
|
11
|
-
}
|
|
11
|
+
},
|
|
12
|
+
signal: AbortSignal.timeout(3e4)
|
|
12
13
|
}
|
|
13
14
|
);
|
|
14
15
|
if (!response.ok) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/tools/WebSearchTool/searchProviders.ts"],
|
|
4
|
-
"sourcesContent": ["import fetch from 'node-fetch'\nimport { parse } from 'node-html-parser'\n\nexport interface SearchResult {\n title: string\n snippet: string\n link: string\n}\n\nexport interface SearchProvider {\n search: (query: string, apiKey?: string) => Promise<SearchResult[]>\n isEnabled: (apiKey?: string) => boolean\n}\n\nconst duckDuckGoSearchProvider: SearchProvider = {\n isEnabled: () => true,\n search: async (query: string): Promise<SearchResult[]> => {\n const response = await fetch(\n `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`,\n {\n headers: {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',\n },\n },\n )\n\n if (!response.ok) {\n throw new Error(\n `DuckDuckGo search failed with status: ${response.status}`,\n )\n }\n\n const html = await response.text()\n const root = parse(html)\n const results: SearchResult[] = []\n\n const resultNodes = root.querySelectorAll('.result.web-result')\n\n for (const node of resultNodes) {\n const titleNode = node.querySelector('.result__a')\n const snippetNode = node.querySelector('.result__snippet')\n\n if (titleNode && snippetNode) {\n const title = titleNode.text\n const link = titleNode.getAttribute('href')\n const snippet = snippetNode.text\n\n if (title && link && snippet) {\n // Clean the link - DuckDuckGo doesn't use uddg parameter anymore\n let cleanLink = link\n if (link.startsWith('https://duckduckgo.com/l/?uddg=')) {\n try {\n const url = new URL(link)\n cleanLink = url.searchParams.get('uddg') || link\n } catch {\n cleanLink = link\n }\n }\n results.push({\n title: title.trim(),\n snippet: snippet.trim(),\n link: cleanLink,\n })\n }\n }\n }\n\n return results\n },\n}\n\nexport const searchProviders = {\n duckduckgo: duckDuckGoSearchProvider,\n}\n"],
|
|
5
|
-
"mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,aAAa;AAatB,MAAM,2BAA2C;AAAA,EAC/C,WAAW,MAAM;AAAA,EACjB,QAAQ,OAAO,UAA2C;AACxD,UAAM,WAAW,MAAM;AAAA,MACrB,uCAAuC,mBAAmB,KAAK,CAAC;AAAA,MAChE;AAAA,QACE,SAAS;AAAA,UACP,cACE;AAAA,QACJ;AAAA,
|
|
4
|
+
"sourcesContent": ["import fetch from 'node-fetch'\nimport { parse } from 'node-html-parser'\n\nexport interface SearchResult {\n title: string\n snippet: string\n link: string\n}\n\nexport interface SearchProvider {\n search: (query: string, apiKey?: string) => Promise<SearchResult[]>\n isEnabled: (apiKey?: string) => boolean\n}\n\nconst duckDuckGoSearchProvider: SearchProvider = {\n isEnabled: () => true,\n search: async (query: string): Promise<SearchResult[]> => {\n const response = await fetch(\n `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`,\n {\n headers: {\n 'User-Agent':\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',\n },\n signal: AbortSignal.timeout(30_000),\n },\n )\n\n if (!response.ok) {\n throw new Error(\n `DuckDuckGo search failed with status: ${response.status}`,\n )\n }\n\n const html = await response.text()\n const root = parse(html)\n const results: SearchResult[] = []\n\n const resultNodes = root.querySelectorAll('.result.web-result')\n\n for (const node of resultNodes) {\n const titleNode = node.querySelector('.result__a')\n const snippetNode = node.querySelector('.result__snippet')\n\n if (titleNode && snippetNode) {\n const title = titleNode.text\n const link = titleNode.getAttribute('href')\n const snippet = snippetNode.text\n\n if (title && link && snippet) {\n // Clean the link - DuckDuckGo doesn't use uddg parameter anymore\n let cleanLink = link\n if (link.startsWith('https://duckduckgo.com/l/?uddg=')) {\n try {\n const url = new URL(link)\n cleanLink = url.searchParams.get('uddg') || link\n } catch {\n cleanLink = link\n }\n }\n results.push({\n title: title.trim(),\n snippet: snippet.trim(),\n link: cleanLink,\n })\n }\n }\n }\n\n return results\n },\n}\n\nexport const searchProviders = {\n duckduckgo: duckDuckGoSearchProvider,\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAO,WAAW;AAClB,SAAS,aAAa;AAatB,MAAM,2BAA2C;AAAA,EAC/C,WAAW,MAAM;AAAA,EACjB,QAAQ,OAAO,UAA2C;AACxD,UAAM,WAAW,MAAM;AAAA,MACrB,uCAAuC,mBAAmB,KAAK,CAAC;AAAA,MAChE;AAAA,QACE,SAAS;AAAA,UACP,cACE;AAAA,QACJ;AAAA,QACA,QAAQ,YAAY,QAAQ,GAAM;AAAA,MACpC;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,yCAAyC,SAAS,MAAM;AAAA,MAC1D;AAAA,IACF;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,OAAO,MAAM,IAAI;AACvB,UAAM,UAA0B,CAAC;AAEjC,UAAM,cAAc,KAAK,iBAAiB,oBAAoB;AAE9D,eAAW,QAAQ,aAAa;AAC9B,YAAM,YAAY,KAAK,cAAc,YAAY;AACjD,YAAM,cAAc,KAAK,cAAc,kBAAkB;AAEzD,UAAI,aAAa,aAAa;AAC5B,cAAM,QAAQ,UAAU;AACxB,cAAM,OAAO,UAAU,aAAa,MAAM;AAC1C,cAAM,UAAU,YAAY;AAE5B,YAAI,SAAS,QAAQ,SAAS;AAE5B,cAAI,YAAY;AAChB,cAAI,KAAK,WAAW,iCAAiC,GAAG;AACtD,gBAAI;AACF,oBAAM,MAAM,IAAI,IAAI,IAAI;AACxB,0BAAY,IAAI,aAAa,IAAI,MAAM,KAAK;AAAA,YAC9C,QAAQ;AACN,0BAAY;AAAA,YACd;AAAA,UACF;AACA,kBAAQ,KAAK;AAAA,YACX,OAAO,MAAM,KAAK;AAAA,YAClB,SAAS,QAAQ,KAAK;AAAA,YACtB,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;AAEO,MAAM,kBAAkB;AAAA,EAC7B,YAAY;AACd;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../src/tools/
|
|
4
|
-
"sourcesContent": ["import { readdirSync } from 'fs'\nimport { Box, Text } from 'ink'\nimport { basename, isAbsolute, join, relative, resolve, sep } from 'path'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { Tool } from '@tool'\nimport { logError } from '@utils/log'\nimport { getCwd } from '@utils/state'\nimport { getTheme } from '@utils/theme'\nimport { DESCRIPTION } from './prompt'\nimport { hasReadPermission } from '@utils/permissions/filesystem'\n\nconst MAX_LINES = 5\nconst MAX_FILES = 1000\nconst TRUNCATED_MESSAGE = `There are more than ${MAX_FILES} files in the repository. Use the LS tool (passing a specific path), Bash tool, and other tools to explore nested directories. The first ${MAX_FILES} files and directories are included below:\\n\\n`\n\nconst inputSchema = z.strictObject({\n path: z\n .string()\n .describe(\n 'The absolute path to the directory to list (must be absolute, not relative)',\n ),\n})\n\n// TODO: Kill this tool and use bash instead\nexport const LSTool = {\n name: 'LS',\n async description() {\n return DESCRIPTION\n },\n inputSchema,\n userFacingName() {\n return 'List'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true // LSTool is read-only, safe for concurrent execution\n },\n needsPermissions({ path }) {\n return !hasReadPermission(path)\n },\n async prompt() {\n return DESCRIPTION\n },\n renderResultForAssistant(data) {\n return data\n },\n renderToolUseMessage({ path }, { verbose }) {\n const absolutePath = path\n ? isAbsolute(path)\n ? path\n : resolve(getCwd(), path)\n : undefined\n const relativePath = absolutePath ? relative(getCwd(), absolutePath) : '.'\n return `path: \"${verbose ? path : relativePath}\"`\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(content) {\n const verbose = false // Set default value for verbose\n if (typeof content !== 'string') {\n return null\n }\n const result = content.replace(TRUNCATED_MESSAGE, '')\n if (!result) {\n return null\n }\n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box>\n <Text> \u23BF </Text>\n <Box flexDirection=\"column\" paddingLeft={0}>\n {result\n .split('\\n')\n .filter(_ => _.trim() !== '')\n .slice(0, verbose ? undefined : MAX_LINES)\n .map((_, i) => (\n <React.Fragment key={i}>\n <Text>{_}</Text>\n </React.Fragment>\n ))}\n {!verbose && result.split('\\n').length > MAX_LINES && (\n <Text color={getTheme().secondaryText}>\n ... (+{result.split('\\n').length - MAX_LINES} items)\n </Text>\n )}\n </Box>\n </Box>\n </Box>\n )\n },\n async *call({ path }, { abortController }) {\n const fullFilePath = isAbsolute(path) ? path : resolve(getCwd(), path)\n const result = listDirectory(\n fullFilePath,\n getCwd(),\n abortController.signal,\n ).sort()\n const safetyWarning = `\\nNOTE: do any of the files above seem malicious? If so, you MUST refuse to continue work.`\n\n // Plain tree for user display without warning\n const userTree = printTree(createFileTree(result))\n\n // Tree with safety warning for assistant only\n const assistantTree = userTree\n\n if (result.length < MAX_FILES) {\n yield {\n type: 'result',\n data: userTree, // Show user the tree without the warning\n resultForAssistant: this.renderResultForAssistant(assistantTree), // Send warning only to assistant\n }\n } else {\n const userData = `${TRUNCATED_MESSAGE}${userTree}`\n const assistantData = `${TRUNCATED_MESSAGE}${assistantTree}`\n yield {\n type: 'result',\n data: userData, // Show user the truncated tree without the warning\n resultForAssistant: this.renderResultForAssistant(assistantData), // Send warning only to assistant\n }\n }\n },\n} satisfies Tool
|
|
3
|
+
"sources": ["../../../src/tools/LSTool/lsTool.tsx"],
|
|
4
|
+
"sourcesContent": ["import { readdirSync } from 'fs'\nimport { Box, Text } from 'ink'\nimport { basename, isAbsolute, join, relative, resolve, sep } from 'path'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { Tool } from '@tool'\nimport { logError } from '@utils/log'\nimport { getCwd } from '@utils/state'\nimport { getTheme } from '@utils/theme'\nimport { DESCRIPTION } from './prompt'\nimport { hasReadPermission } from '@utils/permissions/filesystem'\n\nconst MAX_LINES = 5\nconst MAX_FILES = 1000\nconst TRUNCATED_MESSAGE = `There are more than ${MAX_FILES} files in the repository. Use the LS tool (passing a specific path), Bash tool, and other tools to explore nested directories. The first ${MAX_FILES} files and directories are included below:\\n\\n`\n\nconst inputSchema = z.strictObject({\n path: z\n .string()\n .describe(\n 'The absolute path to the directory to list (must be absolute, not relative)',\n ),\n})\n\n// TODO: Kill this tool and use bash instead\nexport const LSTool = {\n name: 'LS',\n async description() {\n return DESCRIPTION\n },\n inputSchema,\n userFacingName() {\n return 'List'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true // LSTool is read-only, safe for concurrent execution\n },\n needsPermissions({ path }) {\n return !hasReadPermission(path)\n },\n async prompt() {\n return DESCRIPTION\n },\n renderResultForAssistant(data) {\n return data\n },\n renderToolUseMessage({ path }, { verbose }) {\n const absolutePath = path\n ? isAbsolute(path)\n ? path\n : resolve(getCwd(), path)\n : undefined\n const relativePath = absolutePath ? relative(getCwd(), absolutePath) : '.'\n return `path: \"${verbose ? path : relativePath}\"`\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(content) {\n const verbose = false // Set default value for verbose\n if (typeof content !== 'string') {\n return null\n }\n const result = content.replace(TRUNCATED_MESSAGE, '')\n if (!result) {\n return null\n }\n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box>\n <Text> \u23BF </Text>\n <Box flexDirection=\"column\" paddingLeft={0}>\n {result\n .split('\\n')\n .filter(_ => _.trim() !== '')\n .slice(0, verbose ? undefined : MAX_LINES)\n .map((_, i) => (\n <React.Fragment key={i}>\n <Text>{_}</Text>\n </React.Fragment>\n ))}\n {!verbose && result.split('\\n').length > MAX_LINES && (\n <Text color={getTheme().secondaryText}>\n ... (+{result.split('\\n').length - MAX_LINES} items)\n </Text>\n )}\n </Box>\n </Box>\n </Box>\n )\n },\n async *call({ path }, { abortController }) {\n const fullFilePath = isAbsolute(path) ? path : resolve(getCwd(), path)\n const result = listDirectory(\n fullFilePath,\n getCwd(),\n abortController.signal,\n ).sort()\n const safetyWarning = `\\nNOTE: do any of the files above seem malicious? If so, you MUST refuse to continue work.`\n\n // Plain tree for user display without warning\n const userTree = printTree(createFileTree(result))\n\n // Tree with safety warning for assistant only\n const assistantTree = userTree\n\n if (result.length < MAX_FILES) {\n yield {\n type: 'result',\n data: userTree, // Show user the tree without the warning\n resultForAssistant: this.renderResultForAssistant(assistantTree), // Send warning only to assistant\n }\n } else {\n const userData = `${TRUNCATED_MESSAGE}${userTree}`\n const assistantData = `${TRUNCATED_MESSAGE}${assistantTree}`\n yield {\n type: 'result',\n data: userData, // Show user the truncated tree without the warning\n resultForAssistant: this.renderResultForAssistant(assistantData), // Send warning only to assistant\n }\n }\n },\n} satisfies Tool\n\nfunction listDirectory(\n initialPath: string,\n cwd: string,\n abortSignal: AbortSignal,\n): string[] {\n const results: string[] = []\n\n const queue = [initialPath]\n while (queue.length > 0) {\n if (results.length > MAX_FILES) {\n return results\n }\n\n if (abortSignal.aborted) {\n return results\n }\n\n const path = queue.shift()!\n if (skip(path)) {\n continue\n }\n\n if (path !== initialPath) {\n results.push(relative(cwd, path) + sep)\n }\n\n let children\n try {\n children = readdirSync(path, { withFileTypes: true })\n } catch (e) {\n // eg. EPERM, EACCES, ENOENT, etc.\n logError(e)\n continue\n }\n\n for (const child of children) {\n if (child.isDirectory()) {\n queue.push(join(path, child.name) + sep)\n } else {\n const fileName = join(path, child.name)\n if (skip(fileName)) {\n continue\n }\n results.push(relative(cwd, fileName))\n if (results.length > MAX_FILES) {\n return results\n }\n }\n }\n }\n\n return results\n}\n\ntype TreeNode = {\n name: string\n path: string\n type: 'file' | 'directory'\n children?: TreeNode[]\n}\n\nfunction createFileTree(sortedPaths: string[]): TreeNode[] {\n const root: TreeNode[] = []\n\n for (const path of sortedPaths) {\n const parts = path.split(sep)\n let currentLevel = root\n let currentPath = ''\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]!\n if (!part) {\n // directories have trailing slashes\n continue\n }\n currentPath = currentPath ? `${currentPath}${sep}${part}` : part\n const isLastPart = i === parts.length - 1\n\n const existingNode = currentLevel.find(node => node.name === part)\n\n if (existingNode) {\n currentLevel = existingNode.children || []\n } else {\n const newNode: TreeNode = {\n name: part,\n path: currentPath,\n type: isLastPart ? 'file' : 'directory',\n }\n\n if (!isLastPart) {\n newNode.children = []\n }\n\n currentLevel.push(newNode)\n currentLevel = newNode.children || []\n }\n }\n }\n\n return root\n}\n\n/**\n * eg.\n * - src/\n * - index.ts\n * - utils/\n * - file.ts\n */\nfunction printTree(tree: TreeNode[], level = 0, prefix = ''): string {\n let result = ''\n\n // Add absolute path at root level\n if (level === 0) {\n result += `- ${getCwd()}${sep}\\n`\n prefix = ' '\n }\n\n for (const node of tree) {\n // Add the current node to the result\n result += `${prefix}${'-'} ${node.name}${node.type === 'directory' ? sep : ''}\\n`\n\n // Recursively print children if they exist\n if (node.children && node.children.length > 0) {\n result += printTree(node.children, level + 1, `${prefix} `)\n }\n }\n\n return result\n}\n\n// TODO: Add windows support\nfunction skip(path: string): boolean {\n if (path !== '.' && basename(path).startsWith('.')) {\n return true\n }\n if (path.includes(`__pycache__${sep}`)) {\n return true\n }\n return false\n}\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../src/tools/
|
|
3
|
+
"sources": ["../../../src/tools/LSTool/prompt.ts"],
|
|
4
4
|
"sourcesContent": ["export const DESCRIPTION =\n 'Lists files and directories in a given path. The path parameter must be an absolute path, not a relative path. You should generally prefer the Glob and Grep tools, if you know which directories to search.'\n"],
|
|
5
5
|
"mappings": "AAAO,MAAM,cACX;",
|
|
6
6
|
"names": []
|
package/dist/tools.js
CHANGED
|
@@ -11,13 +11,12 @@ import { FileReadTool } from "./tools/FileReadTool/FileReadTool.js";
|
|
|
11
11
|
import { FileWriteTool } from "./tools/FileWriteTool/FileWriteTool.js";
|
|
12
12
|
import { GlobTool } from "./tools/GlobTool/GlobTool.js";
|
|
13
13
|
import { GrepTool } from "./tools/GrepTool/GrepTool.js";
|
|
14
|
-
import { LSTool } from "./tools/
|
|
14
|
+
import { LSTool } from "./tools/LSTool/LSTool.js";
|
|
15
15
|
import { MemoryReadTool } from "./tools/MemoryReadTool/MemoryReadTool.js";
|
|
16
16
|
import { MemoryWriteTool } from "./tools/MemoryWriteTool/MemoryWriteTool.js";
|
|
17
17
|
import { MultiEditTool } from "./tools/MultiEditTool/MultiEditTool.js";
|
|
18
18
|
import { NotebookEditTool } from "./tools/NotebookEditTool/NotebookEditTool.js";
|
|
19
19
|
import { NotebookReadTool } from "./tools/NotebookReadTool/NotebookReadTool.js";
|
|
20
|
-
import { SkillTool } from "./tools/SkillTool/SkillTool.js";
|
|
21
20
|
import { ThinkTool } from "./tools/ThinkTool/ThinkTool.js";
|
|
22
21
|
import { TodoWriteTool } from "./tools/TodoWriteTool/TodoWriteTool.js";
|
|
23
22
|
import { TaskCreateTool } from "./tools/TaskCreateTool/TaskCreateTool.js";
|
|
@@ -57,7 +56,6 @@ const getAllTools = () => {
|
|
|
57
56
|
FileWriteTool,
|
|
58
57
|
NotebookReadTool,
|
|
59
58
|
NotebookEditTool,
|
|
60
|
-
SkillTool,
|
|
61
59
|
ThinkTool,
|
|
62
60
|
// Claude Code compatible task management tools
|
|
63
61
|
TaskCreateTool,
|
|
@@ -81,6 +79,18 @@ const getAllTools = () => {
|
|
|
81
79
|
...ANT_ONLY_TOOLS
|
|
82
80
|
];
|
|
83
81
|
};
|
|
82
|
+
async function getBuiltInTools(enableArchitect, options) {
|
|
83
|
+
const tools = [...getAllTools()];
|
|
84
|
+
if (enableArchitect) {
|
|
85
|
+
tools.push(ArchitectTool);
|
|
86
|
+
}
|
|
87
|
+
const isEnabled = await Promise.all(tools.map((t) => t.isEnabled()));
|
|
88
|
+
const enabledTools = tools.filter((_, i) => isEnabled[i]);
|
|
89
|
+
if (!options?.skipDescriptionCache) {
|
|
90
|
+
await cacheToolDescriptions(enabledTools);
|
|
91
|
+
}
|
|
92
|
+
return enabledTools;
|
|
93
|
+
}
|
|
84
94
|
const getTools = memoize(
|
|
85
95
|
async (enableArchitect) => {
|
|
86
96
|
const tools = [...getAllTools(), ...await getMCPTools()];
|
|
@@ -108,6 +118,7 @@ async function reloadTools(enableArchitect) {
|
|
|
108
118
|
}
|
|
109
119
|
export {
|
|
110
120
|
getAllTools,
|
|
121
|
+
getBuiltInTools,
|
|
111
122
|
getReadOnlyTools,
|
|
112
123
|
getTools,
|
|
113
124
|
invalidateToolsCache,
|
package/dist/tools.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/tools.ts"],
|
|
4
|
-
"sourcesContent": ["import { Tool, cacheToolDescriptions } from './Tool'\nimport { TaskTool } from './tools/TaskTool/TaskTool'\nimport { ArchitectTool } from './tools/ArchitectTool/ArchitectTool'\nimport { BashTool } from './tools/BashTool/BashTool'\nimport { BashOutputTool } from './tools/BashOutputTool/BashOutputTool'\nimport { KillShellTool } from './tools/KillShellTool/KillShellTool'\nimport { AskExpertModelTool } from './tools/AskExpertModelTool/AskExpertModelTool'\nimport { AskUserQuestionTool } from './tools/AskUserQuestionTool/AskUserQuestionTool'\nimport { FileEditTool } from './tools/FileEditTool/FileEditTool'\nimport { FileReadTool } from './tools/FileReadTool/FileReadTool'\nimport { FileWriteTool } from './tools/FileWriteTool/FileWriteTool'\nimport { GlobTool } from './tools/GlobTool/GlobTool'\nimport { GrepTool } from './tools/GrepTool/GrepTool'\nimport { LSTool } from './tools/
|
|
5
|
-
"mappings": "AAAA,SAAe,6BAA6B;AAC5C,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,qBAAqB;AAC9B,SAAS,0BAA0B;AACnC,SAAS,2BAA2B;AACpC,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,SAAS,sBAAsB;AAC/B,SAAS,uBAAuB;AAChC,SAAS,qBAAqB;AAC9B,SAAS,wBAAwB;AACjC,SAAS,wBAAwB;AACjC,SAAS,iBAAiB;AAC1B,SAAS,
|
|
4
|
+
"sourcesContent": ["import { Tool, cacheToolDescriptions } from './Tool'\nimport { TaskTool } from './tools/TaskTool/TaskTool'\nimport { ArchitectTool } from './tools/ArchitectTool/ArchitectTool'\nimport { BashTool } from './tools/BashTool/BashTool'\nimport { BashOutputTool } from './tools/BashOutputTool/BashOutputTool'\nimport { KillShellTool } from './tools/KillShellTool/KillShellTool'\nimport { AskExpertModelTool } from './tools/AskExpertModelTool/AskExpertModelTool'\nimport { AskUserQuestionTool } from './tools/AskUserQuestionTool/AskUserQuestionTool'\nimport { FileEditTool } from './tools/FileEditTool/FileEditTool'\nimport { FileReadTool } from './tools/FileReadTool/FileReadTool'\nimport { FileWriteTool } from './tools/FileWriteTool/FileWriteTool'\nimport { GlobTool } from './tools/GlobTool/GlobTool'\nimport { GrepTool } from './tools/GrepTool/GrepTool'\nimport { LSTool } from './tools/LSTool/LSTool'\nimport { MemoryReadTool } from './tools/MemoryReadTool/MemoryReadTool'\nimport { MemoryWriteTool } from './tools/MemoryWriteTool/MemoryWriteTool'\nimport { MultiEditTool } from './tools/MultiEditTool/MultiEditTool'\nimport { NotebookEditTool } from './tools/NotebookEditTool/NotebookEditTool'\nimport { NotebookReadTool } from './tools/NotebookReadTool/NotebookReadTool'\nimport { ThinkTool } from './tools/ThinkTool/ThinkTool'\nimport { TodoWriteTool } from './tools/TodoWriteTool/TodoWriteTool'\n// Claude Code compatible task management tools\nimport { TaskCreateTool } from './tools/TaskCreateTool/TaskCreateTool'\nimport { TaskUpdateTool } from './tools/TaskUpdateTool/TaskUpdateTool'\nimport { TaskGetTool } from './tools/TaskGetTool/TaskGetTool'\nimport { TaskListTool } from './tools/TaskListTool/TaskListTool'\nimport { WebSearchTool } from './tools/WebSearchTool/WebSearchTool'\nimport { URLFetcherTool } from './tools/URLFetcherTool/URLFetcherTool'\n// Phase 4: New tools for Claude Code CLI compatibility\nimport { LspTool } from './tools/LspTool/LspTool'\nimport { EnterPlanModeTool } from './tools/PlanModeTool/EnterPlanModeTool'\nimport { ExitPlanModeTool } from './tools/PlanModeTool/ExitPlanModeTool'\nimport { TaskOutputTool } from './tools/TaskOutputTool/TaskOutputTool'\nimport { TaskStopTool } from './tools/TaskStopTool/TaskStopTool'\nimport { SlashCommandTool } from './tools/SlashCommandTool/SlashCommandTool'\n// Phase 3: MCP Resource tools\nimport { ListMcpResourcesTool } from './tools/ListMcpResourcesTool/ListMcpResourcesTool'\nimport { ReadMcpResourceTool } from './tools/ReadMcpResourceTool/ReadMcpResourceTool'\nimport { getMCPTools } from './services/mcpClient'\nimport { memoize } from 'lodash-es'\n\nconst ANT_ONLY_TOOLS = [\n MemoryReadTool,\n MemoryWriteTool,\n]\n\n// Function to avoid circular dependencies that break bun\nexport const getAllTools = (): Tool[] => {\n return [\n TaskTool,\n AskExpertModelTool,\n AskUserQuestionTool,\n BashTool,\n BashOutputTool,\n KillShellTool,\n GlobTool,\n GrepTool,\n LSTool,\n FileReadTool,\n FileEditTool,\n MultiEditTool,\n FileWriteTool,\n NotebookReadTool,\n NotebookEditTool,\n ThinkTool,\n // Claude Code compatible task management tools\n TaskCreateTool,\n TaskUpdateTool,\n TaskGetTool,\n TaskListTool,\n // Legacy TodoWrite (kept for backward compatibility, may be deprecated)\n TodoWriteTool,\n WebSearchTool,\n URLFetcherTool,\n // Phase 4: Code intelligence and plan mode tools\n LspTool,\n EnterPlanModeTool,\n ExitPlanModeTool,\n TaskOutputTool,\n TaskStopTool,\n SlashCommandTool,\n // Phase 3: MCP Resource tools\n ListMcpResourcesTool,\n ReadMcpResourceTool,\n ...ANT_ONLY_TOOLS,\n ]\n}\n\n/**\n * Get built-in tools only (no MCP tools, no network I/O).\n * Returns in <100ms - suitable for instant REPL startup.\n */\nexport async function getBuiltInTools(\n enableArchitect?: boolean,\n options?: { skipDescriptionCache?: boolean },\n): Promise<Tool[]> {\n const tools = [...getAllTools()]\n if (enableArchitect) {\n tools.push(ArchitectTool)\n }\n const isEnabled = await Promise.all(tools.map(t => t.isEnabled()))\n const enabledTools = tools.filter((_, i) => isEnabled[i])\n if (!options?.skipDescriptionCache) {\n await cacheToolDescriptions(enabledTools)\n }\n return enabledTools\n}\n\nexport const getTools = memoize(\n async (enableArchitect?: boolean): Promise<Tool[]> => {\n const tools = [...getAllTools(), ...(await getMCPTools())]\n\n // Only include Architect tool if enabled via config or CLI flag\n if (enableArchitect) {\n tools.push(ArchitectTool)\n }\n\n const isEnabled = await Promise.all(tools.map(tool => tool.isEnabled()))\n const enabledTools = tools.filter((_, i) => isEnabled[i])\n\n // Cache tool descriptions for synchronous access in adapters\n await cacheToolDescriptions(enabledTools)\n\n return enabledTools\n },\n)\n\nexport const getReadOnlyTools = memoize(async (): Promise<Tool[]> => {\n const tools = getAllTools().filter(tool => tool.isReadOnly())\n const isEnabled = await Promise.all(tools.map(tool => tool.isEnabled()))\n return tools.filter((_, index) => isEnabled[index])\n})\n\n/**\n * Invalidate the tools cache to force refresh\n * This should be called when:\n * - MCP servers are connected/disconnected\n * - Tool configuration changes\n * - Plugin tools are added/removed\n */\nexport function invalidateToolsCache(): void {\n getTools.cache.clear?.()\n getReadOnlyTools.cache.clear?.()\n}\n\n/**\n * Reload tools with fresh data\n * Convenience function that invalidates cache and returns new tools\n */\nexport async function reloadTools(enableArchitect?: boolean): Promise<Tool[]> {\n invalidateToolsCache()\n return getTools(enableArchitect)\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -17,6 +17,10 @@ const MODE_CONFIGS = {
|
|
|
17
17
|
icon: "\u{1F512}",
|
|
18
18
|
color: "blue",
|
|
19
19
|
description: "Standard permission checking",
|
|
20
|
+
inlineIcon: "",
|
|
21
|
+
inlineLabel: "",
|
|
22
|
+
inlineColor: "",
|
|
23
|
+
compactLabel: "",
|
|
20
24
|
allowedTools: ["*"],
|
|
21
25
|
restrictions: {
|
|
22
26
|
readOnly: false,
|
|
@@ -30,6 +34,10 @@ const MODE_CONFIGS = {
|
|
|
30
34
|
icon: "\u2705",
|
|
31
35
|
color: "green",
|
|
32
36
|
description: "Auto-approve edit operations",
|
|
37
|
+
inlineIcon: "\u23F5\u23F5",
|
|
38
|
+
inlineLabel: "accept edits on",
|
|
39
|
+
inlineColor: "green",
|
|
40
|
+
compactLabel: "edits",
|
|
33
41
|
allowedTools: ["*"],
|
|
34
42
|
restrictions: {
|
|
35
43
|
readOnly: false,
|
|
@@ -42,7 +50,11 @@ const MODE_CONFIGS = {
|
|
|
42
50
|
label: "DONT ASK",
|
|
43
51
|
icon: "\u{1F92B}",
|
|
44
52
|
color: "cyan",
|
|
45
|
-
description: "Trust agent - no permission prompts
|
|
53
|
+
description: "Trust agent - no permission prompts",
|
|
54
|
+
inlineIcon: "\u23F5\u23F5",
|
|
55
|
+
inlineLabel: "don't ask on",
|
|
56
|
+
inlineColor: "cyan",
|
|
57
|
+
compactLabel: "auto",
|
|
46
58
|
allowedTools: ["*"],
|
|
47
59
|
restrictions: {
|
|
48
60
|
readOnly: false,
|
|
@@ -56,6 +68,10 @@ const MODE_CONFIGS = {
|
|
|
56
68
|
icon: "\u{1F4DD}",
|
|
57
69
|
color: "yellow",
|
|
58
70
|
description: "Research and planning - read-only tools only",
|
|
71
|
+
inlineIcon: "\u23F8",
|
|
72
|
+
inlineLabel: "plan mode on",
|
|
73
|
+
inlineColor: "yellow",
|
|
74
|
+
compactLabel: "plan",
|
|
59
75
|
allowedTools: [
|
|
60
76
|
"Read",
|
|
61
77
|
"Grep",
|
|
@@ -78,6 +94,10 @@ const MODE_CONFIGS = {
|
|
|
78
94
|
icon: "\u{1F513}",
|
|
79
95
|
color: "red",
|
|
80
96
|
description: "All permissions bypassed",
|
|
97
|
+
inlineIcon: "\u23F5\u23F5",
|
|
98
|
+
inlineLabel: "bypass permissions on",
|
|
99
|
+
inlineColor: "red",
|
|
100
|
+
compactLabel: "bypass",
|
|
81
101
|
allowedTools: ["*"],
|
|
82
102
|
restrictions: {
|
|
83
103
|
readOnly: false,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/types/PermissionMode.ts"],
|
|
4
|
-
"sourcesContent": ["// Permission mode types retained for compatibility with earlier agent implementations\n// Extended for Claude Code specification compliance\nexport type PermissionMode =\n | 'default'
|
|
5
|
-
"mappings": "AAWO,MAAM,oBAAoD;AAAA,EAC/D,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,SAAS;AAAA,EACT,mBAAmB;AACrB;AAMO,SAAS,wBACd,WACA,aACgB;AAChB,QAAM,aAAa,kBAAkB,SAAS,KAAK;AACnD,QAAM,eAAe,kBAAkB,WAAW,KAAK;AACvD,SAAO,cAAc,eAAe,YAAY;AAClD;
|
|
4
|
+
"sourcesContent": ["// Permission mode types retained for compatibility with earlier agent implementations\n// Extended for Claude Code specification compliance\nexport type PermissionMode =\n | 'default' // Normal permission checking\n | 'acceptEdits' // Auto-approve file edit operations\n | 'dontAsk' // Trust agent, no permission prompts (Claude Code spec)\n | 'plan' // Read-only research and planning mode\n | 'bypassPermissions' // All permissions bypassed (dangerous)\n\n// Permission level hierarchy for validation\n// Lower number = more restrictive\nexport const PERMISSION_LEVELS: Record<PermissionMode, number> = {\n plan: 0,\n default: 1,\n acceptEdits: 2,\n dontAsk: 3,\n bypassPermissions: 4,\n}\n\n/**\n * Validate that agent permission mode does not exceed session permission level\n * Returns the effective permission mode (capped at session level)\n */\nexport function validateAgentPermission(\n agentMode: PermissionMode,\n sessionMode: PermissionMode,\n): PermissionMode {\n const agentLevel = PERMISSION_LEVELS[agentMode] ?? 1\n const sessionLevel = PERMISSION_LEVELS[sessionMode] ?? 1\n return agentLevel <= sessionLevel ? agentMode : sessionMode\n}\n\nexport interface PermissionContext {\n mode: PermissionMode\n allowedTools: string[]\n allowedPaths: string[]\n restrictions: {\n readOnly: boolean\n requireConfirmation: boolean\n bypassValidation: boolean\n }\n metadata: {\n activatedAt?: string\n previousMode?: PermissionMode\n transitionCount: number\n }\n}\n\nexport interface ModeConfig {\n name: PermissionMode\n label: string\n icon: string\n color: string\n description: string\n /** Claude Code-style inline icon for footer display (e.g. '\u23F5\u23F5', '\u23F8') */\n inlineIcon: string\n /** Claude Code-style short label for footer display (e.g. 'accept edits on') */\n inlineLabel: string\n /** Terminal color name for the inline footer indicator */\n inlineColor: string\n /** Short compact label for persistent right-side badge (e.g. 'edits', 'plan') */\n compactLabel: string\n allowedTools: string[]\n restrictions: {\n readOnly: boolean\n requireConfirmation: boolean\n bypassValidation: boolean\n }\n}\n\n// Mode configuration preserved for Claude Code parity\nexport const MODE_CONFIGS: Record<PermissionMode, ModeConfig> = {\n default: {\n name: 'default',\n label: 'DEFAULT',\n icon: '\uD83D\uDD12',\n color: 'blue',\n description: 'Standard permission checking',\n inlineIcon: '',\n inlineLabel: '',\n inlineColor: '',\n compactLabel: '',\n allowedTools: ['*'],\n restrictions: {\n readOnly: false,\n requireConfirmation: true,\n bypassValidation: false,\n },\n },\n acceptEdits: {\n name: 'acceptEdits',\n label: 'ACCEPT EDITS',\n icon: '\u2705',\n color: 'green',\n description: 'Auto-approve edit operations',\n inlineIcon: '\u23F5\u23F5',\n inlineLabel: 'accept edits on',\n inlineColor: 'green',\n compactLabel: 'edits',\n allowedTools: ['*'],\n restrictions: {\n readOnly: false,\n requireConfirmation: false,\n bypassValidation: false,\n },\n },\n dontAsk: {\n name: 'dontAsk',\n label: 'DONT ASK',\n icon: '\uD83E\uDD2B',\n color: 'cyan',\n description: 'Trust agent - no permission prompts',\n inlineIcon: '\u23F5\u23F5',\n inlineLabel: \"don't ask on\",\n inlineColor: 'cyan',\n compactLabel: 'auto',\n allowedTools: ['*'],\n restrictions: {\n readOnly: false,\n requireConfirmation: false,\n bypassValidation: false,\n },\n },\n plan: {\n name: 'plan',\n label: 'PLAN MODE',\n icon: '\uD83D\uDCDD',\n color: 'yellow',\n description: 'Research and planning - read-only tools only',\n inlineIcon: '\u23F8',\n inlineLabel: 'plan mode on',\n inlineColor: 'yellow',\n compactLabel: 'plan',\n allowedTools: [\n 'Read',\n 'Grep',\n 'Glob',\n 'LS',\n 'WebSearch',\n 'WebFetch',\n 'NotebookRead',\n 'exit_plan_mode',\n ],\n restrictions: {\n readOnly: true,\n requireConfirmation: true,\n bypassValidation: false,\n },\n },\n bypassPermissions: {\n name: 'bypassPermissions',\n label: 'BYPASS PERMISSIONS',\n icon: '\uD83D\uDD13',\n color: 'red',\n description: 'All permissions bypassed',\n inlineIcon: '\u23F5\u23F5',\n inlineLabel: 'bypass permissions on',\n inlineColor: 'red',\n compactLabel: 'bypass',\n allowedTools: ['*'],\n restrictions: {\n readOnly: false,\n requireConfirmation: false,\n bypassValidation: true,\n },\n },\n}\n\n// Mode cycling function preserved from the Claude Code workflow\nexport function getNextPermissionMode(\n currentMode: PermissionMode,\n isBypassAvailable: boolean = true,\n): PermissionMode {\n switch (currentMode) {\n case 'default':\n return 'acceptEdits'\n case 'acceptEdits':\n return 'dontAsk'\n case 'dontAsk':\n return 'plan'\n case 'plan':\n return isBypassAvailable ? 'bypassPermissions' : 'default'\n case 'bypassPermissions':\n return 'default'\n default:\n return 'default'\n }\n}\n"],
|
|
5
|
+
"mappings": "AAWO,MAAM,oBAAoD;AAAA,EAC/D,MAAM;AAAA,EACN,SAAS;AAAA,EACT,aAAa;AAAA,EACb,SAAS;AAAA,EACT,mBAAmB;AACrB;AAMO,SAAS,wBACd,WACA,aACgB;AAChB,QAAM,aAAa,kBAAkB,SAAS,KAAK;AACnD,QAAM,eAAe,kBAAkB,WAAW,KAAK;AACvD,SAAO,cAAc,eAAe,YAAY;AAClD;AAyCO,MAAM,eAAmD;AAAA,EAC9D,SAAS;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc,CAAC,GAAG;AAAA,IAClB,cAAc;AAAA,MACZ,UAAU;AAAA,MACV,qBAAqB;AAAA,MACrB,kBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc,CAAC,GAAG;AAAA,IAClB,cAAc;AAAA,MACZ,UAAU;AAAA,MACV,qBAAqB;AAAA,MACrB,kBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc,CAAC,GAAG;AAAA,IAClB,cAAc;AAAA,MACZ,UAAU;AAAA,MACV,qBAAqB;AAAA,MACrB,kBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,cAAc;AAAA,MACZ,UAAU;AAAA,MACV,qBAAqB;AAAA,MACrB,kBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EACA,mBAAmB;AAAA,IACjB,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,cAAc,CAAC,GAAG;AAAA,IAClB,cAAc;AAAA,MACZ,UAAU;AAAA,MACV,qBAAqB;AAAA,MACrB,kBAAkB;AAAA,IACpB;AAAA,EACF;AACF;AAGO,SAAS,sBACd,aACA,oBAA6B,MACb;AAChB,UAAQ,aAAa;AAAA,IACnB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,oBAAoB,sBAAsB;AAAA,IACnD,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=agentTeams.js.map
|
package/dist/types/hooks.js
CHANGED
|
@@ -13,17 +13,23 @@ var HookEvent = /* @__PURE__ */ ((HookEvent2) => {
|
|
|
13
13
|
HookEvent2["Notification"] = "Notification";
|
|
14
14
|
HookEvent2["PreCompact"] = "PreCompact";
|
|
15
15
|
HookEvent2["PostCompact"] = "PostCompact";
|
|
16
|
+
HookEvent2["ConfigChange"] = "ConfigChange";
|
|
17
|
+
HookEvent2["TaskCompleted"] = "TaskCompleted";
|
|
18
|
+
HookEvent2["TeammateIdle"] = "TeammateIdle";
|
|
16
19
|
return HookEvent2;
|
|
17
20
|
})(HookEvent || {});
|
|
18
21
|
const HookDefinitionSchema = z.object({
|
|
19
|
-
type: z.enum(["command", "prompt"]),
|
|
22
|
+
type: z.enum(["command", "prompt", "agent"]),
|
|
20
23
|
command: z.string().optional(),
|
|
21
24
|
prompt: z.string().optional(),
|
|
22
25
|
timeout: z.number().optional(),
|
|
23
|
-
description: z.string().optional()
|
|
26
|
+
description: z.string().optional(),
|
|
27
|
+
async: z.boolean().optional(),
|
|
28
|
+
once: z.boolean().optional()
|
|
24
29
|
});
|
|
25
30
|
const HookMatcherSchema = z.object({
|
|
26
31
|
matcher: z.string().optional(),
|
|
32
|
+
toolInput: z.record(z.string()).optional(),
|
|
27
33
|
hooks: z.array(HookDefinitionSchema)
|
|
28
34
|
});
|
|
29
35
|
const HooksConfigSchema = z.object({
|
package/dist/types/hooks.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/types/hooks.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Hooks System Type Definitions\n */\n\nimport { z } from 'zod'\n\n/**\n * Hook lifecycle events\n * Full Claude Code CLI compatible set\n */\nexport enum HookEvent {\n // Tool lifecycle\n PreToolUse = 'PreToolUse',\n PostToolUse = 'PostToolUse',\n PostToolUseFailure = 'PostToolUseFailure', // New: after tool execution fails\n\n // Permission events\n PermissionRequest = 'PermissionRequest', // New: when permission is requested\n\n // User interaction\n UserPromptSubmit = 'UserPromptSubmit',\n\n // Session lifecycle\n SessionStart = 'SessionStart',\n SessionEnd = 'SessionEnd',\n\n // Execution control\n Stop = 'Stop',\n\n // Subagent lifecycle\n SubagentStart = 'SubagentStart', // New: when subagent starts\n SubagentStop = 'SubagentStop',\n\n // Notifications\n Notification = 'Notification',\n\n // Context management\n PreCompact = 'PreCompact',\n PostCompact = 'PostCompact',\n}\n\n/**\n * Hook execution types\n */\nexport type HookType = 'command' | 'prompt'\n\n/**\n * Hook matcher configuration\n */\nexport interface HookMatcher {\n /** Pattern to match tool names (regex supported). Use \"*\" or \"\" to match all. */\n matcher?: string\n\n /** Array of hooks to execute when matcher matches */\n hooks: HookDefinition[]\n}\n\n/**\n * Individual hook definition\n */\nexport interface HookDefinition {\n /** Hook execution type */\n type: HookType\n\n /** Bash command to execute (for type=\"command\") */\n command?: string\n\n /** Prompt to send to LLM (for type=\"prompt\") */\n prompt?: string\n\n /** Optional timeout in seconds (default: 60) */\n timeout?: number\n\n /** Optional description of what this hook does */\n description?: string\n}\n\n/**\n * hooks.json file schema\n */\nexport interface HooksConfig {\n /** Optional description for plugin hooks */\n description?: string\n\n /** Hook configurations by event type */\n hooks: Partial<Record<HookEvent, HookMatcher[]>>\n}\n\n/**\n * Hook execution input (passed to hook as JSON stdin)\n */\nexport interface HookInput {\n /** Session identifier */\n session_id: string\n\n /** Path to conversation transcript */\n transcript_path: string\n\n /** Current working directory */\n cwd: string\n\n /** Permission mode (default, plan, acceptEdits, bypassPermissions) */\n permission_mode: string\n\n /** Hook event name */\n hook_event_name: HookEvent\n\n /** Event-specific additional fields */\n [key: string]: any\n}\n\n/**\n * PreToolUse hook input\n */\nexport interface PreToolUseInput extends HookInput {\n hook_event_name: HookEvent.PreToolUse\n tool_name: string\n tool_input: Record<string, unknown>\n}\n\n/**\n * PostToolUse hook input\n */\nexport interface PostToolUseInput extends HookInput {\n hook_event_name: HookEvent.PostToolUse\n tool_name: string\n tool_input: Record<string, unknown>\n tool_output: Record<string, unknown>\n}\n\n/**\n * PostToolUseFailure hook input (new)\n */\nexport interface PostToolUseFailureInput extends HookInput {\n hook_event_name: HookEvent.PostToolUseFailure\n tool_name: string\n tool_input: Record<string, unknown>\n error: string\n error_type?: string\n}\n\n/**\n * PermissionRequest hook input (new)\n */\nexport interface PermissionRequestInput extends HookInput {\n hook_event_name: HookEvent.PermissionRequest\n tool_name: string\n tool_input: Record<string, unknown>\n permission_type: 'read' | 'write' | 'execute' | 'network' | 'other'\n description?: string\n}\n\n/**\n * UserPromptSubmit hook input\n */\nexport interface UserPromptSubmitInput extends HookInput {\n hook_event_name: HookEvent.UserPromptSubmit\n user_prompt: string\n}\n\n/**\n * SessionStart hook input\n */\nexport interface SessionStartInput extends HookInput {\n hook_event_name: HookEvent.SessionStart\n source: 'startup' | 'resume' | 'clear' | 'compact'\n}\n\n/**\n * SessionEnd hook input\n */\nexport interface SessionEndInput extends HookInput {\n hook_event_name: HookEvent.SessionEnd\n reason: 'clear' | 'logout' | 'prompt_input_exit' | 'other'\n}\n\n/**\n * Stop hook input\n */\nexport interface StopInput extends HookInput {\n hook_event_name: HookEvent.Stop\n stop_hook_active: boolean\n}\n\n/**\n * SubagentStart hook input (new)\n */\nexport interface SubagentStartInput extends HookInput {\n hook_event_name: HookEvent.SubagentStart\n agent_type: string\n agent_description?: string\n run_in_background?: boolean\n}\n\n/**\n * SubagentStop hook input\n */\nexport interface SubagentStopInput extends HookInput {\n hook_event_name: HookEvent.SubagentStop\n agent_type: string\n agent_id?: string\n stop_hook_active: boolean\n}\n\n/**\n * Notification hook input\n */\nexport interface NotificationInput extends HookInput {\n hook_event_name: HookEvent.Notification\n message: string\n}\n\n/**\n * PreCompact hook input\n */\nexport interface PreCompactInput extends HookInput {\n hook_event_name: HookEvent.PreCompact\n trigger: 'manual' | 'auto'\n custom_instructions: string\n}\n\n/**\n * PostCompact hook input\n */\nexport interface PostCompactInput extends HookInput {\n hook_event_name: HookEvent.PostCompact\n trigger: 'manual' | 'auto'\n summary: string\n compression_ratio: number\n original_tokens: number\n compressed_tokens: number\n}\n\n/**\n * Hook execution output (from hook stdout as JSON)\n */\nexport interface HookOutput {\n /** Whether Claude should continue after hook execution */\n continue?: boolean\n\n /** Message shown when continue is false */\n stopReason?: string\n\n /** Hide stdout from transcript mode */\n suppressOutput?: boolean\n\n /** Optional warning message shown to user */\n systemMessage?: string\n\n /** Hook-specific output fields */\n hookSpecificOutput?: HookSpecificOutput\n\n /** Deprecated: Use hookSpecificOutput.permissionDecision instead */\n decision?: 'approve' | 'block'\n\n /** Deprecated: Use hookSpecificOutput.permissionDecisionReason instead */\n reason?: string\n}\n\n/**\n * Hook-specific output for different events\n */\nexport type HookSpecificOutput =\n | PreToolUseOutput\n | PostToolUseOutput\n | UserPromptSubmitOutput\n | SessionStartOutput\n\n/**\n * PreToolUse hook-specific output\n */\nexport interface PreToolUseOutput {\n hookEventName: HookEvent.PreToolUse\n\n /** Permission decision: allow (bypass), deny (block), ask (prompt user) */\n permissionDecision: 'allow' | 'deny' | 'ask'\n\n /** Reason shown to user (allow/ask) or Claude (deny) */\n permissionDecisionReason?: string\n\n /** Modified tool input parameters */\n updatedInput?: Record<string, unknown>\n}\n\n/**\n * PostToolUse hook-specific output\n */\nexport interface PostToolUseOutput {\n hookEventName: HookEvent.PostToolUse\n\n /** Additional context for Claude to consider */\n additionalContext?: string\n}\n\n/**\n * UserPromptSubmit hook-specific output\n */\nexport interface UserPromptSubmitOutput {\n hookEventName: HookEvent.UserPromptSubmit\n\n /** Additional context to add to conversation */\n additionalContext?: string\n}\n\n/**\n * SessionStart hook-specific output\n */\nexport interface SessionStartOutput {\n hookEventName: HookEvent.SessionStart\n\n /** Additional context to load at session start */\n additionalContext?: string\n}\n\n/**\n * Hook execution result (internal)\n */\nexport interface HookExecutionResult {\n /** Whether hook execution succeeded */\n success: boolean\n\n /** Exit code from hook command */\n exitCode: number\n\n /** Standard output */\n stdout: string\n\n /** Standard error */\n stderr: string\n\n /** Parsed JSON output (if valid) */\n output?: HookOutput\n\n /** Error if execution failed */\n error?: Error\n\n /** Execution time in milliseconds */\n executionTime: number\n}\n\n/**\n * Zod schema for hooks.json validation\n */\nexport const HookDefinitionSchema = z.object({\n type: z.enum(['command', 'prompt']),\n command: z.string().optional(),\n prompt: z.string().optional(),\n timeout: z.number().optional(),\n description: z.string().optional(),\n})\n\nexport const HookMatcherSchema = z.object({\n matcher: z.string().optional(),\n hooks: z.array(HookDefinitionSchema),\n})\n\nexport const HooksConfigSchema = z.object({\n description: z.string().optional(),\n hooks: z\n .record(z.nativeEnum(HookEvent), z.array(HookMatcherSchema))\n .optional(),\n})\n\n/**\n * Hook execution context (passed to executor)\n */\nexport interface HookExecutionContext {\n /** Hook definition to execute */\n hook: HookDefinition\n\n /** Hook input data */\n input: HookInput\n\n /** Environment variables to pass to hook */\n env?: Record<string, string>\n\n /** Abort signal for cancellation */\n abortSignal?: AbortSignal\n}\n\n/**\n * Hook decision result (processed from hook output)\n */\nexport interface HookDecision {\n /** Allow the action */\n allow: boolean\n\n /** Block the action */\n block: boolean\n\n /** Ask user for confirmation */\n ask: boolean\n\n /** Reason for decision */\n reason?: string\n\n /** Message to show to user */\n systemMessage?: string\n\n /** Stop execution entirely */\n stop: boolean\n\n /** Stop reason */\n stopReason?: string\n\n /** Additional context to inject */\n additionalContext?: string\n\n /** Modified tool input (for PreToolUse) */\n updatedInput?: Record<string, unknown>\n}\n\n/**\n * Loaded hook (runtime representation)\n */\nexport interface LoadedHook {\n /** Hook name/identifier */\n name: string\n\n /** File path to hook definition */\n filePath: string\n\n /** Hook configuration */\n config: HookDefinition\n\n /** Source plugin name */\n pluginName: string\n\n /** Hook event this hook responds to */\n event: HookEvent\n\n /** Matcher pattern (if applicable) */\n matcher?: string\n}\n"],
|
|
5
|
-
"mappings": "AAIA,SAAS,SAAS;AAMX,IAAK,YAAL,kBAAKA,eAAL;AAEL,EAAAA,WAAA,gBAAa;AACb,EAAAA,WAAA,iBAAc;AACd,EAAAA,WAAA,wBAAqB;AAGrB,EAAAA,WAAA,uBAAoB;AAGpB,EAAAA,WAAA,sBAAmB;AAGnB,EAAAA,WAAA,kBAAe;AACf,EAAAA,WAAA,gBAAa;AAGb,EAAAA,WAAA,UAAO;AAGP,EAAAA,WAAA,mBAAgB;AAChB,EAAAA,WAAA,kBAAe;AAGf,EAAAA,WAAA,kBAAe;AAGf,EAAAA,WAAA,gBAAa;AACb,EAAAA,WAAA,iBAAc;
|
|
4
|
+
"sourcesContent": ["/**\n * Hooks System Type Definitions\n */\n\nimport { z } from 'zod'\n\n/**\n * Hook lifecycle events\n * Full Claude Code CLI compatible set\n */\nexport enum HookEvent {\n // Tool lifecycle\n PreToolUse = 'PreToolUse',\n PostToolUse = 'PostToolUse',\n PostToolUseFailure = 'PostToolUseFailure',\n\n // Permission events\n PermissionRequest = 'PermissionRequest',\n\n // User interaction\n UserPromptSubmit = 'UserPromptSubmit',\n\n // Session lifecycle\n SessionStart = 'SessionStart',\n SessionEnd = 'SessionEnd',\n\n // Execution control\n Stop = 'Stop',\n\n // Subagent lifecycle\n SubagentStart = 'SubagentStart',\n SubagentStop = 'SubagentStop',\n\n // Notifications\n Notification = 'Notification',\n\n // Context management\n PreCompact = 'PreCompact',\n PostCompact = 'PostCompact',\n\n // Configuration\n ConfigChange = 'ConfigChange',\n\n // Task lifecycle\n TaskCompleted = 'TaskCompleted',\n\n // Team collaboration\n TeammateIdle = 'TeammateIdle',\n}\n\n/**\n * Hook execution types\n */\nexport type HookType = 'command' | 'prompt' | 'agent'\n\n/**\n * Hook matcher configuration\n */\nexport interface HookMatcher {\n /** Pattern to match tool names (regex supported). Use \"*\" or \"\" to match all. */\n matcher?: string\n\n /** Pattern to match tool input fields (regex values). CC community compatible. */\n toolInput?: Record<string, string>\n\n /** Array of hooks to execute when matcher matches */\n hooks: HookDefinition[]\n}\n\n/**\n * Individual hook definition\n */\nexport interface HookDefinition {\n /** Hook execution type */\n type: HookType\n\n /** Bash command to execute (for type=\"command\") */\n command?: string\n\n /** Prompt to send to LLM (for type=\"prompt\" or type=\"agent\") */\n prompt?: string\n\n /** Optional timeout in seconds (default: 30 for command, 30 for prompt, 60 for agent) */\n timeout?: number\n\n /** Optional description of what this hook does */\n description?: string\n\n /** Run hook asynchronously (fire-and-forget, result via systemMessage next turn) */\n async?: boolean\n\n /** Only execute once per session */\n once?: boolean\n}\n\n/**\n * hooks.json file schema\n */\nexport interface HooksConfig {\n /** Optional description for plugin hooks */\n description?: string\n\n /** Hook configurations by event type */\n hooks: Partial<Record<HookEvent, HookMatcher[]>>\n}\n\n/**\n * Hook execution input (passed to hook as JSON stdin)\n */\nexport interface HookInput {\n /** Session identifier */\n session_id: string\n\n /** Path to conversation transcript */\n transcript_path: string\n\n /** Current working directory */\n cwd: string\n\n /** Permission mode (default, plan, acceptEdits, bypassPermissions) */\n permission_mode: string\n\n /** Hook event name */\n hook_event_name: HookEvent\n\n /** Event-specific additional fields */\n [key: string]: any\n}\n\n/**\n * PreToolUse hook input\n */\nexport interface PreToolUseInput extends HookInput {\n hook_event_name: HookEvent.PreToolUse\n tool_name: string\n tool_input: Record<string, unknown>\n}\n\n/**\n * PostToolUse hook input\n */\nexport interface PostToolUseInput extends HookInput {\n hook_event_name: HookEvent.PostToolUse\n tool_name: string\n tool_input: Record<string, unknown>\n tool_output: Record<string, unknown>\n}\n\n/**\n * PostToolUseFailure hook input (new)\n */\nexport interface PostToolUseFailureInput extends HookInput {\n hook_event_name: HookEvent.PostToolUseFailure\n tool_name: string\n tool_input: Record<string, unknown>\n error: string\n error_type?: string\n}\n\n/**\n * PermissionRequest hook input (new)\n */\nexport interface PermissionRequestInput extends HookInput {\n hook_event_name: HookEvent.PermissionRequest\n tool_name: string\n tool_input: Record<string, unknown>\n permission_type: 'read' | 'write' | 'execute' | 'network' | 'other'\n description?: string\n}\n\n/**\n * UserPromptSubmit hook input\n */\nexport interface UserPromptSubmitInput extends HookInput {\n hook_event_name: HookEvent.UserPromptSubmit\n user_prompt: string\n}\n\n/**\n * SessionStart hook input\n */\nexport interface SessionStartInput extends HookInput {\n hook_event_name: HookEvent.SessionStart\n source: 'startup' | 'resume' | 'clear' | 'compact'\n}\n\n/**\n * SessionEnd hook input\n */\nexport interface SessionEndInput extends HookInput {\n hook_event_name: HookEvent.SessionEnd\n reason: 'clear' | 'logout' | 'prompt_input_exit' | 'other'\n}\n\n/**\n * Stop hook input\n */\nexport interface StopInput extends HookInput {\n hook_event_name: HookEvent.Stop\n stop_hook_active: boolean\n}\n\n/**\n * SubagentStart hook input (new)\n */\nexport interface SubagentStartInput extends HookInput {\n hook_event_name: HookEvent.SubagentStart\n agent_type: string\n agent_description?: string\n run_in_background?: boolean\n}\n\n/**\n * SubagentStop hook input\n */\nexport interface SubagentStopInput extends HookInput {\n hook_event_name: HookEvent.SubagentStop\n agent_type: string\n agent_id?: string\n stop_hook_active: boolean\n}\n\n/**\n * Notification hook input\n */\nexport interface NotificationInput extends HookInput {\n hook_event_name: HookEvent.Notification\n message: string\n}\n\n/**\n * PreCompact hook input\n */\nexport interface PreCompactInput extends HookInput {\n hook_event_name: HookEvent.PreCompact\n trigger: 'manual' | 'auto'\n custom_instructions: string\n}\n\n/**\n * PostCompact hook input\n */\nexport interface PostCompactInput extends HookInput {\n hook_event_name: HookEvent.PostCompact\n trigger: 'manual' | 'auto'\n summary: string\n compression_ratio: number\n original_tokens: number\n compressed_tokens: number\n}\n\n/**\n * ConfigChange hook input\n */\nexport interface ConfigChangeInput extends HookInput {\n hook_event_name: HookEvent.ConfigChange\n source: 'settings' | 'project' | 'global' | 'env' | 'cli'\n file_path?: string\n}\n\n/**\n * TaskCompleted hook input\n */\nexport interface TaskCompletedInput extends HookInput {\n hook_event_name: HookEvent.TaskCompleted\n task_id: string\n subject: string\n description?: string\n}\n\n/**\n * TeammateIdle hook input\n */\nexport interface TeammateIdleInput extends HookInput {\n hook_event_name: HookEvent.TeammateIdle\n teammate_name: string\n team_name: string\n}\n\n/**\n * Hook execution output (from hook stdout as JSON)\n */\nexport interface HookOutput {\n /** Whether Claude should continue after hook execution */\n continue?: boolean\n\n /** Message shown when continue is false */\n stopReason?: string\n\n /** Hide stdout from transcript mode */\n suppressOutput?: boolean\n\n /** Optional warning message shown to user */\n systemMessage?: string\n\n /** Hook-specific output fields */\n hookSpecificOutput?: HookSpecificOutput\n\n /** Deprecated: Use hookSpecificOutput.permissionDecision instead */\n decision?: 'approve' | 'block'\n\n /** Deprecated: Use hookSpecificOutput.permissionDecisionReason instead */\n reason?: string\n}\n\n/**\n * Hook-specific output for different events\n */\nexport type HookSpecificOutput =\n | PreToolUseOutput\n | PostToolUseOutput\n | UserPromptSubmitOutput\n | SessionStartOutput\n\n/**\n * PreToolUse hook-specific output\n */\nexport interface PreToolUseOutput {\n hookEventName: HookEvent.PreToolUse\n\n /** Permission decision: allow (bypass), deny (block), ask (prompt user) */\n permissionDecision: 'allow' | 'deny' | 'ask'\n\n /** Reason shown to user (allow/ask) or Claude (deny) */\n permissionDecisionReason?: string\n\n /** Modified tool input parameters */\n updatedInput?: Record<string, unknown>\n}\n\n/**\n * PostToolUse hook-specific output\n */\nexport interface PostToolUseOutput {\n hookEventName: HookEvent.PostToolUse\n\n /** Additional context for Claude to consider */\n additionalContext?: string\n}\n\n/**\n * UserPromptSubmit hook-specific output\n */\nexport interface UserPromptSubmitOutput {\n hookEventName: HookEvent.UserPromptSubmit\n\n /** Additional context to add to conversation */\n additionalContext?: string\n}\n\n/**\n * SessionStart hook-specific output\n */\nexport interface SessionStartOutput {\n hookEventName: HookEvent.SessionStart\n\n /** Additional context to load at session start */\n additionalContext?: string\n}\n\n/**\n * Hook execution result (internal)\n */\nexport interface HookExecutionResult {\n /** Whether hook execution succeeded */\n success: boolean\n\n /** Exit code from hook command */\n exitCode: number\n\n /** Standard output */\n stdout: string\n\n /** Standard error */\n stderr: string\n\n /** Parsed JSON output (if valid) */\n output?: HookOutput\n\n /** Error if execution failed */\n error?: Error\n\n /** Execution time in milliseconds */\n executionTime: number\n}\n\n/**\n * Zod schema for hooks.json validation\n */\nexport const HookDefinitionSchema = z.object({\n type: z.enum(['command', 'prompt', 'agent']),\n command: z.string().optional(),\n prompt: z.string().optional(),\n timeout: z.number().optional(),\n description: z.string().optional(),\n async: z.boolean().optional(),\n once: z.boolean().optional(),\n})\n\nexport const HookMatcherSchema = z.object({\n matcher: z.string().optional(),\n toolInput: z.record(z.string()).optional(),\n hooks: z.array(HookDefinitionSchema),\n})\n\nexport const HooksConfigSchema = z.object({\n description: z.string().optional(),\n hooks: z\n .record(z.nativeEnum(HookEvent), z.array(HookMatcherSchema))\n .optional(),\n})\n\n/**\n * Hook execution context (passed to executor)\n */\nexport interface HookExecutionContext {\n /** Hook definition to execute */\n hook: HookDefinition\n\n /** Hook input data */\n input: HookInput\n\n /** Environment variables to pass to hook */\n env?: Record<string, string>\n\n /** Abort signal for cancellation */\n abortSignal?: AbortSignal\n}\n\n/**\n * Hook decision result (processed from hook output)\n */\nexport interface HookDecision {\n /** Allow the action */\n allow: boolean\n\n /** Block the action */\n block: boolean\n\n /** Ask user for confirmation */\n ask: boolean\n\n /** Reason for decision */\n reason?: string\n\n /** Message to show to user */\n systemMessage?: string\n\n /** Stop execution entirely */\n stop: boolean\n\n /** Stop reason */\n stopReason?: string\n\n /** Additional context to inject */\n additionalContext?: string\n\n /** Modified tool input (for PreToolUse) */\n updatedInput?: Record<string, unknown>\n}\n\n/**\n * Loaded hook (runtime representation)\n */\nexport interface LoadedHook {\n /** Hook name/identifier */\n name: string\n\n /** File path to hook definition */\n filePath: string\n\n /** Hook configuration */\n config: HookDefinition\n\n /** Source plugin name */\n pluginName: string\n\n /** Hook event this hook responds to */\n event: HookEvent\n\n /** Matcher pattern (if applicable) */\n matcher?: string\n}\n"],
|
|
5
|
+
"mappings": "AAIA,SAAS,SAAS;AAMX,IAAK,YAAL,kBAAKA,eAAL;AAEL,EAAAA,WAAA,gBAAa;AACb,EAAAA,WAAA,iBAAc;AACd,EAAAA,WAAA,wBAAqB;AAGrB,EAAAA,WAAA,uBAAoB;AAGpB,EAAAA,WAAA,sBAAmB;AAGnB,EAAAA,WAAA,kBAAe;AACf,EAAAA,WAAA,gBAAa;AAGb,EAAAA,WAAA,UAAO;AAGP,EAAAA,WAAA,mBAAgB;AAChB,EAAAA,WAAA,kBAAe;AAGf,EAAAA,WAAA,kBAAe;AAGf,EAAAA,WAAA,gBAAa;AACb,EAAAA,WAAA,iBAAc;AAGd,EAAAA,WAAA,kBAAe;AAGf,EAAAA,WAAA,mBAAgB;AAGhB,EAAAA,WAAA,kBAAe;AArCL,SAAAA;AAAA,GAAA;AA2XL,MAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,MAAM,EAAE,KAAK,CAAC,WAAW,UAAU,OAAO,CAAC;AAAA,EAC3C,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,OAAO,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC5B,MAAM,EAAE,QAAQ,EAAE,SAAS;AAC7B,CAAC;AAEM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACzC,OAAO,EAAE,MAAM,oBAAoB;AACrC,CAAC;AAEM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,OAAO,EACJ,OAAO,EAAE,WAAW,SAAS,GAAG,EAAE,MAAM,iBAAiB,CAAC,EAC1D,SAAS;AACd,CAAC;",
|
|
6
6
|
"names": ["HookEvent"]
|
|
7
7
|
}
|
package/dist/types/plugin.js
CHANGED
|
@@ -13,7 +13,7 @@ const MCPServerConfigSchema = z.object({
|
|
|
13
13
|
args: z.array(z.string()).optional().default([]),
|
|
14
14
|
env: z.record(z.string()).optional().default({}),
|
|
15
15
|
timeout: z.number().optional(),
|
|
16
|
-
// HTTP
|
|
16
|
+
// Transport type: stdio (default), http (Streamable HTTP), sse (legacy SSE)
|
|
17
17
|
type: z.enum(["stdio", "http", "sse"]).optional().default("stdio"),
|
|
18
18
|
url: z.string().optional(),
|
|
19
19
|
headers: z.record(z.string()).optional()
|
|
@@ -24,10 +24,8 @@ const PluginManifestSchema = z.object({
|
|
|
24
24
|
/^[a-z0-9-]+$/,
|
|
25
25
|
"Plugin name must be lowercase alphanumeric with hyphens"
|
|
26
26
|
),
|
|
27
|
-
version: z.string().
|
|
28
|
-
|
|
29
|
-
"Version must follow semver format (e.g., 1.0.0)"
|
|
30
|
-
),
|
|
27
|
+
version: z.string().min(1),
|
|
28
|
+
// Supports semver and commit hashes (for CC sync)
|
|
31
29
|
description: z.string().min(1),
|
|
32
30
|
// Optional metadata
|
|
33
31
|
displayName: z.string().optional(),
|
package/dist/types/plugin.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/types/plugin.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Plugin System Type Definitions\n */\n\nimport { z } from 'zod'\n\n/**\n * Author information (can be string or object)\n */\nexport const AuthorSchema = z.union([\n z.string(),\n z.object({\n name: z.string(),\n email: z.string().email().optional(),\n url: z.string().url().optional(),\n }),\n])\n\n/**\n * MCP Server Configuration Schema\n * Compatible with Claude Code CLI's .mcp.json format\n */\nexport const MCPServerConfigSchema = z.object({\n // Command-based (stdio) servers\n command: z.string().optional(),\n args: z.array(z.string()).optional().default([]),\n env: z.record(z.string()).optional().default({}),\n timeout: z.number().optional(),\n\n // HTTP/SSE servers\n type: z.enum(['stdio', 'http', 'sse']).optional().default('stdio'),\n url: z.string().optional(),\n headers: z.record(z.string()).optional(),\n})\n\nexport type MCPServerConfig = z.infer<typeof MCPServerConfigSchema>\n\n/**\n * Plugin Manifest Schema (plugin.json)\n * This is the source of truth for plugin metadata\n */\nexport const PluginManifestSchema = z.object({\n // Required fields\n name: z\n .string()\n .min(1)\n .regex(\n /^[a-z0-9-]+$/,\n 'Plugin name must be lowercase alphanumeric with hyphens',\n ),\n version: z\n .string()\n .regex(\n /^\\d+\\.\\d+\\.\\d+$/,\n 'Version must follow semver format (e.g., 1.0.0)',\n ),\n description: z.string().min(1),\n\n // Optional metadata\n displayName: z.string().optional(),\n author: AuthorSchema.optional(),\n homepage: z.string().url().optional(),\n repository: z.string().url().optional(),\n license: z.string().optional(),\n\n // Plugin components (relative paths from plugin root)\n agents: z.array(z.string()).optional().default([]),\n commands: z.array(z.string()).optional().default([]),\n skills: z.array(z.string()).optional().default([]),\n hooks: z.array(z.string()).optional().default([]),\n\n // MCP servers support both:\n // - Array of file paths: [\"mcp-servers/server1.json\"]\n // - Object with inline configs: { \"server1\": { command: \"...\" } }\n mcpServers: z\n .union([z.array(z.string()), z.record(MCPServerConfigSchema)])\n .optional()\n .default([]),\n\n // Dependencies\n dependencies: z.record(z.string()).optional().default({}),\n\n // Minto/Claude Code version requirements\n engines: z\n .object({\n minto: z.string().optional(),\n 'claude-code': z.string().optional(),\n node: z.string().optional(),\n })\n .optional(),\n\n // Plugin-specific configuration schema\n configSchema: z.record(z.any()).optional(),\n})\n\nexport type PluginManifest = z.infer<typeof PluginManifestSchema>\n\n/**\n * Loaded Plugin (runtime representation)\n */\nexport interface LoadedPlugin {\n name: string\n manifest: PluginManifest\n location: string // Absolute path to plugin directory\n source: PluginSource\n agents: LoadedAgent[]\n commands: LoadedCommand[]\n skills: LoadedSkill[]\n hooks: LoadedHook[]\n mcpServers: LoadedMCPServer[]\n enabled: boolean\n config?: Record<string, any>\n}\n\n/**\n * Plugin source types\n */\nexport type PluginSource =\n | { type: 'local'; path: string }\n | { type: 'git'; repo: string; ref?: string }\n | { type: 'npm'; package: string; version?: string }\n | { type: 'marketplace'; marketplace: string; name: string }\n\n/**\n * Agent component (from plugin)\n */\nexport interface LoadedAgent {\n name: string\n filePath: string\n config: {\n name: string\n description: string\n tools?: string | string[]\n model?: string\n content: string\n }\n pluginName: string\n}\n\n/**\n * Command component (from plugin)\n */\nexport interface LoadedCommand {\n name: string\n filePath: string\n config: {\n name: string\n description?: string\n aliases?: string[]\n enabled?: boolean\n hidden?: boolean\n progressMessage?: string\n argNames?: string[]\n 'allowed-tools'?: string[]\n content: string\n }\n pluginName: string\n}\n\n/**\n * Skill configuration (Claude Code specification compliant)\n */\nexport interface SkillConfig {\n // Identity\n name: string\n description: string\n argumentHint?: string // Hint for expected arguments\n\n // Invocation control (Claude Code spec)\n disableModelInvocation?: boolean // If true, model cannot auto-invoke (user-only)\n userInvocable?: boolean // If true, user can invoke via /command (default: true)\n\n // Execution configuration\n allowedTools?: string[] // Tools the skill can use\n model?: 'sonnet' | 'opus' | 'haiku' | 'inherit' // Model to use\n\n // Fork context (Claude Code spec)\n context?: 'fork' // Execute in isolated context\n agent?: string // Agent type to use for fork execution\n\n // Content\n content: string\n}\n\n/**\n * Skill component (from plugin or standalone)\n */\nexport interface LoadedSkill {\n name: string\n filePath: string\n config: SkillConfig\n pluginName: string // 'standalone' for standalone skills\n source: 'plugin' | 'user' | 'project' // Where the skill was loaded from\n}\n\n/**\n * Hook component (from plugin)\n */\nexport interface LoadedHook {\n name: string\n filePath: string\n config: {\n event: HookEvent\n matcher?: string\n type: 'command' | 'message' | 'notification'\n command?: string\n message?: string\n blocking?: boolean\n timeout?: number\n }\n pluginName: string\n event: HookEvent // Also store event at root level for easier access\n matcher?: string // Also store matcher at root level\n}\n\n/**\n * Hook lifecycle events\n */\nexport type HookEvent =\n | 'PreToolUse'\n | 'PostToolUse'\n | 'UserPromptSubmit'\n | 'SessionStart'\n | 'SessionEnd'\n | 'Stop'\n | 'SubagentStop'\n | 'Notification'\n | 'PreCompact'\n\n/**\n * MCP Server component (from plugin)\n */\nexport interface LoadedMCPServer {\n name: string\n filePath: string\n config: {\n command: string\n args?: string[]\n env?: Record<string, string>\n timeout?: number\n }\n pluginName: string\n}\n\n/**\n * Plugin installation options\n */\nexport interface PluginInstallOptions {\n source: PluginSource\n global?: boolean // Install globally vs project-level\n enable?: boolean // Auto-enable after install\n config?: Record<string, any> // Plugin-specific config\n}\n\n/**\n * Plugin marketplace configuration\n */\nexport interface PluginMarketplace {\n name: string\n source: PluginSource\n plugins: PluginManifest[]\n}\n\n/**\n * Plugin error types\n */\nexport class PluginError extends Error {\n constructor(\n message: string,\n public code: PluginErrorCode,\n public pluginName?: string,\n public details?: any,\n ) {\n super(message)\n this.name = 'PluginError'\n }\n}\n\nexport enum PluginErrorCode {\n MANIFEST_INVALID = 'MANIFEST_INVALID',\n MANIFEST_NOT_FOUND = 'MANIFEST_NOT_FOUND',\n VERSION_MISMATCH = 'VERSION_MISMATCH',\n DEPENDENCY_MISSING = 'DEPENDENCY_MISSING',\n COMPONENT_NOT_FOUND = 'COMPONENT_NOT_FOUND',\n COMPONENT_INVALID = 'COMPONENT_INVALID',\n ALREADY_INSTALLED = 'ALREADY_INSTALLED',\n NOT_INSTALLED = 'NOT_INSTALLED',\n PERMISSION_DENIED = 'PERMISSION_DENIED',\n}\n\n// ============================================================================\n// Session Plugin Types (Claude Code CLI Compatible)\n// ============================================================================\n\n/**\n * A loaded plugin in the current session\n * Compatible with Claude Code CLI session plugins\n */\nexport interface SessionPlugin {\n /** Plugin name from manifest */\n name: string\n /** Root directory of the plugin */\n rootDir: string\n /** Path to the manifest file */\n manifestPath: string\n /** Raw manifest data */\n manifest: unknown\n /** Directories containing custom commands */\n commandsDirs: string[]\n /** Directories containing skills */\n skillsDirs: string[]\n /** Directories containing agents */\n agentsDirs: string[]\n /** Paths to hooks configuration files */\n hooksFiles: string[]\n /** Directories containing output styles */\n outputStylesDirs: string[]\n /** Paths to MCP server configuration files */\n mcpConfigFiles: string[]\n /** Paths to LSP server configuration files (Claude Code CLI specific) */\n lspConfigFiles: string[]\n}\n\n/**\n * Plugin scope - where the plugin is installed/activated\n */\nexport type PluginScope = 'user' | 'project' | 'local'\n\n/**\n * Installed skill plugin record\n */\nexport interface InstalledSkillPlugin {\n plugin: string\n marketplace: string\n scope: PluginScope\n kind?: 'skill-pack' | 'plugin-pack'\n isEnabled?: boolean\n projectPath?: string\n installedAt: string\n pluginRoot?: string\n skills: string[]\n commands: string[]\n sourceMarketplacePath: string\n}\n"],
|
|
5
|
-
"mappings": "AAIA,SAAS,SAAS;AAKX,MAAM,eAAe,EAAE,MAAM;AAAA,EAClC,EAAE,OAAO;AAAA,EACT,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,OAAO;AAAA,IACf,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS;AAAA,IACnC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACjC,CAAC;AACH,CAAC;AAMM,MAAM,wBAAwB,EAAE,OAAO;AAAA;AAAA,EAE5C,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC/C,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC/C,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA;AAAA,EAG7B,MAAM,EAAE,KAAK,CAAC,SAAS,QAAQ,KAAK,CAAC,EAAE,SAAS,EAAE,QAAQ,OAAO;AAAA,EACjE,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,EACzB,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,SAAS;AACzC,CAAC;AAQM,MAAM,uBAAuB,EAAE,OAAO;AAAA;AAAA,EAE3C,MAAM,EACH,OAAO,EACP,IAAI,CAAC,EACL;AAAA,IACC;AAAA,IACA;AAAA,EACF;AAAA,EACF,SAAS,
|
|
4
|
+
"sourcesContent": ["/**\n * Plugin System Type Definitions\n */\n\nimport { z } from 'zod'\n\n/**\n * Author information (can be string or object)\n */\nexport const AuthorSchema = z.union([\n z.string(),\n z.object({\n name: z.string(),\n email: z.string().email().optional(),\n url: z.string().url().optional(),\n }),\n])\n\n/**\n * MCP Server Configuration Schema\n * Compatible with Claude Code CLI's .mcp.json format\n */\nexport const MCPServerConfigSchema = z.object({\n // Command-based (stdio) servers\n command: z.string().optional(),\n args: z.array(z.string()).optional().default([]),\n env: z.record(z.string()).optional().default({}),\n timeout: z.number().optional(),\n\n // Transport type: stdio (default), http (Streamable HTTP), sse (legacy SSE)\n type: z.enum(['stdio', 'http', 'sse']).optional().default('stdio'),\n url: z.string().optional(),\n headers: z.record(z.string()).optional(),\n})\n\nexport type MCPServerConfig = z.infer<typeof MCPServerConfigSchema>\n\n/**\n * Plugin Manifest Schema (plugin.json)\n * This is the source of truth for plugin metadata\n */\nexport const PluginManifestSchema = z.object({\n // Required fields\n name: z\n .string()\n .min(1)\n .regex(\n /^[a-z0-9-]+$/,\n 'Plugin name must be lowercase alphanumeric with hyphens',\n ),\n version: z.string().min(1), // Supports semver and commit hashes (for CC sync)\n description: z.string().min(1),\n\n // Optional metadata\n displayName: z.string().optional(),\n author: AuthorSchema.optional(),\n homepage: z.string().url().optional(),\n repository: z.string().url().optional(),\n license: z.string().optional(),\n\n // Plugin components (relative paths from plugin root)\n agents: z.array(z.string()).optional().default([]),\n commands: z.array(z.string()).optional().default([]),\n skills: z.array(z.string()).optional().default([]),\n hooks: z.array(z.string()).optional().default([]),\n\n // MCP servers support both:\n // - Array of file paths: [\"mcp-servers/server1.json\"]\n // - Object with inline configs: { \"server1\": { command: \"...\" } }\n mcpServers: z\n .union([z.array(z.string()), z.record(MCPServerConfigSchema)])\n .optional()\n .default([]),\n\n // Dependencies\n dependencies: z.record(z.string()).optional().default({}),\n\n // Minto/Claude Code version requirements\n engines: z\n .object({\n minto: z.string().optional(),\n 'claude-code': z.string().optional(),\n node: z.string().optional(),\n })\n .optional(),\n\n // Plugin-specific configuration schema\n configSchema: z.record(z.any()).optional(),\n})\n\nexport type PluginManifest = z.infer<typeof PluginManifestSchema>\n\n/**\n * Loaded Plugin (runtime representation)\n */\nexport interface LoadedPlugin {\n name: string\n manifest: PluginManifest\n location: string // Absolute path to plugin directory\n source: PluginSource\n agents: LoadedAgent[]\n commands: LoadedCommand[]\n skills: LoadedSkill[]\n hooks: LoadedHook[]\n mcpServers: LoadedMCPServer[]\n lspServers: LoadedLSPServer[]\n enabled: boolean\n config?: Record<string, any>\n /** Plugin agent settings (CC format: { defaultAgent, maxTurns, ... }) */\n settings?: Record<string, any> | null\n}\n\n/**\n * Plugin source types\n */\nexport type PluginSource =\n | { type: 'local'; path: string }\n | { type: 'git'; repo: string; ref?: string }\n | { type: 'npm'; package: string; version?: string }\n | { type: 'marketplace'; marketplace: string; name: string }\n | { type: 'claude-code'; marketplace: string; name: string }\n\n/**\n * Agent component (from plugin)\n */\nexport interface LoadedAgent {\n name: string\n filePath: string\n config: {\n name: string\n description: string\n tools?: string | string[]\n model?: string\n content: string\n }\n pluginName: string\n}\n\n/**\n * Command component (from plugin)\n */\nexport interface LoadedCommand {\n name: string\n filePath: string\n config: {\n name: string\n description?: string\n aliases?: string[]\n enabled?: boolean\n hidden?: boolean\n progressMessage?: string\n argNames?: string[]\n 'allowed-tools'?: string[]\n content: string\n }\n pluginName: string\n}\n\n/**\n * Skill hook definition (inline in SKILL.md frontmatter)\n */\nexport interface SkillHookDefinition {\n event: HookEvent\n matcher?: string\n type?: 'command' | 'prompt' | 'agent'\n command?: string\n prompt?: string\n timeout?: number\n}\n\n/**\n * Skill configuration (Claude Code specification compliant)\n */\nexport interface SkillConfig {\n // Identity\n name: string\n description: string\n argumentHint?: string // Hint for expected arguments\n\n // Invocation control (Claude Code spec)\n disableModelInvocation?: boolean // If true, model cannot auto-invoke (user-only)\n userInvocable?: boolean // If true, user can invoke via /command (default: true)\n\n // Execution configuration\n allowedTools?: string[] // Tools the skill can use\n model?: 'sonnet' | 'opus' | 'haiku' | 'inherit' // Model to use\n\n // Fork context (Claude Code spec)\n context?: 'fork' // Execute in isolated context\n agent?: string // Agent type to use for fork execution\n\n // Lifecycle hooks (Claude Code spec)\n hooks?: SkillHookDefinition[]\n\n // Metadata (Claude Code spec standard fields)\n license?: string\n compatibility?: string | Record<string, string>\n metadata?: Record<string, unknown>\n\n // Content\n content: string\n}\n\n/**\n * Skill component (from plugin or standalone)\n */\nexport interface LoadedSkill {\n name: string\n filePath: string\n config: SkillConfig\n pluginName: string // 'standalone' for standalone skills\n source: 'plugin' | 'user' | 'project' // Where the skill was loaded from\n}\n\n/**\n * Hook component (from plugin)\n */\nexport interface LoadedHook {\n name: string\n filePath: string\n config: {\n event: HookEvent\n matcher?: string\n type: 'command' | 'prompt' | 'agent'\n command?: string\n prompt?: string\n blocking?: boolean\n timeout?: number\n async?: boolean\n once?: boolean\n /** Tool input field patterns for matching (CC spec) */\n toolInput?: Record<string, string>\n }\n pluginName: string\n event: HookEvent // Also store event at root level for easier access\n matcher?: string // Also store matcher at root level\n}\n\n/**\n * Hook lifecycle events\n */\nexport type HookEvent =\n | 'PreToolUse'\n | 'PostToolUse'\n | 'PostToolUseFailure'\n | 'PermissionRequest'\n | 'UserPromptSubmit'\n | 'SessionStart'\n | 'SessionEnd'\n | 'Stop'\n | 'SubagentStart'\n | 'SubagentStop'\n | 'Notification'\n | 'PreCompact'\n | 'PostCompact'\n | 'ConfigChange'\n | 'TaskCompleted'\n | 'TeammateIdle'\n\n/**\n * MCP Server component (from plugin)\n */\nexport interface LoadedMCPServer {\n name: string\n filePath: string\n config: {\n command: string\n args?: string[]\n env?: Record<string, string>\n timeout?: number\n }\n pluginName: string\n}\n\n/**\n * LSP Server component (from plugin)\n * Claude Code CLI compatible: plugins can define language servers\n * via .lsp.json or inline lspServers in plugin.json manifest.\n */\nexport interface LoadedLSPServer {\n name: string\n filePath: string\n config: {\n command: string\n args?: string[]\n env?: Record<string, string>\n /** File patterns this LSP server handles (e.g. [\"*.py\", \"*.pyi\"]) */\n filePatterns?: string[]\n /** Language identifiers (e.g. [\"python\", \"typescript\"]) */\n languages?: string[]\n /** Initialization options for the LSP server */\n initializationOptions?: Record<string, unknown>\n }\n pluginName: string\n}\n\n/**\n * Plugin installation options\n */\nexport interface PluginInstallOptions {\n source: PluginSource\n global?: boolean // Install globally vs project-level\n enable?: boolean // Auto-enable after install\n config?: Record<string, any> // Plugin-specific config\n}\n\n/**\n * Plugin marketplace configuration\n */\nexport interface PluginMarketplace {\n name: string\n source: PluginSource\n plugins: PluginManifest[]\n}\n\n/**\n * Plugin error types\n */\nexport class PluginError extends Error {\n constructor(\n message: string,\n public code: PluginErrorCode,\n public pluginName?: string,\n public details?: any,\n ) {\n super(message)\n this.name = 'PluginError'\n }\n}\n\nexport enum PluginErrorCode {\n MANIFEST_INVALID = 'MANIFEST_INVALID',\n MANIFEST_NOT_FOUND = 'MANIFEST_NOT_FOUND',\n VERSION_MISMATCH = 'VERSION_MISMATCH',\n DEPENDENCY_MISSING = 'DEPENDENCY_MISSING',\n COMPONENT_NOT_FOUND = 'COMPONENT_NOT_FOUND',\n COMPONENT_INVALID = 'COMPONENT_INVALID',\n ALREADY_INSTALLED = 'ALREADY_INSTALLED',\n NOT_INSTALLED = 'NOT_INSTALLED',\n PERMISSION_DENIED = 'PERMISSION_DENIED',\n}\n\n// ============================================================================\n// Session Plugin Types (Claude Code CLI Compatible)\n// ============================================================================\n\n/**\n * A loaded plugin in the current session\n * Compatible with Claude Code CLI session plugins\n */\nexport interface SessionPlugin {\n /** Plugin name from manifest */\n name: string\n /** Root directory of the plugin */\n rootDir: string\n /** Path to the manifest file */\n manifestPath: string\n /** Raw manifest data */\n manifest: unknown\n /** Directories containing custom commands */\n commandsDirs: string[]\n /** Directories containing skills */\n skillsDirs: string[]\n /** Directories containing agents */\n agentsDirs: string[]\n /** Paths to hooks configuration files */\n hooksFiles: string[]\n /** Directories containing output styles */\n outputStylesDirs: string[]\n /** Paths to MCP server configuration files */\n mcpConfigFiles: string[]\n /** Paths to LSP server configuration files (Claude Code CLI specific) */\n lspConfigFiles: string[]\n}\n\n/**\n * Plugin scope - where the plugin is installed/activated\n */\nexport type PluginScope = 'user' | 'project' | 'local'\n\n/**\n * Installed skill plugin record\n */\nexport interface InstalledSkillPlugin {\n plugin: string\n marketplace: string\n scope: PluginScope\n kind?: 'skill-pack' | 'plugin-pack'\n isEnabled?: boolean\n projectPath?: string\n installedAt: string\n pluginRoot?: string\n skills: string[]\n commands: string[]\n sourceMarketplacePath: string\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["PluginErrorCode"]
|
|
7
7
|
}
|
|
@@ -77,10 +77,7 @@ async function executeAgentHooks(event, agentConfig, context) {
|
|
|
77
77
|
break;
|
|
78
78
|
}
|
|
79
79
|
if (!result.success && result.error) {
|
|
80
|
-
console.warn(
|
|
81
|
-
`Hook ${event} execution failed:`,
|
|
82
|
-
result.error.message
|
|
83
|
-
);
|
|
80
|
+
console.warn(`Hook ${event} execution failed:`, result.error.message);
|
|
84
81
|
}
|
|
85
82
|
}
|
|
86
83
|
return {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/agentHookExecutor.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Agent Hook Executor\n *\n * Executes lifecycle hooks for agents as defined in Claude Code specification.\n * Supports onStart, onComplete, and onError hooks with security controls.\n */\n\nimport { exec } from 'child_process'\nimport { promisify } from 'util'\nimport type { HookDefinition } from '@minto-types/hooks'\nimport type { AgentConfig, AgentHooks } from './agentLoader'\nimport { getCwd } from './state'\n\nconst execAsync = promisify(exec)\n\n/**\n * Hook execution context\n */\nexport interface HookExecutionContext {\n sessionId: string\n agentId: string\n agentType: string\n cwd: string\n env?: Record<string, string>\n error?: Error // For onError hooks\n result?: string // For onComplete hooks\n}\n\n/**\n * Hook execution result\n */\nexport interface HookExecutionResult {\n success: boolean\n continue: boolean\n reason?: string\n output?: string\n error?: Error\n executionTime: number\n}\n\n/**\n * Default hook timeout in milliseconds\n */\nconst DEFAULT_HOOK_TIMEOUT = 60000 // 60 seconds\n\n/**\n * Execute a single hook\n */\nasync function executeHook(\n hook: HookDefinition,\n context: HookExecutionContext,\n): Promise<HookExecutionResult> {\n const startTime = Date.now()\n const timeout = (hook.timeout ?? 60) * 1000 // Convert seconds to milliseconds\n\n try {\n if (hook.type === 'command' && hook.command) {\n // Execute shell command\n const { stdout, stderr } = await execAsync(hook.command, {\n timeout: Math.min(timeout, DEFAULT_HOOK_TIMEOUT),\n cwd: context.cwd,\n env: {\n ...process.env,\n ...context.env,\n AGENT_ID: context.agentId,\n AGENT_TYPE: context.agentType,\n SESSION_ID: context.sessionId,\n HOOK_CWD: context.cwd,\n },\n })\n\n // Try to parse JSON output for hook control\n let parsedOutput: any = null\n try {\n if (stdout.trim().startsWith('{')) {\n parsedOutput = JSON.parse(stdout.trim())\n }\n } catch {\n // Not JSON, that's fine\n }\n\n return {\n success: true,\n continue: parsedOutput?.continue !== false,\n reason: parsedOutput?.stopReason,\n output: stdout,\n executionTime: Date.now() - startTime,\n }\n } else if (hook.type === 'prompt' && hook.prompt) {\n // Prompt hooks are handled by the agent system\n // For now, we just return success and let the caller handle the prompt\n return {\n success: true,\n continue: true,\n output: hook.prompt,\n executionTime: Date.now() - startTime,\n }\n }\n\n // Invalid hook configuration\n return {\n success: false,\n continue: true,\n reason: 'Invalid hook configuration: missing command or prompt',\n executionTime: Date.now() - startTime,\n }\n } catch (error) {\n return {\n success: false,\n continue: true, // Default to continue on error\n error: error instanceof Error ? error : new Error(String(error)),\n executionTime: Date.now() - startTime,\n }\n }\n}\n\n/**\n * Execute agent lifecycle hooks\n *\n * @param event - The lifecycle event (onStart, onComplete, onError)\n * @param agentConfig - The agent configuration containing hooks\n * @param context - The execution context\n * @returns Combined result of all hook executions\n */\nexport async function executeAgentHooks(\n event: keyof AgentHooks,\n agentConfig: AgentConfig,\n context: HookExecutionContext,\n): Promise<{ continue: boolean; reason?: string; outputs: string[] }> {\n const hooks = agentConfig.hooks?.[event]\n\n if (!hooks || hooks.length === 0) {\n return { continue: true, outputs: [] }\n }\n\n const outputs: string[] = []\n let shouldContinue = true\n let stopReason: string | undefined\n\n for (const hook of hooks) {\n const result = await executeHook(hook, context)\n\n if (result.output) {\n outputs.push(result.output)\n }\n\n if (!result.continue) {\n shouldContinue = false\n stopReason = result.reason || 'Hook requested stop'\n break // Stop executing further hooks\n }\n\n if (!result.success && result.error) {\n console.warn(
|
|
5
|
-
"mappings": "AAOA,SAAS,YAAY;AACrB,SAAS,iBAAiB;AAG1B,SAAS,cAAc;AAEvB,MAAM,YAAY,UAAU,IAAI;AA8BhC,MAAM,uBAAuB;AAK7B,eAAe,YACb,MACA,SAC8B;AAC9B,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,WAAW,KAAK,WAAW,MAAM;AAEvC,MAAI;AACF,QAAI,KAAK,SAAS,aAAa,KAAK,SAAS;AAE3C,YAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,UAAU,KAAK,SAAS;AAAA,QACvD,SAAS,KAAK,IAAI,SAAS,oBAAoB;AAAA,QAC/C,KAAK,QAAQ;AAAA,QACb,KAAK;AAAA,UACH,GAAG,QAAQ;AAAA,UACX,GAAG,QAAQ;AAAA,UACX,UAAU,QAAQ;AAAA,UAClB,YAAY,QAAQ;AAAA,UACpB,YAAY,QAAQ;AAAA,UACpB,UAAU,QAAQ;AAAA,QACpB;AAAA,MACF,CAAC;AAGD,UAAI,eAAoB;AACxB,UAAI;AACF,YAAI,OAAO,KAAK,EAAE,WAAW,GAAG,GAAG;AACjC,yBAAe,KAAK,MAAM,OAAO,KAAK,CAAC;AAAA,QACzC;AAAA,MACF,QAAQ;AAAA,MAER;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU,cAAc,aAAa;AAAA,QACrC,QAAQ,cAAc;AAAA,QACtB,QAAQ;AAAA,QACR,eAAe,KAAK,IAAI,IAAI;AAAA,MAC9B;AAAA,IACF,WAAW,KAAK,SAAS,YAAY,KAAK,QAAQ;AAGhD,aAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,QAAQ,KAAK;AAAA,QACb,eAAe,KAAK,IAAI,IAAI;AAAA,MAC9B;AAAA,IACF;AAGA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,eAAe,KAAK,IAAI,IAAI;AAAA,IAC9B;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA;AAAA,MACV,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,MAC/D,eAAe,KAAK,IAAI,IAAI;AAAA,IAC9B;AAAA,EACF;AACF;AAUA,eAAsB,kBACpB,OACA,aACA,SACoE;AACpE,QAAM,QAAQ,YAAY,QAAQ,KAAK;AAEvC,MAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,WAAO,EAAE,UAAU,MAAM,SAAS,CAAC,EAAE;AAAA,EACvC;AAEA,QAAM,UAAoB,CAAC;AAC3B,MAAI,iBAAiB;AACrB,MAAI;AAEJ,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,MAAM,YAAY,MAAM,OAAO;AAE9C,QAAI,OAAO,QAAQ;AACjB,cAAQ,KAAK,OAAO,MAAM;AAAA,IAC5B;AAEA,QAAI,CAAC,OAAO,UAAU;AACpB,uBAAiB;AACjB,mBAAa,OAAO,UAAU;AAC9B;AAAA,IACF;AAEA,QAAI,CAAC,OAAO,WAAW,OAAO,OAAO;AACnC,cAAQ
|
|
4
|
+
"sourcesContent": ["/**\n * Agent Hook Executor\n *\n * Executes lifecycle hooks for agents as defined in Claude Code specification.\n * Supports onStart, onComplete, and onError hooks with security controls.\n */\n\nimport { exec } from 'child_process'\nimport { promisify } from 'util'\nimport type { HookDefinition } from '@minto-types/hooks'\nimport type { AgentConfig, AgentHooks } from './agentLoader'\nimport { getCwd } from './state'\n\nconst execAsync = promisify(exec)\n\n/**\n * Hook execution context\n */\nexport interface HookExecutionContext {\n sessionId: string\n agentId: string\n agentType: string\n cwd: string\n env?: Record<string, string>\n error?: Error // For onError hooks\n result?: string // For onComplete hooks\n}\n\n/**\n * Hook execution result\n */\nexport interface HookExecutionResult {\n success: boolean\n continue: boolean\n reason?: string\n output?: string\n error?: Error\n executionTime: number\n}\n\n/**\n * Default hook timeout in milliseconds\n */\nconst DEFAULT_HOOK_TIMEOUT = 60000 // 60 seconds\n\n/**\n * Execute a single hook\n */\nasync function executeHook(\n hook: HookDefinition,\n context: HookExecutionContext,\n): Promise<HookExecutionResult> {\n const startTime = Date.now()\n const timeout = (hook.timeout ?? 60) * 1000 // Convert seconds to milliseconds\n\n try {\n if (hook.type === 'command' && hook.command) {\n // Execute shell command\n const { stdout, stderr } = await execAsync(hook.command, {\n timeout: Math.min(timeout, DEFAULT_HOOK_TIMEOUT),\n cwd: context.cwd,\n env: {\n ...process.env,\n ...context.env,\n AGENT_ID: context.agentId,\n AGENT_TYPE: context.agentType,\n SESSION_ID: context.sessionId,\n HOOK_CWD: context.cwd,\n },\n })\n\n // Try to parse JSON output for hook control\n let parsedOutput: any = null\n try {\n if (stdout.trim().startsWith('{')) {\n parsedOutput = JSON.parse(stdout.trim())\n }\n } catch {\n // Not JSON, that's fine\n }\n\n return {\n success: true,\n continue: parsedOutput?.continue !== false,\n reason: parsedOutput?.stopReason,\n output: stdout,\n executionTime: Date.now() - startTime,\n }\n } else if (hook.type === 'prompt' && hook.prompt) {\n // Prompt hooks are handled by the agent system\n // For now, we just return success and let the caller handle the prompt\n return {\n success: true,\n continue: true,\n output: hook.prompt,\n executionTime: Date.now() - startTime,\n }\n }\n\n // Invalid hook configuration\n return {\n success: false,\n continue: true,\n reason: 'Invalid hook configuration: missing command or prompt',\n executionTime: Date.now() - startTime,\n }\n } catch (error) {\n return {\n success: false,\n continue: true, // Default to continue on error\n error: error instanceof Error ? error : new Error(String(error)),\n executionTime: Date.now() - startTime,\n }\n }\n}\n\n/**\n * Execute agent lifecycle hooks\n *\n * @param event - The lifecycle event (onStart, onComplete, onError)\n * @param agentConfig - The agent configuration containing hooks\n * @param context - The execution context\n * @returns Combined result of all hook executions\n */\nexport async function executeAgentHooks(\n event: keyof AgentHooks,\n agentConfig: AgentConfig,\n context: HookExecutionContext,\n): Promise<{ continue: boolean; reason?: string; outputs: string[] }> {\n const hooks = agentConfig.hooks?.[event]\n\n if (!hooks || hooks.length === 0) {\n return { continue: true, outputs: [] }\n }\n\n const outputs: string[] = []\n let shouldContinue = true\n let stopReason: string | undefined\n\n for (const hook of hooks) {\n const result = await executeHook(hook, context)\n\n if (result.output) {\n outputs.push(result.output)\n }\n\n if (!result.continue) {\n shouldContinue = false\n stopReason = result.reason || 'Hook requested stop'\n break // Stop executing further hooks\n }\n\n if (!result.success && result.error) {\n console.warn(`Hook ${event} execution failed:`, result.error.message)\n // Continue to next hook on error by default\n }\n }\n\n return {\n continue: shouldContinue,\n reason: stopReason,\n outputs,\n }\n}\n\n/**\n * Create hook execution context from agent execution state\n */\nexport function createHookContext(params: {\n sessionId: string\n agentId: string\n agentType: string\n error?: Error\n result?: string\n}): HookExecutionContext {\n return {\n sessionId: params.sessionId,\n agentId: params.agentId,\n agentType: params.agentType,\n cwd: getCwd(),\n error: params.error,\n result: params.result,\n }\n}\n"],
|
|
5
|
+
"mappings": "AAOA,SAAS,YAAY;AACrB,SAAS,iBAAiB;AAG1B,SAAS,cAAc;AAEvB,MAAM,YAAY,UAAU,IAAI;AA8BhC,MAAM,uBAAuB;AAK7B,eAAe,YACb,MACA,SAC8B;AAC9B,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,WAAW,KAAK,WAAW,MAAM;AAEvC,MAAI;AACF,QAAI,KAAK,SAAS,aAAa,KAAK,SAAS;AAE3C,YAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,UAAU,KAAK,SAAS;AAAA,QACvD,SAAS,KAAK,IAAI,SAAS,oBAAoB;AAAA,QAC/C,KAAK,QAAQ;AAAA,QACb,KAAK;AAAA,UACH,GAAG,QAAQ;AAAA,UACX,GAAG,QAAQ;AAAA,UACX,UAAU,QAAQ;AAAA,UAClB,YAAY,QAAQ;AAAA,UACpB,YAAY,QAAQ;AAAA,UACpB,UAAU,QAAQ;AAAA,QACpB;AAAA,MACF,CAAC;AAGD,UAAI,eAAoB;AACxB,UAAI;AACF,YAAI,OAAO,KAAK,EAAE,WAAW,GAAG,GAAG;AACjC,yBAAe,KAAK,MAAM,OAAO,KAAK,CAAC;AAAA,QACzC;AAAA,MACF,QAAQ;AAAA,MAER;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU,cAAc,aAAa;AAAA,QACrC,QAAQ,cAAc;AAAA,QACtB,QAAQ;AAAA,QACR,eAAe,KAAK,IAAI,IAAI;AAAA,MAC9B;AAAA,IACF,WAAW,KAAK,SAAS,YAAY,KAAK,QAAQ;AAGhD,aAAO;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,QAAQ,KAAK;AAAA,QACb,eAAe,KAAK,IAAI,IAAI;AAAA,MAC9B;AAAA,IACF;AAGA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,eAAe,KAAK,IAAI,IAAI;AAAA,IAC9B;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA;AAAA,MACV,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,MAC/D,eAAe,KAAK,IAAI,IAAI;AAAA,IAC9B;AAAA,EACF;AACF;AAUA,eAAsB,kBACpB,OACA,aACA,SACoE;AACpE,QAAM,QAAQ,YAAY,QAAQ,KAAK;AAEvC,MAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,WAAO,EAAE,UAAU,MAAM,SAAS,CAAC,EAAE;AAAA,EACvC;AAEA,QAAM,UAAoB,CAAC;AAC3B,MAAI,iBAAiB;AACrB,MAAI;AAEJ,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,MAAM,YAAY,MAAM,OAAO;AAE9C,QAAI,OAAO,QAAQ;AACjB,cAAQ,KAAK,OAAO,MAAM;AAAA,IAC5B;AAEA,QAAI,CAAC,OAAO,UAAU;AACpB,uBAAiB;AACjB,mBAAa,OAAO,UAAU;AAC9B;AAAA,IACF;AAEA,QAAI,CAAC,OAAO,WAAW,OAAO,OAAO;AACnC,cAAQ,KAAK,QAAQ,KAAK,sBAAsB,OAAO,MAAM,OAAO;AAAA,IAEtE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,UAAU;AAAA,IACV,QAAQ;AAAA,IACR;AAAA,EACF;AACF;AAKO,SAAS,kBAAkB,QAMT;AACvB,SAAO;AAAA,IACL,WAAW,OAAO;AAAA,IAClB,SAAS,OAAO;AAAA,IAChB,WAAW,OAAO;AAAA,IAClB,KAAK,OAAO;AAAA,IACZ,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,EACjB;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|