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":"api-client.js","sourceRoot":"","sources":["../../src/services/api-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAoC,MAAM,OAAO,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AACpF,OAAO,EAAE,IAAI,EAAW,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAClG,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AA0I9C;;GAEG;AACH,MAAM,SAAS;IACL,MAAM,GAAyB,IAAI,CAAC;IACpC,YAAY,GAAkB,IAAI,CAAC;IACnC,UAAU,CAAS;IACnB,SAAS,CAAS;IAE1B;QACE,yDAAyD;QACzD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAEvD,qCAAqC;QACrC,IAAI,CAAC,WAAW,EAAE,CAAC;QAEnB,uDAAuD;QACvD,uDAAuD;IACzD,CAAC;IAED;;OAEG;IACK,WAAW,CAAI,QAAkC;QACvD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACpE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAS,CAAC;IACjC,CAAC;IAED;;;OAGG;IACK,SAAS;QACf,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,mEAAmE;YACnE,+EAA+E;YAE/E,wEAAwE;YACxE,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,sBAAsB,CAAC;YAExE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;gBACzB,OAAO;gBACP,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;iBACnC;aACF,CAAC,CAAC;YAEH,wEAAwE;YACxE,IAAI,CAAC,SAAS,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CACvC,CAAC,MAAM,EAAE,EAAE;gBACT,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;oBACtB,MAAM,CAAC,OAAO,CAAC,aAAa,GAAG,UAAU,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC/D,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC,EACD,CAAC,KAAK,EAAE,EAAE;gBACR,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC,CACF,CAAC;YAEF,oEAAoE;YACpE,IAAI,CAAC,SAAS,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CACxC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EACtB,KAAK,EAAE,KAAiB,EAAE,EAAE;gBAC1B,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;oBACnC,wBAAwB;oBACxB,IAAI,CAAC,YAAY,EAAE,CAAC;oBAEpB,oCAAoC;oBACpC,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;oBACtE,SAAS,CAAC,IAAI,GAAG,qBAAqB,CAAC;oBACvC,MAAM,SAAS,CAAC;gBAClB,CAAC;gBAED,mEAAmE;gBACnE,IAAI,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;oBACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAmB,CAAC;oBACpD,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;wBACnB,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBACtD,WAAW,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;wBACvC,MAAM,WAAW,CAAC;oBACpB,CAAC;gBACH,CAAC;gBAED,MAAM,KAAK,CAAC;YACd,CAAC,CACF,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;OAEG;IACK,WAAW;QACjB,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;gBACpD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC;YACnD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,6DAA6D;YAC7D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,KAAa,EAAE,SAAkB;QACnD,IAAI,CAAC;YACH,iCAAiC;YACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBAChC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9D,CAAC;YAED,oBAAoB;YACpB,MAAM,WAAW,GAAG;gBAClB,YAAY,EAAE,KAAK;gBACnB,SAAS,EAAE,SAAS,IAAI,IAAI;gBAC5B,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAClC,CAAC;YAEF,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACzG,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,wBAAwB,EAAE,KAAc,CAAC,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,YAAY;QAClB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBAChC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sCAAsC;QACxC,CAAC;IACH,CAAC;IAED;;OAEG;IACI,eAAe;QACpB,OAAO,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC;IACpC,CAAC;IAED,mEAAmE;IAEnE;;;;OAIG;IACH,KAAK,CAAC,cAAc,CAAC,WAAmB;QACtC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAC1C,mBAAmB,EACnB,EAAE,WAAW,EAAE,CAChB,CAAC;QACF,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,KAAa;QAC5C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAC1C,uBAAuB,EACvB,EAAE,IAAI,EAAE,KAAK,EAAE,CAChB,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;QAE5D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;OAIG;IACH,eAAe,CAAC,YAAoB,EAAE,IAAU;QAC9C,0CAA0C;QAC1C,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QAC7B,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QAE5C,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc;QAClB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAC1C,eAAe,CAChB,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,YAAY,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;QAElE,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9C,CAAC;gBAAS,CAAC;YACT,qDAAqD;YACrD,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,cAAc;QAClB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAA2B,UAAU,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,iEAAiE;IAEjE;;;;OAIG;IACH,KAAK,CAAC,kBAAkB,CAAC,IAA+B;QACtD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAC1C,gBAAgB,EAChB,IAAI,CACL,CAAC;QACF,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,gBAAgB,CAAC,MAKtB;QACC,MAAM,WAAW,GAAQ;YACvB,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC;YACvB,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE;SAC3B,CAAC;QAEF,IAAI,MAAM,EAAE,eAAe,KAAK,SAAS,EAAE,CAAC;YAC1C,WAAW,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QACvD,CAAC;QAED,IAAI,MAAM,EAAE,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,WAAW,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CACzC,gBAAgB,EAChB,EAAE,MAAM,EAAE,WAAW,EAAE,CACxB,CAAC;QAEF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,eAAe,CAAC,cAAsB;QAC1C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CACzC,kBAAkB,cAAc,EAAE,CACnC,CAAC;QACF,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,kBAAkB,CACtB,cAAsB,EACtB,IAA+B;QAE/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CACzC,kBAAkB,cAAc,EAAE,EAClC,IAAI,CACL,CAAC;QACF,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,kBAAkB,CAAC,cAAsB;QAC7C,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,kBAAkB,cAAc,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,4DAA4D;IAE5D;;;;;OAKG;IACH,KAAK,CAAC,UAAU,CACd,cAAsB,EACtB,OAA6B;QAE7B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAC1C,kBAAkB,cAAc,WAAW,EAC3C,OAAO,CACR,CAAC;QACF,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,WAAW,CACf,cAAsB,EACtB,MAA0C;QAE1C,MAAM,WAAW,GAAG;YAClB,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC;YACvB,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE;SAC3B,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CACzC,kBAAkB,cAAc,WAAW,EAC3C,EAAE,MAAM,EAAE,WAAW,EAAE,CACxB,CAAC;QAEF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,6DAA6D;IAE7D;;;OAGG;IACH,KAAK,CAAC,WAAW;QACf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAA4B,WAAW,CAAC,CAAC;QACpF,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,cAAc,CAAC,QAA+B;QAClD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CACzC,WAAW,EACX,QAAQ,CACT,CAAC;QACF,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,yEAAyE;IAEzE;;;;OAIG;IACH,KAAK,CAAC,eAAe;QACnB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAA4B,gBAAgB,CAAC,CAAC;QACzF,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,8EAA8E;IAE9E;;;;OAIG;IACH,KAAK,CAAC,mBAAmB;QAMvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAKvC,sBAAsB,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,mEAAmE;IAEnE;;;;OAIG;IACH,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAC1C,WAAW,EACX,EAAE,IAAI,EAAE,CACT,CAAC;YACF,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,uDAAuD;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,gEAAgE;IAEhE;;;;;;;OAOG;IACH,KAAK,CAAC,UAAU,CACd,cAAsB,EACtB,QAAgB,EAChB,QAAgB,EAChB,QAAgB;QAWhB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CASxC,eAAe,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9G,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,uBAAuB,CAAC,cAAsB;QAClD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,uBAAuB,cAAc,EAAE,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,2EAA2E;YAC3E,uEAAuE;QACzE,CAAC;IACH,CAAC;IAED,yDAAyD;IAEzD;;;;OAIG;IACH,KAAK,CAAC,cAAc,CAAC,QAAa;QAKhC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAIxC,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW;QAOf,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAMvC,OAAO,CAAC,CAAC;YACb,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,EAAE,CAAC;gBACnC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,mEAAmE;IAEnE;;;;;;OAMG;IACH,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,QAAe;QAC9C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,IAAI,CAC1C,kBAAkB,EAClB,EAAE,KAAK,EAAE,QAAQ,EAAE,CACpB,CAAC;YACF,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,IAAI,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,QAAQ,CAAC,gCAAgC,EAAE,KAAc,CAAC,CAAC;YAE3D,yCAAyC;YACzC,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBACnD,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC5F,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;YAC9B,CAAC,EAAE,CAAC,CAAC,CAAC;YAEN,wDAAwD;YACxD,+CAA+C;YAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,yDAAyD;IAEzD;;;OAGG;IACH,KAAK,CAAC,WAAW;QAMf,mDAAmD;QACnD,gDAAgD;QAChD,oDAAoD;QACpD,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,sBAAsB,CAAC;QACxE,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAErD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAmB,SAAS,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;CACF;AAED,4BAA4B;AAC5B,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"sources":["../../src/services/api-client.ts"],"sourcesContent":["/**\r\n * API Client Service for Centaurus CLI\r\n * \r\n * Handles all communication with the backend REST API including:\r\n * - Authentication and session management\r\n * - Conversation and message operations\r\n * - User settings management\r\n * - API key storage and retrieval\r\n */\r\n\r\nimport axios, { AxiosInstance, AxiosError } from 'axios';\r\nimport { readFileSync, writeFileSync, mkdirSync, existsSync, unlinkSync } from 'fs';\r\nimport { join, dirname } from 'path';\r\nimport { homedir } from 'os';\r\nimport { IS_DEV_BUILD, DEV_BACKEND_URL, PRODUCTION_BACKEND_URL } from '../config/build-config.js';\r\nimport { logError } from '../utils/logger.js';\r\n\r\n/**\r\n * Type definitions for API requests and responses\r\n */\r\n\r\n// Authentication types\r\ninterface GoogleAuthInitResponse {\r\n authUrl: string;\r\n state: string;\r\n}\r\n\r\ninterface AuthResponse {\r\n sessionToken: string;\r\n expiresAt: string;\r\n user: {\r\n id: string;\r\n email: string;\r\n fullName: string;\r\n avatarUrl?: string;\r\n };\r\n}\r\n\r\ninterface UserProfile {\r\n id: string;\r\n email: string;\r\n fullName: string;\r\n avatarUrl?: string;\r\n createdAt: string;\r\n}\r\n\r\n// Conversation types\r\ninterface CreateConversationRequest {\r\n title: string;\r\n modelUsed: string;\r\n provider: string;\r\n workingDirectory?: string;\r\n tags?: string[];\r\n metadata?: Record<string, any>;\r\n}\r\n\r\ninterface Conversation {\r\n id: string;\r\n userId: string;\r\n title: string;\r\n modelUsed: string;\r\n provider: string;\r\n workingDirectory?: string;\r\n tags: string[];\r\n isPinned: boolean;\r\n metadata: Record<string, any>;\r\n createdAt: string;\r\n updatedAt: string;\r\n archivedAt?: string;\r\n}\r\n\r\ninterface UpdateConversationRequest {\r\n title?: string;\r\n tags?: string[];\r\n isPinned?: boolean;\r\n metadata?: Record<string, any>;\r\n}\r\n\r\n// Message types\r\ninterface CreateMessageRequest {\r\n role: 'user' | 'assistant' | 'system' | 'tool';\r\n content: string;\r\n contentType?: 'text' | 'code' | 'markdown' | 'file' | 'image';\r\n tokensUsed?: number;\r\n toolCalls?: any[];\r\n attachments?: any[];\r\n metadata?: Record<string, any>;\r\n}\r\n\r\ninterface Message {\r\n id: string;\r\n conversationId: string;\r\n role: 'user' | 'assistant' | 'system' | 'tool';\r\n content: string;\r\n contentType: 'text' | 'code' | 'markdown' | 'file' | 'image';\r\n tokensUsed?: number;\r\n toolCalls?: any[];\r\n attachments?: any[];\r\n metadata: Record<string, any>;\r\n createdAt: string;\r\n editedAt?: string;\r\n}\r\n\r\n// Settings types\r\ninterface UserSettings {\r\n defaultModel?: string;\r\n defaultProvider?: string;\r\n theme?: string;\r\n autoSave?: boolean;\r\n planMode?: boolean;\r\n [key: string]: any;\r\n}\r\n\r\n// Models configuration types\r\nexport interface ModelConfig {\r\n id: string;\r\n name: string;\r\n description: string;\r\n provider: string;\r\n contextWindow: number;\r\n region: string;\r\n supportsThinking: boolean;\r\n thinkingConfig?: Record<string, any>;\r\n generationConfig?: {\r\n temperature?: number;\r\n topP?: number;\r\n topK?: number;\r\n maxOutputTokens?: number;\r\n };\r\n allowFrontendDisplay?: boolean; // If false, model is hidden from frontend model picker but valid for API use\r\n}\r\n\r\nexport interface ModelsConfig {\r\n models: ModelConfig[];\r\n defaultModel: string;\r\n}\r\n\r\n// API Response wrapper\r\ninterface ApiResponse<T = any> {\r\n success: boolean;\r\n data?: T;\r\n error?: {\r\n code: string;\r\n message: string;\r\n details?: any;\r\n };\r\n meta?: {\r\n page?: number;\r\n limit?: number;\r\n total?: number;\r\n };\r\n}\r\n\r\n/**\r\n * API Client class for communicating with the backend service\r\n */\r\nclass ApiClient {\r\n private client: AxiosInstance | null = null;\r\n private sessionToken: string | null = null;\r\n private configPath: string;\r\n private configDir: string;\r\n private cachedUser: UserProfile | null = null;\r\n\r\n constructor() {\r\n // Set up session storage path: ~/.centaurus/session.json\r\n this.configDir = join(homedir(), '.centaurus');\r\n this.configPath = join(this.configDir, 'session.json');\r\n\r\n // Load existing session if available\r\n this.loadSession();\r\n\r\n // Don't create axios client yet - wait until first use\r\n // This allows environment variables to be loaded first\r\n }\r\n\r\n /**\r\n * Helper to extract data from API response safely\r\n */\r\n private extractData<T>(response: { data: ApiResponse<T> }): T {\r\n if (response.data.data === undefined || response.data.data === null) {\r\n throw new Error('API response missing expected data payload');\r\n }\r\n return response.data.data as T;\r\n }\r\n\r\n /**\r\n * Get or create the axios client instance\r\n * This is lazy-loaded to ensure environment variables are loaded first\r\n */\r\n private getClient(): AxiosInstance {\r\n if (!this.client) {\r\n // Import build config - values frozen at compile time for security\r\n // SECURITY: This prevents malicious .env files from overriding production URLs\r\n\r\n // Use production URL in production builds, localhost only in dev builds\r\n const baseURL = IS_DEV_BUILD ? DEV_BACKEND_URL : PRODUCTION_BACKEND_URL;\r\n\r\n this.client = axios.create({\r\n baseURL,\r\n timeout: 30000,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n\r\n // Request interceptor: Add Authorization header if session token exists\r\n this.getClient().interceptors.request.use(\r\n (config) => {\r\n if (this.sessionToken) {\r\n config.headers.Authorization = `Bearer ${this.sessionToken}`;\r\n }\r\n return config;\r\n },\r\n (error) => {\r\n return Promise.reject(error);\r\n }\r\n );\r\n\r\n // Response interceptor: Handle 401 errors (expired/invalid session)\r\n this.getClient().interceptors.response.use(\r\n (response) => response,\r\n async (error: AxiosError) => {\r\n if (error.response?.status === 401) {\r\n // Clear invalid session\r\n this.clearSession();\r\n\r\n // Create a more user-friendly error\r\n const authError = new Error('Session expired. Please sign in again.');\r\n authError.name = 'AuthenticationError';\r\n throw authError;\r\n }\r\n\r\n // For other errors, extract message from API response if available\r\n if (error.response?.data) {\r\n const apiError = error.response.data as ApiResponse;\r\n if (apiError.error) {\r\n const customError = new Error(apiError.error.message);\r\n customError.name = apiError.error.code;\r\n throw customError;\r\n }\r\n }\r\n\r\n throw error;\r\n }\r\n );\r\n }\r\n\r\n return this.client;\r\n }\r\n\r\n /**\r\n * Load session token from local config file\r\n */\r\n private loadSession(): void {\r\n try {\r\n if (existsSync(this.configPath)) {\r\n const data = readFileSync(this.configPath, 'utf-8');\r\n const session = JSON.parse(data);\r\n this.sessionToken = session.sessionToken || null;\r\n }\r\n } catch (error) {\r\n // If there's any error reading the session, just start fresh\r\n this.sessionToken = null;\r\n }\r\n }\r\n\r\n /**\r\n * Save session token to local config file\r\n */\r\n private saveSession(token: string, expiresAt?: string): void {\r\n try {\r\n // Ensure config directory exists\r\n if (!existsSync(this.configDir)) {\r\n mkdirSync(this.configDir, { recursive: true, mode: 0o700 });\r\n }\r\n\r\n // Save session data\r\n const sessionData = {\r\n sessionToken: token,\r\n expiresAt: expiresAt || null,\r\n savedAt: new Date().toISOString(),\r\n };\r\n\r\n writeFileSync(this.configPath, JSON.stringify(sessionData, null, 2), { encoding: 'utf-8', mode: 0o600 });\r\n this.sessionToken = token;\r\n } catch (error) {\r\n logError('Failed to save session', error as Error);\r\n throw new Error('Failed to save session locally');\r\n }\r\n }\r\n\r\n /**\r\n * Clear session token from memory and local storage\r\n */\r\n private clearSession(): void {\r\n this.sessionToken = null;\r\n this.cachedUser = null;\r\n try {\r\n if (existsSync(this.configPath)) {\r\n unlinkSync(this.configPath);\r\n }\r\n } catch (error) {\r\n // Ignore errors when clearing session\r\n }\r\n }\r\n\r\n /**\r\n * Check if user is authenticated\r\n */\r\n public isAuthenticated(): boolean {\r\n return this.sessionToken !== null;\r\n }\r\n\r\n // ==================== Authentication Methods ====================\r\n\r\n /**\r\n * Initialize Google OAuth flow\r\n * @param redirectUri - The URI to redirect to after OAuth\r\n * @returns OAuth URL and state parameter\r\n */\r\n async initGoogleAuth(redirectUri: string): Promise<GoogleAuthInitResponse> {\r\n const response = await this.getClient().post<ApiResponse<GoogleAuthInitResponse>>(\r\n '/auth/google/init',\r\n { redirectUri }\r\n );\r\n return this.extractData(response);\r\n }\r\n\r\n /**\r\n * Complete Google OAuth authentication\r\n * @param code - Authorization code from Google\r\n * @param state - State parameter for CSRF protection\r\n * @returns Session token and user information\r\n */\r\n async authenticate(code: string, state: string): Promise<AuthResponse> {\r\n const response = await this.getClient().post<ApiResponse<AuthResponse>>(\r\n '/auth/google/callback',\r\n { code, state }\r\n );\r\n\r\n const authData = this.extractData(response);\r\n this.saveSession(authData.sessionToken, authData.expiresAt);\r\n\r\n return authData;\r\n }\r\n\r\n /**\r\n * Set session token directly (used when receiving token from web app)\r\n * @param sessionToken - The session token to save\r\n * @param user - User information\r\n */\r\n setSessionToken(sessionToken: string, user?: any): void {\r\n // Calculate expiration (30 days from now)\r\n const expiresAt = new Date();\r\n expiresAt.setDate(expiresAt.getDate() + 30);\r\n\r\n this.saveSession(sessionToken, expiresAt.toISOString());\r\n }\r\n\r\n /**\r\n * Refresh the current session token\r\n * @returns New session token and expiration\r\n */\r\n async refreshSession(): Promise<{ sessionToken: string; expiresAt: string }> {\r\n const response = await this.getClient().post<ApiResponse<{ sessionToken: string; expiresAt: string }>>(\r\n '/auth/refresh'\r\n );\r\n\r\n const refreshData = this.extractData(response);\r\n this.saveSession(refreshData.sessionToken, refreshData.expiresAt);\r\n\r\n return refreshData;\r\n }\r\n\r\n /**\r\n * Logout and invalidate current session\r\n */\r\n async logout(): Promise<void> {\r\n try {\r\n await this.getClient().post('/auth/logout');\r\n } finally {\r\n // Always clear local session, even if API call fails\r\n this.clearSession();\r\n }\r\n }\r\n\r\n /**\r\n * Get current authenticated user profile\r\n * @returns User profile information\r\n */\r\n async getCurrentUser(): Promise<UserProfile> {\r\n const response = await this.getClient().get<ApiResponse<UserProfile>>('/auth/me');\r\n const user = this.extractData(response);\r\n this.cachedUser = user;\r\n return user;\r\n }\r\n\r\n getCachedUser(): UserProfile | null {\r\n return this.cachedUser;\r\n }\r\n\r\n // ==================== Conversation Methods ====================\r\n\r\n /**\r\n * Create a new conversation\r\n * @param data - Conversation creation parameters\r\n * @returns Created conversation\r\n */\r\n async createConversation(data: CreateConversationRequest): Promise<Conversation> {\r\n const response = await this.getClient().post<ApiResponse<Conversation>>(\r\n '/threads',\r\n data\r\n );\r\n return this.extractData(response);\r\n }\r\n\r\n /**\r\n * Get all conversations for the authenticated user\r\n * @param params - Pagination and filter parameters\r\n * @returns List of conversations with pagination metadata\r\n */\r\n async getConversations(params?: {\r\n page?: number;\r\n limit?: number;\r\n includeArchived?: boolean;\r\n tags?: string[];\r\n }): Promise<ApiResponse<Conversation[]>> {\r\n const queryParams: any = {\r\n page: params?.page || 1,\r\n limit: params?.limit || 20,\r\n };\r\n\r\n if (params?.includeArchived !== undefined) {\r\n queryParams.includeArchived = params.includeArchived;\r\n }\r\n\r\n if (params?.tags && params.tags.length > 0) {\r\n queryParams.tags = params.tags.join(',');\r\n }\r\n\r\n const response = await this.getClient().get<ApiResponse<Conversation[]>>(\r\n '/threads',\r\n { params: queryParams }\r\n );\r\n\r\n return response.data;\r\n }\r\n\r\n /**\r\n * Get a specific conversation by ID\r\n * @param conversationId - The conversation ID\r\n * @returns Conversation details\r\n */\r\n async getConversation(conversationId: string): Promise<Conversation> {\r\n const response = await this.getClient().get<ApiResponse<Conversation>>(\r\n `/threads/${conversationId}`\r\n );\r\n return this.extractData(response);\r\n }\r\n\r\n /**\r\n * Update a conversation\r\n * @param conversationId - The conversation ID\r\n * @param data - Fields to update\r\n * @returns Updated conversation\r\n */\r\n async updateConversation(\r\n conversationId: string,\r\n data: UpdateConversationRequest\r\n ): Promise<Conversation> {\r\n const response = await this.getClient().put<ApiResponse<Conversation>>(\r\n `/threads/${conversationId}`,\r\n data\r\n );\r\n return this.extractData(response);\r\n }\r\n\r\n /**\r\n * Delete (archive) a conversation\r\n * @param conversationId - The conversation ID\r\n */\r\n async deleteConversation(conversationId: string): Promise<void> {\r\n await this.getClient().delete(`/threads/${conversationId}`);\r\n }\r\n\r\n // ==================== Message Methods ====================\r\n\r\n /**\r\n * Add a message to a conversation\r\n * @param conversationId - The conversation ID\r\n * @param message - Message data\r\n * @returns Created message\r\n */\r\n async addMessage(\r\n conversationId: string,\r\n message: CreateMessageRequest\r\n ): Promise<Message> {\r\n const response = await this.getClient().post<ApiResponse<Message>>(\r\n `/threads/${conversationId}/messages`,\r\n message\r\n );\r\n return this.extractData(response);\r\n }\r\n\r\n /**\r\n * Get all messages for a conversation\r\n * @param conversationId - The conversation ID\r\n * @param params - Pagination parameters\r\n * @returns List of messages with pagination metadata\r\n */\r\n async getMessages(\r\n conversationId: string,\r\n params?: { page?: number; limit?: number }\r\n ): Promise<ApiResponse<Message[]>> {\r\n const queryParams = {\r\n page: params?.page || 1,\r\n limit: params?.limit || 50,\r\n };\r\n\r\n const response = await this.getClient().get<ApiResponse<Message[]>>(\r\n `/threads/${conversationId}/messages`,\r\n { params: queryParams }\r\n );\r\n\r\n return response.data;\r\n }\r\n\r\n // ==================== Settings Methods ====================\r\n\r\n /**\r\n * Get user settings\r\n * @returns User settings object\r\n */\r\n async getSettings(): Promise<UserSettings> {\r\n const response = await this.getClient().get<ApiResponse<UserSettings>>('/settings');\r\n return this.extractData(response);\r\n }\r\n\r\n /**\r\n * Update user settings\r\n * @param settings - Settings to update (partial update supported)\r\n * @returns Updated settings\r\n */\r\n async updateSettings(settings: Partial<UserSettings>): Promise<UserSettings> {\r\n const response = await this.getClient().put<ApiResponse<UserSettings>>(\r\n '/settings',\r\n settings\r\n );\r\n return this.extractData(response);\r\n }\r\n\r\n // ==================== Models Configuration Methods ====================\r\n\r\n /**\r\n * Get available AI models configuration from backend\r\n * This is a public endpoint (no auth required)\r\n * @returns Models configuration including all model variants and default model\r\n */\r\n async getModelsConfig(): Promise<ModelsConfig> {\r\n const response = await this.getClient().get<ApiResponse<ModelsConfig>>('/models');\r\n return this.extractData(response);\r\n }\r\n\r\n // ==================== Rate Limits Configuration Methods ====================\r\n\r\n /**\r\n * Get rate limits configuration from backend\r\n * This is a public endpoint (no auth required)\r\n * @returns Rate limits configuration including session quotas\r\n */\r\n async getRateLimitsConfig(): Promise<{\r\n maxMessagesPerSession: number;\r\n sessionDurationHours: number;\r\n warningThreshold: number;\r\n defaultPlan: string;\r\n }> {\r\n const response = await this.getClient().get<ApiResponse<{\r\n maxMessagesPerSession: number;\r\n sessionDurationHours: number;\r\n warningThreshold: number;\r\n defaultPlan: string;\r\n }>>('/rate-limits/session');\r\n return this.extractData(response);\r\n }\r\n\r\n // ==================== Classification Methods ====================\r\n\r\n /**\r\n * Classify user input to determine if it's a terminal command or AI message\r\n * @param text - Input text to classify\r\n * @returns Mode prediction: 'terminal' or 'ai'\r\n */\r\n async classifyInput(text: string): Promise<'terminal' | 'ai'> {\r\n try {\r\n const response = await this.getClient().post<ApiResponse<{ mode: 'terminal' | 'ai' }>>(\r\n '/classify',\r\n { text }\r\n );\r\n return response.data.data?.mode || 'ai';\r\n } catch (error) {\r\n // On error, return default 'ai' mode - silent fallback\r\n return 'ai';\r\n }\r\n }\r\n\r\n // ==================== File Upload Methods ====================\r\n\r\n /**\r\n * Upload a file to the backend for AI processing\r\n * @param conversationId - The conversation ID\r\n * @param fileName - Original file name\r\n * @param fileType - MIME type\r\n * @param fileData - Base64 encoded file data\r\n * @returns Upload result with gcsUri for Vertex AI\r\n */\r\n async uploadFile(\r\n conversationId: string,\r\n fileName: string,\r\n fileType: string,\r\n fileData: string\r\n ): Promise<{\r\n id: string;\r\n storagePath: string;\r\n publicUrl: string;\r\n fileName: string;\r\n fileType: string;\r\n fileSize: number;\r\n gcsUri?: string;\r\n gcsPath?: string;\r\n }> {\r\n const response = await this.getClient().post<ApiResponse<{\r\n id: string;\r\n storagePath: string;\r\n publicUrl: string;\r\n fileName: string;\r\n fileType: string;\r\n fileSize: number;\r\n gcsUri?: string;\r\n gcsPath?: string;\r\n }>>('/files', { conversationId, fileName, fileType, mimeType: fileType, fileData, clientType: 'cli' });\r\n return this.extractData(response);\r\n }\r\n\r\n /**\r\n * Delete all files for a conversation from storage (Supabase and GCS)\r\n * Call this when deleting a conversation to clean up associated images\r\n * @param conversationId - The conversation ID\r\n */\r\n async deleteConversationFiles(conversationId: string): Promise<void> {\r\n try {\r\n await this.getClient().delete(`/files/by-thread/${conversationId}`);\r\n } catch (error) {\r\n // Silently fail - files might not exist or user might not be authenticated\r\n // This is a cleanup operation, so we don't want to block chat deletion\r\n }\r\n }\r\n\r\n // ==================== Sync Methods ====================\r\n\r\n /**\r\n * Upload sync data (combined chat history and config)\r\n * @param syncData - The combined data to sync\r\n * @returns Upload result with version info\r\n */\r\n async uploadSyncData(syncData: any): Promise<{\r\n id: string;\r\n version: number;\r\n updatedAt: string;\r\n }> {\r\n const response = await this.getClient().post<ApiResponse<{\r\n id: string;\r\n version: number;\r\n updatedAt: string;\r\n }>>('/sync', { syncData });\r\n return this.extractData(response);\r\n }\r\n\r\n /**\r\n * Get sync data for the current user\r\n * @returns Sync data or null if not found\r\n */\r\n async getSyncData(): Promise<{\r\n id: string;\r\n syncData: any;\r\n version: number;\r\n createdAt: string;\r\n updatedAt: string;\r\n } | null> {\r\n try {\r\n const response = await this.getClient().get<ApiResponse<{\r\n id: string;\r\n syncData: any;\r\n version: number;\r\n createdAt: string;\r\n updatedAt: string;\r\n }>>('/sync');\r\n return this.extractData(response);\r\n } catch (error: any) {\r\n if (error.response?.status === 404) {\r\n return null;\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Delete sync data for the current user\r\n */\r\n async deleteSyncData(): Promise<void> {\r\n await this.getClient().delete('/sync');\r\n }\r\n\r\n // ==================== Token Counting Methods ====================\r\n\r\n /**\r\n * Count tokens for a given model and messages\r\n * Uses backend's accurate token counting (Vertex AI countTokens API)\r\n * @param model - Model name (e.g., gemini-2.5-flash)\r\n * @param messages - Array of conversation messages\r\n * @returns Total token count including system prompt\r\n */\r\n async countTokens(model: string, messages: any[]): Promise<number> {\r\n try {\r\n const response = await this.getClient().post<ApiResponse<{ tokenCount: number; model: string }>>(\r\n '/chat/token-count',\r\n { model, messages }\r\n );\r\n return response.data.data?.tokenCount || 0;\r\n } catch (error) {\r\n logError('Failed to count tokens via API', error as Error);\r\n\r\n // Fallback to character-based estimation\r\n const totalCharacters = messages.reduce((sum, msg) => {\r\n const content = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content);\r\n return sum + content.length;\r\n }, 0);\r\n\r\n // Add system prompt estimate (roughly 14000 characters)\r\n // Use 1 token ≈ 4 characters for Gemini models\r\n return Math.ceil((totalCharacters + 14000) / 4);\r\n }\r\n }\r\n\r\n // ==================== Health Check ====================\r\n\r\n /**\r\n * Check backend service health\r\n * @returns Health status information\r\n */\r\n async healthCheck(): Promise<{\r\n status: string;\r\n timestamp: string;\r\n database: string;\r\n version: string;\r\n }> {\r\n // Health endpoint is at root level, not under /api\r\n // So we need to construct the full URL manually\r\n // Use build config for URL (frozen at compile time)\r\n const baseURL = IS_DEV_BUILD ? DEV_BACKEND_URL : PRODUCTION_BACKEND_URL;\r\n const healthURL = baseURL.replace('/v1', '/health');\r\n\r\n const response = await axios.get<ApiResponse<any>>(healthURL);\r\n return this.extractData(response);\r\n }\r\n}\r\n\r\n// Export singleton instance\r\nexport const apiClient = new ApiClient();\r\n\r\n// Export types for use in other modules\r\nexport type {\r\n GoogleAuthInitResponse,\r\n AuthResponse,\r\n UserProfile,\r\n CreateConversationRequest,\r\n Conversation,\r\n UpdateConversationRequest,\r\n CreateMessageRequest,\r\n Message,\r\n UserSettings,\r\n ApiResponse,\r\n};\r\n\r\n"],"mappings":"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","names":[]}
|
|
@@ -1,210 +1,174 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
* to receive the callback from the backend
|
|
6
|
-
*/
|
|
7
|
-
import * as http from 'http';
|
|
8
|
-
import { URL } from 'url';
|
|
9
|
-
import { apiClient } from './api-client.js';
|
|
10
|
-
import open from 'open';
|
|
11
|
-
/**
|
|
12
|
-
* Start a temporary HTTP server to handle callback from web app
|
|
13
|
-
*/
|
|
1
|
+
import * as http from "http";
|
|
2
|
+
import { URL } from "url";
|
|
3
|
+
import { apiClient } from "./api-client.js";
|
|
4
|
+
import open from "open";
|
|
14
5
|
function startCallbackServer(port = 8888) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
body += chunk.toString();
|
|
23
|
-
});
|
|
24
|
-
req.on('end', () => {
|
|
25
|
-
try {
|
|
26
|
-
const data = JSON.parse(body);
|
|
27
|
-
// Web app sends: { sessionToken, user }
|
|
28
|
-
if (data.sessionToken) {
|
|
29
|
-
// Send success response
|
|
30
|
-
res.writeHead(200, {
|
|
31
|
-
'Content-Type': 'application/json',
|
|
32
|
-
'Access-Control-Allow-Origin': '*'
|
|
33
|
-
});
|
|
34
|
-
res.end(JSON.stringify({ success: true }));
|
|
35
|
-
// Close server and resolve
|
|
36
|
-
server.close();
|
|
37
|
-
resolve({
|
|
38
|
-
code: data.sessionToken, // Session token as 'code'
|
|
39
|
-
state: data.user?.id || 'success'
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
44
|
-
res.end(JSON.stringify({ success: false, error: 'Missing session token' }));
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
catch (error) {
|
|
48
|
-
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
49
|
-
res.end(JSON.stringify({ success: false, error: 'Invalid JSON' }));
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
// Handle OPTIONS for CORS preflight
|
|
54
|
-
else if (req.method === 'OPTIONS') {
|
|
55
|
-
res.writeHead(200, {
|
|
56
|
-
'Access-Control-Allow-Origin': '*',
|
|
57
|
-
'Access-Control-Allow-Methods': 'POST, OPTIONS',
|
|
58
|
-
'Access-Control-Allow-Headers': 'Content-Type',
|
|
59
|
-
});
|
|
60
|
-
res.end();
|
|
61
|
-
}
|
|
62
|
-
// Handle GET requests (legacy support)
|
|
63
|
-
else if (req.method === 'GET' && url.pathname === '/callback') {
|
|
64
|
-
const code = url.searchParams.get('code');
|
|
65
|
-
const state = url.searchParams.get('state');
|
|
66
|
-
const error = url.searchParams.get('error');
|
|
67
|
-
if (error) {
|
|
68
|
-
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
69
|
-
res.end(`
|
|
70
|
-
<!DOCTYPE html>
|
|
71
|
-
<html>
|
|
72
|
-
<head>
|
|
73
|
-
<title>Authentication Failed</title>
|
|
74
|
-
<style>
|
|
75
|
-
body { font-family: Arial, sans-serif; text-align: center; padding: 50px; background: #0f172a; color: white; }
|
|
76
|
-
.container { background: #1e293b; padding: 40px; border-radius: 10px; max-width: 500px; margin: 0 auto; border: 1px solid #7c3aed; }
|
|
77
|
-
.error { color: #ef4444; font-size: 24px; margin-bottom: 20px; }
|
|
78
|
-
</style>
|
|
79
|
-
</head>
|
|
80
|
-
<body>
|
|
81
|
-
<div class="container">
|
|
82
|
-
<div class="error">❌ Authentication Failed</div>
|
|
83
|
-
<div>Error: ${error}</div>
|
|
84
|
-
<div style="margin-top: 20px;">Please return to the CLI and try again.</div>
|
|
85
|
-
</div>
|
|
86
|
-
</body>
|
|
87
|
-
</html>
|
|
88
|
-
`);
|
|
89
|
-
server.close();
|
|
90
|
-
reject(new Error(`OAuth error: ${error}`));
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
if (code && state) {
|
|
94
|
-
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
95
|
-
res.end(`
|
|
96
|
-
<!DOCTYPE html>
|
|
97
|
-
<html>
|
|
98
|
-
<head>
|
|
99
|
-
<title>Authentication Successful</title>
|
|
100
|
-
<style>
|
|
101
|
-
body { font-family: Arial, sans-serif; text-align: center; padding: 50px; background: #0f172a; color: white; }
|
|
102
|
-
.container { background: #1e293b; padding: 40px; border-radius: 10px; max-width: 500px; margin: 0 auto; border: 1px solid #7c3aed; }
|
|
103
|
-
.success { color: #10b981; font-size: 24px; margin-bottom: 20px; }
|
|
104
|
-
</style>
|
|
105
|
-
</head>
|
|
106
|
-
<body>
|
|
107
|
-
<div class="container">
|
|
108
|
-
<div class="success">✅ Authentication Successful!</div>
|
|
109
|
-
<div>You can now close this window and return to the CLI.</div>
|
|
110
|
-
</div>
|
|
111
|
-
<script>
|
|
112
|
-
setTimeout(() => window.close(), 3000);
|
|
113
|
-
</script>
|
|
114
|
-
</body>
|
|
115
|
-
</html>
|
|
116
|
-
`);
|
|
117
|
-
server.close();
|
|
118
|
-
resolve({ code, state });
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
res.writeHead(404);
|
|
123
|
-
res.end('Not Found');
|
|
124
|
-
}
|
|
6
|
+
return new Promise((resolve, reject) => {
|
|
7
|
+
const server = http.createServer((req, res) => {
|
|
8
|
+
const url = new URL(req.url || "", `http://localhost:${port}`);
|
|
9
|
+
if (req.method === "POST" && url.pathname === "/callback") {
|
|
10
|
+
let body = "";
|
|
11
|
+
req.on("data", (chunk) => {
|
|
12
|
+
body += chunk.toString();
|
|
125
13
|
});
|
|
126
|
-
|
|
127
|
-
|
|
14
|
+
req.on("end", () => {
|
|
15
|
+
try {
|
|
16
|
+
const data = JSON.parse(body);
|
|
17
|
+
if (data.sessionToken) {
|
|
18
|
+
res.writeHead(200, {
|
|
19
|
+
"Content-Type": "application/json",
|
|
20
|
+
"Access-Control-Allow-Origin": "*"
|
|
21
|
+
});
|
|
22
|
+
res.end(JSON.stringify({ success: true }));
|
|
23
|
+
server.close();
|
|
24
|
+
resolve({
|
|
25
|
+
code: data.sessionToken,
|
|
26
|
+
// Session token as 'code'
|
|
27
|
+
state: data.user?.id || "success"
|
|
28
|
+
});
|
|
29
|
+
} else {
|
|
30
|
+
res.writeHead(400, { "Content-Type": "application/json" });
|
|
31
|
+
res.end(JSON.stringify({ success: false, error: "Missing session token" }));
|
|
32
|
+
}
|
|
33
|
+
} catch (error) {
|
|
34
|
+
res.writeHead(400, { "Content-Type": "application/json" });
|
|
35
|
+
res.end(JSON.stringify({ success: false, error: "Invalid JSON" }));
|
|
36
|
+
}
|
|
128
37
|
});
|
|
129
|
-
|
|
130
|
-
|
|
38
|
+
} else if (req.method === "OPTIONS") {
|
|
39
|
+
res.writeHead(200, {
|
|
40
|
+
"Access-Control-Allow-Origin": "*",
|
|
41
|
+
"Access-Control-Allow-Methods": "POST, OPTIONS",
|
|
42
|
+
"Access-Control-Allow-Headers": "Content-Type"
|
|
131
43
|
});
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
44
|
+
res.end();
|
|
45
|
+
} else if (req.method === "GET" && url.pathname === "/callback") {
|
|
46
|
+
const code = url.searchParams.get("code");
|
|
47
|
+
const state = url.searchParams.get("state");
|
|
48
|
+
const error = url.searchParams.get("error");
|
|
49
|
+
if (error) {
|
|
50
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
51
|
+
res.end(`
|
|
52
|
+
<!DOCTYPE html>
|
|
53
|
+
<html>
|
|
54
|
+
<head>
|
|
55
|
+
<title>Authentication Failed</title>
|
|
56
|
+
<style>
|
|
57
|
+
body { font-family: Arial, sans-serif; text-align: center; padding: 50px; background: #0f172a; color: white; }
|
|
58
|
+
.container { background: #1e293b; padding: 40px; border-radius: 10px; max-width: 500px; margin: 0 auto; border: 1px solid #7c3aed; }
|
|
59
|
+
.error { color: #ef4444; font-size: 24px; margin-bottom: 20px; }
|
|
60
|
+
</style>
|
|
61
|
+
</head>
|
|
62
|
+
<body>
|
|
63
|
+
<div class="container">
|
|
64
|
+
<div class="error">\u274C Authentication Failed</div>
|
|
65
|
+
<div>Error: ${error}</div>
|
|
66
|
+
<div style="margin-top: 20px;">Please return to the CLI and try again.</div>
|
|
67
|
+
</div>
|
|
68
|
+
</body>
|
|
69
|
+
</html>
|
|
70
|
+
`);
|
|
71
|
+
server.close();
|
|
72
|
+
reject(new Error(`OAuth error: ${error}`));
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (code && state) {
|
|
76
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
77
|
+
res.end(`
|
|
78
|
+
<!DOCTYPE html>
|
|
79
|
+
<html>
|
|
80
|
+
<head>
|
|
81
|
+
<title>Authentication Successful</title>
|
|
82
|
+
<style>
|
|
83
|
+
body { font-family: Arial, sans-serif; text-align: center; padding: 50px; background: #0f172a; color: white; }
|
|
84
|
+
.container { background: #1e293b; padding: 40px; border-radius: 10px; max-width: 500px; margin: 0 auto; border: 1px solid #7c3aed; }
|
|
85
|
+
.success { color: #10b981; font-size: 24px; margin-bottom: 20px; }
|
|
86
|
+
</style>
|
|
87
|
+
</head>
|
|
88
|
+
<body>
|
|
89
|
+
<div class="container">
|
|
90
|
+
<div class="success">\u2705 Authentication Successful!</div>
|
|
91
|
+
<div>You can now close this window and return to the CLI.</div>
|
|
92
|
+
</div>
|
|
93
|
+
<script>
|
|
94
|
+
setTimeout(() => window.close(), 3000);
|
|
95
|
+
</script>
|
|
96
|
+
</body>
|
|
97
|
+
</html>
|
|
98
|
+
`);
|
|
99
|
+
server.close();
|
|
100
|
+
resolve({ code, state });
|
|
101
|
+
}
|
|
102
|
+
} else {
|
|
103
|
+
res.writeHead(404);
|
|
104
|
+
res.end("Not Found");
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
server.on("error", (err) => {
|
|
108
|
+
reject(err);
|
|
109
|
+
});
|
|
110
|
+
server.listen(port, () => {
|
|
137
111
|
});
|
|
112
|
+
setTimeout(() => {
|
|
113
|
+
server.close();
|
|
114
|
+
reject(new Error("Authentication timeout - no callback received"));
|
|
115
|
+
}, 5 * 60 * 1e3);
|
|
116
|
+
});
|
|
138
117
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
118
|
+
async function authenticateWithGoogle() {
|
|
119
|
+
const callbackPort = 8888;
|
|
120
|
+
const webAppUrl = "https://centauruslabs.in/auth";
|
|
121
|
+
try {
|
|
122
|
+
console.log("\u{1F510} Opening browser for authentication...\n");
|
|
123
|
+
const callbackPromise = startCallbackServer(callbackPort);
|
|
124
|
+
await open(webAppUrl);
|
|
125
|
+
const { code, state } = await callbackPromise;
|
|
126
|
+
const sessionToken = code;
|
|
127
|
+
apiClient.setSessionToken(sessionToken);
|
|
128
|
+
let user;
|
|
146
129
|
try {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
// and sent it to us via the callback
|
|
156
|
-
const sessionToken = code;
|
|
157
|
-
// Save the session token to local storage
|
|
158
|
-
apiClient.setSessionToken(sessionToken);
|
|
159
|
-
// Get user profile from backend
|
|
160
|
-
let user;
|
|
161
|
-
try {
|
|
162
|
-
user = await apiClient.getCurrentUser();
|
|
163
|
-
}
|
|
164
|
-
catch (error) {
|
|
165
|
-
// If we can't get user profile, use placeholder
|
|
166
|
-
user = {
|
|
167
|
-
id: state,
|
|
168
|
-
email: 'user@example.com',
|
|
169
|
-
fullName: 'User',
|
|
170
|
-
createdAt: new Date().toISOString(),
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
console.log(`✅ You are signed in as ${user.fullName}\n`);
|
|
174
|
-
return {
|
|
175
|
-
success: true,
|
|
176
|
-
sessionToken,
|
|
177
|
-
user: {
|
|
178
|
-
id: user.id,
|
|
179
|
-
email: user.email,
|
|
180
|
-
fullName: user.fullName,
|
|
181
|
-
},
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
catch (error) {
|
|
185
|
-
console.error('❌ Authentication failed:', error.message);
|
|
186
|
-
return {
|
|
187
|
-
success: false,
|
|
188
|
-
error: error.message,
|
|
189
|
-
};
|
|
130
|
+
user = await apiClient.getCurrentUser();
|
|
131
|
+
} catch (error) {
|
|
132
|
+
user = {
|
|
133
|
+
id: state,
|
|
134
|
+
email: "user@example.com",
|
|
135
|
+
fullName: "User",
|
|
136
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
137
|
+
};
|
|
190
138
|
}
|
|
139
|
+
console.log(`\u2705 You are signed in as ${user.fullName}
|
|
140
|
+
`);
|
|
141
|
+
return {
|
|
142
|
+
success: true,
|
|
143
|
+
sessionToken,
|
|
144
|
+
user: {
|
|
145
|
+
id: user.id,
|
|
146
|
+
email: user.email,
|
|
147
|
+
fullName: user.fullName
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
} catch (error) {
|
|
151
|
+
console.error("\u274C Authentication failed:", error.message);
|
|
152
|
+
return {
|
|
153
|
+
success: false,
|
|
154
|
+
error: error.message
|
|
155
|
+
};
|
|
156
|
+
}
|
|
191
157
|
}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
*/
|
|
195
|
-
export function isAuthenticated() {
|
|
196
|
-
return apiClient.isAuthenticated();
|
|
158
|
+
function isAuthenticated() {
|
|
159
|
+
return apiClient.isAuthenticated();
|
|
197
160
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
}
|
|
206
|
-
catch (error) {
|
|
207
|
-
console.error('❌ Logout failed:', error.message);
|
|
208
|
-
}
|
|
161
|
+
async function logout() {
|
|
162
|
+
try {
|
|
163
|
+
await apiClient.logout();
|
|
164
|
+
console.log("\u2705 Logged out successfully");
|
|
165
|
+
} catch (error) {
|
|
166
|
+
console.error("\u274C Logout failed:", error.message);
|
|
167
|
+
}
|
|
209
168
|
}
|
|
169
|
+
export {
|
|
170
|
+
authenticateWithGoogle,
|
|
171
|
+
isAuthenticated,
|
|
172
|
+
logout
|
|
173
|
+
};
|
|
210
174
|
//# sourceMappingURL=auth-handler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-handler.js","sourceRoot":"","sources":["../../src/services/auth-handler.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/services/auth-handler.ts"],"sourcesContent":["/**\r\n * Authentication Handler\r\n * \r\n * Handles OAuth authentication flow with a temporary local server\r\n * to receive the callback from the backend\r\n */\r\n\r\nimport * as http from 'http';\r\nimport { URL } from 'url';\r\nimport { apiClient } from './api-client.js';\r\nimport open from 'open';\r\n\r\ninterface AuthResult {\r\n success: boolean;\r\n sessionToken?: string;\r\n user?: {\r\n id: string;\r\n email: string;\r\n fullName: string;\r\n };\r\n error?: string;\r\n}\r\n\r\n/**\r\n * Start a temporary HTTP server to handle callback from web app\r\n */\r\nfunction startCallbackServer(port: number = 8888): Promise<{ code: string; state: string }> {\r\n return new Promise((resolve, reject) => {\r\n const server = http.createServer((req, res) => {\r\n const url = new URL(req.url || '', `http://localhost:${port}`);\r\n\r\n // Handle POST request from web app\r\n if (req.method === 'POST' && url.pathname === '/callback') {\r\n let body = '';\r\n\r\n req.on('data', (chunk) => {\r\n body += chunk.toString();\r\n });\r\n\r\n req.on('end', () => {\r\n try {\r\n const data = JSON.parse(body);\r\n\r\n // Web app sends: { sessionToken, user }\r\n if (data.sessionToken) {\r\n // Send success response\r\n res.writeHead(200, {\r\n 'Content-Type': 'application/json',\r\n 'Access-Control-Allow-Origin': '*'\r\n });\r\n res.end(JSON.stringify({ success: true }));\r\n\r\n // Close server and resolve\r\n server.close();\r\n resolve({\r\n code: data.sessionToken, // Session token as 'code'\r\n state: data.user?.id || 'success'\r\n });\r\n } else {\r\n res.writeHead(400, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify({ success: false, error: 'Missing session token' }));\r\n }\r\n } catch (error) {\r\n res.writeHead(400, { 'Content-Type': 'application/json' });\r\n res.end(JSON.stringify({ success: false, error: 'Invalid JSON' }));\r\n }\r\n });\r\n }\r\n // Handle OPTIONS for CORS preflight\r\n else if (req.method === 'OPTIONS') {\r\n res.writeHead(200, {\r\n 'Access-Control-Allow-Origin': '*',\r\n 'Access-Control-Allow-Methods': 'POST, OPTIONS',\r\n 'Access-Control-Allow-Headers': 'Content-Type',\r\n });\r\n res.end();\r\n }\r\n // Handle GET requests (legacy support)\r\n else if (req.method === 'GET' && url.pathname === '/callback') {\r\n const code = url.searchParams.get('code');\r\n const state = url.searchParams.get('state');\r\n const error = url.searchParams.get('error');\r\n\r\n if (error) {\r\n res.writeHead(200, { 'Content-Type': 'text/html' });\r\n res.end(`\r\n <!DOCTYPE html>\r\n <html>\r\n <head>\r\n <title>Authentication Failed</title>\r\n <style>\r\n body { font-family: Arial, sans-serif; text-align: center; padding: 50px; background: #0f172a; color: white; }\r\n .container { background: #1e293b; padding: 40px; border-radius: 10px; max-width: 500px; margin: 0 auto; border: 1px solid #7c3aed; }\r\n .error { color: #ef4444; font-size: 24px; margin-bottom: 20px; }\r\n </style>\r\n </head>\r\n <body>\r\n <div class=\"container\">\r\n <div class=\"error\">❌ Authentication Failed</div>\r\n <div>Error: ${error}</div>\r\n <div style=\"margin-top: 20px;\">Please return to the CLI and try again.</div>\r\n </div>\r\n </body>\r\n </html>\r\n `);\r\n\r\n server.close();\r\n reject(new Error(`OAuth error: ${error}`));\r\n return;\r\n }\r\n\r\n if (code && state) {\r\n res.writeHead(200, { 'Content-Type': 'text/html' });\r\n res.end(`\r\n <!DOCTYPE html>\r\n <html>\r\n <head>\r\n <title>Authentication Successful</title>\r\n <style>\r\n body { font-family: Arial, sans-serif; text-align: center; padding: 50px; background: #0f172a; color: white; }\r\n .container { background: #1e293b; padding: 40px; border-radius: 10px; max-width: 500px; margin: 0 auto; border: 1px solid #7c3aed; }\r\n .success { color: #10b981; font-size: 24px; margin-bottom: 20px; }\r\n </style>\r\n </head>\r\n <body>\r\n <div class=\"container\">\r\n <div class=\"success\">✅ Authentication Successful!</div>\r\n <div>You can now close this window and return to the CLI.</div>\r\n </div>\r\n <script>\r\n setTimeout(() => window.close(), 3000);\r\n </script>\r\n </body>\r\n </html>\r\n `);\r\n\r\n server.close();\r\n resolve({ code, state });\r\n }\r\n } else {\r\n res.writeHead(404);\r\n res.end('Not Found');\r\n }\r\n });\r\n\r\n server.on('error', (err) => {\r\n reject(err);\r\n });\r\n\r\n server.listen(port, () => {\r\n // Server started successfully\r\n });\r\n\r\n // Timeout after 5 minutes\r\n setTimeout(() => {\r\n server.close();\r\n reject(new Error('Authentication timeout - no callback received'));\r\n }, 5 * 60 * 1000);\r\n });\r\n}\r\n\r\n/**\r\n * Handle complete OAuth authentication flow via web app\r\n */\r\nexport async function authenticateWithGoogle(): Promise<AuthResult> {\r\n const callbackPort = 8888;\r\n // Always use production web app for authentication\r\n const webAppUrl = 'https://centauruslabs.in/auth';\r\n\r\n try {\r\n console.log('🔐 Opening browser for authentication...\\n');\r\n\r\n // Start local callback server (silently)\r\n const callbackPromise = startCallbackServer(callbackPort);\r\n\r\n // Open web app for user to authenticate\r\n await open(webAppUrl);\r\n\r\n // Wait for callback from web app (silently)\r\n const { code, state } = await callbackPromise;\r\n\r\n // The web app already exchanged the code for a session token\r\n // and sent it to us via the callback\r\n const sessionToken = code;\r\n\r\n // Save the session token to local storage\r\n apiClient.setSessionToken(sessionToken);\r\n\r\n // Get user profile from backend\r\n let user;\r\n try {\r\n user = await apiClient.getCurrentUser();\r\n } catch (error) {\r\n // If we can't get user profile, use placeholder\r\n user = {\r\n id: state,\r\n email: 'user@example.com',\r\n fullName: 'User',\r\n createdAt: new Date().toISOString(),\r\n };\r\n }\r\n\r\n console.log(`✅ You are signed in as ${user.fullName}\\n`);\r\n\r\n return {\r\n success: true,\r\n sessionToken,\r\n user: {\r\n id: user.id,\r\n email: user.email,\r\n fullName: user.fullName,\r\n },\r\n };\r\n } catch (error: any) {\r\n console.error('❌ Authentication failed:', error.message);\r\n\r\n return {\r\n success: false,\r\n error: error.message,\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Check if user is already authenticated\r\n */\r\nexport function isAuthenticated(): boolean {\r\n return apiClient.isAuthenticated();\r\n}\r\n\r\n/**\r\n * Logout and clear session\r\n */\r\nexport async function logout(): Promise<void> {\r\n try {\r\n await apiClient.logout();\r\n console.log('✅ Logged out successfully');\r\n } catch (error: any) {\r\n console.error('❌ Logout failed:', error.message);\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
|