cccmemory 1.8.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 (216) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +349 -0
  3. package/dist/ConversationMemory.d.ts +231 -0
  4. package/dist/ConversationMemory.d.ts.map +1 -0
  5. package/dist/ConversationMemory.js +357 -0
  6. package/dist/ConversationMemory.js.map +1 -0
  7. package/dist/cache/QueryCache.d.ts +215 -0
  8. package/dist/cache/QueryCache.d.ts.map +1 -0
  9. package/dist/cache/QueryCache.js +294 -0
  10. package/dist/cache/QueryCache.js.map +1 -0
  11. package/dist/cli/commands.d.ts +9 -0
  12. package/dist/cli/commands.d.ts.map +1 -0
  13. package/dist/cli/commands.js +954 -0
  14. package/dist/cli/commands.js.map +1 -0
  15. package/dist/cli/help.d.ts +16 -0
  16. package/dist/cli/help.d.ts.map +1 -0
  17. package/dist/cli/help.js +361 -0
  18. package/dist/cli/help.js.map +1 -0
  19. package/dist/cli/index.d.ts +30 -0
  20. package/dist/cli/index.d.ts.map +1 -0
  21. package/dist/cli/index.js +111 -0
  22. package/dist/cli/index.js.map +1 -0
  23. package/dist/context/ContextInjector.d.ts +38 -0
  24. package/dist/context/ContextInjector.d.ts.map +1 -0
  25. package/dist/context/ContextInjector.js +235 -0
  26. package/dist/context/ContextInjector.js.map +1 -0
  27. package/dist/documentation/CodeAnalyzer.d.ts +29 -0
  28. package/dist/documentation/CodeAnalyzer.d.ts.map +1 -0
  29. package/dist/documentation/CodeAnalyzer.js +122 -0
  30. package/dist/documentation/CodeAnalyzer.js.map +1 -0
  31. package/dist/documentation/ConversationAnalyzer.d.ts +19 -0
  32. package/dist/documentation/ConversationAnalyzer.d.ts.map +1 -0
  33. package/dist/documentation/ConversationAnalyzer.js +157 -0
  34. package/dist/documentation/ConversationAnalyzer.js.map +1 -0
  35. package/dist/documentation/CrossReferencer.d.ts +67 -0
  36. package/dist/documentation/CrossReferencer.d.ts.map +1 -0
  37. package/dist/documentation/CrossReferencer.js +247 -0
  38. package/dist/documentation/CrossReferencer.js.map +1 -0
  39. package/dist/documentation/DocumentationGenerator.d.ts +22 -0
  40. package/dist/documentation/DocumentationGenerator.d.ts.map +1 -0
  41. package/dist/documentation/DocumentationGenerator.js +57 -0
  42. package/dist/documentation/DocumentationGenerator.js.map +1 -0
  43. package/dist/documentation/MarkdownFormatter.d.ts +26 -0
  44. package/dist/documentation/MarkdownFormatter.d.ts.map +1 -0
  45. package/dist/documentation/MarkdownFormatter.js +301 -0
  46. package/dist/documentation/MarkdownFormatter.js.map +1 -0
  47. package/dist/documentation/types.d.ts +176 -0
  48. package/dist/documentation/types.d.ts.map +1 -0
  49. package/dist/documentation/types.js +5 -0
  50. package/dist/documentation/types.js.map +1 -0
  51. package/dist/embeddings/ConfigManager.d.ts +46 -0
  52. package/dist/embeddings/ConfigManager.d.ts.map +1 -0
  53. package/dist/embeddings/ConfigManager.js +177 -0
  54. package/dist/embeddings/ConfigManager.js.map +1 -0
  55. package/dist/embeddings/EmbeddingConfig.d.ts +39 -0
  56. package/dist/embeddings/EmbeddingConfig.d.ts.map +1 -0
  57. package/dist/embeddings/EmbeddingConfig.js +132 -0
  58. package/dist/embeddings/EmbeddingConfig.js.map +1 -0
  59. package/dist/embeddings/EmbeddingGenerator.d.ts +51 -0
  60. package/dist/embeddings/EmbeddingGenerator.d.ts.map +1 -0
  61. package/dist/embeddings/EmbeddingGenerator.js +157 -0
  62. package/dist/embeddings/EmbeddingGenerator.js.map +1 -0
  63. package/dist/embeddings/EmbeddingProvider.d.ts +34 -0
  64. package/dist/embeddings/EmbeddingProvider.d.ts.map +1 -0
  65. package/dist/embeddings/EmbeddingProvider.js +6 -0
  66. package/dist/embeddings/EmbeddingProvider.js.map +1 -0
  67. package/dist/embeddings/ModelRegistry.d.ts +48 -0
  68. package/dist/embeddings/ModelRegistry.d.ts.map +1 -0
  69. package/dist/embeddings/ModelRegistry.js +170 -0
  70. package/dist/embeddings/ModelRegistry.js.map +1 -0
  71. package/dist/embeddings/VectorStore.d.ts +114 -0
  72. package/dist/embeddings/VectorStore.d.ts.map +1 -0
  73. package/dist/embeddings/VectorStore.js +393 -0
  74. package/dist/embeddings/VectorStore.js.map +1 -0
  75. package/dist/embeddings/providers/OllamaEmbeddings.d.ts +38 -0
  76. package/dist/embeddings/providers/OllamaEmbeddings.d.ts.map +1 -0
  77. package/dist/embeddings/providers/OllamaEmbeddings.js +125 -0
  78. package/dist/embeddings/providers/OllamaEmbeddings.js.map +1 -0
  79. package/dist/embeddings/providers/OpenAIEmbeddings.d.ts +40 -0
  80. package/dist/embeddings/providers/OpenAIEmbeddings.d.ts.map +1 -0
  81. package/dist/embeddings/providers/OpenAIEmbeddings.js +129 -0
  82. package/dist/embeddings/providers/OpenAIEmbeddings.js.map +1 -0
  83. package/dist/embeddings/providers/TransformersEmbeddings.d.ts +38 -0
  84. package/dist/embeddings/providers/TransformersEmbeddings.d.ts.map +1 -0
  85. package/dist/embeddings/providers/TransformersEmbeddings.js +115 -0
  86. package/dist/embeddings/providers/TransformersEmbeddings.js.map +1 -0
  87. package/dist/handoff/SessionHandoffStore.d.ts +80 -0
  88. package/dist/handoff/SessionHandoffStore.d.ts.map +1 -0
  89. package/dist/handoff/SessionHandoffStore.js +314 -0
  90. package/dist/handoff/SessionHandoffStore.js.map +1 -0
  91. package/dist/index.d.ts +7 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +115 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/mcp-server.d.ts +27 -0
  96. package/dist/mcp-server.d.ts.map +1 -0
  97. package/dist/mcp-server.js +157 -0
  98. package/dist/mcp-server.js.map +1 -0
  99. package/dist/memory/WorkingMemoryStore.d.ts +83 -0
  100. package/dist/memory/WorkingMemoryStore.d.ts.map +1 -0
  101. package/dist/memory/WorkingMemoryStore.js +318 -0
  102. package/dist/memory/WorkingMemoryStore.js.map +1 -0
  103. package/dist/memory/types.d.ts +192 -0
  104. package/dist/memory/types.d.ts.map +1 -0
  105. package/dist/memory/types.js +8 -0
  106. package/dist/memory/types.js.map +1 -0
  107. package/dist/parsers/CodexConversationParser.d.ts +51 -0
  108. package/dist/parsers/CodexConversationParser.d.ts.map +1 -0
  109. package/dist/parsers/CodexConversationParser.js +301 -0
  110. package/dist/parsers/CodexConversationParser.js.map +1 -0
  111. package/dist/parsers/ConversationParser.d.ts +286 -0
  112. package/dist/parsers/ConversationParser.d.ts.map +1 -0
  113. package/dist/parsers/ConversationParser.js +795 -0
  114. package/dist/parsers/ConversationParser.js.map +1 -0
  115. package/dist/parsers/DecisionExtractor.d.ts +144 -0
  116. package/dist/parsers/DecisionExtractor.d.ts.map +1 -0
  117. package/dist/parsers/DecisionExtractor.js +434 -0
  118. package/dist/parsers/DecisionExtractor.js.map +1 -0
  119. package/dist/parsers/GitIntegrator.d.ts +156 -0
  120. package/dist/parsers/GitIntegrator.d.ts.map +1 -0
  121. package/dist/parsers/GitIntegrator.js +348 -0
  122. package/dist/parsers/GitIntegrator.js.map +1 -0
  123. package/dist/parsers/MistakeExtractor.d.ts +151 -0
  124. package/dist/parsers/MistakeExtractor.d.ts.map +1 -0
  125. package/dist/parsers/MistakeExtractor.js +460 -0
  126. package/dist/parsers/MistakeExtractor.js.map +1 -0
  127. package/dist/parsers/RequirementsExtractor.d.ts +166 -0
  128. package/dist/parsers/RequirementsExtractor.d.ts.map +1 -0
  129. package/dist/parsers/RequirementsExtractor.js +338 -0
  130. package/dist/parsers/RequirementsExtractor.js.map +1 -0
  131. package/dist/realtime/ConversationWatcher.d.ts +87 -0
  132. package/dist/realtime/ConversationWatcher.d.ts.map +1 -0
  133. package/dist/realtime/ConversationWatcher.js +204 -0
  134. package/dist/realtime/ConversationWatcher.js.map +1 -0
  135. package/dist/realtime/IncrementalParser.d.ts +83 -0
  136. package/dist/realtime/IncrementalParser.d.ts.map +1 -0
  137. package/dist/realtime/IncrementalParser.js +232 -0
  138. package/dist/realtime/IncrementalParser.js.map +1 -0
  139. package/dist/realtime/LiveExtractor.d.ts +72 -0
  140. package/dist/realtime/LiveExtractor.d.ts.map +1 -0
  141. package/dist/realtime/LiveExtractor.js +288 -0
  142. package/dist/realtime/LiveExtractor.js.map +1 -0
  143. package/dist/search/SemanticSearch.d.ts +121 -0
  144. package/dist/search/SemanticSearch.d.ts.map +1 -0
  145. package/dist/search/SemanticSearch.js +823 -0
  146. package/dist/search/SemanticSearch.js.map +1 -0
  147. package/dist/storage/BackupManager.d.ts +58 -0
  148. package/dist/storage/BackupManager.d.ts.map +1 -0
  149. package/dist/storage/BackupManager.js +223 -0
  150. package/dist/storage/BackupManager.js.map +1 -0
  151. package/dist/storage/ConversationStorage.d.ts +341 -0
  152. package/dist/storage/ConversationStorage.d.ts.map +1 -0
  153. package/dist/storage/ConversationStorage.js +792 -0
  154. package/dist/storage/ConversationStorage.js.map +1 -0
  155. package/dist/storage/DeletionService.d.ts +70 -0
  156. package/dist/storage/DeletionService.d.ts.map +1 -0
  157. package/dist/storage/DeletionService.js +253 -0
  158. package/dist/storage/DeletionService.js.map +1 -0
  159. package/dist/storage/GlobalIndex.d.ts +133 -0
  160. package/dist/storage/GlobalIndex.d.ts.map +1 -0
  161. package/dist/storage/GlobalIndex.js +310 -0
  162. package/dist/storage/GlobalIndex.js.map +1 -0
  163. package/dist/storage/SQLiteManager.d.ts +114 -0
  164. package/dist/storage/SQLiteManager.d.ts.map +1 -0
  165. package/dist/storage/SQLiteManager.js +636 -0
  166. package/dist/storage/SQLiteManager.js.map +1 -0
  167. package/dist/storage/migrations.d.ts +54 -0
  168. package/dist/storage/migrations.d.ts.map +1 -0
  169. package/dist/storage/migrations.js +285 -0
  170. package/dist/storage/migrations.js.map +1 -0
  171. package/dist/storage/schema.sql +436 -0
  172. package/dist/tools/ToolDefinitions.d.ts +946 -0
  173. package/dist/tools/ToolDefinitions.d.ts.map +1 -0
  174. package/dist/tools/ToolDefinitions.js +937 -0
  175. package/dist/tools/ToolDefinitions.js.map +1 -0
  176. package/dist/tools/ToolHandlers.d.ts +791 -0
  177. package/dist/tools/ToolHandlers.d.ts.map +1 -0
  178. package/dist/tools/ToolHandlers.js +3262 -0
  179. package/dist/tools/ToolHandlers.js.map +1 -0
  180. package/dist/types/ToolTypes.d.ts +824 -0
  181. package/dist/types/ToolTypes.d.ts.map +1 -0
  182. package/dist/types/ToolTypes.js +6 -0
  183. package/dist/types/ToolTypes.js.map +1 -0
  184. package/dist/utils/Logger.d.ts +70 -0
  185. package/dist/utils/Logger.d.ts.map +1 -0
  186. package/dist/utils/Logger.js +131 -0
  187. package/dist/utils/Logger.js.map +1 -0
  188. package/dist/utils/McpConfig.d.ts +54 -0
  189. package/dist/utils/McpConfig.d.ts.map +1 -0
  190. package/dist/utils/McpConfig.js +136 -0
  191. package/dist/utils/McpConfig.js.map +1 -0
  192. package/dist/utils/ProjectMigration.d.ts +82 -0
  193. package/dist/utils/ProjectMigration.d.ts.map +1 -0
  194. package/dist/utils/ProjectMigration.js +416 -0
  195. package/dist/utils/ProjectMigration.js.map +1 -0
  196. package/dist/utils/constants.d.ts +75 -0
  197. package/dist/utils/constants.d.ts.map +1 -0
  198. package/dist/utils/constants.js +105 -0
  199. package/dist/utils/constants.js.map +1 -0
  200. package/dist/utils/safeJson.d.ts +37 -0
  201. package/dist/utils/safeJson.d.ts.map +1 -0
  202. package/dist/utils/safeJson.js +48 -0
  203. package/dist/utils/safeJson.js.map +1 -0
  204. package/dist/utils/sanitization.d.ts +45 -0
  205. package/dist/utils/sanitization.d.ts.map +1 -0
  206. package/dist/utils/sanitization.js +153 -0
  207. package/dist/utils/sanitization.js.map +1 -0
  208. package/dist/utils/worktree.d.ts +15 -0
  209. package/dist/utils/worktree.d.ts.map +1 -0
  210. package/dist/utils/worktree.js +86 -0
  211. package/dist/utils/worktree.js.map +1 -0
  212. package/package.json +98 -0
  213. package/scripts/changelog-check.sh +62 -0
  214. package/scripts/check-node.js +17 -0
  215. package/scripts/dev-config.js +56 -0
  216. package/scripts/postinstall.js +117 -0
