rag-lite-ts 2.1.1 → 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.
Files changed (309) hide show
  1. package/dist/{core → cjs/core}/model-validator.js +1 -1
  2. package/dist/{core → cjs/core}/vector-index.js +4 -2
  3. package/dist/esm/api-errors.d.ts +90 -0
  4. package/dist/esm/api-errors.js +320 -0
  5. package/dist/esm/cli/indexer.d.ts +11 -0
  6. package/dist/esm/cli/indexer.js +471 -0
  7. package/dist/esm/cli/search.d.ts +7 -0
  8. package/dist/esm/cli/search.js +332 -0
  9. package/dist/esm/cli.d.ts +3 -0
  10. package/dist/esm/cli.js +529 -0
  11. package/dist/esm/config.d.ts +51 -0
  12. package/dist/esm/config.js +79 -0
  13. package/dist/esm/core/abstract-embedder.d.ts +125 -0
  14. package/dist/esm/core/abstract-embedder.js +264 -0
  15. package/dist/esm/core/actionable-error-messages.d.ts +60 -0
  16. package/dist/esm/core/actionable-error-messages.js +397 -0
  17. package/dist/esm/core/adapters.d.ts +93 -0
  18. package/dist/esm/core/adapters.js +139 -0
  19. package/dist/esm/core/batch-processing-optimizer.d.ts +155 -0
  20. package/dist/esm/core/batch-processing-optimizer.js +536 -0
  21. package/dist/esm/core/binary-index-format.d.ts +78 -0
  22. package/dist/esm/core/binary-index-format.js +291 -0
  23. package/dist/esm/core/chunker.d.ts +119 -0
  24. package/dist/esm/core/chunker.js +73 -0
  25. package/dist/esm/core/cli-database-utils.d.ts +53 -0
  26. package/dist/esm/core/cli-database-utils.js +239 -0
  27. package/dist/esm/core/config.d.ts +102 -0
  28. package/dist/esm/core/config.js +247 -0
  29. package/dist/esm/core/content-errors.d.ts +111 -0
  30. package/dist/esm/core/content-errors.js +362 -0
  31. package/dist/esm/core/content-manager.d.ts +335 -0
  32. package/dist/esm/core/content-manager.js +1476 -0
  33. package/dist/esm/core/content-performance-optimizer.d.ts +150 -0
  34. package/dist/esm/core/content-performance-optimizer.js +516 -0
  35. package/dist/esm/core/content-resolver.d.ts +104 -0
  36. package/dist/esm/core/content-resolver.js +285 -0
  37. package/dist/esm/core/cross-modal-search.d.ts +164 -0
  38. package/dist/esm/core/cross-modal-search.js +342 -0
  39. package/dist/esm/core/database-connection-manager.d.ts +109 -0
  40. package/dist/esm/core/database-connection-manager.js +310 -0
  41. package/dist/esm/core/db.d.ts +213 -0
  42. package/dist/esm/core/db.js +895 -0
  43. package/dist/esm/core/embedder-factory.d.ts +154 -0
  44. package/dist/esm/core/embedder-factory.js +311 -0
  45. package/dist/esm/core/error-handler.d.ts +112 -0
  46. package/dist/esm/core/error-handler.js +239 -0
  47. package/dist/esm/core/index.d.ts +59 -0
  48. package/dist/esm/core/index.js +69 -0
  49. package/dist/esm/core/ingestion.d.ts +202 -0
  50. package/dist/esm/core/ingestion.js +901 -0
  51. package/dist/esm/core/interfaces.d.ts +408 -0
  52. package/dist/esm/core/interfaces.js +106 -0
  53. package/dist/esm/core/lazy-dependency-loader.d.ts +147 -0
  54. package/dist/esm/core/lazy-dependency-loader.js +435 -0
  55. package/dist/esm/core/mode-detection-service.d.ts +150 -0
  56. package/dist/esm/core/mode-detection-service.js +565 -0
  57. package/dist/esm/core/mode-model-validator.d.ts +92 -0
  58. package/dist/esm/core/mode-model-validator.js +203 -0
  59. package/dist/esm/core/model-registry.d.ts +116 -0
  60. package/dist/esm/core/model-registry.js +411 -0
  61. package/dist/esm/core/model-validator.d.ts +217 -0
  62. package/dist/esm/core/model-validator.js +782 -0
  63. package/dist/esm/core/path-manager.d.ts +47 -0
  64. package/dist/esm/core/path-manager.js +71 -0
  65. package/dist/esm/core/raglite-paths.d.ts +121 -0
  66. package/dist/esm/core/raglite-paths.js +145 -0
  67. package/dist/esm/core/reranking-config.d.ts +42 -0
  68. package/dist/esm/core/reranking-config.js +147 -0
  69. package/dist/esm/core/reranking-factory.d.ts +92 -0
  70. package/dist/esm/core/reranking-factory.js +410 -0
  71. package/dist/esm/core/reranking-strategies.d.ts +310 -0
  72. package/dist/esm/core/reranking-strategies.js +650 -0
  73. package/dist/esm/core/resource-cleanup.d.ts +163 -0
  74. package/dist/esm/core/resource-cleanup.js +371 -0
  75. package/dist/esm/core/resource-manager.d.ts +212 -0
  76. package/dist/esm/core/resource-manager.js +564 -0
  77. package/dist/esm/core/search-pipeline.d.ts +111 -0
  78. package/dist/esm/core/search-pipeline.js +287 -0
  79. package/dist/esm/core/search.d.ts +141 -0
  80. package/dist/esm/core/search.js +320 -0
  81. package/dist/esm/core/streaming-operations.d.ts +145 -0
  82. package/dist/esm/core/streaming-operations.js +409 -0
  83. package/dist/esm/core/types.d.ts +66 -0
  84. package/dist/esm/core/types.js +6 -0
  85. package/dist/esm/core/universal-embedder.d.ts +177 -0
  86. package/dist/esm/core/universal-embedder.js +139 -0
  87. package/dist/esm/core/validation-messages.d.ts +99 -0
  88. package/dist/esm/core/validation-messages.js +334 -0
  89. package/dist/esm/core/vector-index.d.ts +72 -0
  90. package/dist/esm/core/vector-index.js +333 -0
  91. package/dist/esm/dom-polyfills.d.ts +6 -0
  92. package/dist/esm/dom-polyfills.js +37 -0
  93. package/dist/esm/factories/index.d.ts +27 -0
  94. package/dist/esm/factories/index.js +29 -0
  95. package/dist/esm/factories/ingestion-factory.d.ts +200 -0
  96. package/dist/esm/factories/ingestion-factory.js +477 -0
  97. package/dist/esm/factories/search-factory.d.ts +154 -0
  98. package/dist/esm/factories/search-factory.js +344 -0
  99. package/dist/esm/file-processor.d.ts +147 -0
  100. package/dist/esm/file-processor.js +963 -0
  101. package/dist/esm/index-manager.d.ts +116 -0
  102. package/dist/esm/index-manager.js +598 -0
  103. package/dist/esm/index.d.ts +75 -0
  104. package/dist/esm/index.js +110 -0
  105. package/dist/esm/indexer.d.ts +7 -0
  106. package/dist/esm/indexer.js +54 -0
  107. package/dist/esm/ingestion.d.ts +63 -0
  108. package/dist/esm/ingestion.js +124 -0
  109. package/dist/esm/mcp-server.d.ts +46 -0
  110. package/dist/esm/mcp-server.js +1820 -0
  111. package/dist/esm/multimodal/clip-embedder.d.ts +327 -0
  112. package/dist/esm/multimodal/clip-embedder.js +996 -0
  113. package/dist/esm/multimodal/index.d.ts +6 -0
  114. package/dist/esm/multimodal/index.js +6 -0
  115. package/dist/esm/preprocess.d.ts +19 -0
  116. package/dist/esm/preprocess.js +203 -0
  117. package/dist/esm/preprocessors/index.d.ts +17 -0
  118. package/dist/esm/preprocessors/index.js +38 -0
  119. package/dist/esm/preprocessors/mdx.d.ts +25 -0
  120. package/dist/esm/preprocessors/mdx.js +101 -0
  121. package/dist/esm/preprocessors/mermaid.d.ts +68 -0
  122. package/dist/esm/preprocessors/mermaid.js +329 -0
  123. package/dist/esm/preprocessors/registry.d.ts +56 -0
  124. package/dist/esm/preprocessors/registry.js +179 -0
  125. package/dist/esm/run-error-recovery-tests.d.ts +7 -0
  126. package/dist/esm/run-error-recovery-tests.js +101 -0
  127. package/dist/esm/search-standalone.d.ts +7 -0
  128. package/dist/esm/search-standalone.js +117 -0
  129. package/dist/esm/search.d.ts +99 -0
  130. package/dist/esm/search.js +177 -0
  131. package/dist/esm/test-utils.d.ts +18 -0
  132. package/dist/esm/test-utils.js +27 -0
  133. package/dist/esm/text/chunker.d.ts +33 -0
  134. package/dist/esm/text/chunker.js +279 -0
  135. package/dist/esm/text/embedder.d.ts +111 -0
  136. package/dist/esm/text/embedder.js +386 -0
  137. package/dist/esm/text/index.d.ts +8 -0
  138. package/dist/esm/text/index.js +9 -0
  139. package/dist/esm/text/preprocessors/index.d.ts +17 -0
  140. package/dist/esm/text/preprocessors/index.js +38 -0
  141. package/dist/esm/text/preprocessors/mdx.d.ts +25 -0
  142. package/dist/esm/text/preprocessors/mdx.js +101 -0
  143. package/dist/esm/text/preprocessors/mermaid.d.ts +68 -0
  144. package/dist/esm/text/preprocessors/mermaid.js +330 -0
  145. package/dist/esm/text/preprocessors/registry.d.ts +56 -0
  146. package/dist/esm/text/preprocessors/registry.js +180 -0
  147. package/dist/esm/text/reranker.d.ts +49 -0
  148. package/dist/esm/text/reranker.js +274 -0
  149. package/dist/esm/text/sentence-transformer-embedder.d.ts +96 -0
  150. package/dist/esm/text/sentence-transformer-embedder.js +340 -0
  151. package/dist/esm/text/tokenizer.d.ts +22 -0
  152. package/dist/esm/text/tokenizer.js +64 -0
  153. package/dist/esm/types.d.ts +83 -0
  154. package/dist/esm/types.js +3 -0
  155. package/dist/esm/utils/vector-math.d.ts +31 -0
  156. package/dist/esm/utils/vector-math.js +70 -0
  157. package/package.json +30 -12
  158. /package/dist/{api-errors.d.ts → cjs/api-errors.d.ts} +0 -0
  159. /package/dist/{api-errors.js → cjs/api-errors.js} +0 -0
  160. /package/dist/{cli → cjs/cli}/indexer.d.ts +0 -0
  161. /package/dist/{cli → cjs/cli}/indexer.js +0 -0
  162. /package/dist/{cli → cjs/cli}/search.d.ts +0 -0
  163. /package/dist/{cli → cjs/cli}/search.js +0 -0
  164. /package/dist/{cli.d.ts → cjs/cli.d.ts} +0 -0
  165. /package/dist/{cli.js → cjs/cli.js} +0 -0
  166. /package/dist/{config.d.ts → cjs/config.d.ts} +0 -0
  167. /package/dist/{config.js → cjs/config.js} +0 -0
  168. /package/dist/{core → cjs/core}/abstract-embedder.d.ts +0 -0
  169. /package/dist/{core → cjs/core}/abstract-embedder.js +0 -0
  170. /package/dist/{core → cjs/core}/actionable-error-messages.d.ts +0 -0
  171. /package/dist/{core → cjs/core}/actionable-error-messages.js +0 -0
  172. /package/dist/{core → cjs/core}/adapters.d.ts +0 -0
  173. /package/dist/{core → cjs/core}/adapters.js +0 -0
  174. /package/dist/{core → cjs/core}/batch-processing-optimizer.d.ts +0 -0
  175. /package/dist/{core → cjs/core}/batch-processing-optimizer.js +0 -0
  176. /package/dist/{core → cjs/core}/binary-index-format.d.ts +0 -0
  177. /package/dist/{core → cjs/core}/binary-index-format.js +0 -0
  178. /package/dist/{core → cjs/core}/chunker.d.ts +0 -0
  179. /package/dist/{core → cjs/core}/chunker.js +0 -0
  180. /package/dist/{core → cjs/core}/cli-database-utils.d.ts +0 -0
  181. /package/dist/{core → cjs/core}/cli-database-utils.js +0 -0
  182. /package/dist/{core → cjs/core}/config.d.ts +0 -0
  183. /package/dist/{core → cjs/core}/config.js +0 -0
  184. /package/dist/{core → cjs/core}/content-errors.d.ts +0 -0
  185. /package/dist/{core → cjs/core}/content-errors.js +0 -0
  186. /package/dist/{core → cjs/core}/content-manager.d.ts +0 -0
  187. /package/dist/{core → cjs/core}/content-manager.js +0 -0
  188. /package/dist/{core → cjs/core}/content-performance-optimizer.d.ts +0 -0
  189. /package/dist/{core → cjs/core}/content-performance-optimizer.js +0 -0
  190. /package/dist/{core → cjs/core}/content-resolver.d.ts +0 -0
  191. /package/dist/{core → cjs/core}/content-resolver.js +0 -0
  192. /package/dist/{core → cjs/core}/cross-modal-search.d.ts +0 -0
  193. /package/dist/{core → cjs/core}/cross-modal-search.js +0 -0
  194. /package/dist/{core → cjs/core}/database-connection-manager.d.ts +0 -0
  195. /package/dist/{core → cjs/core}/database-connection-manager.js +0 -0
  196. /package/dist/{core → cjs/core}/db.d.ts +0 -0
  197. /package/dist/{core → cjs/core}/db.js +0 -0
  198. /package/dist/{core → cjs/core}/embedder-factory.d.ts +0 -0
  199. /package/dist/{core → cjs/core}/embedder-factory.js +0 -0
  200. /package/dist/{core → cjs/core}/error-handler.d.ts +0 -0
  201. /package/dist/{core → cjs/core}/error-handler.js +0 -0
  202. /package/dist/{core → cjs/core}/index.d.ts +0 -0
  203. /package/dist/{core → cjs/core}/index.js +0 -0
  204. /package/dist/{core → cjs/core}/ingestion.d.ts +0 -0
  205. /package/dist/{core → cjs/core}/ingestion.js +0 -0
  206. /package/dist/{core → cjs/core}/interfaces.d.ts +0 -0
  207. /package/dist/{core → cjs/core}/interfaces.js +0 -0
  208. /package/dist/{core → cjs/core}/lazy-dependency-loader.d.ts +0 -0
  209. /package/dist/{core → cjs/core}/lazy-dependency-loader.js +0 -0
  210. /package/dist/{core → cjs/core}/mode-detection-service.d.ts +0 -0
  211. /package/dist/{core → cjs/core}/mode-detection-service.js +0 -0
  212. /package/dist/{core → cjs/core}/mode-model-validator.d.ts +0 -0
  213. /package/dist/{core → cjs/core}/mode-model-validator.js +0 -0
  214. /package/dist/{core → cjs/core}/model-registry.d.ts +0 -0
  215. /package/dist/{core → cjs/core}/model-registry.js +0 -0
  216. /package/dist/{core → cjs/core}/model-validator.d.ts +0 -0
  217. /package/dist/{core → cjs/core}/path-manager.d.ts +0 -0
  218. /package/dist/{core → cjs/core}/path-manager.js +0 -0
  219. /package/dist/{core → cjs/core}/raglite-paths.d.ts +0 -0
  220. /package/dist/{core → cjs/core}/raglite-paths.js +0 -0
  221. /package/dist/{core → cjs/core}/reranking-config.d.ts +0 -0
  222. /package/dist/{core → cjs/core}/reranking-config.js +0 -0
  223. /package/dist/{core → cjs/core}/reranking-factory.d.ts +0 -0
  224. /package/dist/{core → cjs/core}/reranking-factory.js +0 -0
  225. /package/dist/{core → cjs/core}/reranking-strategies.d.ts +0 -0
  226. /package/dist/{core → cjs/core}/reranking-strategies.js +0 -0
  227. /package/dist/{core → cjs/core}/resource-cleanup.d.ts +0 -0
  228. /package/dist/{core → cjs/core}/resource-cleanup.js +0 -0
  229. /package/dist/{core → cjs/core}/resource-manager.d.ts +0 -0
  230. /package/dist/{core → cjs/core}/resource-manager.js +0 -0
  231. /package/dist/{core → cjs/core}/search-pipeline.d.ts +0 -0
  232. /package/dist/{core → cjs/core}/search-pipeline.js +0 -0
  233. /package/dist/{core → cjs/core}/search.d.ts +0 -0
  234. /package/dist/{core → cjs/core}/search.js +0 -0
  235. /package/dist/{core → cjs/core}/streaming-operations.d.ts +0 -0
  236. /package/dist/{core → cjs/core}/streaming-operations.js +0 -0
  237. /package/dist/{core → cjs/core}/types.d.ts +0 -0
  238. /package/dist/{core → cjs/core}/types.js +0 -0
  239. /package/dist/{core → cjs/core}/universal-embedder.d.ts +0 -0
  240. /package/dist/{core → cjs/core}/universal-embedder.js +0 -0
  241. /package/dist/{core → cjs/core}/validation-messages.d.ts +0 -0
  242. /package/dist/{core → cjs/core}/validation-messages.js +0 -0
  243. /package/dist/{core → cjs/core}/vector-index.d.ts +0 -0
  244. /package/dist/{dom-polyfills.d.ts → cjs/dom-polyfills.d.ts} +0 -0
  245. /package/dist/{dom-polyfills.js → cjs/dom-polyfills.js} +0 -0
  246. /package/dist/{factories → cjs/factories}/index.d.ts +0 -0
  247. /package/dist/{factories → cjs/factories}/index.js +0 -0
  248. /package/dist/{factories → cjs/factories}/ingestion-factory.d.ts +0 -0
  249. /package/dist/{factories → cjs/factories}/ingestion-factory.js +0 -0
  250. /package/dist/{factories → cjs/factories}/search-factory.d.ts +0 -0
  251. /package/dist/{factories → cjs/factories}/search-factory.js +0 -0
  252. /package/dist/{file-processor.d.ts → cjs/file-processor.d.ts} +0 -0
  253. /package/dist/{file-processor.js → cjs/file-processor.js} +0 -0
  254. /package/dist/{index-manager.d.ts → cjs/index-manager.d.ts} +0 -0
  255. /package/dist/{index-manager.js → cjs/index-manager.js} +0 -0
  256. /package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
  257. /package/dist/{index.js → cjs/index.js} +0 -0
  258. /package/dist/{indexer.d.ts → cjs/indexer.d.ts} +0 -0
  259. /package/dist/{indexer.js → cjs/indexer.js} +0 -0
  260. /package/dist/{ingestion.d.ts → cjs/ingestion.d.ts} +0 -0
  261. /package/dist/{ingestion.js → cjs/ingestion.js} +0 -0
  262. /package/dist/{mcp-server.d.ts → cjs/mcp-server.d.ts} +0 -0
  263. /package/dist/{mcp-server.js → cjs/mcp-server.js} +0 -0
  264. /package/dist/{multimodal → cjs/multimodal}/clip-embedder.d.ts +0 -0
  265. /package/dist/{multimodal → cjs/multimodal}/clip-embedder.js +0 -0
  266. /package/dist/{multimodal → cjs/multimodal}/index.d.ts +0 -0
  267. /package/dist/{multimodal → cjs/multimodal}/index.js +0 -0
  268. /package/dist/{preprocess.d.ts → cjs/preprocess.d.ts} +0 -0
  269. /package/dist/{preprocess.js → cjs/preprocess.js} +0 -0
  270. /package/dist/{preprocessors → cjs/preprocessors}/index.d.ts +0 -0
  271. /package/dist/{preprocessors → cjs/preprocessors}/index.js +0 -0
  272. /package/dist/{preprocessors → cjs/preprocessors}/mdx.d.ts +0 -0
  273. /package/dist/{preprocessors → cjs/preprocessors}/mdx.js +0 -0
  274. /package/dist/{preprocessors → cjs/preprocessors}/mermaid.d.ts +0 -0
  275. /package/dist/{preprocessors → cjs/preprocessors}/mermaid.js +0 -0
  276. /package/dist/{preprocessors → cjs/preprocessors}/registry.d.ts +0 -0
  277. /package/dist/{preprocessors → cjs/preprocessors}/registry.js +0 -0
  278. /package/dist/{run-error-recovery-tests.d.ts → cjs/run-error-recovery-tests.d.ts} +0 -0
  279. /package/dist/{run-error-recovery-tests.js → cjs/run-error-recovery-tests.js} +0 -0
  280. /package/dist/{search-standalone.d.ts → cjs/search-standalone.d.ts} +0 -0
  281. /package/dist/{search-standalone.js → cjs/search-standalone.js} +0 -0
  282. /package/dist/{search.d.ts → cjs/search.d.ts} +0 -0
  283. /package/dist/{search.js → cjs/search.js} +0 -0
  284. /package/dist/{test-utils.d.ts → cjs/test-utils.d.ts} +0 -0
  285. /package/dist/{test-utils.js → cjs/test-utils.js} +0 -0
  286. /package/dist/{text → cjs/text}/chunker.d.ts +0 -0
  287. /package/dist/{text → cjs/text}/chunker.js +0 -0
  288. /package/dist/{text → cjs/text}/embedder.d.ts +0 -0
  289. /package/dist/{text → cjs/text}/embedder.js +0 -0
  290. /package/dist/{text → cjs/text}/index.d.ts +0 -0
  291. /package/dist/{text → cjs/text}/index.js +0 -0
  292. /package/dist/{text → cjs/text}/preprocessors/index.d.ts +0 -0
  293. /package/dist/{text → cjs/text}/preprocessors/index.js +0 -0
  294. /package/dist/{text → cjs/text}/preprocessors/mdx.d.ts +0 -0
  295. /package/dist/{text → cjs/text}/preprocessors/mdx.js +0 -0
  296. /package/dist/{text → cjs/text}/preprocessors/mermaid.d.ts +0 -0
  297. /package/dist/{text → cjs/text}/preprocessors/mermaid.js +0 -0
  298. /package/dist/{text → cjs/text}/preprocessors/registry.d.ts +0 -0
  299. /package/dist/{text → cjs/text}/preprocessors/registry.js +0 -0
  300. /package/dist/{text → cjs/text}/reranker.d.ts +0 -0
  301. /package/dist/{text → cjs/text}/reranker.js +0 -0
  302. /package/dist/{text → cjs/text}/sentence-transformer-embedder.d.ts +0 -0
  303. /package/dist/{text → cjs/text}/sentence-transformer-embedder.js +0 -0
  304. /package/dist/{text → cjs/text}/tokenizer.d.ts +0 -0
  305. /package/dist/{text → cjs/text}/tokenizer.js +0 -0
  306. /package/dist/{types.d.ts → cjs/types.d.ts} +0 -0
  307. /package/dist/{types.js → cjs/types.js} +0 -0
  308. /package/dist/{utils → cjs/utils}/vector-math.d.ts +0 -0
  309. /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