@within-7/minto 0.1.7 → 0.2.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/cli.js +155 -37
- package/dist/Tool.js +38 -0
- package/dist/Tool.js.map +3 -3
- package/dist/commands/agents/AgentsCommand.js +52 -26
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/agents/constants.js +1 -1
- package/dist/commands/agents/constants.js.map +1 -1
- package/dist/commands/agents/index.js +1 -1
- package/dist/commands/bug.js +74 -7
- package/dist/commands/bug.js.map +3 -3
- package/dist/commands/clear.js +3 -0
- package/dist/commands/clear.js.map +2 -2
- package/dist/commands/compact.js +37 -0
- package/dist/commands/compact.js.map +2 -2
- package/dist/commands/context.js +84 -0
- package/dist/commands/context.js.map +7 -0
- package/dist/commands/ctx_viz.js +18 -10
- package/dist/commands/ctx_viz.js.map +2 -2
- package/dist/commands/doctor.js +158 -12
- package/dist/commands/doctor.js.map +2 -2
- package/dist/commands/export.js +156 -0
- package/dist/commands/export.js.map +7 -0
- package/dist/commands/mcp-interactive.js +21 -12
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/model.js +6 -5
- package/dist/commands/model.js.map +2 -2
- package/dist/commands/permissions.js +86 -0
- package/dist/commands/permissions.js.map +7 -0
- package/dist/commands/quit.js +3 -1
- package/dist/commands/quit.js.map +2 -2
- package/dist/commands/sandbox.js +104 -0
- package/dist/commands/sandbox.js.map +7 -0
- package/dist/commands/status.js +58 -0
- package/dist/commands/status.js.map +7 -0
- package/dist/commands/tasks.js +108 -0
- package/dist/commands/tasks.js.map +7 -0
- package/dist/commands/todos.js +123 -0
- package/dist/commands/todos.js.map +7 -0
- package/dist/commands.js +20 -2
- package/dist/commands.js.map +2 -2
- package/dist/components/AgentThinkingBlock.js +10 -18
- package/dist/components/AgentThinkingBlock.js.map +2 -2
- package/dist/components/BackgroundTasksPanel.js +78 -29
- package/dist/components/BackgroundTasksPanel.js.map +2 -2
- package/dist/components/BashStreamingProgress.js +24 -0
- package/dist/components/BashStreamingProgress.js.map +7 -0
- package/dist/components/CollapsibleHint.js +14 -0
- package/dist/components/CollapsibleHint.js.map +7 -0
- package/dist/components/FileEditToolUpdatedMessage.js +1 -1
- package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
- package/dist/components/HotkeyHelpPanel.js +137 -0
- package/dist/components/HotkeyHelpPanel.js.map +7 -0
- package/dist/components/Logo.js +5 -5
- package/dist/components/Logo.js.map +2 -2
- package/dist/components/Message.js +23 -7
- package/dist/components/Message.js.map +3 -3
- package/dist/components/ModelConfig.js +16 -3
- package/dist/components/ModelConfig.js.map +2 -2
- package/dist/components/ModelListManager.js +3 -3
- package/dist/components/ModelListManager.js.map +2 -2
- package/dist/components/ModelSelector/ModelSelector.js +1 -1
- package/dist/components/Onboarding.js +19 -14
- package/dist/components/Onboarding.js.map +2 -2
- package/dist/components/ProgressBar.js +74 -0
- package/dist/components/ProgressBar.js.map +7 -0
- package/dist/components/PromptInput.js +156 -46
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/RequestStatusIndicator.js +194 -0
- package/dist/components/RequestStatusIndicator.js.map +7 -0
- package/dist/components/Spinner.js +92 -27
- package/dist/components/Spinner.js.map +2 -2
- package/dist/components/SpinnerSymbol.js +21 -27
- package/dist/components/SpinnerSymbol.js.map +2 -2
- package/dist/components/StreamingBashOutput.js +9 -8
- package/dist/components/StreamingBashOutput.js.map +2 -2
- package/dist/components/SubagentBlock.js +1 -1
- package/dist/components/SubagentBlock.js.map +1 -1
- package/dist/components/SubagentProgress.js +10 -11
- package/dist/components/SubagentProgress.js.map +2 -2
- package/dist/components/TaskCard.js +16 -13
- package/dist/components/TaskCard.js.map +2 -2
- package/dist/components/TodoChangeBlock.js +1 -1
- package/dist/components/TodoChangeBlock.js.map +2 -2
- package/dist/components/TodoPanel.js +120 -29
- package/dist/components/TodoPanel.js.map +3 -3
- package/dist/components/TokenCounter.js +74 -0
- package/dist/components/TokenCounter.js.map +7 -0
- package/dist/components/TokenWarning.js +2 -1
- package/dist/components/TokenWarning.js.map +2 -2
- package/dist/components/TreeConnector.js +25 -0
- package/dist/components/TreeConnector.js.map +7 -0
- package/dist/components/TurnCompletionIndicator.js +18 -0
- package/dist/components/TurnCompletionIndicator.js.map +7 -0
- package/dist/components/messages/AssistantTextMessage.js +5 -2
- package/dist/components/messages/AssistantTextMessage.js.map +2 -2
- package/dist/components/messages/AssistantThinkingMessage.js +18 -3
- package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
- package/dist/components/messages/AssistantToolUseMessage.js +11 -8
- package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
- package/dist/components/messages/GroupRenderer.js +53 -0
- package/dist/components/messages/GroupRenderer.js.map +7 -0
- package/dist/components/messages/NestedTasksPreview.js +12 -0
- package/dist/components/messages/NestedTasksPreview.js.map +7 -0
- package/dist/components/messages/ParallelTasksGroupView.js +92 -0
- package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
- package/dist/components/messages/TaskInModuleView.js +198 -0
- package/dist/components/messages/TaskInModuleView.js.map +7 -0
- package/dist/components/messages/TaskOutputContent.js +53 -0
- package/dist/components/messages/TaskOutputContent.js.map +7 -0
- package/dist/components/messages/UserPromptMessage.js +1 -1
- package/dist/components/messages/UserPromptMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
- package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
- package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
- package/dist/constants/colors.js +48 -0
- package/dist/constants/colors.js.map +2 -2
- package/dist/constants/formatRules.js +102 -0
- package/dist/constants/formatRules.js.map +7 -0
- package/dist/constants/prompts.js +12 -34
- package/dist/constants/prompts.js.map +2 -2
- package/dist/constants/symbols.js +64 -6
- package/dist/constants/symbols.js.map +2 -2
- package/dist/constants/timing.js +5 -0
- package/dist/constants/timing.js.map +2 -2
- package/dist/core/config/defaults.js +84 -0
- package/dist/core/config/defaults.js.map +7 -0
- package/dist/core/config/index.js +111 -0
- package/dist/core/config/index.js.map +7 -0
- package/dist/core/config/loader.js +221 -0
- package/dist/core/config/loader.js.map +7 -0
- package/dist/core/config/migrations.js +128 -0
- package/dist/core/config/migrations.js.map +7 -0
- package/dist/core/config/schema.js +178 -0
- package/dist/core/config/schema.js.map +7 -0
- package/dist/core/costTracker.js +138 -0
- package/dist/core/costTracker.js.map +7 -0
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +7 -0
- package/dist/core/permissions/auditLog.js +204 -0
- package/dist/core/permissions/auditLog.js.map +7 -0
- package/dist/core/permissions/engine/index.js +3 -0
- package/dist/core/permissions/engine/index.js.map +7 -0
- package/dist/core/permissions/engine/permissionEngine.js +106 -0
- package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
- package/dist/core/permissions/engine/types.js +1 -0
- package/dist/core/permissions/engine/types.js.map +7 -0
- package/dist/core/permissions/index.js +84 -0
- package/dist/core/permissions/index.js.map +7 -0
- package/dist/core/permissions/ruleEngine.js +259 -0
- package/dist/core/permissions/ruleEngine.js.map +7 -0
- package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
- package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
- package/dist/core/permissions/rules/autoEscalationRule.js +291 -0
- package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
- package/dist/core/permissions/rules/index.js +46 -0
- package/dist/core/permissions/rules/index.js.map +7 -0
- package/dist/core/permissions/rules/planModeRule.js +55 -0
- package/dist/core/permissions/rules/planModeRule.js.map +7 -0
- package/dist/core/permissions/rules/projectBoundaryRule.js +168 -0
- package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
- package/dist/core/permissions/rules/safeModeRule.js +65 -0
- package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
- package/dist/core/permissions/rules/sensitivePathsRule.js +340 -0
- package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
- package/dist/core/permissions/types.js +127 -0
- package/dist/core/permissions/types.js.map +7 -0
- package/dist/core/tools/executor.js +143 -0
- package/dist/core/tools/executor.js.map +7 -0
- package/dist/core/tools/index.js +15 -0
- package/dist/core/tools/index.js.map +7 -0
- package/dist/core/tools/registry.js +183 -0
- package/dist/core/tools/registry.js.map +7 -0
- package/dist/core/tools/types.js +1 -0
- package/dist/core/tools/types.js.map +7 -0
- package/dist/cost-tracker.js +23 -15
- package/dist/cost-tracker.js.map +2 -2
- package/dist/entrypoints/cli.js +43 -43
- package/dist/entrypoints/cli.js.map +2 -2
- package/dist/entrypoints/mcp.js +12 -4
- package/dist/entrypoints/mcp.js.map +2 -2
- package/dist/history.js +14 -3
- package/dist/history.js.map +2 -2
- package/dist/hooks/useAgentTranscripts.js +116 -0
- package/dist/hooks/useAgentTranscripts.js.map +7 -0
- package/dist/hooks/useAnimationSync.js +53 -0
- package/dist/hooks/useAnimationSync.js.map +7 -0
- package/dist/hooks/useArrowKeyHistory.js +4 -2
- package/dist/hooks/useArrowKeyHistory.js.map +2 -2
- package/dist/hooks/useCanUseTool.js +3 -1
- package/dist/hooks/useCanUseTool.js.map +2 -2
- package/dist/hooks/useCancelRequest.js +4 -1
- package/dist/hooks/useCancelRequest.js.map +2 -2
- package/dist/hooks/useExitOnCtrlCD.js +9 -5
- package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
- package/dist/hooks/useHookStatus.js +40 -0
- package/dist/hooks/useHookStatus.js.map +7 -0
- package/dist/hooks/useLogMessages.js +17 -1
- package/dist/hooks/useLogMessages.js.map +2 -2
- package/dist/hooks/useMessageGroups.js +43 -0
- package/dist/hooks/useMessageGroups.js.map +7 -0
- package/dist/hooks/useTerminalSize.js +62 -6
- package/dist/hooks/useTerminalSize.js.map +2 -2
- package/dist/hooks/useUnifiedCompletion.js +69 -0
- package/dist/hooks/useUnifiedCompletion.js.map +2 -2
- package/dist/i18n/index.js +109 -0
- package/dist/i18n/index.js.map +7 -0
- package/dist/i18n/locales/en.js +347 -0
- package/dist/i18n/locales/en.js.map +7 -0
- package/dist/i18n/locales/index.js +7 -0
- package/dist/i18n/locales/index.js.map +7 -0
- package/dist/i18n/locales/zh-CN.js +347 -0
- package/dist/i18n/locales/zh-CN.js.map +7 -0
- package/dist/i18n/types.js +8 -0
- package/dist/i18n/types.js.map +7 -0
- package/dist/query.js +175 -17
- package/dist/query.js.map +3 -3
- package/dist/screens/REPL.js +501 -192
- package/dist/screens/REPL.js.map +3 -3
- package/dist/services/adapters/chatCompletions.js +3 -1
- package/dist/services/adapters/chatCompletions.js.map +2 -2
- package/dist/services/adapters/messageNormalizer.js +354 -0
- package/dist/services/adapters/messageNormalizer.js.map +7 -0
- package/dist/services/adapters/responsesAPI.js +6 -3
- package/dist/services/adapters/responsesAPI.js.map +2 -2
- package/dist/services/checkpointManager.js +386 -0
- package/dist/services/checkpointManager.js.map +7 -0
- package/dist/services/claude.js +138 -11
- package/dist/services/claude.js.map +3 -3
- package/dist/services/compressionService.js +50 -1
- package/dist/services/compressionService.js.map +2 -2
- package/dist/services/contextMonitor.js +162 -0
- package/dist/services/contextMonitor.js.map +7 -0
- package/dist/services/customCommands.js +60 -41
- package/dist/services/customCommands.js.map +2 -2
- package/dist/services/hookExecutor.js +173 -1
- package/dist/services/hookExecutor.js.map +2 -2
- package/dist/services/intelligentCompactor.js +281 -0
- package/dist/services/intelligentCompactor.js.map +7 -0
- package/dist/services/lspConfig.js +109 -0
- package/dist/services/lspConfig.js.map +7 -0
- package/dist/services/mcpClient.js +273 -34
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/modelOrchestrator.js +310 -0
- package/dist/services/modelOrchestrator.js.map +7 -0
- package/dist/services/openai.js +8 -1
- package/dist/services/openai.js.map +2 -2
- package/dist/services/outputStyles.js +138 -0
- package/dist/services/outputStyles.js.map +7 -0
- package/dist/services/plugins/index.js +5 -0
- package/dist/services/plugins/index.js.map +7 -0
- package/dist/services/plugins/lspServers.js +188 -0
- package/dist/services/plugins/lspServers.js.map +7 -0
- package/dist/services/plugins/pluginRuntime.js +229 -0
- package/dist/services/plugins/pluginRuntime.js.map +7 -0
- package/dist/services/plugins/pluginValidation.js +219 -0
- package/dist/services/plugins/pluginValidation.js.map +7 -0
- package/dist/services/plugins/skillMarketplace.js +556 -0
- package/dist/services/plugins/skillMarketplace.js.map +7 -0
- package/dist/services/responseStateManager.js +37 -3
- package/dist/services/responseStateManager.js.map +2 -2
- package/dist/services/sandbox/filesystemBoundary.js +300 -0
- package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
- package/dist/services/sandbox/index.js +14 -0
- package/dist/services/sandbox/index.js.map +7 -0
- package/dist/services/sandbox/networkProxy.js +293 -0
- package/dist/services/sandbox/networkProxy.js.map +7 -0
- package/dist/services/sandbox/sandboxController.js +574 -0
- package/dist/services/sandbox/sandboxController.js.map +7 -0
- package/dist/services/sandbox/types.js +50 -0
- package/dist/services/sandbox/types.js.map +7 -0
- package/dist/services/sessionMemory.js +266 -0
- package/dist/services/sessionMemory.js.map +7 -0
- package/dist/services/taskRouter.js +324 -0
- package/dist/services/taskRouter.js.map +7 -0
- package/dist/tools/ArchitectTool/ArchitectTool.js +7 -1
- package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +3 -0
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
- package/dist/tools/BaseTool.js +72 -0
- package/dist/tools/BaseTool.js.map +7 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
- package/dist/tools/BashTool/BashTool.js +60 -3
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
- package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
- package/dist/tools/BashTool/OutputLine.js +54 -0
- package/dist/tools/BashTool/OutputLine.js.map +2 -2
- package/dist/tools/BashTool/prompt.js +192 -3
- package/dist/tools/BashTool/prompt.js.map +2 -2
- package/dist/tools/FileEditTool/FileEditTool.js +29 -4
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
- package/dist/tools/GlobTool/GlobTool.js +4 -2
- package/dist/tools/GlobTool/GlobTool.js.map +2 -2
- package/dist/tools/GrepTool/GrepTool.js +36 -7
- package/dist/tools/GrepTool/GrepTool.js.map +2 -2
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
- package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
- package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
- package/dist/tools/LspTool/LspTool.js +664 -0
- package/dist/tools/LspTool/LspTool.js.map +7 -0
- package/dist/tools/LspTool/prompt.js +27 -0
- package/dist/tools/LspTool/prompt.js.map +7 -0
- package/dist/tools/MCPTool/MCPTool.js +9 -1
- package/dist/tools/MCPTool/MCPTool.js.map +2 -2
- package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
- package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js +5 -1
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
- package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +74 -0
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +108 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
- package/dist/tools/PlanModeTool/prompt.js +94 -0
- package/dist/tools/PlanModeTool/prompt.js.map +7 -0
- package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
- package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
- package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
- package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
- package/dist/tools/SkillTool/SkillTool.js +6 -1
- package/dist/tools/SkillTool/SkillTool.js.map +2 -2
- package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
- package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
- package/dist/tools/SlashCommandTool/prompt.js +35 -0
- package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
- package/dist/tools/TaskOutputTool/TaskOutputTool.js +189 -0
- package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
- package/dist/tools/TaskOutputTool/prompt.js +15 -0
- package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
- package/dist/tools/TaskTool/TaskTool.js +302 -104
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/tools/TaskTool/prompt.js.map +2 -2
- package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -77
- package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/URLFetcherTool.js +4 -1
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/cache.js +55 -8
- package/dist/tools/URLFetcherTool/cache.js.map +2 -2
- package/dist/tools.js +31 -2
- package/dist/tools.js.map +2 -2
- package/dist/types/hooks.js +4 -0
- package/dist/types/hooks.js.map +2 -2
- package/dist/types/marketplace.js.map +2 -2
- package/dist/types/messageGroup.js +36 -0
- package/dist/types/messageGroup.js.map +7 -0
- package/dist/types/plugin.js.map +2 -2
- package/dist/types/thinking.js +1 -0
- package/dist/types/thinking.js.map +7 -0
- package/dist/utils/BackgroundShellManager.js +136 -39
- package/dist/utils/BackgroundShellManager.js.map +2 -2
- package/dist/utils/MessageBatchBuffer.js +102 -0
- package/dist/utils/MessageBatchBuffer.js.map +7 -0
- package/dist/utils/PersistentShell.js +151 -1
- package/dist/utils/PersistentShell.js.map +2 -2
- package/dist/utils/agentLoader.js +1 -23
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/agentTranscripts.js +641 -0
- package/dist/utils/agentTranscripts.js.map +7 -0
- package/dist/utils/animationManager.js +213 -0
- package/dist/utils/animationManager.js.map +7 -0
- package/dist/utils/animationSync.js +110 -0
- package/dist/utils/animationSync.js.map +7 -0
- package/dist/utils/asyncFile.js +215 -0
- package/dist/utils/asyncFile.js.map +7 -0
- package/dist/utils/backgroundAgentManager.js +231 -0
- package/dist/utils/backgroundAgentManager.js.map +7 -0
- package/dist/utils/config.js +63 -7
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/conversationRecovery.js +19 -0
- package/dist/utils/conversationRecovery.js.map +2 -2
- package/dist/utils/exit.js +73 -0
- package/dist/utils/exit.js.map +7 -0
- package/dist/utils/format.js +73 -5
- package/dist/utils/format.js.map +2 -2
- package/dist/utils/generators.js +76 -6
- package/dist/utils/generators.js.map +2 -2
- package/dist/utils/globalErrorHandler.js +149 -0
- package/dist/utils/globalErrorHandler.js.map +7 -0
- package/dist/utils/groupHandlers/index.js +8 -0
- package/dist/utils/groupHandlers/index.js.map +7 -0
- package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
- package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
- package/dist/utils/groupHandlers/taskHandler.js +104 -0
- package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
- package/dist/utils/groupHandlers/types.js +1 -0
- package/dist/utils/groupHandlers/types.js.map +7 -0
- package/dist/utils/logRotation.js +224 -0
- package/dist/utils/logRotation.js.map +7 -0
- package/dist/utils/marketplaceManager.js +3 -5
- package/dist/utils/marketplaceManager.js.map +2 -2
- package/dist/utils/memSafety.js +264 -0
- package/dist/utils/memSafety.js.map +7 -0
- package/dist/utils/messageGroupManager.js +274 -0
- package/dist/utils/messageGroupManager.js.map +7 -0
- package/dist/utils/messages.js +13 -4
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/model.js +119 -15
- package/dist/utils/model.js.map +3 -3
- package/dist/utils/permissions/filesystem.js +157 -5
- package/dist/utils/permissions/filesystem.js.map +2 -2
- package/dist/utils/plan/planMode.js +143 -0
- package/dist/utils/plan/planMode.js.map +7 -0
- package/dist/utils/pluginLoader.js +17 -21
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/ripgrep.js +55 -2
- package/dist/utils/ripgrep.js.map +2 -2
- package/dist/utils/sanitizeInput.js +32 -0
- package/dist/utils/sanitizeInput.js.map +7 -0
- package/dist/utils/secureKeyStorage.js +312 -0
- package/dist/utils/secureKeyStorage.js.map +7 -0
- package/dist/utils/session/sessionPlugins.js +67 -0
- package/dist/utils/session/sessionPlugins.js.map +7 -0
- package/dist/utils/taskDisplayUtils.js +257 -0
- package/dist/utils/taskDisplayUtils.js.map +7 -0
- package/dist/utils/teamConfig.js +2 -1
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/todoStorage.js +92 -2
- package/dist/utils/todoStorage.js.map +2 -2
- package/dist/utils/toolTimeout.js +136 -0
- package/dist/utils/toolTimeout.js.map +7 -0
- package/dist/utils/tooling/safeRender.js +115 -0
- package/dist/utils/tooling/safeRender.js.map +7 -0
- package/dist/utils/userFriendlyError.js +346 -0
- package/dist/utils/userFriendlyError.js.map +7 -0
- package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +14 -4
- package/scripts/postinstall.js +128 -38
- package/dist/commands/agents.js +0 -2086
- package/dist/commands/agents.js.map +0 -7
- package/dist/commands/build.js +0 -74
- package/dist/commands/build.js.map +0 -7
- package/dist/commands/compression.js +0 -57
- package/dist/commands/compression.js.map +0 -7
- package/dist/commands/listen.js +0 -37
- package/dist/commands/listen.js.map +0 -7
- package/dist/commands/login.js +0 -37
- package/dist/commands/login.js.map +0 -7
- package/dist/commands/logout.js +0 -33
- package/dist/commands/logout.js.map +0 -7
- package/dist/commands/mcp.js +0 -40
- package/dist/commands/mcp.js.map +0 -7
- package/dist/commands/mcp_refresh.js +0 -40
- package/dist/commands/mcp_refresh.js.map +0 -7
- package/dist/commands/modelstatus.js +0 -21
- package/dist/commands/modelstatus.js.map +0 -7
- package/dist/commands/onboarding.js +0 -36
- package/dist/commands/onboarding.js.map +0 -7
- package/dist/commands/plugin-interactive.js +0 -446
- package/dist/commands/plugin-interactive.js.map +0 -7
- package/dist/commands/pr_comments.js +0 -61
- package/dist/commands/pr_comments.js.map +0 -7
- package/dist/commands/release-notes.js +0 -30
- package/dist/commands/release-notes.js.map +0 -7
- package/dist/commands/review.js +0 -51
- package/dist/commands/review.js.map +0 -7
- package/dist/components/Bug.js +0 -147
- package/dist/components/Bug.js.map +0 -7
- package/dist/components/ModelSelector.js +0 -2062
- package/dist/components/ModelSelector.js.map +0 -7
- package/dist/components/ModelStatusDisplay.js +0 -87
- package/dist/components/ModelStatusDisplay.js.map +0 -7
- package/dist/entrypoints/cli-wrapper.js +0 -61
- package/dist/entrypoints/cli-wrapper.js.map +0 -7
- package/dist/screens/Doctor.js +0 -22
- package/dist/screens/Doctor.js.map +0 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/utils/messages.tsx"],
|
|
4
|
-
"sourcesContent": ["import { randomUUID, UUID } from 'crypto'\nimport { Box } from 'ink'\nimport { AssistantMessage, Message, ProgressMessage, UserMessage } from '@query'\nimport { getCommand, hasCommand } from '@commands'\nimport { MalformedCommandError } from './errors'\nimport { logError } from './log'\nimport { resolve } from 'path'\nimport { last } from 'lodash-es'\nimport { memoizeWithLimit } from './async'\nimport type { SetToolJSXFn, Tool, ToolUseContext } from '@tool'\nimport { lastX } from '@utils/generators'\nimport { NO_CONTENT_MESSAGE } from '@services/claude'\nimport {\n ImageBlockParam,\n TextBlockParam,\n ToolResultBlockParam,\n ToolUseBlockParam,\n Message as APIMessage,\n ContentBlockParam,\n ContentBlock,\n} from '@anthropic-ai/sdk/resources/index.mjs'\nimport { setCwd } from './state'\nimport { getCwd } from './state'\nimport chalk from 'chalk'\nimport * as React from 'react'\nimport { UserBashInputMessage } from '@components/messages/UserBashInputMessage'\nimport { Spinner } from '@components/Spinner'\nimport { StreamingBashOutput } from '@components/StreamingBashOutput'\nimport { BashTool } from '@tools/BashTool/BashTool'\nimport { ToolUseBlock } from '@anthropic-ai/sdk/resources/index.mjs'\n\n// NOTE: Dynamic content processing for custom commands has been moved to\n// src/services/customCommands.ts for better organization and reusability.\n// The functions executeBashCommands and resolveFileReferences are no longer\n// duplicated here but are imported when needed for custom command processing.\n\nexport const INTERRUPT_MESSAGE = '[Request interrupted by user]'\nexport const INTERRUPT_MESSAGE_FOR_TOOL_USE =\n '[Request interrupted by user for tool use]'\nexport const CANCEL_MESSAGE =\n \"The user doesn't want to take this action right now. STOP what you are doing and wait for the user to tell you how to proceed.\"\nexport const REJECT_MESSAGE =\n \"The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file). STOP what you are doing and wait for the user to tell you how to proceed.\"\nexport const NO_RESPONSE_REQUESTED = 'No response requested.'\n\nexport const SYNTHETIC_ASSISTANT_MESSAGES = new Set([\n INTERRUPT_MESSAGE,\n INTERRUPT_MESSAGE_FOR_TOOL_USE,\n CANCEL_MESSAGE,\n REJECT_MESSAGE,\n NO_RESPONSE_REQUESTED,\n])\n\nfunction baseCreateAssistantMessage(\n content: ContentBlock[],\n extra?: Partial<AssistantMessage>,\n): AssistantMessage {\n return {\n type: 'assistant',\n costUSD: 0,\n durationMs: 0,\n uuid: randomUUID(),\n message: {\n id: randomUUID(),\n model: '<synthetic>',\n role: 'assistant',\n stop_reason: 'stop_sequence',\n stop_sequence: '',\n type: 'message',\n usage: {\n input_tokens: 0,\n output_tokens: 0,\n cache_creation_input_tokens: 0,\n cache_read_input_tokens: 0,\n },\n content,\n },\n ...extra,\n }\n}\n\nexport function createAssistantMessage(content: string): AssistantMessage {\n return baseCreateAssistantMessage([\n {\n type: 'text' as const,\n text: content === '' ? NO_CONTENT_MESSAGE : content,\n citations: [],\n },\n ])\n}\n\nexport function createAssistantAPIErrorMessage(\n content: string,\n): AssistantMessage {\n return baseCreateAssistantMessage(\n [\n {\n type: 'text' as const,\n text: content === '' ? NO_CONTENT_MESSAGE : content,\n citations: [],\n },\n ],\n { isApiErrorMessage: true },\n )\n}\n\nexport type FullToolUseResult = {\n data: unknown // Matches tool's `Output` type\n resultForAssistant: ToolResultBlockParam['content']\n}\n\nexport function createUserMessage(\n content: string | ContentBlockParam[],\n toolUseResult?: FullToolUseResult,\n): UserMessage {\n const m: UserMessage = {\n type: 'user',\n message: {\n role: 'user',\n content,\n },\n uuid: randomUUID(),\n toolUseResult,\n }\n return m\n}\n\nexport function createProgressMessage(\n toolUseID: string,\n siblingToolUseIDs: Set<string>,\n content: AssistantMessage,\n normalizedMessages: NormalizedMessage[],\n tools: Tool[],\n): ProgressMessage {\n return {\n type: 'progress',\n content,\n normalizedMessages,\n siblingToolUseIDs,\n tools,\n toolUseID,\n uuid: randomUUID(),\n }\n}\n\nexport function createToolResultStopMessage(\n toolUseID: string,\n): ToolResultBlockParam {\n return {\n type: 'tool_result',\n content: CANCEL_MESSAGE,\n is_error: true,\n tool_use_id: toolUseID,\n }\n}\n\nexport async function processUserInput(\n input: string,\n mode: 'bash' | 'prompt' | 'koding',\n setToolJSX: SetToolJSXFn,\n context: ToolUseContext & {\n setForkConvoWithMessagesOnTheNextRender: (\n forkConvoWithMessages: Message[],\n ) => void\n options?: {\n isKodingRequest?: boolean\n kodingContext?: string\n }\n },\n pastedImage: string | null,\n): Promise<Message[]> {\n // Bash commands\n if (mode === 'bash') {\n const userMessage = createUserMessage(`<bash-input>${input}</bash-input>`)\n\n // Special case: cd\n if (input.startsWith('cd ')) {\n const oldCwd = getCwd()\n const newCwd = resolve(oldCwd, input.slice(3))\n try {\n await setCwd(newCwd)\n return [\n userMessage,\n createAssistantMessage(\n `<bash-stdout>Changed directory to ${chalk.bold(`${newCwd}/`)}</bash-stdout>`,\n ),\n ]\n } catch (e) {\n logError(e)\n return [\n userMessage,\n createAssistantMessage(\n `<bash-stderr>cwd error: ${e instanceof Error ? e.message : String(e)}</bash-stderr>`,\n ),\n ]\n }\n }\n\n // All other bash commands - run in background with streaming output\n const validationResult = await BashTool.validateInput({\n command: input,\n })\n if (!validationResult.result) {\n return [userMessage, createAssistantMessage(validationResult.message)]\n }\n\n // Start command in background to enable streaming\n const { BackgroundShellManager } = await import(\n '@utils/BackgroundShellManager'\n )\n const shellId = BackgroundShellManager.getInstance().create(\n input,\n context.readFileTimestamps ? getCwd() : process.cwd(),\n )\n\n let movedToBackground = false\n let completed = false\n let completionData: {\n stdout: string\n stderr: string\n exitCode: number\n } | null = null\n\n // Show streaming output with Ctrl+B option\n setToolJSX({\n jsx: (\n <StreamingBashOutput\n shellId={shellId}\n command={input}\n onMoveToBackground={() => {\n movedToBackground = true\n setToolJSX(null)\n }}\n onComplete={(stdout, stderr, exitCode) => {\n completed = true\n completionData = { stdout, stderr, exitCode }\n setToolJSX(null)\n }}\n />\n ),\n shouldHidePromptInput: false,\n })\n\n // Wait for either completion or move to background\n await new Promise<void>(resolve => {\n const checkInterval = setInterval(() => {\n if (movedToBackground || completed) {\n clearInterval(checkInterval)\n resolve()\n }\n }, 100)\n })\n\n if (movedToBackground) {\n // Task moved to background - return message about it\n return [\n userMessage,\n createAssistantMessage(\n `<bash-stdout>Command moved to background (shell ID: ${shellId})\\nUse Shift+B to view background tasks</bash-stdout>`,\n ),\n ]\n } else if (completed && completionData) {\n // Task completed normally\n return [\n userMessage,\n createAssistantMessage(\n `<bash-stdout>${completionData.stdout}</bash-stdout><bash-stderr>${completionData.stderr}</bash-stderr>`,\n ),\n ]\n } else {\n // Should not reach here\n return [\n userMessage,\n createAssistantMessage(\n `<bash-stderr>Unexpected error in bash execution</bash-stderr>`,\n ),\n ]\n }\n }\n // Koding mode - special wrapper for display\n else if (mode === 'koding') {\n const userMessage = createUserMessage(\n `<koding-input>${input}</koding-input>`,\n )\n // Add the Koding flag to the message\n userMessage.options = {\n ...userMessage.options,\n isKodingRequest: true,\n }\n\n // Rest of koding processing is handled separately to capture assistant response\n return [userMessage]\n }\n\n // Slash commands\n if (input.startsWith('/')) {\n const words = input.slice(1).split(' ')\n let commandName = words[0]\n if (words.length > 1 && words[1] === '(MCP)') {\n commandName = commandName + ' (MCP)'\n }\n if (!commandName) {\n return [\n createAssistantMessage('Commands are in the form `/command [args]`'),\n ]\n }\n\n // Check if it's a real command before processing\n if (!hasCommand(commandName, context.options.commands)) {\n // If not a real command, treat it as a regular user input\n\n return [createUserMessage(input)]\n }\n\n const args = input.slice(commandName.length + 2)\n const newMessages = await getMessagesForSlashCommand(\n commandName,\n args,\n setToolJSX,\n context,\n )\n\n // Local JSX commands\n if (newMessages.length === 0) {\n return []\n }\n\n // For invalid commands, preserve both the user message and error\n if (\n newMessages.length === 2 &&\n newMessages[0]!.type === 'user' &&\n newMessages[1]!.type === 'assistant' &&\n typeof newMessages[1]!.message.content === 'string' &&\n newMessages[1]!.message.content.startsWith('Unknown command:')\n ) {\n return newMessages\n }\n\n // User-Assistant pair (eg. local commands)\n if (newMessages.length === 2) {\n return newMessages\n }\n\n // A valid command\n\n return newMessages\n }\n\n // Regular user prompt\n\n // Check if this is a Koding request that needs special handling\n const isKodingRequest = context.options?.isKodingRequest === true\n const kodingContextInfo = context.options?.kodingContext\n\n // Create base message\n let userMessage: UserMessage\n\n if (pastedImage) {\n userMessage = createUserMessage([\n {\n type: 'image',\n source: {\n type: 'base64',\n media_type: 'image/png',\n data: pastedImage,\n },\n },\n {\n type: 'text',\n text:\n isKodingRequest && kodingContextInfo\n ? `${kodingContextInfo}\\n\\n${input}`\n : input,\n },\n ])\n } else {\n let processedInput =\n isKodingRequest && kodingContextInfo\n ? `${kodingContextInfo}\\n\\n${input}`\n : input\n\n // Process dynamic content for custom commands with ! and @ prefixes\n // This uses the same processing functions as custom commands to maintain consistency\n if (input.includes('!`') || input.includes('@')) {\n try {\n // Import functions from customCommands service to avoid code duplication\n const { executeBashCommands } = await import('@services/customCommands')\n\n // Execute bash commands if present\n if (input.includes('!`')) {\n // Note: This function is not exported from customCommands.ts, so we need to expose it\n // For now, we'll keep the local implementation until we refactor the service\n processedInput = await executeBashCommands(processedInput)\n }\n\n // Process mentions for system reminder integration\n // Note: We don't call resolveFileReferences here anymore -\n // @file mentions should trigger Read tool usage via reminders, not embed content\n if (input.includes('@')) {\n const { processMentions } = await import('@services/mentionProcessor')\n await processMentions(input)\n }\n } catch (error) {\n console.warn('Dynamic content processing failed:', error)\n // Continue with original input if processing fails\n }\n }\n\n userMessage = createUserMessage(processedInput)\n }\n\n // Add the Koding flag to the message if needed\n if (isKodingRequest) {\n userMessage.options = {\n ...userMessage.options,\n isKodingRequest: true,\n }\n }\n\n return [userMessage]\n}\n\nasync function getMessagesForSlashCommand(\n commandName: string,\n args: string,\n setToolJSX: SetToolJSXFn,\n context: ToolUseContext & {\n setForkConvoWithMessagesOnTheNextRender: (\n forkConvoWithMessages: Message[],\n ) => void\n },\n): Promise<Message[]> {\n try {\n const command = getCommand(commandName, context.options.commands)\n switch (command.type) {\n case 'local-jsx': {\n return new Promise(resolve => {\n command\n .call(r => {\n setToolJSX(null)\n resolve([\n createUserMessage(`<command-name>${command.userFacingName()}</command-name>\n <command-message>${command.userFacingName()}</command-message>\n <command-args>${args}</command-args>`),\n r\n ? createAssistantMessage(r)\n : createAssistantMessage(NO_RESPONSE_REQUESTED),\n ])\n }, context)\n .then(jsx => {\n setToolJSX({\n jsx,\n shouldHidePromptInput: true,\n })\n })\n })\n }\n case 'local': {\n const userMessage =\n createUserMessage(`<command-name>${command.userFacingName()}</command-name>\n <command-message>${command.userFacingName()}</command-message>\n <command-args>${args}</command-args>`)\n\n try {\n // Use the context's abortController for local commands\n const result = await command.call(args, {\n ...context,\n options: {\n commands: context.options.commands || [],\n tools: context.options.tools || [],\n slowAndCapableModel:\n context.options.slowAndCapableModel || 'main',\n },\n })\n\n return [\n userMessage,\n createAssistantMessage(\n `<local-command-stdout>${result}</local-command-stdout>`,\n ),\n ]\n } catch (e) {\n logError(e)\n return [\n userMessage,\n createAssistantMessage(\n `<local-command-stderr>${String(e)}</local-command-stderr>`,\n ),\n ]\n }\n }\n case 'prompt': {\n // For custom commands, process them naturally instead of wrapping in command-contents\n const prompt = await command.getPromptForCommand(args)\n return prompt.map(msg => {\n // Create a normal user message from the custom command content\n const userMessage = createUserMessage(\n typeof msg.content === 'string'\n ? msg.content\n : msg.content\n .map(block => (block.type === 'text' ? block.text : ''))\n .join('\\n'),\n )\n\n // Add metadata for tracking but don't wrap in special tags\n userMessage.options = {\n ...userMessage.options,\n isCustomCommand: true,\n commandName: command.userFacingName(),\n commandArgs: args,\n }\n\n return userMessage\n })\n }\n }\n } catch (e) {\n if (e instanceof MalformedCommandError) {\n return [createAssistantMessage(e.message)]\n }\n throw e\n }\n}\n\nexport function extractTagFromMessage(\n message: Message,\n tagName: string,\n): string | null {\n if (message.type === 'progress') {\n return null\n }\n if (typeof message.message.content !== 'string') {\n return null\n }\n return extractTag(message.message.content, tagName)\n}\n\nexport function extractTag(html: string, tagName: string): string | null {\n if (!html.trim() || !tagName.trim()) {\n return null\n }\n\n // Escape special characters in the tag name\n const escapedTag = tagName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n // Create regex pattern that handles:\n // 1. Self-closing tags\n // 2. Tags with attributes\n // 3. Nested tags of the same type\n // 4. Multiline content\n const pattern = new RegExp(\n `<${escapedTag}(?:\\\\s+[^>]*)?>` + // Opening tag with optional attributes\n '([\\\\s\\\\S]*?)' + // Content (non-greedy match)\n `<\\\\/${escapedTag}>`, // Closing tag\n 'gi',\n )\n\n let match\n let depth = 0\n let lastIndex = 0\n const openingTag = new RegExp(`<${escapedTag}(?:\\\\s+[^>]*?)?>`, 'gi')\n const closingTag = new RegExp(`<\\\\/${escapedTag}>`, 'gi')\n\n while ((match = pattern.exec(html)) !== null) {\n // Check for nested tags\n const content = match[1]\n const beforeMatch = html.slice(lastIndex, match.index)\n\n // Reset depth counter\n depth = 0\n\n // Count opening tags before this match\n openingTag.lastIndex = 0\n while (openingTag.exec(beforeMatch) !== null) {\n depth++\n }\n\n // Count closing tags before this match\n closingTag.lastIndex = 0\n while (closingTag.exec(beforeMatch) !== null) {\n depth--\n }\n\n // Only include content if we're at the correct nesting level\n if (depth === 0 && content) {\n return content\n }\n\n lastIndex = match.index + match[0].length\n }\n\n return null\n}\n\nexport function isNotEmptyMessage(message: Message): boolean {\n if (message.type === 'progress') {\n return true\n }\n\n if (typeof message.message.content === 'string') {\n return message.message.content.trim().length > 0\n }\n\n if (message.message.content.length === 0) {\n return false\n }\n\n // Skip multi-block messages for now\n if (message.message.content.length > 1) {\n return true\n }\n\n if (message.message.content[0]!.type !== 'text') {\n return true\n }\n\n return (\n message.message.content[0]!.text.trim().length > 0 &&\n message.message.content[0]!.text !== NO_CONTENT_MESSAGE &&\n message.message.content[0]!.text !== INTERRUPT_MESSAGE_FOR_TOOL_USE\n )\n}\n\n// TODO: replace this with plain UserMessage if/when PR #405 lands\ntype NormalizedUserMessage = {\n message: {\n content: [\n | TextBlockParam\n | ImageBlockParam\n | ToolUseBlockParam\n | ToolResultBlockParam,\n ]\n role: 'user'\n }\n type: 'user'\n uuid: UUID\n}\n\nexport type NormalizedMessage =\n | NormalizedUserMessage\n | AssistantMessage\n | ProgressMessage\n\n// Split messages, so each content block gets its own message\nexport function normalizeMessages(messages: Message[]): NormalizedMessage[] {\n return messages.flatMap(message => {\n if (message.type === 'progress') {\n return [message] as NormalizedMessage[]\n }\n if (typeof message.message.content === 'string') {\n return [message] as NormalizedMessage[]\n }\n return message.message.content.map(_ => {\n switch (message.type) {\n case 'assistant':\n return {\n type: 'assistant',\n uuid: randomUUID(),\n message: {\n ...message.message,\n content: [_],\n },\n costUSD:\n (message as AssistantMessage).costUSD /\n message.message.content.length,\n durationMs: (message as AssistantMessage).durationMs,\n } as NormalizedMessage\n case 'user':\n // It seems like the line below was a no-op before, but I'm not sure.\n // To check, we could throw an error if any of the following are true:\n // - message `role` does isn't `user` -- this possibility is allowed by MCP tools,\n // though isn't supposed to happen in practice (we should fix this)\n // - message `content` is not an array -- this one is more concerning because it's\n // not allowed by the `NormalizedUserMessage` type, but if it's happening that was\n // probably a bug before.\n // Maybe I'm missing something? -(ab)\n // return createUserMessage([_]) as NormalizedMessage\n return message as NormalizedUserMessage\n }\n })\n })\n}\n\ntype ToolUseRequestMessage = AssistantMessage & {\n message: { content: ToolUseBlock[] }\n}\n\nfunction isToolUseRequestMessage(\n message: Message,\n): message is ToolUseRequestMessage {\n return (\n message.type === 'assistant' &&\n 'costUSD' in message &&\n // Note: stop_reason === 'tool_use' is unreliable -- it's not always set correctly\n message.message.content.some(_ => _.type === 'tool_use')\n )\n}\n\n// Re-order, to move result messages to be after their tool use messages\nexport function reorderMessages(\n messages: NormalizedMessage[],\n): NormalizedMessage[] {\n const ms: NormalizedMessage[] = []\n const toolUseMessages: ToolUseRequestMessage[] = []\n\n for (const message of messages) {\n // track tool use messages we've seen\n if (isToolUseRequestMessage(message)) {\n toolUseMessages.push(message)\n }\n\n // if it's a tool progress message...\n if (message.type === 'progress') {\n // replace any existing progress messages with this one\n const existingProgressMessage = ms.find(\n _ => _.type === 'progress' && _.toolUseID === message.toolUseID,\n )\n if (existingProgressMessage) {\n ms[ms.indexOf(existingProgressMessage)] = message\n continue\n }\n // otherwise, insert it after its tool use\n const toolUseMessage = toolUseMessages.find(\n _ => _.message.content[0]?.id === message.toolUseID,\n )\n if (toolUseMessage) {\n ms.splice(ms.indexOf(toolUseMessage) + 1, 0, message)\n continue\n }\n }\n\n // if it's a tool result, insert it after its tool use and progress messages\n if (\n message.type === 'user' &&\n Array.isArray(message.message.content) &&\n message.message.content[0]?.type === 'tool_result'\n ) {\n const toolUseID = (message.message.content[0] as ToolResultBlockParam)\n ?.tool_use_id\n\n // First check for progress messages\n const lastProgressMessage = ms.find(\n _ => _.type === 'progress' && _.toolUseID === toolUseID,\n )\n if (lastProgressMessage) {\n ms.splice(ms.indexOf(lastProgressMessage) + 1, 0, message)\n continue\n }\n\n // If no progress messages, check for tool use messages\n const toolUseMessage = toolUseMessages.find(\n _ => _.message.content[0]?.id === toolUseID,\n )\n if (toolUseMessage) {\n ms.splice(ms.indexOf(toolUseMessage) + 1, 0, message)\n continue\n }\n }\n\n // otherwise, just add it to the list\n else {\n ms.push(message)\n }\n }\n\n return ms\n}\n\n// Use memoizeWithLimit to prevent unbounded cache growth during long conversations\n// Each unique normalizedMessages array would create a new cache entry with lodash memoize\nconst getToolResultIDs = memoizeWithLimit(\n (normalizedMessages: NormalizedMessage[]): { [toolUseID: string]: boolean } =>\n Object.fromEntries(\n normalizedMessages.flatMap(_ =>\n _.type === 'user' && _.message.content[0]?.type === 'tool_result'\n ? [\n [\n _.message.content[0]!.tool_use_id,\n _.message.content[0]!.is_error ?? false,\n ],\n ]\n : ([] as [string, boolean][]),\n ),\n ),\n { max: 50, ttl: 30000 }, // Keep last 50 results for 30 seconds\n)\n\nexport function getUnresolvedToolUseIDs(\n normalizedMessages: NormalizedMessage[],\n): Set<string> {\n const toolResults = getToolResultIDs(normalizedMessages)\n return new Set(\n normalizedMessages\n .filter(\n (\n _,\n ): _ is AssistantMessage & {\n message: { content: [ToolUseBlockParam] }\n } =>\n _.type === 'assistant' &&\n Array.isArray(_.message.content) &&\n _.message.content[0]?.type === 'tool_use' &&\n !(_.message.content[0]?.id in toolResults),\n )\n .map(_ => _.message.content[0].id),\n )\n}\n\n/**\n * Tool uses are in flight if either:\n * 1. They have a corresponding progress message and no result message\n * 2. They are the first unresoved tool use\n *\n * TODO: Find a way to harden this logic to make it more explicit\n */\nexport function getInProgressToolUseIDs(\n normalizedMessages: NormalizedMessage[],\n): Set<string> {\n const unresolvedToolUseIDs = getUnresolvedToolUseIDs(normalizedMessages)\n const toolUseIDsThatHaveProgressMessages = new Set(\n normalizedMessages.filter(_ => _.type === 'progress').map(_ => _.toolUseID),\n )\n return new Set(\n (\n normalizedMessages.filter(_ => {\n if (_.type !== 'assistant') {\n return false\n }\n if (_.message.content[0]?.type !== 'tool_use') {\n return false\n }\n const toolUseID = _.message.content[0].id\n if (toolUseID === unresolvedToolUseIDs.values().next().value) {\n return true\n }\n\n if (\n toolUseIDsThatHaveProgressMessages.has(toolUseID) &&\n unresolvedToolUseIDs.has(toolUseID)\n ) {\n return true\n }\n\n return false\n }) as AssistantMessage[]\n ).map(_ => (_.message.content[0]! as ToolUseBlockParam).id),\n )\n}\n\nexport function getErroredToolUseMessages(\n normalizedMessages: NormalizedMessage[],\n): AssistantMessage[] {\n const toolResults = getToolResultIDs(normalizedMessages)\n return normalizedMessages.filter(\n _ =>\n _.type === 'assistant' &&\n Array.isArray(_.message.content) &&\n _.message.content[0]?.type === 'tool_use' &&\n _.message.content[0]?.id in toolResults &&\n toolResults[_.message.content[0]?.id],\n ) as AssistantMessage[]\n}\n\nexport function normalizeMessagesForAPI(\n messages: Message[],\n): (UserMessage | AssistantMessage)[] {\n const result: (UserMessage | AssistantMessage)[] = []\n messages\n .filter(_ => _.type !== 'progress')\n .forEach(message => {\n switch (message.type) {\n case 'user': {\n // If the current message is not a tool result, add it to the result\n if (\n !Array.isArray(message.message.content) ||\n message.message.content[0]?.type !== 'tool_result'\n ) {\n result.push(message)\n return\n }\n\n // If the last message is not a tool result, add it to the result\n const lastMessage = last(result)\n if (\n !lastMessage ||\n lastMessage?.type === 'assistant' ||\n !Array.isArray(lastMessage.message.content) ||\n lastMessage.message.content[0]?.type !== 'tool_result'\n ) {\n result.push(message)\n return\n }\n\n // Otherwise, merge the current message with the last message\n result[result.indexOf(lastMessage)] = {\n ...lastMessage,\n message: {\n ...lastMessage.message,\n content: [\n ...lastMessage.message.content,\n ...message.message.content,\n ],\n },\n }\n return\n }\n case 'assistant':\n result.push(message)\n return\n }\n })\n return result\n}\n\n// Sometimes the API returns empty messages (eg. \"\\n\\n\"). We need to filter these out,\n// otherwise they will give an API error when we send them to the API next time we call query().\nexport function normalizeContentFromAPI(\n content: APIMessage['content'],\n): APIMessage['content'] {\n const filteredContent = content.filter(\n _ => _.type !== 'text' || _.text.trim().length > 0,\n )\n\n if (filteredContent.length === 0) {\n return [{ type: 'text', text: NO_CONTENT_MESSAGE, citations: [] }]\n }\n\n return filteredContent\n}\n\nexport function isEmptyMessageText(text: string): boolean {\n return (\n stripSystemMessages(text).trim() === '' ||\n text.trim() === NO_CONTENT_MESSAGE\n )\n}\nconst STRIPPED_TAGS = [\n 'commit_analysis',\n 'context',\n 'function_analysis',\n 'pr_analysis',\n]\n\nexport function stripSystemMessages(content: string): string {\n const regex = new RegExp(`<(${STRIPPED_TAGS.join('|')})>.*?</\\\\1>\\n?`, 'gs')\n return content.replace(regex, '').trim()\n}\n\nexport function getToolUseID(message: NormalizedMessage): string | null {\n switch (message.type) {\n case 'assistant':\n if (message.message.content[0]?.type !== 'tool_use') {\n return null\n }\n return message.message.content[0].id\n case 'user':\n if (message.message.content[0]?.type !== 'tool_result') {\n return null\n }\n return message.message.content[0].tool_use_id\n case 'progress':\n return message.toolUseID\n }\n}\n\nexport function getLastAssistantMessageId(\n messages: Message[],\n): string | undefined {\n // Iterate from the end of the array to find the last assistant message\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]\n if (message && message.type === 'assistant') {\n return message.message.id\n }\n }\n return undefined\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { createHash, randomUUID, UUID } from 'crypto'\nimport { Box } from 'ink'\nimport {\n AssistantMessage,\n Message,\n ProgressMessage,\n StreamingProgressContent,\n UserMessage,\n} from '@query'\nimport { getCommand, hasCommand } from '@commands'\nimport { MalformedCommandError } from './errors'\nimport { logError } from './log'\nimport { resolve } from 'path'\nimport { last } from 'lodash-es'\nimport { memoizeWithLimit } from './async'\nimport type { SetToolJSXFn, Tool, ToolUseContext } from '@tool'\nimport { lastX } from '@utils/generators'\nimport { NO_CONTENT_MESSAGE } from '@services/claude'\nimport {\n ImageBlockParam,\n TextBlockParam,\n ToolResultBlockParam,\n ToolUseBlockParam,\n Message as APIMessage,\n ContentBlockParam,\n ContentBlock,\n} from '@anthropic-ai/sdk/resources/index.mjs'\nimport { setCwd } from './state'\nimport { getCwd } from './state'\nimport chalk from 'chalk'\nimport * as React from 'react'\nimport { UserBashInputMessage } from '@components/messages/UserBashInputMessage'\nimport { Spinner } from '@components/Spinner'\nimport { StreamingBashOutput } from '@components/StreamingBashOutput'\nimport { BashTool } from '@tools/BashTool/BashTool'\nimport { ToolUseBlock } from '@anthropic-ai/sdk/resources/index.mjs'\n\n// NOTE: Dynamic content processing for custom commands has been moved to\n// src/services/customCommands.ts for better organization and reusability.\n// The functions executeBashCommands and resolveFileReferences are no longer\n// duplicated here but are imported when needed for custom command processing.\n\nexport const INTERRUPT_MESSAGE = '[Request interrupted by user]'\nexport const INTERRUPT_MESSAGE_FOR_TOOL_USE =\n '[Request interrupted by user for tool use]'\nexport const CANCEL_MESSAGE =\n \"The user doesn't want to take this action right now. STOP what you are doing and wait for the user to tell you how to proceed.\"\nexport const REJECT_MESSAGE =\n \"The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file). STOP what you are doing and wait for the user to tell you how to proceed.\"\nexport const NO_RESPONSE_REQUESTED = 'No response requested.'\n\nexport const SYNTHETIC_ASSISTANT_MESSAGES = new Set([\n INTERRUPT_MESSAGE,\n INTERRUPT_MESSAGE_FOR_TOOL_USE,\n CANCEL_MESSAGE,\n REJECT_MESSAGE,\n NO_RESPONSE_REQUESTED,\n])\n\nfunction baseCreateAssistantMessage(\n content: ContentBlock[],\n extra?: Partial<AssistantMessage>,\n): AssistantMessage {\n return {\n type: 'assistant',\n costUSD: 0,\n durationMs: 0,\n uuid: randomUUID(),\n message: {\n id: randomUUID(),\n model: '<synthetic>',\n role: 'assistant',\n stop_reason: 'stop_sequence',\n stop_sequence: '',\n type: 'message',\n usage: {\n input_tokens: 0,\n output_tokens: 0,\n cache_creation_input_tokens: 0,\n cache_read_input_tokens: 0,\n },\n content,\n },\n ...extra,\n }\n}\n\nexport function createAssistantMessage(content: string): AssistantMessage {\n return baseCreateAssistantMessage([\n {\n type: 'text' as const,\n text: content === '' ? NO_CONTENT_MESSAGE : content,\n citations: [],\n },\n ])\n}\n\nexport function createAssistantAPIErrorMessage(\n content: string,\n): AssistantMessage {\n return baseCreateAssistantMessage(\n [\n {\n type: 'text' as const,\n text: content === '' ? NO_CONTENT_MESSAGE : content,\n citations: [],\n },\n ],\n { isApiErrorMessage: true },\n )\n}\n\nexport type FullToolUseResult = {\n data: unknown // Matches tool's `Output` type\n resultForAssistant: ToolResultBlockParam['content']\n /**\n * New messages to add to the conversation from tool execution\n * Used by SlashCommandTool to inject skill-generated messages\n */\n newMessages?: unknown[]\n /**\n * Context modifier for modifying tool execution context\n * Used by SlashCommandTool to apply allowed tools and model switching\n */\n contextModifier?: {\n modifyContext: (ctx: any) => any\n }\n}\n\nexport function createUserMessage(\n content: string | ContentBlockParam[],\n toolUseResult?: FullToolUseResult,\n): UserMessage {\n const m: UserMessage = {\n type: 'user',\n message: {\n role: 'user',\n content,\n },\n uuid: randomUUID(),\n toolUseResult,\n }\n return m\n}\n\nexport function createProgressMessage(\n toolUseID: string,\n siblingToolUseIDs: Set<string>,\n content: AssistantMessage | StreamingProgressContent,\n normalizedMessages: NormalizedMessage[],\n tools: Tool[],\n): ProgressMessage {\n return {\n type: 'progress',\n content,\n normalizedMessages,\n siblingToolUseIDs,\n tools,\n toolUseID,\n uuid: randomUUID(),\n }\n}\n\nexport function createToolResultStopMessage(\n toolUseID: string,\n): ToolResultBlockParam {\n return {\n type: 'tool_result',\n content: CANCEL_MESSAGE,\n is_error: true,\n tool_use_id: toolUseID,\n }\n}\n\nexport async function processUserInput(\n input: string,\n mode: 'bash' | 'prompt' | 'koding',\n setToolJSX: SetToolJSXFn,\n context: ToolUseContext & {\n setForkConvoWithMessagesOnTheNextRender: (\n forkConvoWithMessages: Message[],\n ) => void\n options?: {\n isKodingRequest?: boolean\n kodingContext?: string\n }\n },\n pastedImage: string | null,\n): Promise<Message[]> {\n // Bash commands\n if (mode === 'bash') {\n const userMessage = createUserMessage(`<bash-input>${input}</bash-input>`)\n\n // Special case: cd\n if (input.startsWith('cd ')) {\n const oldCwd = getCwd()\n const newCwd = resolve(oldCwd, input.slice(3))\n try {\n await setCwd(newCwd)\n return [\n userMessage,\n createAssistantMessage(\n `<bash-stdout>Changed directory to ${chalk.bold(`${newCwd}/`)}</bash-stdout>`,\n ),\n ]\n } catch (e) {\n logError(e)\n return [\n userMessage,\n createAssistantMessage(\n `<bash-stderr>cwd error: ${e instanceof Error ? e.message : String(e)}</bash-stderr>`,\n ),\n ]\n }\n }\n\n // All other bash commands - run in background with streaming output\n const validationResult = await BashTool.validateInput({\n command: input,\n })\n if (!validationResult.result) {\n return [userMessage, createAssistantMessage(validationResult.message)]\n }\n\n // Start command in background to enable streaming\n const { BackgroundShellManager } = await import(\n '@utils/BackgroundShellManager'\n )\n const shellId = BackgroundShellManager.getInstance().create(\n input,\n context.readFileTimestamps ? getCwd() : process.cwd(),\n )\n\n let movedToBackground = false\n let completed = false\n let completionData: {\n stdout: string\n stderr: string\n exitCode: number\n } | null = null\n\n // Show streaming output with Ctrl+B option\n setToolJSX({\n jsx: (\n <StreamingBashOutput\n shellId={shellId}\n command={input}\n onMoveToBackground={() => {\n movedToBackground = true\n setToolJSX(null)\n }}\n onComplete={(stdout, stderr, exitCode) => {\n completed = true\n completionData = { stdout, stderr, exitCode }\n setToolJSX(null)\n }}\n />\n ),\n shouldHidePromptInput: false,\n })\n\n // Wait for either completion or move to background\n await new Promise<void>(resolve => {\n const checkInterval = setInterval(() => {\n if (movedToBackground || completed) {\n clearInterval(checkInterval)\n resolve()\n }\n }, 100)\n })\n\n if (movedToBackground) {\n // Task moved to background - return message about it\n return [\n userMessage,\n createAssistantMessage(\n `<bash-stdout>Command moved to background (shell ID: ${shellId})\\nUse Shift+B to view background tasks</bash-stdout>`,\n ),\n ]\n } else if (completed && completionData) {\n // Task completed normally\n return [\n userMessage,\n createAssistantMessage(\n `<bash-stdout>${completionData.stdout}</bash-stdout><bash-stderr>${completionData.stderr}</bash-stderr>`,\n ),\n ]\n } else {\n // Should not reach here\n return [\n userMessage,\n createAssistantMessage(\n `<bash-stderr>Unexpected error in bash execution</bash-stderr>`,\n ),\n ]\n }\n }\n // Koding mode - special wrapper for display\n else if (mode === 'koding') {\n const userMessage = createUserMessage(\n `<koding-input>${input}</koding-input>`,\n )\n // Add the Koding flag to the message\n userMessage.options = {\n ...userMessage.options,\n isKodingRequest: true,\n }\n\n // Rest of koding processing is handled separately to capture assistant response\n return [userMessage]\n }\n\n // Slash commands\n if (input.startsWith('/')) {\n const words = input.slice(1).split(' ')\n let commandName = words[0]\n if (words.length > 1 && words[1] === '(MCP)') {\n commandName = commandName + ' (MCP)'\n }\n if (!commandName) {\n return [\n createAssistantMessage('Commands are in the form `/command [args]`'),\n ]\n }\n\n // Check if it's a real command before processing\n if (!hasCommand(commandName, context.options.commands)) {\n // If not a real command, treat it as a regular user input\n return [createUserMessage(input)]\n }\n\n const args = input.slice(commandName.length + 2)\n const newMessages = await getMessagesForSlashCommand(\n commandName,\n args,\n setToolJSX,\n context,\n )\n\n // Local JSX commands\n if (newMessages.length === 0) {\n return []\n }\n\n // For invalid commands, preserve both the user message and error\n if (\n newMessages.length === 2 &&\n newMessages[0]!.type === 'user' &&\n newMessages[1]!.type === 'assistant' &&\n typeof newMessages[1]!.message.content === 'string' &&\n newMessages[1]!.message.content.startsWith('Unknown command:')\n ) {\n return newMessages\n }\n\n // User-Assistant pair (eg. local commands)\n if (newMessages.length === 2) {\n return newMessages\n }\n\n // A valid command\n\n return newMessages\n }\n\n // Regular user prompt\n\n // Check if this is a Koding request that needs special handling\n const isKodingRequest = context.options?.isKodingRequest === true\n const kodingContextInfo = context.options?.kodingContext\n\n // Create base message\n let userMessage: UserMessage\n\n if (pastedImage) {\n userMessage = createUserMessage([\n {\n type: 'image',\n source: {\n type: 'base64',\n media_type: 'image/png',\n data: pastedImage,\n },\n },\n {\n type: 'text',\n text:\n isKodingRequest && kodingContextInfo\n ? `${kodingContextInfo}\\n\\n${input}`\n : input,\n },\n ])\n } else {\n let processedInput =\n isKodingRequest && kodingContextInfo\n ? `${kodingContextInfo}\\n\\n${input}`\n : input\n\n // Process dynamic content for custom commands with ! and @ prefixes\n // This uses the same processing functions as custom commands to maintain consistency\n if (input.includes('!`') || input.includes('@')) {\n try {\n // Import functions from customCommands service to avoid code duplication\n const { executeBashCommands } = await import('@services/customCommands')\n\n // Execute bash commands if present\n if (input.includes('!`')) {\n // Note: This function is not exported from customCommands.ts, so we need to expose it\n // For now, we'll keep the local implementation until we refactor the service\n processedInput = await executeBashCommands(processedInput)\n }\n\n // Process mentions for system reminder integration\n // Note: We don't call resolveFileReferences here anymore -\n // @file mentions should trigger Read tool usage via reminders, not embed content\n if (input.includes('@')) {\n const { processMentions } = await import('@services/mentionProcessor')\n await processMentions(input)\n }\n } catch (error) {\n console.warn('Dynamic content processing failed:', error)\n // Continue with original input if processing fails\n }\n }\n\n userMessage = createUserMessage(processedInput)\n }\n\n // Add the Koding flag to the message if needed\n if (isKodingRequest) {\n userMessage.options = {\n ...userMessage.options,\n isKodingRequest: true,\n }\n }\n\n return [userMessage]\n}\n\nasync function getMessagesForSlashCommand(\n commandName: string,\n args: string,\n setToolJSX: SetToolJSXFn,\n context: ToolUseContext & {\n setForkConvoWithMessagesOnTheNextRender: (\n forkConvoWithMessages: Message[],\n ) => void\n },\n): Promise<Message[]> {\n try {\n const command = getCommand(commandName, context.options.commands)\n switch (command.type) {\n case 'local-jsx': {\n return new Promise(resolve => {\n command\n .call(r => {\n setToolJSX(null)\n resolve([\n createUserMessage(`<command-name>${command.userFacingName()}</command-name>\n <command-message>${command.userFacingName()}</command-message>\n <command-args>${args}</command-args>`),\n r\n ? createAssistantMessage(r)\n : createAssistantMessage(NO_RESPONSE_REQUESTED),\n ])\n }, context)\n .then(jsx => {\n setToolJSX({\n jsx,\n shouldHidePromptInput: true,\n })\n })\n })\n }\n case 'local': {\n const userMessage =\n createUserMessage(`<command-name>${command.userFacingName()}</command-name>\n <command-message>${command.userFacingName()}</command-message>\n <command-args>${args}</command-args>`)\n\n try {\n // Use the context's abortController for local commands\n const result = await command.call(args, {\n ...context,\n options: {\n commands: context.options.commands || [],\n tools: context.options.tools || [],\n slowAndCapableModel:\n context.options.slowAndCapableModel || 'main',\n },\n })\n\n return [\n userMessage,\n createAssistantMessage(\n `<local-command-stdout>${result}</local-command-stdout>`,\n ),\n ]\n } catch (e) {\n logError(e)\n return [\n userMessage,\n createAssistantMessage(\n `<local-command-stderr>${String(e)}</local-command-stderr>`,\n ),\n ]\n }\n }\n case 'prompt': {\n // For custom commands, process them naturally instead of wrapping in command-contents\n const prompt = await command.getPromptForCommand(args)\n return prompt.map(msg => {\n // Create a normal user message from the custom command content\n const userMessage = createUserMessage(\n typeof msg.content === 'string'\n ? msg.content\n : msg.content\n .map(block => (block.type === 'text' ? block.text : ''))\n .join('\\n'),\n )\n\n // Add metadata for tracking but don't wrap in special tags\n userMessage.options = {\n ...userMessage.options,\n isCustomCommand: true,\n commandName: command.userFacingName(),\n commandArgs: args,\n }\n\n return userMessage\n })\n }\n }\n } catch (e) {\n if (e instanceof MalformedCommandError) {\n return [createAssistantMessage(e.message)]\n }\n throw e\n }\n}\n\nexport function extractTagFromMessage(\n message: Message,\n tagName: string,\n): string | null {\n if (message.type === 'progress') {\n return null\n }\n if (typeof message.message.content !== 'string') {\n return null\n }\n return extractTag(message.message.content, tagName)\n}\n\nexport function extractTag(html: string, tagName: string): string | null {\n if (!html.trim() || !tagName.trim()) {\n return null\n }\n\n // Escape special characters in the tag name\n const escapedTag = tagName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n // Create regex pattern that handles:\n // 1. Self-closing tags\n // 2. Tags with attributes\n // 3. Nested tags of the same type\n // 4. Multiline content\n const pattern = new RegExp(\n `<${escapedTag}(?:\\\\s+[^>]*)?>` + // Opening tag with optional attributes\n '([\\\\s\\\\S]*?)' + // Content (non-greedy match)\n `<\\\\/${escapedTag}>`, // Closing tag\n 'gi',\n )\n\n let match\n let depth = 0\n let lastIndex = 0\n const openingTag = new RegExp(`<${escapedTag}(?:\\\\s+[^>]*?)?>`, 'gi')\n const closingTag = new RegExp(`<\\\\/${escapedTag}>`, 'gi')\n\n while ((match = pattern.exec(html)) !== null) {\n // Check for nested tags\n const content = match[1]\n const beforeMatch = html.slice(lastIndex, match.index)\n\n // Reset depth counter\n depth = 0\n\n // Count opening tags before this match\n openingTag.lastIndex = 0\n while (openingTag.exec(beforeMatch) !== null) {\n depth++\n }\n\n // Count closing tags before this match\n closingTag.lastIndex = 0\n while (closingTag.exec(beforeMatch) !== null) {\n depth--\n }\n\n // Only include content if we're at the correct nesting level\n if (depth === 0 && content) {\n return content\n }\n\n lastIndex = match.index + match[0].length\n }\n\n return null\n}\n\nexport function isNotEmptyMessage(message: Message): boolean {\n if (message.type === 'progress') {\n return true\n }\n\n if (typeof message.message.content === 'string') {\n return message.message.content.trim().length > 0\n }\n\n if (message.message.content.length === 0) {\n return false\n }\n\n // Skip multi-block messages for now\n if (message.message.content.length > 1) {\n return true\n }\n\n if (message.message.content[0]!.type !== 'text') {\n return true\n }\n\n return (\n message.message.content[0]!.text.trim().length > 0 &&\n message.message.content[0]!.text !== NO_CONTENT_MESSAGE &&\n message.message.content[0]!.text !== INTERRUPT_MESSAGE_FOR_TOOL_USE\n )\n}\n\n// TODO: replace this with plain UserMessage if/when PR #405 lands\ntype NormalizedUserMessage = {\n message: {\n content: [\n | TextBlockParam\n | ImageBlockParam\n | ToolUseBlockParam\n | ToolResultBlockParam,\n ]\n role: 'user'\n }\n type: 'user'\n uuid: UUID\n}\n\nexport type NormalizedMessage =\n | NormalizedUserMessage\n | AssistantMessage\n | ProgressMessage\n\n/**\n * Generate a deterministic UUID based on input string\n * This ensures the same content always produces the same UUID,\n * preventing duplicate entries in Ink's <Static> component\n */\nfunction deterministicUUID(seed: string): UUID {\n const hash = createHash('sha256').update(seed).digest('hex')\n // Format as UUID v4 (xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx)\n return `${hash.slice(0, 8)}-${hash.slice(8, 12)}-4${hash.slice(13, 16)}-${((parseInt(hash.slice(16, 17), 16) & 0x3) | 0x8).toString(16)}${hash.slice(17, 20)}-${hash.slice(20, 32)}` as UUID\n}\n\n// Split messages, so each content block gets its own message\nexport function normalizeMessages(messages: Message[]): NormalizedMessage[] {\n return messages.flatMap((message, messageIndex) => {\n if (message.type === 'progress') {\n return [message] as NormalizedMessage[]\n }\n if (typeof message.message.content === 'string') {\n return [message] as NormalizedMessage[]\n }\n return message.message.content.map((_, contentIndex) => {\n switch (message.type) {\n case 'assistant':\n // Generate deterministic UUID based on message uuid + content index\n // This ensures the same content block always gets the same UUID,\n // preventing duplicate entries when Ink's <Static> re-renders\n const baseUuid =\n (message as AssistantMessage).uuid || `msg-${messageIndex}`\n const contentId =\n _.type === 'tool_use' ? _.id || contentIndex : contentIndex\n const stableUuid = deterministicUUID(`${baseUuid}-${contentId}`)\n\n return {\n type: 'assistant',\n uuid: stableUuid,\n // Preserve original UUID for identifying parallel tool calls from same message\n originalUuid: (message as AssistantMessage).uuid,\n message: {\n ...message.message,\n content: [_],\n },\n costUSD:\n (message as AssistantMessage).costUSD /\n message.message.content.length,\n durationMs: (message as AssistantMessage).durationMs,\n } as NormalizedMessage\n case 'user':\n // It seems like the line below was a no-op before, but I'm not sure.\n // To check, we could throw an error if any of the following are true:\n // - message `role` does isn't `user` -- this possibility is allowed by MCP tools,\n // though isn't supposed to happen in practice (we should fix this)\n // - message `content` is not an array -- this one is more concerning because it's\n // not allowed by the `NormalizedUserMessage` type, but if it's happening that was\n // probably a bug before.\n // Maybe I'm missing something? -(ab)\n // return createUserMessage([_]) as NormalizedMessage\n return message as NormalizedUserMessage\n }\n })\n })\n}\n\ntype ToolUseRequestMessage = AssistantMessage & {\n message: { content: ToolUseBlock[] }\n}\n\nfunction isToolUseRequestMessage(\n message: Message,\n): message is ToolUseRequestMessage {\n return (\n message.type === 'assistant' &&\n 'costUSD' in message &&\n // Note: stop_reason === 'tool_use' is unreliable -- it's not always set correctly\n message.message.content.some(_ => _.type === 'tool_use')\n )\n}\n\n// Re-order, to move result messages to be after their tool use messages\nexport function reorderMessages(\n messages: NormalizedMessage[],\n): NormalizedMessage[] {\n const ms: NormalizedMessage[] = []\n const toolUseMessages: ToolUseRequestMessage[] = []\n\n for (const message of messages) {\n // track tool use messages we've seen\n if (isToolUseRequestMessage(message)) {\n toolUseMessages.push(message)\n }\n\n // if it's a tool progress message...\n if (message.type === 'progress') {\n // replace any existing progress messages with this one\n const existingProgressMessage = ms.find(\n _ => _.type === 'progress' && _.toolUseID === message.toolUseID,\n )\n if (existingProgressMessage) {\n ms[ms.indexOf(existingProgressMessage)] = message\n continue\n }\n // otherwise, insert it after its tool use\n const toolUseMessage = toolUseMessages.find(\n _ => _.message.content[0]?.id === message.toolUseID,\n )\n if (toolUseMessage) {\n ms.splice(ms.indexOf(toolUseMessage) + 1, 0, message)\n continue\n }\n }\n\n // if it's a tool result, insert it after its tool use and progress messages\n if (\n message.type === 'user' &&\n Array.isArray(message.message.content) &&\n message.message.content[0]?.type === 'tool_result'\n ) {\n const toolUseID = (message.message.content[0] as ToolResultBlockParam)\n ?.tool_use_id\n\n // First check for progress messages\n const lastProgressMessage = ms.find(\n _ => _.type === 'progress' && _.toolUseID === toolUseID,\n )\n if (lastProgressMessage) {\n ms.splice(ms.indexOf(lastProgressMessage) + 1, 0, message)\n continue\n }\n\n // If no progress messages, check for tool use messages\n const toolUseMessage = toolUseMessages.find(\n _ => _.message.content[0]?.id === toolUseID,\n )\n if (toolUseMessage) {\n ms.splice(ms.indexOf(toolUseMessage) + 1, 0, message)\n continue\n }\n }\n\n // otherwise, just add it to the list\n else {\n ms.push(message)\n }\n }\n\n return ms\n}\n\n// Use memoizeWithLimit to prevent unbounded cache growth during long conversations\n// Each unique normalizedMessages array would create a new cache entry with lodash memoize\nconst getToolResultIDs = memoizeWithLimit(\n (normalizedMessages: NormalizedMessage[]): { [toolUseID: string]: boolean } =>\n Object.fromEntries(\n normalizedMessages.flatMap(_ =>\n _.type === 'user' && _.message.content[0]?.type === 'tool_result'\n ? [\n [\n _.message.content[0]!.tool_use_id,\n _.message.content[0]!.is_error ?? false,\n ],\n ]\n : ([] as [string, boolean][]),\n ),\n ),\n { max: 50, ttl: 30000 }, // Keep last 50 results for 30 seconds\n)\n\nexport function getUnresolvedToolUseIDs(\n normalizedMessages: NormalizedMessage[],\n): Set<string> {\n const toolResults = getToolResultIDs(normalizedMessages)\n return new Set(\n normalizedMessages\n .filter(\n (\n _,\n ): _ is AssistantMessage & {\n message: { content: [ToolUseBlockParam] }\n } =>\n _.type === 'assistant' &&\n Array.isArray(_.message.content) &&\n _.message.content[0]?.type === 'tool_use' &&\n !(_.message.content[0]?.id in toolResults),\n )\n .map(_ => _.message.content[0].id),\n )\n}\n\n/**\n * Tool uses are in flight if either:\n * 1. They have a corresponding progress message and no result message\n * 2. They are the first unresoved tool use\n *\n * TODO: Find a way to harden this logic to make it more explicit\n */\nexport function getInProgressToolUseIDs(\n normalizedMessages: NormalizedMessage[],\n): Set<string> {\n const unresolvedToolUseIDs = getUnresolvedToolUseIDs(normalizedMessages)\n const toolUseIDsThatHaveProgressMessages = new Set(\n normalizedMessages.filter(_ => _.type === 'progress').map(_ => _.toolUseID),\n )\n return new Set(\n (\n normalizedMessages.filter(_ => {\n if (_.type !== 'assistant') {\n return false\n }\n if (_.message.content[0]?.type !== 'tool_use') {\n return false\n }\n const toolUseID = _.message.content[0].id\n if (toolUseID === unresolvedToolUseIDs.values().next().value) {\n return true\n }\n\n if (\n toolUseIDsThatHaveProgressMessages.has(toolUseID) &&\n unresolvedToolUseIDs.has(toolUseID)\n ) {\n return true\n }\n\n return false\n }) as AssistantMessage[]\n ).map(_ => (_.message.content[0]! as ToolUseBlockParam).id),\n )\n}\n\nexport function getErroredToolUseMessages(\n normalizedMessages: NormalizedMessage[],\n): AssistantMessage[] {\n const toolResults = getToolResultIDs(normalizedMessages)\n return normalizedMessages.filter(\n _ =>\n _.type === 'assistant' &&\n Array.isArray(_.message.content) &&\n _.message.content[0]?.type === 'tool_use' &&\n _.message.content[0]?.id in toolResults &&\n toolResults[_.message.content[0]?.id],\n ) as AssistantMessage[]\n}\n\nexport function normalizeMessagesForAPI(\n messages: Message[],\n): (UserMessage | AssistantMessage)[] {\n const result: (UserMessage | AssistantMessage)[] = []\n messages\n .filter(_ => _.type !== 'progress')\n .forEach(message => {\n switch (message.type) {\n case 'user': {\n // If the current message is not a tool result, add it to the result\n if (\n !Array.isArray(message.message.content) ||\n message.message.content[0]?.type !== 'tool_result'\n ) {\n result.push(message)\n return\n }\n\n // If the last message is not a tool result, add it to the result\n const lastMessage = last(result)\n if (\n !lastMessage ||\n lastMessage?.type === 'assistant' ||\n !Array.isArray(lastMessage.message.content) ||\n lastMessage.message.content[0]?.type !== 'tool_result'\n ) {\n result.push(message)\n return\n }\n\n // Otherwise, merge the current message with the last message\n result[result.indexOf(lastMessage)] = {\n ...lastMessage,\n message: {\n ...lastMessage.message,\n content: [\n ...lastMessage.message.content,\n ...message.message.content,\n ],\n },\n }\n return\n }\n case 'assistant':\n result.push(message)\n return\n }\n })\n return result\n}\n\n// Sometimes the API returns empty messages (eg. \"\\n\\n\"). We need to filter these out,\n// otherwise they will give an API error when we send them to the API next time we call query().\nexport function normalizeContentFromAPI(\n content: APIMessage['content'],\n): APIMessage['content'] {\n const filteredContent = content.filter(\n _ => _.type !== 'text' || _.text.trim().length > 0,\n )\n\n if (filteredContent.length === 0) {\n return [{ type: 'text', text: NO_CONTENT_MESSAGE, citations: [] }]\n }\n\n return filteredContent\n}\n\nexport function isEmptyMessageText(text: string): boolean {\n return (\n stripSystemMessages(text).trim() === '' ||\n text.trim() === NO_CONTENT_MESSAGE\n )\n}\nconst STRIPPED_TAGS = [\n 'commit_analysis',\n 'context',\n 'function_analysis',\n 'pr_analysis',\n]\n\nexport function stripSystemMessages(content: string): string {\n const regex = new RegExp(`<(${STRIPPED_TAGS.join('|')})>.*?</\\\\1>\\n?`, 'gs')\n return content.replace(regex, '').trim()\n}\n\nexport function getToolUseID(message: NormalizedMessage): string | null {\n switch (message.type) {\n case 'assistant':\n if (message.message.content[0]?.type !== 'tool_use') {\n return null\n }\n return message.message.content[0].id\n case 'user':\n if (message.message.content[0]?.type !== 'tool_result') {\n return null\n }\n return message.message.content[0].tool_use_id\n case 'progress':\n return message.toolUseID\n }\n}\n\nexport function getLastAssistantMessageId(\n messages: Message[],\n): string | undefined {\n // Iterate from the end of the array to find the last assistant message\n for (let i = messages.length - 1; i >= 0; i--) {\n const message = messages[i]\n if (message && message.type === 'assistant') {\n return message.message.id\n }\n }\n return undefined\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["userMessage", "resolve"]
|
|
7
7
|
}
|
package/dist/utils/model.js
CHANGED
|
@@ -113,11 +113,11 @@ class ModelManager {
|
|
|
113
113
|
return this.getMainAgentModel();
|
|
114
114
|
}
|
|
115
115
|
/**
|
|
116
|
-
* Switch to the next available model with
|
|
116
|
+
* Switch to the next available model with enhanced context overflow handling
|
|
117
117
|
* If target model can't handle current context, shows warning and reverts after delay
|
|
118
118
|
*
|
|
119
119
|
* @param currentContextTokens - Current conversation token count for validation
|
|
120
|
-
* @returns Object with model name and context status information
|
|
120
|
+
* @returns Object with detailed model name and context status information
|
|
121
121
|
*/
|
|
122
122
|
switchToNextModelWithContextCheck(currentContextTokens = 0) {
|
|
123
123
|
const allProfiles = this.getAllConfiguredModels();
|
|
@@ -127,7 +127,11 @@ class ModelManager {
|
|
|
127
127
|
modelName: null,
|
|
128
128
|
previousModelName: null,
|
|
129
129
|
contextOverflow: false,
|
|
130
|
-
usagePercentage: 0
|
|
130
|
+
usagePercentage: 0,
|
|
131
|
+
currentContextTokens,
|
|
132
|
+
targetContextLimit: 0,
|
|
133
|
+
skippedModels: [],
|
|
134
|
+
totalAvailableModels: 0
|
|
131
135
|
};
|
|
132
136
|
}
|
|
133
137
|
allProfiles.sort((a, b) => {
|
|
@@ -152,7 +156,11 @@ class ModelManager {
|
|
|
152
156
|
modelName: firstModel.name,
|
|
153
157
|
previousModelName: null,
|
|
154
158
|
contextOverflow: !analysis2.compatible,
|
|
155
|
-
usagePercentage: analysis2.usagePercentage
|
|
159
|
+
usagePercentage: analysis2.usagePercentage,
|
|
160
|
+
currentContextTokens,
|
|
161
|
+
targetContextLimit: firstModel.contextLength,
|
|
162
|
+
skippedModels: [],
|
|
163
|
+
totalAvailableModels: allProfiles.length
|
|
156
164
|
};
|
|
157
165
|
}
|
|
158
166
|
const currentIndex = allProfiles.findIndex(
|
|
@@ -174,16 +182,25 @@ class ModelManager {
|
|
|
174
182
|
modelName: firstModel.name,
|
|
175
183
|
previousModelName,
|
|
176
184
|
contextOverflow: !analysis2.compatible,
|
|
177
|
-
usagePercentage: analysis2.usagePercentage
|
|
185
|
+
usagePercentage: analysis2.usagePercentage,
|
|
186
|
+
currentContextTokens,
|
|
187
|
+
targetContextLimit: firstModel.contextLength,
|
|
188
|
+
skippedModels: [],
|
|
189
|
+
totalAvailableModels: allProfiles.length
|
|
178
190
|
};
|
|
179
191
|
}
|
|
180
192
|
if (allProfiles.length === 1) {
|
|
193
|
+
const currentModel2 = allProfiles[0];
|
|
181
194
|
return {
|
|
182
195
|
success: false,
|
|
183
196
|
modelName: null,
|
|
184
197
|
previousModelName,
|
|
185
198
|
contextOverflow: false,
|
|
186
|
-
usagePercentage: 0
|
|
199
|
+
usagePercentage: 0,
|
|
200
|
+
currentContextTokens,
|
|
201
|
+
targetContextLimit: currentModel2?.contextLength || 0,
|
|
202
|
+
skippedModels: [],
|
|
203
|
+
totalAvailableModels: 1
|
|
187
204
|
};
|
|
188
205
|
}
|
|
189
206
|
const nextIndex = (currentIndex + 1) % allProfiles.length;
|
|
@@ -206,7 +223,12 @@ class ModelManager {
|
|
|
206
223
|
modelName: nextModel.name,
|
|
207
224
|
previousModelName,
|
|
208
225
|
contextOverflow: !analysis.compatible,
|
|
209
|
-
usagePercentage: analysis.usagePercentage
|
|
226
|
+
usagePercentage: analysis.usagePercentage,
|
|
227
|
+
currentContextTokens,
|
|
228
|
+
targetContextLimit: nextModel.contextLength,
|
|
229
|
+
skippedModels: [],
|
|
230
|
+
// In simple round-robin, no models are skipped
|
|
231
|
+
totalAvailableModels: allProfiles.length
|
|
210
232
|
};
|
|
211
233
|
}
|
|
212
234
|
/**
|
|
@@ -394,6 +416,13 @@ class ModelManager {
|
|
|
394
416
|
getQuickModel() {
|
|
395
417
|
return this.getModelName("quick") || this.getModelName("task") || this.getModelName("main");
|
|
396
418
|
}
|
|
419
|
+
/**
|
|
420
|
+
* Get compact model for context compression/summarization (with fallback)
|
|
421
|
+
* Fallback chain: compact -> quick -> task -> main
|
|
422
|
+
*/
|
|
423
|
+
getCompactModel() {
|
|
424
|
+
return this.getModelName("compact") || this.getModelName("quick") || this.getModelName("task") || this.getModelName("main");
|
|
425
|
+
}
|
|
397
426
|
/**
|
|
398
427
|
* Add a new model profile with duplicate validation
|
|
399
428
|
*/
|
|
@@ -421,7 +450,8 @@ class ModelManager {
|
|
|
421
450
|
main: config.modelName,
|
|
422
451
|
task: config.modelName,
|
|
423
452
|
reasoning: config.modelName,
|
|
424
|
-
quick: config.modelName
|
|
453
|
+
quick: config.modelName,
|
|
454
|
+
compact: config.modelName
|
|
425
455
|
};
|
|
426
456
|
this.config.defaultModelName = config.modelName;
|
|
427
457
|
}
|
|
@@ -440,7 +470,8 @@ class ModelManager {
|
|
|
440
470
|
main: "",
|
|
441
471
|
task: "",
|
|
442
472
|
reasoning: "",
|
|
443
|
-
quick: ""
|
|
473
|
+
quick: "",
|
|
474
|
+
compact: ""
|
|
444
475
|
};
|
|
445
476
|
}
|
|
446
477
|
this.config.modelPointers[pointer] = modelName;
|
|
@@ -521,6 +552,8 @@ class ModelManager {
|
|
|
521
552
|
}
|
|
522
553
|
/**
|
|
523
554
|
* Save configuration changes
|
|
555
|
+
* Note: This updates the global config file. The singleton instance
|
|
556
|
+
* is automatically refreshed to avoid stale data issues.
|
|
524
557
|
*/
|
|
525
558
|
saveConfig() {
|
|
526
559
|
const updatedConfig = {
|
|
@@ -528,6 +561,7 @@ class ModelManager {
|
|
|
528
561
|
modelProfiles: this.modelProfiles
|
|
529
562
|
};
|
|
530
563
|
saveGlobalConfig(updatedConfig);
|
|
564
|
+
refreshGlobalModelManagerInstance(this);
|
|
531
565
|
}
|
|
532
566
|
/**
|
|
533
567
|
* Get a fallback model when no specific model is configured
|
|
@@ -544,7 +578,7 @@ class ModelManager {
|
|
|
544
578
|
* @returns ModelProfile 或 null
|
|
545
579
|
*/
|
|
546
580
|
resolveModel(modelParam) {
|
|
547
|
-
if (["main", "task", "reasoning", "quick"].includes(modelParam)) {
|
|
581
|
+
if (["main", "task", "reasoning", "quick", "compact"].includes(modelParam)) {
|
|
548
582
|
const pointerId = this.config.modelPointers?.[modelParam];
|
|
549
583
|
if (pointerId) {
|
|
550
584
|
let profile2 = this.findModelProfile(pointerId);
|
|
@@ -575,9 +609,13 @@ class ModelManager {
|
|
|
575
609
|
* 解析模型参数并返回完整信息
|
|
576
610
|
*/
|
|
577
611
|
resolveModelWithInfo(modelParam) {
|
|
578
|
-
const isPointer = [
|
|
579
|
-
|
|
580
|
-
|
|
612
|
+
const isPointer = [
|
|
613
|
+
"main",
|
|
614
|
+
"task",
|
|
615
|
+
"reasoning",
|
|
616
|
+
"quick",
|
|
617
|
+
"compact"
|
|
618
|
+
].includes(modelParam);
|
|
581
619
|
if (isPointer) {
|
|
582
620
|
const pointerId = this.config.modelPointers?.[modelParam];
|
|
583
621
|
if (!pointerId) {
|
|
@@ -653,8 +691,56 @@ class ModelManager {
|
|
|
653
691
|
profile.lastUsed = Date.now();
|
|
654
692
|
}
|
|
655
693
|
}
|
|
694
|
+
/**
|
|
695
|
+
* Find model profile by provider-qualified name (e.g., "openai:gpt-4o", "anthropic:claude-3-5-sonnet")
|
|
696
|
+
* @param qualifiedName - Format: "provider:modelName" or just "modelName"
|
|
697
|
+
* @returns ModelProfile or null
|
|
698
|
+
*/
|
|
699
|
+
findModelByProviderQualified(qualifiedName) {
|
|
700
|
+
if (qualifiedName.includes(":")) {
|
|
701
|
+
const [provider, modelName] = qualifiedName.split(":", 2);
|
|
702
|
+
return this.modelProfiles.find(
|
|
703
|
+
(p) => p.provider.toLowerCase() === provider.toLowerCase() && (p.modelName === modelName || p.modelName.toLowerCase() === modelName.toLowerCase() || p.name.toLowerCase() === modelName.toLowerCase())
|
|
704
|
+
) || null;
|
|
705
|
+
}
|
|
706
|
+
return this.findModelProfile(qualifiedName) || this.findModelProfileByName(qualifiedName);
|
|
707
|
+
}
|
|
708
|
+
/**
|
|
709
|
+
* Enhanced model resolution supporting provider:model format
|
|
710
|
+
* @param modelParam - Can be pointer, provider:model, modelName, or friendly name
|
|
711
|
+
* @returns ModelProfile or null
|
|
712
|
+
*/
|
|
713
|
+
resolveProviderQualifiedModel(modelParam) {
|
|
714
|
+
if (modelParam.includes(":") && !["main", "task", "reasoning", "quick", "compact"].includes(
|
|
715
|
+
modelParam.split(":")[0]
|
|
716
|
+
)) {
|
|
717
|
+
const [provider, modelId] = modelParam.split(":", 2);
|
|
718
|
+
const profile2 = this.findModelByProviderQualified(modelParam);
|
|
719
|
+
return { profile: profile2, provider, modelId };
|
|
720
|
+
}
|
|
721
|
+
const profile = this.resolveModel(modelParam);
|
|
722
|
+
return { profile };
|
|
723
|
+
}
|
|
724
|
+
/**
|
|
725
|
+
* Get all models from a specific provider
|
|
726
|
+
*/
|
|
727
|
+
getModelsByProvider(provider) {
|
|
728
|
+
return this.modelProfiles.filter(
|
|
729
|
+
(p) => p.provider.toLowerCase() === provider.toLowerCase()
|
|
730
|
+
);
|
|
731
|
+
}
|
|
732
|
+
/**
|
|
733
|
+
* Get list of unique providers
|
|
734
|
+
*/
|
|
735
|
+
getUniqueProviders() {
|
|
736
|
+
const providers = new Set(this.modelProfiles.map((p) => p.provider));
|
|
737
|
+
return Array.from(providers);
|
|
738
|
+
}
|
|
656
739
|
}
|
|
657
740
|
let globalModelManager = null;
|
|
741
|
+
function refreshGlobalModelManagerInstance(instance) {
|
|
742
|
+
globalModelManager = instance;
|
|
743
|
+
}
|
|
658
744
|
const getModelManager = () => {
|
|
659
745
|
try {
|
|
660
746
|
if (!globalModelManager) {
|
|
@@ -665,7 +751,13 @@ const getModelManager = () => {
|
|
|
665
751
|
);
|
|
666
752
|
globalModelManager = new ModelManager({
|
|
667
753
|
modelProfiles: [],
|
|
668
|
-
modelPointers: {
|
|
754
|
+
modelPointers: {
|
|
755
|
+
main: "",
|
|
756
|
+
task: "",
|
|
757
|
+
reasoning: "",
|
|
758
|
+
quick: "",
|
|
759
|
+
compact: ""
|
|
760
|
+
}
|
|
669
761
|
});
|
|
670
762
|
} else {
|
|
671
763
|
globalModelManager = new ModelManager(config);
|
|
@@ -676,7 +768,13 @@ const getModelManager = () => {
|
|
|
676
768
|
console.error("Error creating ModelManager:", error);
|
|
677
769
|
return new ModelManager({
|
|
678
770
|
modelProfiles: [],
|
|
679
|
-
modelPointers: {
|
|
771
|
+
modelPointers: {
|
|
772
|
+
main: "",
|
|
773
|
+
task: "",
|
|
774
|
+
reasoning: "",
|
|
775
|
+
quick: "",
|
|
776
|
+
compact: ""
|
|
777
|
+
}
|
|
680
778
|
});
|
|
681
779
|
}
|
|
682
780
|
};
|
|
@@ -689,10 +787,16 @@ const getQuickModel = () => {
|
|
|
689
787
|
const quickModel = manager.getModel("quick");
|
|
690
788
|
return quickModel?.modelName || "quick";
|
|
691
789
|
};
|
|
790
|
+
const getCompactModel = () => {
|
|
791
|
+
const manager = getModelManager();
|
|
792
|
+
const compactModel = manager.getCompactModel();
|
|
793
|
+
return compactModel || "compact";
|
|
794
|
+
};
|
|
692
795
|
export {
|
|
693
796
|
ModelManager,
|
|
694
797
|
USE_BEDROCK,
|
|
695
798
|
USE_VERTEX,
|
|
799
|
+
getCompactModel,
|
|
696
800
|
getModelContextLength,
|
|
697
801
|
getModelManager,
|
|
698
802
|
getQuickModel,
|