rag-lite-ts 2.1.0 → 2.2.0
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/dist/{cli → cjs/cli}/indexer.js +1 -1
- package/dist/{cli → cjs/cli}/search.js +5 -10
- package/dist/{core → cjs/core}/binary-index-format.d.ts +28 -2
- package/dist/cjs/core/binary-index-format.js +291 -0
- package/dist/{core → cjs/core}/ingestion.d.ts +5 -1
- package/dist/{core → cjs/core}/ingestion.js +76 -9
- package/dist/{core → cjs/core}/model-validator.js +1 -1
- package/dist/{core → cjs/core}/reranking-strategies.js +4 -5
- package/dist/{core → cjs/core}/search.js +2 -1
- package/dist/{core → cjs/core}/types.d.ts +1 -1
- package/dist/{core → cjs/core}/vector-index.d.ts +4 -0
- package/dist/{core → cjs/core}/vector-index.js +10 -2
- package/dist/{file-processor.d.ts → cjs/file-processor.d.ts} +2 -0
- package/dist/{file-processor.js → cjs/file-processor.js} +20 -0
- package/dist/{index-manager.d.ts → cjs/index-manager.d.ts} +17 -1
- package/dist/{index-manager.js → cjs/index-manager.js} +148 -7
- package/dist/{multimodal → cjs/multimodal}/clip-embedder.js +71 -66
- package/dist/esm/api-errors.d.ts +90 -0
- package/dist/esm/api-errors.js +320 -0
- package/dist/esm/cli/indexer.d.ts +11 -0
- package/dist/esm/cli/indexer.js +471 -0
- package/dist/esm/cli/search.d.ts +7 -0
- package/dist/esm/cli/search.js +332 -0
- package/dist/esm/cli.d.ts +3 -0
- package/dist/esm/cli.js +529 -0
- package/dist/esm/config.d.ts +51 -0
- package/dist/esm/config.js +79 -0
- package/dist/esm/core/abstract-embedder.d.ts +125 -0
- package/dist/esm/core/abstract-embedder.js +264 -0
- package/dist/esm/core/actionable-error-messages.d.ts +60 -0
- package/dist/esm/core/actionable-error-messages.js +397 -0
- package/dist/esm/core/adapters.d.ts +93 -0
- package/dist/esm/core/adapters.js +139 -0
- package/dist/esm/core/batch-processing-optimizer.d.ts +155 -0
- package/dist/esm/core/batch-processing-optimizer.js +536 -0
- package/dist/esm/core/binary-index-format.d.ts +78 -0
- package/dist/esm/core/binary-index-format.js +291 -0
- package/dist/esm/core/chunker.d.ts +119 -0
- package/dist/esm/core/chunker.js +73 -0
- package/dist/esm/core/cli-database-utils.d.ts +53 -0
- package/dist/esm/core/cli-database-utils.js +239 -0
- package/dist/esm/core/config.d.ts +102 -0
- package/dist/esm/core/config.js +247 -0
- package/dist/esm/core/content-errors.d.ts +111 -0
- package/dist/esm/core/content-errors.js +362 -0
- package/dist/esm/core/content-manager.d.ts +335 -0
- package/dist/esm/core/content-manager.js +1476 -0
- package/dist/esm/core/content-performance-optimizer.d.ts +150 -0
- package/dist/esm/core/content-performance-optimizer.js +516 -0
- package/dist/esm/core/content-resolver.d.ts +104 -0
- package/dist/esm/core/content-resolver.js +285 -0
- package/dist/esm/core/cross-modal-search.d.ts +164 -0
- package/dist/esm/core/cross-modal-search.js +342 -0
- package/dist/esm/core/database-connection-manager.d.ts +109 -0
- package/dist/esm/core/database-connection-manager.js +310 -0
- package/dist/esm/core/db.d.ts +213 -0
- package/dist/esm/core/db.js +895 -0
- package/dist/esm/core/embedder-factory.d.ts +154 -0
- package/dist/esm/core/embedder-factory.js +311 -0
- package/dist/esm/core/error-handler.d.ts +112 -0
- package/dist/esm/core/error-handler.js +239 -0
- package/dist/esm/core/index.d.ts +59 -0
- package/dist/esm/core/index.js +69 -0
- package/dist/esm/core/ingestion.d.ts +202 -0
- package/dist/esm/core/ingestion.js +901 -0
- package/dist/esm/core/interfaces.d.ts +408 -0
- package/dist/esm/core/interfaces.js +106 -0
- package/dist/esm/core/lazy-dependency-loader.d.ts +147 -0
- package/dist/esm/core/lazy-dependency-loader.js +435 -0
- package/dist/esm/core/mode-detection-service.d.ts +150 -0
- package/dist/esm/core/mode-detection-service.js +565 -0
- package/dist/esm/core/mode-model-validator.d.ts +92 -0
- package/dist/esm/core/mode-model-validator.js +203 -0
- package/dist/esm/core/model-registry.d.ts +116 -0
- package/dist/esm/core/model-registry.js +411 -0
- package/dist/esm/core/model-validator.d.ts +217 -0
- package/dist/esm/core/model-validator.js +782 -0
- package/dist/esm/core/path-manager.d.ts +47 -0
- package/dist/esm/core/path-manager.js +71 -0
- package/dist/esm/core/raglite-paths.d.ts +121 -0
- package/dist/esm/core/raglite-paths.js +145 -0
- package/dist/esm/core/reranking-config.d.ts +42 -0
- package/dist/esm/core/reranking-config.js +147 -0
- package/dist/esm/core/reranking-factory.d.ts +92 -0
- package/dist/esm/core/reranking-factory.js +410 -0
- package/dist/esm/core/reranking-strategies.d.ts +310 -0
- package/dist/esm/core/reranking-strategies.js +650 -0
- package/dist/esm/core/resource-cleanup.d.ts +163 -0
- package/dist/esm/core/resource-cleanup.js +371 -0
- package/dist/esm/core/resource-manager.d.ts +212 -0
- package/dist/esm/core/resource-manager.js +564 -0
- package/dist/esm/core/search-pipeline.d.ts +111 -0
- package/dist/esm/core/search-pipeline.js +287 -0
- package/dist/esm/core/search.d.ts +141 -0
- package/dist/esm/core/search.js +320 -0
- package/dist/esm/core/streaming-operations.d.ts +145 -0
- package/dist/esm/core/streaming-operations.js +409 -0
- package/dist/esm/core/types.d.ts +66 -0
- package/dist/esm/core/types.js +6 -0
- package/dist/esm/core/universal-embedder.d.ts +177 -0
- package/dist/esm/core/universal-embedder.js +139 -0
- package/dist/esm/core/validation-messages.d.ts +99 -0
- package/dist/esm/core/validation-messages.js +334 -0
- package/dist/esm/core/vector-index.d.ts +72 -0
- package/dist/esm/core/vector-index.js +333 -0
- package/dist/esm/dom-polyfills.d.ts +6 -0
- package/dist/esm/dom-polyfills.js +37 -0
- package/dist/esm/factories/index.d.ts +27 -0
- package/dist/esm/factories/index.js +29 -0
- package/dist/esm/factories/ingestion-factory.d.ts +200 -0
- package/dist/esm/factories/ingestion-factory.js +477 -0
- package/dist/esm/factories/search-factory.d.ts +154 -0
- package/dist/esm/factories/search-factory.js +344 -0
- package/dist/esm/file-processor.d.ts +147 -0
- package/dist/esm/file-processor.js +963 -0
- package/dist/esm/index-manager.d.ts +116 -0
- package/dist/esm/index-manager.js +598 -0
- package/dist/esm/index.d.ts +75 -0
- package/dist/esm/index.js +110 -0
- package/dist/esm/indexer.d.ts +7 -0
- package/dist/esm/indexer.js +54 -0
- package/dist/esm/ingestion.d.ts +63 -0
- package/dist/esm/ingestion.js +124 -0
- package/dist/esm/mcp-server.d.ts +46 -0
- package/dist/esm/mcp-server.js +1820 -0
- package/dist/esm/multimodal/clip-embedder.d.ts +327 -0
- package/dist/esm/multimodal/clip-embedder.js +996 -0
- package/dist/esm/multimodal/index.d.ts +6 -0
- package/dist/esm/multimodal/index.js +6 -0
- package/dist/esm/preprocess.d.ts +19 -0
- package/dist/esm/preprocess.js +203 -0
- package/dist/esm/preprocessors/index.d.ts +17 -0
- package/dist/esm/preprocessors/index.js +38 -0
- package/dist/esm/preprocessors/mdx.d.ts +25 -0
- package/dist/esm/preprocessors/mdx.js +101 -0
- package/dist/esm/preprocessors/mermaid.d.ts +68 -0
- package/dist/esm/preprocessors/mermaid.js +329 -0
- package/dist/esm/preprocessors/registry.d.ts +56 -0
- package/dist/esm/preprocessors/registry.js +179 -0
- package/dist/esm/run-error-recovery-tests.d.ts +7 -0
- package/dist/esm/run-error-recovery-tests.js +101 -0
- package/dist/esm/search-standalone.d.ts +7 -0
- package/dist/esm/search-standalone.js +117 -0
- package/dist/esm/search.d.ts +99 -0
- package/dist/esm/search.js +177 -0
- package/dist/esm/test-utils.d.ts +18 -0
- package/dist/esm/test-utils.js +27 -0
- package/dist/esm/text/chunker.d.ts +33 -0
- package/dist/esm/text/chunker.js +279 -0
- package/dist/esm/text/embedder.d.ts +111 -0
- package/dist/esm/text/embedder.js +386 -0
- package/dist/esm/text/index.d.ts +8 -0
- package/dist/esm/text/index.js +9 -0
- package/dist/esm/text/preprocessors/index.d.ts +17 -0
- package/dist/esm/text/preprocessors/index.js +38 -0
- package/dist/esm/text/preprocessors/mdx.d.ts +25 -0
- package/dist/esm/text/preprocessors/mdx.js +101 -0
- package/dist/esm/text/preprocessors/mermaid.d.ts +68 -0
- package/dist/esm/text/preprocessors/mermaid.js +330 -0
- package/dist/esm/text/preprocessors/registry.d.ts +56 -0
- package/dist/esm/text/preprocessors/registry.js +180 -0
- package/dist/esm/text/reranker.d.ts +49 -0
- package/dist/esm/text/reranker.js +274 -0
- package/dist/esm/text/sentence-transformer-embedder.d.ts +96 -0
- package/dist/esm/text/sentence-transformer-embedder.js +340 -0
- package/dist/esm/text/tokenizer.d.ts +22 -0
- package/dist/esm/text/tokenizer.js +64 -0
- package/dist/esm/types.d.ts +83 -0
- package/dist/esm/types.js +3 -0
- package/dist/esm/utils/vector-math.d.ts +31 -0
- package/dist/esm/utils/vector-math.js +70 -0
- package/package.json +30 -12
- package/dist/core/binary-index-format.js +0 -122
- /package/dist/{api-errors.d.ts → cjs/api-errors.d.ts} +0 -0
- /package/dist/{api-errors.js → cjs/api-errors.js} +0 -0
- /package/dist/{cli → cjs/cli}/indexer.d.ts +0 -0
- /package/dist/{cli → cjs/cli}/search.d.ts +0 -0
- /package/dist/{cli.d.ts → cjs/cli.d.ts} +0 -0
- /package/dist/{cli.js → cjs/cli.js} +0 -0
- /package/dist/{config.d.ts → cjs/config.d.ts} +0 -0
- /package/dist/{config.js → cjs/config.js} +0 -0
- /package/dist/{core → cjs/core}/abstract-embedder.d.ts +0 -0
- /package/dist/{core → cjs/core}/abstract-embedder.js +0 -0
- /package/dist/{core → cjs/core}/actionable-error-messages.d.ts +0 -0
- /package/dist/{core → cjs/core}/actionable-error-messages.js +0 -0
- /package/dist/{core → cjs/core}/adapters.d.ts +0 -0
- /package/dist/{core → cjs/core}/adapters.js +0 -0
- /package/dist/{core → cjs/core}/batch-processing-optimizer.d.ts +0 -0
- /package/dist/{core → cjs/core}/batch-processing-optimizer.js +0 -0
- /package/dist/{core → cjs/core}/chunker.d.ts +0 -0
- /package/dist/{core → cjs/core}/chunker.js +0 -0
- /package/dist/{core → cjs/core}/cli-database-utils.d.ts +0 -0
- /package/dist/{core → cjs/core}/cli-database-utils.js +0 -0
- /package/dist/{core → cjs/core}/config.d.ts +0 -0
- /package/dist/{core → cjs/core}/config.js +0 -0
- /package/dist/{core → cjs/core}/content-errors.d.ts +0 -0
- /package/dist/{core → cjs/core}/content-errors.js +0 -0
- /package/dist/{core → cjs/core}/content-manager.d.ts +0 -0
- /package/dist/{core → cjs/core}/content-manager.js +0 -0
- /package/dist/{core → cjs/core}/content-performance-optimizer.d.ts +0 -0
- /package/dist/{core → cjs/core}/content-performance-optimizer.js +0 -0
- /package/dist/{core → cjs/core}/content-resolver.d.ts +0 -0
- /package/dist/{core → cjs/core}/content-resolver.js +0 -0
- /package/dist/{core → cjs/core}/cross-modal-search.d.ts +0 -0
- /package/dist/{core → cjs/core}/cross-modal-search.js +0 -0
- /package/dist/{core → cjs/core}/database-connection-manager.d.ts +0 -0
- /package/dist/{core → cjs/core}/database-connection-manager.js +0 -0
- /package/dist/{core → cjs/core}/db.d.ts +0 -0
- /package/dist/{core → cjs/core}/db.js +0 -0
- /package/dist/{core → cjs/core}/embedder-factory.d.ts +0 -0
- /package/dist/{core → cjs/core}/embedder-factory.js +0 -0
- /package/dist/{core → cjs/core}/error-handler.d.ts +0 -0
- /package/dist/{core → cjs/core}/error-handler.js +0 -0
- /package/dist/{core → cjs/core}/index.d.ts +0 -0
- /package/dist/{core → cjs/core}/index.js +0 -0
- /package/dist/{core → cjs/core}/interfaces.d.ts +0 -0
- /package/dist/{core → cjs/core}/interfaces.js +0 -0
- /package/dist/{core → cjs/core}/lazy-dependency-loader.d.ts +0 -0
- /package/dist/{core → cjs/core}/lazy-dependency-loader.js +0 -0
- /package/dist/{core → cjs/core}/mode-detection-service.d.ts +0 -0
- /package/dist/{core → cjs/core}/mode-detection-service.js +0 -0
- /package/dist/{core → cjs/core}/mode-model-validator.d.ts +0 -0
- /package/dist/{core → cjs/core}/mode-model-validator.js +0 -0
- /package/dist/{core → cjs/core}/model-registry.d.ts +0 -0
- /package/dist/{core → cjs/core}/model-registry.js +0 -0
- /package/dist/{core → cjs/core}/model-validator.d.ts +0 -0
- /package/dist/{core → cjs/core}/path-manager.d.ts +0 -0
- /package/dist/{core → cjs/core}/path-manager.js +0 -0
- /package/dist/{core → cjs/core}/raglite-paths.d.ts +0 -0
- /package/dist/{core → cjs/core}/raglite-paths.js +0 -0
- /package/dist/{core → cjs/core}/reranking-config.d.ts +0 -0
- /package/dist/{core → cjs/core}/reranking-config.js +0 -0
- /package/dist/{core → cjs/core}/reranking-factory.d.ts +0 -0
- /package/dist/{core → cjs/core}/reranking-factory.js +0 -0
- /package/dist/{core → cjs/core}/reranking-strategies.d.ts +0 -0
- /package/dist/{core → cjs/core}/resource-cleanup.d.ts +0 -0
- /package/dist/{core → cjs/core}/resource-cleanup.js +0 -0
- /package/dist/{core → cjs/core}/resource-manager.d.ts +0 -0
- /package/dist/{core → cjs/core}/resource-manager.js +0 -0
- /package/dist/{core → cjs/core}/search-pipeline.d.ts +0 -0
- /package/dist/{core → cjs/core}/search-pipeline.js +0 -0
- /package/dist/{core → cjs/core}/search.d.ts +0 -0
- /package/dist/{core → cjs/core}/streaming-operations.d.ts +0 -0
- /package/dist/{core → cjs/core}/streaming-operations.js +0 -0
- /package/dist/{core → cjs/core}/types.js +0 -0
- /package/dist/{core → cjs/core}/universal-embedder.d.ts +0 -0
- /package/dist/{core → cjs/core}/universal-embedder.js +0 -0
- /package/dist/{core → cjs/core}/validation-messages.d.ts +0 -0
- /package/dist/{core → cjs/core}/validation-messages.js +0 -0
- /package/dist/{dom-polyfills.d.ts → cjs/dom-polyfills.d.ts} +0 -0
- /package/dist/{dom-polyfills.js → cjs/dom-polyfills.js} +0 -0
- /package/dist/{factories → cjs/factories}/index.d.ts +0 -0
- /package/dist/{factories → cjs/factories}/index.js +0 -0
- /package/dist/{factories → cjs/factories}/ingestion-factory.d.ts +0 -0
- /package/dist/{factories → cjs/factories}/ingestion-factory.js +0 -0
- /package/dist/{factories → cjs/factories}/search-factory.d.ts +0 -0
- /package/dist/{factories → cjs/factories}/search-factory.js +0 -0
- /package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
- /package/dist/{index.js → cjs/index.js} +0 -0
- /package/dist/{indexer.d.ts → cjs/indexer.d.ts} +0 -0
- /package/dist/{indexer.js → cjs/indexer.js} +0 -0
- /package/dist/{ingestion.d.ts → cjs/ingestion.d.ts} +0 -0
- /package/dist/{ingestion.js → cjs/ingestion.js} +0 -0
- /package/dist/{mcp-server.d.ts → cjs/mcp-server.d.ts} +0 -0
- /package/dist/{mcp-server.js → cjs/mcp-server.js} +0 -0
- /package/dist/{multimodal → cjs/multimodal}/clip-embedder.d.ts +0 -0
- /package/dist/{multimodal → cjs/multimodal}/index.d.ts +0 -0
- /package/dist/{multimodal → cjs/multimodal}/index.js +0 -0
- /package/dist/{preprocess.d.ts → cjs/preprocess.d.ts} +0 -0
- /package/dist/{preprocess.js → cjs/preprocess.js} +0 -0
- /package/dist/{preprocessors → cjs/preprocessors}/index.d.ts +0 -0
- /package/dist/{preprocessors → cjs/preprocessors}/index.js +0 -0
- /package/dist/{preprocessors → cjs/preprocessors}/mdx.d.ts +0 -0
- /package/dist/{preprocessors → cjs/preprocessors}/mdx.js +0 -0
- /package/dist/{preprocessors → cjs/preprocessors}/mermaid.d.ts +0 -0
- /package/dist/{preprocessors → cjs/preprocessors}/mermaid.js +0 -0
- /package/dist/{preprocessors → cjs/preprocessors}/registry.d.ts +0 -0
- /package/dist/{preprocessors → cjs/preprocessors}/registry.js +0 -0
- /package/dist/{run-error-recovery-tests.d.ts → cjs/run-error-recovery-tests.d.ts} +0 -0
- /package/dist/{run-error-recovery-tests.js → cjs/run-error-recovery-tests.js} +0 -0
- /package/dist/{search-standalone.d.ts → cjs/search-standalone.d.ts} +0 -0
- /package/dist/{search-standalone.js → cjs/search-standalone.js} +0 -0
- /package/dist/{search.d.ts → cjs/search.d.ts} +0 -0
- /package/dist/{search.js → cjs/search.js} +0 -0
- /package/dist/{test-utils.d.ts → cjs/test-utils.d.ts} +0 -0
- /package/dist/{test-utils.js → cjs/test-utils.js} +0 -0
- /package/dist/{text → cjs/text}/chunker.d.ts +0 -0
- /package/dist/{text → cjs/text}/chunker.js +0 -0
- /package/dist/{text → cjs/text}/embedder.d.ts +0 -0
- /package/dist/{text → cjs/text}/embedder.js +0 -0
- /package/dist/{text → cjs/text}/index.d.ts +0 -0
- /package/dist/{text → cjs/text}/index.js +0 -0
- /package/dist/{text → cjs/text}/preprocessors/index.d.ts +0 -0
- /package/dist/{text → cjs/text}/preprocessors/index.js +0 -0
- /package/dist/{text → cjs/text}/preprocessors/mdx.d.ts +0 -0
- /package/dist/{text → cjs/text}/preprocessors/mdx.js +0 -0
- /package/dist/{text → cjs/text}/preprocessors/mermaid.d.ts +0 -0
- /package/dist/{text → cjs/text}/preprocessors/mermaid.js +0 -0
- /package/dist/{text → cjs/text}/preprocessors/registry.d.ts +0 -0
- /package/dist/{text → cjs/text}/preprocessors/registry.js +0 -0
- /package/dist/{text → cjs/text}/reranker.d.ts +0 -0
- /package/dist/{text → cjs/text}/reranker.js +0 -0
- /package/dist/{text → cjs/text}/sentence-transformer-embedder.d.ts +0 -0
- /package/dist/{text → cjs/text}/sentence-transformer-embedder.js +0 -0
- /package/dist/{text → cjs/text}/tokenizer.d.ts +0 -0
- /package/dist/{text → cjs/text}/tokenizer.js +0 -0
- /package/dist/{types.d.ts → cjs/types.d.ts} +0 -0
- /package/dist/{types.js → cjs/types.js} +0 -0
- /package/dist/{utils → cjs/utils}/vector-math.d.ts +0 -0
- /package/dist/{utils → cjs/utils}/vector-math.js +0 -0
package/dist/esm/cli.js
ADDED
|
@@ -0,0 +1,529 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFileSync } from 'fs';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { dirname, join } from 'path';
|
|
5
|
+
import { EXIT_CODES, ConfigurationError } from './core/config.js';
|
|
6
|
+
// Get package.json for version info
|
|
7
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
+
const __dirname = dirname(__filename);
|
|
9
|
+
const packageJsonPath = join(__dirname, '..', 'package.json');
|
|
10
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
11
|
+
/**
|
|
12
|
+
* Display version information
|
|
13
|
+
*/
|
|
14
|
+
function showVersion() {
|
|
15
|
+
console.log(`RAG-lite TS v${packageJson.version}`);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Display help information
|
|
19
|
+
*/
|
|
20
|
+
function showHelp() {
|
|
21
|
+
console.log(`
|
|
22
|
+
RAG-lite TS v${packageJson.version}
|
|
23
|
+
Local-first TypeScript retrieval engine for semantic search
|
|
24
|
+
|
|
25
|
+
Usage:
|
|
26
|
+
raglite <command> [options]
|
|
27
|
+
|
|
28
|
+
Commands:
|
|
29
|
+
ingest <path> Ingest documents from file or directory
|
|
30
|
+
search <query> Search indexed documents (text or image)
|
|
31
|
+
rebuild Rebuild the vector index
|
|
32
|
+
version Show version information
|
|
33
|
+
help Show this help message
|
|
34
|
+
|
|
35
|
+
Examples:
|
|
36
|
+
raglite ingest ./docs/ # Ingest all .md/.txt/.docx/.pdf files in docs/
|
|
37
|
+
raglite ingest ./readme.md # Ingest single file
|
|
38
|
+
raglite ingest ./docs/ --model Xenova/all-mpnet-base-v2 # Use higher quality model
|
|
39
|
+
raglite ingest ./docs/ --mode multimodal # Enable multimodal processing
|
|
40
|
+
raglite ingest ./docs/ --path-strategy relative --path-base /project # Use relative paths
|
|
41
|
+
raglite search "machine learning" # Search for documents about machine learning
|
|
42
|
+
raglite search "API documentation" --top-k 10 # Get top 10 results
|
|
43
|
+
raglite search "red car" --content-type image # Search only image results
|
|
44
|
+
raglite search ./photo.jpg # Search with image (multimodal mode only)
|
|
45
|
+
raglite search ./image.png --top-k 5 # Find similar images
|
|
46
|
+
|
|
47
|
+
raglite rebuild # Rebuild the entire index
|
|
48
|
+
|
|
49
|
+
Options for search:
|
|
50
|
+
--top-k <number> Number of results to return (default: 10)
|
|
51
|
+
--rerank Enable reranking for better results
|
|
52
|
+
--no-rerank Disable reranking
|
|
53
|
+
--content-type <type> Filter results by content type: 'text', 'image', or 'all' (default: all)
|
|
54
|
+
|
|
55
|
+
Options for ingest:
|
|
56
|
+
--model <name> Use specific embedding model
|
|
57
|
+
--mode <mode> Processing mode: 'text' (default) or 'multimodal'
|
|
58
|
+
--rebuild-if-needed Automatically rebuild if model mismatch detected (WARNING: rebuilds entire index)
|
|
59
|
+
--path-strategy <strategy> Path storage strategy: 'relative' (default) or 'absolute'
|
|
60
|
+
--path-base <path> Base directory for relative paths (defaults to current directory)
|
|
61
|
+
|
|
62
|
+
Available models:
|
|
63
|
+
Text mode:
|
|
64
|
+
sentence-transformers/all-MiniLM-L6-v2 (384 dim, fast, default)
|
|
65
|
+
Xenova/all-mpnet-base-v2 (768 dim, higher quality)
|
|
66
|
+
Multimodal mode:
|
|
67
|
+
Xenova/clip-vit-base-patch32 (512 dim, faster, default)
|
|
68
|
+
Xenova/clip-vit-base-patch16 (512 dim, more accurate, slower)
|
|
69
|
+
|
|
70
|
+
Available reranking strategies (multimodal mode):
|
|
71
|
+
text-derived Use image-to-text conversion + cross-encoder (default)
|
|
72
|
+
disabled No reranking, use vector similarity only
|
|
73
|
+
|
|
74
|
+
For more information, visit: https://github.com/your-repo/rag-lite-ts
|
|
75
|
+
`);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Parse command line arguments
|
|
79
|
+
*/
|
|
80
|
+
function parseArgs() {
|
|
81
|
+
const args = process.argv.slice(2);
|
|
82
|
+
if (args.length === 0) {
|
|
83
|
+
return { command: 'help', args: [], options: {} };
|
|
84
|
+
}
|
|
85
|
+
// Handle --version and --help flags at the top level
|
|
86
|
+
if (args[0] === '--version' || args[0] === '-v') {
|
|
87
|
+
return { command: 'version', args: [], options: {} };
|
|
88
|
+
}
|
|
89
|
+
if (args[0] === '--help' || args[0] === '-h') {
|
|
90
|
+
return { command: 'help', args: [], options: {} };
|
|
91
|
+
}
|
|
92
|
+
const command = args[0];
|
|
93
|
+
const remainingArgs = [];
|
|
94
|
+
const options = {};
|
|
95
|
+
// Parse arguments and options
|
|
96
|
+
for (let i = 1; i < args.length; i++) {
|
|
97
|
+
const arg = args[i];
|
|
98
|
+
if (arg.startsWith('--')) {
|
|
99
|
+
const optionName = arg.slice(2);
|
|
100
|
+
// Handle boolean flags with optional values
|
|
101
|
+
if (optionName === 'rerank') {
|
|
102
|
+
const nextArg = args[i + 1];
|
|
103
|
+
if (nextArg && (nextArg === 'true' || nextArg === 'false')) {
|
|
104
|
+
options.rerank = nextArg === 'true';
|
|
105
|
+
i++; // Skip the next argument as it's the value
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
options.rerank = true;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else if (optionName === 'no-rerank') {
|
|
112
|
+
options.rerank = false;
|
|
113
|
+
}
|
|
114
|
+
else if (optionName === 'rebuild-if-needed') {
|
|
115
|
+
options.rebuildIfNeeded = true;
|
|
116
|
+
}
|
|
117
|
+
else if (optionName === 'help') {
|
|
118
|
+
return { command: 'help', args: [], options: {} };
|
|
119
|
+
}
|
|
120
|
+
else if (optionName === 'version') {
|
|
121
|
+
return { command: 'version', args: [], options: {} };
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
// Handle options with values
|
|
125
|
+
const nextArg = args[i + 1];
|
|
126
|
+
if (nextArg && !nextArg.startsWith('--')) {
|
|
127
|
+
options[optionName] = nextArg;
|
|
128
|
+
i++; // Skip the next argument as it's the value
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
options[optionName] = true;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
remainingArgs.push(arg);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return { command, args: remainingArgs, options };
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Validate command line arguments
|
|
143
|
+
*/
|
|
144
|
+
function validateArgs(command, args, options) {
|
|
145
|
+
// Phase 3: Reject the removed --rerank-strategy option
|
|
146
|
+
if (options['rerank-strategy'] !== undefined) {
|
|
147
|
+
console.error('Error: --rerank-strategy option has been removed in this version');
|
|
148
|
+
console.error('');
|
|
149
|
+
console.error('Reranking strategy is now automatically selected based on mode:');
|
|
150
|
+
console.error(' Text mode: cross-encoder (or disabled)');
|
|
151
|
+
console.error(' Multimodal mode: text-derived (or disabled)');
|
|
152
|
+
console.error('');
|
|
153
|
+
console.error('Use --rerank or --no-rerank to control reranking instead.');
|
|
154
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
155
|
+
}
|
|
156
|
+
switch (command) {
|
|
157
|
+
case 'ingest':
|
|
158
|
+
if (args.length === 0) {
|
|
159
|
+
console.error('Error: ingest command requires a path argument');
|
|
160
|
+
console.error('');
|
|
161
|
+
console.error('Usage: raglite ingest <path>');
|
|
162
|
+
console.error('');
|
|
163
|
+
console.error('Examples:');
|
|
164
|
+
console.error(' raglite ingest ./docs/ # Ingest all .md/.txt/.docx/.pdf files in docs/');
|
|
165
|
+
console.error(' raglite ingest ./readme.md # Ingest single file');
|
|
166
|
+
console.error(' raglite ingest ./docs/ --model Xenova/all-mpnet-base-v2 # Use higher quality model');
|
|
167
|
+
console.error(' raglite ingest ./docs/ --mode multimodal # Enable multimodal processing');
|
|
168
|
+
console.error('');
|
|
169
|
+
console.error('Options:');
|
|
170
|
+
console.error(' --model <name> Use specific embedding model');
|
|
171
|
+
console.error(' --mode <mode> Processing mode: text (default) or multimodal');
|
|
172
|
+
console.error(' --rebuild-if-needed Automatically rebuild if model mismatch detected');
|
|
173
|
+
console.error('');
|
|
174
|
+
console.error('The path can be either a file (.md or .txt) or a directory.');
|
|
175
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
176
|
+
}
|
|
177
|
+
break;
|
|
178
|
+
case 'search':
|
|
179
|
+
if (args.length === 0) {
|
|
180
|
+
console.error('Error: search command requires a query argument');
|
|
181
|
+
console.error('');
|
|
182
|
+
console.error('Usage: raglite search <query> [options]');
|
|
183
|
+
console.error(' raglite search <image-path> [options]');
|
|
184
|
+
console.error('');
|
|
185
|
+
console.error('Examples:');
|
|
186
|
+
console.error(' raglite search "machine learning"');
|
|
187
|
+
console.error(' raglite search "API documentation" --top-k 10');
|
|
188
|
+
console.error(' raglite search "tutorial" --rerank');
|
|
189
|
+
console.error(' raglite search "red car" --content-type image');
|
|
190
|
+
console.error(' raglite search ./photo.jpg # Image search (multimodal mode)');
|
|
191
|
+
console.error(' raglite search ./image.png --top-k 5 # Find similar images');
|
|
192
|
+
console.error('');
|
|
193
|
+
console.error('Options:');
|
|
194
|
+
console.error(' --top-k <number> Number of results to return (default: 10)');
|
|
195
|
+
console.error(' --rerank Enable reranking for better results');
|
|
196
|
+
console.error(' --no-rerank Disable reranking');
|
|
197
|
+
console.error(' --content-type <type> Filter by content type: text, image, or all (default: all)');
|
|
198
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
199
|
+
}
|
|
200
|
+
break;
|
|
201
|
+
case 'rebuild':
|
|
202
|
+
// No arguments required
|
|
203
|
+
break;
|
|
204
|
+
case 'version':
|
|
205
|
+
// No validation needed
|
|
206
|
+
break;
|
|
207
|
+
case 'help':
|
|
208
|
+
// No validation needed
|
|
209
|
+
break;
|
|
210
|
+
default:
|
|
211
|
+
console.error(`Error: Unknown command '${command}'`);
|
|
212
|
+
console.error('');
|
|
213
|
+
console.error('Available commands: ingest, search, rebuild, version, help');
|
|
214
|
+
console.error('Run "raglite help" for detailed usage information');
|
|
215
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
216
|
+
}
|
|
217
|
+
// Validate numeric options
|
|
218
|
+
if (options['top-k'] !== undefined) {
|
|
219
|
+
const topK = parseInt(options['top-k'], 10);
|
|
220
|
+
if (isNaN(topK) || topK <= 0) {
|
|
221
|
+
console.error('Error: --top-k must be a positive number');
|
|
222
|
+
console.error('');
|
|
223
|
+
console.error('Examples:');
|
|
224
|
+
console.error(' --top-k 5 # Return 5 results');
|
|
225
|
+
console.error(' --top-k 20 # Return 20 results');
|
|
226
|
+
console.error('');
|
|
227
|
+
console.error('Valid range: 1-100 results');
|
|
228
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
229
|
+
}
|
|
230
|
+
if (topK > 100) {
|
|
231
|
+
console.warn(`Warning: Large --top-k value (${topK}) may impact performance. Consider using a smaller value.`);
|
|
232
|
+
}
|
|
233
|
+
options['top-k'] = topK;
|
|
234
|
+
}
|
|
235
|
+
// Validate content-type option (only for search command)
|
|
236
|
+
if (options['content-type'] !== undefined) {
|
|
237
|
+
if (command !== 'search') {
|
|
238
|
+
console.error(`Error: --content-type option is only available for the 'search' command`);
|
|
239
|
+
console.error('');
|
|
240
|
+
console.error('Use this option to filter search results by content type.');
|
|
241
|
+
console.error('');
|
|
242
|
+
console.error('Examples:');
|
|
243
|
+
console.error(' raglite search "query" --content-type text # Only text results');
|
|
244
|
+
console.error(' raglite search "query" --content-type image # Only image results');
|
|
245
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
246
|
+
}
|
|
247
|
+
const supportedTypes = ['text', 'image', 'all'];
|
|
248
|
+
if (!supportedTypes.includes(options['content-type'])) {
|
|
249
|
+
console.error(`Error: Unsupported content type '${options['content-type']}'`);
|
|
250
|
+
console.error('');
|
|
251
|
+
console.error('Supported content types:');
|
|
252
|
+
console.error(' text Filter to show only text results');
|
|
253
|
+
console.error(' image Filter to show only image results');
|
|
254
|
+
console.error(' all Show all results (default)');
|
|
255
|
+
console.error('');
|
|
256
|
+
console.error('Examples:');
|
|
257
|
+
console.error(' --content-type text');
|
|
258
|
+
console.error(' --content-type image');
|
|
259
|
+
console.error(' --content-type all');
|
|
260
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// Validate mode option (only for ingest command)
|
|
264
|
+
if (options.mode !== undefined) {
|
|
265
|
+
if (command !== 'ingest') {
|
|
266
|
+
console.error(`Error: --mode option is only available for the 'ingest' command`);
|
|
267
|
+
console.error('');
|
|
268
|
+
console.error('The search command automatically detects the mode from the database.');
|
|
269
|
+
console.error('Mode is set once during ingestion and persists for all searches.');
|
|
270
|
+
console.error('');
|
|
271
|
+
console.error('Examples:');
|
|
272
|
+
console.error(' raglite ingest ./docs/ --mode multimodal');
|
|
273
|
+
console.error(' raglite search "your query" # Uses mode from ingestion');
|
|
274
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
275
|
+
}
|
|
276
|
+
const supportedModes = ['text', 'multimodal'];
|
|
277
|
+
if (!supportedModes.includes(options.mode)) {
|
|
278
|
+
console.error(`Error: Unsupported mode '${options.mode}'`);
|
|
279
|
+
console.error('');
|
|
280
|
+
console.error('Supported modes:');
|
|
281
|
+
console.error(' text Process text documents only (default)');
|
|
282
|
+
console.error(' multimodal Process text and image documents');
|
|
283
|
+
console.error('');
|
|
284
|
+
console.error('Examples:');
|
|
285
|
+
console.error(' --mode text');
|
|
286
|
+
console.error(' --mode multimodal');
|
|
287
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// Validate model option (only for ingest command)
|
|
291
|
+
if (options.model !== undefined) {
|
|
292
|
+
if (command !== 'ingest') {
|
|
293
|
+
console.error(`Error: --model option is only available for the 'ingest' command`);
|
|
294
|
+
console.error('');
|
|
295
|
+
console.error('The search command automatically uses the model that was used during ingestion.');
|
|
296
|
+
console.error('To search with a different model, you need to re-ingest with that model first.');
|
|
297
|
+
console.error('');
|
|
298
|
+
console.error('Examples:');
|
|
299
|
+
console.error(' raglite ingest ./docs/ --model Xenova/all-mpnet-base-v2');
|
|
300
|
+
console.error(' raglite search "your query" # Uses the model from ingestion');
|
|
301
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
302
|
+
}
|
|
303
|
+
const mode = options.mode || 'text';
|
|
304
|
+
const textModels = [
|
|
305
|
+
'sentence-transformers/all-MiniLM-L6-v2',
|
|
306
|
+
'Xenova/all-mpnet-base-v2'
|
|
307
|
+
];
|
|
308
|
+
const multimodalModels = [
|
|
309
|
+
'Xenova/clip-vit-base-patch32',
|
|
310
|
+
'Xenova/clip-vit-base-patch16'
|
|
311
|
+
];
|
|
312
|
+
let supportedModels;
|
|
313
|
+
let modelTypeDescription;
|
|
314
|
+
if (mode === 'multimodal') {
|
|
315
|
+
supportedModels = multimodalModels;
|
|
316
|
+
modelTypeDescription = 'multimodal models';
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
supportedModels = textModels;
|
|
320
|
+
modelTypeDescription = 'text models';
|
|
321
|
+
}
|
|
322
|
+
if (!supportedModels.includes(options.model)) {
|
|
323
|
+
console.error(`Error: Model '${options.model}' is not supported for ${mode} mode`);
|
|
324
|
+
console.error('');
|
|
325
|
+
if (mode === 'text') {
|
|
326
|
+
console.error('Supported models for text mode:');
|
|
327
|
+
console.error(' sentence-transformers/all-MiniLM-L6-v2 (384 dim, fast, default)');
|
|
328
|
+
console.error(' Xenova/all-mpnet-base-v2 (768 dim, higher quality)');
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
console.error('Supported models for multimodal mode:');
|
|
332
|
+
console.error(' Xenova/clip-vit-base-patch32 (512 dim, faster, default)');
|
|
333
|
+
console.error(' Xenova/clip-vit-base-patch16 (512 dim, more accurate, slower)');
|
|
334
|
+
}
|
|
335
|
+
console.error('');
|
|
336
|
+
console.error('Examples:');
|
|
337
|
+
if (mode === 'text') {
|
|
338
|
+
console.error(' --model sentence-transformers/all-MiniLM-L6-v2');
|
|
339
|
+
console.error(' --model Xenova/all-mpnet-base-v2');
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
console.error(' --model Xenova/clip-vit-base-patch32 --mode multimodal');
|
|
343
|
+
console.error(' --model Xenova/clip-vit-base-patch16 --mode multimodal');
|
|
344
|
+
}
|
|
345
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
// Validate path-strategy option (only for ingest command)
|
|
349
|
+
if (options['path-strategy'] !== undefined) {
|
|
350
|
+
if (command !== 'ingest') {
|
|
351
|
+
console.error(`Error: --path-strategy option is only available for the 'ingest' command`);
|
|
352
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
353
|
+
}
|
|
354
|
+
const supportedStrategies = ['absolute', 'relative'];
|
|
355
|
+
if (!supportedStrategies.includes(options['path-strategy'])) {
|
|
356
|
+
console.error(`Error: Unsupported path strategy '${options['path-strategy']}'`);
|
|
357
|
+
console.error('');
|
|
358
|
+
console.error('Supported strategies:');
|
|
359
|
+
console.error(' relative Store paths relative to base directory (default, portable)');
|
|
360
|
+
console.error(' absolute Store absolute paths');
|
|
361
|
+
console.error('');
|
|
362
|
+
console.error('Examples:');
|
|
363
|
+
console.error(' --path-strategy relative');
|
|
364
|
+
console.error(' --path-strategy absolute');
|
|
365
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
// Validate path-base option (only for ingest command)
|
|
369
|
+
if (options['path-base'] !== undefined) {
|
|
370
|
+
if (command !== 'ingest') {
|
|
371
|
+
console.error(`Error: --path-base option is only available for the 'ingest' command`);
|
|
372
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
373
|
+
}
|
|
374
|
+
if (typeof options['path-base'] !== 'string' || options['path-base'].trim() === '') {
|
|
375
|
+
console.error('Error: --path-base must be a non-empty directory path');
|
|
376
|
+
console.error('');
|
|
377
|
+
console.error('Examples:');
|
|
378
|
+
console.error(' --path-base /project/docs');
|
|
379
|
+
console.error(' --path-base ./my-docs');
|
|
380
|
+
process.exit(EXIT_CODES.INVALID_ARGUMENTS);
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Main CLI entry point
|
|
386
|
+
*/
|
|
387
|
+
async function main() {
|
|
388
|
+
// Set CLI mode to prevent database connection manager from starting timers
|
|
389
|
+
process.env.RAG_CLI_MODE = 'true';
|
|
390
|
+
try {
|
|
391
|
+
const { command, args, options } = parseArgs();
|
|
392
|
+
// Validate arguments
|
|
393
|
+
validateArgs(command, args, options);
|
|
394
|
+
// Handle commands
|
|
395
|
+
switch (command) {
|
|
396
|
+
case 'version':
|
|
397
|
+
showVersion();
|
|
398
|
+
break;
|
|
399
|
+
case 'help':
|
|
400
|
+
showHelp();
|
|
401
|
+
break;
|
|
402
|
+
case 'ingest':
|
|
403
|
+
const { runIngest } = await import('./cli/indexer.js');
|
|
404
|
+
await runIngest(args[0], options);
|
|
405
|
+
break;
|
|
406
|
+
case 'search':
|
|
407
|
+
const { runSearch } = await import('./cli/search.js');
|
|
408
|
+
const query = args.join(' '); // Join all args as query
|
|
409
|
+
await runSearch(query, options);
|
|
410
|
+
break;
|
|
411
|
+
case 'rebuild':
|
|
412
|
+
const { runRebuild } = await import('./cli/indexer.js');
|
|
413
|
+
await runRebuild();
|
|
414
|
+
break;
|
|
415
|
+
default:
|
|
416
|
+
console.error(`Error: Unknown command '${command}'`);
|
|
417
|
+
process.exit(1);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
catch (error) {
|
|
421
|
+
// Handle different error types with appropriate exit codes
|
|
422
|
+
if (error instanceof ConfigurationError) {
|
|
423
|
+
console.error('Configuration Error:');
|
|
424
|
+
console.error(error.message);
|
|
425
|
+
process.exit(error.exitCode);
|
|
426
|
+
}
|
|
427
|
+
else if (error instanceof Error) {
|
|
428
|
+
console.error('Error:', error.message);
|
|
429
|
+
// Provide context-specific help for common errors
|
|
430
|
+
if (error.message.includes('ENOENT')) {
|
|
431
|
+
console.error('');
|
|
432
|
+
console.error('This usually means a file or directory was not found.');
|
|
433
|
+
console.error('Please check that the path exists and you have read permissions.');
|
|
434
|
+
process.exit(EXIT_CODES.FILE_NOT_FOUND);
|
|
435
|
+
}
|
|
436
|
+
else if (error.message.includes('EACCES') || error.message.includes('permission')) {
|
|
437
|
+
console.error('');
|
|
438
|
+
console.error('Permission denied. Please check file/directory permissions.');
|
|
439
|
+
process.exit(EXIT_CODES.PERMISSION_ERROR);
|
|
440
|
+
}
|
|
441
|
+
else if (error.message.includes('SQLITE') || error.message.includes('database')) {
|
|
442
|
+
console.error('');
|
|
443
|
+
console.error('Database error. Try running "raglite rebuild" to fix index issues.');
|
|
444
|
+
process.exit(EXIT_CODES.DATABASE_ERROR);
|
|
445
|
+
}
|
|
446
|
+
else if (error.message.includes('model') || error.message.includes('ONNX')) {
|
|
447
|
+
console.error('');
|
|
448
|
+
console.error('Model loading error. The embedding model will be downloaded automatically on first run.');
|
|
449
|
+
process.exit(EXIT_CODES.MODEL_ERROR);
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
process.exit(EXIT_CODES.GENERAL_ERROR);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
console.error('Unknown error:', String(error));
|
|
457
|
+
process.exit(EXIT_CODES.GENERAL_ERROR);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
// Handle unhandled promise rejections
|
|
462
|
+
process.on('unhandledRejection', (reason, promise) => {
|
|
463
|
+
console.error('🚨 Unhandled Promise Rejection:');
|
|
464
|
+
console.error('Reason:', reason);
|
|
465
|
+
console.error('Promise:', promise);
|
|
466
|
+
console.error('');
|
|
467
|
+
console.error('This is usually caused by an async operation that failed without proper error handling.');
|
|
468
|
+
console.error('The system will exit to prevent undefined behavior.');
|
|
469
|
+
console.error('');
|
|
470
|
+
console.error('If this error persists, please report it with the above details.');
|
|
471
|
+
process.exit(EXIT_CODES.GENERAL_ERROR);
|
|
472
|
+
});
|
|
473
|
+
// Handle uncaught exceptions
|
|
474
|
+
process.on('uncaughtException', (error) => {
|
|
475
|
+
console.error('🚨 Uncaught Exception:');
|
|
476
|
+
console.error('Error:', error.message);
|
|
477
|
+
console.error('');
|
|
478
|
+
if (error.stack) {
|
|
479
|
+
console.error('Stack trace:');
|
|
480
|
+
console.error(error.stack);
|
|
481
|
+
console.error('');
|
|
482
|
+
}
|
|
483
|
+
console.error('This indicates a serious error in the application.');
|
|
484
|
+
console.error('The system will exit immediately to prevent data corruption.');
|
|
485
|
+
console.error('');
|
|
486
|
+
console.error('Please report this issue with the above details.');
|
|
487
|
+
process.exit(EXIT_CODES.GENERAL_ERROR);
|
|
488
|
+
});
|
|
489
|
+
// Handle process termination signals gracefully
|
|
490
|
+
process.on('SIGINT', async () => {
|
|
491
|
+
console.log('\n\nReceived SIGINT (Ctrl+C). Shutting down gracefully...');
|
|
492
|
+
console.log('If you need to force quit, press Ctrl+C again.');
|
|
493
|
+
// Clean up database connections before exit
|
|
494
|
+
try {
|
|
495
|
+
const { DatabaseConnectionManager } = await import('./core/database-connection-manager.js');
|
|
496
|
+
await DatabaseConnectionManager.closeAllConnections();
|
|
497
|
+
}
|
|
498
|
+
catch (error) {
|
|
499
|
+
// Ignore cleanup errors during shutdown
|
|
500
|
+
}
|
|
501
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
502
|
+
});
|
|
503
|
+
process.on('SIGTERM', async () => {
|
|
504
|
+
console.log('\n\nReceived SIGTERM. Shutting down gracefully...');
|
|
505
|
+
// Clean up database connections before exit
|
|
506
|
+
try {
|
|
507
|
+
const { DatabaseConnectionManager } = await import('./core/database-connection-manager.js');
|
|
508
|
+
await DatabaseConnectionManager.closeAllConnections();
|
|
509
|
+
}
|
|
510
|
+
catch (error) {
|
|
511
|
+
// Ignore cleanup errors during shutdown
|
|
512
|
+
}
|
|
513
|
+
process.exit(EXIT_CODES.SUCCESS);
|
|
514
|
+
});
|
|
515
|
+
// Run the CLI only if this file is executed directly
|
|
516
|
+
// In ES modules, we need to check import.meta.url instead of require.main
|
|
517
|
+
// Check if this file is being run directly
|
|
518
|
+
if (process.argv[1] === __filename || process.argv[1].endsWith('cli.js')) {
|
|
519
|
+
main().catch((error) => {
|
|
520
|
+
console.error('Fatal error:', error instanceof Error ? error.message : String(error));
|
|
521
|
+
if (error instanceof ConfigurationError) {
|
|
522
|
+
process.exit(error.exitCode);
|
|
523
|
+
}
|
|
524
|
+
else {
|
|
525
|
+
process.exit(EXIT_CODES.GENERAL_ERROR);
|
|
526
|
+
}
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main configuration file with text-specific settings
|
|
3
|
+
* Extends core configuration with implementation-specific properties
|
|
4
|
+
*/
|
|
5
|
+
import { CoreConfig } from './core/config.js';
|
|
6
|
+
/**
|
|
7
|
+
* Text-specific configuration properties
|
|
8
|
+
*/
|
|
9
|
+
export interface TextConfig {
|
|
10
|
+
embedding_model: string;
|
|
11
|
+
rerank_enabled: boolean;
|
|
12
|
+
rerank_model: string;
|
|
13
|
+
preprocessing: {
|
|
14
|
+
enabled: boolean;
|
|
15
|
+
mdx: boolean;
|
|
16
|
+
mermaid: boolean;
|
|
17
|
+
code_blocks: boolean;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Complete configuration interface combining core and text-specific settings
|
|
22
|
+
*/
|
|
23
|
+
export interface Config extends CoreConfig {
|
|
24
|
+
embedding_model: string;
|
|
25
|
+
rerank_enabled: boolean;
|
|
26
|
+
rerank_model: string;
|
|
27
|
+
preprocessing: {
|
|
28
|
+
enabled: boolean;
|
|
29
|
+
mdx: boolean;
|
|
30
|
+
mermaid: boolean;
|
|
31
|
+
code_blocks: boolean;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Default configuration object with both core and text-specific settings
|
|
36
|
+
*/
|
|
37
|
+
export declare const config: Config;
|
|
38
|
+
export * from './core/config.js';
|
|
39
|
+
/**
|
|
40
|
+
* Validate complete configuration including text-specific settings
|
|
41
|
+
*/
|
|
42
|
+
export declare function validateConfig(config: any): asserts config is Config;
|
|
43
|
+
/**
|
|
44
|
+
* Validate preprocessing configuration
|
|
45
|
+
*/
|
|
46
|
+
export declare function validatePreprocessingConfig(config: any): boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Merge preprocessing configurations
|
|
49
|
+
*/
|
|
50
|
+
export declare function mergePreprocessingConfig(base: any, override: any): any;
|
|
51
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main configuration file with text-specific settings
|
|
3
|
+
* Extends core configuration with implementation-specific properties
|
|
4
|
+
*/
|
|
5
|
+
import { getDefaultModelCachePath } from './core/config.js';
|
|
6
|
+
import { createRequire } from 'module';
|
|
7
|
+
// Create require for CommonJS modules in ES module context
|
|
8
|
+
const require = createRequire(import.meta.url);
|
|
9
|
+
/**
|
|
10
|
+
* Default configuration object with both core and text-specific settings
|
|
11
|
+
*/
|
|
12
|
+
export const config = {
|
|
13
|
+
// Core settings
|
|
14
|
+
chunk_size: parseInt(process.env.RAG_CHUNK_SIZE || '250', 10),
|
|
15
|
+
chunk_overlap: parseInt(process.env.RAG_CHUNK_OVERLAP || '50', 10),
|
|
16
|
+
batch_size: parseInt(process.env.RAG_BATCH_SIZE || '16', 10),
|
|
17
|
+
top_k: parseInt(process.env.RAG_TOP_K || '10', 10),
|
|
18
|
+
db_file: process.env.RAG_DB_FILE || 'db.sqlite',
|
|
19
|
+
index_file: process.env.RAG_INDEX_FILE || 'vector-index.bin',
|
|
20
|
+
model_cache_path: process.env.RAG_MODEL_CACHE_PATH || getDefaultModelCachePath(),
|
|
21
|
+
path_storage_strategy: process.env.RAG_PATH_STORAGE_STRATEGY || 'relative',
|
|
22
|
+
// Text-specific settings
|
|
23
|
+
embedding_model: process.env.RAG_EMBEDDING_MODEL || 'sentence-transformers/all-MiniLM-L6-v2',
|
|
24
|
+
rerank_enabled: process.env.RAG_RERANK_ENABLED !== 'false', // Default to true unless explicitly disabled
|
|
25
|
+
rerank_model: process.env.RAG_RERANK_MODEL || 'cross-encoder/ms-marco-MiniLM-L-6-v2',
|
|
26
|
+
// Preprocessing settings
|
|
27
|
+
preprocessing: {
|
|
28
|
+
enabled: process.env.RAG_PREPROCESSING_ENABLED !== 'false',
|
|
29
|
+
mdx: process.env.RAG_PREPROCESSING_MDX !== 'false',
|
|
30
|
+
mermaid: process.env.RAG_PREPROCESSING_MERMAID !== 'false',
|
|
31
|
+
code_blocks: process.env.RAG_PREPROCESSING_CODE_BLOCKS !== 'false'
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
// Re-export everything from core config
|
|
35
|
+
export * from './core/config.js';
|
|
36
|
+
/**
|
|
37
|
+
* Validate complete configuration including text-specific settings
|
|
38
|
+
*/
|
|
39
|
+
export function validateConfig(config) {
|
|
40
|
+
// First validate core config
|
|
41
|
+
const { validateCoreConfig } = require('./core/config.js');
|
|
42
|
+
validateCoreConfig(config);
|
|
43
|
+
// Validate text-specific settings
|
|
44
|
+
if (!config.embedding_model || typeof config.embedding_model !== 'string') {
|
|
45
|
+
throw new Error('embedding_model must be a non-empty string');
|
|
46
|
+
}
|
|
47
|
+
if (typeof config.rerank_enabled !== 'boolean') {
|
|
48
|
+
throw new Error('rerank_enabled must be a boolean');
|
|
49
|
+
}
|
|
50
|
+
if (!config.rerank_model || typeof config.rerank_model !== 'string') {
|
|
51
|
+
throw new Error('rerank_model must be a non-empty string');
|
|
52
|
+
}
|
|
53
|
+
if (!config.preprocessing || typeof config.preprocessing !== 'object') {
|
|
54
|
+
throw new Error('preprocessing must be an object');
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Validate preprocessing configuration
|
|
59
|
+
*/
|
|
60
|
+
export function validatePreprocessingConfig(config) {
|
|
61
|
+
return config &&
|
|
62
|
+
typeof config === 'object' &&
|
|
63
|
+
typeof config.enabled === 'boolean' &&
|
|
64
|
+
typeof config.mdx === 'boolean' &&
|
|
65
|
+
typeof config.mermaid === 'boolean' &&
|
|
66
|
+
typeof config.code_blocks === 'boolean';
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Merge preprocessing configurations
|
|
70
|
+
*/
|
|
71
|
+
export function mergePreprocessingConfig(base, override) {
|
|
72
|
+
return {
|
|
73
|
+
enabled: override.enabled !== undefined ? override.enabled : base.enabled,
|
|
74
|
+
mdx: override.mdx !== undefined ? override.mdx : base.mdx,
|
|
75
|
+
mermaid: override.mermaid !== undefined ? override.mermaid : base.mermaid,
|
|
76
|
+
code_blocks: override.code_blocks !== undefined ? override.code_blocks : base.code_blocks
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=config.js.map
|