cursor-recursive-rag 0.2.0-alpha.2 → 0.2.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.
Files changed (210) hide show
  1. package/README.md +179 -203
  2. package/dist/adapters/llm/anthropic.d.ts +27 -0
  3. package/dist/adapters/llm/anthropic.d.ts.map +1 -0
  4. package/dist/adapters/llm/anthropic.js +287 -0
  5. package/dist/adapters/llm/anthropic.js.map +1 -0
  6. package/dist/adapters/llm/base.d.ts +62 -0
  7. package/dist/adapters/llm/base.d.ts.map +1 -0
  8. package/dist/adapters/llm/base.js +140 -0
  9. package/dist/adapters/llm/base.js.map +1 -0
  10. package/dist/adapters/llm/deepseek.d.ts +24 -0
  11. package/dist/adapters/llm/deepseek.d.ts.map +1 -0
  12. package/dist/adapters/llm/deepseek.js +228 -0
  13. package/dist/adapters/llm/deepseek.js.map +1 -0
  14. package/dist/adapters/llm/groq.d.ts +25 -0
  15. package/dist/adapters/llm/groq.d.ts.map +1 -0
  16. package/dist/adapters/llm/groq.js +265 -0
  17. package/dist/adapters/llm/groq.js.map +1 -0
  18. package/dist/adapters/llm/index.d.ts +62 -0
  19. package/dist/adapters/llm/index.d.ts.map +1 -0
  20. package/dist/adapters/llm/index.js +380 -0
  21. package/dist/adapters/llm/index.js.map +1 -0
  22. package/dist/adapters/llm/ollama.d.ts +23 -0
  23. package/dist/adapters/llm/ollama.d.ts.map +1 -0
  24. package/dist/adapters/llm/ollama.js +261 -0
  25. package/dist/adapters/llm/ollama.js.map +1 -0
  26. package/dist/adapters/llm/openai.d.ts +22 -0
  27. package/dist/adapters/llm/openai.d.ts.map +1 -0
  28. package/dist/adapters/llm/openai.js +232 -0
  29. package/dist/adapters/llm/openai.js.map +1 -0
  30. package/dist/adapters/llm/openrouter.d.ts +27 -0
  31. package/dist/adapters/llm/openrouter.d.ts.map +1 -0
  32. package/dist/adapters/llm/openrouter.js +305 -0
  33. package/dist/adapters/llm/openrouter.js.map +1 -0
  34. package/dist/adapters/vector/index.d.ts.map +1 -1
  35. package/dist/adapters/vector/index.js +8 -0
  36. package/dist/adapters/vector/index.js.map +1 -1
  37. package/dist/adapters/vector/redis-native.d.ts +35 -0
  38. package/dist/adapters/vector/redis-native.d.ts.map +1 -0
  39. package/dist/adapters/vector/redis-native.js +170 -0
  40. package/dist/adapters/vector/redis-native.js.map +1 -0
  41. package/dist/cli/commands/chat.d.ts +4 -0
  42. package/dist/cli/commands/chat.d.ts.map +1 -0
  43. package/dist/cli/commands/chat.js +374 -0
  44. package/dist/cli/commands/chat.js.map +1 -0
  45. package/dist/cli/commands/maintenance.d.ts +4 -0
  46. package/dist/cli/commands/maintenance.d.ts.map +1 -0
  47. package/dist/cli/commands/maintenance.js +237 -0
  48. package/dist/cli/commands/maintenance.js.map +1 -0
  49. package/dist/cli/commands/rules.d.ts +9 -0
  50. package/dist/cli/commands/rules.d.ts.map +1 -0
  51. package/dist/cli/commands/rules.js +639 -0
  52. package/dist/cli/commands/rules.js.map +1 -0
  53. package/dist/cli/commands/setup.js +5 -4
  54. package/dist/cli/commands/setup.js.map +1 -1
  55. package/dist/cli/index.js +6 -0
  56. package/dist/cli/index.js.map +1 -1
  57. package/dist/config/memoryConfig.d.ts +427 -0
  58. package/dist/config/memoryConfig.d.ts.map +1 -0
  59. package/dist/config/memoryConfig.js +258 -0
  60. package/dist/config/memoryConfig.js.map +1 -0
  61. package/dist/config/rulesConfig.d.ts +486 -0
  62. package/dist/config/rulesConfig.d.ts.map +1 -0
  63. package/dist/config/rulesConfig.js +345 -0
  64. package/dist/config/rulesConfig.js.map +1 -0
  65. package/dist/dashboard/coreTools.d.ts +14 -0
  66. package/dist/dashboard/coreTools.d.ts.map +1 -0
  67. package/dist/dashboard/coreTools.js +413 -0
  68. package/dist/dashboard/coreTools.js.map +1 -0
  69. package/dist/dashboard/public/index.html +1982 -13
  70. package/dist/dashboard/server.d.ts +1 -8
  71. package/dist/dashboard/server.d.ts.map +1 -1
  72. package/dist/dashboard/server.js +846 -13
  73. package/dist/dashboard/server.js.map +1 -1
  74. package/dist/dashboard/toolRegistry.d.ts +192 -0
  75. package/dist/dashboard/toolRegistry.d.ts.map +1 -0
  76. package/dist/dashboard/toolRegistry.js +322 -0
  77. package/dist/dashboard/toolRegistry.js.map +1 -0
  78. package/dist/proxy/index.d.ts +1 -1
  79. package/dist/proxy/index.d.ts.map +1 -1
  80. package/dist/proxy/index.js +9 -6
  81. package/dist/proxy/index.js.map +1 -1
  82. package/dist/server/index.js +21 -0
  83. package/dist/server/index.js.map +1 -1
  84. package/dist/server/tools/crawl.d.ts.map +1 -1
  85. package/dist/server/tools/crawl.js +8 -0
  86. package/dist/server/tools/crawl.js.map +1 -1
  87. package/dist/server/tools/index.d.ts.map +1 -1
  88. package/dist/server/tools/index.js +19 -1
  89. package/dist/server/tools/index.js.map +1 -1
  90. package/dist/server/tools/ingest.d.ts.map +1 -1
  91. package/dist/server/tools/ingest.js +5 -0
  92. package/dist/server/tools/ingest.js.map +1 -1
  93. package/dist/server/tools/memory.d.ts +250 -0
  94. package/dist/server/tools/memory.d.ts.map +1 -0
  95. package/dist/server/tools/memory.js +472 -0
  96. package/dist/server/tools/memory.js.map +1 -0
  97. package/dist/server/tools/recursive-query.d.ts.map +1 -1
  98. package/dist/server/tools/recursive-query.js +6 -0
  99. package/dist/server/tools/recursive-query.js.map +1 -1
  100. package/dist/server/tools/search.d.ts.map +1 -1
  101. package/dist/server/tools/search.js +6 -0
  102. package/dist/server/tools/search.js.map +1 -1
  103. package/dist/services/activity-log.d.ts +10 -0
  104. package/dist/services/activity-log.d.ts.map +1 -0
  105. package/dist/services/activity-log.js +53 -0
  106. package/dist/services/activity-log.js.map +1 -0
  107. package/dist/services/categoryManager.d.ts +110 -0
  108. package/dist/services/categoryManager.d.ts.map +1 -0
  109. package/dist/services/categoryManager.js +549 -0
  110. package/dist/services/categoryManager.js.map +1 -0
  111. package/dist/services/contextEnvironment.d.ts +206 -0
  112. package/dist/services/contextEnvironment.d.ts.map +1 -0
  113. package/dist/services/contextEnvironment.js +481 -0
  114. package/dist/services/contextEnvironment.js.map +1 -0
  115. package/dist/services/conversationProcessor.d.ts +99 -0
  116. package/dist/services/conversationProcessor.d.ts.map +1 -0
  117. package/dist/services/conversationProcessor.js +311 -0
  118. package/dist/services/conversationProcessor.js.map +1 -0
  119. package/dist/services/cursorChatReader.d.ts +129 -0
  120. package/dist/services/cursorChatReader.d.ts.map +1 -0
  121. package/dist/services/cursorChatReader.js +419 -0
  122. package/dist/services/cursorChatReader.js.map +1 -0
  123. package/dist/services/decayCalculator.d.ts +85 -0
  124. package/dist/services/decayCalculator.d.ts.map +1 -0
  125. package/dist/services/decayCalculator.js +182 -0
  126. package/dist/services/decayCalculator.js.map +1 -0
  127. package/dist/services/enhancedVectorStore.d.ts +102 -0
  128. package/dist/services/enhancedVectorStore.d.ts.map +1 -0
  129. package/dist/services/enhancedVectorStore.js +245 -0
  130. package/dist/services/enhancedVectorStore.js.map +1 -0
  131. package/dist/services/hybridScorer.d.ts +120 -0
  132. package/dist/services/hybridScorer.d.ts.map +1 -0
  133. package/dist/services/hybridScorer.js +334 -0
  134. package/dist/services/hybridScorer.js.map +1 -0
  135. package/dist/services/knowledgeExtractor.d.ts +45 -0
  136. package/dist/services/knowledgeExtractor.d.ts.map +1 -0
  137. package/dist/services/knowledgeExtractor.js +436 -0
  138. package/dist/services/knowledgeExtractor.js.map +1 -0
  139. package/dist/services/knowledgeStorage.d.ts +102 -0
  140. package/dist/services/knowledgeStorage.d.ts.map +1 -0
  141. package/dist/services/knowledgeStorage.js +383 -0
  142. package/dist/services/knowledgeStorage.js.map +1 -0
  143. package/dist/services/maintenanceScheduler.d.ts +89 -0
  144. package/dist/services/maintenanceScheduler.d.ts.map +1 -0
  145. package/dist/services/maintenanceScheduler.js +479 -0
  146. package/dist/services/maintenanceScheduler.js.map +1 -0
  147. package/dist/services/memoryMetadataStore.d.ts +62 -0
  148. package/dist/services/memoryMetadataStore.d.ts.map +1 -0
  149. package/dist/services/memoryMetadataStore.js +570 -0
  150. package/dist/services/memoryMetadataStore.js.map +1 -0
  151. package/dist/services/recursiveRetrieval.d.ts +122 -0
  152. package/dist/services/recursiveRetrieval.d.ts.map +1 -0
  153. package/dist/services/recursiveRetrieval.js +443 -0
  154. package/dist/services/recursiveRetrieval.js.map +1 -0
  155. package/dist/services/relationshipGraph.d.ts +77 -0
  156. package/dist/services/relationshipGraph.d.ts.map +1 -0
  157. package/dist/services/relationshipGraph.js +411 -0
  158. package/dist/services/relationshipGraph.js.map +1 -0
  159. package/dist/services/rlmSafeguards.d.ts +273 -0
  160. package/dist/services/rlmSafeguards.d.ts.map +1 -0
  161. package/dist/services/rlmSafeguards.js +705 -0
  162. package/dist/services/rlmSafeguards.js.map +1 -0
  163. package/dist/services/rulesAnalyzer.d.ts +119 -0
  164. package/dist/services/rulesAnalyzer.d.ts.map +1 -0
  165. package/dist/services/rulesAnalyzer.js +768 -0
  166. package/dist/services/rulesAnalyzer.js.map +1 -0
  167. package/dist/services/rulesMerger.d.ts +75 -0
  168. package/dist/services/rulesMerger.d.ts.map +1 -0
  169. package/dist/services/rulesMerger.js +404 -0
  170. package/dist/services/rulesMerger.js.map +1 -0
  171. package/dist/services/rulesParser.d.ts +127 -0
  172. package/dist/services/rulesParser.d.ts.map +1 -0
  173. package/dist/services/rulesParser.js +594 -0
  174. package/dist/services/rulesParser.js.map +1 -0
  175. package/dist/services/smartChunker.d.ts +110 -0
  176. package/dist/services/smartChunker.d.ts.map +1 -0
  177. package/dist/services/smartChunker.js +520 -0
  178. package/dist/services/smartChunker.js.map +1 -0
  179. package/dist/types/categories.d.ts +105 -0
  180. package/dist/types/categories.d.ts.map +1 -0
  181. package/dist/types/categories.js +108 -0
  182. package/dist/types/categories.js.map +1 -0
  183. package/dist/types/extractedKnowledge.d.ts +233 -0
  184. package/dist/types/extractedKnowledge.d.ts.map +1 -0
  185. package/dist/types/extractedKnowledge.js +56 -0
  186. package/dist/types/extractedKnowledge.js.map +1 -0
  187. package/dist/types/index.d.ts +9 -2
  188. package/dist/types/index.d.ts.map +1 -1
  189. package/dist/types/index.js +12 -1
  190. package/dist/types/index.js.map +1 -1
  191. package/dist/types/llmProvider.d.ts +282 -0
  192. package/dist/types/llmProvider.d.ts.map +1 -0
  193. package/dist/types/llmProvider.js +48 -0
  194. package/dist/types/llmProvider.js.map +1 -0
  195. package/dist/types/memory.d.ts +227 -0
  196. package/dist/types/memory.d.ts.map +1 -0
  197. package/dist/types/memory.js +76 -0
  198. package/dist/types/memory.js.map +1 -0
  199. package/dist/types/relationships.d.ts +167 -0
  200. package/dist/types/relationships.d.ts.map +1 -0
  201. package/dist/types/relationships.js +106 -0
  202. package/dist/types/relationships.js.map +1 -0
  203. package/dist/types/rulesOptimizer.d.ts +345 -0
  204. package/dist/types/rulesOptimizer.d.ts.map +1 -0
  205. package/dist/types/rulesOptimizer.js +22 -0
  206. package/dist/types/rulesOptimizer.js.map +1 -0
  207. package/docs/cursor-recursive-rag-memory-spec.md +4569 -0
  208. package/docs/cursor-recursive-rag-tasks.md +1355 -0
  209. package/package.json +6 -3
  210. package/restart-rag.sh +16 -0
