centaurus-cli 2.9.1 → 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 (156) hide show
  1. package/dist/cli-adapter.d.ts +76 -3
  2. package/dist/cli-adapter.d.ts.map +1 -1
  3. package/dist/cli-adapter.js +593 -230
  4. package/dist/cli-adapter.js.map +1 -1
  5. package/dist/config/mcp-config-manager.d.ts +21 -0
  6. package/dist/config/mcp-config-manager.d.ts.map +1 -1
  7. package/dist/config/mcp-config-manager.js +184 -1
  8. package/dist/config/mcp-config-manager.js.map +1 -1
  9. package/dist/config/models.d.ts +1 -0
  10. package/dist/config/models.d.ts.map +1 -1
  11. package/dist/config/models.js +9 -2
  12. package/dist/config/models.js.map +1 -1
  13. package/dist/config/slash-commands.d.ts +3 -0
  14. package/dist/config/slash-commands.d.ts.map +1 -1
  15. package/dist/config/slash-commands.js +39 -4
  16. package/dist/config/slash-commands.js.map +1 -1
  17. package/dist/config/types.d.ts +2 -0
  18. package/dist/config/types.d.ts.map +1 -1
  19. package/dist/config/types.js +1 -0
  20. package/dist/config/types.js.map +1 -1
  21. package/dist/index.js +60 -11
  22. package/dist/index.js.map +1 -1
  23. package/dist/mcp/mcp-command-handler.d.ts +34 -3
  24. package/dist/mcp/mcp-command-handler.d.ts.map +1 -1
  25. package/dist/mcp/mcp-command-handler.js +171 -83
  26. package/dist/mcp/mcp-command-handler.js.map +1 -1
  27. package/dist/mcp/mcp-server-manager.d.ts.map +1 -1
  28. package/dist/mcp/mcp-server-manager.js +9 -23
  29. package/dist/mcp/mcp-server-manager.js.map +1 -1
  30. package/dist/mcp/mcp-tool-wrapper.d.ts.map +1 -1
  31. package/dist/mcp/mcp-tool-wrapper.js +42 -5
  32. package/dist/mcp/mcp-tool-wrapper.js.map +1 -1
  33. package/dist/services/ai-autocomplete-agent.d.ts +39 -0
  34. package/dist/services/ai-autocomplete-agent.d.ts.map +1 -0
  35. package/dist/services/ai-autocomplete-agent.js +189 -0
  36. package/dist/services/ai-autocomplete-agent.js.map +1 -0
  37. package/dist/services/ai-service-client.d.ts +25 -0
  38. package/dist/services/ai-service-client.d.ts.map +1 -1
  39. package/dist/services/ai-service-client.js +162 -1
  40. package/dist/services/ai-service-client.js.map +1 -1
  41. package/dist/services/api-client.d.ts +9 -0
  42. package/dist/services/api-client.d.ts.map +1 -1
  43. package/dist/services/api-client.js +25 -0
  44. package/dist/services/api-client.js.map +1 -1
  45. package/dist/services/auth-handler.js +1 -1
  46. package/dist/services/auth-handler.js.map +1 -1
  47. package/dist/services/input-detection-agent.d.ts +40 -0
  48. package/dist/services/input-detection-agent.d.ts.map +1 -0
  49. package/dist/services/input-detection-agent.js +213 -0
  50. package/dist/services/input-detection-agent.js.map +1 -0
  51. package/dist/services/input-requirement-detector.d.ts +28 -0
  52. package/dist/services/input-requirement-detector.d.ts.map +1 -0
  53. package/dist/services/input-requirement-detector.js +203 -0
  54. package/dist/services/input-requirement-detector.js.map +1 -0
  55. package/dist/services/local-chat-storage.d.ts +21 -0
  56. package/dist/services/local-chat-storage.d.ts.map +1 -1
  57. package/dist/services/local-chat-storage.js +138 -43
  58. package/dist/services/local-chat-storage.js.map +1 -1
  59. package/dist/services/monitored-shell-manager.d.ts +120 -0
  60. package/dist/services/monitored-shell-manager.d.ts.map +1 -0
  61. package/dist/services/monitored-shell-manager.js +239 -0
  62. package/dist/services/monitored-shell-manager.js.map +1 -0
  63. package/dist/services/ollama-service.d.ts +197 -0
  64. package/dist/services/ollama-service.d.ts.map +1 -0
  65. package/dist/services/ollama-service.js +324 -0
  66. package/dist/services/ollama-service.js.map +1 -0
  67. package/dist/services/shell-input-agent.d.ts +89 -0
  68. package/dist/services/shell-input-agent.d.ts.map +1 -0
  69. package/dist/services/shell-input-agent.js +361 -0
  70. package/dist/services/shell-input-agent.js.map +1 -0
  71. package/dist/services/sub-agent-manager.d.ts +139 -0
  72. package/dist/services/sub-agent-manager.d.ts.map +1 -0
  73. package/dist/services/sub-agent-manager.js +517 -0
  74. package/dist/services/sub-agent-manager.js.map +1 -0
  75. package/dist/tools/background-command.d.ts.map +1 -1
  76. package/dist/tools/background-command.js +33 -13
  77. package/dist/tools/background-command.js.map +1 -1
  78. package/dist/tools/command.d.ts.map +1 -1
  79. package/dist/tools/command.js +64 -1
  80. package/dist/tools/command.js.map +1 -1
  81. package/dist/tools/file-ops.d.ts.map +1 -1
  82. package/dist/tools/file-ops.js +33 -19
  83. package/dist/tools/file-ops.js.map +1 -1
  84. package/dist/tools/get-diff.js +1 -1
  85. package/dist/tools/get-diff.js.map +1 -1
  86. package/dist/tools/grep-search.d.ts.map +1 -1
  87. package/dist/tools/grep-search.js +41 -15
  88. package/dist/tools/grep-search.js.map +1 -1
  89. package/dist/tools/plan-mode.js +3 -3
  90. package/dist/tools/plan-mode.js.map +1 -1
  91. package/dist/tools/registry.js +1 -1
  92. package/dist/tools/registry.js.map +1 -1
  93. package/dist/tools/sub-agent.d.ts +9 -0
  94. package/dist/tools/sub-agent.d.ts.map +1 -0
  95. package/dist/tools/sub-agent.js +232 -0
  96. package/dist/tools/sub-agent.js.map +1 -0
  97. package/dist/tools/task-complete.d.ts.map +1 -1
  98. package/dist/tools/task-complete.js +14 -26
  99. package/dist/tools/task-complete.js.map +1 -1
  100. package/dist/ui/components/App.d.ts +45 -2
  101. package/dist/ui/components/App.d.ts.map +1 -1
  102. package/dist/ui/components/App.js +605 -96
  103. package/dist/ui/components/App.js.map +1 -1
  104. package/dist/ui/components/CircularSelectInput.d.ts +24 -0
  105. package/dist/ui/components/CircularSelectInput.d.ts.map +1 -0
  106. package/dist/ui/components/CircularSelectInput.js +71 -0
  107. package/dist/ui/components/CircularSelectInput.js.map +1 -0
  108. package/dist/ui/components/ErrorBoundary.d.ts +3 -2
  109. package/dist/ui/components/ErrorBoundary.d.ts.map +1 -1
  110. package/dist/ui/components/ErrorBoundary.js +29 -1
  111. package/dist/ui/components/ErrorBoundary.js.map +1 -1
  112. package/dist/ui/components/InputBox.d.ts +4 -0
  113. package/dist/ui/components/InputBox.d.ts.map +1 -1
  114. package/dist/ui/components/InputBox.js +343 -21
  115. package/dist/ui/components/InputBox.js.map +1 -1
  116. package/dist/ui/components/InteractiveShell.d.ts +6 -0
  117. package/dist/ui/components/InteractiveShell.d.ts.map +1 -1
  118. package/dist/ui/components/InteractiveShell.js +57 -6
  119. package/dist/ui/components/InteractiveShell.js.map +1 -1
  120. package/dist/ui/components/MCPAddScreen.d.ts +13 -0
  121. package/dist/ui/components/MCPAddScreen.d.ts.map +1 -0
  122. package/dist/ui/components/MCPAddScreen.js +54 -0
  123. package/dist/ui/components/MCPAddScreen.js.map +1 -0
  124. package/dist/ui/components/MCPListScreen.d.ts +17 -0
  125. package/dist/ui/components/MCPListScreen.d.ts.map +1 -0
  126. package/dist/ui/components/MCPListScreen.js +50 -0
  127. package/dist/ui/components/MCPListScreen.js.map +1 -0
  128. package/dist/ui/components/MCPServerListScreen.d.ts +16 -0
  129. package/dist/ui/components/MCPServerListScreen.d.ts.map +1 -0
  130. package/dist/ui/components/MCPServerListScreen.js +59 -0
  131. package/dist/ui/components/MCPServerListScreen.js.map +1 -0
  132. package/dist/ui/components/MonitorModeAIPanel.d.ts +23 -0
  133. package/dist/ui/components/MonitorModeAIPanel.d.ts.map +1 -0
  134. package/dist/ui/components/MonitorModeAIPanel.js +69 -0
  135. package/dist/ui/components/MonitorModeAIPanel.js.map +1 -0
  136. package/dist/ui/components/MultiLineInput.d.ts +13 -0
  137. package/dist/ui/components/MultiLineInput.d.ts.map +1 -0
  138. package/dist/ui/components/MultiLineInput.js +289 -0
  139. package/dist/ui/components/MultiLineInput.js.map +1 -0
  140. package/dist/ui/components/StatusBar.d.ts +2 -0
  141. package/dist/ui/components/StatusBar.d.ts.map +1 -1
  142. package/dist/ui/components/StatusBar.js +33 -2
  143. package/dist/ui/components/StatusBar.js.map +1 -1
  144. package/dist/ui/components/ToolExecutionMessage.d.ts.map +1 -1
  145. package/dist/ui/components/ToolExecutionMessage.js +231 -13
  146. package/dist/ui/components/ToolExecutionMessage.js.map +1 -1
  147. package/dist/ui/components/VersionUpdatePrompt.d.ts.map +1 -1
  148. package/dist/ui/components/VersionUpdatePrompt.js +3 -2
  149. package/dist/ui/components/VersionUpdatePrompt.js.map +1 -1
  150. package/dist/utils/command-history.d.ts +12 -2
  151. package/dist/utils/command-history.d.ts.map +1 -1
  152. package/dist/utils/command-history.js +57 -13
  153. package/dist/utils/command-history.js.map +1 -1
  154. package/dist/utils/input-classifier.js +1 -1
  155. package/dist/utils/input-classifier.js.map +1 -1
  156. package/package.json +2 -1
