@within-7/minto 0.1.7 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli.js +155 -37
- package/dist/Tool.js +38 -0
- package/dist/Tool.js.map +3 -3
- package/dist/commands/agents/AgentsCommand.js +73 -49
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/agents/constants.js +1 -1
- package/dist/commands/agents/constants.js.map +1 -1
- package/dist/commands/agents/index.js +1 -1
- package/dist/commands/bug.js +74 -7
- package/dist/commands/bug.js.map +3 -3
- package/dist/commands/clear.js +3 -0
- package/dist/commands/clear.js.map +2 -2
- package/dist/commands/compact.js +37 -0
- package/dist/commands/compact.js.map +2 -2
- package/dist/commands/context.js +85 -0
- package/dist/commands/context.js.map +7 -0
- package/dist/commands/ctx_viz.js +18 -10
- package/dist/commands/ctx_viz.js.map +2 -2
- package/dist/commands/doctor.js +158 -12
- package/dist/commands/doctor.js.map +2 -2
- package/dist/commands/export.js +157 -0
- package/dist/commands/export.js.map +7 -0
- package/dist/commands/mcp-interactive.js +28 -18
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/model.js +9 -7
- package/dist/commands/model.js.map +2 -2
- package/dist/commands/permissions.js +87 -0
- package/dist/commands/permissions.js.map +7 -0
- package/dist/commands/plugin/AddMarketplaceForm.js +3 -2
- package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
- package/dist/commands/plugin/ConfirmDialog.js +2 -1
- package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
- package/dist/commands/plugin/ErrorView.js +2 -1
- package/dist/commands/plugin/ErrorView.js.map +2 -2
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js +5 -4
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
- package/dist/commands/plugin/InstalledPluginsManager.js +5 -4
- package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
- package/dist/commands/plugin/MainMenu.js +2 -1
- package/dist/commands/plugin/MainMenu.js.map +2 -2
- package/dist/commands/plugin/MarketplaceManager.js +5 -4
- package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
- package/dist/commands/plugin/MarketplaceSelector.js +4 -3
- package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
- package/dist/commands/plugin/PlaceholderScreen.js +3 -2
- package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
- package/dist/commands/plugin/PluginBrowser.js +6 -5
- package/dist/commands/plugin/PluginBrowser.js.map +2 -2
- package/dist/commands/plugin/PluginDetailsInstall.js +5 -4
- package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
- package/dist/commands/plugin/PluginDetailsManage.js +4 -3
- package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
- package/dist/commands/plugin.js +16 -15
- package/dist/commands/plugin.js.map +2 -2
- package/dist/commands/quit.js +3 -1
- package/dist/commands/quit.js.map +2 -2
- package/dist/commands/sandbox.js +105 -0
- package/dist/commands/sandbox.js.map +7 -0
- package/dist/commands/setup.js +2 -1
- package/dist/commands/setup.js.map +2 -2
- package/dist/commands/status.js +59 -0
- package/dist/commands/status.js.map +7 -0
- package/dist/commands/tasks.js +108 -0
- package/dist/commands/tasks.js.map +7 -0
- package/dist/commands/todos.js +123 -0
- package/dist/commands/todos.js.map +7 -0
- package/dist/commands/undo.js +245 -0
- package/dist/commands/undo.js.map +7 -0
- package/dist/commands.js +22 -2
- package/dist/commands.js.map +2 -2
- package/dist/components/AgentThinkingBlock.js +10 -18
- package/dist/components/AgentThinkingBlock.js.map +2 -2
- package/dist/components/AsciiLogo.js +7 -8
- package/dist/components/AsciiLogo.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/QuestionView.js +2 -1
- package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
- package/dist/components/BackgroundTasksPanel.js +78 -29
- package/dist/components/BackgroundTasksPanel.js.map +2 -2
- package/dist/components/BashStreamingProgress.js +24 -0
- package/dist/components/BashStreamingProgress.js.map +7 -0
- package/dist/components/CollapsibleHint.js +15 -0
- package/dist/components/CollapsibleHint.js.map +7 -0
- package/dist/components/Config.js +3 -2
- package/dist/components/Config.js.map +2 -2
- package/dist/components/ConsoleOAuthFlow.js +2 -1
- package/dist/components/ConsoleOAuthFlow.js.map +2 -2
- package/dist/components/Cost.js +2 -1
- package/dist/components/Cost.js.map +2 -2
- package/dist/components/FileEditToolUpdatedMessage.js +1 -1
- package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
- package/dist/components/HeaderBar.js +13 -8
- package/dist/components/HeaderBar.js.map +2 -2
- package/dist/components/HistorySearchOverlay.js +4 -3
- package/dist/components/HistorySearchOverlay.js.map +2 -2
- package/dist/components/HotkeyHelpPanel.js +134 -0
- package/dist/components/HotkeyHelpPanel.js.map +7 -0
- package/dist/components/InvalidConfigDialog.js +2 -1
- package/dist/components/InvalidConfigDialog.js.map +2 -2
- package/dist/components/Logo.js +24 -68
- package/dist/components/Logo.js.map +2 -2
- package/dist/components/MCPServerApprovalDialog.js +2 -1
- package/dist/components/MCPServerApprovalDialog.js.map +2 -2
- package/dist/components/MCPServerDialogCopy.js +2 -1
- package/dist/components/MCPServerDialogCopy.js.map +2 -2
- package/dist/components/MCPServerMultiselectDialog.js +2 -1
- package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
- package/dist/components/Message.js +23 -7
- package/dist/components/Message.js.map +3 -3
- package/dist/components/MessageSelector.js +4 -3
- package/dist/components/MessageSelector.js.map +2 -2
- package/dist/components/ModeIndicator.js +2 -1
- package/dist/components/ModeIndicator.js.map +2 -2
- package/dist/components/ModelConfig.js +20 -6
- package/dist/components/ModelConfig.js.map +2 -2
- package/dist/components/ModelListManager.js +7 -6
- package/dist/components/ModelListManager.js.map +2 -2
- package/dist/components/ModelSelector/ModelSelector.js +27 -14
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/Onboarding.js +22 -16
- package/dist/components/Onboarding.js.map +2 -2
- package/dist/components/OperationSummary.js +130 -0
- package/dist/components/OperationSummary.js.map +7 -0
- package/dist/components/ProgressBar.js +74 -0
- package/dist/components/ProgressBar.js.map +7 -0
- package/dist/components/PromptInput.js +210 -87
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/RequestStatusIndicator.js +194 -0
- package/dist/components/RequestStatusIndicator.js.map +7 -0
- package/dist/components/SensitiveFileWarning.js +31 -0
- package/dist/components/SensitiveFileWarning.js.map +7 -0
- package/dist/components/Spinner.js +141 -27
- package/dist/components/Spinner.js.map +2 -2
- package/dist/components/SpinnerSymbol.js +21 -27
- package/dist/components/SpinnerSymbol.js.map +2 -2
- package/dist/components/StreamingBashOutput.js +9 -8
- package/dist/components/StreamingBashOutput.js.map +2 -2
- package/dist/components/StructuredDiff.js +6 -8
- package/dist/components/StructuredDiff.js.map +2 -2
- package/dist/components/SubagentBlock.js +5 -3
- package/dist/components/SubagentBlock.js.map +2 -2
- package/dist/components/SubagentProgress.js +17 -15
- package/dist/components/SubagentProgress.js.map +2 -2
- package/dist/components/TaskCard.js +30 -24
- package/dist/components/TaskCard.js.map +2 -2
- package/dist/components/TextInput.js +9 -1
- package/dist/components/TextInput.js.map +2 -2
- package/dist/components/TodoChangeBlock.js +1 -1
- package/dist/components/TodoChangeBlock.js.map +2 -2
- package/dist/components/TodoPanel.js +140 -31
- package/dist/components/TodoPanel.js.map +3 -3
- package/dist/components/TokenCounter.js +74 -0
- package/dist/components/TokenCounter.js.map +7 -0
- package/dist/components/TokenWarning.js +2 -1
- package/dist/components/TokenWarning.js.map +2 -2
- package/dist/components/ToolUseLoader.js +2 -2
- package/dist/components/ToolUseLoader.js.map +2 -2
- package/dist/components/TreeConnector.js +26 -0
- package/dist/components/TreeConnector.js.map +7 -0
- package/dist/components/TrustDialog.js +2 -1
- package/dist/components/TrustDialog.js.map +2 -2
- package/dist/components/TurnCompletionIndicator.js +18 -0
- package/dist/components/TurnCompletionIndicator.js.map +7 -0
- package/dist/components/binary-feedback/BinaryFeedbackView.js +2 -1
- package/dist/components/binary-feedback/BinaryFeedbackView.js.map +2 -2
- package/dist/components/messages/AssistantTextMessage.js +20 -9
- package/dist/components/messages/AssistantTextMessage.js.map +2 -2
- package/dist/components/messages/AssistantThinkingMessage.js +18 -3
- package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
- package/dist/components/messages/AssistantToolUseMessage.js +17 -10
- package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
- package/dist/components/messages/GroupRenderer.js +54 -0
- package/dist/components/messages/GroupRenderer.js.map +7 -0
- package/dist/components/messages/NestedTasksPreview.js +24 -0
- package/dist/components/messages/NestedTasksPreview.js.map +7 -0
- package/dist/components/messages/ParallelTasksGroupView.js +93 -0
- package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
- package/dist/components/messages/TaskInModuleView.js +218 -0
- package/dist/components/messages/TaskInModuleView.js.map +7 -0
- package/dist/components/messages/TaskOutputContent.js +56 -0
- package/dist/components/messages/TaskOutputContent.js.map +7 -0
- package/dist/components/messages/UserPromptMessage.js +2 -2
- package/dist/components/messages/UserPromptMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
- package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
- package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
- package/dist/constants/colors.js +120 -54
- package/dist/constants/colors.js.map +2 -2
- package/dist/constants/formatRules.js +102 -0
- package/dist/constants/formatRules.js.map +7 -0
- package/dist/constants/prompts.js +12 -34
- package/dist/constants/prompts.js.map +2 -2
- package/dist/constants/symbols.js +64 -6
- package/dist/constants/symbols.js.map +2 -2
- package/dist/constants/timing.js +5 -0
- package/dist/constants/timing.js.map +2 -2
- package/dist/constants/toolInputExamples.js +84 -0
- package/dist/constants/toolInputExamples.js.map +7 -0
- package/dist/core/backupManager.js +321 -0
- package/dist/core/backupManager.js.map +7 -0
- package/dist/core/config/defaults.js +84 -0
- package/dist/core/config/defaults.js.map +7 -0
- package/dist/core/config/index.js +111 -0
- package/dist/core/config/index.js.map +7 -0
- package/dist/core/config/loader.js +221 -0
- package/dist/core/config/loader.js.map +7 -0
- package/dist/core/config/migrations.js +128 -0
- package/dist/core/config/migrations.js.map +7 -0
- package/dist/core/config/schema.js +178 -0
- package/dist/core/config/schema.js.map +7 -0
- package/dist/core/costTracker.js +129 -0
- package/dist/core/costTracker.js.map +7 -0
- package/dist/core/gitAutoCommit.js +287 -0
- package/dist/core/gitAutoCommit.js.map +7 -0
- package/dist/core/index.js +8 -0
- package/dist/core/index.js.map +7 -0
- package/dist/core/operationTracker.js +212 -0
- package/dist/core/operationTracker.js.map +7 -0
- package/dist/core/permissions/auditLog.js +204 -0
- package/dist/core/permissions/auditLog.js.map +7 -0
- package/dist/core/permissions/engine/index.js +3 -0
- package/dist/core/permissions/engine/index.js.map +7 -0
- package/dist/core/permissions/engine/permissionEngine.js +106 -0
- package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
- package/dist/core/permissions/engine/types.js +1 -0
- package/dist/core/permissions/engine/types.js.map +7 -0
- package/dist/core/permissions/index.js +84 -0
- package/dist/core/permissions/index.js.map +7 -0
- package/dist/core/permissions/ruleEngine.js +259 -0
- package/dist/core/permissions/ruleEngine.js.map +7 -0
- package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
- package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
- package/dist/core/permissions/rules/autoEscalationRule.js +296 -0
- package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
- package/dist/core/permissions/rules/index.js +46 -0
- package/dist/core/permissions/rules/index.js.map +7 -0
- package/dist/core/permissions/rules/planModeRule.js +55 -0
- package/dist/core/permissions/rules/planModeRule.js.map +7 -0
- package/dist/core/permissions/rules/projectBoundaryRule.js +173 -0
- package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
- package/dist/core/permissions/rules/safeModeRule.js +65 -0
- package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
- package/dist/core/permissions/rules/sensitivePathsRule.js +345 -0
- package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
- package/dist/core/permissions/types.js +127 -0
- package/dist/core/permissions/types.js.map +7 -0
- package/dist/core/tokenStats.js +9 -0
- package/dist/core/tokenStats.js.map +7 -0
- package/dist/core/tokenStatsManager.js +331 -0
- package/dist/core/tokenStatsManager.js.map +7 -0
- package/dist/core/tools/executor.js +143 -0
- package/dist/core/tools/executor.js.map +7 -0
- package/dist/core/tools/index.js +15 -0
- package/dist/core/tools/index.js.map +7 -0
- package/dist/core/tools/registry.js +183 -0
- package/dist/core/tools/registry.js.map +7 -0
- package/dist/core/tools/types.js +1 -0
- package/dist/core/tools/types.js.map +7 -0
- package/dist/cost-tracker.js +23 -15
- package/dist/cost-tracker.js.map +2 -2
- package/dist/entrypoints/cli.js +158 -130
- package/dist/entrypoints/cli.js.map +2 -2
- package/dist/entrypoints/mcp.js +12 -4
- package/dist/entrypoints/mcp.js.map +2 -2
- package/dist/history.js +14 -3
- package/dist/history.js.map +2 -2
- package/dist/hooks/useAgentTokenStats.js +72 -0
- package/dist/hooks/useAgentTokenStats.js.map +7 -0
- package/dist/hooks/useAgentTranscripts.js +140 -0
- package/dist/hooks/useAgentTranscripts.js.map +7 -0
- package/dist/hooks/useAnimationSync.js +53 -0
- package/dist/hooks/useAnimationSync.js.map +7 -0
- package/dist/hooks/useArrowKeyHistory.js +4 -2
- package/dist/hooks/useArrowKeyHistory.js.map +2 -2
- package/dist/hooks/useCanUseTool.js +3 -1
- package/dist/hooks/useCanUseTool.js.map +2 -2
- package/dist/hooks/useExitOnCtrlCD.js +9 -5
- package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
- package/dist/hooks/useHookStatus.js +40 -0
- package/dist/hooks/useHookStatus.js.map +7 -0
- package/dist/hooks/useLogMessages.js +29 -2
- package/dist/hooks/useLogMessages.js.map +2 -2
- package/dist/hooks/useMessageGroups.js +43 -0
- package/dist/hooks/useMessageGroups.js.map +7 -0
- package/dist/hooks/useTerminalSize.js +62 -6
- package/dist/hooks/useTerminalSize.js.map +2 -2
- package/dist/hooks/useUnifiedCompletion.js +69 -0
- package/dist/hooks/useUnifiedCompletion.js.map +2 -2
- package/dist/i18n/index.js +109 -0
- package/dist/i18n/index.js.map +7 -0
- package/dist/i18n/locales/en.js +348 -0
- package/dist/i18n/locales/en.js.map +7 -0
- package/dist/i18n/locales/index.js +7 -0
- package/dist/i18n/locales/index.js.map +7 -0
- package/dist/i18n/locales/zh-CN.js +348 -0
- package/dist/i18n/locales/zh-CN.js.map +7 -0
- package/dist/i18n/types.js +8 -0
- package/dist/i18n/types.js.map +7 -0
- package/dist/permissions.js +28 -1
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +253 -21
- package/dist/query.js.map +3 -3
- package/dist/screens/REPL.js +523 -194
- package/dist/screens/REPL.js.map +3 -3
- package/dist/services/adapters/chatCompletions.js +3 -1
- package/dist/services/adapters/chatCompletions.js.map +2 -2
- package/dist/services/adapters/messageNormalizer.js +354 -0
- package/dist/services/adapters/messageNormalizer.js.map +7 -0
- package/dist/services/adapters/responsesAPI.js +6 -3
- package/dist/services/adapters/responsesAPI.js.map +2 -2
- package/dist/services/checkpointManager.js +386 -0
- package/dist/services/checkpointManager.js.map +7 -0
- package/dist/services/claude.js +192 -14
- package/dist/services/claude.js.map +3 -3
- package/dist/services/compressionService.js +50 -1
- package/dist/services/compressionService.js.map +2 -2
- package/dist/services/contextMonitor.js +162 -0
- package/dist/services/contextMonitor.js.map +7 -0
- package/dist/services/customCommands.js +60 -41
- package/dist/services/customCommands.js.map +2 -2
- package/dist/services/hookExecutor.js +173 -1
- package/dist/services/hookExecutor.js.map +2 -2
- package/dist/services/intelligentCompactor.js +281 -0
- package/dist/services/intelligentCompactor.js.map +7 -0
- package/dist/services/lspConfig.js +109 -0
- package/dist/services/lspConfig.js.map +7 -0
- package/dist/services/mcpClient.js +338 -43
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/modelOrchestrator.js +310 -0
- package/dist/services/modelOrchestrator.js.map +7 -0
- package/dist/services/openai.js +8 -1
- package/dist/services/openai.js.map +2 -2
- package/dist/services/outputStyles.js +138 -0
- package/dist/services/outputStyles.js.map +7 -0
- package/dist/services/plugins/index.js +5 -0
- package/dist/services/plugins/index.js.map +7 -0
- package/dist/services/plugins/lspServers.js +188 -0
- package/dist/services/plugins/lspServers.js.map +7 -0
- package/dist/services/plugins/pluginRuntime.js +229 -0
- package/dist/services/plugins/pluginRuntime.js.map +7 -0
- package/dist/services/plugins/pluginValidation.js +219 -0
- package/dist/services/plugins/pluginValidation.js.map +7 -0
- package/dist/services/plugins/skillMarketplace.js +556 -0
- package/dist/services/plugins/skillMarketplace.js.map +7 -0
- package/dist/services/responseStateManager.js +37 -3
- package/dist/services/responseStateManager.js.map +2 -2
- package/dist/services/sandbox/filesystemBoundary.js +341 -0
- package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
- package/dist/services/sandbox/index.js +14 -0
- package/dist/services/sandbox/index.js.map +7 -0
- package/dist/services/sandbox/networkProxy.js +293 -0
- package/dist/services/sandbox/networkProxy.js.map +7 -0
- package/dist/services/sandbox/sandboxController.js +574 -0
- package/dist/services/sandbox/sandboxController.js.map +7 -0
- package/dist/services/sandbox/types.js +50 -0
- package/dist/services/sandbox/types.js.map +7 -0
- package/dist/services/sessionMemory.js +266 -0
- package/dist/services/sessionMemory.js.map +7 -0
- package/dist/services/taskRouter.js +324 -0
- package/dist/services/taskRouter.js.map +7 -0
- package/dist/tools/ArchitectTool/ArchitectTool.js +7 -1
- package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +6 -2
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +2 -1
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
- package/dist/tools/BaseTool.js +72 -0
- package/dist/tools/BaseTool.js.map +7 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
- package/dist/tools/BashTool/BashTool.js +79 -3
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
- package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
- package/dist/tools/BashTool/OutputLine.js +54 -0
- package/dist/tools/BashTool/OutputLine.js.map +2 -2
- package/dist/tools/BashTool/prompt.js +336 -3
- package/dist/tools/BashTool/prompt.js.map +2 -2
- package/dist/tools/FileEditTool/FileEditTool.js +29 -4
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileEditTool/prompt.js +6 -3
- package/dist/tools/FileEditTool/prompt.js.map +2 -2
- package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
- package/dist/tools/FileWriteTool/prompt.js +4 -2
- package/dist/tools/FileWriteTool/prompt.js.map +2 -2
- package/dist/tools/GlobTool/GlobTool.js +4 -2
- package/dist/tools/GlobTool/GlobTool.js.map +2 -2
- package/dist/tools/GrepTool/GrepTool.js +36 -7
- package/dist/tools/GrepTool/GrepTool.js.map +2 -2
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
- package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
- package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
- package/dist/tools/LspTool/LspTool.js +664 -0
- package/dist/tools/LspTool/LspTool.js.map +7 -0
- package/dist/tools/LspTool/prompt.js +27 -0
- package/dist/tools/LspTool/prompt.js.map +7 -0
- package/dist/tools/MCPTool/MCPTool.js +9 -1
- package/dist/tools/MCPTool/MCPTool.js.map +2 -2
- package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
- package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
- package/dist/tools/MultiEditTool/prompt.js +5 -3
- package/dist/tools/MultiEditTool/prompt.js.map +2 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js +7 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
- package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +75 -0
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +109 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
- package/dist/tools/PlanModeTool/prompt.js +94 -0
- package/dist/tools/PlanModeTool/prompt.js.map +7 -0
- package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
- package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
- package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
- package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
- package/dist/tools/SkillTool/SkillTool.js +10 -4
- package/dist/tools/SkillTool/SkillTool.js.map +2 -2
- package/dist/tools/SkillTool/prompt.js +1 -1
- package/dist/tools/SkillTool/prompt.js.map +1 -1
- package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
- package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
- package/dist/tools/SlashCommandTool/prompt.js +35 -0
- package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
- package/dist/tools/TaskOutputTool/TaskOutputTool.js +190 -0
- package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
- package/dist/tools/TaskOutputTool/prompt.js +15 -0
- package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
- package/dist/tools/TaskTool/TaskTool.js +310 -104
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/tools/TaskTool/prompt.js.map +2 -2
- package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -77
- package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/URLFetcherTool.js +4 -1
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/cache.js +55 -8
- package/dist/tools/URLFetcherTool/cache.js.map +2 -2
- package/dist/tools.js +31 -2
- package/dist/tools.js.map +2 -2
- package/dist/types/hooks.js +4 -0
- package/dist/types/hooks.js.map +2 -2
- package/dist/types/marketplace.js.map +2 -2
- package/dist/types/messageGroup.js +36 -0
- package/dist/types/messageGroup.js.map +7 -0
- package/dist/types/plugin.js.map +2 -2
- package/dist/types/thinking.js +1 -0
- package/dist/types/thinking.js.map +7 -0
- package/dist/utils/BackgroundShellManager.js +136 -39
- package/dist/utils/BackgroundShellManager.js.map +2 -2
- package/dist/utils/CircuitBreaker.js +242 -0
- package/dist/utils/CircuitBreaker.js.map +7 -0
- package/dist/utils/MessageBatchBuffer.js +102 -0
- package/dist/utils/MessageBatchBuffer.js.map +7 -0
- package/dist/utils/PersistentShell.js +151 -1
- package/dist/utils/PersistentShell.js.map +2 -2
- package/dist/utils/agentLoader.js +1 -23
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/agentTranscripts.js +641 -0
- package/dist/utils/agentTranscripts.js.map +7 -0
- package/dist/utils/animationManager.js +213 -0
- package/dist/utils/animationManager.js.map +7 -0
- package/dist/utils/animationSync.js +110 -0
- package/dist/utils/animationSync.js.map +7 -0
- package/dist/utils/ask.js +2 -0
- package/dist/utils/ask.js.map +2 -2
- package/dist/utils/asyncFile.js +215 -0
- package/dist/utils/asyncFile.js.map +7 -0
- package/dist/utils/backgroundAgentManager.js +231 -0
- package/dist/utils/backgroundAgentManager.js.map +7 -0
- package/dist/utils/config.js +108 -10
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/conversationRecovery.js +19 -0
- package/dist/utils/conversationRecovery.js.map +2 -2
- package/dist/utils/credentials/CredentialStore.js +1 -0
- package/dist/utils/credentials/CredentialStore.js.map +7 -0
- package/dist/utils/credentials/EncryptedFileStore.js +157 -0
- package/dist/utils/credentials/EncryptedFileStore.js.map +7 -0
- package/dist/utils/credentials/index.js +37 -0
- package/dist/utils/credentials/index.js.map +7 -0
- package/dist/utils/credentials/migration.js +82 -0
- package/dist/utils/credentials/migration.js.map +7 -0
- package/dist/utils/exit.js +73 -0
- package/dist/utils/exit.js.map +7 -0
- package/dist/utils/format.js +73 -5
- package/dist/utils/format.js.map +2 -2
- package/dist/utils/generators.js +76 -6
- package/dist/utils/generators.js.map +2 -2
- package/dist/utils/globalErrorHandler.js +149 -0
- package/dist/utils/globalErrorHandler.js.map +7 -0
- package/dist/utils/groupHandlers/index.js +8 -0
- package/dist/utils/groupHandlers/index.js.map +7 -0
- package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
- package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
- package/dist/utils/groupHandlers/taskHandler.js +104 -0
- package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
- package/dist/utils/groupHandlers/types.js +1 -0
- package/dist/utils/groupHandlers/types.js.map +7 -0
- package/dist/utils/logRotation.js +224 -0
- package/dist/utils/logRotation.js.map +7 -0
- package/dist/utils/markdown.js +13 -1
- package/dist/utils/markdown.js.map +2 -2
- package/dist/utils/marketplaceManager.js +3 -5
- package/dist/utils/marketplaceManager.js.map +2 -2
- package/dist/utils/memSafety.js +264 -0
- package/dist/utils/memSafety.js.map +7 -0
- package/dist/utils/messageGroupManager.js +274 -0
- package/dist/utils/messageGroupManager.js.map +7 -0
- package/dist/utils/messages.js +13 -4
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/model.js +119 -15
- package/dist/utils/model.js.map +3 -3
- package/dist/utils/permissions/filesystem.js +162 -6
- package/dist/utils/permissions/filesystem.js.map +2 -2
- package/dist/utils/plan/planMode.js +143 -0
- package/dist/utils/plan/planMode.js.map +7 -0
- package/dist/utils/pluginLoader.js +17 -21
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/ripgrep.js +55 -2
- package/dist/utils/ripgrep.js.map +2 -2
- package/dist/utils/safePath.js +132 -0
- package/dist/utils/safePath.js.map +7 -0
- package/dist/utils/sanitizeInput.js +32 -0
- package/dist/utils/sanitizeInput.js.map +7 -0
- package/dist/utils/secureKeyStorage.js +312 -0
- package/dist/utils/secureKeyStorage.js.map +7 -0
- package/dist/utils/sensitiveFiles.js +125 -0
- package/dist/utils/sensitiveFiles.js.map +7 -0
- package/dist/utils/session/sessionPlugins.js +67 -0
- package/dist/utils/session/sessionPlugins.js.map +7 -0
- package/dist/utils/taskDisplayUtils.js +257 -0
- package/dist/utils/taskDisplayUtils.js.map +7 -0
- package/dist/utils/teamConfig.js +2 -1
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/theme.js +6 -6
- package/dist/utils/theme.js.map +1 -1
- package/dist/utils/todoStorage.js +92 -2
- package/dist/utils/todoStorage.js.map +2 -2
- package/dist/utils/toolRiskClassification.js +207 -0
- package/dist/utils/toolRiskClassification.js.map +7 -0
- package/dist/utils/toolTimeout.js +136 -0
- package/dist/utils/toolTimeout.js.map +7 -0
- package/dist/utils/tooling/safeRender.js +116 -0
- package/dist/utils/tooling/safeRender.js.map +7 -0
- package/dist/utils/userFriendlyError.js +346 -0
- package/dist/utils/userFriendlyError.js.map +7 -0
- package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +17 -5
- package/scripts/postinstall.js +128 -38
- package/dist/commands/agents.js +0 -2086
- package/dist/commands/agents.js.map +0 -7
- package/dist/commands/build.js +0 -74
- package/dist/commands/build.js.map +0 -7
- package/dist/commands/compression.js +0 -57
- package/dist/commands/compression.js.map +0 -7
- package/dist/commands/listen.js +0 -37
- package/dist/commands/listen.js.map +0 -7
- package/dist/commands/login.js +0 -37
- package/dist/commands/login.js.map +0 -7
- package/dist/commands/logout.js +0 -33
- package/dist/commands/logout.js.map +0 -7
- package/dist/commands/mcp.js +0 -40
- package/dist/commands/mcp.js.map +0 -7
- package/dist/commands/mcp_refresh.js +0 -40
- package/dist/commands/mcp_refresh.js.map +0 -7
- package/dist/commands/modelstatus.js +0 -21
- package/dist/commands/modelstatus.js.map +0 -7
- package/dist/commands/onboarding.js +0 -36
- package/dist/commands/onboarding.js.map +0 -7
- package/dist/commands/plugin-interactive.js +0 -446
- package/dist/commands/plugin-interactive.js.map +0 -7
- package/dist/commands/pr_comments.js +0 -61
- package/dist/commands/pr_comments.js.map +0 -7
- package/dist/commands/release-notes.js +0 -30
- package/dist/commands/release-notes.js.map +0 -7
- package/dist/commands/review.js +0 -51
- package/dist/commands/review.js.map +0 -7
- package/dist/components/Bug.js +0 -147
- package/dist/components/Bug.js.map +0 -7
- package/dist/components/ModelSelector.js +0 -2062
- package/dist/components/ModelSelector.js.map +0 -7
- package/dist/components/ModelStatusDisplay.js +0 -87
- package/dist/components/ModelStatusDisplay.js.map +0 -7
- package/dist/entrypoints/cli-wrapper.js +0 -61
- package/dist/entrypoints/cli-wrapper.js.map +0 -7
- package/dist/hooks/useCancelRequest.js +0 -28
- package/dist/hooks/useCancelRequest.js.map +0 -7
- package/dist/screens/Doctor.js +0 -22
- package/dist/screens/Doctor.js.map +0 -7
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/tools/ReadMcpResourceTool/ReadMcpResourceTool.tsx"],
|
|
4
|
+
"sourcesContent": ["import { Box, Text } from 'ink'\nimport React from 'react'\nimport { z } from 'zod'\nimport { Cost } from '@components/Cost'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { Tool } from '@tool'\nimport { readMCPResource, McpResourceContent } from '@services/mcpClient'\nimport { DESCRIPTION, TOOL_NAME_FOR_PROMPT } from './prompt'\nimport { getTheme } from '@utils/theme'\n\nconst inputSchema = z.strictObject({\n uri: z.string().describe('The URI of the resource to read'),\n server: z\n .string()\n .optional()\n .describe('Optional server name to target a specific MCP server'),\n})\n\ntype Output = {\n durationMs: number\n content: McpResourceContent | null\n error?: string\n}\n\nexport const ReadMcpResourceTool = {\n name: TOOL_NAME_FOR_PROMPT,\n async description() {\n return DESCRIPTION\n },\n userFacingName() {\n return 'Read MCP Resource'\n },\n inputSchema,\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true // Read-only operation, safe for concurrent execution\n },\n needsPermissions() {\n return false // No file system access needed\n },\n async prompt() {\n return DESCRIPTION\n },\n renderToolUseMessage({ uri, server }, { verbose }) {\n let msg = `uri: \"${uri}\"`\n if (server) {\n msg += `, server: \"${server}\"`\n }\n return msg\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output) {\n if (!output) {\n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text color={getTheme().error}>Failed to read resource</Text>\n </Box>\n </Box>\n )\n }\n\n // Handle string content for backward compatibility\n if (typeof output === 'string') {\n try {\n output = JSON.parse(output) as Output\n } catch {\n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text> \u23BF Read MCP resource</Text>\n </Box>\n </Box>\n )\n }\n }\n\n const durationMs = output?.durationMs ?? 0\n\n if (output?.error) {\n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text color={getTheme().error}>{output.error}</Text>\n </Box>\n <Cost costUSD={0} durationMs={durationMs} debug={false} />\n </Box>\n )\n }\n\n if (!output?.content) {\n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text color={getTheme().warning}>Resource not found</Text>\n </Box>\n <Cost costUSD={0} durationMs={durationMs} debug={false} />\n </Box>\n )\n }\n\n const contentType = output.content.mimeType || 'unknown'\n const hasText = !!output.content.text\n const hasBlob = !!output.content.blob\n\n return (\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text> \u23BF Read resource </Text>\n <Text color={getTheme().secondaryText}>\n ({contentType}, {hasText ? 'text' : hasBlob ? 'binary' : 'empty'})\n </Text>\n </Box>\n <Cost costUSD={0} durationMs={durationMs} debug={false} />\n </Box>\n )\n },\n async *call({ uri, server }) {\n const start = Date.now()\n\n try {\n const content = await readMCPResource(uri, server)\n const output: Output = {\n content,\n durationMs: Date.now() - start,\n }\n yield {\n type: 'result',\n resultForAssistant: this.renderResultForAssistant(output),\n data: output,\n }\n } catch (error) {\n const output: Output = {\n content: null,\n durationMs: Date.now() - start,\n error: error instanceof Error ? error.message : String(error),\n }\n yield {\n type: 'result',\n resultForAssistant: this.renderResultForAssistant(output),\n data: output,\n }\n }\n },\n renderResultForAssistant(output) {\n if (output.error) {\n return `Error reading resource: ${output.error}`\n }\n\n if (!output.content) {\n return 'Resource not found or not accessible'\n }\n\n const lines: string[] = []\n lines.push(`Resource: ${output.content.uri}`)\n\n if (output.content.mimeType) {\n lines.push(`MIME Type: ${output.content.mimeType}`)\n }\n\n lines.push('')\n\n if (output.content.text) {\n lines.push('Content:')\n lines.push(output.content.text)\n } else if (output.content.blob) {\n lines.push(\n `Binary content (base64, ${output.content.blob.length} characters)`,\n )\n // Only show first 200 chars of base64 for preview\n if (output.content.blob.length > 200) {\n lines.push(output.content.blob.substring(0, 200) + '...')\n } else {\n lines.push(output.content.blob)\n }\n } else {\n lines.push('(Empty content)')\n }\n\n return lines.join('\\n')\n },\n} satisfies Tool<typeof inputSchema, Output>\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
const TOOL_NAME_FOR_PROMPT = "ReadMcpResource";
|
|
2
|
+
const DESCRIPTION = `Reads the content of a specific resource from an MCP (Model Context Protocol) server.
|
|
3
|
+
|
|
4
|
+
Use this tool to retrieve the content of a resource identified by its URI.
|
|
5
|
+
First use ListMcpResources to discover available resources and their URIs.
|
|
6
|
+
|
|
7
|
+
The resource content can be:
|
|
8
|
+
- Text content (for text files, JSON, etc.)
|
|
9
|
+
- Binary content encoded as base64 (for images, PDFs, etc.)
|
|
10
|
+
|
|
11
|
+
You can optionally specify a server name to target a specific MCP server,
|
|
12
|
+
which is useful when multiple servers might expose resources with similar URIs.`;
|
|
13
|
+
export {
|
|
14
|
+
DESCRIPTION,
|
|
15
|
+
TOOL_NAME_FOR_PROMPT
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/tools/ReadMcpResourceTool/prompt.ts"],
|
|
4
|
+
"sourcesContent": ["export const TOOL_NAME_FOR_PROMPT = 'ReadMcpResource'\n\nexport const DESCRIPTION = `Reads the content of a specific resource from an MCP (Model Context Protocol) server.\n\nUse this tool to retrieve the content of a resource identified by its URI.\nFirst use ListMcpResources to discover available resources and their URIs.\n\nThe resource content can be:\n- Text content (for text files, JSON, etc.)\n- Binary content encoded as base64 (for images, PDFs, etc.)\n\nYou can optionally specify a server name to target a specific MCP server,\nwhich is useful when multiple servers might expose resources with similar URIs.`\n"],
|
|
5
|
+
"mappings": "AAAO,MAAM,uBAAuB;AAE7B,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
getSkillCount
|
|
11
11
|
} from "../../utils/skillLoader.js";
|
|
12
12
|
import { DESCRIPTION, PROMPT } from "./prompt.js";
|
|
13
|
+
import { SEMANTIC_COLORS } from "../../constants/colors.js";
|
|
13
14
|
const inputSchema = z.strictObject({
|
|
14
15
|
action: z.enum(["list", "load", "search"]).describe(
|
|
15
16
|
"Action to perform: list all skills, load a specific skill, or search skills"
|
|
@@ -106,15 +107,20 @@ ${skill.content}
|
|
|
106
107
|
}
|
|
107
108
|
if (output.type === "list") {
|
|
108
109
|
const skills = output.skills || [];
|
|
109
|
-
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: "green" }, "\u2713 Found ", skills.length, " skill", skills.length !== 1 ? "s" : ""), skills.slice(0, 10).map((skill, i) => /* @__PURE__ */ React.createElement(Box, { key: i, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true }, skill?.name || "Unknown"), /* @__PURE__ */ React.createElement(Text, {
|
|
110
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: "green" }, "\u2713 Found ", skills.length, " skill", skills.length !== 1 ? "s" : ""), skills.slice(0, 10).map((skill, i) => /* @__PURE__ */ React.createElement(Box, { key: i, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true }, skill?.name || "Unknown"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "(", skill?.plugin || "Unknown", ")")), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", skill?.description || ""))), skills.length > 10 && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "... and ", skills.length - 10, " more"));
|
|
110
111
|
}
|
|
111
112
|
if (output.type === "search") {
|
|
112
113
|
const skills = output.skills || [];
|
|
113
|
-
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: "green" }, "\u2713 Found ", skills.length, " skill", skills.length !== 1 ? "s" : "", ' matching "', output.query || "", '"'), skills.slice(0, 10).map((skill, i) => /* @__PURE__ */ React.createElement(Box, { key: i, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true }, skill?.name || "Unknown"), /* @__PURE__ */ React.createElement(Text, {
|
|
114
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: "green" }, "\u2713 Found ", skills.length, " skill", skills.length !== 1 ? "s" : "", ' matching "', output.query || "", '"'), skills.slice(0, 10).map((skill, i) => /* @__PURE__ */ React.createElement(Box, { key: i, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true }, skill?.name || "Unknown"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "(", skill?.plugin || "Unknown", ")")), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", skill?.description || ""))), skills.length > 10 && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "... and ", skills.length - 10, " more"));
|
|
114
115
|
}
|
|
115
116
|
if (output.type === "load") {
|
|
116
|
-
const skill = output.skill || {
|
|
117
|
-
|
|
117
|
+
const skill = output.skill || {
|
|
118
|
+
name: "",
|
|
119
|
+
description: "",
|
|
120
|
+
plugin: "",
|
|
121
|
+
content: ""
|
|
122
|
+
};
|
|
123
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: "green" }, "\u2713 Loaded skill: ", skill.name || "Unknown"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "Plugin: ", skill.plugin || "Unknown"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "Content: ", (skill.content || "").length, " characters"));
|
|
118
124
|
}
|
|
119
125
|
return /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "Skill operation completed"));
|
|
120
126
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/tools/SkillTool/SkillTool.tsx"],
|
|
4
|
-
"sourcesContent": ["import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { Tool } from '@tool'\nimport {\n loadAllSkills,\n getSkill,\n loadSkillContent,\n searchSkills,\n getSkillCount,\n} from '@utils/skillLoader'\nimport { DESCRIPTION, PROMPT } from './prompt'\n\nconst inputSchema = z.strictObject({\n action: z\n .enum(['list', 'load', 'search'])\n .describe(\n 'Action to perform: list all skills, load a specific skill, or search skills',\n ),\n name: z\n .string()\n .optional()\n .describe('Name of skill to load (required for \"load\" action)'),\n query: z\n .string()\n .optional()\n .describe('Search query (required for \"search\" action)'),\n})\n\ntype SkillToolOutput =\n | {\n type: 'list'\n skills: Array<{ name: string; description: string; plugin: string }>\n }\n | {\n type: 'load'\n skill: {\n name: string\n description: string\n plugin: string\n content: string\n }\n }\n | {\n type: 'search'\n skills: Array<{ name: string; description: string; plugin: string }>\n query: string\n }\n\nexport const SkillTool = {\n name: 'Skill',\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'Skill'\n },\n async isEnabled() {\n // Enable if there are any skills available\n return getSkillCount() > 0\n },\n isReadOnly() {\n return true // Skills are read-only resources\n },\n isConcurrencySafe() {\n return true // Reading skills is safe for concurrent execution\n },\n needsPermissions() {\n return false // No permissions needed for reading skills\n },\n renderResultForAssistant(output: SkillToolOutput) {\n if (output.type === 'list') {\n if (output.skills.length === 0) {\n return 'No skills available. Install plugins with skills to use this feature.'\n }\n\n const skillsList = output.skills\n .map(\n skill =>\n `- **${skill.name}** (${skill.plugin}): ${skill.description}`,\n )\n .join('\\n')\n\n return `Available skills (${output.skills.length}):\\n\\n${skillsList}\\n\\nUse the \"load\" action to get full skill content.`\n }\n\n if (output.type === 'search') {\n if (output.skills.length === 0) {\n return `No skills found matching \"${output.query}\".`\n }\n\n const skillsList = output.skills\n .map(\n skill =>\n `- **${skill.name}** (${skill.plugin}): ${skill.description}`,\n )\n .join('\\n')\n\n return `Skills matching \"${output.query}\" (${output.skills.length}):\\n\\n${skillsList}\\n\\nUse the \"load\" action to get full skill content.`\n }\n\n if (output.type === 'load') {\n const { skill } = output\n return `# Skill: ${skill.name}\n\n**Plugin**: ${skill.plugin}\n**Description**: ${skill.description}\n\n---\n\n${skill.content}\n\n---\n\n*End of skill content. Apply these instructions to complete your task.*`\n }\n\n return 'Unknown skill operation'\n },\n renderToolUseMessage(input, { verbose }) {\n if (input.action === 'list') {\n return 'Listing all available skills'\n }\n if (input.action === 'load' && input.name) {\n return `Loading skill: ${input.name}`\n }\n if (input.action === 'search' && input.query) {\n return `Searching skills for: ${input.query}`\n }\n return Object.entries(input)\n .map(([key, value]) => `${key}: ${JSON.stringify(value)}`)\n .join(', ')\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: SkillToolOutput) {\n // Guard against undefined or null output\n if (!output || !output.type) {\n return (\n <Box paddingLeft={2}>\n <Text>Skill operation completed</Text>\n </Box>\n )\n }\n\n if (output.type === 'list') {\n const skills = output.skills || []\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n <Text color=\"green\">\n \u2713 Found {skills.length} skill\n {skills.length !== 1 ? 's' : ''}\n </Text>\n {skills.slice(0, 10).map((skill, i) => (\n <Box key={i} flexDirection=\"column\">\n <Text>\n <Text bold>{skill?.name || 'Unknown'}</Text>\n <Text dimColor> ({skill?.plugin || 'Unknown'})</Text>\n </Text>\n <Text dimColor> {skill?.description || ''}</Text>\n </Box>\n ))}\n {skills.length > 10 && (\n <Text dimColor> ... and {skills.length - 10} more</Text>\n )}\n </Box>\n )\n }\n\n if (output.type === 'search') {\n const skills = output.skills || []\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n <Text color=\"green\">\n \u2713 Found {skills.length} skill\n {skills.length !== 1 ? 's' : ''} matching "\n {output.query || ''}"\n </Text>\n {skills.slice(0, 10).map((skill, i) => (\n <Box key={i} flexDirection=\"column\">\n <Text>\n <Text bold>{skill?.name || 'Unknown'}</Text>\n <Text dimColor> ({skill?.plugin || 'Unknown'})</Text>\n </Text>\n <Text dimColor> {skill?.description || ''}</Text>\n </Box>\n ))}\n {skills.length > 10 && (\n <Text dimColor> ... and {skills.length - 10} more</Text>\n )}\n </Box>\n )\n }\n\n if (output.type === 'load') {\n const skill = output.skill || { name: '', description: '', plugin: '', content: '' }\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n <Text color=\"green\">\u2713 Loaded skill: {skill.name || 'Unknown'}</Text>\n <Text dimColor> Plugin: {skill.plugin || 'Unknown'}</Text>\n <Text dimColor>\n {' '}\n Content: {(skill.content || '').length} characters\n </Text>\n </Box>\n )\n }\n\n return (\n <Box paddingLeft={2}>\n <Text>Skill operation completed</Text>\n </Box>\n )\n },\n async validateInput(input) {\n if (input.action === 'load') {\n if (!input.name) {\n return {\n result: false,\n message: 'Skill name is required for \"load\" action',\n }\n }\n\n const skill = getSkill(input.name)\n if (!skill) {\n const allSkills = loadAllSkills()\n const availableNames = allSkills.map(s => s.name).join(', ')\n return {\n result: false,\n message: `Skill \"${input.name}\" not found. Available skills: ${availableNames}`,\n }\n }\n }\n\n if (input.action === 'search') {\n if (!input.query) {\n return {\n result: false,\n message: 'Query is required for \"search\" action',\n }\n }\n }\n\n return { result: true }\n },\n async *call(input) {\n try {\n // List all skills\n if (input.action === 'list') {\n const skills = loadAllSkills()\n const skillsList = skills.map(skill => ({\n name: skill.name,\n description: skill.config.description,\n plugin: skill.pluginName,\n }))\n\n const output: SkillToolOutput = {\n type: 'list',\n skills: skillsList,\n }\n\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n return\n }\n\n // Load specific skill\n if (input.action === 'load' && input.name) {\n const skill = getSkill(input.name)\n if (!skill) {\n throw new Error(`Skill \"${input.name}\" not found`)\n }\n\n // Load full content\n const content = await loadSkillContent(skill)\n\n const output: SkillToolOutput = {\n type: 'load',\n skill: {\n name: skill.name,\n description: skill.config.description,\n plugin: skill.pluginName,\n content,\n },\n }\n\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n return\n }\n\n // Search skills\n if (input.action === 'search' && input.query) {\n const skills = searchSkills(input.query)\n const skillsList = skills.map(skill => ({\n name: skill.name,\n description: skill.config.description,\n plugin: skill.pluginName,\n }))\n\n const output: SkillToolOutput = {\n type: 'search',\n skills: skillsList,\n query: input.query,\n }\n\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n return\n }\n\n throw new Error('Invalid skill action or missing required parameters')\n } catch (error) {\n throw new Error(\n `Skill operation failed: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n },\n} satisfies Tool<typeof inputSchema, SkillToolOutput>\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,KAAK,YAAY;AAC1B,YAAY,WAAW;AACvB,SAAS,SAAS;AAClB,SAAS,sCAAsC;AAE/C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,aAAa,cAAc;
|
|
4
|
+
"sourcesContent": ["import { Box, Text } from 'ink'\nimport * as React from 'react'\nimport { z } from 'zod'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { Tool } from '@tool'\nimport {\n loadAllSkills,\n getSkill,\n loadSkillContent,\n searchSkills,\n getSkillCount,\n} from '@utils/skillLoader'\nimport { DESCRIPTION, PROMPT } from './prompt'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\nconst inputSchema = z.strictObject({\n action: z\n .enum(['list', 'load', 'search'])\n .describe(\n 'Action to perform: list all skills, load a specific skill, or search skills',\n ),\n name: z\n .string()\n .optional()\n .describe('Name of skill to load (required for \"load\" action)'),\n query: z\n .string()\n .optional()\n .describe('Search query (required for \"search\" action)'),\n})\n\ntype SkillToolOutput =\n | {\n type: 'list'\n skills: Array<{ name: string; description: string; plugin: string }>\n }\n | {\n type: 'load'\n skill: {\n name: string\n description: string\n plugin: string\n content: string\n }\n }\n | {\n type: 'search'\n skills: Array<{ name: string; description: string; plugin: string }>\n query: string\n }\n\nexport const SkillTool = {\n name: 'Skill',\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'Skill'\n },\n async isEnabled() {\n // Enable if there are any skills available\n return getSkillCount() > 0\n },\n isReadOnly() {\n return true // Skills are read-only resources\n },\n isConcurrencySafe() {\n return true // Reading skills is safe for concurrent execution\n },\n needsPermissions() {\n return false // No permissions needed for reading skills\n },\n renderResultForAssistant(output: SkillToolOutput) {\n if (output.type === 'list') {\n if (output.skills.length === 0) {\n return 'No skills available. Install plugins with skills to use this feature.'\n }\n\n const skillsList = output.skills\n .map(\n skill =>\n `- **${skill.name}** (${skill.plugin}): ${skill.description}`,\n )\n .join('\\n')\n\n return `Available skills (${output.skills.length}):\\n\\n${skillsList}\\n\\nUse the \"load\" action to get full skill content.`\n }\n\n if (output.type === 'search') {\n if (output.skills.length === 0) {\n return `No skills found matching \"${output.query}\".`\n }\n\n const skillsList = output.skills\n .map(\n skill =>\n `- **${skill.name}** (${skill.plugin}): ${skill.description}`,\n )\n .join('\\n')\n\n return `Skills matching \"${output.query}\" (${output.skills.length}):\\n\\n${skillsList}\\n\\nUse the \"load\" action to get full skill content.`\n }\n\n if (output.type === 'load') {\n const { skill } = output\n return `# Skill: ${skill.name}\n\n**Plugin**: ${skill.plugin}\n**Description**: ${skill.description}\n\n---\n\n${skill.content}\n\n---\n\n*End of skill content. Apply these instructions to complete your task.*`\n }\n\n return 'Unknown skill operation'\n },\n renderToolUseMessage(input, { verbose }) {\n if (input.action === 'list') {\n return 'Listing all available skills'\n }\n if (input.action === 'load' && input.name) {\n return `Loading skill: ${input.name}`\n }\n if (input.action === 'search' && input.query) {\n return `Searching skills for: ${input.query}`\n }\n return Object.entries(input)\n .map(([key, value]) => `${key}: ${JSON.stringify(value)}`)\n .join(', ')\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: SkillToolOutput) {\n // Guard against undefined or null output\n if (!output || !output.type) {\n return (\n <Box paddingLeft={2}>\n <Text>Skill operation completed</Text>\n </Box>\n )\n }\n\n if (output.type === 'list') {\n const skills = output.skills || []\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n <Text color=\"green\">\n \u2713 Found {skills.length} skill\n {skills.length !== 1 ? 's' : ''}\n </Text>\n {skills.slice(0, 10).map((skill, i) => (\n <Box key={i} flexDirection=\"column\">\n <Text>\n <Text bold>{skill?.name || 'Unknown'}</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n ({skill?.plugin || 'Unknown'})\n </Text>\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n {skill?.description || ''}\n </Text>\n </Box>\n ))}\n {skills.length > 10 && (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n ... and {skills.length - 10} more\n </Text>\n )}\n </Box>\n )\n }\n\n if (output.type === 'search') {\n const skills = output.skills || []\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n <Text color=\"green\">\n \u2713 Found {skills.length} skill\n {skills.length !== 1 ? 's' : ''} matching "\n {output.query || ''}"\n </Text>\n {skills.slice(0, 10).map((skill, i) => (\n <Box key={i} flexDirection=\"column\">\n <Text>\n <Text bold>{skill?.name || 'Unknown'}</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n ({skill?.plugin || 'Unknown'})\n </Text>\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n {skill?.description || ''}\n </Text>\n </Box>\n ))}\n {skills.length > 10 && (\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n ... and {skills.length - 10} more\n </Text>\n )}\n </Box>\n )\n }\n\n if (output.type === 'load') {\n const skill = output.skill || {\n name: '',\n description: '',\n plugin: '',\n content: '',\n }\n return (\n <Box flexDirection=\"column\" paddingLeft={2}>\n <Text color=\"green\">\u2713 Loaded skill: {skill.name || 'Unknown'}</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n Plugin: {skill.plugin || 'Unknown'}\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n Content: {(skill.content || '').length} characters\n </Text>\n </Box>\n )\n }\n\n return (\n <Box paddingLeft={2}>\n <Text>Skill operation completed</Text>\n </Box>\n )\n },\n async validateInput(input) {\n if (input.action === 'load') {\n if (!input.name) {\n return {\n result: false,\n message: 'Skill name is required for \"load\" action',\n }\n }\n\n const skill = getSkill(input.name)\n if (!skill) {\n const allSkills = loadAllSkills()\n const availableNames = allSkills.map(s => s.name).join(', ')\n return {\n result: false,\n message: `Skill \"${input.name}\" not found. Available skills: ${availableNames}`,\n }\n }\n }\n\n if (input.action === 'search') {\n if (!input.query) {\n return {\n result: false,\n message: 'Query is required for \"search\" action',\n }\n }\n }\n\n return { result: true }\n },\n async *call(input) {\n try {\n // List all skills\n if (input.action === 'list') {\n const skills = loadAllSkills()\n const skillsList = skills.map(skill => ({\n name: skill.name,\n description: skill.config.description,\n plugin: skill.pluginName,\n }))\n\n const output: SkillToolOutput = {\n type: 'list',\n skills: skillsList,\n }\n\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n return\n }\n\n // Load specific skill\n if (input.action === 'load' && input.name) {\n const skill = getSkill(input.name)\n if (!skill) {\n throw new Error(`Skill \"${input.name}\" not found`)\n }\n\n // Load full content\n const content = await loadSkillContent(skill)\n\n const output: SkillToolOutput = {\n type: 'load',\n skill: {\n name: skill.name,\n description: skill.config.description,\n plugin: skill.pluginName,\n content,\n },\n }\n\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n return\n }\n\n // Search skills\n if (input.action === 'search' && input.query) {\n const skills = searchSkills(input.query)\n const skillsList = skills.map(skill => ({\n name: skill.name,\n description: skill.config.description,\n plugin: skill.pluginName,\n }))\n\n const output: SkillToolOutput = {\n type: 'search',\n skills: skillsList,\n query: input.query,\n }\n\n yield {\n type: 'result',\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n }\n return\n }\n\n throw new Error('Invalid skill action or missing required parameters')\n } catch (error) {\n throw new Error(\n `Skill operation failed: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n },\n} satisfies Tool<typeof inputSchema, SkillToolOutput>\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -64,7 +64,7 @@ Skills typically include:
|
|
|
64
64
|
2. Search or list skills to find "microservices-patterns"
|
|
65
65
|
3. Load the skill to get detailed instructions
|
|
66
66
|
4. Follow skill guidance to architect the system
|
|
67
|
-
5. Use referenced tools (
|
|
67
|
+
5. Use referenced tools (Replace, Edit, etc.) to implement
|
|
68
68
|
|
|
69
69
|
## Important Notes
|
|
70
70
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/tools/SkillTool/prompt.ts"],
|
|
4
|
-
"sourcesContent": ["export const DESCRIPTION = `Use this tool to discover and load skills from installed plugins. Skills provide specialized knowledge and instructions for specific tasks (e.g., API design, testing patterns, architecture patterns).\n\nSkills use progressive disclosure - list skills to see what's available, then load specific skills to get detailed instructions.`\n\nexport const PROMPT = `# Skill Tool\n\n## Purpose\nLoad and apply skills from plugins. Skills provide expert knowledge, best practices, and step-by-step instructions for specialized tasks.\n\n## Available Operations\n\n### List Skills\n\\`\\`\\`json\n{\n \"action\": \"list\"\n}\n\\`\\`\\`\nReturns all available skills with their names, descriptions, and source plugins.\n\n### Load Skill\n\\`\\`\\`json\n{\n \"action\": \"load\",\n \"name\": \"skill-name\"\n}\n\\`\\`\\`\nLoads and displays the full content of a specific skill. Use this when you need detailed instructions for a task.\n\n### Search Skills\n\\`\\`\\`json\n{\n \"action\": \"search\",\n \"query\": \"search-term\"\n}\n\\`\\`\\`\nSearches skills by name, description, or plugin name. Returns matching skills.\n\n## Usage Pattern\n\n1. **Discover**: Use \"list\" or \"search\" to find relevant skills\n2. **Load**: Use \"load\" to get full skill instructions\n3. **Apply**: Follow the skill's instructions to complete the task\n4. **Context**: Skills may reference tools, patterns, or other resources\n\n## When to Use Skills\n\n- User requests expertise in a specific domain (e.g., \"design a REST API\")\n- Task matches a skill description (e.g., backend architecture, testing)\n- Need best practices or patterns for a technology\n- Want step-by-step guidance for complex operations\n\n## Skill Content Structure\n\nSkills typically include:\n- Overview and purpose\n- Key concepts and principles\n- Step-by-step instructions\n- Code examples and patterns\n- Best practices and anti-patterns\n- Common pitfalls and solutions\n\n## Example Workflow\n\n1. User: \"Help me design a microservices architecture\"\n2. Search or list skills to find \"microservices-patterns\"\n3. Load the skill to get detailed instructions\n4. Follow skill guidance to architect the system\n5. Use referenced tools (
|
|
4
|
+
"sourcesContent": ["export const DESCRIPTION = `Use this tool to discover and load skills from installed plugins. Skills provide specialized knowledge and instructions for specific tasks (e.g., API design, testing patterns, architecture patterns).\n\nSkills use progressive disclosure - list skills to see what's available, then load specific skills to get detailed instructions.`\n\nexport const PROMPT = `# Skill Tool\n\n## Purpose\nLoad and apply skills from plugins. Skills provide expert knowledge, best practices, and step-by-step instructions for specialized tasks.\n\n## Available Operations\n\n### List Skills\n\\`\\`\\`json\n{\n \"action\": \"list\"\n}\n\\`\\`\\`\nReturns all available skills with their names, descriptions, and source plugins.\n\n### Load Skill\n\\`\\`\\`json\n{\n \"action\": \"load\",\n \"name\": \"skill-name\"\n}\n\\`\\`\\`\nLoads and displays the full content of a specific skill. Use this when you need detailed instructions for a task.\n\n### Search Skills\n\\`\\`\\`json\n{\n \"action\": \"search\",\n \"query\": \"search-term\"\n}\n\\`\\`\\`\nSearches skills by name, description, or plugin name. Returns matching skills.\n\n## Usage Pattern\n\n1. **Discover**: Use \"list\" or \"search\" to find relevant skills\n2. **Load**: Use \"load\" to get full skill instructions\n3. **Apply**: Follow the skill's instructions to complete the task\n4. **Context**: Skills may reference tools, patterns, or other resources\n\n## When to Use Skills\n\n- User requests expertise in a specific domain (e.g., \"design a REST API\")\n- Task matches a skill description (e.g., backend architecture, testing)\n- Need best practices or patterns for a technology\n- Want step-by-step guidance for complex operations\n\n## Skill Content Structure\n\nSkills typically include:\n- Overview and purpose\n- Key concepts and principles\n- Step-by-step instructions\n- Code examples and patterns\n- Best practices and anti-patterns\n- Common pitfalls and solutions\n\n## Example Workflow\n\n1. User: \"Help me design a microservices architecture\"\n2. Search or list skills to find \"microservices-patterns\"\n3. Load the skill to get detailed instructions\n4. Follow skill guidance to architect the system\n5. Use referenced tools (Replace, Edit, etc.) to implement\n\n## Important Notes\n\n- Skills are loaded from installed plugins\n- Each skill comes from a specific plugin source\n- Skills are cached for performance\n- Load skills progressively - metadata first, full content on demand\n- Skills complement your existing knowledge - use them as guides, not rigid rules\n`\n"],
|
|
5
5
|
"mappings": "AAAO,MAAM,cAAc;AAAA;AAAA;AAIpB,MAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { FallbackToolUseRejectedMessage } from "../../components/FallbackToolUseRejectedMessage.js";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { createUserMessage } from "../../utils/messages.js";
|
|
5
|
+
import { getCommands } from "../../commands.js";
|
|
6
|
+
import {
|
|
7
|
+
loadCustomCommands
|
|
8
|
+
} from "../../services/customCommands.js";
|
|
9
|
+
import { TOOL_NAME_FOR_PROMPT } from "./prompt.js";
|
|
10
|
+
import { Box, Text } from "ink";
|
|
11
|
+
const inputSchema = z.strictObject({
|
|
12
|
+
skill: z.string().describe('The skill name. E.g., "commit", "review-pr", or "pdf"'),
|
|
13
|
+
args: z.string().optional().describe("Optional arguments for the skill")
|
|
14
|
+
});
|
|
15
|
+
function normalizeCommandModelName(model) {
|
|
16
|
+
if (typeof model !== "string") return void 0;
|
|
17
|
+
const trimmed = model.trim();
|
|
18
|
+
if (!trimmed || trimmed === "inherit") return void 0;
|
|
19
|
+
if (trimmed === "haiku") return "quick";
|
|
20
|
+
if (trimmed === "sonnet") return "task";
|
|
21
|
+
if (trimmed === "opus") return "main";
|
|
22
|
+
return trimmed;
|
|
23
|
+
}
|
|
24
|
+
function getCharBudget() {
|
|
25
|
+
const raw = Number(process.env.SLASH_COMMAND_TOOL_CHAR_BUDGET);
|
|
26
|
+
return Number.isFinite(raw) && raw > 0 ? raw : 15e3;
|
|
27
|
+
}
|
|
28
|
+
const SlashCommandTool = {
|
|
29
|
+
name: TOOL_NAME_FOR_PROMPT,
|
|
30
|
+
async description(input) {
|
|
31
|
+
const skill = input?.skill;
|
|
32
|
+
return skill ? `Execute skill: ${skill}` : "Execute a skill within the main conversation";
|
|
33
|
+
},
|
|
34
|
+
userFacingName() {
|
|
35
|
+
return "Skill";
|
|
36
|
+
},
|
|
37
|
+
inputSchema,
|
|
38
|
+
isReadOnly() {
|
|
39
|
+
return false;
|
|
40
|
+
},
|
|
41
|
+
isConcurrencySafe() {
|
|
42
|
+
return false;
|
|
43
|
+
},
|
|
44
|
+
async isEnabled() {
|
|
45
|
+
return true;
|
|
46
|
+
},
|
|
47
|
+
needsPermissions() {
|
|
48
|
+
return true;
|
|
49
|
+
},
|
|
50
|
+
async prompt() {
|
|
51
|
+
const all = await loadCustomCommands();
|
|
52
|
+
const commands = all.filter(
|
|
53
|
+
(cmd) => cmd.type === "prompt" && cmd.isSkill !== true && cmd.disableModelInvocation !== true
|
|
54
|
+
);
|
|
55
|
+
const limited = [];
|
|
56
|
+
let used = 0;
|
|
57
|
+
for (const cmd of commands) {
|
|
58
|
+
const name = `/${cmd.name}`;
|
|
59
|
+
const args = cmd.argumentHint ? ` ${cmd.argumentHint}` : "";
|
|
60
|
+
const whenToUse = cmd.whenToUse ? `- ${cmd.whenToUse}` : "";
|
|
61
|
+
const line = `- ${name}${args}: ${cmd.description} ${whenToUse}`.trim();
|
|
62
|
+
used += line.length + 1;
|
|
63
|
+
if (used > getCharBudget()) break;
|
|
64
|
+
limited.push(cmd);
|
|
65
|
+
}
|
|
66
|
+
const availableLines = limited.length > 0 ? limited.map((cmd) => {
|
|
67
|
+
const name = `/${cmd.name}`;
|
|
68
|
+
const args = cmd.argumentHint ? ` ${cmd.argumentHint}` : "";
|
|
69
|
+
const whenToUse = cmd.whenToUse ? `- ${cmd.whenToUse}` : "";
|
|
70
|
+
return `- ${name}${args}: ${cmd.description} ${whenToUse}`.trim();
|
|
71
|
+
}).join("\n") : "";
|
|
72
|
+
const truncatedNotice = commands.length > limited.length ? `
|
|
73
|
+
(Showing ${limited.length} of ${commands.length} commands due to token limits)` : "";
|
|
74
|
+
return `Execute a skill within the main conversation
|
|
75
|
+
|
|
76
|
+
<skills_instructions>
|
|
77
|
+
When users ask you to perform tasks, check if any of the available skills below can help complete the task more effectively. Skills provide specialized capabilities and domain knowledge.
|
|
78
|
+
|
|
79
|
+
When users ask you to run a "slash command" or reference "/<something>" (e.g., "/commit", "/review-pr"), they are referring to a skill. Use this tool to invoke the corresponding skill.
|
|
80
|
+
|
|
81
|
+
<example>
|
|
82
|
+
User: "run /commit"
|
|
83
|
+
Assistant: [Calls Skill tool with skill: "commit"]
|
|
84
|
+
</example>
|
|
85
|
+
|
|
86
|
+
How to invoke:
|
|
87
|
+
- Use this tool with the skill name and optional arguments
|
|
88
|
+
- Examples:
|
|
89
|
+
- \`skill: "pdf"\` - invoke the pdf skill
|
|
90
|
+
- \`skill: "commit", args: "-m 'Fix bug'"\` - invoke with arguments
|
|
91
|
+
- \`skill: "review-pr", args: "123"\` - invoke with arguments
|
|
92
|
+
- \`skill: "ms-office-suite:pdf"\` - invoke using fully qualified name
|
|
93
|
+
|
|
94
|
+
Important:
|
|
95
|
+
- When a skill is relevant, you must invoke this tool IMMEDIATELY as your first action
|
|
96
|
+
- NEVER just announce or mention a skill in your text response without actually calling this tool
|
|
97
|
+
- This is a BLOCKING REQUIREMENT: invoke the relevant Skill tool BEFORE generating any other response about the task
|
|
98
|
+
- Only use skills listed in <available_skills> below
|
|
99
|
+
- Do not invoke a skill that is already running
|
|
100
|
+
- Do not use this tool for built-in CLI commands (like /help, /clear, etc.)
|
|
101
|
+
</skills_instructions>
|
|
102
|
+
|
|
103
|
+
${availableLines ? `<available_skills>
|
|
104
|
+
${availableLines}${truncatedNotice}
|
|
105
|
+
</available_skills>
|
|
106
|
+
` : ""}`;
|
|
107
|
+
},
|
|
108
|
+
renderToolUseMessage({ skill, args }, _options) {
|
|
109
|
+
return args ? `${skill} ${args}` : skill;
|
|
110
|
+
},
|
|
111
|
+
renderToolUseRejectedMessage() {
|
|
112
|
+
return /* @__PURE__ */ React.createElement(FallbackToolUseRejectedMessage, null);
|
|
113
|
+
},
|
|
114
|
+
renderToolResultMessage(output) {
|
|
115
|
+
if (!output) {
|
|
116
|
+
return /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "Skill executed"));
|
|
117
|
+
}
|
|
118
|
+
return /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: "green" }, "\u2713 Launching skill: /", output.skillName));
|
|
119
|
+
},
|
|
120
|
+
renderResultForAssistant(output) {
|
|
121
|
+
return `Launching skill: /${output.skillName}`;
|
|
122
|
+
},
|
|
123
|
+
async validateInput({ skill }, context) {
|
|
124
|
+
const parsed = parseSkillName(skill);
|
|
125
|
+
if (!parsed) {
|
|
126
|
+
return {
|
|
127
|
+
result: false,
|
|
128
|
+
message: `Invalid skill name: ${skill}`,
|
|
129
|
+
errorCode: 1
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
const commands = context?.options?.commands ?? await getCommands();
|
|
133
|
+
const cmd = findCommand(parsed.skillName, commands);
|
|
134
|
+
if (!cmd) {
|
|
135
|
+
return {
|
|
136
|
+
result: false,
|
|
137
|
+
message: `Unknown skill: ${parsed.skillName}`,
|
|
138
|
+
errorCode: 2
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
if (cmd.disableModelInvocation) {
|
|
142
|
+
return {
|
|
143
|
+
result: false,
|
|
144
|
+
message: `Skill ${parsed.skillName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool due to disable-model-invocation`,
|
|
145
|
+
errorCode: 4
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
if (cmd.disableNonInteractive) {
|
|
149
|
+
return {
|
|
150
|
+
result: false,
|
|
151
|
+
message: `Skill ${parsed.skillName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool because it is non-interactive`,
|
|
152
|
+
errorCode: 6
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
if (cmd.type !== "prompt") {
|
|
156
|
+
return {
|
|
157
|
+
result: false,
|
|
158
|
+
message: `Skill ${parsed.skillName} is not a prompt-based command`,
|
|
159
|
+
errorCode: 5
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
return { result: true };
|
|
163
|
+
},
|
|
164
|
+
async *call({ skill, args }, context) {
|
|
165
|
+
const parsed = parseSkillName(skill);
|
|
166
|
+
if (!parsed) {
|
|
167
|
+
throw new Error(`Invalid skill name: ${skill}`);
|
|
168
|
+
}
|
|
169
|
+
const commands = context.options?.commands ?? await getCommands();
|
|
170
|
+
const cmd = findCommand(parsed.skillName, commands);
|
|
171
|
+
if (!cmd) {
|
|
172
|
+
throw new Error(`Unknown skill: ${parsed.skillName}`);
|
|
173
|
+
}
|
|
174
|
+
if (cmd.disableModelInvocation) {
|
|
175
|
+
throw new Error(
|
|
176
|
+
`Skill ${parsed.skillName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool due to disable-model-invocation`
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
if (cmd.disableNonInteractive) {
|
|
180
|
+
throw new Error(
|
|
181
|
+
`Skill ${parsed.skillName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool because it is non-interactive`
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
if (cmd.type !== "prompt") {
|
|
185
|
+
throw new Error(
|
|
186
|
+
`Unexpected ${cmd.type} command. Expected 'prompt' command. Use /${parsed.skillName} directly in the main conversation.`
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
const combinedArgs = args || "";
|
|
190
|
+
const prompt = await cmd.getPromptForCommand(combinedArgs);
|
|
191
|
+
const expandedMessages = prompt.map((msg) => {
|
|
192
|
+
const userMessage = createUserMessage(
|
|
193
|
+
typeof msg.content === "string" ? msg.content : msg.content.map((block) => block.type === "text" ? block.text : "").join("\n")
|
|
194
|
+
);
|
|
195
|
+
userMessage.options = {
|
|
196
|
+
...userMessage.options,
|
|
197
|
+
isCustomCommand: true,
|
|
198
|
+
commandName: cmd.userFacingName(),
|
|
199
|
+
commandArgs: combinedArgs
|
|
200
|
+
};
|
|
201
|
+
return userMessage;
|
|
202
|
+
});
|
|
203
|
+
const commandNameForMeta = cmd.userFacingName();
|
|
204
|
+
const progressMessage = cmd.progressMessage || "running";
|
|
205
|
+
const metaMessage = createUserMessage(`<command-name>${commandNameForMeta}</command-name>
|
|
206
|
+
<command-message>${commandNameForMeta} is ${progressMessage}\u2026</command-message>
|
|
207
|
+
<command-args>${combinedArgs}</command-args>`);
|
|
208
|
+
const allowedTools = Array.isArray(cmd.allowedTools) ? cmd.allowedTools : [];
|
|
209
|
+
const model = normalizeCommandModelName(cmd.model);
|
|
210
|
+
const maxThinkingTokens = typeof cmd.maxThinkingTokens === "number" ? cmd.maxThinkingTokens : void 0;
|
|
211
|
+
const output = { success: true, skillName: parsed.skillName };
|
|
212
|
+
yield {
|
|
213
|
+
type: "result",
|
|
214
|
+
data: output,
|
|
215
|
+
resultForAssistant: this.renderResultForAssistant(output),
|
|
216
|
+
newMessages: [metaMessage, ...expandedMessages],
|
|
217
|
+
contextModifier: allowedTools.length > 0 || model || maxThinkingTokens !== void 0 ? {
|
|
218
|
+
modifyContext(ctx) {
|
|
219
|
+
const next = { ...ctx };
|
|
220
|
+
if (allowedTools.length > 0) {
|
|
221
|
+
const prev = Array.isArray(
|
|
222
|
+
next.options?.commandAllowedTools
|
|
223
|
+
) ? next.options.commandAllowedTools : [];
|
|
224
|
+
next.options = {
|
|
225
|
+
...next.options || {},
|
|
226
|
+
commandAllowedTools: [
|
|
227
|
+
.../* @__PURE__ */ new Set([...prev, ...allowedTools])
|
|
228
|
+
]
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
if (model) {
|
|
232
|
+
next.options = { ...next.options || {}, model };
|
|
233
|
+
}
|
|
234
|
+
if (maxThinkingTokens !== void 0) {
|
|
235
|
+
next.options = {
|
|
236
|
+
...next.options || {},
|
|
237
|
+
maxThinkingTokens
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
return next;
|
|
241
|
+
}
|
|
242
|
+
} : void 0
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
function parseSkillName(skill) {
|
|
247
|
+
const trimmed = skill.trim();
|
|
248
|
+
const withoutSlash = trimmed.startsWith("/") ? trimmed.slice(1) : trimmed;
|
|
249
|
+
if (!withoutSlash) return null;
|
|
250
|
+
return { skillName: withoutSlash };
|
|
251
|
+
}
|
|
252
|
+
function findCommand(skillName, commands) {
|
|
253
|
+
return commands.find(
|
|
254
|
+
(c) => c?.name === skillName || c?.userFacingName?.() === skillName || Array.isArray(c?.aliases) && c.aliases.includes(skillName)
|
|
255
|
+
) ?? null;
|
|
256
|
+
}
|
|
257
|
+
export {
|
|
258
|
+
SlashCommandTool
|
|
259
|
+
};
|
|
260
|
+
//# sourceMappingURL=SlashCommandTool.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/tools/SlashCommandTool/SlashCommandTool.tsx"],
|
|
4
|
+
"sourcesContent": ["/**\n * Slash Command Tool\n *\n * Executes custom slash commands (skills) within the main conversation.\n * Compatible with Claude Code CLI Skill tool specification.\n */\n\nimport { z } from 'zod'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { Tool } from '@tool'\nimport * as React from 'react'\nimport type { Message } from '@query'\nimport { createUserMessage } from '@utils/messages'\nimport { getCommands } from '@commands'\nimport {\n loadCustomCommands,\n type CustomCommandWithScope,\n} from '@services/customCommands'\nimport { TOOL_NAME_FOR_PROMPT } from './prompt'\nimport { Box, Text } from 'ink'\n\nconst inputSchema = z.strictObject({\n skill: z\n .string()\n .describe('The skill name. E.g., \"commit\", \"review-pr\", or \"pdf\"'),\n args: z.string().optional().describe('Optional arguments for the skill'),\n})\n\ntype Input = z.infer<typeof inputSchema>\ntype Output = {\n success: boolean\n skillName: string\n}\n\nfunction normalizeCommandModelName(model: unknown): string | undefined {\n if (typeof model !== 'string') return undefined\n const trimmed = model.trim()\n if (!trimmed || trimmed === 'inherit') return undefined\n if (trimmed === 'haiku') return 'quick'\n if (trimmed === 'sonnet') return 'task'\n if (trimmed === 'opus') return 'main'\n return trimmed\n}\n\nfunction getCharBudget(): number {\n const raw = Number(process.env.SLASH_COMMAND_TOOL_CHAR_BUDGET)\n return Number.isFinite(raw) && raw > 0 ? raw : 15000\n}\n\nexport const SlashCommandTool = {\n name: TOOL_NAME_FOR_PROMPT,\n async description(input?: Input) {\n const skill = input?.skill\n return skill\n ? `Execute skill: ${skill}`\n : 'Execute a skill within the main conversation'\n },\n userFacingName() {\n return 'Skill'\n },\n inputSchema,\n isReadOnly() {\n return false\n },\n isConcurrencySafe() {\n return false\n },\n async isEnabled() {\n return true\n },\n needsPermissions() {\n return true\n },\n async prompt() {\n const all = await loadCustomCommands()\n const commands = all.filter(\n cmd =>\n cmd.type === 'prompt' &&\n (cmd as any).isSkill !== true &&\n (cmd as any).disableModelInvocation !== true,\n )\n\n const limited: CustomCommandWithScope[] = []\n let used = 0\n for (const cmd of commands) {\n const name = `/${cmd.name}`\n const args = (cmd as any).argumentHint\n ? ` ${(cmd as any).argumentHint}`\n : ''\n const whenToUse = (cmd as any).whenToUse\n ? `- ${(cmd as any).whenToUse}`\n : ''\n const line = `- ${name}${args}: ${cmd.description} ${whenToUse}`.trim()\n used += line.length + 1\n if (used > getCharBudget()) break\n limited.push(cmd)\n }\n\n const availableLines =\n limited.length > 0\n ? limited\n .map(cmd => {\n const name = `/${cmd.name}`\n const args = (cmd as any).argumentHint\n ? ` ${(cmd as any).argumentHint}`\n : ''\n const whenToUse = (cmd as any).whenToUse\n ? `- ${(cmd as any).whenToUse}`\n : ''\n return `- ${name}${args}: ${cmd.description} ${whenToUse}`.trim()\n })\n .join('\\n')\n : ''\n\n const truncatedNotice =\n commands.length > limited.length\n ? `\\n(Showing ${limited.length} of ${commands.length} commands due to token limits)`\n : ''\n\n return `Execute a skill within the main conversation\n\n<skills_instructions>\nWhen users ask you to perform tasks, check if any of the available skills below can help complete the task more effectively. Skills provide specialized capabilities and domain knowledge.\n\nWhen users ask you to run a \"slash command\" or reference \"/<something>\" (e.g., \"/commit\", \"/review-pr\"), they are referring to a skill. Use this tool to invoke the corresponding skill.\n\n<example>\nUser: \"run /commit\"\nAssistant: [Calls Skill tool with skill: \"commit\"]\n</example>\n\nHow to invoke:\n- Use this tool with the skill name and optional arguments\n- Examples:\n - \\`skill: \"pdf\"\\` - invoke the pdf skill\n - \\`skill: \"commit\", args: \"-m 'Fix bug'\"\\` - invoke with arguments\n - \\`skill: \"review-pr\", args: \"123\"\\` - invoke with arguments\n - \\`skill: \"ms-office-suite:pdf\"\\` - invoke using fully qualified name\n\nImportant:\n- When a skill is relevant, you must invoke this tool IMMEDIATELY as your first action\n- NEVER just announce or mention a skill in your text response without actually calling this tool\n- This is a BLOCKING REQUIREMENT: invoke the relevant Skill tool BEFORE generating any other response about the task\n- Only use skills listed in <available_skills> below\n- Do not invoke a skill that is already running\n- Do not use this tool for built-in CLI commands (like /help, /clear, etc.)\n</skills_instructions>\n\n${\n availableLines\n ? `<available_skills>\n${availableLines}${truncatedNotice}\n</available_skills>\n`\n : ''\n}`\n },\n renderToolUseMessage({ skill, args }: Input, _options: { verbose: boolean }) {\n return args ? `${skill} ${args}` : skill\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: Output) {\n if (!output) {\n return (\n <Box paddingLeft={2}>\n <Text>Skill executed</Text>\n </Box>\n )\n }\n\n return (\n <Box paddingLeft={2}>\n <Text color=\"green\">\u2713 Launching skill: /{output.skillName}</Text>\n </Box>\n )\n },\n renderResultForAssistant(output: Output) {\n return `Launching skill: /${output.skillName}`\n },\n async validateInput({ skill }: Input, context) {\n const parsed = parseSkillName(skill)\n if (!parsed) {\n return {\n result: false,\n message: `Invalid skill name: ${skill}`,\n errorCode: 1,\n }\n }\n\n const commands = context?.options?.commands ?? (await getCommands())\n const cmd = findCommand(parsed.skillName, commands)\n\n if (!cmd) {\n return {\n result: false,\n message: `Unknown skill: ${parsed.skillName}`,\n errorCode: 2,\n }\n }\n\n if ((cmd as any).disableModelInvocation) {\n return {\n result: false,\n message: `Skill ${parsed.skillName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool due to disable-model-invocation`,\n errorCode: 4,\n }\n }\n\n if ((cmd as any).disableNonInteractive) {\n return {\n result: false,\n message: `Skill ${parsed.skillName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool because it is non-interactive`,\n errorCode: 6,\n }\n }\n\n if (cmd.type !== 'prompt') {\n return {\n result: false,\n message: `Skill ${parsed.skillName} is not a prompt-based command`,\n errorCode: 5,\n }\n }\n\n return { result: true }\n },\n async *call({ skill, args }: Input, context) {\n const parsed = parseSkillName(skill)\n if (!parsed) {\n throw new Error(`Invalid skill name: ${skill}`)\n }\n\n const commands = context.options?.commands ?? (await getCommands())\n const cmd = findCommand(parsed.skillName, commands)\n\n if (!cmd) {\n throw new Error(`Unknown skill: ${parsed.skillName}`)\n }\n\n if ((cmd as any).disableModelInvocation) {\n throw new Error(\n `Skill ${parsed.skillName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool due to disable-model-invocation`,\n )\n }\n\n if ((cmd as any).disableNonInteractive) {\n throw new Error(\n `Skill ${parsed.skillName} cannot be used with ${TOOL_NAME_FOR_PROMPT} tool because it is non-interactive`,\n )\n }\n\n if (cmd.type !== 'prompt') {\n throw new Error(\n `Unexpected ${cmd.type} command. Expected 'prompt' command. Use /${parsed.skillName} directly in the main conversation.`,\n )\n }\n\n const combinedArgs = args || ''\n const prompt = await cmd.getPromptForCommand(combinedArgs)\n const expandedMessages: Message[] = prompt.map(msg => {\n const userMessage = createUserMessage(\n typeof msg.content === 'string'\n ? msg.content\n : (msg.content as any[])\n .map(block => (block.type === 'text' ? block.text : ''))\n .join('\\n'),\n )\n userMessage.options = {\n ...userMessage.options,\n isCustomCommand: true,\n commandName: cmd.userFacingName(),\n commandArgs: combinedArgs,\n }\n return userMessage\n })\n\n const commandNameForMeta = cmd.userFacingName()\n const progressMessage = (cmd as any).progressMessage || 'running'\n const metaMessage =\n createUserMessage(`<command-name>${commandNameForMeta}</command-name>\n<command-message>${commandNameForMeta} is ${progressMessage}\u2026</command-message>\n<command-args>${combinedArgs}</command-args>`)\n\n const allowedTools: string[] = Array.isArray((cmd as any).allowedTools)\n ? (cmd as any).allowedTools\n : []\n const model = normalizeCommandModelName((cmd as any).model)\n const maxThinkingTokens: number | undefined =\n typeof (cmd as any).maxThinkingTokens === 'number'\n ? (cmd as any).maxThinkingTokens\n : undefined\n\n const output: Output = { success: true, skillName: parsed.skillName }\n\n yield {\n type: 'result' as const,\n data: output,\n resultForAssistant: this.renderResultForAssistant(output),\n newMessages: [metaMessage, ...expandedMessages],\n contextModifier:\n allowedTools.length > 0 || model || maxThinkingTokens !== undefined\n ? {\n modifyContext(ctx: any) {\n const next = { ...ctx }\n\n if (allowedTools.length > 0) {\n const prev = Array.isArray(\n (next.options as any)?.commandAllowedTools,\n )\n ? ((next.options as any).commandAllowedTools as string[])\n : []\n next.options = {\n ...(next.options || {}),\n commandAllowedTools: [\n ...new Set([...prev, ...allowedTools]),\n ],\n }\n }\n\n if (model) {\n next.options = { ...(next.options || {}), model }\n }\n\n if (maxThinkingTokens !== undefined) {\n next.options = {\n ...(next.options || {}),\n maxThinkingTokens,\n }\n }\n\n return next\n },\n }\n : undefined,\n }\n },\n} satisfies Tool<typeof inputSchema, Output>\n\nfunction parseSkillName(skill: string): { skillName: string } | null {\n const trimmed = skill.trim()\n // Remove leading slash if present\n const withoutSlash = trimmed.startsWith('/') ? trimmed.slice(1) : trimmed\n if (!withoutSlash) return null\n return { skillName: withoutSlash }\n}\n\nfunction findCommand(skillName: string, commands: any[]): any | null {\n return (\n commands.find(\n (c: any) =>\n c?.name === skillName ||\n c?.userFacingName?.() === skillName ||\n (Array.isArray(c?.aliases) && c.aliases.includes(skillName)),\n ) ?? null\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
const TOOL_NAME_FOR_PROMPT = "Skill";
|
|
2
|
+
const DESCRIPTION = `Execute a skill within the main conversation
|
|
3
|
+
|
|
4
|
+
<skills_instructions>
|
|
5
|
+
When users ask you to perform tasks, check if any of the available skills below can help complete the task more effectively. Skills provide specialized capabilities and domain knowledge.
|
|
6
|
+
|
|
7
|
+
When users ask you to run a "slash command" or reference "/<something>" (e.g., "/commit", "/review-pr"), they are referring to a skill. Use this tool to invoke the corresponding skill.
|
|
8
|
+
|
|
9
|
+
<example>
|
|
10
|
+
User: "run /commit"
|
|
11
|
+
Assistant: [Calls Skill tool with skill: "commit"]
|
|
12
|
+
</example>
|
|
13
|
+
|
|
14
|
+
How to invoke:
|
|
15
|
+
- Use this tool with the skill name and optional arguments
|
|
16
|
+
- Examples:
|
|
17
|
+
- \`skill: "pdf"\` - invoke the pdf skill
|
|
18
|
+
- \`skill: "commit", args: "-m 'Fix bug'"\` - invoke with arguments
|
|
19
|
+
- \`skill: "review-pr", args: "123"\` - invoke with arguments
|
|
20
|
+
- \`skill: "ms-office-suite:pdf"\` - invoke using fully qualified name
|
|
21
|
+
|
|
22
|
+
Important:
|
|
23
|
+
- When a skill is relevant, you must invoke this tool IMMEDIATELY as your first action
|
|
24
|
+
- NEVER just announce or mention a skill in your text response without actually calling this tool
|
|
25
|
+
- This is a BLOCKING REQUIREMENT: invoke the relevant Skill tool BEFORE generating any other response about the task
|
|
26
|
+
- Only use skills listed in <available_skills> below
|
|
27
|
+
- Do not invoke a skill that is already running
|
|
28
|
+
- Do not use this tool for built-in CLI commands (like /help, /clear, etc.)
|
|
29
|
+
</skills_instructions>
|
|
30
|
+
`;
|
|
31
|
+
export {
|
|
32
|
+
DESCRIPTION,
|
|
33
|
+
TOOL_NAME_FOR_PROMPT
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/tools/SlashCommandTool/prompt.ts"],
|
|
4
|
+
"sourcesContent": ["export const TOOL_NAME_FOR_PROMPT = 'Skill'\nexport const DESCRIPTION = `Execute a skill within the main conversation\n\n<skills_instructions>\nWhen users ask you to perform tasks, check if any of the available skills below can help complete the task more effectively. Skills provide specialized capabilities and domain knowledge.\n\nWhen users ask you to run a \"slash command\" or reference \"/<something>\" (e.g., \"/commit\", \"/review-pr\"), they are referring to a skill. Use this tool to invoke the corresponding skill.\n\n<example>\nUser: \"run /commit\"\nAssistant: [Calls Skill tool with skill: \"commit\"]\n</example>\n\nHow to invoke:\n- Use this tool with the skill name and optional arguments\n- Examples:\n - \\`skill: \"pdf\"\\` - invoke the pdf skill\n - \\`skill: \"commit\", args: \"-m 'Fix bug'\"\\` - invoke with arguments\n - \\`skill: \"review-pr\", args: \"123\"\\` - invoke with arguments\n - \\`skill: \"ms-office-suite:pdf\"\\` - invoke using fully qualified name\n\nImportant:\n- When a skill is relevant, you must invoke this tool IMMEDIATELY as your first action\n- NEVER just announce or mention a skill in your text response without actually calling this tool\n- This is a BLOCKING REQUIREMENT: invoke the relevant Skill tool BEFORE generating any other response about the task\n- Only use skills listed in <available_skills> below\n- Do not invoke a skill that is already running\n- Do not use this tool for built-in CLI commands (like /help, /clear, etc.)\n</skills_instructions>\n`\n"],
|
|
5
|
+
"mappings": "AAAO,MAAM,uBAAuB;AAC7B,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|