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.
Files changed (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +240 -0
  3. package/dist/api-errors.d.ts +90 -0
  4. package/dist/api-errors.d.ts.map +1 -0
  5. package/dist/api-errors.js +320 -0
  6. package/dist/api-errors.js.map +1 -0
  7. package/dist/chunker.d.ts +47 -0
  8. package/dist/chunker.d.ts.map +1 -0
  9. package/dist/chunker.js +256 -0
  10. package/dist/chunker.js.map +1 -0
  11. package/dist/cli/indexer.d.ts +11 -0
  12. package/dist/cli/indexer.d.ts.map +1 -0
  13. package/dist/cli/indexer.js +272 -0
  14. package/dist/cli/indexer.js.map +1 -0
  15. package/dist/cli/search.d.ts +7 -0
  16. package/dist/cli/search.d.ts.map +1 -0
  17. package/dist/cli/search.js +206 -0
  18. package/dist/cli/search.js.map +1 -0
  19. package/dist/cli.d.ts +3 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +362 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/config.d.ts +90 -0
  24. package/dist/config.d.ts.map +1 -0
  25. package/dist/config.js +281 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/db.d.ts +90 -0
  28. package/dist/db.d.ts.map +1 -0
  29. package/dist/db.js +340 -0
  30. package/dist/db.js.map +1 -0
  31. package/dist/embedder.d.ts +101 -0
  32. package/dist/embedder.d.ts.map +1 -0
  33. package/dist/embedder.js +323 -0
  34. package/dist/embedder.js.map +1 -0
  35. package/dist/error-handler.d.ts +91 -0
  36. package/dist/error-handler.d.ts.map +1 -0
  37. package/dist/error-handler.js +196 -0
  38. package/dist/error-handler.js.map +1 -0
  39. package/dist/file-processor.d.ts +59 -0
  40. package/dist/file-processor.d.ts.map +1 -0
  41. package/dist/file-processor.js +312 -0
  42. package/dist/file-processor.js.map +1 -0
  43. package/dist/index-manager.d.ts +99 -0
  44. package/dist/index-manager.d.ts.map +1 -0
  45. package/dist/index-manager.js +444 -0
  46. package/dist/index-manager.js.map +1 -0
  47. package/dist/index.d.ts +13 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +21 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/indexer.d.ts +7 -0
  52. package/dist/indexer.d.ts.map +1 -0
  53. package/dist/indexer.js +51 -0
  54. package/dist/indexer.js.map +1 -0
  55. package/dist/ingestion.d.ts +175 -0
  56. package/dist/ingestion.d.ts.map +1 -0
  57. package/dist/ingestion.js +705 -0
  58. package/dist/ingestion.js.map +1 -0
  59. package/dist/mcp-server.d.ts +14 -0
  60. package/dist/mcp-server.d.ts.map +1 -0
  61. package/dist/mcp-server.js +680 -0
  62. package/dist/mcp-server.js.map +1 -0
  63. package/dist/path-manager.d.ts +42 -0
  64. package/dist/path-manager.d.ts.map +1 -0
  65. package/dist/path-manager.js +66 -0
  66. package/dist/path-manager.js.map +1 -0
  67. package/dist/preprocess.d.ts +19 -0
  68. package/dist/preprocess.d.ts.map +1 -0
  69. package/dist/preprocess.js +203 -0
  70. package/dist/preprocess.js.map +1 -0
  71. package/dist/preprocessors/index.d.ts +17 -0
  72. package/dist/preprocessors/index.d.ts.map +1 -0
  73. package/dist/preprocessors/index.js +38 -0
  74. package/dist/preprocessors/index.js.map +1 -0
  75. package/dist/preprocessors/mdx.d.ts +25 -0
  76. package/dist/preprocessors/mdx.d.ts.map +1 -0
  77. package/dist/preprocessors/mdx.js +101 -0
  78. package/dist/preprocessors/mdx.js.map +1 -0
  79. package/dist/preprocessors/mermaid.d.ts +68 -0
  80. package/dist/preprocessors/mermaid.d.ts.map +1 -0
  81. package/dist/preprocessors/mermaid.js +329 -0
  82. package/dist/preprocessors/mermaid.js.map +1 -0
  83. package/dist/preprocessors/registry.d.ts +56 -0
  84. package/dist/preprocessors/registry.d.ts.map +1 -0
  85. package/dist/preprocessors/registry.js +179 -0
  86. package/dist/preprocessors/registry.js.map +1 -0
  87. package/dist/reranker.d.ts +40 -0
  88. package/dist/reranker.d.ts.map +1 -0
  89. package/dist/reranker.js +212 -0
  90. package/dist/reranker.js.map +1 -0
  91. package/dist/resource-manager-demo.d.ts +7 -0
  92. package/dist/resource-manager-demo.d.ts.map +1 -0
  93. package/dist/resource-manager-demo.js +52 -0
  94. package/dist/resource-manager-demo.js.map +1 -0
  95. package/dist/resource-manager.d.ts +129 -0
  96. package/dist/resource-manager.d.ts.map +1 -0
  97. package/dist/resource-manager.js +389 -0
  98. package/dist/resource-manager.js.map +1 -0
  99. package/dist/search-standalone.d.ts +7 -0
  100. package/dist/search-standalone.d.ts.map +1 -0
  101. package/dist/search-standalone.js +117 -0
  102. package/dist/search-standalone.js.map +1 -0
  103. package/dist/search.d.ts +92 -0
  104. package/dist/search.d.ts.map +1 -0
  105. package/dist/search.js +454 -0
  106. package/dist/search.js.map +1 -0
  107. package/dist/test-utils.d.ts +36 -0
  108. package/dist/test-utils.d.ts.map +1 -0
  109. package/dist/test-utils.js +27 -0
  110. package/dist/test-utils.js.map +1 -0
  111. package/dist/tokenizer.d.ts +21 -0
  112. package/dist/tokenizer.d.ts.map +1 -0
  113. package/dist/tokenizer.js +59 -0
  114. package/dist/tokenizer.js.map +1 -0
  115. package/dist/types.d.ts +44 -0
  116. package/dist/types.d.ts.map +1 -0
  117. package/dist/types.js +3 -0
  118. package/dist/types.js.map +1 -0
  119. package/dist/vector-index.d.ts +64 -0
  120. package/dist/vector-index.d.ts.map +1 -0
  121. package/dist/vector-index.js +308 -0
  122. package/dist/vector-index.js.map +1 -0
  123. package/package.json +80 -0
@@ -0,0 +1,40 @@
1
+ import type { SearchResult } from './types.js';
2
+ /**
3
+ * Cross-encoder reranker for improving search result quality
4
+ * Uses a cross-encoder model to rerank initial vector search results
5
+ */
6
+ export declare class CrossEncoderReranker {
7
+ private model;
8
+ private tokenizer;
9
+ private modelName;
10
+ private static readonly FALLBACK_MODELS;
11
+ /**
12
+ * Load the cross-encoder model with graceful fallback
13
+ */
14
+ loadModel(): Promise<void>;
15
+ /**
16
+ * Try to load a specific model
17
+ */
18
+ private tryLoadModel;
19
+ /**
20
+ * Rerank search results using cross-encoder scoring
21
+ * @param query - Original search query
22
+ * @param results - Initial search results from vector search
23
+ * @returns Promise resolving to reranked results
24
+ */
25
+ rerank(query: string, results: SearchResult[]): Promise<SearchResult[]>;
26
+ /**
27
+ * Check if the model is loaded
28
+ */
29
+ isLoaded(): boolean;
30
+ /**
31
+ * Get the model name being used
32
+ */
33
+ getModelName(): string;
34
+ /**
35
+ * Simple text-based reranking using keyword matching and text similarity
36
+ * This is a fallback when cross-encoder models don't work well for the content
37
+ */
38
+ private simpleTextReranking;
39
+ }
40
+ //# sourceMappingURL=reranker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reranker.d.ts","sourceRoot":"","sources":["../src/reranker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C;;;GAGG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,SAAS,CAA2C;IAE5D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAKrC;IAEF;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAuBhC;;OAEG;YACW,YAAY;IAsB1B;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAqE7E;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;CAqF5B"}
@@ -0,0 +1,212 @@
1
+ import { AutoTokenizer, AutoModelForSequenceClassification } from '@huggingface/transformers';
2
+ import { config } from './config.js';
3
+ /**
4
+ * Cross-encoder reranker for improving search result quality
5
+ * Uses a cross-encoder model to rerank initial vector search results
6
+ */
7
+ export class CrossEncoderReranker {
8
+ model = null; // Use any to avoid complex transformers.js typing issues
9
+ tokenizer = null;
10
+ modelName = 'Xenova/ms-marco-MiniLM-L-6-v2'; // Use working model as default
11
+ // Alternative models in case the primary fails
12
+ static FALLBACK_MODELS = [
13
+ 'Xenova/ms-marco-MiniLM-L-6-v2', // Primary - optimized for transformers.js
14
+ 'cross-encoder/ms-marco-MiniLM-L-6-v2', // Original (likely to fail)
15
+ 'cross-encoder/ms-marco-MiniLM-L-2-v2', // Smaller original (likely to fail)
16
+ // Note: sentence-transformers/all-MiniLM-L6-v2 is a bi-encoder, not cross-encoder, so removed
17
+ ];
18
+ /**
19
+ * Load the cross-encoder model with graceful fallback
20
+ */
21
+ async loadModel() {
22
+ // Try primary model first (should work since it's Xenova)
23
+ if (await this.tryLoadModel(this.modelName)) {
24
+ return;
25
+ }
26
+ // Try fallback models if primary fails
27
+ console.warn(`Primary model ${this.modelName} failed, trying fallbacks...`);
28
+ for (const fallbackModel of CrossEncoderReranker.FALLBACK_MODELS) {
29
+ if (fallbackModel === this.modelName)
30
+ continue; // Skip already tried model
31
+ console.warn(`Trying fallback model: ${fallbackModel}`);
32
+ if (await this.tryLoadModel(fallbackModel)) {
33
+ this.modelName = fallbackModel;
34
+ return;
35
+ }
36
+ }
37
+ console.warn('All cross-encoder models failed to load. Reranking will be disabled.');
38
+ this.model = null;
39
+ this.tokenizer = null;
40
+ }
41
+ /**
42
+ * Try to load a specific model
43
+ */
44
+ async tryLoadModel(modelName) {
45
+ try {
46
+ console.log(`Loading cross-encoder model: ${modelName}`);
47
+ // Load model and tokenizer separately for proper cross-encoder usage
48
+ this.model = await AutoModelForSequenceClassification.from_pretrained(modelName, {
49
+ cache_dir: config.model_cache_path,
50
+ dtype: 'fp32' // Suppress dtype warnings
51
+ });
52
+ this.tokenizer = await AutoTokenizer.from_pretrained(modelName, {
53
+ cache_dir: config.model_cache_path
54
+ });
55
+ console.log(`Cross-encoder model loaded successfully: ${modelName}`);
56
+ return true;
57
+ }
58
+ catch (error) {
59
+ console.warn(`Failed to load model ${modelName}: ${error instanceof Error ? error.message : 'Unknown error'}`);
60
+ return false;
61
+ }
62
+ }
63
+ /**
64
+ * Rerank search results using cross-encoder scoring
65
+ * @param query - Original search query
66
+ * @param results - Initial search results from vector search
67
+ * @returns Promise resolving to reranked results
68
+ */
69
+ async rerank(query, results) {
70
+ if (!this.model || !this.tokenizer) {
71
+ throw new Error('Cross-encoder model not loaded. Call loadModel() first.');
72
+ }
73
+ if (results.length === 0) {
74
+ return results;
75
+ }
76
+ try {
77
+ // Prepare queries and documents for proper cross-encoder format
78
+ const queries = results.map(() => query);
79
+ const documents = results.map(result => result.text);
80
+ // Tokenize using the proper cross-encoder format with text_pair
81
+ const features = this.tokenizer(queries, {
82
+ text_pair: documents,
83
+ padding: true,
84
+ truncation: true,
85
+ return_tensors: 'pt'
86
+ });
87
+ // Get model predictions
88
+ const output = await this.model(features);
89
+ // Extract logits - these are the raw relevance scores
90
+ const logits = output.logits;
91
+ // Convert logits to scores and pair with results
92
+ const scores = results.map((result, i) => {
93
+ // For cross-encoders, we typically use the raw logit as the relevance score
94
+ // Higher logits = more relevant
95
+ const rawScore = Array.isArray(logits) ? logits[i] : logits.data[i];
96
+ // Apply sigmoid to convert logit to probability-like score
97
+ const score = 1 / (1 + Math.exp(-rawScore));
98
+ return {
99
+ score: score,
100
+ result: result
101
+ };
102
+ });
103
+ // Check if scores look reasonable
104
+ const maxScore = Math.max(...scores.map(s => s.score));
105
+ const minScore = Math.min(...scores.map(s => s.score));
106
+ const scoreRange = maxScore - minScore;
107
+ // If there's very little variation in scores, fall back to simple reranking
108
+ if (scoreRange < 0.1) {
109
+ console.log(`Cross-encoder scores have low variation (range: ${scoreRange.toFixed(3)}), using simple text reranking`);
110
+ return this.simpleTextReranking(query, results);
111
+ }
112
+ // Sort by cross-encoder scores (descending)
113
+ scores.sort((a, b) => b.score - a.score);
114
+ // Update results with new scores and return reranked results
115
+ return scores.map(item => ({
116
+ ...item.result,
117
+ score: item.score
118
+ }));
119
+ }
120
+ catch (error) {
121
+ console.warn(`Reranking failed, falling back to simple text reranking: ${error instanceof Error ? error.message : 'Unknown error'}`);
122
+ return this.simpleTextReranking(query, results);
123
+ }
124
+ }
125
+ /**
126
+ * Check if the model is loaded
127
+ */
128
+ isLoaded() {
129
+ return this.model !== null && this.tokenizer !== null;
130
+ }
131
+ /**
132
+ * Get the model name being used
133
+ */
134
+ getModelName() {
135
+ return this.modelName;
136
+ }
137
+ /**
138
+ * Simple text-based reranking using keyword matching and text similarity
139
+ * This is a fallback when cross-encoder models don't work well for the content
140
+ */
141
+ simpleTextReranking(query, results) {
142
+ const queryLower = query.toLowerCase();
143
+ const queryWords = queryLower.split(/\s+/).filter(word => word.length > 2);
144
+ const rerankedResults = results.map(result => {
145
+ const textLower = result.text.toLowerCase();
146
+ const titleLower = result.document.title?.toLowerCase() || '';
147
+ let score = result.score; // Start with vector search score
148
+ let bonus = 0;
149
+ // Bonus for exact query matches
150
+ if (textLower.includes(queryLower)) {
151
+ bonus += 0.15;
152
+ }
153
+ // Bonus for title matches
154
+ if (titleLower.includes(queryLower)) {
155
+ bonus += 0.1;
156
+ }
157
+ // Special handling for "What is X?" queries
158
+ if (queryLower.startsWith('what is')) {
159
+ const subject = queryLower.replace('what is', '').trim().replace(/\?$/, '');
160
+ // Major bonus for definitional patterns like "X is a/an..."
161
+ const definitionPatterns = [
162
+ `${subject} is a`,
163
+ `${subject} is an`,
164
+ `${subject} is the`,
165
+ `${subject} provides`,
166
+ `${subject} helps`
167
+ ];
168
+ for (const pattern of definitionPatterns) {
169
+ if (textLower.includes(pattern)) {
170
+ bonus += 0.3; // Large bonus for definitional content
171
+ break;
172
+ }
173
+ }
174
+ }
175
+ // Bonus for individual word matches
176
+ let wordMatches = 0;
177
+ for (const word of queryWords) {
178
+ if (textLower.includes(word)) {
179
+ wordMatches++;
180
+ }
181
+ if (titleLower.includes(word)) {
182
+ wordMatches += 0.5; // Title matches are worth more
183
+ }
184
+ }
185
+ // Normalize word match bonus
186
+ if (queryWords.length > 0) {
187
+ bonus += (wordMatches / queryWords.length) * 0.1;
188
+ }
189
+ // Bonus for content that appears to be introductory/definitional
190
+ const introKeywords = ['introduction', 'what is', 'overview', 'about', 'definition', '# introduction'];
191
+ for (const keyword of introKeywords) {
192
+ if (textLower.includes(keyword) || titleLower.includes(keyword)) {
193
+ bonus += 0.08;
194
+ }
195
+ }
196
+ // Extra bonus for files with "intro" in the path
197
+ if (result.document.source?.toLowerCase().includes('intro')) {
198
+ bonus += 0.1;
199
+ }
200
+ // Apply bonus but cap the total score at 1.0
201
+ const newScore = Math.min(1.0, score + bonus);
202
+ return {
203
+ ...result,
204
+ score: newScore
205
+ };
206
+ });
207
+ // Sort by new scores (descending)
208
+ rerankedResults.sort((a, b) => b.score - a.score);
209
+ return rerankedResults;
210
+ }
211
+ }
212
+ //# sourceMappingURL=reranker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reranker.js","sourceRoot":"","sources":["../src/reranker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Demo script showing ResourceManager usage
3
+ * This demonstrates the internal resource management system
4
+ */
5
+ declare function demonstrateResourceManager(): Promise<void>;
6
+ export { demonstrateResourceManager };
7
+ //# sourceMappingURL=resource-manager-demo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-manager-demo.d.ts","sourceRoot":"","sources":["../src/resource-manager-demo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,iBAAe,0BAA0B,kBA4CxC;AAOD,OAAO,EAAE,0BAA0B,EAAE,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Demo script showing ResourceManager usage
3
+ * This demonstrates the internal resource management system
4
+ */
5
+ import { ResourceManager } from './resource-manager.js';
6
+ import { CommonErrors } from './api-errors.js';
7
+ async function demonstrateResourceManager() {
8
+ console.log('=== ResourceManager Demo ===\n');
9
+ // 1. Create ResourceManager instances
10
+ console.log('1. Creating ResourceManager instances...');
11
+ const manager1 = ResourceManager.getInstance({ basePath: './demo-data' });
12
+ const manager2 = ResourceManager.getInstance({ basePath: './demo-data' }); // Same config
13
+ const manager3 = ResourceManager.getInstance({ basePath: './other-data' }); // Different config
14
+ console.log(` - manager1 === manager2: ${manager1 === manager2} (singleton pattern)`);
15
+ console.log(` - manager1 === manager3: ${manager1 === manager3} (different configs)`);
16
+ console.log(` - Active instances: ${ResourceManager.getActiveInstanceCount()}`);
17
+ // 2. Check if instances exist
18
+ console.log('\n2. Checking instance existence...');
19
+ console.log(` - Has instance for './demo-data': ${ResourceManager.hasInstance({ basePath: './demo-data' })}`);
20
+ console.log(` - Has instance for './nonexistent': ${ResourceManager.hasInstance({ basePath: './nonexistent' })}`);
21
+ // 3. Validate search files (will fail since files don't exist)
22
+ console.log('\n3. Validating search files...');
23
+ try {
24
+ await manager1.validateSearchFiles();
25
+ console.log(' - Validation passed');
26
+ }
27
+ catch (error) {
28
+ console.log(` - Validation failed (expected): ${error instanceof Error ? error.message.split('\n')[0] : 'Unknown error'}`);
29
+ }
30
+ // 4. Demonstrate error handling
31
+ console.log('\n4. Demonstrating error handling...');
32
+ try {
33
+ throw CommonErrors.NO_DOCUMENTS_INGESTED;
34
+ }
35
+ catch (error) {
36
+ if (error instanceof Error) {
37
+ console.log(` - Error caught: ${error.message}`);
38
+ }
39
+ }
40
+ // 5. Cleanup resources
41
+ console.log('\n5. Cleaning up resources...');
42
+ console.log(` - Before cleanup: ${ResourceManager.getActiveInstanceCount()} instances`);
43
+ await ResourceManager.cleanupAll();
44
+ console.log(` - After cleanup: ${ResourceManager.getActiveInstanceCount()} instances`);
45
+ console.log('\n=== Demo Complete ===');
46
+ }
47
+ // Run the demo if this file is executed directly
48
+ if (process.argv[1] && process.argv[1].endsWith('resource-manager-demo.js')) {
49
+ demonstrateResourceManager().catch(console.error);
50
+ }
51
+ export { demonstrateResourceManager };
52
+ //# sourceMappingURL=resource-manager-demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-manager-demo.js","sourceRoot":"","sources":["../src/resource-manager-demo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,129 @@
1
+ import { DatabaseConnection } from './db.js';
2
+ import { IndexManager } from './index-manager.js';
3
+ import { EmbeddingEngine } from './embedder.js';
4
+ /**
5
+ * Configuration for resource initialization
6
+ */
7
+ export interface ResourceConfig {
8
+ basePath?: string;
9
+ dbPath?: string;
10
+ indexPath?: string;
11
+ modelName?: string;
12
+ batchSize?: number;
13
+ skipModelCheck?: boolean;
14
+ }
15
+ /**
16
+ * Managed resources container
17
+ */
18
+ export interface ManagedResources {
19
+ database: DatabaseConnection;
20
+ indexManager: IndexManager;
21
+ embedder: EmbeddingEngine;
22
+ }
23
+ /**
24
+ * Internal ResourceManager for automatic initialization and cleanup
25
+ * Implements singleton pattern for resource sharing across instances
26
+ * Requirements: 5.1, 5.4 - Automatic resource management and lifecycle handling
27
+ */
28
+ export declare class ResourceManager {
29
+ private static instances;
30
+ private static cleanupHandlersSet;
31
+ private database;
32
+ private indexManager;
33
+ private embedder;
34
+ private isInitialized;
35
+ private initializationPromise;
36
+ private readonly resourceKey;
37
+ private readonly config;
38
+ /**
39
+ * Get or create ResourceManager instance for the given configuration
40
+ * Implements singleton pattern for resource sharing
41
+ * @param config - Resource configuration
42
+ * @returns ResourceManager instance
43
+ */
44
+ static getInstance(config?: ResourceConfig): ResourceManager;
45
+ /**
46
+ * Resolve and normalize configuration with defaults
47
+ */
48
+ private static resolveConfig;
49
+ /**
50
+ * Private constructor - use getInstance() instead
51
+ */
52
+ private constructor();
53
+ /**
54
+ * Initialize all resources with lazy loading
55
+ * Requirements: 5.1 - Automatic resource management
56
+ */
57
+ initialize(): Promise<ManagedResources>;
58
+ /**
59
+ * Perform the actual initialization steps
60
+ */
61
+ private performInitialization;
62
+ /**
63
+ * Initialize database connection and schema
64
+ */
65
+ private initializeDatabase;
66
+ /**
67
+ * Initialize embedder based on stored model info or configuration
68
+ * Requirements: 5.1 - Embedder initialization based on stored model info from database
69
+ */
70
+ private initializeEmbedder;
71
+ /**
72
+ * Initialize index manager with model compatibility validation
73
+ */
74
+ private initializeIndexManager;
75
+ /**
76
+ * Get initialized resources
77
+ * @throws Error if resources are not initialized
78
+ */
79
+ private getResources;
80
+ /**
81
+ * Get database connection (lazy initialization)
82
+ */
83
+ getDatabase(): Promise<DatabaseConnection>;
84
+ /**
85
+ * Get index manager (lazy initialization)
86
+ */
87
+ getIndexManager(): Promise<IndexManager>;
88
+ /**
89
+ * Get embedder (lazy initialization)
90
+ */
91
+ getEmbedder(): Promise<EmbeddingEngine>;
92
+ /**
93
+ * Check if resources are initialized
94
+ */
95
+ isResourcesInitialized(): boolean;
96
+ /**
97
+ * Validate that required files exist for search operations
98
+ * @throws ResourceError with user-friendly message if files are missing
99
+ */
100
+ validateSearchFiles(): Promise<void>;
101
+ /**
102
+ * Set up automatic cleanup handlers
103
+ * Requirements: 5.5 - Automatic cleanup on process exit
104
+ */
105
+ private setupCleanupHandlers;
106
+ /**
107
+ * Synchronous cleanup for process exit handlers
108
+ */
109
+ private performSyncCleanup;
110
+ /**
111
+ * Clean up all resources with proper error handling
112
+ * Requirements: 5.5 - Proper resource disposal and error handling during cleanup
113
+ */
114
+ cleanup(): Promise<void>;
115
+ /**
116
+ * Clean up all instances (for testing or shutdown)
117
+ * Requirements: 5.5 - Ensure resources are properly disposed when no longer needed
118
+ */
119
+ static cleanupAll(): Promise<void>;
120
+ /**
121
+ * Get the number of active resource instances
122
+ */
123
+ static getActiveInstanceCount(): number;
124
+ /**
125
+ * Check if a specific resource configuration is already managed
126
+ */
127
+ static hasInstance(config: ResourceConfig): boolean;
128
+ }
129
+ //# sourceMappingURL=resource-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-manager.d.ts","sourceRoot":"","sources":["../src/resource-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAA0E,MAAM,SAAS,CAAC;AACrH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAA6B,MAAM,eAAe,CAAC;AAM3E;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED;;;;GAIG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,SAAS,CAAsC;IAC9D,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAS;IAE1C,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,qBAAqB,CAA8B;IAE3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAElD;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,MAAM,GAAE,cAAmB,GAAG,eAAe;IAYhE;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAa5B;;OAEG;IACH,OAAO;IAQP;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAgB7C;;OAEG;YACW,qBAAqB;IAyBnC;;OAEG;YACW,kBAAkB;IAUhC;;;OAGG;YACW,kBAAkB;IAyChC;;OAEG;YACW,sBAAsB;IA0BpC;;;OAGG;IACH,OAAO,CAAC,YAAY;IAYpB;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAOhD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,YAAY,CAAC;IAO9C;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC;IAO7C;;OAEG;IACH,sBAAsB,IAAI,OAAO;IAIjC;;;OAGG;IACG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB1C;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA+C5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAqD9B;;;OAGG;WACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBxC;;OAEG;IACH,MAAM,CAAC,sBAAsB,IAAI,MAAM;IAIvC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO;CAKpD"}