@within-7/minto 0.3.9 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Tool.js.map +2 -2
- package/dist/commands/agents/AgentsCommand.js +461 -657
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/agents/types.js +1 -0
- package/dist/commands/agents/types.js.map +2 -2
- package/dist/commands/agents/utils/fileOperations.js +96 -36
- package/dist/commands/agents/utils/fileOperations.js.map +3 -3
- package/dist/commands/agents/utils/index.js +3 -1
- package/dist/commands/agents/utils/index.js.map +2 -2
- package/dist/commands/context.js +54 -23
- package/dist/commands/context.js.map +2 -2
- package/dist/commands/ctx_viz.js +1 -1
- package/dist/commands/effort.js +87 -0
- package/dist/commands/effort.js.map +7 -0
- package/dist/commands/export.js +684 -94
- package/dist/commands/export.js.map +2 -2
- package/dist/commands/ide.js +18 -0
- package/dist/commands/ide.js.map +7 -0
- package/dist/commands/language.js +19 -46
- package/dist/commands/language.js.map +2 -2
- package/dist/commands/mcp-interactive.js +425 -217
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/memory.js +168 -0
- package/dist/commands/memory.js.map +7 -0
- package/dist/commands/model.js +457 -65
- package/dist/commands/model.js.map +2 -2
- package/dist/commands/outputStyle.js +64 -0
- package/dist/commands/outputStyle.js.map +7 -0
- package/dist/commands/permissions.js +75 -49
- package/dist/commands/permissions.js.map +2 -2
- package/dist/commands/plugin/utils.js +33 -1
- package/dist/commands/plugin/utils.js.map +2 -2
- package/dist/commands/plugin.js +891 -185
- package/dist/commands/plugin.js.map +3 -3
- package/dist/commands/refreshCommands.js +2 -0
- package/dist/commands/refreshCommands.js.map +2 -2
- package/dist/commands/resume.js +1 -1
- package/dist/commands/resume.js.map +1 -1
- package/dist/commands/review.js +51 -0
- package/dist/commands/review.js.map +7 -0
- package/dist/commands/sandbox.js +168 -70
- package/dist/commands/sandbox.js.map +2 -2
- package/dist/commands/setup.js +593 -107
- package/dist/commands/setup.js.map +2 -2
- package/dist/commands/stats.js +188 -131
- package/dist/commands/stats.js.map +2 -2
- package/dist/commands/status.js +75 -13
- package/dist/commands/status.js.map +2 -2
- package/dist/commands/terminalSetup.js +6 -0
- package/dist/commands/terminalSetup.js.map +2 -2
- package/dist/commands/undo.js +146 -174
- package/dist/commands/undo.js.map +2 -2
- package/dist/commands/vim.js +22 -0
- package/dist/commands/vim.js.map +7 -0
- package/dist/commands.js +12 -0
- package/dist/commands.js.map +2 -2
- package/dist/components/Help.js +165 -32
- package/dist/components/Help.js.map +2 -2
- package/dist/components/HighlightedCode.js +1 -0
- package/dist/components/HighlightedCode.js.map +2 -2
- package/dist/components/InfoPanel/InfoPanel.js +123 -0
- package/dist/components/InfoPanel/InfoPanel.js.map +7 -0
- package/dist/components/InfoPanel/index.js +5 -0
- package/dist/components/InfoPanel/index.js.map +7 -0
- package/dist/components/InfoPanel/types.js +1 -0
- package/dist/components/InfoPanel/types.js.map +7 -0
- package/dist/components/ModelSelector/BrandTextInput.js +43 -0
- package/dist/components/ModelSelector/BrandTextInput.js.map +7 -0
- package/dist/components/ModelSelector/ModelSelector.js +590 -565
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/ModelSelector/WizardContainer.js +45 -0
- package/dist/components/ModelSelector/WizardContainer.js.map +7 -0
- package/dist/components/ModelSelector/index.js +1 -3
- package/dist/components/ModelSelector/index.js.map +2 -2
- package/dist/components/PromptInput.js +26 -11
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/PulseLabel.js +44 -0
- package/dist/components/PulseLabel.js.map +7 -0
- package/dist/components/RequestStatusIndicator.js +1 -1
- package/dist/components/RequestStatusIndicator.js.map +1 -1
- package/dist/components/SimpleSelector/SimpleSelector.js +154 -0
- package/dist/components/SimpleSelector/SimpleSelector.js.map +7 -0
- package/dist/components/SimpleSelector/index.js +5 -0
- package/dist/components/SimpleSelector/index.js.map +7 -0
- package/dist/components/SimpleSelector/types.js +1 -0
- package/dist/components/SimpleSelector/types.js.map +7 -0
- package/dist/components/Spinner.js +12 -42
- package/dist/components/Spinner.js.map +3 -3
- package/dist/components/StartupStatus.js +57 -0
- package/dist/components/StartupStatus.js.map +7 -0
- package/dist/components/StatusOverlayContent.js +21 -0
- package/dist/components/StatusOverlayContent.js.map +7 -0
- package/dist/components/SubagentBlock.js +43 -6
- package/dist/components/SubagentBlock.js.map +2 -2
- package/dist/components/TabbedListView/ScrollableList.js +31 -5
- package/dist/components/TabbedListView/ScrollableList.js.map +2 -2
- package/dist/components/TabbedListView/TabBar.js +13 -8
- package/dist/components/TabbedListView/TabBar.js.map +2 -2
- package/dist/components/TabbedListView/TabbedListView.js +123 -48
- package/dist/components/TabbedListView/TabbedListView.js.map +2 -2
- package/dist/components/TodoPanel.js +1 -1
- package/dist/components/TodoPanel.js.map +1 -1
- package/dist/components/ToolUseLoader.js +5 -0
- package/dist/components/ToolUseLoader.js.map +2 -2
- package/dist/components/TrustDialog.js +0 -2
- package/dist/components/TrustDialog.js.map +2 -2
- package/dist/components/messages/TaskInModuleView.js +1 -1
- package/dist/components/messages/TaskInModuleView.js.map +2 -2
- package/dist/components/messages/TaskToolMessage.js +1 -1
- package/dist/components/messages/TaskToolMessage.js.map +2 -2
- package/dist/components/messages/UserPromptMessage.js +6 -1
- package/dist/components/messages/UserPromptMessage.js.map +2 -2
- package/dist/constants/modelCapabilities.js +103 -18
- package/dist/constants/modelCapabilities.js.map +2 -2
- package/dist/constants/product.js +2 -0
- package/dist/constants/product.js.map +2 -2
- package/dist/constants/prompts/agentPrompt.js +30 -0
- package/dist/constants/prompts/agentPrompt.js.map +7 -0
- package/dist/constants/prompts/codeConventions.js +27 -0
- package/dist/constants/prompts/codeConventions.js.map +7 -0
- package/dist/constants/prompts/doingTasks.js +15 -0
- package/dist/constants/prompts/doingTasks.js.map +7 -0
- package/dist/constants/prompts/envInfo.js +17 -0
- package/dist/constants/prompts/envInfo.js.map +7 -0
- package/dist/constants/prompts/executingWithCare.js +17 -0
- package/dist/constants/prompts/executingWithCare.js.map +7 -0
- package/dist/constants/prompts/identity.js +10 -0
- package/dist/constants/prompts/identity.js.map +7 -0
- package/dist/constants/prompts/index.js +78 -0
- package/dist/constants/prompts/index.js.map +7 -0
- package/dist/constants/prompts/taskManagement.js +60 -0
- package/dist/constants/prompts/taskManagement.js.map +7 -0
- package/dist/constants/prompts/toneAndStyle.js +62 -0
- package/dist/constants/prompts/toneAndStyle.js.map +7 -0
- package/dist/constants/prompts/toolUsagePolicy.js +38 -0
- package/dist/constants/prompts/toolUsagePolicy.js.map +7 -0
- package/dist/constants/prompts.js +5 -176
- package/dist/constants/prompts.js.map +2 -2
- package/dist/constants/providerRegistry.js +235 -0
- package/dist/constants/providerRegistry.js.map +7 -0
- package/dist/constants/providers.js +35 -0
- package/dist/constants/providers.js.map +7 -0
- package/dist/context/PermissionContext.js +0 -1
- package/dist/context/PermissionContext.js.map +2 -2
- package/dist/context.js +87 -31
- package/dist/context.js.map +2 -2
- package/dist/core/backupHook.js +29 -0
- package/dist/core/backupHook.js.map +7 -0
- package/dist/core/config/defaults.js +11 -2
- package/dist/core/config/defaults.js.map +2 -2
- package/dist/core/config/schema.js +21 -3
- package/dist/core/config/schema.js.map +2 -2
- package/dist/core/costTracker.js +18 -16
- package/dist/core/costTracker.js.map +2 -2
- package/dist/core/index.js +0 -1
- package/dist/core/index.js.map +2 -2
- package/dist/core/tokenStatsManager.js +22 -4
- package/dist/core/tokenStatsManager.js.map +2 -2
- package/dist/cost-tracker.js +0 -16
- package/dist/cost-tracker.js.map +2 -2
- package/dist/entrypoints/bootstrap.js +3 -1
- package/dist/entrypoints/bootstrap.js.map +2 -2
- package/dist/entrypoints/cli.js +81 -68
- package/dist/entrypoints/cli.js.map +2 -2
- package/dist/hooks/useAgentTokenStats.js +1 -1
- package/dist/hooks/useAgentTokenStats.js.map +2 -2
- package/dist/hooks/useAgentTranscripts.js +2 -1
- package/dist/hooks/useAgentTranscripts.js.map +2 -2
- package/dist/hooks/useBackgroundShells.js +29 -0
- package/dist/hooks/useBackgroundShells.js.map +7 -0
- package/dist/hooks/useCanUseTool.js +1 -1
- package/dist/hooks/useCanUseTool.js.map +2 -2
- package/dist/hooks/useDeferredLoading.js +64 -0
- package/dist/hooks/useDeferredLoading.js.map +7 -0
- package/dist/hooks/useHookStatus.js +1 -1
- package/dist/hooks/useHookStatus.js.map +2 -2
- package/dist/hooks/useSessionTracking.js +55 -0
- package/dist/hooks/useSessionTracking.js.map +7 -0
- package/dist/hooks/useTerminalSize.js +21 -0
- package/dist/hooks/useTerminalSize.js.map +2 -2
- package/dist/hooks/useTextInput.js +1 -0
- package/dist/hooks/useTextInput.js.map +2 -2
- package/dist/hooks/useUnifiedCompletion.js +3 -2
- package/dist/hooks/useUnifiedCompletion.js.map +2 -2
- package/dist/i18n/locales/en.js +299 -1
- package/dist/i18n/locales/en.js.map +2 -2
- package/dist/i18n/locales/zh-CN.js +300 -2
- package/dist/i18n/locales/zh-CN.js.map +2 -2
- package/dist/i18n/types.js.map +1 -1
- package/dist/messages.js +41 -17
- package/dist/messages.js.map +2 -2
- package/dist/permissions.js +94 -1
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +27 -19
- package/dist/query.js.map +2 -2
- package/dist/screens/REPL.js +83 -74
- package/dist/screens/REPL.js.map +2 -2
- package/dist/services/adapters/responsesAPI.js +6 -0
- package/dist/services/adapters/responsesAPI.js.map +2 -2
- package/dist/services/agentTeams/index.js +35 -0
- package/dist/services/agentTeams/index.js.map +7 -0
- package/dist/services/agentTeams/mailbox.js +114 -0
- package/dist/services/agentTeams/mailbox.js.map +7 -0
- package/dist/services/agentTeams/teamManager.js +149 -0
- package/dist/services/agentTeams/teamManager.js.map +7 -0
- package/dist/services/agentTeams/teamTaskStore.js +114 -0
- package/dist/services/agentTeams/teamTaskStore.js.map +7 -0
- package/dist/services/agentTeams/teammateSpawner.js +80 -0
- package/dist/services/agentTeams/teammateSpawner.js.map +7 -0
- package/dist/services/checkpointManager.js +16 -3
- package/dist/services/checkpointManager.js.map +2 -2
- package/dist/services/claude.js +19 -1728
- package/dist/services/claude.js.map +3 -3
- package/dist/services/customCommands.js +30 -8
- package/dist/services/customCommands.js.map +2 -2
- package/dist/services/gpt5ConnectionTest.js +4 -2
- package/dist/services/gpt5ConnectionTest.js.map +2 -2
- package/dist/services/hookExecutor.js +411 -127
- package/dist/services/hookExecutor.js.map +2 -2
- package/dist/services/llm/anthropicProvider.js +807 -0
- package/dist/services/llm/anthropicProvider.js.map +7 -0
- package/dist/services/llm/dispatch.js +218 -0
- package/dist/services/llm/dispatch.js.map +7 -0
- package/dist/services/llm/index.js +44 -0
- package/dist/services/llm/index.js.map +7 -0
- package/dist/services/llm/mintoContext.js +69 -0
- package/dist/services/llm/mintoContext.js.map +7 -0
- package/dist/services/llm/openaiProvider.js +622 -0
- package/dist/services/llm/openaiProvider.js.map +7 -0
- package/dist/services/llm/types.js +157 -0
- package/dist/services/llm/types.js.map +7 -0
- package/dist/services/mcpClient.js +183 -33
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/notifier.js +14 -0
- package/dist/services/notifier.js.map +2 -2
- package/dist/services/oauth.js +4 -2
- package/dist/services/oauth.js.map +2 -2
- package/dist/services/openai.js +66 -56
- package/dist/services/openai.js.map +3 -3
- package/dist/services/outputStyles.js +102 -21
- package/dist/services/outputStyles.js.map +2 -2
- package/dist/services/plugins/lspServers.js +1 -1
- package/dist/services/plugins/lspServers.js.map +2 -2
- package/dist/services/plugins/pluginRuntime.js +2 -1
- package/dist/services/plugins/pluginRuntime.js.map +2 -2
- package/dist/services/plugins/pluginValidation.js +10 -3
- package/dist/services/plugins/pluginValidation.js.map +2 -2
- package/dist/services/plugins/skillMarketplace.js +20 -9
- package/dist/services/plugins/skillMarketplace.js.map +2 -2
- package/dist/services/sentry.js +1 -1
- package/dist/services/sentry.js.map +2 -2
- package/dist/services/sessionMemory.js +16 -3
- package/dist/services/sessionMemory.js.map +2 -2
- package/dist/services/systemReminder.js +367 -9
- package/dist/services/systemReminder.js.map +2 -2
- package/dist/services/taskStore.js +19 -0
- package/dist/services/taskStore.js.map +2 -2
- package/dist/tools/ArchitectTool/ArchitectTool.js.map +1 -1
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +1 -1
- package/dist/tools/BashOutputTool/BashOutputTool.js.map +1 -1
- package/dist/tools/BashTool/BashTool.js +28 -0
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/FileEditTool/FileEditTool.js +8 -1
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileReadTool/FileReadTool.js +14 -0
- package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
- package/dist/tools/FileWriteTool/FileWriteTool.js +10 -1
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
- package/dist/tools/GlobTool/GlobTool.js.map +1 -1
- package/dist/tools/GrepTool/GrepTool.js.map +1 -1
- package/dist/tools/KillShellTool/KillShellTool.js.map +1 -1
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +2 -2
- package/dist/tools/LspTool/LspTool.js +11 -2
- package/dist/tools/LspTool/LspTool.js.map +2 -2
- package/dist/tools/MCPTool/MCPTool.js.map +1 -1
- package/dist/tools/MemoryReadTool/MemoryReadTool.js +2 -1
- package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +2 -1
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js +7 -0
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js +2 -0
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
- package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +1 -1
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +8 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +2 -2
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +2 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +2 -2
- package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +1 -1
- package/dist/tools/SlashCommandTool/SlashCommandTool.js +174 -18
- package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +3 -3
- package/dist/tools/TaskCreateTool/TaskCreateTool.js.map +1 -1
- package/dist/tools/TaskGetTool/TaskGetTool.js.map +1 -1
- package/dist/tools/TaskListTool/TaskListTool.js.map +1 -1
- package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +1 -1
- package/dist/tools/TaskStopTool/TaskStopTool.js.map +1 -1
- package/dist/tools/TaskTool/TaskTool.js +84 -11
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/tools/TaskTool/prompt.js +12 -6
- package/dist/tools/TaskTool/prompt.js.map +2 -2
- package/dist/tools/TaskUpdateTool/TaskUpdateTool.js.map +1 -1
- package/dist/tools/ThinkTool/ThinkTool.js.map +1 -1
- package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +1 -1
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +1 -1
- package/dist/tools/WebSearchTool/WebSearchTool.js.map +1 -1
- package/dist/tools/WebSearchTool/searchProviders.js +2 -1
- package/dist/tools/WebSearchTool/searchProviders.js.map +2 -2
- package/dist/tools/lsTool/lsTool.js.map +2 -2
- package/dist/tools/lsTool/prompt.js.map +1 -1
- package/dist/tools.js +14 -3
- package/dist/tools.js.map +2 -2
- package/dist/types/PermissionMode.js +21 -1
- package/dist/types/PermissionMode.js.map +2 -2
- package/dist/types/agentTeams.js +1 -0
- package/dist/types/agentTeams.js.map +7 -0
- package/dist/types/hooks.js +8 -2
- package/dist/types/hooks.js.map +2 -2
- package/dist/types/plugin.js +3 -5
- package/dist/types/plugin.js.map +2 -2
- package/dist/utils/agentHookExecutor.js +1 -4
- package/dist/utils/agentHookExecutor.js.map +2 -2
- package/dist/utils/agentLoader.js +91 -15
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/agentMemory.js.map +2 -2
- package/dist/utils/animationManager.js +1 -1
- package/dist/utils/animationManager.js.map +2 -2
- package/dist/utils/ask.js +1 -1
- package/dist/utils/async.js +5 -1
- package/dist/utils/async.js.map +2 -2
- package/dist/utils/autoCompactCore.js +60 -0
- package/dist/utils/autoCompactCore.js.map +2 -2
- package/dist/utils/claudeCodeSync.js +439 -0
- package/dist/utils/claudeCodeSync.js.map +7 -0
- package/dist/utils/config.js +27 -151
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/configSchema.js +227 -0
- package/dist/utils/configSchema.js.map +7 -0
- package/dist/utils/debugLogger.js.map +2 -2
- package/dist/utils/env.js +4 -3
- package/dist/utils/env.js.map +2 -2
- package/dist/utils/envConfig.js +34 -0
- package/dist/utils/envConfig.js.map +3 -3
- package/dist/utils/execFileNoThrow.js +2 -1
- package/dist/utils/execFileNoThrow.js.map +2 -2
- package/dist/utils/gpt5.js +146 -0
- package/dist/utils/gpt5.js.map +7 -0
- package/dist/utils/hookManager.js +374 -140
- package/dist/utils/hookManager.js.map +2 -2
- package/dist/utils/markdown.js +47 -0
- package/dist/utils/markdown.js.map +2 -2
- package/dist/utils/marketplaceManager.js +80 -43
- package/dist/utils/marketplaceManager.js.map +2 -2
- package/dist/utils/memoizeWithTTL.js +25 -0
- package/dist/utils/memoizeWithTTL.js.map +7 -0
- package/dist/utils/messages.js +2 -2
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/model.js +34 -9
- package/dist/utils/model.js.map +2 -2
- package/dist/utils/pluginInstaller.js +68 -29
- package/dist/utils/pluginInstaller.js.map +2 -2
- package/dist/utils/pluginLoader.js +249 -57
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/repoFetcher.js +110 -0
- package/dist/utils/repoFetcher.js.map +7 -0
- package/dist/utils/safeFetch.js +45 -0
- package/dist/utils/safeFetch.js.map +7 -0
- package/dist/utils/skillLoader.js +77 -12
- package/dist/utils/skillLoader.js.map +2 -2
- package/dist/utils/streamingState.js +52 -0
- package/dist/utils/streamingState.js.map +7 -0
- package/dist/utils/stringSubstitution.js +4 -5
- package/dist/utils/stringSubstitution.js.map +2 -2
- package/dist/utils/style.js +6 -3
- package/dist/utils/style.js.map +2 -2
- package/dist/utils/teamConfig.js +162 -16
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/terminal.js +1 -1
- package/dist/utils/terminal.js.map +2 -2
- package/dist/utils/toolRiskClassification.js +0 -6
- package/dist/utils/toolRiskClassification.js.map +2 -2
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +7 -6
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 type { UUID } from './types/common'\nimport type { ThinkingMetadata } from './types/thinking'\nimport type { Tool, ToolUseContext, AskUserFn } 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 '@components/Spinner'\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: any[]\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: (jsx: any) => void\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 the latest user message\n if (reminders && messages.length > 0) {\n // Find the last user message\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i]\n if (msg?.type === 'user') {\n const lastUserMessage = msg as UserMessage\n messages[i] = {\n ...lastUserMessage,\n message: {\n ...lastUserMessage.message,\n content:\n typeof lastUserMessage.message.content === 'string'\n ? reminders + lastUserMessage.message.content\n : [\n ...(Array.isArray(lastUserMessage.message.content)\n ? lastUserMessage.message.content\n : []),\n { type: 'text', text: reminders },\n ],\n },\n }\n break\n }\n }\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 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 // \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: any,\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 any,\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 // 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 {\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": "AASA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,OAEK;AACP,SAAS,yBAAyB;AAClC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,WAAW;AACpB,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AAEP,SAAS,aAAa,wBAAwB;AAC9C,SAAS,mBAAmB,2BAA2B;AACvD,SAAS,gBAAgB;AAMzB,SAAS,2BAA2B,SAA0B;AAC5D,MAAI,YAAY,QAAQ,YAAY,QAAW;AAC7C,WAAO;AAAA,EACT;AACA,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO,WAAW;AAAA,EACpB;AACA,MAAI,MAAM,QAAQ,OAAO,GAAG;AAE1B,WAAO,QACJ,IAAI,UAAQ;AACX,UAAI,OAAO,SAAS,SAAU,QAAO;AACrC,UAAI,QAAQ,OAAO,SAAS,YAAY,UAAU;AAChD,eAAO,OAAO,KAAK,IAAI;AACzB,aAAO,KAAK,UAAU,IAAI;AAAA,IAC5B,CAAC,EACA,KAAK,IAAI;AAAA,EACd;AACA,MAAI,OAAO,YAAY,UAAU;AAE/B,QAAI,UAAU,QAAS,QAAO,OAAQ,QAA8B,IAAI;AACxE,WAAO,KAAK,UAAU,OAAO;AAAA,EAC/B;AACA,SAAO,OAAO,OAAO;AACvB;AACA,SAAS,cAAc;AACvB,SAAS,wBAAwB;AACjC,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;AA0F/B,MAAM,2BAA2B;AAMjC,MAAM,kBAAkB;AAKjB,MAAM,gCAAgC,MAAM;AAAA,EACjD,YAAY,OAAe;AACzB;AAAA,MACE,+BAA+B,KAAK,IAAI,eAAe;AAAA,IAEzD;AACA,SAAK,OAAO;AAAA,EACd;AACF;AAGA,eAAe,wBACb,gBACA,sBACA,2BAI+B;AAC/B,MACE,QAAQ,IAAI,cAAc,SAC1B,CAAC,6BACD,CAAE,MAAM,wBAAwB,GAChC;AACA,UAAM,mBAAmB,MAAM,qBAAqB;AACpD,QAAI,eAAe,gBAAgB,OAAO,SAAS;AACjD,aAAO,EAAE,SAAS,MAAM,2BAA2B,MAAM;AAAA,IAC3D;AACA,WAAO,EAAE,SAAS,kBAAkB,2BAA2B,MAAM;AAAA,EACvE;AACA,QAAM,CAAC,IAAI,EAAE,IAAI,MAAM,QAAQ,IAAI;AAAA,IACjC,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,EACvB,CAAC;AACD,MAAI,eAAe,gBAAgB,OAAO,SAAS;AACjD,WAAO,EAAE,SAAS,MAAM,2BAA2B,MAAM;AAAA,EAC3D;AACA,MAAI,GAAG,mBAAmB;AAGxB,WAAO,EAAE,SAAS,IAAI,2BAA2B,MAAM;AAAA,EACzD;AACA,MAAI,GAAG,mBAAmB;AACxB,WAAO,EAAE,SAAS,IAAI,2BAA2B,MAAM;AAAA,EACzD;AACA,MAAI,CAAC,kCAAkC,IAAI,EAAE,GAAG;AAC9C,WAAO,EAAE,SAAS,IAAI,2BAA2B,MAAM;AAAA,EACzD;AACA,SAAO,MAAM,0BAA0B,IAAI,EAAE;AAC/C;AAeA,gBAAuB,MACrB,UACA,cACA,SACA,YACA,gBACA,2BAIA,SAAiB,GACc;AAE/B,MAAI,SAAS,iBAAiB;AAC5B,UAAM,QAAQ,IAAI,wBAAwB,MAAM;AAChD,aAAS,KAAK;AACd,UAAM,+BAA+B,MAAM,OAAO;AAClD;AAAA,EACF;AACA,QAAM,iBAAiB,kBAAkB;AAEzC,YAAU,YAAY;AAItB,oBAAkB,EAAE,OAAO,aAAa,CAAC;AAEzC,QAAM,EAAE,UAAU,mBAAmB,aAAa,IAAI,MAAM;AAAA,IAC1D;AAAA,IACA;AAAA,EACF;AACA,MAAI,cAAc;AAChB,eAAW;AACX,UAAM,KAAK,qBAAqB;AAAA,MAC9B,eAAe,SAAS;AAAA,MACxB,gBAAgB,kBAAkB;AAAA,IACpC,CAAC;AAAA,EACH;AAEA,YAAU,qBAAqB;AAE/B,QAAM,EAAE,cAAc,kBAAkB,UAAU,IAChD,8BAA8B,cAAc,SAAS,eAAe,OAAO;AAG7E,oBAAkB,mBAAmB;AAAA,IACnC,SAAS,eAAe;AAAA,IACxB,UAAU,SAAS;AAAA,IACnB,WAAW,KAAK,IAAI;AAAA,EACtB,CAAC;AAGD,MAAI,WAAW;AACb,qBAAiB,KAAK,SAAS;AAAA,EACjC;AAEA,YAAU,iBAAiB;AAG3B,oBAAkB,EAAE,OAAO,UAAU,CAAC;AAEtC,WAAS,uBAAuB;AAC9B,WAAO;AAAA,MACL,wBAAwB,QAAQ;AAAA,MAChC;AAAA,MACA,eAAe,QAAQ;AAAA,MACvB,eAAe,QAAQ;AAAA,MACvB,eAAe,gBAAgB;AAAA,MAC/B;AAAA,QACE,UAAU,eAAe,QAAQ,YAAY;AAAA,QAC7C,OAAO,eAAe,QAAQ,SAAS;AAAA,QACvC,qBAAqB;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,MAAI,eAAe,gBAAgB,OAAO,SAAS;AACjD,UAAM,uBAAuB,iBAAiB;AAC9C;AAAA,EACF;AAEA,MAAI,OAAO,YAAY,MAAM;AAC3B,UAAM,uBAAuB,iBAAiB;AAC9C;AAAA,EACF;AAEA,QAAM,mBAAmB,OAAO;AAChC,QAAM,4BAA4B,OAAO;AAGzC,oBAAkB,EAAE,OAAO,aAAa,CAAC;AAEzC,QAAM;AAIN,QAAM,kBAAkB,iBAAiB,QAAQ,QAAQ;AAAA,IACvD,OAAK,EAAE,SAAS;AAAA,EAClB;AAGA,MAAI,CAAC,gBAAgB,QAAQ;AAC3B,wBAAoB;AAGpB,UAAM,cAAc,eAAe;AACnC,QAAI,aAAa;AACf,kBAAY,YAAY,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC1C;AAEA;AAAA,EACF;AAEA,QAAM,cAA6B,CAAC;AAIpC,QAAM,cAA8B,CAAC;AACrC,QAAM,kBAAkC,CAAC;AAEzC,aAAW,OAAO,iBAAiB;AACjC,UAAM,OAAO,eAAe,QAAQ,MAAM,KAAK,OAAK,EAAE,SAAS,IAAI,IAAI;AACvE,UAAM,SAAS,MAAM,oBAAoB,KAAK,MAAM,aAAa,KAAK;AACtE,QAAI,QAAQ;AACV,sBAAgB,KAAK,GAAG;AAAA,IAC1B,OAAO;AACL,kBAAY,KAAK,GAAG;AAAA,IACtB;AAAA,EACF;AAGA,QAAM,KAAK,0BAA0B;AAAA,IACnC,WAAW,gBAAgB;AAAA,IAC3B,aAAa,YAAY,IAAI,SAAO,IAAI,IAAI;AAAA,IAC5C,iBAAiB,gBAAgB,IAAI,SAAO,IAAI,IAAI;AAAA,IACpD,oBAAoB,gBAAgB,IAAI,SAAO;AAC7C,YAAM,OAAO,eAAe,QAAQ,MAAM,KAAK,OAAK,EAAE,SAAS,IAAI,IAAI;AACvE,aAAO;AAAA,QACL,MAAM,IAAI;AAAA,QACV,mBAAmB,MAAM,oBAAoB,KAAK;AAAA,QAClD,YAAY,MAAM,aAAa,KAAK;AAAA,MACtC;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAGD,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,KAAK,sBAAsB;AAAA,MAC/B,OAAO,YAAY;AAAA,MACnB,OAAO,YAAY,IAAI,OAAK,EAAE,IAAI;AAAA,IACpC,CAAC;AACD,qBAAiB,WAAW;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,GAAG;AACD,YAAM;AACN,UAAI,QAAQ,SAAS,QAAQ;AAC3B,oBAAY,KAAK,OAAO;AAAA,MAC1B;AAAA,IACF;AACA,UAAM,KAAK,yBAAyB;AAAA,MAClC,OAAO,YAAY;AAAA,IACrB,CAAC;AAAA,EACH;AAGA,MAAI,gBAAgB,SAAS,GAAG;AAC9B,UAAM,KAAK,0BAA0B;AAAA,MACnC,OAAO,gBAAgB;AAAA,MACvB,OAAO,gBAAgB,IAAI,OAAK,EAAE,IAAI;AAAA,MACtC,gBAAgB;AAAA,IAClB,CAAC;AAGD,sBAAkB;AAAA,MAChB,OAAO;AAAA,MACP,iBAAiB,gBAAgB;AAAA,IACnC,CAAC;AAED,UAAM,sBAAsB,KAAK,IAAI;AACrC,qBAAiB,WAAW;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,GAAG;AACD,YAAM;AACN,UAAI,QAAQ,SAAS,QAAQ;AAC3B,oBAAY,KAAK,OAAO;AAAA,MAC1B;AAAA,IACF;AACA,UAAM,KAAK,6BAA6B;AAAA,MACtC,OAAO,gBAAgB;AAAA,MACvB,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B,CAAC;AAAA,EACH;AAEA,MAAI,eAAe,gBAAgB,OAAO,SAAS;AACjD,UAAM,uBAAuB,8BAA8B;AAC3D;AAAA,EACF;AAGA,QAAM,qBAAqB,YAAY,KAAK,CAAC,GAAG,MAAM;AACpD,UAAM,SAAS,gBAAgB;AAAA,MAC7B,QAAM,GAAG,OAAQ,EAAE,QAAQ,QAAQ,CAAC,EAAmB;AAAA,IACzD;AACA,UAAM,SAAS,gBAAgB;AAAA,MAC7B,QAAM,GAAG,OAAQ,EAAE,QAAQ,QAAQ,CAAC,EAAmB;AAAA,IACzD;AACA,WAAO,SAAS;AAAA,EAClB,CAAC;AAID,MAAI,kBAAkB;AACtB,QAAM,qBAAgC,CAAC;AAEvC,aAAWA,WAAU,oBAAoB;AACvC,QAAIA,QAAO,eAAe,iBAAiB;AAEzC,wBACEA,QAAO,cAAc,gBAAgB,cAAc,eAAe;AACpE,YAAM,KAAK,4BAA4B;AAAA,QACrC,cAAeA,QAAO,QAAQ,QAAQ,CAAC,GAAoB;AAAA,MAC7D,CAAC;AAAA,IACH;AAEA,QACEA,QAAO,eAAe,eACtB,MAAM,QAAQA,QAAO,cAAc,WAAW,GAC9C;AAEA,iBAAW,OAAOA,QAAO,cAAc,aAAa;AAClD,YAAI,OAAO,OAAO,QAAQ,YAAY,UAAU,KAAK;AACnD,6BAAmB,KAAK,GAAc;AAAA,QACxC;AAAA,MACF;AACA,YAAM,KAAK,sBAAsB;AAAA,QAC/B,OAAOA,QAAO,cAAc,YAAY;AAAA,MAC1C,CAAC;AAAA,IACH;AAAA,EACF;AAIA,MAAI;AACF,WAAO,MAAM;AAAA,MACX;AAAA,QACE,GAAG;AAAA,QACH;AAAA,QACA,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,MACA;AAAA,MACA,SAAS;AAAA;AAAA,IACX;AAAA,EACF,SAAS,OAAO;AAGd,UAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,aAAS,0BAA0B,YAAY,EAAE;AAGjD,UAAM,+BAA+B,iBAAiB,YAAY,EAAE;AAGpE,UAAM;AAAA,EACR;AACF;AAEA,gBAAgB,qBACd,iBACA,kBACA,YACA,gBACA,2BAC+B;AAC/B,SAAO;AAAA,IACL,gBAAgB;AAAA,MAAI,aAClB;AAAA,QACE;AAAA,QACA,IAAI,IAAI,gBAAgB,IAAI,OAAK,EAAE,EAAE,CAAC;AAAA,QACtC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,IACA,eAAe,gBAAgB;AAAA;AAAA,EACjC;AACF;AAEA,gBAAgB,iBACd,iBACA,kBACA,YACA,gBACA,2BAC+B;AAC/B,aAAW,WAAW,iBAAiB;AACrC,WAAO;AAAA,MACL;AAAA,MACA,IAAI,IAAI,gBAAgB,IAAI,OAAK,EAAE,EAAE,CAAC;AAAA,MACtC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,gBAAuB,WACrB,SACA,mBACA,kBACA,YACA,gBACA,2BAC+B;AAC/B,QAAM,iBAAiB,kBAAkB;AAGzC,QAAM,KAAK,kBAAkB;AAAA,IAC3B,UAAU,QAAQ;AAAA,IAClB,WAAW,QAAQ;AAAA,IACnB,WAAW,KAAK,UAAU,QAAQ,KAAK,EAAE;AAAA,IACzC,kBAAkB,kBAAkB;AAAA,IACpC,2BAA2B,CAAC,CAAC;AAAA,IAC7B,WAAW,gBAAgB;AAAA,EAC7B,CAAC;AAED;AAAA,IACE;AAAA,IACA;AAAA,MACE,UAAU,QAAQ;AAAA,MAClB,QAAQ;AAAA,MACR,QAAQ,QAAQ,QAAQ,OAAO,KAAK,QAAQ,KAAK,EAAE,KAAK,IAAI,IAAI;AAAA,IAClE;AAAA,IACA,gBAAgB;AAAA,EAClB;AAEA,QAAM,WAAW,QAAQ;AACzB,QAAM,OAAO,eAAe,QAAQ,MAAM,KAAK,OAAK,EAAE,SAAS,QAAQ;AAGvE,oBAAkB,EAAE,OAAO,YAAY,SAAS,CAAC;AAGjD,MAAI,CAAC,MAAM;AACT,UAAM,MAAM,kBAAkB;AAAA,MAC5B,eAAe;AAAA,MACf,gBAAgB,eAAe,QAAQ,MAAM,IAAI,OAAK,EAAE,IAAI;AAAA,MAC5D,WAAW,QAAQ;AAAA,MACnB,WAAW,gBAAgB;AAAA,IAC7B,CAAC;AAED,UAAM,kBAAkB;AAAA,MACtB;AAAA,QACE,MAAM;AAAA,QACN,SAAS,kCAAkC,QAAQ;AAAA,QACnD,UAAU;AAAA,QACV,aAAa,QAAQ;AAAA,MACvB;AAAA,IACF,CAAC;AACD;AAAA,EACF;AAEA,QAAM,YAAY,QAAQ;AAE1B,QAAM,KAAK,yBAAyB;AAAA,IAClC,UAAU,KAAK;AAAA,IACf,WAAW,QAAQ;AAAA,IACnB,WAAW,OAAO,KAAK,SAAS;AAAA,IAChC,WAAW,gBAAgB;AAAA,EAC7B,CAAC;AAED,MAAI;AAEF,QAAI,eAAe,gBAAgB,OAAO,SAAS;AACjD,YAAM,KAAK,mCAAmC;AAAA,QAC5C,UAAU,KAAK;AAAA,QACf,WAAW,QAAQ;AAAA,QACnB,aAAa;AAAA,QACb,WAAW,gBAAgB;AAAA,MAC7B,CAAC;AAED,YAAM,UAAU,kBAAkB;AAAA,QAChC,4BAA4B,QAAQ,EAAE;AAAA,MACxC,CAAC;AACD,YAAM;AACN;AAAA,IACF;AAGA,QAAI,sBAAsB;AAE1B,qBAAiB,WAAW;AAAA,MAC1B;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,GAAG;AAED,UAAI,eAAe,gBAAgB,OAAO,SAAS;AACjD,cAAM,KAAK,uCAAuC;AAAA,UAChD,UAAU,KAAK;AAAA,UACf,WAAW,QAAQ;AAAA,UACnB;AAAA,UACA,aAAa;AAAA,UACb,WAAW,gBAAgB;AAAA,QAC7B,CAAC;AAGD,YAAI,uBAAuB,QAAQ,SAAS,YAAY;AACtD,gBAAM;AAAA,QACR;AAGA,cAAM,gBAAgB,kBAAkB;AAAA,UACtC,4BAA4B,QAAQ,EAAE;AAAA,QACxC,CAAC;AACD,cAAM;AACN;AAAA,MACF;AAEA,UAAI,QAAQ,SAAS,YAAY;AAC/B,8BAAsB;AAAA,MACxB;AAEA,YAAM;AAAA,IACR;AAAA,EACF,SAAS,GAAG;AACV,aAAS,CAAC;AAGV,UAAM,cAAc,eAAe;AACnC,QAAI,aAAa;AACf,kBACG;AAAA,QACC;AAAA,QACA;AAAA,QACA,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC;AAAA,MAC3C,EACC,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACnB;AAGA,UAAM,eAAe,kBAAkB;AAAA,MACrC;AAAA,QACE,MAAM;AAAA,QACN,SAAS,0BAA0B,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,QAC7E,UAAU;AAAA,QACV,aAAa,QAAQ;AAAA,MACvB;AAAA,IACF,CAAC;AACD,UAAM;AAAA,EACR;AACF;AAGO,SAAS,mBACd,MACA,OAC8C;AAC9C,UAAQ,MAAM;AAAA,IACZ,KAAK,UAAU;AACb,YAAM,EAAE,SAAS,QAAQ,IAAI,SAAS,YAAY,MAAM,KAAK;AAC7D,aAAO;AAAA,QACL,SAAS,QAAQ,QAAQ,MAAM,OAAO,CAAC,QAAQ,EAAE;AAAA,QACjD,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC/B;AAAA,IACF;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;AAMA,SAAS,2BACP,MACA,OACA,iBACQ;AAER,QAAM,aAAa;AAMnB,MAAI,WAAW,iBAAiB;AAE9B,QAAIC,WAAU;AAAA,MACZ,+CAA+C,KAAK,IAAI;AAAA,MACxD;AAAA,MACA;AAAA,MACA;AAAA,MACA,oBAAoB,oBAAoB,KAAK,IAAI,KAAK,OAAO;AAAA,IAC/D;AAEA,QAAI,WAAW,mBAAmB;AAChC,MAAAA,SAAQ,KAAK,gBAAgB,WAAW,iBAAiB,EAAE;AAAA,IAC7D;AAEA,QAAI,WAAW,sBAAsB;AACnC,MAAAA,SAAQ,KAAK,IAAI,qBAAqB,WAAW,oBAAoB;AAAA,IACvE;AAEA,IAAAA,SAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAOA,SAAQ,KAAK,IAAI;AAAA,EAC1B;AAGA,QAAM,YAAY,OAAO,KAAK,KAAK;AACnC,QAAM,eAAe,UAAU,WAAW;AAE1C,QAAM,UACJ,oBAAoB,KAAK,IAAI,KAAK;AACpC,QAAM,cAAc,kBAAkB,KAAK,IAAI;AAC/C,QAAM,oBAAoB,uBAAuB,KAAK,IAAI;AAE1D,MAAI,UAAU;AAAA,IACZ,kCAAkC,KAAK,IAAI;AAAA,IAC3C;AAAA,IACA;AAAA,IACA,GAAG,OAAO;AAAA,EACZ;AAEA,MAAI,aAAa;AACf,YAAQ,KAAK,IAAI,gBAAgB,WAAW,EAAE;AAAA,EAChD;AAEA,MAAI,cAAc;AAChB,YAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,OAAO;AAEL,YAAQ;AAAA,MACN;AAAA,MACA,UAAU,gBAAgB,OAAO;AAAA,MACjC,wBAAwB,UAAU,SAAS,IAAI,UAAU,KAAK,IAAI,IAAI,QAAQ;AAAA,IAChF;AAGA,QAAI,mBAAmB;AACrB,cAAQ,KAAK,IAAI,kBAAkB;AACnC,iBAAW,CAAC,OAAO,IAAI,KAAK,OAAO,QAAQ,iBAAiB,GAAG;AAC7D,gBAAQ,KAAK,UAAK,KAAK,KAAK,IAAI,EAAE;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAEA,UAAQ;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,QAAQ,KAAK,IAAI;AAC1B;AAEA,gBAAgB,4BACd,MACA,WACA,mBACA,OACA,SACA,YACA,kBACA,2BACqD;AAGrD,QAAM,eAAe,KAAK,YAAY,UAAU,KAAK;AACrD,MAAI,CAAC,aAAa,SAAS;AACzB,QAAI,eAAe;AAAA,MACjB;AAAA,MACA;AAAA,MACA,aAAa;AAAA,IACf;AAEA,UAAM,kBAAkB;AAAA,MACtB;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,QACT,UAAU;AAAA,QACV,aAAa;AAAA,MACf;AAAA,IACF,CAAC;AACD;AAAA,EACF;AAEA,QAAM,kBAAkB,mBAAmB,MAAM,KAAK;AAGtD,QAAM,cAAc,MAAM,KAAK;AAAA,IAC7B;AAAA,IACA;AAAA,EACF;AACA,MAAI,aAAa,WAAW,OAAO;AACjC,UAAM,kBAAkB;AAAA,MACtB;AAAA,QACE,MAAM;AAAA,QACN,SAAS,YAAa;AAAA,QACtB,UAAU;AAAA,QACV,aAAa;AAAA,MACf;AAAA,IACF,CAAC;AACD;AAAA,EACF;AAIA,QAAM,mBAAmB,4BACpB,EAAE,QAAQ,KAAK,IAChB,MAAM,WAAW,MAAM,iBAAiB,SAAS,gBAAgB;AACrE,MAAI,iBAAiB,WAAW,OAAO;AACrC,UAAM,kBAAkB;AAAA,MACtB;AAAA,QACE,MAAM;AAAA,QACN,SAAS,iBAAiB;AAAA,QAC1B,UAAU;AAAA,QACV,aAAa;AAAA,MACf;AAAA,IACF,CAAC;AACD;AAAA,EACF;AAKA,MAAI,CAAC,6BAA6B,CAAC,iBAAiB,QAAQ;AAC1D,sBAAkB,EAAE,OAAO,aAAa,CAAC;AAAA,EAC3C;AAGA,QAAM,cAAc,eAAe;AACnC,MAAI,aAAa;AACf,QAAI;AACF,YAAM,WAAW,MAAM,YAAY;AAAA,QACjC,KAAK;AAAA,QACL;AAAA,MACF;AAEA,UAAI,CAAC,SAAS,gBAAgB;AAC5B,YAAI,SAAS,eAAe;AAE1B,gBAAM,WAAW,MAAM;AAAA,YACrB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AACA,cAAI,SAAS,WAAW,OAAO;AAC7B,kBAAM,kBAAkB;AAAA,cACtB;AAAA,gBACE,MAAM;AAAA,gBACN,SACE,SAAS,UAAU;AAAA,gBACrB,UAAU;AAAA,gBACV,aAAa;AAAA,cACf;AAAA,YACF,CAAC;AACD;AAAA,UACF;AAAA,QACF,OAAO;AAEL,gBAAM,kBAAkB;AAAA,YACtB;AAAA,cACE,MAAM;AAAA,cACN,SAAS,SAAS,UAAU;AAAA,cAC5B,UAAU;AAAA,cACV,aAAa;AAAA,YACf;AAAA,UACF,CAAC;AACD;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,MAAM,0BAA0B,EAAE,MAAM,CAAC;AAAA,IAEjD;AAAA,EACF;AAGA,MAAI,aAAuC;AAC3C,MAAI;AAEF,UAAM,uBAAuB;AAAA,MAC3B,GAAG;AAAA,MACH,WAAW;AAAA,IACb;AACA,UAAM,eAAe,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,IACF;AAEA,UAAM,YAAY,YAAY,cAAc,KAAK,IAAI;AAErD,qBAAiB,UAAU,WAAW;AACpC,cAAQ,OAAO,MAAM;AAAA,QACnB,KAAK;AAEH,gBAAM,oBAAoB;AAAA,YACxB,OAAO,sBAAsB,OAAO;AAAA,UACtC;AACA,uBAAa;AAAA,YACX,MAAM,OAAO;AAAA,YACb,oBAAoB;AAAA;AAAA,YAEpB,aAAa,OAAO;AAAA,YACpB,iBAAiB,OAAO;AAAA,UAC1B;AAEA,gBAAM;AAAA,YACJ;AAAA,cACE;AAAA,gBACE,MAAM;AAAA,gBACN,SAAS;AAAA,gBACT,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA;AAAA,UACF;AAGA,cAAI;AACF,2BAAe,KAAK,MAAM,KAAK;AAAA,UACjC,QAAQ;AAAA,UAER;AAGA,cAAI,eAAe,YAAY;AAC7B,wBACG;AAAA,cACC,KAAK;AAAA,cACL;AAAA,cACA;AAAA,YACF,EACC,MAAM,SAAO;AACZ,oBAAM,MAAM,2BAA2B,EAAE,OAAO,IAAI,CAAC;AAAA,YACvD,CAAC;AAAA,UACL;AAEA;AAAA,QACF,KAAK;AACH,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACA,OAAO;AAAA,YACP,OAAO,sBAAsB,CAAC;AAAA,YAC9B,OAAO,SAAS,CAAC;AAAA,UACnB;AACA;AAAA,MACJ;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AAEd,QAAI;AACF,qBAAe,KAAK,MAAM,IAAI;AAAA,IAChC,QAAQ;AAAA,IAER;AAGA,UAAM,UAAU,eAAe;AAC/B,QAAI,SAAS;AACX,cACG;AAAA,QACC,KAAK;AAAA,QACL;AAAA,QACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QACrD,iBAAiB,mBAAmB,YAAY;AAAA,MAClD,EACC,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACnB;AAGA,QAAI,iBAAiB,kBAAkB;AACrC,YAAM,MAAM,gBAAgB;AAAA,QAC1B,UAAU,KAAK;AAAA,QACf;AAAA,QACA,WAAW,MAAM;AAAA,MACnB,CAAC;AAED,YAAM,kBAAkB;AAAA,QACtB;AAAA,UACE,MAAM;AAAA,UACN,SAAS,UAAU,MAAM,OAAO;AAAA,UAChC,UAAU;AAAA,UACV,aAAa;AAAA,QACf;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,UAAM,UAAU,YAAY,KAAK;AACjC,aAAS,KAAK;AAEd,UAAM,kBAAkB;AAAA,MACtB;AAAA,QACE,MAAM;AAAA,QACN;AAAA,QACA,UAAU;AAAA,QACV,aAAa;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,YAAY,OAAwB;AAC3C,MAAI,EAAE,iBAAiB,QAAQ;AAC7B,WAAO,OAAO,KAAK;AAAA,EACrB;AACA,QAAM,QAAQ,CAAC,MAAM,OAAO;AAC5B,MAAI,YAAY,SAAS,OAAO,MAAM,WAAW,UAAU;AACzD,UAAM,KAAK,MAAM,MAAM;AAAA,EACzB;AACA,MAAI,YAAY,SAAS,OAAO,MAAM,WAAW,UAAU;AACzD,UAAM,KAAK,MAAM,MAAM;AAAA,EACzB;AACA,QAAM,cAAc,MAAM,OAAO,OAAO,EAAE,KAAK,IAAI;AACnD,MAAI,YAAY,UAAU,KAAO;AAC/B,WAAO;AAAA,EACT;AACA,QAAM,aAAa;AACnB,QAAM,QAAQ,YAAY,MAAM,GAAG,UAAU;AAC7C,QAAM,MAAM,YAAY,MAAM,CAAC,UAAU;AACzC,SAAO,GAAG,KAAK;AAAA;AAAA,OAAY,YAAY,SAAS,GAAK;AAAA;AAAA,EAAiC,GAAG;AAC3F;",
|
|
6
6
|
"names": ["result", "message"]
|
|
7
7
|
}
|
package/dist/screens/REPL.js
CHANGED
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
PermissionRequest
|
|
16
16
|
} from "../components/permissions/PermissionRequest.js";
|
|
17
17
|
import PromptInput from "../components/PromptInput.js";
|
|
18
|
-
import { getSystemPrompt } from "../constants/prompts.js";
|
|
18
|
+
import { getSystemPrompt } from "../constants/prompts/index.js";
|
|
19
19
|
import { getContext } from "../context.js";
|
|
20
20
|
import { getTotalCost, useCostSummary } from "../cost-tracker.js";
|
|
21
21
|
import { useLogStartupTime } from "../hooks/useLogStartupTime.js";
|
|
@@ -26,7 +26,6 @@ import { useLogMessages, serializeMessageForLog } from "../hooks/useLogMessages.
|
|
|
26
26
|
import { overwriteLog } from "../utils/log.js";
|
|
27
27
|
import { PermissionProvider } from "../context/PermissionContext.js";
|
|
28
28
|
import { useFullscreenExitCallback } from "../hooks/useTerminalSize.js";
|
|
29
|
-
import { ModeIndicator } from "../components/ModeIndicator.js";
|
|
30
29
|
import { TodoPanel } from "../components/TodoPanel.js";
|
|
31
30
|
import { TurnCompletionIndicator } from "../components/TurnCompletionIndicator.js";
|
|
32
31
|
import { getTodos, initTodoSession } from "../utils/todoStorage.js";
|
|
@@ -44,7 +43,16 @@ import {
|
|
|
44
43
|
saveGlobalConfig,
|
|
45
44
|
getVerboseLabel
|
|
46
45
|
} from "../utils/config.js";
|
|
47
|
-
import {
|
|
46
|
+
import { loadMessagesFromLog } from "../utils/conversationRecovery.js";
|
|
47
|
+
import { useBackgroundShells } from "../hooks/useBackgroundShells.js";
|
|
48
|
+
import { useDeferredLoading } from "../hooks/useDeferredLoading.js";
|
|
49
|
+
import { useSessionTracking } from "../hooks/useSessionTracking.js";
|
|
50
|
+
import { emitReminderEvent } from "../services/systemReminder.js";
|
|
51
|
+
import {
|
|
52
|
+
getNextAvailableLogForkNumber,
|
|
53
|
+
loadLogList,
|
|
54
|
+
CACHE_PATHS
|
|
55
|
+
} from "../utils/log.js";
|
|
48
56
|
import {
|
|
49
57
|
getErroredToolUseMessages,
|
|
50
58
|
getInProgressToolUseIDs,
|
|
@@ -66,11 +74,6 @@ import { BinaryFeedback } from "../components/binary-feedback/BinaryFeedback.js"
|
|
|
66
74
|
import { getMaxThinkingTokens } from "../utils/thinking.js";
|
|
67
75
|
import { getOriginalCwd } from "../utils/state.js";
|
|
68
76
|
import { handleHashCommand } from "../commands/terminalSetup.js";
|
|
69
|
-
import { debug as debugLogger } from "../utils/debugLogger.js";
|
|
70
|
-
import {
|
|
71
|
-
initializeHookManager
|
|
72
|
-
} from "../utils/hookManager.js";
|
|
73
|
-
import { loadAllPlugins } from "../utils/pluginLoader.js";
|
|
74
77
|
import { randomUUID } from "crypto";
|
|
75
78
|
import { getMessagesPath } from "../utils/log.js";
|
|
76
79
|
import {
|
|
@@ -88,12 +91,10 @@ import { useAgentTranscripts } from "../hooks/useAgentTranscripts.js";
|
|
|
88
91
|
import { GroupRenderer } from "../components/messages/GroupRenderer.js";
|
|
89
92
|
import { SEMANTIC_COLORS } from "../constants/colors.js";
|
|
90
93
|
import {
|
|
91
|
-
initSessionTracker,
|
|
92
94
|
recordFirstPrompt,
|
|
93
95
|
incrementMessageCount,
|
|
94
96
|
incrementToolCallCount,
|
|
95
|
-
flushSessionStats
|
|
96
|
-
endSession
|
|
97
|
+
flushSessionStats
|
|
97
98
|
} from "../utils/sessionTracker.js";
|
|
98
99
|
const RESUME_VISIBLE_MESSAGE_COUNT = Infinity;
|
|
99
100
|
function REPL({
|
|
@@ -113,7 +114,9 @@ function REPL({
|
|
|
113
114
|
initialUpdateVersion,
|
|
114
115
|
initialUpdateCommands,
|
|
115
116
|
fallbackMode = false,
|
|
116
|
-
isResumedConversation = false
|
|
117
|
+
isResumedConversation = false,
|
|
118
|
+
enableArchitect,
|
|
119
|
+
autoResume = false
|
|
117
120
|
}) {
|
|
118
121
|
const [verbose, setVerbose] = useState(
|
|
119
122
|
verboseFromCLI === true ? true : false
|
|
@@ -155,8 +158,21 @@ function REPL({
|
|
|
155
158
|
);
|
|
156
159
|
const [binaryFeedbackContext, setBinaryFeedbackContext] = useState(null);
|
|
157
160
|
const [askUserQuestionContext, setAskUserQuestionContext] = useState(null);
|
|
158
|
-
const
|
|
159
|
-
|
|
161
|
+
const {
|
|
162
|
+
commands: currentCommands,
|
|
163
|
+
tools: currentTools,
|
|
164
|
+
mcpClients: currentMcpClients,
|
|
165
|
+
updateVersion: updateAvailableVersion,
|
|
166
|
+
updateCommands,
|
|
167
|
+
startupItems
|
|
168
|
+
} = useDeferredLoading({
|
|
169
|
+
initialCommands: commands,
|
|
170
|
+
initialTools: tools,
|
|
171
|
+
initialMcpClients: mcpClients,
|
|
172
|
+
initialUpdateVersion,
|
|
173
|
+
initialUpdateCommands,
|
|
174
|
+
enableArchitect
|
|
175
|
+
});
|
|
160
176
|
const [isTodoPanelVisible, setIsTodoPanelVisible] = useState(true);
|
|
161
177
|
const [verboseToggleMessage, setVerboseToggleMessage] = useState(null);
|
|
162
178
|
const turnStartTimeRef = useRef(null);
|
|
@@ -178,10 +194,12 @@ function REPL({
|
|
|
178
194
|
turnStartTimeRef.current = null;
|
|
179
195
|
}
|
|
180
196
|
}, [isLoading]);
|
|
181
|
-
const
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
197
|
+
const {
|
|
198
|
+
shells: backgroundShells,
|
|
199
|
+
isPanelVisible: showBackgroundPanel,
|
|
200
|
+
setIsPanelVisible: setShowBackgroundPanel,
|
|
201
|
+
runningCount: backgroundShellRunningCount
|
|
202
|
+
} = useBackgroundShells();
|
|
185
203
|
const prevUnresolvedRef = useRef(/* @__PURE__ */ new Set());
|
|
186
204
|
const messageBatchBufferRef = useRef(null);
|
|
187
205
|
if (messageBatchBufferRef.current === null) {
|
|
@@ -217,7 +235,6 @@ function REPL({
|
|
|
217
235
|
[]
|
|
218
236
|
);
|
|
219
237
|
const readFileTimestamps = useRef({});
|
|
220
|
-
const hookManagerRef = useRef(null);
|
|
221
238
|
const { status: apiKeyStatus, reverify } = useApiKeyVerification();
|
|
222
239
|
function onInterrupt() {
|
|
223
240
|
if (!isLoading) {
|
|
@@ -276,10 +293,10 @@ function REPL({
|
|
|
276
293
|
{
|
|
277
294
|
abortController: newAbortController,
|
|
278
295
|
options: {
|
|
279
|
-
commands,
|
|
296
|
+
commands: currentCommands,
|
|
280
297
|
forkNumber,
|
|
281
298
|
messageLogName,
|
|
282
|
-
tools,
|
|
299
|
+
tools: currentTools,
|
|
283
300
|
verbose,
|
|
284
301
|
maxThinkingTokens: 0
|
|
285
302
|
},
|
|
@@ -313,10 +330,10 @@ function REPL({
|
|
|
313
330
|
canUseTool,
|
|
314
331
|
{
|
|
315
332
|
options: {
|
|
316
|
-
commands,
|
|
333
|
+
commands: currentCommands,
|
|
317
334
|
forkNumber,
|
|
318
335
|
messageLogName,
|
|
319
|
-
tools,
|
|
336
|
+
tools: currentTools,
|
|
320
337
|
verbose,
|
|
321
338
|
safeMode,
|
|
322
339
|
safetyMode,
|
|
@@ -402,10 +419,10 @@ function REPL({
|
|
|
402
419
|
canUseTool,
|
|
403
420
|
{
|
|
404
421
|
options: {
|
|
405
|
-
commands,
|
|
422
|
+
commands: currentCommands,
|
|
406
423
|
forkNumber,
|
|
407
424
|
messageLogName,
|
|
408
|
-
tools,
|
|
425
|
+
tools: currentTools,
|
|
409
426
|
verbose,
|
|
410
427
|
safeMode,
|
|
411
428
|
safetyMode,
|
|
@@ -501,45 +518,29 @@ function REPL({
|
|
|
501
518
|
useLogMessages(messages, messageLogName, forkNumber);
|
|
502
519
|
useLogStartupTime();
|
|
503
520
|
useEffect(() => {
|
|
504
|
-
|
|
521
|
+
if (!autoResume) return;
|
|
522
|
+
loadLogList(CACHE_PATHS.messages()).then(async (logs) => {
|
|
523
|
+
for (const log of logs) {
|
|
524
|
+
try {
|
|
525
|
+
const loaded = await loadMessagesFromLog(log.fullPath, tools);
|
|
526
|
+
if (loaded && loaded.length > 0) {
|
|
527
|
+
setMessages(loaded);
|
|
528
|
+
emitReminderEvent("session:continuation", {
|
|
529
|
+
messageCount: loaded.length
|
|
530
|
+
});
|
|
531
|
+
break;
|
|
532
|
+
}
|
|
533
|
+
} catch {
|
|
534
|
+
continue;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
}).catch(() => {
|
|
538
|
+
});
|
|
505
539
|
}, []);
|
|
506
540
|
useEffect(() => {
|
|
507
|
-
|
|
508
|
-
const plugins = loadAllPlugins();
|
|
509
|
-
const sessionId = randomUUID();
|
|
510
|
-
const transcriptPath = getMessagesPath(messageLogName, forkNumber, 0);
|
|
511
|
-
const hookManager = initializeHookManager(
|
|
512
|
-
sessionId,
|
|
513
|
-
transcriptPath,
|
|
514
|
-
plugins
|
|
515
|
-
);
|
|
516
|
-
hookManagerRef.current = hookManager;
|
|
517
|
-
initSessionTracker(getOriginalCwd());
|
|
518
|
-
hookManager.executeSessionStart().catch((err) => {
|
|
519
|
-
debugLogger.error("SessionStart hooks failed", { error: err });
|
|
520
|
-
});
|
|
521
|
-
return () => {
|
|
522
|
-
flushSessionStats();
|
|
523
|
-
endSession("other");
|
|
524
|
-
hookManager.executeSessionEnd("other").catch((err) => {
|
|
525
|
-
debugLogger.error("SessionEnd hooks failed", { error: err });
|
|
526
|
-
});
|
|
527
|
-
};
|
|
528
|
-
} catch (err) {
|
|
529
|
-
debugLogger.error("Failed to initialize hook manager", { error: err });
|
|
530
|
-
}
|
|
531
|
-
}, [messageLogName, forkNumber]);
|
|
532
|
-
useEffect(() => {
|
|
533
|
-
const manager = BackgroundShellManager.getInstance();
|
|
534
|
-
setBackgroundShells(manager.list());
|
|
535
|
-
const handleListChange = (shells) => {
|
|
536
|
-
setBackgroundShells(shells);
|
|
537
|
-
};
|
|
538
|
-
manager.on("listChange", handleListChange);
|
|
539
|
-
return () => {
|
|
540
|
-
manager.off("listChange", handleListChange);
|
|
541
|
-
};
|
|
541
|
+
onInit();
|
|
542
542
|
}, []);
|
|
543
|
+
useSessionTracking(messageLogName, forkNumber);
|
|
543
544
|
const normalizedMessages = useMemo(
|
|
544
545
|
() => normalizeMessages(messages).filter(isNotEmptyMessage),
|
|
545
546
|
[messages]
|
|
@@ -599,7 +600,7 @@ function REPL({
|
|
|
599
600
|
jsx: /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", width: "100%", key: "logo" }, /* @__PURE__ */ React.createElement(
|
|
600
601
|
Logo,
|
|
601
602
|
{
|
|
602
|
-
mcpClients,
|
|
603
|
+
mcpClients: currentMcpClients,
|
|
603
604
|
isDefaultModel,
|
|
604
605
|
updateBannerVersion: updateAvailableVersion,
|
|
605
606
|
updateBannerCommands: updateCommands
|
|
@@ -622,6 +623,9 @@ function REPL({
|
|
|
622
623
|
if (!group && _.type === "progress") {
|
|
623
624
|
group = getGroupForToolUse(_.toolUseID);
|
|
624
625
|
}
|
|
626
|
+
if (!group && toolUseID) {
|
|
627
|
+
group = getGroupForToolUse(toolUseID);
|
|
628
|
+
}
|
|
625
629
|
if (group && (group.type === "parallel-tasks" || group.type === "task")) {
|
|
626
630
|
if (renderedGroupIds.has(group.id)) {
|
|
627
631
|
continue;
|
|
@@ -688,7 +692,7 @@ function REPL({
|
|
|
688
692
|
}
|
|
689
693
|
}
|
|
690
694
|
}
|
|
691
|
-
if (_.type === "progress" &&
|
|
695
|
+
if (_.type === "progress" && !unresolvedToolUseIDs.has(_.toolUseID)) {
|
|
692
696
|
continue;
|
|
693
697
|
}
|
|
694
698
|
const message = _.type === "progress" ? (
|
|
@@ -746,7 +750,7 @@ function REPL({
|
|
|
746
750
|
message: _,
|
|
747
751
|
messages: normalizedMessages,
|
|
748
752
|
addMargin: true,
|
|
749
|
-
tools,
|
|
753
|
+
tools: currentTools,
|
|
750
754
|
verbose,
|
|
751
755
|
debug,
|
|
752
756
|
erroredToolUseIDs,
|
|
@@ -786,7 +790,7 @@ function REPL({
|
|
|
786
790
|
}, [
|
|
787
791
|
forkNumber,
|
|
788
792
|
normalizedMessages,
|
|
789
|
-
|
|
793
|
+
currentTools,
|
|
790
794
|
verbose,
|
|
791
795
|
debug,
|
|
792
796
|
erroredToolUseIDs,
|
|
@@ -795,7 +799,7 @@ function REPL({
|
|
|
795
799
|
toolUseConfirm,
|
|
796
800
|
isMessageSelectorVisible,
|
|
797
801
|
unresolvedToolUseIDs,
|
|
798
|
-
|
|
802
|
+
currentMcpClients,
|
|
799
803
|
isDefaultModel,
|
|
800
804
|
isResumedConversation,
|
|
801
805
|
// V1+ dependencies
|
|
@@ -830,8 +834,12 @@ function REPL({
|
|
|
830
834
|
const handleToggleBackgroundPanel = useCallback(() => {
|
|
831
835
|
setShowBackgroundPanel((prev) => !prev);
|
|
832
836
|
}, []);
|
|
833
|
-
const handleModelChange = useCallback(() => {
|
|
837
|
+
const handleModelChange = useCallback(async () => {
|
|
838
|
+
setIsResizeClearing(true);
|
|
839
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
840
|
+
await clearTerminal();
|
|
834
841
|
setForkNumber((prev) => prev + 1);
|
|
842
|
+
setIsResizeClearing(false);
|
|
835
843
|
}, []);
|
|
836
844
|
const handleToggleVerbose = useCallback(async (newVerbose) => {
|
|
837
845
|
const message = `${getVerboseLabel(newVerbose)} (Ctrl+O)`;
|
|
@@ -883,7 +891,7 @@ function REPL({
|
|
|
883
891
|
PermissionProvider,
|
|
884
892
|
{
|
|
885
893
|
isBypassPermissionsModeAvailable: !safeMode,
|
|
886
|
-
children: /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(React.Fragment, { key: `
|
|
894
|
+
children: /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(React.Fragment, { key: `static-wrapper-${forkNumber}` }, /* @__PURE__ */ React.createElement(
|
|
887
895
|
Static,
|
|
888
896
|
{
|
|
889
897
|
items: staticItems,
|
|
@@ -907,7 +915,7 @@ function REPL({
|
|
|
907
915
|
showTodoList: isTodoPanelVisible
|
|
908
916
|
}
|
|
909
917
|
),
|
|
910
|
-
!isResizeClearing && !isLoading && !toolJSX && !toolUseConfirm && !binaryFeedbackContext && /* @__PURE__ */ React.createElement(
|
|
918
|
+
!isResizeClearing && !isLoading && !toolJSX && !toolUseConfirm && !binaryFeedbackContext && queuedPrompts.length === 0 && /* @__PURE__ */ React.createElement(
|
|
911
919
|
TurnCompletionIndicator,
|
|
912
920
|
{
|
|
913
921
|
durationMs: lastTurnDurationMs,
|
|
@@ -926,7 +934,7 @@ function REPL({
|
|
|
926
934
|
},
|
|
927
935
|
verbose,
|
|
928
936
|
normalizedMessages,
|
|
929
|
-
tools,
|
|
937
|
+
tools: currentTools,
|
|
930
938
|
debug,
|
|
931
939
|
erroredToolUseIDs,
|
|
932
940
|
inProgressToolUseIDs,
|
|
@@ -978,10 +986,10 @@ function REPL({
|
|
|
978
986
|
), /* @__PURE__ */ React.createElement(
|
|
979
987
|
PromptInput,
|
|
980
988
|
{
|
|
981
|
-
commands,
|
|
989
|
+
commands: currentCommands,
|
|
982
990
|
forkNumber,
|
|
983
991
|
messageLogName,
|
|
984
|
-
tools,
|
|
992
|
+
tools: currentTools,
|
|
985
993
|
isDisabled: apiKeyStatus === "invalid",
|
|
986
994
|
isLoading,
|
|
987
995
|
onQuery,
|
|
@@ -1020,7 +1028,8 @@ function REPL({
|
|
|
1020
1028
|
},
|
|
1021
1029
|
onInterrupt,
|
|
1022
1030
|
isOverlayActive: !!(toolJSX && !toolJSX.shouldHidePromptInput),
|
|
1023
|
-
unmount: unmountREPL
|
|
1031
|
+
unmount: unmountREPL,
|
|
1032
|
+
startupItems
|
|
1024
1033
|
}
|
|
1025
1034
|
), toolJSX && !toolJSX.shouldHidePromptInput && toolJSX.jsx)
|
|
1026
1035
|
), isMessageSelectorVisible && /* @__PURE__ */ React.createElement(React.Fragment, { key: `message-selector-wrapper-${forkNumber}` }, /* @__PURE__ */ React.createElement(
|
|
@@ -1047,7 +1056,7 @@ function REPL({
|
|
|
1047
1056
|
});
|
|
1048
1057
|
},
|
|
1049
1058
|
onEscape: () => setIsMessageSelectorVisible(false),
|
|
1050
|
-
tools
|
|
1059
|
+
tools: currentTools
|
|
1051
1060
|
}
|
|
1052
1061
|
)), /* @__PURE__ */ React.createElement(Newline, null))
|
|
1053
1062
|
}
|