rag-lite-ts 1.0.1
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/LICENSE +21 -0
- package/README.md +240 -0
- package/dist/api-errors.d.ts +90 -0
- package/dist/api-errors.d.ts.map +1 -0
- package/dist/api-errors.js +320 -0
- package/dist/api-errors.js.map +1 -0
- package/dist/chunker.d.ts +47 -0
- package/dist/chunker.d.ts.map +1 -0
- package/dist/chunker.js +256 -0
- package/dist/chunker.js.map +1 -0
- package/dist/cli/indexer.d.ts +11 -0
- package/dist/cli/indexer.d.ts.map +1 -0
- package/dist/cli/indexer.js +272 -0
- package/dist/cli/indexer.js.map +1 -0
- package/dist/cli/search.d.ts +7 -0
- package/dist/cli/search.d.ts.map +1 -0
- package/dist/cli/search.js +206 -0
- package/dist/cli/search.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +362 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +90 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +281 -0
- package/dist/config.js.map +1 -0
- package/dist/db.d.ts +90 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +340 -0
- package/dist/db.js.map +1 -0
- package/dist/embedder.d.ts +101 -0
- package/dist/embedder.d.ts.map +1 -0
- package/dist/embedder.js +323 -0
- package/dist/embedder.js.map +1 -0
- package/dist/error-handler.d.ts +91 -0
- package/dist/error-handler.d.ts.map +1 -0
- package/dist/error-handler.js +196 -0
- package/dist/error-handler.js.map +1 -0
- package/dist/file-processor.d.ts +59 -0
- package/dist/file-processor.d.ts.map +1 -0
- package/dist/file-processor.js +312 -0
- package/dist/file-processor.js.map +1 -0
- package/dist/index-manager.d.ts +99 -0
- package/dist/index-manager.d.ts.map +1 -0
- package/dist/index-manager.js +444 -0
- package/dist/index-manager.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer.d.ts +7 -0
- package/dist/indexer.d.ts.map +1 -0
- package/dist/indexer.js +51 -0
- package/dist/indexer.js.map +1 -0
- package/dist/ingestion.d.ts +175 -0
- package/dist/ingestion.d.ts.map +1 -0
- package/dist/ingestion.js +705 -0
- package/dist/ingestion.js.map +1 -0
- package/dist/mcp-server.d.ts +14 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +680 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/path-manager.d.ts +42 -0
- package/dist/path-manager.d.ts.map +1 -0
- package/dist/path-manager.js +66 -0
- package/dist/path-manager.js.map +1 -0
- package/dist/preprocess.d.ts +19 -0
- package/dist/preprocess.d.ts.map +1 -0
- package/dist/preprocess.js +203 -0
- package/dist/preprocess.js.map +1 -0
- package/dist/preprocessors/index.d.ts +17 -0
- package/dist/preprocessors/index.d.ts.map +1 -0
- package/dist/preprocessors/index.js +38 -0
- package/dist/preprocessors/index.js.map +1 -0
- package/dist/preprocessors/mdx.d.ts +25 -0
- package/dist/preprocessors/mdx.d.ts.map +1 -0
- package/dist/preprocessors/mdx.js +101 -0
- package/dist/preprocessors/mdx.js.map +1 -0
- package/dist/preprocessors/mermaid.d.ts +68 -0
- package/dist/preprocessors/mermaid.d.ts.map +1 -0
- package/dist/preprocessors/mermaid.js +329 -0
- package/dist/preprocessors/mermaid.js.map +1 -0
- package/dist/preprocessors/registry.d.ts +56 -0
- package/dist/preprocessors/registry.d.ts.map +1 -0
- package/dist/preprocessors/registry.js +179 -0
- package/dist/preprocessors/registry.js.map +1 -0
- package/dist/reranker.d.ts +40 -0
- package/dist/reranker.d.ts.map +1 -0
- package/dist/reranker.js +212 -0
- package/dist/reranker.js.map +1 -0
- package/dist/resource-manager-demo.d.ts +7 -0
- package/dist/resource-manager-demo.d.ts.map +1 -0
- package/dist/resource-manager-demo.js +52 -0
- package/dist/resource-manager-demo.js.map +1 -0
- package/dist/resource-manager.d.ts +129 -0
- package/dist/resource-manager.d.ts.map +1 -0
- package/dist/resource-manager.js +389 -0
- package/dist/resource-manager.js.map +1 -0
- package/dist/search-standalone.d.ts +7 -0
- package/dist/search-standalone.d.ts.map +1 -0
- package/dist/search-standalone.js +117 -0
- package/dist/search-standalone.js.map +1 -0
- package/dist/search.d.ts +92 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +454 -0
- package/dist/search.js.map +1 -0
- package/dist/test-utils.d.ts +36 -0
- package/dist/test-utils.d.ts.map +1 -0
- package/dist/test-utils.js +27 -0
- package/dist/test-utils.js.map +1 -0
- package/dist/tokenizer.d.ts +21 -0
- package/dist/tokenizer.d.ts.map +1 -0
- package/dist/tokenizer.js +59 -0
- package/dist/tokenizer.js.map +1 -0
- package/dist/types.d.ts +44 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/vector-index.d.ts +64 -0
- package/dist/vector-index.d.ts.map +1 -0
- package/dist/vector-index.js +308 -0
- package/dist/vector-index.js.map +1 -0
- package/package.json +80 -0
package/dist/embedder.js
ADDED
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import { pipeline } from '@huggingface/transformers';
|
|
2
|
+
import { createHash } from 'crypto';
|
|
3
|
+
import { config } from './config.js';
|
|
4
|
+
import { handleError, ErrorCategory, ErrorSeverity, safeExecute } from './error-handler.js';
|
|
5
|
+
/**
|
|
6
|
+
* List of supported embedding models
|
|
7
|
+
*/
|
|
8
|
+
const SUPPORTED_MODELS = [
|
|
9
|
+
'sentence-transformers/all-MiniLM-L6-v2',
|
|
10
|
+
'Xenova/all-mpnet-base-v2'
|
|
11
|
+
];
|
|
12
|
+
/**
|
|
13
|
+
* Embedding engine using transformers.js for generating embeddings
|
|
14
|
+
*/
|
|
15
|
+
export class EmbeddingEngine {
|
|
16
|
+
model = null;
|
|
17
|
+
modelVersion = null;
|
|
18
|
+
modelName;
|
|
19
|
+
batchSize;
|
|
20
|
+
constructor(modelName, batchSize) {
|
|
21
|
+
this.modelName = modelName || config.embedding_model;
|
|
22
|
+
this.batchSize = batchSize || config.batch_size;
|
|
23
|
+
// Validate that the model is supported
|
|
24
|
+
if (!SUPPORTED_MODELS.includes(this.modelName)) {
|
|
25
|
+
throw new Error(`Unsupported model: ${this.modelName}\n` +
|
|
26
|
+
`Supported models: ${SUPPORTED_MODELS.join(', ')}`);
|
|
27
|
+
}
|
|
28
|
+
console.log(`🤖 EmbeddingEngine initialized with model: ${this.modelName}, batchSize: ${this.batchSize}`);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Load the embedding model
|
|
32
|
+
* @throws {Error} If model loading fails
|
|
33
|
+
*/
|
|
34
|
+
async loadModel() {
|
|
35
|
+
await safeExecute(async () => {
|
|
36
|
+
console.log(`Loading embedding model: ${this.modelName}`);
|
|
37
|
+
// Initialize the feature extraction pipeline
|
|
38
|
+
// Let transformers.js handle model caching automatically
|
|
39
|
+
try {
|
|
40
|
+
this.model = await pipeline('feature-extraction', this.modelName, {
|
|
41
|
+
cache_dir: config.model_cache_path,
|
|
42
|
+
local_files_only: false,
|
|
43
|
+
dtype: 'fp32' // Explicitly specify dtype to suppress warning
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
// Enhanced error handling for model download failures
|
|
48
|
+
if (error instanceof Error && (error.message.includes('network') ||
|
|
49
|
+
error.message.includes('download') ||
|
|
50
|
+
error.message.includes('fetch') ||
|
|
51
|
+
error.message.includes('ENOTFOUND') ||
|
|
52
|
+
error.message.includes('ECONNREFUSED') ||
|
|
53
|
+
error.message.includes('timeout'))) {
|
|
54
|
+
throw new Error(`Failed to download model '${this.modelName}'. ` +
|
|
55
|
+
`Check your internet connection or see models/README.md for offline setup instructions.`);
|
|
56
|
+
}
|
|
57
|
+
throw error;
|
|
58
|
+
}
|
|
59
|
+
// Generate model version hash
|
|
60
|
+
this.modelVersion = this.generateModelVersion();
|
|
61
|
+
console.log(`Model loaded successfully. Version: ${this.modelVersion}`);
|
|
62
|
+
}, 'Model Loading', {
|
|
63
|
+
category: ErrorCategory.MODEL,
|
|
64
|
+
severity: ErrorSeverity.FATAL,
|
|
65
|
+
exitCode: 6
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Generate embeddings for a batch of texts
|
|
70
|
+
* @param texts - Array of text strings to embed
|
|
71
|
+
* @returns Promise resolving to array of embedding results
|
|
72
|
+
*/
|
|
73
|
+
async embedBatch(texts) {
|
|
74
|
+
if (!this.model) {
|
|
75
|
+
throw new Error('Model not loaded. Call loadModel() first.');
|
|
76
|
+
}
|
|
77
|
+
if (texts.length === 0) {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
// Split into smaller batches based on configured batch size
|
|
81
|
+
const results = [];
|
|
82
|
+
for (let i = 0; i < texts.length; i += this.batchSize) {
|
|
83
|
+
const batch = texts.slice(i, i + this.batchSize);
|
|
84
|
+
const batchResults = await this.processBatchWithErrorHandling(batch, i);
|
|
85
|
+
results.push(...batchResults);
|
|
86
|
+
}
|
|
87
|
+
return results;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Process a single batch with error handling for individual chunks
|
|
91
|
+
* @param batch - Array of text strings in this batch
|
|
92
|
+
* @param startIndex - Starting index for this batch in the original array
|
|
93
|
+
* @returns Promise resolving to array of embedding results
|
|
94
|
+
*/
|
|
95
|
+
async processBatchWithErrorHandling(batch, startIndex) {
|
|
96
|
+
return await safeExecute(async () => {
|
|
97
|
+
// Try to process the entire batch first
|
|
98
|
+
const embeddings = await this.model(batch, {
|
|
99
|
+
pooling: 'mean',
|
|
100
|
+
normalize: true
|
|
101
|
+
});
|
|
102
|
+
// Convert to EmbeddingResult format
|
|
103
|
+
const results = [];
|
|
104
|
+
const embeddingData = embeddings.tolist();
|
|
105
|
+
for (let i = 0; i < batch.length; i++) {
|
|
106
|
+
const embedding_id = this.generateEmbeddingId(batch[i], startIndex + i);
|
|
107
|
+
const vector = new Float32Array(embeddingData[i]);
|
|
108
|
+
results.push({
|
|
109
|
+
embedding_id,
|
|
110
|
+
vector
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return results;
|
|
114
|
+
}, `Batch Embedding (${batch.length} chunks)`, {
|
|
115
|
+
category: ErrorCategory.EMBEDDING,
|
|
116
|
+
severity: ErrorSeverity.ERROR,
|
|
117
|
+
skipError: true,
|
|
118
|
+
fallbackValue: []
|
|
119
|
+
}) || await this.fallbackToIndividualProcessing(batch, startIndex);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Fallback to individual chunk processing when batch fails
|
|
123
|
+
*/
|
|
124
|
+
async fallbackToIndividualProcessing(batch, startIndex) {
|
|
125
|
+
handleError(`Batch processing failed for ${batch.length} chunks, falling back to individual processing`, 'Embedding Batch Processing', {
|
|
126
|
+
category: ErrorCategory.EMBEDDING,
|
|
127
|
+
severity: ErrorSeverity.WARNING,
|
|
128
|
+
skipError: true
|
|
129
|
+
});
|
|
130
|
+
const results = [];
|
|
131
|
+
for (let i = 0; i < batch.length; i++) {
|
|
132
|
+
const singleResult = await safeExecute(() => this.processSingleChunk(batch[i], startIndex + i), `Individual Chunk Embedding (${startIndex + i})`, {
|
|
133
|
+
category: ErrorCategory.EMBEDDING,
|
|
134
|
+
severity: ErrorSeverity.WARNING,
|
|
135
|
+
skipError: true
|
|
136
|
+
});
|
|
137
|
+
if (singleResult) {
|
|
138
|
+
results.push(singleResult);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return results;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Process a single chunk with error handling
|
|
145
|
+
* @param text - Text to embed
|
|
146
|
+
* @param index - Index of this chunk
|
|
147
|
+
* @returns Promise resolving to embedding result or null if failed
|
|
148
|
+
*/
|
|
149
|
+
async processSingleChunk(text, index) {
|
|
150
|
+
try {
|
|
151
|
+
const embeddings = await this.model([text], {
|
|
152
|
+
pooling: 'mean',
|
|
153
|
+
normalize: true
|
|
154
|
+
});
|
|
155
|
+
const embeddingData = embeddings.tolist();
|
|
156
|
+
const embedding_id = this.generateEmbeddingId(text, index);
|
|
157
|
+
const vector = new Float32Array(embeddingData[0]);
|
|
158
|
+
return {
|
|
159
|
+
embedding_id,
|
|
160
|
+
vector
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
// Return null to indicate failure
|
|
165
|
+
throw error;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Generate embedding for a single text
|
|
170
|
+
* @param text - Text string to embed
|
|
171
|
+
* @returns Promise resolving to embedding result
|
|
172
|
+
*/
|
|
173
|
+
async embedSingle(text) {
|
|
174
|
+
const results = await this.embedBatch([text]);
|
|
175
|
+
if (results.length === 0) {
|
|
176
|
+
throw new Error('Failed to generate embedding for single text');
|
|
177
|
+
}
|
|
178
|
+
return results[0];
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Generate embeddings for document chunks with progress logging
|
|
182
|
+
* Optimized for large document ingestion with batch processing
|
|
183
|
+
* @param chunks - Array of text chunks from documents
|
|
184
|
+
* @returns Promise resolving to array of embedding results
|
|
185
|
+
*/
|
|
186
|
+
async embedDocumentBatch(chunks) {
|
|
187
|
+
if (!this.model) {
|
|
188
|
+
throw new Error('Model not loaded. Call loadModel() first.');
|
|
189
|
+
}
|
|
190
|
+
if (chunks.length === 0) {
|
|
191
|
+
return [];
|
|
192
|
+
}
|
|
193
|
+
console.log(`Processing ${chunks.length} chunk${chunks.length === 1 ? '' : 's'} in batches of ${this.batchSize}...`);
|
|
194
|
+
const results = [];
|
|
195
|
+
const totalBatches = Math.ceil(chunks.length / this.batchSize);
|
|
196
|
+
let processedChunks = 0;
|
|
197
|
+
let skippedChunks = 0;
|
|
198
|
+
for (let batchIndex = 0; batchIndex < totalBatches; batchIndex++) {
|
|
199
|
+
const startIdx = batchIndex * this.batchSize;
|
|
200
|
+
const endIdx = Math.min(startIdx + this.batchSize, chunks.length);
|
|
201
|
+
const batch = chunks.slice(startIdx, endIdx);
|
|
202
|
+
try {
|
|
203
|
+
const batchResults = await this.processBatchWithErrorHandling(batch, startIdx);
|
|
204
|
+
results.push(...batchResults);
|
|
205
|
+
processedChunks += batchResults.length;
|
|
206
|
+
skippedChunks += (batch.length - batchResults.length);
|
|
207
|
+
// Progress logging - more frequent updates for better user experience
|
|
208
|
+
const progressInterval = Math.max(1, Math.floor(totalBatches / 20)); // Show progress every 5%
|
|
209
|
+
if ((batchIndex + 1) % progressInterval === 0 || batchIndex === totalBatches - 1) {
|
|
210
|
+
const percentage = Math.round(((batchIndex + 1) / totalBatches) * 100);
|
|
211
|
+
console.log(`Processed ${processedChunks} of ${chunks.length} chunks (${percentage}%)${skippedChunks > 0 ? ` - ${skippedChunks} skipped` : ''}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
console.error(`Failed to process batch ${batchIndex + 1}/${totalBatches}:`, error instanceof Error ? error.message : String(error));
|
|
216
|
+
skippedChunks += batch.length;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (skippedChunks > 0) {
|
|
220
|
+
console.log(`✓ Embedding complete: ${processedChunks} successful, ${skippedChunks} skipped due to errors`);
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
console.log(`✓ Embedding complete: ${processedChunks} chunks processed successfully`);
|
|
224
|
+
}
|
|
225
|
+
return results;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Get the current model version identifier
|
|
229
|
+
* @returns Model version string
|
|
230
|
+
*/
|
|
231
|
+
getModelVersion() {
|
|
232
|
+
if (!this.modelVersion) {
|
|
233
|
+
throw new Error('Model not loaded. Call loadModel() first.');
|
|
234
|
+
}
|
|
235
|
+
return this.modelVersion;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Check if the model is loaded
|
|
239
|
+
* @returns True if model is loaded
|
|
240
|
+
*/
|
|
241
|
+
isLoaded() {
|
|
242
|
+
return this.model !== null;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Get the model name
|
|
246
|
+
* @returns Model name string
|
|
247
|
+
*/
|
|
248
|
+
getModelName() {
|
|
249
|
+
return this.modelName;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Get the batch size
|
|
253
|
+
* @returns Batch size number
|
|
254
|
+
*/
|
|
255
|
+
getBatchSize() {
|
|
256
|
+
return this.batchSize;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Generate a deterministic model version identifier
|
|
260
|
+
* Uses model name and configuration for consistent versioning
|
|
261
|
+
* @returns Model version string
|
|
262
|
+
*/
|
|
263
|
+
generateModelVersion() {
|
|
264
|
+
// Create a deterministic hash based on model name and configuration
|
|
265
|
+
// This ensures the same model configuration always produces the same version
|
|
266
|
+
const configData = JSON.stringify({
|
|
267
|
+
model: this.modelName,
|
|
268
|
+
// Add other relevant config that affects embeddings
|
|
269
|
+
quantized: false,
|
|
270
|
+
revision: 'main'
|
|
271
|
+
});
|
|
272
|
+
const hash = createHash('sha256').update(configData).digest('hex').substring(0, 16);
|
|
273
|
+
return `${this.modelName.replace('/', '_')}_${hash}`;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Generate a deterministic embedding ID for a text chunk
|
|
277
|
+
* @param text - The text content
|
|
278
|
+
* @param index - Index in the batch
|
|
279
|
+
* @returns Deterministic embedding ID
|
|
280
|
+
*/
|
|
281
|
+
generateEmbeddingId(text, index) {
|
|
282
|
+
// Create deterministic ID based on content hash only
|
|
283
|
+
// This ensures the same text always gets the same ID regardless of processing order
|
|
284
|
+
const contentHash = createHash('sha256').update(text.trim()).digest('hex');
|
|
285
|
+
return contentHash.substring(0, 32);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Singleton instance for the embedding engine
|
|
290
|
+
* Ensures model is loaded only once across the application
|
|
291
|
+
*/
|
|
292
|
+
let embeddingEngineInstance = null;
|
|
293
|
+
/**
|
|
294
|
+
* Get the singleton embedding engine instance
|
|
295
|
+
* @param modelName - Optional model name override
|
|
296
|
+
* @param batchSize - Optional batch size override
|
|
297
|
+
* @returns EmbeddingEngine instance
|
|
298
|
+
*/
|
|
299
|
+
export function getEmbeddingEngine(modelName, batchSize) {
|
|
300
|
+
// Always create a new instance if specific parameters are provided
|
|
301
|
+
// This ensures we don't use cached instances with wrong configuration
|
|
302
|
+
if (modelName || batchSize) {
|
|
303
|
+
embeddingEngineInstance = new EmbeddingEngine(modelName, batchSize);
|
|
304
|
+
}
|
|
305
|
+
else if (!embeddingEngineInstance) {
|
|
306
|
+
embeddingEngineInstance = new EmbeddingEngine();
|
|
307
|
+
}
|
|
308
|
+
return embeddingEngineInstance;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Initialize the embedding engine and load the model
|
|
312
|
+
* @param modelName - Optional model name override
|
|
313
|
+
* @param batchSize - Optional batch size override
|
|
314
|
+
* @returns Promise resolving to the loaded embedding engine
|
|
315
|
+
*/
|
|
316
|
+
export async function initializeEmbeddingEngine(modelName, batchSize) {
|
|
317
|
+
const engine = getEmbeddingEngine(modelName, batchSize);
|
|
318
|
+
if (!engine.isLoaded()) {
|
|
319
|
+
await engine.loadModel();
|
|
320
|
+
}
|
|
321
|
+
return engine;
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=embedder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedder.js","sourceRoot":"","sources":["../src/embedder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAe,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGzG;;GAEG;AACH,MAAM,gBAAgB,GAAG;IACvB,wCAAwC;IACxC,0BAA0B;CAC3B,CAAC;AAEF;;GAEG;AACH,MAAM,OAAO,eAAe;IAClB,KAAK,GAAe,IAAI,CAAC;IACzB,YAAY,GAAkB,IAAI,CAAC;IAC1B,SAAS,CAAS;IAClB,SAAS,CAAS;IAEnC,YAAY,SAAkB,EAAE,SAAkB;QAChD,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,MAAM,CAAC,eAAe,CAAC;QACrD,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC;QAEhD,uCAAuC;QACvC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,CAAC,SAAS,IAAI;gBACxC,qBAAqB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACnD,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,8CAA8C,IAAI,CAAC,SAAS,gBAAgB,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC5G,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS;QACb,MAAM,WAAW,CACf,KAAK,IAAI,EAAE;YACT,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;YAE1D,6CAA6C;YAC7C,yDAAyD;YACzD,IAAI,CAAC;gBACH,IAAI,CAAC,KAAK,GAAG,MAAM,QAAQ,CAAC,oBAAoB,EAAE,IAAI,CAAC,SAAS,EAAE;oBAChE,SAAS,EAAE,MAAM,CAAC,gBAAgB;oBAClC,gBAAgB,EAAE,KAAK;oBACvB,KAAK,EAAE,MAAM,CAAC,+CAA+C;iBAC9D,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,sDAAsD;gBACtD,IAAI,KAAK,YAAY,KAAK,IAAI,CAC5B,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;oBACjC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;oBAClC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;oBAC/B,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;oBACnC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;oBACtC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAClC,EAAE,CAAC;oBACF,MAAM,IAAI,KAAK,CACb,6BAA6B,IAAI,CAAC,SAAS,KAAK;wBAChD,wFAAwF,CACzF,CAAC;gBACJ,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YAED,8BAA8B;YAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAEhD,OAAO,CAAC,GAAG,CAAC,uCAAuC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAC1E,CAAC,EACD,eAAe,EACf;YACE,QAAQ,EAAE,aAAa,CAAC,KAAK;YAC7B,QAAQ,EAAE,aAAa,CAAC,KAAK;YAC7B,QAAQ,EAAE,CAAC;SACZ,CACF,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,4DAA4D;QAC5D,MAAM,OAAO,GAAsB,EAAE,CAAC;QAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;YACjD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,6BAA6B,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,6BAA6B,CAAC,KAAe,EAAE,UAAkB;QAC7E,OAAO,MAAM,WAAW,CACtB,KAAK,IAAI,EAAE;YACT,wCAAwC;YACxC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAM,CAAC,KAAK,EAAE;gBAC1C,OAAO,EAAE,MAAM;gBACf,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YAEH,oCAAoC;YACpC,MAAM,OAAO,GAAsB,EAAE,CAAC;YACtC,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;YAE1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;gBACxE,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;gBAElD,OAAO,CAAC,IAAI,CAAC;oBACX,YAAY;oBACZ,MAAM;iBACP,CAAC,CAAC;YACL,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC,EACD,oBAAoB,KAAK,CAAC,MAAM,UAAU,EAC1C;YACE,QAAQ,EAAE,aAAa,CAAC,SAAS;YACjC,QAAQ,EAAE,aAAa,CAAC,KAAK;YAC7B,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,EAAE;SAClB,CACF,IAAI,MAAM,IAAI,CAAC,8BAA8B,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACpE,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,8BAA8B,CAAC,KAAe,EAAE,UAAkB;QAC9E,WAAW,CACT,+BAA+B,KAAK,CAAC,MAAM,gDAAgD,EAC3F,4BAA4B,EAC5B;YACE,QAAQ,EAAE,aAAa,CAAC,SAAS;YACjC,QAAQ,EAAE,aAAa,CAAC,OAAO;YAC/B,SAAS,EAAE,IAAI;SAChB,CACF,CAAC;QAEF,MAAM,OAAO,GAAsB,EAAE,CAAC;QAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,YAAY,GAAG,MAAM,WAAW,CACpC,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,EACvD,+BAA+B,UAAU,GAAG,CAAC,GAAG,EAChD;gBACE,QAAQ,EAAE,aAAa,CAAC,SAAS;gBACjC,QAAQ,EAAE,aAAa,CAAC,OAAO;gBAC/B,SAAS,EAAE,IAAI;aAChB,CACF,CAAC;YAEF,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,kBAAkB,CAAC,IAAY,EAAE,KAAa;QAC1D,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAM,CAAC,CAAC,IAAI,CAAC,EAAE;gBAC3C,OAAO,EAAE,MAAM;gBACf,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YAEH,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;YAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YAElD,OAAO;gBACL,YAAY;gBACZ,MAAM;aACP,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kCAAkC;YAClC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW,CAAC,IAAY;QAC5B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,kBAAkB,CAAC,MAAgB;QACvC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,kBAAkB,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC;QAErH,MAAM,OAAO,GAAsB,EAAE,CAAC;QACtC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/D,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,YAAY,EAAE,UAAU,EAAE,EAAE,CAAC;YACjE,MAAM,QAAQ,GAAG,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;YAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAClE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAE7C,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,6BAA6B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAC/E,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;gBAC9B,eAAe,IAAI,YAAY,CAAC,MAAM,CAAC;gBACvC,aAAa,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;gBAEtD,sEAAsE;gBACtE,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,yBAAyB;gBAC9F,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,gBAAgB,KAAK,CAAC,IAAI,UAAU,KAAK,YAAY,GAAG,CAAC,EAAE,CAAC;oBACjF,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC;oBACvE,OAAO,CAAC,GAAG,CAAC,aAAa,eAAe,OAAO,MAAM,CAAC,MAAM,YAAY,UAAU,KAAK,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,aAAa,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACnJ,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,UAAU,GAAG,CAAC,IAAI,YAAY,GAAG,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACpI,aAAa,IAAI,KAAK,CAAC,MAAM,CAAC;YAChC,CAAC;QACH,CAAC;QAED,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,yBAAyB,eAAe,gBAAgB,aAAa,wBAAwB,CAAC,CAAC;QAC7G,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,yBAAyB,eAAe,gCAAgC,CAAC,CAAC;QACxF,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACH,eAAe;QACb,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACK,oBAAoB;QAC1B,oEAAoE;QACpE,6EAA6E;QAC7E,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;YAChC,KAAK,EAAE,IAAI,CAAC,SAAS;YACrB,oDAAoD;YACpD,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,MAAM;SACjB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpF,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IACvD,CAAC;IAED;;;;;OAKG;IACK,mBAAmB,CAAC,IAAY,EAAE,KAAa;QACrD,qDAAqD;QACrD,oFAAoF;QACpF,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3E,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC;CACF;AAED;;;GAGG;AACH,IAAI,uBAAuB,GAA2B,IAAI,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,SAAkB,EAAE,SAAkB;IACvE,mEAAmE;IACnE,sEAAsE;IACtE,IAAI,SAAS,IAAI,SAAS,EAAE,CAAC;QAC3B,uBAAuB,GAAG,IAAI,eAAe,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACtE,CAAC;SAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACpC,uBAAuB,GAAG,IAAI,eAAe,EAAE,CAAC;IAClD,CAAC;IACD,OAAO,uBAAuB,CAAC;AACjC,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,SAAkB,EAAE,SAAkB;IACpF,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAExD,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;QACvB,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized error handling utilities for RAG-lite TS
|
|
3
|
+
* Provides consistent error handling patterns across the application
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Error categories for different types of failures
|
|
7
|
+
*/
|
|
8
|
+
export declare enum ErrorCategory {
|
|
9
|
+
CONFIGURATION = "Configuration",
|
|
10
|
+
DATABASE = "Database",
|
|
11
|
+
MODEL = "Model",
|
|
12
|
+
INDEX = "Index",
|
|
13
|
+
FILE_SYSTEM = "File System",
|
|
14
|
+
EMBEDDING = "Embedding",
|
|
15
|
+
NETWORK = "Network",
|
|
16
|
+
VALIDATION = "Validation",
|
|
17
|
+
GENERAL = "General"
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Error severity levels
|
|
21
|
+
*/
|
|
22
|
+
export declare enum ErrorSeverity {
|
|
23
|
+
FATAL = "FATAL",// System must exit immediately
|
|
24
|
+
ERROR = "ERROR",// Operation failed but system can continue
|
|
25
|
+
WARNING = "WARNING",// Potential issue but operation can continue
|
|
26
|
+
INFO = "INFO"
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Enhanced error class with category and severity
|
|
30
|
+
*/
|
|
31
|
+
export declare class CategorizedError extends Error {
|
|
32
|
+
category: ErrorCategory;
|
|
33
|
+
severity: ErrorSeverity;
|
|
34
|
+
exitCode: number;
|
|
35
|
+
originalError?: Error | undefined;
|
|
36
|
+
constructor(message: string, category: ErrorCategory, severity?: ErrorSeverity, exitCode?: number, originalError?: Error | undefined);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Handle errors with appropriate logging and exit behavior
|
|
40
|
+
* @param error - Error to handle
|
|
41
|
+
* @param context - Context where error occurred
|
|
42
|
+
* @param options - Handling options
|
|
43
|
+
*/
|
|
44
|
+
export declare function handleError(error: Error | string, context: string, options?: {
|
|
45
|
+
category?: ErrorCategory;
|
|
46
|
+
severity?: ErrorSeverity;
|
|
47
|
+
exitCode?: number;
|
|
48
|
+
skipError?: boolean;
|
|
49
|
+
showStack?: boolean;
|
|
50
|
+
}): void;
|
|
51
|
+
/**
|
|
52
|
+
* Wrapper for try-catch blocks with consistent error handling
|
|
53
|
+
* @param operation - Function to execute
|
|
54
|
+
* @param context - Context description
|
|
55
|
+
* @param options - Error handling options
|
|
56
|
+
*/
|
|
57
|
+
export declare function safeExecute<T>(operation: () => Promise<T> | T, context: string, options?: {
|
|
58
|
+
category?: ErrorCategory;
|
|
59
|
+
severity?: ErrorSeverity;
|
|
60
|
+
exitCode?: number;
|
|
61
|
+
skipError?: boolean;
|
|
62
|
+
fallbackValue?: T;
|
|
63
|
+
}): Promise<T | undefined>;
|
|
64
|
+
/**
|
|
65
|
+
* Validate that a condition is true, throw categorized error if not
|
|
66
|
+
* @param condition - Condition to check
|
|
67
|
+
* @param message - Error message if condition fails
|
|
68
|
+
* @param category - Error category
|
|
69
|
+
* @param exitCode - Exit code for fatal errors
|
|
70
|
+
*/
|
|
71
|
+
export declare function assert(condition: boolean, message: string, category?: ErrorCategory, exitCode?: number): asserts condition;
|
|
72
|
+
/**
|
|
73
|
+
* Log progress with error context
|
|
74
|
+
* @param message - Progress message
|
|
75
|
+
* @param current - Current progress value
|
|
76
|
+
* @param total - Total progress value
|
|
77
|
+
*/
|
|
78
|
+
export declare function logProgress(message: string, current?: number, total?: number): void;
|
|
79
|
+
/**
|
|
80
|
+
* Create a categorized error for common scenarios
|
|
81
|
+
*/
|
|
82
|
+
export declare const createError: {
|
|
83
|
+
configuration: (message: string, exitCode?: 3) => CategorizedError;
|
|
84
|
+
database: (message: string, exitCode?: 5) => CategorizedError;
|
|
85
|
+
model: (message: string, exitCode?: 6) => CategorizedError;
|
|
86
|
+
index: (message: string, exitCode?: 7) => CategorizedError;
|
|
87
|
+
fileSystem: (message: string, exitCode?: 4) => CategorizedError;
|
|
88
|
+
embedding: (message: string, severity?: ErrorSeverity) => CategorizedError;
|
|
89
|
+
validation: (message: string, exitCode?: 2) => CategorizedError;
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=error-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../src/error-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,oBAAY,aAAa;IACvB,aAAa,kBAAkB;IAC/B,QAAQ,aAAa;IACrB,KAAK,UAAU;IACf,KAAK,UAAU;IACf,WAAW,gBAAgB;IAC3B,SAAS,cAAc;IACvB,OAAO,YAAY;IACnB,UAAU,eAAe;IACzB,OAAO,YAAY;CACpB;AAED;;GAEG;AACH,oBAAY,aAAa;IACvB,KAAK,UAAU,CAAO,+BAA+B;IACrD,KAAK,UAAU,CAAO,2CAA2C;IACjE,OAAO,YAAY,CAAG,6CAA6C;IACnE,IAAI,SAAS;CACd;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IAGhC,QAAQ,EAAE,aAAa;IACvB,QAAQ,EAAE,aAAa;IACvB,QAAQ,EAAE,MAAM;IAChB,aAAa,CAAC,EAAE,KAAK;gBAJ5B,OAAO,EAAE,MAAM,EACR,QAAQ,EAAE,aAAa,EACvB,QAAQ,GAAE,aAAmC,EAC7C,QAAQ,GAAE,MAAiC,EAC3C,aAAa,CAAC,EAAE,KAAK,YAAA;CAK/B;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,KAAK,GAAG,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CAChB,GACL,IAAI,CAsCN;AA4DD;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAC/B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,CAAC,CAAC;CACd,GACL,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAqBxB;AAED;;;;;;GAMG;AACH,wBAAgB,MAAM,CACpB,SAAS,EAAE,OAAO,EAClB,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,aAAwC,EAClD,QAAQ,GAAE,MAAiC,GAC1C,OAAO,CAAC,SAAS,CAInB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAUnF;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;6BACG,MAAM;wBAGX,MAAM;qBAGT,MAAM;qBAGN,MAAM;0BAGD,MAAM;yBAGP,MAAM;0BAGL,MAAM;CAE7B,CAAC"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized error handling utilities for RAG-lite TS
|
|
3
|
+
* Provides consistent error handling patterns across the application
|
|
4
|
+
*/
|
|
5
|
+
import { EXIT_CODES } from './config.js';
|
|
6
|
+
/**
|
|
7
|
+
* Error categories for different types of failures
|
|
8
|
+
*/
|
|
9
|
+
export var ErrorCategory;
|
|
10
|
+
(function (ErrorCategory) {
|
|
11
|
+
ErrorCategory["CONFIGURATION"] = "Configuration";
|
|
12
|
+
ErrorCategory["DATABASE"] = "Database";
|
|
13
|
+
ErrorCategory["MODEL"] = "Model";
|
|
14
|
+
ErrorCategory["INDEX"] = "Index";
|
|
15
|
+
ErrorCategory["FILE_SYSTEM"] = "File System";
|
|
16
|
+
ErrorCategory["EMBEDDING"] = "Embedding";
|
|
17
|
+
ErrorCategory["NETWORK"] = "Network";
|
|
18
|
+
ErrorCategory["VALIDATION"] = "Validation";
|
|
19
|
+
ErrorCategory["GENERAL"] = "General";
|
|
20
|
+
})(ErrorCategory || (ErrorCategory = {}));
|
|
21
|
+
/**
|
|
22
|
+
* Error severity levels
|
|
23
|
+
*/
|
|
24
|
+
export var ErrorSeverity;
|
|
25
|
+
(function (ErrorSeverity) {
|
|
26
|
+
ErrorSeverity["FATAL"] = "FATAL";
|
|
27
|
+
ErrorSeverity["ERROR"] = "ERROR";
|
|
28
|
+
ErrorSeverity["WARNING"] = "WARNING";
|
|
29
|
+
ErrorSeverity["INFO"] = "INFO"; // Informational message
|
|
30
|
+
})(ErrorSeverity || (ErrorSeverity = {}));
|
|
31
|
+
/**
|
|
32
|
+
* Enhanced error class with category and severity
|
|
33
|
+
*/
|
|
34
|
+
export class CategorizedError extends Error {
|
|
35
|
+
category;
|
|
36
|
+
severity;
|
|
37
|
+
exitCode;
|
|
38
|
+
originalError;
|
|
39
|
+
constructor(message, category, severity = ErrorSeverity.ERROR, exitCode = EXIT_CODES.GENERAL_ERROR, originalError) {
|
|
40
|
+
super(message);
|
|
41
|
+
this.category = category;
|
|
42
|
+
this.severity = severity;
|
|
43
|
+
this.exitCode = exitCode;
|
|
44
|
+
this.originalError = originalError;
|
|
45
|
+
this.name = 'CategorizedError';
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Handle errors with appropriate logging and exit behavior
|
|
50
|
+
* @param error - Error to handle
|
|
51
|
+
* @param context - Context where error occurred
|
|
52
|
+
* @param options - Handling options
|
|
53
|
+
*/
|
|
54
|
+
export function handleError(error, context, options = {}) {
|
|
55
|
+
const { category = ErrorCategory.GENERAL, severity = ErrorSeverity.ERROR, exitCode = EXIT_CODES.GENERAL_ERROR, skipError = false, showStack = false } = options;
|
|
56
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
57
|
+
const timestamp = new Date().toISOString();
|
|
58
|
+
// Format error message based on severity
|
|
59
|
+
const severityPrefix = severity === ErrorSeverity.FATAL ? '🚨' :
|
|
60
|
+
severity === ErrorSeverity.ERROR ? '❌' :
|
|
61
|
+
severity === ErrorSeverity.WARNING ? '⚠️' : 'ℹ️';
|
|
62
|
+
const logMessage = `${severityPrefix} [${timestamp}] ${severity} in ${context} (${category}): ${errorMessage}`;
|
|
63
|
+
if (severity === ErrorSeverity.FATAL || severity === ErrorSeverity.ERROR) {
|
|
64
|
+
console.error(logMessage);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
console.log(logMessage);
|
|
68
|
+
}
|
|
69
|
+
// Show stack trace for debugging if requested
|
|
70
|
+
if (showStack && error instanceof Error && error.stack) {
|
|
71
|
+
console.error('Stack trace:', error.stack);
|
|
72
|
+
}
|
|
73
|
+
// Handle based on severity
|
|
74
|
+
if (severity === ErrorSeverity.FATAL) {
|
|
75
|
+
console.error('\nThe system cannot continue and will exit immediately.');
|
|
76
|
+
provideContextualGuidance(category, exitCode);
|
|
77
|
+
process.exit(exitCode);
|
|
78
|
+
}
|
|
79
|
+
else if (severity === ErrorSeverity.ERROR && !skipError) {
|
|
80
|
+
console.error('Operation failed. See error details above.');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Provide contextual guidance based on error category and exit code
|
|
85
|
+
*/
|
|
86
|
+
function provideContextualGuidance(category, exitCode) {
|
|
87
|
+
console.error('\nTroubleshooting guidance:');
|
|
88
|
+
switch (category) {
|
|
89
|
+
case ErrorCategory.CONFIGURATION:
|
|
90
|
+
console.error('- Check your configuration file for syntax errors');
|
|
91
|
+
console.error('- Ensure all required fields are present and valid');
|
|
92
|
+
console.error('- Verify numeric values are positive numbers');
|
|
93
|
+
break;
|
|
94
|
+
case ErrorCategory.DATABASE:
|
|
95
|
+
console.error('- Try running "raglite rebuild" to fix database issues');
|
|
96
|
+
console.error('- Check that the database file is not locked by another process');
|
|
97
|
+
console.error('- Ensure you have write permissions in the current directory');
|
|
98
|
+
console.error('- Verify sufficient disk space is available');
|
|
99
|
+
break;
|
|
100
|
+
case ErrorCategory.MODEL:
|
|
101
|
+
console.error('- Ensure you have internet connection for model download');
|
|
102
|
+
console.error('- Check available disk space in the models directory');
|
|
103
|
+
console.error('- Try clearing the model cache and downloading again');
|
|
104
|
+
console.error('- Verify your system has sufficient memory (2GB+ recommended)');
|
|
105
|
+
break;
|
|
106
|
+
case ErrorCategory.INDEX:
|
|
107
|
+
console.error('- Try running "raglite rebuild" to recreate the vector index');
|
|
108
|
+
console.error('- Check available disk space for index files');
|
|
109
|
+
console.error('- Ensure the index file is not corrupted or locked');
|
|
110
|
+
break;
|
|
111
|
+
case ErrorCategory.FILE_SYSTEM:
|
|
112
|
+
console.error('- Check that files and directories exist and are accessible');
|
|
113
|
+
console.error('- Verify you have read/write permissions');
|
|
114
|
+
console.error('- Ensure paths are spelled correctly');
|
|
115
|
+
break;
|
|
116
|
+
case ErrorCategory.EMBEDDING:
|
|
117
|
+
console.error('- Check that the embedding model is properly loaded');
|
|
118
|
+
console.error('- Verify input text is not empty or malformed');
|
|
119
|
+
console.error('- Ensure sufficient memory for batch processing');
|
|
120
|
+
break;
|
|
121
|
+
case ErrorCategory.NETWORK:
|
|
122
|
+
console.error('- Check your internet connection');
|
|
123
|
+
console.error('- Verify firewall settings allow model downloads');
|
|
124
|
+
console.error('- Try again later if servers are temporarily unavailable');
|
|
125
|
+
break;
|
|
126
|
+
default:
|
|
127
|
+
console.error('- Check the error message above for specific details');
|
|
128
|
+
console.error('- Try running the command again');
|
|
129
|
+
console.error('- If the problem persists, please report it as a bug');
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Wrapper for try-catch blocks with consistent error handling
|
|
134
|
+
* @param operation - Function to execute
|
|
135
|
+
* @param context - Context description
|
|
136
|
+
* @param options - Error handling options
|
|
137
|
+
*/
|
|
138
|
+
export async function safeExecute(operation, context, options = {}) {
|
|
139
|
+
try {
|
|
140
|
+
return await operation();
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
handleError(error, context, options);
|
|
144
|
+
if (options.fallbackValue !== undefined) {
|
|
145
|
+
return options.fallbackValue;
|
|
146
|
+
}
|
|
147
|
+
if (options.skipError) {
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
// Re-throw if not skipping and no fallback
|
|
151
|
+
if (options.severity !== ErrorSeverity.FATAL) {
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
return undefined; // This won't be reached due to process.exit in FATAL
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Validate that a condition is true, throw categorized error if not
|
|
159
|
+
* @param condition - Condition to check
|
|
160
|
+
* @param message - Error message if condition fails
|
|
161
|
+
* @param category - Error category
|
|
162
|
+
* @param exitCode - Exit code for fatal errors
|
|
163
|
+
*/
|
|
164
|
+
export function assert(condition, message, category = ErrorCategory.VALIDATION, exitCode = EXIT_CODES.GENERAL_ERROR) {
|
|
165
|
+
if (!condition) {
|
|
166
|
+
throw new CategorizedError(message, category, ErrorSeverity.FATAL, exitCode);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Log progress with error context
|
|
171
|
+
* @param message - Progress message
|
|
172
|
+
* @param current - Current progress value
|
|
173
|
+
* @param total - Total progress value
|
|
174
|
+
*/
|
|
175
|
+
export function logProgress(message, current, total) {
|
|
176
|
+
const timestamp = new Date().toISOString();
|
|
177
|
+
let progressMsg = `ℹ️ [${timestamp}] ${message}`;
|
|
178
|
+
if (current !== undefined && total !== undefined) {
|
|
179
|
+
const percentage = Math.round((current / total) * 100);
|
|
180
|
+
progressMsg += ` (${current}/${total} - ${percentage}%)`;
|
|
181
|
+
}
|
|
182
|
+
console.log(progressMsg);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Create a categorized error for common scenarios
|
|
186
|
+
*/
|
|
187
|
+
export const createError = {
|
|
188
|
+
configuration: (message, exitCode = EXIT_CODES.CONFIGURATION_ERROR) => new CategorizedError(message, ErrorCategory.CONFIGURATION, ErrorSeverity.FATAL, exitCode),
|
|
189
|
+
database: (message, exitCode = EXIT_CODES.DATABASE_ERROR) => new CategorizedError(message, ErrorCategory.DATABASE, ErrorSeverity.FATAL, exitCode),
|
|
190
|
+
model: (message, exitCode = EXIT_CODES.MODEL_ERROR) => new CategorizedError(message, ErrorCategory.MODEL, ErrorSeverity.FATAL, exitCode),
|
|
191
|
+
index: (message, exitCode = EXIT_CODES.INDEX_ERROR) => new CategorizedError(message, ErrorCategory.INDEX, ErrorSeverity.FATAL, exitCode),
|
|
192
|
+
fileSystem: (message, exitCode = EXIT_CODES.FILE_NOT_FOUND) => new CategorizedError(message, ErrorCategory.FILE_SYSTEM, ErrorSeverity.FATAL, exitCode),
|
|
193
|
+
embedding: (message, severity = ErrorSeverity.ERROR) => new CategorizedError(message, ErrorCategory.EMBEDDING, severity),
|
|
194
|
+
validation: (message, exitCode = EXIT_CODES.INVALID_ARGUMENTS) => new CategorizedError(message, ErrorCategory.VALIDATION, ErrorSeverity.FATAL, exitCode)
|
|
195
|
+
};
|
|
196
|
+
//# sourceMappingURL=error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../src/error-handler.ts"],"names":[],"mappings":"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"}
|