@@ -0,0 +1,380 @@
1
+ /**
2
+ * LLM Provider Factory
3
+ *
4
+ * Creates and manages LLM providers with auto-detection, fallback chains,
5
+ * and configuration from environment variables and config files.
6
+ */
7
+ import { readFileSync, existsSync } from 'fs';
8
+ import { join } from 'path';
9
+ import { homedir } from 'os';
10
+ import { LLMError, LLM_ENV_VARS, DEFAULT_MODELS } from '../../types/llmProvider.js';
11
+ import { OpenAIProvider } from './openai.js';
12
+ import { AnthropicProvider } from './anthropic.js';
13
+ import { DeepSeekProvider } from './deepseek.js';
14
+ import { GroqProvider } from './groq.js';
15
+ import { OllamaProvider } from './ollama.js';
16
+ import { OpenRouterProvider } from './openrouter.js';
17
+ // Re-export provider classes
18
+ export { OpenAIProvider } from './openai.js';
19
+ export { AnthropicProvider } from './anthropic.js';
20
+ export { DeepSeekProvider } from './deepseek.js';
21
+ export { GroqProvider } from './groq.js';
22
+ export { OllamaProvider } from './ollama.js';
23
+ export { OpenRouterProvider } from './openrouter.js';
24
+ export { BaseLLMProvider } from './base.js';
25
+ /**
26
+ * Create a provider from configuration
27
+ */
28
+ export function createProvider(config) {
29
+ switch (config.provider) {
30
+ case 'openai':
31
+ return new OpenAIProvider(config);
32
+ case 'anthropic':
33
+ return new AnthropicProvider(config);
34
+ case 'deepseek':
35
+ return new DeepSeekProvider(config);
36
+ case 'groq':
37
+ return new GroqProvider(config);
38
+ case 'ollama':
39
+ return new OllamaProvider(config);
40
+ case 'openrouter':
41
+ return new OpenRouterProvider(config);
42
+ case 'cursor':
43
+ // Cursor provider not yet implemented - fall back to Ollama
44
+ console.warn('Cursor AI provider not yet implemented, falling back to Ollama');
45
+ return new OllamaProvider({ provider: 'ollama', defaultModel: 'llama3.2' });
46
+ default:
47
+ throw new Error(`Unknown provider: ${config.provider}`);
48
+ }
49
+ }
50
+ /**
51
+ * Load LLM configuration from file
52
+ */
53
+ function loadConfigFile() {
54
+ const configPath = join(homedir(), '.cursor-rag', 'llm-config.json');
55
+ if (!existsSync(configPath)) {
56
+ return null;
57
+ }
58
+ try {
59
+ const content = readFileSync(configPath, 'utf-8');
60
+ return JSON.parse(content);
61
+ }
62
+ catch (error) {
63
+ console.warn(`Failed to load LLM config from ${configPath}:`, error);
64
+ return null;
65
+ }
66
+ }
67
+ /**
68
+ * Detect available providers from environment variables
69
+ */
70
+ function detectProvidersFromEnv() {
71
+ const providers = [];
72
+ if (process.env[LLM_ENV_VARS.openai]) {
73
+ providers.push({
74
+ provider: 'openai',
75
+ apiKey: process.env[LLM_ENV_VARS.openai],
76
+ defaultModel: DEFAULT_MODELS.openai,
77
+ });
78
+ }
79
+ if (process.env[LLM_ENV_VARS.anthropic]) {
80
+ providers.push({
81
+ provider: 'anthropic',
82
+ apiKey: process.env[LLM_ENV_VARS.anthropic],
83
+ defaultModel: DEFAULT_MODELS.anthropic,
84
+ });
85
+ }
86
+ if (process.env[LLM_ENV_VARS.deepseek]) {
87
+ providers.push({
88
+ provider: 'deepseek',
89
+ apiKey: process.env[LLM_ENV_VARS.deepseek],
90
+ defaultModel: DEFAULT_MODELS.deepseek,
91
+ });
92
+ }
93
+ if (process.env[LLM_ENV_VARS.groq]) {
94
+ providers.push({
95
+ provider: 'groq',
96
+ apiKey: process.env[LLM_ENV_VARS.groq],
97
+ defaultModel: DEFAULT_MODELS.groq,
98
+ });
99
+ }
100
+ if (process.env[LLM_ENV_VARS.openrouter]) {
101
+ providers.push({
102
+ provider: 'openrouter',
103
+ apiKey: process.env[LLM_ENV_VARS.openrouter],
104
+ defaultModel: DEFAULT_MODELS.openrouter,
105
+ });
106
+ }
107
+ // Ollama is always available as a fallback (no API key required)
108
+ providers.push({
109
+ provider: 'ollama',
110
+ baseUrl: process.env[LLM_ENV_VARS.ollama] ?? 'http://localhost:11434',
111
+ defaultModel: DEFAULT_MODELS.ollama,
112
+ });
113
+ return providers;
114
+ }
115
+ /**
116
+ * Build provider config from config file
117
+ */
118
+ function buildConfigFromFile(config) {
119
+ const providers = [];
120
+ const providerConfigs = config.providers ?? {};
121
+ if (providerConfigs.openai?.apiKey) {
122
+ providers.push({
123
+ provider: 'openai',
124
+ ...providerConfigs.openai,
125
+ });
126
+ }
127
+ if (providerConfigs.anthropic?.apiKey) {
128
+ providers.push({
129
+ provider: 'anthropic',
130
+ ...providerConfigs.anthropic,
131
+ });
132
+ }
133
+ if (providerConfigs.deepseek?.apiKey) {
134
+ providers.push({
135
+ provider: 'deepseek',
136
+ ...providerConfigs.deepseek,
137
+ });
138
+ }
139
+ if (providerConfigs.groq?.apiKey) {
140
+ providers.push({
141
+ provider: 'groq',
142
+ ...providerConfigs.groq,
143
+ });
144
+ }
145
+ if (providerConfigs.openrouter?.apiKey) {
146
+ providers.push({
147
+ provider: 'openrouter',
148
+ ...providerConfigs.openrouter,
149
+ });
150
+ }
151
+ // Ollama from config or fallback
152
+ providers.push({
153
+ provider: 'ollama',
154
+ baseUrl: providerConfigs.ollama?.baseUrl ?? 'http://localhost:11434',
155
+ defaultModel: providerConfigs.ollama?.defaultModel ?? DEFAULT_MODELS.ollama,
156
+ });
157
+ // Reorder based on fallback order if specified
158
+ if (config.fallbackOrder) {
159
+ const ordered = [];
160
+ for (const providerType of config.fallbackOrder) {
161
+ const found = providers.find(p => p.provider === providerType);
162
+ if (found) {
163
+ ordered.push(found);
164
+ }
165
+ }
166
+ // Add any remaining providers
167
+ for (const p of providers) {
168
+ if (!ordered.includes(p)) {
169
+ ordered.push(p);
170
+ }
171
+ }
172
+ return ordered;
173
+ }
174
+ // Move default provider to front
175
+ if (config.defaultProvider) {
176
+ const defaultIndex = providers.findIndex(p => p.provider === config.defaultProvider);
177
+ if (defaultIndex > 0) {
178
+ const [defaultProvider] = providers.splice(defaultIndex, 1);
179
+ providers.unshift(defaultProvider);
180
+ }
181
+ }
182
+ return providers;
183
+ }
184
+ /**
185
+ * LLM Provider Manager with fallback support
186
+ */
187
+ export class LLMProviderManager {
188
+ type;
189
+ name;
190
+ providers = [];
191
+ primaryProvider;
192
+ totalTokens = 0;
193
+ totalCost = 0;
194
+ constructor(configs) {
195
+ if (configs.length === 0) {
196
+ throw new Error('At least one provider configuration is required');
197
+ }
198
+ this.providers = configs.map(c => createProvider(c));
199
+ this.primaryProvider = this.providers[0];
200
+ this.type = this.primaryProvider.type;
201
+ this.name = `${this.primaryProvider.name} (with ${this.providers.length - 1} fallbacks)`;
202
+ }
203
+ async isAvailable() {
204
+ for (const provider of this.providers) {
205
+ if (await provider.isAvailable()) {
206
+ return true;
207
+ }
208
+ }
209
+ return false;
210
+ }
211
+ async listModels() {
212
+ return this.primaryProvider.listModels();
213
+ }
214
+ getModelCapabilities(model) {
215
+ return this.primaryProvider.getModelCapabilities(model);
216
+ }
217
+ async complete(prompt, options) {
218
+ return this.chat([{ role: 'user', content: prompt }], options);
219
+ }
220
+ async chat(messages, options) {
221
+ let lastError;
222
+ for (const provider of this.providers) {
223
+ try {
224
+ if (!(await provider.isAvailable())) {
225
+ continue;
226
+ }
227
+ const response = await provider.chat(messages, options);
228
+ // Track usage
229
+ if (response.usage) {
230
+ this.totalTokens += response.usage.totalTokens;
231
+ this.totalCost += response.usage.estimatedCost ?? 0;
232
+ }
233
+ return response;
234
+ }
235
+ catch (error) {
236
+ lastError = error instanceof Error ? error : new Error(String(error));
237
+ // Don't retry on authentication or context errors
238
+ if (error instanceof LLMError && !error.retryable) {
239
+ console.warn(`Provider ${provider.name} failed with non-retryable error: ${error.message}`);
240
+ continue;
241
+ }
242
+ console.warn(`Provider ${provider.name} failed, trying next: ${lastError.message}`);
243
+ }
244
+ }
245
+ throw lastError ?? new LLMError('All providers failed', 'PROVIDER_UNAVAILABLE', this.type, false);
246
+ }
247
+ getTotalTokensUsed() {
248
+ return this.totalTokens;
249
+ }
250
+ getTotalCost() {
251
+ return this.totalCost;
252
+ }
253
+ resetUsageTracking() {
254
+ this.totalTokens = 0;
255
+ this.totalCost = 0;
256
+ for (const provider of this.providers) {
257
+ provider.resetUsageTracking();
258
+ }
259
+ }
260
+ /**
261
+ * Get the primary provider
262
+ */
263
+ getPrimaryProvider() {
264
+ return this.primaryProvider;
265
+ }
266
+ /**
267
+ * Get all configured providers
268
+ */
269
+ getAllProviders() {
270
+ return this.providers;
271
+ }
272
+ /**
273
+ * Switch primary provider
274
+ */
275
+ setPrimaryProvider(providerType) {
276
+ const provider = this.providers.find(p => p.type === providerType);
277
+ if (provider) {
278
+ this.primaryProvider = provider;
279
+ return true;
280
+ }
281
+ return false;
282
+ }
283
+ }
284
+ /**
285
+ * Get or create the default LLM provider manager
286
+ */
287
+ let defaultManager = null;
288
+ export function getLLMProvider(config) {
289
+ // Return cached manager if no specific config requested
290
+ if (!config && defaultManager) {
291
+ return defaultManager;
292
+ }
293
+ let providers = [];
294
+ if (config?.primary) {
295
+ providers.push(config.primary);
296
+ }
297
+ if (config?.fallbacks) {
298
+ providers.push(...config.fallbacks);
299
+ }
300
+ // Auto-detect if no explicit config or autoDetect is enabled
301
+ if (providers.length === 0 || config?.autoDetect !== false) {
302
+ const configFile = loadConfigFile();
303
+ if (configFile) {
304
+ const fileProviders = buildConfigFromFile(configFile);
305
+ // Merge with explicit providers (explicit takes priority)
306
+ for (const fp of fileProviders) {
307
+ if (!providers.some(p => p.provider === fp.provider)) {
308
+ providers.push(fp);
309
+ }
310
+ }
311
+ }
312
+ else {
313
+ const envProviders = detectProvidersFromEnv();
314
+ for (const ep of envProviders) {
315
+ if (!providers.some(p => p.provider === ep.provider)) {
316
+ providers.push(ep);
317
+ }
318
+ }
319
+ }
320
+ }
321
+ if (providers.length === 0) {
322
+ // Always fall back to Ollama
323
+ providers.push({
324
+ provider: 'ollama',
325
+ baseUrl: 'http://localhost:11434',
326
+ defaultModel: 'llama3.2',
327
+ });
328
+ }
329
+ const manager = new LLMProviderManager(providers);
330
+ // Cache as default if no specific config
331
+ if (!config) {
332
+ defaultManager = manager;
333
+ }
334
+ return manager;
335
+ }
336
+ /**
337
+ * Create a single provider directly (without fallbacks)
338
+ */
339
+ export function createSingleProvider(providerType, config) {
340
+ const envKey = LLM_ENV_VARS[providerType];
341
+ const apiKey = config?.apiKey ?? (envKey ? process.env[envKey] : undefined);
342
+ const fullConfig = {
343
+ provider: providerType,
344
+ apiKey,
345
+ defaultModel: config?.defaultModel ?? DEFAULT_MODELS[providerType],
346
+ baseUrl: config?.baseUrl,
347
+ timeout: config?.timeout,
348
+ maxRetries: config?.maxRetries,
349
+ rateLimit: config?.rateLimit,
350
+ trackCosts: config?.trackCosts,
351
+ };
352
+ return createProvider(fullConfig);
353
+ }
354
+ /**
355
+ * Check which providers are available
356
+ */
357
+ export async function checkAvailableProviders() {
358
+ const results = {
359
+ openai: false,
360
+ anthropic: false,
361
+ deepseek: false,
362
+ groq: false,
363
+ ollama: false,
364
+ openrouter: false,
365
+ cursor: false,
366
+ };
367
+ const checks = Object.keys(results).map(async (providerType) => {
368
+ try {
369
+ const provider = createSingleProvider(providerType);
370
+ results[providerType] = await provider.isAvailable();
371
+ }
372
+ catch {
373
+ results[providerType] = false;
374
+ }
375
+ });
376
+ await Promise.all(checks);
377
+ return results;
378
+ }
379
+ export { LLMError, LLM_ENV_VARS, DEFAULT_MODELS } from '../../types/llmProvider.js';
380
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/llm/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Ollama LLM Provider
3
+ *
4
+ * Local model inference with no API key required.
5
+ * Supports any model available in Ollama.
6
+ */
7
+ import { BaseLLMProvider } from './base.js';
8
+ import type { LLMMessage, LLMCompletionOptions, LLMResponse, ModelInfo, ModelCapabilities, OllamaProviderConfig } from '../../types/llmProvider.js';
9
+ export declare class OllamaProvider extends BaseLLMProvider {
10
+ readonly type: "ollama";
11
+ readonly name = "Ollama";
12
+ private client;
13
+ private model;
14
+ private availableModels;
15
+ constructor(config: OllamaProviderConfig);
16
+ isAvailable(): Promise<boolean>;
17
+ listModels(): Promise<ModelInfo[]>;
18
+ getModelCapabilities(model: string): ModelCapabilities | null;
19
+ chat(messages: LLMMessage[], options?: LLMCompletionOptions): Promise<LLMResponse>;
20
+ private handleStream;
21
+ private handleError;
22
+ }
23
+ //# sourceMappingURL=ollama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../src/adapters/llm/ollama.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EACV,UAAU,EACV,oBAAoB,EACpB,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,oBAAoB,EACrB,MAAM,4BAA4B,CAAC;AAgGpC,qBAAa,cAAe,SAAQ,eAAe;IACjD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,IAAI,YAAY;IAEzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,eAAe,CAAgB;gBAE3B,MAAM,EAAE,oBAAoB;IAQlC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAU/B,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAwBxC,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAUvD,IAAI,CACR,QAAQ,EAAE,UAAU,EAAE,EACtB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,WAAW,CAAC;YAkET,YAAY;IAqD1B,OAAO,CAAC,WAAW;CA+BpB"}
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Ollama LLM Provider
3
+ *
4
+ * Local model inference with no API key required.
5
+ * Supports any model available in Ollama.
6
+ */
7
+ import { Ollama } from 'ollama';
8
+ import { BaseLLMProvider } from './base.js';
9
+ import { LLMError } from '../../types/llmProvider.js';
10
+ /**
11
+ * Common Ollama model configurations
12
+ */
13
+ const OLLAMA_MODELS = {
14
+ 'llama3.2': {
15
+ contextLength: 128000,
16
+ supportsVision: false,
17
+ supportsFunctions: false,
18
+ supportsJsonMode: true,
19
+ supportsStreaming: true,
20
+ },
21
+ 'llama3.2:3b': {
22
+ contextLength: 128000,
23
+ supportsVision: false,
24
+ supportsFunctions: false,
25
+ supportsJsonMode: true,
26
+ supportsStreaming: true,
27
+ },
28
+ 'llama3.1': {
29
+ contextLength: 128000,
30
+ supportsVision: false,
31
+ supportsFunctions: false,
32
+ supportsJsonMode: true,
33
+ supportsStreaming: true,
34
+ },
35
+ 'llama3.1:70b': {
36
+ contextLength: 128000,
37
+ supportsVision: false,
38
+ supportsFunctions: false,
39
+ supportsJsonMode: true,
40
+ supportsStreaming: true,
41
+ },
42
+ 'codellama': {
43
+ contextLength: 16384,
44
+ supportsVision: false,
45
+ supportsFunctions: false,
46
+ supportsJsonMode: false,
47
+ supportsStreaming: true,
48
+ },
49
+ 'deepseek-coder-v2': {
50
+ contextLength: 128000,
51
+ supportsVision: false,
52
+ supportsFunctions: false,
53
+ supportsJsonMode: true,
54
+ supportsStreaming: true,
55
+ },
56
+ 'qwen2.5-coder': {
57
+ contextLength: 32768,
58
+ supportsVision: false,
59
+ supportsFunctions: false,
60
+ supportsJsonMode: true,
61
+ supportsStreaming: true,
62
+ },
63
+ 'mistral': {
64
+ contextLength: 32768,
65
+ supportsVision: false,
66
+ supportsFunctions: false,
67
+ supportsJsonMode: true,
68
+ supportsStreaming: true,
69
+ },
70
+ 'mixtral': {
71
+ contextLength: 32768,
72
+ supportsVision: false,
73
+ supportsFunctions: false,
74
+ supportsJsonMode: true,
75
+ supportsStreaming: true,
76
+ },
77
+ 'phi3': {
78
+ contextLength: 128000,
79
+ supportsVision: false,
80
+ supportsFunctions: false,
81
+ supportsJsonMode: true,
82
+ supportsStreaming: true,
83
+ },
84
+ 'gemma2': {
85
+ contextLength: 8192,
86
+ supportsVision: false,
87
+ supportsFunctions: false,
88
+ supportsJsonMode: true,
89
+ supportsStreaming: true,
90
+ },
91
+ };
92
+ const DEFAULT_CAPABILITIES = {
93
+ contextLength: 8192,
94
+ supportsVision: false,
95
+ supportsFunctions: false,
96
+ supportsJsonMode: false,
97
+ supportsStreaming: true,
98
+ inputCostPer1M: 0, // Free (local)
99
+ outputCostPer1M: 0,
100
+ };
101
+ export class OllamaProvider extends BaseLLMProvider {
102
+ type = 'ollama';
103
+ name = 'Ollama';
104
+ client;
105
+ model;
106
+ availableModels = [];
107
+ constructor(config) {
108
+ super(config);
109
+ this.model = config.defaultModel ?? 'llama3.2';
110
+ this.client = new Ollama({
111
+ host: config.baseUrl ?? 'http://localhost:11434',
112
+ });
113
+ }
114
+ async isAvailable() {
115
+ try {
116
+ const models = await this.client.list();
117
+ this.availableModels = models.models.map(m => m.name);
118
+ return this.availableModels.length > 0;
119
+ }
120
+ catch {
121
+ return false;
122
+ }
123
+ }
124
+ async listModels() {
125
+ try {
126
+ const models = await this.client.list();
127
+ this.availableModels = models.models.map(m => m.name);
128
+ return models.models.map(m => {
129
+ const baseName = m.name.split(':')[0];
130
+ const knownCapabilities = OLLAMA_MODELS[baseName] ?? OLLAMA_MODELS[m.name];
131
+ return {
132
+ id: m.name,
133
+ name: m.name,
134
+ provider: 'ollama',
135
+ capabilities: {
136
+ ...DEFAULT_CAPABILITIES,
137
+ ...knownCapabilities,
138
+ },
139
+ };
140
+ });
141
+ }
142
+ catch {
143
+ return [];
144
+ }
145
+ }
146
+ getModelCapabilities(model) {
147
+ const baseName = model.split(':')[0];
148
+ const known = OLLAMA_MODELS[baseName] ?? OLLAMA_MODELS[model];
149
+ return {
150
+ ...DEFAULT_CAPABILITIES,
151
+ ...known,
152
+ };
153
+ }
154
+ async chat(messages, options) {
155
+ const model = options?.headers?.['x-model'] ?? this.model;
156
+ const capabilities = this.getModelCapabilities(model);
157
+ const startTime = Date.now();
158
+ return this.withRetry(async () => {
159
+ try {
160
+ const ollamaMessages = messages.map(m => ({
161
+ role: m.role,
162
+ content: m.content,
163
+ }));
164
+ const requestOptions = {};
165
+ if (options?.temperature !== undefined) {
166
+ requestOptions.temperature = options.temperature;
167
+ }
168
+ if (options?.topP !== undefined) {
169
+ requestOptions.top_p = options.topP;
170
+ }
171
+ if (options?.stop) {
172
+ requestOptions.stop = options.stop;
173
+ }
174
+ if (options?.maxTokens) {
175
+ requestOptions.num_predict = options.maxTokens;
176
+ }
177
+ // Handle streaming
178
+ if (options?.onStream && capabilities?.supportsStreaming) {
179
+ return this.handleStream(model, ollamaMessages, requestOptions, options.onStream, startTime);
180
+ }
181
+ // Non-streaming request
182
+ const response = await this.client.chat({
183
+ model,
184
+ messages: ollamaMessages,
185
+ options: requestOptions,
186
+ stream: false,
187
+ });
188
+ const latencyMs = Date.now() - startTime;
189
+ // Ollama returns token counts in eval_count and prompt_eval_count
190
+ const usage = {
191
+ promptTokens: response.prompt_eval_count ?? 0,
192
+ completionTokens: response.eval_count ?? 0,
193
+ totalTokens: (response.prompt_eval_count ?? 0) + (response.eval_count ?? 0),
194
+ estimatedCost: 0, // Free (local)
195
+ };
196
+ this.trackUsage(usage);
197
+ return {
198
+ content: response.message.content,
199
+ model,
200
+ usage,
201
+ latencyMs,
202
+ streamed: false,
203
+ finishReason: response.done ? 'stop' : undefined,
204
+ };
205
+ }
206
+ catch (error) {
207
+ throw this.handleError(error);
208
+ }
209
+ }, `Ollama chat completion`);
210
+ }
211
+ async handleStream(model, messages, requestOptions, onStream, startTime) {
212
+ let content = '';
213
+ let promptTokens = 0;
214
+ let completionTokens = 0;
215
+ const stream = await this.client.chat({
216
+ model,
217
+ messages,
218
+ options: requestOptions,
219
+ stream: true,
220
+ });
221
+ for await (const chunk of stream) {
222
+ if (chunk.message?.content) {
223
+ content += chunk.message.content;
224
+ onStream(chunk.message.content);
225
+ }
226
+ if (chunk.prompt_eval_count) {
227
+ promptTokens = chunk.prompt_eval_count;
228
+ }
229
+ if (chunk.eval_count) {
230
+ completionTokens = chunk.eval_count;
231
+ }
232
+ }
233
+ const latencyMs = Date.now() - startTime;
234
+ const usage = {
235
+ promptTokens,
236
+ completionTokens,
237
+ totalTokens: promptTokens + completionTokens,
238
+ estimatedCost: 0,
239
+ };
240
+ this.trackUsage(usage);
241
+ return {
242
+ content,
243
+ model,
244
+ usage,
245
+ latencyMs,
246
+ streamed: true,
247
+ finishReason: 'stop',
248
+ };
249
+ }
250
+ handleError(error) {
251
+ const message = error instanceof Error ? error.message : String(error);
252
+ if (message.includes('ECONNREFUSED') || message.includes('fetch failed')) {
253
+ return new LLMError('Ollama is not running. Start it with: ollama serve', 'PROVIDER_UNAVAILABLE', 'ollama', true, error instanceof Error ? error : undefined);
254
+ }
255
+ if (message.includes('model') && message.includes('not found')) {
256
+ return new LLMError(`Model not found. Pull it with: ollama pull ${this.model}`, 'MODEL_NOT_FOUND', 'ollama', false, error instanceof Error ? error : undefined);
257
+ }
258
+ return new LLMError(`Ollama error: ${message}`, 'UNKNOWN', 'ollama', false, error instanceof Error ? error : undefined);
259
+ }
260
+ }
261
+ //# sourceMappingURL=ollama.js.map