@within-7/minto 0.2.0 → 0.3.3
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/commands/agents/AgentsCommand.js +22 -24
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/context.js +2 -1
- package/dist/commands/context.js.map +2 -2
- package/dist/commands/export.js +2 -1
- package/dist/commands/export.js.map +2 -2
- package/dist/commands/mcp-interactive.js +7 -6
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/model.js +3 -2
- package/dist/commands/model.js.map +2 -2
- package/dist/commands/permissions.js +4 -3
- package/dist/commands/permissions.js.map +2 -2
- 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/sandbox.js +4 -3
- package/dist/commands/sandbox.js.map +2 -2
- package/dist/commands/setup.js +2 -1
- package/dist/commands/setup.js.map +2 -2
- package/dist/commands/status.js +2 -1
- package/dist/commands/status.js.map +2 -2
- package/dist/commands/undo.js +245 -0
- package/dist/commands/undo.js.map +7 -0
- package/dist/commands.js +2 -0
- package/dist/commands.js.map +2 -2
- package/dist/components/AgentThinkingBlock.js +1 -1
- 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/CollapsibleHint.js +2 -1
- package/dist/components/CollapsibleHint.js.map +2 -2
- 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/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 +8 -11
- package/dist/components/HotkeyHelpPanel.js.map +2 -2
- package/dist/components/InvalidConfigDialog.js +2 -1
- package/dist/components/InvalidConfigDialog.js.map +2 -2
- package/dist/components/Logo.js +23 -67
- 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/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 +4 -3
- package/dist/components/ModelConfig.js.map +2 -2
- package/dist/components/ModelListManager.js +4 -3
- package/dist/components/ModelListManager.js.map +2 -2
- package/dist/components/ModelSelector/ModelSelector.js +26 -13
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/Onboarding.js +3 -2
- 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/PromptInput.js +88 -75
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/SensitiveFileWarning.js +31 -0
- package/dist/components/SensitiveFileWarning.js.map +7 -0
- package/dist/components/Spinner.js +71 -22
- package/dist/components/Spinner.js.map +2 -2
- package/dist/components/StructuredDiff.js +6 -8
- package/dist/components/StructuredDiff.js.map +2 -2
- package/dist/components/SubagentBlock.js +4 -2
- package/dist/components/SubagentBlock.js.map +2 -2
- package/dist/components/SubagentProgress.js +17 -6
- package/dist/components/SubagentProgress.js.map +2 -2
- package/dist/components/TaskCard.js +14 -11
- 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/TodoPanel.js +44 -26
- package/dist/components/TodoPanel.js.map +2 -2
- package/dist/components/ToolUseLoader.js +2 -2
- package/dist/components/ToolUseLoader.js.map +2 -2
- package/dist/components/TreeConnector.js +4 -3
- package/dist/components/TreeConnector.js.map +2 -2
- package/dist/components/TrustDialog.js +2 -1
- package/dist/components/TrustDialog.js.map +2 -2
- 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 +17 -9
- package/dist/components/messages/AssistantTextMessage.js.map +2 -2
- package/dist/components/messages/AssistantToolUseMessage.js +8 -4
- package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
- package/dist/components/messages/GroupRenderer.js +2 -1
- package/dist/components/messages/GroupRenderer.js.map +2 -2
- package/dist/components/messages/NestedTasksPreview.js +13 -1
- package/dist/components/messages/NestedTasksPreview.js.map +2 -2
- package/dist/components/messages/ParallelTasksGroupView.js +4 -3
- package/dist/components/messages/ParallelTasksGroupView.js.map +2 -2
- package/dist/components/messages/TaskInModuleView.js +35 -15
- package/dist/components/messages/TaskInModuleView.js.map +2 -2
- package/dist/components/messages/TaskOutputContent.js +9 -6
- package/dist/components/messages/TaskOutputContent.js.map +2 -2
- package/dist/components/messages/UserPromptMessage.js +2 -2
- package/dist/components/messages/UserPromptMessage.js.map +2 -2
- package/dist/constants/colors.js +90 -72
- package/dist/constants/colors.js.map +2 -2
- package/dist/constants/prompts.js +22 -1
- package/dist/constants/prompts.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/costTracker.js +9 -18
- package/dist/core/costTracker.js.map +2 -2
- package/dist/core/gitAutoCommit.js +287 -0
- package/dist/core/gitAutoCommit.js.map +7 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +2 -2
- package/dist/core/operationTracker.js +212 -0
- package/dist/core/operationTracker.js.map +7 -0
- package/dist/core/permissions/rules/allowedToolsRule.js +1 -1
- package/dist/core/permissions/rules/allowedToolsRule.js.map +2 -2
- package/dist/core/permissions/rules/autoEscalationRule.js +5 -0
- package/dist/core/permissions/rules/autoEscalationRule.js.map +2 -2
- package/dist/core/permissions/rules/projectBoundaryRule.js +5 -0
- package/dist/core/permissions/rules/projectBoundaryRule.js.map +2 -2
- package/dist/core/permissions/rules/sensitivePathsRule.js +5 -0
- package/dist/core/permissions/rules/sensitivePathsRule.js.map +2 -2
- 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/entrypoints/cli.js +122 -88
- package/dist/entrypoints/cli.js.map +2 -2
- package/dist/hooks/useAgentTokenStats.js +72 -0
- package/dist/hooks/useAgentTokenStats.js.map +7 -0
- package/dist/hooks/useAgentTranscripts.js +30 -6
- package/dist/hooks/useAgentTranscripts.js.map +2 -2
- package/dist/hooks/useLogMessages.js +12 -1
- package/dist/hooks/useLogMessages.js.map +2 -2
- package/dist/i18n/locales/en.js +6 -5
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.js +6 -5
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/i18n/types.js.map +1 -1
- package/dist/permissions.js +147 -1
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +78 -4
- package/dist/query.js.map +3 -3
- package/dist/screens/REPL.js +23 -3
- package/dist/screens/REPL.js.map +2 -2
- package/dist/screens/ResumeConversation.js +2 -0
- package/dist/screens/ResumeConversation.js.map +2 -2
- package/dist/services/claude.js +54 -3
- package/dist/services/claude.js.map +2 -2
- package/dist/services/intelligentCompactor.js +1 -1
- package/dist/services/intelligentCompactor.js.map +2 -2
- package/dist/services/mcpClient.js +81 -25
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/sandbox/filesystemBoundary.js +58 -17
- package/dist/services/sandbox/filesystemBoundary.js.map +2 -2
- package/dist/services/taskStore.js +205 -0
- package/dist/services/taskStore.js.map +7 -0
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +3 -2
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +42 -4
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
- package/dist/tools/BashTool/BashTool.js +43 -7
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/BashTool/prompt.js +184 -34
- package/dist/tools/BashTool/prompt.js.map +2 -2
- package/dist/tools/FileEditTool/FileEditTool.js +24 -9
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileEditTool/prompt.js +10 -4
- package/dist/tools/FileEditTool/prompt.js.map +2 -2
- package/dist/tools/FileEditTool/utils.js +10 -4
- package/dist/tools/FileEditTool/utils.js.map +2 -2
- package/dist/tools/FileReadTool/FileReadTool.js +1 -1
- package/dist/tools/FileReadTool/FileReadTool.js.map +1 -1
- package/dist/tools/FileReadTool/prompt.js +16 -1
- package/dist/tools/FileReadTool/prompt.js.map +2 -2
- package/dist/tools/FileWriteTool/FileWriteTool.js +1 -1
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +1 -1
- package/dist/tools/FileWriteTool/prompt.js +12 -3
- package/dist/tools/FileWriteTool/prompt.js.map +2 -2
- package/dist/tools/GlobTool/prompt.js +12 -1
- package/dist/tools/GlobTool/prompt.js.map +2 -2
- package/dist/tools/GrepTool/GrepTool.js +333 -65
- package/dist/tools/GrepTool/GrepTool.js.map +2 -2
- package/dist/tools/GrepTool/prompt.js +15 -8
- package/dist/tools/GrepTool/prompt.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 +59 -46
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
- package/dist/tools/NotebookEditTool/prompt.js +1 -1
- package/dist/tools/NotebookEditTool/prompt.js.map +1 -1
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +3 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +3 -2
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
- package/dist/tools/PlanModeTool/prompt.js +1 -1
- package/dist/tools/PlanModeTool/prompt.js.map +1 -1
- package/dist/tools/SkillTool/SkillTool.js +4 -3
- 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/TaskCreateTool/TaskCreateTool.js +102 -0
- package/dist/tools/TaskCreateTool/TaskCreateTool.js.map +7 -0
- package/dist/tools/TaskCreateTool/prompt.js +47 -0
- package/dist/tools/TaskCreateTool/prompt.js.map +7 -0
- package/dist/tools/TaskGetTool/TaskGetTool.js +115 -0
- package/dist/tools/TaskGetTool/TaskGetTool.js.map +7 -0
- package/dist/tools/TaskGetTool/prompt.js +28 -0
- package/dist/tools/TaskGetTool/prompt.js.map +7 -0
- package/dist/tools/TaskListTool/TaskListTool.js +102 -0
- package/dist/tools/TaskListTool/TaskListTool.js.map +7 -0
- package/dist/tools/TaskListTool/prompt.js +27 -0
- package/dist/tools/TaskListTool/prompt.js.map +7 -0
- package/dist/tools/TaskOutputTool/TaskOutputTool.js +3 -2
- package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +2 -2
- package/dist/tools/TaskStopTool/TaskStopTool.js +150 -0
- package/dist/tools/TaskStopTool/TaskStopTool.js.map +7 -0
- package/dist/tools/TaskStopTool/prompt.js +15 -0
- package/dist/tools/TaskStopTool/prompt.js.map +7 -0
- package/dist/tools/TaskTool/TaskTool.js +49 -1
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/tools/TaskUpdateTool/TaskUpdateTool.js +134 -0
- package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +7 -0
- package/dist/tools/TaskUpdateTool/prompt.js +81 -0
- package/dist/tools/TaskUpdateTool/prompt.js.map +7 -0
- package/dist/tools/URLFetcherTool/prompt.js +1 -1
- package/dist/tools/URLFetcherTool/prompt.js.map +1 -1
- package/dist/tools.js +12 -0
- package/dist/tools.js.map +2 -2
- package/dist/utils/CircuitBreaker.js +242 -0
- package/dist/utils/CircuitBreaker.js.map +7 -0
- package/dist/utils/ask.js +2 -0
- package/dist/utils/ask.js.map +2 -2
- package/dist/utils/config.js +47 -5
- package/dist/utils/config.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/markdown.js +13 -1
- package/dist/utils/markdown.js.map +2 -2
- package/dist/utils/model.js +15 -2
- package/dist/utils/model.js.map +2 -2
- package/dist/utils/permissions/filesystem.js +5 -1
- package/dist/utils/permissions/filesystem.js.map +2 -2
- package/dist/utils/ripgrep.js +53 -1
- 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/sensitiveFiles.js +125 -0
- package/dist/utils/sensitiveFiles.js.map +7 -0
- package/dist/utils/taskDisplayUtils.js +9 -9
- package/dist/utils/taskDisplayUtils.js.map +2 -2
- package/dist/utils/terminal.js +12 -0
- package/dist/utils/terminal.js.map +2 -2
- package/dist/utils/theme.js +6 -6
- package/dist/utils/theme.js.map +1 -1
- package/dist/utils/toolRiskClassification.js +207 -0
- package/dist/utils/toolRiskClassification.js.map +7 -0
- package/dist/utils/tooling/safeRender.js +17 -17
- package/dist/utils/tooling/safeRender.js.map +2 -2
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +22 -28
- package/dist/hooks/useCancelRequest.js +0 -31
- package/dist/hooks/useCancelRequest.js.map +0 -7
|
@@ -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 || {\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 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,102 @@
|
|
|
1
|
+
import { Box, Text } from "ink";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { FallbackToolUseRejectedMessage } from "../../components/FallbackToolUseRejectedMessage.js";
|
|
5
|
+
import { createTask } from "../../services/taskStore.js";
|
|
6
|
+
import { DESCRIPTION, PROMPT } from "./prompt.js";
|
|
7
|
+
import { getTheme } from "../../utils/theme.js";
|
|
8
|
+
const inputSchema = z.strictObject({
|
|
9
|
+
subject: z.string().describe("A brief title for the task"),
|
|
10
|
+
description: z.string().describe("A detailed description of what needs to be done"),
|
|
11
|
+
activeForm: z.string().optional().describe(
|
|
12
|
+
'Present continuous form shown in spinner when in_progress (e.g., "Running tests")'
|
|
13
|
+
),
|
|
14
|
+
metadata: z.record(z.unknown()).optional().describe("Arbitrary metadata to attach to the task")
|
|
15
|
+
});
|
|
16
|
+
const TaskCreateTool = {
|
|
17
|
+
name: "TaskCreate",
|
|
18
|
+
async description() {
|
|
19
|
+
return DESCRIPTION;
|
|
20
|
+
},
|
|
21
|
+
async prompt() {
|
|
22
|
+
return PROMPT;
|
|
23
|
+
},
|
|
24
|
+
inputSchema,
|
|
25
|
+
userFacingName() {
|
|
26
|
+
return "Create Task";
|
|
27
|
+
},
|
|
28
|
+
async isEnabled() {
|
|
29
|
+
return true;
|
|
30
|
+
},
|
|
31
|
+
isReadOnly() {
|
|
32
|
+
return false;
|
|
33
|
+
},
|
|
34
|
+
isConcurrencySafe() {
|
|
35
|
+
return false;
|
|
36
|
+
},
|
|
37
|
+
needsPermissions() {
|
|
38
|
+
return false;
|
|
39
|
+
},
|
|
40
|
+
renderToolUseMessage(input) {
|
|
41
|
+
const subject = input.subject || "";
|
|
42
|
+
const truncated = subject.length > 50 ? subject.slice(0, 50) + "..." : subject;
|
|
43
|
+
return `subject: "${truncated}"`;
|
|
44
|
+
},
|
|
45
|
+
renderToolUseRejectedMessage() {
|
|
46
|
+
return /* @__PURE__ */ React.createElement(FallbackToolUseRejectedMessage, null);
|
|
47
|
+
},
|
|
48
|
+
renderToolResultMessage(output) {
|
|
49
|
+
if (!output || !output.taskId) {
|
|
50
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, null, "Task created"));
|
|
51
|
+
}
|
|
52
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, { color: getTheme().success }, "Task #", output.taskId, " created: ", output.subject));
|
|
53
|
+
},
|
|
54
|
+
renderResultForAssistant(result) {
|
|
55
|
+
return `Task #${result.taskId} created successfully: ${result.subject}`;
|
|
56
|
+
},
|
|
57
|
+
async validateInput({ subject, description }) {
|
|
58
|
+
if (!subject?.trim()) {
|
|
59
|
+
return {
|
|
60
|
+
result: false,
|
|
61
|
+
message: "Task subject cannot be empty"
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
if (!description?.trim()) {
|
|
65
|
+
return {
|
|
66
|
+
result: false,
|
|
67
|
+
message: "Task description cannot be empty"
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return { result: true };
|
|
71
|
+
},
|
|
72
|
+
async *call(input) {
|
|
73
|
+
try {
|
|
74
|
+
const task = createTask({
|
|
75
|
+
subject: input.subject,
|
|
76
|
+
description: input.description,
|
|
77
|
+
activeForm: input.activeForm,
|
|
78
|
+
metadata: input.metadata
|
|
79
|
+
});
|
|
80
|
+
const result = {
|
|
81
|
+
taskId: task.id,
|
|
82
|
+
subject: task.subject
|
|
83
|
+
};
|
|
84
|
+
yield {
|
|
85
|
+
type: "result",
|
|
86
|
+
data: result,
|
|
87
|
+
resultForAssistant: this.renderResultForAssistant(result)
|
|
88
|
+
};
|
|
89
|
+
} catch (error) {
|
|
90
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
|
|
91
|
+
yield {
|
|
92
|
+
type: "result",
|
|
93
|
+
data: { error: errorMessage },
|
|
94
|
+
resultForAssistant: `Error creating task: ${errorMessage}`
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
export {
|
|
100
|
+
TaskCreateTool
|
|
101
|
+
};
|
|
102
|
+
//# sourceMappingURL=TaskCreateTool.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/tools/TaskCreateTool/TaskCreateTool.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 { createTask } from '@services/taskStore'\nimport { DESCRIPTION, PROMPT } from './prompt'\nimport { getTheme } from '@utils/theme'\n\nconst inputSchema = z.strictObject({\n subject: z.string().describe('A brief title for the task'),\n description: z\n .string()\n .describe('A detailed description of what needs to be done'),\n activeForm: z\n .string()\n .optional()\n .describe(\n 'Present continuous form shown in spinner when in_progress (e.g., \"Running tests\")',\n ),\n metadata: z\n .record(z.unknown())\n .optional()\n .describe('Arbitrary metadata to attach to the task'),\n})\n\nexport const TaskCreateTool = {\n name: 'TaskCreate',\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'Create Task'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return false\n },\n isConcurrencySafe() {\n return false\n },\n needsPermissions() {\n return false\n },\n renderToolUseMessage(input: z.infer<typeof inputSchema>) {\n const subject = input.subject || ''\n const truncated =\n subject.length > 50 ? subject.slice(0, 50) + '...' : subject\n return `subject: \"${truncated}\"`\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: { taskId: string; subject: string }) {\n if (!output || !output.taskId) {\n return (\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text>Task created</Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text color={getTheme().success}>\n Task #{output.taskId} created: {output.subject}\n </Text>\n </Box>\n )\n },\n renderResultForAssistant(result: { taskId: string; subject: string }) {\n return `Task #${result.taskId} created successfully: ${result.subject}`\n },\n async validateInput({ subject, description }: z.infer<typeof inputSchema>) {\n if (!subject?.trim()) {\n return {\n result: false,\n message: 'Task subject cannot be empty',\n }\n }\n if (!description?.trim()) {\n return {\n result: false,\n message: 'Task description cannot be empty',\n }\n }\n return { result: true }\n },\n async *call(input: z.infer<typeof inputSchema>) {\n try {\n const task = createTask({\n subject: input.subject,\n description: input.description,\n activeForm: input.activeForm,\n metadata: input.metadata,\n })\n\n const result = {\n taskId: task.id,\n subject: task.subject,\n }\n\n yield {\n type: 'result',\n data: result,\n resultForAssistant: this.renderResultForAssistant(result),\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error occurred'\n yield {\n type: 'result',\n data: { error: errorMessage },\n resultForAssistant: `Error creating task: ${errorMessage}`,\n }\n }\n },\n} satisfies Tool<\n typeof inputSchema,\n { taskId: string; subject: string } | { error: string }\n>\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,KAAK,YAAY;AAC1B,YAAY,WAAW;AACvB,SAAS,SAAS;AAClB,SAAS,sCAAsC;AAE/C,SAAS,kBAAkB;AAC3B,SAAS,aAAa,cAAc;AACpC,SAAS,gBAAgB;AAEzB,MAAM,cAAc,EAAE,aAAa;AAAA,EACjC,SAAS,EAAE,OAAO,EAAE,SAAS,4BAA4B;AAAA,EACzD,aAAa,EACV,OAAO,EACP,SAAS,iDAAiD;AAAA,EAC7D,YAAY,EACT,OAAO,EACP,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EACF,UAAU,EACP,OAAO,EAAE,QAAQ,CAAC,EAClB,SAAS,EACT,SAAS,0CAA0C;AACxD,CAAC;AAEM,MAAM,iBAAiB;AAAA,EAC5B,MAAM;AAAA,EACN,MAAM,cAAc;AAClB,WAAO;AAAA,EACT;AAAA,EACA,MAAM,SAAS;AACb,WAAO;AAAA,EACT;AAAA,EACA;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,YAAY;AAChB,WAAO;AAAA,EACT;AAAA,EACA,aAAa;AACX,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB;AAClB,WAAO;AAAA,EACT;AAAA,EACA,mBAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EACA,qBAAqB,OAAoC;AACvD,UAAM,UAAU,MAAM,WAAW;AACjC,UAAM,YACJ,QAAQ,SAAS,KAAK,QAAQ,MAAM,GAAG,EAAE,IAAI,QAAQ;AACvD,WAAO,aAAa,SAAS;AAAA,EAC/B;AAAA,EACA,+BAA+B;AAC7B,WAAO,oCAAC,oCAA+B;AAAA,EACzC;AAAA,EACA,wBAAwB,QAA6C;AACnE,QAAI,CAAC,UAAU,CAAC,OAAO,QAAQ;AAC7B,aACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,YAAK,qBAAoB,GAC1B,oCAAC,YAAK,cAAY,CACpB;AAAA,IAEJ;AAEA,WACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,YAAK,qBAAoB,GAC1B,oCAAC,QAAK,OAAO,SAAS,EAAE,WAAS,UACxB,OAAO,QAAO,cAAW,OAAO,OACzC,CACF;AAAA,EAEJ;AAAA,EACA,yBAAyB,QAA6C;AACpE,WAAO,SAAS,OAAO,MAAM,0BAA0B,OAAO,OAAO;AAAA,EACvE;AAAA,EACA,MAAM,cAAc,EAAE,SAAS,YAAY,GAAgC;AACzE,QAAI,CAAC,SAAS,KAAK,GAAG;AACpB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AACA,QAAI,CAAC,aAAa,KAAK,GAAG;AACxB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AACA,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AAAA,EACA,OAAO,KAAK,OAAoC;AAC9C,QAAI;AACF,YAAM,OAAO,WAAW;AAAA,QACtB,SAAS,MAAM;AAAA,QACf,aAAa,MAAM;AAAA,QACnB,YAAY,MAAM;AAAA,QAClB,UAAU,MAAM;AAAA,MAClB,CAAC;AAED,YAAM,SAAS;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,MAChB;AAEA,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,oBAAoB,KAAK,yBAAyB,MAAM;AAAA,MAC1D;AAAA,IACF,SAAS,OAAO;AACd,YAAM,eACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM,EAAE,OAAO,aAAa;AAAA,QAC5B,oBAAoB,wBAAwB,YAAY;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
const PROMPT = `Use this tool to create a structured task list for your current coding session. This helps you track progress, organize complex tasks, and demonstrate thoroughness to the user.
|
|
2
|
+
It also helps the user understand the progress of the task and overall progress of their requests.
|
|
3
|
+
|
|
4
|
+
## When to Use This Tool
|
|
5
|
+
|
|
6
|
+
Use this tool proactively in these scenarios:
|
|
7
|
+
|
|
8
|
+
- Complex multi-step tasks - When a task requires 3 or more distinct steps or actions
|
|
9
|
+
- Non-trivial and complex tasks - Tasks that require careful planning or multiple operations
|
|
10
|
+
- Plan mode - When using plan mode, create a task list to track the work
|
|
11
|
+
- User explicitly requests todo list - When the user directly asks you to use the todo list
|
|
12
|
+
- User provides multiple tasks - When users provide a list of things to be done (numbered or comma-separated)
|
|
13
|
+
- After receiving new instructions - Immediately capture user requirements as tasks
|
|
14
|
+
- When you start working on a task - Mark it as in_progress BEFORE beginning work
|
|
15
|
+
- After completing a task - Mark it as completed and add any new follow-up tasks discovered during implementation
|
|
16
|
+
|
|
17
|
+
## When NOT to Use This Tool
|
|
18
|
+
|
|
19
|
+
Skip using this tool when:
|
|
20
|
+
- There is only a single, straightforward task
|
|
21
|
+
- The task is trivial and tracking it provides no organizational benefit
|
|
22
|
+
- The task can be completed in less than 3 trivial steps
|
|
23
|
+
- The task is purely conversational or informational
|
|
24
|
+
|
|
25
|
+
NOTE that you should not use this tool if there is only one trivial task to do. In this case you are better off just doing the task directly.
|
|
26
|
+
|
|
27
|
+
## Task Fields
|
|
28
|
+
|
|
29
|
+
- **subject**: A brief, actionable title in imperative form (e.g., "Fix authentication bug in login flow")
|
|
30
|
+
- **description**: Detailed description of what needs to be done, including context and acceptance criteria
|
|
31
|
+
- **activeForm**: Present continuous form shown in spinner when task is in_progress (e.g., "Fixing authentication bug"). This is displayed to the user while you work on the task.
|
|
32
|
+
|
|
33
|
+
**IMPORTANT**: Always provide activeForm when creating tasks. The subject should be imperative ("Run tests") while activeForm should be present continuous ("Running tests"). All tasks are created with status \`pending\`.
|
|
34
|
+
|
|
35
|
+
## Tips
|
|
36
|
+
|
|
37
|
+
- Create tasks with clear, specific subjects that describe the outcome
|
|
38
|
+
- Include enough detail in the description for another agent to understand and complete the task
|
|
39
|
+
- After creating tasks, use TaskUpdate to set up dependencies (blocks/blockedBy) if needed
|
|
40
|
+
- Check TaskList first to avoid creating duplicate tasks
|
|
41
|
+
`;
|
|
42
|
+
const DESCRIPTION = "Create a new task to track progress on complex work";
|
|
43
|
+
export {
|
|
44
|
+
DESCRIPTION,
|
|
45
|
+
PROMPT
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/tools/TaskCreateTool/prompt.ts"],
|
|
4
|
+
"sourcesContent": ["export const PROMPT = `Use this tool to create a structured task list for your current coding session. This helps you track progress, organize complex tasks, and demonstrate thoroughness to the user.\nIt also helps the user understand the progress of the task and overall progress of their requests.\n\n## When to Use This Tool\n\nUse this tool proactively in these scenarios:\n\n- Complex multi-step tasks - When a task requires 3 or more distinct steps or actions\n- Non-trivial and complex tasks - Tasks that require careful planning or multiple operations\n- Plan mode - When using plan mode, create a task list to track the work\n- User explicitly requests todo list - When the user directly asks you to use the todo list\n- User provides multiple tasks - When users provide a list of things to be done (numbered or comma-separated)\n- After receiving new instructions - Immediately capture user requirements as tasks\n- When you start working on a task - Mark it as in_progress BEFORE beginning work\n- After completing a task - Mark it as completed and add any new follow-up tasks discovered during implementation\n\n## When NOT to Use This Tool\n\nSkip using this tool when:\n- There is only a single, straightforward task\n- The task is trivial and tracking it provides no organizational benefit\n- The task can be completed in less than 3 trivial steps\n- The task is purely conversational or informational\n\nNOTE that you should not use this tool if there is only one trivial task to do. In this case you are better off just doing the task directly.\n\n## Task Fields\n\n- **subject**: A brief, actionable title in imperative form (e.g., \"Fix authentication bug in login flow\")\n- **description**: Detailed description of what needs to be done, including context and acceptance criteria\n- **activeForm**: Present continuous form shown in spinner when task is in_progress (e.g., \"Fixing authentication bug\"). This is displayed to the user while you work on the task.\n\n**IMPORTANT**: Always provide activeForm when creating tasks. The subject should be imperative (\"Run tests\") while activeForm should be present continuous (\"Running tests\"). All tasks are created with status \\`pending\\`.\n\n## Tips\n\n- Create tasks with clear, specific subjects that describe the outcome\n- Include enough detail in the description for another agent to understand and complete the task\n- After creating tasks, use TaskUpdate to set up dependencies (blocks/blockedBy) if needed\n- Check TaskList first to avoid creating duplicate tasks\n`\n\nexport const DESCRIPTION = 'Create a new task to track progress on complex work'\n"],
|
|
5
|
+
"mappings": "AAAO,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;AA0Cf,MAAM,cAAc;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { Box, Text } from "ink";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { FallbackToolUseRejectedMessage } from "../../components/FallbackToolUseRejectedMessage.js";
|
|
5
|
+
import { getTaskById } from "../../services/taskStore.js";
|
|
6
|
+
import { DESCRIPTION, PROMPT } from "./prompt.js";
|
|
7
|
+
import { getTheme } from "../../utils/theme.js";
|
|
8
|
+
const inputSchema = z.strictObject({
|
|
9
|
+
taskId: z.string().describe("The ID of the task to retrieve")
|
|
10
|
+
});
|
|
11
|
+
const TaskGetTool = {
|
|
12
|
+
name: "TaskGet",
|
|
13
|
+
async description() {
|
|
14
|
+
return DESCRIPTION;
|
|
15
|
+
},
|
|
16
|
+
async prompt() {
|
|
17
|
+
return PROMPT;
|
|
18
|
+
},
|
|
19
|
+
inputSchema,
|
|
20
|
+
userFacingName() {
|
|
21
|
+
return "Get Task";
|
|
22
|
+
},
|
|
23
|
+
async isEnabled() {
|
|
24
|
+
return true;
|
|
25
|
+
},
|
|
26
|
+
isReadOnly() {
|
|
27
|
+
return true;
|
|
28
|
+
},
|
|
29
|
+
isConcurrencySafe() {
|
|
30
|
+
return true;
|
|
31
|
+
},
|
|
32
|
+
needsPermissions() {
|
|
33
|
+
return false;
|
|
34
|
+
},
|
|
35
|
+
renderToolUseMessage(input) {
|
|
36
|
+
return `taskId: ${input.taskId}`;
|
|
37
|
+
},
|
|
38
|
+
renderToolUseRejectedMessage() {
|
|
39
|
+
return /* @__PURE__ */ React.createElement(FallbackToolUseRejectedMessage, null);
|
|
40
|
+
},
|
|
41
|
+
renderToolResultMessage(output) {
|
|
42
|
+
if (!output || "error" in output) {
|
|
43
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, { color: getTheme().error }, output && "error" in output ? output.error : "Task not found"));
|
|
44
|
+
}
|
|
45
|
+
const statusColor = output.status === "completed" ? getTheme().success : output.status === "in_progress" ? getTheme().warning : getTheme().secondaryText;
|
|
46
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, { bold: true }, "#", output.id), /* @__PURE__ */ React.createElement(Text, null, " "), /* @__PURE__ */ React.createElement(Text, null, output.subject)), /* @__PURE__ */ React.createElement(Box, { flexDirection: "row", paddingLeft: 5 }, /* @__PURE__ */ React.createElement(Text, { color: statusColor }, "[", output.status, "]"), output.owner && /* @__PURE__ */ React.createElement(Text, { color: getTheme().secondaryText }, " owner: ", output.owner)));
|
|
47
|
+
},
|
|
48
|
+
renderResultForAssistant(result) {
|
|
49
|
+
if ("error" in result) {
|
|
50
|
+
return `Error: ${result.error}`;
|
|
51
|
+
}
|
|
52
|
+
const lines = [
|
|
53
|
+
`Task #${result.id}:`,
|
|
54
|
+
` Subject: ${result.subject}`,
|
|
55
|
+
` Status: ${result.status}`,
|
|
56
|
+
` Description: ${result.description}`
|
|
57
|
+
];
|
|
58
|
+
if (result.activeForm) {
|
|
59
|
+
lines.push(` Active Form: ${result.activeForm}`);
|
|
60
|
+
}
|
|
61
|
+
if (result.owner) {
|
|
62
|
+
lines.push(` Owner: ${result.owner}`);
|
|
63
|
+
}
|
|
64
|
+
if (result.blocks && result.blocks.length > 0) {
|
|
65
|
+
lines.push(` Blocks: [${result.blocks.join(", ")}]`);
|
|
66
|
+
}
|
|
67
|
+
if (result.blockedBy && result.blockedBy.length > 0) {
|
|
68
|
+
lines.push(` Blocked By: [${result.blockedBy.join(", ")}]`);
|
|
69
|
+
}
|
|
70
|
+
if (result.metadata && Object.keys(result.metadata).length > 0) {
|
|
71
|
+
lines.push(` Metadata: ${JSON.stringify(result.metadata)}`);
|
|
72
|
+
}
|
|
73
|
+
return lines.join("\n");
|
|
74
|
+
},
|
|
75
|
+
async validateInput({ taskId }) {
|
|
76
|
+
if (!taskId?.trim()) {
|
|
77
|
+
return {
|
|
78
|
+
result: false,
|
|
79
|
+
message: "Task ID is required"
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return { result: true };
|
|
83
|
+
},
|
|
84
|
+
async *call(input) {
|
|
85
|
+
try {
|
|
86
|
+
const task = getTaskById(input.taskId);
|
|
87
|
+
if (!task) {
|
|
88
|
+
const result = { error: `Task with ID '${input.taskId}' not found` };
|
|
89
|
+
yield {
|
|
90
|
+
type: "result",
|
|
91
|
+
data: result,
|
|
92
|
+
resultForAssistant: this.renderResultForAssistant(result)
|
|
93
|
+
};
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
yield {
|
|
97
|
+
type: "result",
|
|
98
|
+
data: task,
|
|
99
|
+
resultForAssistant: this.renderResultForAssistant(task)
|
|
100
|
+
};
|
|
101
|
+
} catch (error) {
|
|
102
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
|
|
103
|
+
const result = { error: errorMessage };
|
|
104
|
+
yield {
|
|
105
|
+
type: "result",
|
|
106
|
+
data: result,
|
|
107
|
+
resultForAssistant: `Error getting task: ${errorMessage}`
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
export {
|
|
113
|
+
TaskGetTool
|
|
114
|
+
};
|
|
115
|
+
//# sourceMappingURL=TaskGetTool.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/tools/TaskGetTool/TaskGetTool.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 { getTaskById, Task } from '@services/taskStore'\nimport { DESCRIPTION, PROMPT } from './prompt'\nimport { getTheme } from '@utils/theme'\n\nconst inputSchema = z.strictObject({\n taskId: z.string().describe('The ID of the task to retrieve'),\n})\n\nexport const TaskGetTool = {\n name: 'TaskGet',\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'Get Task'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n needsPermissions() {\n return false\n },\n renderToolUseMessage(input: z.infer<typeof inputSchema>) {\n return `taskId: ${input.taskId}`\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: Task | { error: string }) {\n if (!output || 'error' in output) {\n return (\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text color={getTheme().error}>\n {output && 'error' in output ? output.error : 'Task not found'}\n </Text>\n </Box>\n )\n }\n\n const statusColor =\n output.status === 'completed'\n ? getTheme().success\n : output.status === 'in_progress'\n ? getTheme().warning\n : getTheme().secondaryText\n\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text bold>#{output.id}</Text>\n <Text> </Text>\n <Text>{output.subject}</Text>\n </Box>\n <Box flexDirection=\"row\" paddingLeft={5}>\n <Text color={statusColor}>[{output.status}]</Text>\n {output.owner && (\n <Text color={getTheme().secondaryText}> owner: {output.owner}</Text>\n )}\n </Box>\n </Box>\n )\n },\n renderResultForAssistant(result: Task | { error: string }) {\n if ('error' in result) {\n return `Error: ${result.error}`\n }\n\n const lines: string[] = [\n `Task #${result.id}:`,\n ` Subject: ${result.subject}`,\n ` Status: ${result.status}`,\n ` Description: ${result.description}`,\n ]\n\n if (result.activeForm) {\n lines.push(` Active Form: ${result.activeForm}`)\n }\n if (result.owner) {\n lines.push(` Owner: ${result.owner}`)\n }\n if (result.blocks && result.blocks.length > 0) {\n lines.push(` Blocks: [${result.blocks.join(', ')}]`)\n }\n if (result.blockedBy && result.blockedBy.length > 0) {\n lines.push(` Blocked By: [${result.blockedBy.join(', ')}]`)\n }\n if (result.metadata && Object.keys(result.metadata).length > 0) {\n lines.push(` Metadata: ${JSON.stringify(result.metadata)}`)\n }\n\n return lines.join('\\n')\n },\n async validateInput({ taskId }: z.infer<typeof inputSchema>) {\n if (!taskId?.trim()) {\n return {\n result: false,\n message: 'Task ID is required',\n }\n }\n return { result: true }\n },\n async *call(input: z.infer<typeof inputSchema>) {\n try {\n const task = getTaskById(input.taskId)\n\n if (!task) {\n const result = { error: `Task with ID '${input.taskId}' not found` }\n yield {\n type: 'result',\n data: result,\n resultForAssistant: this.renderResultForAssistant(result),\n }\n return\n }\n\n yield {\n type: 'result',\n data: task,\n resultForAssistant: this.renderResultForAssistant(task),\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error occurred'\n const result = { error: errorMessage }\n yield {\n type: 'result',\n data: result,\n resultForAssistant: `Error getting task: ${errorMessage}`,\n }\n }\n },\n} satisfies Tool<typeof inputSchema, Task | { error: string }>\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const PROMPT = `Use this tool to retrieve a task by its ID from the task list.
|
|
2
|
+
|
|
3
|
+
## When to Use This Tool
|
|
4
|
+
|
|
5
|
+
- When you need the full description and context before starting work on a task
|
|
6
|
+
- To understand task dependencies (what it blocks, what blocks it)
|
|
7
|
+
- After being assigned a task, to get complete requirements
|
|
8
|
+
|
|
9
|
+
## Output
|
|
10
|
+
|
|
11
|
+
Returns full task details:
|
|
12
|
+
- **subject**: Task title
|
|
13
|
+
- **description**: Detailed requirements and context
|
|
14
|
+
- **status**: 'pending', 'in_progress', or 'completed'
|
|
15
|
+
- **blocks**: Tasks waiting on this one to complete
|
|
16
|
+
- **blockedBy**: Tasks that must complete before this one can start
|
|
17
|
+
|
|
18
|
+
## Tips
|
|
19
|
+
|
|
20
|
+
- After fetching a task, verify its blockedBy list is empty before beginning work.
|
|
21
|
+
- Use TaskList to see all tasks in summary form.
|
|
22
|
+
`;
|
|
23
|
+
const DESCRIPTION = "Get full details of a task by its ID";
|
|
24
|
+
export {
|
|
25
|
+
DESCRIPTION,
|
|
26
|
+
PROMPT
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/tools/TaskGetTool/prompt.ts"],
|
|
4
|
+
"sourcesContent": ["export const PROMPT = `Use this tool to retrieve a task by its ID from the task list.\n\n## When to Use This Tool\n\n- When you need the full description and context before starting work on a task\n- To understand task dependencies (what it blocks, what blocks it)\n- After being assigned a task, to get complete requirements\n\n## Output\n\nReturns full task details:\n- **subject**: Task title\n- **description**: Detailed requirements and context\n- **status**: 'pending', 'in_progress', or 'completed'\n- **blocks**: Tasks waiting on this one to complete\n- **blockedBy**: Tasks that must complete before this one can start\n\n## Tips\n\n- After fetching a task, verify its blockedBy list is empty before beginning work.\n- Use TaskList to see all tasks in summary form.\n`\n\nexport const DESCRIPTION = 'Get full details of a task by its ID'\n"],
|
|
5
|
+
"mappings": "AAAO,MAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBf,MAAM,cAAc;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { Box, Text } from "ink";
|
|
2
|
+
import * as React from "react";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import { FallbackToolUseRejectedMessage } from "../../components/FallbackToolUseRejectedMessage.js";
|
|
5
|
+
import { getTaskList, getTaskStatistics } from "../../services/taskStore.js";
|
|
6
|
+
import { DESCRIPTION, PROMPT } from "./prompt.js";
|
|
7
|
+
import { getTheme } from "../../utils/theme.js";
|
|
8
|
+
const inputSchema = z.strictObject({});
|
|
9
|
+
const TaskListTool = {
|
|
10
|
+
name: "TaskList",
|
|
11
|
+
async description() {
|
|
12
|
+
return DESCRIPTION;
|
|
13
|
+
},
|
|
14
|
+
async prompt() {
|
|
15
|
+
return PROMPT;
|
|
16
|
+
},
|
|
17
|
+
inputSchema,
|
|
18
|
+
userFacingName() {
|
|
19
|
+
return "List Tasks";
|
|
20
|
+
},
|
|
21
|
+
async isEnabled() {
|
|
22
|
+
return true;
|
|
23
|
+
},
|
|
24
|
+
isReadOnly() {
|
|
25
|
+
return true;
|
|
26
|
+
},
|
|
27
|
+
isConcurrencySafe() {
|
|
28
|
+
return true;
|
|
29
|
+
},
|
|
30
|
+
needsPermissions() {
|
|
31
|
+
return false;
|
|
32
|
+
},
|
|
33
|
+
renderToolUseMessage() {
|
|
34
|
+
return "";
|
|
35
|
+
},
|
|
36
|
+
renderToolUseRejectedMessage() {
|
|
37
|
+
return /* @__PURE__ */ React.createElement(FallbackToolUseRejectedMessage, null);
|
|
38
|
+
},
|
|
39
|
+
renderToolResultMessage(output) {
|
|
40
|
+
if (!output || !output.tasks) {
|
|
41
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, null, "No tasks found"));
|
|
42
|
+
}
|
|
43
|
+
const { tasks, stats } = output;
|
|
44
|
+
if (tasks.length === 0) {
|
|
45
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, { color: getTheme().secondaryText }, "No tasks in list"));
|
|
46
|
+
}
|
|
47
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, null, stats.total, " task(s): ", stats.pending, " pending, ", stats.inProgress, " ", "in progress, ", stats.completed, " completed")), tasks.slice(0, 5).map((task) => {
|
|
48
|
+
const statusColor = task.status === "completed" ? getTheme().success : task.status === "in_progress" ? getTheme().warning : getTheme().secondaryText;
|
|
49
|
+
return /* @__PURE__ */ React.createElement(Box, { key: task.id, flexDirection: "row", paddingLeft: 5 }, /* @__PURE__ */ React.createElement(Text, { color: statusColor }, "#", task.id), /* @__PURE__ */ React.createElement(Text, null, " "), /* @__PURE__ */ React.createElement(Text, null, task.subject.length > 40 ? task.subject.slice(0, 40) + "..." : task.subject), task.blockedBy && task.blockedBy.length > 0 && /* @__PURE__ */ React.createElement(Text, { color: getTheme().error }, " ", "(blocked by: ", task.blockedBy.join(", "), ")"));
|
|
50
|
+
}), tasks.length > 5 && /* @__PURE__ */ React.createElement(Box, { paddingLeft: 5 }, /* @__PURE__ */ React.createElement(Text, { color: getTheme().secondaryText }, "... and ", tasks.length - 5, " more")));
|
|
51
|
+
},
|
|
52
|
+
renderResultForAssistant(result) {
|
|
53
|
+
const { tasks, stats } = result;
|
|
54
|
+
if (tasks.length === 0) {
|
|
55
|
+
return "No tasks in the task list.";
|
|
56
|
+
}
|
|
57
|
+
const lines = [
|
|
58
|
+
`Task List (${stats.total} total: ${stats.pending} pending, ${stats.inProgress} in progress, ${stats.completed} completed):`,
|
|
59
|
+
""
|
|
60
|
+
];
|
|
61
|
+
for (const task of tasks) {
|
|
62
|
+
let line = `#${task.id} [${task.status}] ${task.subject}`;
|
|
63
|
+
if (task.owner) {
|
|
64
|
+
line += ` (owner: ${task.owner})`;
|
|
65
|
+
}
|
|
66
|
+
if (task.blockedBy && task.blockedBy.length > 0) {
|
|
67
|
+
line += ` (blocked by: ${task.blockedBy.join(", ")})`;
|
|
68
|
+
}
|
|
69
|
+
lines.push(line);
|
|
70
|
+
}
|
|
71
|
+
return lines.join("\n");
|
|
72
|
+
},
|
|
73
|
+
async *call() {
|
|
74
|
+
try {
|
|
75
|
+
const tasks = getTaskList();
|
|
76
|
+
const stats = getTaskStatistics();
|
|
77
|
+
const result = {
|
|
78
|
+
tasks,
|
|
79
|
+
stats
|
|
80
|
+
};
|
|
81
|
+
yield {
|
|
82
|
+
type: "result",
|
|
83
|
+
data: result,
|
|
84
|
+
resultForAssistant: this.renderResultForAssistant(result)
|
|
85
|
+
};
|
|
86
|
+
} catch (error) {
|
|
87
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
|
|
88
|
+
yield {
|
|
89
|
+
type: "result",
|
|
90
|
+
data: {
|
|
91
|
+
tasks: [],
|
|
92
|
+
stats: { total: 0, pending: 0, inProgress: 0, completed: 0 }
|
|
93
|
+
},
|
|
94
|
+
resultForAssistant: `Error listing tasks: ${errorMessage}`
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
export {
|
|
100
|
+
TaskListTool
|
|
101
|
+
};
|
|
102
|
+
//# sourceMappingURL=TaskListTool.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/tools/TaskListTool/TaskListTool.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 { getTaskList, getTaskStatistics } from '@services/taskStore'\nimport { DESCRIPTION, PROMPT } from './prompt'\nimport { getTheme } from '@utils/theme'\n\nconst inputSchema = z.strictObject({})\n\ntype TaskSummary = {\n id: string\n subject: string\n status: 'pending' | 'in_progress' | 'completed'\n owner?: string\n blockedBy?: string[]\n}\n\ntype TaskListOutput = {\n tasks: TaskSummary[]\n stats: {\n total: number\n pending: number\n inProgress: number\n completed: number\n }\n}\n\nexport const TaskListTool = {\n name: 'TaskList',\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'List Tasks'\n },\n async isEnabled() {\n return true\n },\n isReadOnly() {\n return true\n },\n isConcurrencySafe() {\n return true\n },\n needsPermissions() {\n return false\n },\n renderToolUseMessage() {\n return ''\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: TaskListOutput) {\n if (!output || !output.tasks) {\n return (\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text>No tasks found</Text>\n </Box>\n )\n }\n\n const { tasks, stats } = output\n\n if (tasks.length === 0) {\n return (\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text color={getTheme().secondaryText}>No tasks in list</Text>\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"column\">\n <Box flexDirection=\"row\">\n <Text> \u23BF </Text>\n <Text>\n {stats.total} task(s): {stats.pending} pending, {stats.inProgress}{' '}\n in progress, {stats.completed} completed\n </Text>\n </Box>\n {tasks.slice(0, 5).map(task => {\n const statusColor =\n task.status === 'completed'\n ? getTheme().success\n : task.status === 'in_progress'\n ? getTheme().warning\n : getTheme().secondaryText\n\n return (\n <Box key={task.id} flexDirection=\"row\" paddingLeft={5}>\n <Text color={statusColor}>#{task.id}</Text>\n <Text> </Text>\n <Text>\n {task.subject.length > 40\n ? task.subject.slice(0, 40) + '...'\n : task.subject}\n </Text>\n {task.blockedBy && task.blockedBy.length > 0 && (\n <Text color={getTheme().error}>\n {' '}\n (blocked by: {task.blockedBy.join(', ')})\n </Text>\n )}\n </Box>\n )\n })}\n {tasks.length > 5 && (\n <Box paddingLeft={5}>\n <Text color={getTheme().secondaryText}>\n ... and {tasks.length - 5} more\n </Text>\n </Box>\n )}\n </Box>\n )\n },\n renderResultForAssistant(result: TaskListOutput) {\n const { tasks, stats } = result\n\n if (tasks.length === 0) {\n return 'No tasks in the task list.'\n }\n\n const lines: string[] = [\n `Task List (${stats.total} total: ${stats.pending} pending, ${stats.inProgress} in progress, ${stats.completed} completed):`,\n '',\n ]\n\n for (const task of tasks) {\n let line = `#${task.id} [${task.status}] ${task.subject}`\n if (task.owner) {\n line += ` (owner: ${task.owner})`\n }\n if (task.blockedBy && task.blockedBy.length > 0) {\n line += ` (blocked by: ${task.blockedBy.join(', ')})`\n }\n lines.push(line)\n }\n\n return lines.join('\\n')\n },\n async *call() {\n try {\n const tasks = getTaskList()\n const stats = getTaskStatistics()\n\n const result: TaskListOutput = {\n tasks,\n stats,\n }\n\n yield {\n type: 'result',\n data: result,\n resultForAssistant: this.renderResultForAssistant(result),\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error occurred'\n yield {\n type: 'result',\n data: {\n tasks: [],\n stats: { total: 0, pending: 0, inProgress: 0, completed: 0 },\n },\n resultForAssistant: `Error listing tasks: ${errorMessage}`,\n }\n }\n },\n} satisfies Tool<typeof inputSchema, TaskListOutput>\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,KAAK,YAAY;AAC1B,YAAY,WAAW;AACvB,SAAS,SAAS;AAClB,SAAS,sCAAsC;AAE/C,SAAS,aAAa,yBAAyB;AAC/C,SAAS,aAAa,cAAc;AACpC,SAAS,gBAAgB;AAEzB,MAAM,cAAc,EAAE,aAAa,CAAC,CAAC;AAoB9B,MAAM,eAAe;AAAA,EAC1B,MAAM;AAAA,EACN,MAAM,cAAc;AAClB,WAAO;AAAA,EACT;AAAA,EACA,MAAM,SAAS;AACb,WAAO;AAAA,EACT;AAAA,EACA;AAAA,EACA,iBAAiB;AACf,WAAO;AAAA,EACT;AAAA,EACA,MAAM,YAAY;AAChB,WAAO;AAAA,EACT;AAAA,EACA,aAAa;AACX,WAAO;AAAA,EACT;AAAA,EACA,oBAAoB;AAClB,WAAO;AAAA,EACT;AAAA,EACA,mBAAmB;AACjB,WAAO;AAAA,EACT;AAAA,EACA,uBAAuB;AACrB,WAAO;AAAA,EACT;AAAA,EACA,+BAA+B;AAC7B,WAAO,oCAAC,oCAA+B;AAAA,EACzC;AAAA,EACA,wBAAwB,QAAwB;AAC9C,QAAI,CAAC,UAAU,CAAC,OAAO,OAAO;AAC5B,aACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,YAAK,qBAAoB,GAC1B,oCAAC,YAAK,gBAAc,CACtB;AAAA,IAEJ;AAEA,UAAM,EAAE,OAAO,MAAM,IAAI;AAEzB,QAAI,MAAM,WAAW,GAAG;AACtB,aACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,YAAK,qBAAoB,GAC1B,oCAAC,QAAK,OAAO,SAAS,EAAE,iBAAe,kBAAgB,CACzD;AAAA,IAEJ;AAEA,WACE,oCAAC,OAAI,eAAc,YACjB,oCAAC,OAAI,eAAc,SACjB,oCAAC,YAAK,qBAAoB,GAC1B,oCAAC,YACE,MAAM,OAAM,cAAW,MAAM,SAAQ,cAAW,MAAM,YAAY,KAAI,iBACzD,MAAM,WAAU,YAChC,CACF,GACC,MAAM,MAAM,GAAG,CAAC,EAAE,IAAI,UAAQ;AAC7B,YAAM,cACJ,KAAK,WAAW,cACZ,SAAS,EAAE,UACX,KAAK,WAAW,gBACd,SAAS,EAAE,UACX,SAAS,EAAE;AAEnB,aACE,oCAAC,OAAI,KAAK,KAAK,IAAI,eAAc,OAAM,aAAa,KAClD,oCAAC,QAAK,OAAO,eAAa,KAAE,KAAK,EAAG,GACpC,oCAAC,YAAK,GAAC,GACP,oCAAC,YACE,KAAK,QAAQ,SAAS,KACnB,KAAK,QAAQ,MAAM,GAAG,EAAE,IAAI,QAC5B,KAAK,OACX,GACC,KAAK,aAAa,KAAK,UAAU,SAAS,KACzC,oCAAC,QAAK,OAAO,SAAS,EAAE,SACrB,KAAI,iBACS,KAAK,UAAU,KAAK,IAAI,GAAE,GAC1C,CAEJ;AAAA,IAEJ,CAAC,GACA,MAAM,SAAS,KACd,oCAAC,OAAI,aAAa,KAChB,oCAAC,QAAK,OAAO,SAAS,EAAE,iBAAe,YAC5B,MAAM,SAAS,GAAE,OAC5B,CACF,CAEJ;AAAA,EAEJ;AAAA,EACA,yBAAyB,QAAwB;AAC/C,UAAM,EAAE,OAAO,MAAM,IAAI;AAEzB,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,UAAM,QAAkB;AAAA,MACtB,cAAc,MAAM,KAAK,WAAW,MAAM,OAAO,aAAa,MAAM,UAAU,iBAAiB,MAAM,SAAS;AAAA,MAC9G;AAAA,IACF;AAEA,eAAW,QAAQ,OAAO;AACxB,UAAI,OAAO,IAAI,KAAK,EAAE,KAAK,KAAK,MAAM,KAAK,KAAK,OAAO;AACvD,UAAI,KAAK,OAAO;AACd,gBAAQ,YAAY,KAAK,KAAK;AAAA,MAChC;AACA,UAAI,KAAK,aAAa,KAAK,UAAU,SAAS,GAAG;AAC/C,gBAAQ,iBAAiB,KAAK,UAAU,KAAK,IAAI,CAAC;AAAA,MACpD;AACA,YAAM,KAAK,IAAI;AAAA,IACjB;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EACA,OAAO,OAAO;AACZ,QAAI;AACF,YAAM,QAAQ,YAAY;AAC1B,YAAM,QAAQ,kBAAkB;AAEhC,YAAM,SAAyB;AAAA,QAC7B;AAAA,QACA;AAAA,MACF;AAEA,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,oBAAoB,KAAK,yBAAyB,MAAM;AAAA,MAC1D;AAAA,IACF,SAAS,OAAO;AACd,YAAM,eACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,UACJ,OAAO,CAAC;AAAA,UACR,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,YAAY,GAAG,WAAW,EAAE;AAAA,QAC7D;AAAA,QACA,oBAAoB,wBAAwB,YAAY;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const PROMPT = `Use this tool to list all tasks in the task list.
|
|
2
|
+
|
|
3
|
+
## When to Use This Tool
|
|
4
|
+
|
|
5
|
+
- To see what tasks are available to work on (status: 'pending', no owner, not blocked)
|
|
6
|
+
- To check overall progress on the project
|
|
7
|
+
- To find tasks that are blocked and need dependencies resolved
|
|
8
|
+
- After completing a task, to check for newly unblocked work or claim the next available task
|
|
9
|
+
- **Prefer working on tasks in ID order** (lowest ID first) when multiple tasks are available, as earlier tasks often set up context for later ones
|
|
10
|
+
|
|
11
|
+
## Output
|
|
12
|
+
|
|
13
|
+
Returns a summary of each task:
|
|
14
|
+
- **id**: Task identifier (use with TaskGet, TaskUpdate)
|
|
15
|
+
- **subject**: Brief description of the task
|
|
16
|
+
- **status**: 'pending', 'in_progress', or 'completed'
|
|
17
|
+
- **owner**: Agent ID if assigned, empty if available
|
|
18
|
+
- **blockedBy**: List of open task IDs that must be resolved first (tasks with blockedBy cannot be claimed until dependencies resolve)
|
|
19
|
+
|
|
20
|
+
Use TaskGet with a specific task ID to view full details including description and comments.
|
|
21
|
+
`;
|
|
22
|
+
const DESCRIPTION = "List all tasks in the task list";
|
|
23
|
+
export {
|
|
24
|
+
DESCRIPTION,
|
|
25
|
+
PROMPT
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=prompt.js.map
|