rag-lite-ts 1.0.1 → 1.0.2

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 (182) hide show
  1. package/README.md +94 -65
  2. package/dist/cli/indexer.d.ts.map +1 -1
  3. package/dist/cli/indexer.js +78 -50
  4. package/dist/cli/indexer.js.map +1 -1
  5. package/dist/cli/search.d.ts.map +1 -1
  6. package/dist/cli/search.js +13 -30
  7. package/dist/cli/search.js.map +1 -1
  8. package/dist/cli.js +2 -2
  9. package/dist/cli.js.map +1 -1
  10. package/dist/config.d.ts +34 -73
  11. package/dist/config.d.ts.map +1 -1
  12. package/dist/config.js +50 -255
  13. package/dist/config.js.map +1 -1
  14. package/dist/core/adapters.d.ts +93 -0
  15. package/dist/core/adapters.d.ts.map +1 -0
  16. package/dist/core/adapters.js +139 -0
  17. package/dist/core/adapters.js.map +1 -0
  18. package/dist/core/chunker.d.ts +117 -0
  19. package/dist/core/chunker.d.ts.map +1 -0
  20. package/dist/core/chunker.js +73 -0
  21. package/dist/core/chunker.js.map +1 -0
  22. package/dist/core/config.d.ts +102 -0
  23. package/dist/core/config.d.ts.map +1 -0
  24. package/dist/core/config.js +240 -0
  25. package/dist/core/config.js.map +1 -0
  26. package/dist/{db.d.ts → core/db.d.ts} +25 -9
  27. package/dist/core/db.d.ts.map +1 -0
  28. package/dist/{db.js → core/db.js} +86 -16
  29. package/dist/core/db.js.map +1 -0
  30. package/dist/{error-handler.d.ts → core/error-handler.d.ts} +23 -2
  31. package/dist/core/error-handler.d.ts.map +1 -0
  32. package/dist/{error-handler.js → core/error-handler.js} +51 -8
  33. package/dist/core/error-handler.js.map +1 -0
  34. package/dist/core/index.d.ts +57 -0
  35. package/dist/core/index.d.ts.map +1 -0
  36. package/dist/core/index.js +66 -0
  37. package/dist/core/index.js.map +1 -0
  38. package/dist/core/ingestion.d.ts +143 -0
  39. package/dist/core/ingestion.d.ts.map +1 -0
  40. package/dist/core/ingestion.js +347 -0
  41. package/dist/core/ingestion.js.map +1 -0
  42. package/dist/core/interfaces.d.ts +408 -0
  43. package/dist/core/interfaces.d.ts.map +1 -0
  44. package/dist/core/interfaces.js +106 -0
  45. package/dist/core/interfaces.js.map +1 -0
  46. package/dist/{path-manager.d.ts → core/path-manager.d.ts} +5 -0
  47. package/dist/core/path-manager.d.ts.map +1 -0
  48. package/dist/{path-manager.js → core/path-manager.js} +5 -0
  49. package/dist/core/path-manager.js.map +1 -0
  50. package/dist/core/search-example.d.ts +25 -0
  51. package/dist/core/search-example.d.ts.map +1 -0
  52. package/dist/core/search-example.js +138 -0
  53. package/dist/core/search-example.js.map +1 -0
  54. package/dist/core/search-pipeline-example.d.ts +21 -0
  55. package/dist/core/search-pipeline-example.d.ts.map +1 -0
  56. package/dist/core/search-pipeline-example.js +188 -0
  57. package/dist/core/search-pipeline-example.js.map +1 -0
  58. package/dist/core/search-pipeline.d.ts +111 -0
  59. package/dist/core/search-pipeline.d.ts.map +1 -0
  60. package/dist/core/search-pipeline.js +287 -0
  61. package/dist/core/search-pipeline.js.map +1 -0
  62. package/dist/core/search.d.ts +104 -0
  63. package/dist/core/search.d.ts.map +1 -0
  64. package/dist/core/search.js +218 -0
  65. package/dist/core/search.js.map +1 -0
  66. package/dist/core/types.d.ts +63 -0
  67. package/dist/core/types.d.ts.map +1 -0
  68. package/dist/core/types.js +6 -0
  69. package/dist/core/types.js.map +1 -0
  70. package/dist/{vector-index.d.ts → core/vector-index.d.ts} +4 -0
  71. package/dist/core/vector-index.d.ts.map +1 -0
  72. package/dist/{vector-index.js → core/vector-index.js} +19 -0
  73. package/dist/core/vector-index.js.map +1 -0
  74. package/dist/dom-polyfills.d.ts +6 -0
  75. package/dist/dom-polyfills.d.ts.map +1 -0
  76. package/dist/dom-polyfills.js +40 -0
  77. package/dist/dom-polyfills.js.map +1 -0
  78. package/dist/examples/clean-api-examples.d.ts +44 -0
  79. package/dist/examples/clean-api-examples.d.ts.map +1 -0
  80. package/dist/examples/clean-api-examples.js +206 -0
  81. package/dist/examples/clean-api-examples.js.map +1 -0
  82. package/dist/factories/index.d.ts +43 -0
  83. package/dist/factories/index.d.ts.map +1 -0
  84. package/dist/factories/index.js +44 -0
  85. package/dist/factories/index.js.map +1 -0
  86. package/dist/factories/text-factory.d.ts +466 -0
  87. package/dist/factories/text-factory.d.ts.map +1 -0
  88. package/dist/factories/text-factory.js +719 -0
  89. package/dist/factories/text-factory.js.map +1 -0
  90. package/dist/file-processor.d.ts +2 -2
  91. package/dist/file-processor.d.ts.map +1 -1
  92. package/dist/file-processor.js +3 -3
  93. package/dist/file-processor.js.map +1 -1
  94. package/dist/index-manager.d.ts +3 -2
  95. package/dist/index-manager.d.ts.map +1 -1
  96. package/dist/index-manager.js +13 -11
  97. package/dist/index-manager.js.map +1 -1
  98. package/dist/index.d.ts +63 -8
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +91 -16
  101. package/dist/index.js.map +1 -1
  102. package/dist/indexer.js +1 -1
  103. package/dist/indexer.js.map +1 -1
  104. package/dist/ingestion.d.ts +30 -156
  105. package/dist/ingestion.d.ts.map +1 -1
  106. package/dist/ingestion.js +58 -675
  107. package/dist/ingestion.js.map +1 -1
  108. package/dist/mcp-server.js +86 -55
  109. package/dist/mcp-server.js.map +1 -1
  110. package/dist/preprocess.js +1 -1
  111. package/dist/preprocess.js.map +1 -1
  112. package/dist/search-standalone.js +1 -1
  113. package/dist/search-standalone.js.map +1 -1
  114. package/dist/search.d.ts +32 -76
  115. package/dist/search.d.ts.map +1 -1
  116. package/dist/search.js +80 -428
  117. package/dist/search.js.map +1 -1
  118. package/dist/text/chunker.d.ts +32 -0
  119. package/dist/text/chunker.d.ts.map +1 -0
  120. package/dist/{chunker.js → text/chunker.js} +98 -75
  121. package/dist/text/chunker.js.map +1 -0
  122. package/dist/{embedder.d.ts → text/embedder.d.ts} +22 -1
  123. package/dist/text/embedder.d.ts.map +1 -0
  124. package/dist/{embedder.js → text/embedder.js} +71 -4
  125. package/dist/text/embedder.js.map +1 -0
  126. package/dist/text/index.d.ts +7 -0
  127. package/dist/text/index.d.ts.map +1 -0
  128. package/dist/text/index.js +8 -0
  129. package/dist/text/index.js.map +1 -0
  130. package/dist/text/preprocessors/index.d.ts +17 -0
  131. package/dist/text/preprocessors/index.d.ts.map +1 -0
  132. package/dist/text/preprocessors/index.js +38 -0
  133. package/dist/text/preprocessors/index.js.map +1 -0
  134. package/dist/text/preprocessors/mdx.d.ts +25 -0
  135. package/dist/text/preprocessors/mdx.d.ts.map +1 -0
  136. package/dist/text/preprocessors/mdx.js +101 -0
  137. package/dist/text/preprocessors/mdx.js.map +1 -0
  138. package/dist/text/preprocessors/mermaid.d.ts +68 -0
  139. package/dist/text/preprocessors/mermaid.d.ts.map +1 -0
  140. package/dist/text/preprocessors/mermaid.js +330 -0
  141. package/dist/text/preprocessors/mermaid.js.map +1 -0
  142. package/dist/text/preprocessors/registry.d.ts +56 -0
  143. package/dist/text/preprocessors/registry.d.ts.map +1 -0
  144. package/dist/text/preprocessors/registry.js +180 -0
  145. package/dist/text/preprocessors/registry.js.map +1 -0
  146. package/dist/text/reranker.d.ts +60 -0
  147. package/dist/text/reranker.d.ts.map +1 -0
  148. package/dist/{reranker.js → text/reranker.js} +134 -19
  149. package/dist/text/reranker.js.map +1 -0
  150. package/dist/{tokenizer.d.ts → text/tokenizer.d.ts} +1 -0
  151. package/dist/text/tokenizer.d.ts.map +1 -0
  152. package/dist/{tokenizer.js → text/tokenizer.js} +7 -2
  153. package/dist/text/tokenizer.js.map +1 -0
  154. package/dist/types.d.ts +1 -1
  155. package/dist/types.d.ts.map +1 -1
  156. package/package.json +2 -2
  157. package/dist/chunker.d.ts +0 -47
  158. package/dist/chunker.d.ts.map +0 -1
  159. package/dist/chunker.js.map +0 -1
  160. package/dist/db.d.ts.map +0 -1
  161. package/dist/db.js.map +0 -1
  162. package/dist/embedder.d.ts.map +0 -1
  163. package/dist/embedder.js.map +0 -1
  164. package/dist/error-handler.d.ts.map +0 -1
  165. package/dist/error-handler.js.map +0 -1
  166. package/dist/path-manager.d.ts.map +0 -1
  167. package/dist/path-manager.js.map +0 -1
  168. package/dist/reranker.d.ts +0 -40
  169. package/dist/reranker.d.ts.map +0 -1
  170. package/dist/reranker.js.map +0 -1
  171. package/dist/resource-manager-demo.d.ts +0 -7
  172. package/dist/resource-manager-demo.d.ts.map +0 -1
  173. package/dist/resource-manager-demo.js +0 -52
  174. package/dist/resource-manager-demo.js.map +0 -1
  175. package/dist/resource-manager.d.ts +0 -129
  176. package/dist/resource-manager.d.ts.map +0 -1
  177. package/dist/resource-manager.js +0 -389
  178. package/dist/resource-manager.js.map +0 -1
  179. package/dist/tokenizer.d.ts.map +0 -1
  180. package/dist/tokenizer.js.map +0 -1
  181. package/dist/vector-index.d.ts.map +0 -1
  182. package/dist/vector-index.js.map +0 -1
