centaurus-cli 2.0.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/AUTH_FLOW.md +138 -0
- package/CONFIG_GUIDE.md +255 -0
- package/LICENSE +21 -0
- package/README.md +346 -0
- package/dist/ai/provider-factory.d.ts +6 -0
- package/dist/ai/provider-factory.d.ts.map +1 -0
- package/dist/ai/provider-factory.js +27 -0
- package/dist/ai/provider-factory.js.map +1 -0
- package/dist/ai/providers/base.d.ts +25 -0
- package/dist/ai/providers/base.d.ts.map +1 -0
- package/dist/ai/providers/base.js +9 -0
- package/dist/ai/providers/base.js.map +1 -0
- package/dist/ai/providers/gemini.d.ts +34 -0
- package/dist/ai/providers/gemini.d.ts.map +1 -0
- package/dist/ai/providers/gemini.js +146 -0
- package/dist/ai/providers/gemini.js.map +1 -0
- package/dist/ai/types.d.ts +20 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +2 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/cli-adapter.d.ts +78 -0
- package/dist/cli-adapter.d.ts.map +1 -0
- package/dist/cli-adapter.js +605 -0
- package/dist/cli-adapter.js.map +1 -0
- package/dist/commands/CommandParser.d.ts +27 -0
- package/dist/commands/CommandParser.d.ts.map +1 -0
- package/dist/commands/CommandParser.js +238 -0
- package/dist/commands/CommandParser.js.map +1 -0
- package/dist/config/ConfigManager.d.ts +59 -0
- package/dist/config/ConfigManager.d.ts.map +1 -0
- package/dist/config/ConfigManager.js +332 -0
- package/dist/config/ConfigManager.js.map +1 -0
- package/dist/config/defaultConfig.d.ts +82 -0
- package/dist/config/defaultConfig.d.ts.map +1 -0
- package/dist/config/defaultConfig.js +88 -0
- package/dist/config/defaultConfig.js.map +1 -0
- package/dist/config/manager.d.ts +60 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +162 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/types.d.ts +9 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +6 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index-custom.d.ts +3 -0
- package/dist/index-custom.d.ts.map +1 -0
- package/dist/index-custom.js +65 -0
- package/dist/index-custom.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +102 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/system-prompt.d.ts +47 -0
- package/dist/prompts/system-prompt.d.ts.map +1 -0
- package/dist/prompts/system-prompt.js +378 -0
- package/dist/prompts/system-prompt.js.map +1 -0
- package/dist/providers/GoogleProvider.d.ts +26 -0
- package/dist/providers/GoogleProvider.d.ts.map +1 -0
- package/dist/providers/GoogleProvider.js +313 -0
- package/dist/providers/GoogleProvider.js.map +1 -0
- package/dist/providers/Provider.d.ts +114 -0
- package/dist/providers/Provider.d.ts.map +1 -0
- package/dist/providers/Provider.js +44 -0
- package/dist/providers/Provider.js.map +1 -0
- package/dist/services/api-client.d.ts +282 -0
- package/dist/services/api-client.d.ts.map +1 -0
- package/dist/services/api-client.js +339 -0
- package/dist/services/api-client.js.map +1 -0
- package/dist/services/auth-handler.d.ts +30 -0
- package/dist/services/auth-handler.d.ts.map +1 -0
- package/dist/services/auth-handler.js +210 -0
- package/dist/services/auth-handler.js.map +1 -0
- package/dist/services/conversation-manager.d.ts +73 -0
- package/dist/services/conversation-manager.d.ts.map +1 -0
- package/dist/services/conversation-manager.js +128 -0
- package/dist/services/conversation-manager.js.map +1 -0
- package/dist/tests/automated-verification.d.ts +27 -0
- package/dist/tests/automated-verification.d.ts.map +1 -0
- package/dist/tests/automated-verification.js +359 -0
- package/dist/tests/automated-verification.js.map +1 -0
- package/dist/tests/integration-tests.d.ts +50 -0
- package/dist/tests/integration-tests.d.ts.map +1 -0
- package/dist/tests/integration-tests.js +648 -0
- package/dist/tests/integration-tests.js.map +1 -0
- package/dist/tools/ToolRegistry.d.ts +44 -0
- package/dist/tools/ToolRegistry.d.ts.map +1 -0
- package/dist/tools/ToolRegistry.js +494 -0
- package/dist/tools/ToolRegistry.js.map +1 -0
- package/dist/tools/command.d.ts +4 -0
- package/dist/tools/command.d.ts.map +1 -0
- package/dist/tools/command.js +117 -0
- package/dist/tools/command.js.map +1 -0
- package/dist/tools/file-ops-test.d.ts +6 -0
- package/dist/tools/file-ops-test.d.ts.map +1 -0
- package/dist/tools/file-ops-test.js +197 -0
- package/dist/tools/file-ops-test.js.map +1 -0
- package/dist/tools/file-ops.d.ts +6 -0
- package/dist/tools/file-ops.d.ts.map +1 -0
- package/dist/tools/file-ops.js +189 -0
- package/dist/tools/file-ops.js.map +1 -0
- package/dist/tools/plan-mode.d.ts +53 -0
- package/dist/tools/plan-mode.d.ts.map +1 -0
- package/dist/tools/plan-mode.js +202 -0
- package/dist/tools/plan-mode.js.map +1 -0
- package/dist/tools/registry.d.ts +30 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +67 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +34 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/web-search.d.ts +24 -0
- package/dist/tools/web-search.d.ts.map +1 -0
- package/dist/tools/web-search.js +194 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/types/index.d.ts +32 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui/DisplayHistory.d.ts +53 -0
- package/dist/ui/DisplayHistory.d.ts.map +1 -0
- package/dist/ui/DisplayHistory.js +82 -0
- package/dist/ui/DisplayHistory.js.map +1 -0
- package/dist/ui/clack-ui.d.ts +83 -0
- package/dist/ui/clack-ui.d.ts.map +1 -0
- package/dist/ui/clack-ui.js +304 -0
- package/dist/ui/clack-ui.js.map +1 -0
- package/dist/ui/components/App.d.ts +47 -0
- package/dist/ui/components/App.d.ts.map +1 -0
- package/dist/ui/components/App.js +389 -0
- package/dist/ui/components/App.js.map +1 -0
- package/dist/ui/components/AuthScreen.d.ts +8 -0
- package/dist/ui/components/AuthScreen.d.ts.map +1 -0
- package/dist/ui/components/AuthScreen.js +37 -0
- package/dist/ui/components/AuthScreen.js.map +1 -0
- package/dist/ui/components/AuthWelcomeScreen.d.ts +8 -0
- package/dist/ui/components/AuthWelcomeScreen.d.ts.map +1 -0
- package/dist/ui/components/AuthWelcomeScreen.js +34 -0
- package/dist/ui/components/AuthWelcomeScreen.js.map +1 -0
- package/dist/ui/components/CodeBlock.d.ts +9 -0
- package/dist/ui/components/CodeBlock.d.ts.map +1 -0
- package/dist/ui/components/CodeBlock.js +22 -0
- package/dist/ui/components/CodeBlock.js.map +1 -0
- package/dist/ui/components/ConfigViewer.d.ts +11 -0
- package/dist/ui/components/ConfigViewer.d.ts.map +1 -0
- package/dist/ui/components/ConfigViewer.js +27 -0
- package/dist/ui/components/ConfigViewer.js.map +1 -0
- package/dist/ui/components/ConfirmPrompt.d.ts +11 -0
- package/dist/ui/components/ConfirmPrompt.d.ts.map +1 -0
- package/dist/ui/components/ConfirmPrompt.js +55 -0
- package/dist/ui/components/ConfirmPrompt.js.map +1 -0
- package/dist/ui/components/DiffViewer.d.ts +8 -0
- package/dist/ui/components/DiffViewer.d.ts.map +1 -0
- package/dist/ui/components/DiffViewer.js +63 -0
- package/dist/ui/components/DiffViewer.js.map +1 -0
- package/dist/ui/components/DisplayItemRenderer.d.ts +18 -0
- package/dist/ui/components/DisplayItemRenderer.d.ts.map +1 -0
- package/dist/ui/components/DisplayItemRenderer.js +53 -0
- package/dist/ui/components/DisplayItemRenderer.js.map +1 -0
- package/dist/ui/components/DynamicMessage.d.ts +13 -0
- package/dist/ui/components/DynamicMessage.d.ts.map +1 -0
- package/dist/ui/components/DynamicMessage.js +27 -0
- package/dist/ui/components/DynamicMessage.js.map +1 -0
- package/dist/ui/components/ErrorBoundary.d.ts +16 -0
- package/dist/ui/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/ui/components/ErrorBoundary.js +25 -0
- package/dist/ui/components/ErrorBoundary.js.map +1 -0
- package/dist/ui/components/FileOperation.d.ts +10 -0
- package/dist/ui/components/FileOperation.d.ts.map +1 -0
- package/dist/ui/components/FileOperation.js +31 -0
- package/dist/ui/components/FileOperation.js.map +1 -0
- package/dist/ui/components/InputBox.d.ts +12 -0
- package/dist/ui/components/InputBox.d.ts.map +1 -0
- package/dist/ui/components/InputBox.js +50 -0
- package/dist/ui/components/InputBox.js.map +1 -0
- package/dist/ui/components/KeyboardHelp.d.ts +7 -0
- package/dist/ui/components/KeyboardHelp.d.ts.map +1 -0
- package/dist/ui/components/KeyboardHelp.js +25 -0
- package/dist/ui/components/KeyboardHelp.js.map +1 -0
- package/dist/ui/components/LoadingIndicator.d.ts +3 -0
- package/dist/ui/components/LoadingIndicator.d.ts.map +1 -0
- package/dist/ui/components/LoadingIndicator.js +25 -0
- package/dist/ui/components/LoadingIndicator.js.map +1 -0
- package/dist/ui/components/MarkdownRenderer.d.ts +8 -0
- package/dist/ui/components/MarkdownRenderer.d.ts.map +1 -0
- package/dist/ui/components/MarkdownRenderer.js +96 -0
- package/dist/ui/components/MarkdownRenderer.js.map +1 -0
- package/dist/ui/components/MessageBox.d.ts +10 -0
- package/dist/ui/components/MessageBox.d.ts.map +1 -0
- package/dist/ui/components/MessageBox.js +50 -0
- package/dist/ui/components/MessageBox.js.map +1 -0
- package/dist/ui/components/MessageDisplay.d.ts +8 -0
- package/dist/ui/components/MessageDisplay.d.ts.map +1 -0
- package/dist/ui/components/MessageDisplay.js +43 -0
- package/dist/ui/components/MessageDisplay.js.map +1 -0
- package/dist/ui/components/ScrollableContent.d.ts +7 -0
- package/dist/ui/components/ScrollableContent.d.ts.map +1 -0
- package/dist/ui/components/ScrollableContent.js +6 -0
- package/dist/ui/components/ScrollableContent.js.map +1 -0
- package/dist/ui/components/ScrollableMessageList.d.ts +10 -0
- package/dist/ui/components/ScrollableMessageList.d.ts.map +1 -0
- package/dist/ui/components/ScrollableMessageList.js +133 -0
- package/dist/ui/components/ScrollableMessageList.js.map +1 -0
- package/dist/ui/components/ScrollableScreen.d.ts +9 -0
- package/dist/ui/components/ScrollableScreen.d.ts.map +1 -0
- package/dist/ui/components/ScrollableScreen.js +22 -0
- package/dist/ui/components/ScrollableScreen.js.map +1 -0
- package/dist/ui/components/SelectPrompt.d.ts +12 -0
- package/dist/ui/components/SelectPrompt.d.ts.map +1 -0
- package/dist/ui/components/SelectPrompt.js +10 -0
- package/dist/ui/components/SelectPrompt.js.map +1 -0
- package/dist/ui/components/StaticMessageHistory.d.ts +14 -0
- package/dist/ui/components/StaticMessageHistory.d.ts.map +1 -0
- package/dist/ui/components/StaticMessageHistory.js +19 -0
- package/dist/ui/components/StaticMessageHistory.js.map +1 -0
- package/dist/ui/components/StatusBar.d.ts +10 -0
- package/dist/ui/components/StatusBar.d.ts.map +1 -0
- package/dist/ui/components/StatusBar.js +20 -0
- package/dist/ui/components/StatusBar.js.map +1 -0
- package/dist/ui/components/StreamingMessageDisplay.d.ts +13 -0
- package/dist/ui/components/StreamingMessageDisplay.d.ts.map +1 -0
- package/dist/ui/components/StreamingMessageDisplay.js +26 -0
- package/dist/ui/components/StreamingMessageDisplay.js.map +1 -0
- package/dist/ui/components/ToolExecutionMessage.d.ts +8 -0
- package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -0
- package/dist/ui/components/ToolExecutionMessage.js +189 -0
- package/dist/ui/components/ToolExecutionMessage.js.map +1 -0
- package/dist/ui/components/ToolExecutionStatus.d.ts +10 -0
- package/dist/ui/components/ToolExecutionStatus.d.ts.map +1 -0
- package/dist/ui/components/ToolExecutionStatus.js +65 -0
- package/dist/ui/components/ToolExecutionStatus.js.map +1 -0
- package/dist/ui/components/ToolResult.d.ts +10 -0
- package/dist/ui/components/ToolResult.d.ts.map +1 -0
- package/dist/ui/components/ToolResult.js +17 -0
- package/dist/ui/components/ToolResult.js.map +1 -0
- package/dist/ui/components/WelcomeBanner.d.ts +3 -0
- package/dist/ui/components/WelcomeBanner.d.ts.map +1 -0
- package/dist/ui/components/WelcomeBanner.js +28 -0
- package/dist/ui/components/WelcomeBanner.js.map +1 -0
- package/dist/ui/components/code-block.d.ts +10 -0
- package/dist/ui/components/code-block.d.ts.map +1 -0
- package/dist/ui/components/code-block.js +74 -0
- package/dist/ui/components/code-block.js.map +1 -0
- package/dist/ui/components/confirm-prompt.d.ts +12 -0
- package/dist/ui/components/confirm-prompt.d.ts.map +1 -0
- package/dist/ui/components/confirm-prompt.js +104 -0
- package/dist/ui/components/confirm-prompt.js.map +1 -0
- package/dist/ui/components/diff-viewer.d.ts +9 -0
- package/dist/ui/components/diff-viewer.d.ts.map +1 -0
- package/dist/ui/components/diff-viewer.js +57 -0
- package/dist/ui/components/diff-viewer.js.map +1 -0
- package/dist/ui/components/input-box.d.ts +18 -0
- package/dist/ui/components/input-box.d.ts.map +1 -0
- package/dist/ui/components/input-box.js +157 -0
- package/dist/ui/components/input-box.js.map +1 -0
- package/dist/ui/components/keyboard-help.d.ts +7 -0
- package/dist/ui/components/keyboard-help.d.ts.map +1 -0
- package/dist/ui/components/keyboard-help.js +43 -0
- package/dist/ui/components/keyboard-help.js.map +1 -0
- package/dist/ui/components/loading-indicator.d.ts +3 -0
- package/dist/ui/components/loading-indicator.d.ts.map +1 -0
- package/dist/ui/components/loading-indicator.js +42 -0
- package/dist/ui/components/loading-indicator.js.map +1 -0
- package/dist/ui/components/message-display.d.ts +7 -0
- package/dist/ui/components/message-display.d.ts.map +1 -0
- package/dist/ui/components/message-display.js +104 -0
- package/dist/ui/components/message-display.js.map +1 -0
- package/dist/ui/components/misc.d.ts +28 -0
- package/dist/ui/components/misc.d.ts.map +1 -0
- package/dist/ui/components/misc.js +128 -0
- package/dist/ui/components/misc.js.map +1 -0
- package/dist/ui/components/select-prompt.d.ts +13 -0
- package/dist/ui/components/select-prompt.d.ts.map +1 -0
- package/dist/ui/components/select-prompt.js +42 -0
- package/dist/ui/components/select-prompt.js.map +1 -0
- package/dist/ui/components/status-bar.d.ts +11 -0
- package/dist/ui/components/status-bar.d.ts.map +1 -0
- package/dist/ui/components/status-bar.js +47 -0
- package/dist/ui/components/status-bar.js.map +1 -0
- package/dist/ui/components/tool-execution.d.ts +3 -0
- package/dist/ui/components/tool-execution.d.ts.map +1 -0
- package/dist/ui/components/tool-execution.js +374 -0
- package/dist/ui/components/tool-execution.js.map +1 -0
- package/dist/ui/components/tool-result.d.ts +11 -0
- package/dist/ui/components/tool-result.d.ts.map +1 -0
- package/dist/ui/components/tool-result.js +58 -0
- package/dist/ui/components/tool-result.js.map +1 -0
- package/dist/ui/components/welcome-banner.d.ts +3 -0
- package/dist/ui/components/welcome-banner.d.ts.map +1 -0
- package/dist/ui/components/welcome-banner.js +46 -0
- package/dist/ui/components/welcome-banner.js.map +1 -0
- package/dist/ui/hooks/useDisplayHistory.d.ts +13 -0
- package/dist/ui/hooks/useDisplayHistory.d.ts.map +1 -0
- package/dist/ui/hooks/useDisplayHistory.js +45 -0
- package/dist/ui/hooks/useDisplayHistory.js.map +1 -0
- package/dist/ui/render-engine.d.ts +69 -0
- package/dist/ui/render-engine.d.ts.map +1 -0
- package/dist/ui/render-engine.js +197 -0
- package/dist/ui/render-engine.js.map +1 -0
- package/dist/ui/terminal/TerminalRenderer.d.ts +84 -0
- package/dist/ui/terminal/TerminalRenderer.d.ts.map +1 -0
- package/dist/ui/terminal/TerminalRenderer.js +154 -0
- package/dist/ui/terminal/TerminalRenderer.js.map +1 -0
- package/dist/ui/terminal/TerminalUI.d.ts +139 -0
- package/dist/ui/terminal/TerminalUI.d.ts.map +1 -0
- package/dist/ui/terminal/TerminalUI.js +430 -0
- package/dist/ui/terminal/TerminalUI.js.map +1 -0
- package/dist/ui/terminal/VirtualChatBuffer.d.ts +32 -0
- package/dist/ui/terminal/VirtualChatBuffer.d.ts.map +1 -0
- package/dist/ui/terminal/VirtualChatBuffer.js +37 -0
- package/dist/ui/terminal/VirtualChatBuffer.js.map +1 -0
- package/dist/ui/terminal-kit-base.d.ts +117 -0
- package/dist/ui/terminal-kit-base.d.ts.map +1 -0
- package/dist/ui/terminal-kit-base.js +188 -0
- package/dist/ui/terminal-kit-base.js.map +1 -0
- package/dist/utils/file.d.ts +21 -0
- package/dist/utils/file.d.ts.map +1 -0
- package/dist/utils/file.js +68 -0
- package/dist/utils/file.js.map +1 -0
- package/dist/utils/logger.d.ts +17 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +57 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/markdown-parser.d.ts +56 -0
- package/dist/utils/markdown-parser.d.ts.map +1 -0
- package/dist/utils/markdown-parser.js +307 -0
- package/dist/utils/markdown-parser.js.map +1 -0
- package/dist/utils/shell.d.ts +7 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +62 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/state.d.ts +13 -0
- package/dist/utils/state.d.ts.map +1 -0
- package/dist/utils/state.js +25 -0
- package/dist/utils/state.js.map +1 -0
- package/package.json +81 -0
- package/postinstall.js +46 -0
|
@@ -0,0 +1,605 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { dirname } from 'path';
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = dirname(__filename);
|
|
7
|
+
import { ConfigManager } from './config/manager.js';
|
|
8
|
+
import { ProviderFactory } from './ai/provider-factory.js';
|
|
9
|
+
import { ToolRegistry } from './tools/registry.js';
|
|
10
|
+
import { readFileTool, writeFileTool, editFileTool, listDirectoryTool } from './tools/file-ops.js';
|
|
11
|
+
import { executeCommandTool, grepSearchTool } from './tools/command.js';
|
|
12
|
+
import { webSearchTool, fetchUrlTool } from './tools/web-search.js';
|
|
13
|
+
import { apiClient } from './services/api-client.js';
|
|
14
|
+
import { conversationManager } from './services/conversation-manager.js';
|
|
15
|
+
export class CentaurusCLI {
|
|
16
|
+
configManager;
|
|
17
|
+
toolRegistry;
|
|
18
|
+
conversationHistory = [];
|
|
19
|
+
systemPrompt;
|
|
20
|
+
aiProvider = null;
|
|
21
|
+
cwd;
|
|
22
|
+
planMode = false;
|
|
23
|
+
onResponseCallback;
|
|
24
|
+
onShowPickerCallback;
|
|
25
|
+
onToolExecutionUpdate;
|
|
26
|
+
onToolApprovalRequest;
|
|
27
|
+
onToolStreamingOutput;
|
|
28
|
+
onPlanModeChange;
|
|
29
|
+
onPlanApprovalRequest;
|
|
30
|
+
conversationStarted = false;
|
|
31
|
+
constructor() {
|
|
32
|
+
this.configManager = new ConfigManager();
|
|
33
|
+
this.toolRegistry = new ToolRegistry();
|
|
34
|
+
this.cwd = process.cwd();
|
|
35
|
+
this.systemPrompt = this.loadSystemPrompt();
|
|
36
|
+
}
|
|
37
|
+
setOnResponseCallback(callback) {
|
|
38
|
+
this.onResponseCallback = callback;
|
|
39
|
+
}
|
|
40
|
+
setOnShowPickerCallback(callback) {
|
|
41
|
+
this.onShowPickerCallback = callback;
|
|
42
|
+
}
|
|
43
|
+
setOnToolExecutionUpdate(callback) {
|
|
44
|
+
this.onToolExecutionUpdate = callback;
|
|
45
|
+
}
|
|
46
|
+
setOnToolApprovalRequest(callback) {
|
|
47
|
+
this.onToolApprovalRequest = callback;
|
|
48
|
+
}
|
|
49
|
+
setOnToolStreamingOutput(callback) {
|
|
50
|
+
this.onToolStreamingOutput = callback;
|
|
51
|
+
}
|
|
52
|
+
setOnPlanModeChange(callback) {
|
|
53
|
+
this.onPlanModeChange = callback;
|
|
54
|
+
}
|
|
55
|
+
setOnPlanApprovalRequest(callback) {
|
|
56
|
+
this.onPlanApprovalRequest = callback;
|
|
57
|
+
}
|
|
58
|
+
getPlanMode() {
|
|
59
|
+
return this.planMode;
|
|
60
|
+
}
|
|
61
|
+
async handlePickerSelection(selection, pickerType) {
|
|
62
|
+
let responseMessage = '';
|
|
63
|
+
if (pickerType === 'model') {
|
|
64
|
+
this.configManager.set('model', selection);
|
|
65
|
+
responseMessage = `Model changed to: ${selection}`;
|
|
66
|
+
// Reinitialize AI provider with new model
|
|
67
|
+
const cfg = this.configManager.load();
|
|
68
|
+
if (this.configManager.isComplete()) {
|
|
69
|
+
this.aiProvider = ProviderFactory.createProvider(cfg);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else if (pickerType === 'provider') {
|
|
73
|
+
this.configManager.set('provider', selection);
|
|
74
|
+
responseMessage = `Provider changed to: ${selection}\n\nNote: Make sure you have configured the API key for this provider.`;
|
|
75
|
+
// Reinitialize AI provider with new provider
|
|
76
|
+
const cfg = this.configManager.load();
|
|
77
|
+
if (this.configManager.isComplete()) {
|
|
78
|
+
try {
|
|
79
|
+
this.aiProvider = ProviderFactory.createProvider(cfg);
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
responseMessage += `\n\nError: ${error.message}`;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Send response back to UI
|
|
87
|
+
if (this.onResponseCallback) {
|
|
88
|
+
this.onResponseCallback(responseMessage);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async initialize() {
|
|
92
|
+
// Register tools
|
|
93
|
+
this.toolRegistry.register(readFileTool);
|
|
94
|
+
this.toolRegistry.register(writeFileTool);
|
|
95
|
+
this.toolRegistry.register(editFileTool);
|
|
96
|
+
this.toolRegistry.register(listDirectoryTool);
|
|
97
|
+
this.toolRegistry.register(executeCommandTool);
|
|
98
|
+
this.toolRegistry.register(grepSearchTool);
|
|
99
|
+
this.toolRegistry.register(webSearchTool);
|
|
100
|
+
this.toolRegistry.register(fetchUrlTool);
|
|
101
|
+
// Load configuration
|
|
102
|
+
const config = this.configManager.load();
|
|
103
|
+
// Enable backend sync if authenticated
|
|
104
|
+
if (apiClient.isAuthenticated()) {
|
|
105
|
+
this.configManager.enableBackendSync();
|
|
106
|
+
}
|
|
107
|
+
// Initialize AI provider if config is complete
|
|
108
|
+
if (this.configManager.isComplete()) {
|
|
109
|
+
this.aiProvider = ProviderFactory.createProvider(config);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Check if user is authenticated
|
|
114
|
+
*/
|
|
115
|
+
isAuthenticated() {
|
|
116
|
+
return apiClient.isAuthenticated();
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Start a new conversation in the backend
|
|
120
|
+
*/
|
|
121
|
+
async ensureConversationStarted() {
|
|
122
|
+
if (this.conversationStarted || !apiClient.isAuthenticated()) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
const config = this.configManager.load();
|
|
127
|
+
const title = `Conversation ${new Date().toLocaleString()}`;
|
|
128
|
+
await conversationManager.startNewConversation(title, config.model || 'gemini-2.0-flash-exp', config.provider || 'google', this.cwd);
|
|
129
|
+
this.conversationStarted = true;
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
console.error('Failed to start conversation in backend:', error);
|
|
133
|
+
// Continue without backend persistence
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Save a message to the backend
|
|
138
|
+
*/
|
|
139
|
+
async saveMessageToBackend(role, content) {
|
|
140
|
+
if (!apiClient.isAuthenticated()) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
try {
|
|
144
|
+
await this.ensureConversationStarted();
|
|
145
|
+
await conversationManager.addMessage({
|
|
146
|
+
role,
|
|
147
|
+
content,
|
|
148
|
+
contentType: 'text',
|
|
149
|
+
metadata: {},
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
console.error('Failed to save message to backend:', error);
|
|
154
|
+
// Continue without backend persistence
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
getModel() {
|
|
158
|
+
const config = this.configManager.load();
|
|
159
|
+
return config.model || 'gemini-2.0-flash-exp';
|
|
160
|
+
}
|
|
161
|
+
async handleMessage(message) {
|
|
162
|
+
// Handle slash commands
|
|
163
|
+
if (message.startsWith('/')) {
|
|
164
|
+
await this.handleSlashCommand(message);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
// Ensure AI provider is initialized
|
|
168
|
+
if (!this.aiProvider) {
|
|
169
|
+
const config = this.configManager.load();
|
|
170
|
+
if (!this.configManager.isComplete()) {
|
|
171
|
+
throw new Error('Configuration incomplete. Please set up your API key.');
|
|
172
|
+
}
|
|
173
|
+
this.aiProvider = ProviderFactory.createProvider(config);
|
|
174
|
+
}
|
|
175
|
+
// Add user message to history
|
|
176
|
+
this.conversationHistory.push({
|
|
177
|
+
role: 'user',
|
|
178
|
+
content: message,
|
|
179
|
+
});
|
|
180
|
+
// Save user message to backend
|
|
181
|
+
await this.saveMessageToBackend('user', message);
|
|
182
|
+
// Create messages array with system prompt
|
|
183
|
+
const systemContent = this.systemPrompt + this.getEnvironmentContext() + (this.planMode ? this.getPlanModeInstructions() : '');
|
|
184
|
+
let messages = [
|
|
185
|
+
{ role: 'system', content: systemContent },
|
|
186
|
+
...this.conversationHistory,
|
|
187
|
+
];
|
|
188
|
+
try {
|
|
189
|
+
const tools = this.toolRegistry.getSchemas();
|
|
190
|
+
const context = {
|
|
191
|
+
cwd: this.cwd,
|
|
192
|
+
requireApproval: async (message, risky, preview, operationType, operationDetails) => {
|
|
193
|
+
if (this.onToolApprovalRequest) {
|
|
194
|
+
return await this.onToolApprovalRequest({ message, risky, preview, operationType, operationDetails });
|
|
195
|
+
}
|
|
196
|
+
return true; // Auto-approve if no callback registered
|
|
197
|
+
},
|
|
198
|
+
onStreamingOutput: (chunk, type) => {
|
|
199
|
+
// Forward streaming output to UI callback
|
|
200
|
+
if (this.onToolStreamingOutput) {
|
|
201
|
+
this.onToolStreamingOutput({ toolName: 'execute_command', chunk, type });
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
let finalAssistantMessage = '';
|
|
206
|
+
const MAX_TURNS = 10; // Prevent infinite loops
|
|
207
|
+
let turnCount = 0;
|
|
208
|
+
// Multi-turn tool execution loop
|
|
209
|
+
while (turnCount < MAX_TURNS) {
|
|
210
|
+
turnCount++;
|
|
211
|
+
let assistantMessage = '';
|
|
212
|
+
let toolCalls = [];
|
|
213
|
+
// Stream AI response
|
|
214
|
+
for await (const chunk of this.aiProvider.stream({ messages, tools })) {
|
|
215
|
+
if (chunk.text) {
|
|
216
|
+
assistantMessage += chunk.text;
|
|
217
|
+
}
|
|
218
|
+
if (chunk.toolCalls) {
|
|
219
|
+
toolCalls.push(...chunk.toolCalls);
|
|
220
|
+
}
|
|
221
|
+
if (chunk.done) {
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// If there are tool calls, execute them and continue loop
|
|
226
|
+
if (toolCalls.length > 0) {
|
|
227
|
+
const toolResults = [];
|
|
228
|
+
for (const toolCall of toolCalls) {
|
|
229
|
+
try {
|
|
230
|
+
// Notify UI: tool is executing
|
|
231
|
+
if (this.onToolExecutionUpdate) {
|
|
232
|
+
this.onToolExecutionUpdate({
|
|
233
|
+
toolName: toolCall.name,
|
|
234
|
+
status: 'executing',
|
|
235
|
+
arguments: toolCall.arguments
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
const result = await this.toolRegistry.execute(toolCall.name, toolCall.arguments, context);
|
|
239
|
+
if (result.success) {
|
|
240
|
+
// Notify UI: tool succeeded
|
|
241
|
+
if (this.onToolExecutionUpdate) {
|
|
242
|
+
this.onToolExecutionUpdate({
|
|
243
|
+
toolName: toolCall.name,
|
|
244
|
+
status: 'completed',
|
|
245
|
+
result: result.result,
|
|
246
|
+
arguments: toolCall.arguments
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
toolResults.push({
|
|
250
|
+
tool_call_id: toolCall.id,
|
|
251
|
+
name: toolCall.name,
|
|
252
|
+
content: result.result,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
// Notify UI: tool failed
|
|
257
|
+
if (this.onToolExecutionUpdate) {
|
|
258
|
+
this.onToolExecutionUpdate({
|
|
259
|
+
toolName: toolCall.name,
|
|
260
|
+
status: 'error',
|
|
261
|
+
error: result.error,
|
|
262
|
+
arguments: toolCall.arguments
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
toolResults.push({
|
|
266
|
+
tool_call_id: toolCall.id,
|
|
267
|
+
name: toolCall.name,
|
|
268
|
+
content: `Error: ${result.error}`,
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
// Notify UI: tool failed
|
|
274
|
+
if (this.onToolExecutionUpdate) {
|
|
275
|
+
this.onToolExecutionUpdate({
|
|
276
|
+
toolName: toolCall.name,
|
|
277
|
+
status: 'error',
|
|
278
|
+
error: error.message,
|
|
279
|
+
arguments: toolCall.arguments
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
toolResults.push({
|
|
283
|
+
tool_call_id: toolCall.id,
|
|
284
|
+
name: toolCall.name,
|
|
285
|
+
content: `Error: ${error.message}`,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
// For Gemini, we need to properly format function responses
|
|
290
|
+
// Add assistant message with tool calls to conversation history
|
|
291
|
+
this.conversationHistory.push({
|
|
292
|
+
role: 'assistant',
|
|
293
|
+
content: assistantMessage || '',
|
|
294
|
+
});
|
|
295
|
+
// Add tool results to conversation history as user messages
|
|
296
|
+
const toolResultsText = toolResults.map(tr => `Tool "${tr.name}" returned:\n${tr.content}`).join('\n\n');
|
|
297
|
+
this.conversationHistory.push({
|
|
298
|
+
role: 'user',
|
|
299
|
+
content: toolResultsText,
|
|
300
|
+
});
|
|
301
|
+
// Rebuild messages array with updated history
|
|
302
|
+
messages = [
|
|
303
|
+
{ role: 'system', content: systemContent },
|
|
304
|
+
...this.conversationHistory,
|
|
305
|
+
];
|
|
306
|
+
// Continue to next turn to let AI process results
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
309
|
+
// No more tool calls - AI provided final response
|
|
310
|
+
if (assistantMessage) {
|
|
311
|
+
finalAssistantMessage = assistantMessage;
|
|
312
|
+
break;
|
|
313
|
+
}
|
|
314
|
+
// No tool calls and no message - something went wrong
|
|
315
|
+
break;
|
|
316
|
+
}
|
|
317
|
+
// Send final message to user (without tool execution logs)
|
|
318
|
+
const finalMessage = finalAssistantMessage || 'Task completed.';
|
|
319
|
+
// Save to conversation history
|
|
320
|
+
this.conversationHistory.push({
|
|
321
|
+
role: 'assistant',
|
|
322
|
+
content: finalMessage,
|
|
323
|
+
});
|
|
324
|
+
// Save assistant message to backend
|
|
325
|
+
await this.saveMessageToBackend('assistant', finalMessage);
|
|
326
|
+
// Parse response for plan mode
|
|
327
|
+
if (this.planMode) {
|
|
328
|
+
const planData = this.parsePlanResponse(finalMessage);
|
|
329
|
+
if (planData && this.onPlanApprovalRequest) {
|
|
330
|
+
// Ask user for approval
|
|
331
|
+
const approved = await this.onPlanApprovalRequest(planData);
|
|
332
|
+
if (approved) {
|
|
333
|
+
// Switch to execution mode
|
|
334
|
+
this.planMode = false;
|
|
335
|
+
if (this.onPlanModeChange) {
|
|
336
|
+
this.onPlanModeChange(false);
|
|
337
|
+
}
|
|
338
|
+
// Send message to start execution
|
|
339
|
+
await this.handleMessage('Let\'s implement the plan we just discussed. Start with the first task.');
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
// Send response back to UI
|
|
345
|
+
if (this.onResponseCallback) {
|
|
346
|
+
this.onResponseCallback(finalMessage);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
catch (error) {
|
|
350
|
+
throw new Error(`AI Error: ${error.message}`);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
async handleSlashCommand(command) {
|
|
354
|
+
const parts = command.slice(1).split(' ');
|
|
355
|
+
const cmd = parts[0].toLowerCase();
|
|
356
|
+
const args = parts.slice(1);
|
|
357
|
+
let responseMessage = '';
|
|
358
|
+
switch (cmd) {
|
|
359
|
+
case 'help':
|
|
360
|
+
responseMessage = `Available Commands:\n\n` +
|
|
361
|
+
`/help - Show this help message\n` +
|
|
362
|
+
`/clear - Clear conversation history\n` +
|
|
363
|
+
`/config - View current configuration\n` +
|
|
364
|
+
`/config set <key> <value> - Set configuration value\n` +
|
|
365
|
+
`/model - List available models or set model\n` +
|
|
366
|
+
`/provider - List providers or switch provider\n` +
|
|
367
|
+
`/plan - Toggle plan mode for complex implementations\n` +
|
|
368
|
+
`/logout - Sign out, clear session, and exit CLI\n` +
|
|
369
|
+
`/exit - Exit the application\n\n` +
|
|
370
|
+
`Examples:\n` +
|
|
371
|
+
`/config set googleApiKey YOUR_API_KEY\n` +
|
|
372
|
+
`/config set openrouterApiKey YOUR_API_KEY`;
|
|
373
|
+
break;
|
|
374
|
+
case 'logout':
|
|
375
|
+
try {
|
|
376
|
+
await apiClient.logout();
|
|
377
|
+
responseMessage = '✅ Logged out successfully.\n\n' +
|
|
378
|
+
'Your session has been cleared.\n' +
|
|
379
|
+
'Exiting CLI...';
|
|
380
|
+
// Send response to UI
|
|
381
|
+
if (this.onResponseCallback) {
|
|
382
|
+
this.onResponseCallback(responseMessage);
|
|
383
|
+
}
|
|
384
|
+
// Wait a moment for the message to display, then exit
|
|
385
|
+
setTimeout(() => {
|
|
386
|
+
process.exit(0);
|
|
387
|
+
}, 1000);
|
|
388
|
+
return; // Don't send response again at the end
|
|
389
|
+
}
|
|
390
|
+
catch (error) {
|
|
391
|
+
responseMessage = `❌ Logout failed: ${error.message}\n\nExiting CLI anyway...`;
|
|
392
|
+
// Send response to UI
|
|
393
|
+
if (this.onResponseCallback) {
|
|
394
|
+
this.onResponseCallback(responseMessage);
|
|
395
|
+
}
|
|
396
|
+
// Exit even if logout failed
|
|
397
|
+
setTimeout(() => {
|
|
398
|
+
process.exit(0);
|
|
399
|
+
}, 1000);
|
|
400
|
+
return; // Don't send response again at the end
|
|
401
|
+
}
|
|
402
|
+
case 'plan':
|
|
403
|
+
this.planMode = !this.planMode;
|
|
404
|
+
responseMessage = `Plan mode ${this.planMode ? 'ENABLED' : 'DISABLED'}.\n\n` +
|
|
405
|
+
(this.planMode
|
|
406
|
+
? 'In plan mode, I will create detailed implementation plans before executing tasks.'
|
|
407
|
+
: 'Plan mode is now off. I will execute tasks directly.');
|
|
408
|
+
// Notify UI of plan mode change
|
|
409
|
+
if (this.onPlanModeChange) {
|
|
410
|
+
this.onPlanModeChange(this.planMode);
|
|
411
|
+
}
|
|
412
|
+
break;
|
|
413
|
+
case 'clear':
|
|
414
|
+
this.conversationHistory = [];
|
|
415
|
+
this.conversationStarted = false;
|
|
416
|
+
responseMessage = 'Conversation history cleared.';
|
|
417
|
+
break;
|
|
418
|
+
case 'config':
|
|
419
|
+
if (args.length >= 2 && args[0].toLowerCase() === 'set') {
|
|
420
|
+
// Set config value: /config set <key> <value>
|
|
421
|
+
const configKey = args[1];
|
|
422
|
+
const configValue = args.slice(2).join(' ');
|
|
423
|
+
if (!configValue) {
|
|
424
|
+
responseMessage = `Error: No value provided.\nUsage: /config set <key> <value>`;
|
|
425
|
+
}
|
|
426
|
+
else if (configKey === 'googleApiKey' || configKey === 'openrouterApiKey' || configKey === 'model' || configKey === 'provider') {
|
|
427
|
+
this.configManager.set(configKey, configValue);
|
|
428
|
+
// Show appropriate message for API keys
|
|
429
|
+
let displayValue = configValue;
|
|
430
|
+
if (configKey.includes('ApiKey')) {
|
|
431
|
+
const keys = configValue.split(',').map(k => k.trim()).filter(k => k.length > 0);
|
|
432
|
+
if (keys.length > 1) {
|
|
433
|
+
displayValue = `${keys.length} keys (rotation enabled)`;
|
|
434
|
+
}
|
|
435
|
+
else {
|
|
436
|
+
displayValue = '***' + configValue.slice(-4);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
responseMessage = `Configuration updated: ${configKey} = ${displayValue}\n\n`;
|
|
440
|
+
// Reinitialize provider if API key was set
|
|
441
|
+
if (configKey.includes('ApiKey') && this.configManager.isComplete()) {
|
|
442
|
+
try {
|
|
443
|
+
this.aiProvider = ProviderFactory.createProvider(this.configManager.load());
|
|
444
|
+
responseMessage += 'AI provider initialized successfully!';
|
|
445
|
+
}
|
|
446
|
+
catch (error) {
|
|
447
|
+
responseMessage += `Warning: ${error.message}`;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
responseMessage = `Error: Unknown config key: ${configKey}\nValid keys: googleApiKey, openrouterApiKey, model, provider`;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
// View config
|
|
457
|
+
const config = this.configManager.load();
|
|
458
|
+
const apiKey = config.provider === 'google' ? config.googleApiKey : config.openrouterApiKey;
|
|
459
|
+
const providerName = config.provider === 'google' ? 'Google' : 'OpenRouter';
|
|
460
|
+
const requiredKeyName = config.provider === 'google' ? 'googleApiKey' : 'openrouterApiKey';
|
|
461
|
+
// Parse keys to show count
|
|
462
|
+
const keys = config.provider === 'google'
|
|
463
|
+
? this.configManager.getGoogleApiKeys()
|
|
464
|
+
: this.configManager.getOpenRouterApiKeys();
|
|
465
|
+
const keyDisplay = keys.length > 0
|
|
466
|
+
? `${keys.length} key(s) configured ${keys.length > 1 ? '(rotation enabled)' : ''}`
|
|
467
|
+
: '❌ Not set';
|
|
468
|
+
responseMessage = `Current Configuration:\n\n` +
|
|
469
|
+
`Provider: ${config.provider || 'Not set'}\n` +
|
|
470
|
+
`Model: ${config.model || 'Not set'}\n` +
|
|
471
|
+
`API Keys (${providerName}): ${keyDisplay}\n\n`;
|
|
472
|
+
// Show helpful message if API key is not set
|
|
473
|
+
if (!apiKey) {
|
|
474
|
+
responseMessage += `⚠️ API Key Required!\n\n` +
|
|
475
|
+
`To use ${providerName}, set your API key:\n` +
|
|
476
|
+
`/config set ${requiredKeyName} YOUR_API_KEY\n\n`;
|
|
477
|
+
if (config.provider === 'google') {
|
|
478
|
+
responseMessage += `Get your Google AI Studio API key at:\nhttps://makersuite.google.com/app/apikey`;
|
|
479
|
+
}
|
|
480
|
+
else {
|
|
481
|
+
responseMessage += `Get your OpenRouter API key at:\nhttps://openrouter.ai/keys`;
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
break;
|
|
486
|
+
case 'model':
|
|
487
|
+
if (args.length === 0) {
|
|
488
|
+
// Show picker for model selection
|
|
489
|
+
if (this.onShowPickerCallback) {
|
|
490
|
+
const currentModel = this.configManager.load().model;
|
|
491
|
+
this.onShowPickerCallback({
|
|
492
|
+
message: 'Select Model',
|
|
493
|
+
type: 'model',
|
|
494
|
+
choices: [
|
|
495
|
+
{ label: `gemini-2.5-flash${currentModel === 'gemini-2.5-flash' ? ' [CURRENT]' : ''}`, value: 'gemini-2.5-flash' },
|
|
496
|
+
{ label: `gemini-2.5-pro${currentModel === 'gemini-2.5-pro' ? ' [CURRENT]' : ''}`, value: 'gemini-2.5-pro' },
|
|
497
|
+
{ label: `gemini-2.0-flash-exp${currentModel === 'gemini-2.0-flash-exp' ? ' [CURRENT]' : ''}`, value: 'gemini-2.0-flash-exp' },
|
|
498
|
+
{ label: `gemini-2.0-flash-thinking-exp${currentModel === 'gemini-2.0-flash-thinking-exp' ? ' [CURRENT]' : ''}`, value: 'gemini-2.0-flash-thinking-exp' },
|
|
499
|
+
{ label: `gemini-1.5-pro${currentModel === 'gemini-1.5-pro' ? ' [CURRENT]' : ''}`, value: 'gemini-1.5-pro' },
|
|
500
|
+
{ label: `gemini-1.5-flash${currentModel === 'gemini-1.5-flash' ? ' [CURRENT]' : ''}`, value: 'gemini-1.5-flash' },
|
|
501
|
+
]
|
|
502
|
+
});
|
|
503
|
+
return; // Don't send a text response, picker will handle it
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
else {
|
|
507
|
+
// Direct set via command argument
|
|
508
|
+
const newModel = args.join(' ');
|
|
509
|
+
this.configManager.set('model', newModel);
|
|
510
|
+
responseMessage = `Model changed to: ${newModel}`;
|
|
511
|
+
// Reinitialize AI provider with new model
|
|
512
|
+
const cfg = this.configManager.load();
|
|
513
|
+
if (this.configManager.isComplete()) {
|
|
514
|
+
this.aiProvider = ProviderFactory.createProvider(cfg);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
break;
|
|
518
|
+
case 'provider':
|
|
519
|
+
if (args.length === 0) {
|
|
520
|
+
// Show picker for provider selection
|
|
521
|
+
if (this.onShowPickerCallback) {
|
|
522
|
+
const currentProvider = this.configManager.load().provider;
|
|
523
|
+
this.onShowPickerCallback({
|
|
524
|
+
message: 'Select Provider',
|
|
525
|
+
type: 'provider',
|
|
526
|
+
choices: [
|
|
527
|
+
{ label: `google (Google Gemini)${currentProvider === 'google' ? ' [CURRENT]' : ''}`, value: 'google' },
|
|
528
|
+
{ label: `openrouter (OpenRouter)${currentProvider === 'openrouter' ? ' [CURRENT]' : ''}`, value: 'openrouter' },
|
|
529
|
+
]
|
|
530
|
+
});
|
|
531
|
+
return; // Don't send a text response, picker will handle it
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
else {
|
|
535
|
+
// Direct set via command argument
|
|
536
|
+
const newProvider = args[0].toLowerCase();
|
|
537
|
+
if (newProvider !== 'google' && newProvider !== 'openrouter') {
|
|
538
|
+
responseMessage = `Invalid provider: ${newProvider}\nAvailable: google, openrouter`;
|
|
539
|
+
}
|
|
540
|
+
else {
|
|
541
|
+
this.configManager.set('provider', newProvider);
|
|
542
|
+
responseMessage = `Provider changed to: ${newProvider}\n\nNote: Make sure you have configured the API key for this provider.`;
|
|
543
|
+
// Reinitialize AI provider with new provider
|
|
544
|
+
const cfg = this.configManager.load();
|
|
545
|
+
if (this.configManager.isComplete()) {
|
|
546
|
+
try {
|
|
547
|
+
this.aiProvider = ProviderFactory.createProvider(cfg);
|
|
548
|
+
}
|
|
549
|
+
catch (error) {
|
|
550
|
+
responseMessage += `\n\nError: ${error.message}`;
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
break;
|
|
556
|
+
case 'exit':
|
|
557
|
+
process.exit(0);
|
|
558
|
+
break;
|
|
559
|
+
default:
|
|
560
|
+
responseMessage = `Unknown command: /${cmd}\nType /help for available commands.`;
|
|
561
|
+
}
|
|
562
|
+
// Send command response back to UI
|
|
563
|
+
if (responseMessage && this.onResponseCallback) {
|
|
564
|
+
this.onResponseCallback(responseMessage);
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
loadSystemPrompt() {
|
|
568
|
+
const promptPath = path.join(__dirname, '../prompts/centaurus-system-prompt.txt');
|
|
569
|
+
try {
|
|
570
|
+
return fs.readFileSync(promptPath, 'utf-8');
|
|
571
|
+
}
|
|
572
|
+
catch (error) {
|
|
573
|
+
return 'You are Centaurus, an AI coding assistant.';
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
getEnvironmentContext() {
|
|
577
|
+
const platform = process.platform;
|
|
578
|
+
const isWindows = platform === 'win32';
|
|
579
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || '~';
|
|
580
|
+
const shell = process.env.SHELL || process.env.ComSpec || (isWindows ? 'cmd' : 'bash');
|
|
581
|
+
return `\n## Environment Context\n\nYou are running in the following environment:\n- **OS**: ${isWindows ? 'Windows' : platform === 'darwin' ? 'macOS' : 'Linux'} (${platform})\n- **Current Directory**: ${this.cwd}\n- **Home Directory**: ${homeDir}\n- **Shell**: ${shell}\n\n${isWindows ? 'Windows Environment: Use commands like dir, type, cd. Downloads folder is at ' + homeDir + '\\Downloads' : 'Unix Environment: Use ls, pwd, cat. Downloads folder is at ' + homeDir + '/Downloads'}`;
|
|
582
|
+
}
|
|
583
|
+
getPlanModeInstructions() {
|
|
584
|
+
return `\n\n## PLAN MODE ACTIVE\n\nYou are currently in PLAN MODE. In this mode, you should:\n\n1. **Explore the current directory** using list_directory and read_file tools to understand the codebase structure\n2. **Research the topic** using the web_search tool to gather best practices and implementation approaches\n3. **Create a detailed implementation plan** with ordered tasks\n\nWhen you've completed your planning, you MUST format your response in this EXACT format:\n\n<tasks>\n1. First task description\n2. Second task description\n3. Third task description\n...\n</tasks>\n\n<question>\nShall I proceed with implementing this plan?\n</question>\n\nIMPORTANT:\n- The <tasks> section must contain a numbered list of tasks in order\n- The <question> section must contain a yes/no question asking if you should proceed\n- Do NOT execute any implementation tasks in plan mode - only create the plan\n- Use tools to explore and research, but do not modify any files`;
|
|
585
|
+
}
|
|
586
|
+
parsePlanResponse(response) {
|
|
587
|
+
// Extract tasks
|
|
588
|
+
const tasksMatch = response.match(/<tasks>([\s\S]*?)<\/tasks>/);
|
|
589
|
+
if (!tasksMatch)
|
|
590
|
+
return null;
|
|
591
|
+
const tasksText = tasksMatch[1].trim();
|
|
592
|
+
const taskLines = tasksText.split('\n').filter(line => line.trim());
|
|
593
|
+
const tasks = taskLines.map(line => {
|
|
594
|
+
// Remove numbering (e.g., "1. ", "2. ")
|
|
595
|
+
return line.replace(/^\d+\.\s*/, '').trim();
|
|
596
|
+
}).filter(task => task);
|
|
597
|
+
// Extract question
|
|
598
|
+
const questionMatch = response.match(/<question>([\s\S]*?)<\/question>/);
|
|
599
|
+
if (!questionMatch)
|
|
600
|
+
return null;
|
|
601
|
+
const question = questionMatch[1].trim();
|
|
602
|
+
return { tasks, question };
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
//# sourceMappingURL=cli-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-adapter.js","sourceRoot":"","sources":["../src/cli-adapter.ts"],"names":[],"mappings":"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"}
|