centaurus-cli 3.0.1 → 3.1.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/ai/types.js +0 -1
- package/dist/ai/types.js.map +1 -1
- package/dist/cli-adapter.js +5047 -5158
- package/dist/cli-adapter.js.map +1 -1
- package/dist/commands/CommandParser.js +372 -315
- package/dist/commands/CommandParser.js.map +1 -1
- package/dist/config/build-config.js +11 -42
- package/dist/config/build-config.js.map +1 -1
- package/dist/config/defaultConfig.js +94 -82
- package/dist/config/defaultConfig.js.map +1 -1
- package/dist/config/manager.js +144 -160
- package/dist/config/manager.js.map +1 -1
- package/dist/config/mcp-config-manager.js +411 -364
- package/dist/config/mcp-config-manager.js.map +1 -1
- package/dist/config/models.js +118 -185
- package/dist/config/models.js.map +1 -1
- package/dist/config/slash-commands.js +186 -184
- package/dist/config/slash-commands.js.map +1 -1
- package/dist/config/types.js +33 -26
- package/dist/config/types.js.map +1 -1
- package/dist/context/command-detector.js +63 -67
- package/dist/context/command-detector.js.map +1 -1
- package/dist/context/context-manager.js +533 -518
- package/dist/context/context-manager.js.map +1 -1
- package/dist/context/handlers/docker-handler.js +518 -576
- package/dist/context/handlers/docker-handler.js.map +1 -1
- package/dist/context/handlers/ssh-handler.js +1050 -1109
- package/dist/context/handlers/ssh-handler.js.map +1 -1
- package/dist/context/handlers/wsl-handler.js +558 -630
- package/dist/context/handlers/wsl-handler.js.map +1 -1
- package/dist/context/index.js +42 -6
- package/dist/context/index.js.map +1 -1
- package/dist/context/subshell-handler.js +0 -4
- package/dist/context/subshell-handler.js.map +1 -1
- package/dist/context/types.js +20 -31
- package/dist/context/types.js.map +1 -1
- package/dist/hooks/useConnectivity.js +13 -10
- package/dist/hooks/useConnectivity.js.map +1 -1
- package/dist/hooks/useTerminalDimensions.js +67 -79
- package/dist/hooks/useTerminalDimensions.js.map +1 -1
- package/dist/index.js +228 -251
- package/dist/index.js.map +1 -1
- package/dist/mcp/mcp-command-handler.js +297 -260
- package/dist/mcp/mcp-command-handler.js.map +1 -1
- package/dist/mcp/mcp-server-manager.js +139 -155
- package/dist/mcp/mcp-server-manager.js.map +1 -1
- package/dist/mcp/mcp-tool-wrapper.js +74 -94
- package/dist/mcp/mcp-tool-wrapper.js.map +1 -1
- package/dist/services/ai-autocomplete-agent.js +169 -181
- package/dist/services/ai-autocomplete-agent.js.map +1 -1
- package/dist/services/ai-context-injector.js +180 -93
- package/dist/services/ai-context-injector.js.map +1 -1
- package/dist/services/ai-service-client.js +513 -456
- package/dist/services/ai-service-client.js.map +1 -1
- package/dist/services/api-client.js +443 -441
- package/dist/services/api-client.js.map +1 -1
- package/dist/services/auth-handler.js +162 -198
- package/dist/services/auth-handler.js.map +1 -1
- package/dist/services/background-task-manager.js +258 -282
- package/dist/services/background-task-manager.js.map +1 -1
- package/dist/services/checkpoint-manager.js +1526 -1512
- package/dist/services/checkpoint-manager.js.map +1 -1
- package/dist/services/clipboard-service.js +151 -200
- package/dist/services/clipboard-service.js.map +1 -1
- package/dist/services/connectivity-manager.js +63 -65
- package/dist/services/connectivity-manager.js.map +1 -1
- package/dist/services/conversation-manager.js +118 -121
- package/dist/services/conversation-manager.js.map +1 -1
- package/dist/services/environment-context-injector.js +160 -187
- package/dist/services/environment-context-injector.js.map +1 -1
- package/dist/services/fast-context-agent.js +203 -243
- package/dist/services/fast-context-agent.js.map +1 -1
- package/dist/services/input-detection-agent.js +190 -202
- package/dist/services/input-detection-agent.js.map +1 -1
- package/dist/services/input-requirement-detector.js +155 -189
- package/dist/services/input-requirement-detector.js.map +1 -1
- package/dist/services/local-chat-storage.js +342 -365
- package/dist/services/local-chat-storage.js.map +1 -1
- package/dist/services/monitored-shell-manager.js +225 -233
- package/dist/services/monitored-shell-manager.js.map +1 -1
- package/dist/services/ollama-service.js +293 -310
- package/dist/services/ollama-service.js.map +1 -1
- package/dist/services/rules-storage.js +142 -0
- package/dist/services/rules-storage.js.map +1 -0
- package/dist/services/session-quota-manager.js +219 -235
- package/dist/services/session-quota-manager.js.map +1 -1
- package/dist/services/shell-input-agent.js +299 -334
- package/dist/services/shell-input-agent.js.map +1 -1
- package/dist/services/sub-agent-manager.js +459 -501
- package/dist/services/sub-agent-manager.js.map +1 -1
- package/dist/services/warpify-detector.js +133 -183
- package/dist/services/warpify-detector.js.map +1 -1
- package/dist/services/workflow-storage.js +202 -217
- package/dist/services/workflow-storage.js.map +1 -1
- package/dist/test-ssh-handler.js +148 -193
- package/dist/test-ssh-handler.js.map +1 -1
- package/dist/tools/add-mcp.js +161 -0
- package/dist/tools/add-mcp.js.map +1 -0
- package/dist/tools/background-command.js +240 -273
- package/dist/tools/background-command.js.map +1 -1
- package/dist/tools/command.js +447 -440
- package/dist/tools/command.js.map +1 -1
- package/dist/tools/create-image.js +172 -202
- package/dist/tools/create-image.js.map +1 -1
- package/dist/tools/enter-remote-session.js +169 -215
- package/dist/tools/enter-remote-session.js.map +1 -1
- package/dist/tools/fast-context.js +60 -67
- package/dist/tools/fast-context.js.map +1 -1
- package/dist/tools/file-ops.js +601 -572
- package/dist/tools/file-ops.js.map +1 -1
- package/dist/tools/find-files.js +262 -303
- package/dist/tools/find-files.js.map +1 -1
- package/dist/tools/get-diff.js +423 -406
- package/dist/tools/get-diff.js.map +1 -1
- package/dist/tools/grep-search.js +966 -948
- package/dist/tools/grep-search.js.map +1 -1
- package/dist/tools/inspect-symbol.js +308 -323
- package/dist/tools/inspect-symbol.js.map +1 -1
- package/dist/tools/plan-mode.js +459 -503
- package/dist/tools/plan-mode.js.map +1 -1
- package/dist/tools/read-binary-file.js +160 -190
- package/dist/tools/read-binary-file.js.map +1 -1
- package/dist/tools/registry.js +100 -84
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/reproduce_issue.js +170 -151
- package/dist/tools/reproduce_issue.js.map +1 -1
- package/dist/tools/sub-agent.js +223 -228
- package/dist/tools/sub-agent.js.map +1 -1
- package/dist/tools/task-complete.js +28 -27
- package/dist/tools/task-complete.js.map +1 -1
- package/dist/tools/types.js +0 -1
- package/dist/tools/types.js.map +1 -1
- package/dist/tools/validation.js +96 -118
- package/dist/tools/validation.js.map +1 -1
- package/dist/tools/web-search.js +194 -194
- package/dist/tools/web-search.js.map +1 -1
- package/dist/tools/workflow-tool.js +77 -82
- package/dist/tools/workflow-tool.js.map +1 -1
- package/dist/types/index.js +0 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/rule.js +1 -0
- package/dist/types/rule.js.map +1 -0
- package/dist/types/workflow.js +0 -7
- package/dist/types/workflow.js.map +1 -1
- package/dist/ui/components/AgentTimer.js +24 -25
- package/dist/ui/components/AgentTimer.js.map +1 -1
- package/dist/ui/components/App.js +3266 -3263
- package/dist/ui/components/App.js.map +1 -1
- package/dist/ui/components/AuthScreen.js +22 -34
- package/dist/ui/components/AuthScreen.js.map +1 -1
- package/dist/ui/components/AuthWelcomeScreen.js +30 -24
- package/dist/ui/components/AuthWelcomeScreen.js.map +1 -1
- package/dist/ui/components/Breadcrumbs.js +53 -82
- package/dist/ui/components/Breadcrumbs.js.map +1 -1
- package/dist/ui/components/CircularSelectInput.js +59 -67
- package/dist/ui/components/CircularSelectInput.js.map +1 -1
- package/dist/ui/components/ClipboardFileAutocomplete.js +78 -39
- package/dist/ui/components/ClipboardFileAutocomplete.js.map +1 -1
- package/dist/ui/components/CodeBlock.js +24 -42
- package/dist/ui/components/CodeBlock.js.map +1 -1
- package/dist/ui/components/ConfigViewer.js +18 -25
- package/dist/ui/components/ConfigViewer.js.map +1 -1
- package/dist/ui/components/ConfirmPrompt.js +49 -71
- package/dist/ui/components/ConfirmPrompt.js.map +1 -1
- package/dist/ui/components/ConnectionStatusMessage.js +32 -83
- package/dist/ui/components/ConnectionStatusMessage.js.map +1 -1
- package/dist/ui/components/ContextWindowIndicator.js +34 -49
- package/dist/ui/components/ContextWindowIndicator.js.map +1 -1
- package/dist/ui/components/DetailedPlanReviewScreen.js +104 -106
- package/dist/ui/components/DetailedPlanReviewScreen.js.map +1 -1
- package/dist/ui/components/DiffViewer.js +68 -121
- package/dist/ui/components/DiffViewer.js.map +1 -1
- package/dist/ui/components/ErrorBoundary.js +40 -48
- package/dist/ui/components/ErrorBoundary.js.map +1 -1
- package/dist/ui/components/FileCreationPreview.js +29 -60
- package/dist/ui/components/FileCreationPreview.js.map +1 -1
- package/dist/ui/components/FileOperation.js +34 -29
- package/dist/ui/components/FileOperation.js.map +1 -1
- package/dist/ui/components/FileTagAutocomplete.js +55 -25
- package/dist/ui/components/FileTagAutocomplete.js.map +1 -1
- package/dist/ui/components/FontRecommendation.js.map +1 -1
- package/dist/ui/components/GitDiffBreadcrumb.js +29 -0
- package/dist/ui/components/GitDiffBreadcrumb.js.map +1 -0
- package/dist/ui/components/InputBox.js +1620 -2150
- package/dist/ui/components/InputBox.js.map +1 -1
- package/dist/ui/components/InteractiveShell.js +234 -352
- package/dist/ui/components/InteractiveShell.js.map +1 -1
- package/dist/ui/components/KeyboardHelp.js +34 -35
- package/dist/ui/components/KeyboardHelp.js.map +1 -1
- package/dist/ui/components/LoadingIndicator.js +22 -25
- package/dist/ui/components/LoadingIndicator.js.map +1 -1
- package/dist/ui/components/MCPAddScreen.js +40 -51
- package/dist/ui/components/MCPAddScreen.js.map +1 -1
- package/dist/ui/components/MCPListScreen.js +40 -48
- package/dist/ui/components/MCPListScreen.js.map +1 -1
- package/dist/ui/components/MCPServerListScreen.js +49 -56
- package/dist/ui/components/MCPServerListScreen.js.map +1 -1
- package/dist/ui/components/MarkdownRenderer.js +69 -96
- package/dist/ui/components/MarkdownRenderer.js.map +1 -1
- package/dist/ui/components/MessageBox.js +66 -48
- package/dist/ui/components/MessageBox.js.map +1 -1
- package/dist/ui/components/MessageDisplay.js +150 -142
- package/dist/ui/components/MessageDisplay.js.map +1 -1
- package/dist/ui/components/MonitorModeAIPanel.js +46 -65
- package/dist/ui/components/MonitorModeAIPanel.js.map +1 -1
- package/dist/ui/components/MultiLineInput.js +243 -277
- package/dist/ui/components/MultiLineInput.js.map +1 -1
- package/dist/ui/components/PasswordPrompt.js +37 -18
- package/dist/ui/components/PasswordPrompt.js.map +1 -1
- package/dist/ui/components/PlanAcceptedMessage.js +27 -38
- package/dist/ui/components/PlanAcceptedMessage.js.map +1 -1
- package/dist/ui/components/PlanReviewScreen.js +46 -50
- package/dist/ui/components/PlanReviewScreen.js.map +1 -1
- package/dist/ui/components/RulesEditorScreen.js +81 -0
- package/dist/ui/components/RulesEditorScreen.js.map +1 -0
- package/dist/ui/components/SelectPrompt.js +19 -8
- package/dist/ui/components/SelectPrompt.js.map +1 -1
- package/dist/ui/components/ShimmerText.js +44 -0
- package/dist/ui/components/ShimmerText.js.map +1 -0
- package/dist/ui/components/SlashCommandAutocomplete.js +49 -22
- package/dist/ui/components/SlashCommandAutocomplete.js.map +1 -1
- package/dist/ui/components/StatusBar.js +56 -87
- package/dist/ui/components/StatusBar.js.map +1 -1
- package/dist/ui/components/StreamingMessageDisplay.js +116 -99
- package/dist/ui/components/StreamingMessageDisplay.js.map +1 -1
- package/dist/ui/components/TaskCompletedMessage.js +28 -23
- package/dist/ui/components/TaskCompletedMessage.js.map +1 -1
- package/dist/ui/components/TaskProgressIndicator.js +44 -70
- package/dist/ui/components/TaskProgressIndicator.js.map +1 -1
- package/dist/ui/components/ThinkingDisplay.js +44 -41
- package/dist/ui/components/ThinkingDisplay.js.map +1 -1
- package/dist/ui/components/ToolExecutionMessage.js +772 -1326
- package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
- package/dist/ui/components/ToolExecutionStatus.js +53 -84
- package/dist/ui/components/ToolExecutionStatus.js.map +1 -1
- package/dist/ui/components/ToolResult.js +22 -15
- package/dist/ui/components/ToolResult.js.map +1 -1
- package/dist/ui/components/VersionUpdatePrompt.js +88 -120
- package/dist/ui/components/VersionUpdatePrompt.js.map +1 -1
- package/dist/ui/components/WelcomeBanner.js +176 -26
- package/dist/ui/components/WelcomeBanner.js.map +1 -1
- package/dist/ui/components/WorkflowCreatorScreen.js +94 -161
- package/dist/ui/components/WorkflowCreatorScreen.js.map +1 -1
- package/dist/utils/ansi-encoder.js +30 -61
- package/dist/utils/ansi-encoder.js.map +1 -1
- package/dist/utils/chat-formatter.js +327 -305
- package/dist/utils/chat-formatter.js.map +1 -1
- package/dist/utils/command-history.js +152 -174
- package/dist/utils/command-history.js.map +1 -1
- package/dist/utils/context-sanitizer.js +49 -112
- package/dist/utils/context-sanitizer.js.map +1 -1
- package/dist/utils/conversation-logger.js +292 -324
- package/dist/utils/conversation-logger.js.map +1 -1
- package/dist/utils/custom-commands-manager.js +126 -131
- package/dist/utils/custom-commands-manager.js.map +1 -1
- package/dist/utils/editor-utils.js +732 -837
- package/dist/utils/editor-utils.js.map +1 -1
- package/dist/utils/file.js +174 -213
- package/dist/utils/file.js.map +1 -1
- package/dist/utils/git-stats.js +169 -0
- package/dist/utils/git-stats.js.map +1 -0
- package/dist/utils/input-classifier.js +960 -482
- package/dist/utils/input-classifier.js.map +1 -1
- package/dist/utils/logger.js +48 -73
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/markdown-parser.js +277 -310
- package/dist/utils/markdown-parser.js.map +1 -1
- package/dist/utils/rule-reference-resolver.js +54 -0
- package/dist/utils/rule-reference-resolver.js.map +1 -0
- package/dist/utils/shell.js +144 -156
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/state.js +23 -22
- package/dist/utils/state.js.map +1 -1
- package/dist/utils/syntax-checker.js +279 -327
- package/dist/utils/syntax-checker.js.map +1 -1
- package/dist/utils/terminal-output.js +199 -302
- package/dist/utils/terminal-output.js.map +1 -1
- package/dist/utils/text-clipboard.js +47 -70
- package/dist/utils/text-clipboard.js.map +1 -1
- package/dist/utils/unicode-sanitizer.js +134 -197
- package/dist/utils/unicode-sanitizer.js.map +1 -1
- package/dist/utils/version-checker.js +46 -56
- package/dist/utils/version-checker.js.map +1 -1
- package/package.json +6 -4
- package/dist/ai/types.d.ts +0 -20
- package/dist/ai/types.d.ts.map +0 -1
- package/dist/cli-adapter.d.ts +0 -514
- package/dist/cli-adapter.d.ts.map +0 -1
- package/dist/commands/CommandParser.d.ts +0 -27
- package/dist/commands/CommandParser.d.ts.map +0 -1
- package/dist/config/build-config.d.ts +0 -42
- package/dist/config/build-config.d.ts.map +0 -1
- package/dist/config/defaultConfig.d.ts +0 -79
- package/dist/config/defaultConfig.d.ts.map +0 -1
- package/dist/config/manager.d.ts +0 -62
- package/dist/config/manager.d.ts.map +0 -1
- package/dist/config/mcp-config-manager.d.ts +0 -79
- package/dist/config/mcp-config-manager.d.ts.map +0 -1
- package/dist/config/models.d.ts +0 -83
- package/dist/config/models.d.ts.map +0 -1
- package/dist/config/slash-commands.d.ts +0 -23
- package/dist/config/slash-commands.d.ts.map +0 -1
- package/dist/config/types.d.ts +0 -35
- package/dist/config/types.d.ts.map +0 -1
- package/dist/context/command-detector.d.ts +0 -50
- package/dist/context/command-detector.d.ts.map +0 -1
- package/dist/context/context-manager.d.ts +0 -157
- package/dist/context/context-manager.d.ts.map +0 -1
- package/dist/context/handlers/docker-handler.d.ts +0 -130
- package/dist/context/handlers/docker-handler.d.ts.map +0 -1
- package/dist/context/handlers/ssh-handler.d.ts +0 -201
- package/dist/context/handlers/ssh-handler.d.ts.map +0 -1
- package/dist/context/handlers/wsl-handler.d.ts +0 -146
- package/dist/context/handlers/wsl-handler.d.ts.map +0 -1
- package/dist/context/index.d.ts +0 -8
- package/dist/context/index.d.ts.map +0 -1
- package/dist/context/subshell-handler.d.ts +0 -165
- package/dist/context/subshell-handler.d.ts.map +0 -1
- package/dist/context/types.d.ts +0 -70
- package/dist/context/types.d.ts.map +0 -1
- package/dist/hooks/useConnectivity.d.ts +0 -2
- package/dist/hooks/useConnectivity.d.ts.map +0 -1
- package/dist/hooks/useTerminalDimensions.d.ts +0 -41
- package/dist/hooks/useTerminalDimensions.d.ts.map +0 -1
- package/dist/index.d.ts +0 -9
- package/dist/index.d.ts.map +0 -1
- package/dist/mcp/mcp-command-handler.d.ts +0 -47
- package/dist/mcp/mcp-command-handler.d.ts.map +0 -1
- package/dist/mcp/mcp-server-manager.d.ts +0 -30
- package/dist/mcp/mcp-server-manager.d.ts.map +0 -1
- package/dist/mcp/mcp-tool-wrapper.d.ts +0 -12
- package/dist/mcp/mcp-tool-wrapper.d.ts.map +0 -1
- package/dist/services/ai-autocomplete-agent.d.ts +0 -39
- package/dist/services/ai-autocomplete-agent.d.ts.map +0 -1
- package/dist/services/ai-context-injector.d.ts +0 -41
- package/dist/services/ai-context-injector.d.ts.map +0 -1
- package/dist/services/ai-service-client.d.ts +0 -128
- package/dist/services/ai-service-client.d.ts.map +0 -1
- package/dist/services/api-client.d.ts +0 -353
- package/dist/services/api-client.d.ts.map +0 -1
- package/dist/services/auth-handler.d.ts +0 -30
- package/dist/services/auth-handler.d.ts.map +0 -1
- package/dist/services/background-task-manager.d.ts +0 -114
- package/dist/services/background-task-manager.d.ts.map +0 -1
- package/dist/services/checkpoint-manager.d.ts +0 -204
- package/dist/services/checkpoint-manager.d.ts.map +0 -1
- package/dist/services/clipboard-service.d.ts +0 -37
- package/dist/services/clipboard-service.d.ts.map +0 -1
- package/dist/services/connectivity-manager.d.ts +0 -18
- package/dist/services/connectivity-manager.d.ts.map +0 -1
- package/dist/services/conversation-manager.d.ts +0 -73
- package/dist/services/conversation-manager.d.ts.map +0 -1
- package/dist/services/environment-context-injector.d.ts +0 -69
- package/dist/services/environment-context-injector.d.ts.map +0 -1
- package/dist/services/fast-context-agent.d.ts +0 -12
- package/dist/services/fast-context-agent.d.ts.map +0 -1
- package/dist/services/input-detection-agent.d.ts +0 -40
- package/dist/services/input-detection-agent.d.ts.map +0 -1
- package/dist/services/input-requirement-detector.d.ts +0 -28
- package/dist/services/input-requirement-detector.d.ts.map +0 -1
- package/dist/services/local-chat-storage.d.ts +0 -182
- package/dist/services/local-chat-storage.d.ts.map +0 -1
- package/dist/services/monitored-shell-manager.d.ts +0 -120
- package/dist/services/monitored-shell-manager.d.ts.map +0 -1
- package/dist/services/ollama-service.d.ts +0 -197
- package/dist/services/ollama-service.d.ts.map +0 -1
- package/dist/services/session-quota-manager.d.ts +0 -101
- package/dist/services/session-quota-manager.d.ts.map +0 -1
- package/dist/services/shell-input-agent.d.ts +0 -89
- package/dist/services/shell-input-agent.d.ts.map +0 -1
- package/dist/services/sub-agent-manager.d.ts +0 -140
- package/dist/services/sub-agent-manager.d.ts.map +0 -1
- package/dist/services/warpify-detector.d.ts +0 -43
- package/dist/services/warpify-detector.d.ts.map +0 -1
- package/dist/services/workflow-storage.d.ts +0 -72
- package/dist/services/workflow-storage.d.ts.map +0 -1
- package/dist/test-ssh-handler.d.ts +0 -8
- package/dist/test-ssh-handler.d.ts.map +0 -1
- package/dist/tools/background-command.d.ts +0 -11
- package/dist/tools/background-command.d.ts.map +0 -1
- package/dist/tools/command.d.ts +0 -3
- package/dist/tools/command.d.ts.map +0 -1
- package/dist/tools/create-image.d.ts +0 -10
- package/dist/tools/create-image.d.ts.map +0 -1
- package/dist/tools/enter-remote-session.d.ts +0 -48
- package/dist/tools/enter-remote-session.d.ts.map +0 -1
- package/dist/tools/fast-context.d.ts +0 -3
- package/dist/tools/fast-context.d.ts.map +0 -1
- package/dist/tools/file-ops.d.ts +0 -7
- package/dist/tools/file-ops.d.ts.map +0 -1
- package/dist/tools/find-files.d.ts +0 -49
- package/dist/tools/find-files.d.ts.map +0 -1
- package/dist/tools/get-diff.d.ts +0 -14
- package/dist/tools/get-diff.d.ts.map +0 -1
- package/dist/tools/grep-search.d.ts +0 -155
- package/dist/tools/grep-search.d.ts.map +0 -1
- package/dist/tools/inspect-symbol.d.ts +0 -32
- package/dist/tools/inspect-symbol.d.ts.map +0 -1
- package/dist/tools/plan-mode.d.ts +0 -140
- package/dist/tools/plan-mode.d.ts.map +0 -1
- package/dist/tools/read-binary-file.d.ts +0 -10
- package/dist/tools/read-binary-file.d.ts.map +0 -1
- package/dist/tools/registry.d.ts +0 -31
- package/dist/tools/registry.d.ts.map +0 -1
- package/dist/tools/reproduce_issue.d.ts +0 -2
- package/dist/tools/reproduce_issue.d.ts.map +0 -1
- package/dist/tools/sub-agent.d.ts +0 -9
- package/dist/tools/sub-agent.d.ts.map +0 -1
- package/dist/tools/task-complete.d.ts +0 -3
- package/dist/tools/task-complete.d.ts.map +0 -1
- package/dist/tools/types.d.ts +0 -40
- package/dist/tools/types.d.ts.map +0 -1
- package/dist/tools/validation.d.ts +0 -47
- package/dist/tools/validation.d.ts.map +0 -1
- package/dist/tools/web-search.d.ts +0 -24
- package/dist/tools/web-search.d.ts.map +0 -1
- package/dist/tools/workflow-tool.d.ts +0 -11
- package/dist/tools/workflow-tool.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -123
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/workflow.d.ts +0 -110
- package/dist/types/workflow.d.ts.map +0 -1
- package/dist/ui/components/AgentTimer.d.ts +0 -7
- package/dist/ui/components/AgentTimer.d.ts.map +0 -1
- package/dist/ui/components/App.d.ts +0 -197
- package/dist/ui/components/App.d.ts.map +0 -1
- package/dist/ui/components/AuthScreen.d.ts +0 -8
- package/dist/ui/components/AuthScreen.d.ts.map +0 -1
- package/dist/ui/components/AuthWelcomeScreen.d.ts +0 -8
- package/dist/ui/components/AuthWelcomeScreen.d.ts.map +0 -1
- package/dist/ui/components/Breadcrumbs.d.ts +0 -13
- package/dist/ui/components/Breadcrumbs.d.ts.map +0 -1
- package/dist/ui/components/CircularSelectInput.d.ts +0 -24
- package/dist/ui/components/CircularSelectInput.d.ts.map +0 -1
- package/dist/ui/components/ClipboardFileAutocomplete.d.ts +0 -10
- package/dist/ui/components/ClipboardFileAutocomplete.d.ts.map +0 -1
- package/dist/ui/components/CodeBlock.d.ts +0 -9
- package/dist/ui/components/CodeBlock.d.ts.map +0 -1
- package/dist/ui/components/ConfigViewer.d.ts +0 -11
- package/dist/ui/components/ConfigViewer.d.ts.map +0 -1
- package/dist/ui/components/ConfirmPrompt.d.ts +0 -13
- package/dist/ui/components/ConfirmPrompt.d.ts.map +0 -1
- package/dist/ui/components/ConnectionStatusMessage.d.ts +0 -17
- package/dist/ui/components/ConnectionStatusMessage.d.ts.map +0 -1
- package/dist/ui/components/ContextWindowIndicator.d.ts +0 -8
- package/dist/ui/components/ContextWindowIndicator.d.ts.map +0 -1
- package/dist/ui/components/DetailedPlanReviewScreen.d.ts +0 -17
- package/dist/ui/components/DetailedPlanReviewScreen.d.ts.map +0 -1
- package/dist/ui/components/DiffViewer.d.ts +0 -9
- package/dist/ui/components/DiffViewer.d.ts.map +0 -1
- package/dist/ui/components/ErrorBoundary.d.ts +0 -17
- package/dist/ui/components/ErrorBoundary.d.ts.map +0 -1
- package/dist/ui/components/FileCreationPreview.d.ts +0 -8
- package/dist/ui/components/FileCreationPreview.d.ts.map +0 -1
- package/dist/ui/components/FileOperation.d.ts +0 -10
- package/dist/ui/components/FileOperation.d.ts.map +0 -1
- package/dist/ui/components/FileTagAutocomplete.d.ts +0 -11
- package/dist/ui/components/FileTagAutocomplete.d.ts.map +0 -1
- package/dist/ui/components/FontRecommendation.d.ts +0 -1
- package/dist/ui/components/FontRecommendation.d.ts.map +0 -1
- package/dist/ui/components/InputBox.d.ts +0 -42
- package/dist/ui/components/InputBox.d.ts.map +0 -1
- package/dist/ui/components/InteractiveShell.d.ts +0 -30
- package/dist/ui/components/InteractiveShell.d.ts.map +0 -1
- package/dist/ui/components/KeyboardHelp.d.ts +0 -7
- package/dist/ui/components/KeyboardHelp.d.ts.map +0 -1
- package/dist/ui/components/LoadingIndicator.d.ts +0 -3
- package/dist/ui/components/LoadingIndicator.d.ts.map +0 -1
- package/dist/ui/components/MCPAddScreen.d.ts +0 -13
- package/dist/ui/components/MCPAddScreen.d.ts.map +0 -1
- package/dist/ui/components/MCPListScreen.d.ts +0 -17
- package/dist/ui/components/MCPListScreen.d.ts.map +0 -1
- package/dist/ui/components/MCPServerListScreen.d.ts +0 -16
- package/dist/ui/components/MCPServerListScreen.d.ts.map +0 -1
- package/dist/ui/components/MarkdownRenderer.d.ts +0 -8
- package/dist/ui/components/MarkdownRenderer.d.ts.map +0 -1
- package/dist/ui/components/MessageBox.d.ts +0 -10
- package/dist/ui/components/MessageBox.d.ts.map +0 -1
- package/dist/ui/components/MessageDisplay.d.ts +0 -14
- package/dist/ui/components/MessageDisplay.d.ts.map +0 -1
- package/dist/ui/components/MonitorModeAIPanel.d.ts +0 -23
- package/dist/ui/components/MonitorModeAIPanel.d.ts.map +0 -1
- package/dist/ui/components/MultiLineInput.d.ts +0 -13
- package/dist/ui/components/MultiLineInput.d.ts.map +0 -1
- package/dist/ui/components/PasswordPrompt.d.ts +0 -9
- package/dist/ui/components/PasswordPrompt.d.ts.map +0 -1
- package/dist/ui/components/PlanAcceptedMessage.d.ts +0 -20
- package/dist/ui/components/PlanAcceptedMessage.d.ts.map +0 -1
- package/dist/ui/components/PlanReviewScreen.d.ts +0 -14
- package/dist/ui/components/PlanReviewScreen.d.ts.map +0 -1
- package/dist/ui/components/SelectPrompt.d.ts +0 -12
- package/dist/ui/components/SelectPrompt.d.ts.map +0 -1
- package/dist/ui/components/SlashCommandAutocomplete.d.ts +0 -13
- package/dist/ui/components/SlashCommandAutocomplete.d.ts.map +0 -1
- package/dist/ui/components/StatusBar.d.ts +0 -14
- package/dist/ui/components/StatusBar.d.ts.map +0 -1
- package/dist/ui/components/StreamingMessageDisplay.d.ts +0 -15
- package/dist/ui/components/StreamingMessageDisplay.d.ts.map +0 -1
- package/dist/ui/components/TaskCompletedMessage.d.ts +0 -14
- package/dist/ui/components/TaskCompletedMessage.d.ts.map +0 -1
- package/dist/ui/components/TaskProgressIndicator.d.ts +0 -18
- package/dist/ui/components/TaskProgressIndicator.d.ts.map +0 -1
- package/dist/ui/components/ThinkingDisplay.d.ts +0 -15
- package/dist/ui/components/ThinkingDisplay.d.ts.map +0 -1
- package/dist/ui/components/ToolExecutionMessage.d.ts +0 -8
- package/dist/ui/components/ToolExecutionMessage.d.ts.map +0 -1
- package/dist/ui/components/ToolExecutionStatus.d.ts +0 -10
- package/dist/ui/components/ToolExecutionStatus.d.ts.map +0 -1
- package/dist/ui/components/ToolResult.d.ts +0 -10
- package/dist/ui/components/ToolResult.d.ts.map +0 -1
- package/dist/ui/components/VersionUpdatePrompt.d.ts +0 -9
- package/dist/ui/components/VersionUpdatePrompt.d.ts.map +0 -1
- package/dist/ui/components/WelcomeBanner.d.ts +0 -3
- package/dist/ui/components/WelcomeBanner.d.ts.map +0 -1
- package/dist/ui/components/WorkflowCreatorScreen.d.ts +0 -25
- package/dist/ui/components/WorkflowCreatorScreen.d.ts.map +0 -1
- package/dist/utils/ansi-encoder.d.ts +0 -7
- package/dist/utils/ansi-encoder.d.ts.map +0 -1
- package/dist/utils/chat-formatter.d.ts +0 -12
- package/dist/utils/chat-formatter.d.ts.map +0 -1
- package/dist/utils/command-history.d.ts +0 -24
- package/dist/utils/command-history.d.ts.map +0 -1
- package/dist/utils/context-sanitizer.d.ts +0 -50
- package/dist/utils/context-sanitizer.d.ts.map +0 -1
- package/dist/utils/conversation-logger.d.ts +0 -142
- package/dist/utils/conversation-logger.d.ts.map +0 -1
- package/dist/utils/custom-commands-manager.d.ts +0 -59
- package/dist/utils/custom-commands-manager.d.ts.map +0 -1
- package/dist/utils/editor-utils.d.ts +0 -101
- package/dist/utils/editor-utils.d.ts.map +0 -1
- package/dist/utils/file.d.ts +0 -61
- package/dist/utils/file.d.ts.map +0 -1
- package/dist/utils/input-classifier.d.ts +0 -25
- package/dist/utils/input-classifier.d.ts.map +0 -1
- package/dist/utils/logger.d.ts +0 -17
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/markdown-parser.d.ts +0 -60
- package/dist/utils/markdown-parser.d.ts.map +0 -1
- package/dist/utils/shell.d.ts +0 -47
- package/dist/utils/shell.d.ts.map +0 -1
- package/dist/utils/state.d.ts +0 -13
- package/dist/utils/state.d.ts.map +0 -1
- package/dist/utils/syntax-checker.d.ts +0 -24
- package/dist/utils/syntax-checker.d.ts.map +0 -1
- package/dist/utils/terminal-output.d.ts +0 -25
- package/dist/utils/terminal-output.d.ts.map +0 -1
- package/dist/utils/text-clipboard.d.ts +0 -12
- package/dist/utils/text-clipboard.d.ts.map +0 -1
- package/dist/utils/unicode-sanitizer.d.ts +0 -44
- package/dist/utils/unicode-sanitizer.d.ts.map +0 -1
- package/dist/utils/version-checker.d.ts +0 -14
- package/dist/utils/version-checker.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-config-manager.js","sourceRoot":"","sources":["../../src/config/mcp-config-manager.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/config/mcp-config-manager.ts"],"sourcesContent":["import * as fs from 'fs';\r\nimport * as path from 'path';\r\nimport * as os from 'os';\r\nimport { logWarning } from '../utils/logger.js';\r\n\r\nexport interface MCPServerConfig {\r\n name: string;\r\n command: string;\r\n args?: string[];\r\n env?: Record<string, string>;\r\n enabled?: boolean;\r\n auth?: {\r\n type: 'oauth';\r\n clientId?: string;\r\n authUrl?: string;\r\n };\r\n}\r\n\r\nexport interface MCPConfig {\r\n servers: MCPServerConfig[];\r\n}\r\n\r\nexport class MCPConfigManager {\r\n private configPath: string;\r\n private config: MCPConfig;\r\n\r\n constructor(configDir?: string) {\r\n const baseDir = configDir || path.join(os.homedir(), '.centaurus');\r\n this.configPath = path.join(baseDir, 'mcp-config.json');\r\n this.config = this.load();\r\n }\r\n\r\n getConfigPath(): string {\r\n return this.configPath;\r\n }\r\n\r\n load(): MCPConfig {\r\n try {\r\n if (fs.existsSync(this.configPath)) {\r\n const content = fs.readFileSync(this.configPath, 'utf-8');\r\n\r\n // Handle empty file\r\n if (!content.trim()) {\r\n logWarning('[MCP Config] Config file is empty');\r\n return this.getDefaultConfig();\r\n }\r\n\r\n let rawConfig: any;\r\n try {\r\n rawConfig = JSON.parse(content);\r\n } catch (parseError: any) {\r\n logWarning(`[MCP Config] Invalid JSON: ${parseError.message}`);\r\n return this.getDefaultConfig();\r\n }\r\n\r\n // Normalize the config to standard format\r\n const normalizedConfig = this.normalizeConfig(rawConfig);\r\n\r\n if (normalizedConfig.servers.length === 0) {\r\n logWarning('[MCP Config] No servers found in config file');\r\n }\r\n\r\n return normalizedConfig;\r\n } else {\r\n // Config file doesn't exist - create directory and return default\r\n const configDir = path.dirname(this.configPath);\r\n if (!fs.existsSync(configDir)) {\r\n fs.mkdirSync(configDir, { recursive: true });\r\n }\r\n }\r\n } catch (error: any) {\r\n logWarning(`[MCP Config] Failed to load config: ${error.message}`);\r\n }\r\n\r\n return this.getDefaultConfig();\r\n }\r\n\r\n /**\r\n * Normalize config from different formats to standard format\r\n * Supports:\r\n * 1. mcp_servers format (preferred): { \"mcp_servers\": { \"serverName\": { \"command\": \"...\", ... } } }\r\n * 2. Array format: { \"servers\": [{ \"name\": \"x\", \"command\": \"y\", ... }] }\r\n * 3. Object format: { \"serverName\": { \"command\": \"y\", ... } } - keys become server names\r\n * 4. mcpServers format (VSCode/Claude style): { \"mcpServers\": { ... } }\r\n */\r\n private normalizeConfig(rawConfig: any): MCPConfig {\r\n // If it's null or not an object, return default\r\n if (!rawConfig || typeof rawConfig !== 'object') {\r\n return this.getDefaultConfig();\r\n }\r\n\r\n // Format 1 (PREFERRED): Check for \"mcp_servers\" key (snake_case) - object format\r\n if (rawConfig.mcp_servers && typeof rawConfig.mcp_servers === 'object' && !Array.isArray(rawConfig.mcp_servers)) {\r\n return this.convertObjectToArrayFormat(rawConfig.mcp_servers);\r\n }\r\n\r\n // Format 2: Standard array format with \"servers\" key\r\n if (Array.isArray(rawConfig.servers)) {\r\n const validServers = rawConfig.servers\r\n .filter((s: any) => this.validateServerConfig(s))\r\n .map((s: any) => this.sanitizeServerConfig(s));\r\n return { servers: validServers };\r\n }\r\n\r\n // Format 3: Check for \"mcpServers\" key (VSCode/Claude Desktop style - camelCase)\r\n if (rawConfig.mcpServers && typeof rawConfig.mcpServers === 'object') {\r\n return this.convertObjectToArrayFormat(rawConfig.mcpServers);\r\n }\r\n\r\n // Format 4: Object format where keys are server names (legacy)\r\n // Check if any top-level key looks like a server config (has 'command' property)\r\n const potentialServers = Object.entries(rawConfig).filter(\r\n ([key, value]: [string, any]) =>\r\n key !== 'servers' &&\r\n key !== 'mcpServers' &&\r\n key !== 'mcp_servers' &&\r\n value &&\r\n typeof value === 'object' &&\r\n 'command' in value\r\n );\r\n\r\n if (potentialServers.length > 0) {\r\n return this.convertObjectToArrayFormat(rawConfig);\r\n }\r\n\r\n // If we have a 'servers' key but it's not an array, try to handle it\r\n if (rawConfig.servers && typeof rawConfig.servers === 'object' && !Array.isArray(rawConfig.servers)) {\r\n return this.convertObjectToArrayFormat(rawConfig.servers);\r\n }\r\n\r\n logWarning('[MCP Config] Unrecognized config format');\r\n return this.getDefaultConfig();\r\n }\r\n\r\n /**\r\n * Convert object-based format to array format\r\n * { \"serverName\": { \"command\": \"x\", ... } } => { \"servers\": [{ \"name\": \"serverName\", \"command\": \"x\", ... }] }\r\n */\r\n private convertObjectToArrayFormat(configObject: Record<string, any>): MCPConfig {\r\n const servers: MCPServerConfig[] = [];\r\n\r\n for (const [name, serverConfig] of Object.entries(configObject)) {\r\n if (!serverConfig || typeof serverConfig !== 'object') {\r\n logWarning(`[MCP Config] Skipping invalid server entry: ${name}`);\r\n continue;\r\n }\r\n\r\n // Build server config with name from key\r\n const server: MCPServerConfig = {\r\n name,\r\n command: serverConfig.command,\r\n args: serverConfig.args,\r\n env: serverConfig.env,\r\n enabled: serverConfig.enabled,\r\n auth: serverConfig.auth\r\n };\r\n\r\n if (this.validateServerConfig(server)) {\r\n servers.push(this.sanitizeServerConfig(server));\r\n }\r\n }\r\n\r\n return { servers };\r\n }\r\n\r\n /**\r\n * Validate a server config has required fields\r\n */\r\n private validateServerConfig(config: any): boolean {\r\n if (!config || typeof config !== 'object') {\r\n return false;\r\n }\r\n\r\n if (!config.name || typeof config.name !== 'string') {\r\n logWarning('[MCP Config] Server missing required \"name\" field');\r\n return false;\r\n }\r\n\r\n if (!config.command || typeof config.command !== 'string') {\r\n logWarning(`[MCP Config] Server \"${config.name}\" missing required \"command\" field`);\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Sanitize and set defaults for server config\r\n */\r\n private sanitizeServerConfig(config: any): MCPServerConfig {\r\n return {\r\n name: config.name,\r\n command: config.command,\r\n args: Array.isArray(config.args) ? config.args : undefined,\r\n env: config.env && typeof config.env === 'object' ? config.env : undefined,\r\n enabled: config.enabled !== false, // Default to enabled\r\n auth: config.auth\r\n };\r\n }\r\n\r\n save(config: MCPConfig): void {\r\n try {\r\n const configDir = path.dirname(this.configPath);\r\n\r\n // Ensure config directory exists\r\n if (!fs.existsSync(configDir)) {\r\n fs.mkdirSync(configDir, { recursive: true });\r\n }\r\n\r\n // Convert to mcp_servers object format (preferred format)\r\n const mcpServersFormat: Record<string, any> = {};\r\n for (const server of config.servers) {\r\n const serverConfig: any = {\r\n command: server.command\r\n };\r\n if (server.args && server.args.length > 0) {\r\n serverConfig.args = server.args;\r\n }\r\n if (server.env && Object.keys(server.env).length > 0) {\r\n serverConfig.env = server.env;\r\n }\r\n if (server.enabled === false) {\r\n serverConfig.enabled = false;\r\n }\r\n if (server.auth) {\r\n serverConfig.auth = server.auth;\r\n }\r\n mcpServersFormat[server.name] = serverConfig;\r\n }\r\n\r\n const outputConfig = { mcp_servers: mcpServersFormat };\r\n fs.writeFileSync(this.configPath, JSON.stringify(outputConfig, null, 2), 'utf-8');\r\n this.config = config;\r\n } catch (error) {\r\n throw new Error(`Failed to save MCP config: ${error}`);\r\n }\r\n }\r\n\r\n getServers(): MCPServerConfig[] {\r\n return this.config.servers.filter(s => s.enabled !== false);\r\n }\r\n\r\n getAllServers(): MCPServerConfig[] {\r\n return this.config.servers;\r\n }\r\n\r\n /**\r\n * Reload config from disk into cache\r\n * Call this when user runs /mcp refresh\r\n */\r\n reload(): MCPConfig {\r\n this.config = this.load();\r\n return this.config;\r\n }\r\n\r\n addServer(server: MCPServerConfig): void {\r\n this.config.servers.push(server);\r\n this.save(this.config);\r\n }\r\n\r\n removeServer(name: string): void {\r\n this.config.servers = this.config.servers.filter(s => s.name !== name);\r\n this.save(this.config);\r\n }\r\n\r\n enableServer(name: string): void {\r\n const index = this.config.servers.findIndex(s => s.name === name);\r\n if (index !== -1) {\r\n this.config.servers[index].enabled = true;\r\n this.save(this.config);\r\n }\r\n }\r\n\r\n disableServer(name: string): void {\r\n const index = this.config.servers.findIndex(s => s.name === name);\r\n if (index !== -1) {\r\n this.config.servers[index].enabled = false;\r\n this.save(this.config);\r\n }\r\n }\r\n\r\n updateServer(name: string, updates: Partial<MCPServerConfig>): void {\r\n const index = this.config.servers.findIndex(s => s.name === name);\r\n if (index !== -1) {\r\n this.config.servers[index] = { ...this.config.servers[index], ...updates };\r\n this.save(this.config);\r\n }\r\n }\r\n\r\n /**\r\n * Validate a server config JSON string and return parsed config or error\r\n * Supports multiple formats:\r\n * 1. \"server-name\": {\"command\": \"...\", \"args\": [...]}\r\n * 2. {\"server-name\": {\"command\": \"...\", \"args\": [...]}}\r\n * 3. {\"mcpServers\": {\"server-name\": {\"command\": \"...\", \"args\": [...]}}}\r\n * 4. {\"name\": \"server-name\", \"command\": \"...\", \"args\": [...]}\r\n */\r\n validateServerConfigJSON(jsonString: string): { valid: boolean; config?: MCPServerConfig; error?: string } {\r\n try {\r\n let parsed: any;\r\n let parseErrorMsg = '';\r\n\r\n // Sanitize input (remove comments, trailing commas)\r\n const cleanJson = this.sanitizeJsonString(jsonString);\r\n\r\n // 1. Try direct parse\r\n try {\r\n parsed = JSON.parse(cleanJson);\r\n } catch (e1: any) {\r\n parseErrorMsg = e1.message;\r\n // 2. Try wrapping in braces (for pasted properties like \"key\": { ... })\r\n try {\r\n parsed = JSON.parse(`{${cleanJson}}`);\r\n } catch (e2) {\r\n // 3. Try appending closing brace (common copy-paste error)\r\n try {\r\n parsed = JSON.parse(`${cleanJson}}`);\r\n } catch (e3) {\r\n // 4. Try both\r\n try {\r\n parsed = JSON.parse(`{${cleanJson}}`);\r\n } catch (e4) {\r\n return { valid: false, error: `Invalid JSON: ${parseErrorMsg}` };\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Strategy: Extract server name and config from various formats\r\n\r\n // Check 1: Is the root itself a server config with \"name\" field?\r\n // Format: {\"name\": \"server-name\", \"command\": \"...\", \"args\": [...]}\r\n if (this.isValidServerShape(parsed) && parsed.name) {\r\n return this.finalizeValidation(parsed);\r\n }\r\n\r\n // Check 2: Is it wrapped in \"mcpServers\" or \"mcp_servers\"?\r\n // Format: {\"mcpServers\": {\"server-name\": {\"command\": \"...\", \"args\": [...]}}}\r\n const inner = parsed.mcpServers || parsed.mcp_servers || parsed.servers;\r\n if (inner && typeof inner === 'object') {\r\n // If array, take first\r\n if (Array.isArray(inner) && inner.length > 0 && this.isValidServerShape(inner[0])) {\r\n return this.finalizeValidation(inner[0]);\r\n }\r\n // If object, extract first server entry\r\n if (!Array.isArray(inner)) {\r\n const entries = Object.entries(inner);\r\n if (entries.length > 0) {\r\n const [serverName, serverConfig] = entries[0];\r\n if (this.isValidServerShape(serverConfig)) {\r\n // Inject key as name if missing\r\n const configWithName = { ...(serverConfig as any), name: serverName };\r\n return this.finalizeValidation(configWithName);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Check 3: Is it a single server entry without wrapper?\r\n // Format: {\"server-name\": {\"command\": \"...\", \"args\": [...]}}\r\n // or Format: \"server-name\": {\"command\": \"...\", \"args\": [...]}\r\n const entries = Object.entries(parsed);\r\n if (entries.length === 1) {\r\n const [serverName, serverConfig] = entries[0];\r\n // Skip known wrapper keys\r\n if (serverName !== 'mcpServers' && serverName !== 'servers' && serverName !== 'mcp_servers') {\r\n if (this.isValidServerShape(serverConfig)) {\r\n // Inject key as name\r\n const configWithName = { ...(serverConfig as any), name: serverName };\r\n return this.finalizeValidation(configWithName);\r\n }\r\n }\r\n }\r\n\r\n // Check 4: Multiple server entries - take the first one\r\n for (const [key, val] of entries) {\r\n if (key !== 'mcpServers' && key !== 'servers' && key !== 'mcp_servers' && this.isValidServerShape(val)) {\r\n // Inject key as name\r\n const configWithName = { ...(val as any), name: key };\r\n return this.finalizeValidation(configWithName);\r\n }\r\n }\r\n\r\n return { valid: false, error: 'Could not find a valid MCP server configuration (must have \"command\" field)' };\r\n\r\n } catch (parseError: any) {\r\n return { valid: false, error: `Unexpected error: ${parseError.message}` };\r\n }\r\n }\r\n\r\n private isValidServerShape(obj: any): boolean {\r\n return obj && typeof obj === 'object' && typeof obj.command === 'string';\r\n }\r\n\r\n private finalizeValidation(parsed: any): { valid: boolean; config?: MCPServerConfig; error?: string } {\r\n // Ensure name exists\r\n if (!parsed.name || typeof parsed.name !== 'string') {\r\n return { valid: false, error: 'Missing or invalid \"name\" field' };\r\n }\r\n\r\n // Trim and validate name\r\n const serverName = parsed.name.trim();\r\n if (!serverName) {\r\n return { valid: false, error: 'Server name cannot be empty' };\r\n }\r\n\r\n // Check for duplicate name\r\n const existingNames = this.config.servers.map(s => s.name.toLowerCase());\r\n if (existingNames.includes(serverName.toLowerCase())) {\r\n return { valid: false, error: `Server with name \"${serverName}\" already exists` };\r\n }\r\n\r\n // Validate optional fields\r\n if (parsed.args !== undefined && !Array.isArray(parsed.args)) {\r\n return { valid: false, error: '\"args\" must be an array of strings' };\r\n }\r\n if (parsed.env !== undefined && (typeof parsed.env !== 'object' || Array.isArray(parsed.env))) {\r\n return { valid: false, error: '\"env\" must be an object with string values' };\r\n }\r\n\r\n const config: MCPServerConfig = {\r\n name: serverName,\r\n command: parsed.command,\r\n args: Array.isArray(parsed.args) ? parsed.args : undefined,\r\n env: parsed.env && typeof parsed.env === 'object' ? parsed.env : undefined,\r\n enabled: parsed.enabled !== false,\r\n auth: parsed.auth\r\n };\r\n\r\n return { valid: true, config };\r\n }\r\n\r\n private getDefaultConfig(): MCPConfig {\r\n return {\r\n servers: []\r\n };\r\n }\r\n\r\n /**\r\n * Helper to clean up JSON string (remove comments, trailing commas)\r\n */\r\n private sanitizeJsonString(str: string): string {\n try {\n const withoutComments = this.stripCommentsOutsideStrings(str);\n return this.removeTrailingCommasOutsideStrings(withoutComments);\n } catch (e) {\n return str;\n }\n }\n\n /**\n * Remove JS-style comments from JSON-like input, but only when they appear\n * outside of quoted JSON strings (so values like \"https://...\" remain intact).\n */\n private stripCommentsOutsideStrings(input: string): string {\n let result = '';\n let inString = false;\n let escaped = false;\n let inLineComment = false;\n let inBlockComment = false;\n\n for (let i = 0; i < input.length; i++) {\n const char = input[i];\n const next = input[i + 1];\n\n if (inLineComment) {\n if (char === '\\n' || char === '\\r') {\n inLineComment = false;\n result += char;\n }\n continue;\n }\n\n if (inBlockComment) {\n if (char === '*' && next === '/') {\n inBlockComment = false;\n i++; // Skip '/'\n continue;\n }\n\n // Preserve newlines so JSON parser line/column errors remain useful\n if (char === '\\n' || char === '\\r') {\n result += char;\n }\n continue;\n }\n\n if (inString) {\n result += char;\n\n if (escaped) {\n escaped = false;\n } else if (char === '\\\\') {\n escaped = true;\n } else if (char === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (char === '\"') {\n inString = true;\n result += char;\n continue;\n }\n\n if (char === '/' && next === '/') {\n inLineComment = true;\n i++; // Skip second '/'\n continue;\n }\n\n if (char === '/' && next === '*') {\n inBlockComment = true;\n i++; // Skip '*'\n continue;\n }\n\n result += char;\n }\n\n return result;\n }\n\n /**\n * Remove trailing commas before closing } or ], while respecting strings.\n */\n private removeTrailingCommasOutsideStrings(input: string): string {\n let result = '';\n let inString = false;\n let escaped = false;\n\n for (let i = 0; i < input.length; i++) {\n const char = input[i];\n\n if (inString) {\n result += char;\n\n if (escaped) {\n escaped = false;\n } else if (char === '\\\\') {\n escaped = true;\n } else if (char === '\"') {\n inString = false;\n }\n continue;\n }\n\n if (char === '\"') {\n inString = true;\n result += char;\n continue;\n }\n\n if (char === ',') {\n let j = i + 1;\n while (j < input.length && /\\s/.test(input[j])) {\n j++;\n }\n\n const nextNonWhitespace = input[j];\n if (nextNonWhitespace === '}' || nextNonWhitespace === ']') {\n continue;\n }\n }\n\n result += char;\n }\n\n return result;\n }\n\r\n createExampleConfig(): void {\r\n const exampleConfig: MCPConfig = {\r\n servers: [\r\n {\r\n name: 'example-filesystem',\r\n command: 'npx',\r\n args: ['-y', '@modelcontextprotocol/server-filesystem', os.homedir()],\r\n enabled: false\r\n }\r\n ]\r\n };\r\n\r\n if (!fs.existsSync(this.configPath)) {\r\n this.save(exampleConfig);\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":["entries"]}
|
package/dist/config/models.js
CHANGED
|
@@ -1,205 +1,138 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
*/
|
|
5
|
-
import { apiClient } from '../services/api-client.js';
|
|
6
|
-
import { logWarning } from '../utils/logger.js';
|
|
7
|
-
import { quickLog } from '../utils/conversation-logger.js';
|
|
8
|
-
/**
|
|
9
|
-
* Cached models configuration
|
|
10
|
-
* Fetched once per session from backend
|
|
11
|
-
*/
|
|
1
|
+
import { apiClient } from "../services/api-client.js";
|
|
2
|
+
import { logWarning } from "../utils/logger.js";
|
|
3
|
+
import { quickLog } from "../utils/conversation-logger.js";
|
|
12
4
|
let cachedConfig = null;
|
|
13
5
|
let fetchPromise = null;
|
|
14
|
-
/**
|
|
15
|
-
* Default fallback configuration when backend is unavailable
|
|
16
|
-
*/
|
|
17
6
|
const FALLBACK_CONFIG = {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
34
|
-
],
|
|
35
|
-
defaultModel: 'gemini-2.5-flash'
|
|
36
|
-
};
|
|
37
|
-
/**
|
|
38
|
-
* Fetch models configuration from backend (with caching)
|
|
39
|
-
* This is the main entry point for getting model config
|
|
40
|
-
*/
|
|
41
|
-
export async function fetchModelsConfig() {
|
|
42
|
-
// Return cached config if available
|
|
43
|
-
if (cachedConfig) {
|
|
44
|
-
return cachedConfig;
|
|
45
|
-
}
|
|
46
|
-
// If a fetch is already in progress, wait for it
|
|
47
|
-
if (fetchPromise) {
|
|
48
|
-
return fetchPromise;
|
|
7
|
+
models: [
|
|
8
|
+
{
|
|
9
|
+
id: "gemini-2.5-flash",
|
|
10
|
+
name: "Gemini 2.5 Flash",
|
|
11
|
+
description: "Fast and efficient",
|
|
12
|
+
provider: "google",
|
|
13
|
+
contextWindow: 1e6,
|
|
14
|
+
region: "us-central1",
|
|
15
|
+
supportsThinking: true,
|
|
16
|
+
thinkingConfig: { thinking_config: { include_thoughts: true } },
|
|
17
|
+
generationConfig: {
|
|
18
|
+
temperature: 0.1,
|
|
19
|
+
topP: 0.95,
|
|
20
|
+
maxOutputTokens: 16384
|
|
21
|
+
}
|
|
49
22
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
// On error, use fallback config
|
|
59
|
-
logWarning('Failed to fetch models config from backend, using fallback');
|
|
60
|
-
cachedConfig = FALLBACK_CONFIG;
|
|
61
|
-
return FALLBACK_CONFIG;
|
|
62
|
-
}
|
|
63
|
-
finally {
|
|
64
|
-
fetchPromise = null;
|
|
65
|
-
}
|
|
66
|
-
})();
|
|
23
|
+
],
|
|
24
|
+
defaultModel: "gemini-2.5-flash"
|
|
25
|
+
};
|
|
26
|
+
async function fetchModelsConfig() {
|
|
27
|
+
if (cachedConfig) {
|
|
28
|
+
return cachedConfig;
|
|
29
|
+
}
|
|
30
|
+
if (fetchPromise) {
|
|
67
31
|
return fetchPromise;
|
|
32
|
+
}
|
|
33
|
+
fetchPromise = (async () => {
|
|
34
|
+
try {
|
|
35
|
+
const config = await apiClient.getModelsConfig();
|
|
36
|
+
cachedConfig = config;
|
|
37
|
+
return config;
|
|
38
|
+
} catch (error) {
|
|
39
|
+
logWarning("Failed to fetch models config from backend, using fallback");
|
|
40
|
+
cachedConfig = FALLBACK_CONFIG;
|
|
41
|
+
return FALLBACK_CONFIG;
|
|
42
|
+
} finally {
|
|
43
|
+
fetchPromise = null;
|
|
44
|
+
}
|
|
45
|
+
})();
|
|
46
|
+
return fetchPromise;
|
|
68
47
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
export function clearModelsCache() {
|
|
73
|
-
cachedConfig = null;
|
|
74
|
-
fetchPromise = null;
|
|
48
|
+
function clearModelsCache() {
|
|
49
|
+
cachedConfig = null;
|
|
50
|
+
fetchPromise = null;
|
|
75
51
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
if (cachedConfig) {
|
|
88
|
-
const model = cachedConfig.models.find(m => m.name.toLowerCase() === modelNameOrId.toLowerCase() ||
|
|
89
|
-
m.id.toLowerCase() === modelNameOrId.toLowerCase());
|
|
90
|
-
if (model) {
|
|
91
|
-
quickLog(`[${new Date().toISOString()}] [getModelContextWindowSync] Found model "${model.name}" with contextWindow: ${model.contextWindow}\n`);
|
|
92
|
-
return model.contextWindow;
|
|
93
|
-
}
|
|
94
|
-
quickLog(`[${new Date().toISOString()}] [getModelContextWindowSync] Model NOT found in cache. Available: ${cachedConfig.models.map(m => m.name).join(', ')}\n`);
|
|
52
|
+
function getModelContextWindowSync(modelNameOrId) {
|
|
53
|
+
quickLog(`[${(/* @__PURE__ */ new Date()).toISOString()}] [getModelContextWindowSync] Looking up: "${modelNameOrId}", cache populated: ${!!cachedConfig}, models in cache: ${cachedConfig?.models?.length || 0}
|
|
54
|
+
`);
|
|
55
|
+
if (cachedConfig) {
|
|
56
|
+
const model = cachedConfig.models.find(
|
|
57
|
+
(m) => m.name.toLowerCase() === modelNameOrId.toLowerCase() || m.id.toLowerCase() === modelNameOrId.toLowerCase()
|
|
58
|
+
);
|
|
59
|
+
if (model) {
|
|
60
|
+
quickLog(`[${(/* @__PURE__ */ new Date()).toISOString()}] [getModelContextWindowSync] Found model "${model.name}" with contextWindow: ${model.contextWindow}
|
|
61
|
+
`);
|
|
62
|
+
return model.contextWindow;
|
|
95
63
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
return 1000000; // Default 1M tokens
|
|
64
|
+
quickLog(`[${(/* @__PURE__ */ new Date()).toISOString()}] [getModelContextWindowSync] Model NOT found in cache. Available: ${cachedConfig.models.map((m) => m.name).join(", ")}
|
|
65
|
+
`);
|
|
66
|
+
}
|
|
67
|
+
const nameLower = modelNameOrId.toLowerCase();
|
|
68
|
+
if (nameLower.includes("kimi")) return 128e3;
|
|
69
|
+
if (nameLower.includes("glm")) return 128e3;
|
|
70
|
+
if (nameLower.includes("gemini")) return 1e6;
|
|
71
|
+
return 1e6;
|
|
105
72
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
*/
|
|
110
|
-
export async function getAllModelConfigs() {
|
|
111
|
-
const config = await fetchModelsConfig();
|
|
112
|
-
return config.models;
|
|
73
|
+
async function getAllModelConfigs() {
|
|
74
|
+
const config = await fetchModelsConfig();
|
|
75
|
+
return config.models;
|
|
113
76
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
* @returns Promise resolving to model configuration or undefined
|
|
118
|
-
*/
|
|
119
|
-
export async function getModelConfig(modelId) {
|
|
120
|
-
const config = await fetchModelsConfig();
|
|
121
|
-
return config.models.find(m => m.id === modelId);
|
|
77
|
+
async function getModelConfig(modelId) {
|
|
78
|
+
const config = await fetchModelsConfig();
|
|
79
|
+
return config.models.find((m) => m.id === modelId);
|
|
122
80
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
* @param modelName - Model display name
|
|
127
|
-
* @returns Promise resolving to model configuration or undefined
|
|
128
|
-
*/
|
|
129
|
-
export async function getModelConfigByIdAndName(modelId, modelName) {
|
|
130
|
-
const config = await fetchModelsConfig();
|
|
131
|
-
return config.models.find(m => m.id === modelId && m.name === modelName);
|
|
81
|
+
async function getModelConfigByIdAndName(modelId, modelName) {
|
|
82
|
+
const config = await fetchModelsConfig();
|
|
83
|
+
return config.models.find((m) => m.id === modelId && m.name === modelName);
|
|
132
84
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
*/
|
|
137
|
-
export async function getDefaultModel() {
|
|
138
|
-
const config = await fetchModelsConfig();
|
|
139
|
-
return config.defaultModel;
|
|
85
|
+
async function getDefaultModel() {
|
|
86
|
+
const config = await fetchModelsConfig();
|
|
87
|
+
return config.defaultModel;
|
|
140
88
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
*/
|
|
146
|
-
export async function getSupportedModels() {
|
|
147
|
-
const config = await fetchModelsConfig();
|
|
148
|
-
// Backend already filters allowFrontendDisplay: false, but we check here too for robustness
|
|
149
|
-
const userFacingModels = config.models.filter(m => m.allowFrontendDisplay !== false);
|
|
150
|
-
return Array.from(new Set(userFacingModels.map(m => m.id)));
|
|
89
|
+
async function getSupportedModels() {
|
|
90
|
+
const config = await fetchModelsConfig();
|
|
91
|
+
const userFacingModels = config.models.filter((m) => m.allowFrontendDisplay !== false);
|
|
92
|
+
return Array.from(new Set(userFacingModels.map((m) => m.id)));
|
|
151
93
|
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
* @returns Promise resolving to true if model is supported
|
|
156
|
-
*/
|
|
157
|
-
export async function isValidModel(model) {
|
|
158
|
-
const models = await getSupportedModels();
|
|
159
|
-
return models.includes(model);
|
|
94
|
+
async function isValidModel(model) {
|
|
95
|
+
const models = await getSupportedModels();
|
|
96
|
+
return models.includes(model);
|
|
160
97
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
return `Invalid model: ${invalidModel}\n\n` +
|
|
171
|
-
`Supported models:\n` +
|
|
172
|
-
userFacingModels.map(m => ` - ${m.id} (${m.name})`).join('\n') +
|
|
173
|
-
`\n\nUse /model to select from available models.`;
|
|
98
|
+
async function getInvalidModelError(invalidModel) {
|
|
99
|
+
const config = await fetchModelsConfig();
|
|
100
|
+
const userFacingModels = config.models.filter((m) => m.allowFrontendDisplay !== false);
|
|
101
|
+
return `Invalid model: ${invalidModel}
|
|
102
|
+
|
|
103
|
+
Supported models:
|
|
104
|
+
` + userFacingModels.map((m) => ` - ${m.id} (${m.name})`).join("\n") + `
|
|
105
|
+
|
|
106
|
+
Use /model to select from available models.`;
|
|
174
107
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
const config = await getModelConfig(model);
|
|
182
|
-
if (config) {
|
|
183
|
-
return `${config.name} - ${config.description}`;
|
|
184
|
-
}
|
|
185
|
-
return model;
|
|
108
|
+
async function getModelDisplayName(model) {
|
|
109
|
+
const config = await getModelConfig(model);
|
|
110
|
+
if (config) {
|
|
111
|
+
return `${config.name} - ${config.description}`;
|
|
112
|
+
}
|
|
113
|
+
return model;
|
|
186
114
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
* @returns Promise resolving to context window size in tokens
|
|
191
|
-
*/
|
|
192
|
-
export async function getModelContextWindow(model) {
|
|
193
|
-
const config = await getModelConfig(model);
|
|
194
|
-
return config?.contextWindow || 2000000; // Default 2M tokens
|
|
115
|
+
async function getModelContextWindow(model) {
|
|
116
|
+
const config = await getModelConfig(model);
|
|
117
|
+
return config?.contextWindow || 2e6;
|
|
195
118
|
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
* @returns Promise resolving to true if model supports thinking
|
|
200
|
-
*/
|
|
201
|
-
export async function modelSupportsThinking(model) {
|
|
202
|
-
const config = await getModelConfig(model);
|
|
203
|
-
return config?.supportsThinking || false;
|
|
119
|
+
async function modelSupportsThinking(model) {
|
|
120
|
+
const config = await getModelConfig(model);
|
|
121
|
+
return config?.supportsThinking || false;
|
|
204
122
|
}
|
|
123
|
+
export {
|
|
124
|
+
clearModelsCache,
|
|
125
|
+
fetchModelsConfig,
|
|
126
|
+
getAllModelConfigs,
|
|
127
|
+
getDefaultModel,
|
|
128
|
+
getInvalidModelError,
|
|
129
|
+
getModelConfig,
|
|
130
|
+
getModelConfigByIdAndName,
|
|
131
|
+
getModelContextWindow,
|
|
132
|
+
getModelContextWindowSync,
|
|
133
|
+
getModelDisplayName,
|
|
134
|
+
getSupportedModels,
|
|
135
|
+
isValidModel,
|
|
136
|
+
modelSupportsThinking
|
|
137
|
+
};
|
|
205
138
|
//# sourceMappingURL=models.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/config/models.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAA6B,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAK3D;;;GAGG;AACH,IAAI,YAAY,GAAwB,IAAI,CAAC;AAC7C,IAAI,YAAY,GAAiC,IAAI,CAAC;AAEtD;;GAEG;AACH,MAAM,eAAe,GAAiB;IACpC,MAAM,EAAE;QACN;YACE,EAAE,EAAE,kBAAkB;YACtB,IAAI,EAAE,kBAAkB;YACxB,WAAW,EAAE,oBAAoB;YACjC,QAAQ,EAAE,QAAQ;YAClB,aAAa,EAAE,OAAO;YACtB,MAAM,EAAE,aAAa;YACrB,gBAAgB,EAAE,IAAI;YACtB,cAAc,EAAE,EAAE,eAAe,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,EAAE;YAC/D,gBAAgB,EAAE;gBAChB,WAAW,EAAE,GAAG;gBAChB,IAAI,EAAE,IAAI;gBACV,eAAe,EAAE,KAAK;aACvB;SACF;KACF;IACD,YAAY,EAAE,kBAAkB;CACjC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,oCAAoC;IACpC,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,iDAAiD;IACjD,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,8BAA8B;IAC9B,YAAY,GAAG,CAAC,KAAK,IAAI,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,eAAe,EAAE,CAAC;YACjD,YAAY,GAAG,MAAM,CAAC;YACtB,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gCAAgC;YAChC,UAAU,CAAC,4DAA4D,CAAC,CAAC;YACzE,YAAY,GAAG,eAAe,CAAC;YAC/B,OAAO,eAAe,CAAC;QACzB,CAAC;gBAAS,CAAC;YACT,YAAY,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,YAAY,GAAG,IAAI,CAAC;IACpB,YAAY,GAAG,IAAI,CAAC;AACtB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,aAAqB;IAC7D,iCAAiC;IACjC,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,8CAA8C,aAAa,uBAAuB,CAAC,CAAC,YAAY,sBAAsB,YAAY,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;IAElM,6BAA6B;IAC7B,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACzC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,aAAa,CAAC,WAAW,EAAE;YACpD,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,aAAa,CAAC,WAAW,EAAE,CACnD,CAAC;QACF,IAAI,KAAK,EAAE,CAAC;YACV,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,8CAA8C,KAAK,CAAC,IAAI,yBAAyB,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC;YAC/I,OAAO,KAAK,CAAC,aAAa,CAAC;QAC7B,CAAC;QACD,QAAQ,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,sEAAsE,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClK,CAAC;IAED,4CAA4C;IAC5C,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;IAC9C,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAC7C,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,OAAO,CAAC;IACjD,OAAO,OAAO,CAAC,CAAC,oBAAoB;AACtC,CAAC;AAGD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACzC,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe;IAClD,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACzC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;AACnD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,OAAe,EAAE,SAAiB;IAChF,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACzC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;AAC3E,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACzC,OAAO,MAAM,CAAC,YAAY,CAAC;AAC7B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACzC,4FAA4F;IAC5F,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB,KAAK,KAAK,CAAC,CAAC;IACrF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa;IAC9C,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC1C,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,YAAoB;IAC7D,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACzC,+BAA+B;IAC/B,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB,KAAK,KAAK,CAAC,CAAC;IACrF,OAAO,kBAAkB,YAAY,MAAM;QACzC,qBAAqB;QACrB,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/D,iDAAiD,CAAC;AACtD,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAAa;IACrD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,GAAG,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;IAClD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAAa;IACvD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,MAAM,EAAE,aAAa,IAAI,OAAO,CAAC,CAAC,oBAAoB;AAC/D,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAAa;IACvD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,KAAK,CAAC,CAAC;IAC3C,OAAO,MAAM,EAAE,gBAAgB,IAAI,KAAK,CAAC;AAC3C,CAAC"}
|
|
1
|
+
{"version":3,"sources":["../../src/config/models.ts"],"sourcesContent":["/**\r\n * Supported AI models\r\n * Fetched from backend API with caching\r\n */\r\n\r\nimport { apiClient, ModelConfig, ModelsConfig } from '../services/api-client.js';\r\nimport { logWarning } from '../utils/logger.js';\r\nimport { quickLog } from '../utils/conversation-logger.js';\r\n\r\n// Re-export types\r\nexport type { ModelConfig, ModelsConfig };\r\n\r\n/**\r\n * Cached models configuration\r\n * Fetched once per session from backend\r\n */\r\nlet cachedConfig: ModelsConfig | null = null;\r\nlet fetchPromise: Promise<ModelsConfig> | null = null;\r\n\r\n/**\r\n * Default fallback configuration when backend is unavailable\r\n */\r\nconst FALLBACK_CONFIG: ModelsConfig = {\r\n models: [\r\n {\r\n id: 'gemini-2.5-flash',\r\n name: 'Gemini 2.5 Flash',\r\n description: 'Fast and efficient',\r\n provider: 'google',\r\n contextWindow: 1000000,\r\n region: 'us-central1',\r\n supportsThinking: true,\r\n thinkingConfig: { thinking_config: { include_thoughts: true } },\r\n generationConfig: {\r\n temperature: 0.1,\r\n topP: 0.95,\r\n maxOutputTokens: 16384\r\n }\r\n }\r\n ],\r\n defaultModel: 'gemini-2.5-flash'\r\n};\r\n\r\n/**\r\n * Fetch models configuration from backend (with caching)\r\n * This is the main entry point for getting model config\r\n */\r\nexport async function fetchModelsConfig(): Promise<ModelsConfig> {\r\n // Return cached config if available\r\n if (cachedConfig) {\r\n return cachedConfig;\r\n }\r\n\r\n // If a fetch is already in progress, wait for it\r\n if (fetchPromise) {\r\n return fetchPromise;\r\n }\r\n\r\n // Start fetching from backend\r\n fetchPromise = (async () => {\r\n try {\r\n const config = await apiClient.getModelsConfig();\r\n cachedConfig = config;\r\n return config;\r\n } catch (error) {\r\n // On error, use fallback config\r\n logWarning('Failed to fetch models config from backend, using fallback');\r\n cachedConfig = FALLBACK_CONFIG;\r\n return FALLBACK_CONFIG;\r\n } finally {\r\n fetchPromise = null;\r\n }\r\n })();\r\n\r\n return fetchPromise;\r\n}\r\n\r\n/**\r\n * Clear cached config (useful for refreshing)\r\n */\r\nexport function clearModelsCache(): void {\r\n cachedConfig = null;\r\n fetchPromise = null;\r\n}\r\n\r\n/**\r\n * Get context window size for a model SYNCHRONOUSLY from cache\r\n * This is useful for UI components that need immediate values\r\n * Returns fallback defaults if cache is not yet populated\r\n * @param modelNameOrId - Model name or ID (case-insensitive search)\r\n * @returns Context window size in tokens\r\n */\r\nexport function getModelContextWindowSync(modelNameOrId: string): number {\r\n // DEBUG: Log cache state to file\r\n quickLog(`[${new Date().toISOString()}] [getModelContextWindowSync] Looking up: \"${modelNameOrId}\", cache populated: ${!!cachedConfig}, models in cache: ${cachedConfig?.models?.length || 0}\\n`);\r\n\r\n // Try to find in cache first\r\n if (cachedConfig) {\r\n const model = cachedConfig.models.find(m =>\r\n m.name.toLowerCase() === modelNameOrId.toLowerCase() ||\r\n m.id.toLowerCase() === modelNameOrId.toLowerCase()\r\n );\r\n if (model) {\r\n quickLog(`[${new Date().toISOString()}] [getModelContextWindowSync] Found model \"${model.name}\" with contextWindow: ${model.contextWindow}\\n`);\r\n return model.contextWindow;\r\n }\r\n quickLog(`[${new Date().toISOString()}] [getModelContextWindowSync] Model NOT found in cache. Available: ${cachedConfig.models.map(m => m.name).join(', ')}\\n`);\r\n }\r\n\r\n // Fallback defaults based on known patterns\r\n const nameLower = modelNameOrId.toLowerCase();\r\n if (nameLower.includes('kimi')) return 128000;\r\n if (nameLower.includes('glm')) return 128000;\r\n if (nameLower.includes('gemini')) return 1000000;\r\n return 1000000; // Default 1M tokens\r\n}\r\n\r\n\r\n/**\r\n * Get all model configurations (async)\r\n * @returns Promise resolving to array of all model configurations\r\n */\r\nexport async function getAllModelConfigs(): Promise<ModelConfig[]> {\r\n const config = await fetchModelsConfig();\r\n return config.models;\r\n}\r\n\r\n/**\r\n * Get model configuration by ID (async)\r\n * @param modelId - Model ID\r\n * @returns Promise resolving to model configuration or undefined\r\n */\r\nexport async function getModelConfig(modelId: string): Promise<ModelConfig | undefined> {\r\n const config = await fetchModelsConfig();\r\n return config.models.find(m => m.id === modelId);\r\n}\r\n\r\n/**\r\n * Get model configuration by ID and name (for duplicate model IDs with different configs)\r\n * @param modelId - Model ID\r\n * @param modelName - Model display name\r\n * @returns Promise resolving to model configuration or undefined\r\n */\r\nexport async function getModelConfigByIdAndName(modelId: string, modelName: string): Promise<ModelConfig | undefined> {\r\n const config = await fetchModelsConfig();\r\n return config.models.find(m => m.id === modelId && m.name === modelName);\r\n}\r\n\r\n/**\r\n * Get default model ID (async)\r\n * @returns Promise resolving to default model ID\r\n */\r\nexport async function getDefaultModel(): Promise<string> {\r\n const config = await fetchModelsConfig();\r\n return config.defaultModel;\r\n}\r\n\r\n/**\r\n * Get list of supported model IDs (unique) (async)\r\n * Excludes internal models that are not meant to be user-selectable\r\n * @returns Promise resolving to array of unique model IDs\r\n */\r\nexport async function getSupportedModels(): Promise<string[]> {\r\n const config = await fetchModelsConfig();\r\n // Backend already filters allowFrontendDisplay: false, but we check here too for robustness\r\n const userFacingModels = config.models.filter(m => m.allowFrontendDisplay !== false);\r\n return Array.from(new Set(userFacingModels.map(m => m.id)));\r\n}\r\n\r\n/**\r\n * Validate if a model name is supported (async)\r\n * @param model - Model name to validate\r\n * @returns Promise resolving to true if model is supported\r\n */\r\nexport async function isValidModel(model: string): Promise<boolean> {\r\n const models = await getSupportedModels();\r\n return models.includes(model);\r\n}\r\n\r\n/**\r\n * Get a user-friendly error message for invalid models (async)\r\n * @param invalidModel - The invalid model name\r\n * @returns Promise resolving to error message with list of valid models\r\n */\r\nexport async function getInvalidModelError(invalidModel: string): Promise<string> {\r\n const config = await fetchModelsConfig();\r\n // Only show user-facing models\r\n const userFacingModels = config.models.filter(m => m.allowFrontendDisplay !== false);\r\n return `Invalid model: ${invalidModel}\\n\\n` +\r\n `Supported models:\\n` +\r\n userFacingModels.map(m => ` - ${m.id} (${m.name})`).join('\\n') +\r\n `\\n\\nUse /model to select from available models.`;\r\n}\r\n\r\n/**\r\n * Get model display name with description (async)\r\n * @param model - Model ID\r\n * @returns Promise resolving to display name with description\r\n */\r\nexport async function getModelDisplayName(model: string): Promise<string> {\r\n const config = await getModelConfig(model);\r\n if (config) {\r\n return `${config.name} - ${config.description}`;\r\n }\r\n return model;\r\n}\r\n\r\n/**\r\n * Get context window size for a model (async)\r\n * @param model - Model ID\r\n * @returns Promise resolving to context window size in tokens\r\n */\r\nexport async function getModelContextWindow(model: string): Promise<number> {\r\n const config = await getModelConfig(model);\r\n return config?.contextWindow || 2000000; // Default 2M tokens\r\n}\r\n\r\n/**\r\n * Check if model supports thinking (async)\r\n * @param model - Model ID\r\n * @returns Promise resolving to true if model supports thinking\r\n */\r\nexport async function modelSupportsThinking(model: string): Promise<boolean> {\r\n const config = await getModelConfig(model);\r\n return config?.supportsThinking || false;\r\n}\r\n\r\n\r\n"],"mappings":"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","names":[]}
|