@@ -0,0 +1,347 @@
1
+ /**
2
+ * CORE MODULE — Shared between text-only (rag-lite-ts) and future multimodal (rag-lite-mm)
3
+ * Model-agnostic. No transformer or modality-specific logic.
4
+ */
5
+ import { discoverAndProcessFiles } from '../file-processor.js';
6
+ import { chunkDocument } from './chunker.js';
7
+ import { insertChunk, upsertDocument } from './db.js';
8
+ import { config } from './config.js';
9
+ import { DocumentPathManager } from './path-manager.js';
10
+ import { existsSync } from 'fs';
11
+ /**
12
+ * Main ingestion pipeline class
13
+ * Coordinates the entire process from file discovery to vector storage
14
+ * Uses explicit dependency injection for clean architecture
15
+ */
16
+ export class IngestionPipeline {
17
+ embedFn;
18
+ indexManager;
19
+ db;
20
+ defaultChunkConfig;
21
+ pathManager;
22
+ /**
23
+ * Creates a new IngestionPipeline with explicit dependency injection
24
+ *
25
+ * DEPENDENCY INJECTION PATTERN:
26
+ * This constructor requires all dependencies to be explicitly provided, enabling:
27
+ * - Clean separation between core ingestion logic and implementation-specific components
28
+ * - Support for different embedding models and content types
29
+ * - Testability through mock injection
30
+ * - Future extensibility for multimodal content processing
31
+ *
32
+ * @param embedFn - Function to embed document chunks into vectors
33
+ * - Signature: (query: string, contentType?: string) => Promise<EmbeddingResult>
34
+ * - Must handle chunk text and return consistent embedding format
35
+ * - Examples:
36
+ * - Text: const embedFn = (text) => textEmbedder.embedSingle(text)
37
+ * - Multimodal: const embedFn = (content, type) => type === 'image' ? clipEmbedder.embedImage(content) : clipEmbedder.embedText(content)
38
+ * - Custom: const embedFn = (text) => customModel.embed(text)
39
+ *
40
+ * @param indexManager - Vector index manager for storing embeddings
41
+ * - Handles vector storage and indexing operations
42
+ * - Must support the embedding dimensions produced by embedFn
43
+ * - Example: new IndexManager('./index.bin')
44
+ *
45
+ * @param db - Database connection for metadata storage
46
+ * - Stores document and chunk metadata with content type support
47
+ * - Supports different content types through metadata fields
48
+ * - Example: await openDatabase('./db.sqlite')
49
+ *
50
+ * USAGE EXAMPLES:
51
+ * ```typescript
52
+ * // Text-only ingestion pipeline
53
+ * const textEmbedFn = await createTextEmbedder();
54
+ * const indexManager = new IndexManager('./index.bin');
55
+ * const db = await openDatabase('./db.sqlite');
56
+ * const ingestion = new IngestionPipeline(textEmbedFn, indexManager, db);
57
+ *
58
+ * // Custom embedding implementation
59
+ * const customEmbedFn = async (text) => ({
60
+ * embedding_id: generateId(),
61
+ * vector: await myCustomModel.embed(text)
62
+ * });
63
+ * const ingestion = new IngestionPipeline(customEmbedFn, indexManager, db);
64
+ *
65
+ * // Multimodal ingestion (future)
66
+ * const multimodalEmbedFn = async (content, contentType) => {
67
+ * if (contentType === 'image') {
68
+ * return { embedding_id: generateId(), vector: await clipModel.embedImage(content) };
69
+ * }
70
+ * return { embedding_id: generateId(), vector: await clipModel.embedText(content) };
71
+ * };
72
+ * const ingestion = new IngestionPipeline(multimodalEmbedFn, indexManager, db);
73
+ * ```
74
+ */
75
+ constructor(embedFn, indexManager, db, defaultChunkConfig) {
76
+ this.embedFn = embedFn;
77
+ this.indexManager = indexManager;
78
+ this.db = db;
79
+ this.defaultChunkConfig = defaultChunkConfig;
80
+ // Validate required dependencies
81
+ if (!embedFn || typeof embedFn !== 'function') {
82
+ throw new Error('embedFn must be a valid function');
83
+ }
84
+ if (!indexManager) {
85
+ throw new Error('indexManager is required');
86
+ }
87
+ if (!db) {
88
+ throw new Error('db connection is required');
89
+ }
90
+ // Initialize path manager with default configuration
91
+ this.pathManager = new DocumentPathManager(config.path_storage_strategy, process.cwd());
92
+ }
93
+ /**
94
+ * Ingest documents from a directory
95
+ * @param directoryPath - Path to directory containing documents
96
+ * @param options - Optional ingestion configuration
97
+ * @returns Promise resolving to ingestion results
98
+ */
99
+ async ingestDirectory(directoryPath, options = {}) {
100
+ if (!existsSync(directoryPath)) {
101
+ throw new Error(`Directory not found: ${directoryPath}`);
102
+ }
103
+ return this.ingestPath(directoryPath, options);
104
+ }
105
+ /**
106
+ * Ingest a single file
107
+ * @param filePath - Path to the file to ingest
108
+ * @param options - Optional ingestion configuration
109
+ * @returns Promise resolving to ingestion results
110
+ */
111
+ async ingestFile(filePath, options = {}) {
112
+ if (!existsSync(filePath)) {
113
+ throw new Error(`File not found: ${filePath}`);
114
+ }
115
+ return this.ingestPath(filePath, options);
116
+ }
117
+ /**
118
+ * Ingest documents from a path (file or directory)
119
+ * Implements the complete pipeline: file processing → chunking → embedding → storage
120
+ */
121
+ async ingestPath(path, options = {}) {
122
+ const startTime = Date.now();
123
+ console.log(`\n=== Starting ingestion from: ${path} ===`);
124
+ try {
125
+ // Phase 1: File Discovery and Processing
126
+ console.log('\n--- Phase 1: File Discovery and Processing ---');
127
+ const fileResult = await discoverAndProcessFiles(path, options.fileOptions, this.pathManager);
128
+ if (fileResult.documents.length === 0) {
129
+ console.log('No documents found to process');
130
+ return {
131
+ documentsProcessed: 0,
132
+ chunksCreated: 0,
133
+ embeddingsGenerated: 0,
134
+ documentErrors: fileResult.processingResult.errors.length,
135
+ embeddingErrors: 0,
136
+ processingTimeMs: Date.now() - startTime
137
+ };
138
+ }
139
+ // Phase 2: Document Chunking
140
+ console.log('\n--- Phase 2: Document Chunking ---');
141
+ const effectiveChunkConfig = options.chunkConfig || this.defaultChunkConfig || {
142
+ chunkSize: config.chunk_size,
143
+ chunkOverlap: config.chunk_overlap
144
+ };
145
+ const chunkingResult = await this.chunkDocuments(fileResult.documents, effectiveChunkConfig);
146
+ if (chunkingResult.totalChunks === 0) {
147
+ console.log('No chunks created from documents');
148
+ return {
149
+ documentsProcessed: fileResult.documents.length,
150
+ chunksCreated: 0,
151
+ embeddingsGenerated: 0,
152
+ documentErrors: fileResult.processingResult.errors.length,
153
+ embeddingErrors: 0,
154
+ processingTimeMs: Date.now() - startTime
155
+ };
156
+ }
157
+ // Phase 3: Embedding Generation
158
+ console.log('\n--- Phase 3: Embedding Generation ---');
159
+ const embeddingResult = await this.generateEmbeddings(chunkingResult.allChunks);
160
+ // Phase 4: Database and Index Storage
161
+ console.log('\n--- Phase 4: Storage Operations ---');
162
+ await this.storeDocumentsAndChunks(chunkingResult.documentChunks, embeddingResult.embeddings);
163
+ // Phase 5: Vector Index Updates
164
+ console.log('\n--- Phase 5: Vector Index Updates ---');
165
+ await this.updateVectorIndex(embeddingResult.embeddings);
166
+ const endTime = Date.now();
167
+ const processingTimeMs = endTime - startTime;
168
+ const result = {
169
+ documentsProcessed: fileResult.documents.length,
170
+ chunksCreated: chunkingResult.totalChunks,
171
+ embeddingsGenerated: embeddingResult.embeddings.length,
172
+ documentErrors: fileResult.processingResult.errors.length,
173
+ embeddingErrors: embeddingResult.errors,
174
+ processingTimeMs
175
+ };
176
+ console.log('\n=== Ingestion Complete ===');
177
+ console.log(`Documents processed: ${result.documentsProcessed}`);
178
+ console.log(`Chunks created: ${result.chunksCreated}`);
179
+ console.log(`Embeddings generated: ${result.embeddingsGenerated}`);
180
+ console.log(`Document errors: ${result.documentErrors}`);
181
+ console.log(`Embedding errors: ${result.embeddingErrors}`);
182
+ console.log(`Total time: ${(processingTimeMs / 1000).toFixed(2)}s`);
183
+ return result;
184
+ }
185
+ catch (error) {
186
+ console.error('\n=== Ingestion Failed ===');
187
+ console.error(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`);
188
+ throw new Error(`Ingestion failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
189
+ }
190
+ }
191
+ /**
192
+ * Chunk all documents and organize results
193
+ */
194
+ async chunkDocuments(documents, chunkConfig) {
195
+ const documentChunks = [];
196
+ const allChunks = [];
197
+ let totalChunks = 0;
198
+ console.log(`Processing ${documents.length} document${documents.length === 1 ? '' : 's'} for chunking...`);
199
+ for (let i = 0; i < documents.length; i++) {
200
+ const document = documents[i];
201
+ try {
202
+ const chunks = await chunkDocument(document, chunkConfig);
203
+ documentChunks.push({ document, chunks });
204
+ // Collect all chunk texts for embedding
205
+ const chunkTexts = chunks.map(chunk => chunk.text);
206
+ allChunks.push(...chunkTexts);
207
+ totalChunks += chunks.length;
208
+ // Progress logging - more frequent for better user experience
209
+ if (documents.length <= 10 || (i + 1) % Math.max(1, Math.floor(documents.length / 10)) === 0 || i === documents.length - 1) {
210
+ const percentage = Math.round(((i + 1) / documents.length) * 100);
211
+ console.log(`Processed ${i + 1} of ${documents.length} documents (${percentage}%) - ${totalChunks} chunks created`);
212
+ }
213
+ }
214
+ catch (error) {
215
+ console.error(`Failed to chunk document ${document.source}:`, error instanceof Error ? error.message : String(error));
216
+ // Continue with other documents
217
+ continue;
218
+ }
219
+ }
220
+ console.log(`✓ Chunking complete: Created ${totalChunks} chunks from ${documentChunks.length} documents`);
221
+ return { documentChunks, allChunks, totalChunks };
222
+ }
223
+ /**
224
+ * Generate embeddings for all chunks with error handling
225
+ */
226
+ async generateEmbeddings(chunkTexts) {
227
+ console.log(`Generating embeddings for ${chunkTexts.length} chunk${chunkTexts.length === 1 ? '' : 's'}...`);
228
+ console.log('This may take a few minutes depending on the number of chunks...');
229
+ try {
230
+ // Generate embeddings using injected embed function
231
+ const embeddings = [];
232
+ let errors = 0;
233
+ for (let i = 0; i < chunkTexts.length; i++) {
234
+ try {
235
+ const embedding = await this.embedFn(chunkTexts[i]);
236
+ embeddings.push(embedding);
237
+ }
238
+ catch (error) {
239
+ console.warn(`Failed to embed chunk ${i + 1}:`, error instanceof Error ? error.message : String(error));
240
+ errors++;
241
+ }
242
+ // Progress logging
243
+ if (chunkTexts.length > 10 && (i + 1) % Math.max(1, Math.floor(chunkTexts.length / 10)) === 0) {
244
+ const percentage = Math.round(((i + 1) / chunkTexts.length) * 100);
245
+ console.log(`Generated ${i + 1} of ${chunkTexts.length} embeddings (${percentage}%)`);
246
+ }
247
+ }
248
+ if (errors > 0) {
249
+ console.warn(`⚠ Warning: ${errors} chunk${errors === 1 ? '' : 's'} failed embedding and ${errors === 1 ? 'was' : 'were'} skipped`);
250
+ }
251
+ console.log(`✓ Generated ${embeddings.length} embeddings successfully`);
252
+ return { embeddings, errors };
253
+ }
254
+ catch (error) {
255
+ console.error('Critical embedding failure:', error instanceof Error ? error.message : String(error));
256
+ throw new Error(`Embedding generation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
257
+ }
258
+ }
259
+ /**
260
+ * Store documents and chunks in database
261
+ */
262
+ async storeDocumentsAndChunks(documentChunks, embeddings) {
263
+ console.log(`Storing ${documentChunks.length} document${documentChunks.length === 1 ? '' : 's'} and chunks in database...`);
264
+ // Create a mapping of chunk text to embedding for efficient lookup
265
+ const embeddingMap = new Map();
266
+ let embeddingIndex = 0;
267
+ // Build mapping - this assumes embeddings are in the same order as chunks were processed
268
+ for (const { chunks } of documentChunks) {
269
+ for (const chunk of chunks) {
270
+ if (embeddingIndex < embeddings.length) {
271
+ embeddingMap.set(chunk.text, embeddings[embeddingIndex]);
272
+ embeddingIndex++;
273
+ }
274
+ }
275
+ }
276
+ let totalChunksStored = 0;
277
+ let documentsStored = 0;
278
+ // Process each document sequentially
279
+ for (const { document, chunks } of documentChunks) {
280
+ try {
281
+ // Insert or get existing document
282
+ const documentId = await upsertDocument(this.db, document.source, document.title);
283
+ documentsStored++;
284
+ // Insert all chunks for this document
285
+ let chunksStoredForDoc = 0;
286
+ for (const chunk of chunks) {
287
+ const embedding = embeddingMap.get(chunk.text);
288
+ if (embedding) {
289
+ try {
290
+ await insertChunk(this.db, embedding.embedding_id, documentId, chunk.text, chunk.chunkIndex);
291
+ chunksStoredForDoc++;
292
+ totalChunksStored++;
293
+ }
294
+ catch (chunkError) {
295
+ console.error(`Failed to store chunk ${chunk.chunkIndex} for document ${document.source}:`, chunkError instanceof Error ? chunkError.message : String(chunkError));
296
+ // Continue with other chunks
297
+ }
298
+ }
299
+ else {
300
+ console.warn(`No embedding found for chunk ${chunk.chunkIndex} in document ${document.source}`);
301
+ }
302
+ }
303
+ // Progress logging for storage
304
+ if (documentChunks.length <= 20 || documentsStored % Math.max(1, Math.floor(documentChunks.length / 10)) === 0 || documentsStored === documentChunks.length) {
305
+ const percentage = Math.round((documentsStored / documentChunks.length) * 100);
306
+ console.log(`Stored ${documentsStored} of ${documentChunks.length} documents (${percentage}%) - ${totalChunksStored} chunks total`);
307
+ }
308
+ }
309
+ catch (docError) {
310
+ console.error(`Failed to store document ${document.source}:`, docError instanceof Error ? docError.message : String(docError));
311
+ // Continue with other documents
312
+ }
313
+ }
314
+ console.log(`✓ Storage complete: ${documentsStored} documents, ${totalChunksStored} chunks saved to database`);
315
+ }
316
+ /**
317
+ * Update vector index with new embeddings
318
+ */
319
+ async updateVectorIndex(embeddings) {
320
+ if (embeddings.length === 0) {
321
+ console.log('No embeddings to add to vector index');
322
+ return;
323
+ }
324
+ console.log(`Adding ${embeddings.length} vector${embeddings.length === 1 ? '' : 's'} to search index...`);
325
+ try {
326
+ await this.indexManager.addVectors(embeddings);
327
+ console.log(`✓ Vector index updated successfully with ${embeddings.length} new vectors`);
328
+ }
329
+ catch (error) {
330
+ console.error('Failed to update vector index:', error instanceof Error ? error.message : String(error));
331
+ throw error;
332
+ }
333
+ }
334
+ /**
335
+ * Clean up resources - explicit cleanup method
336
+ */
337
+ async cleanup() {
338
+ try {
339
+ await this.db.close();
340
+ await this.indexManager.close();
341
+ }
342
+ catch (error) {
343
+ console.error('Error during IngestionPipeline cleanup:', error instanceof Error ? error.message : String(error));
344
+ }
345
+ }
346
+ }
347
+ //# sourceMappingURL=ingestion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingestion.js","sourceRoot":"","sources":["../../src/core/ingestion.ts"],"names":[],"mappings":"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"}