@within-7/minto 0.3.0 → 0.3.4

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.
Files changed (84) hide show
  1. package/dist/commands/setup.js +40 -2
  2. package/dist/commands/setup.js.map +2 -2
  3. package/dist/components/SubagentProgress.js +10 -2
  4. package/dist/components/SubagentProgress.js.map +2 -2
  5. package/dist/constants/prompts.js +22 -1
  6. package/dist/constants/prompts.js.map +2 -2
  7. package/dist/entrypoints/cli.js +15 -9
  8. package/dist/entrypoints/cli.js.map +2 -2
  9. package/dist/permissions.js +121 -2
  10. package/dist/permissions.js.map +2 -2
  11. package/dist/screens/ResumeConversation.js +2 -0
  12. package/dist/screens/ResumeConversation.js.map +2 -2
  13. package/dist/services/taskStore.js +205 -0
  14. package/dist/services/taskStore.js.map +7 -0
  15. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +40 -3
  16. package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
  17. package/dist/tools/BashTool/BashTool.js +21 -4
  18. package/dist/tools/BashTool/BashTool.js.map +2 -2
  19. package/dist/tools/BashTool/prompt.js +6 -0
  20. package/dist/tools/BashTool/prompt.js.map +2 -2
  21. package/dist/tools/FileEditTool/FileEditTool.js +24 -9
  22. package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
  23. package/dist/tools/FileEditTool/prompt.js +4 -1
  24. package/dist/tools/FileEditTool/prompt.js.map +2 -2
  25. package/dist/tools/FileEditTool/utils.js +10 -4
  26. package/dist/tools/FileEditTool/utils.js.map +2 -2
  27. package/dist/tools/FileReadTool/FileReadTool.js +1 -1
  28. package/dist/tools/FileReadTool/FileReadTool.js.map +1 -1
  29. package/dist/tools/FileReadTool/prompt.js +16 -1
  30. package/dist/tools/FileReadTool/prompt.js.map +2 -2
  31. package/dist/tools/FileWriteTool/FileWriteTool.js +1 -1
  32. package/dist/tools/FileWriteTool/FileWriteTool.js.map +1 -1
  33. package/dist/tools/FileWriteTool/prompt.js +8 -1
  34. package/dist/tools/FileWriteTool/prompt.js.map +2 -2
  35. package/dist/tools/GlobTool/prompt.js +12 -1
  36. package/dist/tools/GlobTool/prompt.js.map +2 -2
  37. package/dist/tools/GrepTool/GrepTool.js +333 -65
  38. package/dist/tools/GrepTool/GrepTool.js.map +2 -2
  39. package/dist/tools/GrepTool/prompt.js +15 -8
  40. package/dist/tools/GrepTool/prompt.js.map +2 -2
  41. package/dist/tools/NotebookEditTool/NotebookEditTool.js +57 -45
  42. package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
  43. package/dist/tools/NotebookEditTool/prompt.js +1 -1
  44. package/dist/tools/NotebookEditTool/prompt.js.map +1 -1
  45. package/dist/tools/TaskCreateTool/TaskCreateTool.js +102 -0
  46. package/dist/tools/TaskCreateTool/TaskCreateTool.js.map +7 -0
  47. package/dist/tools/TaskCreateTool/prompt.js +47 -0
  48. package/dist/tools/TaskCreateTool/prompt.js.map +7 -0
  49. package/dist/tools/TaskGetTool/TaskGetTool.js +115 -0
  50. package/dist/tools/TaskGetTool/TaskGetTool.js.map +7 -0
  51. package/dist/tools/TaskGetTool/prompt.js +28 -0
  52. package/dist/tools/TaskGetTool/prompt.js.map +7 -0
  53. package/dist/tools/TaskListTool/TaskListTool.js +102 -0
  54. package/dist/tools/TaskListTool/TaskListTool.js.map +7 -0
  55. package/dist/tools/TaskListTool/prompt.js +27 -0
  56. package/dist/tools/TaskListTool/prompt.js.map +7 -0
  57. package/dist/tools/TaskStopTool/TaskStopTool.js +150 -0
  58. package/dist/tools/TaskStopTool/TaskStopTool.js.map +7 -0
  59. package/dist/tools/TaskStopTool/prompt.js +15 -0
  60. package/dist/tools/TaskStopTool/prompt.js.map +7 -0
  61. package/dist/tools/TaskTool/TaskTool.js +41 -1
  62. package/dist/tools/TaskTool/TaskTool.js.map +2 -2
  63. package/dist/tools/TaskUpdateTool/TaskUpdateTool.js +134 -0
  64. package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +7 -0
  65. package/dist/tools/TaskUpdateTool/prompt.js +81 -0
  66. package/dist/tools/TaskUpdateTool/prompt.js.map +7 -0
  67. package/dist/tools/URLFetcherTool/prompt.js +1 -1
  68. package/dist/tools/URLFetcherTool/prompt.js.map +1 -1
  69. package/dist/tools.js +12 -0
  70. package/dist/tools.js.map +2 -2
  71. package/dist/utils/config.js.map +2 -2
  72. package/dist/utils/model.js +15 -2
  73. package/dist/utils/model.js.map +2 -2
  74. package/dist/utils/ripgrep.js +53 -1
  75. package/dist/utils/ripgrep.js.map +2 -2
  76. package/dist/utils/teamConfig.js +160 -0
  77. package/dist/utils/teamConfig.js.map +3 -3
  78. package/dist/utils/terminal.js +12 -0
  79. package/dist/utils/terminal.js.map +2 -2
  80. package/dist/utils/tooling/safeRender.js +13 -14
  81. package/dist/utils/tooling/safeRender.js.map +2 -2
  82. package/dist/version.js +2 -2
  83. package/dist/version.js.map +1 -1
  84. package/package.json +20 -28
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/tools/TaskTool/TaskTool.tsx"],
4
- "sourcesContent": ["import { TextBlock } from '@anthropic-ai/sdk/resources/index.mjs'\nimport chalk from 'chalk'\nimport { last, memoize } from 'lodash-es'\nimport { EOL } from 'os'\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text } from 'ink'\nimport { z } from 'zod'\nimport { Tool, ValidationResult } from '@tool'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { getAgentPrompt } from '@constants/prompts'\nimport { getContext } from '@context'\nimport { hasPermissionsToUseTool } from '@permissions'\nimport { AssistantMessage, Message as MessageType, query } from '@query'\nimport { formatDuration, formatNumber } from '@utils/format'\nimport {\n getMessagesPath,\n getNextAvailableLogSidechainNumber,\n overwriteLog,\n logError,\n} from '@utils/log'\nimport { applyMarkdown } from '@utils/markdown'\nimport {\n createAssistantMessage,\n createUserMessage,\n getLastAssistantMessageId,\n INTERRUPT_MESSAGE,\n normalizeMessages,\n} from '@utils/messages'\nimport { getModelManager } from '@utils/model'\nimport { getMaxThinkingTokens } from '@utils/thinking'\nimport { getTheme } from '@utils/theme'\nimport { generateAgentId } from '@utils/agentStorage'\nimport { debug as debugLogger } from '@utils/debugLogger'\nimport { getTaskTools, getPrompt } from './prompt'\nimport { TOOL_NAME } from './constants'\nimport {\n getActiveAgents,\n getAgentByType,\n getAvailableAgentTypes,\n} from '@utils/agentLoader'\nimport {\n createAgentTranscript,\n getAgentTranscript,\n getResumableTranscript,\n appendMessageToTranscript,\n updateAgentTranscript,\n completeAgentTranscript,\n failAgentTranscript,\n interruptAgentTranscript,\n canResumeTranscript,\n registerToolUseAgent,\n type AgentTranscript,\n} from '@utils/agentTranscripts'\n// Background agent imports removed - run_in_background feature deprecated\nimport { UserFriendlyError, formatErrorForUser } from '@utils/userFriendlyError'\nimport {\n pushAgentContext,\n popAgentContext,\n cleanupAgentStreamingState,\n} from '@components/Spinner'\n\nconst inputSchema = z.object({\n description: z\n .string()\n .describe('A short (3-5 word) description of the task'),\n prompt: z.string().describe('The task for the agent to perform'),\n model_name: z\n .string()\n .optional()\n .describe(\n 'Optional: Specific model name to use for this task. If not provided, uses the default task model pointer.',\n ),\n subagent_type: z\n .string()\n .optional()\n .describe(\n 'The specialized agent type to use. MUST be an exact name from the available agents list in the tool description. Defaults to \"general-purpose\" if not specified.',\n ),\n resume: z\n .string()\n .optional()\n .describe(\n 'Optional agent ID to resume from. If provided, the agent will continue from the previous execution transcript.',\n ),\n // run_in_background parameter removed - concurrent execution is automatic\n})\n\nexport const TaskTool = {\n async prompt({ safeMode }) {\n return await getPrompt(safeMode)\n },\n name: TOOL_NAME,\n async description() {\n // Dynamically load available agent types from plugins\n const availableTypes = await getAvailableAgentTypes()\n const typesList = availableTypes.join(', ')\n return `Launch a specialized agent to handle tasks autonomously. You MUST use an exact agent type name from this list: ${typesList}. Default to \"general-purpose\" if unsure.`\n },\n inputSchema,\n\n async *call(\n { description, prompt, model_name, subagent_type, resume },\n {\n abortController,\n options: { safeMode = false, forkNumber, messageLogName, verbose },\n readFileTimestamps,\n toolUseId,\n },\n ): AsyncGenerator<\n | { type: 'result'; data: TextBlock[]; resultForAssistant?: string }\n | {\n type: 'progress'\n content: any\n normalizedMessages?: any[]\n tools?: any[]\n },\n void,\n unknown\n > {\n const startTime = Date.now()\n\n // Default to general-purpose if no subagent_type specified\n const agentType = subagent_type || 'general-purpose'\n\n // Handle resume: check if we're resuming from a previous transcript\n let resumedTranscript: AgentTranscript | null = null\n let agentId: string\n\n if (resume) {\n resumedTranscript = getResumableTranscript(resume)\n if (!resumedTranscript) {\n yield {\n type: 'result',\n data: [\n {\n type: 'text',\n text: `Cannot resume agent '${resume}': transcript not found or not resumable (status must be 'running' or 'interrupted')`,\n },\n ] as TextBlock[],\n resultForAssistant: `Cannot resume agent '${resume}': transcript not found or not resumable`,\n }\n return\n }\n agentId = resume\n debugLogger.info('TASK_AGENT_RESUMING', {\n agentId,\n agentType: resumedTranscript.agentType,\n messageCount: resumedTranscript.messages.length,\n previousStatus: resumedTranscript.status,\n })\n } else {\n agentId = generateAgentId()\n }\n\n // Register toolUseId -> agentId mapping for UI association\n if (toolUseId) {\n registerToolUseAgent(toolUseId, agentId)\n }\n\n // \uD83D\uDD27 CRITICAL FIX: Track whether we've yielded a result to prevent UI stuck state\n let hasYieldedResult = false\n\n // Apply subagent configuration\n let effectivePrompt = prompt\n let effectiveModel = model_name || 'task'\n let toolFilter = null\n let temperature = undefined\n\n // Load agent configuration dynamically\n if (agentType) {\n const agentConfig = await getAgentByType(agentType)\n\n if (!agentConfig) {\n // If agent type not found, return helpful message instead of throwing\n const availableTypes = await getAvailableAgentTypes()\n const helpMessage = `Agent type '${agentType}' not found.\\n\\nAvailable agents:\\n${availableTypes.map(t => ` \u2022 ${t}`).join('\\n')}\\n\\nUse /agents command to manage agent configurations.`\n\n yield {\n type: 'result',\n data: [{ type: 'text', text: helpMessage }] as TextBlock[],\n resultForAssistant: helpMessage,\n }\n hasYieldedResult = true\n return\n }\n\n // Apply system prompt if configured\n if (agentConfig.systemPrompt) {\n effectivePrompt = `${agentConfig.systemPrompt}\\n\\n${prompt}`\n }\n\n // Apply model if not overridden by model_name parameter\n if (!model_name && agentConfig.model_name) {\n // Support inherit: keep pointer-based default\n if (agentConfig.model_name !== 'inherit') {\n effectiveModel = agentConfig.model_name as string\n }\n }\n\n // Store tool filter for later application\n toolFilter = agentConfig.tools\n\n // Note: temperature is not currently in our agent configs\n // but could be added in the future\n }\n\n // Initialize messages: either resume from transcript or start fresh\n const messages: MessageType[] = resumedTranscript\n ? [...resumedTranscript.messages]\n : [createUserMessage(effectivePrompt)]\n\n let tools = await getTaskTools(safeMode)\n\n // Apply tool filtering if specified by subagent config\n if (toolFilter) {\n // Back-compat: ['*'] means all tools\n const isAllArray =\n Array.isArray(toolFilter) &&\n toolFilter.length === 1 &&\n toolFilter[0] === '*'\n if (toolFilter === '*' || isAllArray) {\n // no-op, keep all tools\n } else if (Array.isArray(toolFilter)) {\n tools = tools.filter(tool => toolFilter.includes(tool.name))\n }\n }\n\n // Model already resolved in effectiveModel variable above\n const modelToUse = effectiveModel\n\n // Display initial task information with separate progress lines\n if (resumedTranscript) {\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `Resuming agent: ${agentType} (${agentId})`,\n ),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `Restored ${resumedTranscript.messages.length} messages, ${resumedTranscript.toolUseCount} tool uses`,\n ),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n } else {\n yield {\n type: 'progress',\n content: createAssistantMessage(`Starting agent: ${agentType}`),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(`Using model: ${modelToUse}`),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(`Task: ${description}`),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `Prompt: ${prompt.length > 150 ? prompt.substring(0, 150) + '...' : prompt}`,\n ),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n\n const [taskPrompt, context, maxThinkingTokens] = await Promise.all([\n getAgentPrompt(),\n getContext(),\n getMaxThinkingTokens(messages),\n ])\n\n // Inject model context to prevent self-referential expert consultations\n taskPrompt.push(\n `\\nIMPORTANT: You are currently running as ${modelToUse}. You do not need to consult ${modelToUse} via AskExpertModel since you ARE ${modelToUse}. Complete tasks directly using your capabilities.`,\n )\n\n // Initialize tool use count (restore from transcript if resuming)\n let toolUseCount = resumedTranscript?.toolUseCount || 0\n\n const getSidechainNumber = memoize(() =>\n getNextAvailableLogSidechainNumber(messageLogName, forkNumber),\n )\n\n // Create or update transcript for this agent execution\n if (!resumedTranscript) {\n createAgentTranscript({\n agentId,\n agentType,\n toolUseId, // Include toolUseId for event-driven UI updates\n description,\n prompt,\n model: modelToUse,\n forkNumber,\n messageLogName,\n messages: [...messages],\n toolUseCount: 0,\n })\n } else {\n // Update transcript status to running when resuming\n appendMessageToTranscript(\n agentId,\n createUserMessage(`[Resumed] ${prompt}`),\n )\n }\n\n // Build query options, adding temperature if specified\n const queryOptions = {\n safeMode,\n forkNumber,\n messageLogName,\n tools,\n commands: [],\n verbose,\n maxThinkingTokens,\n model: modelToUse,\n }\n\n // Add temperature if specified by subagent config\n if (temperature !== undefined) {\n queryOptions['temperature'] = temperature\n }\n\n // \uD83D\uDD27 CRITICAL FIX: Wrap entire query execution in try-catch-finally\n // This ensures we ALWAYS yield a result, even if query() throws an error\n\n // Push agent context so streaming state is isolated for this subagent\n pushAgentContext(agentId)\n\n try {\n for await (const message of query(\n messages,\n taskPrompt,\n context,\n hasPermissionsToUseTool,\n {\n abortController,\n options: queryOptions,\n messageId: getLastAssistantMessageId(messages),\n agentId,\n readFileTimestamps,\n setToolJSX: () => {}, // No-op implementation for TaskTool\n },\n )) {\n messages.push(message)\n\n // Persist message to transcript for resume capability\n appendMessageToTranscript(agentId, message)\n\n overwriteLog(\n getMessagesPath(messageLogName, forkNumber, getSidechainNumber()),\n messages.filter(_ => _.type !== 'progress'),\n )\n\n if (message.type !== 'assistant') {\n continue\n }\n\n // Real-time token usage update for running task display\n if (message.message.usage) {\n updateAgentTranscript(agentId, {\n tokenUsage: {\n inputTokens: message.message.usage.input_tokens,\n outputTokens: message.message.usage.output_tokens,\n cacheReadTokens: message.message.usage.cache_read_input_tokens,\n cacheCreationTokens:\n message.message.usage.cache_creation_input_tokens,\n },\n })\n }\n\n const normalizedMessages = normalizeMessages(messages)\n\n // Process tool uses and text content for better visibility\n for (const content of message.message.content) {\n if (\n content.type === 'text' &&\n content.text &&\n content.text !== INTERRUPT_MESSAGE\n ) {\n // Show agent's reasoning/responses\n const preview =\n content.text.length > 200\n ? content.text.substring(0, 200) + '...'\n : content.text\n yield {\n type: 'progress',\n content: createAssistantMessage(`${preview}`),\n normalizedMessages,\n tools,\n }\n } else if (content.type === 'tool_use') {\n toolUseCount++\n\n // Show which tool is being used with agent context\n const toolMessage = normalizedMessages.find(\n _ =>\n _.type === 'assistant' &&\n _.message.content[0]?.type === 'tool_use' &&\n _.message.content[0].id === content.id,\n ) as AssistantMessage\n\n if (toolMessage) {\n // Clone and modify the message to show agent context\n const modifiedMessage = {\n ...toolMessage,\n message: {\n ...toolMessage.message,\n content: toolMessage.message.content.map(c => {\n if (c.type === 'tool_use' && c.id === content.id) {\n // Add agent context to tool name display\n return {\n ...c,\n name: c.name, // Keep original name, UI will handle display\n }\n }\n return c\n }),\n },\n }\n\n yield {\n type: 'progress',\n content: modifiedMessage,\n normalizedMessages,\n tools,\n }\n }\n }\n }\n }\n\n const normalizedMessages = normalizeMessages(messages)\n const lastMessage = last(messages)\n if (lastMessage?.type !== 'assistant') {\n throw new Error('Last message was not an assistant message')\n }\n\n // Calculate token usage for transcript\n const tokenUsage = {\n inputTokens: lastMessage.message.usage.input_tokens,\n outputTokens: lastMessage.message.usage.output_tokens,\n cacheReadTokens: lastMessage.message.usage.cache_read_input_tokens,\n cacheCreationTokens:\n lastMessage.message.usage.cache_creation_input_tokens,\n }\n\n // Check for interrupt\n const isInterrupted = lastMessage.message.content.some(\n _ => _.type === 'text' && _.text === INTERRUPT_MESSAGE,\n )\n\n if (isInterrupted) {\n // Mark transcript as interrupted (can be resumed later)\n interruptAgentTranscript(agentId)\n debugLogger.info('TASK_AGENT_INTERRUPTED', { agentId, toolUseCount })\n } else {\n // Mark transcript as completed\n completeAgentTranscript(agentId, tokenUsage)\n debugLogger.info('TASK_AGENT_COMPLETED', { agentId, toolUseCount })\n\n const result = [\n toolUseCount === 1 ? '1 tool use' : `${toolUseCount} tool uses`,\n formatNumber(\n (lastMessage.message.usage.cache_creation_input_tokens ?? 0) +\n (lastMessage.message.usage.cache_read_input_tokens ?? 0) +\n lastMessage.message.usage.input_tokens +\n lastMessage.message.usage.output_tokens,\n ) + ' tokens',\n formatDuration(Date.now() - startTime),\n ]\n yield {\n type: 'progress',\n content: createAssistantMessage(`Done (${result.join(' \u00B7 ')})`),\n normalizedMessages,\n tools,\n }\n }\n\n // Output is an AssistantMessage, but since TaskTool is a tool, it needs\n // to serialize its response to UserMessage-compatible content.\n const data = lastMessage.message.content.filter(_ => _.type === 'text')\n\n // Include agentId in result for potential resume\n const resultWithAgentId = isInterrupted\n ? `[Interrupted - Agent ID: ${agentId}]\\n${this.renderResultForAssistant(data)}`\n : this.renderResultForAssistant(data)\n\n yield {\n type: 'result',\n data,\n resultForAssistant: resultWithAgentId,\n }\n hasYieldedResult = true\n } catch (error) {\n // \uD83D\uDD27 CRITICAL: On error, we MUST yield a result to clear UI state\n const errorMessage =\n error instanceof Error ? error.message : String(error)\n\n // \uD83D\uDD27 FIX: Check if this is an AbortError (ESC interrupt)\n // AbortError indicates user interrupted, should mark as 'interrupted' not 'failed'\n const isAbortError =\n error instanceof Error &&\n (error.name === 'AbortError' ||\n error.message.includes('aborted') ||\n error.message.includes('abort'))\n\n if (isAbortError) {\n // Mark transcript as interrupted (can be resumed later)\n interruptAgentTranscript(agentId)\n debugLogger.info('TASK_AGENT_INTERRUPTED_BY_ABORT', {\n agentId,\n toolUseCount,\n })\n\n yield {\n type: 'result',\n data: [\n {\n type: 'text',\n text: `Task [${agentType}] interrupted\\n[Agent ID: ${agentId}]`,\n },\n ] as TextBlock[],\n resultForAssistant: `Task [${agentType}] interrupted by user\\n[Agent ID: ${agentId} - can be resumed]`,\n }\n } else {\n // Convert to user-friendly error for better UX\n const friendlyError =\n error instanceof UserFriendlyError\n ? error\n : new UserFriendlyError(error, {\n operation: 'agent task',\n model: agentType,\n })\n const friendlyMessage = friendlyError.getUserMessage()\n\n logError(`TaskTool [${agentType}] error: ${errorMessage}`)\n\n // Mark transcript as failed with friendly message\n failAgentTranscript(agentId, friendlyMessage)\n debugLogger.error('TASK_AGENT_FAILED', {\n agentId,\n error: errorMessage,\n errorId: friendlyError.id,\n })\n\n yield {\n type: 'result',\n data: [\n {\n type: 'text',\n text: `${friendlyMessage}\\n[Agent ID: ${agentId}]`,\n },\n ] as TextBlock[],\n resultForAssistant: `Task [${agentType}] failed: ${errorMessage}\\n[Agent ID: ${agentId} - can be resumed]`,\n }\n }\n hasYieldedResult = true\n } finally {\n // Pop agent context and clean up streaming state\n popAgentContext()\n cleanupAgentStreamingState(agentId)\n\n // \uD83D\uDD27 SAFETY NET: Ensure we always yield a result even in unexpected scenarios\n if (!hasYieldedResult) {\n // Mark as interrupted if we haven't yielded a result\n interruptAgentTranscript(agentId)\n\n yield {\n type: 'result',\n data: [\n {\n type: 'text',\n text: `Task [${agentType}] terminated unexpectedly\\n[Agent ID: ${agentId}]`,\n },\n ] as TextBlock[],\n resultForAssistant: `Task [${agentType}] terminated unexpectedly\\n[Agent ID: ${agentId} - can be resumed]`,\n }\n }\n }\n },\n\n isReadOnly() {\n return true // for now...\n },\n isConcurrencySafe() {\n return true // Task tool supports concurrent execution in official implementation\n },\n async validateInput(input, context) {\n if (!input.description || typeof input.description !== 'string') {\n return {\n result: false,\n message: 'Description is required and must be a string',\n }\n }\n if (!input.prompt || typeof input.prompt !== 'string') {\n return {\n result: false,\n message: 'Prompt is required and must be a string',\n }\n }\n\n // Model validation - similar to Edit tool error handling\n if (input.model_name) {\n const modelManager = getModelManager()\n const availableModels = modelManager.getAllAvailableModelNames()\n\n if (!availableModels.includes(input.model_name)) {\n return {\n result: false,\n message: `Model '${input.model_name}' does not exist. Available models: ${availableModels.join(', ')}`,\n meta: {\n model_name: input.model_name,\n availableModels,\n },\n }\n }\n }\n\n // Validate subagent_type if provided\n if (input.subagent_type) {\n const availableTypes = await getAvailableAgentTypes()\n if (!availableTypes.includes(input.subagent_type)) {\n return {\n result: false,\n message: `Agent type '${input.subagent_type}' does not exist. Available types: ${availableTypes.join(', ')}`,\n meta: {\n subagent_type: input.subagent_type,\n availableTypes,\n },\n }\n }\n }\n\n // Validate resume parameter if provided\n if (input.resume) {\n if (!canResumeTranscript(input.resume)) {\n return {\n result: false,\n message: `Cannot resume agent '${input.resume}': transcript not found or not resumable (status must be 'running' or 'interrupted')`,\n meta: {\n resume: input.resume,\n },\n }\n }\n }\n\n return { result: true }\n },\n async isEnabled() {\n return true\n },\n userFacingName(input?: any) {\n // Return agent name with proper prefix\n const agentType = input?.subagent_type || 'general-purpose'\n return `agent-${agentType}`\n },\n needsPermissions() {\n return false\n },\n renderResultForAssistant(data: TextBlock[]) {\n return data\n .map(block => (block.type === 'text' ? block.text : ''))\n .join('\\n')\n },\n renderToolUseMessage(\n { description, prompt, model_name, subagent_type },\n { verbose },\n ) {\n if (!description || !prompt) return null\n\n const modelManager = getModelManager()\n const defaultTaskModel = modelManager.getModelName('task')\n const actualModel = model_name || defaultTaskModel\n const agentType = subagent_type || 'general-purpose'\n const promptPreview =\n prompt.length > 80 ? prompt.substring(0, 80) + '...' : prompt\n\n const theme = getTheme()\n\n if (verbose) {\n return (\n <Box flexDirection=\"column\">\n <Text>\n [{agentType}] {actualModel}: {description}\n </Text>\n <Box\n paddingLeft={2}\n borderLeftStyle=\"single\"\n borderLeftColor={theme.secondaryBorder}\n >\n <Text color={theme.secondaryText}>{promptPreview}</Text>\n </Box>\n </Box>\n )\n }\n\n // Simple display: agent type, model and description\n return `[${agentType}] ${actualModel}: ${description}`\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(content, options?: { verbose?: boolean }) {\n const theme = getTheme()\n const verbose = options?.verbose ?? false\n\n // Guard against undefined or null content\n if (!content) {\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={theme.success}>Done</Text>\n </Box>\n )\n }\n\n if (Array.isArray(content)) {\n const textBlocks = content.filter(\n (block): block is { type: 'text'; text: string } =>\n block && block.type === 'text',\n )\n const totalLength = textBlocks.reduce(\n (sum, block) => sum + (block.text?.length || 0),\n 0,\n )\n // Use exact match for interrupt detection\n const isInterrupted = content.some(\n block =>\n block && block.type === 'text' && block.text === INTERRUPT_MESSAGE,\n )\n\n if (isInterrupted) {\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={theme.error}>Interrupted by user</Text>\n </Box>\n )\n }\n\n // Extract output content for display based on verbosity\n const outputText = textBlocks.map(b => b.text).join('\\n')\n\n // Determine how much content to show based on displayMode\n // minimal/compact (verbose=false): Just show \"Task completed (X characters)\"\n // detailed (verbose=true): Show preview of the actual output\n const getOutputPreview = () => {\n if (!verbose || !outputText) return null\n const maxLen = 500\n if (outputText.length <= maxLen) return outputText\n return outputText.substring(0, maxLen) + '...'\n }\n\n const outputPreview = getOutputPreview()\n\n return (\n <Box flexDirection=\"column\">\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={theme.success}>Done</Text>\n {textBlocks.length > 0 && verbose && (\n <Text color={theme.secondaryText}> ({totalLength} chars)</Text>\n )}\n </Box>\n </Box>\n {outputPreview && (\n <Box marginTop={1} paddingLeft={4}>\n <Text color={theme.mutedText}>{outputPreview}</Text>\n </Box>\n )}\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={theme.success}>Done</Text>\n </Box>\n )\n },\n} satisfies Tool<typeof inputSchema, TextBlock[]>\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { TextBlock } from '@anthropic-ai/sdk/resources/index.mjs'\nimport chalk from 'chalk'\nimport { last, memoize } from 'lodash-es'\nimport { EOL } from 'os'\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text } from 'ink'\nimport { z } from 'zod'\nimport { Tool, ValidationResult } from '@tool'\nimport { FallbackToolUseRejectedMessage } from '@components/FallbackToolUseRejectedMessage'\nimport { getAgentPrompt } from '@constants/prompts'\nimport { getContext } from '@context'\nimport { hasPermissionsToUseTool } from '@permissions'\nimport { AssistantMessage, Message as MessageType, query } from '@query'\nimport { formatDuration, formatNumber } from '@utils/format'\nimport {\n getMessagesPath,\n getNextAvailableLogSidechainNumber,\n overwriteLog,\n logError,\n} from '@utils/log'\nimport { applyMarkdown } from '@utils/markdown'\nimport {\n createAssistantMessage,\n createUserMessage,\n getLastAssistantMessageId,\n INTERRUPT_MESSAGE,\n normalizeMessages,\n} from '@utils/messages'\nimport { getModelManager } from '@utils/model'\nimport { getMaxThinkingTokens } from '@utils/thinking'\nimport { getTheme } from '@utils/theme'\nimport { generateAgentId } from '@utils/agentStorage'\nimport { debug as debugLogger } from '@utils/debugLogger'\nimport { getTaskTools, getPrompt } from './prompt'\nimport { TOOL_NAME } from './constants'\nimport {\n getActiveAgents,\n getAgentByType,\n getAvailableAgentTypes,\n} from '@utils/agentLoader'\nimport {\n createAgentTranscript,\n getAgentTranscript,\n getResumableTranscript,\n appendMessageToTranscript,\n updateAgentTranscript,\n completeAgentTranscript,\n failAgentTranscript,\n interruptAgentTranscript,\n canResumeTranscript,\n registerToolUseAgent,\n type AgentTranscript,\n} from '@utils/agentTranscripts'\n// Background agent imports removed - run_in_background feature deprecated\nimport { UserFriendlyError, formatErrorForUser } from '@utils/userFriendlyError'\nimport {\n pushAgentContext,\n popAgentContext,\n cleanupAgentStreamingState,\n} from '@components/Spinner'\n\nconst inputSchema = z.object({\n description: z\n .string()\n .describe('A short (3-5 word) description of the task'),\n prompt: z.string().describe('The task for the agent to perform'),\n model_name: z\n .string()\n .optional()\n .describe(\n 'Optional: Specific model name to use for this task. If not provided, uses the default task model pointer.',\n ),\n model: z\n .enum(['sonnet', 'opus', 'haiku'])\n .optional()\n .describe(\n 'Optional model hint for this agent. Maps to configured model pointers: sonnet\u2192main, opus\u2192reasoning, haiku\u2192quick. If not specified, uses the task model pointer. Prefer haiku for quick, straightforward tasks.',\n ),\n subagent_type: z\n .string()\n .optional()\n .describe(\n 'The specialized agent type to use. MUST be an exact name from the available agents list in the tool description. Defaults to \"general-purpose\" if not specified.',\n ),\n resume: z\n .string()\n .optional()\n .describe(\n 'Optional agent ID to resume from. If provided, the agent will continue from the previous execution transcript.',\n ),\n max_turns: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\n 'Maximum number of agentic turns (API round-trips) before stopping. Used internally for warmup.',\n ),\n // run_in_background parameter removed - concurrent execution is automatic\n})\n\nexport const TaskTool = {\n async prompt({ safeMode }) {\n return await getPrompt(safeMode)\n },\n name: TOOL_NAME,\n async description() {\n // Dynamically load available agent types from plugins\n const availableTypes = await getAvailableAgentTypes()\n const typesList = availableTypes.join(', ')\n return `Launch a specialized agent to handle tasks autonomously. You MUST use an exact agent type name from this list: ${typesList}. Default to \"general-purpose\" if unsure.`\n },\n inputSchema,\n\n async *call(\n {\n description,\n prompt,\n model_name,\n model,\n subagent_type,\n resume,\n max_turns,\n },\n {\n abortController,\n options: { safeMode = false, forkNumber, messageLogName, verbose },\n readFileTimestamps,\n toolUseId,\n },\n ): AsyncGenerator<\n | { type: 'result'; data: TextBlock[]; resultForAssistant?: string }\n | {\n type: 'progress'\n content: any\n normalizedMessages?: any[]\n tools?: any[]\n },\n void,\n unknown\n > {\n const startTime = Date.now()\n\n // Default to general-purpose if no subagent_type specified\n const agentType = subagent_type || 'general-purpose'\n\n // Handle resume: check if we're resuming from a previous transcript\n let resumedTranscript: AgentTranscript | null = null\n let agentId: string\n\n if (resume) {\n resumedTranscript = getResumableTranscript(resume)\n if (!resumedTranscript) {\n yield {\n type: 'result',\n data: [\n {\n type: 'text',\n text: `Cannot resume agent '${resume}': transcript not found or not resumable (status must be 'running' or 'interrupted')`,\n },\n ] as TextBlock[],\n resultForAssistant: `Cannot resume agent '${resume}': transcript not found or not resumable`,\n }\n return\n }\n agentId = resume\n debugLogger.info('TASK_AGENT_RESUMING', {\n agentId,\n agentType: resumedTranscript.agentType,\n messageCount: resumedTranscript.messages.length,\n previousStatus: resumedTranscript.status,\n })\n } else {\n agentId = generateAgentId()\n }\n\n // Register toolUseId -> agentId mapping for UI association\n if (toolUseId) {\n registerToolUseAgent(toolUseId, agentId)\n }\n\n // \uD83D\uDD27 CRITICAL FIX: Track whether we've yielded a result to prevent UI stuck state\n let hasYieldedResult = false\n\n // Apply subagent configuration\n let effectivePrompt = prompt\n let effectiveModel = model_name || 'task'\n let toolFilter = null\n let temperature = undefined\n\n // Load agent configuration dynamically\n if (agentType) {\n const agentConfig = await getAgentByType(agentType)\n\n if (!agentConfig) {\n // If agent type not found, return helpful message instead of throwing\n const availableTypes = await getAvailableAgentTypes()\n const helpMessage = `Agent type '${agentType}' not found.\\n\\nAvailable agents:\\n${availableTypes.map(t => ` \u2022 ${t}`).join('\\n')}\\n\\nUse /agents command to manage agent configurations.`\n\n yield {\n type: 'result',\n data: [{ type: 'text', text: helpMessage }] as TextBlock[],\n resultForAssistant: helpMessage,\n }\n hasYieldedResult = true\n return\n }\n\n // Apply system prompt if configured\n if (agentConfig.systemPrompt) {\n effectivePrompt = `${agentConfig.systemPrompt}\\n\\n${prompt}`\n }\n\n // Apply model if not overridden by model_name parameter\n if (!model_name && agentConfig.model_name) {\n // Support inherit: keep pointer-based default\n if (agentConfig.model_name !== 'inherit') {\n effectiveModel = agentConfig.model_name as string\n }\n }\n\n // Store tool filter for later application\n toolFilter = agentConfig.tools\n\n // Note: temperature is not currently in our agent configs\n // but could be added in the future\n }\n\n // Apply model resolution with intelligent fallback\n // Priority: model_name (explicit) > model (alias) > agent config > task pointer > main model\n if (model) {\n // Model aliases are semantic hints, not hardcoded model names\n // Map to Minto's model pointer system for proper resolution\n const modelPointerMap: Record<string, string> = {\n sonnet: 'main', // Use main model for standard tasks\n opus: 'reasoning', // Use reasoning model for complex tasks\n haiku: 'quick', // Use quick model for fast tasks\n }\n\n const pointerType = modelPointerMap[model] || 'task'\n const modelManager = getModelManager()\n const resolvedModelName = modelManager.getModelName(pointerType as any)\n\n if (resolvedModelName) {\n effectiveModel = resolvedModelName\n }\n // If resolution fails, keep the previous effectiveModel (from agent config or 'task' default)\n }\n\n // Initialize messages: either resume from transcript or start fresh\n const messages: MessageType[] = resumedTranscript\n ? [...resumedTranscript.messages]\n : [createUserMessage(effectivePrompt)]\n\n let tools = await getTaskTools(safeMode)\n\n // Apply tool filtering if specified by subagent config\n if (toolFilter) {\n // Back-compat: ['*'] means all tools\n const isAllArray =\n Array.isArray(toolFilter) &&\n toolFilter.length === 1 &&\n toolFilter[0] === '*'\n if (toolFilter === '*' || isAllArray) {\n // no-op, keep all tools\n } else if (Array.isArray(toolFilter)) {\n tools = tools.filter(tool => toolFilter.includes(tool.name))\n }\n }\n\n // Model already resolved in effectiveModel variable above\n const modelToUse = effectiveModel\n\n // Display initial task information with separate progress lines\n if (resumedTranscript) {\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `Resuming agent: ${agentType} (${agentId})`,\n ),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `Restored ${resumedTranscript.messages.length} messages, ${resumedTranscript.toolUseCount} tool uses`,\n ),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n } else {\n yield {\n type: 'progress',\n content: createAssistantMessage(`Starting agent: ${agentType}`),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(`Using model: ${modelToUse}`),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(`Task: ${description}`),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n\n yield {\n type: 'progress',\n content: createAssistantMessage(\n `Prompt: ${prompt.length > 150 ? prompt.substring(0, 150) + '...' : prompt}`,\n ),\n normalizedMessages: normalizeMessages(messages),\n tools,\n }\n\n const [taskPrompt, context, maxThinkingTokens] = await Promise.all([\n getAgentPrompt(),\n getContext(),\n getMaxThinkingTokens(messages),\n ])\n\n // Inject model context to prevent self-referential expert consultations\n taskPrompt.push(\n `\\nIMPORTANT: You are currently running as ${modelToUse}. You do not need to consult ${modelToUse} via AskExpertModel since you ARE ${modelToUse}. Complete tasks directly using your capabilities.`,\n )\n\n // Initialize tool use count (restore from transcript if resuming)\n let toolUseCount = resumedTranscript?.toolUseCount || 0\n\n const getSidechainNumber = memoize(() =>\n getNextAvailableLogSidechainNumber(messageLogName, forkNumber),\n )\n\n // Create or update transcript for this agent execution\n if (!resumedTranscript) {\n createAgentTranscript({\n agentId,\n agentType,\n toolUseId, // Include toolUseId for event-driven UI updates\n description,\n prompt,\n model: modelToUse,\n forkNumber,\n messageLogName,\n messages: [...messages],\n toolUseCount: 0,\n })\n } else {\n // Update transcript status to running when resuming\n appendMessageToTranscript(\n agentId,\n createUserMessage(`[Resumed] ${prompt}`),\n )\n }\n\n // Build query options, adding temperature if specified\n const queryOptions = {\n safeMode,\n forkNumber,\n messageLogName,\n tools,\n commands: [],\n verbose,\n maxThinkingTokens,\n model: modelToUse,\n }\n\n // Add temperature if specified by subagent config\n if (temperature !== undefined) {\n queryOptions['temperature'] = temperature\n }\n\n // \uD83D\uDD27 CRITICAL FIX: Wrap entire query execution in try-catch-finally\n // This ensures we ALWAYS yield a result, even if query() throws an error\n\n // Push agent context so streaming state is isolated for this subagent\n pushAgentContext(agentId)\n\n // Track turn count for max_turns limit\n let turnCount = 0\n\n try {\n for await (const message of query(\n messages,\n taskPrompt,\n context,\n hasPermissionsToUseTool,\n {\n abortController,\n options: queryOptions,\n messageId: getLastAssistantMessageId(messages),\n agentId,\n readFileTimestamps,\n setToolJSX: () => {}, // No-op implementation for TaskTool\n },\n )) {\n messages.push(message)\n\n // Persist message to transcript for resume capability\n appendMessageToTranscript(agentId, message)\n\n overwriteLog(\n getMessagesPath(messageLogName, forkNumber, getSidechainNumber()),\n messages.filter(_ => _.type !== 'progress'),\n )\n\n if (message.type !== 'assistant') {\n continue\n }\n\n // Increment turn count for each assistant message (API round-trip)\n turnCount++\n\n // Check max_turns limit\n if (max_turns && turnCount >= max_turns) {\n debugLogger.info('TASK_AGENT_MAX_TURNS_REACHED', {\n agentId,\n turnCount,\n max_turns,\n })\n // Break out of the query loop - will proceed to normal completion handling\n break\n }\n\n // Real-time token usage update for running task display\n if (message.message.usage) {\n updateAgentTranscript(agentId, {\n tokenUsage: {\n inputTokens: message.message.usage.input_tokens,\n outputTokens: message.message.usage.output_tokens,\n cacheReadTokens: message.message.usage.cache_read_input_tokens,\n cacheCreationTokens:\n message.message.usage.cache_creation_input_tokens,\n },\n })\n }\n\n const normalizedMessages = normalizeMessages(messages)\n\n // Process tool uses and text content for better visibility\n for (const content of message.message.content) {\n if (\n content.type === 'text' &&\n content.text &&\n content.text !== INTERRUPT_MESSAGE\n ) {\n // Show agent's reasoning/responses\n const preview =\n content.text.length > 200\n ? content.text.substring(0, 200) + '...'\n : content.text\n yield {\n type: 'progress',\n content: createAssistantMessage(`${preview}`),\n normalizedMessages,\n tools,\n }\n } else if (content.type === 'tool_use') {\n toolUseCount++\n\n // Show which tool is being used with agent context\n const toolMessage = normalizedMessages.find(\n _ =>\n _.type === 'assistant' &&\n _.message.content[0]?.type === 'tool_use' &&\n _.message.content[0].id === content.id,\n ) as AssistantMessage\n\n if (toolMessage) {\n // Clone and modify the message to show agent context\n const modifiedMessage = {\n ...toolMessage,\n message: {\n ...toolMessage.message,\n content: toolMessage.message.content.map(c => {\n if (c.type === 'tool_use' && c.id === content.id) {\n // Add agent context to tool name display\n return {\n ...c,\n name: c.name, // Keep original name, UI will handle display\n }\n }\n return c\n }),\n },\n }\n\n yield {\n type: 'progress',\n content: modifiedMessage,\n normalizedMessages,\n tools,\n }\n }\n }\n }\n }\n\n const normalizedMessages = normalizeMessages(messages)\n const lastMessage = last(messages)\n if (lastMessage?.type !== 'assistant') {\n throw new Error('Last message was not an assistant message')\n }\n\n // Calculate token usage for transcript\n const tokenUsage = {\n inputTokens: lastMessage.message.usage.input_tokens,\n outputTokens: lastMessage.message.usage.output_tokens,\n cacheReadTokens: lastMessage.message.usage.cache_read_input_tokens,\n cacheCreationTokens:\n lastMessage.message.usage.cache_creation_input_tokens,\n }\n\n // Check for interrupt\n const isInterrupted = lastMessage.message.content.some(\n _ => _.type === 'text' && _.text === INTERRUPT_MESSAGE,\n )\n\n if (isInterrupted) {\n // Mark transcript as interrupted (can be resumed later)\n interruptAgentTranscript(agentId)\n debugLogger.info('TASK_AGENT_INTERRUPTED', { agentId, toolUseCount })\n } else {\n // Mark transcript as completed\n completeAgentTranscript(agentId, tokenUsage)\n debugLogger.info('TASK_AGENT_COMPLETED', { agentId, toolUseCount })\n\n const result = [\n toolUseCount === 1 ? '1 tool use' : `${toolUseCount} tool uses`,\n formatNumber(\n (lastMessage.message.usage.cache_creation_input_tokens ?? 0) +\n (lastMessage.message.usage.cache_read_input_tokens ?? 0) +\n lastMessage.message.usage.input_tokens +\n lastMessage.message.usage.output_tokens,\n ) + ' tokens',\n formatDuration(Date.now() - startTime),\n ]\n yield {\n type: 'progress',\n content: createAssistantMessage(`Done (${result.join(' \u00B7 ')})`),\n normalizedMessages,\n tools,\n }\n }\n\n // Output is an AssistantMessage, but since TaskTool is a tool, it needs\n // to serialize its response to UserMessage-compatible content.\n const data = lastMessage.message.content.filter(_ => _.type === 'text')\n\n // Include agentId in result for potential resume\n const resultWithAgentId = isInterrupted\n ? `[Interrupted - Agent ID: ${agentId}]\\n${this.renderResultForAssistant(data)}`\n : this.renderResultForAssistant(data)\n\n yield {\n type: 'result',\n data,\n resultForAssistant: resultWithAgentId,\n }\n hasYieldedResult = true\n } catch (error) {\n // \uD83D\uDD27 CRITICAL: On error, we MUST yield a result to clear UI state\n const errorMessage =\n error instanceof Error ? error.message : String(error)\n\n // \uD83D\uDD27 FIX: Check if this is an AbortError (ESC interrupt)\n // AbortError indicates user interrupted, should mark as 'interrupted' not 'failed'\n const isAbortError =\n error instanceof Error &&\n (error.name === 'AbortError' ||\n error.message.includes('aborted') ||\n error.message.includes('abort'))\n\n if (isAbortError) {\n // Mark transcript as interrupted (can be resumed later)\n interruptAgentTranscript(agentId)\n debugLogger.info('TASK_AGENT_INTERRUPTED_BY_ABORT', {\n agentId,\n toolUseCount,\n })\n\n yield {\n type: 'result',\n data: [\n {\n type: 'text',\n text: `Task [${agentType}] interrupted\\n[Agent ID: ${agentId}]`,\n },\n ] as TextBlock[],\n resultForAssistant: `Task [${agentType}] interrupted by user\\n[Agent ID: ${agentId} - can be resumed]`,\n }\n } else {\n // Convert to user-friendly error for better UX\n const friendlyError =\n error instanceof UserFriendlyError\n ? error\n : new UserFriendlyError(error, {\n operation: 'agent task',\n model: agentType,\n })\n const friendlyMessage = friendlyError.getUserMessage()\n\n logError(`TaskTool [${agentType}] error: ${errorMessage}`)\n\n // Mark transcript as failed with friendly message\n failAgentTranscript(agentId, friendlyMessage)\n debugLogger.error('TASK_AGENT_FAILED', {\n agentId,\n error: errorMessage,\n errorId: friendlyError.id,\n })\n\n yield {\n type: 'result',\n data: [\n {\n type: 'text',\n text: `${friendlyMessage}\\n[Agent ID: ${agentId}]`,\n },\n ] as TextBlock[],\n resultForAssistant: `Task [${agentType}] failed: ${errorMessage}\\n[Agent ID: ${agentId} - can be resumed]`,\n }\n }\n hasYieldedResult = true\n } finally {\n // Pop agent context and clean up streaming state\n popAgentContext()\n cleanupAgentStreamingState(agentId)\n\n // \uD83D\uDD27 SAFETY NET: Ensure we always yield a result even in unexpected scenarios\n if (!hasYieldedResult) {\n // Mark as interrupted if we haven't yielded a result\n interruptAgentTranscript(agentId)\n\n yield {\n type: 'result',\n data: [\n {\n type: 'text',\n text: `Task [${agentType}] terminated unexpectedly\\n[Agent ID: ${agentId}]`,\n },\n ] as TextBlock[],\n resultForAssistant: `Task [${agentType}] terminated unexpectedly\\n[Agent ID: ${agentId} - can be resumed]`,\n }\n }\n }\n },\n\n isReadOnly() {\n return true // for now...\n },\n isConcurrencySafe() {\n return true // Task tool supports concurrent execution in official implementation\n },\n async validateInput(input, context) {\n if (!input.description || typeof input.description !== 'string') {\n return {\n result: false,\n message: 'Description is required and must be a string',\n }\n }\n if (!input.prompt || typeof input.prompt !== 'string') {\n return {\n result: false,\n message: 'Prompt is required and must be a string',\n }\n }\n\n // Model validation - similar to Edit tool error handling\n if (input.model_name) {\n const modelManager = getModelManager()\n const availableModels = modelManager.getAllAvailableModelNames()\n\n if (!availableModels.includes(input.model_name)) {\n return {\n result: false,\n message: `Model '${input.model_name}' does not exist. Available models: ${availableModels.join(', ')}`,\n meta: {\n model_name: input.model_name,\n availableModels,\n },\n }\n }\n }\n\n // Validate subagent_type if provided\n if (input.subagent_type) {\n const availableTypes = await getAvailableAgentTypes()\n if (!availableTypes.includes(input.subagent_type)) {\n return {\n result: false,\n message: `Agent type '${input.subagent_type}' does not exist. Available types: ${availableTypes.join(', ')}`,\n meta: {\n subagent_type: input.subagent_type,\n availableTypes,\n },\n }\n }\n }\n\n // Validate resume parameter if provided\n if (input.resume) {\n if (!canResumeTranscript(input.resume)) {\n return {\n result: false,\n message: `Cannot resume agent '${input.resume}': transcript not found or not resumable (status must be 'running' or 'interrupted')`,\n meta: {\n resume: input.resume,\n },\n }\n }\n }\n\n return { result: true }\n },\n async isEnabled() {\n return true\n },\n userFacingName(input?: any) {\n // Return agent name with proper prefix\n const agentType = input?.subagent_type || 'general-purpose'\n return `agent-${agentType}`\n },\n needsPermissions() {\n return false\n },\n renderResultForAssistant(data: TextBlock[]) {\n return data\n .map(block => (block.type === 'text' ? block.text : ''))\n .join('\\n')\n },\n renderToolUseMessage(\n { description, prompt, model_name, subagent_type },\n { verbose },\n ) {\n if (!description || !prompt) return null\n\n const modelManager = getModelManager()\n const defaultTaskModel = modelManager.getModelName('task')\n const actualModel = model_name || defaultTaskModel\n const agentType = subagent_type || 'general-purpose'\n const promptPreview =\n prompt.length > 80 ? prompt.substring(0, 80) + '...' : prompt\n\n const theme = getTheme()\n\n if (verbose) {\n return (\n <Box flexDirection=\"column\">\n <Text>\n [{agentType}] {actualModel}: {description}\n </Text>\n <Box\n paddingLeft={2}\n borderLeftStyle=\"single\"\n borderLeftColor={theme.secondaryBorder}\n >\n <Text color={theme.secondaryText}>{promptPreview}</Text>\n </Box>\n </Box>\n )\n }\n\n // Simple display: agent type, model and description\n return `[${agentType}] ${actualModel}: ${description}`\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(content, options?: { verbose?: boolean }) {\n const theme = getTheme()\n const verbose = options?.verbose ?? false\n\n // Guard against undefined or null content\n if (!content) {\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={theme.success}>Done</Text>\n </Box>\n )\n }\n\n if (Array.isArray(content)) {\n const textBlocks = content.filter(\n (block): block is { type: 'text'; text: string } =>\n block && block.type === 'text',\n )\n const totalLength = textBlocks.reduce(\n (sum, block) => sum + (block.text?.length || 0),\n 0,\n )\n // Use exact match for interrupt detection\n const isInterrupted = content.some(\n block =>\n block && block.type === 'text' && block.text === INTERRUPT_MESSAGE,\n )\n\n if (isInterrupted) {\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={theme.error}>Interrupted by user</Text>\n </Box>\n )\n }\n\n // Extract output content for display based on verbosity\n const outputText = textBlocks.map(b => b.text).join('\\n')\n\n // Determine how much content to show based on displayMode\n // minimal/compact (verbose=false): Just show \"Task completed (X characters)\"\n // detailed (verbose=true): Show preview of the actual output\n const getOutputPreview = () => {\n if (!verbose || !outputText) return null\n const maxLen = 500\n if (outputText.length <= maxLen) return outputText\n return outputText.substring(0, maxLen) + '...'\n }\n\n const outputPreview = getOutputPreview()\n\n return (\n <Box flexDirection=\"column\">\n <Box justifyContent=\"space-between\" width=\"100%\">\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={theme.success}>Done</Text>\n {textBlocks.length > 0 && verbose && (\n <Text color={theme.secondaryText}> ({totalLength} chars)</Text>\n )}\n </Box>\n </Box>\n {outputPreview && (\n <Box marginTop={1} paddingLeft={4}>\n <Text color={theme.mutedText}>{outputPreview}</Text>\n </Box>\n )}\n </Box>\n )\n }\n\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={theme.success}>Done</Text>\n </Box>\n )\n },\n} satisfies Tool<typeof inputSchema, TextBlock[]>\n"],
5
+ "mappings": "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",
6
6
  "names": ["normalizedMessages"]