@@ -1,6 +1,5 @@
1
1
  import { Client } from '@modelcontextprotocol/sdk/client/index.js';
2
2
  import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
3
- import { spawn } from 'child_process';
4
3
  import { logWarning } from '../utils/logger.js';
5
4
  export class MCPServerManager {
6
5
  servers = new Map();
@@ -14,29 +13,12 @@ export class MCPServerManager {
14
13
  status: 'connecting',
15
14
  tools: []
16
15
  });
17
- // Spawn the MCP server process
18
- const serverProcess = spawn(config.command, config.args || [], {
19
- env: { ...process.env, ...config.env },
20
- stdio: ['pipe', 'pipe', 'pipe']
21
- });
22
- // Handle process errors
23
- serverProcess.on('error', (error) => {
24
- this.statuses.set(config.name, {
25
- name: config.name,
26
- status: 'error',
27
- tools: [],
28
- error: `Process error: ${error.message}`
29
- });
30
- });
31
- serverProcess.stderr?.on('data', (data) => {
32
- // Log stderr to file instead of console to keep UI clean
33
- logWarning(`[MCP ${config.name}] stderr: ${data.toString().trim()}`);
34
- });
35
- // Create transport
16
+ // Create transport with stderr suppressed to prevent logs in terminal
36
17
  const transport = new StdioClientTransport({
37
18
  command: config.command,
38
19
  args: config.args || [],
39
- env: config.env
20
+ env: { ...process.env, ...config.env },
21
+ stderr: 'ignore' // Suppress stderr output to terminal
40
22
  });
