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.
Files changed (310) hide show
  1. package/dist/{cli → cjs/cli}/indexer.js +1 -1
  2. package/dist/{cli → cjs/cli}/search.js +5 -10
  3. package/dist/{core → cjs/core}/binary-index-format.d.ts +28 -2
  4. package/dist/cjs/core/binary-index-format.js +291 -0
  5. package/dist/{core → cjs/core}/ingestion.d.ts +5 -1
  6. package/dist/{core → cjs/core}/ingestion.js +76 -9
  7. package/dist/{core → cjs/core}/model-validator.js +1 -1
  8. package/dist/{core → cjs/core}/reranking-strategies.js +4 -5
  9. package/dist/{core → cjs/core}/search.js +2 -1
  10. package/dist/{core → cjs/core}/types.d.ts +1 -1
  11. package/dist/{core → cjs/core}/vector-index.d.ts +4 -0
  12. package/dist/{core → cjs/core}/vector-index.js +10 -2
  13. package/dist/{file-processor.d.ts → cjs/file-processor.d.ts} +2 -0
  14. package/dist/{file-processor.js → cjs/file-processor.js} +20 -0
  15. package/dist/{index-manager.d.ts → cjs/index-manager.d.ts} +17 -1
  16. package/dist/{index-manager.js → cjs/index-manager.js} +148 -7
  17. package/dist/{multimodal → cjs/multimodal}/clip-embedder.js +71 -66
  18. package/dist/esm/api-errors.d.ts +90 -0
  19. package/dist/esm/api-errors.js +320 -0
  20. package/dist/esm/cli/indexer.d.ts +11 -0
  21. package/dist/esm/cli/indexer.js +471 -0
  22. package/dist/esm/cli/search.d.ts +7 -0
  23. package/dist/esm/cli/search.js +332 -0
  24. package/dist/esm/cli.d.ts +3 -0
  25. package/dist/esm/cli.js +529 -0
  26. package/dist/esm/config.d.ts +51 -0
  27. package/dist/esm/config.js +79 -0
  28. package/dist/esm/core/abstract-embedder.d.ts +125 -0
  29. package/dist/esm/core/abstract-embedder.js +264 -0
  30. package/dist/esm/core/actionable-error-messages.d.ts +60 -0
  31. package/dist/esm/core/actionable-error-messages.js +397 -0
  32. package/dist/esm/core/adapters.d.ts +93 -0
  33. package/dist/esm/core/adapters.js +139 -0
  34. package/dist/esm/core/batch-processing-optimizer.d.ts +155 -0
  35. package/dist/esm/core/batch-processing-optimizer.js +536 -0
  36. package/dist/esm/core/binary-index-format.d.ts +78 -0
  37. package/dist/esm/core/binary-index-format.js +291 -0
  38. package/dist/esm/core/chunker.d.ts +119 -0
  39. package/dist/esm/core/chunker.js +73 -0
  40. package/dist/esm/core/cli-database-utils.d.ts +53 -0
  41. package/dist/esm/core/cli-database-utils.js +239 -0
  42. package/dist/esm/core/config.d.ts +102 -0
  43. package/dist/esm/core/config.js +247 -0
  44. package/dist/esm/core/content-errors.d.ts +111 -0
  45. package/dist/esm/core/content-errors.js +362 -0
  46. package/dist/esm/core/content-manager.d.ts +335 -0
  47. package/dist/esm/core/content-manager.js +1476 -0
  48. package/dist/esm/core/content-performance-optimizer.d.ts +150 -0
  49. package/dist/esm/core/content-performance-optimizer.js +516 -0
  50. package/dist/esm/core/content-resolver.d.ts +104 -0
  51. package/dist/esm/core/content-resolver.js +285 -0
  52. package/dist/esm/core/cross-modal-search.d.ts +164 -0
  53. package/dist/esm/core/cross-modal-search.js +342 -0
  54. package/dist/esm/core/database-connection-manager.d.ts +109 -0
  55. package/dist/esm/core/database-connection-manager.js +310 -0
  56. package/dist/esm/core/db.d.ts +213 -0
  57. package/dist/esm/core/db.js +895 -0
  58. package/dist/esm/core/embedder-factory.d.ts +154 -0
  59. package/dist/esm/core/embedder-factory.js +311 -0
  60. package/dist/esm/core/error-handler.d.ts +112 -0
  61. package/dist/esm/core/error-handler.js +239 -0
  62. package/dist/esm/core/index.d.ts +59 -0
  63. package/dist/esm/core/index.js +69 -0
  64. package/dist/esm/core/ingestion.d.ts +202 -0
  65. package/dist/esm/core/ingestion.js +901 -0
  66. package/dist/esm/core/interfaces.d.ts +408 -0
  67. package/dist/esm/core/interfaces.js +106 -0
  68. package/dist/esm/core/lazy-dependency-loader.d.ts +147 -0
  69. package/dist/esm/core/lazy-dependency-loader.js +435 -0
  70. package/dist/esm/core/mode-detection-service.d.ts +150 -0
  71. package/dist/esm/core/mode-detection-service.js +565 -0
  72. package/dist/esm/core/mode-model-validator.d.ts +92 -0
  73. package/dist/esm/core/mode-model-validator.js +203 -0
  74. package/dist/esm/core/model-registry.d.ts +116 -0
  75. package/dist/esm/core/model-registry.js +411 -0
  76. package/dist/esm/core/model-validator.d.ts +217 -0
  77. package/dist/esm/core/model-validator.js +782 -0
  78. package/dist/esm/core/path-manager.d.ts +47 -0
  79. package/dist/esm/core/path-manager.js +71 -0
  80. package/dist/esm/core/raglite-paths.d.ts +121 -0
  81. package/dist/esm/core/raglite-paths.js +145 -0
  82. package/dist/esm/core/reranking-config.d.ts +42 -0
  83. package/dist/esm/core/reranking-config.js +147 -0
  84. package/dist/esm/core/reranking-factory.d.ts +92 -0
  85. package/dist/esm/core/reranking-factory.js +410 -0
  86. package/dist/esm/core/reranking-strategies.d.ts +310 -0
  87. package/dist/esm/core/reranking-strategies.js +650 -0
  88. package/dist/esm/core/resource-cleanup.d.ts +163 -0
  89. package/dist/esm/core/resource-cleanup.js +371 -0
  90. package/dist/esm/core/resource-manager.d.ts +212 -0
  91. package/dist/esm/core/resource-manager.js +564 -0
  92. package/dist/esm/core/search-pipeline.d.ts +111 -0
  93. package/dist/esm/core/search-pipeline.js +287 -0
  94. package/dist/esm/core/search.d.ts +141 -0
  95. package/dist/esm/core/search.js +320 -0
  96. package/dist/esm/core/streaming-operations.d.ts +145 -0
  97. package/dist/esm/core/streaming-operations.js +409 -0
  98. package/dist/esm/core/types.d.ts +66 -0
  99. package/dist/esm/core/types.js +6 -0
  100. package/dist/esm/core/universal-embedder.d.ts +177 -0
  101. package/dist/esm/core/universal-embedder.js +139 -0
  102. package/dist/esm/core/validation-messages.d.ts +99 -0
  103. package/dist/esm/core/validation-messages.js +334 -0
  104. package/dist/esm/core/vector-index.d.ts +72 -0
  105. package/dist/esm/core/vector-index.js +333 -0
  106. package/dist/esm/dom-polyfills.d.ts +6 -0
  107. package/dist/esm/dom-polyfills.js +37 -0
  108. package/dist/esm/factories/index.d.ts +27 -0
  109. package/dist/esm/factories/index.js +29 -0
  110. package/dist/esm/factories/ingestion-factory.d.ts +200 -0
  111. package/dist/esm/factories/ingestion-factory.js +477 -0
  112. package/dist/esm/factories/search-factory.d.ts +154 -0
  113. package/dist/esm/factories/search-factory.js +344 -0
  114. package/dist/esm/file-processor.d.ts +147 -0
  115. package/dist/esm/file-processor.js +963 -0
  116. package/dist/esm/index-manager.d.ts +116 -0
  117. package/dist/esm/index-manager.js +598 -0
  118. package/dist/esm/index.d.ts +75 -0
  119. package/dist/esm/index.js +110 -0
  120. package/dist/esm/indexer.d.ts +7 -0
  121. package/dist/esm/indexer.js +54 -0
  122. package/dist/esm/ingestion.d.ts +63 -0
  123. package/dist/esm/ingestion.js +124 -0
  124. package/dist/esm/mcp-server.d.ts +46 -0
  125. package/dist/esm/mcp-server.js +1820 -0
  126. package/dist/esm/multimodal/clip-embedder.d.ts +327 -0
  127. package/dist/esm/multimodal/clip-embedder.js +996 -0
  128. package/dist/esm/multimodal/index.d.ts +6 -0
  129. package/dist/esm/multimodal/index.js +6 -0
  130. package/dist/esm/preprocess.d.ts +19 -0
  131. package/dist/esm/preprocess.js +203 -0
  132. package/dist/esm/preprocessors/index.d.ts +17 -0
  133. package/dist/esm/preprocessors/index.js +38 -0
  134. package/dist/esm/preprocessors/mdx.d.ts +25 -0
  135. package/dist/esm/preprocessors/mdx.js +101 -0
  136. package/dist/esm/preprocessors/mermaid.d.ts +68 -0
  137. package/dist/esm/preprocessors/mermaid.js +329 -0
  138. package/dist/esm/preprocessors/registry.d.ts +56 -0
  139. package/dist/esm/preprocessors/registry.js +179 -0
  140. package/dist/esm/run-error-recovery-tests.d.ts +7 -0
  141. package/dist/esm/run-error-recovery-tests.js +101 -0
  142. package/dist/esm/search-standalone.d.ts +7 -0
  143. package/dist/esm/search-standalone.js +117 -0
  144. package/dist/esm/search.d.ts +99 -0
  145. package/dist/esm/search.js +177 -0
  146. package/dist/esm/test-utils.d.ts +18 -0
  147. package/dist/esm/test-utils.js +27 -0
  148. package/dist/esm/text/chunker.d.ts +33 -0
  149. package/dist/esm/text/chunker.js +279 -0
  150. package/dist/esm/text/embedder.d.ts +111 -0
  151. package/dist/esm/text/embedder.js +386 -0
  152. package/dist/esm/text/index.d.ts +8 -0
  153. package/dist/esm/text/index.js +9 -0
  154. package/dist/esm/text/preprocessors/index.d.ts +17 -0
  155. package/dist/esm/text/preprocessors/index.js +38 -0
  156. package/dist/esm/text/preprocessors/mdx.d.ts +25 -0
  157. package/dist/esm/text/preprocessors/mdx.js +101 -0
  158. package/dist/esm/text/preprocessors/mermaid.d.ts +68 -0
  159. package/dist/esm/text/preprocessors/mermaid.js +330 -0
  160. package/dist/esm/text/preprocessors/registry.d.ts +56 -0
  161. package/dist/esm/text/preprocessors/registry.js +180 -0
  162. package/dist/esm/text/reranker.d.ts +49 -0
  163. package/dist/esm/text/reranker.js +274 -0
  164. package/dist/esm/text/sentence-transformer-embedder.d.ts +96 -0
  165. package/dist/esm/text/sentence-transformer-embedder.js +340 -0
  166. package/dist/esm/text/tokenizer.d.ts +22 -0
  167. package/dist/esm/text/tokenizer.js +64 -0
  168. package/dist/esm/types.d.ts +83 -0
  169. package/dist/esm/types.js +3 -0
  170. package/dist/esm/utils/vector-math.d.ts +31 -0
  171. package/dist/esm/utils/vector-math.js +70 -0
  172. package/package.json +30 -12
  173. package/dist/core/binary-index-format.js +0 -122
  174. /package/dist/{api-errors.d.ts → cjs/api-errors.d.ts} +0 -0
  175. /package/dist/{api-errors.js → cjs/api-errors.js} +0 -0
  176. /package/dist/{cli → cjs/cli}/indexer.d.ts +0 -0
  177. /package/dist/{cli → cjs/cli}/search.d.ts +0 -0
  178. /package/dist/{cli.d.ts → cjs/cli.d.ts} +0 -0
  179. /package/dist/{cli.js → cjs/cli.js} +0 -0
  180. /package/dist/{config.d.ts → cjs/config.d.ts} +0 -0
  181. /package/dist/{config.js → cjs/config.js} +0 -0
  182. /package/dist/{core → cjs/core}/abstract-embedder.d.ts +0 -0
  183. /package/dist/{core → cjs/core}/abstract-embedder.js +0 -0
  184. /package/dist/{core → cjs/core}/actionable-error-messages.d.ts +0 -0
  185. /package/dist/{core → cjs/core}/actionable-error-messages.js +0 -0
  186. /package/dist/{core → cjs/core}/adapters.d.ts +0 -0
  187. /package/dist/{core → cjs/core}/adapters.js +0 -0
  188. /package/dist/{core → cjs/core}/batch-processing-optimizer.d.ts +0 -0
  189. /package/dist/{core → cjs/core}/batch-processing-optimizer.js +0 -0
  190. /package/dist/{core → cjs/core}/chunker.d.ts +0 -0
  191. /package/dist/{core → cjs/core}/chunker.js +0 -0
  192. /package/dist/{core → cjs/core}/cli-database-utils.d.ts +0 -0
  193. /package/dist/{core → cjs/core}/cli-database-utils.js +0 -0
  194. /package/dist/{core → cjs/core}/config.d.ts +0 -0
  195. /package/dist/{core → cjs/core}/config.js +0 -0
  196. /package/dist/{core → cjs/core}/content-errors.d.ts +0 -0
  197. /package/dist/{core → cjs/core}/content-errors.js +0 -0
  198. /package/dist/{core → cjs/core}/content-manager.d.ts +0 -0
  199. /package/dist/{core → cjs/core}/content-manager.js +0 -0
  200. /package/dist/{core → cjs/core}/content-performance-optimizer.d.ts +0 -0
  201. /package/dist/{core → cjs/core}/content-performance-optimizer.js +0 -0
  202. /package/dist/{core → cjs/core}/content-resolver.d.ts +0 -0
  203. /package/dist/{core → cjs/core}/content-resolver.js +0 -0
  204. /package/dist/{core → cjs/core}/cross-modal-search.d.ts +0 -0
  205. /package/dist/{core → cjs/core}/cross-modal-search.js +0 -0
  206. /package/dist/{core → cjs/core}/database-connection-manager.d.ts +0 -0
  207. /package/dist/{core → cjs/core}/database-connection-manager.js +0 -0
  208. /package/dist/{core → cjs/core}/db.d.ts +0 -0
  209. /package/dist/{core → cjs/core}/db.js +0 -0
  210. /package/dist/{core → cjs/core}/embedder-factory.d.ts +0 -0
  211. /package/dist/{core → cjs/core}/embedder-factory.js +0 -0
  212. /package/dist/{core → cjs/core}/error-handler.d.ts +0 -0
  213. /package/dist/{core → cjs/core}/error-handler.js +0 -0
  214. /package/dist/{core → cjs/core}/index.d.ts +0 -0
  215. /package/dist/{core → cjs/core}/index.js +0 -0
  216. /package/dist/{core → cjs/core}/interfaces.d.ts +0 -0
  217. /package/dist/{core → cjs/core}/interfaces.js +0 -0
  218. /package/dist/{core → cjs/core}/lazy-dependency-loader.d.ts +0 -0
  219. /package/dist/{core → cjs/core}/lazy-dependency-loader.js +0 -0
  220. /package/dist/{core → cjs/core}/mode-detection-service.d.ts +0 -0
  221. /package/dist/{core → cjs/core}/mode-detection-service.js +0 -0
  222. /package/dist/{core → cjs/core}/mode-model-validator.d.ts +0 -0
  223. /package/dist/{core → cjs/core}/mode-model-validator.js +0 -0
  224. /package/dist/{core → cjs/core}/model-registry.d.ts +0 -0
  225. /package/dist/{core → cjs/core}/model-registry.js +0 -0
  226. /package/dist/{core → cjs/core}/model-validator.d.ts +0 -0
  227. /package/dist/{core → cjs/core}/path-manager.d.ts +0 -0
  228. /package/dist/{core → cjs/core}/path-manager.js +0 -0
  229. /package/dist/{core → cjs/core}/raglite-paths.d.ts +0 -0
  230. /package/dist/{core → cjs/core}/raglite-paths.js +0 -0
  231. /package/dist/{core → cjs/core}/reranking-config.d.ts +0 -0
  232. /package/dist/{core → cjs/core}/reranking-config.js +0 -0
  233. /package/dist/{core → cjs/core}/reranking-factory.d.ts +0 -0
  234. /package/dist/{core → cjs/core}/reranking-factory.js +0 -0
  235. /package/dist/{core → cjs/core}/reranking-strategies.d.ts +0 -0
  236. /package/dist/{core → cjs/core}/resource-cleanup.d.ts +0 -0
  237. /package/dist/{core → cjs/core}/resource-cleanup.js +0 -0
  238. /package/dist/{core → cjs/core}/resource-manager.d.ts +0 -0
  239. /package/dist/{core → cjs/core}/resource-manager.js +0 -0
  240. /package/dist/{core → cjs/core}/search-pipeline.d.ts +0 -0
  241. /package/dist/{core → cjs/core}/search-pipeline.js +0 -0
  242. /package/dist/{core → cjs/core}/search.d.ts +0 -0
  243. /package/dist/{core → cjs/core}/streaming-operations.d.ts +0 -0
  244. /package/dist/{core → cjs/core}/streaming-operations.js +0 -0
  245. /package/dist/{core → cjs/core}/types.js +0 -0
  246. /package/dist/{core → cjs/core}/universal-embedder.d.ts +0 -0
  247. /package/dist/{core → cjs/core}/universal-embedder.js +0 -0
  248. /package/dist/{core → cjs/core}/validation-messages.d.ts +0 -0
  249. /package/dist/{core → cjs/core}/validation-messages.js +0 -0
  250. /package/dist/{dom-polyfills.d.ts → cjs/dom-polyfills.d.ts} +0 -0
  251. /package/dist/{dom-polyfills.js → cjs/dom-polyfills.js} +0 -0
  252. /package/dist/{factories → cjs/factories}/index.d.ts +0 -0
  253. /package/dist/{factories → cjs/factories}/index.js +0 -0
  254. /package/dist/{factories → cjs/factories}/ingestion-factory.d.ts +0 -0
  255. /package/dist/{factories → cjs/factories}/ingestion-factory.js +0 -0
  256. /package/dist/{factories → cjs/factories}/search-factory.d.ts +0 -0
  257. /package/dist/{factories → cjs/factories}/search-factory.js +0 -0
  258. /package/dist/{index.d.ts → cjs/index.d.ts} +0 -0
  259. /package/dist/{index.js → cjs/index.js} +0 -0
  260. /package/dist/{indexer.d.ts → cjs/indexer.d.ts} +0 -0
  261. /package/dist/{indexer.js → cjs/indexer.js} +0 -0
  262. /package/dist/{ingestion.d.ts → cjs/ingestion.d.ts} +0 -0
  263. /package/dist/{ingestion.js → cjs/ingestion.js} +0 -0
  264. /package/dist/{mcp-server.d.ts → cjs/mcp-server.d.ts} +0 -0
  265. /package/dist/{mcp-server.js → cjs/mcp-server.js} +0 -0
  266. /package/dist/{multimodal → cjs/multimodal}/clip-embedder.d.ts +0 -0
  267. /package/dist/{multimodal → cjs/multimodal}/index.d.ts +0 -0
  268. /package/dist/{multimodal → cjs/multimodal}/index.js +0 -0
  269. /package/dist/{preprocess.d.ts → cjs/preprocess.d.ts} +0 -0
  270. /package/dist/{preprocess.js → cjs/preprocess.js} +0 -0
  271. /package/dist/{preprocessors → cjs/preprocessors}/index.d.ts +0 -0
  272. /package/dist/{preprocessors → cjs/preprocessors}/index.js +0 -0
  273. /package/dist/{preprocessors → cjs/preprocessors}/mdx.d.ts +0 -0
  274. /package/dist/{preprocessors → cjs/preprocessors}/mdx.js +0 -0
  275. /package/dist/{preprocessors → cjs/preprocessors}/mermaid.d.ts +0 -0
  276. /package/dist/{preprocessors → cjs/preprocessors}/mermaid.js +0 -0
  277. /package/dist/{preprocessors → cjs/preprocessors}/registry.d.ts +0 -0
  278. /package/dist/{preprocessors → cjs/preprocessors}/registry.js +0 -0
  279. /package/dist/{run-error-recovery-tests.d.ts → cjs/run-error-recovery-tests.d.ts} +0 -0
  280. /package/dist/{run-error-recovery-tests.js → cjs/run-error-recovery-tests.js} +0 -0
  281. /package/dist/{search-standalone.d.ts → cjs/search-standalone.d.ts} +0 -0
  282. /package/dist/{search-standalone.js → cjs/search-standalone.js} +0 -0
  283. /package/dist/{search.d.ts → cjs/search.d.ts} +0 -0
  284. /package/dist/{search.js → cjs/search.js} +0 -0
  285. /package/dist/{test-utils.d.ts → cjs/test-utils.d.ts} +0 -0
  286. /package/dist/{test-utils.js → cjs/test-utils.js} +0 -0
  287. /package/dist/{text → cjs/text}/chunker.d.ts +0 -0
  288. /package/dist/{text → cjs/text}/chunker.js +0 -0
  289. /package/dist/{text → cjs/text}/embedder.d.ts +0 -0
  290. /package/dist/{text → cjs/text}/embedder.js +0 -0
  291. /package/dist/{text → cjs/text}/index.d.ts +0 -0
  292. /package/dist/{text → cjs/text}/index.js +0 -0
  293. /package/dist/{text → cjs/text}/preprocessors/index.d.ts +0 -0
  294. /package/dist/{text → cjs/text}/preprocessors/index.js +0 -0
  295. /package/dist/{text → cjs/text}/preprocessors/mdx.d.ts +0 -0
  296. /package/dist/{text → cjs/text}/preprocessors/mdx.js +0 -0
  297. /package/dist/{text → cjs/text}/preprocessors/mermaid.d.ts +0 -0
  298. /package/dist/{text → cjs/text}/preprocessors/mermaid.js +0 -0
  299. /package/dist/{text → cjs/text}/preprocessors/registry.d.ts +0 -0
  300. /package/dist/{text → cjs/text}/preprocessors/registry.js +0 -0
  301. /package/dist/{text → cjs/text}/reranker.d.ts +0 -0
  302. /package/dist/{text → cjs/text}/reranker.js +0 -0
  303. /package/dist/{text → cjs/text}/sentence-transformer-embedder.d.ts +0 -0
  304. /package/dist/{text → cjs/text}/sentence-transformer-embedder.js +0 -0
  305. /package/dist/{text → cjs/text}/tokenizer.d.ts +0 -0
  306. /package/dist/{text → cjs/text}/tokenizer.js +0 -0
  307. /package/dist/{types.d.ts → cjs/types.d.ts} +0 -0
  308. /package/dist/{types.js → cjs/types.js} +0 -0
  309. /package/dist/{utils → cjs/utils}/vector-math.d.ts +0 -0
  310. /package/dist/{utils → cjs/utils}/vector-math.js +0 -0