7
7
  }
@@ -0,0 +1,134 @@
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 { updateTask, 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 update"),
10
+ status: z.enum(["pending", "in_progress", "completed", "deleted"]).optional().describe("New status for the task"),
11
+ subject: z.string().optional().describe("New subject for the task"),
12
+ description: z.string().optional().describe("New description for the task"),
13
+ activeForm: z.string().optional().describe(
14
+ 'Present continuous form shown in spinner when in_progress (e.g., "Running tests")'
15
+ ),
16
+ owner: z.string().optional().describe("New owner for the task"),
17
+ metadata: z.record(z.unknown()).optional().describe(
18
+ "Metadata keys to merge into the task. Set a key to null to delete it."
19
+ ),
20
+ addBlocks: z.array(z.string()).optional().describe("Task IDs that this task blocks"),
21
+ addBlockedBy: z.array(z.string()).optional().describe("Task IDs that block this task")
22
+ });
23
+ const TaskUpdateTool = {
24
+ name: "TaskUpdate",
25
+ async description() {
26
+ return DESCRIPTION;
27
+ },
28
+ async prompt() {
29
+ return PROMPT;
30
+ },
31
+ inputSchema,
32
+ userFacingName() {
33
+ return "Update Task";
34
+ },
35
+ async isEnabled() {
36
+ return true;
37
+ },
38
+ isReadOnly() {
39
+ return false;
40
+ },
41
+ isConcurrencySafe() {
42
+ return false;
43
+ },
44
+ needsPermissions() {
45
+ return false;
46
+ },
47
+ renderToolUseMessage(input) {
48
+ const parts = [`taskId: ${input.taskId}`];
49
+ if (input.status) {
50
+ parts.push(`status: ${input.status}`);
51
+ }
52
+ return parts.join(", ");
53
+ },
54
+ renderToolUseRejectedMessage() {
55
+ return /* @__PURE__ */ React.createElement(FallbackToolUseRejectedMessage, null);
56
+ },
57
+ renderToolResultMessage(output) {
58
+ if (!output || !output.taskId) {
59
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, null, "Task updated"));
60
+ }
61
+ if (output.deleted) {
62
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, { color: getTheme().secondaryText }, "Task #", output.taskId, " deleted"));
63
+ }
64
+ const statusColor = output.status === "completed" ? getTheme().success : output.status === "in_progress" ? getTheme().warning : getTheme().secondaryText;
65
+ return /* @__PURE__ */ React.createElement(Box, { flexDirection: "row" }, /* @__PURE__ */ React.createElement(Text, null, "\xA0\xA0\u23BF \xA0"), /* @__PURE__ */ React.createElement(Text, null, "Updated task #", output.taskId, output.status && /* @__PURE__ */ React.createElement(Text, { color: statusColor }, " \u2192 ", output.status)));
66
+ },
67
+ renderResultForAssistant(result) {
68
+ if (result.deleted) {
69
+ return `Task #${result.taskId} has been deleted`;
70
+ }
71
+ return `Updated task #${result.taskId}${result.status ? ` status` : ""}`;
72
+ },
73
+ async validateInput({ taskId }) {
74
+ if (!taskId?.trim()) {
75
+ return {
76
+ result: false,
77
+ message: "Task ID is required"
78
+ };
79
+ }
80
+ const task = getTaskById(taskId);
81
+ if (!task) {
82
+ return {
83
+ result: false,
84
+ message: `Task with ID '${taskId}' not found`
85
+ };
86
+ }
87
+ return { result: true };
88
+ },
89
+ async *call(input) {
90
+ try {
91
+ const isDeleting = input.status === "deleted";
92
+ const task = updateTask({
93
+ taskId: input.taskId,
94
+ status: input.status,
95
+ subject: input.subject,
96
+ description: input.description,
97
+ activeForm: input.activeForm,
98
+ owner: input.owner,
99
+ metadata: input.metadata,
100
+ addBlocks: input.addBlocks,
101
+ addBlockedBy: input.addBlockedBy
102
+ });
103
+ if (!task) {
104
+ yield {
105
+ type: "result",
106
+ data: { error: "Task not found" },
107
+ resultForAssistant: `Error: Task with ID '${input.taskId}' not found`
108
+ };
109
+ return;
110
+ }
111
+ const result = {
112
+ taskId: task.id,
113
+ status: task.status,
114
+ deleted: isDeleting
115
+ };
116
+ yield {
117
+ type: "result",
118
+ data: result,
119
+ resultForAssistant: this.renderResultForAssistant(result)
120
+ };
121
+ } catch (error) {
122
+ const errorMessage = error instanceof Error ? error.message : "Unknown error occurred";
123
+ yield {
124
+ type: "result",
125
+ data: { error: errorMessage },
126
+ resultForAssistant: `Error updating task: ${errorMessage}`
127
+ };
128
+ }
129
+ }
130
+ };
131
+ export {
132
+ TaskUpdateTool
133
+ };
134
+ //# sourceMappingURL=TaskUpdateTool.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/tools/TaskUpdateTool/TaskUpdateTool.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 { updateTask, getTaskById } 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 update'),\n status: z\n .enum(['pending', 'in_progress', 'completed', 'deleted'])\n .optional()\n .describe('New status for the task'),\n subject: z.string().optional().describe('New subject for the task'),\n description: z.string().optional().describe('New description for the task'),\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 owner: z.string().optional().describe('New owner for the task'),\n metadata: z\n .record(z.unknown())\n .optional()\n .describe(\n 'Metadata keys to merge into the task. Set a key to null to delete it.',\n ),\n addBlocks: z\n .array(z.string())\n .optional()\n .describe('Task IDs that this task blocks'),\n addBlockedBy: z\n .array(z.string())\n .optional()\n .describe('Task IDs that block this task'),\n})\n\nexport const TaskUpdateTool = {\n name: 'TaskUpdate',\n async description() {\n return DESCRIPTION\n },\n async prompt() {\n return PROMPT\n },\n inputSchema,\n userFacingName() {\n return 'Update 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 parts: string[] = [`taskId: ${input.taskId}`]\n if (input.status) {\n parts.push(`status: ${input.status}`)\n }\n return parts.join(', ')\n },\n renderToolUseRejectedMessage() {\n return <FallbackToolUseRejectedMessage />\n },\n renderToolResultMessage(output: {\n taskId: string\n status?: string\n deleted?: boolean\n }) {\n if (!output || !output.taskId) {\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text>Task updated</Text>\n </Box>\n )\n }\n\n if (output.deleted) {\n return (\n <Box flexDirection=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text color={getTheme().secondaryText}>\n Task #{output.taskId} deleted\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=\"row\">\n <Text>&nbsp;&nbsp;\u23BF &nbsp;</Text>\n <Text>\n Updated task #{output.taskId}\n {output.status && <Text color={statusColor}> \u2192 {output.status}</Text>}\n </Text>\n </Box>\n )\n },\n renderResultForAssistant(result: {\n taskId: string\n status?: string\n deleted?: boolean\n }) {\n if (result.deleted) {\n return `Task #${result.taskId} has been deleted`\n }\n return `Updated task #${result.taskId}${result.status ? ` status` : ''}`\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\n const task = getTaskById(taskId)\n if (!task) {\n return {\n result: false,\n message: `Task with ID '${taskId}' not found`,\n }\n }\n\n return { result: true }\n },\n async *call(input: z.infer<typeof inputSchema>) {\n try {\n const isDeleting = input.status === 'deleted'\n\n const task = updateTask({\n taskId: input.taskId,\n status: input.status,\n subject: input.subject,\n description: input.description,\n activeForm: input.activeForm,\n owner: input.owner,\n metadata: input.metadata,\n addBlocks: input.addBlocks,\n addBlockedBy: input.addBlockedBy,\n })\n\n if (!task) {\n yield {\n type: 'result',\n data: { error: 'Task not found' },\n resultForAssistant: `Error: Task with ID '${input.taskId}' not found`,\n }\n return\n }\n\n const result = {\n taskId: task.id,\n status: task.status,\n deleted: isDeleting,\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 updating task: ${errorMessage}`,\n }\n }\n },\n} satisfies Tool<\n typeof inputSchema,\n { taskId: string; status?: string; deleted?: boolean } | { error: string }\n>\n"],
5
+ "mappings": "AAAA,SAAS,KAAK,YAAY;AAC1B,YAAY,WAAW;AACvB,SAAS,SAAS;AAClB,SAAS,sCAAsC;AAE/C,SAAS,YAAY,mBAAmB;AACxC,SAAS,aAAa,cAAc;AACpC,SAAS,gBAAgB;AAEzB,MAAM,cAAc,EAAE,aAAa;AAAA,EACjC,QAAQ,EAAE,OAAO,EAAE,SAAS,8BAA8B;AAAA,EAC1D,QAAQ,EACL,KAAK,CAAC,WAAW,eAAe,aAAa,SAAS,CAAC,EACvD,SAAS,EACT,SAAS,yBAAyB;AAAA,EACrC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,EAClE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,8BAA8B;AAAA,EAC1E,YAAY,EACT,OAAO,EACP,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EACF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wBAAwB;AAAA,EAC9D,UAAU,EACP,OAAO,EAAE,QAAQ,CAAC,EAClB,SAAS,EACT;AAAA,IACC;AAAA,EACF;AAAA,EACF,WAAW,EACR,MAAM,EAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,gCAAgC;AAAA,EAC5C,cAAc,EACX,MAAM,EAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,+BAA+B;AAC7C,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,QAAkB,CAAC,WAAW,MAAM,MAAM,EAAE;AAClD,QAAI,MAAM,QAAQ;AAChB,YAAM,KAAK,WAAW,MAAM,MAAM,EAAE;AAAA,IACtC;AACA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EACA,+BAA+B;AAC7B,WAAO,oCAAC,oCAA+B;AAAA,EACzC;AAAA,EACA,wBAAwB,QAIrB;AACD,QAAI,CAAC,UAAU,CAAC,OAAO,QAAQ;AAC7B,aACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,YAAK,qBAAoB,GAC1B,oCAAC,YAAK,cAAY,CACpB;AAAA,IAEJ;AAEA,QAAI,OAAO,SAAS;AAClB,aACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,YAAK,qBAAoB,GAC1B,oCAAC,QAAK,OAAO,SAAS,EAAE,iBAAe,UAC9B,OAAO,QAAO,UACvB,CACF;AAAA,IAEJ;AAEA,UAAM,cACJ,OAAO,WAAW,cACd,SAAS,EAAE,UACX,OAAO,WAAW,gBAChB,SAAS,EAAE,UACX,SAAS,EAAE;AAEnB,WACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,YAAK,qBAAoB,GAC1B,oCAAC,YAAK,kBACW,OAAO,QACrB,OAAO,UAAU,oCAAC,QAAK,OAAO,eAAa,YAAI,OAAO,MAAO,CAChE,CACF;AAAA,EAEJ;AAAA,EACA,yBAAyB,QAItB;AACD,QAAI,OAAO,SAAS;AAClB,aAAO,SAAS,OAAO,MAAM;AAAA,IAC/B;AACA,WAAO,iBAAiB,OAAO,MAAM,GAAG,OAAO,SAAS,YAAY,EAAE;AAAA,EACxE;AAAA,EACA,MAAM,cAAc,EAAE,OAAO,GAAgC;AAC3D,QAAI,CAAC,QAAQ,KAAK,GAAG;AACnB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AAEA,UAAM,OAAO,YAAY,MAAM;AAC/B,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS,iBAAiB,MAAM;AAAA,MAClC;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,KAAK;AAAA,EACxB;AAAA,EACA,OAAO,KAAK,OAAoC;AAC9C,QAAI;AACF,YAAM,aAAa,MAAM,WAAW;AAEpC,YAAM,OAAO,WAAW;AAAA,QACtB,QAAQ,MAAM;AAAA,QACd,QAAQ,MAAM;AAAA,QACd,SAAS,MAAM;AAAA,QACf,aAAa,MAAM;AAAA,QACnB,YAAY,MAAM;AAAA,QAClB,OAAO,MAAM;AAAA,QACb,UAAU,MAAM;AAAA,QAChB,WAAW,MAAM;AAAA,QACjB,cAAc,MAAM;AAAA,MACtB,CAAC;AAED,UAAI,CAAC,MAAM;AACT,cAAM;AAAA,UACJ,MAAM;AAAA,UACN,MAAM,EAAE,OAAO,iBAAiB;AAAA,UAChC,oBAAoB,wBAAwB,MAAM,MAAM;AAAA,QAC1D;AACA;AAAA,MACF;AAEA,YAAM,SAAS;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,QAAQ,KAAK;AAAA,QACb,SAAS;AAAA,MACX;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,81 @@
1
+ const PROMPT = `Use this tool to update a task in the task list.
2
+
3
+ ## When to Use This Tool
4
+
5
+ **Mark tasks as resolved:**
6
+ - When you have completed the work described in a task
7
+ - When a task is no longer needed or has been superseded
8
+ - IMPORTANT: Always mark your assigned tasks as resolved when you finish them
9
+ - After resolving, call TaskList to find your next task
10
+
11
+ - ONLY mark a task as completed when you have FULLY accomplished it
12
+ - If you encounter errors, blockers, or cannot finish, keep the task as in_progress
13
+ - When blocked, create a new task describing what needs to be resolved
14
+ - Never mark a task as completed if:
15
+ - Tests are failing
16
+ - Implementation is partial
17
+ - You encountered unresolved errors
18
+ - You couldn't find necessary files or dependencies
19
+
20
+ **Delete tasks:**
21
+ - When a task is no longer relevant or was created in error
22
+ - Setting status to \`deleted\` permanently removes the task
23
+
24
+ **Update task details:**
25
+ - When requirements change or become clearer
26
+ - When establishing dependencies between tasks
27
+
28
+ ## Fields You Can Update
29
+
30
+ - **status**: The task status (see Status Workflow below)
31
+ - **subject**: Change the task title (imperative form, e.g., "Run tests")
32
+ - **description**: Change the task description
33
+ - **activeForm**: Present continuous form shown in spinner when in_progress (e.g., "Running tests")
34
+ - **owner**: Change the task owner (agent name)
35
+ - **metadata**: Merge metadata keys into the task (set a key to null to delete it)
36
+ - **addBlocks**: Mark tasks that cannot start until this one completes
37
+ - **addBlockedBy**: Mark tasks that must complete before this one can start
38
+
39
+ ## Status Workflow
40
+
41
+ Status progresses: \`pending\` \u2192 \`in_progress\` \u2192 \`completed\`
42
+
43
+ Use \`deleted\` to permanently remove a task.
44
+
45
+ ## Staleness
46
+
47
+ Make sure to read a task's latest state using \`TaskGet\` before updating it.
48
+
49
+ ## Examples
50
+
51
+ Mark task as in progress when starting work:
52
+ \`\`\`json
53
+ {"taskId": "1", "status": "in_progress"}
54
+ \`\`\`
55
+
56
+ Mark task as completed after finishing work:
57
+ \`\`\`json
58
+ {"taskId": "1", "status": "completed"}
59
+ \`\`\`
60
+
61
+ Delete a task:
62
+ \`\`\`json
63
+ {"taskId": "1", "status": "deleted"}
64
+ \`\`\`
65
+
66
+ Claim a task by setting owner:
67
+ \`\`\`json
68
+ {"taskId": "1", "owner": "my-name"}
69
+ \`\`\`
70
+
71
+ Set up task dependencies:
72
+ \`\`\`json
73
+ {"taskId": "2", "addBlockedBy": ["1"]}
74
+ \`\`\`
75
+ `;
76
+ const DESCRIPTION = "Update a task status, details, or dependencies";
77
+ export {
78
+ DESCRIPTION,
79
+ PROMPT
80
+ };
81
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/tools/TaskUpdateTool/prompt.ts"],
4
+ "sourcesContent": ["export const PROMPT = `Use this tool to update a task in the task list.\n\n## When to Use This Tool\n\n**Mark tasks as resolved:**\n- When you have completed the work described in a task\n- When a task is no longer needed or has been superseded\n- IMPORTANT: Always mark your assigned tasks as resolved when you finish them\n- After resolving, call TaskList to find your next task\n\n- ONLY mark a task as completed when you have FULLY accomplished it\n- If you encounter errors, blockers, or cannot finish, keep the task as in_progress\n- When blocked, create a new task describing what needs to be resolved\n- Never mark a task as completed if:\n - Tests are failing\n - Implementation is partial\n - You encountered unresolved errors\n - You couldn't find necessary files or dependencies\n\n**Delete tasks:**\n- When a task is no longer relevant or was created in error\n- Setting status to \\`deleted\\` permanently removes the task\n\n**Update task details:**\n- When requirements change or become clearer\n- When establishing dependencies between tasks\n\n## Fields You Can Update\n\n- **status**: The task status (see Status Workflow below)\n- **subject**: Change the task title (imperative form, e.g., \"Run tests\")\n- **description**: Change the task description\n- **activeForm**: Present continuous form shown in spinner when in_progress (e.g., \"Running tests\")\n- **owner**: Change the task owner (agent name)\n- **metadata**: Merge metadata keys into the task (set a key to null to delete it)\n- **addBlocks**: Mark tasks that cannot start until this one completes\n- **addBlockedBy**: Mark tasks that must complete before this one can start\n\n## Status Workflow\n\nStatus progresses: \\`pending\\` \u2192 \\`in_progress\\` \u2192 \\`completed\\`\n\nUse \\`deleted\\` to permanently remove a task.\n\n## Staleness\n\nMake sure to read a task's latest state using \\`TaskGet\\` before updating it.\n\n## Examples\n\nMark task as in progress when starting work:\n\\`\\`\\`json\n{\"taskId\": \"1\", \"status\": \"in_progress\"}\n\\`\\`\\`\n\nMark task as completed after finishing work:\n\\`\\`\\`json\n{\"taskId\": \"1\", \"status\": \"completed\"}\n\\`\\`\\`\n\nDelete a task:\n\\`\\`\\`json\n{\"taskId\": \"1\", \"status\": \"deleted\"}\n\\`\\`\\`\n\nClaim a task by setting owner:\n\\`\\`\\`json\n{\"taskId\": \"1\", \"owner\": \"my-name\"}\n\\`\\`\\`\n\nSet up task dependencies:\n\\`\\`\\`json\n{\"taskId\": \"2\", \"addBlockedBy\": [\"1\"]}\n\\`\\`\\`\n`\n\nexport const DESCRIPTION = 'Update a task status, details, or dependencies'\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;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;AA4Ef,MAAM,cAAc;",
6
+ "names": []
7
+ }
@@ -1,4 +1,4 @@
1
- const TOOL_NAME_FOR_PROMPT = "URLFetcher";
1
+ const TOOL_NAME_FOR_PROMPT = "WebFetch";
2
2
  const DESCRIPTION = `- Fetches content from a specified URL and processes it using an AI model
3
3
  - Takes a URL and a prompt as input
4
4
  - Fetches the URL content, converts HTML to markdown
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/tools/URLFetcherTool/prompt.ts"],
4
- "sourcesContent": ["export const TOOL_NAME_FOR_PROMPT = 'URLFetcher'\nexport const DESCRIPTION = `- Fetches content from a specified URL and processes it using an AI model\n- Takes a URL and a prompt as input\n- Fetches the URL content, converts HTML to markdown\n- Processes the content with the prompt using a small, fast model\n- Returns the model's response about the content\n- Use this tool when you need to retrieve and analyze web content\n\nUsage notes:\n- IMPORTANT: If an MCP-provided web fetch tool is available, prefer using that tool instead of this one, as it may have fewer restrictions. All MCP-provided tools start with \"mcp__\".\n- The URL must be a fully-formed valid URL (e.g., https://example.com)\n- HTTP URLs will be automatically upgraded to HTTPS\n- The prompt should describe what information you want to extract from the page\n- This tool is read-only and does not modify any files\n- Results may be summarized if the content is very large\n- Includes a self-cleaning 15-minute cache for faster responses when repeatedly accessing the same URL\n- When a URL redirects, the tool will inform you and provide the redirect URL in a special format. You should then make a new URLFetcher request with the redirect URL to fetch the content.`\n"],
4
+ "sourcesContent": ["export const TOOL_NAME_FOR_PROMPT = 'WebFetch'\nexport const DESCRIPTION = `- Fetches content from a specified URL and processes it using an AI model\n- Takes a URL and a prompt as input\n- Fetches the URL content, converts HTML to markdown\n- Processes the content with the prompt using a small, fast model\n- Returns the model's response about the content\n- Use this tool when you need to retrieve and analyze web content\n\nUsage notes:\n- IMPORTANT: If an MCP-provided web fetch tool is available, prefer using that tool instead of this one, as it may have fewer restrictions. All MCP-provided tools start with \"mcp__\".\n- The URL must be a fully-formed valid URL (e.g., https://example.com)\n- HTTP URLs will be automatically upgraded to HTTPS\n- The prompt should describe what information you want to extract from the page\n- This tool is read-only and does not modify any files\n- Results may be summarized if the content is very large\n- Includes a self-cleaning 15-minute cache for faster responses when repeatedly accessing the same URL\n- When a URL redirects, the tool will inform you and provide the redirect URL in a special format. You should then make a new URLFetcher request with the redirect URL to fetch the content.`\n"],
5
5
  "mappings": "AAAO,MAAM,uBAAuB;AAC7B,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
