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,239 @@
1
+ /**
2
+ * CLI Database Utilities - Database access helpers for CLI commands
3
+ * Provides database locking detection and retry mechanisms for CLI operations
4
+ * Prevents conflicts between CLI commands and long-running processes like MCP server
5
+ */
6
+ import { DatabaseConnectionManager } from './database-connection-manager.js';
7
+ import { existsSync } from 'fs';
8
+ /**
9
+ * Default options for CLI database access
10
+ */
11
+ const DEFAULT_CLI_OPTIONS = {
12
+ maxWaitMs: 10000, // 10 seconds
13
+ retryIntervalMs: 500, // 0.5 seconds
14
+ showProgress: true,
15
+ commandName: 'CLI command'
16
+ };
17
+ /**
18
+ * Wait for database to become available for CLI operations
19
+ * Provides user-friendly progress messages and error handling
20
+ */
21
+ export async function waitForCLIDatabaseAccess(dbPath, options = {}) {
22
+ const opts = { ...DEFAULT_CLI_OPTIONS, ...options };
23
+ // Check if database file exists
24
+ if (!existsSync(dbPath)) {
25
+ throw new Error(`Database file not found: ${dbPath}\n` +
26
+ `Please run 'raglite ingest <path>' first to create the database.`);
27
+ }
28
+ const startTime = Date.now();
29
+ let attempts = 0;
30
+ let lastError = null;
31
+ while (Date.now() - startTime < opts.maxWaitMs) {
32
+ attempts++;
33
+ try {
34
+ // Try to get database access
35
+ await DatabaseConnectionManager.waitForDatabaseAccess(dbPath, 1000);
36
+ if (opts.showProgress && attempts > 1) {
37
+ console.log(`✅ Database is now available (after ${attempts} attempts)`);
38
+ }
39
+ return; // Success!
40
+ }
41
+ catch (error) {
42
+ lastError = error;
43
+ if (lastError.message.includes('SQLITE_BUSY') || lastError.message.includes('busy')) {
44
+ // Database is busy - show progress and retry
45
+ if (opts.showProgress) {
46
+ if (attempts === 1) {
47
+ console.log(`⏳ Database is busy, waiting for access...`);
48
+ console.log(` This usually happens when another process is using the database.`);
49
+ console.log(` Common causes:`);
50
+ console.log(` • MCP server is running`);
51
+ console.log(` • Another CLI command is in progress`);
52
+ console.log(` • Long-running ingestion process`);
53
+ console.log('');
54
+ }
55
+ else if (attempts % 4 === 0) {
56
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
57
+ console.log(` Still waiting... (${elapsed}s elapsed, attempt ${attempts})`);
58
+ }
59
+ }
60
+ // Wait before retrying
61
+ await new Promise(resolve => setTimeout(resolve, opts.retryIntervalMs));
62
+ continue;
63
+ }
64
+ else {
65
+ // Other error - don't retry
66
+ throw new Error(`Failed to access database: ${lastError.message}\n` +
67
+ `Please check that the database file is not corrupted and you have proper permissions.`);
68
+ }
69
+ }
70
+ }
71
+ // Timeout reached
72
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
73
+ throw new Error(`Database is still busy after ${elapsed} seconds.\n` +
74
+ `\n` +
75
+ `This might be because:\n` +
76
+ `• Another process is using the database (MCP server, long ingestion, etc.)\n` +
77
+ `• The database is locked due to an interrupted operation\n` +
78
+ `\n` +
79
+ `Solutions:\n` +
80
+ `• Wait for other operations to complete\n` +
81
+ `• Stop the MCP server if running\n` +
82
+ `• Restart your terminal/process\n` +
83
+ `• As a last resort, restart your computer\n` +
84
+ `\n` +
85
+ `Last error: ${lastError?.message || 'Unknown error'}`);
86
+ }
87
+ /**
88
+ * Execute a CLI operation with database access protection
89
+ * Automatically handles database locking and provides user feedback
90
+ */
91
+ export async function withCLIDatabaseAccess(dbPath, operation, options = {}) {
92
+ const opts = { ...DEFAULT_CLI_OPTIONS, ...options };
93
+ try {
94
+ // Wait for database access
95
+ await waitForCLIDatabaseAccess(dbPath, opts);
96
+ // Execute the operation
97
+ return await operation();
98
+ }
99
+ catch (error) {
100
+ if (error instanceof Error) {
101
+ // Enhance error message with CLI context
102
+ const enhancedMessage = `${opts.commandName} failed: ${error.message}\n` +
103
+ `\n` +
104
+ `If this error persists:\n` +
105
+ `• Check that no other RAG-lite processes are running\n` +
106
+ `• Verify database file permissions\n` +
107
+ `• Try running the command again\n`;
108
+ throw new Error(enhancedMessage);
109
+ }
110
+ throw error;
111
+ }
112
+ }
113
+ /**
114
+ * Check if database is currently busy (non-blocking)
115
+ * Useful for showing warnings or status information
116
+ */
117
+ export async function isDatabaseBusy(dbPath) {
118
+ try {
119
+ await DatabaseConnectionManager.waitForDatabaseAccess(dbPath, 100);
120
+ return { isBusy: false };
121
+ }
122
+ catch (error) {
123
+ if (error instanceof Error && (error.message.includes('SQLITE_BUSY') ||
124
+ error.message.includes('busy'))) {
125
+ return {
126
+ isBusy: true,
127
+ reason: 'Database is currently in use by another process',
128
+ suggestions: [
129
+ 'Wait for other operations to complete',
130
+ 'Stop MCP server if running',
131
+ 'Check for other CLI commands in progress'
132
+ ]
133
+ };
134
+ }
135
+ return {
136
+ isBusy: true,
137
+ reason: `Database access error: ${error instanceof Error ? error.message : String(error)}`,
138
+ suggestions: [
139
+ 'Check database file permissions',
140
+ 'Verify database file is not corrupted',
141
+ 'Ensure you have read/write access to the database directory'
142
+ ]
143
+ };
144
+ }
145
+ }
146
+ /**
147
+ * Show database status information for debugging
148
+ * Useful for troubleshooting CLI issues
149
+ */
150
+ export async function showDatabaseStatus(dbPath) {
151
+ console.log(`📊 Database Status: ${dbPath}`);
152
+ console.log('');
153
+ // Check file existence
154
+ if (!existsSync(dbPath)) {
155
+ console.log('❌ Database file does not exist');
156
+ console.log(' Run "raglite ingest <path>" to create the database');
157
+ return;
158
+ }
159
+ // Check file stats
160
+ try {
161
+ const fs = await import('fs');
162
+ const stats = fs.statSync(dbPath);
163
+ console.log(`📁 File size: ${(stats.size / 1024).toFixed(1)} KB`);
164
+ console.log(`📅 Last modified: ${stats.mtime.toLocaleString()}`);
165
+ }
166
+ catch (error) {
167
+ console.log(`⚠️ Cannot read file stats: ${error}`);
168
+ }
169
+ // Check database access
170
+ const busyStatus = await isDatabaseBusy(dbPath);
171
+ if (busyStatus.isBusy) {
172
+ console.log(`🔒 Status: BUSY`);
173
+ console.log(` Reason: ${busyStatus.reason}`);
174
+ if (busyStatus.suggestions) {
175
+ console.log(' Suggestions:');
176
+ busyStatus.suggestions.forEach(suggestion => {
177
+ console.log(` • ${suggestion}`);
178
+ });
179
+ }
180
+ }
181
+ else {
182
+ console.log(`✅ Status: AVAILABLE`);
183
+ }
184
+ // Show connection manager stats
185
+ const connectionStats = DatabaseConnectionManager.getConnectionStats();
186
+ if (connectionStats.totalConnections > 0) {
187
+ console.log('');
188
+ console.log(`🔗 Active connections: ${connectionStats.totalConnections}`);
189
+ connectionStats.connections.forEach((conn, index) => {
190
+ console.log(` ${index + 1}. ${conn.path}`);
191
+ console.log(` References: ${conn.refCount}`);
192
+ console.log(` Last accessed: ${conn.lastAccessed.toLocaleString()}`);
193
+ console.log(` Idle time: ${(conn.idleTime / 1000).toFixed(1)}s`);
194
+ });
195
+ }
196
+ console.log('');
197
+ }
198
+ /**
199
+ * Force cleanup of database connections (emergency use only)
200
+ * Use with caution - only for recovery from stuck states
201
+ */
202
+ export async function forceCleanupDatabase(dbPath) {
203
+ console.log(`🚨 Force cleaning up database connections: ${dbPath}`);
204
+ try {
205
+ await DatabaseConnectionManager.forceCloseConnection(dbPath);
206
+ console.log('✅ Force cleanup completed');
207
+ }
208
+ catch (error) {
209
+ console.log(`⚠️ Force cleanup failed: ${error}`);
210
+ console.log('You may need to restart the process or reboot your system');
211
+ }
212
+ }
213
+ /**
214
+ * Graceful shutdown helper for CLI commands
215
+ * Ensures proper cleanup when CLI commands are interrupted
216
+ */
217
+ export function setupCLICleanup(dbPath) {
218
+ const cleanup = async () => {
219
+ console.log('\n🛑 Shutting down gracefully...');
220
+ if (dbPath) {
221
+ try {
222
+ await DatabaseConnectionManager.releaseConnection(dbPath);
223
+ }
224
+ catch (error) {
225
+ // Ignore cleanup errors during shutdown
226
+ }
227
+ }
228
+ await DatabaseConnectionManager.closeAllConnections();
229
+ process.exit(0);
230
+ };
231
+ // Only set up handlers if they haven't been set up already
232
+ if (!process.listenerCount('SIGINT')) {
233
+ process.on('SIGINT', cleanup);
234
+ }
235
+ if (!process.listenerCount('SIGTERM')) {
236
+ process.on('SIGTERM', cleanup);
237
+ }
238
+ }
239
+ //# sourceMappingURL=cli-database-utils.js.map
@@ -0,0 +1,102 @@
1
+ /**
2
+ * CORE MODULE — Shared between text-only (rag-lite-ts) and future multimodal (rag-lite-mm)
3
+ * Model-agnostic. No transformer or modality-specific logic.
4
+ */
5
+ /**
6
+ * Core configuration interface - model-agnostic settings
7
+ */
8
+ export interface CoreConfig {
9
+ chunk_size: number;
10
+ chunk_overlap: number;
11
+ batch_size: number;
12
+ top_k: number;
13
+ db_file: string;
14
+ index_file: string;
15
+ model_cache_path?: string;
16
+ path_storage_strategy: 'absolute' | 'relative';
17
+ embedding_model: string;
18
+ rerank_enabled: boolean;
19
+ preprocessing?: any;
20
+ }
21
+ /**
22
+ * Extensible configuration interface that can be extended by implementations
23
+ */
24
+ export interface ExtensibleConfig<T = {}> extends CoreConfig {
25
+ implementation: T;
26
+ }
27
+ /**
28
+ * Standard exit codes for different error conditions
29
+ */
30
+ export declare const EXIT_CODES: {
31
+ readonly SUCCESS: 0;
32
+ readonly GENERAL_ERROR: 1;
33
+ readonly INVALID_ARGUMENTS: 2;
34
+ readonly CONFIGURATION_ERROR: 3;
35
+ readonly FILE_NOT_FOUND: 4;
36
+ readonly DATABASE_ERROR: 5;
37
+ readonly MODEL_ERROR: 6;
38
+ readonly INDEX_ERROR: 7;
39
+ readonly PERMISSION_ERROR: 8;
40
+ };
41
+ /**
42
+ * Configuration validation error with specific exit code
43
+ */
44
+ export declare class ConfigurationError extends Error {
45
+ exitCode: number;
46
+ constructor(message: string, exitCode?: number);
47
+ }
48
+ /**
49
+ * Get the default model cache path as specified in the requirements
50
+ * @returns Default cache path (~/.raglite/models/)
51
+ */
52
+ export declare function getDefaultModelCachePath(): string;
53
+ /**
54
+ * Validates core configuration fields
55
+ * @param config - Configuration object to validate
56
+ * @throws {ConfigurationError} If configuration is invalid
57
+ */
58
+ export declare function validateCoreConfig(config: any): asserts config is CoreConfig;
59
+ /**
60
+ * Model defaults interface for different embedding models
61
+ */
62
+ export interface ModelDefaults {
63
+ dimensions: number;
64
+ chunk_size: number;
65
+ chunk_overlap: number;
66
+ batch_size: number;
67
+ }
68
+ /**
69
+ * Get default configuration for different embedding models
70
+ * @param modelName - Name of the embedding model
71
+ * @returns Model-specific defaults
72
+ */
73
+ export declare function getModelDefaults(modelName?: string): ModelDefaults;
74
+ /**
75
+ * Default core configuration object
76
+ * Model-agnostic settings that can be used by core modules
77
+ */
78
+ export declare const config: CoreConfig;
79
+ /**
80
+ * Validate preprocessing configuration
81
+ */
82
+ export declare function validatePreprocessingConfig(config: any): asserts config is any;
83
+ /**
84
+ * Merge preprocessing configurations with mode defaults
85
+ */
86
+ export declare function mergePreprocessingConfig(config: any): any;
87
+ /**
88
+ * Utility function to handle unrecoverable errors with descriptive messages
89
+ * Logs error and exits immediately with appropriate exit code
90
+ * @param error - Error object or message
91
+ * @param context - Context where the error occurred
92
+ * @param exitCode - Exit code to use (defaults to GENERAL_ERROR)
93
+ */
94
+ export declare function handleUnrecoverableError(error: Error | string, context: string, exitCode?: number): never;
95
+ /**
96
+ * Utility function for safe error logging with context
97
+ * @param error - Error to log
98
+ * @param context - Context where error occurred
99
+ * @param skipError - Whether to skip this error and continue (default: false)
100
+ */
101
+ export declare function logError(error: Error | string, context: string, skipError?: boolean): void;
102
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1,247 @@
1
+ /**
2
+ * CORE MODULE — Shared between text-only (rag-lite-ts) and future multimodal (rag-lite-mm)
3
+ * Model-agnostic. No transformer or modality-specific logic.
4
+ */
5
+ import { homedir } from 'os';
6
+ import { join } from 'path';
7
+ /**
8
+ * Standard exit codes for different error conditions
9
+ */
10
+ export const EXIT_CODES = {
11
+ SUCCESS: 0,
12
+ GENERAL_ERROR: 1,
13
+ INVALID_ARGUMENTS: 2,
14
+ CONFIGURATION_ERROR: 3,
15
+ FILE_NOT_FOUND: 4,
16
+ DATABASE_ERROR: 5,
17
+ MODEL_ERROR: 6,
18
+ INDEX_ERROR: 7,
19
+ PERMISSION_ERROR: 8
20
+ };
21
+ /**
22
+ * Configuration validation error with specific exit code
23
+ */
24
+ export class ConfigurationError extends Error {
25
+ exitCode;
26
+ constructor(message, exitCode = EXIT_CODES.CONFIGURATION_ERROR) {
27
+ super(message);
28
+ this.exitCode = exitCode;
29
+ this.name = 'ConfigurationError';
30
+ }
31
+ }
32
+ /**
33
+ * Get the default model cache path as specified in the requirements
34
+ * @returns Default cache path (~/.raglite/models/)
35
+ */
36
+ export function getDefaultModelCachePath() {
37
+ return join(homedir(), '.raglite', 'models');
38
+ }
39
+ /**
40
+ * Validates core configuration fields
41
+ * @param config - Configuration object to validate
42
+ * @throws {ConfigurationError} If configuration is invalid
43
+ */
44
+ export function validateCoreConfig(config) {
45
+ if (!config || typeof config !== 'object') {
46
+ throw new ConfigurationError('Configuration must be an object');
47
+ }
48
+ // Check required string fields
49
+ const requiredStrings = ['db_file', 'index_file'];
50
+ for (const field of requiredStrings) {
51
+ if (!config[field] || typeof config[field] !== 'string') {
52
+ throw new ConfigurationError(`Configuration error: '${field}' must be a non-empty string.\n` +
53
+ `Current value: ${JSON.stringify(config[field])}\n` +
54
+ `Please check your configuration file.`);
55
+ }
56
+ }
57
+ // Validate path_storage_strategy
58
+ if (!['absolute', 'relative'].includes(config.path_storage_strategy)) {
59
+ throw new ConfigurationError(`Configuration error: 'path_storage_strategy' must be either 'absolute' or 'relative'.\n` +
60
+ `Current value: ${JSON.stringify(config.path_storage_strategy)}\n` +
61
+ `Please set it to 'absolute' or 'relative'.`);
62
+ }
63
+ // Check required numeric fields are positive
64
+ const requiredNumbers = ['chunk_size', 'chunk_overlap', 'batch_size', 'top_k'];
65
+ for (const field of requiredNumbers) {
66
+ if (typeof config[field] !== 'number' || config[field] <= 0) {
67
+ throw new ConfigurationError(`Configuration error: '${field}' must be a positive number.\n` +
68
+ `Current value: ${JSON.stringify(config[field])}\n` +
69
+ `Please ensure all numeric values are greater than 0.`);
70
+ }
71
+ }
72
+ // Validate optional model_cache_path field
73
+ if (config.model_cache_path !== undefined && (typeof config.model_cache_path !== 'string' || config.model_cache_path.trim() === '')) {
74
+ throw new ConfigurationError(`Configuration error: 'model_cache_path' must be a non-empty string when provided.\n` +
75
+ `Current value: ${JSON.stringify(config.model_cache_path)}\n` +
76
+ `Please provide a valid directory path or remove the field to use default caching.`);
77
+ }
78
+ // Validate chunk_overlap is less than chunk_size
79
+ if (config.chunk_overlap >= config.chunk_size) {
80
+ throw new ConfigurationError(`Configuration error: chunk_overlap (${config.chunk_overlap}) must be less than chunk_size (${config.chunk_size}).\n` +
81
+ `Recommended: Set chunk_overlap to about 20% of chunk_size (e.g., chunk_size: 250, chunk_overlap: 50).`);
82
+ }
83
+ // Validate reasonable ranges for performance
84
+ if (config.chunk_size > 1000) {
85
+ console.warn(`Warning: Large chunk_size (${config.chunk_size}) may impact performance. Recommended range: 200-400 tokens.`);
86
+ }
87
+ if (config.batch_size > 64) {
88
+ console.warn(`Warning: Large batch_size (${config.batch_size}) may cause memory issues. Recommended range: 8-32.`);
89
+ }
90
+ }
91
+ /**
92
+ * Get default configuration for different embedding models
93
+ * @param modelName - Name of the embedding model
94
+ * @returns Model-specific defaults
95
+ */
96
+ export function getModelDefaults(modelName) {
97
+ // Default configuration for most models
98
+ const defaults = {
99
+ dimensions: 384, // Most common dimension for sentence transformers
100
+ chunk_size: 250,
101
+ chunk_overlap: 50,
102
+ batch_size: 16
103
+ };
104
+ // Model-specific overrides based on model name heuristics
105
+ if (modelName) {
106
+ const normalizedName = modelName.toLowerCase();
107
+ // CLIP models - 512 dimensions
108
+ if (normalizedName.includes('clip')) {
109
+ defaults.dimensions = 512;
110
+ defaults.batch_size = 8;
111
+ }
112
+ // MPNet models - 768 dimensions
113
+ else if (normalizedName.includes('all-mpnet-base-v2')) {
114
+ defaults.dimensions = 768;
115
+ defaults.chunk_size = 400;
116
+ defaults.chunk_overlap = 80;
117
+ defaults.batch_size = 8;
118
+ }
119
+ else if (normalizedName.includes('mpnet') || normalizedName.includes('768')) {
120
+ defaults.dimensions = 768;
121
+ }
122
+ // Models with 512 in the name
123
+ else if (normalizedName.includes('512')) {
124
+ defaults.dimensions = 512;
125
+ }
126
+ // MiniLM and other 384-dimensional models (default)
127
+ else if (normalizedName.includes('384') || normalizedName.includes('minilm')) {
128
+ defaults.dimensions = 384;
129
+ }
130
+ }
131
+ return defaults;
132
+ }
133
+ /**
134
+ * Default core configuration object
135
+ * Model-agnostic settings that can be used by core modules
136
+ */
137
+ export const config = {
138
+ chunk_size: parseInt(process.env.RAG_CHUNK_SIZE || '250', 10),
139
+ chunk_overlap: parseInt(process.env.RAG_CHUNK_OVERLAP || '50', 10),
140
+ batch_size: parseInt(process.env.RAG_BATCH_SIZE || '16', 10),
141
+ top_k: parseInt(process.env.RAG_TOP_K || '10', 10),
142
+ db_file: process.env.RAG_DB_FILE || 'db.sqlite',
143
+ index_file: process.env.RAG_INDEX_FILE || 'vector-index.bin',
144
+ model_cache_path: process.env.RAG_MODEL_CACHE_PATH || getDefaultModelCachePath(),
145
+ path_storage_strategy: process.env.RAG_PATH_STORAGE_STRATEGY || 'relative',
146
+ embedding_model: process.env.RAG_EMBEDDING_MODEL || 'sentence-transformers/all-MiniLM-L6-v2',
147
+ rerank_enabled: process.env.RAG_RERANK_ENABLED === 'true',
148
+ preprocessing: { mode: 'balanced' }
149
+ };
150
+ /**
151
+ * Validate preprocessing configuration
152
+ */
153
+ export function validatePreprocessingConfig(config) {
154
+ if (!config || typeof config !== 'object') {
155
+ throw new ConfigurationError('Preprocessing configuration must be an object');
156
+ }
157
+ if (!config.mode || !['strict', 'balanced', 'rich'].includes(config.mode)) {
158
+ throw new ConfigurationError('preprocessing.mode must be one of: strict, balanced, rich');
159
+ }
160
+ // Validate overrides if present
161
+ if (config.overrides !== undefined) {
162
+ if (!config.overrides || typeof config.overrides !== 'object') {
163
+ throw new ConfigurationError('preprocessing.overrides must be an object when provided');
164
+ }
165
+ const validValues = ['strip', 'keep', 'placeholder', 'extract'];
166
+ // Validate MDX override
167
+ if (config.overrides.mdx !== undefined && !validValues.includes(config.overrides.mdx)) {
168
+ throw new ConfigurationError('preprocessing.overrides.mdx must be one of: strip, keep, placeholder');
169
+ }
170
+ // Validate Mermaid override
171
+ if (config.overrides.mermaid !== undefined && !validValues.includes(config.overrides.mermaid)) {
172
+ throw new ConfigurationError('preprocessing.overrides.mermaid must be one of: strip, keep, placeholder, extract');
173
+ }
174
+ // Validate code override
175
+ if (config.overrides.code !== undefined && !validValues.includes(config.overrides.code)) {
176
+ throw new ConfigurationError('preprocessing.overrides.code must be one of: strip, keep, placeholder');
177
+ }
178
+ }
179
+ }
180
+ /**
181
+ * Merge preprocessing configurations with mode defaults
182
+ */
183
+ export function mergePreprocessingConfig(config) {
184
+ const modeDefaults = {
185
+ strict: { mdx: 'strip', mermaid: 'strip', code: 'strip' },
186
+ balanced: { mdx: 'placeholder', mermaid: 'placeholder', code: 'keep' },
187
+ rich: { mdx: 'keep', mermaid: 'extract', code: 'keep' }
188
+ };
189
+ const defaults = modeDefaults[config.mode] || modeDefaults.balanced;
190
+ return {
191
+ ...defaults,
192
+ ...config.overrides
193
+ };
194
+ }
195
+ /**
196
+ * Utility function to handle unrecoverable errors with descriptive messages
197
+ * Logs error and exits immediately with appropriate exit code
198
+ * @param error - Error object or message
199
+ * @param context - Context where the error occurred
200
+ * @param exitCode - Exit code to use (defaults to GENERAL_ERROR)
201
+ */
202
+ export function handleUnrecoverableError(error, context, exitCode = EXIT_CODES.GENERAL_ERROR) {
203
+ const errorMessage = error instanceof Error ? error.message : String(error);
204
+ console.error(`\nFatal Error in ${context}:`);
205
+ console.error(errorMessage);
206
+ console.error('\nThe system cannot continue and will exit immediately.');
207
+ // Provide context-specific guidance
208
+ switch (exitCode) {
209
+ case EXIT_CODES.CONFIGURATION_ERROR:
210
+ console.error('\nPlease check your configuration and try again.');
211
+ break;
212
+ case EXIT_CODES.DATABASE_ERROR:
213
+ console.error('\nTry running "raglite rebuild" to fix database issues.');
214
+ break;
215
+ case EXIT_CODES.MODEL_ERROR:
216
+ console.error('\nEnsure you have internet connection for model download and sufficient disk space.');
217
+ break;
218
+ case EXIT_CODES.INDEX_ERROR:
219
+ console.error('\nTry running "raglite rebuild" to recreate the vector index.');
220
+ break;
221
+ case EXIT_CODES.FILE_NOT_FOUND:
222
+ console.error('\nPlease check that the specified files or directories exist and are accessible.');
223
+ break;
224
+ case EXIT_CODES.PERMISSION_ERROR:
225
+ console.error('\nPlease check file and directory permissions.');
226
+ break;
227
+ default:
228
+ console.error('\nIf this problem persists, please report it as a bug.');
229
+ }
230
+ process.exit(exitCode);
231
+ }
232
+ /**
233
+ * Utility function for safe error logging with context
234
+ * @param error - Error to log
235
+ * @param context - Context where error occurred
236
+ * @param skipError - Whether to skip this error and continue (default: false)
237
+ */
238
+ export function logError(error, context, skipError = false) {
239
+ const errorMessage = error instanceof Error ? error.message : String(error);
240
+ if (skipError) {
241
+ console.error(`Warning in ${context}: ${errorMessage} (skipping and continuing)`);
242
+ }
243
+ else {
244
+ console.error(`Error in ${context}: ${errorMessage}`);
245
+ }
246
+ }
247
+ //# sourceMappingURL=config.js.map