centaurus-cli 2.9.2 → 2.9.3

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.
Files changed (54) hide show
  1. package/dist/cli-adapter.d.ts +6 -3
  2. package/dist/cli-adapter.d.ts.map +1 -1
  3. package/dist/cli-adapter.js +244 -74
  4. package/dist/cli-adapter.js.map +1 -1
  5. package/dist/config/models.d.ts.map +1 -1
  6. package/dist/config/models.js +2 -0
  7. package/dist/config/models.js.map +1 -1
  8. package/dist/config/slash-commands.d.ts +3 -0
  9. package/dist/config/slash-commands.d.ts.map +1 -1
  10. package/dist/config/slash-commands.js +35 -1
  11. package/dist/config/slash-commands.js.map +1 -1
  12. package/dist/config/types.d.ts +2 -0
  13. package/dist/config/types.d.ts.map +1 -1
  14. package/dist/config/types.js +1 -0
  15. package/dist/config/types.js.map +1 -1
  16. package/dist/services/ai-autocomplete-agent.d.ts +39 -0
  17. package/dist/services/ai-autocomplete-agent.d.ts.map +1 -0
  18. package/dist/services/ai-autocomplete-agent.js +189 -0
  19. package/dist/services/ai-autocomplete-agent.js.map +1 -0
  20. package/dist/services/ai-service-client.d.ts +25 -0
  21. package/dist/services/ai-service-client.d.ts.map +1 -1
  22. package/dist/services/ai-service-client.js +162 -1
  23. package/dist/services/ai-service-client.js.map +1 -1
  24. package/dist/services/auth-handler.js +1 -1
  25. package/dist/services/auth-handler.js.map +1 -1
  26. package/dist/services/local-chat-storage.d.ts +21 -0
  27. package/dist/services/local-chat-storage.d.ts.map +1 -1
  28. package/dist/services/local-chat-storage.js +138 -43
  29. package/dist/services/local-chat-storage.js.map +1 -1
  30. package/dist/services/ollama-service.d.ts +197 -0
  31. package/dist/services/ollama-service.d.ts.map +1 -0
  32. package/dist/services/ollama-service.js +324 -0
  33. package/dist/services/ollama-service.js.map +1 -0
  34. package/dist/ui/components/App.d.ts +2 -2
  35. package/dist/ui/components/App.d.ts.map +1 -1
  36. package/dist/ui/components/App.js +45 -2
  37. package/dist/ui/components/App.js.map +1 -1
  38. package/dist/ui/components/InputBox.d.ts +2 -0
  39. package/dist/ui/components/InputBox.d.ts.map +1 -1
  40. package/dist/ui/components/InputBox.js +321 -19
  41. package/dist/ui/components/InputBox.js.map +1 -1
  42. package/dist/ui/components/MultiLineInput.d.ts.map +1 -1
  43. package/dist/ui/components/MultiLineInput.js +68 -2
  44. package/dist/ui/components/MultiLineInput.js.map +1 -1
  45. package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
  46. package/dist/ui/components/ToolExecutionMessage.js +5 -1
  47. package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
  48. package/dist/utils/command-history.d.ts +12 -2
  49. package/dist/utils/command-history.d.ts.map +1 -1
  50. package/dist/utils/command-history.js +57 -13
  51. package/dist/utils/command-history.js.map +1 -1
  52. package/dist/utils/input-classifier.js +1 -1
  53. package/dist/utils/input-classifier.js.map +1 -1
  54. package/package.json +1 -1
