@within-7/minto 0.4.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Tool.js +7 -0
- package/dist/Tool.js.map +2 -2
- package/dist/commands/agents/AgentsCommand.js +1 -1
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/agents/constants.js +2 -2
- package/dist/commands/agents/constants.js.map +2 -2
- package/dist/commands/clear.js +4 -3
- package/dist/commands/clear.js.map +2 -2
- package/dist/commands/compact.js +2 -2
- package/dist/commands/compact.js.map +1 -1
- package/dist/commands/context.js +3 -1
- package/dist/commands/context.js.map +2 -2
- package/dist/commands/login.js +128 -0
- package/dist/commands/login.js.map +7 -0
- package/dist/commands/memory.js +33 -82
- package/dist/commands/memory.js.map +2 -2
- package/dist/commands/quit.js +3 -1
- package/dist/commands/quit.js.map +2 -2
- package/dist/commands/resume.js +39 -239
- package/dist/commands/resume.js.map +2 -2
- package/dist/commands/tasks.js +1 -1
- package/dist/commands/tasks.js.map +2 -2
- package/dist/commands/terminalSetup.js +6 -2
- package/dist/commands/terminalSetup.js.map +2 -2
- package/dist/commands.js +2 -0
- package/dist/commands.js.map +2 -2
- package/dist/components/AgentDetailView.js +126 -0
- package/dist/components/AgentDetailView.js.map +7 -0
- package/dist/components/AgentThinkingBlock.js +1 -1
- package/dist/components/AgentThinkingBlock.js.map +2 -2
- package/dist/components/AgentViewBanner.js +22 -0
- package/dist/components/AgentViewBanner.js.map +7 -0
- package/dist/components/HeaderBar.js +1 -1
- package/dist/components/HeaderBar.js.map +2 -2
- package/dist/components/Help.js +8 -1
- package/dist/components/Help.js.map +2 -2
- package/dist/components/HotkeyHelpPanel.js +26 -8
- package/dist/components/HotkeyHelpPanel.js.map +2 -2
- package/dist/components/IdleNotificationBar.js +10 -0
- package/dist/components/IdleNotificationBar.js.map +7 -0
- package/dist/components/ModelSelector/ModelSelector.js +55 -20
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/PromptInput.js +186 -115
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/RewindPanel.js +272 -0
- package/dist/components/RewindPanel.js.map +7 -0
- package/dist/components/Spinner.js +10 -21
- package/dist/components/Spinner.js.map +2 -2
- package/dist/components/StreamingTextPreview.js +29 -0
- package/dist/components/StreamingTextPreview.js.map +7 -0
- package/dist/components/SubagentBlock.js +3 -2
- package/dist/components/SubagentBlock.js.map +2 -2
- package/dist/components/SubagentProgress.js +4 -4
- package/dist/components/SubagentProgress.js.map +2 -2
- package/dist/components/TabbedListView/SearchInput.js +1 -1
- package/dist/components/TabbedListView/SearchInput.js.map +2 -2
- package/dist/components/TabbedListView/TabbedListView.js +87 -41
- package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
- package/dist/components/TaskCard.js +4 -4
- package/dist/components/TaskCard.js.map +2 -2
- package/dist/components/TeamMemberPanel.js +107 -0
- package/dist/components/TeamMemberPanel.js.map +7 -0
- package/dist/components/ThinkingSelector.js +84 -0
- package/dist/components/ThinkingSelector.js.map +7 -0
- package/dist/components/TitledDivider.js +26 -0
- package/dist/components/TitledDivider.js.map +7 -0
- package/dist/components/TodoPanel.js +31 -30
- package/dist/components/TodoPanel.js.map +2 -2
- package/dist/components/TokenWarning.js +28 -7
- package/dist/components/TokenWarning.js.map +2 -2
- package/dist/components/messages/AssistantTextMessage.js +5 -2
- package/dist/components/messages/AssistantTextMessage.js.map +2 -2
- package/dist/components/messages/AssistantToolUseMessage.js +9 -1
- package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
- package/dist/components/messages/DefaultToolResultFallback.js +11 -0
- package/dist/components/messages/DefaultToolResultFallback.js.map +7 -0
- package/dist/components/messages/ParallelTasksGroupView.js +14 -6
- package/dist/components/messages/ParallelTasksGroupView.js.map +2 -2
- package/dist/components/messages/TaskInModuleView.js +27 -27
- package/dist/components/messages/TaskInModuleView.js.map +2 -2
- package/dist/components/messages/UserGuidanceMessage.js +26 -0
- package/dist/components/messages/UserGuidanceMessage.js.map +7 -0
- package/dist/components/messages/UserPromptMessage.js +2 -1
- package/dist/components/messages/UserPromptMessage.js.map +2 -2
- package/dist/components/messages/UserTeamNotificationMessage.js +91 -0
- package/dist/components/messages/UserTeamNotificationMessage.js.map +7 -0
- package/dist/components/messages/UserTextMessage.js +8 -0
- package/dist/components/messages/UserTextMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js +4 -2
- package/dist/components/messages/UserToolResultMessage/UserToolRejectMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js +18 -1
- package/dist/components/messages/UserToolResultMessage/UserToolResultMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +12 -1
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
- package/dist/components/permissions/PermissionRequest.js +4 -0
- package/dist/components/permissions/PermissionRequest.js.map +2 -2
- package/dist/components/permissions/PlanApprovalRequest.js +164 -0
- package/dist/components/permissions/PlanApprovalRequest.js.map +7 -0
- package/dist/constants/agentTeams.js +17 -0
- package/dist/constants/agentTeams.js.map +7 -0
- package/dist/constants/macros.js +2 -1
- package/dist/constants/macros.js.map +2 -2
- package/dist/constants/prompts/agentPrompt.js +1 -0
- package/dist/constants/prompts/agentPrompt.js.map +2 -2
- package/dist/constants/prompts/autoMemory.js +39 -0
- package/dist/constants/prompts/autoMemory.js.map +7 -0
- package/dist/constants/prompts/codeConventions.js +1 -13
- package/dist/constants/prompts/codeConventions.js.map +2 -2
- package/dist/constants/prompts/doingTasks.js +21 -2
- package/dist/constants/prompts/doingTasks.js.map +2 -2
- package/dist/constants/prompts/envInfo.js +6 -7
- package/dist/constants/prompts/envInfo.js.map +2 -2
- package/dist/constants/prompts/index.js +27 -5
- package/dist/constants/prompts/index.js.map +2 -2
- package/dist/constants/prompts/taskManagement.js +2 -43
- package/dist/constants/prompts/taskManagement.js.map +2 -2
- package/dist/constants/prompts/teamOverlays.js +50 -0
- package/dist/constants/prompts/teamOverlays.js.map +7 -0
- package/dist/constants/prompts/toneAndStyle.js +4 -29
- package/dist/constants/prompts/toneAndStyle.js.map +2 -2
- package/dist/constants/prompts/toolUsagePolicy.js +7 -22
- package/dist/constants/prompts/toolUsagePolicy.js.map +2 -2
- package/dist/constants/toolInputExamples.js +2 -2
- package/dist/constants/toolInputExamples.js.map +2 -2
- package/dist/context.js +39 -6
- package/dist/context.js.map +2 -2
- package/dist/core/backupManager.js +1 -1
- package/dist/core/backupManager.js.map +2 -2
- package/dist/core/permissions/rules/planModeRule.js +1 -1
- package/dist/core/permissions/rules/planModeRule.js.map +1 -1
- package/dist/core/permissions/rules/safeModeRule.js +1 -1
- package/dist/core/permissions/rules/safeModeRule.js.map +1 -1
- package/dist/engine/AgentEngine.js +902 -0
- package/dist/engine/AgentEngine.js.map +7 -0
- package/dist/engine/EngineRegistry.js +89 -0
- package/dist/engine/EngineRegistry.js.map +7 -0
- package/dist/engine/foregroundAdapter.js +191 -0
- package/dist/engine/foregroundAdapter.js.map +7 -0
- package/dist/engine/index.js +15 -0
- package/dist/engine/index.js.map +7 -0
- package/dist/engine/types.js +1 -0
- package/dist/engine/types.js.map +7 -0
- package/dist/entrypoints/cli.js +410 -79
- package/dist/entrypoints/cli.js.map +3 -3
- package/dist/hooks/useAgentEngine.js +129 -0
- package/dist/hooks/useAgentEngine.js.map +7 -0
- package/dist/hooks/useAgentTokenStats.js +0 -16
- package/dist/hooks/useAgentTokenStats.js.map +2 -2
- package/dist/hooks/useCanUseTool.js +47 -2
- package/dist/hooks/useCanUseTool.js.map +2 -2
- package/dist/hooks/useDeferredLoading.js +4 -1
- package/dist/hooks/useDeferredLoading.js.map +2 -2
- package/dist/hooks/useIdleNotifications.js +66 -0
- package/dist/hooks/useIdleNotifications.js.map +7 -0
- package/dist/hooks/useSessionTracking.js +9 -7
- package/dist/hooks/useSessionTracking.js.map +2 -2
- package/dist/hooks/useTeamMembers.js +51 -0
- package/dist/hooks/useTeamMembers.js.map +7 -0
- package/dist/i18n/locales/en.js +77 -12
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.js +77 -12
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/i18n/types.js.map +1 -1
- package/dist/messages.js.map +2 -2
- package/dist/permissions.js +113 -7
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +135 -37
- package/dist/query.js.map +2 -2
- package/dist/screens/REPL.js +504 -361
- package/dist/screens/REPL.js.map +3 -3
- package/dist/screens/ResumeConversation.js +199 -14
- package/dist/screens/ResumeConversation.js.map +2 -2
- package/dist/services/adapters/base.js.map +1 -1
- package/dist/services/agentTeams/backends/headless.js +108 -0
- package/dist/services/agentTeams/backends/headless.js.map +7 -0
- package/dist/services/agentTeams/backends/inProcess.js +102 -0
- package/dist/services/agentTeams/backends/inProcess.js.map +7 -0
- package/dist/services/agentTeams/backends/resolver.js +18 -0
- package/dist/services/agentTeams/backends/resolver.js.map +7 -0
- package/dist/services/agentTeams/backends/tmux.js +168 -0
- package/dist/services/agentTeams/backends/tmux.js.map +7 -0
- package/dist/services/agentTeams/backends/types.js +1 -0
- package/dist/services/agentTeams/backends/types.js.map +7 -0
- package/dist/services/agentTeams/heartbeat.js +88 -0
- package/dist/services/agentTeams/heartbeat.js.map +7 -0
- package/dist/services/agentTeams/index.js +42 -2
- package/dist/services/agentTeams/index.js.map +2 -2
- package/dist/services/agentTeams/injectionChannel.js +105 -0
- package/dist/services/agentTeams/injectionChannel.js.map +7 -0
- package/dist/services/agentTeams/mailbox.js +410 -30
- package/dist/services/agentTeams/mailbox.js.map +2 -2
- package/dist/services/agentTeams/messageFormatter.js +80 -0
- package/dist/services/agentTeams/messageFormatter.js.map +7 -0
- package/dist/services/agentTeams/permissionDelegation.js +71 -0
- package/dist/services/agentTeams/permissionDelegation.js.map +7 -0
- package/dist/services/agentTeams/teamEvents.js +45 -0
- package/dist/services/agentTeams/teamEvents.js.map +7 -0
- package/dist/services/agentTeams/teamManager.js +251 -34
- package/dist/services/agentTeams/teamManager.js.map +2 -2
- package/dist/services/agentTeams/teamTaskStore.js +290 -61
- package/dist/services/agentTeams/teamTaskStore.js.map +2 -2
- package/dist/services/agentTeams/teammateSpawner.js +99 -18
- package/dist/services/agentTeams/teammateSpawner.js.map +2 -2
- package/dist/services/hookExecutor.js +51 -8
- package/dist/services/hookExecutor.js.map +2 -2
- package/dist/services/llm/anthropicProvider.js +56 -59
- package/dist/services/llm/anthropicProvider.js.map +2 -2
- package/dist/services/llm/dispatch.js +24 -5
- package/dist/services/llm/dispatch.js.map +2 -2
- package/dist/services/llm/openaiProvider.js +115 -136
- package/dist/services/llm/openaiProvider.js.map +3 -3
- package/dist/services/llm/types.js +89 -15
- package/dist/services/llm/types.js.map +2 -2
- package/dist/services/mcpClient.js +80 -4
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/mintoAuth.js +299 -0
- package/dist/services/mintoAuth.js.map +7 -0
- package/dist/services/oauth.js +3 -3
- package/dist/services/oauth.js.map +2 -2
- package/dist/services/openai.js +91 -20
- package/dist/services/openai.js.map +2 -2
- package/dist/services/plugins/pluginRuntime.js +11 -5
- package/dist/services/plugins/pluginRuntime.js.map +2 -2
- package/dist/services/plugins/pluginValidation.js +4 -2
- package/dist/services/plugins/pluginValidation.js.map +2 -2
- package/dist/services/sandbox/sandboxController.js +11 -3
- package/dist/services/sandbox/sandboxController.js.map +2 -2
- package/dist/services/sessionMemoryInjector.js +77 -0
- package/dist/services/sessionMemoryInjector.js.map +7 -0
- package/dist/services/systemReminder.js +130 -8
- package/dist/services/systemReminder.js.map +2 -2
- package/dist/services/taskStore.js +199 -8
- package/dist/services/taskStore.js.map +3 -3
- package/dist/services/topicDetector.js +169 -0
- package/dist/services/topicDetector.js.map +7 -0
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +0 -13
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
- package/dist/tools/BashTool/BashTool.js +51 -28
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/BashTool/prompt.js +95 -118
- package/dist/tools/BashTool/prompt.js.map +2 -2
- package/dist/tools/BashTool/utils.js +39 -1
- package/dist/tools/BashTool/utils.js.map +2 -2
- package/dist/tools/EnterWorktreeTool/EnterWorktreeTool.js +121 -0
- package/dist/tools/EnterWorktreeTool/EnterWorktreeTool.js.map +7 -0
- package/dist/tools/EnterWorktreeTool/prompt.js +22 -0
- package/dist/tools/EnterWorktreeTool/prompt.js.map +7 -0
- package/dist/tools/FileEditTool/FileEditTool.js +9 -4
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileEditTool/prompt.js +3 -7
- package/dist/tools/FileEditTool/prompt.js.map +2 -2
- package/dist/tools/FileReadTool/FileReadTool.js +125 -3
- package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
- package/dist/tools/FileReadTool/prompt.js +1 -2
- package/dist/tools/FileReadTool/prompt.js.map +2 -2
- package/dist/tools/FileWriteTool/prompt.js +3 -5
- package/dist/tools/FileWriteTool/prompt.js.map +2 -2
- package/dist/tools/GlobTool/GlobTool.js +3 -2
- package/dist/tools/GlobTool/GlobTool.js.map +2 -2
- package/dist/tools/GrepTool/GrepTool.js +16 -5
- package/dist/tools/GrepTool/GrepTool.js.map +2 -2
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +2 -2
- package/dist/tools/MCPSearchTool/MCPSearchTool.js +172 -0
- package/dist/tools/MCPSearchTool/MCPSearchTool.js.map +7 -0
- package/dist/tools/MCPSearchTool/prompt.js +77 -0
- package/dist/tools/MCPSearchTool/prompt.js.map +7 -0
- package/dist/tools/MultiEditTool/prompt.js +4 -7
- package/dist/tools/MultiEditTool/prompt.js.map +2 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +12 -8
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +54 -1
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
- package/dist/tools/PlanModeTool/prompt.js +23 -74
- package/dist/tools/PlanModeTool/prompt.js.map +2 -2
- package/dist/tools/SendMessageTool/SendMessageTool.js +341 -0
- package/dist/tools/SendMessageTool/SendMessageTool.js.map +7 -0
- package/dist/tools/SendMessageTool/prompt.js +44 -0
- package/dist/tools/SendMessageTool/prompt.js.map +7 -0
- package/dist/tools/TaskCreateTool/prompt.js +15 -4
- package/dist/tools/TaskCreateTool/prompt.js.map +2 -2
- package/dist/tools/TaskListTool/prompt.js +18 -3
- package/dist/tools/TaskListTool/prompt.js.map +2 -2
- package/dist/tools/TaskOutputTool/prompt.js +4 -3
- package/dist/tools/TaskOutputTool/prompt.js.map +2 -2
- package/dist/tools/TaskTool/TaskTool.js +762 -98
- package/dist/tools/TaskTool/TaskTool.js.map +3 -3
- package/dist/tools/TaskTool/constants.js +8 -2
- package/dist/tools/TaskTool/constants.js.map +2 -2
- package/dist/tools/TaskTool/prompt.js +74 -70
- package/dist/tools/TaskTool/prompt.js.map +2 -2
- package/dist/tools/TaskUpdateTool/TaskUpdateTool.js +15 -1
- package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +2 -2
- package/dist/tools/TeamCreateTool/TeamCreateTool.js +129 -0
- package/dist/tools/TeamCreateTool/TeamCreateTool.js.map +7 -0
- package/dist/tools/TeamCreateTool/prompt.js +58 -0
- package/dist/tools/TeamCreateTool/prompt.js.map +7 -0
- package/dist/tools/TeamDeleteTool/TeamDeleteTool.js +151 -0
- package/dist/tools/TeamDeleteTool/TeamDeleteTool.js.map +7 -0
- package/dist/tools/TeamDeleteTool/prompt.js +16 -0
- package/dist/tools/TeamDeleteTool/prompt.js.map +7 -0
- package/dist/tools/URLFetcherTool/URLFetcherTool.js +106 -15
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/prompt.js +3 -2
- package/dist/tools/URLFetcherTool/prompt.js.map +2 -2
- package/dist/tools/WebSearchTool/WebSearchTool.js +2 -1
- package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
- package/dist/tools/WebSearchTool/prompt.js +5 -4
- package/dist/tools/WebSearchTool/prompt.js.map +2 -2
- package/dist/tools.js +100 -20
- package/dist/tools.js.map +2 -2
- package/dist/types/PermissionMode.js +35 -6
- package/dist/types/PermissionMode.js.map +2 -2
- package/dist/types/hooks.js +2 -0
- package/dist/types/hooks.js.map +2 -2
- package/dist/types/plugin.js +2 -0
- package/dist/types/plugin.js.map +3 -3
- package/dist/utils/CircuitBreaker.js +15 -9
- package/dist/utils/CircuitBreaker.js.map +2 -2
- package/dist/utils/agentLoader.js +249 -112
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/animationManager.js +40 -3
- package/dist/utils/animationManager.js.map +2 -2
- package/dist/utils/ask.js +7 -6
- package/dist/utils/ask.js.map +2 -2
- package/dist/utils/atomicWrite.js +23 -0
- package/dist/utils/atomicWrite.js.map +7 -0
- package/dist/utils/autoCompactCore.js +73 -56
- package/dist/utils/autoCompactCore.js.map +2 -2
- package/dist/utils/autoMemoryPaths.js +89 -0
- package/dist/utils/autoMemoryPaths.js.map +7 -0
- package/dist/utils/config.js +63 -38
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/configSchema.js +13 -8
- package/dist/utils/configSchema.js.map +2 -2
- package/dist/utils/credentials/index.js +14 -0
- package/dist/utils/credentials/index.js.map +2 -2
- package/dist/utils/dualPath.js +24 -0
- package/dist/utils/dualPath.js.map +7 -0
- package/dist/utils/exit.js +66 -7
- package/dist/utils/exit.js.map +2 -2
- package/dist/utils/externalEditor.js +155 -0
- package/dist/utils/externalEditor.js.map +7 -0
- package/dist/utils/fileLock.js +67 -0
- package/dist/utils/fileLock.js.map +7 -0
- package/dist/utils/format.js +24 -14
- package/dist/utils/format.js.map +2 -2
- package/dist/utils/globalErrorHandler.js +5 -96
- package/dist/utils/globalErrorHandler.js.map +3 -3
- package/dist/utils/groupHandlers/parallelTasksHandler.js +5 -3
- package/dist/utils/groupHandlers/parallelTasksHandler.js.map +2 -2
- package/dist/utils/groupHandlers/taskHandler.js +2 -2
- package/dist/utils/groupHandlers/taskHandler.js.map +2 -2
- package/dist/utils/hookManager.js +64 -6
- package/dist/utils/hookManager.js.map +2 -2
- package/dist/utils/log.js +6 -2
- package/dist/utils/log.js.map +2 -2
- package/dist/utils/markdown.js +237 -19
- package/dist/utils/markdown.js.map +2 -2
- package/dist/utils/messageContextManager.js +18 -5
- package/dist/utils/messageContextManager.js.map +2 -2
- package/dist/utils/messageGroupManager.js +1 -1
- package/dist/utils/messageGroupManager.js.map +2 -2
- package/dist/utils/messages.js +104 -46
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/model.js +2 -2
- package/dist/utils/model.js.map +2 -2
- package/dist/utils/pasteCache.js +8 -4
- package/dist/utils/pasteCache.js.map +2 -2
- package/dist/utils/pluginLoader.js +18 -0
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/secureKeyStorage.js +36 -7
- package/dist/utils/secureKeyStorage.js.map +2 -2
- package/dist/utils/simpleMode.js +7 -0
- package/dist/utils/simpleMode.js.map +7 -0
- package/dist/utils/streamingState.js +11 -1
- package/dist/utils/streamingState.js.map +2 -2
- package/dist/utils/taskDisplayUtils.js +2 -1
- package/dist/utils/taskDisplayUtils.js.map +2 -2
- package/dist/utils/teamConfig.js +2 -2
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/thinking.js +6 -2
- package/dist/utils/thinking.js.map +3 -3
- package/dist/utils/tokenProgress.js +55 -0
- package/dist/utils/tokenProgress.js.map +7 -0
- package/dist/utils/toolRiskClassification.js +26 -17
- package/dist/utils/toolRiskClassification.js.map +2 -2
- package/dist/utils/tooling/toolError.js +12 -0
- package/dist/utils/tooling/toolError.js.map +7 -0
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +10 -8
package/dist/query.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/query.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n Message as APIAssistantMessage,\n MessageParam,\n ToolUseBlock,\n} from '@anthropic-ai/sdk/resources/index.mjs'\nimport { z } from 'zod'\nimport type { UUID } from './types/common'\nimport type { ThinkingMetadata } from './types/thinking'\nimport type { Tool, ToolUseContext, AskUserFn, SetToolJSXFn } from './Tool'\nimport {\n messagePairValidForBinaryFeedback,\n shouldUseBinaryFeedback,\n} from '@components/binary-feedback/utils'\nimport { CanUseToolFn } from './hooks/useCanUseTool'\nimport {\n formatSystemPromptWithContext,\n queryLLM,\n queryModel,\n} from '@services/claude'\nimport { emitReminderEvent } from '@services/systemReminder'\nimport {\n TOOL_INPUT_EXAMPLES,\n TOOL_DESCRIPTIONS,\n PARAMETER_DESCRIPTIONS,\n} from '@constants/toolInputExamples'\nimport { all } from '@utils/generators'\nimport { logError } from '@utils/log'\nimport {\n debug,\n markPhase,\n getCurrentRequest,\n logUserFriendly,\n} from './utils/debugLogger'\nimport { getModelManager } from '@utils/model'\nimport {\n createAssistantMessage,\n createAssistantAPIErrorMessage,\n createProgressMessage,\n createToolResultStopMessage,\n createUserMessage,\n FullToolUseResult,\n INTERRUPT_MESSAGE,\n INTERRUPT_MESSAGE_FOR_TOOL_USE,\n NormalizedMessage,\n normalizeMessagesForAPI,\n} from '@utils/messages'\nimport { createToolExecutionController } from '@utils/toolExecutionController'\nimport { withTimeout, ToolTimeoutError } from '@utils/toolTimeout'\nimport { setStreamingState, resetStreamingState } from '@utils/streamingState'\nimport { BashTool } from '@tools/BashTool/BashTool'\n\n/**\n * Normalize tool result content for API submission.\n * Ensures content is always a string regardless of input type.\n */\nfunction normalizeToolResultContent(content: unknown): string {\n if (content === null || content === undefined) {\n return '(no content)'\n }\n if (typeof content === 'string') {\n return content || '(no content)'\n }\n if (Array.isArray(content)) {\n // Handle array of content blocks (e.g., TextBlock[])\n return content\n .map(item => {\n if (typeof item === 'string') return item\n if (item && typeof item === 'object' && 'text' in item)\n return String(item.text)\n return JSON.stringify(item)\n })\n .join('\\n')\n }\n if (typeof content === 'object') {\n // Handle objects - try to extract text or stringify\n if ('text' in content) return String((content as { text: unknown }).text)\n return JSON.stringify(content)\n }\n return String(content)\n}\nimport { getCwd } from './utils/state'\nimport { checkAutoCompact } from './utils/autoCompactCore'\nimport { getHookManager } from '@utils/hookManager'\nimport { recordToolCall } from '@utils/stats'\n\n// Extended ToolUseContext for query functions\ninterface ExtendedToolUseContext extends ToolUseContext {\n abortController: AbortController\n options: {\n commands: import('./commands').Command[]\n forkNumber: number\n messageLogName: string\n tools: Tool[]\n verbose: boolean\n /** @deprecated Use safetyMode instead */\n safeMode?: boolean\n /** Safety mode: 'yolo' | 'smart' | 'strict' */\n safetyMode?: import('./utils/config').SafetyMode\n maxThinkingTokens: number\n isKodingRequest?: boolean\n model?: string | import('./utils/config').ModelPointerType\n }\n readFileTimestamps: { [filename: string]: number }\n setToolJSX: SetToolJSXFn\n askUser?: AskUserFn\n requestId?: string\n}\n\nexport type Response = { costUSD: number; response: string }\nexport type UserMessage = {\n message: MessageParam\n type: 'user'\n uuid: UUID\n toolUseResult?: FullToolUseResult\n options?: {\n isKodingRequest?: boolean\n kodingContext?: string\n isCustomCommand?: boolean\n commandName?: string\n commandArgs?: string\n }\n}\n\nexport type AssistantMessage = {\n costUSD: number\n durationMs: number\n message: APIAssistantMessage\n type: 'assistant'\n uuid: UUID\n isApiErrorMessage?: boolean\n responseId?: string // For GPT-5 Responses API state management\n /**\n * Original message UUID before normalization.\n * When a message with multiple content blocks is split into individual messages,\n * each resulting message will have a unique `uuid` but share the same `originalUuid`.\n * This is used to identify parallel tool calls from the same assistant message.\n */\n originalUuid?: UUID\n /**\n * Metadata for thinking blocks if present.\n * Used to display duration and character count in verbose mode.\n */\n thinkingMetadata?: ThinkingMetadata\n}\n\nexport type BinaryFeedbackResult =\n | { message: AssistantMessage | null; shouldSkipPermissionCheck: false }\n | { message: AssistantMessage; shouldSkipPermissionCheck: true }\n\n/**\n * Streaming output content for tools like BashTool\n */\nexport type StreamingProgressContent = {\n type: 'streaming'\n toolName: string\n stdout: string\n stderr: string\n isStreaming: boolean\n}\n\nexport type ProgressMessage = {\n content: AssistantMessage | StreamingProgressContent\n normalizedMessages: NormalizedMessage[]\n siblingToolUseIDs: Set<string>\n tools: Tool[]\n toolUseID: string\n type: 'progress'\n uuid: UUID\n}\n\n// Each array item is either a single message or a message-and-response pair\nexport type Message = UserMessage | AssistantMessage | ProgressMessage\n\nconst MAX_TOOL_USE_CONCURRENCY = 10\n\n/**\n * Maximum recursion depth for query calls.\n * Prevents stack overflow from infinite tool use loops.\n */\nconst MAX_QUERY_DEPTH = 50\n\n/**\n * Error thrown when query depth limit is exceeded\n */\nexport class QueryDepthExceededError extends Error {\n constructor(depth: number) {\n super(\n `Query depth limit exceeded (${depth}/${MAX_QUERY_DEPTH}). ` +\n `This usually indicates an infinite loop in tool usage.`,\n )\n this.name = 'QueryDepthExceededError'\n }\n}\n\n// Returns a message if we got one, or `null` if the user cancelled\nasync function queryWithBinaryFeedback(\n toolUseContext: ExtendedToolUseContext,\n getAssistantResponse: () => Promise<AssistantMessage>,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n): Promise<BinaryFeedbackResult> {\n if (\n process.env.USER_TYPE !== 'ant' ||\n !getBinaryFeedbackResponse ||\n !(await shouldUseBinaryFeedback())\n ) {\n const assistantMessage = await getAssistantResponse()\n if (toolUseContext.abortController.signal.aborted) {\n return { message: null, shouldSkipPermissionCheck: false }\n }\n return { message: assistantMessage, shouldSkipPermissionCheck: false }\n }\n const [m1, m2] = await Promise.all([\n getAssistantResponse(),\n getAssistantResponse(),\n ])\n if (toolUseContext.abortController.signal.aborted) {\n return { message: null, shouldSkipPermissionCheck: false }\n }\n if (m2.isApiErrorMessage) {\n // If m2 is an error, we might as well return m1, even if it's also an error --\n // the UI will display it as an error as it would in the non-feedback path.\n return { message: m1, shouldSkipPermissionCheck: false }\n }\n if (m1.isApiErrorMessage) {\n return { message: m2, shouldSkipPermissionCheck: false }\n }\n if (!messagePairValidForBinaryFeedback(m1, m2)) {\n return { message: m1, shouldSkipPermissionCheck: false }\n }\n return await getBinaryFeedbackResponse(m1, m2)\n}\n\n/**\n * The rules of thinking are lengthy and fortuitous. They require plenty of thinking\n * of most long duration and deep meditation for a wizard to wrap one's noggin around.\n *\n * The rules follow:\n * 1. A message that contains a thinking or redacted_thinking block must be part of a query whose max_thinking_length > 0\n * 2. A thinking block may not be the last message in a block\n * 3. Thinking blocks must be preserved for the duration of an assistant trajectory (a single turn, or if that turn includes a tool_use block then also its subsequent tool_result and the following assistant message)\n *\n * Heed these rules well, young wizard. For they are the rules of thinking, and\n * the rules of thinking are the rules of the universe. If ye does not heed these\n * rules, ye will be punished with an entire day of debugging and hair pulling.\n */\nexport async function* query(\n messages: Message[],\n systemPrompt: string[],\n context: { [k: string]: string },\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n _depth: number = 0, // Internal: tracks recursion depth\n): AsyncGenerator<Message, void> {\n // Check recursion depth to prevent stack overflow\n if (_depth > MAX_QUERY_DEPTH) {\n const error = new QueryDepthExceededError(_depth)\n logError(error)\n yield createAssistantAPIErrorMessage(error.message)\n return\n }\n const currentRequest = getCurrentRequest()\n\n markPhase('QUERY_INIT')\n\n // Auto-compact check\n // \u2705 P2 FIX: Show compaction status in UI\n setStreamingState({ phase: 'compacting' })\n\n const { messages: processedMessages, wasCompacted } = await checkAutoCompact(\n messages,\n toolUseContext,\n )\n if (wasCompacted) {\n messages = processedMessages\n debug.flow('CONTEXT_COMPACTED', {\n originalCount: messages.length,\n compactedCount: processedMessages.length,\n })\n }\n\n markPhase('SYSTEM_PROMPT_BUILD')\n\n const { systemPrompt: fullSystemPrompt, reminders } =\n formatSystemPromptWithContext(systemPrompt, context, toolUseContext.agentId)\n\n // Emit session startup event\n emitReminderEvent('session:startup', {\n agentId: toolUseContext.agentId,\n messages: messages.length,\n timestamp: Date.now(),\n })\n\n // Inject reminders into system prompt (not user messages) to prevent UI leakage\n if (reminders) {\n fullSystemPrompt.push(reminders)\n }\n\n markPhase('LLM_PREPARATION')\n\n // Update streaming state for UI feedback\n setStreamingState({ phase: 'waiting' })\n\n function getAssistantResponse() {\n return queryLLM(\n normalizeMessagesForAPI(messages),\n fullSystemPrompt,\n toolUseContext.options.maxThinkingTokens,\n toolUseContext.options.tools,\n toolUseContext.abortController.signal,\n {\n safeMode: toolUseContext.options.safeMode ?? false,\n model: toolUseContext.options.model || 'main',\n prependCLISysprompt: true,\n toolUseContext: toolUseContext,\n },\n )\n }\n\n const result = await queryWithBinaryFeedback(\n toolUseContext,\n getAssistantResponse,\n getBinaryFeedbackResponse,\n )\n\n // If request was cancelled, return immediately with interrupt message\n if (toolUseContext.abortController.signal.aborted) {\n yield createAssistantMessage(INTERRUPT_MESSAGE)\n return\n }\n\n if (result.message === null) {\n yield createAssistantMessage(INTERRUPT_MESSAGE)\n return\n }\n\n const assistantMessage = result.message\n const shouldSkipPermissionCheck = result.shouldSkipPermissionCheck\n\n // Update streaming state - we got a response\n setStreamingState({ phase: 'generating' })\n\n yield assistantMessage\n\n // @see https://docs.anthropic.com/en/docs/build-with-claude/tool-use\n // Note: stop_reason === 'tool_use' is unreliable -- it's not always set correctly\n const toolUseMessages = assistantMessage.message.content.filter(\n _ => _.type === 'tool_use',\n )\n\n // If there's no more tool use, we're done\n if (!toolUseMessages.length) {\n resetStreamingState()\n\n // Fire Stop hook (fire-and-forget)\n const hookManager = getHookManager()\n if (hookManager) {\n hookManager.executeStop().catch(() => {})\n }\n\n return\n }\n\n const toolResults: UserMessage[] = []\n\n // Smart concurrency: separate tools into serial and concurrent groups\n // This allows mixing TodoWrite (serial) with multiple Task calls (concurrent)\n const serialTools: ToolUseBlock[] = []\n const concurrentTools: ToolUseBlock[] = []\n\n for (const msg of toolUseMessages) {\n const tool = toolUseContext.options.tools.find(t => t.name === msg.name)\n const isSafe = tool?.isConcurrencySafe?.() ?? tool?.isReadOnly?.() ?? false\n if (isSafe) {\n concurrentTools.push(msg)\n } else {\n serialTools.push(msg)\n }\n }\n\n // Debug: Log concurrency decision\n debug.flow('TOOL_CONCURRENCY_CHECK', {\n toolCount: toolUseMessages.length,\n serialTools: serialTools.map(msg => msg.name),\n concurrentTools: concurrentTools.map(msg => msg.name),\n concurrencyDetails: toolUseMessages.map(msg => {\n const tool = toolUseContext.options.tools.find(t => t.name === msg.name)\n return {\n name: msg.name,\n isConcurrencySafe: tool?.isConcurrencySafe?.() ?? 'undefined',\n isReadOnly: tool?.isReadOnly?.() ?? 'undefined',\n }\n }),\n })\n\n // Step 1: Execute serial tools first (e.g., TodoWrite)\n if (serialTools.length > 0) {\n debug.flow('SERIAL_TOOLS_START', {\n count: serialTools.length,\n tools: serialTools.map(t => t.name),\n })\n for await (const message of runToolsSerially(\n serialTools,\n assistantMessage,\n canUseTool,\n toolUseContext,\n shouldSkipPermissionCheck,\n )) {\n yield message\n if (message.type === 'user') {\n toolResults.push(message)\n }\n }\n debug.flow('SERIAL_TOOLS_COMPLETE', {\n count: serialTools.length,\n })\n }\n\n // Step 2: Execute concurrent tools in parallel (e.g., multiple Task calls)\n if (concurrentTools.length > 0) {\n debug.flow('CONCURRENT_TOOLS_START', {\n count: concurrentTools.length,\n tools: concurrentTools.map(t => t.name),\n maxConcurrency: MAX_TOOL_USE_CONCURRENCY,\n })\n\n // \u2705 P2 FIX: Update UI to show concurrent task count\n setStreamingState({\n phase: 'concurrent',\n concurrentCount: concurrentTools.length,\n })\n\n const concurrentStartTime = Date.now()\n for await (const message of runToolsConcurrently(\n concurrentTools,\n assistantMessage,\n canUseTool,\n toolUseContext,\n shouldSkipPermissionCheck,\n )) {\n yield message\n if (message.type === 'user') {\n toolResults.push(message)\n }\n }\n debug.flow('CONCURRENT_TOOLS_COMPLETE', {\n count: concurrentTools.length,\n durationMs: Date.now() - concurrentStartTime,\n })\n }\n\n if (toolUseContext.abortController.signal.aborted) {\n yield createAssistantMessage(INTERRUPT_MESSAGE_FOR_TOOL_USE)\n return\n }\n\n // Sort toolResults to match the order of toolUseMessages\n const orderedToolResults = toolResults.sort((a, b) => {\n const aIndex = toolUseMessages.findIndex(\n tu => tu.id === (a.message.content[0] as ToolUseBlock).id,\n )\n const bIndex = toolUseMessages.findIndex(\n tu => tu.id === (b.message.content[0] as ToolUseBlock).id,\n )\n return aIndex - bIndex\n })\n\n // Process contextModifier and newMessages from tool results\n // These are used by SlashCommandTool to modify context and inject messages\n let modifiedContext = toolUseContext\n const additionalMessages: Message[] = []\n\n for (const result of orderedToolResults) {\n if (result.toolUseResult?.contextModifier) {\n // Apply context modifier (e.g., allowed tools, model switching)\n modifiedContext =\n result.toolUseResult.contextModifier.modifyContext(modifiedContext)\n debug.flow('CONTEXT_MODIFIER_APPLIED', {\n toolResultId: (result.message.content[0] as ToolUseBlock)?.id,\n })\n }\n\n if (\n result.toolUseResult?.newMessages &&\n Array.isArray(result.toolUseResult.newMessages)\n ) {\n // Add new messages from tool execution (e.g., skill-generated prompts)\n for (const msg of result.toolUseResult.newMessages) {\n if (msg && typeof msg === 'object' && 'type' in msg) {\n additionalMessages.push(msg as Message)\n }\n }\n debug.flow('NEW_MESSAGES_ADDED', {\n count: result.toolUseResult.newMessages.length,\n })\n }\n }\n\n // Recursive query with depth tracking\n\n try {\n yield* await query(\n [\n ...messages,\n assistantMessage,\n ...orderedToolResults,\n ...additionalMessages,\n ],\n systemPrompt,\n context,\n canUseTool,\n modifiedContext, // Use modified context if contextModifier was applied\n getBinaryFeedbackResponse,\n _depth + 1, // Increment depth for recursion tracking\n )\n } catch (error) {\n // \uD83D\uDD27 CRITICAL FIX: Yield error message instead of just re-throwing\n // This ensures the UI receives proper feedback when recursive query fails\n const errorMessage = error instanceof Error ? error.message : String(error)\n logError(`Recursive query error: ${errorMessage}`)\n\n // Yield an error message so the UI can display it\n yield createAssistantAPIErrorMessage(`Query failed: ${errorMessage}`)\n\n // Re-throw to propagate to caller for additional handling if needed\n throw error\n }\n}\n\nasync function* runToolsConcurrently(\n toolUseMessages: ToolUseBlock[],\n assistantMessage: AssistantMessage,\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<Message, void> {\n yield* all(\n toolUseMessages.map(toolUse =>\n runToolUse(\n toolUse,\n new Set(toolUseMessages.map(_ => _.id)),\n assistantMessage,\n canUseTool,\n toolUseContext,\n shouldSkipPermissionCheck,\n ),\n ),\n MAX_TOOL_USE_CONCURRENCY,\n toolUseContext.abortController.signal, // Pass abort signal for proper cancellation\n )\n}\n\nasync function* runToolsSerially(\n toolUseMessages: ToolUseBlock[],\n assistantMessage: AssistantMessage,\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<Message, void> {\n for (const toolUse of toolUseMessages) {\n yield* runToolUse(\n toolUse,\n new Set(toolUseMessages.map(_ => _.id)),\n assistantMessage,\n canUseTool,\n toolUseContext,\n shouldSkipPermissionCheck,\n )\n }\n}\n\nexport async function* runToolUse(\n toolUse: ToolUseBlock,\n siblingToolUseIDs: Set<string>,\n assistantMessage: AssistantMessage,\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<Message, void> {\n const currentRequest = getCurrentRequest()\n\n // \uD83D\uDD0D Debug: \u5DE5\u5177\u8C03\u7528\u5F00\u59CB\n debug.flow('TOOL_USE_START', {\n toolName: toolUse.name,\n toolUseID: toolUse.id,\n inputSize: JSON.stringify(toolUse.input).length,\n siblingToolCount: siblingToolUseIDs.size,\n shouldSkipPermissionCheck: !!shouldSkipPermissionCheck,\n requestId: currentRequest?.id,\n })\n\n logUserFriendly(\n 'TOOL_EXECUTION',\n {\n toolName: toolUse.name,\n action: 'Starting',\n target: toolUse.input ? Object.keys(toolUse.input).join(', ') : '',\n },\n currentRequest?.id,\n )\n\n const toolName = toolUse.name\n const tool = toolUseContext.options.tools.find(t => t.name === toolName)\n\n // Update streaming state to show tool execution\n setStreamingState({ phase: 'tool_use', toolName })\n\n // Check if the tool exists\n if (!tool) {\n debug.error('TOOL_NOT_FOUND', {\n requestedTool: toolName,\n availableTools: toolUseContext.options.tools.map(t => t.name),\n toolUseID: toolUse.id,\n requestId: currentRequest?.id,\n })\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: `Error: No such tool available: ${toolName}`,\n is_error: true,\n tool_use_id: toolUse.id,\n },\n ])\n return\n }\n\n const toolInput = toolUse.input as { [key: string]: string }\n\n debug.flow('TOOL_VALIDATION_START', {\n toolName: tool.name,\n toolUseID: toolUse.id,\n inputKeys: Object.keys(toolInput),\n requestId: currentRequest?.id,\n })\n\n try {\n // \uD83D\uDD27 Check for cancellation before starting tool execution\n if (toolUseContext.abortController.signal.aborted) {\n debug.flow('TOOL_USE_CANCELLED_BEFORE_START', {\n toolName: tool.name,\n toolUseID: toolUse.id,\n abortReason: 'AbortController signal',\n requestId: currentRequest?.id,\n })\n\n const message = createUserMessage([\n createToolResultStopMessage(toolUse.id),\n ])\n yield message\n return\n }\n\n // Track if any progress messages were yielded\n let hasProgressMessages = false\n\n for await (const message of checkPermissionsAndCallTool(\n tool,\n toolUse.id,\n siblingToolUseIDs,\n toolInput,\n toolUseContext,\n canUseTool,\n assistantMessage,\n shouldSkipPermissionCheck,\n )) {\n // \uD83D\uDD27 Check for cancellation during tool execution\n if (toolUseContext.abortController.signal.aborted) {\n debug.flow('TOOL_USE_CANCELLED_DURING_EXECUTION', {\n toolName: tool.name,\n toolUseID: toolUse.id,\n hasProgressMessages,\n abortReason: 'AbortController signal during execution',\n requestId: currentRequest?.id,\n })\n\n // If we yielded progress messages but got cancelled, yield a cancellation result\n if (hasProgressMessages && message.type === 'progress') {\n yield message // yield the last progress message first\n }\n\n // Always yield a tool result message for cancellation to clear UI state\n const cancelMessage = createUserMessage([\n createToolResultStopMessage(toolUse.id),\n ])\n yield cancelMessage\n return\n }\n\n if (message.type === 'progress') {\n hasProgressMessages = true\n }\n\n yield message\n }\n } catch (e) {\n logError(e)\n\n // Fire PostToolUseFailure hook (fire-and-forget)\n const hookManager = getHookManager()\n if (hookManager) {\n hookManager\n .executePostToolUseFailure(\n toolName,\n toolInput as Record<string, unknown>,\n e instanceof Error ? e.message : String(e),\n )\n .catch(() => {})\n }\n\n // \uD83D\uDD27 Even on error, ensure we yield a tool result to clear UI state\n const errorMessage = createUserMessage([\n {\n type: 'tool_result',\n content: `Tool execution failed: ${e instanceof Error ? e.message : String(e)}`,\n is_error: true,\n tool_use_id: toolUse.id,\n },\n ])\n yield errorMessage\n }\n}\n\n// TODO: Generalize this to all tools\nexport function normalizeToolInput(\n tool: Tool,\n input: { [key: string]: boolean | string | number },\n): { [key: string]: boolean | string | number } {\n switch (tool) {\n case BashTool: {\n const { command, timeout } = BashTool.inputSchema.parse(input) // already validated upstream, won't throw\n return {\n command: command.replace(`cd ${getCwd()} && `, ''),\n ...(timeout ? { timeout } : {}),\n }\n }\n default:\n return input\n }\n}\n\n/**\n * Build a user-friendly error message for tool input validation failures.\n * Provides clear guidance on expected format, examples, and how to fix the issue.\n */\nfunction buildToolInputErrorMessage(\n tool: Tool,\n input: { [key: string]: boolean | string | number },\n validationError: z.ZodError,\n): string {\n // Check if this is a JSON parse error from upstream (claude.ts)\n const parseError = input as {\n __parse_error__?: boolean\n __error_message__?: string\n __raw_json_preview__?: string\n }\n\n if (parseError.__parse_error__) {\n // JSON parse error - model generated malformed JSON\n let message = [\n `Error: Failed to parse tool parameters for \"${tool.name}\".`,\n ``,\n `The model generated invalid JSON. This is typically a temporary issue.`,\n ``,\n `Expected format: ${TOOL_INPUT_EXAMPLES[tool.name] || '{...}'}`,\n ]\n\n if (parseError.__error_message__) {\n message.push(`Parse error: ${parseError.__error_message__}`)\n }\n\n if (parseError.__raw_json_preview__) {\n message.push(``, `Raw JSON preview:`, parseError.__raw_json_preview__)\n }\n\n message.push(\n ``,\n `Suggestions:`,\n `\u2022 Retry your request - the model may succeed on the next attempt`,\n `\u2022 Try simplifying your request with fewer parameters`,\n `\u2022 Check if special characters in values need escaping`,\n )\n\n return message.join('\\n')\n }\n\n // Validation error - parameters are syntactically correct but semantically wrong\n const inputKeys = Object.keys(input)\n const isEmptyInput = inputKeys.length === 0\n\n const example =\n TOOL_INPUT_EXAMPLES[tool.name] || '{...required parameters...}'\n const description = TOOL_DESCRIPTIONS[tool.name]\n const paramDescriptions = PARAMETER_DESCRIPTIONS[tool.name]\n\n let message = [\n `Error: Invalid parameters for \"${tool.name}\" tool.`,\n ``,\n `Expected format:`,\n `${example}`,\n ]\n\n if (description) {\n message.push(``, `Description: ${description}`)\n }\n\n if (isEmptyInput) {\n message.push(\n ``,\n `Issue: The tool was called without any parameters.`,\n `This usually indicates a JSON parsing error in the model's response.`,\n )\n } else {\n // Show which parameters were provided vs missing\n message.push(\n ``,\n `Issue: ${validationError.message}`,\n `Provided parameters: ${inputKeys.length > 0 ? inputKeys.join(', ') : '(none)'}`,\n )\n\n // Show parameter-specific help if available\n if (paramDescriptions) {\n message.push(``, `Parameter guide:`)\n for (const [param, desc] of Object.entries(paramDescriptions)) {\n message.push(`\u2022 ${param}: ${desc}`)\n }\n }\n }\n\n message.push(\n ``,\n `Suggestions:`,\n `\u2022 Ensure all required parameters are provided`,\n `\u2022 Check that parameters have the correct type (string, number, boolean)`,\n `\u2022 Verify file paths are absolute (start with /)`,\n `\u2022 Retry your request - the model often succeeds on retry`,\n )\n\n return message.join('\\n')\n}\n\nasync function* checkPermissionsAndCallTool(\n tool: Tool,\n toolUseID: string,\n siblingToolUseIDs: Set<string>,\n input: { [key: string]: boolean | string | number },\n context: ToolUseContext,\n canUseTool: CanUseToolFn,\n assistantMessage: AssistantMessage,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<UserMessage | ProgressMessage, void> {\n // Validate input types with zod\n // (surprisingly, the model is not great at generating valid input)\n const isValidInput = tool.inputSchema.safeParse(input)\n if (!isValidInput.success) {\n let errorMessage = buildToolInputErrorMessage(\n tool,\n input,\n isValidInput.error,\n )\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: errorMessage,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n const normalizedInput = normalizeToolInput(tool, input)\n\n // Validate input values. Each tool has its own validation logic\n const isValidCall = await tool.validateInput?.(\n normalizedInput as never,\n context,\n )\n if (isValidCall?.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: isValidCall!.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n // Check whether we have permission to use the tool,\n // and ask the user for permission if we don't\n const permissionResult = shouldSkipPermissionCheck\n ? ({ result: true } as const)\n : await canUseTool(tool, normalizedInput, context, assistantMessage)\n if (permissionResult.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: permissionResult.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n // \u2705 P1 FIX: Show permission waiting state when permission check is pending\n // Note: This is handled by the PermissionRequest dialog in the UI\n // But we update streaming state to indicate the phase\n if (!shouldSkipPermissionCheck && !permissionResult.result) {\n setStreamingState({ phase: 'permission' })\n }\n\n // PreToolUse hooks\n const hookManager = getHookManager()\n if (hookManager) {\n try {\n const decision = await hookManager.executePreToolUse(\n tool.name,\n normalizedInput as Record<string, unknown>,\n )\n\n if (!decision.shouldContinue) {\n if (decision.shouldAskUser) {\n // Ask user for approval via permission system\n const approved = await canUseTool(\n tool,\n normalizedInput,\n context,\n assistantMessage,\n )\n if (approved.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content:\n decision.reason || 'Hook requested approval but user denied',\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n } else {\n // Hook blocked the tool\n yield createUserMessage([\n {\n type: 'tool_result',\n content: decision.reason || 'Tool execution blocked by hook',\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n }\n } catch (error) {\n debug.error('PreToolUse hook failed', { error })\n // Continue on error (fail-safe)\n }\n }\n\n // Call the tool with timeout protection\n let toolOutput: FullToolUseResult | null = null\n try {\n // Add toolUseId to context for tracking concurrent executions\n const contextWithToolUseId = {\n ...context,\n toolUseId: toolUseID,\n }\n const rawGenerator = tool.call(\n normalizedInput as never,\n contextWithToolUseId,\n )\n // Wrap tool execution with timeout to prevent infinite hangs\n const generator = withTimeout(rawGenerator, tool.name)\n\n for await (const result of generator) {\n switch (result.type) {\n case 'result':\n // Normalize content to ensure API compatibility\n const normalizedContent = normalizeToolResultContent(\n result.resultForAssistant ?? result.data,\n )\n toolOutput = {\n data: result.data,\n resultForAssistant: normalizedContent,\n // Preserve contextModifier and newMessages for caller to process\n newMessages: result.newMessages,\n contextModifier: result.contextModifier,\n }\n\n yield createUserMessage(\n [\n {\n type: 'tool_result',\n content: normalizedContent,\n tool_use_id: toolUseID,\n },\n ],\n toolOutput,\n )\n\n // Record successful tool call to stats (fire-and-forget)\n try {\n recordToolCall(tool.name, false)\n } catch {\n // Stats recording is non-critical, ignore errors\n }\n\n // PostToolUse hooks (fire-and-forget)\n if (hookManager && toolOutput) {\n hookManager\n .executePostToolUse(\n tool.name,\n normalizedInput as Record<string, unknown>,\n toolOutput as Record<string, unknown>,\n )\n .catch(err => {\n debug.error('PostToolUse hook failed', { error: err })\n })\n }\n\n return\n case 'progress':\n yield createProgressMessage(\n toolUseID,\n siblingToolUseIDs,\n result.content,\n result.normalizedMessages || [],\n result.tools || [],\n )\n break\n }\n }\n } catch (error) {\n // Record failed tool call to stats (fire-and-forget)\n try {\n recordToolCall(tool.name, true)\n } catch {\n // Stats recording is non-critical, ignore errors\n }\n\n // Fire PostToolUseFailure hook for all tool errors\n const hookMgr = getHookManager()\n if (hookMgr) {\n hookMgr\n .executePostToolUseFailure(\n tool.name,\n normalizedInput as Record<string, unknown>,\n error instanceof Error ? error.message : String(error),\n error instanceof ToolTimeoutError ? 'timeout' : undefined,\n )\n .catch(() => {})\n }\n\n // Special handling for timeout errors\n if (error instanceof ToolTimeoutError) {\n debug.error('TOOL_TIMEOUT', {\n toolName: tool.name,\n toolUseID,\n timeoutMs: error.timeoutMs,\n })\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: `Error: ${error.message}. The tool execution was cancelled. Consider breaking this operation into smaller steps or checking if there's an infinite loop.`,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n const content = formatError(error)\n logError(error)\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n }\n}\n\nfunction formatError(error: unknown): string {\n if (!(error instanceof Error)) {\n return String(error)\n }\n const parts = [error.message]\n if ('stderr' in error && typeof error.stderr === 'string') {\n parts.push(error.stderr)\n }\n if ('stdout' in error && typeof error.stdout === 'string') {\n parts.push(error.stdout)\n }\n const fullMessage = parts.filter(Boolean).join('\\n')\n if (fullMessage.length <= 10000) {\n return fullMessage\n }\n const halfLength = 5000\n const start = fullMessage.slice(0, halfLength)\n const end = fullMessage.slice(-halfLength)\n return `${start}\\n\\n... [${fullMessage.length - 10000} characters truncated] ...\\n\\n${end}`\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import {\n Message as APIAssistantMessage,\n MessageParam,\n ToolUseBlock,\n} from '@anthropic-ai/sdk/resources/index.mjs'\nimport { z } from 'zod'\nimport type { UUID } from './types/common'\nimport type { ThinkingMetadata } from './types/thinking'\nimport type { Tool, ToolUseContext, AskUserFn, SetToolJSXFn } from './Tool'\nimport {\n messagePairValidForBinaryFeedback,\n shouldUseBinaryFeedback,\n} from '@components/binary-feedback/utils'\nimport { CanUseToolFn } from './hooks/useCanUseTool'\nimport {\n formatSystemPromptWithContext,\n queryLLM,\n queryModel,\n} from '@services/claude'\nimport { emitReminderEvent } from '@services/systemReminder'\nimport { getDeferredMCPTools } from '@services/mcpClient'\nimport {\n TOOL_INPUT_EXAMPLES,\n TOOL_DESCRIPTIONS,\n PARAMETER_DESCRIPTIONS,\n} from '@constants/toolInputExamples'\nimport { all } from '@utils/generators'\nimport { logError } from '@utils/log'\nimport {\n debug,\n markPhase,\n getCurrentRequest,\n logUserFriendly,\n} from './utils/debugLogger'\nimport { getModelManager } from '@utils/model'\nimport {\n createAssistantMessage,\n createAssistantAPIErrorMessage,\n createProgressMessage,\n createToolResultStopMessage,\n createUserMessage,\n FullToolUseResult,\n INTERRUPT_MESSAGE,\n INTERRUPT_MESSAGE_FOR_TOOL_USE,\n NormalizedMessage,\n normalizeMessagesForAPI,\n} from '@utils/messages'\nimport { createToolExecutionController } from '@utils/toolExecutionController'\nimport { withTimeout, ToolTimeoutError } from '@utils/toolTimeout'\nimport {\n setStreamingState,\n resetStreamingState,\n getStreamingState,\n} from '@utils/streamingState'\nimport { BashTool } from '@tools/BashTool/BashTool'\n\n// Tags to strip from tool result content to prevent injection\nconst TOOL_RESULT_STRIPPED_TAGS = [\n 'user-guidance',\n 'team-message',\n 'task-notification',\n 'system-reminder',\n]\nconst TOOL_RESULT_TAG_REGEX = new RegExp(\n `<(${TOOL_RESULT_STRIPPED_TAGS.join('|')})>[\\\\s\\\\S]*?</\\\\1>\\\\n?`,\n 'g',\n)\n\n/**\n * Strip injection-prone tags from tool result text content.\n */\nfunction stripToolResultTags(text: string): string {\n return text.replace(TOOL_RESULT_TAG_REGEX, '').trim() || text\n}\n\n/**\n * Normalize tool result content for API submission.\n * Ensures content is always a string regardless of input type.\n * Also strips injection-prone tags from text content.\n */\nfunction normalizeToolResultContent(content: unknown): string {\n if (content === null || content === undefined) {\n return '(no content)'\n }\n if (typeof content === 'string') {\n return stripToolResultTags(content) || '(no content)'\n }\n if (Array.isArray(content)) {\n // Handle array of content blocks (e.g., TextBlock[])\n const joined = content\n .map(item => {\n if (typeof item === 'string') return item\n if (item && typeof item === 'object' && 'text' in item)\n return String(item.text)\n return JSON.stringify(item)\n })\n .join('\\n')\n return stripToolResultTags(joined)\n }\n if (typeof content === 'object') {\n // Handle objects - try to extract text or stringify\n if ('text' in content)\n return stripToolResultTags(String((content as { text: unknown }).text))\n return JSON.stringify(content)\n }\n return String(content)\n}\nimport { getCwd } from './utils/state'\nimport { checkAutoCompact } from './utils/autoCompactCore'\nimport { getHookManager } from '@utils/hookManager'\nimport { recordToolCall } from '@utils/stats'\nimport type { MessageInjectionChannel } from '@services/agentTeams/injectionChannel'\n\n// Extended ToolUseContext for query functions\ninterface ExtendedToolUseContext extends ToolUseContext {\n abortController: AbortController\n options: {\n commands: import('./commands').Command[]\n forkNumber: number\n messageLogName: string\n tools: Tool[]\n verbose: boolean\n /** @deprecated Use safetyMode instead */\n safeMode?: boolean\n /** Safety mode: 'yolo' | 'smart' | 'strict' */\n safetyMode?: import('./utils/config').SafetyMode\n maxThinkingTokens: number\n isKodingRequest?: boolean\n model?: string | import('./utils/config').ModelPointerType\n }\n readFileTimestamps: { [filename: string]: number }\n setToolJSX: SetToolJSXFn\n askUser?: AskUserFn\n requestId?: string\n /**\n * Optional injection channel for mid-turn user guidance delivery.\n * When provided, query() drains pending messages at tool-completion\n * boundaries (after all tools finish, before the next API call) so the\n * model sees user guidance on the very next turn. This implements\n * CC-aligned \"boundary-aware injection\".\n */\n injectionChannel?: MessageInjectionChannel\n}\n\nexport type Response = { costUSD: number; response: string }\nexport type UserMessage = {\n message: MessageParam\n type: 'user'\n uuid: UUID\n toolUseResult?: FullToolUseResult\n /** Display-only message \u2014 rendered in UI but excluded from API context. */\n localOnly?: boolean\n options?: {\n isKodingRequest?: boolean\n kodingContext?: string\n isCustomCommand?: boolean\n commandName?: string\n commandArgs?: string\n }\n}\n\nexport type AssistantMessage = {\n costUSD: number\n durationMs: number\n message: APIAssistantMessage\n type: 'assistant'\n uuid: UUID\n /** Display-only message \u2014 rendered in UI but excluded from API context. */\n localOnly?: boolean\n isApiErrorMessage?: boolean\n responseId?: string // For GPT-5 Responses API state management\n /**\n * Original message UUID before normalization.\n * When a message with multiple content blocks is split into individual messages,\n * each resulting message will have a unique `uuid` but share the same `originalUuid`.\n * This is used to identify parallel tool calls from the same assistant message.\n */\n originalUuid?: UUID\n /**\n * Metadata for thinking blocks if present.\n * Used to display duration and character count in verbose mode.\n */\n thinkingMetadata?: ThinkingMetadata\n /**\n * True if this message was generated by the system (e.g., smart compression summary),\n * not a real LLM response.\n */\n isSynthetic?: boolean\n}\n\nexport type BinaryFeedbackResult =\n | { message: AssistantMessage | null; shouldSkipPermissionCheck: false }\n | { message: AssistantMessage; shouldSkipPermissionCheck: true }\n\n/**\n * Streaming output content for tools like BashTool\n */\nexport type StreamingProgressContent = {\n type: 'streaming'\n toolName: string\n stdout: string\n stderr: string\n isStreaming: boolean\n}\n\nexport type ProgressMessage = {\n content: AssistantMessage | StreamingProgressContent\n normalizedMessages: NormalizedMessage[]\n siblingToolUseIDs: Set<string>\n tools: Tool[]\n toolUseID: string\n type: 'progress'\n uuid: UUID\n}\n\n// Each array item is either a single message or a message-and-response pair\nexport type Message = UserMessage | AssistantMessage | ProgressMessage\n\nconst MAX_TOOL_USE_CONCURRENCY = 10\n\n/**\n * Maximum recursion depth for query calls.\n * Prevents stack overflow from infinite tool use loops.\n */\nconst MAX_QUERY_DEPTH = 50\n\n/**\n * Error thrown when query depth limit is exceeded\n */\nexport class QueryDepthExceededError extends Error {\n constructor(depth: number) {\n super(\n `Query depth limit exceeded (${depth}/${MAX_QUERY_DEPTH}). ` +\n `This usually indicates an infinite loop in tool usage.`,\n )\n this.name = 'QueryDepthExceededError'\n }\n}\n\n// Returns a message if we got one, or `null` if the user cancelled\nasync function queryWithBinaryFeedback(\n toolUseContext: ExtendedToolUseContext,\n getAssistantResponse: () => Promise<AssistantMessage>,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n): Promise<BinaryFeedbackResult> {\n if (\n process.env.USER_TYPE !== 'ant' ||\n !getBinaryFeedbackResponse ||\n !(await shouldUseBinaryFeedback())\n ) {\n const assistantMessage = await getAssistantResponse()\n if (toolUseContext.abortController.signal.aborted) {\n return { message: null, shouldSkipPermissionCheck: false }\n }\n return { message: assistantMessage, shouldSkipPermissionCheck: false }\n }\n const [m1, m2] = await Promise.all([\n getAssistantResponse(),\n getAssistantResponse(),\n ])\n if (toolUseContext.abortController.signal.aborted) {\n return { message: null, shouldSkipPermissionCheck: false }\n }\n if (m2.isApiErrorMessage) {\n // If m2 is an error, we might as well return m1, even if it's also an error --\n // the UI will display it as an error as it would in the non-feedback path.\n return { message: m1, shouldSkipPermissionCheck: false }\n }\n if (m1.isApiErrorMessage) {\n return { message: m2, shouldSkipPermissionCheck: false }\n }\n if (!messagePairValidForBinaryFeedback(m1, m2)) {\n return { message: m1, shouldSkipPermissionCheck: false }\n }\n return await getBinaryFeedbackResponse(m1, m2)\n}\n\n/**\n * The rules of thinking are lengthy and fortuitous. They require plenty of thinking\n * of most long duration and deep meditation for a wizard to wrap one's noggin around.\n *\n * The rules follow:\n * 1. A message that contains a thinking or redacted_thinking block must be part of a query whose max_thinking_length > 0\n * 2. A thinking block may not be the last message in a block\n * 3. Thinking blocks must be preserved for the duration of an assistant trajectory (a single turn, or if that turn includes a tool_use block then also its subsequent tool_result and the following assistant message)\n *\n * Heed these rules well, young wizard. For they are the rules of thinking, and\n * the rules of thinking are the rules of the universe. If ye does not heed these\n * rules, ye will be punished with an entire day of debugging and hair pulling.\n */\n// Per-call normalize cache for normalizeMessagesForAPI to avoid re-normalizing\n// when the messages array hasn't grown. Scoped per query() call chain via closure\n// to prevent cross-engine contamination in concurrent scenarios.\n\nexport async function* query(\n messages: Message[],\n systemPrompt: string[],\n context: { [k: string]: string },\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n getBinaryFeedbackResponse?: (\n m1: AssistantMessage,\n m2: AssistantMessage,\n ) => Promise<BinaryFeedbackResult>,\n _depth: number = 0, // Internal: tracks recursion depth\n // Internal: per-call-chain normalize cache (passed through recursive calls)\n _normalizeCache?: {\n length: number\n result: (UserMessage | AssistantMessage)[]\n },\n): AsyncGenerator<Message, void> {\n // Initialize per-call-chain cache at depth 0\n const normalizeCache = _normalizeCache ?? { length: -1, result: [] }\n\n // Check recursion depth to prevent stack overflow\n if (_depth > MAX_QUERY_DEPTH) {\n const error = new QueryDepthExceededError(_depth)\n logError(error)\n yield createAssistantAPIErrorMessage(error.message)\n return\n }\n const currentRequest = getCurrentRequest()\n\n markPhase('QUERY_INIT')\n\n // Pre-flight topic detection (only at top-level, not recursive tool-use queries)\n if (_depth === 0) {\n try {\n const { getGlobalConfig } = await import('@utils/config')\n const config = getGlobalConfig()\n if (config.enableTopicDetection && messages.length >= 3) {\n const { detectTopic, isDefinitiveNewTopic } = await import(\n '@services/topicDetector'\n )\n\n // Extract the new user message text\n const lastMsg = messages[messages.length - 1]\n const newMessageText =\n lastMsg?.type === 'user' &&\n typeof lastMsg.message.content === 'string'\n ? lastMsg.message.content\n : null\n\n if (newMessageText) {\n // Use all messages except the last (which is the new one) as context\n const contextMessages = messages.slice(0, -1)\n const topicResult = await detectTopic(contextMessages, newMessageText)\n\n if (isDefinitiveNewTopic(topicResult)) {\n debug.flow('NEW_TOPIC_DETECTED', {\n confidence: topicResult.confidence,\n reason: topicResult.reason ?? 'none',\n })\n // Future: trigger session memory save for old topic here\n }\n }\n }\n } catch (error) {\n // Topic detection is non-critical \u2014 log and continue\n debug.warn(\n 'TOPIC_DETECTION_PREFLIGHT_ERROR',\n error instanceof Error ? error.message : String(error),\n )\n }\n }\n\n // Auto-compact check \u2014 only at top-level depth (recursive tool-use loops don't need compaction)\n if (_depth === 0) {\n const { messages: processedMessages, wasCompacted } =\n await checkAutoCompact(messages, toolUseContext)\n if (wasCompacted) {\n // \u2705 P2 FIX: Show compaction status in UI (only when compaction actually runs)\n setStreamingState({ phase: 'compacting' })\n messages = processedMessages\n debug.flow('CONTEXT_COMPACTED', {\n originalCount: messages.length,\n compactedCount: processedMessages.length,\n })\n }\n }\n\n markPhase('SYSTEM_PROMPT_BUILD')\n\n const { systemPrompt: fullSystemPrompt, reminders } =\n formatSystemPromptWithContext(systemPrompt, context, toolUseContext.agentId)\n\n // Emit session startup event (only at top-level, not recursive tool-use queries)\n if (_depth === 0) {\n emitReminderEvent('session:startup', {\n agentId: toolUseContext.agentId,\n messages: messages.length,\n timestamp: Date.now(),\n })\n }\n\n // Inject reminders into system prompt (not user messages) to prevent UI leakage\n if (reminders) {\n fullSystemPrompt.push(reminders)\n }\n\n // Inject <available-deferred-tools> list so the model knows which MCP tools\n // can be activated via ToolSearch. Without this, the model never discovers\n // deferred tools and falls back to weaker built-in alternatives.\n const deferredTools = getDeferredMCPTools()\n if (deferredTools.size > 0) {\n const toolNames = Array.from(deferredTools.keys()).join('\\n')\n fullSystemPrompt.push(\n `<available-deferred-tools>\\n${toolNames}\\n</available-deferred-tools>`,\n )\n }\n\n markPhase('LLM_PREPARATION')\n\n // Update streaming state for UI feedback\n // Set turnStartedAt only on the first call (not on re-entries within the same turn)\n const currentState = getStreamingState()\n setStreamingState({\n phase: 'waiting',\n ...(currentState.phase !== 'tool_use' &&\n currentState.phase !== 'generating' && { turnStartedAt: Date.now() }),\n })\n\n function getAssistantResponse() {\n // Use cached normalized messages when length hasn't changed\n if (messages.length !== normalizeCache.length) {\n normalizeCache.result = normalizeMessagesForAPI(messages)\n normalizeCache.length = messages.length\n }\n return queryLLM(\n normalizeCache.result,\n fullSystemPrompt,\n toolUseContext.options.maxThinkingTokens,\n toolUseContext.options.tools,\n toolUseContext.abortController.signal,\n {\n safeMode: toolUseContext.options.safeMode ?? false,\n model: toolUseContext.options.model || 'main',\n prependCLISysprompt: true,\n toolUseContext: toolUseContext,\n },\n )\n }\n\n const result = await queryWithBinaryFeedback(\n toolUseContext,\n getAssistantResponse,\n getBinaryFeedbackResponse,\n )\n\n // If request was cancelled, return immediately with interrupt message\n if (toolUseContext.abortController.signal.aborted) {\n resetStreamingState()\n yield createAssistantMessage(INTERRUPT_MESSAGE)\n return\n }\n\n if (result.message === null) {\n resetStreamingState()\n yield createAssistantMessage(INTERRUPT_MESSAGE)\n return\n }\n\n const assistantMessage = result.message\n const shouldSkipPermissionCheck = result.shouldSkipPermissionCheck\n\n // Clear streaming text preview before yielding complete message to avoid\n // showing both streaming preview and final rendered message simultaneously\n setStreamingState({ phase: 'generating', streamingText: undefined })\n\n yield assistantMessage\n\n // @see https://docs.anthropic.com/en/docs/build-with-claude/tool-use\n // Note: stop_reason === 'tool_use' is unreliable -- it's not always set correctly\n const toolUseMessages = assistantMessage.message.content.filter(\n _ => _.type === 'tool_use',\n )\n\n // If there's no more tool use, we're done\n if (!toolUseMessages.length) {\n resetStreamingState()\n\n // Fire Stop hook (fire-and-forget)\n const hookManager = getHookManager()\n if (hookManager) {\n hookManager.executeStop().catch(err => {\n debug.trace('HOOK_ERROR', { hook: 'Stop', error: err })\n })\n }\n\n return\n }\n\n const toolResults: UserMessage[] = []\n\n // Smart concurrency: separate tools into serial and concurrent groups\n // This allows mixing TodoWrite (serial) with multiple Task calls (concurrent)\n const serialTools: ToolUseBlock[] = []\n const concurrentTools: ToolUseBlock[] = []\n\n for (const msg of toolUseMessages) {\n const tool = toolUseContext.options.tools.find(t => t.name === msg.name)\n const isSafe = tool?.isConcurrencySafe?.() ?? tool?.isReadOnly?.() ?? false\n if (isSafe) {\n concurrentTools.push(msg)\n } else {\n serialTools.push(msg)\n }\n }\n\n // Debug: Log concurrency decision\n debug.flow('TOOL_CONCURRENCY_CHECK', {\n toolCount: toolUseMessages.length,\n serialTools: serialTools.map(msg => msg.name),\n concurrentTools: concurrentTools.map(msg => msg.name),\n concurrencyDetails: toolUseMessages.map(msg => {\n const tool = toolUseContext.options.tools.find(t => t.name === msg.name)\n return {\n name: msg.name,\n isConcurrencySafe: tool?.isConcurrencySafe?.() ?? 'undefined',\n isReadOnly: tool?.isReadOnly?.() ?? 'undefined',\n }\n }),\n })\n\n // Step 1: Execute serial tools first (e.g., TodoWrite)\n if (serialTools.length > 0) {\n debug.flow('SERIAL_TOOLS_START', {\n count: serialTools.length,\n tools: serialTools.map(t => t.name),\n })\n for await (const message of runToolsSerially(\n serialTools,\n assistantMessage,\n canUseTool,\n toolUseContext,\n shouldSkipPermissionCheck,\n )) {\n yield message\n if (message.type === 'user') {\n toolResults.push(message)\n }\n }\n debug.flow('SERIAL_TOOLS_COMPLETE', {\n count: serialTools.length,\n })\n }\n\n // Step 2: Execute concurrent tools in parallel (e.g., multiple Task calls)\n if (concurrentTools.length > 0) {\n debug.flow('CONCURRENT_TOOLS_START', {\n count: concurrentTools.length,\n tools: concurrentTools.map(t => t.name),\n maxConcurrency: MAX_TOOL_USE_CONCURRENCY,\n })\n\n // \u2705 P2 FIX: Update UI to show concurrent task count\n setStreamingState({\n phase: 'concurrent',\n concurrentCount: concurrentTools.length,\n })\n\n const concurrentStartTime = Date.now()\n for await (const message of runToolsConcurrently(\n concurrentTools,\n assistantMessage,\n canUseTool,\n toolUseContext,\n shouldSkipPermissionCheck,\n )) {\n yield message\n if (message.type === 'user') {\n toolResults.push(message)\n }\n }\n debug.flow('CONCURRENT_TOOLS_COMPLETE', {\n count: concurrentTools.length,\n durationMs: Date.now() - concurrentStartTime,\n })\n }\n\n if (toolUseContext.abortController.signal.aborted) {\n yield createAssistantMessage(INTERRUPT_MESSAGE_FOR_TOOL_USE)\n return\n }\n\n // Sort toolResults to match the order of toolUseMessages\n const orderedToolResults = toolResults.sort((a, b) => {\n const aIndex = toolUseMessages.findIndex(\n tu => tu.id === (a.message.content[0] as ToolUseBlock).id,\n )\n const bIndex = toolUseMessages.findIndex(\n tu => tu.id === (b.message.content[0] as ToolUseBlock).id,\n )\n return aIndex - bIndex\n })\n\n // Process contextModifier and newMessages from tool results\n // These are used by SlashCommandTool to modify context and inject messages\n let modifiedContext = toolUseContext\n const additionalMessages: Message[] = []\n\n for (const result of orderedToolResults) {\n if (result.toolUseResult?.contextModifier) {\n // Apply context modifier (e.g., allowed tools, model switching)\n modifiedContext =\n result.toolUseResult.contextModifier.modifyContext(modifiedContext)\n debug.flow('CONTEXT_MODIFIER_APPLIED', {\n toolResultId: (result.message.content[0] as ToolUseBlock)?.id,\n })\n }\n\n if (\n result.toolUseResult?.newMessages &&\n Array.isArray(result.toolUseResult.newMessages)\n ) {\n // Add new messages from tool execution (e.g., skill-generated prompts)\n for (const msg of result.toolUseResult.newMessages) {\n if (msg && typeof msg === 'object' && 'type' in msg) {\n additionalMessages.push(msg as Message)\n }\n }\n debug.flow('NEW_MESSAGES_ADDED', {\n count: result.toolUseResult.newMessages.length,\n })\n }\n }\n\n // Boundary-aware injection: drain pending user guidance at the natural\n // boundary between tool completion and the next API call. The model sees\n // guidance on the very next turn, enabling real-time user influence on\n // agent behavior during long tool chains. This aligns with CC's approach\n // of injecting at logical boundaries (not mid-generation).\n //\n // FIX: Yield guidance as a user message so the engine tracks it in\n // _messages and the UI displays it. Previously, guidance was added to\n // additionalMessages but never yielded, making it invisible in the UI\n // despite reaching the API.\n debug.trace('QUERY_TOOL_BOUNDARY_INJECT', {\n hasMessages: toolUseContext.injectionChannel?.hasMessages(),\n channelSize: toolUseContext.injectionChannel?.size,\n })\n if (toolUseContext.injectionChannel?.hasMessages()) {\n const pending = toolUseContext.injectionChannel.drain()\n if (pending.length > 0) {\n const guidanceText = pending.map(m => m.text).join('\\n\\n')\n // Use ContentBlockParam[] format (not plain string) so that\n // normalizeMessagesForAPI can safely merge this with preceding\n // tool_result ContentBlockParam[] messages via array spread.\n // Plain string content would be spread into individual characters.\n const guidanceMessage = createUserMessage([\n { type: 'text' as const, text: guidanceText },\n ])\n additionalMessages.push(guidanceMessage)\n // Yield so the engine adds this to _messages for UI rendering.\n // The message content uses <user-guidance> tags which\n // UserPromptMessage strips for clean display.\n yield guidanceMessage\n debug.flow('GUIDANCE_INJECTED', {\n messageCount: pending.length,\n textLength: guidanceText.length,\n })\n }\n }\n\n // Recursive query with depth tracking\n // In-place push: the Engine passes a snapshot ([...this._messages]) so\n // mutating `messages` here is safe and avoids O(depth*messages) copies.\n\n try {\n messages.push(\n assistantMessage,\n ...orderedToolResults,\n ...additionalMessages,\n )\n yield* await query(\n messages,\n systemPrompt,\n context,\n canUseTool,\n modifiedContext, // Use modified context if contextModifier was applied\n getBinaryFeedbackResponse,\n _depth + 1, // Increment depth for recursion tracking\n normalizeCache, // Pass through per-call-chain cache\n )\n } catch (error) {\n // Yield error message for UI feedback. Do NOT re-throw \u2014 the caller\n // (AgentEngine) handles generator completion naturally, and the yielded\n // error message provides user-visible feedback. Re-throwing after yield\n // would cause a double-error: the yielded message AND an uncaught throw.\n const errorMessage = error instanceof Error ? error.message : String(error)\n logError(`Recursive query error: ${errorMessage}`)\n yield createAssistantAPIErrorMessage(`Query failed: ${errorMessage}`)\n }\n}\n\nasync function* runToolsConcurrently(\n toolUseMessages: ToolUseBlock[],\n assistantMessage: AssistantMessage,\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<Message, void> {\n const toolUseIds = new Set(toolUseMessages.map(_ => _.id))\n yield* all(\n toolUseMessages.map(toolUse =>\n runToolUse(\n toolUse,\n toolUseIds,\n assistantMessage,\n canUseTool,\n toolUseContext,\n shouldSkipPermissionCheck,\n ),\n ),\n MAX_TOOL_USE_CONCURRENCY,\n toolUseContext.abortController.signal, // Pass abort signal for proper cancellation\n )\n}\n\nasync function* runToolsSerially(\n toolUseMessages: ToolUseBlock[],\n assistantMessage: AssistantMessage,\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<Message, void> {\n const toolUseIds = new Set(toolUseMessages.map(_ => _.id))\n for (const toolUse of toolUseMessages) {\n yield* runToolUse(\n toolUse,\n toolUseIds,\n assistantMessage,\n canUseTool,\n toolUseContext,\n shouldSkipPermissionCheck,\n )\n }\n}\n\nexport async function* runToolUse(\n toolUse: ToolUseBlock,\n siblingToolUseIDs: Set<string>,\n assistantMessage: AssistantMessage,\n canUseTool: CanUseToolFn,\n toolUseContext: ExtendedToolUseContext,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<Message, void> {\n const currentRequest = getCurrentRequest()\n\n // \uD83D\uDD0D Debug: \u5DE5\u5177\u8C03\u7528\u5F00\u59CB\n debug.flow('TOOL_USE_START', {\n toolName: toolUse.name,\n toolUseID: toolUse.id,\n inputSize: JSON.stringify(toolUse.input).length,\n siblingToolCount: siblingToolUseIDs.size,\n shouldSkipPermissionCheck: !!shouldSkipPermissionCheck,\n requestId: currentRequest?.id,\n })\n\n logUserFriendly(\n 'TOOL_EXECUTION',\n {\n toolName: toolUse.name,\n action: 'Starting',\n target: toolUse.input ? Object.keys(toolUse.input).join(', ') : '',\n },\n currentRequest?.id,\n )\n\n const toolName = toolUse.name\n const tool = toolUseContext.options.tools.find(t => t.name === toolName)\n\n // Update streaming state to show tool execution\n setStreamingState({ phase: 'tool_use', toolName })\n\n // Check if the tool exists\n if (!tool) {\n debug.error('TOOL_NOT_FOUND', {\n requestedTool: toolName,\n availableTools: toolUseContext.options.tools.map(t => t.name),\n toolUseID: toolUse.id,\n requestId: currentRequest?.id,\n })\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: `Error: No such tool available: ${toolName}`,\n is_error: true,\n tool_use_id: toolUse.id,\n },\n ])\n return\n }\n\n const toolInput = toolUse.input as { [key: string]: string }\n\n debug.flow('TOOL_VALIDATION_START', {\n toolName: tool.name,\n toolUseID: toolUse.id,\n inputKeys: Object.keys(toolInput),\n requestId: currentRequest?.id,\n })\n\n try {\n // \uD83D\uDD27 Check for cancellation before starting tool execution\n if (toolUseContext.abortController.signal.aborted) {\n debug.flow('TOOL_USE_CANCELLED_BEFORE_START', {\n toolName: tool.name,\n toolUseID: toolUse.id,\n abortReason: 'AbortController signal',\n requestId: currentRequest?.id,\n })\n\n const message = createUserMessage([\n createToolResultStopMessage(toolUse.id),\n ])\n yield message\n return\n }\n\n // Track if any progress messages were yielded\n let hasProgressMessages = false\n\n for await (const message of checkPermissionsAndCallTool(\n tool,\n toolUse.id,\n siblingToolUseIDs,\n toolInput,\n toolUseContext,\n canUseTool,\n assistantMessage,\n shouldSkipPermissionCheck,\n )) {\n // \uD83D\uDD27 Check for cancellation during tool execution\n if (toolUseContext.abortController.signal.aborted) {\n debug.flow('TOOL_USE_CANCELLED_DURING_EXECUTION', {\n toolName: tool.name,\n toolUseID: toolUse.id,\n hasProgressMessages,\n abortReason: 'AbortController signal during execution',\n requestId: currentRequest?.id,\n })\n\n // If we yielded progress messages but got cancelled, yield a cancellation result\n if (hasProgressMessages && message.type === 'progress') {\n yield message // yield the last progress message first\n }\n\n // Always yield a tool result message for cancellation to clear UI state\n const cancelMessage = createUserMessage([\n createToolResultStopMessage(toolUse.id),\n ])\n yield cancelMessage\n return\n }\n\n if (message.type === 'progress') {\n hasProgressMessages = true\n }\n\n yield message\n }\n } catch (e) {\n logError(e)\n\n // Fire PostToolUseFailure hook (fire-and-forget)\n const hookManager = getHookManager()\n if (hookManager) {\n hookManager\n .executePostToolUseFailure(\n toolName,\n toolInput as Record<string, unknown>,\n e instanceof Error ? e.message : String(e),\n )\n .catch(err => {\n debug.trace('HOOK_ERROR', {\n hook: 'PostToolUseFailure',\n error: err,\n })\n })\n }\n\n // \uD83D\uDD27 Even on error, ensure we yield a tool result to clear UI state\n const errorMessage = createUserMessage([\n {\n type: 'tool_result',\n content: `Tool execution failed: ${e instanceof Error ? e.message : String(e)}`,\n is_error: true,\n tool_use_id: toolUse.id,\n },\n ])\n yield errorMessage\n }\n}\n\n// TODO: Generalize this to all tools\nexport function normalizeToolInput(\n tool: Tool,\n input: { [key: string]: boolean | string | number },\n): { [key: string]: boolean | string | number } {\n switch (tool) {\n case BashTool: {\n const { command, timeout } = BashTool.inputSchema.parse(input) // already validated upstream, won't throw\n return {\n command: command.replace(`cd ${getCwd()} && `, ''),\n ...(timeout ? { timeout } : {}),\n }\n }\n default:\n return input\n }\n}\n\n/**\n * Build a user-friendly error message for tool input validation failures.\n * Provides clear guidance on expected format, examples, and how to fix the issue.\n */\nfunction buildToolInputErrorMessage(\n tool: Tool,\n input: { [key: string]: boolean | string | number },\n validationError: z.ZodError,\n): string {\n // Check if this is a JSON parse error from upstream (claude.ts)\n const parseError = input as {\n __parse_error__?: boolean\n __error_message__?: string\n __raw_json_preview__?: string\n }\n\n if (parseError.__parse_error__) {\n // JSON parse error - model generated malformed JSON\n let message = [\n `Error: Failed to parse tool parameters for \"${tool.name}\".`,\n ``,\n `The model generated invalid JSON. This is typically a temporary issue.`,\n ``,\n `Expected format: ${TOOL_INPUT_EXAMPLES[tool.name] || '{...}'}`,\n ]\n\n if (parseError.__error_message__) {\n message.push(`Parse error: ${parseError.__error_message__}`)\n }\n\n if (parseError.__raw_json_preview__) {\n message.push(``, `Raw JSON preview:`, parseError.__raw_json_preview__)\n }\n\n message.push(\n ``,\n `Suggestions:`,\n `\u2022 Retry your request - the model may succeed on the next attempt`,\n `\u2022 Try simplifying your request with fewer parameters`,\n `\u2022 Check if special characters in values need escaping`,\n )\n\n return message.join('\\n')\n }\n\n // Validation error - parameters are syntactically correct but semantically wrong\n const inputKeys = Object.keys(input)\n const isEmptyInput = inputKeys.length === 0\n\n const example =\n TOOL_INPUT_EXAMPLES[tool.name] || '{...required parameters...}'\n const description = TOOL_DESCRIPTIONS[tool.name]\n const paramDescriptions = PARAMETER_DESCRIPTIONS[tool.name]\n\n let message = [\n `Error: Invalid parameters for \"${tool.name}\" tool.`,\n ``,\n `Expected format:`,\n `${example}`,\n ]\n\n if (description) {\n message.push(``, `Description: ${description}`)\n }\n\n if (isEmptyInput) {\n message.push(\n ``,\n `Issue: The tool was called without any parameters.`,\n `This usually indicates a JSON parsing error in the model's response.`,\n )\n } else {\n // Show which parameters were provided vs missing\n message.push(\n ``,\n `Issue: ${validationError.message}`,\n `Provided parameters: ${inputKeys.length > 0 ? inputKeys.join(', ') : '(none)'}`,\n )\n\n // Show parameter-specific help if available\n if (paramDescriptions) {\n message.push(``, `Parameter guide:`)\n for (const [param, desc] of Object.entries(paramDescriptions)) {\n message.push(`\u2022 ${param}: ${desc}`)\n }\n }\n }\n\n message.push(\n ``,\n `Suggestions:`,\n `\u2022 Ensure all required parameters are provided`,\n `\u2022 Check that parameters have the correct type (string, number, boolean)`,\n `\u2022 Verify file paths are absolute (start with /)`,\n `\u2022 Retry your request - the model often succeeds on retry`,\n )\n\n return message.join('\\n')\n}\n\nasync function* checkPermissionsAndCallTool(\n tool: Tool,\n toolUseID: string,\n siblingToolUseIDs: Set<string>,\n input: { [key: string]: boolean | string | number },\n context: ToolUseContext,\n canUseTool: CanUseToolFn,\n assistantMessage: AssistantMessage,\n shouldSkipPermissionCheck?: boolean,\n): AsyncGenerator<UserMessage | ProgressMessage, void> {\n // Validate input types with zod\n // (surprisingly, the model is not great at generating valid input)\n const isValidInput = tool.inputSchema.safeParse(input)\n if (!isValidInput.success) {\n let errorMessage = buildToolInputErrorMessage(\n tool,\n input,\n isValidInput.error,\n )\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: errorMessage,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n const normalizedInput = normalizeToolInput(tool, input)\n\n // Validate input values. Each tool has its own validation logic\n const isValidCall = await tool.validateInput?.(\n normalizedInput as never,\n context,\n )\n if (isValidCall?.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: isValidCall!.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n // Check whether we have permission to use the tool,\n // and ask the user for permission if we don't\n const permissionResult = shouldSkipPermissionCheck\n ? ({ result: true } as const)\n : await canUseTool(tool, normalizedInput, context, assistantMessage)\n if (permissionResult.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content: permissionResult.message,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n // \u2705 P1 FIX: Show permission waiting state when permission check is pending\n // Note: This is handled by the PermissionRequest dialog in the UI\n // But we update streaming state to indicate the phase\n if (!shouldSkipPermissionCheck && !permissionResult.result) {\n setStreamingState({ phase: 'permission' })\n }\n\n // PreToolUse hooks\n const hookManager = getHookManager()\n if (hookManager) {\n try {\n const decision = await hookManager.executePreToolUse(\n tool.name,\n normalizedInput as Record<string, unknown>,\n )\n\n if (!decision.shouldContinue) {\n if (decision.shouldAskUser) {\n // Ask user for approval via permission system\n const approved = await canUseTool(\n tool,\n normalizedInput,\n context,\n assistantMessage,\n )\n if (approved.result === false) {\n yield createUserMessage([\n {\n type: 'tool_result',\n content:\n decision.reason || 'Hook requested approval but user denied',\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n } else {\n // Hook blocked the tool\n yield createUserMessage([\n {\n type: 'tool_result',\n content: decision.reason || 'Tool execution blocked by hook',\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n }\n } catch (error) {\n debug.error('PreToolUse hook failed', { error })\n // Continue on error (fail-safe)\n }\n }\n\n // Call the tool with timeout protection\n let toolOutput: FullToolUseResult | null = null\n try {\n // Add toolUseId to context for tracking concurrent executions\n const contextWithToolUseId = {\n ...context,\n toolUseId: toolUseID,\n }\n const rawGenerator = tool.call(\n normalizedInput as never,\n contextWithToolUseId,\n )\n // Wrap tool execution with timeout to prevent infinite hangs\n const generator = withTimeout(rawGenerator, tool.name)\n\n for await (const result of generator) {\n switch (result.type) {\n case 'result':\n // Normalize content to ensure API compatibility\n const normalizedContent = normalizeToolResultContent(\n result.resultForAssistant ?? result.data,\n )\n toolOutput = {\n data: result.data,\n resultForAssistant: normalizedContent,\n // Preserve contextModifier and newMessages for caller to process\n newMessages: result.newMessages,\n contextModifier: result.contextModifier,\n }\n\n yield createUserMessage(\n [\n {\n type: 'tool_result',\n content: normalizedContent,\n tool_use_id: toolUseID,\n },\n ],\n toolOutput,\n )\n\n // Record successful tool call to stats (fire-and-forget)\n try {\n recordToolCall(tool.name, false)\n } catch {\n // Stats recording is non-critical, ignore errors\n }\n\n // PostToolUse hooks (fire-and-forget)\n if (hookManager && toolOutput) {\n hookManager\n .executePostToolUse(\n tool.name,\n normalizedInput as Record<string, unknown>,\n toolOutput as Record<string, unknown>,\n )\n .catch(err => {\n debug.error('PostToolUse hook failed', { error: err })\n })\n }\n\n return\n case 'progress':\n yield createProgressMessage(\n toolUseID,\n siblingToolUseIDs,\n result.content,\n result.normalizedMessages || [],\n result.tools || [],\n )\n break\n }\n }\n } catch (error) {\n // Record failed tool call to stats (fire-and-forget)\n try {\n recordToolCall(tool.name, true)\n } catch {\n // Stats recording is non-critical, ignore errors\n }\n\n // Fire PostToolUseFailure hook for all tool errors\n const hookMgr = getHookManager()\n if (hookMgr) {\n hookMgr\n .executePostToolUseFailure(\n tool.name,\n normalizedInput as Record<string, unknown>,\n error instanceof Error ? error.message : String(error),\n error instanceof ToolTimeoutError ? 'timeout' : undefined,\n )\n .catch(err => {\n debug.trace('HOOK_ERROR', {\n hook: 'PostToolUseFailure',\n error: err,\n })\n })\n }\n\n // Special handling for timeout errors\n if (error instanceof ToolTimeoutError) {\n debug.error('TOOL_TIMEOUT', {\n toolName: tool.name,\n toolUseID,\n timeoutMs: error.timeoutMs,\n })\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content: `Error: ${error.message}. The tool execution was cancelled. Consider breaking this operation into smaller steps or checking if there's an infinite loop.`,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n return\n }\n\n const content = formatError(error)\n logError(error)\n\n yield createUserMessage([\n {\n type: 'tool_result',\n content,\n is_error: true,\n tool_use_id: toolUseID,\n },\n ])\n }\n}\n\nfunction formatError(error: unknown): string {\n if (!(error instanceof Error)) {\n return String(error)\n }\n const parts = [error.message]\n if ('stderr' in error && typeof error.stderr === 'string') {\n parts.push(error.stderr)\n }\n if ('stdout' in error && typeof error.stdout === 'string') {\n parts.push(error.stdout)\n }\n const fullMessage = parts.filter(Boolean).join('\\n')\n if (fullMessage.length <= 10000) {\n return fullMessage\n }\n const halfLength = 5000\n const start = fullMessage.slice(0, halfLength)\n const end = fullMessage.slice(-halfLength)\n return `${start}\\n\\n... [${fullMessage.length - 10000} characters truncated] ...\\n\\n${end}`\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["result", "message"]
|
|
7
7
|
}
|