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,"
|
|
1
|
+
{"version":3,"sources":["../../src/mcp/mcp-tool-wrapper.ts"],"sourcesContent":["import { Tool, ToolExecutionContext } from '../tools/types.js';\r\nimport { MCPServerManager, MCPTool } from './mcp-server-manager.js';\r\n\r\n/**\r\n * Sanitize JSON Schema for Gemini compatibility\r\n * Removes properties that Gemini doesn't support\r\n */\r\nfunction sanitizeSchemaForGemini(schema: any): any {\r\n if (!schema || typeof schema !== 'object') {\r\n return schema;\r\n }\r\n\r\n // Create a copy to avoid mutating the original\r\n const sanitized = Array.isArray(schema) ? [...schema] : { ...schema };\r\n\r\n // Remove unsupported properties\r\n const unsupportedProps = [\r\n 'exclusiveMinimum',\r\n 'exclusiveMaximum',\r\n 'const',\r\n 'contentMediaType',\r\n 'contentEncoding',\r\n 'examples',\r\n '$schema',\r\n '$id',\r\n '$ref',\r\n 'definitions',\r\n '$defs'\r\n ];\r\n\r\n for (const prop of unsupportedProps) {\r\n delete sanitized[prop];\r\n }\r\n\r\n // Recursively sanitize nested objects\r\n for (const key in sanitized) {\r\n if (typeof sanitized[key] === 'object' && sanitized[key] !== null) {\r\n sanitized[key] = sanitizeSchemaForGemini(sanitized[key]);\r\n }\r\n }\r\n\r\n return sanitized;\r\n}\r\n\r\n/**\r\n * Create a Tool wrapper for an MCP tool\r\n * This allows MCP tools to be registered in the Centaurus tool registry\r\n */\r\nexport function createMCPToolWrapper(\r\n serverName: string,\r\n mcpTool: MCPTool,\r\n serverManager: MCPServerManager\r\n): Tool {\r\n // Sanitize the input schema to remove Gemini-incompatible properties\r\n const sanitizedSchema = sanitizeSchemaForGemini(mcpTool.inputSchema || {\r\n type: 'object',\r\n properties: {},\r\n required: []\r\n });\r\n\r\n return {\r\n schema: {\r\n name: `mcp_${serverName}_${mcpTool.name}`,\r\n description: mcpTool.description || `${mcpTool.name} from ${serverName} MCP server`,\r\n parameters: sanitizedSchema\r\n },\r\n async execute(args: Record<string, any>, context: ToolExecutionContext): Promise<string> {\r\n try {\r\n // Check if server is still connected\r\n if (!serverManager.isConnected(serverName)) {\r\n throw new Error(`MCP server '${serverName}' is not connected`);\r\n }\r\n\r\n // Request user approval before executing MCP tools\r\n // MCP tools can have side effects so they should be treated as risky operations\r\n const toolDisplayName = `mcp_${serverName}_${mcpTool.name}`;\r\n\r\n const approved = await context.requireApproval(\r\n `Execute MCP tool: ${serverName} ${mcpTool.name}`,\r\n true // MCP tools are considered risky as they can have side effects\r\n );\r\n\r\n if (!approved || (typeof approved === 'object' && !approved.approved)) {\r\n return 'MCP tool execution cancelled by user.';\r\n }\r\n\r\n // Call the MCP tool\r\n const result = await serverManager.callTool(serverName, mcpTool.name, args);\r\n\r\n // Extract content from result\r\n if (result.content && Array.isArray(result.content)) {\r\n // MCP tools return content as an array of content items\r\n return result.content\r\n .map((item: any) => {\r\n if (item.type === 'text') {\r\n return item.text;\r\n } else if (item.type === 'image') {\r\n return `[Image: ${item.data}]`;\r\n } else if (item.type === 'resource') {\r\n return `[Resource: ${item.resource?.uri}]`;\r\n }\r\n return JSON.stringify(item);\r\n })\r\n .join('\\n');\r\n }\r\n\r\n // Fallback: return JSON stringified result\r\n return JSON.stringify(result, null, 2);\r\n } catch (error: any) {\r\n throw new Error(`MCP tool execution failed: ${error.message}`);\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Create tool wrappers for all tools from an MCP server\r\n */\r\nexport function createMCPToolWrappers(\r\n serverName: string,\r\n tools: MCPTool[],\r\n serverManager: MCPServerManager\r\n): Tool[] {\r\n return tools.map(tool => createMCPToolWrapper(serverName, tool, serverManager));\r\n}\r\n"],"mappings":"AAOA,SAAS,wBAAwB,QAAkB;AAC/C,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACvC,WAAO;AAAA,EACX;AAGA,QAAM,YAAY,MAAM,QAAQ,MAAM,IAAI,CAAC,GAAG,MAAM,IAAI,EAAE,GAAG,OAAO;AAGpE,QAAM,mBAAmB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ;AAEA,aAAW,QAAQ,kBAAkB;AACjC,WAAO,UAAU,IAAI;AAAA,EACzB;AAGA,aAAW,OAAO,WAAW;AACzB,QAAI,OAAO,UAAU,GAAG,MAAM,YAAY,UAAU,GAAG,MAAM,MAAM;AAC/D,gBAAU,GAAG,IAAI,wBAAwB,UAAU,GAAG,CAAC;AAAA,IAC3D;AAAA,EACJ;AAEA,SAAO;AACX;AAMO,SAAS,qBACZ,YACA,SACA,eACI;AAEJ,QAAM,kBAAkB,wBAAwB,QAAQ,eAAe;AAAA,IACnE,MAAM;AAAA,IACN,YAAY,CAAC;AAAA,IACb,UAAU,CAAC;AAAA,EACf,CAAC;AAED,SAAO;AAAA,IACH,QAAQ;AAAA,MACJ,MAAM,OAAO,UAAU,IAAI,QAAQ,IAAI;AAAA,MACvC,aAAa,QAAQ,eAAe,GAAG,QAAQ,IAAI,SAAS,UAAU;AAAA,MACtE,YAAY;AAAA,IAChB;AAAA,IACA,MAAM,QAAQ,MAA2B,SAAgD;AACrF,UAAI;AAEA,YAAI,CAAC,cAAc,YAAY,UAAU,GAAG;AACxC,gBAAM,IAAI,MAAM,eAAe,UAAU,oBAAoB;AAAA,QACjE;AAIA,cAAM,kBAAkB,OAAO,UAAU,IAAI,QAAQ,IAAI;AAEzD,cAAM,WAAW,MAAM,QAAQ;AAAA,UAC3B,qBAAqB,UAAU,IAAI,QAAQ,IAAI;AAAA,UAC/C;AAAA;AAAA,QACJ;AAEA,YAAI,CAAC,YAAa,OAAO,aAAa,YAAY,CAAC,SAAS,UAAW;AACnE,iBAAO;AAAA,QACX;AAGA,cAAM,SAAS,MAAM,cAAc,SAAS,YAAY,QAAQ,MAAM,IAAI;AAG1E,YAAI,OAAO,WAAW,MAAM,QAAQ,OAAO,OAAO,GAAG;AAEjD,iBAAO,OAAO,QACT,IAAI,CAAC,SAAc;AAChB,gBAAI,KAAK,SAAS,QAAQ;AACtB,qBAAO,KAAK;AAAA,YAChB,WAAW,KAAK,SAAS,SAAS;AAC9B,qBAAO,WAAW,KAAK,IAAI;AAAA,YAC/B,WAAW,KAAK,SAAS,YAAY;AACjC,qBAAO,cAAc,KAAK,UAAU,GAAG;AAAA,YAC3C;AACA,mBAAO,KAAK,UAAU,IAAI;AAAA,UAC9B,CAAC,EACA,KAAK,IAAI;AAAA,QAClB;AAGA,eAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,MACzC,SAAS,OAAY;AACjB,cAAM,IAAI,MAAM,8BAA8B,MAAM,OAAO,EAAE;AAAA,MACjE;AAAA,IACJ;AAAA,EACJ;AACJ;AAKO,SAAS,sBACZ,YACA,OACA,eACM;AACN,SAAO,MAAM,IAAI,UAAQ,qBAAqB,YAAY,MAAM,aAAa,CAAC;AAClF;","names":[]}
|
|
@@ -1,189 +1,177 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
EXAMPLES:
|
|
24
|
-
User typing: "git st" → git status
|
|
25
|
-
User typing: "npm i" → npm install
|
|
26
|
-
User typing: "cd .." → cd ..
|
|
27
|
-
User typing: "py te" (files: [test.py, main.py]) → python test.py
|
|
28
|
-
User typing: "cat rea" (files: [README.md]) → cat README.md
|
|
29
|
-
User typing: "xyz123" → NONE`;
|
|
30
|
-
// ==================== AIAutocompleteAgent Class ====================
|
|
1
|
+
import { aiServiceClient } from "./ai-service-client.js";
|
|
2
|
+
import { quickLog } from "../utils/conversation-logger.js";
|
|
3
|
+
const MODEL = "gemini-2.0-flash-lite";
|
|
4
|
+
const DEBOUNCE_MS = 5e3;
|
|
5
|
+
const AUTOCOMPLETE_SYSTEM_PROMPT = `You are a command prediction assistant. Your job is to predict the FULL command the user is trying to type based on their current input and context.
|
|
6
|
+
|
|
7
|
+
RULES:
|
|
8
|
+
1. Respond with ONLY the predicted full command - no explanations, no quotes, no markdown
|
|
9
|
+
2. If you cannot confidently predict a command, respond with exactly "NONE"
|
|
10
|
+
3. The prediction should be a complete, valid command that would work in the given OS and directory
|
|
11
|
+
4. Consider the user's command history in this directory and session when making predictions
|
|
12
|
+
5. USE THE FILE LIST: If the user is typing a command that operates on a file (like 'python', 'cat', 'ls'), try to complete the filename from the provided list.
|
|
13
|
+
6. Be conservative - only predict when you have high confidence
|
|
14
|
+
|
|
15
|
+
EXAMPLES:
|
|
16
|
+
User typing: "git st" \u2192 git status
|
|
17
|
+
User typing: "npm i" \u2192 npm install
|
|
18
|
+
User typing: "cd .." \u2192 cd ..
|
|
19
|
+
User typing: "py te" (files: [test.py, main.py]) \u2192 python test.py
|
|
20
|
+
User typing: "cat rea" (files: [README.md]) \u2192 cat README.md
|
|
21
|
+
User typing: "xyz123" \u2192 NONE`;
|
|
31
22
|
class AIAutocompleteAgentClass {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
// Don't predict for slash commands
|
|
43
|
-
if (context.currentInput.startsWith('/')) {
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
// Don't predict for file tags
|
|
47
|
-
if (context.currentInput.includes('@')) {
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
// Cancel any pending request
|
|
51
|
-
this.abort();
|
|
52
|
-
// Create new abort controller
|
|
53
|
-
const abortController = new AbortController();
|
|
54
|
-
this.pendingRequest = abortController;
|
|
55
|
-
// Merge signals if external signal provided
|
|
56
|
-
const effectiveSignal = signal
|
|
57
|
-
? this.mergeSignals(signal, abortController.signal)
|
|
58
|
-
: abortController.signal;
|
|
59
|
-
try {
|
|
60
|
-
const prediction = await this.callAI(context, effectiveSignal);
|
|
61
|
-
return prediction;
|
|
62
|
-
}
|
|
63
|
-
catch (error) {
|
|
64
|
-
if (error.name === 'AbortError' || error.message === 'AbortError') {
|
|
65
|
-
// Request was cancelled, this is expected
|
|
66
|
-
return null;
|
|
67
|
-
}
|
|
68
|
-
quickLog(`[${new Date().toISOString()}] [AIAutocompleteAgent] Prediction error: ${error.message}\n`);
|
|
69
|
-
return null;
|
|
70
|
-
}
|
|
71
|
-
finally {
|
|
72
|
-
if (this.pendingRequest === abortController) {
|
|
73
|
-
this.pendingRequest = null;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
23
|
+
pendingRequest = null;
|
|
24
|
+
/**
|
|
25
|
+
* Predict the full command the user is trying to type
|
|
26
|
+
* Returns null if no confident prediction can be made
|
|
27
|
+
*/
|
|
28
|
+
async predictCommand(context, signal) {
|
|
29
|
+
if (!context.currentInput || context.currentInput.trim().length < 2) {
|
|
30
|
+
return null;
|
|
76
31
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
*/
|
|
80
|
-
abort() {
|
|
81
|
-
if (this.pendingRequest) {
|
|
82
|
-
this.pendingRequest.abort();
|
|
83
|
-
this.pendingRequest = null;
|
|
84
|
-
}
|
|
32
|
+
if (context.currentInput.startsWith("/")) {
|
|
33
|
+
return null;
|
|
85
34
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
35
|
+
if (context.currentInput.includes("@")) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
this.abort();
|
|
39
|
+
const abortController = new AbortController();
|
|
40
|
+
this.pendingRequest = abortController;
|
|
41
|
+
const effectiveSignal = signal ? this.mergeSignals(signal, abortController.signal) : abortController.signal;
|
|
42
|
+
try {
|
|
43
|
+
const prediction = await this.callAI(context, effectiveSignal);
|
|
44
|
+
return prediction;
|
|
45
|
+
} catch (error) {
|
|
46
|
+
if (error.name === "AbortError" || error.message === "AbortError") {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
quickLog(`[${(/* @__PURE__ */ new Date()).toISOString()}] [AIAutocompleteAgent] Prediction error: ${error.message}
|
|
50
|
+
`);
|
|
51
|
+
return null;
|
|
52
|
+
} finally {
|
|
53
|
+
if (this.pendingRequest === abortController) {
|
|
54
|
+
this.pendingRequest = null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Abort any pending prediction request
|
|
60
|
+
*/
|
|
61
|
+
abort() {
|
|
62
|
+
if (this.pendingRequest) {
|
|
63
|
+
this.pendingRequest.abort();
|
|
64
|
+
this.pendingRequest = null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Call the AI model to get a prediction
|
|
69
|
+
*/
|
|
70
|
+
async callAI(context, signal) {
|
|
71
|
+
const contextParts = [
|
|
72
|
+
`OS: ${context.os}`,
|
|
73
|
+
`Platform: ${context.platform}`,
|
|
74
|
+
`Current Directory: ${context.cwd}`
|
|
75
|
+
];
|
|
76
|
+
if (context.files && context.files.length > 0) {
|
|
77
|
+
const fileList = context.files.slice(0, 50);
|
|
78
|
+
contextParts.push(`Files in current directory:
|
|
79
|
+
${fileList.join("\n")}`);
|
|
80
|
+
}
|
|
81
|
+
if (context.directoryHistory.length > 0) {
|
|
82
|
+
const recentDirHistory = context.directoryHistory.slice(0, 10);
|
|
83
|
+
contextParts.push(`Recent commands in this directory:
|
|
84
|
+
${recentDirHistory.join("\n")}`);
|
|
85
|
+
}
|
|
86
|
+
if (context.sessionCommands.length > 0) {
|
|
87
|
+
const recentSession = context.sessionCommands.slice(-10);
|
|
88
|
+
contextParts.push(`Commands run in this session:
|
|
89
|
+
${recentSession.join("\n")}`);
|
|
90
|
+
}
|
|
91
|
+
const userPrompt = `${contextParts.join("\n\n")}
|
|
92
|
+
|
|
93
|
+
User is currently typing: "${context.currentInput}"
|
|
94
|
+
|
|
112
95
|
What is the full command they are trying to type?`;
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
return null;
|
|
157
|
-
}
|
|
158
|
-
// Don't return the prediction if it's the same as the current input
|
|
159
|
-
if (prediction.toLowerCase() === context.currentInput.toLowerCase()) {
|
|
160
|
-
return null;
|
|
161
|
-
}
|
|
162
|
-
// Don't return if prediction doesn't start with the current input (should be a completion)
|
|
163
|
-
if (!prediction.toLowerCase().startsWith(context.currentInput.toLowerCase())) {
|
|
164
|
-
return null;
|
|
165
|
-
}
|
|
166
|
-
quickLog(`[${new Date().toISOString()}] [AIAutocompleteAgent] Valid Prediction: "${prediction}" for input "${context.currentInput}"\n`);
|
|
167
|
-
return prediction;
|
|
96
|
+
const messages = [
|
|
97
|
+
{ role: "user", content: AUTOCOMPLETE_SYSTEM_PROMPT + "\n\n" + userPrompt }
|
|
98
|
+
];
|
|
99
|
+
quickLog(`[${(/* @__PURE__ */ new Date()).toISOString()}] [AIAutocompleteAgent] Context: ${JSON.stringify(context, null, 2)}
|
|
100
|
+
`);
|
|
101
|
+
quickLog(`[${(/* @__PURE__ */ new Date()).toISOString()}] [AIAutocompleteAgent] Full Prompt:
|
|
102
|
+
${JSON.stringify(messages, null, 2)}
|
|
103
|
+
`);
|
|
104
|
+
let responseText = "";
|
|
105
|
+
try {
|
|
106
|
+
for await (const chunk of aiServiceClient.streamChat(
|
|
107
|
+
MODEL,
|
|
108
|
+
messages,
|
|
109
|
+
[],
|
|
110
|
+
// No tools needed
|
|
111
|
+
{
|
|
112
|
+
cwd: context.cwd,
|
|
113
|
+
platform: context.platform,
|
|
114
|
+
shell: process.platform === "win32" ? "powershell" : "bash",
|
|
115
|
+
os: context.os === "win32" ? "windows" : context.os === "darwin" ? "macos" : "linux",
|
|
116
|
+
homeDir: ""
|
|
117
|
+
},
|
|
118
|
+
void 0,
|
|
119
|
+
void 0,
|
|
120
|
+
signal
|
|
121
|
+
)) {
|
|
122
|
+
if (signal.aborted) {
|
|
123
|
+
throw new Error("AbortError");
|
|
124
|
+
}
|
|
125
|
+
if (chunk.type === "text") {
|
|
126
|
+
responseText += chunk.content;
|
|
127
|
+
}
|
|
128
|
+
if (responseText.length > 200) {
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
} catch (error) {
|
|
133
|
+
if (error.message === "AbortError" || error.name === "AbortError") {
|
|
134
|
+
const abortError = new Error("AbortError");
|
|
135
|
+
abortError.name = "AbortError";
|
|
136
|
+
throw abortError;
|
|
137
|
+
}
|
|
138
|
+
throw error;
|
|
168
139
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
140
|
+
const prediction = responseText.trim();
|
|
141
|
+
quickLog(`[${(/* @__PURE__ */ new Date()).toISOString()}] [AIAutocompleteAgent] Raw AI Response: "${prediction}"
|
|
142
|
+
`);
|
|
143
|
+
if (!prediction || prediction.toUpperCase() === "NONE" || prediction.length < 2) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
if (prediction.toLowerCase() === context.currentInput.toLowerCase()) {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
if (!prediction.toLowerCase().startsWith(context.currentInput.toLowerCase())) {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
quickLog(`[${(/* @__PURE__ */ new Date()).toISOString()}] [AIAutocompleteAgent] Valid Prediction: "${prediction}" for input "${context.currentInput}"
|
|
153
|
+
`);
|
|
154
|
+
return prediction;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Merge two abort signals into one
|
|
158
|
+
*/
|
|
159
|
+
mergeSignals(signal1, signal2) {
|
|
160
|
+
const controller = new AbortController();
|
|
161
|
+
const abort = () => controller.abort();
|
|
162
|
+
if (signal1.aborted || signal2.aborted) {
|
|
163
|
+
controller.abort();
|
|
164
|
+
} else {
|
|
165
|
+
signal1.addEventListener("abort", abort, { once: true });
|
|
166
|
+
signal2.addEventListener("abort", abort, { once: true });
|
|
183
167
|
}
|
|
168
|
+
return controller.signal;
|
|
169
|
+
}
|
|
184
170
|
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
171
|
+
const AIAutocompleteAgent = new AIAutocompleteAgentClass();
|
|
172
|
+
const AI_AUTOCOMPLETE_DEBOUNCE_MS = DEBOUNCE_MS;
|
|
173
|
+
export {
|
|
174
|
+
AIAutocompleteAgent,
|
|
175
|
+
AI_AUTOCOMPLETE_DEBOUNCE_MS
|
|
176
|
+
};
|
|
189
177
|
//# sourceMappingURL=ai-autocomplete-agent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-autocomplete-agent.js","sourceRoot":"","sources":["../../src/services/ai-autocomplete-agent.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/services/ai-autocomplete-agent.ts"],"sourcesContent":["/**\r\n * AI Autocomplete Agent Service\r\n * \r\n * A lightweight AI agent using gemini-2.0-flash-lite that predicts commands\r\n * the user is trying to type. Triggered after 5 seconds of input inactivity.\r\n */\r\n\r\nimport { aiServiceClient, Message as AIMessage } from './ai-service-client.js';\r\nimport { quickLog } from '../utils/conversation-logger.js';\r\n\r\n// ==================== Constants ====================\r\n\r\nconst MODEL = 'gemini-2.0-flash-lite'; // Fast, cheap model for prediction\r\nconst DEBOUNCE_MS = 5000; // 5 seconds of inactivity before triggering\r\n\r\n// ==================== Types ====================\r\n\r\nexport interface AutocompleteContext {\r\n os: string;\r\n platform: string;\r\n cwd: string;\r\n directoryHistory: string[]; // Commands previously run in this directory\r\n sessionCommands: string[]; // Commands run in this chat session\r\n files: string[]; // Files/folders in current directory (context)\r\n currentInput: string; // What user is currently typing\r\n}\r\n\r\n// ==================== System Prompt ====================\r\n\r\nconst AUTOCOMPLETE_SYSTEM_PROMPT = `You are a command prediction assistant. Your job is to predict the FULL command the user is trying to type based on their current input and context.\r\n\r\nRULES:\r\n1. Respond with ONLY the predicted full command - no explanations, no quotes, no markdown\r\n2. If you cannot confidently predict a command, respond with exactly \"NONE\"\r\n3. The prediction should be a complete, valid command that would work in the given OS and directory\r\n4. Consider the user's command history in this directory and session when making predictions\r\n5. USE THE FILE LIST: If the user is typing a command that operates on a file (like 'python', 'cat', 'ls'), try to complete the filename from the provided list.\r\n6. Be conservative - only predict when you have high confidence\r\n\r\nEXAMPLES:\r\nUser typing: \"git st\" → git status\r\nUser typing: \"npm i\" → npm install\r\nUser typing: \"cd ..\" → cd ..\r\nUser typing: \"py te\" (files: [test.py, main.py]) → python test.py\r\nUser typing: \"cat rea\" (files: [README.md]) → cat README.md\r\nUser typing: \"xyz123\" → NONE`;\r\n\r\n// ==================== AIAutocompleteAgent Class ====================\r\n\r\nclass AIAutocompleteAgentClass {\r\n private pendingRequest: AbortController | null = null;\r\n\r\n /**\r\n * Predict the full command the user is trying to type\r\n * Returns null if no confident prediction can be made\r\n */\r\n async predictCommand(context: AutocompleteContext, signal?: AbortSignal): Promise<string | null> {\r\n // Don't predict for empty or very short inputs\r\n if (!context.currentInput || context.currentInput.trim().length < 2) {\r\n return null;\r\n }\r\n\r\n // Don't predict for slash commands\r\n if (context.currentInput.startsWith('/')) {\r\n return null;\r\n }\r\n\r\n // Don't predict for file tags\r\n if (context.currentInput.includes('@')) {\r\n return null;\r\n }\r\n\r\n // Cancel any pending request\r\n this.abort();\r\n\r\n // Create new abort controller\r\n const abortController = new AbortController();\r\n this.pendingRequest = abortController;\r\n\r\n // Merge signals if external signal provided\r\n const effectiveSignal = signal\r\n ? this.mergeSignals(signal, abortController.signal)\r\n : abortController.signal;\r\n\r\n try {\r\n const prediction = await this.callAI(context, effectiveSignal);\r\n return prediction;\r\n } catch (error: any) {\r\n if (error.name === 'AbortError' || error.message === 'AbortError') {\r\n // Request was cancelled, this is expected\r\n return null;\r\n }\r\n quickLog(`[${new Date().toISOString()}] [AIAutocompleteAgent] Prediction error: ${error.message}\\n`);\r\n return null;\r\n } finally {\r\n if (this.pendingRequest === abortController) {\r\n this.pendingRequest = null;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Abort any pending prediction request\r\n */\r\n abort(): void {\r\n if (this.pendingRequest) {\r\n this.pendingRequest.abort();\r\n this.pendingRequest = null;\r\n }\r\n }\r\n\r\n /**\r\n * Call the AI model to get a prediction\r\n */\r\n private async callAI(context: AutocompleteContext, signal: AbortSignal): Promise<string | null> {\r\n // Build context string\r\n const contextParts: string[] = [\r\n `OS: ${context.os}`,\r\n `Platform: ${context.platform}`,\r\n `Current Directory: ${context.cwd}`,\r\n ];\r\n\r\n if (context.files && context.files.length > 0) {\r\n const fileList = context.files.slice(0, 50); // Hard limit just in case\r\n contextParts.push(`Files in current directory:\\n${fileList.join('\\n')}`);\r\n }\r\n\r\n if (context.directoryHistory.length > 0) {\r\n const recentDirHistory = context.directoryHistory.slice(0, 10); // Take top 10 most frequent/recent\r\n contextParts.push(`Recent commands in this directory:\\n${recentDirHistory.join('\\n')}`);\r\n }\r\n\r\n if (context.sessionCommands.length > 0) {\r\n const recentSession = context.sessionCommands.slice(-10);\r\n contextParts.push(`Commands run in this session:\\n${recentSession.join('\\n')}`);\r\n }\r\n\r\n const userPrompt = `${contextParts.join('\\n\\n')}\r\n\r\nUser is currently typing: \"${context.currentInput}\"\r\n\r\nWhat is the full command they are trying to type?`;\r\n\r\n // Build messages\r\n const messages: AIMessage[] = [\r\n { role: 'user', content: AUTOCOMPLETE_SYSTEM_PROMPT + '\\n\\n' + userPrompt }\r\n ];\r\n\r\n // Log detailed context and prompt for debugging\r\n quickLog(`[${new Date().toISOString()}] [AIAutocompleteAgent] Context: ${JSON.stringify(context, null, 2)}\\n`);\r\n quickLog(`[${new Date().toISOString()}] [AIAutocompleteAgent] Full Prompt:\\n${JSON.stringify(messages, null, 2)}\\n`);\r\n\r\n // Stream AI response\r\n let responseText = '';\r\n\r\n try {\r\n for await (const chunk of aiServiceClient.streamChat(\r\n MODEL,\r\n messages,\r\n [], // No tools needed\r\n {\r\n cwd: context.cwd,\r\n platform: context.platform,\r\n shell: process.platform === 'win32' ? 'powershell' : 'bash',\r\n os: (context.os === 'win32' ? 'windows' : context.os === 'darwin' ? 'macos' : 'linux') as 'linux' | 'windows' | 'macos',\r\n homeDir: ''\r\n },\r\n undefined,\r\n undefined,\r\n signal\r\n )) {\r\n if (signal.aborted) {\r\n throw new Error('AbortError');\r\n }\r\n\r\n if (chunk.type === 'text') {\r\n responseText += chunk.content;\r\n }\r\n\r\n // Early exit if response is getting too long (should be a single command)\r\n if (responseText.length > 200) {\r\n break;\r\n }\r\n }\r\n } catch (error: any) {\r\n if (error.message === 'AbortError' || error.name === 'AbortError') {\r\n const abortError = new Error('AbortError');\r\n abortError.name = 'AbortError';\r\n throw abortError;\r\n }\r\n throw error;\r\n }\r\n\r\n // Parse response\r\n const prediction = responseText.trim();\r\n\r\n quickLog(`[${new Date().toISOString()}] [AIAutocompleteAgent] Raw AI Response: \"${prediction}\"\\n`);\r\n\r\n // Check for NONE or invalid predictions\r\n if (!prediction || prediction.toUpperCase() === 'NONE' || prediction.length < 2) {\r\n return null;\r\n }\r\n\r\n // Don't return the prediction if it's the same as the current input\r\n if (prediction.toLowerCase() === context.currentInput.toLowerCase()) {\r\n return null;\r\n }\r\n\r\n // Don't return if prediction doesn't start with the current input (should be a completion)\r\n if (!prediction.toLowerCase().startsWith(context.currentInput.toLowerCase())) {\r\n return null;\r\n }\r\n\r\n quickLog(`[${new Date().toISOString()}] [AIAutocompleteAgent] Valid Prediction: \"${prediction}\" for input \"${context.currentInput}\"\\n`);\r\n\r\n return prediction;\r\n }\r\n\r\n /**\r\n * Merge two abort signals into one\r\n */\r\n private mergeSignals(signal1: AbortSignal, signal2: AbortSignal): AbortSignal {\r\n const controller = new AbortController();\r\n\r\n const abort = () => controller.abort();\r\n\r\n if (signal1.aborted || signal2.aborted) {\r\n controller.abort();\r\n } else {\r\n signal1.addEventListener('abort', abort, { once: true });\r\n signal2.addEventListener('abort', abort, { once: true });\r\n }\r\n\r\n return controller.signal;\r\n }\r\n}\r\n\r\n// Export singleton\r\nexport const AIAutocompleteAgent = new AIAutocompleteAgentClass();\r\n\r\n// Export debounce constant for use in InputBox\r\nexport const AI_AUTOCOMPLETE_DEBOUNCE_MS = DEBOUNCE_MS;\r\n"],"mappings":"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","names":[]}
|