@@ -0,0 +1,324 @@
1
+ /**
2
+ * Ollama Service
3
+ * Client for interacting with the local Ollama API
4
+ *
5
+ * Ollama exposes a REST API at http://localhost:11434 by default.
6
+ * This service provides methods for:
7
+ * - Checking if Ollama is running
8
+ * - Fetching available local models
9
+ * - Sending chat messages to local models
10
+ */
11
+ import { logError } from '../utils/logger.js';
12
+ import { quickLog } from '../utils/conversation-logger.js';
13
+ // Ollama API base URL (configurable via environment variable)
14
+ const OLLAMA_BASE_URL = process.env.OLLAMA_HOST || 'http://localhost:11434';
15
+ // Timeout for Ollama API requests (5 seconds)
16
+ const REQUEST_TIMEOUT = 5000;
17
+ /**
18
+ * Model families that support tool calling
19
+ * Based on https://ollama.com/search?c=tools
20
+ */
21
+ export const TOOL_CAPABLE_MODEL_FAMILIES = [
22
+ 'llama3.1', 'llama3.2', 'llama3.3',
23
+ 'mistral-nemo', 'mistral-small',
24
+ 'command-r', 'command-r-plus',
25
+ 'firefunction',
26
+ 'qwen2.5', 'qwen2.5-coder',
27
+ 'granite3-dense', 'granite3.1-dense',
28
+ 'nemotron',
29
+ 'hermes3',
30
+ 'athene-v2',
31
+ 'gpt-oss',
32
+ 'exaone3.5',
33
+ 'deepseek-r1',
34
+ 'qwen3-coder',
35
+ 'qwen-coder',
36
+ 'deepseek-v3',
37
+ 'deepseek-v2',
38
+ 'deepseek',
39
+ ];
40
+ /**
41
+ * Ollama Service Class
42
+ * Provides methods for interacting with the local Ollama API
43
+ */
44
+ class OllamaService {
45
+ baseUrl;
46
+ constructor(baseUrl = OLLAMA_BASE_URL) {
47
+ this.baseUrl = baseUrl;
48
+ }
49
+ /**
50
+ * Check if Ollama is running and accessible
51
+ * @returns OllamaStatus indicating if Ollama is available
52
+ */
53
+ async isOllamaRunning() {
54
+ try {
55
+ const controller = new AbortController();
56
+ const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT);
57
+ // Ollama has a simple root endpoint that returns version info
58
+ const response = await fetch(`${this.baseUrl}/api/version`, {
59
+ method: 'GET',
60
+ signal: controller.signal,
61
+ });
62
+ clearTimeout(timeoutId);
63
+ if (response.ok) {
64
+ const data = await response.json();
65
+ return {
66
+ available: true,
67
+ version: data.version || 'unknown',
68
+ };
69
+ }
70
+ return {
71
+ available: false,
72
+ error: `Ollama returned status ${response.status}`,
73
+ };
74
+ }
75
+ catch (error) {
76
+ quickLog(`[${new Date().toISOString()}] [OllamaService] isOllamaRunning error: ${error.message}\n`);
77
+ if (error.name === 'AbortError') {
78
+ return {
79
+ available: false,
80
+ error: 'Connection timed out. Ollama may not be running.',
81
+ };
82
+ }
83
+ if (error.code === 'ECONNREFUSED') {
84
+ return {
85
+ available: false,
86
+ error: 'Connection refused. Ollama is not running or not installed.',
87
+ };
88
+ }
89
+ return {
90
+ available: false,
91
+ error: error.message || 'Unknown error connecting to Ollama',
92
+ };
93
+ }
94
+ }
95
+ /**
96
+ * Get list of locally available models from Ollama
97
+ * @returns Array of OllamaModel objects
98
+ * @throws Error if Ollama is not available or request fails
99
+ */
100
+ async getLocalModels() {
101
+ try {
102
+ const controller = new AbortController();
103
+ const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT);
104
+ const response = await fetch(`${this.baseUrl}/api/tags`, {
105
+ method: 'GET',
106
+ signal: controller.signal,
107
+ });
108
+ clearTimeout(timeoutId);
109
+ if (!response.ok) {
110
+ throw new Error(`Ollama API returned status ${response.status}`);
111
+ }
112
+ const data = await response.json();
113
+ quickLog(`[${new Date().toISOString()}] [OllamaService] getLocalModels: Found ${data.models?.length || 0} models\n`);
114
+ return data.models || [];
115
+ }
116
+ catch (error) {
117
+ quickLog(`[${new Date().toISOString()}] [OllamaService] getLocalModels error: ${error.message}\n`);
118
+ if (error.name === 'AbortError') {
119
+ throw new Error('Connection to Ollama timed out. Please ensure Ollama is running.');
120
+ }
121
+ if (error.code === 'ECONNREFUSED') {
122
+ throw new Error('Cannot connect to Ollama. Please ensure Ollama is installed and running.\n\nInstall from: https://ollama.ai');
123
+ }
124
+ throw error;
125
+ }
126
+ }
127
+ /**
128
+ * Send a chat message to an Ollama model (non-streaming)
129
+ * @param model Model name to use (e.g., "llama3:latest")
130
+ * @param messages Array of chat messages
131
+ * @param tools Optional array of tool definitions
132
+ * @param options Optional generation parameters
133
+ * @returns OllamaChatResponse with the model's reply
134
+ */
135
+ async sendChatMessage(model, messages, tools, options) {
136
+ try {
137
+ const request = {
138
+ model,
139
+ messages,
140
+ stream: false,
141
+ tools: tools && tools.length > 0 ? tools : undefined,
142
+ options,
143
+ };
144
+ quickLog(`[${new Date().toISOString()}] [OllamaService] sendChatMessage: model=${model}, messages=${messages.length}, tools=${tools?.length || 0}\n`);
145
+ const response = await fetch(`${this.baseUrl}/api/chat`, {
146
+ method: 'POST',
147
+ headers: {
148
+ 'Content-Type': 'application/json',
149
+ },
150
+ body: JSON.stringify(request),
151
+ });
152
+ if (!response.ok) {
153
+ const errorText = await response.text();
154
+ throw new Error(`Ollama API error: ${response.status} - ${errorText}`);
155
+ }
156
+ const data = await response.json();
157
+ // Log if tool calls were returned
158
+ if (data.message?.tool_calls?.length) {
159
+ quickLog(`[${new Date().toISOString()}] [OllamaService] Response contains ${data.message.tool_calls.length} tool calls\n`);
160
+ }
161
+ return data;
162
+ }
163
+ catch (error) {
164
+ logError(`Ollama sendChatMessage error: ${error.message}`);
165
+ throw error;
166
+ }
167
+ }
168
+ /**
169
+ * Check if a model name indicates it supports tool calling
170
+ * @param modelName The model name (e.g., "llama3.2:latest")
171
+ * @returns True if the model likely supports tools
172
+ */
173
+ static modelSupportsTools(modelName) {
174
+ const lowerName = modelName.toLowerCase();
175
+ // Check against known tool-capable model families
176
+ return TOOL_CAPABLE_MODEL_FAMILIES.some(family => lowerName.startsWith(family) || lowerName.includes(`:${family}`));
177
+ }
178
+ /**
179
+ * Send a streaming chat message to an Ollama model
180
+ * @param model Model name to use
181
+ * @param messages Array of chat messages
182
+ * @param onChunk Callback for each streaming chunk
183
+ * @param options Optional generation parameters
184
+ * @returns Final complete response after stream ends
185
+ */
186
+ async sendChatMessageStreaming(model, messages, onChunk, options) {
187
+ try {
188
+ const request = {
189
+ model,
190
+ messages,
191
+ stream: true,
192
+ options,
193
+ };
194
+ quickLog(`[${new Date().toISOString()}] [OllamaService] Starting streaming chat with model: ${model}\n`);
195
+ const response = await fetch(`${this.baseUrl}/api/chat`, {
196
+ method: 'POST',
197
+ headers: {
198
+ 'Content-Type': 'application/json',
199
+ },
200
+ body: JSON.stringify(request),
201
+ });
202
+ if (!response.ok) {
203
+ const errorText = await response.text();
204
+ throw new Error(`Ollama API error: ${response.status} - ${errorText}`);
205
+ }
206
+ if (!response.body) {
207
+ throw new Error('No response body from Ollama');
208
+ }
209
+ const reader = response.body.getReader();
210
+ const decoder = new TextDecoder();
211
+ let fullContent = '';
212
+ let lastChunk = null;
213
+ while (true) {
214
+ const { done, value } = await reader.read();
215
+ if (done)
216
+ break;
217
+ const text = decoder.decode(value, { stream: true });
218
+ const lines = text.split('\n').filter(line => line.trim());
219
+ for (const line of lines) {
220
+ try {
221
+ const chunk = JSON.parse(line);
222
+ fullContent += chunk.message?.content || '';
223
+ lastChunk = chunk;
224
+ // Invoke callback with each chunk
225
+ onChunk(chunk);
226
+ if (chunk.done) {
227
+ break;
228
+ }
229
+ }
230
+ catch (parseError) {
231
+ // Skip malformed JSON lines
232
+ quickLog(`[${new Date().toISOString()}] [OllamaService] Skipping malformed chunk: ${line}\n`);
233
+ }
234
+ }
235
+ }
236
+ // Return a complete response object
237
+ const finalResponse = {
238
+ model,
239
+ created_at: lastChunk?.created_at || new Date().toISOString(),
240
+ message: {
241
+ role: 'assistant',
242
+ content: fullContent,
243
+ },
244
+ done: true,
245
+ total_duration: lastChunk?.total_duration || 0,
246
+ load_duration: lastChunk?.load_duration || 0,
247
+ prompt_eval_count: lastChunk?.prompt_eval_count || 0,
248
+ prompt_eval_duration: lastChunk?.prompt_eval_duration || 0,
249
+ eval_count: lastChunk?.eval_count || 0,
250
+ eval_duration: lastChunk?.eval_duration || 0,
251
+ };
252
+ quickLog(`[${new Date().toISOString()}] [OllamaService] Streaming complete. Total content length: ${fullContent.length}\n`);
253
+ return finalResponse;
254
+ }
255
+ catch (error) {
256
+ logError(`Ollama streaming error: ${error.message}`);
257
+ throw error;
258
+ }
259
+ }
260
+ /**
261
+ * Format model size for display (bytes to human-readable)
262
+ * @param bytes Size in bytes
263
+ * @returns Human-readable size string
264
+ */
265
+ static formatModelSize(bytes) {
266
+ if (bytes < 1024)
267
+ return `${bytes} B`;
268
+ if (bytes < 1024 * 1024)
269
+ return `${(bytes / 1024).toFixed(1)} KB`;
270
+ if (bytes < 1024 * 1024 * 1024)
271
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
272
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
273
+ }
274
+ /**
275
+ * Get a user-friendly error message for common Ollama issues
276
+ * @param error The error that occurred
277
+ * @returns User-friendly error message with helpful instructions
278
+ */
279
+ static getHelpfulErrorMessage(error) {
280
+ const message = error.message.toLowerCase();
281
+ if (message.includes('econnrefused') || message.includes('connection refused')) {
282
+ return `❌ Cannot connect to Ollama
283
+
284
+ Ollama is not running or not installed on this machine.
285
+
286
+ To fix this:
287
+ 1. Install Ollama from: https://ollama.ai
288
+ 2. Start Ollama by running: ollama serve
289
+ 3. Pull a model: ollama pull llama3
290
+
291
+ Then try again with /models local`;
292
+ }
293
+ if (message.includes('timeout') || message.includes('timed out')) {
294
+ return `❌ Connection to Ollama timed out
295
+
296
+ Ollama may be starting up or under heavy load.
297
+
298
+ Please ensure Ollama is running:
299
+ • Check if 'ollama serve' is running
300
+ • Try again in a few seconds`;
301
+ }
302
+ if (message.includes('model') && message.includes('not found')) {
303
+ return `❌ Model not found
304
+
305
+ The requested model is not available locally.
306
+
307
+ To download models, run:
308
+ • ollama pull llama3
309
+ • ollama pull codellama
310
+ • ollama pull mistral
311
+
312
+ Then try again.`;
313
+ }
314
+ return `❌ Ollama error: ${error.message}
315
+
316
+ Please ensure Ollama is installed and running.
317
+ Install from: https://ollama.ai`;
318
+ }
319
+ }
320
+ // Export singleton instance
321
+ export const ollamaService = new OllamaService();
322
+ // Export class for testing with different URLs
323
+ export { OllamaService };
324
+ //# sourceMappingURL=ollama-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama-service.js","sourceRoot":"","sources":["../../src/services/ollama-service.ts"],"names":[],"mappings":"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"}
@@ -20,9 +20,9 @@ interface AppProps {
20
20
  label: string;
21
21
  value: string;
22
22
  }>;
