osagent-core 0.1.39 → 0.1.87

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 (187) hide show
  1. package/dist/src/code_assist/oauth-credential-storage.test.js +1 -1
  2. package/dist/src/code_assist/oauth-credential-storage.test.js.map +1 -1
  3. package/dist/src/code_assist/oauth2.test.js +12 -12
  4. package/dist/src/code_assist/oauth2.test.js.map +1 -1
  5. package/dist/src/config/config.test.js +3 -3
  6. package/dist/src/config/config.test.js.map +1 -1
  7. package/dist/src/config/models.js +2 -1
  8. package/dist/src/config/models.js.map +1 -1
  9. package/dist/src/config/storage.test.js +10 -10
  10. package/dist/src/config/storage.test.js.map +1 -1
  11. package/dist/src/core/client.test.js +1 -1
  12. package/dist/src/core/client.test.js.map +1 -1
  13. package/dist/src/core/contentGenerator.js +127 -28
  14. package/dist/src/core/contentGenerator.js.map +1 -1
  15. package/dist/src/core/coreToolScheduler.test.js +1 -1
  16. package/dist/src/core/coreToolScheduler.test.js.map +1 -1
  17. package/dist/src/core/logger.test.js +1 -1
  18. package/dist/src/core/logger.test.js.map +1 -1
  19. package/dist/src/core/ollamaContentGenerator/index.js +21 -2
  20. package/dist/src/core/ollamaContentGenerator/index.js.map +1 -1
  21. package/dist/src/core/openaiContentGenerator/converter.d.ts +27 -1
  22. package/dist/src/core/openaiContentGenerator/converter.js +105 -4
  23. package/dist/src/core/openaiContentGenerator/converter.js.map +1 -1
  24. package/dist/src/core/openaiContentGenerator/errorHandler.d.ts +4 -0
  25. package/dist/src/core/openaiContentGenerator/errorHandler.js +60 -1
  26. package/dist/src/core/openaiContentGenerator/errorHandler.js.map +1 -1
  27. package/dist/src/core/openaiContentGenerator/pipeline.js +48 -1
  28. package/dist/src/core/openaiContentGenerator/pipeline.js.map +1 -1
  29. package/dist/src/core/openaiContentGenerator/pipeline.test.js +2 -0
  30. package/dist/src/core/openaiContentGenerator/pipeline.test.js.map +1 -1
  31. package/dist/src/core/openaiContentGenerator/provider/dashscope.js +2 -2
  32. package/dist/src/core/openaiContentGenerator/provider/dashscope.js.map +1 -1
  33. package/dist/src/core/openaiContentGenerator/provider/dashscope.test.js +6 -6
  34. package/dist/src/core/openaiContentGenerator/provider/default.test.js +4 -4
  35. package/dist/src/core/openaiContentGenerator/provider/ollama.d.ts +24 -0
  36. package/dist/src/core/openaiContentGenerator/provider/ollama.js +105 -1
  37. package/dist/src/core/openaiContentGenerator/provider/ollama.js.map +1 -1
  38. package/dist/src/core/openaiContentGenerator/provider/openrouter.js +1 -1
  39. package/dist/src/core/openaiContentGenerator/provider/openrouter.js.map +1 -1
  40. package/dist/src/core/openaiContentGenerator/provider/openrouter.test.js +11 -11
  41. package/dist/src/core/openaiContentGenerator/provider/openrouter.test.js.map +1 -1
  42. package/dist/src/core/openaiContentGenerator/streamingToolCallParser.js +13 -10
  43. package/dist/src/core/openaiContentGenerator/streamingToolCallParser.js.map +1 -1
  44. package/dist/src/core/prompts.test.js +36 -36
  45. package/dist/src/core/prompts.test.js.map +1 -1
  46. package/dist/src/core/tokenLimits.js +67 -49
  47. package/dist/src/core/tokenLimits.js.map +1 -1
  48. package/dist/src/core/tokenLimits.test.js +66 -65
  49. package/dist/src/core/tokenLimits.test.js.map +1 -1
  50. package/dist/src/generated/git-commit.d.ts +2 -2
  51. package/dist/src/generated/git-commit.js +2 -2
  52. package/dist/src/ide/ide-client.d.ts +1 -0
  53. package/dist/src/ide/ide-client.js +17 -6
  54. package/dist/src/ide/ide-client.js.map +1 -1
  55. package/dist/src/ide/ide-client.test.js +18 -18
  56. package/dist/src/ide/ide-client.test.js.map +1 -1
  57. package/dist/src/ide/ide-installer.js +2 -1
  58. package/dist/src/ide/ide-installer.js.map +1 -1
  59. package/dist/src/ide/process-utils.js +13 -4
  60. package/dist/src/ide/process-utils.js.map +1 -1
  61. package/dist/src/ide/types.d.ts +44 -44
  62. package/dist/src/index.d.ts +4 -0
  63. package/dist/src/index.js +4 -0
  64. package/dist/src/index.js.map +1 -1
  65. package/dist/src/mcp/google-auth-provider.js +1 -1
  66. package/dist/src/mcp/google-auth-provider.js.map +1 -1
  67. package/dist/src/mcp/google-auth-provider.test.js +3 -3
  68. package/dist/src/mcp/token-storage/file-token-storage.test.js +3 -3
  69. package/dist/src/mcp/token-storage/file-token-storage.test.js.map +1 -1
  70. package/dist/src/orchestration/agent-registry.js +8 -1
  71. package/dist/src/orchestration/agent-registry.js.map +1 -1
  72. package/dist/src/orchestration/agents.js +40 -147
  73. package/dist/src/orchestration/agents.js.map +1 -1
  74. package/dist/src/orchestration/context-manager.js +3 -65
  75. package/dist/src/orchestration/context-manager.js.map +1 -1
  76. package/dist/src/orchestration/index.d.ts +4 -0
  77. package/dist/src/orchestration/index.js +4 -0
  78. package/dist/src/orchestration/index.js.map +1 -1
  79. package/dist/src/orchestration/orchestration-queue.d.ts +7 -0
  80. package/dist/src/orchestration/orchestration-queue.js +11 -0
  81. package/dist/src/orchestration/orchestration-queue.js.map +1 -1
  82. package/dist/src/orchestration/orchestrator.d.ts +1 -0
  83. package/dist/src/orchestration/semanticSkillMatcher.d.ts +75 -0
  84. package/dist/src/orchestration/semanticSkillMatcher.js +227 -0
  85. package/dist/src/orchestration/semanticSkillMatcher.js.map +1 -0
  86. package/dist/src/orchestration/skill-plugins.d.ts +127 -0
  87. package/dist/src/orchestration/skill-plugins.js +246 -0
  88. package/dist/src/orchestration/skill-plugins.js.map +1 -0
  89. package/dist/src/qwen/qwenContentGenerator.test.js +90 -158
  90. package/dist/src/qwen/qwenContentGenerator.test.js.map +1 -1
  91. package/dist/src/qwen/qwenOAuth2.test.js +1 -1
  92. package/dist/src/qwen/qwenOAuth2.test.js.map +1 -1
  93. package/dist/src/qwen/sharedTokenManager.d.ts +4 -0
  94. package/dist/src/qwen/sharedTokenManager.js +18 -3
  95. package/dist/src/qwen/sharedTokenManager.js.map +1 -1
  96. package/dist/src/services/chatCompressionService.d.ts +2 -1
  97. package/dist/src/services/chatCompressionService.js +2 -1
  98. package/dist/src/services/chatCompressionService.js.map +1 -1
  99. package/dist/src/services/chatCompressionService.test.js +1 -1
  100. package/dist/src/services/chatRecordingService.test.js +4 -4
  101. package/dist/src/services/chatRecordingService.test.js.map +1 -1
  102. package/dist/src/services/embeddings/embeddingService.d.ts +77 -0
  103. package/dist/src/services/embeddings/embeddingService.js +333 -0
  104. package/dist/src/services/embeddings/embeddingService.js.map +1 -0
  105. package/dist/src/services/embeddings/index.d.ts +19 -0
  106. package/dist/src/services/embeddings/index.js +12 -0
  107. package/dist/src/services/embeddings/index.js.map +1 -0
  108. package/dist/src/services/embeddings/ollamaEmbedding.d.ts +39 -0
  109. package/dist/src/services/embeddings/ollamaEmbedding.js +203 -0
  110. package/dist/src/services/embeddings/ollamaEmbedding.js.map +1 -0
  111. package/dist/src/services/embeddings/openRouterEmbedding.d.ts +43 -0
  112. package/dist/src/services/embeddings/openRouterEmbedding.js +212 -0
  113. package/dist/src/services/embeddings/openRouterEmbedding.js.map +1 -0
  114. package/dist/src/services/embeddings/types.d.ts +90 -0
  115. package/dist/src/services/embeddings/types.js +21 -0
  116. package/dist/src/services/embeddings/types.js.map +1 -0
  117. package/dist/src/services/episodicMemory.d.ts +124 -0
  118. package/dist/src/services/episodicMemory.js +304 -0
  119. package/dist/src/services/episodicMemory.js.map +1 -0
  120. package/dist/src/services/gitService.test.js +1 -1
  121. package/dist/src/services/gitService.test.js.map +1 -1
  122. package/dist/src/services/loopDetectionService.js +13 -0
  123. package/dist/src/services/loopDetectionService.js.map +1 -1
  124. package/dist/src/services/vectorMemory/index.d.ts +20 -0
  125. package/dist/src/services/vectorMemory/index.js +9 -0
  126. package/dist/src/services/vectorMemory/index.js.map +1 -0
  127. package/dist/src/services/vectorMemory/types.d.ts +202 -0
  128. package/dist/src/services/vectorMemory/types.js +19 -0
  129. package/dist/src/services/vectorMemory/types.js.map +1 -0
  130. package/dist/src/services/vectorMemory/vectorMemoryService.d.ts +92 -0
  131. package/dist/src/services/vectorMemory/vectorMemoryService.js +534 -0
  132. package/dist/src/services/vectorMemory/vectorMemoryService.js.map +1 -0
  133. package/dist/src/subagents/hooks-registry.d.ts +58 -0
  134. package/dist/src/subagents/hooks-registry.js +80 -0
  135. package/dist/src/subagents/hooks-registry.js.map +1 -0
  136. package/dist/src/subagents/index.d.ts +6 -2
  137. package/dist/src/subagents/index.js +6 -1
  138. package/dist/src/subagents/index.js.map +1 -1
  139. package/dist/src/subagents/subagent-hooks.d.ts +136 -1
  140. package/dist/src/subagents/subagent-hooks.js +128 -1
  141. package/dist/src/subagents/subagent-hooks.js.map +1 -1
  142. package/dist/src/subagents/subagent-manager.test.js +49 -26
  143. package/dist/src/subagents/subagent-manager.test.js.map +1 -1
  144. package/dist/src/tools/mcp-client.js +7 -1
  145. package/dist/src/tools/mcp-client.js.map +1 -1
  146. package/dist/src/tools/mcp-client.test.js +12 -12
  147. package/dist/src/tools/mcp-client.test.js.map +1 -1
  148. package/dist/src/tools/memoryTool.test.js +28 -28
  149. package/dist/src/tools/memoryTool.test.js.map +1 -1
  150. package/dist/src/tools/modifiable-tool.test.js +9 -9
  151. package/dist/src/tools/modifiable-tool.test.js.map +1 -1
  152. package/dist/src/tools/shell.d.ts +1 -1
  153. package/dist/src/tools/shell.js +37 -7
  154. package/dist/src/tools/shell.js.map +1 -1
  155. package/dist/src/tools/shell.test.js +28 -6
  156. package/dist/src/tools/shell.test.js.map +1 -1
  157. package/dist/src/tools/task.js +5 -1
  158. package/dist/src/tools/task.js.map +1 -1
  159. package/dist/src/tools/task.test.js +4 -4
  160. package/dist/src/tools/task.test.js.map +1 -1
  161. package/dist/src/tools/todoWrite.js +1 -1
  162. package/dist/src/tools/todoWrite.test.js +3 -3
  163. package/dist/src/tools/tool-names.d.ts +1 -1
  164. package/dist/src/tools/tool-names.js +1 -1
  165. package/dist/src/utils/bfsFileSearch.test.js +3 -3
  166. package/dist/src/utils/bfsFileSearch.test.js.map +1 -1
  167. package/dist/src/utils/errorParsing.test.js +7 -7
  168. package/dist/src/utils/errorParsing.test.js.map +1 -1
  169. package/dist/src/utils/filesearch/fileSearch.test.js +1 -1
  170. package/dist/src/utils/getFolderStructure.test.js +9 -9
  171. package/dist/src/utils/getFolderStructure.test.js.map +1 -1
  172. package/dist/src/utils/ignorePatterns.test.js +6 -6
  173. package/dist/src/utils/ignorePatterns.test.js.map +1 -1
  174. package/dist/src/utils/installationManager.test.js +1 -1
  175. package/dist/src/utils/installationManager.test.js.map +1 -1
  176. package/dist/src/utils/memoryImportProcessor.js +1 -1
  177. package/dist/src/utils/memoryImportProcessor.js.map +1 -1
  178. package/dist/src/utils/memoryImportProcessor.test.js +1 -1
  179. package/dist/src/utils/memoryImportProcessor.test.js.map +1 -1
  180. package/dist/src/utils/ripgrepUtils.test.js +15 -11
  181. package/dist/src/utils/ripgrepUtils.test.js.map +1 -1
  182. package/dist/src/utils/shell-utils.test.js +4 -1
  183. package/dist/src/utils/shell-utils.test.js.map +1 -1
  184. package/dist/src/utils/userAccountManager.test.js +1 -1
  185. package/dist/src/utils/userAccountManager.test.js.map +1 -1
  186. package/dist/tsconfig.tsbuildinfo +1 -1
  187. package/package.json +7 -4