6
6
  "names": []
7
7
  }
package/dist/tools.js CHANGED
@@ -20,12 +20,17 @@ import { NotebookReadTool } from "./tools/NotebookReadTool/NotebookReadTool.js";
20
20
  import { SkillTool } from "./tools/SkillTool/SkillTool.js";
21
21
  import { ThinkTool } from "./tools/ThinkTool/ThinkTool.js";
22
22
  import { TodoWriteTool } from "./tools/TodoWriteTool/TodoWriteTool.js";
23
+ import { TaskCreateTool } from "./tools/TaskCreateTool/TaskCreateTool.js";
24
+ import { TaskUpdateTool } from "./tools/TaskUpdateTool/TaskUpdateTool.js";
25
+ import { TaskGetTool } from "./tools/TaskGetTool/TaskGetTool.js";
26
+ import { TaskListTool } from "./tools/TaskListTool/TaskListTool.js";
23
27
  import { WebSearchTool } from "./tools/WebSearchTool/WebSearchTool.js";
24
28
  import { URLFetcherTool } from "./tools/URLFetcherTool/URLFetcherTool.js";
25
29
  import { LspTool } from "./tools/LspTool/LspTool.js";
26
30
  import { EnterPlanModeTool } from "./tools/PlanModeTool/EnterPlanModeTool.js";