23
- type: 'model';
23
+ type: 'model' | 'local-model';
24
24
  }) => void) => void;
25
- onPickerSelection: (selection: string, type: 'model') => Promise<void>;
25
+ onPickerSelection: (selection: string, type: 'model' | 'local-model') => Promise<void>;
26
26
  onToolExecutionUpdate: (callback: (update: {
27
27
  toolName: string;
28
28
  status: 'pending' | 'executing' | 'completed' | 'error';
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../src/ui/components/App.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../src/ui/components/App.tsx"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import React, { useState, useCallback } from 'react';
1
+ import React, { useState, useCallback, useMemo } from 'react';
2
2
  import { Box, Text, useApp, useInput, Static } from 'ink';
3
3
  import SelectInput from 'ink-select-input';
4
4
  import { CircularSelectInput } from './CircularSelectInput.js';
@@ -38,6 +38,7 @@ import { apiClient } from '../../services/api-client.js';
38
38
  import { conversationManager } from '../../services/conversation-manager.js';
39
39
  import { logDebug, logError } from '../../utils/logger.js';
40
40
  import { getTerminalDimensions } from '../../hooks/useTerminalDimensions.js';
41
+ import { ConfigManager } from '../../config/manager.js';
41
42
  // Banner item with stable timestamp - created once outside component
42
43
  const BANNER_ITEM = { id: '__banner__', role: '__banner__', content: '', timestamp: new Date(0) };
43
44
  const MessageList = React.memo(({ history, current, showBanner }) => {
@@ -222,6 +223,7 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
222
223
  subAgentCount: 0,
223
224
  sessionQuotaExhausted: false,
224
225
  sessionQuotaTimeRemaining: '',
226
+ aiAutoSuggest: false,
225
227
  });
226
228
  // Track last terminal width to detect actual width changes
227
229
  const lastTerminalWidthRef = React.useRef(process.stdout.columns || 80);
@@ -323,6 +325,14 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
323
325
  React.useEffect(() => {
324
326
  const loadModelsConfig = async () => {
325
327
  try {
328
+ // Initialize ConfigManager to load general settings
329
+ const configManager = new ConfigManager();
330
+ const generalConfig = configManager.load();
331
+ setState(prev => ({
332
+ ...prev,
333
+ aiAutoSuggest: generalConfig.aiAutoSuggest === true
334
+ }));
335
+ // Import quickLog for debugging
326
336
  // Import quickLog for debugging
327
337
  const { quickLog } = await import('../../utils/conversation-logger.js');
328
338
  quickLog(`[${new Date().toISOString()}] [App] loadModelsConfig effect starting, currentModel: ${initialModel}\n`);
@@ -2129,6 +2139,33 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
2129
2139
  }
2130
2140
  else if (!isSlashCommand) {
2131
2141
  // Only add user message to display if it's not a slash command
2142
+ // INTERRUPT HANDLING: If AI is currently working, cancel and clean up first
2143
+ // This allows the new message to replace the interrupted turn
2144
+ if (state.isAiWorking || state.isLoading) {
2145
+ // Cancel current request (cli-adapter will clean up its history)
2146
+ onCancelRequest();
2147
+ // Small delay to allow abort to propagate before new request starts
2148
+ await new Promise(resolve => setTimeout(resolve, 50));
2149
+ // Clean up UI state: remove any partial/interrupted messages
2150
+ setState(prev => {
2151
+ // Filter out the last user message (the one we're replacing)
2152
+ let cleanedHistory = [...prev.messageHistory];
2153
+ for (let i = cleanedHistory.length - 1; i >= 0; i--) {
2154
+ if (cleanedHistory[i].role === 'user') {
2155
+ cleanedHistory.splice(i, 1);
2156
+ break; // Only remove the most recent user message
2157
+ }
2158
+ }
2159
+ return {
2160
+ ...prev,
2161
+ messageHistory: cleanedHistory,
2162
+ currentMessage: null,
2163
+ isLoading: false,
2164
+ isAiWorking: false,
2165
+ approvalRequest: undefined, // Clear any pending approval
2166
+ };
2167
+ });
2168
+ }
2132
2169
  // Show user message IMMEDIATELY with image breadcrumbs (uploading state)
2133
2170
  // Images will be uploaded in background, then AI will be called
2134
2171
  const hasImagesToUpload = clipboardImages && clipboardImages.length > 0;
@@ -2320,6 +2357,12 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
2320
2357
  const handleInputValueChange = useCallback((value) => {
2321
2358
  preservedInputTextRef.current = value;
2322
2359
  }, []);
2360
+ // Memoize session commands to prevent unnecessary re-renders in InputBox
2361
+ const sessionCommands = useMemo(() => {
2362
+ return state.messageHistory
2363
+ .filter(m => m.role === 'user')
2364
+ .map(m => m.content);
2365
+ }, [state.messageHistory]);
2323
2366
  // If in interactive editor mode, render minimal UI to keep Ink mounted
2324
2367
  // but don't render any visible content - the editor has the screen
2325
2368
  if (state.isInteractiveEditorMode) {
@@ -2441,7 +2484,7 @@ export const App = ({ onMessage, onCancelRequest, initialModel, initialPlanMode,
2441
2484
  handleSubmit(value, clipboardImages);
2442
2485
  }, autoAcceptMode: state.autoAcceptMode, model: state.currentModel, planMode: state.planMode, commandMode: state.commandMode, backgroundMode: state.backgroundMode, currentWorkingDirectory: state.currentWorkingDirectory, commandHistory: state.commandHistory, onToggleAutoAccept: handleToggleAutoAccept, onToggleCommandMode: onToggleCommandMode, onToggleBackgroundMode: onToggleBackgroundMode, isActive: true, subshellContext: state.subshellContext, currentTokens: state.currentTokens, maxTokens: state.maxTokens, contextLimitReached: state.contextLimitReached, isShellRunning: state.shellState?.isRunning, backgroundTaskCount: state.backgroundTaskCount, subAgentCount: state.subAgentCount, initialValue: preservedInputTextRef.current, onValueChange: handleInputValueChange, onSetAutoModeSetup: (callback) => {
2443
2486
  setAutoModeCallbackRef.current = callback;
2444
- }, sessionQuotaExhausted: state.sessionQuotaExhausted, sessionQuotaTimeRemaining: state.sessionQuotaTimeRemaining }))),
2487
+ }, sessionQuotaExhausted: state.sessionQuotaExhausted, sessionQuotaTimeRemaining: state.sessionQuotaTimeRemaining, aiAutoSuggestEnabled: state.aiAutoSuggest, sessionCommands: sessionCommands }))),
2445
2488
  state.showExitWarning && (React.createElement(Box, { marginTop: 1 },
2446
2489
  React.createElement(Text, { color: "#ffaa00", bold: true }, "\u26A0\uFE0F Press Ctrl+C again to exit"))),
2447
2490
  !isConnected && (React.createElement(Box, { marginTop: 0, marginLeft: state.showExitWarning ? 2 : 0 },