ocr-provenance-mcp 1.0.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.

Potentially problematic release.


This version of ocr-provenance-mcp might be problematic. Click here for more details.

Files changed (578) hide show
  1. package/.env.example +55 -0
  2. package/LICENSE +78 -0
  3. package/README.md +1154 -0
  4. package/dist/bin-http.d.ts +24 -0
  5. package/dist/bin-http.d.ts.map +1 -0
  6. package/dist/bin-http.js +275 -0
  7. package/dist/bin-http.js.map +1 -0
  8. package/dist/bin-setup.d.ts +11 -0
  9. package/dist/bin-setup.d.ts.map +1 -0
  10. package/dist/bin-setup.js +610 -0
  11. package/dist/bin-setup.js.map +1 -0
  12. package/dist/bin.d.ts +16 -0
  13. package/dist/bin.d.ts.map +1 -0
  14. package/dist/bin.js +16 -0
  15. package/dist/bin.js.map +1 -0
  16. package/dist/index.d.ts +13 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +90 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/models/chunk.d.ts +136 -0
  21. package/dist/models/chunk.d.ts.map +1 -0
  22. package/dist/models/chunk.js +27 -0
  23. package/dist/models/chunk.js.map +1 -0
  24. package/dist/models/cluster.d.ts +79 -0
  25. package/dist/models/cluster.d.ts.map +1 -0
  26. package/dist/models/cluster.js +10 -0
  27. package/dist/models/cluster.js.map +1 -0
  28. package/dist/models/comparison.d.ts +62 -0
  29. package/dist/models/comparison.d.ts.map +1 -0
  30. package/dist/models/comparison.js +8 -0
  31. package/dist/models/comparison.js.map +1 -0
  32. package/dist/models/document.d.ts +104 -0
  33. package/dist/models/document.d.ts.map +1 -0
  34. package/dist/models/document.js +15 -0
  35. package/dist/models/document.js.map +1 -0
  36. package/dist/models/embedding.d.ts +87 -0
  37. package/dist/models/embedding.d.ts.map +1 -0
  38. package/dist/models/embedding.js +23 -0
  39. package/dist/models/embedding.js.map +1 -0
  40. package/dist/models/extraction.d.ts +15 -0
  41. package/dist/models/extraction.d.ts.map +1 -0
  42. package/dist/models/extraction.js +2 -0
  43. package/dist/models/extraction.js.map +1 -0
  44. package/dist/models/form-fill.d.ts +23 -0
  45. package/dist/models/form-fill.d.ts.map +1 -0
  46. package/dist/models/form-fill.js +2 -0
  47. package/dist/models/form-fill.js.map +1 -0
  48. package/dist/models/image.d.ts +177 -0
  49. package/dist/models/image.d.ts.map +1 -0
  50. package/dist/models/image.js +8 -0
  51. package/dist/models/image.js.map +1 -0
  52. package/dist/models/index.d.ts +14 -0
  53. package/dist/models/index.d.ts.map +1 -0
  54. package/dist/models/index.js +22 -0
  55. package/dist/models/index.js.map +1 -0
  56. package/dist/models/provenance.d.ts +174 -0
  57. package/dist/models/provenance.d.ts.map +1 -0
  58. package/dist/models/provenance.js +53 -0
  59. package/dist/models/provenance.js.map +1 -0
  60. package/dist/models/uploaded-file.d.ts +20 -0
  61. package/dist/models/uploaded-file.d.ts.map +1 -0
  62. package/dist/models/uploaded-file.js +2 -0
  63. package/dist/models/uploaded-file.js.map +1 -0
  64. package/dist/server/errors.d.ts +93 -0
  65. package/dist/server/errors.d.ts.map +1 -0
  66. package/dist/server/errors.js +256 -0
  67. package/dist/server/errors.js.map +1 -0
  68. package/dist/server/events.d.ts +36 -0
  69. package/dist/server/events.d.ts.map +1 -0
  70. package/dist/server/events.js +48 -0
  71. package/dist/server/events.js.map +1 -0
  72. package/dist/server/permissions.d.ts +26 -0
  73. package/dist/server/permissions.d.ts.map +1 -0
  74. package/dist/server/permissions.js +194 -0
  75. package/dist/server/permissions.js.map +1 -0
  76. package/dist/server/register-tools.d.ts +25 -0
  77. package/dist/server/register-tools.d.ts.map +1 -0
  78. package/dist/server/register-tools.js +102 -0
  79. package/dist/server/register-tools.js.map +1 -0
  80. package/dist/server/startup.d.ts +16 -0
  81. package/dist/server/startup.d.ts.map +1 -0
  82. package/dist/server/startup.js +37 -0
  83. package/dist/server/startup.js.map +1 -0
  84. package/dist/server/state.d.ts +166 -0
  85. package/dist/server/state.d.ts.map +1 -0
  86. package/dist/server/state.js +424 -0
  87. package/dist/server/state.js.map +1 -0
  88. package/dist/server/transports/http-transport.d.ts +37 -0
  89. package/dist/server/transports/http-transport.d.ts.map +1 -0
  90. package/dist/server/transports/http-transport.js +204 -0
  91. package/dist/server/transports/http-transport.js.map +1 -0
  92. package/dist/server/transports/index.d.ts +9 -0
  93. package/dist/server/transports/index.d.ts.map +1 -0
  94. package/dist/server/transports/index.js +9 -0
  95. package/dist/server/transports/index.js.map +1 -0
  96. package/dist/server/transports/session-manager.d.ts +40 -0
  97. package/dist/server/transports/session-manager.d.ts.map +1 -0
  98. package/dist/server/transports/session-manager.js +74 -0
  99. package/dist/server/transports/session-manager.js.map +1 -0
  100. package/dist/server/types.d.ts +82 -0
  101. package/dist/server/types.d.ts.map +1 -0
  102. package/dist/server/types.js +14 -0
  103. package/dist/server/types.js.map +1 -0
  104. package/dist/services/audit.d.ts +26 -0
  105. package/dist/services/audit.d.ts.map +1 -0
  106. package/dist/services/audit.js +43 -0
  107. package/dist/services/audit.js.map +1 -0
  108. package/dist/services/chunking/chunk-deduplicator.d.ts +33 -0
  109. package/dist/services/chunking/chunk-deduplicator.d.ts.map +1 -0
  110. package/dist/services/chunking/chunk-deduplicator.js +46 -0
  111. package/dist/services/chunking/chunk-deduplicator.js.map +1 -0
  112. package/dist/services/chunking/chunk-merger.d.ts +26 -0
  113. package/dist/services/chunking/chunk-merger.d.ts.map +1 -0
  114. package/dist/services/chunking/chunk-merger.js +94 -0
  115. package/dist/services/chunking/chunk-merger.js.map +1 -0
  116. package/dist/services/chunking/chunker.d.ts +62 -0
  117. package/dist/services/chunking/chunker.d.ts.map +1 -0
  118. package/dist/services/chunking/chunker.js +566 -0
  119. package/dist/services/chunking/chunker.js.map +1 -0
  120. package/dist/services/chunking/heading-normalizer.d.ts +33 -0
  121. package/dist/services/chunking/heading-normalizer.d.ts.map +1 -0
  122. package/dist/services/chunking/heading-normalizer.js +101 -0
  123. package/dist/services/chunking/heading-normalizer.js.map +1 -0
  124. package/dist/services/chunking/json-block-analyzer.d.ts +163 -0
  125. package/dist/services/chunking/json-block-analyzer.d.ts.map +1 -0
  126. package/dist/services/chunking/json-block-analyzer.js +1033 -0
  127. package/dist/services/chunking/json-block-analyzer.js.map +1 -0
  128. package/dist/services/chunking/markdown-parser.d.ts +75 -0
  129. package/dist/services/chunking/markdown-parser.d.ts.map +1 -0
  130. package/dist/services/chunking/markdown-parser.js +428 -0
  131. package/dist/services/chunking/markdown-parser.js.map +1 -0
  132. package/dist/services/chunking/text-normalizer.d.ts +20 -0
  133. package/dist/services/chunking/text-normalizer.d.ts.map +1 -0
  134. package/dist/services/chunking/text-normalizer.js +36 -0
  135. package/dist/services/chunking/text-normalizer.js.map +1 -0
  136. package/dist/services/clm/contract-schemas.d.ts +36 -0
  137. package/dist/services/clm/contract-schemas.d.ts.map +1 -0
  138. package/dist/services/clm/contract-schemas.js +92 -0
  139. package/dist/services/clm/contract-schemas.js.map +1 -0
  140. package/dist/services/clm/summarization.d.ts +46 -0
  141. package/dist/services/clm/summarization.d.ts.map +1 -0
  142. package/dist/services/clm/summarization.js +61 -0
  143. package/dist/services/clm/summarization.js.map +1 -0
  144. package/dist/services/clustering/clustering-service.d.ts +58 -0
  145. package/dist/services/clustering/clustering-service.d.ts.map +1 -0
  146. package/dist/services/clustering/clustering-service.js +467 -0
  147. package/dist/services/clustering/clustering-service.js.map +1 -0
  148. package/dist/services/comparison/diff-service.d.ts +41 -0
  149. package/dist/services/comparison/diff-service.d.ts.map +1 -0
  150. package/dist/services/comparison/diff-service.js +120 -0
  151. package/dist/services/comparison/diff-service.js.map +1 -0
  152. package/dist/services/embedding/embedder.d.ts +55 -0
  153. package/dist/services/embedding/embedder.d.ts.map +1 -0
  154. package/dist/services/embedding/embedder.js +202 -0
  155. package/dist/services/embedding/embedder.js.map +1 -0
  156. package/dist/services/embedding/nomic.d.ts +67 -0
  157. package/dist/services/embedding/nomic.d.ts.map +1 -0
  158. package/dist/services/embedding/nomic.js +280 -0
  159. package/dist/services/embedding/nomic.js.map +1 -0
  160. package/dist/services/gemini/circuit-breaker.d.ts +106 -0
  161. package/dist/services/gemini/circuit-breaker.d.ts.map +1 -0
  162. package/dist/services/gemini/circuit-breaker.js +237 -0
  163. package/dist/services/gemini/circuit-breaker.js.map +1 -0
  164. package/dist/services/gemini/client.d.ts +173 -0
  165. package/dist/services/gemini/client.d.ts.map +1 -0
  166. package/dist/services/gemini/client.js +483 -0
  167. package/dist/services/gemini/client.js.map +1 -0
  168. package/dist/services/gemini/config.d.ts +116 -0
  169. package/dist/services/gemini/config.d.ts.map +1 -0
  170. package/dist/services/gemini/config.js +118 -0
  171. package/dist/services/gemini/config.js.map +1 -0
  172. package/dist/services/gemini/index.d.ts +9 -0
  173. package/dist/services/gemini/index.d.ts.map +1 -0
  174. package/dist/services/gemini/index.js +13 -0
  175. package/dist/services/gemini/index.js.map +1 -0
  176. package/dist/services/gemini/rate-limiter.d.ts +62 -0
  177. package/dist/services/gemini/rate-limiter.d.ts.map +1 -0
  178. package/dist/services/gemini/rate-limiter.js +120 -0
  179. package/dist/services/gemini/rate-limiter.js.map +1 -0
  180. package/dist/services/images/extractor.d.ts +88 -0
  181. package/dist/services/images/extractor.d.ts.map +1 -0
  182. package/dist/services/images/extractor.js +340 -0
  183. package/dist/services/images/extractor.js.map +1 -0
  184. package/dist/services/images/optimizer.d.ts +130 -0
  185. package/dist/services/images/optimizer.d.ts.map +1 -0
  186. package/dist/services/images/optimizer.js +228 -0
  187. package/dist/services/images/optimizer.js.map +1 -0
  188. package/dist/services/ocr/datalab.d.ts +64 -0
  189. package/dist/services/ocr/datalab.d.ts.map +1 -0
  190. package/dist/services/ocr/datalab.js +425 -0
  191. package/dist/services/ocr/datalab.js.map +1 -0
  192. package/dist/services/ocr/errors.d.ts +38 -0
  193. package/dist/services/ocr/errors.d.ts.map +1 -0
  194. package/dist/services/ocr/errors.js +83 -0
  195. package/dist/services/ocr/errors.js.map +1 -0
  196. package/dist/services/ocr/file-manager.d.ts +76 -0
  197. package/dist/services/ocr/file-manager.d.ts.map +1 -0
  198. package/dist/services/ocr/file-manager.js +238 -0
  199. package/dist/services/ocr/file-manager.js.map +1 -0
  200. package/dist/services/ocr/form-fill.d.ts +48 -0
  201. package/dist/services/ocr/form-fill.d.ts.map +1 -0
  202. package/dist/services/ocr/form-fill.js +213 -0
  203. package/dist/services/ocr/form-fill.js.map +1 -0
  204. package/dist/services/ocr/processor.d.ts +95 -0
  205. package/dist/services/ocr/processor.d.ts.map +1 -0
  206. package/dist/services/ocr/processor.js +259 -0
  207. package/dist/services/ocr/processor.js.map +1 -0
  208. package/dist/services/provenance/agent-metadata.d.ts +82 -0
  209. package/dist/services/provenance/agent-metadata.d.ts.map +1 -0
  210. package/dist/services/provenance/agent-metadata.js +106 -0
  211. package/dist/services/provenance/agent-metadata.js.map +1 -0
  212. package/dist/services/provenance/chain-hash.d.ts +57 -0
  213. package/dist/services/provenance/chain-hash.d.ts.map +1 -0
  214. package/dist/services/provenance/chain-hash.js +131 -0
  215. package/dist/services/provenance/chain-hash.js.map +1 -0
  216. package/dist/services/provenance/exporter.d.ts +202 -0
  217. package/dist/services/provenance/exporter.d.ts.map +1 -0
  218. package/dist/services/provenance/exporter.js +457 -0
  219. package/dist/services/provenance/exporter.js.map +1 -0
  220. package/dist/services/provenance/index.d.ts +15 -0
  221. package/dist/services/provenance/index.d.ts.map +1 -0
  222. package/dist/services/provenance/index.js +17 -0
  223. package/dist/services/provenance/index.js.map +1 -0
  224. package/dist/services/provenance/tracker.d.ts +138 -0
  225. package/dist/services/provenance/tracker.d.ts.map +1 -0
  226. package/dist/services/provenance/tracker.js +293 -0
  227. package/dist/services/provenance/tracker.js.map +1 -0
  228. package/dist/services/provenance/verifier.d.ts +153 -0
  229. package/dist/services/provenance/verifier.d.ts.map +1 -0
  230. package/dist/services/provenance/verifier.js +536 -0
  231. package/dist/services/provenance/verifier.js.map +1 -0
  232. package/dist/services/python-pool.d.ts +70 -0
  233. package/dist/services/python-pool.d.ts.map +1 -0
  234. package/dist/services/python-pool.js +265 -0
  235. package/dist/services/python-pool.js.map +1 -0
  236. package/dist/services/search/bm25.d.ts +180 -0
  237. package/dist/services/search/bm25.d.ts.map +1 -0
  238. package/dist/services/search/bm25.js +656 -0
  239. package/dist/services/search/bm25.js.map +1 -0
  240. package/dist/services/search/fusion.d.ts +103 -0
  241. package/dist/services/search/fusion.d.ts.map +1 -0
  242. package/dist/services/search/fusion.js +122 -0
  243. package/dist/services/search/fusion.js.map +1 -0
  244. package/dist/services/search/local-reranker.d.ts +30 -0
  245. package/dist/services/search/local-reranker.d.ts.map +1 -0
  246. package/dist/services/search/local-reranker.js +123 -0
  247. package/dist/services/search/local-reranker.js.map +1 -0
  248. package/dist/services/search/quality.d.ts +11 -0
  249. package/dist/services/search/quality.d.ts.map +1 -0
  250. package/dist/services/search/quality.js +17 -0
  251. package/dist/services/search/quality.js.map +1 -0
  252. package/dist/services/search/query-classifier.d.ts +34 -0
  253. package/dist/services/search/query-classifier.d.ts.map +1 -0
  254. package/dist/services/search/query-classifier.js +114 -0
  255. package/dist/services/search/query-classifier.js.map +1 -0
  256. package/dist/services/search/query-expander.d.ts +73 -0
  257. package/dist/services/search/query-expander.d.ts.map +1 -0
  258. package/dist/services/search/query-expander.js +281 -0
  259. package/dist/services/search/query-expander.js.map +1 -0
  260. package/dist/services/search/reranker.d.ts +44 -0
  261. package/dist/services/search/reranker.d.ts.map +1 -0
  262. package/dist/services/search/reranker.js +101 -0
  263. package/dist/services/search/reranker.js.map +1 -0
  264. package/dist/services/storage/database/annotation-operations.d.ts +113 -0
  265. package/dist/services/storage/database/annotation-operations.d.ts.map +1 -0
  266. package/dist/services/storage/database/annotation-operations.js +177 -0
  267. package/dist/services/storage/database/annotation-operations.js.map +1 -0
  268. package/dist/services/storage/database/approval-operations.d.ts +132 -0
  269. package/dist/services/storage/database/approval-operations.d.ts.map +1 -0
  270. package/dist/services/storage/database/approval-operations.js +206 -0
  271. package/dist/services/storage/database/approval-operations.js.map +1 -0
  272. package/dist/services/storage/database/chunk-operations.d.ts +132 -0
  273. package/dist/services/storage/database/chunk-operations.d.ts.map +1 -0
  274. package/dist/services/storage/database/chunk-operations.js +306 -0
  275. package/dist/services/storage/database/chunk-operations.js.map +1 -0
  276. package/dist/services/storage/database/cluster-operations.d.ts +97 -0
  277. package/dist/services/storage/database/cluster-operations.d.ts.map +1 -0
  278. package/dist/services/storage/database/cluster-operations.js +258 -0
  279. package/dist/services/storage/database/cluster-operations.js.map +1 -0
  280. package/dist/services/storage/database/comparison-operations.d.ts +41 -0
  281. package/dist/services/storage/database/comparison-operations.d.ts.map +1 -0
  282. package/dist/services/storage/database/comparison-operations.js +65 -0
  283. package/dist/services/storage/database/comparison-operations.js.map +1 -0
  284. package/dist/services/storage/database/converters.d.ts +36 -0
  285. package/dist/services/storage/database/converters.d.ts.map +1 -0
  286. package/dist/services/storage/database/converters.js +244 -0
  287. package/dist/services/storage/database/converters.js.map +1 -0
  288. package/dist/services/storage/database/document-operations.d.ts +145 -0
  289. package/dist/services/storage/database/document-operations.d.ts.map +1 -0
  290. package/dist/services/storage/database/document-operations.js +498 -0
  291. package/dist/services/storage/database/document-operations.js.map +1 -0
  292. package/dist/services/storage/database/embedding-operations.d.ts +130 -0
  293. package/dist/services/storage/database/embedding-operations.d.ts.map +1 -0
  294. package/dist/services/storage/database/embedding-operations.js +315 -0
  295. package/dist/services/storage/database/embedding-operations.js.map +1 -0
  296. package/dist/services/storage/database/extraction-operations.d.ts +47 -0
  297. package/dist/services/storage/database/extraction-operations.d.ts.map +1 -0
  298. package/dist/services/storage/database/extraction-operations.js +85 -0
  299. package/dist/services/storage/database/extraction-operations.js.map +1 -0
  300. package/dist/services/storage/database/form-fill-operations.d.ts +58 -0
  301. package/dist/services/storage/database/form-fill-operations.d.ts.map +1 -0
  302. package/dist/services/storage/database/form-fill-operations.js +116 -0
  303. package/dist/services/storage/database/form-fill-operations.js.map +1 -0
  304. package/dist/services/storage/database/helpers.d.ts +29 -0
  305. package/dist/services/storage/database/helpers.d.ts.map +1 -0
  306. package/dist/services/storage/database/helpers.js +55 -0
  307. package/dist/services/storage/database/helpers.js.map +1 -0
  308. package/dist/services/storage/database/image-operations.d.ts +202 -0
  309. package/dist/services/storage/database/image-operations.d.ts.map +1 -0
  310. package/dist/services/storage/database/image-operations.js +484 -0
  311. package/dist/services/storage/database/image-operations.js.map +1 -0
  312. package/dist/services/storage/database/index.d.ts +13 -0
  313. package/dist/services/storage/database/index.d.ts.map +1 -0
  314. package/dist/services/storage/database/index.js +16 -0
  315. package/dist/services/storage/database/index.js.map +1 -0
  316. package/dist/services/storage/database/lock-operations.d.ts +59 -0
  317. package/dist/services/storage/database/lock-operations.d.ts.map +1 -0
  318. package/dist/services/storage/database/lock-operations.js +89 -0
  319. package/dist/services/storage/database/lock-operations.js.map +1 -0
  320. package/dist/services/storage/database/obligation-operations.d.ts +88 -0
  321. package/dist/services/storage/database/obligation-operations.d.ts.map +1 -0
  322. package/dist/services/storage/database/obligation-operations.js +206 -0
  323. package/dist/services/storage/database/obligation-operations.js.map +1 -0
  324. package/dist/services/storage/database/ocr-operations.d.ts +33 -0
  325. package/dist/services/storage/database/ocr-operations.d.ts.map +1 -0
  326. package/dist/services/storage/database/ocr-operations.js +70 -0
  327. package/dist/services/storage/database/ocr-operations.js.map +1 -0
  328. package/dist/services/storage/database/playbook-operations.d.ts +72 -0
  329. package/dist/services/storage/database/playbook-operations.d.ts.map +1 -0
  330. package/dist/services/storage/database/playbook-operations.js +247 -0
  331. package/dist/services/storage/database/playbook-operations.js.map +1 -0
  332. package/dist/services/storage/database/provenance-operations.d.ts +112 -0
  333. package/dist/services/storage/database/provenance-operations.d.ts.map +1 -0
  334. package/dist/services/storage/database/provenance-operations.js +251 -0
  335. package/dist/services/storage/database/provenance-operations.js.map +1 -0
  336. package/dist/services/storage/database/service.d.ts +142 -0
  337. package/dist/services/storage/database/service.d.ts.map +1 -0
  338. package/dist/services/storage/database/service.js +310 -0
  339. package/dist/services/storage/database/service.js.map +1 -0
  340. package/dist/services/storage/database/static-operations.d.ts +30 -0
  341. package/dist/services/storage/database/static-operations.d.ts.map +1 -0
  342. package/dist/services/storage/database/static-operations.js +218 -0
  343. package/dist/services/storage/database/static-operations.js.map +1 -0
  344. package/dist/services/storage/database/stats-operations.d.ts +101 -0
  345. package/dist/services/storage/database/stats-operations.d.ts.map +1 -0
  346. package/dist/services/storage/database/stats-operations.js +394 -0
  347. package/dist/services/storage/database/stats-operations.js.map +1 -0
  348. package/dist/services/storage/database/tag-operations.d.ts +76 -0
  349. package/dist/services/storage/database/tag-operations.d.ts.map +1 -0
  350. package/dist/services/storage/database/tag-operations.js +178 -0
  351. package/dist/services/storage/database/tag-operations.js.map +1 -0
  352. package/dist/services/storage/database/types.d.ts +286 -0
  353. package/dist/services/storage/database/types.d.ts.map +1 -0
  354. package/dist/services/storage/database/types.js +39 -0
  355. package/dist/services/storage/database/types.js.map +1 -0
  356. package/dist/services/storage/database/upload-operations.d.ts +71 -0
  357. package/dist/services/storage/database/upload-operations.d.ts.map +1 -0
  358. package/dist/services/storage/database/upload-operations.js +124 -0
  359. package/dist/services/storage/database/upload-operations.js.map +1 -0
  360. package/dist/services/storage/database/user-operations.d.ts +102 -0
  361. package/dist/services/storage/database/user-operations.d.ts.map +1 -0
  362. package/dist/services/storage/database/user-operations.js +151 -0
  363. package/dist/services/storage/database/user-operations.js.map +1 -0
  364. package/dist/services/storage/database/workflow-operations.d.ts +98 -0
  365. package/dist/services/storage/database/workflow-operations.d.ts.map +1 -0
  366. package/dist/services/storage/database/workflow-operations.js +157 -0
  367. package/dist/services/storage/database/workflow-operations.js.map +1 -0
  368. package/dist/services/storage/database.d.ts +16 -0
  369. package/dist/services/storage/database.d.ts.map +1 -0
  370. package/dist/services/storage/database.js +15 -0
  371. package/dist/services/storage/database.js.map +1 -0
  372. package/dist/services/storage/index.d.ts +10 -0
  373. package/dist/services/storage/index.d.ts.map +1 -0
  374. package/dist/services/storage/index.js +10 -0
  375. package/dist/services/storage/index.js.map +1 -0
  376. package/dist/services/storage/migrations/index.d.ts +16 -0
  377. package/dist/services/storage/migrations/index.d.ts.map +1 -0
  378. package/dist/services/storage/migrations/index.js +20 -0
  379. package/dist/services/storage/migrations/index.js.map +1 -0
  380. package/dist/services/storage/migrations/operations.d.ts +40 -0
  381. package/dist/services/storage/migrations/operations.d.ts.map +1 -0
  382. package/dist/services/storage/migrations/operations.js +2910 -0
  383. package/dist/services/storage/migrations/operations.js.map +1 -0
  384. package/dist/services/storage/migrations/schema-definitions.d.ts +306 -0
  385. package/dist/services/storage/migrations/schema-definitions.d.ts.map +1 -0
  386. package/dist/services/storage/migrations/schema-definitions.js +1006 -0
  387. package/dist/services/storage/migrations/schema-definitions.js.map +1 -0
  388. package/dist/services/storage/migrations/schema-helpers.d.ts +50 -0
  389. package/dist/services/storage/migrations/schema-helpers.d.ts.map +1 -0
  390. package/dist/services/storage/migrations/schema-helpers.js +176 -0
  391. package/dist/services/storage/migrations/schema-helpers.js.map +1 -0
  392. package/dist/services/storage/migrations/types.d.ts +15 -0
  393. package/dist/services/storage/migrations/types.d.ts.map +1 -0
  394. package/dist/services/storage/migrations/types.js +21 -0
  395. package/dist/services/storage/migrations/types.js.map +1 -0
  396. package/dist/services/storage/migrations/verification.d.ts +20 -0
  397. package/dist/services/storage/migrations/verification.d.ts.map +1 -0
  398. package/dist/services/storage/migrations/verification.js +78 -0
  399. package/dist/services/storage/migrations/verification.js.map +1 -0
  400. package/dist/services/storage/migrations.d.ts +16 -0
  401. package/dist/services/storage/migrations.d.ts.map +1 -0
  402. package/dist/services/storage/migrations.js +17 -0
  403. package/dist/services/storage/migrations.js.map +1 -0
  404. package/dist/services/storage/types.d.ts +12 -0
  405. package/dist/services/storage/types.d.ts.map +1 -0
  406. package/dist/services/storage/types.js +5 -0
  407. package/dist/services/storage/types.js.map +1 -0
  408. package/dist/services/storage/vector.d.ts +208 -0
  409. package/dist/services/storage/vector.d.ts.map +1 -0
  410. package/dist/services/storage/vector.js +526 -0
  411. package/dist/services/storage/vector.js.map +1 -0
  412. package/dist/services/vlm/pipeline.d.ts +194 -0
  413. package/dist/services/vlm/pipeline.d.ts.map +1 -0
  414. package/dist/services/vlm/pipeline.js +800 -0
  415. package/dist/services/vlm/pipeline.js.map +1 -0
  416. package/dist/services/vlm/prompts.d.ts +171 -0
  417. package/dist/services/vlm/prompts.d.ts.map +1 -0
  418. package/dist/services/vlm/prompts.js +229 -0
  419. package/dist/services/vlm/prompts.js.map +1 -0
  420. package/dist/services/vlm/service.d.ts +174 -0
  421. package/dist/services/vlm/service.d.ts.map +1 -0
  422. package/dist/services/vlm/service.js +256 -0
  423. package/dist/services/vlm/service.js.map +1 -0
  424. package/dist/services/webhook-delivery.d.ts +4 -0
  425. package/dist/services/webhook-delivery.d.ts.map +1 -0
  426. package/dist/services/webhook-delivery.js +140 -0
  427. package/dist/services/webhook-delivery.js.map +1 -0
  428. package/dist/tools/chunks.d.ts +19 -0
  429. package/dist/tools/chunks.d.ts.map +1 -0
  430. package/dist/tools/chunks.js +392 -0
  431. package/dist/tools/chunks.js.map +1 -0
  432. package/dist/tools/clm.d.ts +16 -0
  433. package/dist/tools/clm.d.ts.map +1 -0
  434. package/dist/tools/clm.js +668 -0
  435. package/dist/tools/clm.js.map +1 -0
  436. package/dist/tools/clustering.d.ts +13 -0
  437. package/dist/tools/clustering.d.ts.map +1 -0
  438. package/dist/tools/clustering.js +498 -0
  439. package/dist/tools/clustering.js.map +1 -0
  440. package/dist/tools/collaboration.d.ts +15 -0
  441. package/dist/tools/collaboration.d.ts.map +1 -0
  442. package/dist/tools/collaboration.js +516 -0
  443. package/dist/tools/collaboration.js.map +1 -0
  444. package/dist/tools/comparison.d.ts +13 -0
  445. package/dist/tools/comparison.d.ts.map +1 -0
  446. package/dist/tools/comparison.js +735 -0
  447. package/dist/tools/comparison.js.map +1 -0
  448. package/dist/tools/compliance.d.ts +15 -0
  449. package/dist/tools/compliance.d.ts.map +1 -0
  450. package/dist/tools/compliance.js +640 -0
  451. package/dist/tools/compliance.js.map +1 -0
  452. package/dist/tools/config.d.ts +19 -0
  453. package/dist/tools/config.d.ts.map +1 -0
  454. package/dist/tools/config.js +213 -0
  455. package/dist/tools/config.js.map +1 -0
  456. package/dist/tools/database.d.ts +62 -0
  457. package/dist/tools/database.d.ts.map +1 -0
  458. package/dist/tools/database.js +288 -0
  459. package/dist/tools/database.js.map +1 -0
  460. package/dist/tools/documents.d.ts +61 -0
  461. package/dist/tools/documents.d.ts.map +1 -0
  462. package/dist/tools/documents.js +1624 -0
  463. package/dist/tools/documents.js.map +1 -0
  464. package/dist/tools/embeddings.d.ts +14 -0
  465. package/dist/tools/embeddings.d.ts.map +1 -0
  466. package/dist/tools/embeddings.js +626 -0
  467. package/dist/tools/embeddings.js.map +1 -0
  468. package/dist/tools/evaluation.d.ts +25 -0
  469. package/dist/tools/evaluation.d.ts.map +1 -0
  470. package/dist/tools/evaluation.js +523 -0
  471. package/dist/tools/evaluation.js.map +1 -0
  472. package/dist/tools/events.d.ts +16 -0
  473. package/dist/tools/events.d.ts.map +1 -0
  474. package/dist/tools/events.js +493 -0
  475. package/dist/tools/events.js.map +1 -0
  476. package/dist/tools/extraction-structured.d.ts +13 -0
  477. package/dist/tools/extraction-structured.d.ts.map +1 -0
  478. package/dist/tools/extraction-structured.js +390 -0
  479. package/dist/tools/extraction-structured.js.map +1 -0
  480. package/dist/tools/extraction.d.ts +24 -0
  481. package/dist/tools/extraction.d.ts.map +1 -0
  482. package/dist/tools/extraction.js +424 -0
  483. package/dist/tools/extraction.js.map +1 -0
  484. package/dist/tools/file-management.d.ts +14 -0
  485. package/dist/tools/file-management.d.ts.map +1 -0
  486. package/dist/tools/file-management.js +523 -0
  487. package/dist/tools/file-management.js.map +1 -0
  488. package/dist/tools/form-fill.d.ts +13 -0
  489. package/dist/tools/form-fill.d.ts.map +1 -0
  490. package/dist/tools/form-fill.js +250 -0
  491. package/dist/tools/form-fill.js.map +1 -0
  492. package/dist/tools/health.d.ts +19 -0
  493. package/dist/tools/health.d.ts.map +1 -0
  494. package/dist/tools/health.js +229 -0
  495. package/dist/tools/health.js.map +1 -0
  496. package/dist/tools/images.d.ts +54 -0
  497. package/dist/tools/images.d.ts.map +1 -0
  498. package/dist/tools/images.js +787 -0
  499. package/dist/tools/images.js.map +1 -0
  500. package/dist/tools/ingestion.d.ts +94 -0
  501. package/dist/tools/ingestion.d.ts.map +1 -0
  502. package/dist/tools/ingestion.js +1659 -0
  503. package/dist/tools/ingestion.js.map +1 -0
  504. package/dist/tools/intelligence.d.ts +18 -0
  505. package/dist/tools/intelligence.d.ts.map +1 -0
  506. package/dist/tools/intelligence.js +1039 -0
  507. package/dist/tools/intelligence.js.map +1 -0
  508. package/dist/tools/provenance.d.ts +51 -0
  509. package/dist/tools/provenance.d.ts.map +1 -0
  510. package/dist/tools/provenance.js +691 -0
  511. package/dist/tools/provenance.js.map +1 -0
  512. package/dist/tools/reports.d.ts +41 -0
  513. package/dist/tools/reports.d.ts.map +1 -0
  514. package/dist/tools/reports.js +1394 -0
  515. package/dist/tools/reports.js.map +1 -0
  516. package/dist/tools/search.d.ts +35 -0
  517. package/dist/tools/search.d.ts.map +1 -0
  518. package/dist/tools/search.js +2528 -0
  519. package/dist/tools/search.js.map +1 -0
  520. package/dist/tools/shared.d.ts +52 -0
  521. package/dist/tools/shared.d.ts.map +1 -0
  522. package/dist/tools/shared.js +54 -0
  523. package/dist/tools/shared.js.map +1 -0
  524. package/dist/tools/tags.d.ts +15 -0
  525. package/dist/tools/tags.d.ts.map +1 -0
  526. package/dist/tools/tags.js +287 -0
  527. package/dist/tools/tags.js.map +1 -0
  528. package/dist/tools/timeline.d.ts +15 -0
  529. package/dist/tools/timeline.d.ts.map +1 -0
  530. package/dist/tools/timeline.js +14 -0
  531. package/dist/tools/timeline.js.map +1 -0
  532. package/dist/tools/users.d.ts +14 -0
  533. package/dist/tools/users.d.ts.map +1 -0
  534. package/dist/tools/users.js +257 -0
  535. package/dist/tools/users.js.map +1 -0
  536. package/dist/tools/vlm.d.ts +40 -0
  537. package/dist/tools/vlm.d.ts.map +1 -0
  538. package/dist/tools/vlm.js +475 -0
  539. package/dist/tools/vlm.js.map +1 -0
  540. package/dist/tools/workflow.d.ts +16 -0
  541. package/dist/tools/workflow.d.ts.map +1 -0
  542. package/dist/tools/workflow.js +495 -0
  543. package/dist/tools/workflow.js.map +1 -0
  544. package/dist/utils/backoff.d.ts +53 -0
  545. package/dist/utils/backoff.d.ts.map +1 -0
  546. package/dist/utils/backoff.js +78 -0
  547. package/dist/utils/backoff.js.map +1 -0
  548. package/dist/utils/config-persistence.d.ts +33 -0
  549. package/dist/utils/config-persistence.d.ts.map +1 -0
  550. package/dist/utils/config-persistence.js +61 -0
  551. package/dist/utils/config-persistence.js.map +1 -0
  552. package/dist/utils/hash.d.ts +65 -0
  553. package/dist/utils/hash.d.ts.map +1 -0
  554. package/dist/utils/hash.js +146 -0
  555. package/dist/utils/hash.js.map +1 -0
  556. package/dist/utils/math.d.ts +21 -0
  557. package/dist/utils/math.d.ts.map +1 -0
  558. package/dist/utils/math.js +39 -0
  559. package/dist/utils/math.js.map +1 -0
  560. package/dist/utils/validation.d.ts +697 -0
  561. package/dist/utils/validation.d.ts.map +1 -0
  562. package/dist/utils/validation.js +529 -0
  563. package/dist/utils/validation.js.map +1 -0
  564. package/package.json +96 -0
  565. package/python/.gitkeep +0 -0
  566. package/python/__init__.py +104 -0
  567. package/python/clustering_worker.py +440 -0
  568. package/python/docx_image_extractor.py +524 -0
  569. package/python/embedding_worker.py +552 -0
  570. package/python/file_manager_worker.py +564 -0
  571. package/python/form_fill_worker.py +399 -0
  572. package/python/gpu_utils.py +582 -0
  573. package/python/image_extractor.py +317 -0
  574. package/python/image_optimizer.py +444 -0
  575. package/python/ocr_worker.py +712 -0
  576. package/python/pyproject.toml +76 -0
  577. package/python/requirements.txt +51 -0
  578. package/python/reranker_worker.py +87 -0
