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,389 @@
1
+ import { openDatabase, initializeSchema, getStoredModelInfo, setStoredModelInfo } from './db.js';
2
+ import { IndexManager } from './index-manager.js';
3
+ import { initializeEmbeddingEngine } from './embedder.js';
4
+ import { config, getModelDefaults } from './config.js';
5
+ import { ErrorFactory } from './api-errors.js';
6
+ import { join, resolve } from 'path';
7
+ import { existsSync } from 'fs';
8
+ /**
9
+ * Internal ResourceManager for automatic initialization and cleanup
10
+ * Implements singleton pattern for resource sharing across instances
11
+ * Requirements: 5.1, 5.4 - Automatic resource management and lifecycle handling
12
+ */
13
+ export class ResourceManager {
14
+ static instances = new Map();
15
+ static cleanupHandlersSet = false;
16
+ database = null;
17
+ indexManager = null;
18
+ embedder = null;
19
+ isInitialized = false;
20
+ initializationPromise = null;
21
+ resourceKey;
22
+ config;
23
+ /**
24
+ * Get or create ResourceManager instance for the given configuration
25
+ * Implements singleton pattern for resource sharing
26
+ * @param config - Resource configuration
27
+ * @returns ResourceManager instance
28
+ */
29
+ static getInstance(config = {}) {
30
+ // Create a unique key based on the configuration
31
+ const resolvedConfig = ResourceManager.resolveConfig(config);
32
+ const key = `${resolvedConfig.dbPath}:${resolvedConfig.indexPath}:${resolvedConfig.modelName}`;
33
+ if (!ResourceManager.instances.has(key)) {
34
+ ResourceManager.instances.set(key, new ResourceManager(key, resolvedConfig));
35
+ }
36
+ return ResourceManager.instances.get(key);
37
+ }
38
+ /**
39
+ * Resolve and normalize configuration with defaults
40
+ */
41
+ static resolveConfig(resourceConfig) {
42
+ const basePath = resourceConfig.basePath ? resolve(resourceConfig.basePath) : process.cwd();
43
+ return {
44
+ basePath,
45
+ dbPath: resourceConfig.dbPath ? resolve(resourceConfig.dbPath) : join(basePath, 'db.sqlite'),
46
+ indexPath: resourceConfig.indexPath ? resolve(resourceConfig.indexPath) : join(basePath, 'vector-index.bin'),
47
+ modelName: resourceConfig.modelName || config.embedding_model,
48
+ batchSize: resourceConfig.batchSize || config.batch_size,
49
+ skipModelCheck: resourceConfig.skipModelCheck || false
50
+ };
51
+ }
52
+ /**
53
+ * Private constructor - use getInstance() instead
54
+ */
55
+ constructor(resourceKey, config) {
56
+ this.resourceKey = resourceKey;
57
+ this.config = config;
58
+ // Set up automatic cleanup handlers
59
+ this.setupCleanupHandlers();
60
+ }
61
+ /**
62
+ * Initialize all resources with lazy loading
63
+ * Requirements: 5.1 - Automatic resource management
64
+ */
65
+ async initialize() {
66
+ // Return existing initialization promise if already in progress
67
+ if (this.initializationPromise) {
68
+ await this.initializationPromise;
69
+ return this.getResources();
70
+ }
71
+ // Start new initialization if not already initialized
72
+ if (!this.isInitialized) {
73
+ this.initializationPromise = this.performInitialization();
74
+ await this.initializationPromise;
75
+ }
76
+ return this.getResources();
77
+ }
78
+ /**
79
+ * Perform the actual initialization steps
80
+ */
81
+ async performInitialization() {
82
+ try {
83
+ console.log('Initializing resources...');
84
+ // Step 1: Initialize database
85
+ await this.initializeDatabase();
86
+ // Step 2: Initialize embedder (either from stored model info or config)
87
+ await this.initializeEmbedder();
88
+ // Step 3: Initialize index manager with model compatibility check
89
+ await this.initializeIndexManager();
90
+ this.isInitialized = true;
91
+ console.log('Resources initialized successfully');
92
+ }
93
+ catch (error) {
94
+ // Clean up partial initialization on failure
95
+ await this.cleanup();
96
+ throw ErrorFactory.createResourceError(error, 'initialization');
97
+ }
98
+ finally {
99
+ this.initializationPromise = null;
100
+ }
101
+ }
102
+ /**
103
+ * Initialize database connection and schema
104
+ */
105
+ async initializeDatabase() {
106
+ if (this.database) {
107
+ return;
108
+ }
109
+ console.log('Opening database connection...');
110
+ this.database = await openDatabase(this.config.dbPath);
111
+ await initializeSchema(this.database);
112
+ }
113
+ /**
114
+ * Initialize embedder based on stored model info or configuration
115
+ * Requirements: 5.1 - Embedder initialization based on stored model info from database
116
+ */
117
+ async initializeEmbedder() {
118
+ if (this.embedder) {
119
+ return;
120
+ }
121
+ if (!this.database) {
122
+ throw new Error('Database must be initialized before embedder');
123
+ }
124
+ let modelName = this.config.modelName;
125
+ // Try to get stored model info from database first
126
+ try {
127
+ const storedModelInfo = await getStoredModelInfo(this.database);
128
+ if (storedModelInfo && storedModelInfo.modelName) {
129
+ modelName = storedModelInfo.modelName;
130
+ console.log(`Using stored model from database: ${modelName}`);
131
+ }
132
+ else if (this.config.modelName) {
133
+ console.log(`No stored model found, using configured model: ${modelName}`);
134
+ // Store the model info for future use
135
+ const modelDefaults = getModelDefaults(modelName);
136
+ await setStoredModelInfo(this.database, modelName, modelDefaults.dimensions);
137
+ }
138
+ else {
139
+ // Use default model from config
140
+ modelName = config.embedding_model;
141
+ console.log(`Using default model: ${modelName}`);
142
+ const modelDefaults = getModelDefaults(modelName);
143
+ await setStoredModelInfo(this.database, modelName, modelDefaults.dimensions);
144
+ }
145
+ }
146
+ catch (error) {
147
+ console.warn(`Failed to read stored model info: ${error instanceof Error ? error.message : 'Unknown error'}`);
148
+ // Fall back to configured or default model
149
+ if (!modelName) {
150
+ modelName = config.embedding_model;
151
+ }
152
+ }
153
+ console.log(`Loading embedding model: ${modelName}...`);
154
+ this.embedder = await initializeEmbeddingEngine(modelName, this.config.batchSize);
155
+ }
156
+ /**
157
+ * Initialize index manager with model compatibility validation
158
+ */
159
+ async initializeIndexManager() {
160
+ if (this.indexManager) {
161
+ return;
162
+ }
163
+ if (!this.database || !this.embedder) {
164
+ throw new Error('Database and embedder must be initialized before index manager');
165
+ }
166
+ console.log('Initializing index manager...');
167
+ // Get model info for index manager initialization
168
+ const storedModelInfo = await getStoredModelInfo(this.database);
169
+ const modelName = storedModelInfo?.modelName || this.embedder.getModelName();
170
+ const dimensions = storedModelInfo?.dimensions || getModelDefaults(modelName).dimensions;
171
+ this.indexManager = new IndexManager(this.config.indexPath, this.config.dbPath, dimensions, modelName);
172
+ await this.indexManager.initialize(this.config.skipModelCheck);
173
+ }
174
+ /**
175
+ * Get initialized resources
176
+ * @throws Error if resources are not initialized
177
+ */
178
+ getResources() {
179
+ if (!this.isInitialized || !this.database || !this.indexManager || !this.embedder) {
180
+ throw new Error('Resources not properly initialized');
181
+ }
182
+ return {
183
+ database: this.database,
184
+ indexManager: this.indexManager,
185
+ embedder: this.embedder
186
+ };
187
+ }
188
+ /**
189
+ * Get database connection (lazy initialization)
190
+ */
191
+ async getDatabase() {
192
+ if (!this.database) {
193
+ await this.initialize();
194
+ }
195
+ return this.database;
196
+ }
197
+ /**
198
+ * Get index manager (lazy initialization)
199
+ */
200
+ async getIndexManager() {
201
+ if (!this.indexManager) {
202
+ await this.initialize();
203
+ }
204
+ return this.indexManager;
205
+ }
206
+ /**
207
+ * Get embedder (lazy initialization)
208
+ */
209
+ async getEmbedder() {
210
+ if (!this.embedder) {
211
+ await this.initialize();
212
+ }
213
+ return this.embedder;
214
+ }
215
+ /**
216
+ * Check if resources are initialized
217
+ */
218
+ isResourcesInitialized() {
219
+ return this.isInitialized;
220
+ }
221
+ /**
222
+ * Validate that required files exist for search operations
223
+ * @throws ResourceError with user-friendly message if files are missing
224
+ */
225
+ async validateSearchFiles() {
226
+ if (!existsSync(this.config.dbPath)) {
227
+ throw ErrorFactory.createResourceError(new Error(`Database file not found: ${this.config.dbPath}`), 'missing_database');
228
+ }
229
+ if (!existsSync(this.config.indexPath)) {
230
+ throw ErrorFactory.createResourceError(new Error(`Vector index file not found: ${this.config.indexPath}`), 'missing_index');
231
+ }
232
+ }
233
+ /**
234
+ * Set up automatic cleanup handlers
235
+ * Requirements: 5.5 - Automatic cleanup on process exit
236
+ */
237
+ setupCleanupHandlers() {
238
+ if (ResourceManager.cleanupHandlersSet) {
239
+ return;
240
+ }
241
+ ResourceManager.cleanupHandlersSet = true;
242
+ const cleanupAll = async () => {
243
+ const instances = Array.from(ResourceManager.instances.values());
244
+ await Promise.all(instances.map(instance => instance.cleanup()));
245
+ };
246
+ // Handle various exit scenarios
247
+ process.on('exit', () => {
248
+ // Synchronous cleanup for exit event
249
+ for (const instance of ResourceManager.instances.values()) {
250
+ try {
251
+ instance.performSyncCleanup();
252
+ }
253
+ catch (error) {
254
+ // Silent cleanup on exit
255
+ }
256
+ }
257
+ });
258
+ process.on('SIGINT', async () => {
259
+ await cleanupAll();
260
+ process.exit(0);
261
+ });
262
+ process.on('SIGTERM', async () => {
263
+ await cleanupAll();
264
+ process.exit(0);
265
+ });
266
+ process.on('uncaughtException', async (error) => {
267
+ console.error('Uncaught exception:', error);
268
+ await cleanupAll();
269
+ process.exit(1);
270
+ });
271
+ process.on('unhandledRejection', async (reason) => {
272
+ console.error('Unhandled rejection:', reason);
273
+ await cleanupAll();
274
+ process.exit(1);
275
+ });
276
+ }
277
+ /**
278
+ * Synchronous cleanup for process exit handlers
279
+ */
280
+ performSyncCleanup() {
281
+ try {
282
+ if (this.database) {
283
+ // Note: Synchronous close is not available in sqlite3,
284
+ // but we set to null to prevent further use
285
+ this.database = null;
286
+ }
287
+ this.indexManager = null;
288
+ this.embedder = null;
289
+ this.isInitialized = false;
290
+ }
291
+ catch (error) {
292
+ // Silent cleanup
293
+ }
294
+ }
295
+ /**
296
+ * Clean up all resources with proper error handling
297
+ * Requirements: 5.5 - Proper resource disposal and error handling during cleanup
298
+ */
299
+ async cleanup() {
300
+ const errors = [];
301
+ // Clean up database connection
302
+ if (this.database) {
303
+ try {
304
+ await this.database.close();
305
+ console.log('Database connection closed successfully');
306
+ }
307
+ catch (error) {
308
+ const errorMsg = `Failed to close database: ${error instanceof Error ? error.message : String(error)}`;
309
+ errors.push(errorMsg);
310
+ console.error(errorMsg);
311
+ }
312
+ finally {
313
+ this.database = null;
314
+ }
315
+ }
316
+ // Clean up index manager
317
+ if (this.indexManager) {
318
+ try {
319
+ await this.indexManager.close();
320
+ console.log('Index manager closed successfully');
321
+ }
322
+ catch (error) {
323
+ const errorMsg = `Failed to close index manager: ${error instanceof Error ? error.message : String(error)}`;
324
+ errors.push(errorMsg);
325
+ console.error(errorMsg);
326
+ }
327
+ finally {
328
+ this.indexManager = null;
329
+ }
330
+ }
331
+ // Clean up embedder (no explicit cleanup needed, just nullify reference)
332
+ if (this.embedder) {
333
+ this.embedder = null;
334
+ console.log('Embedder reference cleared');
335
+ }
336
+ // Reset state
337
+ this.isInitialized = false;
338
+ this.initializationPromise = null;
339
+ // Remove from instances map
340
+ ResourceManager.instances.delete(this.resourceKey);
341
+ // Log cleanup completion
342
+ if (errors.length === 0) {
343
+ console.log('Resource cleanup completed successfully');
344
+ }
345
+ else {
346
+ console.warn(`Resource cleanup completed with ${errors.length} error(s):`);
347
+ errors.forEach(error => console.warn(` - ${error}`));
348
+ }
349
+ }
350
+ /**
351
+ * Clean up all instances (for testing or shutdown)
352
+ * Requirements: 5.5 - Ensure resources are properly disposed when no longer needed
353
+ */
354
+ static async cleanupAll() {
355
+ const instances = Array.from(ResourceManager.instances.values());
356
+ if (instances.length === 0) {
357
+ console.log('No resource instances to clean up');
358
+ return;
359
+ }
360
+ console.log(`Cleaning up ${instances.length} resource instance(s)...`);
361
+ const cleanupPromises = instances.map(async (instance, index) => {
362
+ try {
363
+ await instance.cleanup();
364
+ console.log(`Instance ${index + 1}/${instances.length} cleaned up successfully`);
365
+ }
366
+ catch (error) {
367
+ console.error(`Failed to cleanup instance ${index + 1}/${instances.length}:`, error instanceof Error ? error.message : String(error));
368
+ }
369
+ });
370
+ await Promise.allSettled(cleanupPromises);
371
+ ResourceManager.instances.clear();
372
+ console.log('All resource instances cleanup completed');
373
+ }
374
+ /**
375
+ * Get the number of active resource instances
376
+ */
377
+ static getActiveInstanceCount() {
378
+ return ResourceManager.instances.size;
379
+ }
380
+ /**
381
+ * Check if a specific resource configuration is already managed
382
+ */
383
+ static hasInstance(config) {
384
+ const resolvedConfig = ResourceManager.resolveConfig(config);
385
+ const key = `${resolvedConfig.dbPath}:${resolvedConfig.indexPath}:${resolvedConfig.modelName}`;
386
+ return ResourceManager.instances.has(key);
387
+ }
388
+ }
389
+ //# sourceMappingURL=resource-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-manager.js","sourceRoot":"","sources":["../src/resource-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Standalone search script for direct node execution
4
+ * Usage: node search.js <query> [--top-k <number>] [--rerank|--no-rerank]
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=search-standalone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-standalone.d.ts","sourceRoot":"","sources":["../src/search-standalone.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
@@ -0,0 +1,117 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Standalone search script for direct node execution
4
+ * Usage: node search.js <query> [--top-k <number>] [--rerank|--no-rerank]
5
+ */
6
+ import { runSearch } from './cli/search.js';
7
+ import { EXIT_CODES, ConfigurationError } from './config.js';
8
+ function parseArgs() {
9
+ const args = process.argv.slice(2);
10
+ if (args.length === 0) {
11
+ console.error('RAG-lite TS Document Search');
12
+ console.error('');
13
+ console.error('Usage: node search.js <query> [options]');
14
+ console.error('');
15
+ console.error('Arguments:');
16
+ console.error(' <query> Search query (wrap in quotes if it contains spaces)');
17
+ console.error('');
18
+ console.error('Options:');
19
+ console.error(' --top-k <number> Number of results to return (default: 10, max: 100)');
20
+ console.error(' --rerank Enable reranking for better results');
21
+ console.error(' --no-rerank Disable reranking');
22
+ console.error('');
23
+ console.error('Examples:');
24
+ console.error(' node search.js "machine learning"');
25
+ console.error(' node search.js "API documentation" --top-k 10');
26
+ console.error(' node search.js "tutorial" --rerank');
27
+ console.error(' node search.js "how to install" --top-k 20 --rerank');
28
+ console.error('');
29
+ console.error('Note: Make sure you have ingested documents first using:');
30
+ console.error(' node indexer.js <path>');
31
+ process.exit(EXIT_CODES.INVALID_ARGUMENTS);
32
+ }
33
+ const queryParts = [];
34
+ const options = {};
35
+ for (let i = 0; i < args.length; i++) {
36
+ const arg = args[i];
37
+ if (arg === '--top-k') {
38
+ const nextArg = args[i + 1];
39
+ if (!nextArg) {
40
+ console.error('Error: --top-k requires a numeric value');
41
+ console.error('');
42
+ console.error('Examples:');
43
+ console.error(' --top-k 5 # Return 5 results');
44
+ console.error(' --top-k 20 # Return 20 results');
45
+ process.exit(EXIT_CODES.INVALID_ARGUMENTS);
46
+ }
47
+ const topK = parseInt(nextArg, 10);
48
+ if (isNaN(topK) || topK <= 0) {
49
+ console.error('Error: --top-k must be a positive number');
50
+ console.error('');
51
+ console.error('Examples:');
52
+ console.error(' --top-k 5 # Return 5 results');
53
+ console.error(' --top-k 20 # Return 20 results');
54
+ process.exit(EXIT_CODES.INVALID_ARGUMENTS);
55
+ }
56
+ if (topK > 100) {
57
+ console.warn(`Warning: Large --top-k value (${topK}) may impact performance. Consider using a smaller value.`);
58
+ }
59
+ options['top-k'] = topK;
60
+ i++; // Skip next argument
61
+ }
62
+ else if (arg === '--rerank') {
63
+ options.rerank = true;
64
+ }
65
+ else if (arg === '--no-rerank') {
66
+ options.rerank = false;
67
+ }
68
+ else if (arg === '--help' || arg === '-h') {
69
+ // Re-show help and exit
70
+ parseArgs();
71
+ }
72
+ else if (arg.startsWith('--')) {
73
+ console.error(`Error: Unknown option '${arg}'`);
74
+ console.error('');
75
+ console.error('Available options:');
76
+ console.error(' --top-k <number> Number of results to return');
77
+ console.error(' --rerank Enable reranking');
78
+ console.error(' --no-rerank Disable reranking');
79
+ console.error(' --help, -h Show this help');
80
+ process.exit(EXIT_CODES.INVALID_ARGUMENTS);
81
+ }
82
+ else {
83
+ queryParts.push(arg);
84
+ }
85
+ }
86
+ const query = queryParts.join(' ');
87
+ if (!query.trim()) {
88
+ console.error('Error: Query cannot be empty');
89
+ console.error('');
90
+ console.error('Please provide a search query:');
91
+ console.error(' node search.js "your search terms"');
92
+ process.exit(EXIT_CODES.INVALID_ARGUMENTS);
93
+ }
94
+ if (query.trim().length > 500) {
95
+ console.error('Error: Query is too long (maximum 500 characters)');
96
+ console.error('');
97
+ console.error('Please use a shorter, more specific query.');
98
+ process.exit(EXIT_CODES.INVALID_ARGUMENTS);
99
+ }
100
+ return { query, options };
101
+ }
102
+ async function main() {
103
+ const { query, options } = parseArgs();
104
+ await runSearch(query, options);
105
+ }
106
+ main().catch((error) => {
107
+ if (error instanceof ConfigurationError) {
108
+ console.error('Configuration Error:');
109
+ console.error(error.message);
110
+ process.exit(error.exitCode);
111
+ }
112
+ else {
113
+ console.error('Fatal Error:', error instanceof Error ? error.message : String(error));
114
+ process.exit(EXIT_CODES.GENERAL_ERROR);
115
+ }
116
+ });
117
+ //# sourceMappingURL=search-standalone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-standalone.js","sourceRoot":"","sources":["../src/search-standalone.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import { EmbeddingEngine } from './embedder.js';
2
+ import { IndexManager } from './index-manager.js';
3
+ import { DatabaseConnection } from './db.js';
4
+ import type { SearchResult, SearchOptions } from './types.js';
5
+ /**
6
+ * User-friendly error class with actionable suggestions
7
+ */
8
+ export declare class SearchError extends Error {
9
+ code: string;
10
+ suggestions: string[];
11
+ constructor(message: string, code: string, suggestions: string[]);
12
+ }
13
+ /**
14
+ * Search engine that provides semantic search capabilities
15
+ * Implements the core search pipeline: query embedding → vector search → metadata retrieval → optional reranking
16
+ * Supports concurrent read operations for multiple simultaneous queries
17
+ */
18
+ export declare class SearchEngine {
19
+ private static instances;
20
+ private static cleanupHandlersSet;
21
+ private embedder;
22
+ private indexManager;
23
+ private dbConnection;
24
+ private reranker;
25
+ private isInitialized;
26
+ private indexPath;
27
+ private dbPath;
28
+ private enableReranking;
29
+ /**
30
+ * Creates a new SearchEngine with simplified constructor
31
+ * Search engine is ready to use immediately without requiring initialization calls (Requirement 3.5)
32
+ * @param indexPath - Path to vector index file (defaults to './vector-index.bin')
33
+ * @param dbPath - Path to database file (defaults to './db.sqlite')
34
+ */
35
+ constructor(indexPath?: string, dbPath?: string);
36
+ /**
37
+ * Legacy constructor for backward compatibility
38
+ * @deprecated Use the simple constructor new SearchEngine(indexPath?, dbPath?) instead
39
+ */
40
+ static createWithComponents(embedder: EmbeddingEngine, indexManager: IndexManager, dbConnection: DatabaseConnection, enableReranking?: boolean): SearchEngine;
41
+ /**
42
+ * Automatically initialize resources on first use with user-friendly error handling
43
+ * Implements lazy initialization as required by Requirements 3.5, 4.3, 5.1, 5.2
44
+ */
45
+ private ensureInitialized;
46
+ /**
47
+ * Create user-friendly error messages with actionable suggestions
48
+ * Implements requirement 5.3: Clear, actionable error messages with specific next steps
49
+ */
50
+ private createUserFriendlyError;
51
+ /**
52
+ * Initialize the search engine (public method for backward compatibility)
53
+ * Sets up database, index manager, and embedding engine
54
+ */
55
+ initialize(): Promise<void>;
56
+ /**
57
+ * Perform semantic search on the indexed documents (matches README API)
58
+ * Automatically initializes resources on first use (Requirements 4.1, 4.2, 4.4, 4.5)
59
+ * Supports concurrent read operations for multiple simultaneous queries
60
+ * @param query - Search query string
61
+ * @param options - Search options including top_k and rerank settings
62
+ * @returns Promise resolving to array of search results
63
+ */
64
+ search(query: string, options?: SearchOptions): Promise<SearchResult[]>;
65
+ /**
66
+ * Format search results with proper structure
67
+ * @param chunks - Database chunks with metadata
68
+ * @param distances - Similarity distances from vector search
69
+ * @param embeddingIds - Embedding IDs in search result order
70
+ * @returns Formatted search results
71
+ */
72
+ private formatSearchResults;
73
+ /**
74
+ * Get search engine statistics
75
+ * @returns Object with current search engine stats
76
+ */
77
+ getStats(): Promise<{
78
+ totalChunks: number;
79
+ indexSize: number;
80
+ rerankingEnabled: boolean;
81
+ isInitialized: boolean;
82
+ }>;
83
+ /**
84
+ * Set up automatic cleanup on process exit (Requirement 5.5)
85
+ */
86
+ private setupAutomaticCleanup;
87
+ /**
88
+ * Clean up resources (Requirement 5.5)
89
+ */
90
+ cleanup(): Promise<void>;
91
+ }
92
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAA6B,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAA6D,MAAM,SAAS,CAAC;AAExG,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAK9D;;GAEG;AACH,qBAAa,WAAY,SAAQ,KAAK;IAG3B,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,MAAM,EAAE;gBAF5B,OAAO,EAAE,MAAM,EACR,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EAAE;CAK/B;AAyBD;;;;GAIG;AACH,qBAAa,YAAY;IAEvB,OAAO,CAAC,MAAM,CAAC,SAAS,CAA2B;IACnD,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAS;IAE1C,OAAO,CAAC,QAAQ,CAAgC;IAChD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,YAAY,CAAmC;IACvD,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,eAAe,CAAkB;IAEzC;;;;;OAKG;gBACS,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAmB/C;;;OAGG;IACH,MAAM,CAAC,oBAAoB,CACzB,QAAQ,EAAE,eAAe,EACzB,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,kBAAkB,EAChC,eAAe,GAAE,OAAe,GAC/B,YAAY;IAgBf;;;OAGG;YACW,iBAAiB;IA+F/B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAmH/B;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;;;;;OAOG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAiFjF;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IAsC3B;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,aAAa,EAAE,OAAO,CAAC;KACxB,CAAC;IAmBF;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA0D7B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAsB/B"}