@@ -0,0 +1,203 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 OSAgent OC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { EmbeddingError } from './types.js';
7
+ /**
8
+ * Ollama Embedding Provider
9
+ *
10
+ * Primary embedding provider using local Ollama instance.
11
+ * Uses nomic-embed-text model (768 dimensions) by default.
12
+ *
13
+ * @see https://ollama.com/blog/embedding-models
14
+ */
15
+ export class OllamaEmbeddingProvider {
16
+ name = 'ollama';
17
+ baseUrl;
18
+ model;
19
+ timeoutMs;
20
+ dimensions;
21
+ constructor(config = {}) {
22
+ // Check OLLAMA_HOST env var for WSL/remote setups
23
+ const ollamaHost = process.env['OLLAMA_HOST'];
24
+ const ollamaBaseUrl = process.env['OLLAMA_BASE_URL'];
25
+ const effectiveUrl = ollamaHost
26
+ ? (ollamaHost.startsWith('http') ? ollamaHost : `http://${ollamaHost}`)
27
+ : (ollamaBaseUrl?.replace(/\/v1\/?$/, '') ?? 'http://localhost:11434');
28
+ this.baseUrl = config.baseUrl ?? effectiveUrl.replace(/\/$/, '');
29
+ this.model = config.model ?? 'nomic-embed-text';
30
+ this.timeoutMs = config.timeoutMs ?? 30000;
31
+ // nomic-embed-text produces 768-dimensional embeddings
32
+ this.dimensions = this.model.includes('nomic') ? 768 : 384;
33
+ }
34
+ getDimensions() {
35
+ return this.dimensions;
36
+ }
37
+ /**
38
+ * Check if Ollama is running and the model is available
39
+ */
40
+ async isAvailable() {
41
+ try {
42
+ // Check if Ollama server is running
43
+ const response = await fetch(`${this.baseUrl}/api/tags`, {
44
+ method: 'GET',
45
+ signal: AbortSignal.timeout(5000),
46
+ });
47
+ if (!response.ok) {
48
+ return false;
49
+ }
50
+ // Check if the embedding model is available
51
+ const data = (await response.json());
52
+ const models = data.models ?? [];
53
+ const modelAvailable = models.some((m) => m.name === this.model || m.name.startsWith(`${this.model}:`));
54
+ if (!modelAvailable) {
55
+ console.warn(`[OllamaEmbedding] Model ${this.model} not found. Available: ${models.map((m) => m.name).join(', ')}`);
56
+ console.warn(`[OllamaEmbedding] Pull it with: ollama pull ${this.model}`);
57
+ }
58
+ return modelAvailable;
59
+ }
60
+ catch {
61
+ return false;
62
+ }
63
+ }
64
+ /**
65
+ * Generate embedding for a single text
66
+ */
67
+ async embed(text) {
68
+ if (!text || text.trim().length === 0) {
69
+ throw new EmbeddingError('Text cannot be empty', 'invalid_input', this.name);
70
+ }
71
+ try {
72
+ const response = await fetch(`${this.baseUrl}/api/embed`, {
73
+ method: 'POST',
74
+ headers: { 'Content-Type': 'application/json' },
75
+ body: JSON.stringify({
76
+ model: this.model,
77
+ input: text,
78
+ }),
79
+ signal: AbortSignal.timeout(this.timeoutMs),
80
+ });
81
+ if (!response.ok) {
82
+ const errorText = await response.text();
83
+ if (response.status === 404) {
84
+ throw new EmbeddingError(`Model ${this.model} not found. Run: ollama pull ${this.model}`, 'model_not_found', this.name);
85
+ }
86
+ throw new EmbeddingError(`Ollama API error: ${response.status} - ${errorText}`, 'unknown', this.name);
87
+ }
88
+ const data = (await response.json());
89
+ if (!data.embeddings || data.embeddings.length === 0) {
90
+ throw new EmbeddingError('No embeddings returned from Ollama', 'unknown', this.name);
91
+ }
92
+ return data.embeddings[0];
93
+ }
94
+ catch (error) {
95
+ if (error instanceof EmbeddingError) {
96
+ throw error;
97
+ }
98
+ if (error instanceof Error) {
99
+ if (error.name === 'TimeoutError' || error.name === 'AbortError') {
100
+ throw new EmbeddingError(`Ollama request timed out after ${this.timeoutMs}ms`, 'timeout', this.name, error);
101
+ }
102
+ if (error.message.includes('ECONNREFUSED') || error.message.includes('fetch failed')) {
103
+ throw new EmbeddingError('Ollama server not running. Start with: ollama serve', 'provider_unavailable', this.name, error);
104
+ }
105
+ }
106
+ throw new EmbeddingError(`Ollama embedding failed: ${error instanceof Error ? error.message : String(error)}`, 'unknown', this.name, error instanceof Error ? error : undefined);
107
+ }
108
+ }
109
+ /**
110
+ * Generate embeddings for multiple texts (batch operation)
111
+ */
112
+ async embedBatch(texts) {
113
+ if (texts.length === 0) {
114
+ return [];
115
+ }
116
+ // Filter out empty texts
117
+ const validTexts = texts.filter((t) => t && t.trim().length > 0);
118
+ if (validTexts.length === 0) {
119
+ throw new EmbeddingError('All texts are empty', 'invalid_input', this.name);
120
+ }
121
+ try {
122
+ const response = await fetch(`${this.baseUrl}/api/embed`, {
123
+ method: 'POST',
124
+ headers: { 'Content-Type': 'application/json' },
125
+ body: JSON.stringify({
126
+ model: this.model,
127
+ input: validTexts,
128
+ }),
129
+ signal: AbortSignal.timeout(this.timeoutMs * 2), // Longer timeout for batch
130
+ });
131
+ if (!response.ok) {
132
+ const errorText = await response.text();
133
+ throw new EmbeddingError(`Ollama batch API error: ${response.status} - ${errorText}`, 'unknown', this.name);
134
+ }
135
+ const data = (await response.json());
136
+ if (!data.embeddings) {
137
+ throw new EmbeddingError('No embeddings returned from Ollama batch', 'unknown', this.name);
138
+ }
139
+ return data.embeddings;
140
+ }
141
+ catch (error) {
142
+ if (error instanceof EmbeddingError) {
143
+ throw error;
144
+ }
145
+ // Fallback to sequential embedding if batch fails
146
+ console.warn('[OllamaEmbedding] Batch failed, falling back to sequential');
147
+ const results = [];
148
+ for (const text of validTexts) {
149
+ results.push(await this.embed(text));
150
+ }
151
+ return results;
152
+ }
153
+ }
154
+ /**
155
+ * Pull the embedding model if not available
156
+ */
157
+ async pullModel() {
158
+ try {
159
+ console.log(`[OllamaEmbedding] Pulling model ${this.model}...`);
160
+ const response = await fetch(`${this.baseUrl}/api/pull`, {
161
+ method: 'POST',
162
+ headers: { 'Content-Type': 'application/json' },
163
+ body: JSON.stringify({ name: this.model }),
164
+ signal: AbortSignal.timeout(600000), // 10 minute timeout for model download
165
+ });
166
+ if (!response.ok) {
167
+ console.error(`[OllamaEmbedding] Failed to pull model: ${response.status}`);
168
+ return false;
169
+ }
170
+ // Stream the response to show progress
171
+ const reader = response.body?.getReader();
172
+ if (reader) {
173
+ const decoder = new TextDecoder();
174
+ while (true) {
175
+ const { done, value } = await reader.read();
176
+ if (done)
177
+ break;
178
+ const chunk = decoder.decode(value);
179
+ // Parse NDJSON response
180
+ const lines = chunk.split('\n').filter((l) => l.trim());
181
+ for (const line of lines) {
182
+ try {
183
+ const data = JSON.parse(line);
184
+ if (data.status) {
185
+ console.log(`[OllamaEmbedding] ${data.status}`);
186
+ }
187
+ }
188
+ catch {
189
+ // Ignore parse errors
190
+ }
191
+ }
192
+ }
193
+ }
194
+ console.log(`[OllamaEmbedding] Model ${this.model} pulled successfully`);
195
+ return true;
196
+ }
197
+ catch (error) {
198
+ console.error(`[OllamaEmbedding] Failed to pull model: ${error}`);
199
+ return false;
200
+ }
201
+ }
202
+ }
203
+ //# sourceMappingURL=ollamaEmbedding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollamaEmbedding.js","sourceRoot":"","sources":["../../../../src/services/embeddings/ollamaEmbedding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 OSAgent OC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import type { EmbeddingProvider, OpenRouterEmbeddingConfig } from './types.js';
7
+ /**
8
+ * OpenRouter Embedding Provider
9
+ *
10
+ * Fallback embedding provider using OpenRouter API.
11
+ * Uses text-embedding-3-small model (1536 dimensions) by default.
12
+ *
13
+ * @see https://openrouter.ai/docs/api/reference/embeddings
14
+ */
15
+ export declare class OpenRouterEmbeddingProvider implements EmbeddingProvider {
16
+ readonly name = "openrouter";
17
+ private readonly apiKey;
18
+ private readonly baseUrl;
19
+ private readonly model;
20
+ private readonly timeoutMs;
21
+ private readonly dimensions;
22
+ constructor(config: OpenRouterEmbeddingConfig);
23
+ getDimensions(): number;
24
+ /**
25
+ * Check if OpenRouter is available with valid API key
26
+ */
27
+ isAvailable(): Promise<boolean>;
28
+ /**
29
+ * Generate embedding for a single text
30
+ */
31
+ embed(text: string): Promise<number[]>;
32
+ /**
33
+ * Generate embeddings for multiple texts (batch operation)
34
+ */
35
+ embedBatch(texts: string[]): Promise<number[][]>;
36
+ /**
37
+ * Check remaining credits (if supported)
38
+ */
39
+ getCredits(): Promise<{
40
+ remaining: number;
41
+ limit: number;
42
+ } | null>;
43
+ }
@@ -0,0 +1,212 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 OSAgent OC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { EmbeddingError } from './types.js';
7
+ /**
8
+ * OpenRouter Embedding Provider
9
+ *
10
+ * Fallback embedding provider using OpenRouter API.
11
+ * Uses text-embedding-3-small model (1536 dimensions) by default.
12
+ *
13
+ * @see https://openrouter.ai/docs/api/reference/embeddings
14
+ */
15
+ export class OpenRouterEmbeddingProvider {
16
+ name = 'openrouter';
17
+ apiKey;
18
+ baseUrl;
19
+ model;
20
+ timeoutMs;
21
+ dimensions;
22
+ constructor(config) {
23
+ if (!config.apiKey) {
24
+ throw new Error('OpenRouter API key is required');
25
+ }
26
+ this.apiKey = config.apiKey;
27
+ this.baseUrl = config.baseUrl ?? 'https://openrouter.ai/api/v1';
28
+ this.model = config.model ?? 'openai/text-embedding-3-small';
29
+ this.timeoutMs = config.timeoutMs ?? 30000;
30
+ // Dimensions based on model
31
+ if (this.model.includes('text-embedding-3-large')) {
32
+ this.dimensions = 3072;
33
+ }
34
+ else if (this.model.includes('text-embedding-3-small')) {
35
+ this.dimensions = 1536;
36
+ }
37
+ else if (this.model.includes('text-embedding-ada')) {
38
+ this.dimensions = 1536;
39
+ }
40
+ else {
41
+ this.dimensions = 1536; // Default fallback
42
+ }
43
+ }
44
+ getDimensions() {
45
+ return this.dimensions;
46
+ }
47
+ /**
48
+ * Check if OpenRouter is available with valid API key
49
+ */
50
+ async isAvailable() {
51
+ try {
52
+ // Make a minimal request to verify the API key
53
+ const response = await fetch(`${this.baseUrl}/models`, {
54
+ method: 'GET',
55
+ headers: {
56
+ Authorization: `Bearer ${this.apiKey}`,
57
+ 'HTTP-Referer': 'https://osagent.dev',
58
+ 'X-Title': 'OSAgent',
59
+ },
60
+ signal: AbortSignal.timeout(5000),
61
+ });
62
+ return response.ok;
63
+ }
64
+ catch {
65
+ return false;
66
+ }
67
+ }
68
+ /**
69
+ * Generate embedding for a single text
70
+ */
71
+ async embed(text) {
72
+ if (!text || text.trim().length === 0) {
73
+ throw new EmbeddingError('Text cannot be empty', 'invalid_input', this.name);
74
+ }
75
+ try {
76
+ const response = await fetch(`${this.baseUrl}/embeddings`, {
77
+ method: 'POST',
78
+ headers: {
79
+ 'Content-Type': 'application/json',
80
+ Authorization: `Bearer ${this.apiKey}`,
81
+ 'HTTP-Referer': 'https://osagent.dev',
82
+ 'X-Title': 'OSAgent',
83
+ },
84
+ body: JSON.stringify({
85
+ model: this.model,
86
+ input: text,
87
+ }),
88
+ signal: AbortSignal.timeout(this.timeoutMs),
89
+ });
90
+ if (!response.ok) {
91
+ const errorData = (await response.json().catch(() => ({})));
92
+ const errorMessage = errorData.error?.message || `HTTP ${response.status}`;
93
+ if (response.status === 401) {
94
+ throw new EmbeddingError('Invalid OpenRouter API key', 'provider_unavailable', this.name);
95
+ }
96
+ if (response.status === 402) {
97
+ throw new EmbeddingError('OpenRouter credits exhausted. Add credits at openrouter.ai', 'rate_limit', this.name);
98
+ }
99
+ if (response.status === 429) {
100
+ throw new EmbeddingError('OpenRouter rate limit exceeded', 'rate_limit', this.name);
101
+ }
102
+ throw new EmbeddingError(`OpenRouter API error: ${errorMessage}`, 'unknown', this.name);
103
+ }
104
+ const data = (await response.json());
105
+ if (!data.data || data.data.length === 0 || !data.data[0].embedding) {
106
+ throw new EmbeddingError('No embeddings returned from OpenRouter', 'unknown', this.name);
107
+ }
108
+ return data.data[0].embedding;
109
+ }
110
+ catch (error) {
111
+ if (error instanceof EmbeddingError) {
112
+ throw error;
113
+ }
114
+ if (error instanceof Error) {
115
+ if (error.name === 'TimeoutError' || error.name === 'AbortError') {
116
+ throw new EmbeddingError(`OpenRouter request timed out after ${this.timeoutMs}ms`, 'timeout', this.name, error);
117
+ }
118
+ if (error.message.includes('fetch failed') || error.message.includes('ENOTFOUND')) {
119
+ throw new EmbeddingError('Cannot reach OpenRouter API. Check your internet connection.', 'network_error', this.name, error);
120
+ }
121
+ }
122
+ throw new EmbeddingError(`OpenRouter embedding failed: ${error instanceof Error ? error.message : String(error)}`, 'unknown', this.name, error instanceof Error ? error : undefined);
123
+ }
124
+ }
125
+ /**
126
+ * Generate embeddings for multiple texts (batch operation)
127
+ */
128
+ async embedBatch(texts) {
129
+ if (texts.length === 0) {
130
+ return [];
131
+ }
132
+ // Filter out empty texts
133
+ const validTexts = texts.filter((t) => t && t.trim().length > 0);
134
+ if (validTexts.length === 0) {
135
+ throw new EmbeddingError('All texts are empty', 'invalid_input', this.name);
136
+ }
137
+ try {
138
+ const response = await fetch(`${this.baseUrl}/embeddings`, {
139
+ method: 'POST',
140
+ headers: {
141
+ 'Content-Type': 'application/json',
142
+ Authorization: `Bearer ${this.apiKey}`,
143
+ 'HTTP-Referer': 'https://osagent.dev',
144
+ 'X-Title': 'OSAgent',
145
+ },
146
+ body: JSON.stringify({
147
+ model: this.model,
148
+ input: validTexts,
149
+ }),
150
+ signal: AbortSignal.timeout(this.timeoutMs * 2), // Longer timeout for batch
151
+ });
152
+ if (!response.ok) {
153
+ const errorData = (await response.json().catch(() => ({})));
154
+ const errorMessage = errorData.error?.message || `HTTP ${response.status}`;
155
+ throw new EmbeddingError(`OpenRouter batch API error: ${errorMessage}`, 'unknown', this.name);
156
+ }
157
+ const data = (await response.json());
158
+ if (!data.data) {
159
+ throw new EmbeddingError('No embeddings returned from OpenRouter batch', 'unknown', this.name);
160
+ }
161
+ // Sort by index to ensure correct order
162
+ const sorted = data.data.sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
163
+ return sorted.map((item) => {
164
+ if (!item.embedding) {
165
+ throw new EmbeddingError('Missing embedding in OpenRouter batch response', 'unknown', this.name);
166
+ }
167
+ return item.embedding;
168
+ });
169
+ }
170
+ catch (error) {
171
+ if (error instanceof EmbeddingError) {
172
+ throw error;
173
+ }
174
+ // Fallback to sequential embedding if batch fails
175
+ console.warn('[OpenRouterEmbedding] Batch failed, falling back to sequential');
176
+ const results = [];
177
+ for (const text of validTexts) {
178
+ results.push(await this.embed(text));
179
+ }
180
+ return results;
181
+ }
182
+ }
183
+ /**
184
+ * Check remaining credits (if supported)
185
+ */
186
+ async getCredits() {
187
+ try {
188
+ const response = await fetch(`${this.baseUrl}/auth/key`, {
189
+ method: 'GET',
190
+ headers: {
191
+ Authorization: `Bearer ${this.apiKey}`,
192
+ },
193
+ signal: AbortSignal.timeout(5000),
194
+ });
195
+ if (!response.ok) {
196
+ return null;
197
+ }
198
+ const data = (await response.json());
199
+ if (data.data) {
200
+ return {
201
+ remaining: (data.data.limit ?? 0) - (data.data.usage ?? 0),
202
+ limit: data.data.limit ?? 0,
203
+ };
204
+ }
205
+ return null;
206
+ }
207
+ catch {
208
+ return null;
209
+ }
210
+ }
211
+ }
212
+ //# sourceMappingURL=openRouterEmbedding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openRouterEmbedding.js","sourceRoot":"","sources":["../../../../src/services/embeddings/openRouterEmbedding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 OSAgent OC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Embedding Provider Interface
8
+ *
9
+ * Defines the contract for embedding providers (Ollama, OpenRouter, etc.)
10
+ * that convert text into vector representations for semantic search.
11
+ */
12
+ export interface EmbeddingProvider {
13
+ /** Provider name for logging/debugging */
14
+ readonly name: string;
15
+ /** Get embedding dimensions (e.g., 768 for nomic-embed-text, 1536 for OpenAI) */
16
+ getDimensions(): number;
17
+ /** Check if provider is available and configured */
18
+ isAvailable(): Promise<boolean>;
19
+ /** Generate embedding for a single text */
20
+ embed(text: string): Promise<number[]>;
21
+ /** Generate embeddings for multiple texts (batch operation) */
22
+ embedBatch(texts: string[]): Promise<number[][]>;
23
+ }
24
+ /**
25
+ * Embedding result with metadata
26
+ */
27
+ export interface EmbeddingResult {
28
+ /** The embedding vector */
29
+ embedding: number[];
30
+ /** Provider that generated this embedding */
31
+ provider: string;
32
+ /** Model used for embedding */
33
+ model: string;
34
+ /** Time taken in milliseconds */
35
+ durationMs: number;
36
+ /** Token count if available */
37
+ tokenCount?: number;
38
+ }
39
+ /**
40
+ * Embedding service configuration
41
+ */
42
+ export interface EmbeddingServiceConfig {
43
+ /** Primary provider (tried first) */
44
+ primaryProvider?: EmbeddingProvider;
45
+ /** Fallback provider (used if primary fails) */
46
+ fallbackProvider?: EmbeddingProvider;
47
+ /** Whether to cache embeddings */
48
+ enableCache?: boolean;
49
+ /** Cache TTL in milliseconds */
50
+ cacheTtlMs?: number;
51
+ /** Maximum batch size for batch operations */
52
+ maxBatchSize?: number;
53
+ }
54
+ /**
55
+ * Ollama embedding configuration
56
+ */
57
+ export interface OllamaEmbeddingConfig {
58
+ /** Ollama API base URL (default: http://localhost:11434) */
59
+ baseUrl?: string;
60
+ /** Model to use (default: nomic-embed-text) */
61
+ model?: string;
62
+ /** Request timeout in milliseconds */
63
+ timeoutMs?: number;
64
+ }
65
+ /**
66
+ * OpenRouter embedding configuration
67
+ */
68
+ export interface OpenRouterEmbeddingConfig {
69
+ /** OpenRouter API key */
70
+ apiKey: string;
71
+ /** API base URL (default: https://openrouter.ai/api/v1) */
72
+ baseUrl?: string;
73
+ /** Model to use (default: text-embedding-3-small) */
74
+ model?: string;
75
+ /** Request timeout in milliseconds */
76
+ timeoutMs?: number;
77
+ }
78
+ /**
79
+ * Embedding error types
80
+ */
81
+ export type EmbeddingErrorType = 'provider_unavailable' | 'model_not_found' | 'rate_limit' | 'timeout' | 'invalid_input' | 'network_error' | 'unknown';
82
+ /**
83
+ * Custom error for embedding operations
84
+ */
85
+ export declare class EmbeddingError extends Error {
86
+ readonly type: EmbeddingErrorType;
87
+ readonly provider: string;
88
+ readonly cause?: Error;
89
+ constructor(message: string, type: EmbeddingErrorType, provider: string, cause?: Error);
90
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 OSAgent OC
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ /**
7
+ * Custom error for embedding operations
8
+ */
9
+ export class EmbeddingError extends Error {
10
+ type;
11
+ provider;
12
+ cause;
13
+ constructor(message, type, provider, cause) {
14
+ super(message);
15
+ this.name = 'EmbeddingError';
16
+ this.type = type;
17
+ this.provider = provider;
18
+ this.cause = cause;
19
+ }
20
+ }
21
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/services/embeddings/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA4GH;;GAEG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvB,IAAI,CAAqB;IACzB,QAAQ,CAAS;IACR,KAAK,CAAS;IAEvC,YACE,OAAe,EACf,IAAwB,EACxB,QAAgB,EAChB,KAAa;QAEb,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF"}