41
23
  // Create client
42
24
  const client = new Client({
@@ -54,8 +36,12 @@ export class MCPServerManager {
54
36
  description: tool.description,
55
37
  inputSchema: tool.inputSchema
56
38
  }));
57
- // Store client and process
58
- this.servers.set(config.name, { client, process: serverProcess, config });
39
+ // Store client (transport manages the process internally)
40
+ this.servers.set(config.name, {
41
+ client,
42
+ process: transport.process, // Access internal process for cleanup
43
+ config
44
+ });
59
45
  this.startTimes.set(config.name, Date.now());
60
46
  // Update status
61
47
  this.statuses.set(config.name, {
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-server-manager.js","sourceRoot":"","sources":["../../src/mcp/mcp-server-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp-server-manager.js","sourceRoot":"","sources":["../../src/mcp/mcp-server-manager.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-tool-wrapper.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp-tool-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAwB,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,oBAAoB,CAChC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,gBAAgB,GAChC,IAAI,CA0DN;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACjC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,OAAO,EAAE,EAChB,aAAa,EAAE,gBAAgB,GAChC,IAAI,EAAE,CAER"}
1
+ {"version":3,"file":"mcp-tool-wrapper.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp-tool-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAwB,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AA2CpE;;;GAGG;AACH,wBAAgB,oBAAoB,CAChC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,gBAAgB,GAChC,IAAI,CA6DN;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACjC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,OAAO,EAAE,EAChB,aAAa,EAAE,gBAAgB,GAChC,IAAI,EAAE,CAER"}
@@ -1,17 +1,54 @@
1
+ /**
2
+ * Sanitize JSON Schema for Gemini compatibility
3
+ * Removes properties that Gemini doesn't support
4
+ */
5
+ function sanitizeSchemaForGemini(schema) {
6
+ if (!schema || typeof schema !== 'object') {
7
+ return schema;
8
+ }
9
+ // Create a copy to avoid mutating the original
10
+ const sanitized = Array.isArray(schema) ? [...schema] : { ...schema };
11
+ // Remove unsupported properties
12
+ const unsupportedProps = [
13
+ 'exclusiveMinimum',
14
+ 'exclusiveMaximum',
15
+ 'const',
16
+ 'contentMediaType',
17
+ 'contentEncoding',
18
+ 'examples',
19
+ '$schema',
20
+ '$id',
21
+ '$ref',
22
+ 'definitions',
23
+ '$defs'
24
+ ];
25
+ for (const prop of unsupportedProps) {
26
+ delete sanitized[prop];
27
+ }
28
+ // Recursively sanitize nested objects
29
+ for (const key in sanitized) {
30
+ if (typeof sanitized[key] === 'object' && sanitized[key] !== null) {
31
+ sanitized[key] = sanitizeSchemaForGemini(sanitized[key]);
32
+ }
33
+ }
34
+ return sanitized;
35
+ }
1
36
  /**
2
37
  * Create a Tool wrapper for an MCP tool
3
38
  * This allows MCP tools to be registered in the Centaurus tool registry
4
39
  */
5
40
  export function createMCPToolWrapper(serverName, mcpTool, serverManager) {
41
+ // Sanitize the input schema to remove Gemini-incompatible properties
42
+ const sanitizedSchema = sanitizeSchemaForGemini(mcpTool.inputSchema || {
43
+ type: 'object',
44
+ properties: {},
45
+ required: []
46
+ });
6
47
  return {
7
48
  schema: {
8
49
  name: `mcp_${serverName}_${mcpTool.name}`,
9
50
  description: mcpTool.description || `${mcpTool.name} from ${serverName} MCP server`,
10
- parameters: mcpTool.inputSchema || {
11
- type: 'object',
12
- properties: {},
13
- required: []
14
- }
51
+ parameters: sanitizedSchema
15
52
  },
16
53
  async execute(args, context) {
17
54
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-tool-wrapper.js","sourceRoot":"","sources":["../../src/mcp/mcp-tool-wrapper.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAChC,UAAkB,EAClB,OAAgB,EAChB,aAA+B;IAE/B,OAAO;QACH,MAAM,EAAE;YACJ,IAAI,EAAE,OAAO,UAAU,IAAI,OAAO,CAAC,IAAI,EAAE;YACzC,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,GAAG,OAAO,CAAC,IAAI,SAAS,UAAU,aAAa;YACnF,UAAU,EAAE,OAAO,CAAC,WAAW,IAAI;gBAC/B,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;gBACd,QAAQ,EAAE,EAAE;aACf;SACJ;QACD,KAAK,CAAC,OAAO,CAAC,IAAyB,EAAE,OAA6B;YAClE,IAAI,CAAC;gBACD,qCAAqC;gBACrC,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;oBACzC,MAAM,IAAI,KAAK,CAAC,eAAe,UAAU,oBAAoB,CAAC,CAAC;gBACnE,CAAC;gBAED,mDAAmD;gBACnD,gFAAgF;gBAChF,MAAM,eAAe,GAAG,OAAO,UAAU,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBAE5D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,eAAe,CAC1C,qBAAqB,UAAU,IAAI,OAAO,CAAC,IAAI,EAAE,EACjD,IAAI,CAAC,+DAA+D;iBACvE,CAAC;gBAEF,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACpE,OAAO,uCAAuC,CAAC;gBACnD,CAAC;gBAED,oBAAoB;gBACpB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAE5E,8BAA8B;gBAC9B,IAAI,MAAM,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;oBAClD,wDAAwD;oBACxD,OAAO,MAAM,CAAC,OAAO;yBAChB,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;wBACf,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;4BACvB,OAAO,IAAI,CAAC,IAAI,CAAC;wBACrB,CAAC;6BAAM,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;4BAC/B,OAAO,WAAW,IAAI,CAAC,IAAI,GAAG,CAAC;wBACnC,CAAC;6BAAM,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;4BAClC,OAAO,cAAc,IAAI,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAC;wBAC/C,CAAC;wBACD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;oBAChC,CAAC,CAAC;yBACD,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpB,CAAC;gBAED,2CAA2C;gBAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACnE,CAAC;QACL,CAAC;KACJ,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACjC,UAAkB,EAClB,KAAgB,EAChB,aAA+B;IAE/B,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,oBAAoB,CAAC,UAAU,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;AACpF,CAAC"}
1
+ {"version":3,"file":"mcp-tool-wrapper.js","sourceRoot":"","sources":["../../src/mcp/mcp-tool-wrapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * AI Autocomplete Agent Service
3
+ *
4
+ * A lightweight AI agent using gemini-2.0-flash-lite that predicts commands
5
+ * the user is trying to type. Triggered after 5 seconds of input inactivity.
6
+ */
7
+ export interface AutocompleteContext {
8
+ os: string;
9
+ platform: string;
10
+ cwd: string;
11
+ directoryHistory: string[];
12
+ sessionCommands: string[];
13
+ files: string[];
14
+ currentInput: string;
15
+ }
16
+ declare class AIAutocompleteAgentClass {
17
+ private pendingRequest;
18
+ /**
19
+ * Predict the full command the user is trying to type
20
+ * Returns null if no confident prediction can be made
21
+ */
22
+ predictCommand(context: AutocompleteContext, signal?: AbortSignal): Promise<string | null>;
23
+ /**
24
+ * Abort any pending prediction request
25
+ */
26
+ abort(): void;
27
+ /**
28
+ * Call the AI model to get a prediction
29
+ */
30
+ private callAI;
31
+ /**
32
+ * Merge two abort signals into one
33
+ */
34
+ private mergeSignals;
35
+ }
36
+ export declare const AIAutocompleteAgent: AIAutocompleteAgentClass;
37
+ export declare const AI_AUTOCOMPLETE_DEBOUNCE_MS = 5000;
38
+ export {};
39
+ //# sourceMappingURL=ai-autocomplete-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-autocomplete-agent.d.ts","sourceRoot":"","sources":["../../src/services/ai-autocomplete-agent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,MAAM,WAAW,mBAAmB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACxB;AAwBD,cAAM,wBAAwB;IAC1B,OAAO,CAAC,cAAc,CAAgC;IAEtD;;;OAGG;IACG,cAAc,CAAC,OAAO,EAAE,mBAAmB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA6ChG;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;YACW,MAAM;IAwGpB;;OAEG;IACH,OAAO,CAAC,YAAY;CAcvB;AAGD,eAAO,MAAM,mBAAmB,0BAAiC,CAAC;AAGlE,eAAO,MAAM,2BAA2B,OAAc,CAAC"}
@@ -0,0 +1,189 @@
1
+ /**
2
+ * AI Autocomplete Agent Service
3
+ *
4
+ * A lightweight AI agent using gemini-2.0-flash-lite that predicts commands
5
+ * the user is trying to type. Triggered after 5 seconds of input inactivity.
6
+ */
7
+ import { aiServiceClient } from './ai-service-client.js';
8
+ import { quickLog } from '../utils/conversation-logger.js';
9
+ // ==================== Constants ====================
10
+ const MODEL = 'gemini-2.0-flash-lite'; // Fast, cheap model for prediction
11
+ const DEBOUNCE_MS = 5000; // 5 seconds of inactivity before triggering
12
+ // ==================== System Prompt ====================
13
+ 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.
14
+
15
+ RULES:
16
+ 1. Respond with ONLY the predicted full command - no explanations, no quotes, no markdown
17
+ 2. If you cannot confidently predict a command, respond with exactly "NONE"
18
+ 3. The prediction should be a complete, valid command that would work in the given OS and directory
19
+ 4. Consider the user's command history in this directory and session when making predictions
20
+ 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.
21
+ 6. Be conservative - only predict when you have high confidence
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 ====================
31
+ class AIAutocompleteAgentClass {
32
+ pendingRequest = null;
33
+ /**
34
+ * Predict the full command the user is trying to type
35
+ * Returns null if no confident prediction can be made
36
+ */
37
+ async predictCommand(context, signal) {
38
+ // Don't predict for empty or very short inputs
39
+ if (!context.currentInput || context.currentInput.trim().length < 2) {
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
+ }
76
+ }
77
+ /**
78
+ * Abort any pending prediction request
79
+ */
80
+ abort() {
81
+ if (this.pendingRequest) {
82
+ this.pendingRequest.abort();
83
+ this.pendingRequest = null;
84
+ }
85
+ }
86
+ /**
87
+ * Call the AI model to get a prediction
88
+ */
89
+ async callAI(context, signal) {
90
+ // Build context string
91
+ const contextParts = [
92
+ `OS: ${context.os}`,
93
+ `Platform: ${context.platform}`,
94
+ `Current Directory: ${context.cwd}`,
95
+ ];
96
+ if (context.files && context.files.length > 0) {
97
+ const fileList = context.files.slice(0, 50); // Hard limit just in case
98
+ contextParts.push(`Files in current directory:\n${fileList.join('\n')}`);
99
+ }
100
+ if (context.directoryHistory.length > 0) {
101
+ const recentDirHistory = context.directoryHistory.slice(0, 10); // Take top 10 most frequent/recent
102
+ contextParts.push(`Recent commands in this directory:\n${recentDirHistory.join('\n')}`);
103
+ }
104
+ if (context.sessionCommands.length > 0) {
105
+ const recentSession = context.sessionCommands.slice(-10);
106
+ contextParts.push(`Commands run in this session:\n${recentSession.join('\n')}`);
107
+ }
108
+ const userPrompt = `${contextParts.join('\n\n')}
109
+
110
+ User is currently typing: "${context.currentInput}"
111
+
112
+ What is the full command they are trying to type?`;
113
+ // Build messages
114
+ const messages = [
115
+ { role: 'user', content: AUTOCOMPLETE_SYSTEM_PROMPT + '\n\n' + userPrompt }
116
+ ];
117
+ // Log detailed context and prompt for debugging
118
+ quickLog(`[${new Date().toISOString()}] [AIAutocompleteAgent] Context: ${JSON.stringify(context, null, 2)}\n`);
119
+ quickLog(`[${new Date().toISOString()}] [AIAutocompleteAgent] Full Prompt:\n${JSON.stringify(messages, null, 2)}\n`);
120
+ // Stream AI response
121
+ let responseText = '';
122
+ try {
123
+ for await (const chunk of aiServiceClient.streamChat(MODEL, messages, [], // No tools needed
124
+ {
125
+ cwd: context.cwd,
126
+ platform: context.platform,
127
+ shell: process.platform === 'win32' ? 'powershell' : 'bash',
128
+ os: (context.os === 'win32' ? 'windows' : context.os === 'darwin' ? 'macos' : 'linux'),
129
+ homeDir: ''
130
+ }, undefined, undefined, signal)) {
131
+ if (signal.aborted) {
132
+ throw new Error('AbortError');
133
+ }
134
+ if (chunk.type === 'text') {
135
+ responseText += chunk.content;
136
+ }
137
+ // Early exit if response is getting too long (should be a single command)
138
+ if (responseText.length > 200) {
139
+ break;
140
+ }
141
+ }
142
+ }
143
+ catch (error) {
144
+ if (error.message === 'AbortError' || error.name === 'AbortError') {
145
+ const abortError = new Error('AbortError');
146
+ abortError.name = 'AbortError';
147
+ throw abortError;
148
+ }
149
+ throw error;
150
+ }
151
+ // Parse response
152
+ const prediction = responseText.trim();
153
+ quickLog(`[${new Date().toISOString()}] [AIAutocompleteAgent] Raw AI Response: "${prediction}"\n`);
154
+ // Check for NONE or invalid predictions
155
+ if (!prediction || prediction.toUpperCase() === 'NONE' || prediction.length < 2) {
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;
168
+ }
169
+ /**
170
+ * Merge two abort signals into one
171
+ */
172
+ mergeSignals(signal1, signal2) {
173
+ const controller = new AbortController();
174
+ const abort = () => controller.abort();
175
+ if (signal1.aborted || signal2.aborted) {
176
+ controller.abort();
177
+ }
178
+ else {
179
+ signal1.addEventListener('abort', abort, { once: true });
180
+ signal2.addEventListener('abort', abort, { once: true });
181
+ }
182
+ return controller.signal;
183
+ }
184
+ }
185
+ // Export singleton
186
+ export const AIAutocompleteAgent = new AIAutocompleteAgentClass();
187
+ // Export debounce constant for use in InputBox
188
+ export const AI_AUTOCOMPLETE_DEBOUNCE_MS = DEBOUNCE_MS;
189
+ //# sourceMappingURL=ai-autocomplete-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-autocomplete-agent.js","sourceRoot":"","sources":["../../src/services/ai-autocomplete-agent.ts"],"names":[],"mappings":"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"}
@@ -91,6 +91,31 @@ export declare class AIServiceClient {
91
91
  * This is a workaround since sessionToken is private
92
92
  */
93
93
  private getSessionToken;
94
+ /**
95
+ * Check if the current configuration is using a local Ollama model
96
+ */
97
+ isUsingLocalModel(): boolean;
98
+ /**
99
+ * Get the current model name from config
100
+ */
101
+ private getCurrentModel;
102
+ /**
103
+ * Convert internal message format to Ollama format (with tool support)
104
+ */
105
+ private convertToOllamaMessages;
106
+ /**
107
+ * Convert ToolSchema array to Ollama tool format
108
+ */
109
+ private convertToolsToOllamaFormat;
110
+ /**
111
+ * Stream chat request to local Ollama instance with tool calling support
112
+ *
113
+ * @param model - The local Ollama model to use (e.g., 'llama3.2:latest')
114
+ * @param messages - Conversation history
115
+ * @param tools - Available tools (will be converted to Ollama format)
116
+ * @yields Stream chunks (text, tool_call, or done events)
117
+ */
118
+ streamLocalChat(model: string, messages: Message[], tools?: ToolSchema[]): AsyncGenerator<StreamChunk, void, unknown>;
94
119
  /**
95
120
  * Parse Server-Sent Events stream from response body
96
121
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ai-service-client.d.ts","sourceRoot":"","sources":["../../src/services/ai-service-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAO5D;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,sBAAsB,CAAC;AAgBrH;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAgB;;IAQlC;;;OAGG;IACH,OAAO,CAAC,UAAU;IAWlB;;;;;;;;;OASG;IACI,UAAU,CACf,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,UAAU,EAAE,EACnB,kBAAkB,CAAC,EAAE,kBAAkB,EACvC,IAAI,CAAC,EAAE,MAAM,EACb,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACpC,WAAW,CAAC,EAAE,WAAW,GACxB,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC;IAkK7C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;;OAGG;IACH,OAAO,CAAC,eAAe;IAiBvB;;;;;OAKG;YACY,cAAc;CA0E9B;AAGD,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
1
+ {"version":3,"file":"ai-service-client.d.ts","sourceRoot":"","sources":["../../src/services/ai-service-client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAS5D;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,sBAAsB,CAAC;AAgBrH;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAgB;;IAQlC;;;OAGG;IACH,OAAO,CAAC,UAAU;IAWlB;;;;;;;;;OASG;IACI,UAAU,CACf,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,UAAU,EAAE,EACnB,kBAAkB,CAAC,EAAE,kBAAkB,EACvC,IAAI,CAAC,EAAE,MAAM,EACb,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACpC,WAAW,CAAC,EAAE,WAAW,GACxB,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC;IAsL7C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;;OAGG;IACH,OAAO,CAAC,eAAe;IAiBvB;;OAEG;IACH,iBAAiB,IAAI,OAAO;IAc5B;;OAEG;IACH,OAAO,CAAC,eAAe;IAcvB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAiC/B;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAelC;;;;;;;OAOG;IACI,eAAe,CACpB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,GAAE,UAAU,EAAO,GACvB,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,CAAC;IA6D7C;;;;;OAKG;YACY,cAAc;CA0E9B;AAGD,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
@@ -10,6 +10,8 @@ import { join } from 'path';
10
10
  import { homedir } from 'os';
11
11
  import { IS_DEV_BUILD, DEV_BACKEND_URL, PRODUCTION_BACKEND_URL } from '../config/build-config.js';
12
12
  import { logWarning } from '../utils/logger.js';
13
+ import { ollamaService, OllamaService } from './ollama-service.js';
14
+ import { quickLog } from '../utils/conversation-logger.js';
13
15
  /**
14
16
  * AI Service Client for streaming chat requests to backend
15
17
  */
@@ -46,7 +48,23 @@ export class AIServiceClient {
46
48
  * @yields Stream chunks (text, tool calls, done, or error events)
47
49
  */
48
50
  async *streamChat(model, messages, tools, environmentContext, mode, thinkingConfig, abortSignal) {
49
- // Build request payload
51
+ // Check if using a local Ollama model
52
+ if (this.isUsingLocalModel()) {
53
+ const localModel = this.getCurrentModel();
54
+ const supportsTools = OllamaService.modelSupportsTools(localModel);
55
+ quickLog(`[${new Date().toISOString()}] [AIServiceClient] Routing to local Ollama model: ${localModel}, supportsTools: ${supportsTools}\n`);
56
+ // Show warning only if tools are provided but model doesn't support them
57
+ if (tools.length > 0 && !supportsTools) {
58
+ yield {
59
+ type: 'text',
60
+ content: `⚠️ Note: Model "${localModel}" does not support tool calling. Running in text-only mode.\n\n`,
61
+ };
62
+ }
63
+ // Route to local Ollama with tools
64
+ yield* this.streamLocalChat(localModel, messages, tools);
65
+ return;
66
+ }
67
+ // Build request payload for cloud backend
50
68
  const payload = {
51
69
  model,
52
70
  messages,
@@ -223,6 +241,149 @@ export class AIServiceClient {
223
241
  }
224
242
  return '';
225
243
  }
244
+ /**
245
+ * Check if the current configuration is using a local Ollama model
246
+ */
247
+ isUsingLocalModel() {
248
+ const configPath = join(homedir(), '.centaurus', 'config.json');
249
+ try {
250
+ if (existsSync(configPath)) {
251
+ const data = readFileSync(configPath, 'utf-8');
252
+ const config = JSON.parse(data);
253
+ return config.isLocalModel === true;
254
+ }
255
+ }
256
+ catch (error) {
257
+ // Return false if unable to read
258
+ }
259
+ return false;
260
+ }
261
+ /**
262
+ * Get the current model name from config
263
+ */
264
+ getCurrentModel() {
265
+ const configPath = join(homedir(), '.centaurus', 'config.json');
266
+ try {
267
+ if (existsSync(configPath)) {
268
+ const data = readFileSync(configPath, 'utf-8');
269
+ const config = JSON.parse(data);
270
+ return config.model || 'gemini-2.5-flash';
271
+ }
272
+ }
273
+ catch (error) {
274
+ // Return default if unable to read
275
+ }
276
+ return 'gemini-2.5-flash';
277
+ }
278
+ /**
279
+ * Convert internal message format to Ollama format (with tool support)
280
+ */
281
+ convertToOllamaMessages(messages) {
282
+ return messages.map(msg => {
283
+ if (msg.role === 'tool') {
284
+ // Tool results - convert to Ollama's tool message format
285
+ return {
286
+ role: 'tool',
287
+ content: msg.content,
288
+ tool_name: msg.tool_call_id || 'unknown', // Use tool_call_id as tool_name
289
+ };
290
+ }
291
+ if (msg.role === 'assistant' && msg.tool_calls?.length) {
292
+ // Assistant message with tool calls
293
+ return {
294
+ role: 'assistant',
295
+ content: msg.content || '',
296
+ tool_calls: msg.tool_calls.map(tc => ({
297
+ function: {
298
+ name: tc.name,
299
+ arguments: tc.arguments,
300
+ }
301
+ })),
302
+ };
303
+ }
304
+ // Regular message
305
+ return {
306
+ role: msg.role,
307
+ content: msg.content,
308
+ };
309
+ });
310
+ }
311
+ /**
312
+ * Convert ToolSchema array to Ollama tool format
313
+ */
314
+ convertToolsToOllamaFormat(tools) {
315
+ return tools.map(tool => ({
316
+ type: 'function',
317
+ function: {
318
+ name: tool.name,
319
+ description: tool.description,
320
+ parameters: {
321
+ type: 'object',
322
+ properties: tool.parameters.properties,
323
+ required: tool.parameters.required,
324
+ },
325
+ },
326
+ }));
327
+ }
328
+ /**
329
+ * Stream chat request to local Ollama instance with tool calling support
330
+ *
331
+ * @param model - The local Ollama model to use (e.g., 'llama3.2:latest')
332
+ * @param messages - Conversation history
333
+ * @param tools - Available tools (will be converted to Ollama format)
334
+ * @yields Stream chunks (text, tool_call, or done events)
335
+ */
336
+ async *streamLocalChat(model, messages, tools = []) {
337
+ try {
338
+ const supportsTools = OllamaService.modelSupportsTools(model);
339
+ const effectiveTools = supportsTools ? tools : [];
340
+ quickLog(`[${new Date().toISOString()}] [AIServiceClient] Starting local chat with model: ${model}, tools: ${effectiveTools.length}, supportsTools: ${supportsTools}\n`);
341
+ // Convert messages to Ollama format
342
+ const ollamaMessages = this.convertToOllamaMessages(messages);
343
+ // Convert tools to Ollama format if model supports them
344
+ const ollamaTools = effectiveTools.length > 0
345
+ ? this.convertToolsToOllamaFormat(effectiveTools)
346
+ : undefined;
347
+ // Send request to Ollama with tools
348
+ const response = await ollamaService.sendChatMessage(model, ollamaMessages, ollamaTools);
349
+ // Check for tool calls in response
350
+ if (response.message?.tool_calls?.length) {
351
+ quickLog(`[${new Date().toISOString()}] [AIServiceClient] Received ${response.message.tool_calls.length} tool calls from Ollama\n`);
352
+ // Yield each tool call
353
+ for (const toolCall of response.message.tool_calls) {
354
+ yield {
355
+ type: 'tool_call',
356
+ toolCall: {
357
+ id: `ollama-${Date.now()}-${toolCall.function.name}`, // Generate unique ID
358
+ name: toolCall.function.name,
359
+ arguments: toolCall.function.arguments,
360
+ },
361
+ };
362
+ }
363
+ // Signal completion (tool execution will happen in cli-adapter)
364
+ yield { type: 'done' };
365
+ return;
366
+ }
367
+ // No tool calls - yield text response
368
+ if (response.message.content) {
369
+ yield {
370
+ type: 'text',
371
+ content: response.message.content,
372
+ };
373
+ }
374
+ // Signal completion
375
+ yield { type: 'done' };
376
+ quickLog(`[${new Date().toISOString()}] [AIServiceClient] Local chat completed\n`);
377
+ }
378
+ catch (error) {
379
+ quickLog(`[${new Date().toISOString()}] [AIServiceClient] Local chat error: ${error.message}\n`);
380
+ yield {
381
+ type: 'error',
382
+ message: error.message || 'Failed to communicate with Ollama',
383
+ code: 'OLLAMA_ERROR',
384
+ };
385
+ }
386
+ }
226
387
  /**
227
388
  * Parse Server-Sent Events stream from response body
228
389
  *