@within-7/minto 0.4.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Tool.js +7 -0
- package/dist/Tool.js.map +2 -2
- package/dist/commands/agents/AgentsCommand.js +1 -1
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/agents/constants.js +2 -2
- package/dist/commands/agents/constants.js.map +2 -2
- package/dist/commands/clear.js +4 -3
- package/dist/commands/clear.js.map +2 -2
- package/dist/commands/compact.js +2 -2
- package/dist/commands/compact.js.map +1 -1
- package/dist/commands/context.js +3 -1
- package/dist/commands/context.js.map +2 -2
- package/dist/commands/login.js +128 -0
- package/dist/commands/login.js.map +7 -0
- package/dist/commands/memory.js +33 -82
- package/dist/commands/memory.js.map +2 -2
- package/dist/commands/quit.js +3 -1
- package/dist/commands/quit.js.map +2 -2
- package/dist/commands/resume.js +39 -239
- package/dist/commands/resume.js.map +2 -2
- package/dist/commands/tasks.js +1 -1
- package/dist/commands/tasks.js.map +2 -2
- package/dist/commands/terminalSetup.js +6 -2
- package/dist/commands/terminalSetup.js.map +2 -2
- package/dist/commands.js +2 -0
- package/dist/commands.js.map +2 -2
- package/dist/components/AgentDetailView.js +126 -0
- package/dist/components/AgentDetailView.js.map +7 -0
- package/dist/components/AgentThinkingBlock.js +1 -1
- package/dist/components/AgentThinkingBlock.js.map +2 -2
- package/dist/components/AgentViewBanner.js +22 -0
- package/dist/components/AgentViewBanner.js.map +7 -0
- package/dist/components/HeaderBar.js +1 -1
- package/dist/components/HeaderBar.js.map +2 -2
- package/dist/components/Help.js +8 -1
- package/dist/components/Help.js.map +2 -2
- package/dist/components/HotkeyHelpPanel.js +26 -8
- package/dist/components/HotkeyHelpPanel.js.map +2 -2
- package/dist/components/IdleNotificationBar.js +10 -0
- package/dist/components/IdleNotificationBar.js.map +7 -0
- package/dist/components/ModelSelector/ModelSelector.js +55 -20
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/PromptInput.js +186 -115
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/RewindPanel.js +272 -0
- package/dist/components/RewindPanel.js.map +7 -0
- package/dist/components/Spinner.js +10 -21
- package/dist/components/Spinner.js.map +2 -2
- package/dist/components/StreamingTextPreview.js +29 -0
- package/dist/components/StreamingTextPreview.js.map +7 -0
- package/dist/components/SubagentBlock.js +3 -2
- package/dist/components/SubagentBlock.js.map +2 -2
- package/dist/components/SubagentProgress.js +4 -4
- package/dist/components/SubagentProgress.js.map +2 -2
- package/dist/components/TabbedListView/SearchInput.js +1 -1
- package/dist/components/TabbedListView/SearchInput.js.map +2 -2
- package/dist/components/TabbedListView/TabbedListView.js +87 -41
- package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
- package/dist/components/TaskCard.js +4 -4
- package/dist/components/TaskCard.js.map +2 -2
- package/dist/components/TeamMemberPanel.js +107 -0
- package/dist/components/TeamMemberPanel.js.map +7 -0
- package/dist/components/ThinkingSelector.js +84 -0
- package/dist/components/ThinkingSelector.js.map +7 -0
- package/dist/components/TitledDivider.js +26 -0
- package/dist/components/TitledDivider.js.map +7 -0
- package/dist/components/TodoPanel.js +31 -30
- package/dist/components/TodoPanel.js.map +2 -2
- package/dist/components/TokenWarning.js +28 -7
- package/dist/components/TokenWarning.js.map +2 -2
- package/dist/components/messages/AssistantTextMessage.js +5 -2
- package/dist/components/messages/AssistantTextMessage.js.map +2 -2
- package/dist/components/messages/AssistantToolUseMessage.js +9 -1
- package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
- package/dist/components/messages/DefaultToolResultFallback.js +11 -0
- package/dist/components/messages/DefaultToolResultFallback.js.map +7 -0
- package/dist/components/messages/ParallelTasksGroupView.js +14 -6
- package/dist/components/messages/ParallelTasksGroupView.js.map +2 -2
- package/dist/components/messages/TaskInModuleView.js +27 -27
- package/dist/components/messages/TaskInModuleView.js.map +2 -2
- package/dist/components/messages/UserGuidanceMessage.js +26 -0
- package/dist/components/messages/UserGuidanceMessage.js.map +7 -0
- package/dist/components/messages/UserPromptMessage.js +2 -1
- package/dist/components/messages/UserPromptMessage.js.map +2 -2
- package/dist/components/messages/UserTeamNotificationMessage.js +91 -0
- package/dist/components/messages/UserTeamNotificationMessage.js.map +7 -0
- package/dist/components/messages/UserTextMessage.js +8 -0
- package/dist/components/messages/UserTextMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js +4 -2
- package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js +18 -1
- package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +12 -1
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
- package/dist/components/permissions/PermissionRequest.js +4 -0
- package/dist/components/permissions/PermissionRequest.js.map +2 -2
- package/dist/components/permissions/PlanApprovalRequest.js +164 -0
- package/dist/components/permissions/PlanApprovalRequest.js.map +7 -0
- package/dist/constants/agentTeams.js +17 -0
- package/dist/constants/agentTeams.js.map +7 -0
- package/dist/constants/macros.js +2 -1
- package/dist/constants/macros.js.map +2 -2
- package/dist/constants/prompts/agentPrompt.js +1 -0
- package/dist/constants/prompts/agentPrompt.js.map +2 -2
- package/dist/constants/prompts/autoMemory.js +39 -0
- package/dist/constants/prompts/autoMemory.js.map +7 -0
- package/dist/constants/prompts/codeConventions.js +1 -13
- package/dist/constants/prompts/codeConventions.js.map +2 -2
- package/dist/constants/prompts/doingTasks.js +21 -2
- package/dist/constants/prompts/doingTasks.js.map +2 -2
- package/dist/constants/prompts/envInfo.js +6 -7
- package/dist/constants/prompts/envInfo.js.map +2 -2
- package/dist/constants/prompts/index.js +27 -5
- package/dist/constants/prompts/index.js.map +2 -2
- package/dist/constants/prompts/taskManagement.js +2 -43
- package/dist/constants/prompts/taskManagement.js.map +2 -2
- package/dist/constants/prompts/teamOverlays.js +50 -0
- package/dist/constants/prompts/teamOverlays.js.map +7 -0
- package/dist/constants/prompts/toneAndStyle.js +4 -29
- package/dist/constants/prompts/toneAndStyle.js.map +2 -2
- package/dist/constants/prompts/toolUsagePolicy.js +7 -22
- package/dist/constants/prompts/toolUsagePolicy.js.map +2 -2
- package/dist/constants/toolInputExamples.js +2 -2
- package/dist/constants/toolInputExamples.js.map +2 -2
- package/dist/context.js +39 -6
- package/dist/context.js.map +2 -2
- package/dist/core/backupManager.js +1 -1
- package/dist/core/backupManager.js.map +2 -2
- package/dist/core/permissions/rules/planModeRule.js +1 -1
- package/dist/core/permissions/rules/planModeRule.js.map +1 -1
- package/dist/core/permissions/rules/safeModeRule.js +1 -1
- package/dist/core/permissions/rules/safeModeRule.js.map +1 -1
- package/dist/engine/AgentEngine.js +902 -0
- package/dist/engine/AgentEngine.js.map +7 -0
- package/dist/engine/EngineRegistry.js +89 -0
- package/dist/engine/EngineRegistry.js.map +7 -0
- package/dist/engine/foregroundAdapter.js +191 -0
- package/dist/engine/foregroundAdapter.js.map +7 -0
- package/dist/engine/index.js +15 -0
- package/dist/engine/index.js.map +7 -0
- package/dist/engine/types.js +1 -0
- package/dist/engine/types.js.map +7 -0
- package/dist/entrypoints/cli.js +410 -79
- package/dist/entrypoints/cli.js.map +3 -3
- package/dist/hooks/useAgentEngine.js +129 -0
- package/dist/hooks/useAgentEngine.js.map +7 -0
- package/dist/hooks/useAgentTokenStats.js +0 -16
- package/dist/hooks/useAgentTokenStats.js.map +2 -2
- package/dist/hooks/useCanUseTool.js +47 -2
- package/dist/hooks/useCanUseTool.js.map +2 -2
- package/dist/hooks/useDeferredLoading.js +4 -1
- package/dist/hooks/useDeferredLoading.js.map +2 -2
- package/dist/hooks/useIdleNotifications.js +66 -0
- package/dist/hooks/useIdleNotifications.js.map +7 -0
- package/dist/hooks/useSessionTracking.js +9 -7
- package/dist/hooks/useSessionTracking.js.map +2 -2
- package/dist/hooks/useTeamMembers.js +51 -0
- package/dist/hooks/useTeamMembers.js.map +7 -0
- package/dist/i18n/locales/en.js +77 -12
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.js +77 -12
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/i18n/types.js.map +1 -1
- package/dist/messages.js.map +2 -2
- package/dist/permissions.js +113 -7
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +135 -37
- package/dist/query.js.map +2 -2
- package/dist/screens/REPL.js +504 -361
- package/dist/screens/REPL.js.map +3 -3
- package/dist/screens/ResumeConversation.js +199 -14
- package/dist/screens/ResumeConversation.js.map +2 -2
- package/dist/services/adapters/base.js.map +1 -1
- package/dist/services/agentTeams/backends/headless.js +108 -0
- package/dist/services/agentTeams/backends/headless.js.map +7 -0
- package/dist/services/agentTeams/backends/inProcess.js +102 -0
- package/dist/services/agentTeams/backends/inProcess.js.map +7 -0
- package/dist/services/agentTeams/backends/resolver.js +18 -0
- package/dist/services/agentTeams/backends/resolver.js.map +7 -0
- package/dist/services/agentTeams/backends/tmux.js +168 -0
- package/dist/services/agentTeams/backends/tmux.js.map +7 -0
- package/dist/services/agentTeams/backends/types.js +1 -0
- package/dist/services/agentTeams/backends/types.js.map +7 -0
- package/dist/services/agentTeams/heartbeat.js +88 -0
- package/dist/services/agentTeams/heartbeat.js.map +7 -0
- package/dist/services/agentTeams/index.js +42 -2
- package/dist/services/agentTeams/index.js.map +2 -2
- package/dist/services/agentTeams/injectionChannel.js +105 -0
- package/dist/services/agentTeams/injectionChannel.js.map +7 -0
- package/dist/services/agentTeams/mailbox.js +410 -30
- package/dist/services/agentTeams/mailbox.js.map +2 -2
- package/dist/services/agentTeams/messageFormatter.js +80 -0
- package/dist/services/agentTeams/messageFormatter.js.map +7 -0
- package/dist/services/agentTeams/permissionDelegation.js +71 -0
- package/dist/services/agentTeams/permissionDelegation.js.map +7 -0
- package/dist/services/agentTeams/teamEvents.js +45 -0
- package/dist/services/agentTeams/teamEvents.js.map +7 -0
- package/dist/services/agentTeams/teamManager.js +251 -34
- package/dist/services/agentTeams/teamManager.js.map +2 -2
- package/dist/services/agentTeams/teamTaskStore.js +290 -61
- package/dist/services/agentTeams/teamTaskStore.js.map +2 -2
- package/dist/services/agentTeams/teammateSpawner.js +99 -18
- package/dist/services/agentTeams/teammateSpawner.js.map +2 -2
- package/dist/services/hookExecutor.js +51 -8
- package/dist/services/hookExecutor.js.map +2 -2
- package/dist/services/llm/anthropicProvider.js +56 -59
- package/dist/services/llm/anthropicProvider.js.map +2 -2
- package/dist/services/llm/dispatch.js +24 -5
- package/dist/services/llm/dispatch.js.map +2 -2
- package/dist/services/llm/openaiProvider.js +115 -136
- package/dist/services/llm/openaiProvider.js.map +3 -3
- package/dist/services/llm/types.js +89 -15
- package/dist/services/llm/types.js.map +2 -2
- package/dist/services/mcpClient.js +80 -4
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/mintoAuth.js +299 -0
- package/dist/services/mintoAuth.js.map +7 -0
- package/dist/services/oauth.js +3 -3
- package/dist/services/oauth.js.map +2 -2
- package/dist/services/openai.js +91 -20
- package/dist/services/openai.js.map +2 -2
- package/dist/services/plugins/pluginRuntime.js +11 -5
- package/dist/services/plugins/pluginRuntime.js.map +2 -2
- package/dist/services/plugins/pluginValidation.js +4 -2
- package/dist/services/plugins/pluginValidation.js.map +2 -2
- package/dist/services/sandbox/sandboxController.js +11 -3
- package/dist/services/sandbox/sandboxController.js.map +2 -2
- package/dist/services/sessionMemoryInjector.js +77 -0
- package/dist/services/sessionMemoryInjector.js.map +7 -0
- package/dist/services/systemReminder.js +130 -8
- package/dist/services/systemReminder.js.map +2 -2
- package/dist/services/taskStore.js +199 -8
- package/dist/services/taskStore.js.map +3 -3
- package/dist/services/topicDetector.js +169 -0
- package/dist/services/topicDetector.js.map +7 -0
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +0 -13
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
- package/dist/tools/BashTool/BashTool.js +51 -28
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/BashTool/prompt.js +95 -118
- package/dist/tools/BashTool/prompt.js.map +2 -2
- package/dist/tools/BashTool/utils.js +39 -1
- package/dist/tools/BashTool/utils.js.map +2 -2
- package/dist/tools/EnterWorktreeTool/EnterWorktreeTool.js +121 -0
- package/dist/tools/EnterWorktreeTool/EnterWorktreeTool.js.map +7 -0
- package/dist/tools/EnterWorktreeTool/prompt.js +22 -0
- package/dist/tools/EnterWorktreeTool/prompt.js.map +7 -0
- package/dist/tools/FileEditTool/FileEditTool.js +9 -4
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileEditTool/prompt.js +3 -7
- package/dist/tools/FileEditTool/prompt.js.map +2 -2
- package/dist/tools/FileReadTool/FileReadTool.js +125 -3
- package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
- package/dist/tools/FileReadTool/prompt.js +1 -2
- package/dist/tools/FileReadTool/prompt.js.map +2 -2
- package/dist/tools/FileWriteTool/prompt.js +3 -5
- package/dist/tools/FileWriteTool/prompt.js.map +2 -2
- package/dist/tools/GlobTool/GlobTool.js +3 -2
- package/dist/tools/GlobTool/GlobTool.js.map +2 -2
- package/dist/tools/GrepTool/GrepTool.js +16 -5
- package/dist/tools/GrepTool/GrepTool.js.map +2 -2
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +2 -2
- package/dist/tools/MCPSearchTool/MCPSearchTool.js +172 -0
- package/dist/tools/MCPSearchTool/MCPSearchTool.js.map +7 -0
- package/dist/tools/MCPSearchTool/prompt.js +77 -0
- package/dist/tools/MCPSearchTool/prompt.js.map +7 -0
- package/dist/tools/MultiEditTool/prompt.js +4 -7
- package/dist/tools/MultiEditTool/prompt.js.map +2 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +12 -8
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +54 -1
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
- package/dist/tools/PlanModeTool/prompt.js +23 -74
- package/dist/tools/PlanModeTool/prompt.js.map +2 -2
- package/dist/tools/SendMessageTool/SendMessageTool.js +341 -0
- package/dist/tools/SendMessageTool/SendMessageTool.js.map +7 -0
- package/dist/tools/SendMessageTool/prompt.js +44 -0
- package/dist/tools/SendMessageTool/prompt.js.map +7 -0
- package/dist/tools/TaskCreateTool/prompt.js +15 -4
- package/dist/tools/TaskCreateTool/prompt.js.map +2 -2
- package/dist/tools/TaskListTool/prompt.js +18 -3
- package/dist/tools/TaskListTool/prompt.js.map +2 -2
- package/dist/tools/TaskOutputTool/prompt.js +4 -3
- package/dist/tools/TaskOutputTool/prompt.js.map +2 -2
- package/dist/tools/TaskTool/TaskTool.js +762 -98
- package/dist/tools/TaskTool/TaskTool.js.map +3 -3
- package/dist/tools/TaskTool/constants.js +8 -2
- package/dist/tools/TaskTool/constants.js.map +2 -2
- package/dist/tools/TaskTool/prompt.js +74 -70
- package/dist/tools/TaskTool/prompt.js.map +2 -2
- package/dist/tools/TaskUpdateTool/TaskUpdateTool.js +15 -1
- package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +2 -2
- package/dist/tools/TeamCreateTool/TeamCreateTool.js +129 -0
- package/dist/tools/TeamCreateTool/TeamCreateTool.js.map +7 -0
- package/dist/tools/TeamCreateTool/prompt.js +58 -0
- package/dist/tools/TeamCreateTool/prompt.js.map +7 -0
- package/dist/tools/TeamDeleteTool/TeamDeleteTool.js +151 -0
- package/dist/tools/TeamDeleteTool/TeamDeleteTool.js.map +7 -0
- package/dist/tools/TeamDeleteTool/prompt.js +16 -0
- package/dist/tools/TeamDeleteTool/prompt.js.map +7 -0
- package/dist/tools/URLFetcherTool/URLFetcherTool.js +106 -15
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/prompt.js +3 -2
- package/dist/tools/URLFetcherTool/prompt.js.map +2 -2
- package/dist/tools/WebSearchTool/WebSearchTool.js +2 -1
- package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
- package/dist/tools/WebSearchTool/prompt.js +5 -4
- package/dist/tools/WebSearchTool/prompt.js.map +2 -2
- package/dist/tools.js +100 -20
- package/dist/tools.js.map +2 -2
- package/dist/types/PermissionMode.js +35 -6
- package/dist/types/PermissionMode.js.map +2 -2
- package/dist/types/hooks.js +2 -0
- package/dist/types/hooks.js.map +2 -2
- package/dist/types/plugin.js +2 -0
- package/dist/types/plugin.js.map +3 -3
- package/dist/utils/CircuitBreaker.js +15 -9
- package/dist/utils/CircuitBreaker.js.map +2 -2
- package/dist/utils/agentLoader.js +249 -112
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/animationManager.js +40 -3
- package/dist/utils/animationManager.js.map +2 -2
- package/dist/utils/ask.js +7 -6
- package/dist/utils/ask.js.map +2 -2
- package/dist/utils/atomicWrite.js +23 -0
- package/dist/utils/atomicWrite.js.map +7 -0
- package/dist/utils/autoCompactCore.js +73 -56
- package/dist/utils/autoCompactCore.js.map +2 -2
- package/dist/utils/autoMemoryPaths.js +89 -0
- package/dist/utils/autoMemoryPaths.js.map +7 -0
- package/dist/utils/config.js +63 -38
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/configSchema.js +13 -8
- package/dist/utils/configSchema.js.map +2 -2
- package/dist/utils/credentials/index.js +14 -0
- package/dist/utils/credentials/index.js.map +2 -2
- package/dist/utils/dualPath.js +24 -0
- package/dist/utils/dualPath.js.map +7 -0
- package/dist/utils/exit.js +66 -7
- package/dist/utils/exit.js.map +2 -2
- package/dist/utils/externalEditor.js +155 -0
- package/dist/utils/externalEditor.js.map +7 -0
- package/dist/utils/fileLock.js +67 -0
- package/dist/utils/fileLock.js.map +7 -0
- package/dist/utils/format.js +24 -14
- package/dist/utils/format.js.map +2 -2
- package/dist/utils/globalErrorHandler.js +5 -96
- package/dist/utils/globalErrorHandler.js.map +3 -3
- package/dist/utils/groupHandlers/parallelTasksHandler.js +5 -3
- package/dist/utils/groupHandlers/parallelTasksHandler.js.map +2 -2
- package/dist/utils/groupHandlers/taskHandler.js +2 -2
- package/dist/utils/groupHandlers/taskHandler.js.map +2 -2
- package/dist/utils/hookManager.js +64 -6
- package/dist/utils/hookManager.js.map +2 -2
- package/dist/utils/log.js +6 -2
- package/dist/utils/log.js.map +2 -2
- package/dist/utils/markdown.js +237 -19
- package/dist/utils/markdown.js.map +2 -2
- package/dist/utils/messageContextManager.js +18 -5
- package/dist/utils/messageContextManager.js.map +2 -2
- package/dist/utils/messageGroupManager.js +1 -1
- package/dist/utils/messageGroupManager.js.map +2 -2
- package/dist/utils/messages.js +104 -46
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/model.js +2 -2
- package/dist/utils/model.js.map +2 -2
- package/dist/utils/pasteCache.js +8 -4
- package/dist/utils/pasteCache.js.map +2 -2
- package/dist/utils/pluginLoader.js +18 -0
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/secureKeyStorage.js +36 -7
- package/dist/utils/secureKeyStorage.js.map +2 -2
- package/dist/utils/simpleMode.js +7 -0
- package/dist/utils/simpleMode.js.map +7 -0
- package/dist/utils/streamingState.js +11 -1
- package/dist/utils/streamingState.js.map +2 -2
- package/dist/utils/taskDisplayUtils.js +2 -1
- package/dist/utils/taskDisplayUtils.js.map +2 -2
- package/dist/utils/teamConfig.js +2 -2
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/thinking.js +6 -2
- package/dist/utils/thinking.js.map +3 -3
- package/dist/utils/tokenProgress.js +55 -0
- package/dist/utils/tokenProgress.js.map +7 -0
- package/dist/utils/toolRiskClassification.js +26 -17
- package/dist/utils/toolRiskClassification.js.map +2 -2
- package/dist/utils/tooling/toolError.js +12 -0
- package/dist/utils/tooling/toolError.js.map +7 -0
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +10 -8
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { last, memoize } from "lodash-es";
|
|
2
2
|
import { dirname } from "path";
|
|
3
|
+
import { execFileSync } from "child_process";
|
|
3
4
|
import React from "react";
|
|
4
5
|
import { Box, Text } from "ink";
|
|
5
6
|
import { z } from "zod";
|
|
6
7
|
import { FallbackToolUseRejectedMessage } from "../../components/FallbackToolUseRejectedMessage.js";
|
|
7
|
-
import { getAgentPrompt } from "../../constants/prompts/index.js";
|
|
8
|
+
import { getAgentPrompt, getSystemPrompt } from "../../constants/prompts/index.js";
|
|
8
9
|
import { getContext } from "../../context.js";
|
|
9
10
|
import { hasPermissionsToUseTool } from "../../permissions.js";
|
|
10
|
-
import { query } from "../../query.js";
|
|
11
11
|
import { formatDuration, formatNumber } from "../../utils/format.js";
|
|
12
12
|
import {
|
|
13
13
|
getMessagesPath,
|
|
@@ -18,7 +18,6 @@ import {
|
|
|
18
18
|
import {
|
|
19
19
|
createAssistantMessage,
|
|
20
20
|
createUserMessage,
|
|
21
|
-
getLastAssistantMessageId,
|
|
22
21
|
INTERRUPT_MESSAGE,
|
|
23
22
|
normalizeMessages
|
|
24
23
|
} from "../../utils/messages.js";
|
|
@@ -27,6 +26,7 @@ import { getMaxThinkingTokens } from "../../utils/thinking.js";
|
|
|
27
26
|
import { getTheme } from "../../utils/theme.js";
|
|
28
27
|
import { generateAgentId } from "../../utils/agentStorage.js";
|
|
29
28
|
import { debug as debugLogger } from "../../utils/debugLogger.js";
|
|
29
|
+
import { getTools, getReadOnlyTools } from "../../tools.js";
|
|
30
30
|
import { getTaskTools, getPrompt } from "./prompt.js";
|
|
31
31
|
import { TOOL_NAME } from "./constants.js";
|
|
32
32
|
import {
|
|
@@ -37,15 +37,18 @@ import {
|
|
|
37
37
|
createAgentTranscript,
|
|
38
38
|
getResumableTranscript,
|
|
39
39
|
appendMessageToTranscript,
|
|
40
|
-
updateAgentTranscript,
|
|
41
40
|
completeAgentTranscript,
|
|
42
41
|
failAgentTranscript,
|
|
43
42
|
interruptAgentTranscript,
|
|
44
43
|
canResumeTranscript,
|
|
45
44
|
registerToolUseAgent
|
|
46
45
|
} from "../../utils/agentTranscripts.js";
|
|
46
|
+
import {
|
|
47
|
+
registerBackgroundAgent,
|
|
48
|
+
completeBackgroundAgent,
|
|
49
|
+
failBackgroundAgent
|
|
50
|
+
} from "../../utils/backgroundAgentManager.js";
|
|
47
51
|
import { UserFriendlyError } from "../../utils/userFriendlyError.js";
|
|
48
|
-
import { execSync } from "child_process";
|
|
49
52
|
import {
|
|
50
53
|
pushAgentContext,
|
|
51
54
|
popAgentContext,
|
|
@@ -65,6 +68,47 @@ import { getSkill, loadSkillContent } from "../../utils/skillLoader.js";
|
|
|
65
68
|
import { getCwd } from "../../utils/state.js";
|
|
66
69
|
import { getHookManager } from "../../utils/hookManager.js";
|
|
67
70
|
import { substituteVariables } from "../../utils/stringSubstitution.js";
|
|
71
|
+
import {
|
|
72
|
+
getTeam,
|
|
73
|
+
addTeammate,
|
|
74
|
+
updateTeammateStatus,
|
|
75
|
+
sanitizeTeamName
|
|
76
|
+
} from "../../services/agentTeams/teamManager.js";
|
|
77
|
+
import {
|
|
78
|
+
markTeammateIdle,
|
|
79
|
+
markTeammateCompleted
|
|
80
|
+
} from "../../services/agentTeams/teammateSpawner.js";
|
|
81
|
+
import { resolveBackend } from "../../services/agentTeams/backends/resolver.js";
|
|
82
|
+
import {
|
|
83
|
+
registerInProcessAgent,
|
|
84
|
+
updateInProcessAgentState,
|
|
85
|
+
unregisterInProcessAgent
|
|
86
|
+
} from "../../services/agentTeams/backends/inProcess.js";
|
|
87
|
+
const DEFAULT_HEADLESS_TIMEOUT_MS = 10 * 60 * 1e3;
|
|
88
|
+
function scopeEnvVars(vars, options) {
|
|
89
|
+
if (options?.inProcess) {
|
|
90
|
+
return () => {
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
const saved = {};
|
|
94
|
+
for (const key of Object.keys(vars)) {
|
|
95
|
+
saved[key] = process.env[key];
|
|
96
|
+
if (vars[key] !== void 0) {
|
|
97
|
+
process.env[key] = vars[key];
|
|
98
|
+
} else {
|
|
99
|
+
delete process.env[key];
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return () => {
|
|
103
|
+
for (const key of Object.keys(saved)) {
|
|
104
|
+
if (saved[key] !== void 0) {
|
|
105
|
+
process.env[key] = saved[key];
|
|
106
|
+
} else {
|
|
107
|
+
delete process.env[key];
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
68
112
|
const inputSchema = z.object({
|
|
69
113
|
description: z.string().describe("A short (3-5 word) description of the task"),
|
|
70
114
|
prompt: z.string().describe("The task for the agent to perform"),
|
|
@@ -82,8 +126,19 @@ const inputSchema = z.object({
|
|
|
82
126
|
),
|
|
83
127
|
max_turns: z.number().int().positive().optional().describe(
|
|
84
128
|
"Maximum number of agentic turns (API round-trips) before stopping. Used internally for warmup."
|
|
129
|
+
),
|
|
130
|
+
team_name: z.string().optional().describe(
|
|
131
|
+
"Optional team name. When provided, the subagent is spawned as a teammate with team context, discovery info, and team tools (SendMessage, TaskCreate, etc.)."
|
|
132
|
+
),
|
|
133
|
+
name: z.string().optional().describe(
|
|
134
|
+
'Optional human-readable name for this teammate (e.g., "researcher", "tester"). Used for team communication.'
|
|
135
|
+
),
|
|
136
|
+
run_in_background: z.boolean().optional().describe(
|
|
137
|
+
"Set to true to run this agent in the background. The tool result will include an output_file path - use Read tool or Bash tail to check on output."
|
|
138
|
+
),
|
|
139
|
+
isolation: z.enum(["worktree"]).optional().describe(
|
|
140
|
+
'Isolation mode. "worktree" creates a temporary git worktree so the agent works on an isolated copy of the repo.'
|
|
85
141
|
)
|
|
86
|
-
// run_in_background parameter removed - concurrent execution is automatic
|
|
87
142
|
});
|
|
88
143
|
const TaskTool = {
|
|
89
144
|
async prompt({ safeMode }) {
|
|
@@ -103,14 +158,28 @@ const TaskTool = {
|
|
|
103
158
|
model,
|
|
104
159
|
subagent_type,
|
|
105
160
|
resume,
|
|
106
|
-
max_turns
|
|
161
|
+
max_turns,
|
|
162
|
+
team_name,
|
|
163
|
+
name: teammateName,
|
|
164
|
+
run_in_background,
|
|
165
|
+
isolation
|
|
107
166
|
}, {
|
|
108
167
|
abortController,
|
|
109
|
-
options: {
|
|
168
|
+
options: {
|
|
169
|
+
safeMode = false,
|
|
170
|
+
safetyMode,
|
|
171
|
+
forkNumber,
|
|
172
|
+
messageLogName,
|
|
173
|
+
verbose
|
|
174
|
+
},
|
|
110
175
|
readFileTimestamps,
|
|
111
176
|
toolUseId
|
|
112
177
|
}) {
|
|
113
178
|
const startTime = Date.now();
|
|
179
|
+
const effectiveRunInBackground = team_name ? true : run_in_background;
|
|
180
|
+
if (team_name) {
|
|
181
|
+
team_name = sanitizeTeamName(team_name);
|
|
182
|
+
}
|
|
114
183
|
const agentType = subagent_type || "general-purpose";
|
|
115
184
|
let resumedTranscript = null;
|
|
116
185
|
let agentId;
|
|
@@ -171,7 +240,9 @@ Use /agents command to manage agent configurations.`;
|
|
|
171
240
|
}
|
|
172
241
|
loadedAgentConfig = agentConfig;
|
|
173
242
|
if (agentConfig.systemPrompt) {
|
|
174
|
-
effectivePrompt =
|
|
243
|
+
effectivePrompt = `<system-reminder>
|
|
244
|
+
${agentConfig.systemPrompt}
|
|
245
|
+
</system-reminder>
|
|
175
246
|
|
|
176
247
|
${prompt}`;
|
|
177
248
|
}
|
|
@@ -299,10 +370,11 @@ ${substitutedContent}
|
|
|
299
370
|
}
|
|
300
371
|
}
|
|
301
372
|
let worktreePath = null;
|
|
302
|
-
|
|
373
|
+
const shouldUseWorktree = isolation === "worktree" || loadedAgentConfig?.isolation === "worktree";
|
|
374
|
+
if (shouldUseWorktree) {
|
|
303
375
|
try {
|
|
304
376
|
const tmpDir = `/tmp/minto-worktree-${agentId}`;
|
|
305
|
-
|
|
377
|
+
execFileSync("git", ["worktree", "add", tmpDir, "HEAD"], {
|
|
306
378
|
cwd: getCwd(),
|
|
307
379
|
stdio: "pipe"
|
|
308
380
|
});
|
|
@@ -314,6 +386,10 @@ ${effectivePrompt}`;
|
|
|
314
386
|
agentId,
|
|
315
387
|
worktreePath
|
|
316
388
|
});
|
|
389
|
+
const hookMgrCreate = getHookManager();
|
|
390
|
+
hookMgrCreate?.executeWorktreeCreate(worktreePath, agentId, agentType).catch(
|
|
391
|
+
(err) => debugLogger.trace("HOOK_WORKTREE_CREATE", { error: err })
|
|
392
|
+
);
|
|
317
393
|
} catch (err) {
|
|
318
394
|
debugLogger.warn("TASK_AGENT_WORKTREE_FAILED", {
|
|
319
395
|
agentId,
|
|
@@ -321,24 +397,376 @@ ${effectivePrompt}`;
|
|
|
321
397
|
});
|
|
322
398
|
}
|
|
323
399
|
}
|
|
324
|
-
|
|
400
|
+
let restoreEnvVars = null;
|
|
401
|
+
if (team_name) {
|
|
402
|
+
const teammateAgentId = teammateName ? `${teammateName}@${team_name}` : `${agentType}@${team_name}`;
|
|
403
|
+
try {
|
|
404
|
+
const { getTeammateColor } = await import("../../constants/agentTeams.js");
|
|
405
|
+
const teamEntry = getTeam(team_name);
|
|
406
|
+
const colorIndex = teamEntry?.team.members.length ?? 0;
|
|
407
|
+
addTeammate(team_name, {
|
|
408
|
+
id: teammateAgentId,
|
|
409
|
+
name: teammateName || agentType,
|
|
410
|
+
agentType,
|
|
411
|
+
status: "working",
|
|
412
|
+
prompt,
|
|
413
|
+
color: getTeammateColor(colorIndex)
|
|
414
|
+
});
|
|
415
|
+
} catch {
|
|
416
|
+
}
|
|
417
|
+
if (worktreePath && team_name) {
|
|
418
|
+
try {
|
|
419
|
+
const { updateTeammateWorktree } = await import("../../services/agentTeams/teamManager.js");
|
|
420
|
+
updateTeammateWorktree(
|
|
421
|
+
team_name,
|
|
422
|
+
teammateName ? `${teammateName}@${team_name}` : `${agentType}@${team_name}`,
|
|
423
|
+
worktreePath
|
|
424
|
+
);
|
|
425
|
+
} catch {
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
const effectiveAgentName = teammateName || agentType;
|
|
429
|
+
let planModeValue;
|
|
430
|
+
try {
|
|
431
|
+
const teamEntry = getTeam(team_name);
|
|
432
|
+
const member = teamEntry?.team.members.find(
|
|
433
|
+
(m) => m.id === teammateAgentId
|
|
434
|
+
);
|
|
435
|
+
planModeValue = member?.planModeRequired ? "1" : void 0;
|
|
436
|
+
} catch {
|
|
437
|
+
}
|
|
438
|
+
const earlyBackend = resolveBackend(
|
|
439
|
+
getTeam(team_name)?.team.config.displayMode
|
|
440
|
+
);
|
|
441
|
+
const isInProcessBackend = earlyBackend.mode === "in-process";
|
|
442
|
+
const parentDepth = parseInt(
|
|
443
|
+
process.env.MINTO_AGENT_DEPTH ?? process.env.CLAUDE_AGENT_DEPTH ?? "0",
|
|
444
|
+
10
|
|
445
|
+
) || 0;
|
|
446
|
+
const childDepth = String(parentDepth + 1);
|
|
447
|
+
restoreEnvVars = scopeEnvVars(
|
|
448
|
+
{
|
|
449
|
+
MINTO_TEAM_NAME: team_name,
|
|
450
|
+
MINTO_AGENT_ID: teammateAgentId,
|
|
451
|
+
MINTO_AGENT_TYPE: agentType,
|
|
452
|
+
MINTO_AGENT_NAME: effectiveAgentName,
|
|
453
|
+
MINTO_PLAN_MODE_REQUIRED: planModeValue,
|
|
454
|
+
MINTO_AGENT_DEPTH: childDepth,
|
|
455
|
+
// CC compat: set CLAUDE_CODE_* so CC ecosystem tools can read them
|
|
456
|
+
CLAUDE_CODE_TEAM_NAME: team_name,
|
|
457
|
+
CLAUDE_CODE_AGENT_ID: teammateAgentId,
|
|
458
|
+
CLAUDE_CODE_AGENT_TYPE: agentType,
|
|
459
|
+
CLAUDE_CODE_AGENT_NAME: effectiveAgentName,
|
|
460
|
+
CLAUDE_CODE_PLAN_MODE_REQUIRED: planModeValue,
|
|
461
|
+
CLAUDE_AGENT_DEPTH: childDepth
|
|
462
|
+
},
|
|
463
|
+
{ inProcess: isInProcessBackend }
|
|
464
|
+
);
|
|
465
|
+
let teamDiscovery = "";
|
|
466
|
+
try {
|
|
467
|
+
const { getTeam: getTeamFn } = await import("../../services/agentTeams/teamManager.js");
|
|
468
|
+
const entry = getTeamFn(team_name);
|
|
469
|
+
if (entry) {
|
|
470
|
+
const otherMembers = entry.team.members.filter((m) => m.id !== teammateAgentId && m.name !== teammateName).map((m) => ` - ${m.name} (${m.agentType}): ${m.status}`).join("\n");
|
|
471
|
+
if (otherMembers) {
|
|
472
|
+
teamDiscovery = `
|
|
473
|
+
Team members:
|
|
474
|
+
${otherMembers}`;
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
} catch {
|
|
478
|
+
}
|
|
479
|
+
const teamContext = `
|
|
480
|
+
# Agent Teammate Communication
|
|
481
|
+
|
|
482
|
+
You are agent "${teammateName || agentType}" in team "${team_name}".
|
|
483
|
+
|
|
484
|
+
## CRITICAL: Reporting Results
|
|
485
|
+
|
|
486
|
+
**You MUST use the SendMessage tool to report your results to the team lead.** Your text output is NOT visible to the team lead or any teammate. The ONLY way to deliver your findings is via SendMessage.
|
|
487
|
+
|
|
488
|
+
When you finish your task:
|
|
489
|
+
1. Use SendMessage with type "message", recipient "team-lead", and your findings as content
|
|
490
|
+
2. Include a brief summary in the summary field
|
|
491
|
+
3. Do NOT just output text \u2014 it will be lost
|
|
492
|
+
|
|
493
|
+
## Communication
|
|
494
|
+
|
|
495
|
+
- Use SendMessage with type \`message\` to send messages to specific teammates
|
|
496
|
+
- Use SendMessage with type \`broadcast\` sparingly for team-wide announcements
|
|
497
|
+
- Do NOT send acknowledgment messages ("Got it", "\u5DF2\u6536\u5230") \u2014 only send when you have actionable content
|
|
498
|
+
- ALWAYS respond in the same language as the user's original request
|
|
499
|
+
|
|
500
|
+
**User guidance**: Sometimes the user may send you direct messages that appear in \`<user-guidance>\` tags. When you receive user guidance, respond directly in your text output \u2014 do NOT forward it to the team lead via SendMessage. The user can see your text output in the focus view.
|
|
501
|
+
|
|
502
|
+
Team: ${team_name}
|
|
503
|
+
Your agent ID: ${teammateAgentId}
|
|
504
|
+
Your agent type: ${agentType}${teamDiscovery}
|
|
505
|
+
`;
|
|
506
|
+
effectivePrompt = `<system-reminder>
|
|
507
|
+
${teamContext}
|
|
508
|
+
</system-reminder>
|
|
509
|
+
|
|
510
|
+
` + effectivePrompt;
|
|
511
|
+
agentId = teammateAgentId;
|
|
512
|
+
if (toolUseId) {
|
|
513
|
+
registerToolUseAgent(toolUseId, agentId);
|
|
514
|
+
}
|
|
515
|
+
const backend = resolveBackend(
|
|
516
|
+
getTeam(team_name)?.team.config.displayMode
|
|
517
|
+
);
|
|
518
|
+
effectivePermissionMode = safeMode ? "plan" : "acceptEdits";
|
|
519
|
+
if (backend.mode !== "in-process") {
|
|
520
|
+
try {
|
|
521
|
+
const spawnTeamEntry = getTeam(team_name);
|
|
522
|
+
const spawnMember = spawnTeamEntry?.team.members.find(
|
|
523
|
+
(m) => m.id === teammateAgentId
|
|
524
|
+
);
|
|
525
|
+
const handle = await backend.spawn({
|
|
526
|
+
agentId: teammateAgentId,
|
|
527
|
+
agentName: teammateName || agentType,
|
|
528
|
+
teamName: team_name,
|
|
529
|
+
agentType,
|
|
530
|
+
prompt,
|
|
531
|
+
model: effectiveModel !== "task" ? effectiveModel : void 0,
|
|
532
|
+
cwd: process.cwd(),
|
|
533
|
+
maxTurns: max_turns,
|
|
534
|
+
mode: effectivePermissionMode,
|
|
535
|
+
planModeRequired: spawnMember?.planModeRequired,
|
|
536
|
+
color: spawnMember?.color,
|
|
537
|
+
parentSessionId: spawnTeamEntry?.team.leadSessionId
|
|
538
|
+
});
|
|
539
|
+
createAgentTranscript({
|
|
540
|
+
agentId: teammateAgentId,
|
|
541
|
+
agentType,
|
|
542
|
+
toolUseId,
|
|
543
|
+
description: description || teammateName || agentType,
|
|
544
|
+
prompt,
|
|
545
|
+
model: effectiveModel,
|
|
546
|
+
forkNumber,
|
|
547
|
+
messageLogName,
|
|
548
|
+
messages: [createUserMessage(effectivePrompt)],
|
|
549
|
+
toolUseCount: 0,
|
|
550
|
+
metadata: { isBackground: true }
|
|
551
|
+
});
|
|
552
|
+
yield {
|
|
553
|
+
type: "progress",
|
|
554
|
+
content: createAssistantMessage(
|
|
555
|
+
`Teammate "${teammateName || agentType}" spawned as independent process (headless mode, agent ID: ${teammateAgentId})`
|
|
556
|
+
)
|
|
557
|
+
};
|
|
558
|
+
if (effectiveRunInBackground) {
|
|
559
|
+
registerBackgroundAgent(
|
|
560
|
+
teammateAgentId,
|
|
561
|
+
agentType,
|
|
562
|
+
description,
|
|
563
|
+
abortController
|
|
564
|
+
);
|
|
565
|
+
(async () => {
|
|
566
|
+
const HEADLESS_TIMEOUT_MS2 = DEFAULT_HEADLESS_TIMEOUT_MS;
|
|
567
|
+
let exitCode2 = null;
|
|
568
|
+
await new Promise((resolve) => {
|
|
569
|
+
const timeoutId = setTimeout(() => {
|
|
570
|
+
debugLogger.warn("HEADLESS_AGENT_TIMEOUT", {
|
|
571
|
+
agentId: teammateAgentId,
|
|
572
|
+
timeoutMs: HEADLESS_TIMEOUT_MS2
|
|
573
|
+
});
|
|
574
|
+
backend.kill(handle).then(resolve, resolve);
|
|
575
|
+
}, HEADLESS_TIMEOUT_MS2);
|
|
576
|
+
backend.onExit(handle, (code) => {
|
|
577
|
+
exitCode2 = code;
|
|
578
|
+
clearTimeout(timeoutId);
|
|
579
|
+
resolve();
|
|
580
|
+
});
|
|
581
|
+
if (!backend.isAlive(handle)) {
|
|
582
|
+
clearTimeout(timeoutId);
|
|
583
|
+
resolve();
|
|
584
|
+
}
|
|
585
|
+
if (abortController.signal.aborted) {
|
|
586
|
+
clearTimeout(timeoutId);
|
|
587
|
+
backend.kill(handle).then(resolve, resolve);
|
|
588
|
+
} else {
|
|
589
|
+
abortController.signal.addEventListener(
|
|
590
|
+
"abort",
|
|
591
|
+
() => {
|
|
592
|
+
clearTimeout(timeoutId);
|
|
593
|
+
backend.kill(handle).then(resolve, resolve);
|
|
594
|
+
},
|
|
595
|
+
{ once: true }
|
|
596
|
+
);
|
|
597
|
+
}
|
|
598
|
+
});
|
|
599
|
+
if (exitCode2 !== null && exitCode2 !== 0) {
|
|
600
|
+
updateTeammateStatus(team_name, teammateAgentId, "stopped");
|
|
601
|
+
failBackgroundAgent(teammateAgentId, `exit code ${exitCode2}`);
|
|
602
|
+
failAgentTranscript(teammateAgentId, `exit code ${exitCode2}`);
|
|
603
|
+
} else {
|
|
604
|
+
markTeammateCompleted(
|
|
605
|
+
team_name,
|
|
606
|
+
teammateAgentId,
|
|
607
|
+
teammateName || agentType,
|
|
608
|
+
{
|
|
609
|
+
summary: `Teammate "${teammateName || agentType}" completed.`
|
|
610
|
+
}
|
|
611
|
+
).catch(
|
|
612
|
+
(err) => debugLogger.trace("MARK_TEAMMATE_COMPLETED", { error: err })
|
|
613
|
+
);
|
|
614
|
+
completeBackgroundAgent(teammateAgentId, [
|
|
615
|
+
{
|
|
616
|
+
type: "text",
|
|
617
|
+
text: `Teammate "${teammateName || agentType}" completed.`
|
|
618
|
+
}
|
|
619
|
+
]);
|
|
620
|
+
completeAgentTranscript(teammateAgentId);
|
|
621
|
+
}
|
|
622
|
+
})();
|
|
623
|
+
const bgResultText = `Agent "${teammateName || agentType}" running in background`;
|
|
624
|
+
yield {
|
|
625
|
+
type: "result",
|
|
626
|
+
data: [{ type: "text", text: bgResultText }],
|
|
627
|
+
resultForAssistant: `Teammate "${teammateName || agentType}" is running in the background. You will be notified automatically when they finish \u2014 do NOT check on them.`
|
|
628
|
+
};
|
|
629
|
+
hasYieldedResult = true;
|
|
630
|
+
return;
|
|
631
|
+
}
|
|
632
|
+
const HEADLESS_TIMEOUT_MS = DEFAULT_HEADLESS_TIMEOUT_MS;
|
|
633
|
+
let exitCode = null;
|
|
634
|
+
await new Promise((resolve) => {
|
|
635
|
+
const timeoutId = setTimeout(() => {
|
|
636
|
+
debugLogger.warn("HEADLESS_AGENT_TIMEOUT", {
|
|
637
|
+
agentId: teammateAgentId,
|
|
638
|
+
timeoutMs: HEADLESS_TIMEOUT_MS
|
|
639
|
+
});
|
|
640
|
+
backend.kill(handle).then(resolve, resolve);
|
|
641
|
+
}, HEADLESS_TIMEOUT_MS);
|
|
642
|
+
backend.onExit(handle, (code) => {
|
|
643
|
+
exitCode = code;
|
|
644
|
+
clearTimeout(timeoutId);
|
|
645
|
+
resolve();
|
|
646
|
+
});
|
|
647
|
+
if (!backend.isAlive(handle)) {
|
|
648
|
+
clearTimeout(timeoutId);
|
|
649
|
+
resolve();
|
|
650
|
+
}
|
|
651
|
+
if (abortController.signal.aborted) {
|
|
652
|
+
clearTimeout(timeoutId);
|
|
653
|
+
backend.kill(handle).then(resolve, resolve);
|
|
654
|
+
} else {
|
|
655
|
+
abortController.signal.addEventListener(
|
|
656
|
+
"abort",
|
|
657
|
+
() => {
|
|
658
|
+
clearTimeout(timeoutId);
|
|
659
|
+
backend.kill(handle).then(resolve, resolve);
|
|
660
|
+
},
|
|
661
|
+
{ once: true }
|
|
662
|
+
);
|
|
663
|
+
}
|
|
664
|
+
});
|
|
665
|
+
markTeammateCompleted(
|
|
666
|
+
team_name,
|
|
667
|
+
teammateAgentId,
|
|
668
|
+
teammateName || agentType,
|
|
669
|
+
{
|
|
670
|
+
summary: `Teammate "${teammateName || agentType}" completed.`
|
|
671
|
+
}
|
|
672
|
+
).catch(
|
|
673
|
+
(err) => debugLogger.trace("MARK_TEAMMATE_COMPLETED", { error: err })
|
|
674
|
+
);
|
|
675
|
+
const teamEntry = getTeam(team_name);
|
|
676
|
+
const leadId = `team-lead@${team_name}`;
|
|
677
|
+
let agentResultText = `Teammate "${teammateName || agentType}" completed.`;
|
|
678
|
+
if (exitCode !== null && exitCode !== 0) {
|
|
679
|
+
agentResultText = `Teammate "${teammateName || agentType}" failed (exit code ${exitCode}). The agent process encountered an error during startup or execution.`;
|
|
680
|
+
failAgentTranscript(teammateAgentId, agentResultText);
|
|
681
|
+
} else {
|
|
682
|
+
completeAgentTranscript(teammateAgentId);
|
|
683
|
+
}
|
|
684
|
+
if (teamEntry) {
|
|
685
|
+
const unread = teamEntry.mailbox.getUnread(leadId);
|
|
686
|
+
const fromAgent = unread.filter((m) => m.from === teammateAgentId);
|
|
687
|
+
if (fromAgent.length > 0) {
|
|
688
|
+
const {
|
|
689
|
+
parseIdleNotification,
|
|
690
|
+
formatIdleNotificationForInjection,
|
|
691
|
+
formatTeamMessage
|
|
692
|
+
} = require("../../services/agentTeams/messageFormatter");
|
|
693
|
+
agentResultText = fromAgent.map((m) => {
|
|
694
|
+
const idleData = parseIdleNotification(m.text);
|
|
695
|
+
if (idleData) {
|
|
696
|
+
return formatIdleNotificationForInjection(idleData);
|
|
697
|
+
}
|
|
698
|
+
return formatTeamMessage(m);
|
|
699
|
+
}).join("\n\n");
|
|
700
|
+
teamEntry.mailbox.markRead(fromAgent.map((m) => m.id));
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
yield {
|
|
704
|
+
type: "result",
|
|
705
|
+
data: [
|
|
706
|
+
{
|
|
707
|
+
type: "text",
|
|
708
|
+
text: agentResultText
|
|
709
|
+
}
|
|
710
|
+
],
|
|
711
|
+
resultForAssistant: agentResultText
|
|
712
|
+
};
|
|
713
|
+
hasYieldedResult = true;
|
|
714
|
+
return;
|
|
715
|
+
} catch (spawnError) {
|
|
716
|
+
debugLogger.warn("HEADLESS_SPAWN_FAILED", {
|
|
717
|
+
agentId: teammateAgentId,
|
|
718
|
+
error: spawnError instanceof Error ? spawnError.message : String(spawnError)
|
|
719
|
+
});
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
if (team_name) {
|
|
724
|
+
registerInProcessAgent(agentId, effectivePermissionMode);
|
|
725
|
+
}
|
|
726
|
+
let messages = resumedTranscript ? [...resumedTranscript.messages] : [];
|
|
325
727
|
let tools = await getTaskTools(safeMode);
|
|
326
728
|
let allowedSubagentTypes = null;
|
|
327
729
|
if (toolFilter) {
|
|
328
730
|
const isAllArray = Array.isArray(toolFilter) && toolFilter.length === 1 && toolFilter[0] === "*";
|
|
329
731
|
if (toolFilter === "*" || isAllArray) {
|
|
330
732
|
} else if (Array.isArray(toolFilter)) {
|
|
331
|
-
const taskPatterns = toolFilter.filter(
|
|
733
|
+
const taskPatterns = toolFilter.filter(
|
|
734
|
+
(t) => (t.startsWith("Agent(") || t.startsWith("Task(")) && t.endsWith(")")
|
|
735
|
+
).map(
|
|
736
|
+
(t) => t.startsWith("Agent(") ? t.slice(6, -1) : t.slice(5, -1)
|
|
737
|
+
);
|
|
332
738
|
if (taskPatterns.length > 0) {
|
|
333
739
|
allowedSubagentTypes = taskPatterns;
|
|
334
740
|
}
|
|
335
|
-
const baseToolNames = toolFilter.map(
|
|
741
|
+
const baseToolNames = toolFilter.map(
|
|
742
|
+
(t) => t.startsWith("Agent(") || t.startsWith("Task(") ? TOOL_NAME : t
|
|
743
|
+
).filter((t, i, arr) => arr.indexOf(t) === i);
|
|
336
744
|
tools = tools.filter((tool) => baseToolNames.includes(tool.name));
|
|
337
745
|
}
|
|
338
746
|
}
|
|
339
747
|
if (disallowedToolFilter?.length) {
|
|
340
748
|
tools = tools.filter((tool) => !disallowedToolFilter.includes(tool.name));
|
|
341
749
|
}
|
|
750
|
+
if (team_name) {
|
|
751
|
+
const currentDepth = parseInt(
|
|
752
|
+
process.env.MINTO_AGENT_DEPTH ?? process.env.CLAUDE_AGENT_DEPTH ?? "0",
|
|
753
|
+
10
|
|
754
|
+
) || 0;
|
|
755
|
+
const teamToolNames = /* @__PURE__ */ new Set([
|
|
756
|
+
"SendMessage",
|
|
757
|
+
...currentDepth < 2 ? [TOOL_NAME] : [],
|
|
758
|
+
"TaskCreate",
|
|
759
|
+
"TaskUpdate",
|
|
760
|
+
"TaskList",
|
|
761
|
+
"TaskGet"
|
|
762
|
+
]);
|
|
763
|
+
const fullTools = await (!safeMode ? getTools() : getReadOnlyTools());
|
|
764
|
+
for (const tool of fullTools) {
|
|
765
|
+
if (teamToolNames.has(tool.name) && !tools.some((t) => t.name === tool.name)) {
|
|
766
|
+
tools.push(tool);
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
}
|
|
342
770
|
if (effectivePermissionMode !== "default") {
|
|
343
771
|
const modeConfig = MODE_CONFIGS[effectivePermissionMode];
|
|
344
772
|
if (modeConfig && modeConfig.allowedTools[0] !== "*") {
|
|
@@ -394,7 +822,7 @@ ${effectivePrompt}`;
|
|
|
394
822
|
tools
|
|
395
823
|
};
|
|
396
824
|
const [taskPrompt, context, maxThinkingTokens] = await Promise.all([
|
|
397
|
-
getAgentPrompt(),
|
|
825
|
+
team_name ? getSystemPrompt("teammate") : getAgentPrompt(),
|
|
398
826
|
getContext(),
|
|
399
827
|
getMaxThinkingTokens(messages)
|
|
400
828
|
]);
|
|
@@ -424,7 +852,8 @@ IMPORTANT: You are currently running as ${modelToUse}. You do not need to consul
|
|
|
424
852
|
forkNumber,
|
|
425
853
|
messageLogName,
|
|
426
854
|
messages: [...messages],
|
|
427
|
-
toolUseCount: 0
|
|
855
|
+
toolUseCount: 0,
|
|
856
|
+
...effectiveRunInBackground && team_name ? { metadata: { isBackground: true } } : {}
|
|
428
857
|
});
|
|
429
858
|
} else {
|
|
430
859
|
appendMessageToTranscript(
|
|
@@ -435,106 +864,281 @@ IMPORTANT: You are currently running as ${modelToUse}. You do not need to consul
|
|
|
435
864
|
const effectiveMaxThinkingTokens = agentMaxThinkingTokens ?? maxThinkingTokens;
|
|
436
865
|
const queryOptions = {
|
|
437
866
|
safeMode,
|
|
867
|
+
safetyMode,
|
|
438
868
|
forkNumber,
|
|
439
869
|
messageLogName,
|
|
440
870
|
tools,
|
|
441
871
|
commands: [],
|
|
442
872
|
verbose,
|
|
443
873
|
maxThinkingTokens: effectiveMaxThinkingTokens,
|
|
444
|
-
model: modelToUse
|
|
874
|
+
model: modelToUse,
|
|
875
|
+
...effectivePermissionMode ? { permissionMode: effectivePermissionMode } : {}
|
|
445
876
|
};
|
|
446
877
|
if (temperature !== void 0) {
|
|
447
878
|
queryOptions["temperature"] = temperature;
|
|
448
879
|
}
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
options: queryOptions,
|
|
460
|
-
messageId: getLastAssistantMessageId(messages),
|
|
461
|
-
agentId,
|
|
462
|
-
readFileTimestamps,
|
|
463
|
-
setToolJSX: () => {
|
|
464
|
-
}
|
|
465
|
-
// No-op implementation for TaskTool
|
|
466
|
-
}
|
|
467
|
-
)) {
|
|
468
|
-
messages.push(message);
|
|
469
|
-
appendMessageToTranscript(agentId, message);
|
|
470
|
-
overwriteLog(
|
|
471
|
-
getMessagesPath(messageLogName, forkNumber, getSidechainNumber()),
|
|
472
|
-
messages.filter((_) => _.type !== "progress")
|
|
880
|
+
let effectiveAbortController = abortController;
|
|
881
|
+
if (team_name) {
|
|
882
|
+
const agentAC = new AbortController();
|
|
883
|
+
if (abortController.signal.aborted) {
|
|
884
|
+
agentAC.abort();
|
|
885
|
+
} else {
|
|
886
|
+
abortController.signal.addEventListener(
|
|
887
|
+
"abort",
|
|
888
|
+
() => agentAC.abort(),
|
|
889
|
+
{ once: true }
|
|
473
890
|
);
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
891
|
+
}
|
|
892
|
+
effectiveAbortController = agentAC;
|
|
893
|
+
try {
|
|
894
|
+
const { registerAgentAbortController } = await import("../../services/agentTeams/teamManager.js");
|
|
895
|
+
registerAgentAbortController(team_name, agentId, agentAC);
|
|
896
|
+
} catch {
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
if (effectiveRunInBackground && team_name) {
|
|
900
|
+
registerBackgroundAgent(
|
|
901
|
+
agentId,
|
|
902
|
+
agentType,
|
|
903
|
+
description,
|
|
904
|
+
effectiveAbortController
|
|
905
|
+
);
|
|
906
|
+
(async () => {
|
|
907
|
+
pushAgentContext(agentId);
|
|
908
|
+
let bgToolUseCount = 0;
|
|
909
|
+
try {
|
|
910
|
+
const { AgentEngine } = await import("../../engine/AgentEngine.js");
|
|
911
|
+
const { getGlobalRegistry } = await import("../../engine/EngineRegistry.js");
|
|
912
|
+
const engine = new AgentEngine({
|
|
480
913
|
agentId,
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
914
|
+
name: teammateName || agentType,
|
|
915
|
+
role: "teammate",
|
|
916
|
+
teamName: team_name,
|
|
917
|
+
systemPrompt: team_name ? () => getSystemPrompt("teammate") : taskPrompt,
|
|
918
|
+
context,
|
|
919
|
+
tools: queryOptions.tools,
|
|
920
|
+
initialMessages: [...messages],
|
|
921
|
+
idleTimeoutMs: 3e4,
|
|
922
|
+
heartbeatIntervalMs: 500,
|
|
923
|
+
maxTurns: max_turns || void 0,
|
|
924
|
+
maxThinkingTokens: queryOptions.maxThinkingTokens,
|
|
925
|
+
model: queryOptions.model,
|
|
926
|
+
forkNumber,
|
|
927
|
+
messageLogName,
|
|
928
|
+
verbose: queryOptions.verbose,
|
|
929
|
+
safeMode: queryOptions.safeMode,
|
|
930
|
+
safetyMode: queryOptions.safetyMode,
|
|
931
|
+
permissionMode: effectivePermissionMode,
|
|
932
|
+
readFileTimestamps,
|
|
933
|
+
canUseTool: hasPermissionsToUseTool,
|
|
934
|
+
askUser: () => Promise.resolve([]),
|
|
935
|
+
setToolJSX: () => {
|
|
936
|
+
},
|
|
937
|
+
onMessage: (message) => {
|
|
938
|
+
appendMessageToTranscript(agentId, message);
|
|
939
|
+
overwriteLog(
|
|
940
|
+
getMessagesPath(
|
|
941
|
+
messageLogName,
|
|
942
|
+
forkNumber,
|
|
943
|
+
getSidechainNumber()
|
|
944
|
+
),
|
|
945
|
+
[...engine.messages].filter((_) => _.type !== "progress")
|
|
946
|
+
);
|
|
947
|
+
if (message.type === "assistant") {
|
|
948
|
+
for (const content of message.message.content) {
|
|
949
|
+
if (content.type === "tool_use") bgToolUseCount++;
|
|
950
|
+
}
|
|
951
|
+
}
|
|
493
952
|
}
|
|
494
953
|
});
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
tools
|
|
505
|
-
};
|
|
506
|
-
} else if (content.type === "tool_use") {
|
|
507
|
-
toolUseCount++;
|
|
508
|
-
const toolMessage = normalizedMessages2.find(
|
|
509
|
-
(_) => _.type === "assistant" && _.message.content[0]?.type === "tool_use" && _.message.content[0].id === content.id
|
|
954
|
+
const globalRegistry = getGlobalRegistry();
|
|
955
|
+
globalRegistry.register(agentId, engine);
|
|
956
|
+
if (effectiveAbortController.signal.aborted) {
|
|
957
|
+
engine.stop();
|
|
958
|
+
} else {
|
|
959
|
+
effectiveAbortController.signal.addEventListener(
|
|
960
|
+
"abort",
|
|
961
|
+
() => engine.stop(),
|
|
962
|
+
{ once: true }
|
|
510
963
|
);
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
...c,
|
|
520
|
-
name: c.name
|
|
521
|
-
// Keep original name, UI will handle display
|
|
522
|
-
};
|
|
523
|
-
}
|
|
524
|
-
return c;
|
|
964
|
+
}
|
|
965
|
+
engine.on((event) => {
|
|
966
|
+
if (event.type === "state_change" && event.to === "stopped") {
|
|
967
|
+
globalRegistry.unregister(agentId);
|
|
968
|
+
if (hookMgr) {
|
|
969
|
+
hookMgr.executeSubagentStop(agentType, agentId).catch(
|
|
970
|
+
(err) => debugLogger.warn("SubagentStop hook failed (Path B)", {
|
|
971
|
+
error: err
|
|
525
972
|
})
|
|
973
|
+
);
|
|
974
|
+
}
|
|
975
|
+
const engineMessages = engine.messages;
|
|
976
|
+
const lastMessage = engineMessages[engineMessages.length - 1];
|
|
977
|
+
if (lastMessage?.type === "assistant") {
|
|
978
|
+
completeAgentTranscript(agentId);
|
|
979
|
+
completeBackgroundAgent(
|
|
980
|
+
agentId,
|
|
981
|
+
lastMessage.message.content.filter(
|
|
982
|
+
(_) => _.type === "text"
|
|
983
|
+
)
|
|
984
|
+
);
|
|
985
|
+
if (loadedAgentConfig?.hooks?.onComplete?.length) {
|
|
986
|
+
const hookContext = createHookContext({
|
|
987
|
+
sessionId: agentId,
|
|
988
|
+
agentId,
|
|
989
|
+
agentType,
|
|
990
|
+
result: lastMessage.message.content.filter((_) => _.type === "text").map((_) => _.text).join("\n")
|
|
991
|
+
});
|
|
992
|
+
executeAgentHooks(
|
|
993
|
+
"onComplete",
|
|
994
|
+
loadedAgentConfig,
|
|
995
|
+
hookContext
|
|
996
|
+
).catch(
|
|
997
|
+
(err) => debugLogger.warn(
|
|
998
|
+
"TASK_AGENT_ONCOMPLETE_HOOK_FAILED (Path B)",
|
|
999
|
+
{
|
|
1000
|
+
agentId,
|
|
1001
|
+
agentType,
|
|
1002
|
+
error: err instanceof Error ? err.message : String(err)
|
|
1003
|
+
}
|
|
1004
|
+
)
|
|
1005
|
+
);
|
|
1006
|
+
}
|
|
1007
|
+
if (loadedAgentConfig?.memory) {
|
|
1008
|
+
const finalResponse = lastMessage.message.content.filter((_) => _.type === "text").map((_) => _.text).join("\n");
|
|
1009
|
+
if (finalResponse.trim()) {
|
|
1010
|
+
saveAgentMemory(
|
|
1011
|
+
agentType,
|
|
1012
|
+
loadedAgentConfig.memory,
|
|
1013
|
+
finalResponse
|
|
1014
|
+
).catch(
|
|
1015
|
+
(err) => debugLogger.warn(
|
|
1016
|
+
"TASK_AGENT_MEMORY_SAVE_FAILED (Path B)",
|
|
1017
|
+
{
|
|
1018
|
+
agentId,
|
|
1019
|
+
agentType,
|
|
1020
|
+
error: err instanceof Error ? err.message : String(err)
|
|
1021
|
+
}
|
|
1022
|
+
)
|
|
1023
|
+
);
|
|
1024
|
+
}
|
|
526
1025
|
}
|
|
527
|
-
}
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
1026
|
+
} else {
|
|
1027
|
+
completeBackgroundAgent(agentId, [
|
|
1028
|
+
{ type: "text", text: "Agent completed." }
|
|
1029
|
+
]);
|
|
1030
|
+
}
|
|
1031
|
+
const idleSummary = lastMessage?.type === "assistant" ? lastMessage.message.content.filter((_) => _.type === "text").map((_) => _.text).join("\n").slice(0, 2e3) || void 0 : void 0;
|
|
1032
|
+
updateInProcessAgentState(agentId, {
|
|
1033
|
+
isIdle: true,
|
|
1034
|
+
lastReportedToolCount: bgToolUseCount
|
|
1035
|
+
});
|
|
1036
|
+
markTeammateCompleted(
|
|
1037
|
+
team_name,
|
|
1038
|
+
agentId,
|
|
1039
|
+
teammateName || agentType,
|
|
1040
|
+
{
|
|
1041
|
+
summary: idleSummary
|
|
1042
|
+
}
|
|
1043
|
+
).catch((err) => {
|
|
1044
|
+
debugLogger.error("TEAMMATE_MARK_COMPLETED_FAILED", {
|
|
1045
|
+
agentId,
|
|
1046
|
+
teamName: team_name,
|
|
1047
|
+
error: err instanceof Error ? err.message : String(err)
|
|
1048
|
+
});
|
|
1049
|
+
});
|
|
534
1050
|
}
|
|
1051
|
+
});
|
|
1052
|
+
await engine.start();
|
|
1053
|
+
await engine.submitPrompt(effectivePrompt);
|
|
1054
|
+
if (engine.isRunning) {
|
|
1055
|
+
await new Promise((resolve) => {
|
|
1056
|
+
engine.on((event) => {
|
|
1057
|
+
if (event.type === "state_change" && event.to === "stopped") {
|
|
1058
|
+
resolve();
|
|
1059
|
+
}
|
|
1060
|
+
});
|
|
1061
|
+
});
|
|
1062
|
+
}
|
|
1063
|
+
} catch (error) {
|
|
1064
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
1065
|
+
failBackgroundAgent(agentId, errorMsg);
|
|
1066
|
+
failAgentTranscript(agentId, errorMsg);
|
|
1067
|
+
markTeammateIdle(team_name, agentId, teammateName || agentType, {
|
|
1068
|
+
status: "failed",
|
|
1069
|
+
failureReason: errorMsg
|
|
1070
|
+
}).catch((err) => {
|
|
1071
|
+
debugLogger.error("TEAMMATE_MARK_IDLE_FAILED", {
|
|
1072
|
+
agentId,
|
|
1073
|
+
teamName: team_name,
|
|
1074
|
+
error: err instanceof Error ? err.message : String(err)
|
|
1075
|
+
});
|
|
1076
|
+
});
|
|
1077
|
+
if (loadedAgentConfig?.hooks?.onError?.length) {
|
|
1078
|
+
const hookContext = createHookContext({
|
|
1079
|
+
sessionId: agentId,
|
|
1080
|
+
agentId,
|
|
1081
|
+
agentType,
|
|
1082
|
+
error: error instanceof Error ? error : new Error(String(error))
|
|
1083
|
+
});
|
|
1084
|
+
executeAgentHooks("onError", loadedAgentConfig, hookContext).catch(
|
|
1085
|
+
() => {
|
|
1086
|
+
}
|
|
1087
|
+
);
|
|
1088
|
+
}
|
|
1089
|
+
} finally {
|
|
1090
|
+
popAgentContext();
|
|
1091
|
+
cleanupAgentStreamingState(agentId);
|
|
1092
|
+
unregisterInProcessAgent(agentId);
|
|
1093
|
+
}
|
|
1094
|
+
})();
|
|
1095
|
+
const bgResultText = `Agent "${teammateName || agentType}" running in background`;
|
|
1096
|
+
yield {
|
|
1097
|
+
type: "result",
|
|
1098
|
+
data: [{ type: "text", text: bgResultText }],
|
|
1099
|
+
resultForAssistant: `Teammate "${teammateName || agentType}" is running in the background. You will be notified automatically when they finish \u2014 do NOT check on them.`
|
|
1100
|
+
};
|
|
1101
|
+
hasYieldedResult = true;
|
|
1102
|
+
return;
|
|
1103
|
+
}
|
|
1104
|
+
pushAgentContext(agentId);
|
|
1105
|
+
const messagesOut = {
|
|
1106
|
+
current: messages
|
|
1107
|
+
};
|
|
1108
|
+
try {
|
|
1109
|
+
const { runForegroundEngine } = await import("../../engine/foregroundAdapter.js");
|
|
1110
|
+
for await (const item of runForegroundEngine({
|
|
1111
|
+
agentId,
|
|
1112
|
+
teamName: team_name,
|
|
1113
|
+
teammateName,
|
|
1114
|
+
agentType,
|
|
1115
|
+
systemPrompt: team_name ? () => getSystemPrompt("teammate") : taskPrompt,
|
|
1116
|
+
context,
|
|
1117
|
+
tools: queryOptions.tools,
|
|
1118
|
+
initialMessages: [...messages],
|
|
1119
|
+
prompt: effectivePrompt,
|
|
1120
|
+
maxTurns: max_turns || void 0,
|
|
1121
|
+
maxThinkingTokens: queryOptions.maxThinkingTokens,
|
|
1122
|
+
model: queryOptions.model,
|
|
1123
|
+
forkNumber,
|
|
1124
|
+
messageLogName,
|
|
1125
|
+
sidechainNumber: getSidechainNumber(),
|
|
1126
|
+
verbose: queryOptions.verbose,
|
|
1127
|
+
safeMode: queryOptions.safeMode,
|
|
1128
|
+
safetyMode: queryOptions.safetyMode,
|
|
1129
|
+
permissionMode: effectivePermissionMode,
|
|
1130
|
+
readFileTimestamps,
|
|
1131
|
+
abortController: effectiveAbortController,
|
|
1132
|
+
messagesOut
|
|
1133
|
+
})) {
|
|
1134
|
+
yield item;
|
|
1135
|
+
if (item.type === "progress" && item.content?.message?.content) {
|
|
1136
|
+
for (const c of item.content.message.content) {
|
|
1137
|
+
if (c.type === "tool_use") toolUseCount++;
|
|
535
1138
|
}
|
|
536
1139
|
}
|
|
537
1140
|
}
|
|
1141
|
+
messages = messagesOut.current;
|
|
538
1142
|
const normalizedMessages = normalizeMessages(messages);
|
|
539
1143
|
const lastMessage = last(messages);
|
|
540
1144
|
if (lastMessage?.type !== "assistant") {
|
|
@@ -615,9 +1219,26 @@ IMPORTANT: You are currently running as ${modelToUse}. You do not need to consul
|
|
|
615
1219
|
tools
|
|
616
1220
|
};
|
|
617
1221
|
}
|
|
1222
|
+
if (team_name) {
|
|
1223
|
+
updateInProcessAgentState(agentId, {
|
|
1224
|
+
isIdle: true,
|
|
1225
|
+
lastReportedToolCount: toolUseCount,
|
|
1226
|
+
lastReportedTokenCount: lastMessage ? (lastMessage.message.usage.cache_creation_input_tokens ?? 0) + (lastMessage.message.usage.cache_read_input_tokens ?? 0) + lastMessage.message.usage.input_tokens + lastMessage.message.usage.output_tokens : 0
|
|
1227
|
+
});
|
|
1228
|
+
const idleSummary = isInterrupted ? void 0 : lastMessage.message.content.filter((_) => _.type === "text").map((_) => _.text).join("\n").slice(0, 2e3) || void 0;
|
|
1229
|
+
markTeammateIdle(team_name, agentId, teammateName || agentType, {
|
|
1230
|
+
status: isInterrupted ? "failed" : "completed",
|
|
1231
|
+
summary: idleSummary,
|
|
1232
|
+
...isInterrupted && { failureReason: "interrupted" }
|
|
1233
|
+
}).catch((err) => debugLogger.trace("MARK_TEAMMATE_IDLE", { error: err }));
|
|
1234
|
+
unregisterInProcessAgent(agentId);
|
|
1235
|
+
}
|
|
618
1236
|
const data = lastMessage.message.content.filter((_) => _.type === "text");
|
|
619
1237
|
const resultWithAgentId = isInterrupted ? `[Interrupted - Agent ID: ${agentId}]
|
|
620
|
-
${this.renderResultForAssistant(data)}` : this.renderResultForAssistant(data)
|
|
1238
|
+
${this.renderResultForAssistant(data)}` : `${this.renderResultForAssistant(data)}
|
|
1239
|
+
|
|
1240
|
+
Agent completed successfully.
|
|
1241
|
+
agentId: ${agentId}`;
|
|
621
1242
|
yield {
|
|
622
1243
|
type: "result",
|
|
623
1244
|
data,
|
|
@@ -691,11 +1312,13 @@ ${this.renderResultForAssistant(data)}` : this.renderResultForAssistant(data);
|
|
|
691
1312
|
hasYieldedResult = true;
|
|
692
1313
|
} finally {
|
|
693
1314
|
if (worktreePath) {
|
|
1315
|
+
let removeSuccess = false;
|
|
694
1316
|
try {
|
|
695
|
-
|
|
1317
|
+
execFileSync("git", ["worktree", "remove", worktreePath, "--force"], {
|
|
696
1318
|
cwd: getCwd(),
|
|
697
1319
|
stdio: "pipe"
|
|
698
1320
|
});
|
|
1321
|
+
removeSuccess = true;
|
|
699
1322
|
debugLogger.info("TASK_AGENT_WORKTREE_REMOVED", {
|
|
700
1323
|
agentId,
|
|
701
1324
|
worktreePath
|
|
@@ -706,9 +1329,28 @@ ${this.renderResultForAssistant(data)}` : this.renderResultForAssistant(data);
|
|
|
706
1329
|
worktreePath
|
|
707
1330
|
});
|
|
708
1331
|
}
|
|
1332
|
+
const hookMgrRemove = getHookManager();
|
|
1333
|
+
hookMgrRemove?.executeWorktreeRemove(
|
|
1334
|
+
worktreePath,
|
|
1335
|
+
agentId,
|
|
1336
|
+
agentType,
|
|
1337
|
+
removeSuccess
|
|
1338
|
+
).catch(
|
|
1339
|
+
(err) => debugLogger.trace("HOOK_WORKTREE_REMOVE", { error: err })
|
|
1340
|
+
);
|
|
709
1341
|
}
|
|
710
1342
|
popAgentContext();
|
|
711
1343
|
cleanupAgentStreamingState(agentId);
|
|
1344
|
+
if (team_name) {
|
|
1345
|
+
try {
|
|
1346
|
+
const { unregisterAgentAbortController } = await import("../../services/agentTeams/teamManager.js");
|
|
1347
|
+
unregisterAgentAbortController(team_name, agentId);
|
|
1348
|
+
} catch {
|
|
1349
|
+
}
|
|
1350
|
+
}
|
|
1351
|
+
if (restoreEnvVars) {
|
|
1352
|
+
restoreEnvVars();
|
|
1353
|
+
}
|
|
712
1354
|
if (!hasYieldedResult) {
|
|
713
1355
|
interruptAgentTranscript(agentId);
|
|
714
1356
|
yield {
|
|
@@ -798,7 +1440,14 @@ ${this.renderResultForAssistant(data)}` : this.renderResultForAssistant(data);
|
|
|
798
1440
|
renderResultForAssistant(data) {
|
|
799
1441
|
return data.map((block) => block.type === "text" ? block.text : "").join("\n");
|
|
800
1442
|
},
|
|
801
|
-
renderToolUseMessage({
|
|
1443
|
+
renderToolUseMessage({
|
|
1444
|
+
description,
|
|
1445
|
+
prompt,
|
|
1446
|
+
model_name,
|
|
1447
|
+
subagent_type,
|
|
1448
|
+
team_name,
|
|
1449
|
+
name: teammateName
|
|
1450
|
+
}, { verbose }) {
|
|
802
1451
|
if (!description || !prompt) return null;
|
|
803
1452
|
const modelManager = getModelManager();
|
|
804
1453
|
const defaultTaskModel = modelManager.getModelName("task");
|
|
@@ -806,6 +1455,21 @@ ${this.renderResultForAssistant(data)}` : this.renderResultForAssistant(data);
|
|
|
806
1455
|
const agentType = subagent_type || "general-purpose";
|
|
807
1456
|
const promptPreview = prompt.length > 80 ? prompt.substring(0, 80) + "..." : prompt;
|
|
808
1457
|
const theme = getTheme();
|
|
1458
|
+
if (team_name) {
|
|
1459
|
+
const displayName = teammateName || agentType;
|
|
1460
|
+
if (verbose) {
|
|
1461
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.info }, "@", displayName), " ", /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "(", agentType, ")"), ":", " ", description), /* @__PURE__ */ React.createElement(
|
|
1462
|
+
Box,
|
|
1463
|
+
{
|
|
1464
|
+
paddingLeft: 2,
|
|
1465
|
+
borderLeftStyle: "single",
|
|
1466
|
+
borderLeftColor: theme.secondaryBorder
|
|
1467
|
+
},
|
|
1468
|
+
/* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, promptPreview)
|
|
1469
|
+
));
|
|
1470
|
+
}
|
|
1471
|
+
return `@${displayName} (${agentType}): ${description}`;
|
|
1472
|
+
}
|
|
809
1473
|
if (verbose) {
|
|
810
1474
|
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, null, "[", agentType, "] ", actualModel, ": ", description), /* @__PURE__ */ React.createElement(
|
|
811
1475
|
Box,
|