@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/commands/model.js
CHANGED
|
@@ -1,87 +1,478 @@
|
|
|
1
|
-
import React, { useState } from "react";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import React, { useState, useMemo, useCallback } from "react";
|
|
2
|
+
import { SimpleSelector } from "../components/SimpleSelector/index.js";
|
|
3
|
+
import { ModelSelector } from "../components/ModelSelector/index.js";
|
|
4
4
|
import { enableConfigs } from "../utils/config.js";
|
|
5
|
+
import {
|
|
6
|
+
setModelPointer,
|
|
7
|
+
getGlobalConfig
|
|
8
|
+
} from "../utils/config.js";
|
|
9
|
+
import { getModelManager, reloadModelManager } from "../utils/model.js";
|
|
5
10
|
import { triggerModelConfigChange } from "../messages.js";
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
11
|
+
import { t } from "../i18n/index.js";
|
|
12
|
+
const ID_MANAGE_LIBRARY = "__manage_library__";
|
|
13
|
+
const ID_ADD_NEW = "__add_new__";
|
|
14
|
+
const ID_CLEAR = "__clear__";
|
|
15
|
+
const ID_EDIT = "__edit__";
|
|
16
|
+
const ID_DELETE = "__delete__";
|
|
17
|
+
const ID_BACK = "__back__";
|
|
18
|
+
const ID_CONFIRM_YES = "__yes__";
|
|
19
|
+
const ID_CONFIRM_NO = "__no__";
|
|
20
|
+
const POINTER_TYPES = [
|
|
21
|
+
"main",
|
|
22
|
+
"task",
|
|
23
|
+
"reasoning",
|
|
24
|
+
"quick",
|
|
25
|
+
"compact"
|
|
26
|
+
];
|
|
27
|
+
const POINTER_LABELS = {
|
|
28
|
+
main: "Main",
|
|
29
|
+
task: "Task",
|
|
30
|
+
reasoning: "Reasoning",
|
|
31
|
+
quick: "Quick",
|
|
32
|
+
compact: "Compact"
|
|
33
|
+
};
|
|
34
|
+
function getPointerDescription(pointer) {
|
|
35
|
+
const key = `ui.modelConfig.${pointer}Description`;
|
|
36
|
+
return t(key);
|
|
37
|
+
}
|
|
10
38
|
function ModelCommand({ onClose, abortController }) {
|
|
11
|
-
const [
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
39
|
+
const [phase, setPhase] = useState({ type: "main" });
|
|
40
|
+
const [statusOverlay, setStatusOverlay] = useState(null);
|
|
41
|
+
const [refreshKey, setRefreshKey] = useState(0);
|
|
42
|
+
const refreshModels = useCallback(() => {
|
|
43
|
+
reloadModelManager();
|
|
44
|
+
triggerModelConfigChange();
|
|
45
|
+
setRefreshKey((prev) => prev + 1);
|
|
46
|
+
}, []);
|
|
47
|
+
const showSuccessAndGo = useCallback(
|
|
48
|
+
(message, nextPhase) => {
|
|
49
|
+
setStatusOverlay({ type: "success", message });
|
|
50
|
+
setTimeout(() => {
|
|
51
|
+
setStatusOverlay(null);
|
|
52
|
+
setPhase(nextPhase);
|
|
53
|
+
}, 800);
|
|
23
54
|
},
|
|
24
|
-
|
|
55
|
+
[]
|
|
25
56
|
);
|
|
26
|
-
if (
|
|
57
|
+
if (phase.type === "main") {
|
|
58
|
+
return /* @__PURE__ */ React.createElement(
|
|
59
|
+
MainPhase,
|
|
60
|
+
{
|
|
61
|
+
refreshKey,
|
|
62
|
+
statusOverlay,
|
|
63
|
+
onSelectPointer: (pointer) => setPhase({ type: "assign", pointer }),
|
|
64
|
+
onManageLibrary: () => setPhase({ type: "library" }),
|
|
65
|
+
onClose
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
if (phase.type === "assign") {
|
|
27
70
|
return /* @__PURE__ */ React.createElement(
|
|
28
|
-
|
|
71
|
+
AssignPhase,
|
|
29
72
|
{
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
73
|
+
pointer: phase.pointer,
|
|
74
|
+
refreshKey,
|
|
75
|
+
statusOverlay,
|
|
76
|
+
onAssign: (pointer, modelName) => {
|
|
77
|
+
setModelPointer(pointer, modelName);
|
|
78
|
+
refreshModels();
|
|
79
|
+
showSuccessAndGo(
|
|
80
|
+
t("commands.model.pointerUpdated").replace(
|
|
81
|
+
"{pointer}",
|
|
82
|
+
POINTER_LABELS[pointer]
|
|
83
|
+
),
|
|
84
|
+
{ type: "main" }
|
|
85
|
+
);
|
|
86
|
+
},
|
|
87
|
+
onClear: (pointer) => {
|
|
88
|
+
setModelPointer(pointer, "");
|
|
89
|
+
refreshModels();
|
|
90
|
+
showSuccessAndGo(
|
|
91
|
+
t("commands.model.pointerCleared").replace(
|
|
92
|
+
"{pointer}",
|
|
93
|
+
POINTER_LABELS[pointer]
|
|
94
|
+
),
|
|
95
|
+
{ type: "main" }
|
|
96
|
+
);
|
|
97
|
+
},
|
|
98
|
+
onClose: () => setPhase({ type: "main" })
|
|
99
|
+
}
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
if (phase.type === "library") {
|
|
103
|
+
return /* @__PURE__ */ React.createElement(
|
|
104
|
+
LibraryPhase,
|
|
105
|
+
{
|
|
106
|
+
refreshKey,
|
|
107
|
+
statusOverlay,
|
|
108
|
+
onSelectModel: (modelName, modelLabel) => setPhase({ type: "model-actions", modelName, modelLabel }),
|
|
109
|
+
onAddNew: () => {
|
|
110
|
+
enableConfigs();
|
|
111
|
+
abortController?.abort?.();
|
|
112
|
+
setPhase({ type: "add-model" });
|
|
113
|
+
},
|
|
114
|
+
onClose: () => setPhase({ type: "main" })
|
|
115
|
+
}
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
if (phase.type === "model-actions") {
|
|
119
|
+
return /* @__PURE__ */ React.createElement(
|
|
120
|
+
ModelActionsPhase,
|
|
121
|
+
{
|
|
122
|
+
modelName: phase.modelName,
|
|
123
|
+
modelLabel: phase.modelLabel,
|
|
124
|
+
onEdit: () => {
|
|
125
|
+
enableConfigs();
|
|
126
|
+
abortController?.abort?.();
|
|
127
|
+
setPhase({
|
|
128
|
+
type: "edit-model",
|
|
129
|
+
modelName: phase.modelName,
|
|
130
|
+
modelLabel: phase.modelLabel
|
|
35
131
|
});
|
|
36
|
-
}
|
|
132
|
+
},
|
|
133
|
+
onDelete: () => setPhase({
|
|
134
|
+
type: "confirm-delete",
|
|
135
|
+
modelName: phase.modelName,
|
|
136
|
+
modelLabel: phase.modelLabel
|
|
137
|
+
}),
|
|
138
|
+
onClose: () => setPhase({ type: "library" })
|
|
37
139
|
}
|
|
38
140
|
);
|
|
39
141
|
}
|
|
40
|
-
|
|
41
|
-
const modelManager = getModelManager();
|
|
42
|
-
const pointers = ["main", "task", "reasoning", "quick", "compact"];
|
|
142
|
+
if (phase.type === "confirm-delete") {
|
|
43
143
|
return /* @__PURE__ */ React.createElement(
|
|
44
|
-
|
|
144
|
+
ConfirmDeletePhase,
|
|
45
145
|
{
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
146
|
+
modelName: phase.modelName,
|
|
147
|
+
modelLabel: phase.modelLabel,
|
|
148
|
+
statusOverlay,
|
|
149
|
+
onConfirm: () => {
|
|
150
|
+
try {
|
|
151
|
+
const modelManager = getModelManager();
|
|
152
|
+
modelManager.removeModel(phase.modelName);
|
|
153
|
+
refreshModels();
|
|
154
|
+
showSuccessAndGo(t("commands.model.modelDeleted"), {
|
|
155
|
+
type: "library"
|
|
156
|
+
});
|
|
157
|
+
} catch {
|
|
158
|
+
setStatusOverlay({
|
|
159
|
+
type: "error",
|
|
160
|
+
message: t("commands.model.deleteFailed")
|
|
161
|
+
});
|
|
162
|
+
setTimeout(() => {
|
|
163
|
+
setStatusOverlay(null);
|
|
164
|
+
setPhase({
|
|
165
|
+
type: "model-actions",
|
|
166
|
+
modelName: phase.modelName,
|
|
167
|
+
modelLabel: phase.modelLabel
|
|
168
|
+
});
|
|
169
|
+
}, 1500);
|
|
61
170
|
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
171
|
+
},
|
|
172
|
+
onCancel: () => setPhase({
|
|
173
|
+
type: "model-actions",
|
|
174
|
+
modelName: phase.modelName,
|
|
175
|
+
modelLabel: phase.modelLabel
|
|
176
|
+
})
|
|
177
|
+
}
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
if (phase.type === "add-model") {
|
|
181
|
+
return /* @__PURE__ */ React.createElement(
|
|
182
|
+
ModelSelector,
|
|
183
|
+
{
|
|
184
|
+
onDone: () => {
|
|
185
|
+
refreshModels();
|
|
186
|
+
setPhase({ type: "library" });
|
|
187
|
+
},
|
|
188
|
+
onCancel: () => setPhase({ type: "library" }),
|
|
189
|
+
skipModelType: true,
|
|
190
|
+
isOnboarding: false,
|
|
191
|
+
abortController: new AbortController()
|
|
192
|
+
}
|
|
68
193
|
);
|
|
69
|
-
}
|
|
194
|
+
}
|
|
195
|
+
if (phase.type === "edit-model") {
|
|
196
|
+
const modelManager = getModelManager();
|
|
197
|
+
const profile = modelManager.getAvailableModels().find((m) => m.modelName === phase.modelName);
|
|
198
|
+
if (!profile) {
|
|
199
|
+
setPhase({ type: "library" });
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
70
202
|
return /* @__PURE__ */ React.createElement(
|
|
71
|
-
|
|
203
|
+
ModelSelector,
|
|
72
204
|
{
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
205
|
+
onDone: () => {
|
|
206
|
+
refreshModels();
|
|
207
|
+
setPhase({ type: "library" });
|
|
208
|
+
},
|
|
209
|
+
onCancel: () => setPhase({
|
|
210
|
+
type: "model-actions",
|
|
211
|
+
modelName: phase.modelName,
|
|
212
|
+
modelLabel: phase.modelLabel
|
|
213
|
+
}),
|
|
214
|
+
skipModelType: true,
|
|
215
|
+
isOnboarding: false,
|
|
216
|
+
abortController: new AbortController(),
|
|
217
|
+
editingModel: profile
|
|
218
|
+
}
|
|
83
219
|
);
|
|
84
220
|
}
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
function MainPhase({
|
|
224
|
+
refreshKey,
|
|
225
|
+
statusOverlay,
|
|
226
|
+
onSelectPointer,
|
|
227
|
+
onManageLibrary,
|
|
228
|
+
onClose
|
|
229
|
+
}) {
|
|
230
|
+
const items = useMemo(() => {
|
|
231
|
+
const config = getGlobalConfig();
|
|
232
|
+
const modelManager = getModelManager();
|
|
233
|
+
const models = modelManager.getAvailableModels();
|
|
234
|
+
const pointerItems = POINTER_TYPES.map((pointer) => {
|
|
235
|
+
const assignedModelName = config.modelPointers?.[pointer] || "";
|
|
236
|
+
const model2 = models.find((m) => m.modelName === assignedModelName);
|
|
237
|
+
const description = model2 ? `${model2.name} (${model2.provider})` : getPointerDescription(pointer);
|
|
238
|
+
return {
|
|
239
|
+
id: pointer,
|
|
240
|
+
label: POINTER_LABELS[pointer],
|
|
241
|
+
description,
|
|
242
|
+
category: t("commands.model.pointersCategory"),
|
|
243
|
+
statusIcon: model2 ? "\u2713" : void 0,
|
|
244
|
+
statusColor: model2 ? "#4EBA65" : void 0
|
|
245
|
+
};
|
|
246
|
+
});
|
|
247
|
+
const actionItems = [
|
|
248
|
+
{
|
|
249
|
+
id: ID_MANAGE_LIBRARY,
|
|
250
|
+
label: t("commands.model.modelLibrary"),
|
|
251
|
+
description: t("commands.model.modelLibrarySubtitle"),
|
|
252
|
+
category: t("commands.model.actionsCategory")
|
|
253
|
+
}
|
|
254
|
+
];
|
|
255
|
+
return [...pointerItems, ...actionItems];
|
|
256
|
+
}, [refreshKey]);
|
|
257
|
+
const handleSelect = useCallback(
|
|
258
|
+
(item) => {
|
|
259
|
+
if (item.id === ID_MANAGE_LIBRARY) {
|
|
260
|
+
onManageLibrary();
|
|
261
|
+
} else {
|
|
262
|
+
onSelectPointer(item.id);
|
|
263
|
+
}
|
|
264
|
+
},
|
|
265
|
+
[onSelectPointer, onManageLibrary]
|
|
266
|
+
);
|
|
267
|
+
return /* @__PURE__ */ React.createElement(
|
|
268
|
+
SimpleSelector,
|
|
269
|
+
{
|
|
270
|
+
title: t("commands.model.title"),
|
|
271
|
+
items,
|
|
272
|
+
onSelect: handleSelect,
|
|
273
|
+
onClose,
|
|
274
|
+
groupByCategory: true,
|
|
275
|
+
statusOverlay
|
|
276
|
+
}
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
function AssignPhase({
|
|
280
|
+
pointer,
|
|
281
|
+
refreshKey,
|
|
282
|
+
statusOverlay,
|
|
283
|
+
onAssign,
|
|
284
|
+
onClear,
|
|
285
|
+
onClose
|
|
286
|
+
}) {
|
|
287
|
+
const items = useMemo(() => {
|
|
288
|
+
const config = getGlobalConfig();
|
|
289
|
+
const modelManager = getModelManager();
|
|
290
|
+
const models = modelManager.getAvailableModels();
|
|
291
|
+
const currentAssignment = config.modelPointers?.[pointer] || "";
|
|
292
|
+
const modelItems = models.map((model2) => ({
|
|
293
|
+
id: model2.modelName,
|
|
294
|
+
label: model2.name,
|
|
295
|
+
description: `${model2.provider}: ${model2.modelName}`,
|
|
296
|
+
isCurrent: model2.modelName === currentAssignment
|
|
297
|
+
}));
|
|
298
|
+
if (currentAssignment) {
|
|
299
|
+
modelItems.push({
|
|
300
|
+
id: ID_CLEAR,
|
|
301
|
+
label: t("commands.model.clearAssignment"),
|
|
302
|
+
statusIcon: "\u2715",
|
|
303
|
+
statusColor: "#FF6B80"
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
return modelItems;
|
|
307
|
+
}, [pointer, refreshKey]);
|
|
308
|
+
const handleSelect = useCallback(
|
|
309
|
+
(item) => {
|
|
310
|
+
if (item.id === ID_CLEAR) {
|
|
311
|
+
onClear(pointer);
|
|
312
|
+
} else {
|
|
313
|
+
onAssign(pointer, item.id);
|
|
314
|
+
}
|
|
315
|
+
},
|
|
316
|
+
[pointer, onAssign, onClear]
|
|
317
|
+
);
|
|
318
|
+
return /* @__PURE__ */ React.createElement(
|
|
319
|
+
SimpleSelector,
|
|
320
|
+
{
|
|
321
|
+
title: t("commands.model.selectModel").replace(
|
|
322
|
+
"{pointer}",
|
|
323
|
+
POINTER_LABELS[pointer]
|
|
324
|
+
),
|
|
325
|
+
items,
|
|
326
|
+
onSelect: handleSelect,
|
|
327
|
+
onClose,
|
|
328
|
+
statusOverlay
|
|
329
|
+
}
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
function LibraryPhase({
|
|
333
|
+
refreshKey,
|
|
334
|
+
statusOverlay,
|
|
335
|
+
onSelectModel,
|
|
336
|
+
onAddNew,
|
|
337
|
+
onClose
|
|
338
|
+
}) {
|
|
339
|
+
const items = useMemo(() => {
|
|
340
|
+
const config = getGlobalConfig();
|
|
341
|
+
const modelManager = getModelManager();
|
|
342
|
+
const models = modelManager.getAvailableModels();
|
|
343
|
+
const modelItems = models.map((model2) => {
|
|
344
|
+
const usedBy = [];
|
|
345
|
+
POINTER_TYPES.forEach((p) => {
|
|
346
|
+
if (config.modelPointers?.[p] === model2.modelName) {
|
|
347
|
+
usedBy.push(POINTER_LABELS[p]);
|
|
348
|
+
}
|
|
349
|
+
});
|
|
350
|
+
const usageDesc = usedBy.length > 0 ? `[${usedBy.join(", ")}]` : "";
|
|
351
|
+
return {
|
|
352
|
+
id: model2.modelName,
|
|
353
|
+
label: model2.name,
|
|
354
|
+
description: `${model2.provider}${usageDesc ? " " + usageDesc : ""}`,
|
|
355
|
+
statusIcon: usedBy.length > 0 ? "\u2713" : void 0,
|
|
356
|
+
statusColor: usedBy.length > 0 ? "#4EBA65" : void 0,
|
|
357
|
+
data: { modelLabel: model2.name }
|
|
358
|
+
};
|
|
359
|
+
});
|
|
360
|
+
modelItems.push({
|
|
361
|
+
id: ID_ADD_NEW,
|
|
362
|
+
label: t("commands.model.addNewModel")
|
|
363
|
+
});
|
|
364
|
+
return modelItems;
|
|
365
|
+
}, [refreshKey]);
|
|
366
|
+
const handleSelect = useCallback(
|
|
367
|
+
(item) => {
|
|
368
|
+
if (item.id === ID_ADD_NEW) {
|
|
369
|
+
onAddNew();
|
|
370
|
+
} else {
|
|
371
|
+
const data = item.data;
|
|
372
|
+
onSelectModel(item.id, data?.modelLabel || item.label);
|
|
373
|
+
}
|
|
374
|
+
},
|
|
375
|
+
[onSelectModel, onAddNew]
|
|
376
|
+
);
|
|
377
|
+
return /* @__PURE__ */ React.createElement(
|
|
378
|
+
SimpleSelector,
|
|
379
|
+
{
|
|
380
|
+
title: t("commands.model.modelLibrary"),
|
|
381
|
+
subtitle: t("commands.model.modelLibrarySubtitle"),
|
|
382
|
+
items,
|
|
383
|
+
onSelect: handleSelect,
|
|
384
|
+
onClose,
|
|
385
|
+
statusOverlay
|
|
386
|
+
}
|
|
387
|
+
);
|
|
388
|
+
}
|
|
389
|
+
function ModelActionsPhase({
|
|
390
|
+
modelName,
|
|
391
|
+
modelLabel,
|
|
392
|
+
onEdit,
|
|
393
|
+
onDelete,
|
|
394
|
+
onClose
|
|
395
|
+
}) {
|
|
396
|
+
const items = [
|
|
397
|
+
{
|
|
398
|
+
id: ID_EDIT,
|
|
399
|
+
label: t("commands.model.editModel")
|
|
400
|
+
},
|
|
401
|
+
{
|
|
402
|
+
id: ID_DELETE,
|
|
403
|
+
label: t("common.delete"),
|
|
404
|
+
statusIcon: "\u2715",
|
|
405
|
+
statusColor: "#FF6B80"
|
|
406
|
+
},
|
|
407
|
+
{
|
|
408
|
+
id: ID_BACK,
|
|
409
|
+
label: t("common.back")
|
|
410
|
+
}
|
|
411
|
+
];
|
|
412
|
+
const handleSelect = useCallback(
|
|
413
|
+
(item) => {
|
|
414
|
+
if (item.id === ID_EDIT) {
|
|
415
|
+
onEdit();
|
|
416
|
+
} else if (item.id === ID_DELETE) {
|
|
417
|
+
onDelete();
|
|
418
|
+
} else {
|
|
419
|
+
onClose();
|
|
420
|
+
}
|
|
421
|
+
},
|
|
422
|
+
[onEdit, onDelete, onClose]
|
|
423
|
+
);
|
|
424
|
+
return /* @__PURE__ */ React.createElement(
|
|
425
|
+
SimpleSelector,
|
|
426
|
+
{
|
|
427
|
+
title: t("commands.model.modelActions").replace("{model}", modelLabel),
|
|
428
|
+
items,
|
|
429
|
+
onSelect: handleSelect,
|
|
430
|
+
onClose
|
|
431
|
+
}
|
|
432
|
+
);
|
|
433
|
+
}
|
|
434
|
+
function ConfirmDeletePhase({
|
|
435
|
+
modelName,
|
|
436
|
+
modelLabel,
|
|
437
|
+
statusOverlay,
|
|
438
|
+
onConfirm,
|
|
439
|
+
onCancel
|
|
440
|
+
}) {
|
|
441
|
+
const items = [
|
|
442
|
+
{
|
|
443
|
+
id: ID_CONFIRM_YES,
|
|
444
|
+
label: t("commands.model.confirmDeleteYes"),
|
|
445
|
+
statusIcon: "\u2715",
|
|
446
|
+
statusColor: "#FF6B80"
|
|
447
|
+
},
|
|
448
|
+
{
|
|
449
|
+
id: ID_CONFIRM_NO,
|
|
450
|
+
label: t("commands.model.confirmDeleteNo")
|
|
451
|
+
}
|
|
452
|
+
];
|
|
453
|
+
const handleSelect = useCallback(
|
|
454
|
+
(item) => {
|
|
455
|
+
if (item.id === ID_CONFIRM_YES) {
|
|
456
|
+
onConfirm();
|
|
457
|
+
} else {
|
|
458
|
+
onCancel();
|
|
459
|
+
}
|
|
460
|
+
},
|
|
461
|
+
[onConfirm, onCancel]
|
|
462
|
+
);
|
|
463
|
+
return /* @__PURE__ */ React.createElement(
|
|
464
|
+
SimpleSelector,
|
|
465
|
+
{
|
|
466
|
+
title: t("commands.model.confirmDeleteTitle").replace(
|
|
467
|
+
"{model}",
|
|
468
|
+
modelLabel
|
|
469
|
+
),
|
|
470
|
+
items,
|
|
471
|
+
onSelect: handleSelect,
|
|
472
|
+
onClose: onCancel,
|
|
473
|
+
statusOverlay
|
|
474
|
+
}
|
|
475
|
+
);
|
|
85
476
|
}
|
|
86
477
|
const model = {
|
|
87
478
|
name: "model",
|
|
@@ -89,6 +480,7 @@ const model = {
|
|
|
89
480
|
aliases: ["ms", "modelstatus", "model-status"],
|
|
90
481
|
isEnabled: true,
|
|
91
482
|
isHidden: false,
|
|
483
|
+
hidePromptInput: true,
|
|
92
484
|
type: "local-jsx",
|
|
93
485
|
userFacingName() {
|
|
94
486
|
return "model";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/commands/model.tsx"],
|
|
4
|
-
"sourcesContent": ["import React, { useState } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { ModelConfig } from '@components/ModelConfig'\nimport { enableConfigs } from '@utils/config'\nimport { triggerModelConfigChange } from '@messages'\nimport { getModelManager } from '@utils/model'\nimport { getTheme } from '@utils/theme'\nimport { useExitOnCtrlCD } from '@hooks/useExitOnCtrlCD'\nimport type { Command } from '@commands'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\ntype Props = {\n onClose: () => void\n abortController?: AbortController\n}\n\n/**\n * Combined Model Command - Shows status and provides configuration\n *\n * This merges the functionality of /model and /modelstatus into a single command.\n * First shows current model status, then allows entering configuration mode.\n */\nfunction ModelCommand({ onClose, abortController }: Props): React.ReactNode {\n const [mode, setMode] = useState<'status' | 'config'>('status')\n const theme = getTheme()\n const exitState = useExitOnCtrlCD(onClose)\n\n // Only listen for input when in status mode\n // When in config mode, ModelConfig handles its own input\n useInput(\n (input, key) => {\n if (key.return || input === 'c' || input === 'C') {\n enableConfigs()\n abortController?.abort?.()\n setMode('config')\n } else if (key.escape) {\n onClose()\n }\n },\n { isActive: mode === 'status' },\n )\n\n if (mode === 'config') {\n return (\n <ModelConfig\n onClose={() => {\n import('@utils/model').then(({ reloadModelManager }) => {\n reloadModelManager()\n triggerModelConfigChange()\n // Return to status mode instead of exiting completely\n setMode('status')\n })\n }}\n />\n )\n }\n\n // Status mode - show current model configuration\n try {\n const modelManager = getModelManager()\n const pointers = ['main', 'task', 'reasoning', 'quick', 'compact'] as const\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\n \uD83D\uDCCA Model Status{' '}\n {exitState.pending\n ? `(press ${exitState.keyName} again to exit)`\n : ''}\n </Text>\n <Text> </Text>\n\n {pointers.map(pointer => {\n try {\n const model = modelManager.getModel(pointer)\n if (model && model.name && model.provider) {\n return (\n <Box key={pointer}>\n <Text>\n <Text bold color={theme.minto}>\n {pointer.toUpperCase().padEnd(10)}\n </Text>{' '}\n \u2192 {model.name}{' '}\n <Text color={theme.secondaryText}>\n ({model.provider}, {model.modelName || 'unknown'})\n </Text>\n </Text>\n </Box>\n )\n } else {\n return (\n <Box key={pointer}>\n <Text>\n <Text bold color={theme.minto}>\n {pointer.toUpperCase().padEnd(10)}\n </Text>{' '}\n \u2192 <Text color={theme.error}>Not configured</Text>\n </Text>\n </Box>\n )\n }\n } catch {\n return (\n <Box key={pointer}>\n <Text>\n <Text bold color={theme.minto}>\n {pointer.toUpperCase().padEnd(10)}\n </Text>{' '}\n \u2192 <Text color={theme.error}>Error</Text>\n </Text>\n </Box>\n )\n }\n })}\n\n <Text> </Text>\n <Box flexDirection=\"column\">\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>Enter</Text> or <Text bold>C</Text> to configure\n models\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>Esc</Text> to close\n </Text>\n </Box>\n </Box>\n )\n } catch (error) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>\uD83D\uDCCA Model Status Error</Text>\n <Text color={theme.error}>\n Error reading model status: {String(error)}\n </Text>\n <Text> </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Press <Text bold>Enter</Text> to configure models\n </Text>\n </Box>\n )\n }\n}\n\nconst model: Command = {\n name: 'model',\n description: 'View model status and configure AI provider settings',\n aliases: ['ms', 'modelstatus', 'model-status'],\n isEnabled: true,\n isHidden: false,\n type: 'local-jsx',\n userFacingName() {\n return 'model'\n },\n async call(onDone, context) {\n const { abortController } = context || {}\n return <ModelCommand onClose={onDone} abortController={abortController} />\n },\n}\n\nexport default model\n"],
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["/**\n * Model Command\n *\n * Interactive model configuration using SimpleSelector phase state machine.\n *\n * Phase flow:\n * main \u2192 (select pointer) \u2192 assign \u2192 (select model) \u2192 main\n * main \u2192 (Manage Library) \u2192 library \u2192 (select model) \u2192 model-actions\n * \u2193\n * confirm-delete \u2192 library\n * library \u2192 (+ Add New) \u2192 add-model \u2192 library\n */\n\nimport React, { useState, useMemo, useCallback } from 'react'\nimport { SimpleSelector } from '@components/SimpleSelector'\nimport type { SelectorItem, StatusOverlay } from '@components/SimpleSelector'\nimport { ModelSelector } from '@components/ModelSelector'\nimport { enableConfigs } from '@utils/config'\nimport {\n ModelPointerType,\n setModelPointer,\n getGlobalConfig,\n} from '@utils/config'\nimport { getModelManager, reloadModelManager } from '@utils/model'\nimport { triggerModelConfigChange } from '@messages'\nimport { t } from '@i18n'\nimport type { Command } from '@commands'\n\n// =============================================================================\n// Types\n// =============================================================================\n\ntype ModelPhase =\n | { type: 'main' }\n | { type: 'assign'; pointer: ModelPointerType }\n | { type: 'library' }\n | { type: 'model-actions'; modelName: string; modelLabel: string }\n | { type: 'confirm-delete'; modelName: string; modelLabel: string }\n | { type: 'add-model' }\n | { type: 'edit-model'; modelName: string; modelLabel: string }\n\n// Special item IDs\nconst ID_MANAGE_LIBRARY = '__manage_library__'\nconst ID_ADD_NEW = '__add_new__'\nconst ID_CLEAR = '__clear__'\nconst ID_EDIT = '__edit__'\nconst ID_DELETE = '__delete__'\nconst ID_BACK = '__back__'\nconst ID_CONFIRM_YES = '__yes__'\nconst ID_CONFIRM_NO = '__no__'\n\nconst POINTER_TYPES: ModelPointerType[] = [\n 'main',\n 'task',\n 'reasoning',\n 'quick',\n 'compact',\n]\n\nconst POINTER_LABELS: Record<ModelPointerType, string> = {\n main: 'Main',\n task: 'Task',\n reasoning: 'Reasoning',\n quick: 'Quick',\n compact: 'Compact',\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nfunction getPointerDescription(pointer: ModelPointerType): string {\n const key = `ui.modelConfig.${pointer}Description` as const\n return t(key)\n}\n\n// =============================================================================\n// Main Component\n// =============================================================================\n\ntype Props = {\n onClose: () => void\n abortController?: AbortController\n}\n\nfunction ModelCommand({ onClose, abortController }: Props): React.ReactNode {\n const [phase, setPhase] = useState<ModelPhase>({ type: 'main' })\n const [statusOverlay, setStatusOverlay] = useState<StatusOverlay | null>(null)\n const [refreshKey, setRefreshKey] = useState(0)\n\n // Reload models and trigger config change\n const refreshModels = useCallback(() => {\n reloadModelManager()\n triggerModelConfigChange()\n setRefreshKey(prev => prev + 1)\n }, [])\n\n // Show a temporary success overlay then transition\n const showSuccessAndGo = useCallback(\n (message: string, nextPhase: ModelPhase) => {\n setStatusOverlay({ type: 'success', message })\n setTimeout(() => {\n setStatusOverlay(null)\n setPhase(nextPhase)\n }, 800)\n },\n [],\n )\n\n // \u2500\u2500\u2500 Phase: main \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (phase.type === 'main') {\n return (\n <MainPhase\n refreshKey={refreshKey}\n statusOverlay={statusOverlay}\n onSelectPointer={pointer => setPhase({ type: 'assign', pointer })}\n onManageLibrary={() => setPhase({ type: 'library' })}\n onClose={onClose}\n />\n )\n }\n\n // \u2500\u2500\u2500 Phase: assign \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (phase.type === 'assign') {\n return (\n <AssignPhase\n pointer={phase.pointer}\n refreshKey={refreshKey}\n statusOverlay={statusOverlay}\n onAssign={(pointer, modelName) => {\n setModelPointer(pointer, modelName)\n refreshModels()\n showSuccessAndGo(\n t('commands.model.pointerUpdated').replace(\n '{pointer}',\n POINTER_LABELS[pointer],\n ),\n { type: 'main' },\n )\n }}\n onClear={pointer => {\n setModelPointer(pointer, '')\n refreshModels()\n showSuccessAndGo(\n t('commands.model.pointerCleared').replace(\n '{pointer}',\n POINTER_LABELS[pointer],\n ),\n { type: 'main' },\n )\n }}\n onClose={() => setPhase({ type: 'main' })}\n />\n )\n }\n\n // \u2500\u2500\u2500 Phase: library \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (phase.type === 'library') {\n return (\n <LibraryPhase\n refreshKey={refreshKey}\n statusOverlay={statusOverlay}\n onSelectModel={(modelName, modelLabel) =>\n setPhase({ type: 'model-actions', modelName, modelLabel })\n }\n onAddNew={() => {\n enableConfigs()\n abortController?.abort?.()\n setPhase({ type: 'add-model' })\n }}\n onClose={() => setPhase({ type: 'main' })}\n />\n )\n }\n\n // \u2500\u2500\u2500 Phase: model-actions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (phase.type === 'model-actions') {\n return (\n <ModelActionsPhase\n modelName={phase.modelName}\n modelLabel={phase.modelLabel}\n onEdit={() => {\n enableConfigs()\n abortController?.abort?.()\n setPhase({\n type: 'edit-model',\n modelName: phase.modelName,\n modelLabel: phase.modelLabel,\n })\n }}\n onDelete={() =>\n setPhase({\n type: 'confirm-delete',\n modelName: phase.modelName,\n modelLabel: phase.modelLabel,\n })\n }\n onClose={() => setPhase({ type: 'library' })}\n />\n )\n }\n\n // \u2500\u2500\u2500 Phase: confirm-delete \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (phase.type === 'confirm-delete') {\n return (\n <ConfirmDeletePhase\n modelName={phase.modelName}\n modelLabel={phase.modelLabel}\n statusOverlay={statusOverlay}\n onConfirm={() => {\n try {\n const modelManager = getModelManager()\n modelManager.removeModel(phase.modelName)\n refreshModels()\n showSuccessAndGo(t('commands.model.modelDeleted'), {\n type: 'library',\n })\n } catch {\n setStatusOverlay({\n type: 'error',\n message: t('commands.model.deleteFailed'),\n })\n setTimeout(() => {\n setStatusOverlay(null)\n setPhase({\n type: 'model-actions',\n modelName: phase.modelName,\n modelLabel: phase.modelLabel,\n })\n }, 1500)\n }\n }}\n onCancel={() =>\n setPhase({\n type: 'model-actions',\n modelName: phase.modelName,\n modelLabel: phase.modelLabel,\n })\n }\n />\n )\n }\n\n // \u2500\u2500\u2500 Phase: add-model \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (phase.type === 'add-model') {\n return (\n <ModelSelector\n onDone={() => {\n refreshModels()\n setPhase({ type: 'library' })\n }}\n onCancel={() => setPhase({ type: 'library' })}\n skipModelType={true}\n isOnboarding={false}\n abortController={new AbortController()}\n />\n )\n }\n\n // \u2500\u2500\u2500 Phase: edit-model \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (phase.type === 'edit-model') {\n const modelManager = getModelManager()\n const profile = modelManager\n .getAvailableModels()\n .find(m => m.modelName === phase.modelName)\n if (!profile) {\n // Model not found, go back to library\n setPhase({ type: 'library' })\n return null\n }\n return (\n <ModelSelector\n onDone={() => {\n refreshModels()\n setPhase({ type: 'library' })\n }}\n onCancel={() =>\n setPhase({\n type: 'model-actions',\n modelName: phase.modelName,\n modelLabel: phase.modelLabel,\n })\n }\n skipModelType={true}\n isOnboarding={false}\n abortController={new AbortController()}\n editingModel={profile}\n />\n )\n }\n\n // Fallback (shouldn't happen)\n return null\n}\n\n// =============================================================================\n// Phase Components\n// =============================================================================\n\nfunction MainPhase({\n refreshKey,\n statusOverlay,\n onSelectPointer,\n onManageLibrary,\n onClose,\n}: {\n refreshKey: number\n statusOverlay: StatusOverlay | null\n onSelectPointer: (pointer: ModelPointerType) => void\n onManageLibrary: () => void\n onClose: () => void\n}) {\n const items = useMemo((): SelectorItem[] => {\n const config = getGlobalConfig()\n const modelManager = getModelManager()\n const models = modelManager.getAvailableModels()\n\n const pointerItems: SelectorItem[] = POINTER_TYPES.map(pointer => {\n const assignedModelName = config.modelPointers?.[pointer] || ''\n const model = models.find(m => m.modelName === assignedModelName)\n const description = model\n ? `${model.name} (${model.provider})`\n : getPointerDescription(pointer)\n\n return {\n id: pointer,\n label: POINTER_LABELS[pointer],\n description,\n category: t('commands.model.pointersCategory'),\n statusIcon: model ? '\\u2713' : undefined,\n statusColor: model ? '#4EBA65' : undefined,\n }\n })\n\n const actionItems: SelectorItem[] = [\n {\n id: ID_MANAGE_LIBRARY,\n label: t('commands.model.modelLibrary'),\n description: t('commands.model.modelLibrarySubtitle'),\n category: t('commands.model.actionsCategory'),\n },\n ]\n\n return [...pointerItems, ...actionItems]\n }, [refreshKey])\n\n const handleSelect = useCallback(\n (item: SelectorItem) => {\n if (item.id === ID_MANAGE_LIBRARY) {\n onManageLibrary()\n } else {\n onSelectPointer(item.id as ModelPointerType)\n }\n },\n [onSelectPointer, onManageLibrary],\n )\n\n return (\n <SimpleSelector\n title={t('commands.model.title')}\n items={items}\n onSelect={handleSelect}\n onClose={onClose}\n groupByCategory={true}\n statusOverlay={statusOverlay}\n />\n )\n}\n\nfunction AssignPhase({\n pointer,\n refreshKey,\n statusOverlay,\n onAssign,\n onClear,\n onClose,\n}: {\n pointer: ModelPointerType\n refreshKey: number\n statusOverlay: StatusOverlay | null\n onAssign: (pointer: ModelPointerType, modelName: string) => void\n onClear: (pointer: ModelPointerType) => void\n onClose: () => void\n}) {\n const items = useMemo((): SelectorItem[] => {\n const config = getGlobalConfig()\n const modelManager = getModelManager()\n const models = modelManager.getAvailableModels()\n const currentAssignment = config.modelPointers?.[pointer] || ''\n\n const modelItems: SelectorItem[] = models.map(model => ({\n id: model.modelName,\n label: model.name,\n description: `${model.provider}: ${model.modelName}`,\n isCurrent: model.modelName === currentAssignment,\n }))\n\n // Add \"Clear Assignment\" option if there's a current assignment\n if (currentAssignment) {\n modelItems.push({\n id: ID_CLEAR,\n label: t('commands.model.clearAssignment'),\n statusIcon: '\\u2715',\n statusColor: '#FF6B80',\n })\n }\n\n return modelItems\n }, [pointer, refreshKey])\n\n const handleSelect = useCallback(\n (item: SelectorItem) => {\n if (item.id === ID_CLEAR) {\n onClear(pointer)\n } else {\n onAssign(pointer, item.id)\n }\n },\n [pointer, onAssign, onClear],\n )\n\n return (\n <SimpleSelector\n title={t('commands.model.selectModel').replace(\n '{pointer}',\n POINTER_LABELS[pointer],\n )}\n items={items}\n onSelect={handleSelect}\n onClose={onClose}\n statusOverlay={statusOverlay}\n />\n )\n}\n\nfunction LibraryPhase({\n refreshKey,\n statusOverlay,\n onSelectModel,\n onAddNew,\n onClose,\n}: {\n refreshKey: number\n statusOverlay: StatusOverlay | null\n onSelectModel: (modelName: string, modelLabel: string) => void\n onAddNew: () => void\n onClose: () => void\n}) {\n const items = useMemo((): SelectorItem[] => {\n const config = getGlobalConfig()\n const modelManager = getModelManager()\n const models = modelManager.getAvailableModels()\n\n const modelItems: SelectorItem[] = models.map(model => {\n // Find which pointers use this model\n const usedBy: string[] = []\n POINTER_TYPES.forEach(p => {\n if (config.modelPointers?.[p] === model.modelName) {\n usedBy.push(POINTER_LABELS[p])\n }\n })\n const usageDesc = usedBy.length > 0 ? `[${usedBy.join(', ')}]` : ''\n\n return {\n id: model.modelName,\n label: model.name,\n description: `${model.provider}${usageDesc ? ' ' + usageDesc : ''}`,\n statusIcon: usedBy.length > 0 ? '\\u2713' : undefined,\n statusColor: usedBy.length > 0 ? '#4EBA65' : undefined,\n data: { modelLabel: model.name },\n }\n })\n\n modelItems.push({\n id: ID_ADD_NEW,\n label: t('commands.model.addNewModel'),\n })\n\n return modelItems\n }, [refreshKey])\n\n const handleSelect = useCallback(\n (item: SelectorItem) => {\n if (item.id === ID_ADD_NEW) {\n onAddNew()\n } else {\n const data = item.data as { modelLabel: string } | undefined\n onSelectModel(item.id, data?.modelLabel || item.label)\n }\n },\n [onSelectModel, onAddNew],\n )\n\n return (\n <SimpleSelector\n title={t('commands.model.modelLibrary')}\n subtitle={t('commands.model.modelLibrarySubtitle')}\n items={items}\n onSelect={handleSelect}\n onClose={onClose}\n statusOverlay={statusOverlay}\n />\n )\n}\n\nfunction ModelActionsPhase({\n modelName,\n modelLabel,\n onEdit,\n onDelete,\n onClose,\n}: {\n modelName: string\n modelLabel: string\n onEdit: () => void\n onDelete: () => void\n onClose: () => void\n}) {\n const items: SelectorItem[] = [\n {\n id: ID_EDIT,\n label: t('commands.model.editModel'),\n },\n {\n id: ID_DELETE,\n label: t('common.delete'),\n statusIcon: '\\u2715',\n statusColor: '#FF6B80',\n },\n {\n id: ID_BACK,\n label: t('common.back'),\n },\n ]\n\n const handleSelect = useCallback(\n (item: SelectorItem) => {\n if (item.id === ID_EDIT) {\n onEdit()\n } else if (item.id === ID_DELETE) {\n onDelete()\n } else {\n onClose()\n }\n },\n [onEdit, onDelete, onClose],\n )\n\n return (\n <SimpleSelector\n title={t('commands.model.modelActions').replace('{model}', modelLabel)}\n items={items}\n onSelect={handleSelect}\n onClose={onClose}\n />\n )\n}\n\nfunction ConfirmDeletePhase({\n modelName,\n modelLabel,\n statusOverlay,\n onConfirm,\n onCancel,\n}: {\n modelName: string\n modelLabel: string\n statusOverlay: StatusOverlay | null\n onConfirm: () => void\n onCancel: () => void\n}) {\n const items: SelectorItem[] = [\n {\n id: ID_CONFIRM_YES,\n label: t('commands.model.confirmDeleteYes'),\n statusIcon: '\\u2715',\n statusColor: '#FF6B80',\n },\n {\n id: ID_CONFIRM_NO,\n label: t('commands.model.confirmDeleteNo'),\n },\n ]\n\n const handleSelect = useCallback(\n (item: SelectorItem) => {\n if (item.id === ID_CONFIRM_YES) {\n onConfirm()\n } else {\n onCancel()\n }\n },\n [onConfirm, onCancel],\n )\n\n return (\n <SimpleSelector\n title={t('commands.model.confirmDeleteTitle').replace(\n '{model}',\n modelLabel,\n )}\n items={items}\n onSelect={handleSelect}\n onClose={onCancel}\n statusOverlay={statusOverlay}\n />\n )\n}\n\n// =============================================================================\n// Command Export\n// =============================================================================\n\nconst model: Command = {\n name: 'model',\n description: 'View model status and configure AI provider settings',\n aliases: ['ms', 'modelstatus', 'model-status'],\n isEnabled: true,\n isHidden: false,\n hidePromptInput: true,\n type: 'local-jsx',\n userFacingName() {\n return 'model'\n },\n async call(onDone, context) {\n const { abortController } = context || {}\n return <ModelCommand onClose={onDone} abortController={abortController} />\n },\n}\n\nexport default model\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["model"]
|
|
7
7
|
}
|