@within-7/minto 0.4.0 → 0.4.2
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 +7 -0
- package/dist/Tool.js.map +2 -2
- package/dist/commands/agents/AgentsCommand.js +1 -1
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/agents/constants.js +2 -2
- package/dist/commands/agents/constants.js.map +2 -2
- package/dist/commands/clear.js +4 -3
- package/dist/commands/clear.js.map +2 -2
- package/dist/commands/compact.js +2 -2
- package/dist/commands/compact.js.map +1 -1
- package/dist/commands/context.js +3 -1
- package/dist/commands/context.js.map +2 -2
- package/dist/commands/login.js +128 -0
- package/dist/commands/login.js.map +7 -0
- package/dist/commands/memory.js +33 -82
- package/dist/commands/memory.js.map +2 -2
- package/dist/commands/quit.js +3 -1
- package/dist/commands/quit.js.map +2 -2
- package/dist/commands/resume.js +39 -239
- package/dist/commands/resume.js.map +2 -2
- package/dist/commands/tasks.js +1 -1
- package/dist/commands/tasks.js.map +2 -2
- package/dist/commands/terminalSetup.js +6 -2
- package/dist/commands/terminalSetup.js.map +2 -2
- package/dist/commands.js +2 -0
- package/dist/commands.js.map +2 -2
- package/dist/components/AgentDetailView.js +126 -0
- package/dist/components/AgentDetailView.js.map +7 -0
- package/dist/components/AgentThinkingBlock.js +1 -1
- package/dist/components/AgentThinkingBlock.js.map +2 -2
- package/dist/components/AgentViewBanner.js +22 -0
- package/dist/components/AgentViewBanner.js.map +7 -0
- package/dist/components/HeaderBar.js +1 -1
- package/dist/components/HeaderBar.js.map +2 -2
- package/dist/components/Help.js +8 -1
- package/dist/components/Help.js.map +2 -2
- package/dist/components/HotkeyHelpPanel.js +26 -8
- package/dist/components/HotkeyHelpPanel.js.map +2 -2
- package/dist/components/IdleNotificationBar.js +10 -0
- package/dist/components/IdleNotificationBar.js.map +7 -0
- package/dist/components/ModelSelector/ModelSelector.js +55 -20
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/PromptInput.js +186 -115
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/RewindPanel.js +272 -0
- package/dist/components/RewindPanel.js.map +7 -0
- package/dist/components/Spinner.js +10 -21
- package/dist/components/Spinner.js.map +2 -2
- package/dist/components/StreamingTextPreview.js +29 -0
- package/dist/components/StreamingTextPreview.js.map +7 -0
- package/dist/components/SubagentBlock.js +3 -2
- package/dist/components/SubagentBlock.js.map +2 -2
- package/dist/components/SubagentProgress.js +4 -4
- package/dist/components/SubagentProgress.js.map +2 -2
- package/dist/components/TabbedListView/SearchInput.js +1 -1
- package/dist/components/TabbedListView/SearchInput.js.map +2 -2
- package/dist/components/TabbedListView/TabbedListView.js +87 -41
- package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
- package/dist/components/TaskCard.js +4 -4
- package/dist/components/TaskCard.js.map +2 -2
- package/dist/components/TeamMemberPanel.js +107 -0
- package/dist/components/TeamMemberPanel.js.map +7 -0
- package/dist/components/ThinkingSelector.js +84 -0
- package/dist/components/ThinkingSelector.js.map +7 -0
- package/dist/components/TitledDivider.js +26 -0
- package/dist/components/TitledDivider.js.map +7 -0
- package/dist/components/TodoPanel.js +31 -30
- package/dist/components/TodoPanel.js.map +2 -2
- package/dist/components/TokenWarning.js +28 -7
- package/dist/components/TokenWarning.js.map +2 -2
- package/dist/components/messages/AssistantTextMessage.js +5 -2
- package/dist/components/messages/AssistantTextMessage.js.map +2 -2
- package/dist/components/messages/AssistantToolUseMessage.js +9 -1
- package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
- package/dist/components/messages/DefaultToolResultFallback.js +11 -0
- package/dist/components/messages/DefaultToolResultFallback.js.map +7 -0
- package/dist/components/messages/ParallelTasksGroupView.js +14 -6
- package/dist/components/messages/ParallelTasksGroupView.js.map +2 -2
- package/dist/components/messages/TaskInModuleView.js +27 -27
- package/dist/components/messages/TaskInModuleView.js.map +2 -2
- package/dist/components/messages/UserGuidanceMessage.js +26 -0
- package/dist/components/messages/UserGuidanceMessage.js.map +7 -0
- package/dist/components/messages/UserPromptMessage.js +2 -1
- package/dist/components/messages/UserPromptMessage.js.map +2 -2
- package/dist/components/messages/UserTeamNotificationMessage.js +91 -0
- package/dist/components/messages/UserTeamNotificationMessage.js.map +7 -0
- package/dist/components/messages/UserTextMessage.js +8 -0
- package/dist/components/messages/UserTextMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js +4 -2
- package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js +18 -1
- package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +12 -1
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
- package/dist/components/permissions/PermissionRequest.js +4 -0
- package/dist/components/permissions/PermissionRequest.js.map +2 -2
- package/dist/components/permissions/PlanApprovalRequest.js +164 -0
- package/dist/components/permissions/PlanApprovalRequest.js.map +7 -0
- package/dist/constants/agentTeams.js +17 -0
- package/dist/constants/agentTeams.js.map +7 -0
- package/dist/constants/macros.js +2 -1
- package/dist/constants/macros.js.map +2 -2
- package/dist/constants/prompts/agentPrompt.js +1 -0
- package/dist/constants/prompts/agentPrompt.js.map +2 -2
- package/dist/constants/prompts/autoMemory.js +39 -0
- package/dist/constants/prompts/autoMemory.js.map +7 -0
- package/dist/constants/prompts/codeConventions.js +1 -13
- package/dist/constants/prompts/codeConventions.js.map +2 -2
- package/dist/constants/prompts/doingTasks.js +21 -2
- package/dist/constants/prompts/doingTasks.js.map +2 -2
- package/dist/constants/prompts/envInfo.js +6 -7
- package/dist/constants/prompts/envInfo.js.map +2 -2
- package/dist/constants/prompts/index.js +27 -5
- package/dist/constants/prompts/index.js.map +2 -2
- package/dist/constants/prompts/taskManagement.js +2 -43
- package/dist/constants/prompts/taskManagement.js.map +2 -2
- package/dist/constants/prompts/teamOverlays.js +50 -0
- package/dist/constants/prompts/teamOverlays.js.map +7 -0
- package/dist/constants/prompts/toneAndStyle.js +4 -29
- package/dist/constants/prompts/toneAndStyle.js.map +2 -2
- package/dist/constants/prompts/toolUsagePolicy.js +7 -22
- package/dist/constants/prompts/toolUsagePolicy.js.map +2 -2
- package/dist/constants/toolInputExamples.js +2 -2
- package/dist/constants/toolInputExamples.js.map +2 -2
- package/dist/context.js +39 -6
- package/dist/context.js.map +2 -2
- package/dist/core/backupManager.js +1 -1
- package/dist/core/backupManager.js.map +2 -2
- package/dist/core/permissions/rules/planModeRule.js +1 -1
- package/dist/core/permissions/rules/planModeRule.js.map +1 -1
- package/dist/core/permissions/rules/safeModeRule.js +1 -1
- package/dist/core/permissions/rules/safeModeRule.js.map +1 -1
- package/dist/engine/AgentEngine.js +902 -0
- package/dist/engine/AgentEngine.js.map +7 -0
- package/dist/engine/EngineRegistry.js +89 -0
- package/dist/engine/EngineRegistry.js.map +7 -0
- package/dist/engine/foregroundAdapter.js +191 -0
- package/dist/engine/foregroundAdapter.js.map +7 -0
- package/dist/engine/index.js +15 -0
- package/dist/engine/index.js.map +7 -0
- package/dist/engine/types.js +1 -0
- package/dist/engine/types.js.map +7 -0
- package/dist/entrypoints/cli.js +410 -79
- package/dist/entrypoints/cli.js.map +3 -3
- package/dist/hooks/useAgentEngine.js +129 -0
- package/dist/hooks/useAgentEngine.js.map +7 -0
- package/dist/hooks/useAgentTokenStats.js +0 -16
- package/dist/hooks/useAgentTokenStats.js.map +2 -2
- package/dist/hooks/useCanUseTool.js +47 -2
- package/dist/hooks/useCanUseTool.js.map +2 -2
- package/dist/hooks/useDeferredLoading.js +4 -1
- package/dist/hooks/useDeferredLoading.js.map +2 -2
- package/dist/hooks/useIdleNotifications.js +66 -0
- package/dist/hooks/useIdleNotifications.js.map +7 -0
- package/dist/hooks/useSessionTracking.js +9 -7
- package/dist/hooks/useSessionTracking.js.map +2 -2
- package/dist/hooks/useTeamMembers.js +51 -0
- package/dist/hooks/useTeamMembers.js.map +7 -0
- package/dist/i18n/locales/en.js +77 -12
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.js +77 -12
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/i18n/types.js.map +1 -1
- package/dist/messages.js.map +2 -2
- package/dist/permissions.js +113 -7
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +135 -37
- package/dist/query.js.map +2 -2
- package/dist/screens/REPL.js +504 -361
- package/dist/screens/REPL.js.map +3 -3
- package/dist/screens/ResumeConversation.js +199 -14
- package/dist/screens/ResumeConversation.js.map +2 -2
- package/dist/services/adapters/base.js.map +1 -1
- package/dist/services/agentTeams/backends/headless.js +108 -0
- package/dist/services/agentTeams/backends/headless.js.map +7 -0
- package/dist/services/agentTeams/backends/inProcess.js +102 -0
- package/dist/services/agentTeams/backends/inProcess.js.map +7 -0
- package/dist/services/agentTeams/backends/resolver.js +18 -0
- package/dist/services/agentTeams/backends/resolver.js.map +7 -0
- package/dist/services/agentTeams/backends/tmux.js +168 -0
- package/dist/services/agentTeams/backends/tmux.js.map +7 -0
- package/dist/services/agentTeams/backends/types.js +1 -0
- package/dist/services/agentTeams/backends/types.js.map +7 -0
- package/dist/services/agentTeams/heartbeat.js +88 -0
- package/dist/services/agentTeams/heartbeat.js.map +7 -0
- package/dist/services/agentTeams/index.js +42 -2
- package/dist/services/agentTeams/index.js.map +2 -2
- package/dist/services/agentTeams/injectionChannel.js +105 -0
- package/dist/services/agentTeams/injectionChannel.js.map +7 -0
- package/dist/services/agentTeams/mailbox.js +410 -30
- package/dist/services/agentTeams/mailbox.js.map +2 -2
- package/dist/services/agentTeams/messageFormatter.js +80 -0
- package/dist/services/agentTeams/messageFormatter.js.map +7 -0
- package/dist/services/agentTeams/permissionDelegation.js +71 -0
- package/dist/services/agentTeams/permissionDelegation.js.map +7 -0
- package/dist/services/agentTeams/teamEvents.js +45 -0
- package/dist/services/agentTeams/teamEvents.js.map +7 -0
- package/dist/services/agentTeams/teamManager.js +251 -34
- package/dist/services/agentTeams/teamManager.js.map +2 -2
- package/dist/services/agentTeams/teamTaskStore.js +290 -61
- package/dist/services/agentTeams/teamTaskStore.js.map +2 -2
- package/dist/services/agentTeams/teammateSpawner.js +99 -18
- package/dist/services/agentTeams/teammateSpawner.js.map +2 -2
- package/dist/services/hookExecutor.js +51 -8
- package/dist/services/hookExecutor.js.map +2 -2
- package/dist/services/llm/anthropicProvider.js +56 -59
- package/dist/services/llm/anthropicProvider.js.map +2 -2
- package/dist/services/llm/dispatch.js +24 -5
- package/dist/services/llm/dispatch.js.map +2 -2
- package/dist/services/llm/openaiProvider.js +115 -136
- package/dist/services/llm/openaiProvider.js.map +3 -3
- package/dist/services/llm/types.js +89 -15
- package/dist/services/llm/types.js.map +2 -2
- package/dist/services/mcpClient.js +80 -4
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/mintoAuth.js +299 -0
- package/dist/services/mintoAuth.js.map +7 -0
- package/dist/services/oauth.js +3 -3
- package/dist/services/oauth.js.map +2 -2
- package/dist/services/openai.js +91 -20
- package/dist/services/openai.js.map +2 -2
- package/dist/services/plugins/pluginRuntime.js +11 -5
- package/dist/services/plugins/pluginRuntime.js.map +2 -2
- package/dist/services/plugins/pluginValidation.js +4 -2
- package/dist/services/plugins/pluginValidation.js.map +2 -2
- package/dist/services/sandbox/sandboxController.js +11 -3
- package/dist/services/sandbox/sandboxController.js.map +2 -2
- package/dist/services/sessionMemoryInjector.js +77 -0
- package/dist/services/sessionMemoryInjector.js.map +7 -0
- package/dist/services/systemReminder.js +130 -8
- package/dist/services/systemReminder.js.map +2 -2
- package/dist/services/taskStore.js +199 -8
- package/dist/services/taskStore.js.map +3 -3
- package/dist/services/topicDetector.js +169 -0
- package/dist/services/topicDetector.js.map +7 -0
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +0 -13
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
- package/dist/tools/BashTool/BashTool.js +51 -28
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/BashTool/prompt.js +95 -118
- package/dist/tools/BashTool/prompt.js.map +2 -2
- package/dist/tools/BashTool/utils.js +39 -1
- package/dist/tools/BashTool/utils.js.map +2 -2
- package/dist/tools/EnterWorktreeTool/EnterWorktreeTool.js +121 -0
- package/dist/tools/EnterWorktreeTool/EnterWorktreeTool.js.map +7 -0
- package/dist/tools/EnterWorktreeTool/prompt.js +22 -0
- package/dist/tools/EnterWorktreeTool/prompt.js.map +7 -0
- package/dist/tools/FileEditTool/FileEditTool.js +9 -4
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileEditTool/prompt.js +3 -7
- package/dist/tools/FileEditTool/prompt.js.map +2 -2
- package/dist/tools/FileReadTool/FileReadTool.js +125 -3
- package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
- package/dist/tools/FileReadTool/prompt.js +1 -2
- package/dist/tools/FileReadTool/prompt.js.map +2 -2
- package/dist/tools/FileWriteTool/prompt.js +3 -5
- package/dist/tools/FileWriteTool/prompt.js.map +2 -2
- package/dist/tools/GlobTool/GlobTool.js +3 -2
- package/dist/tools/GlobTool/GlobTool.js.map +2 -2
- package/dist/tools/GrepTool/GrepTool.js +16 -5
- package/dist/tools/GrepTool/GrepTool.js.map +2 -2
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +2 -2
- package/dist/tools/MCPSearchTool/MCPSearchTool.js +172 -0
- package/dist/tools/MCPSearchTool/MCPSearchTool.js.map +7 -0
- package/dist/tools/MCPSearchTool/prompt.js +77 -0
- package/dist/tools/MCPSearchTool/prompt.js.map +7 -0
- package/dist/tools/MultiEditTool/prompt.js +4 -7
- package/dist/tools/MultiEditTool/prompt.js.map +2 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +12 -8
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +54 -1
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
- package/dist/tools/PlanModeTool/prompt.js +23 -74
- package/dist/tools/PlanModeTool/prompt.js.map +2 -2
- package/dist/tools/SendMessageTool/SendMessageTool.js +341 -0
- package/dist/tools/SendMessageTool/SendMessageTool.js.map +7 -0
- package/dist/tools/SendMessageTool/prompt.js +44 -0
- package/dist/tools/SendMessageTool/prompt.js.map +7 -0
- package/dist/tools/TaskCreateTool/prompt.js +15 -4
- package/dist/tools/TaskCreateTool/prompt.js.map +2 -2
- package/dist/tools/TaskListTool/prompt.js +18 -3
- package/dist/tools/TaskListTool/prompt.js.map +2 -2
- package/dist/tools/TaskOutputTool/prompt.js +4 -3
- package/dist/tools/TaskOutputTool/prompt.js.map +2 -2
- package/dist/tools/TaskTool/TaskTool.js +762 -98
- package/dist/tools/TaskTool/TaskTool.js.map +3 -3
- package/dist/tools/TaskTool/constants.js +8 -2
- package/dist/tools/TaskTool/constants.js.map +2 -2
- package/dist/tools/TaskTool/prompt.js +74 -70
- package/dist/tools/TaskTool/prompt.js.map +2 -2
- package/dist/tools/TaskUpdateTool/TaskUpdateTool.js +15 -1
- package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +2 -2
- package/dist/tools/TeamCreateTool/TeamCreateTool.js +129 -0
- package/dist/tools/TeamCreateTool/TeamCreateTool.js.map +7 -0
- package/dist/tools/TeamCreateTool/prompt.js +58 -0
- package/dist/tools/TeamCreateTool/prompt.js.map +7 -0
- package/dist/tools/TeamDeleteTool/TeamDeleteTool.js +151 -0
- package/dist/tools/TeamDeleteTool/TeamDeleteTool.js.map +7 -0
- package/dist/tools/TeamDeleteTool/prompt.js +16 -0
- package/dist/tools/TeamDeleteTool/prompt.js.map +7 -0
- package/dist/tools/URLFetcherTool/URLFetcherTool.js +106 -15
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/prompt.js +3 -2
- package/dist/tools/URLFetcherTool/prompt.js.map +2 -2
- package/dist/tools/WebSearchTool/WebSearchTool.js +2 -1
- package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
- package/dist/tools/WebSearchTool/prompt.js +5 -4
- package/dist/tools/WebSearchTool/prompt.js.map +2 -2
- package/dist/tools.js +100 -20
- package/dist/tools.js.map +2 -2
- package/dist/types/PermissionMode.js +35 -6
- package/dist/types/PermissionMode.js.map +2 -2
- package/dist/types/hooks.js +2 -0
- package/dist/types/hooks.js.map +2 -2
- package/dist/types/plugin.js +2 -0
- package/dist/types/plugin.js.map +3 -3
- package/dist/utils/CircuitBreaker.js +15 -9
- package/dist/utils/CircuitBreaker.js.map +2 -2
- package/dist/utils/agentLoader.js +249 -112
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/animationManager.js +40 -3
- package/dist/utils/animationManager.js.map +2 -2
- package/dist/utils/ask.js +7 -6
- package/dist/utils/ask.js.map +2 -2
- package/dist/utils/atomicWrite.js +23 -0
- package/dist/utils/atomicWrite.js.map +7 -0
- package/dist/utils/autoCompactCore.js +73 -56
- package/dist/utils/autoCompactCore.js.map +2 -2
- package/dist/utils/autoMemoryPaths.js +89 -0
- package/dist/utils/autoMemoryPaths.js.map +7 -0
- package/dist/utils/config.js +63 -38
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/configSchema.js +13 -8
- package/dist/utils/configSchema.js.map +2 -2
- package/dist/utils/credentials/index.js +14 -0
- package/dist/utils/credentials/index.js.map +2 -2
- package/dist/utils/dualPath.js +24 -0
- package/dist/utils/dualPath.js.map +7 -0
- package/dist/utils/exit.js +66 -7
- package/dist/utils/exit.js.map +2 -2
- package/dist/utils/externalEditor.js +155 -0
- package/dist/utils/externalEditor.js.map +7 -0
- package/dist/utils/fileLock.js +67 -0
- package/dist/utils/fileLock.js.map +7 -0
- package/dist/utils/format.js +24 -14
- package/dist/utils/format.js.map +2 -2
- package/dist/utils/globalErrorHandler.js +5 -96
- package/dist/utils/globalErrorHandler.js.map +3 -3
- package/dist/utils/groupHandlers/parallelTasksHandler.js +5 -3
- package/dist/utils/groupHandlers/parallelTasksHandler.js.map +2 -2
- package/dist/utils/groupHandlers/taskHandler.js +2 -2
- package/dist/utils/groupHandlers/taskHandler.js.map +2 -2
- package/dist/utils/hookManager.js +64 -6
- package/dist/utils/hookManager.js.map +2 -2
- package/dist/utils/log.js +6 -2
- package/dist/utils/log.js.map +2 -2
- package/dist/utils/markdown.js +237 -19
- package/dist/utils/markdown.js.map +2 -2
- package/dist/utils/messageContextManager.js +18 -5
- package/dist/utils/messageContextManager.js.map +2 -2
- package/dist/utils/messageGroupManager.js +1 -1
- package/dist/utils/messageGroupManager.js.map +2 -2
- package/dist/utils/messages.js +104 -46
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/model.js +2 -2
- package/dist/utils/model.js.map +2 -2
- package/dist/utils/pasteCache.js +8 -4
- package/dist/utils/pasteCache.js.map +2 -2
- package/dist/utils/pluginLoader.js +18 -0
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/secureKeyStorage.js +36 -7
- package/dist/utils/secureKeyStorage.js.map +2 -2
- package/dist/utils/simpleMode.js +7 -0
- package/dist/utils/simpleMode.js.map +7 -0
- package/dist/utils/streamingState.js +11 -1
- package/dist/utils/streamingState.js.map +2 -2
- package/dist/utils/taskDisplayUtils.js +2 -1
- package/dist/utils/taskDisplayUtils.js.map +2 -2
- package/dist/utils/teamConfig.js +2 -2
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/thinking.js +6 -2
- package/dist/utils/thinking.js.map +3 -3
- package/dist/utils/tokenProgress.js +55 -0
- package/dist/utils/tokenProgress.js.map +7 -0
- package/dist/utils/toolRiskClassification.js +26 -17
- package/dist/utils/toolRiskClassification.js.map +2 -2
- package/dist/utils/tooling/toolError.js +12 -0
- package/dist/utils/tooling/toolError.js.map +7 -0
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +10 -8
package/dist/tools.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import { cacheToolDescriptions } from "./Tool.js";
|
|
1
|
+
import { cacheToolDescriptions, getToolDescriptionAsync } from "./Tool.js";
|
|
2
2
|
import { TaskTool } from "./tools/TaskTool/TaskTool.js";
|
|
3
3
|
import { ArchitectTool } from "./tools/ArchitectTool/ArchitectTool.js";
|
|
4
4
|
import { BashTool } from "./tools/BashTool/BashTool.js";
|
|
5
|
-
import { BashOutputTool } from "./tools/BashOutputTool/BashOutputTool.js";
|
|
6
|
-
import { KillShellTool } from "./tools/KillShellTool/KillShellTool.js";
|
|
7
5
|
import { AskExpertModelTool } from "./tools/AskExpertModelTool/AskExpertModelTool.js";
|
|
8
6
|
import { AskUserQuestionTool } from "./tools/AskUserQuestionTool/AskUserQuestionTool.js";
|
|
9
7
|
import { FileEditTool } from "./tools/FileEditTool/FileEditTool.js";
|
|
@@ -33,20 +31,32 @@ import { TaskStopTool } from "./tools/TaskStopTool/TaskStopTool.js";
|
|
|
33
31
|
import { SlashCommandTool } from "./tools/SlashCommandTool/SlashCommandTool.js";
|
|
34
32
|
import { ListMcpResourcesTool } from "./tools/ListMcpResourcesTool/ListMcpResourcesTool.js";
|
|
35
33
|
import { ReadMcpResourceTool } from "./tools/ReadMcpResourceTool/ReadMcpResourceTool.js";
|
|
36
|
-
import {
|
|
34
|
+
import { MCPSearchTool } from "./tools/MCPSearchTool/MCPSearchTool.js";
|
|
35
|
+
import { EnterWorktreeTool } from "./tools/EnterWorktreeTool/EnterWorktreeTool.js";
|
|
36
|
+
import { TeamCreateTool } from "./tools/TeamCreateTool/TeamCreateTool.js";
|
|
37
|
+
import { SendMessageTool } from "./tools/SendMessageTool/SendMessageTool.js";
|
|
38
|
+
import { TeamDeleteTool } from "./tools/TeamDeleteTool/TeamDeleteTool.js";
|
|
39
|
+
import {
|
|
40
|
+
getMCPTools,
|
|
41
|
+
isMCPToolActivated
|
|
42
|
+
} from "./services/mcpClient.js";
|
|
43
|
+
import { getModelContextLength } from "./utils/model.js";
|
|
37
44
|
import { memoize } from "lodash-es";
|
|
38
|
-
const ANT_ONLY_TOOLS = [
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
45
|
+
const ANT_ONLY_TOOLS = [MemoryReadTool, MemoryWriteTool];
|
|
46
|
+
function getToolSearchMode() {
|
|
47
|
+
const envVal = (process.env.MINTO_ENABLE_TOOL_SEARCH || process.env.ENABLE_TOOL_SEARCH || "auto").toLowerCase();
|
|
48
|
+
if (envVal === "always" || envVal === "1" || envVal === "true")
|
|
49
|
+
return "always";
|
|
50
|
+
if (envVal === "never" || envVal === "0" || envVal === "false") return "never";
|
|
51
|
+
return "auto";
|
|
52
|
+
}
|
|
53
|
+
function estimateTokens(text) {
|
|
54
|
+
return Math.ceil(text.length / 4);
|
|
55
|
+
}
|
|
42
56
|
const getAllTools = () => {
|
|
43
57
|
return [
|
|
44
|
-
|
|
45
|
-
AskExpertModelTool,
|
|
46
|
-
AskUserQuestionTool,
|
|
58
|
+
// Static description tools (high cache hit rate)
|
|
47
59
|
BashTool,
|
|
48
|
-
BashOutputTool,
|
|
49
|
-
KillShellTool,
|
|
50
60
|
GlobTool,
|
|
51
61
|
GrepTool,
|
|
52
62
|
LSTool,
|
|
@@ -57,25 +67,35 @@ const getAllTools = () => {
|
|
|
57
67
|
NotebookReadTool,
|
|
58
68
|
NotebookEditTool,
|
|
59
69
|
ThinkTool,
|
|
60
|
-
|
|
70
|
+
AskUserQuestionTool,
|
|
71
|
+
AskExpertModelTool,
|
|
72
|
+
// Task management tools
|
|
61
73
|
TaskCreateTool,
|
|
62
74
|
TaskUpdateTool,
|
|
63
75
|
TaskGetTool,
|
|
64
76
|
TaskListTool,
|
|
65
|
-
// Legacy TodoWrite (kept for backward compatibility, may be deprecated)
|
|
66
77
|
TodoWriteTool,
|
|
67
78
|
WebSearchTool,
|
|
68
79
|
URLFetcherTool,
|
|
69
|
-
//
|
|
80
|
+
// Plan mode and utility tools
|
|
70
81
|
LspTool,
|
|
71
82
|
EnterPlanModeTool,
|
|
72
83
|
ExitPlanModeTool,
|
|
73
84
|
TaskOutputTool,
|
|
74
85
|
TaskStopTool,
|
|
75
86
|
SlashCommandTool,
|
|
76
|
-
//
|
|
87
|
+
// MCP Resource tools
|
|
77
88
|
ListMcpResourcesTool,
|
|
78
89
|
ReadMcpResourceTool,
|
|
90
|
+
MCPSearchTool,
|
|
91
|
+
// Worktree isolation
|
|
92
|
+
EnterWorktreeTool,
|
|
93
|
+
// Agent Teams tools (conditionally enabled via isEnabled())
|
|
94
|
+
TeamCreateTool,
|
|
95
|
+
SendMessageTool,
|
|
96
|
+
TeamDeleteTool,
|
|
97
|
+
// Dynamic description tools last (description changes per-request, breaks cache after this point)
|
|
98
|
+
TaskTool,
|
|
79
99
|
...ANT_ONLY_TOOLS
|
|
80
100
|
];
|
|
81
101
|
};
|
|
@@ -91,14 +111,74 @@ async function getBuiltInTools(enableArchitect, options) {
|
|
|
91
111
|
}
|
|
92
112
|
return enabledTools;
|
|
93
113
|
}
|
|
114
|
+
async function shouldDeferMCPTools(mcpTools) {
|
|
115
|
+
const mode = getToolSearchMode();
|
|
116
|
+
if (mode === "never") return false;
|
|
117
|
+
if (mode === "always") return mcpTools.length > 0;
|
|
118
|
+
if (mcpTools.length === 0) return false;
|
|
119
|
+
const contextLength = getModelContextLength("main");
|
|
120
|
+
const threshold = contextLength * 0.1;
|
|
121
|
+
let totalTokens = 0;
|
|
122
|
+
for (const tool of mcpTools) {
|
|
123
|
+
const desc = await getToolDescriptionAsync(tool);
|
|
124
|
+
totalTokens += estimateTokens(desc);
|
|
125
|
+
totalTokens += estimateTokens(tool.name);
|
|
126
|
+
if (tool.inputJSONSchema) {
|
|
127
|
+
totalTokens += estimateTokens(JSON.stringify(tool.inputJSONSchema));
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return totalTokens > threshold;
|
|
131
|
+
}
|
|
132
|
+
async function partitionMCPTools(mcpTools) {
|
|
133
|
+
const { getDeferredMCPTools: getDeferred } = await import("./services/mcpClient.js");
|
|
134
|
+
const activeTools = [];
|
|
135
|
+
let deferredCount = 0;
|
|
136
|
+
for (const tool of mcpTools) {
|
|
137
|
+
if (isMCPToolActivated(tool.name)) {
|
|
138
|
+
activeTools.push(tool);
|
|
139
|
+
} else {
|
|
140
|
+
const desc = await getToolDescriptionAsync(tool);
|
|
141
|
+
const parts = tool.name.split("__");
|
|
142
|
+
const serverName = parts.length >= 2 ? parts[1] : "unknown";
|
|
143
|
+
const deferred = getDeferred();
|
|
144
|
+
if (!deferred.has(tool.name)) {
|
|
145
|
+
deferred.set(tool.name, {
|
|
146
|
+
name: tool.name,
|
|
147
|
+
description: desc,
|
|
148
|
+
serverName
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
deferredCount++;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return { activeTools, deferredCount };
|
|
155
|
+
}
|
|
94
156
|
const getTools = memoize(
|
|
95
157
|
async (enableArchitect) => {
|
|
96
|
-
const
|
|
158
|
+
const { isSimpleMode } = await import("./utils/simpleMode.js");
|
|
159
|
+
const mcpTools = isSimpleMode() ? [] : await getMCPTools();
|
|
160
|
+
const shouldDefer = await shouldDeferMCPTools(mcpTools);
|
|
161
|
+
let effectiveMCPTools;
|
|
162
|
+
if (shouldDefer) {
|
|
163
|
+
const { activeTools } = await partitionMCPTools(mcpTools);
|
|
164
|
+
effectiveMCPTools = activeTools;
|
|
165
|
+
} else {
|
|
166
|
+
effectiveMCPTools = mcpTools;
|
|
167
|
+
}
|
|
168
|
+
const tools = [...getAllTools(), ...effectiveMCPTools];
|
|
97
169
|
if (enableArchitect) {
|
|
98
170
|
tools.push(ArchitectTool);
|
|
99
171
|
}
|
|
100
|
-
const
|
|
101
|
-
const
|
|
172
|
+
const seen = /* @__PURE__ */ new Set();
|
|
173
|
+
const uniqueTools = tools.filter((tool) => {
|
|
174
|
+
if (seen.has(tool.name)) return false;
|
|
175
|
+
seen.add(tool.name);
|
|
176
|
+
return true;
|
|
177
|
+
});
|
|
178
|
+
const isEnabled = await Promise.all(
|
|
179
|
+
uniqueTools.map((tool) => tool.isEnabled())
|
|
180
|
+
);
|
|
181
|
+
const enabledTools = uniqueTools.filter((_, i) => isEnabled[i]);
|
|
102
182
|
await cacheToolDescriptions(enabledTools);
|
|
103
183
|
return enabledTools;
|
|
104
184
|
}
|
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/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": "AAAA,SAAe,
|
|
4
|
+
"sourcesContent": ["import { Tool, cacheToolDescriptions, getToolDescriptionAsync } from './Tool'\nimport { TaskTool } from './tools/TaskTool/TaskTool'\nimport { ArchitectTool } from './tools/ArchitectTool/ArchitectTool'\nimport { BashTool } from './tools/BashTool/BashTool'\n// BashOutputTool and KillShellTool removed \u2014 unified into TaskOutputTool and TaskStopTool (CC v2.0.62)\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'\n// Tool Search (CC-aligned: ToolSearch, was MCPSearch)\nimport { MCPSearchTool } from './tools/MCPSearchTool/MCPSearchTool'\n// Worktree isolation\nimport { EnterWorktreeTool } from './tools/EnterWorktreeTool/EnterWorktreeTool'\n// Agent Teams tools\nimport { TeamCreateTool } from './tools/TeamCreateTool/TeamCreateTool'\nimport { SendMessageTool } from './tools/SendMessageTool/SendMessageTool'\nimport { TeamDeleteTool } from './tools/TeamDeleteTool/TeamDeleteTool'\nimport {\n getMCPTools,\n getDeferredMCPTools,\n isMCPToolActivated,\n} from './services/mcpClient'\nimport { getModelContextLength } from './utils/model'\nimport { memoize } from 'lodash-es'\n\nconst ANT_ONLY_TOOLS = [MemoryReadTool, MemoryWriteTool]\n\n/**\n * Get the ENABLE_TOOL_SEARCH mode: \"auto\" | \"always\" | \"never\"\n */\nfunction getToolSearchMode(): 'auto' | 'always' | 'never' {\n const envVal = (\n process.env.MINTO_ENABLE_TOOL_SEARCH ||\n process.env.ENABLE_TOOL_SEARCH ||\n 'auto'\n ).toLowerCase()\n if (envVal === 'always' || envVal === '1' || envVal === 'true')\n return 'always'\n if (envVal === 'never' || envVal === '0' || envVal === 'false') return 'never'\n return 'auto'\n}\n\n/**\n * Estimate token count from a string (rough: chars / 4).\n */\nfunction estimateTokens(text: string): number {\n return Math.ceil(text.length / 4)\n}\n\n// Function to avoid circular dependencies that break bun\nexport const getAllTools = (): Tool[] => {\n // Tool ordering optimized for prompt caching:\n // Static descriptions first (stable cache prefix), dynamic descriptions last\n return [\n // Static description tools (high cache hit rate)\n BashTool,\n GlobTool,\n GrepTool,\n LSTool,\n FileReadTool,\n FileEditTool,\n MultiEditTool,\n FileWriteTool,\n NotebookReadTool,\n NotebookEditTool,\n ThinkTool,\n AskUserQuestionTool,\n AskExpertModelTool,\n // Task management tools\n TaskCreateTool,\n TaskUpdateTool,\n TaskGetTool,\n TaskListTool,\n TodoWriteTool,\n WebSearchTool,\n URLFetcherTool,\n // Plan mode and utility tools\n LspTool,\n EnterPlanModeTool,\n ExitPlanModeTool,\n TaskOutputTool,\n TaskStopTool,\n SlashCommandTool,\n // MCP Resource tools\n ListMcpResourcesTool,\n ReadMcpResourceTool,\n MCPSearchTool,\n // Worktree isolation\n EnterWorktreeTool,\n // Agent Teams tools (conditionally enabled via isEnabled())\n TeamCreateTool,\n SendMessageTool,\n TeamDeleteTool,\n // Dynamic description tools last (description changes per-request, breaks cache after this point)\n TaskTool,\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\n/**\n * Determine whether MCP tools should use deferred/search mode.\n * In deferred mode, only ToolSearch + already-activated tools are included.\n * The rest are stored in the deferred registry for on-demand activation.\n */\nasync function shouldDeferMCPTools(mcpTools: Tool[]): Promise<boolean> {\n const mode = getToolSearchMode()\n if (mode === 'never') return false\n if (mode === 'always') return mcpTools.length > 0\n\n // \"auto\" mode: defer if MCP descriptions exceed 10% of context\n if (mcpTools.length === 0) return false\n\n const contextLength = getModelContextLength('main')\n const threshold = contextLength * 0.1\n\n // Estimate total MCP tool description token count\n let totalTokens = 0\n for (const tool of mcpTools) {\n const desc = await getToolDescriptionAsync(tool)\n totalTokens += estimateTokens(desc)\n // Also account for the tool name and schema overhead\n totalTokens += estimateTokens(tool.name)\n if (tool.inputJSONSchema) {\n totalTokens += estimateTokens(JSON.stringify(tool.inputJSONSchema))\n }\n }\n\n return totalTokens > threshold\n}\n\n/**\n * Split MCP tools into active and deferred sets.\n * Active tools: already activated via ToolSearch.\n * Deferred tools: stored in the deferred registry with minimal metadata.\n */\nasync function partitionMCPTools(\n mcpTools: Tool[],\n): Promise<{ activeTools: Tool[]; deferredCount: number }> {\n const { getDeferredMCPTools: getDeferred } = await import(\n './services/mcpClient'\n )\n const activeTools: Tool[] = []\n let deferredCount = 0\n\n for (const tool of mcpTools) {\n if (isMCPToolActivated(tool.name)) {\n activeTools.push(tool)\n } else {\n // Store in deferred registry\n const desc = await getToolDescriptionAsync(tool)\n // Extract server name from full tool name: mcp__serverName__toolName\n const parts = tool.name.split('__')\n const serverName = parts.length >= 2 ? parts[1] : 'unknown'\n\n const deferred = getDeferred()\n if (!deferred.has(tool.name)) {\n deferred.set(tool.name, {\n name: tool.name,\n description: desc,\n serverName,\n })\n }\n deferredCount++\n }\n }\n\n return { activeTools, deferredCount }\n}\n\nexport const getTools = memoize(\n async (enableArchitect?: boolean): Promise<Tool[]> => {\n // Skip MCP tools entirely in simple mode for faster startup\n const { isSimpleMode } = await import('./utils/simpleMode')\n const mcpTools = isSimpleMode() ? [] : await getMCPTools()\n const shouldDefer = await shouldDeferMCPTools(mcpTools)\n\n let effectiveMCPTools: Tool[]\n if (shouldDefer) {\n const { activeTools } = await partitionMCPTools(mcpTools)\n effectiveMCPTools = activeTools\n } else {\n effectiveMCPTools = mcpTools\n }\n\n const tools = [...getAllTools(), ...effectiveMCPTools]\n\n // Only include Architect tool if enabled via config or CLI flag\n if (enableArchitect) {\n tools.push(ArchitectTool)\n }\n\n // Deduplicate by tool name (built-in tools take priority over MCP duplicates)\n const seen = new Set<string>()\n const uniqueTools = tools.filter(tool => {\n if (seen.has(tool.name)) return false\n seen.add(tool.name)\n return true\n })\n\n const isEnabled = await Promise.all(\n uniqueTools.map(tool => tool.isEnabled()),\n )\n const enabledTools = uniqueTools.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 * - MCP tools are activated via ToolSearch\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
|
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
const PERMISSION_LEVELS = {
|
|
2
2
|
plan: 0,
|
|
3
|
+
delegate: 0,
|
|
4
|
+
// Restricted like plan
|
|
3
5
|
default: 1,
|
|
4
6
|
acceptEdits: 2,
|
|
5
7
|
dontAsk: 3,
|
|
@@ -33,9 +35,9 @@ const MODE_CONFIGS = {
|
|
|
33
35
|
label: "ACCEPT EDITS",
|
|
34
36
|
icon: "\u2705",
|
|
35
37
|
color: "green",
|
|
36
|
-
description: "Auto-approve
|
|
38
|
+
description: "Auto-approve file edits within working directory; other tools still follow normal permission flow",
|
|
37
39
|
inlineIcon: "\u23F5\u23F5",
|
|
38
|
-
inlineLabel: "accept edits on",
|
|
40
|
+
inlineLabel: "auto-accept edits on",
|
|
39
41
|
inlineColor: "green",
|
|
40
42
|
compactLabel: "edits",
|
|
41
43
|
allowedTools: ["*"],
|
|
@@ -50,7 +52,7 @@ const MODE_CONFIGS = {
|
|
|
50
52
|
label: "DONT ASK",
|
|
51
53
|
icon: "\u{1F92B}",
|
|
52
54
|
color: "cyan",
|
|
53
|
-
description: "
|
|
55
|
+
description: "Auto-deny tools not in permissions.allow; safe/read-only tools still allowed",
|
|
54
56
|
inlineIcon: "\u23F5\u23F5",
|
|
55
57
|
inlineLabel: "don't ask on",
|
|
56
58
|
inlineColor: "cyan",
|
|
@@ -88,6 +90,31 @@ const MODE_CONFIGS = {
|
|
|
88
90
|
bypassValidation: false
|
|
89
91
|
}
|
|
90
92
|
},
|
|
93
|
+
delegate: {
|
|
94
|
+
name: "delegate",
|
|
95
|
+
label: "DELEGATE",
|
|
96
|
+
icon: "\u{1F465}",
|
|
97
|
+
color: "magenta",
|
|
98
|
+
description: "Delegate mode - team/task tools only",
|
|
99
|
+
inlineIcon: "\u{1F465}",
|
|
100
|
+
inlineLabel: "delegate mode on",
|
|
101
|
+
inlineColor: "magenta",
|
|
102
|
+
compactLabel: "delegate",
|
|
103
|
+
allowedTools: [
|
|
104
|
+
"TeamCreate",
|
|
105
|
+
"TeamDelete",
|
|
106
|
+
"SendMessage",
|
|
107
|
+
"TaskCreate",
|
|
108
|
+
"TaskGet",
|
|
109
|
+
"TaskUpdate",
|
|
110
|
+
"TaskList"
|
|
111
|
+
],
|
|
112
|
+
restrictions: {
|
|
113
|
+
readOnly: false,
|
|
114
|
+
requireConfirmation: true,
|
|
115
|
+
bypassValidation: false
|
|
116
|
+
}
|
|
117
|
+
},
|
|
91
118
|
bypassPermissions: {
|
|
92
119
|
name: "bypassPermissions",
|
|
93
120
|
label: "BYPASS PERMISSIONS",
|
|
@@ -106,18 +133,20 @@ const MODE_CONFIGS = {
|
|
|
106
133
|
}
|
|
107
134
|
}
|
|
108
135
|
};
|
|
109
|
-
function getNextPermissionMode(currentMode, isBypassAvailable =
|
|
136
|
+
function getNextPermissionMode(currentMode, isBypassAvailable = false) {
|
|
110
137
|
switch (currentMode) {
|
|
111
138
|
case "default":
|
|
112
139
|
return "acceptEdits";
|
|
113
140
|
case "acceptEdits":
|
|
114
|
-
return "dontAsk";
|
|
115
|
-
case "dontAsk":
|
|
116
141
|
return "plan";
|
|
117
142
|
case "plan":
|
|
118
143
|
return isBypassAvailable ? "bypassPermissions" : "default";
|
|
119
144
|
case "bypassPermissions":
|
|
120
145
|
return "default";
|
|
146
|
+
// System-managed modes: cycle back to default
|
|
147
|
+
case "dontAsk":
|
|
148
|
+
case "delegate":
|
|
149
|
+
return "default";
|
|
121
150
|
default:
|
|
122
151
|
return "default";
|
|
123
152
|
}
|
|
@@ -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' // Normal permission checking\n | 'acceptEdits' // Auto-approve file
|
|
5
|
-
"mappings": "
|
|
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 \u2014 prompts for each tool\n | 'acceptEdits' // Auto-approve file edits within working directory; Bash still asks\n | 'dontAsk' // Auto-deny tools not in permissions.allow; safe tools still allowed\n | 'plan' // Read-only research and planning mode\n | 'delegate' // Team/task tools only (Minto Shift+Tab delegate 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 delegate: 0, // Restricted like plan\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:\n 'Auto-approve file edits within working directory; other tools still follow normal permission flow',\n inlineIcon: '\u23F5\u23F5',\n inlineLabel: 'auto-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:\n 'Auto-deny tools not in permissions.allow; safe/read-only tools still allowed',\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 delegate: {\n name: 'delegate',\n label: 'DELEGATE',\n icon: '\uD83D\uDC65',\n color: 'magenta',\n description: 'Delegate mode - team/task tools only',\n inlineIcon: '\uD83D\uDC65',\n inlineLabel: 'delegate mode on',\n inlineColor: 'magenta',\n compactLabel: 'delegate',\n allowedTools: [\n 'TeamCreate',\n 'TeamDelete',\n 'SendMessage',\n 'TaskCreate',\n 'TaskGet',\n 'TaskUpdate',\n 'TaskList',\n ],\n restrictions: {\n readOnly: false,\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/**\n * User-facing Shift+Tab cycle for permission modes.\n *\n * Only modes safe for interactive use are included:\n * default \u2192 acceptEdits \u2192 plan \u2192 [bypassPermissions] \u2192 default\n *\n * Excluded from manual cycling (system-managed only):\n * - `dontAsk`: Designed for CI/CD \u2014 auto-denies tools not in permissions.allow.\n * Switching to this interactively would break the AI's ability to work.\n * Activate via CLI flag or programmatic setMode().\n * - `delegate`: Only meaningful when a team is active \u2014 restricts to coordination\n * tools only. Without an active team, the AI becomes completely inoperable.\n * Activate programmatically when spawning team workflows.\n */\nexport function getNextPermissionMode(\n currentMode: PermissionMode,\n isBypassAvailable: boolean = false,\n): PermissionMode {\n switch (currentMode) {\n case 'default':\n return 'acceptEdits'\n case 'acceptEdits':\n return 'plan'\n case 'plan':\n return isBypassAvailable ? 'bypassPermissions' : 'default'\n case 'bypassPermissions':\n return 'default'\n // System-managed modes: cycle back to default\n case 'dontAsk':\n case 'delegate':\n return 'default'\n default:\n return 'default'\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/types/hooks.js
CHANGED
|
@@ -16,6 +16,8 @@ var HookEvent = /* @__PURE__ */ ((HookEvent2) => {
|
|
|
16
16
|
HookEvent2["ConfigChange"] = "ConfigChange";
|
|
17
17
|
HookEvent2["TaskCompleted"] = "TaskCompleted";
|
|
18
18
|
HookEvent2["TeammateIdle"] = "TeammateIdle";
|
|
19
|
+
HookEvent2["WorktreeCreate"] = "WorktreeCreate";
|
|
20
|
+
HookEvent2["WorktreeRemove"] = "WorktreeRemove";
|
|
19
21
|
return HookEvent2;
|
|
20
22
|
})(HookEvent || {});
|
|
21
23
|
const HookDefinitionSchema = 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',\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;
|
|
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 // Worktree lifecycle\n WorktreeCreate = 'WorktreeCreate',\n WorktreeRemove = 'WorktreeRemove',\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 * WorktreeCreate hook input\n */\nexport interface WorktreeCreateInput extends HookInput {\n hook_event_name: HookEvent.WorktreeCreate\n worktree_path: string\n agent_id: string\n agent_type: string\n}\n\n/**\n * WorktreeRemove hook input\n */\nexport interface WorktreeRemoveInput extends HookInput {\n hook_event_name: HookEvent.WorktreeRemove\n worktree_path: string\n agent_id: string\n agent_type: string\n success: boolean\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 * Used by both plugin-loaded hooks and settings.json hooks.\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 (extends HookDefinition with event routing fields) */\n config: HookDefinition & {\n /** Hook event this config responds to */\n event: HookEvent\n /** Matcher pattern for tool name matching */\n matcher?: string\n /** Whether the hook blocks execution until complete */\n blocking?: boolean\n /** Tool input field patterns for matching (CC spec) */\n toolInput?: Record<string, string>\n }\n\n /** Source plugin name */\n pluginName: string\n\n /** Hook event this hook responds to (root-level for easier access) */\n event: HookEvent\n\n /** Matcher pattern (root-level for easier access) */\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;AAGf,EAAAA,WAAA,oBAAiB;AACjB,EAAAA,WAAA,oBAAiB;AAzCP,SAAAA;AAAA,GAAA;AAoZL,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
|
@@ -53,6 +53,7 @@ const PluginManifestSchema = z.object({
|
|
|
53
53
|
// Plugin-specific configuration schema
|
|
54
54
|
configSchema: z.record(z.any()).optional()
|
|
55
55
|
});
|
|
56
|
+
import { HookEvent as HookEvent2 } from "./hooks.js";
|
|
56
57
|
class PluginError extends Error {
|
|
57
58
|
constructor(message, code, pluginName, details) {
|
|
58
59
|
super(message);
|
|
@@ -76,6 +77,7 @@ var PluginErrorCode = /* @__PURE__ */ ((PluginErrorCode2) => {
|
|
|
76
77
|
})(PluginErrorCode || {});
|
|
77
78
|
export {
|
|
78
79
|
AuthorSchema,
|
|
80
|
+
HookEvent2 as HookEvent,
|
|
79
81
|
MCPServerConfigSchema,
|
|
80
82
|
PluginError,
|
|
81
83
|
PluginErrorCode,
|
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 // 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": "AAIA,SAAS,SAAS;
|
|
6
|
-
"names": ["PluginErrorCode"]
|
|
4
|
+
"sourcesContent": ["/**\n * Plugin System Type Definitions\n */\n\nimport { z } from 'zod'\nimport { HookEvent, type LoadedHook } from './hooks'\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// Re-export from hooks.ts to avoid duplicate definitions\n// HookEvent is an enum (value), LoadedHook is an interface (type-only)\nexport { HookEvent } from './hooks'\nexport type { LoadedHook } from './hooks'\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 * 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
|
+
"names": ["HookEvent", "PluginErrorCode"]
|
|
7
7
|
}
|
|
@@ -61,15 +61,21 @@ class CircuitBreaker {
|
|
|
61
61
|
if (!timeout) {
|
|
62
62
|
return this.execute(operation);
|
|
63
63
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
64
|
+
let timeoutId;
|
|
65
|
+
try {
|
|
66
|
+
const result = await Promise.race([
|
|
67
|
+
this.execute(operation),
|
|
68
|
+
new Promise((_, reject) => {
|
|
69
|
+
timeoutId = setTimeout(
|
|
70
|
+
() => reject(new Error(`Operation timeout after ${timeout}ms`)),
|
|
71
|
+
timeout
|
|
72
|
+
);
|
|
73
|
+
})
|
|
74
|
+
]);
|
|
75
|
+
return result;
|
|
76
|
+
} finally {
|
|
77
|
+
if (timeoutId !== void 0) clearTimeout(timeoutId);
|
|
78
|
+
}
|
|
73
79
|
}
|
|
74
80
|
/**
|
|
75
81
|
* Get current circuit state
|