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.
- package/README.md +94 -65
- package/dist/cli/indexer.d.ts.map +1 -1
- package/dist/cli/indexer.js +78 -50
- package/dist/cli/indexer.js.map +1 -1
- package/dist/cli/search.d.ts.map +1 -1
- package/dist/cli/search.js +13 -30
- package/dist/cli/search.js.map +1 -1
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +34 -73
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +50 -255
- package/dist/config.js.map +1 -1
- package/dist/core/adapters.d.ts +93 -0
- package/dist/core/adapters.d.ts.map +1 -0
- package/dist/core/adapters.js +139 -0
- package/dist/core/adapters.js.map +1 -0
- package/dist/core/chunker.d.ts +117 -0
- package/dist/core/chunker.d.ts.map +1 -0
- package/dist/core/chunker.js +73 -0
- package/dist/core/chunker.js.map +1 -0
- package/dist/core/config.d.ts +102 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +240 -0
- package/dist/core/config.js.map +1 -0
- package/dist/{db.d.ts → core/db.d.ts} +25 -9
- package/dist/core/db.d.ts.map +1 -0
- package/dist/{db.js → core/db.js} +86 -16
- package/dist/core/db.js.map +1 -0
- package/dist/{error-handler.d.ts → core/error-handler.d.ts} +23 -2
- package/dist/core/error-handler.d.ts.map +1 -0
- package/dist/{error-handler.js → core/error-handler.js} +51 -8
- package/dist/core/error-handler.js.map +1 -0
- package/dist/core/index.d.ts +57 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +66 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/ingestion.d.ts +143 -0
- package/dist/core/ingestion.d.ts.map +1 -0
- package/dist/core/ingestion.js +347 -0
- package/dist/core/ingestion.js.map +1 -0
- package/dist/core/interfaces.d.ts +408 -0
- package/dist/core/interfaces.d.ts.map +1 -0
- package/dist/core/interfaces.js +106 -0
- package/dist/core/interfaces.js.map +1 -0
- package/dist/{path-manager.d.ts → core/path-manager.d.ts} +5 -0
- package/dist/core/path-manager.d.ts.map +1 -0
- package/dist/{path-manager.js → core/path-manager.js} +5 -0
- package/dist/core/path-manager.js.map +1 -0
- package/dist/core/search-example.d.ts +25 -0
- package/dist/core/search-example.d.ts.map +1 -0
- package/dist/core/search-example.js +138 -0
- package/dist/core/search-example.js.map +1 -0
- package/dist/core/search-pipeline-example.d.ts +21 -0
- package/dist/core/search-pipeline-example.d.ts.map +1 -0
- package/dist/core/search-pipeline-example.js +188 -0
- package/dist/core/search-pipeline-example.js.map +1 -0
- package/dist/core/search-pipeline.d.ts +111 -0
- package/dist/core/search-pipeline.d.ts.map +1 -0
- package/dist/core/search-pipeline.js +287 -0
- package/dist/core/search-pipeline.js.map +1 -0
- package/dist/core/search.d.ts +104 -0
- package/dist/core/search.d.ts.map +1 -0
- package/dist/core/search.js +218 -0
- package/dist/core/search.js.map +1 -0
- package/dist/core/types.d.ts +63 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +6 -0
- package/dist/core/types.js.map +1 -0
- package/dist/{vector-index.d.ts → core/vector-index.d.ts} +4 -0
- package/dist/core/vector-index.d.ts.map +1 -0
- package/dist/{vector-index.js → core/vector-index.js} +19 -0
- package/dist/core/vector-index.js.map +1 -0
- package/dist/dom-polyfills.d.ts +6 -0
- package/dist/dom-polyfills.d.ts.map +1 -0
- package/dist/dom-polyfills.js +40 -0
- package/dist/dom-polyfills.js.map +1 -0
- package/dist/examples/clean-api-examples.d.ts +44 -0
- package/dist/examples/clean-api-examples.d.ts.map +1 -0
- package/dist/examples/clean-api-examples.js +206 -0
- package/dist/examples/clean-api-examples.js.map +1 -0
- package/dist/factories/index.d.ts +43 -0
- package/dist/factories/index.d.ts.map +1 -0
- package/dist/factories/index.js +44 -0
- package/dist/factories/index.js.map +1 -0
- package/dist/factories/text-factory.d.ts +466 -0
- package/dist/factories/text-factory.d.ts.map +1 -0
- package/dist/factories/text-factory.js +719 -0
- package/dist/factories/text-factory.js.map +1 -0
- package/dist/file-processor.d.ts +2 -2
- package/dist/file-processor.d.ts.map +1 -1
- package/dist/file-processor.js +3 -3
- package/dist/file-processor.js.map +1 -1
- package/dist/index-manager.d.ts +3 -2
- package/dist/index-manager.d.ts.map +1 -1
- package/dist/index-manager.js +13 -11
- package/dist/index-manager.js.map +1 -1
- package/dist/index.d.ts +63 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +91 -16
- package/dist/index.js.map +1 -1
- package/dist/indexer.js +1 -1
- package/dist/indexer.js.map +1 -1
- package/dist/ingestion.d.ts +30 -156
- package/dist/ingestion.d.ts.map +1 -1
- package/dist/ingestion.js +58 -675
- package/dist/ingestion.js.map +1 -1
- package/dist/mcp-server.js +86 -55
- package/dist/mcp-server.js.map +1 -1
- package/dist/preprocess.js +1 -1
- package/dist/preprocess.js.map +1 -1
- package/dist/search-standalone.js +1 -1
- package/dist/search-standalone.js.map +1 -1
- package/dist/search.d.ts +32 -76
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +80 -428
- package/dist/search.js.map +1 -1
- package/dist/text/chunker.d.ts +32 -0
- package/dist/text/chunker.d.ts.map +1 -0
- package/dist/{chunker.js → text/chunker.js} +98 -75
- package/dist/text/chunker.js.map +1 -0
- package/dist/{embedder.d.ts → text/embedder.d.ts} +22 -1
- package/dist/text/embedder.d.ts.map +1 -0
- package/dist/{embedder.js → text/embedder.js} +71 -4
- package/dist/text/embedder.js.map +1 -0
- package/dist/text/index.d.ts +7 -0
- package/dist/text/index.d.ts.map +1 -0
- package/dist/text/index.js +8 -0
- package/dist/text/index.js.map +1 -0
- package/dist/text/preprocessors/index.d.ts +17 -0
- package/dist/text/preprocessors/index.d.ts.map +1 -0
- package/dist/text/preprocessors/index.js +38 -0
- package/dist/text/preprocessors/index.js.map +1 -0
- package/dist/text/preprocessors/mdx.d.ts +25 -0
- package/dist/text/preprocessors/mdx.d.ts.map +1 -0
- package/dist/text/preprocessors/mdx.js +101 -0
- package/dist/text/preprocessors/mdx.js.map +1 -0
- package/dist/text/preprocessors/mermaid.d.ts +68 -0
- package/dist/text/preprocessors/mermaid.d.ts.map +1 -0
- package/dist/text/preprocessors/mermaid.js +330 -0
- package/dist/text/preprocessors/mermaid.js.map +1 -0
- package/dist/text/preprocessors/registry.d.ts +56 -0
- package/dist/text/preprocessors/registry.d.ts.map +1 -0
- package/dist/text/preprocessors/registry.js +180 -0
- package/dist/text/preprocessors/registry.js.map +1 -0
- package/dist/text/reranker.d.ts +60 -0
- package/dist/text/reranker.d.ts.map +1 -0
- package/dist/{reranker.js → text/reranker.js} +134 -19
- package/dist/text/reranker.js.map +1 -0
- package/dist/{tokenizer.d.ts → text/tokenizer.d.ts} +1 -0
- package/dist/text/tokenizer.d.ts.map +1 -0
- package/dist/{tokenizer.js → text/tokenizer.js} +7 -2
- package/dist/text/tokenizer.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/chunker.d.ts +0 -47
- package/dist/chunker.d.ts.map +0 -1
- package/dist/chunker.js.map +0 -1
- package/dist/db.d.ts.map +0 -1
- package/dist/db.js.map +0 -1
- package/dist/embedder.d.ts.map +0 -1
- package/dist/embedder.js.map +0 -1
- package/dist/error-handler.d.ts.map +0 -1
- package/dist/error-handler.js.map +0 -1
- package/dist/path-manager.d.ts.map +0 -1
- package/dist/path-manager.js.map +0 -1
- package/dist/reranker.d.ts +0 -40
- package/dist/reranker.d.ts.map +0 -1
- package/dist/reranker.js.map +0 -1
- package/dist/resource-manager-demo.d.ts +0 -7
- package/dist/resource-manager-demo.d.ts.map +0 -1
- package/dist/resource-manager-demo.js +0 -52
- package/dist/resource-manager-demo.js.map +0 -1
- package/dist/resource-manager.d.ts +0 -129
- package/dist/resource-manager.d.ts.map +0 -1
- package/dist/resource-manager.js +0 -389
- package/dist/resource-manager.js.map +0 -1
- package/dist/tokenizer.d.ts.map +0 -1
- package/dist/tokenizer.js.map +0 -1
- package/dist/vector-index.d.ts.map +0 -1
- 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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"}
|