27
31
  import { ExitPlanModeTool } from "./tools/PlanModeTool/ExitPlanModeTool.js";
28
32
  import { TaskOutputTool } from "./tools/TaskOutputTool/TaskOutputTool.js";
33
+ import { TaskStopTool } from "./tools/TaskStopTool/TaskStopTool.js";
29
34
  import { SlashCommandTool } from "./tools/SlashCommandTool/SlashCommandTool.js";
30
35
  import { ListMcpResourcesTool } from "./tools/ListMcpResourcesTool/ListMcpResourcesTool.js";
31
36
  import { ReadMcpResourceTool } from "./tools/ReadMcpResourceTool/ReadMcpResourceTool.js";
@@ -54,6 +59,12 @@ const getAllTools = () => {
54
59
  NotebookEditTool,
55
60
  SkillTool,
56
61
  ThinkTool,
62
+ // Claude Code compatible task management tools
63
+ TaskCreateTool,
64
+ TaskUpdateTool,
65
+ TaskGetTool,
66
+ TaskListTool,
67
+ // Legacy TodoWrite (kept for backward compatibility, may be deprecated)
57
68
  TodoWriteTool,
58
69
  WebSearchTool,
59
70
  URLFetcherTool,
@@ -62,6 +73,7 @@ const getAllTools = () => {
62
73
  EnterPlanModeTool,
63
74
  ExitPlanModeTool,
64
75
  TaskOutputTool,
76
+ TaskStopTool,
65
77
  SlashCommandTool,
66
78
  // Phase 3: MCP Resource tools
67
79
  ListMcpResourcesTool,
package/dist/tools.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/tools.ts"],
4
- "sourcesContent": ["import { Tool, cacheToolDescriptions } from './Tool'\nimport { TaskTool } from './tools/TaskTool/TaskTool'\nimport { ArchitectTool } from './tools/ArchitectTool/ArchitectTool'\nimport { BashTool } from './tools/BashTool/BashTool'\nimport { BashOutputTool } from './tools/BashOutputTool/BashOutputTool'\nimport { KillShellTool } from './tools/KillShellTool/KillShellTool'\nimport { AskExpertModelTool } from './tools/AskExpertModelTool/AskExpertModelTool'\nimport { AskUserQuestionTool } from './tools/AskUserQuestionTool/AskUserQuestionTool'\nimport { FileEditTool } from './tools/FileEditTool/FileEditTool'\nimport { FileReadTool } from './tools/FileReadTool/FileReadTool'\nimport { FileWriteTool } from './tools/FileWriteTool/FileWriteTool'\nimport { GlobTool } from './tools/GlobTool/GlobTool'\nimport { GrepTool } from './tools/GrepTool/GrepTool'\nimport { LSTool } from './tools/lsTool/lsTool'\nimport { MemoryReadTool } from './tools/MemoryReadTool/MemoryReadTool'\nimport { MemoryWriteTool } from './tools/MemoryWriteTool/MemoryWriteTool'\nimport { MultiEditTool } from './tools/MultiEditTool/MultiEditTool'\nimport { NotebookEditTool } from './tools/NotebookEditTool/NotebookEditTool'\nimport { NotebookReadTool } from './tools/NotebookReadTool/NotebookReadTool'\nimport { SkillTool } from './tools/SkillTool/SkillTool'\nimport { ThinkTool } from './tools/ThinkTool/ThinkTool'\nimport { TodoWriteTool } from './tools/TodoWriteTool/TodoWriteTool'\nimport { WebSearchTool } from './tools/WebSearchTool/WebSearchTool'\nimport { URLFetcherTool } from './tools/URLFetcherTool/URLFetcherTool'\n// Phase 4: New tools for Claude Code CLI compatibility\nimport { LspTool } from './tools/LspTool/LspTool'\nimport { EnterPlanModeTool } from './tools/PlanModeTool/EnterPlanModeTool'\nimport { ExitPlanModeTool } from './tools/PlanModeTool/ExitPlanModeTool'\nimport { TaskOutputTool } from './tools/TaskOutputTool/TaskOutputTool'\nimport { SlashCommandTool } from './tools/SlashCommandTool/SlashCommandTool'\n// Phase 3: MCP Resource tools\nimport { ListMcpResourcesTool } from './tools/ListMcpResourcesTool/ListMcpResourcesTool'\nimport { ReadMcpResourceTool } from './tools/ReadMcpResourceTool/ReadMcpResourceTool'\nimport { getMCPTools } from './services/mcpClient'\nimport { memoize } from 'lodash-es'\n\nconst ANT_ONLY_TOOLS = [\n MemoryReadTool as unknown as Tool,\n MemoryWriteTool as unknown as Tool,\n]\n\n// Function to avoid circular dependencies that break bun\nexport const getAllTools = (): Tool[] => {\n return [\n TaskTool as unknown as Tool,\n AskExpertModelTool as unknown as Tool,\n AskUserQuestionTool as unknown as Tool,\n BashTool as unknown as Tool,\n BashOutputTool as unknown as Tool,\n KillShellTool as unknown as Tool,\n GlobTool as unknown as Tool,\n GrepTool as unknown as Tool,\n LSTool as unknown as Tool,\n FileReadTool as unknown as Tool,\n FileEditTool as unknown as Tool,\n MultiEditTool as unknown as Tool,\n FileWriteTool as unknown as Tool,\n NotebookReadTool as unknown as Tool,\n NotebookEditTool as unknown as Tool,\n SkillTool as unknown as Tool,\n ThinkTool as unknown as Tool,\n TodoWriteTool as unknown as Tool,\n WebSearchTool as unknown as Tool,\n URLFetcherTool as unknown as Tool,\n // Phase 4: Code intelligence and plan mode tools\n LspTool as unknown as Tool,\n EnterPlanModeTool as unknown as Tool,\n ExitPlanModeTool as unknown as Tool,\n TaskOutputTool as unknown as Tool,\n SlashCommandTool as unknown as Tool,\n // Phase 3: MCP Resource tools\n ListMcpResourcesTool as unknown as Tool,\n ReadMcpResourceTool as unknown as Tool,\n ...ANT_ONLY_TOOLS,\n ]\n}\n\nexport const getTools = memoize(\n async (enableArchitect?: boolean): Promise<Tool[]> => {\n const tools = [...getAllTools(), ...(await getMCPTools())]\n\n // Only include Architect tool if enabled via config or CLI flag\n if (enableArchitect) {\n tools.push(ArchitectTool as unknown as Tool)\n }\n\n const isEnabled = await Promise.all(tools.map(tool => tool.isEnabled()))\n const enabledTools = tools.filter((_, i) => isEnabled[i])\n\n // Cache tool descriptions for synchronous access in adapters\n await cacheToolDescriptions(enabledTools)\n\n return enabledTools\n },\n)\n\nexport const getReadOnlyTools = memoize(async (): Promise<Tool[]> => {\n const tools = getAllTools().filter(tool => tool.isReadOnly())\n const isEnabled = await Promise.all(tools.map(tool => tool.isEnabled()))\n return tools.filter((_, index) => isEnabled[index])\n})\n\n/**\n * Invalidate the tools cache to force refresh\n * This should be called when:\n * - MCP servers are connected/disconnected\n * - Tool configuration changes\n * - Plugin tools are added/removed\n */\nexport function invalidateToolsCache(): void {\n getTools.cache.clear?.()\n getReadOnlyTools.cache.clear?.()\n}\n\n/**\n * Reload tools with fresh data\n * Convenience function that invalidates cache and returns new tools\n */\nexport async function reloadTools(enableArchitect?: boolean): Promise<Tool[]> {\n invalidateToolsCache()\n return getTools(enableArchitect)\n}\n"],
5
- "mappings": "AAAA,SAAe,6BAA6B;AAC5C,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,qBAAqB;AAC9B,SAAS,0BAA0B;AACnC,SAAS,2BAA2B;AACpC,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,SAAS,sBAAsB;AAC/B,SAAS,uBAAuB;AAChC,SAAS,qBAAqB;AAC9B,SAAS,wBAAwB;AACjC,SAAS,wBAAwB;AACjC,SAAS,iBAAiB;AAC1B,SAAS,iBAAiB;AAC1B,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB;AAE/B,SAAS,eAAe;AACxB,SAAS,yBAAyB;AAClC,SAAS,wBAAwB;AACjC,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AAEjC,SAAS,4BAA4B;AACrC,SAAS,2BAA2B;AACpC,SAAS,mBAAmB;AAC5B,SAAS,eAAe;AAExB,MAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AACF;AAGO,MAAM,cAAc,MAAc;AACvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL;AACF;AAEO,MAAM,WAAW;AAAA,EACtB,OAAO,oBAA+C;AACpD,UAAM,QAAQ,CAAC,GAAG,YAAY,GAAG,GAAI,MAAM,YAAY,CAAE;AAGzD,QAAI,iBAAiB;AACnB,YAAM,KAAK,aAAgC;AAAA,IAC7C;AAEA,UAAM,YAAY,MAAM,QAAQ,IAAI,MAAM,IAAI,UAAQ,KAAK,UAAU,CAAC,CAAC;AACvE,UAAM,eAAe,MAAM,OAAO,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC;AAGxD,UAAM,sBAAsB,YAAY;AAExC,WAAO;AAAA,EACT;AACF;AAEO,MAAM,mBAAmB,QAAQ,YAA6B;AACnE,QAAM,QAAQ,YAAY,EAAE,OAAO,UAAQ,KAAK,WAAW,CAAC;AAC5D,QAAM,YAAY,MAAM,QAAQ,IAAI,MAAM,IAAI,UAAQ,KAAK,UAAU,CAAC,CAAC;AACvE,SAAO,MAAM,OAAO,CAAC,GAAG,UAAU,UAAU,KAAK,CAAC;AACpD,CAAC;AASM,SAAS,uBAA6B;AAC3C,WAAS,MAAM,QAAQ;AACvB,mBAAiB,MAAM,QAAQ;AACjC;AAMA,eAAsB,YAAY,iBAA4C;AAC5E,uBAAqB;AACrB,SAAO,SAAS,eAAe;AACjC;",
4
+ "sourcesContent": ["import { Tool, cacheToolDescriptions } from './Tool'\nimport { TaskTool } from './tools/TaskTool/TaskTool'\nimport { ArchitectTool } from './tools/ArchitectTool/ArchitectTool'\nimport { BashTool } from './tools/BashTool/BashTool'\nimport { BashOutputTool } from './tools/BashOutputTool/BashOutputTool'\nimport { KillShellTool } from './tools/KillShellTool/KillShellTool'\nimport { AskExpertModelTool } from './tools/AskExpertModelTool/AskExpertModelTool'\nimport { AskUserQuestionTool } from './tools/AskUserQuestionTool/AskUserQuestionTool'\nimport { FileEditTool } from './tools/FileEditTool/FileEditTool'\nimport { FileReadTool } from './tools/FileReadTool/FileReadTool'\nimport { FileWriteTool } from './tools/FileWriteTool/FileWriteTool'\nimport { GlobTool } from './tools/GlobTool/GlobTool'\nimport { GrepTool } from './tools/GrepTool/GrepTool'\nimport { LSTool } from './tools/lsTool/lsTool'\nimport { MemoryReadTool } from './tools/MemoryReadTool/MemoryReadTool'\nimport { MemoryWriteTool } from './tools/MemoryWriteTool/MemoryWriteTool'\nimport { MultiEditTool } from './tools/MultiEditTool/MultiEditTool'\nimport { NotebookEditTool } from './tools/NotebookEditTool/NotebookEditTool'\nimport { NotebookReadTool } from './tools/NotebookReadTool/NotebookReadTool'\nimport { SkillTool } from './tools/SkillTool/SkillTool'\nimport { ThinkTool } from './tools/ThinkTool/ThinkTool'\nimport { TodoWriteTool } from './tools/TodoWriteTool/TodoWriteTool'\n// Claude Code compatible task management tools\nimport { TaskCreateTool } from './tools/TaskCreateTool/TaskCreateTool'\nimport { TaskUpdateTool } from './tools/TaskUpdateTool/TaskUpdateTool'\nimport { TaskGetTool } from './tools/TaskGetTool/TaskGetTool'\nimport { TaskListTool } from './tools/TaskListTool/TaskListTool'\nimport { WebSearchTool } from './tools/WebSearchTool/WebSearchTool'\nimport { URLFetcherTool } from './tools/URLFetcherTool/URLFetcherTool'\n// Phase 4: New tools for Claude Code CLI compatibility\nimport { LspTool } from './tools/LspTool/LspTool'\nimport { EnterPlanModeTool } from './tools/PlanModeTool/EnterPlanModeTool'\nimport { ExitPlanModeTool } from './tools/PlanModeTool/ExitPlanModeTool'\nimport { TaskOutputTool } from './tools/TaskOutputTool/TaskOutputTool'\nimport { TaskStopTool } from './tools/TaskStopTool/TaskStopTool'\nimport { SlashCommandTool } from './tools/SlashCommandTool/SlashCommandTool'\n// Phase 3: MCP Resource tools\nimport { ListMcpResourcesTool } from './tools/ListMcpResourcesTool/ListMcpResourcesTool'\nimport { ReadMcpResourceTool } from './tools/ReadMcpResourceTool/ReadMcpResourceTool'\nimport { getMCPTools } from './services/mcpClient'\nimport { memoize } from 'lodash-es'\n\nconst ANT_ONLY_TOOLS = [\n MemoryReadTool as unknown as Tool,\n MemoryWriteTool as unknown as Tool,\n]\n\n// Function to avoid circular dependencies that break bun\nexport const getAllTools = (): Tool[] => {\n return [\n TaskTool as unknown as Tool,\n AskExpertModelTool as unknown as Tool,\n AskUserQuestionTool as unknown as Tool,\n BashTool as unknown as Tool,\n BashOutputTool as unknown as Tool,\n KillShellTool as unknown as Tool,\n GlobTool as unknown as Tool,\n GrepTool as unknown as Tool,\n LSTool as unknown as Tool,\n FileReadTool as unknown as Tool,\n FileEditTool as unknown as Tool,\n MultiEditTool as unknown as Tool,\n FileWriteTool as unknown as Tool,\n NotebookReadTool as unknown as Tool,\n NotebookEditTool as unknown as Tool,\n SkillTool as unknown as Tool,\n ThinkTool as unknown as Tool,\n // Claude Code compatible task management tools\n TaskCreateTool as unknown as Tool,\n TaskUpdateTool as unknown as Tool,\n TaskGetTool as unknown as Tool,\n TaskListTool as unknown as Tool,\n // Legacy TodoWrite (kept for backward compatibility, may be deprecated)\n TodoWriteTool as unknown as Tool,\n WebSearchTool as unknown as Tool,\n URLFetcherTool as unknown as Tool,\n // Phase 4: Code intelligence and plan mode tools\n LspTool as unknown as Tool,\n EnterPlanModeTool as unknown as Tool,\n ExitPlanModeTool as unknown as Tool,\n TaskOutputTool as unknown as Tool,\n TaskStopTool as unknown as Tool,\n SlashCommandTool as unknown as Tool,\n // Phase 3: MCP Resource tools\n ListMcpResourcesTool as unknown as Tool,\n ReadMcpResourceTool as unknown as Tool,\n ...ANT_ONLY_TOOLS,\n ]\n}\n\nexport const getTools = memoize(\n async (enableArchitect?: boolean): Promise<Tool[]> => {\n const tools = [...getAllTools(), ...(await getMCPTools())]\n\n // Only include Architect tool if enabled via config or CLI flag\n if (enableArchitect) {\n tools.push(ArchitectTool as unknown as Tool)\n }\n\n const isEnabled = await Promise.all(tools.map(tool => tool.isEnabled()))\n const enabledTools = tools.filter((_, i) => isEnabled[i])\n\n // Cache tool descriptions for synchronous access in adapters\n await cacheToolDescriptions(enabledTools)\n\n return enabledTools\n },\n)\n\nexport const getReadOnlyTools = memoize(async (): Promise<Tool[]> => {\n const tools = getAllTools().filter(tool => tool.isReadOnly())\n const isEnabled = await Promise.all(tools.map(tool => tool.isEnabled()))\n return tools.filter((_, index) => isEnabled[index])\n})\n\n/**\n * Invalidate the tools cache to force refresh\n * This should be called when:\n * - MCP servers are connected/disconnected\n * - Tool configuration changes\n * - Plugin tools are added/removed\n */\nexport function invalidateToolsCache(): void {\n getTools.cache.clear?.()\n getReadOnlyTools.cache.clear?.()\n}\n\n/**\n * Reload tools with fresh data\n * Convenience function that invalidates cache and returns new tools\n */\nexport async function reloadTools(enableArchitect?: boolean): Promise<Tool[]> {\n invalidateToolsCache()\n return getTools(enableArchitect)\n}\n"],
5
+ "mappings": "AAAA,SAAe,6BAA6B;AAC5C,SAAS,gBAAgB;AACzB,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,qBAAqB;AAC9B,SAAS,0BAA0B;AACnC,SAAS,2BAA2B;AACpC,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,SAAS,sBAAsB;AAC/B,SAAS,uBAAuB;AAChC,SAAS,qBAAqB;AAC9B,SAAS,wBAAwB;AACjC,SAAS,wBAAwB;AACjC,SAAS,iBAAiB;AAC1B,SAAS,iBAAiB;AAC1B,SAAS,qBAAqB;AAE9B,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;AAC/B,SAAS,mBAAmB;AAC5B,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB;AAE/B,SAAS,eAAe;AACxB,SAAS,yBAAyB;AAClC,SAAS,wBAAwB;AACjC,SAAS,sBAAsB;AAC/B,SAAS,oBAAoB;AAC7B,SAAS,wBAAwB;AAEjC,SAAS,4BAA4B;AACrC,SAAS,2BAA2B;AACpC,SAAS,mBAAmB;AAC5B,SAAS,eAAe;AAExB,MAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AACF;AAGO,MAAM,cAAc,MAAc;AACvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL;AACF;AAEO,MAAM,WAAW;AAAA,EACtB,OAAO,oBAA+C;AACpD,UAAM,QAAQ,CAAC,GAAG,YAAY,GAAG,GAAI,MAAM,YAAY,CAAE;AAGzD,QAAI,iBAAiB;AACnB,YAAM,KAAK,aAAgC;AAAA,IAC7C;AAEA,UAAM,YAAY,MAAM,QAAQ,IAAI,MAAM,IAAI,UAAQ,KAAK,UAAU,CAAC,CAAC;AACvE,UAAM,eAAe,MAAM,OAAO,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC;AAGxD,UAAM,sBAAsB,YAAY;AAExC,WAAO;AAAA,EACT;AACF;AAEO,MAAM,mBAAmB,QAAQ,YAA6B;AACnE,QAAM,QAAQ,YAAY,EAAE,OAAO,UAAQ,KAAK,WAAW,CAAC;AAC5D,QAAM,YAAY,MAAM,QAAQ,IAAI,MAAM,IAAI,UAAQ,KAAK,UAAU,CAAC,CAAC;AACvE,SAAO,MAAM,OAAO,CAAC,GAAG,UAAU,UAAU,KAAK,CAAC;AACpD,CAAC;AASM,SAAS,uBAA6B;AAC3C,WAAS,MAAM,QAAQ;AACvB,mBAAiB,MAAM,QAAQ;AACjC;AAMA,eAAsB,YAAY,iBAA4C;AAC5E,uBAAqB;AACrB,SAAO,SAAS,eAAe;AACjC;",
6
6
  "names": []
7
7
  }