rag-lite-ts 2.1.1 → 2.3.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/README.md +88 -5
- package/dist/{cli → cjs/cli}/indexer.js +73 -15
- package/dist/cjs/cli/ui-server.d.ts +5 -0
- package/dist/cjs/cli/ui-server.js +152 -0
- package/dist/{cli.js → cjs/cli.js} +25 -6
- package/dist/{core → cjs/core}/binary-index-format.js +6 -3
- package/dist/{core → cjs/core}/db.d.ts +56 -0
- package/dist/{core → cjs/core}/db.js +105 -0
- package/dist/{core → cjs/core}/ingestion.js +3 -0
- package/dist/cjs/core/knowledge-base-manager.d.ts +109 -0
- package/dist/cjs/core/knowledge-base-manager.js +256 -0
- package/dist/{core → cjs/core}/model-validator.js +1 -1
- package/dist/{core → cjs/core}/search-pipeline.js +1 -1
- package/dist/{core → cjs/core}/search.js +1 -1
- package/dist/cjs/core/vector-index-messages.d.ts +52 -0
- package/dist/cjs/core/vector-index-messages.js +5 -0
- package/dist/cjs/core/vector-index-worker.d.ts +6 -0
- package/dist/cjs/core/vector-index-worker.js +304 -0
- package/dist/cjs/core/vector-index.d.ts +107 -0
- package/dist/cjs/core/vector-index.js +344 -0
- package/dist/{factories → cjs/factories}/ingestion-factory.js +3 -7
- package/dist/{factories → cjs/factories}/search-factory.js +11 -0
- package/dist/{index-manager.d.ts → cjs/index-manager.d.ts} +23 -3
- package/dist/{index-manager.js → cjs/index-manager.js} +84 -15
- package/dist/{index.d.ts → cjs/index.d.ts} +2 -1
- package/dist/{index.js → cjs/index.js} +3 -1
- 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 +529 -0
- package/dist/esm/cli/search.d.ts +7 -0
- package/dist/esm/cli/search.js +332 -0
- package/dist/esm/cli/ui-server.d.ts +5 -0
- package/dist/esm/cli/ui-server.js +152 -0
- package/dist/esm/cli.d.ts +3 -0
- package/dist/esm/cli.js +548 -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 +294 -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 +269 -0
- package/dist/esm/core/db.js +1000 -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 +904 -0
- package/dist/esm/core/interfaces.d.ts +408 -0
- package/dist/esm/core/interfaces.js +106 -0
- package/dist/esm/core/knowledge-base-manager.d.ts +109 -0
- package/dist/esm/core/knowledge-base-manager.js +256 -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-messages.d.ts +52 -0
- package/dist/esm/core/vector-index-messages.js +5 -0
- package/dist/esm/core/vector-index-worker.d.ts +6 -0
- package/dist/esm/core/vector-index-worker.js +304 -0
- package/dist/esm/core/vector-index.d.ts +107 -0
- package/dist/esm/core/vector-index.js +344 -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 +473 -0
- package/dist/esm/factories/search-factory.d.ts +154 -0
- package/dist/esm/factories/search-factory.js +355 -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 +136 -0
- package/dist/esm/index-manager.js +667 -0
- package/dist/esm/index.d.ts +76 -0
- package/dist/esm/index.js +112 -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 +39 -14
- package/dist/core/vector-index.d.ts +0 -72
- package/dist/core/vector-index.js +0 -331
- /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 → cjs/cli}/search.js +0 -0
- /package/dist/{cli.d.ts → cjs/cli.d.ts} +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}/binary-index-format.d.ts +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}/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}/ingestion.d.ts +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}/reranking-strategies.js +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.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.d.ts +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}/search-factory.d.ts +0 -0
- /package/dist/{file-processor.d.ts → cjs/file-processor.d.ts} +0 -0
- /package/dist/{file-processor.js → cjs/file-processor.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}/clip-embedder.js +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
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-Modal Search Implementation
|
|
3
|
+
*
|
|
4
|
+
* This module extends the core SearchEngine to provide cross-modal search capabilities
|
|
5
|
+
* that enable text queries to find images and image queries to find text content.
|
|
6
|
+
*
|
|
7
|
+
* Task 4.2: Implement cross-modal search functionality
|
|
8
|
+
* - Update search logic to handle mixed content type results
|
|
9
|
+
* - Ensure ranking works properly across text and image content
|
|
10
|
+
* - Test text queries finding relevant images and vice versa
|
|
11
|
+
*
|
|
12
|
+
* Requirements addressed:
|
|
13
|
+
* - 6.1: Enable text queries to find relevant image content
|
|
14
|
+
* - 6.2: Enable image queries to find relevant text content
|
|
15
|
+
* - 6.3: Rank mixed content types by semantic similarity
|
|
16
|
+
*/
|
|
17
|
+
import { SearchEngine } from './search.js';
|
|
18
|
+
import { cosineSimilarity } from '../utils/vector-math.js';
|
|
19
|
+
/**
|
|
20
|
+
* Cross-Modal Search Engine
|
|
21
|
+
*
|
|
22
|
+
* Extends the core SearchEngine to provide cross-modal search capabilities.
|
|
23
|
+
* This implementation enables:
|
|
24
|
+
* - Text queries finding semantically similar images
|
|
25
|
+
* - Image queries finding semantically similar text
|
|
26
|
+
* - Mixed content type results ranked by semantic similarity
|
|
27
|
+
* - Unified embedding space leveraging CLIP models
|
|
28
|
+
*/
|
|
29
|
+
export class CrossModalSearchEngine extends SearchEngine {
|
|
30
|
+
embedder; // Reference to the embedder for cross-modal operations
|
|
31
|
+
constructor(embedFn, indexManager, db, rerankFn, contentResolver, embedder) {
|
|
32
|
+
super(embedFn, indexManager, db, rerankFn, contentResolver);
|
|
33
|
+
this.embedder = embedder;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Perform cross-modal search that can find content across different modalities
|
|
37
|
+
*
|
|
38
|
+
* This method extends the base search functionality to:
|
|
39
|
+
* 1. Detect query content type (text or image path)
|
|
40
|
+
* 2. Generate appropriate embeddings for the query
|
|
41
|
+
* 3. Search across all content types in the unified embedding space
|
|
42
|
+
* 4. Rank results by semantic similarity regardless of content type
|
|
43
|
+
* 5. Apply cross-modal ranking adjustments
|
|
44
|
+
*
|
|
45
|
+
* @param query - Search query (text string or image path)
|
|
46
|
+
* @param options - Cross-modal search options
|
|
47
|
+
* @returns Promise resolving to cross-modal search results
|
|
48
|
+
*/
|
|
49
|
+
async crossModalSearch(query, options = {}) {
|
|
50
|
+
console.log(`🔍 Cross-modal search: "${query.substring(0, 50)}${query.length > 50 ? '...' : ''}"`);
|
|
51
|
+
// Step 1: Detect query content type
|
|
52
|
+
const queryContentType = this.detectQueryContentType(query);
|
|
53
|
+
console.log(`📝 Query content type: ${queryContentType}`);
|
|
54
|
+
// Step 2: Perform base search with detected content type
|
|
55
|
+
const baseResults = await this.search(query, {
|
|
56
|
+
...options,
|
|
57
|
+
contentType: queryContentType
|
|
58
|
+
});
|
|
59
|
+
// Step 3: Convert to cross-modal results with enhanced metadata
|
|
60
|
+
const crossModalResults = await this.enhanceResultsWithCrossModalInfo(baseResults, query, queryContentType, options);
|
|
61
|
+
// Step 4: Apply cross-modal ranking if enabled
|
|
62
|
+
if (options.enableCrossModalRanking !== false) {
|
|
63
|
+
return this.applyCrossModalRanking(crossModalResults, query, queryContentType, options);
|
|
64
|
+
}
|
|
65
|
+
return crossModalResults;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Search for images using text queries
|
|
69
|
+
*
|
|
70
|
+
* @param textQuery - Text description to search for
|
|
71
|
+
* @param options - Search options
|
|
72
|
+
* @returns Promise resolving to image search results
|
|
73
|
+
*/
|
|
74
|
+
async searchImagesWithText(textQuery, options = {}) {
|
|
75
|
+
console.log(`🖼️ Text-to-image search: "${textQuery}"`);
|
|
76
|
+
const searchOptions = {
|
|
77
|
+
...options,
|
|
78
|
+
includeContentTypes: ['image'],
|
|
79
|
+
enableCrossModalRanking: true
|
|
80
|
+
};
|
|
81
|
+
return this.crossModalSearch(textQuery, searchOptions);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Search for text using image queries
|
|
85
|
+
*
|
|
86
|
+
* @param imagePath - Path to image file to search with
|
|
87
|
+
* @param options - Search options
|
|
88
|
+
* @returns Promise resolving to text search results
|
|
89
|
+
*/
|
|
90
|
+
async searchTextWithImage(imagePath, options = {}) {
|
|
91
|
+
console.log(`📝 Image-to-text search: "${imagePath}"`);
|
|
92
|
+
const searchOptions = {
|
|
93
|
+
...options,
|
|
94
|
+
includeContentTypes: ['text'],
|
|
95
|
+
enableCrossModalRanking: true
|
|
96
|
+
};
|
|
97
|
+
return this.crossModalSearch(imagePath, searchOptions);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Search across all content types with unified ranking
|
|
101
|
+
*
|
|
102
|
+
* @param query - Search query (text or image path)
|
|
103
|
+
* @param options - Search options
|
|
104
|
+
* @returns Promise resolving to mixed content type results
|
|
105
|
+
*/
|
|
106
|
+
async searchUnified(query, options = {}) {
|
|
107
|
+
console.log(`🌐 Unified cross-modal search: "${query.substring(0, 50)}${query.length > 50 ? '...' : ''}"`);
|
|
108
|
+
const searchOptions = {
|
|
109
|
+
...options,
|
|
110
|
+
includeContentTypes: ['text', 'image'],
|
|
111
|
+
enableCrossModalRanking: true
|
|
112
|
+
};
|
|
113
|
+
return this.crossModalSearch(query, searchOptions);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Detect the content type of a query
|
|
117
|
+
* @private
|
|
118
|
+
*/
|
|
119
|
+
detectQueryContentType(query) {
|
|
120
|
+
// Simple heuristic: if query looks like a file path with image extension, treat as image
|
|
121
|
+
const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.bmp'];
|
|
122
|
+
const lowerQuery = query.toLowerCase();
|
|
123
|
+
if (imageExtensions.some(ext => lowerQuery.endsWith(ext))) {
|
|
124
|
+
return 'image';
|
|
125
|
+
}
|
|
126
|
+
// Default to text for all other queries
|
|
127
|
+
return 'text';
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Enhance search results with cross-modal information
|
|
131
|
+
* @private
|
|
132
|
+
*/
|
|
133
|
+
async enhanceResultsWithCrossModalInfo(results, query, queryContentType, options) {
|
|
134
|
+
const enhancedResults = [];
|
|
135
|
+
for (const result of results) {
|
|
136
|
+
const resultContentType = result.contentType || 'text';
|
|
137
|
+
const isCrossModal = queryContentType !== resultContentType;
|
|
138
|
+
// Filter by content type if specified
|
|
139
|
+
if (options.includeContentTypes &&
|
|
140
|
+
!options.includeContentTypes.includes(resultContentType)) {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
// Calculate semantic similarity for cross-modal results
|
|
144
|
+
let semanticSimilarity;
|
|
145
|
+
if (isCrossModal && this.embedder) {
|
|
146
|
+
try {
|
|
147
|
+
semanticSimilarity = await this.calculateSemanticSimilarity(query, result.content, queryContentType, resultContentType);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
console.warn(`Failed to calculate semantic similarity: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Apply cross-modal threshold if specified
|
|
154
|
+
if (options.crossModalThreshold &&
|
|
155
|
+
isCrossModal &&
|
|
156
|
+
semanticSimilarity !== undefined &&
|
|
157
|
+
semanticSimilarity < options.crossModalThreshold) {
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
enhancedResults.push({
|
|
161
|
+
...result,
|
|
162
|
+
isCrossModal,
|
|
163
|
+
semanticSimilarity,
|
|
164
|
+
originalScore: result.score
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return enhancedResults;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Apply cross-modal ranking to results
|
|
171
|
+
* @private
|
|
172
|
+
*/
|
|
173
|
+
applyCrossModalRanking(results, query, queryContentType, options) {
|
|
174
|
+
console.log(`🎯 Applying cross-modal ranking to ${results.length} results`);
|
|
175
|
+
// Sort results by a combination of original score and semantic similarity
|
|
176
|
+
const rankedResults = results.sort((a, b) => {
|
|
177
|
+
// For cross-modal results, use semantic similarity if available
|
|
178
|
+
if (a.isCrossModal && a.semanticSimilarity !== undefined) {
|
|
179
|
+
const aScore = a.semanticSimilarity;
|
|
180
|
+
const bScore = b.isCrossModal && b.semanticSimilarity !== undefined
|
|
181
|
+
? b.semanticSimilarity
|
|
182
|
+
: b.score;
|
|
183
|
+
return bScore - aScore;
|
|
184
|
+
}
|
|
185
|
+
if (b.isCrossModal && b.semanticSimilarity !== undefined) {
|
|
186
|
+
const aScore = a.isCrossModal && a.semanticSimilarity !== undefined
|
|
187
|
+
? a.semanticSimilarity
|
|
188
|
+
: a.score;
|
|
189
|
+
const bScore = b.semanticSimilarity;
|
|
190
|
+
return bScore - aScore;
|
|
191
|
+
}
|
|
192
|
+
// For same-modal results, use original score
|
|
193
|
+
return b.score - a.score;
|
|
194
|
+
});
|
|
195
|
+
// Update scores based on ranking
|
|
196
|
+
rankedResults.forEach((result, index) => {
|
|
197
|
+
if (result.isCrossModal && result.semanticSimilarity !== undefined) {
|
|
198
|
+
// Use semantic similarity as the primary score for cross-modal results
|
|
199
|
+
result.score = result.semanticSimilarity;
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
console.log(`✅ Cross-modal ranking applied: ${rankedResults.length} results ranked`);
|
|
203
|
+
return rankedResults;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Calculate semantic similarity between query and result content
|
|
207
|
+
* @private
|
|
208
|
+
*/
|
|
209
|
+
async calculateSemanticSimilarity(query, resultContent, queryContentType, resultContentType) {
|
|
210
|
+
if (!this.embedder) {
|
|
211
|
+
throw new Error('Embedder not available for semantic similarity calculation');
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
// Generate embeddings for both query and result
|
|
215
|
+
let queryEmbedding;
|
|
216
|
+
let resultEmbedding;
|
|
217
|
+
if (queryContentType === 'image') {
|
|
218
|
+
queryEmbedding = await this.embedder.embedImage(query);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
queryEmbedding = await this.embedder.embedText(query);
|
|
222
|
+
}
|
|
223
|
+
if (resultContentType === 'image') {
|
|
224
|
+
// For image results, we need the image path from metadata
|
|
225
|
+
// This is a simplified approach - in practice, you'd need proper image path resolution
|
|
226
|
+
resultEmbedding = await this.embedder.embedText(resultContent); // Fallback to text
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
resultEmbedding = await this.embedder.embedText(resultContent);
|
|
230
|
+
}
|
|
231
|
+
// Calculate cosine similarity
|
|
232
|
+
const similarity = cosineSimilarity(queryEmbedding.vector, resultEmbedding.vector);
|
|
233
|
+
return Math.max(0, similarity); // Ensure non-negative similarity
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
console.warn(`Semantic similarity calculation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
237
|
+
return 0;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Get cross-modal search statistics
|
|
242
|
+
*/
|
|
243
|
+
async getCrossModalStats() {
|
|
244
|
+
const baseStats = await this.getStats();
|
|
245
|
+
// This would need to be implemented with actual database queries
|
|
246
|
+
// For now, return basic stats with cross-modal indicators
|
|
247
|
+
return {
|
|
248
|
+
totalChunks: baseStats.totalChunks,
|
|
249
|
+
textChunks: baseStats.totalChunks, // Placeholder
|
|
250
|
+
imageChunks: 0, // Placeholder
|
|
251
|
+
crossModalCapable: this.embedder !== undefined,
|
|
252
|
+
supportedContentTypes: this.embedder?.supportedContentTypes || ['text']
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Factory function to create a cross-modal search engine
|
|
258
|
+
*
|
|
259
|
+
* @param embedFn - Embedding function that supports multiple content types
|
|
260
|
+
* @param indexManager - Vector index manager
|
|
261
|
+
* @param db - Database connection
|
|
262
|
+
* @param rerankFn - Optional reranking function
|
|
263
|
+
* @param contentResolver - Content resolver for unified content system
|
|
264
|
+
* @param embedder - Reference to the embedder for cross-modal operations
|
|
265
|
+
* @returns CrossModalSearchEngine instance
|
|
266
|
+
*/
|
|
267
|
+
export function createCrossModalSearchEngine(embedFn, indexManager, db, rerankFn, contentResolver, embedder) {
|
|
268
|
+
return new CrossModalSearchEngine(embedFn, indexManager, db, rerankFn, contentResolver, embedder);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Utility function to check if a search engine supports cross-modal search
|
|
272
|
+
*
|
|
273
|
+
* @param searchEngine - Search engine to check
|
|
274
|
+
* @returns True if the engine supports cross-modal search
|
|
275
|
+
*/
|
|
276
|
+
export function supportsCrossModalSearch(searchEngine) {
|
|
277
|
+
return searchEngine instanceof CrossModalSearchEngine;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Cross-modal search result analyzer
|
|
281
|
+
* Provides utilities for analyzing cross-modal search results
|
|
282
|
+
*/
|
|
283
|
+
export class CrossModalResultAnalyzer {
|
|
284
|
+
/**
|
|
285
|
+
* Analyze cross-modal search results
|
|
286
|
+
*/
|
|
287
|
+
static analyzeResults(results) {
|
|
288
|
+
const analysis = {
|
|
289
|
+
totalResults: results.length,
|
|
290
|
+
crossModalResults: 0,
|
|
291
|
+
sameModalResults: 0,
|
|
292
|
+
averageSemanticSimilarity: 0,
|
|
293
|
+
contentTypeDistribution: {}
|
|
294
|
+
};
|
|
295
|
+
let totalSimilarity = 0;
|
|
296
|
+
let similarityCount = 0;
|
|
297
|
+
for (const result of results) {
|
|
298
|
+
// Count cross-modal vs same-modal results
|
|
299
|
+
if (result.isCrossModal) {
|
|
300
|
+
analysis.crossModalResults++;
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
analysis.sameModalResults++;
|
|
304
|
+
}
|
|
305
|
+
// Track semantic similarity
|
|
306
|
+
if (result.semanticSimilarity !== undefined) {
|
|
307
|
+
totalSimilarity += result.semanticSimilarity;
|
|
308
|
+
similarityCount++;
|
|
309
|
+
}
|
|
310
|
+
// Track content type distribution
|
|
311
|
+
const contentType = result.contentType || 'unknown';
|
|
312
|
+
analysis.contentTypeDistribution[contentType] =
|
|
313
|
+
(analysis.contentTypeDistribution[contentType] || 0) + 1;
|
|
314
|
+
}
|
|
315
|
+
// Calculate average semantic similarity
|
|
316
|
+
if (similarityCount > 0) {
|
|
317
|
+
analysis.averageSemanticSimilarity = totalSimilarity / similarityCount;
|
|
318
|
+
}
|
|
319
|
+
return analysis;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Generate a summary report of cross-modal search results
|
|
323
|
+
*/
|
|
324
|
+
static generateReport(results, query) {
|
|
325
|
+
const analysis = this.analyzeResults(results);
|
|
326
|
+
let report = `Cross-Modal Search Report\n`;
|
|
327
|
+
report += `========================\n`;
|
|
328
|
+
report += `Query: "${query.substring(0, 50)}${query.length > 50 ? '...' : ''}"\n`;
|
|
329
|
+
report += `Total Results: ${analysis.totalResults}\n`;
|
|
330
|
+
report += `Cross-Modal Results: ${analysis.crossModalResults}\n`;
|
|
331
|
+
report += `Same-Modal Results: ${analysis.sameModalResults}\n`;
|
|
332
|
+
if (analysis.averageSemanticSimilarity > 0) {
|
|
333
|
+
report += `Average Semantic Similarity: ${analysis.averageSemanticSimilarity.toFixed(4)}\n`;
|
|
334
|
+
}
|
|
335
|
+
report += `\nContent Type Distribution:\n`;
|
|
336
|
+
for (const [type, count] of Object.entries(analysis.contentTypeDistribution)) {
|
|
337
|
+
report += ` ${type}: ${count}\n`;
|
|
338
|
+
}
|
|
339
|
+
return report;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=cross-modal-search.js.map
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Connection Manager - Centralized connection handling
|
|
3
|
+
* Prevents database locking issues by managing shared connections
|
|
4
|
+
* Addresses production issues with MCP server + CLI concurrent usage
|
|
5
|
+
*/
|
|
6
|
+
import { type DatabaseConnection } from './db.js';
|
|
7
|
+
/**
|
|
8
|
+
* Database Connection Manager
|
|
9
|
+
* Manages shared database connections to prevent locking issues
|
|
10
|
+
*/
|
|
11
|
+
export declare class DatabaseConnectionManager {
|
|
12
|
+
private static connections;
|
|
13
|
+
private static cleanupInterval;
|
|
14
|
+
private static readonly CLEANUP_INTERVAL;
|
|
15
|
+
private static readonly MAX_IDLE_TIME;
|
|
16
|
+
/**
|
|
17
|
+
* Get a shared database connection
|
|
18
|
+
* Creates new connection if none exists, otherwise returns existing
|
|
19
|
+
*/
|
|
20
|
+
static getConnection(dbPath: string): Promise<DatabaseConnection>;
|
|
21
|
+
/**
|
|
22
|
+
* Release a database connection reference
|
|
23
|
+
* Connection is kept alive for potential reuse
|
|
24
|
+
*/
|
|
25
|
+
static releaseConnection(dbPath: string): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Force close a specific database connection
|
|
28
|
+
* Use with caution - only for cleanup or error recovery
|
|
29
|
+
*/
|
|
30
|
+
static forceCloseConnection(dbPath: string): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Close all database connections
|
|
33
|
+
* Used during application shutdown
|
|
34
|
+
*/
|
|
35
|
+
static closeAllConnections(): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Get connection statistics for monitoring
|
|
38
|
+
*/
|
|
39
|
+
static getConnectionStats(): {
|
|
40
|
+
totalConnections: number;
|
|
41
|
+
connections: Array<{
|
|
42
|
+
path: string;
|
|
43
|
+
refCount: number;
|
|
44
|
+
lastAccessed: Date;
|
|
45
|
+
idleTime: number;
|
|
46
|
+
}>;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Check if a connection exists for a given path
|
|
50
|
+
*/
|
|
51
|
+
static hasConnection(dbPath: string): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Wait for database to become available
|
|
54
|
+
* Useful for handling temporary locking issues
|
|
55
|
+
*/
|
|
56
|
+
static waitForDatabaseAccess(dbPath: string, maxWaitMs?: number): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Normalize database path for consistent key usage
|
|
59
|
+
*/
|
|
60
|
+
private static normalizePath;
|
|
61
|
+
/**
|
|
62
|
+
* Start the cleanup timer for idle connections
|
|
63
|
+
* Only start if not in CLI mode to prevent hanging
|
|
64
|
+
*/
|
|
65
|
+
private static startCleanupTimer;
|
|
66
|
+
/**
|
|
67
|
+
* Clean up idle connections that haven't been used recently
|
|
68
|
+
*/
|
|
69
|
+
private static cleanupIdleConnections;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Convenience function to get a managed database connection
|
|
73
|
+
* Use this instead of openDatabase() directly
|
|
74
|
+
*/
|
|
75
|
+
export declare function getManagedConnection(dbPath: string): Promise<DatabaseConnection>;
|
|
76
|
+
/**
|
|
77
|
+
* Convenience function to release a managed database connection
|
|
78
|
+
* Use this instead of connection.close() directly
|
|
79
|
+
*/
|
|
80
|
+
export declare function releaseManagedConnection(dbPath: string): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Enhanced database connection wrapper
|
|
83
|
+
* Automatically manages connection lifecycle
|
|
84
|
+
*/
|
|
85
|
+
export declare class ManagedDatabaseConnection {
|
|
86
|
+
private dbPath;
|
|
87
|
+
private connection;
|
|
88
|
+
constructor(dbPath: string);
|
|
89
|
+
/**
|
|
90
|
+
* Get the underlying database connection
|
|
91
|
+
* Automatically acquires managed connection on first use
|
|
92
|
+
*/
|
|
93
|
+
getConnection(): Promise<DatabaseConnection>;
|
|
94
|
+
/**
|
|
95
|
+
* Execute a database operation with automatic connection management
|
|
96
|
+
*/
|
|
97
|
+
execute<T>(operation: (db: DatabaseConnection) => Promise<T>): Promise<T>;
|
|
98
|
+
/**
|
|
99
|
+
* Release the managed connection
|
|
100
|
+
* Connection may be kept alive for reuse by other components
|
|
101
|
+
*/
|
|
102
|
+
release(): Promise<void>;
|
|
103
|
+
/**
|
|
104
|
+
* Force close the connection
|
|
105
|
+
* Use only during cleanup or error recovery
|
|
106
|
+
*/
|
|
107
|
+
forceClose(): Promise<void>;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=database-connection-manager.d.ts.map
|