@@ -0,0 +1,424 @@
1
+ /**
2
+ * MCP Server State Management
3
+ *
4
+ * Manages global server state including current database connection and configuration.
5
+ * FAIL FAST: All state access throws immediately if preconditions not met.
6
+ *
7
+ * @module server/state
8
+ */
9
+ import { DatabaseService } from '../services/storage/database/index.js';
10
+ import { VectorService } from '../services/storage/vector.js';
11
+ import { DEFAULT_STORAGE_PATH } from '../services/storage/database/helpers.js';
12
+ import { databaseNotSelectedError, databaseNotFoundError, databaseAlreadyExistsError, } from './errors.js';
13
+ import { loadPersistedConfig } from '../utils/config-persistence.js';
14
+ // ═══════════════════════════════════════════════════════════════════════════════
15
+ // DEFAULT CONFIGURATION
16
+ // ═══════════════════════════════════════════════════════════════════════════════
17
+ /**
18
+ * Default server configuration
19
+ */
20
+ const defaultConfig = {
21
+ defaultStoragePath: DEFAULT_STORAGE_PATH,
22
+ defaultOCRMode: 'balanced',
23
+ maxConcurrent: 3,
24
+ embeddingBatchSize: 32,
25
+ embeddingDevice: 'auto',
26
+ chunkSize: 2000,
27
+ chunkOverlapPercent: 10,
28
+ maxChunkSize: 8000,
29
+ autoClusterEnabled: false,
30
+ autoClusterThreshold: 10,
31
+ autoClusterAlgorithm: 'hdbscan',
32
+ imageOptimization: {
33
+ enabled: true,
34
+ ocrMaxWidth: 4800,
35
+ vlmMaxDimension: 2048,
36
+ vlmSkipBelowSize: 50,
37
+ vlmMinRelevance: 0.3,
38
+ vlmSkipLogosIcons: true,
39
+ },
40
+ };
41
+ // ═══════════════════════════════════════════════════════════════════════════════
42
+ // GLOBAL STATE
43
+ // ═══════════════════════════════════════════════════════════════════════════════
44
+ /**
45
+ * Global server state
46
+ * Mutable state for current database and configuration
47
+ */
48
+ export const state = {
49
+ currentDatabase: null,
50
+ currentDatabaseName: null,
51
+ config: { ...defaultConfig },
52
+ };
53
+ /**
54
+ * Cached VectorService instance - cleared on database change
55
+ */
56
+ let _cachedVectorService = null;
57
+ /**
58
+ * Generation counter - incremented on every database switch/clear.
59
+ */
60
+ let _dbGeneration = 0;
61
+ /**
62
+ * Active operation counter - tracks in-flight async database operations.
63
+ * selectDatabase() and clearDatabase() refuse to proceed when > 0.
64
+ */
65
+ let _activeOperations = 0;
66
+ /**
67
+ * Require database to be selected - FAIL FAST if not
68
+ *
69
+ * @returns Database service, vector service, and generation counter
70
+ * @throws MCPError with DATABASE_NOT_SELECTED if no database is selected
71
+ */
72
+ export function requireDatabase() {
73
+ if (!state.currentDatabase) {
74
+ throw databaseNotSelectedError();
75
+ }
76
+ if (!_cachedVectorService) {
77
+ _cachedVectorService = new VectorService(state.currentDatabase.getConnection());
78
+ }
79
+ return { db: state.currentDatabase, vector: _cachedVectorService, generation: _dbGeneration };
80
+ }
81
+ /**
82
+ * Validate that the database generation matches the expected value.
83
+ *
84
+ * The generation counter increments on every database switch/clear. A mismatch
85
+ * means the database was switched between the time a caller obtained the
86
+ * generation and the time it validates -- indicating a race condition where
87
+ * the caller's database reference is stale.
88
+ *
89
+ * Callers can optionally use this at critical points (e.g., before writing
90
+ * results back to the database) to detect and fail fast on stale references.
91
+ *
92
+ * @param expectedGeneration - The generation value obtained from requireDatabase()
93
+ * @throws Error if the current generation does not match
94
+ */
95
+ export function validateGeneration(expectedGeneration) {
96
+ if (_dbGeneration !== expectedGeneration) {
97
+ throw new Error(`Database generation mismatch: expected ${expectedGeneration}, current ${_dbGeneration}. ` +
98
+ `The database was switched during this operation. Retry with the current database.`);
99
+ }
100
+ }
101
+ // ═══════════════════════════════════════════════════════════════════════════════
102
+ // OPERATION TRACKING (H-1, H-2, M-9)
103
+ // ═══════════════════════════════════════════════════════════════════════════════
104
+ /**
105
+ * Begin tracking an in-flight database operation.
106
+ *
107
+ * Increments the active operation counter and returns the current generation.
108
+ * While any operations are active, selectDatabase() and clearDatabase() will
109
+ * throw to prevent database switches during async work.
110
+ *
111
+ * @returns Current database generation for later validation
112
+ * @throws MCPError if no database is selected
113
+ */
114
+ export function beginDatabaseOperation() {
115
+ if (!state.currentDatabase) {
116
+ throw databaseNotSelectedError();
117
+ }
118
+ _activeOperations++;
119
+ return _dbGeneration;
120
+ }
121
+ /**
122
+ * End tracking an in-flight database operation.
123
+ *
124
+ * Decrements the active operation counter. Counter never goes below 0.
125
+ */
126
+ export function endDatabaseOperation() {
127
+ if (_activeOperations > 0) {
128
+ _activeOperations--;
129
+ }
130
+ }
131
+ /**
132
+ * Get the number of active database operations (for diagnostics/testing).
133
+ */
134
+ export function getActiveOperationCount() {
135
+ return _activeOperations;
136
+ }
137
+ /**
138
+ * Execute an async function within a tracked database operation scope.
139
+ *
140
+ * Calls beginDatabaseOperation() before the function and endDatabaseOperation()
141
+ * in a finally block, guaranteeing the counter is decremented even on error.
142
+ * Also validates the generation after the function completes to detect any
143
+ * mid-operation database switch.
144
+ *
145
+ * Use this for async tool handlers that do database writes across multiple
146
+ * await points. Read-only synchronous handlers do not need this wrapper
147
+ * because the event loop does not yield.
148
+ *
149
+ * @param fn - Async function receiving DatabaseServices
150
+ * @returns The result of fn
151
+ * @throws MCPError if no database is selected
152
+ * @throws Error if the database was switched during the operation
153
+ */
154
+ export async function withDatabaseOperation(fn) {
155
+ const generation = beginDatabaseOperation();
156
+ try {
157
+ const services = requireDatabase();
158
+ const result = await fn(services);
159
+ validateGeneration(generation);
160
+ return result;
161
+ }
162
+ finally {
163
+ endDatabaseOperation();
164
+ }
165
+ }
166
+ /**
167
+ * Check if a database is currently selected
168
+ */
169
+ export function hasDatabase() {
170
+ return state.currentDatabase !== null;
171
+ }
172
+ /**
173
+ * Get current database name or null
174
+ */
175
+ export function getCurrentDatabaseName() {
176
+ return state.currentDatabaseName;
177
+ }
178
+ // ═══════════════════════════════════════════════════════════════════════════════
179
+ // DATABASE MANAGEMENT
180
+ // ═══════════════════════════════════════════════════════════════════════════════
181
+ /**
182
+ * Apply persisted config from a database's config_json column.
183
+ *
184
+ * Called after database selection to restore config values that were
185
+ * saved by handleConfigSet in a previous session.
186
+ *
187
+ * @param db - The newly opened DatabaseService
188
+ */
189
+ function applyPersistedConfig(db) {
190
+ try {
191
+ const persisted = loadPersistedConfig(db.getConnection());
192
+ if (Object.keys(persisted).length > 0) {
193
+ // Apply each persisted config key using updateConfig
194
+ const CONFIG_KEY_TO_STATE = {
195
+ datalab_default_mode: 'defaultOCRMode',
196
+ datalab_max_concurrent: 'maxConcurrent',
197
+ embedding_batch_size: 'embeddingBatchSize',
198
+ embedding_device: 'embeddingDevice',
199
+ chunk_size: 'chunkSize',
200
+ chunk_overlap_percent: 'chunkOverlapPercent',
201
+ max_chunk_size: 'maxChunkSize',
202
+ auto_cluster_enabled: 'autoClusterEnabled',
203
+ auto_cluster_threshold: 'autoClusterThreshold',
204
+ auto_cluster_algorithm: 'autoClusterAlgorithm',
205
+ };
206
+ const updates = {};
207
+ for (const [key, value] of Object.entries(persisted)) {
208
+ const stateKey = CONFIG_KEY_TO_STATE[key];
209
+ if (stateKey) {
210
+ updates[stateKey] = value;
211
+ }
212
+ }
213
+ if (Object.keys(updates).length > 0) {
214
+ updateConfig(updates);
215
+ console.error(`[state] Loaded ${Object.keys(updates).length} persisted config value(s) from database`);
216
+ }
217
+ }
218
+ }
219
+ catch (error) {
220
+ console.error(`[state] Failed to apply persisted config: ${error instanceof Error ? error.message : String(error)}`);
221
+ }
222
+ }
223
+ /**
224
+ * Select a database by name - opens connection and sets as current
225
+ *
226
+ * FAIL FAST: Throws immediately if database doesn't exist or if operations
227
+ * are in-flight (H-2 guard). Uses atomic swap (M-9 fix): opens new DB first,
228
+ * then swaps state, then closes old DB -- no null window.
229
+ *
230
+ * @param name - Database name to select
231
+ * @param storagePath - Optional storage path override
232
+ * @throws MCPError with DATABASE_NOT_FOUND if database doesn't exist
233
+ * @throws Error if database operations are in-flight
234
+ */
235
+ export function selectDatabase(name, storagePath) {
236
+ const path = storagePath ?? state.config.defaultStoragePath;
237
+ // H-2: Refuse to switch while async operations are in-flight
238
+ if (_activeOperations > 0) {
239
+ throw new Error(`Cannot switch databases while ${_activeOperations} operation(s) are in-flight. ` +
240
+ `Wait for active operations to complete before switching databases.`);
241
+ }
242
+ // Verify database exists BEFORE any state changes - FAIL FAST
243
+ // If the new DB doesn't exist, the old connection stays open and usable.
244
+ if (!DatabaseService.exists(name, path)) {
245
+ throw databaseNotFoundError(name, path);
246
+ }
247
+ // M-9: Atomic swap - open new FIRST, then swap state, then close old.
248
+ // This eliminates the null window where state.currentDatabase is null
249
+ // between closing old and opening new.
250
+ const newDb = DatabaseService.open(name, path);
251
+ const oldDb = state.currentDatabase;
252
+ // Swap state atomically (single tick - no await between these assignments)
253
+ state.currentDatabase = newDb;
254
+ state.currentDatabaseName = name;
255
+ _cachedVectorService = null;
256
+ _dbGeneration++;
257
+ // Close old connection AFTER state points to new DB
258
+ if (oldDb) {
259
+ oldDb.close();
260
+ }
261
+ // Load persisted config from the database (if any)
262
+ applyPersistedConfig(newDb);
263
+ }
264
+ /**
265
+ * Create a new database and optionally select it
266
+ *
267
+ * FAIL FAST: Throws immediately if database already exists
268
+ *
269
+ * @param name - Database name to create
270
+ * @param description - Optional description
271
+ * @param storagePath - Optional storage path override
272
+ * @param autoSelect - Whether to select the database after creation (default: true)
273
+ * @returns The created database service
274
+ * @throws MCPError with DATABASE_ALREADY_EXISTS if database exists
275
+ */
276
+ export function createDatabase(name, description, storagePath, autoSelect = true) {
277
+ const path = storagePath ?? state.config.defaultStoragePath;
278
+ // Check if database already exists - FAIL FAST
279
+ if (DatabaseService.exists(name, path)) {
280
+ throw databaseAlreadyExistsError(name);
281
+ }
282
+ // Create the database
283
+ const db = DatabaseService.create(name, description, path);
284
+ if (autoSelect) {
285
+ // H-3: Refuse to switch while async operations are in-flight
286
+ if (_activeOperations > 0) {
287
+ // Close the newly created DB since we can't switch to it
288
+ db.close();
289
+ throw new Error(`Cannot auto-select newly created database "${name}" while ${_activeOperations} operation(s) are in-flight. ` +
290
+ `Wait for active operations to complete, then select the database manually.`);
291
+ }
292
+ // Close any existing connection first
293
+ if (state.currentDatabase) {
294
+ state.currentDatabase.close();
295
+ }
296
+ _cachedVectorService = null;
297
+ _dbGeneration++;
298
+ state.currentDatabase = db;
299
+ state.currentDatabaseName = name;
300
+ }
301
+ // When autoSelect=false, return the open DB -- caller manages lifecycle.
302
+ // Previously the DB was closed here making the returned service dead.
303
+ return db;
304
+ }
305
+ /**
306
+ * Delete a database
307
+ *
308
+ * FAIL FAST: Throws if database doesn't exist
309
+ *
310
+ * @param name - Database name to delete
311
+ * @param storagePath - Optional storage path override
312
+ * @throws MCPError with DATABASE_NOT_FOUND if database doesn't exist
313
+ */
314
+ export function deleteDatabase(name, storagePath) {
315
+ const path = storagePath ?? state.config.defaultStoragePath;
316
+ // Verify database exists - FAIL FAST
317
+ if (!DatabaseService.exists(name, path)) {
318
+ throw databaseNotFoundError(name, path);
319
+ }
320
+ // If this is the current database, clear state first
321
+ if (state.currentDatabaseName === name) {
322
+ clearDatabase();
323
+ }
324
+ // Delete the database
325
+ DatabaseService.delete(name, path);
326
+ }
327
+ /**
328
+ * Clear current database selection - closes connection.
329
+ *
330
+ * FAIL FAST: Throws if async operations are in-flight (H-2 guard).
331
+ * The forceClose parameter bypasses the guard for internal use only
332
+ * (resetState in tests, process exit cleanup).
333
+ *
334
+ * @param forceClose - Skip operation guard (internal use only)
335
+ * @throws Error if database operations are in-flight and forceClose is false
336
+ */
337
+ export function clearDatabase(forceClose = false) {
338
+ // H-2: Refuse to clear while async operations are in-flight
339
+ if (!forceClose && _activeOperations > 0) {
340
+ throw new Error(`Cannot clear database while ${_activeOperations} operation(s) are in-flight. ` +
341
+ `Wait for active operations to complete before clearing the database.`);
342
+ }
343
+ if (state.currentDatabase) {
344
+ state.currentDatabase.close();
345
+ state.currentDatabase = null;
346
+ state.currentDatabaseName = null;
347
+ _cachedVectorService = null;
348
+ _dbGeneration++;
349
+ }
350
+ }
351
+ // ═══════════════════════════════════════════════════════════════════════════════
352
+ // CONFIGURATION
353
+ // ═══════════════════════════════════════════════════════════════════════════════
354
+ /**
355
+ * Get current server configuration
356
+ */
357
+ export function getConfig() {
358
+ return { ...state.config };
359
+ }
360
+ /**
361
+ * Update server configuration (deep merges nested objects like imageOptimization)
362
+ */
363
+ export function updateConfig(updates) {
364
+ // Deep merge imageOptimization if both existing and update have it
365
+ if (updates.imageOptimization && state.config.imageOptimization) {
366
+ updates = {
367
+ ...updates,
368
+ imageOptimization: {
369
+ ...state.config.imageOptimization,
370
+ ...updates.imageOptimization,
371
+ },
372
+ };
373
+ }
374
+ state.config = { ...state.config, ...updates };
375
+ }
376
+ /**
377
+ * Reset configuration to defaults
378
+ */
379
+ export function resetConfig() {
380
+ state.config = { ...defaultConfig };
381
+ }
382
+ /**
383
+ * Get default storage path
384
+ */
385
+ export function getDefaultStoragePath() {
386
+ return state.config.defaultStoragePath;
387
+ }
388
+ // ═══════════════════════════════════════════════════════════════════════════════
389
+ // STATE RESET (FOR TESTING)
390
+ // ═══════════════════════════════════════════════════════════════════════════════
391
+ /**
392
+ * Reset all server state - ONLY USE IN TESTS
393
+ *
394
+ * Uses forceClose=true to bypass the operation guard since tests
395
+ * need to reset state unconditionally between test cases.
396
+ */
397
+ export function resetState() {
398
+ clearDatabase(/* forceClose */ true);
399
+ _cachedVectorService = null;
400
+ _dbGeneration = 0;
401
+ _activeOperations = 0;
402
+ state.config = { ...defaultConfig };
403
+ }
404
+ // ═══════════════════════════════════════════════════════════════════════════════
405
+ // PROCESS EXIT CLEANUP
406
+ // ═══════════════════════════════════════════════════════════════════════════════
407
+ /**
408
+ * L-5: Clean up database connections on process exit.
409
+ * Ensures WAL/SHM files are properly checkpointed.
410
+ */
411
+ process.on('exit', () => {
412
+ if (state.currentDatabase) {
413
+ try {
414
+ state.currentDatabase.close();
415
+ }
416
+ catch (error) {
417
+ console.error('[state] database close on exit failed:', error instanceof Error ? error.message : String(error));
418
+ // Continue exit cleanup despite error
419
+ }
420
+ state.currentDatabase = null;
421
+ state.currentDatabaseName = null;
422
+ }
423
+ });
424
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/server/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Streamable HTTP Transport for MCP
3
+ *
4
+ * Implements MCP Streamable HTTP transport (2025-03-26):
5
+ * - HTTP POST for client->server messages
6
+ * - SSE for server->client streaming
7
+ * - Mcp-Session-Id header for session management
8
+ *
9
+ * CRITICAL: NEVER use console.log() - stdout is reserved for JSON-RPC protocol.
10
+ *
11
+ * @module server/transports/http-transport
12
+ */
13
+ export interface HttpTransportConfig {
14
+ port: number;
15
+ sessionTtlMs: number;
16
+ }
17
+ export declare class HttpTransport {
18
+ private sessions;
19
+ private server;
20
+ private config;
21
+ private cleanupTimer;
22
+ private messageHandler;
23
+ constructor(config?: Partial<HttpTransportConfig>);
24
+ /** Set the handler for incoming messages */
25
+ onMessage(handler: (sessionId: string, message: unknown) => Promise<unknown>): void;
26
+ /** Start the HTTP server */
27
+ start(): Promise<void>;
28
+ /** Stop the HTTP server */
29
+ stop(): Promise<void>;
30
+ private handlePost;
31
+ private handleSSE;
32
+ /** Send SSE event to a session */
33
+ sendEvent(sessionId: string, event: string, data: unknown): void;
34
+ private cleanupExpiredSessions;
35
+ getSessionCount(): number;
36
+ }
37
+ //# sourceMappingURL=http-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-transport.d.ts","sourceRoot":"","sources":["../../../src/server/transports/http-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB;AAaD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,cAAc,CAA4E;gBAEtF,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAOjD,4CAA4C;IAC5C,SAAS,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IAInF,4BAA4B;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmD5B,2BAA2B;IACrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAeb,UAAU;YAiDV,SAAS;IAoCvB,kCAAkC;IAClC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAchE,OAAO,CAAC,sBAAsB;IAiB9B,eAAe,IAAI,MAAM;CAG1B"}
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Streamable HTTP Transport for MCP
3
+ *
4
+ * Implements MCP Streamable HTTP transport (2025-03-26):
5
+ * - HTTP POST for client->server messages
6
+ * - SSE for server->client streaming
7
+ * - Mcp-Session-Id header for session management
8
+ *
9
+ * CRITICAL: NEVER use console.log() - stdout is reserved for JSON-RPC protocol.
10
+ *
11
+ * @module server/transports/http-transport
12
+ */
13
+ import http from 'http';
14
+ import { randomUUID } from 'crypto';
15
+ // ═══════════════════════════════════════════════════════════════════════════════
16
+ // HTTP TRANSPORT
17
+ // ═══════════════════════════════════════════════════════════════════════════════
18
+ export class HttpTransport {
19
+ sessions = new Map();
20
+ server = null;
21
+ config;
22
+ cleanupTimer = null;
23
+ messageHandler = null;
24
+ constructor(config) {
25
+ this.config = {
26
+ port: config?.port ?? (Number(process.env.MCP_HTTP_PORT) || 3100),
27
+ sessionTtlMs: config?.sessionTtlMs ?? (Number(process.env.MCP_SESSION_TTL) || 3600) * 1000,
28
+ };
29
+ }
30
+ /** Set the handler for incoming messages */
31
+ onMessage(handler) {
32
+ this.messageHandler = handler;
33
+ }
34
+ /** Start the HTTP server */
35
+ async start() {
36
+ this.server = http.createServer(async (req, res) => {
37
+ // CORS headers
38
+ res.setHeader('Access-Control-Allow-Origin', '*');
39
+ res.setHeader('Access-Control-Allow-Methods', 'POST, GET, OPTIONS');
40
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Mcp-Session-Id');
41
+ res.setHeader('Access-Control-Expose-Headers', 'Mcp-Session-Id');
42
+ if (req.method === 'OPTIONS') {
43
+ res.writeHead(204);
44
+ res.end();
45
+ return;
46
+ }
47
+ try {
48
+ if (req.method === 'POST' && req.url === '/mcp') {
49
+ await this.handlePost(req, res);
50
+ }
51
+ else if (req.method === 'GET' && req.url === '/mcp/sse') {
52
+ await this.handleSSE(req, res);
53
+ }
54
+ else if (req.method === 'GET' && req.url === '/health') {
55
+ res.writeHead(200, { 'Content-Type': 'application/json' });
56
+ res.end(JSON.stringify({ status: 'ok', sessions: this.sessions.size }));
57
+ }
58
+ else {
59
+ res.writeHead(404);
60
+ res.end('Not found');
61
+ }
62
+ }
63
+ catch (error) {
64
+ console.error('[HttpTransport] Request error:', error instanceof Error ? error.message : String(error));
65
+ if (!res.headersSent) {
66
+ res.writeHead(500, { 'Content-Type': 'application/json' });
67
+ res.end(JSON.stringify({ error: 'Internal server error' }));
68
+ }
69
+ }
70
+ });
71
+ await new Promise((resolve, reject) => {
72
+ this.server.listen(this.config.port, () => {
73
+ console.error(`[HttpTransport] Listening on port ${this.config.port}`);
74
+ resolve();
75
+ });
76
+ this.server.on('error', reject);
77
+ });
78
+ // Session cleanup every 60s
79
+ this.cleanupTimer = setInterval(() => this.cleanupExpiredSessions(), 60000);
80
+ this.cleanupTimer.unref();
81
+ }
82
+ /** Stop the HTTP server */
83
+ async stop() {
84
+ if (this.cleanupTimer) {
85
+ clearInterval(this.cleanupTimer);
86
+ this.cleanupTimer = null;
87
+ }
88
+ if (this.server) {
89
+ await new Promise((resolve) => {
90
+ this.server.close(() => resolve());
91
+ });
92
+ this.server = null;
93
+ }
94
+ this.sessions.clear();
95
+ console.error('[HttpTransport] Stopped');
96
+ }
97
+ async handlePost(req, res) {
98
+ // Get or create session
99
+ let sessionId = req.headers['mcp-session-id'];
100
+ if (sessionId && !this.sessions.has(sessionId)) {
101
+ res.writeHead(400, { 'Content-Type': 'application/json' });
102
+ res.end(JSON.stringify({ error: 'Invalid session ID' }));
103
+ return;
104
+ }
105
+ if (!sessionId) {
106
+ sessionId = randomUUID();
107
+ this.sessions.set(sessionId, {
108
+ id: sessionId,
109
+ createdAt: Date.now(),
110
+ lastActivity: Date.now(),
111
+ sseResponse: null,
112
+ });
113
+ }
114
+ const session = this.sessions.get(sessionId);
115
+ session.lastActivity = Date.now();
116
+ // Read body
117
+ const body = await new Promise((resolve, reject) => {
118
+ let data = '';
119
+ req.on('data', (chunk) => {
120
+ data += chunk;
121
+ });
122
+ req.on('end', () => resolve(data));
123
+ req.on('error', reject);
124
+ });
125
+ if (!this.messageHandler) {
126
+ res.writeHead(500, { 'Content-Type': 'application/json' });
127
+ res.end(JSON.stringify({ error: 'No message handler registered' }));
128
+ return;
129
+ }
130
+ const message = JSON.parse(body);
131
+ const response = await this.messageHandler(sessionId, message);
132
+ res.writeHead(200, {
133
+ 'Content-Type': 'application/json',
134
+ 'Mcp-Session-Id': sessionId,
135
+ });
136
+ res.end(JSON.stringify(response));
137
+ }
138
+ async handleSSE(req, res) {
139
+ const sessionId = req.headers['mcp-session-id'];
140
+ if (!sessionId || !this.sessions.has(sessionId)) {
141
+ res.writeHead(400);
142
+ res.end('Invalid session');
143
+ return;
144
+ }
145
+ const session = this.sessions.get(sessionId);
146
+ session.lastActivity = Date.now();
147
+ session.sseResponse = res;
148
+ res.writeHead(200, {
149
+ 'Content-Type': 'text/event-stream',
150
+ 'Cache-Control': 'no-cache',
151
+ 'Connection': 'keep-alive',
152
+ 'Mcp-Session-Id': sessionId,
153
+ });
154
+ // Keep-alive ping every 30s
155
+ const keepAlive = setInterval(() => {
156
+ try {
157
+ res.write(': ping\n\n');
158
+ }
159
+ catch {
160
+ clearInterval(keepAlive);
161
+ }
162
+ }, 30000);
163
+ req.on('close', () => {
164
+ clearInterval(keepAlive);
165
+ if (session.sseResponse === res) {
166
+ session.sseResponse = null;
167
+ }
168
+ });
169
+ }
170
+ /** Send SSE event to a session */
171
+ sendEvent(sessionId, event, data) {
172
+ const session = this.sessions.get(sessionId);
173
+ if (session?.sseResponse) {
174
+ try {
175
+ session.sseResponse.write(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`);
176
+ }
177
+ catch (error) {
178
+ console.error(`[HttpTransport] SSE send failed for ${sessionId}: ${error instanceof Error ? error.message : String(error)}`);
179
+ session.sseResponse = null;
180
+ }
181
+ }
182
+ }
183
+ cleanupExpiredSessions() {
184
+ const now = Date.now();
185
+ for (const [id, session] of this.sessions) {
186
+ if (now - session.lastActivity > this.config.sessionTtlMs) {
187
+ console.error(`[HttpTransport] Expiring session ${id}`);
188
+ if (session.sseResponse) {
189
+ try {
190
+ session.sseResponse.end();
191
+ }
192
+ catch {
193
+ /* ignore close errors */
194
+ }
195
+ }
196
+ this.sessions.delete(id);
197
+ }
198
+ }
199
+ }
200
+ getSessionCount() {
201
+ return this.sessions.size;
202
+ }
203
+ }
204
+ //# sourceMappingURL=http-transport.js.map