@@ -0,0 +1,332 @@
1
+ import { existsSync, statSync } from 'fs';
2
+ import { extname } from 'path';
3
+ import { SearchFactory } from '../factories/search-factory.js';
4
+ import { withCLIDatabaseAccess, setupCLICleanup } from '../core/cli-database-utils.js';
5
+ import { config, EXIT_CODES, ConfigurationError } from '../core/config.js';
6
+ /**
7
+ * Detect if query is an image file path
8
+ * @param query - Query string to check
9
+ * @returns True if query is a valid image file path
10
+ */
11
+ function isImageFile(query) {
12
+ // Check if file exists
13
+ if (!existsSync(query)) {
14
+ return false;
15
+ }
16
+ // Check if it's a file (not a directory)
17
+ try {
18
+ const stats = statSync(query);
19
+ if (!stats.isFile()) {
20
+ return false;
21
+ }
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ // Check file extension
27
+ const ext = extname(query).toLowerCase();
28
+ const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.bmp'];
29
+ return imageExtensions.includes(ext);
30
+ }
31
+ /**
32
+ * Run search from CLI
33
+ * @param query - Search query string or image file path
34
+ * @param options - CLI options including top-k and rerank settings
35
+ */
36
+ export async function runSearch(query, options = {}) {
37
+ try {
38
+ // Search uses the model that was used during ingestion (stored in database)
39
+ const effectiveConfig = config;
40
+ // Validate query
41
+ if (!query || query.trim().length === 0) {
42
+ console.error('Error: Search query cannot be empty');
43
+ console.error('');
44
+ console.error('Usage: raglite search <query>');
45
+ console.error(' raglite search <image-path>');
46
+ console.error('');
47
+ console.error('Examples:');
48
+ console.error(' raglite search "machine learning"');
49
+ console.error(' raglite search "how to install"');
50
+ console.error(' raglite search ./photo.jpg');
51
+ process.exit(EXIT_CODES.INVALID_ARGUMENTS);
52
+ }
53
+ // Detect if query is an image file
54
+ const isImage = isImageFile(query);
55
+ // Validate query length for text queries
56
+ if (!isImage && query.trim().length > 500) {
57
+ console.error('Error: Search query is too long (maximum 500 characters)');
58
+ console.error('');
59
+ console.error('Please use a shorter, more specific query.');
60
+ process.exit(EXIT_CODES.INVALID_ARGUMENTS);
61
+ }
62
+ // Check if database exists
63
+ if (!existsSync(effectiveConfig.db_file)) {
64
+ console.error('Error: No database found. You need to ingest documents first.');
65
+ console.error('');
66
+ console.error('To get started:');
67
+ console.error('1. First ingest your documents: raglite ingest <path>');
68
+ console.error('2. Then search: raglite search "your query"');
69
+ console.error('');
70
+ console.error('Examples:');
71
+ console.error(' raglite ingest ./docs/ # Ingest all .md/.txt files');
72
+ console.error(' raglite search "machine learning" # Search your documents');
73
+ process.exit(EXIT_CODES.FILE_NOT_FOUND);
74
+ }
75
+ // Check if vector index exists
76
+ if (!existsSync(effectiveConfig.index_file)) {
77
+ console.error('Error: No vector index found. The ingestion may not have completed successfully.');
78
+ console.error('');
79
+ console.error('To fix this:');
80
+ console.error('1. Try re-ingesting: raglite ingest <path>');
81
+ console.error('2. Or rebuild the index: raglite rebuild');
82
+ console.error('');
83
+ console.error('If the problem persists, check that your documents were processed correctly.');
84
+ process.exit(EXIT_CODES.INDEX_ERROR);
85
+ }
86
+ // Display search type
87
+ if (isImage) {
88
+ console.log(`Searching with image: "${query}"`);
89
+ }
90
+ else {
91
+ console.log(`Searching for: "${query}"`);
92
+ }
93
+ console.log('');
94
+ // Setup graceful cleanup
95
+ setupCLICleanup(effectiveConfig.db_file);
96
+ // Initialize search engine using polymorphic factory with database protection
97
+ let searchEngine;
98
+ let embedder;
99
+ try {
100
+ // Create search engine using SearchFactory (auto-detects mode)
101
+ searchEngine = await withCLIDatabaseAccess(effectiveConfig.db_file, () => SearchFactory.create(effectiveConfig.index_file, effectiveConfig.db_file), {
102
+ commandName: 'Search command',
103
+ showProgress: true
104
+ });
105
+ // For image queries, we need to check if the mode supports images
106
+ if (isImage) {
107
+ // Get system info to check mode
108
+ const { ModeDetectionService } = await import('../core/mode-detection-service.js');
109
+ const modeService = new ModeDetectionService(effectiveConfig.db_file);
110
+ const systemInfo = await modeService.detectMode();
111
+ if (systemInfo.mode !== 'multimodal') {
112
+ console.error('Error: Image search is only supported in multimodal mode');
113
+ console.error('');
114
+ console.error('Your database is configured for text-only mode.');
115
+ console.error('To enable image search:');
116
+ console.error('1. Re-ingest your documents with multimodal mode:');
117
+ console.error(' raglite ingest <path> --mode multimodal');
118
+ console.error('2. Then search with images:');
119
+ console.error(' raglite search ./photo.jpg');
120
+ process.exit(EXIT_CODES.INVALID_ARGUMENTS);
121
+ }
122
+ // Create embedder for image embedding
123
+ const { createEmbedder } = await import('../core/embedder-factory.js');
124
+ embedder = await createEmbedder(systemInfo.modelName);
125
+ // Check if embedder supports images
126
+ const { supportsImages } = await import('../core/universal-embedder.js');
127
+ if (!supportsImages(embedder)) {
128
+ console.error('Error: The current model does not support image embedding');
129
+ console.error('');
130
+ console.error(`Model: ${systemInfo.modelName}`);
131
+ console.error('Image search requires a multimodal model like CLIP.');
132
+ process.exit(EXIT_CODES.MODEL_ERROR);
133
+ }
134
+ }
135
+ // Prepare search options
136
+ const searchOptions = {};
137
+ if (options['top-k'] !== undefined) {
138
+ searchOptions.top_k = options['top-k'];
139
+ }
140
+ // Set content type filter for search-level filtering
141
+ const contentTypeFilter = options['content-type'];
142
+ if (contentTypeFilter && contentTypeFilter !== 'all') {
143
+ searchOptions.contentType = contentTypeFilter;
144
+ }
145
+ // Phase 2: Disable reranking for image-to-image searches to preserve visual similarity
146
+ let rerankingForciblyDisabled = false;
147
+ if (isImage && embedder) {
148
+ // Force disable reranking for image searches, regardless of user setting
149
+ searchOptions.rerank = false;
150
+ rerankingForciblyDisabled = true;
151
+ // Warn user if they tried to enable reranking for image search
152
+ if (options.rerank === true) {
153
+ console.warn('⚠️ Reranking is disabled for image-to-image search to preserve visual similarity.');
154
+ console.warn(' Image-to-image search uses CLIP embeddings for direct visual matching.');
155
+ console.warn(' For text-to-image search, use: raglite search "description" --rerank');
156
+ console.warn('');
157
+ }
158
+ }
159
+ else {
160
+ // For text searches, use user setting (defaults to false from Phase 1)
161
+ if (options.rerank !== undefined) {
162
+ searchOptions.rerank = options.rerank;
163
+ }
164
+ }
165
+ // Track whether reranking will actually be used in this search
166
+ const rerankingUsed = searchOptions.rerank === true;
167
+ // Perform search
168
+ const startTime = Date.now();
169
+ let results;
170
+ if (isImage && embedder) {
171
+ // Image-based search: embed the image and search with the vector
172
+ console.log('Embedding image...');
173
+ const imageEmbedding = await embedder.embedImage(query);
174
+ console.log('Searching with image embedding...');
175
+ results = await searchEngine.searchWithVector(imageEmbedding.vector, searchOptions);
176
+ }
177
+ else {
178
+ // Text-based search
179
+ results = await searchEngine.search(query, searchOptions);
180
+ }
181
+ const searchTime = Date.now() - startTime;
182
+ // Display results
183
+ if (results.length === 0) {
184
+ console.log('No results found.');
185
+ console.log('\nTips:');
186
+ console.log('- Try different keywords or phrases');
187
+ console.log('- Make sure you have ingested relevant documents');
188
+ console.log('- Check if your query matches the content of your documents');
189
+ }
190
+ else {
191
+ console.log(`Found ${results.length} result${results.length === 1 ? '' : 's'} in ${searchTime}ms:\n`);
192
+ results.forEach((result, index) => {
193
+ // Add content type icon for visual distinction
194
+ const contentTypeIcon = result.contentType === 'image' ? '🖼️ ' : '📄 ';
195
+ const contentTypeLabel = result.contentType === 'image' ? '[IMAGE]' : '[TEXT]';
196
+ console.log(`${index + 1}. ${contentTypeIcon}${result.document.title}`);
197
+ console.log(` Source: ${result.document.source}`);
198
+ console.log(` Type: ${contentTypeLabel}`);
199
+ console.log(` Score: ${(result.score * 100).toFixed(1)}%`);
200
+ // Display content differently based on type
201
+ if (result.contentType === 'image') {
202
+ // For images, show metadata if available
203
+ if (result.metadata?.description) {
204
+ console.log(` Description: ${truncateText(result.metadata.description, 200)}`);
205
+ }
206
+ if (result.metadata?.dimensions) {
207
+ console.log(` Dimensions: ${result.metadata.dimensions}`);
208
+ }
209
+ if (result.metadata?.format) {
210
+ console.log(` Format: ${result.metadata.format}`);
211
+ }
212
+ }
213
+ else {
214
+ // For text, show content preview
215
+ console.log(` Text: ${truncateText(result.content, 200)}`);
216
+ }
217
+ console.log('');
218
+ });
219
+ // Show search statistics
220
+ const stats = await searchEngine.getStats();
221
+ console.log('─'.repeat(50));
222
+ console.log(`Search completed in ${searchTime}ms`);
223
+ console.log(`Searched ${stats.totalChunks} chunks`);
224
+ if (rerankingUsed) {
225
+ console.log('Reranking: enabled');
226
+ }
227
+ else if (rerankingForciblyDisabled) {
228
+ console.log('Reranking: disabled');
229
+ }
230
+ else if (stats.rerankingEnabled) {
231
+ console.log('Reranking: available (not used)');
232
+ }
233
+ else {
234
+ console.log('Reranking: disabled');
235
+ }
236
+ }
237
+ }
238
+ finally {
239
+ // Cleanup resources
240
+ if (embedder) {
241
+ await embedder.cleanup();
242
+ }
243
+ if (searchEngine) {
244
+ await searchEngine.cleanup();
245
+ }
246
+ // Ensure clean exit for CLI commands
247
+ const { DatabaseConnectionManager } = await import('../core/database-connection-manager.js');
248
+ await DatabaseConnectionManager.closeAllConnections();
249
+ // Force exit for CLI commands to prevent hanging
250
+ setTimeout(() => {
251
+ process.exit(0);
252
+ }, 100);
253
+ }
254
+ }
255
+ catch (error) {
256
+ console.error('\n' + '='.repeat(50));
257
+ console.error('SEARCH FAILED');
258
+ console.error('='.repeat(50));
259
+ if (error instanceof ConfigurationError) {
260
+ console.error('Configuration Error:');
261
+ console.error(error.message);
262
+ process.exit(error.exitCode);
263
+ }
264
+ else if (error instanceof Error) {
265
+ console.error('Error:', error.message);
266
+ console.error('');
267
+ if (error.message.includes('SQLITE') || error.message.includes('database')) {
268
+ console.error('Database Error:');
269
+ console.error('- The database may be corrupted or inaccessible');
270
+ console.error('- Try rebuilding the index: raglite rebuild');
271
+ console.error('- Ensure the database file is not locked by another process');
272
+ console.error('- Check file permissions and available disk space');
273
+ process.exit(EXIT_CODES.DATABASE_ERROR);
274
+ }
275
+ else if (error.message.includes('model') || error.message.includes('ONNX')) {
276
+ console.error('Model Error:');
277
+ console.error('- The embedding model failed to load');
278
+ console.error('- Try restarting the search command');
279
+ console.error('- Ensure you have internet connection for model download');
280
+ console.error('- Check available disk space in the models directory');
281
+ process.exit(EXIT_CODES.MODEL_ERROR);
282
+ }
283
+ else if (error.message.includes('index') || error.message.includes('vector')) {
284
+ console.error('Vector Index Error:');
285
+ console.error('- The vector index may be corrupted or incompatible');
286
+ console.error('- Try rebuilding the index: raglite rebuild');
287
+ console.error('- Ensure the index file is not corrupted');
288
+ console.error('- Check available disk space');
289
+ process.exit(EXIT_CODES.INDEX_ERROR);
290
+ }
291
+ else if (error.message.includes('not initialized') || error.message.includes('empty')) {
292
+ console.error('No Data Found:');
293
+ console.error('- Make sure you have ingested documents first');
294
+ console.error('- Run: raglite ingest <path>');
295
+ console.error('- Check that your documents contain searchable text');
296
+ console.error('- Verify documents are in supported formats (.md, .txt)');
297
+ process.exit(EXIT_CODES.FILE_NOT_FOUND);
298
+ }
299
+ else {
300
+ console.error('General Error:');
301
+ console.error('- An unexpected error occurred during search');
302
+ console.error('- Try running the search again');
303
+ console.error('- If the problem persists, try: raglite rebuild');
304
+ console.error('- Check that your query is valid and not too complex');
305
+ process.exit(EXIT_CODES.GENERAL_ERROR);
306
+ }
307
+ }
308
+ else {
309
+ console.error('Unknown error:', String(error));
310
+ process.exit(EXIT_CODES.GENERAL_ERROR);
311
+ }
312
+ }
313
+ }
314
+ /**
315
+ * Truncate text to specified length with ellipsis
316
+ * @param text - Text to truncate
317
+ * @param maxLength - Maximum length before truncation
318
+ * @returns Truncated text with ellipsis if needed
319
+ */
320
+ function truncateText(text, maxLength) {
321
+ if (text.length <= maxLength) {
322
+ return text;
323
+ }
324
+ // Try to break at word boundary
325
+ const truncated = text.substring(0, maxLength);
326
+ const lastSpaceIndex = truncated.lastIndexOf(' ');
327
+ if (lastSpaceIndex > maxLength * 0.8) {
328
+ return truncated.substring(0, lastSpaceIndex) + '...';
329
+ }
330
+ return truncated + '...';
331
+ }
332
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map