@@ -0,0 +1,393 @@
1
+ /**
2
+ * Vector Store with sqlite-vec integration
3
+ * Dual-schema support (vector extension or BLOB fallback)
4
+ */
5
+ export class VectorStore {
6
+ db;
7
+ sqliteManager;
8
+ hasVecExtension = false;
9
+ vecTablesInitialized = false;
10
+ constructor(sqliteManager) {
11
+ this.db = sqliteManager.getDatabase();
12
+ this.sqliteManager = sqliteManager;
13
+ this.detectVecExtension();
14
+ }
15
+ /**
16
+ * Detect if sqlite-vec extension is available
17
+ */
18
+ detectVecExtension() {
19
+ try {
20
+ // First, check if vec0 module is registered by querying sqlite_master
21
+ // This works even in read-only mode
22
+ const vecTables = this.db
23
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name LIKE 'vec_%'")
24
+ .all();
25
+ // If vec tables exist, the extension was loaded successfully before
26
+ if (vecTables.length > 0) {
27
+ this.hasVecExtension = true;
28
+ console.error("✓ sqlite-vec extension detected (existing tables found)");
29
+ return;
30
+ }
31
+ // Try to create a test virtual table (requires write access)
32
+ this.db.exec("CREATE VIRTUAL TABLE IF NOT EXISTS vec_test USING vec0(test float[1])");
33
+ this.db.exec("DROP TABLE vec_test");
34
+ this.hasVecExtension = true;
35
+ console.error("✓ sqlite-vec extension detected");
36
+ }
37
+ catch (error) {
38
+ const errorMessage = error.message;
39
+ // Check if it's a read-only error vs actual missing extension
40
+ if (errorMessage.includes("readonly") || errorMessage.includes("read-only")) {
41
+ // Database is read-only, assume vec is available if extension loaded
42
+ // (SQLiteManager would have failed to load if it wasn't)
43
+ this.hasVecExtension = true;
44
+ console.error("✓ sqlite-vec extension assumed available (read-only mode)");
45
+ }
46
+ else {
47
+ this.hasVecExtension = false;
48
+ console.error("⚠ sqlite-vec not available:", errorMessage);
49
+ }
50
+ }
51
+ }
52
+ /**
53
+ * Check if vec extension is enabled
54
+ */
55
+ isVecEnabled() {
56
+ return this.hasVecExtension;
57
+ }
58
+ /**
59
+ * Generic helper to get existing embedding IDs from both BLOB and vec tables.
60
+ * @param blobTable - BLOB table name (e.g., "message_embeddings")
61
+ * @param idColumn - Column name for the entity ID (e.g., "message_id")
62
+ * @param vecTable - Vec table name (e.g., "vec_message_embeddings")
63
+ * @param prefix - ID prefix in vec table (e.g., "msg_")
64
+ */
65
+ getExistingEmbeddingIds(blobTable, idColumn, vecTable, prefix) {
66
+ const ids = new Set();
67
+ // Query BLOB fallback table
68
+ try {
69
+ const rows = this.db
70
+ .prepare(`SELECT ${idColumn} FROM ${blobTable}`)
71
+ .all();
72
+ for (const row of rows) {
73
+ ids.add(row[idColumn]);
74
+ }
75
+ }
76
+ catch (_e) {
77
+ // Table might not exist yet
78
+ }
79
+ // Also query sqlite-vec table if extension is available
80
+ if (this.hasVecExtension) {
81
+ try {
82
+ const vecRows = this.db
83
+ .prepare(`SELECT id FROM ${vecTable}`)
84
+ .all();
85
+ for (const row of vecRows) {
86
+ // Strip prefix to get actual entity ID
87
+ if (row.id.startsWith(prefix)) {
88
+ ids.add(row.id.substring(prefix.length));
89
+ }
90
+ }
91
+ }
92
+ catch (_e) {
93
+ // Vec table might not exist yet
94
+ }
95
+ }
96
+ return ids;
97
+ }
98
+ /**
99
+ * Get set of message IDs that already have embeddings.
100
+ */
101
+ getExistingMessageEmbeddingIds() {
102
+ return this.getExistingEmbeddingIds("message_embeddings", "message_id", "vec_message_embeddings", "msg_");
103
+ }
104
+ /**
105
+ * Get set of decision IDs that already have embeddings.
106
+ */
107
+ getExistingDecisionEmbeddingIds() {
108
+ return this.getExistingEmbeddingIds("decision_embeddings", "decision_id", "vec_decision_embeddings", "dec_");
109
+ }
110
+ /**
111
+ * Get set of mistake IDs that already have embeddings.
112
+ */
113
+ getExistingMistakeEmbeddingIds() {
114
+ return this.getExistingEmbeddingIds("mistake_embeddings", "mistake_id", "vec_mistake_embeddings", "mst_");
115
+ }
116
+ /**
117
+ * Ensure vec tables exist with correct dimensions
118
+ */
119
+ ensureVecTables(dimensions) {
120
+ if (!this.hasVecExtension || this.vecTablesInitialized) {
121
+ return;
122
+ }
123
+ this.sqliteManager.createVecTablesWithDimensions(dimensions);
124
+ this.vecTablesInitialized = true;
125
+ }
126
+ /**
127
+ * Store an embedding for a message
128
+ * @param messageId - The message ID
129
+ * @param content - The message content
130
+ * @param embedding - The embedding vector
131
+ * @param modelName - The model used to generate the embedding (default: all-MiniLM-L6-v2)
132
+ */
133
+ async storeMessageEmbedding(messageId, content, embedding, modelName = "all-MiniLM-L6-v2") {
134
+ const embedId = `msg_${messageId}`;
135
+ // ALWAYS store content in BLOB table for JOINs and fallback
136
+ // This ensures search can always retrieve content regardless of vec mode
137
+ this.storeInBlobTable(messageId, content, embedding, modelName);
138
+ if (this.hasVecExtension) {
139
+ // Ensure vec tables exist with correct dimensions
140
+ try {
141
+ this.ensureVecTables(embedding.length);
142
+ }
143
+ catch (error) {
144
+ console.error("Failed to ensure vec tables:", error.message);
145
+ // Content already stored in BLOB table, so we can continue
146
+ return;
147
+ }
148
+ // Also store in sqlite-vec virtual table for fast similarity search
149
+ try {
150
+ // Try to delete existing entry first (handles dimension mismatches)
151
+ try {
152
+ this.db
153
+ .prepare("DELETE FROM vec_message_embeddings WHERE id = ?")
154
+ .run(embedId);
155
+ }
156
+ catch (_deleteError) {
157
+ // Ignore - entry might not exist
158
+ }
159
+ // Now insert the new embedding
160
+ this.db
161
+ .prepare("INSERT INTO vec_message_embeddings (id, embedding) VALUES (?, ?)")
162
+ .run(embedId, this.float32ArrayToBuffer(embedding));
163
+ }
164
+ catch (error) {
165
+ // Only log non-UNIQUE-constraint errors
166
+ const errorMessage = error.message;
167
+ if (!errorMessage.includes("UNIQUE constraint")) {
168
+ console.error("Vec embedding storage failed, using BLOB only:", errorMessage);
169
+ }
170
+ // Content already stored in BLOB table, so search will still work
171
+ }
172
+ }
173
+ }
174
+ /**
175
+ * Store embedding in BLOB table (fallback)
176
+ */
177
+ storeInBlobTable(messageId, content, embedding, modelName) {
178
+ this.db
179
+ .prepare(`INSERT INTO message_embeddings
180
+ (id, message_id, content, embedding, model_name, created_at)
181
+ VALUES (?, ?, ?, ?, ?, ?)
182
+ ON CONFLICT(id) DO UPDATE SET
183
+ message_id = excluded.message_id,
184
+ content = excluded.content,
185
+ embedding = excluded.embedding,
186
+ model_name = excluded.model_name,
187
+ created_at = excluded.created_at`)
188
+ .run(`msg_${messageId}`, messageId, content, this.float32ArrayToBuffer(embedding), modelName, Date.now());
189
+ }
190
+ /**
191
+ * Generic helper to store embeddings for decisions/mistakes (simpler schema without content).
192
+ * @param entityId - The entity ID (decision or mistake)
193
+ * @param embedding - The embedding vector
194
+ * @param blobTable - BLOB table name (e.g., "decision_embeddings")
195
+ * @param idColumn - Column name for entity ID (e.g., "decision_id")
196
+ * @param vecTable - Vec table name (e.g., "vec_decision_embeddings")
197
+ * @param prefix - ID prefix (e.g., "dec_")
198
+ * @param entityType - For logging (e.g., "decision")
199
+ */
200
+ storeEntityEmbedding(entityId, embedding, blobTable, idColumn, vecTable, prefix, entityType) {
201
+ const embedId = `${prefix}${entityId}`;
202
+ // Store in BLOB table
203
+ this.db
204
+ .prepare(`INSERT INTO ${blobTable}
205
+ (id, ${idColumn}, embedding, created_at)
206
+ VALUES (?, ?, ?, ?)
207
+ ON CONFLICT(id) DO UPDATE SET
208
+ ${idColumn} = excluded.${idColumn},
209
+ embedding = excluded.embedding,
210
+ created_at = excluded.created_at`)
211
+ .run(embedId, entityId, this.float32ArrayToBuffer(embedding), Date.now());
212
+ // Also store in sqlite-vec if available
213
+ if (this.hasVecExtension) {
214
+ try {
215
+ this.ensureVecTables(embedding.length);
216
+ try {
217
+ this.db.prepare(`DELETE FROM ${vecTable} WHERE id = ?`).run(embedId);
218
+ }
219
+ catch (_e) {
220
+ // Ignore - entry might not exist
221
+ }
222
+ this.db
223
+ .prepare(`INSERT INTO ${vecTable} (id, embedding) VALUES (?, ?)`)
224
+ .run(embedId, this.float32ArrayToBuffer(embedding));
225
+ }
226
+ catch (error) {
227
+ const errorMessage = error.message;
228
+ if (!errorMessage.includes("UNIQUE constraint")) {
229
+ console.error(`Vec ${entityType} embedding storage failed:`, errorMessage);
230
+ }
231
+ }
232
+ }
233
+ }
234
+ /**
235
+ * Store an embedding for a decision
236
+ */
237
+ async storeDecisionEmbedding(decisionId, embedding) {
238
+ this.storeEntityEmbedding(decisionId, embedding, "decision_embeddings", "decision_id", "vec_decision_embeddings", "dec_", "decision");
239
+ }
240
+ /**
241
+ * Store an embedding for a mistake
242
+ */
243
+ async storeMistakeEmbedding(mistakeId, embedding) {
244
+ this.storeEntityEmbedding(mistakeId, embedding, "mistake_embeddings", "mistake_id", "vec_mistake_embeddings", "mst_", "mistake");
245
+ }
246
+ /**
247
+ * Search for similar messages
248
+ */
249
+ async searchMessages(queryEmbedding, limit = 10) {
250
+ if (this.hasVecExtension) {
251
+ return this.searchWithVecExtension(queryEmbedding, limit);
252
+ }
253
+ else {
254
+ return this.searchWithCosine(queryEmbedding, limit);
255
+ }
256
+ }
257
+ /**
258
+ * Search using sqlite-vec extension
259
+ */
260
+ searchWithVecExtension(queryEmbedding, limit) {
261
+ try {
262
+ const queryBuffer = this.float32ArrayToBuffer(queryEmbedding);
263
+ const results = this.db
264
+ .prepare(`SELECT
265
+ vec.id,
266
+ me.content,
267
+ vec_distance_cosine(vec.embedding, ?) as distance
268
+ FROM vec_message_embeddings vec
269
+ JOIN message_embeddings me ON vec.id = me.id
270
+ ORDER BY distance
271
+ LIMIT ?`)
272
+ .all(queryBuffer, limit);
273
+ return results.map((r) => ({
274
+ id: r.id.replace("msg_", ""),
275
+ content: r.content,
276
+ similarity: 1 - r.distance, // Convert distance to similarity
277
+ }));
278
+ }
279
+ catch (error) {
280
+ console.error("Error in vec search:", error);
281
+ // Fallback to cosine
282
+ return this.searchWithCosine(queryEmbedding, limit);
283
+ }
284
+ }
285
+ /**
286
+ * Search using manual cosine similarity (fallback)
287
+ */
288
+ searchWithCosine(queryEmbedding, limit) {
289
+ const allEmbeddings = this.db
290
+ .prepare("SELECT id, message_id, content, embedding FROM message_embeddings")
291
+ .all();
292
+ const results = allEmbeddings
293
+ .map((row) => {
294
+ const embedding = this.bufferToFloat32Array(row.embedding);
295
+ const similarity = this.cosineSimilarity(queryEmbedding, embedding);
296
+ return {
297
+ id: row.message_id,
298
+ content: row.content,
299
+ similarity,
300
+ };
301
+ })
302
+ .sort((a, b) => b.similarity - a.similarity)
303
+ .slice(0, limit);
304
+ return results;
305
+ }
306
+ /**
307
+ * Calculate cosine similarity between two vectors
308
+ */
309
+ cosineSimilarity(a, b) {
310
+ if (a.length !== b.length) {
311
+ throw new Error(`Vectors must have same length: got ${a.length} and ${b.length}`);
312
+ }
313
+ let dotProduct = 0;
314
+ let normA = 0;
315
+ let normB = 0;
316
+ for (let i = 0; i < a.length; i++) {
317
+ dotProduct += a[i] * b[i];
318
+ normA += a[i] * a[i];
319
+ normB += b[i] * b[i];
320
+ }
321
+ // Guard against division by zero (zero vectors)
322
+ if (normA === 0 || normB === 0) {
323
+ return 0;
324
+ }
325
+ return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
326
+ }
327
+ /**
328
+ * Convert Float32Array to Buffer for storage
329
+ */
330
+ float32ArrayToBuffer(array) {
331
+ return Buffer.from(array.buffer, array.byteOffset, array.byteLength);
332
+ }
333
+ /**
334
+ * Convert Buffer to Float32Array for retrieval
335
+ */
336
+ bufferToFloat32Array(buffer) {
337
+ // Validate byte alignment (must be divisible by 4 for Float32)
338
+ if (buffer.byteLength % 4 !== 0) {
339
+ console.error(`Invalid embedding buffer size: ${buffer.byteLength} bytes (not divisible by 4)`);
340
+ return new Float32Array(0);
341
+ }
342
+ // Copy to ensure proper alignment (Node Buffers may not be aligned)
343
+ const aligned = new Float32Array(buffer.byteLength / 4);
344
+ const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
345
+ for (let i = 0; i < aligned.length; i++) {
346
+ aligned[i] = view.getFloat32(i * 4, true); // little-endian
347
+ }
348
+ return aligned;
349
+ }
350
+ /**
351
+ * Get embedding count
352
+ */
353
+ getEmbeddingCount() {
354
+ const result = this.db
355
+ .prepare("SELECT COUNT(*) as count FROM message_embeddings")
356
+ .get();
357
+ return result.count;
358
+ }
359
+ /**
360
+ * Clear all embeddings
361
+ */
362
+ clearAllEmbeddings() {
363
+ this.db.exec("DELETE FROM message_embeddings");
364
+ this.db.exec("DELETE FROM decision_embeddings");
365
+ try {
366
+ this.db.exec("DELETE FROM mistake_embeddings");
367
+ }
368
+ catch (_e) {
369
+ // Table might not exist yet
370
+ }
371
+ if (this.hasVecExtension) {
372
+ try {
373
+ this.db.exec("DELETE FROM vec_message_embeddings");
374
+ }
375
+ catch (_e) {
376
+ // Vector table might not exist
377
+ }
378
+ try {
379
+ this.db.exec("DELETE FROM vec_decision_embeddings");
380
+ }
381
+ catch (_e) {
382
+ // Vector table might not exist
383
+ }
384
+ try {
385
+ this.db.exec("DELETE FROM vec_mistake_embeddings");
386
+ }
387
+ catch (_e) {
388
+ // Vector table might not exist
389
+ }
390
+ }
391
+ }
392
+ }
393
+ //# sourceMappingURL=VectorStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VectorStore.js","sourceRoot":"","sources":["../../src/embeddings/VectorStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Ollama Embeddings Provider
3
+ * Uses local Ollama API for embeddings
4
+ */
5
+ import type { EmbeddingProvider, ModelInfo } from "../EmbeddingProvider.js";
6
+ export declare class OllamaEmbeddings implements EmbeddingProvider {
7
+ private baseUrl;
8
+ private model;
9
+ private dimensions;
10
+ private available;
11
+ private initializationError;
12
+ constructor(baseUrl?: string, model?: string, dimensions?: number);
13
+ /**
14
+ * Initialize by checking if Ollama is available
15
+ */
16
+ initialize(): Promise<void>;
17
+ /**
18
+ * Check if embeddings are available
19
+ */
20
+ isAvailable(): boolean;
21
+ /**
22
+ * Generate embedding for a single text
23
+ */
24
+ embed(text: string): Promise<Float32Array>;
25
+ /**
26
+ * Generate embeddings for multiple texts (batched)
27
+ */
28
+ embedBatch(texts: string[], batchSize?: number): Promise<Float32Array[]>;
29
+ /**
30
+ * Get model information
31
+ */
32
+ getModelInfo(): ModelInfo;
33
+ /**
34
+ * Get default dimensions for common Ollama models using ModelRegistry
35
+ */
36
+ private getDefaultDimensions;
37
+ }
38
+ //# sourceMappingURL=OllamaEmbeddings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OllamaEmbeddings.d.ts","sourceRoot":"","sources":["../../../src/embeddings/providers/OllamaEmbeddings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAO5E,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,mBAAmB,CAAsB;gBAErC,OAAO,GAAE,MAAiC,EAAE,KAAK,GAAE,MAA4B,EAAE,UAAU,CAAC,EAAE,MAAM;IAMhH;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiCjC;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IA+BhD;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,GAAE,MAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA0BlF;;OAEG;IACH,YAAY,IAAI,SAAS;IASzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAa7B"}
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Ollama Embeddings Provider
3
+ * Uses local Ollama API for embeddings
4
+ */
5
+ import { getModelDimensions } from "../ModelRegistry.js";
6
+ export class OllamaEmbeddings {
7
+ baseUrl;
8
+ model;
9
+ dimensions;
10
+ available = false;
11
+ initializationError = null;
12
+ constructor(baseUrl = "http://localhost:11434", model = "mxbai-embed-large", dimensions) {
13
+ this.baseUrl = baseUrl.replace(/\/$/, ""); // Remove trailing slash
14
+ this.model = model;
15
+ this.dimensions = dimensions || this.getDefaultDimensions(model);
16
+ }
17
+ /**
18
+ * Initialize by checking if Ollama is available
19
+ */
20
+ async initialize() {
21
+ try {
22
+ // Check if Ollama is running
23
+ const response = await fetch(`${this.baseUrl}/api/tags`, {
24
+ method: "GET",
25
+ });
26
+ if (!response.ok) {
27
+ throw new Error(`Ollama API returned ${response.status}`);
28
+ }
29
+ // Check if model is available
30
+ const data = (await response.json());
31
+ const hasModel = data.models.some((m) => m.name.includes(this.model));
32
+ if (!hasModel) {
33
+ console.error(`⚠️ Model '${this.model}' not found in Ollama. Available models: ${data.models.map((m) => m.name).join(", ")}`);
34
+ console.error(` Pull the model with: ollama pull ${this.model}`);
35
+ throw new Error(`Model ${this.model} not available in Ollama`);
36
+ }
37
+ this.available = true;
38
+ console.error(`✓ Ollama embeddings ready (${this.model})`);
39
+ }
40
+ catch (error) {
41
+ this.initializationError = error;
42
+ this.available = false;
43
+ console.error("⚠️ Ollama not available:", error.message);
44
+ console.error(" Make sure Ollama is running: ollama serve");
45
+ }
46
+ }
47
+ /**
48
+ * Check if embeddings are available
49
+ */
50
+ isAvailable() {
51
+ return this.available;
52
+ }
53
+ /**
54
+ * Generate embedding for a single text
55
+ */
56
+ async embed(text) {
57
+ if (!this.available) {
58
+ throw new Error(`Ollama embeddings not available: ${this.initializationError?.message || "Not initialized"}`);
59
+ }
60
+ try {
61
+ const response = await fetch(`${this.baseUrl}/api/embeddings`, {
62
+ method: "POST",
63
+ headers: {
64
+ "Content-Type": "application/json",
65
+ },
66
+ body: JSON.stringify({
67
+ model: this.model,
68
+ prompt: text,
69
+ }),
70
+ });
71
+ if (!response.ok) {
72
+ throw new Error(`Ollama API error: ${response.status} ${response.statusText}`);
73
+ }
74
+ const data = (await response.json());
75
+ return new Float32Array(data.embedding);
76
+ }
77
+ catch (error) {
78
+ console.error("Error generating embedding with Ollama:", error);
79
+ throw error;
80
+ }
81
+ }
82
+ /**
83
+ * Generate embeddings for multiple texts (batched)
84
+ */
85
+ async embedBatch(texts, batchSize = 32) {
86
+ if (!this.available) {
87
+ throw new Error("Ollama embeddings not initialized");
88
+ }
89
+ const embeddings = [];
90
+ // Process in batches
91
+ for (let i = 0; i < texts.length; i += batchSize) {
92
+ const batch = texts.slice(i, i + batchSize);
93
+ console.error(`Generating embeddings for batch ${Math.floor(i / batchSize) + 1}/${Math.ceil(texts.length / batchSize)} (Ollama)`);
94
+ // Ollama doesn't have batch endpoint, so we do parallel requests
95
+ const batchEmbeddings = await Promise.all(batch.map((text) => this.embed(text)));
96
+ embeddings.push(...batchEmbeddings);
97
+ }
98
+ return embeddings;
99
+ }
100
+ /**
101
+ * Get model information
102
+ */
103
+ getModelInfo() {
104
+ return {
105
+ provider: "ollama",
106
+ model: this.model,
107
+ dimensions: this.dimensions,
108
+ available: this.available,
109
+ };
110
+ }
111
+ /**
112
+ * Get default dimensions for common Ollama models using ModelRegistry
113
+ */
114
+ getDefaultDimensions(model) {
115
+ // Try to get dimensions from ModelRegistry
116
+ const dimensions = getModelDimensions(model);
117
+ if (dimensions) {
118
+ return dimensions;
119
+ }
120
+ // Default to 768 if unknown (most common for Ollama models)
121
+ console.error(`Unknown model dimensions for '${model}', defaulting to 768. Specify dimensions in config if different.`);
122
+ return 768;
123
+ }
124
+ }
125
+ //# sourceMappingURL=OllamaEmbeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OllamaEmbeddings.js","sourceRoot":"","sources":["../../../src/embeddings/providers/OllamaEmbeddings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAMzD,MAAM,OAAO,gBAAgB;IACnB,OAAO,CAAS;IAChB,KAAK,CAAS;IACd,UAAU,CAAS;IACnB,SAAS,GAAY,KAAK,CAAC;IAC3B,mBAAmB,GAAiB,IAAI,CAAC;IAEjD,YAAY,UAAkB,wBAAwB,EAAE,QAAgB,mBAAmB,EAAE,UAAmB;QAC9G,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,wBAAwB;QACnE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,UAAU,GAAG,UAAU,IAAI,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,6BAA6B;YAC7B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,WAAW,EAAE;gBACvD,MAAM,EAAE,KAAK;aACd,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5D,CAAC;YAED,8BAA8B;YAC9B,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwC,CAAC;YAC5E,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAEtE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CACX,aAAa,IAAI,CAAC,KAAK,4CAA4C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC/G,CAAC;gBACF,OAAO,CAAC,KAAK,CAAC,uCAAuC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gBACnE,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,0BAA0B,CAAC,CAAC;YACjE,CAAC;YAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,OAAO,CAAC,KAAK,CAAC,8BAA8B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,mBAAmB,GAAG,KAAc,CAAC;YAC1C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;YACpE,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,oCAAoC,IAAI,CAAC,mBAAmB,EAAE,OAAO,IAAI,iBAAiB,EAAE,CAC7F,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,iBAAiB,EAAE;gBAC7D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,MAAM,EAAE,IAAI;iBACb,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YACjF,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;YAChE,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;YAChE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,KAAe,EAAE,YAAoB,EAAE;QACtD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,UAAU,GAAmB,EAAE,CAAC;QAEtC,qBAAqB;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;YACjD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;YAE5C,OAAO,CAAC,KAAK,CACX,mCAAmC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,WAAW,CACnH,CAAC;YAEF,iEAAiE;YACjE,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,GAAG,CACvC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CACtC,CAAC;YAEF,UAAU,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,KAAa;QACxC,2CAA2C;QAC3C,MAAM,UAAU,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,4DAA4D;QAC5D,OAAO,CAAC,KAAK,CACX,iCAAiC,KAAK,kEAAkE,CACzG,CAAC;QACF,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * OpenAI Embeddings Provider
3
+ * Uses OpenAI API for high-quality embeddings
4
+ */
5
+ import type { EmbeddingProvider, ModelInfo } from "../EmbeddingProvider.js";
6
+ export declare class OpenAIEmbeddings implements EmbeddingProvider {
7
+ private client;
8
+ private model;
9
+ private dimensions;
10
+ private apiKey;
11
+ private available;
12
+ private initializationError;
13
+ constructor(apiKey: string, model?: string, dimensions?: number);
14
+ /**
15
+ * Initialize OpenAI client
16
+ */
17
+ initialize(): Promise<void>;
18
+ /**
19
+ * Check if embeddings are available
20
+ */
21
+ isAvailable(): boolean;
22
+ /**
23
+ * Generate embedding for a single text
24
+ */
25
+ embed(text: string): Promise<Float32Array>;
26
+ /**
27
+ * Generate embeddings for multiple texts (batched)
28
+ * OpenAI supports batch requests natively
29
+ */
30
+ embedBatch(texts: string[], batchSize?: number): Promise<Float32Array[]>;
31
+ /**
32
+ * Get model information
33
+ */
34
+ getModelInfo(): ModelInfo;
35
+ /**
36
+ * Get default dimensions for OpenAI models using ModelRegistry
37
+ */
38
+ private getDefaultDimensions;
39
+ }
40
+ //# sourceMappingURL=OpenAIEmbeddings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpenAIEmbeddings.d.ts","sourceRoot":"","sources":["../../../src/embeddings/providers/OpenAIEmbeddings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAe5E,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,mBAAmB,CAAsB;gBAErC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAiC,EAAE,UAAU,CAAC,EAAE,MAAM;IAMzF;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiCjC;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAoBhD;;;OAGG;IACG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,SAAS,GAAE,MAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAoCnF;;OAEG;IACH,YAAY,IAAI,SAAS;IASzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAU7B"}