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,536 @@
1
+ /**
2
+ * ProvenanceVerifier - Hash integrity and chain verification
3
+ *
4
+ * Constitution Compliance:
5
+ * - CP-003: Immutable Hash Verification
6
+ * - CP-001: Complete Provenance Chain
7
+ *
8
+ * FAIL FAST: All errors throw immediately
9
+ * NO MOCKS: Tests use real DatabaseService
10
+ */
11
+ import fs from 'fs';
12
+ import { ProvenanceErrorCode } from './tracker.js';
13
+ import { ProvenanceType } from '../../models/provenance.js';
14
+ import { computeHash, hashFile, isValidHashFormat } from '../../utils/hash.js';
15
+ import { rowToDocument, rowToOCRResult, rowToChunk, rowToEmbedding, rowToProvenance, rowToImage, } from '../storage/database/converters.js';
16
+ /** Error codes for verifier operations */
17
+ export const VerifierErrorCode = {
18
+ ...ProvenanceErrorCode,
19
+ INTEGRITY_FAILED: 'INTEGRITY_VERIFICATION_FAILED',
20
+ CONTENT_NOT_FOUND: 'CONTENT_NOT_FOUND',
21
+ FILE_NOT_FOUND: 'SOURCE_FILE_NOT_FOUND',
22
+ HASH_FORMAT_INVALID: 'HASH_FORMAT_INVALID',
23
+ };
24
+ /**
25
+ * VerifierError - Typed error for verification operations
26
+ * FAIL FAST: Always throw with detailed error information
27
+ */
28
+ export class VerifierError extends Error {
29
+ code;
30
+ details;
31
+ constructor(message, code, details) {
32
+ super(message);
33
+ this.code = code;
34
+ this.details = details;
35
+ this.name = 'VerifierError';
36
+ Object.setPrototypeOf(this, VerifierError.prototype);
37
+ }
38
+ }
39
+ /**
40
+ * ProvenanceVerifier - Hash integrity and chain verification
41
+ *
42
+ * Provides verification for:
43
+ * 1. Single provenance record content hash
44
+ * 2. Complete provenance chain integrity
45
+ * 3. Database-wide verification
46
+ * 4. Source file integrity
47
+ */
48
+ export class ProvenanceVerifier {
49
+ db;
50
+ tracker;
51
+ rawDb;
52
+ constructor(db, tracker) {
53
+ this.db = db;
54
+ this.tracker = tracker;
55
+ this.rawDb = db.getConnection();
56
+ }
57
+ /**
58
+ * Verify content hash for a single provenance record
59
+ *
60
+ * @param provenanceId - Provenance record ID to verify
61
+ * @returns Verification result with computed and expected hashes
62
+ * @throws VerifierError if provenance not found, content not found, or file not accessible
63
+ */
64
+ async verifyContentHash(provenanceId) {
65
+ // Get provenance record - throws if not found
66
+ const record = this.tracker.getProvenanceById(provenanceId);
67
+ // Get content and expected hash based on type
68
+ const { content, expectedHash, isFile } = this.getContentForVerification(record);
69
+ // Validate expected hash format
70
+ const formatValid = isValidHashFormat(expectedHash);
71
+ // Compute hash of content
72
+ let computedHash;
73
+ if (isFile && typeof content === 'string') {
74
+ // For files, content is the file path - hash the file
75
+ computedHash = await hashFile(content);
76
+ }
77
+ else {
78
+ // For text content, compute hash directly
79
+ computedHash = computeHash(content);
80
+ }
81
+ const valid = formatValid && computedHash === expectedHash;
82
+ return {
83
+ valid,
84
+ item_id: provenanceId,
85
+ item_type: record.type,
86
+ expected_hash: expectedHash,
87
+ computed_hash: computedHash,
88
+ format_valid: formatValid,
89
+ verified_at: new Date().toISOString(),
90
+ };
91
+ }
92
+ /**
93
+ * Verify complete provenance chain from item to root
94
+ *
95
+ * @param provenanceId - Starting provenance record ID
96
+ * @returns Chain verification result with all failing items
97
+ * @throws VerifierError if chain broken or item not found
98
+ */
99
+ async verifyChain(provenanceId) {
100
+ // Get chain using tracker - throws if not found
101
+ const chain = this.tracker.getProvenanceChain(provenanceId);
102
+ const failedItems = [];
103
+ let hashesVerified = 0;
104
+ let hashesFailed = 0;
105
+ // Verify each record in the chain: current + ancestors
106
+ const allRecords = [chain.current, ...chain.ancestors];
107
+ for (const record of allRecords) {
108
+ try {
109
+ const result = await this.verifyContentHash(record.id);
110
+ if (result.valid) {
111
+ hashesVerified++;
112
+ }
113
+ else {
114
+ hashesFailed++;
115
+ failedItems.push({
116
+ id: record.id,
117
+ expected_hash: result.expected_hash,
118
+ computed_hash: result.computed_hash,
119
+ type: record.type,
120
+ });
121
+ }
122
+ }
123
+ catch (error) {
124
+ // Content not found or file not accessible - count as failure
125
+ hashesFailed++;
126
+ failedItems.push({
127
+ id: record.id,
128
+ expected_hash: record.content_hash,
129
+ computed_hash: 'ERROR: ' + (error instanceof Error ? error.message : 'Unknown error'),
130
+ type: record.type,
131
+ });
132
+ }
133
+ }
134
+ const valid = hashesFailed === 0 && chain.isComplete;
135
+ return {
136
+ valid,
137
+ chain_intact: chain.isComplete,
138
+ hashes_verified: hashesVerified,
139
+ hashes_failed: hashesFailed,
140
+ failed_items: failedItems,
141
+ verified_at: new Date().toISOString(),
142
+ start_id: provenanceId,
143
+ chain_depth: chain.depth,
144
+ root_document_id: chain.root.root_document_id,
145
+ chain_length: allRecords.length,
146
+ };
147
+ }
148
+ /**
149
+ * Verify all provenance records in database
150
+ *
151
+ * @returns Database verification result with counts by type
152
+ */
153
+ async verifyDatabase() {
154
+ const startTime = Date.now();
155
+ const allProvenance = this.getAllProvenance();
156
+ // H-6: Cap failedItems to prevent unbounded memory growth
157
+ const MAX_FAILED_ITEMS = 1000;
158
+ const failedItems = [];
159
+ let failedOverflow = 0;
160
+ let hashesVerified = 0;
161
+ let hashesFailed = 0;
162
+ let documentsVerified = 0;
163
+ let ocrResultsVerified = 0;
164
+ let chunksVerified = 0;
165
+ let embeddingsVerified = 0;
166
+ let imagesVerified = 0;
167
+ let vlmDescriptionsVerified = 0;
168
+ for (const record of allProvenance) {
169
+ try {
170
+ const result = await this.verifyContentHash(record.id);
171
+ // Count by type
172
+ switch (record.type) {
173
+ case ProvenanceType.DOCUMENT:
174
+ documentsVerified++;
175
+ break;
176
+ case ProvenanceType.OCR_RESULT:
177
+ ocrResultsVerified++;
178
+ break;
179
+ case ProvenanceType.CHUNK:
180
+ chunksVerified++;
181
+ break;
182
+ case ProvenanceType.EMBEDDING:
183
+ embeddingsVerified++;
184
+ break;
185
+ case ProvenanceType.IMAGE:
186
+ imagesVerified++;
187
+ break;
188
+ case ProvenanceType.VLM_DESCRIPTION:
189
+ vlmDescriptionsVerified++;
190
+ break;
191
+ }
192
+ if (result.valid) {
193
+ hashesVerified++;
194
+ }
195
+ else {
196
+ hashesFailed++;
197
+ if (failedItems.length < MAX_FAILED_ITEMS) {
198
+ failedItems.push({
199
+ id: record.id,
200
+ expected_hash: result.expected_hash,
201
+ computed_hash: result.computed_hash,
202
+ type: record.type,
203
+ });
204
+ }
205
+ else {
206
+ failedOverflow++;
207
+ }
208
+ }
209
+ }
210
+ catch (error) {
211
+ hashesFailed++;
212
+ if (failedItems.length < MAX_FAILED_ITEMS) {
213
+ failedItems.push({
214
+ id: record.id,
215
+ expected_hash: record.content_hash,
216
+ computed_hash: 'ERROR: ' + (error instanceof Error ? error.message : 'Unknown error'),
217
+ type: record.type,
218
+ });
219
+ }
220
+ else {
221
+ failedOverflow++;
222
+ }
223
+ }
224
+ }
225
+ const durationMs = Date.now() - startTime;
226
+ // Chain integrity check: verify all parent_id references exist and depths are correct
227
+ let chainIntact = true;
228
+ const chainErrors = [];
229
+ const parentedRecords = this.rawDb
230
+ .prepare(`SELECT id, parent_id, type, chain_depth FROM provenance WHERE parent_id IS NOT NULL`)
231
+ .all();
232
+ for (const record of parentedRecords) {
233
+ const parent = this.rawDb
234
+ .prepare('SELECT id, chain_depth FROM provenance WHERE id = ?')
235
+ .get(record.parent_id);
236
+ if (!parent) {
237
+ chainIntact = false;
238
+ if (chainErrors.length < 10) {
239
+ chainErrors.push(`${record.id} (${record.type}): parent ${record.parent_id} not found`);
240
+ }
241
+ }
242
+ else if (parent.chain_depth !== record.chain_depth - 1) {
243
+ chainIntact = false;
244
+ if (chainErrors.length < 10) {
245
+ chainErrors.push(`${record.id} (${record.type}): depth ${record.chain_depth} but parent depth ${parent.chain_depth} (expected ${record.chain_depth - 1})`);
246
+ }
247
+ }
248
+ }
249
+ return {
250
+ valid: hashesFailed === 0 && chainIntact,
251
+ chain_intact: chainIntact,
252
+ chain_errors: chainErrors.length > 0 ? chainErrors : undefined,
253
+ hashes_verified: hashesVerified,
254
+ hashes_failed: hashesFailed,
255
+ failed_items: failedItems,
256
+ verified_at: new Date().toISOString(),
257
+ database_name: this.getDatabaseName(),
258
+ documents_verified: documentsVerified,
259
+ ocr_results_verified: ocrResultsVerified,
260
+ chunks_verified: chunksVerified,
261
+ embeddings_verified: embeddingsVerified,
262
+ images_verified: imagesVerified,
263
+ vlm_descriptions_verified: vlmDescriptionsVerified,
264
+ duration_ms: durationMs,
265
+ failed_overflow: failedOverflow,
266
+ };
267
+ }
268
+ /**
269
+ * Verify source file still matches stored hash
270
+ *
271
+ * @param documentId - Document ID to verify
272
+ * @returns Verification result for the file
273
+ * @throws VerifierError if document not found or file not accessible
274
+ */
275
+ async verifyFileIntegrity(documentId) {
276
+ // Get document
277
+ const doc = this.db.getDocument(documentId);
278
+ if (!doc) {
279
+ throw new VerifierError(`Document not found: ${documentId}`, VerifierErrorCode.NOT_FOUND, {
280
+ documentId,
281
+ });
282
+ }
283
+ // Check file exists
284
+ if (!fs.existsSync(doc.file_path)) {
285
+ throw new VerifierError(`Source file not found: ${doc.file_path}`, VerifierErrorCode.FILE_NOT_FOUND, { documentId, filePath: doc.file_path });
286
+ }
287
+ // Hash the file
288
+ const computedHash = await hashFile(doc.file_path);
289
+ const expectedHash = doc.file_hash;
290
+ const formatValid = isValidHashFormat(expectedHash);
291
+ const valid = formatValid && computedHash === expectedHash;
292
+ return {
293
+ valid,
294
+ item_id: documentId,
295
+ item_type: ProvenanceType.DOCUMENT,
296
+ expected_hash: expectedHash,
297
+ computed_hash: computedHash,
298
+ format_valid: formatValid,
299
+ verified_at: new Date().toISOString(),
300
+ };
301
+ }
302
+ // ════════════════════════════════════════════════════════════════
303
+ // PRIVATE HELPER METHODS
304
+ // ════════════════════════════════════════════════════════════════
305
+ /**
306
+ * Get content and expected hash for a provenance record
307
+ * Returns { content, expectedHash, isFile } or throws if content not found
308
+ *
309
+ * CRITICAL MAPPING:
310
+ * - DOCUMENT: file_path → file_hash (via hashFile)
311
+ * - OCR_RESULT: extracted_text → content_hash
312
+ * - CHUNK: text → text_hash
313
+ * - EMBEDDING: original_text → content_hash
314
+ */
315
+ getContentForVerification(record) {
316
+ switch (record.type) {
317
+ case ProvenanceType.DOCUMENT: {
318
+ // For DOCUMENT, we verify the file on disk using file_hash
319
+ // Query document by provenance_id since record.id IS the document's provenance_id
320
+ const doc = this.getDocumentByProvenanceId(record.id);
321
+ if (!doc) {
322
+ throw new VerifierError(`Document not found for provenance ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, type: record.type });
323
+ }
324
+ // Check file exists
325
+ if (!fs.existsSync(doc.file_path)) {
326
+ throw new VerifierError(`Source file not found: ${doc.file_path}`, VerifierErrorCode.FILE_NOT_FOUND, { provenanceId: record.id, filePath: doc.file_path });
327
+ }
328
+ // Return file path - caller will hash the file
329
+ return { content: doc.file_path, expectedHash: doc.file_hash, isFile: true };
330
+ }
331
+ case ProvenanceType.OCR_RESULT: {
332
+ const ocr = this.getOCRResultByProvenanceId(record.id);
333
+ if (!ocr) {
334
+ throw new VerifierError(`OCR result not found for provenance ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, type: record.type });
335
+ }
336
+ return { content: ocr.extracted_text, expectedHash: ocr.content_hash, isFile: false };
337
+ }
338
+ case ProvenanceType.CHUNK: {
339
+ const chunk = this.getChunkByProvenanceId(record.id);
340
+ if (!chunk) {
341
+ throw new VerifierError(`Chunk not found for provenance ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, type: record.type });
342
+ }
343
+ // CRITICAL: CHUNK uses text_hash, not content_hash
344
+ return { content: chunk.text, expectedHash: chunk.text_hash, isFile: false };
345
+ }
346
+ case ProvenanceType.EMBEDDING: {
347
+ const emb = this.getEmbeddingByProvenanceId(record.id);
348
+ if (!emb) {
349
+ throw new VerifierError(`Embedding not found for provenance ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, type: record.type });
350
+ }
351
+ return { content: emb.original_text, expectedHash: emb.content_hash, isFile: false };
352
+ }
353
+ case ProvenanceType.IMAGE: {
354
+ // IMAGE verification: hash the extracted image file
355
+ const image = this.getImageByProvenanceId(record.id);
356
+ if (!image) {
357
+ throw new VerifierError(`Image not found for provenance ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, type: record.type });
358
+ }
359
+ // Check extracted file exists
360
+ if (!image.extracted_path || !fs.existsSync(image.extracted_path)) {
361
+ throw new VerifierError(`Extracted image file not found: ${image.extracted_path}`, VerifierErrorCode.FILE_NOT_FOUND, { provenanceId: record.id, imagePath: image.extracted_path });
362
+ }
363
+ // Return file path - caller will hash the file
364
+ return { content: image.extracted_path, expectedHash: record.content_hash, isFile: true };
365
+ }
366
+ case ProvenanceType.VLM_DESCRIPTION: {
367
+ // VLM_DESCRIPTION verification: hash the VLM description text
368
+ // The description is stored in images.vlm_description, but we need to find it
369
+ // via the provenance chain - the parent should be an IMAGE
370
+ // Get the parent IMAGE to find the VLM description
371
+ if (!record.parent_id) {
372
+ throw new VerifierError(`VLM_DESCRIPTION has no parent_id: ${record.id}`, VerifierErrorCode.CHAIN_BROKEN, { provenanceId: record.id });
373
+ }
374
+ const image = this.getImageByProvenanceId(record.parent_id);
375
+ if (!image) {
376
+ throw new VerifierError(`Parent image not found for VLM_DESCRIPTION ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, parentId: record.parent_id });
377
+ }
378
+ if (!image.vlm_description) {
379
+ throw new VerifierError(`VLM description is empty for image ${image.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, imageId: image.id });
380
+ }
381
+ return { content: image.vlm_description, expectedHash: record.content_hash, isFile: false };
382
+ }
383
+ case ProvenanceType.COMPARISON: {
384
+ const comparison = this.rawDb
385
+ .prepare('SELECT text_diff_json, structural_diff_json FROM comparisons WHERE provenance_id = ?')
386
+ .get(record.id);
387
+ if (!comparison) {
388
+ throw new VerifierError(`Comparison not found for provenance ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id });
389
+ }
390
+ const parseDiffField = (json, field) => {
391
+ try {
392
+ return JSON.parse(json);
393
+ }
394
+ catch (error) {
395
+ console.error(`[ProvenanceVerifier] Failed to parse ${field} JSON for provenance ${record.id}:`, error instanceof Error ? error.message : String(error));
396
+ throw new VerifierError(`Corrupt ${field} in comparison for provenance ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, field });
397
+ }
398
+ };
399
+ const diffContent = JSON.stringify({
400
+ text_diff: parseDiffField(comparison.text_diff_json, 'text_diff_json'),
401
+ structural_diff: parseDiffField(comparison.structural_diff_json, 'structural_diff_json'),
402
+ });
403
+ return { content: diffContent, expectedHash: record.content_hash, isFile: false };
404
+ }
405
+ case ProvenanceType.EXTRACTION: {
406
+ // EXTRACTION: content_hash = computeHash(JSON.stringify(extractionJson))
407
+ // Re-derive: Load extraction record and hash its extraction_json field
408
+ const extraction = this.rawDb
409
+ .prepare('SELECT extraction_json FROM extractions WHERE provenance_id = ?')
410
+ .get(record.id);
411
+ if (!extraction) {
412
+ throw new VerifierError(`Extraction not found for provenance ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, type: record.type });
413
+ }
414
+ // The hash was computed over JSON.stringify(response.extractionJson) which was
415
+ // stored as extraction_json. Re-hash the stored string directly.
416
+ return {
417
+ content: extraction.extraction_json,
418
+ expectedHash: record.content_hash,
419
+ isFile: false,
420
+ };
421
+ }
422
+ case ProvenanceType.FORM_FILL: {
423
+ // FORM_FILL: content_hash = computeHash(JSON.stringify({ fields_filled, fields_not_found }))
424
+ // Re-derive: Load from form_fills table, reconstruct the same object
425
+ const formFill = this.rawDb
426
+ .prepare('SELECT fields_filled, fields_not_found FROM form_fills WHERE provenance_id = ?')
427
+ .get(record.id);
428
+ if (!formFill) {
429
+ throw new VerifierError(`Form fill not found for provenance ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, type: record.type });
430
+ }
431
+ // Reconstruct the exact object that was hashed: { fields_filled, fields_not_found }
432
+ // The original code hashes: computeHash(JSON.stringify({ fields_filled: result.fieldsFilled, fields_not_found: result.fieldsNotFound }))
433
+ // form_fills stores these as JSON strings, so parse them back to arrays
434
+ const formFillContent = JSON.stringify({
435
+ fields_filled: JSON.parse(formFill.fields_filled),
436
+ fields_not_found: JSON.parse(formFill.fields_not_found),
437
+ });
438
+ return { content: formFillContent, expectedHash: record.content_hash, isFile: false };
439
+ }
440
+ case ProvenanceType.CLUSTERING: {
441
+ // CLUSTERING: content_hash = computeHash(JSON.stringify(centroid) + ':' + runId)
442
+ // Re-derive: Load cluster record and reconstruct the same input
443
+ const cluster = this.rawDb
444
+ .prepare('SELECT centroid_json, run_id FROM clusters WHERE provenance_id = ?')
445
+ .get(record.id);
446
+ if (!cluster) {
447
+ throw new VerifierError(`Cluster not found for provenance ${record.id}`, VerifierErrorCode.CONTENT_NOT_FOUND, { provenanceId: record.id, type: record.type });
448
+ }
449
+ // The original hash: computeHash(JSON.stringify(centroid) + ':' + runId)
450
+ // centroid_json is already JSON.stringify(centroid), so use it directly
451
+ const clusterContent = cluster.centroid_json + ':' + cluster.run_id;
452
+ return { content: clusterContent, expectedHash: record.content_hash, isFile: false };
453
+ }
454
+ default: {
455
+ const unknownType = record.type;
456
+ throw new VerifierError(`Unknown provenance type: ${unknownType}`, VerifierErrorCode.INVALID_TYPE, { type: unknownType });
457
+ }
458
+ }
459
+ }
460
+ // ════════════════════════════════════════════════════════════════
461
+ // RAW SQL HELPERS (methods not in DatabaseService)
462
+ // ════════════════════════════════════════════════════════════════
463
+ /**
464
+ * Get document by its provenance_id
465
+ */
466
+ getDocumentByProvenanceId(provenanceId) {
467
+ const row = this.rawDb
468
+ .prepare('SELECT * FROM documents WHERE provenance_id = ?')
469
+ .get(provenanceId);
470
+ return row ? rowToDocument(row) : null;
471
+ }
472
+ /**
473
+ * Get OCR result by its provenance_id
474
+ */
475
+ getOCRResultByProvenanceId(provenanceId) {
476
+ const row = this.rawDb
477
+ .prepare('SELECT * FROM ocr_results WHERE provenance_id = ?')
478
+ .get(provenanceId);
479
+ return row ? rowToOCRResult(row) : null;
480
+ }
481
+ /**
482
+ * Get chunk by its provenance_id
483
+ */
484
+ getChunkByProvenanceId(provenanceId) {
485
+ const row = this.rawDb
486
+ .prepare('SELECT * FROM chunks WHERE provenance_id = ?')
487
+ .get(provenanceId);
488
+ return row ? rowToChunk(row) : null;
489
+ }
490
+ /**
491
+ * Get embedding by its provenance_id (without vector)
492
+ */
493
+ getEmbeddingByProvenanceId(provenanceId) {
494
+ const row = this.rawDb
495
+ .prepare('SELECT * FROM embeddings WHERE provenance_id = ?')
496
+ .get(provenanceId);
497
+ return row ? rowToEmbedding(row) : null;
498
+ }
499
+ /**
500
+ * Get image by its provenance_id
501
+ */
502
+ getImageByProvenanceId(provenanceId) {
503
+ const row = this.rawDb
504
+ .prepare('SELECT * FROM images WHERE provenance_id = ?')
505
+ .get(provenanceId);
506
+ return row ? rowToImage(row) : null;
507
+ }
508
+ /**
509
+ * Get all provenance records ordered by chain_depth
510
+ */
511
+ getAllProvenance() {
512
+ // H-6: Use iterate() to avoid double-allocation (.all() + .map())
513
+ const records = [];
514
+ const stmt = this.rawDb.prepare('SELECT * FROM provenance ORDER BY chain_depth ASC');
515
+ for (const row of stmt.iterate()) {
516
+ records.push(rowToProvenance(row));
517
+ }
518
+ return records;
519
+ }
520
+ /**
521
+ * Get database name from metadata
522
+ */
523
+ getDatabaseName() {
524
+ try {
525
+ const row = this.rawDb
526
+ .prepare('SELECT database_name FROM database_metadata LIMIT 1')
527
+ .get();
528
+ return row?.database_name ?? 'unknown';
529
+ }
530
+ catch (error) {
531
+ console.error(`[Verifier] Failed to get database name from metadata: ${String(error)}`);
532
+ return 'unknown';
533
+ }
534
+ }
535
+ }
536
+ //# sourceMappingURL=verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../../src/services/provenance/verifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Python Worker Process Pool
3
+ *
4
+ * Maintains warm Python processes to amortize import costs (torch, transformers).
5
+ * Workers accept JSON commands on stdin, return JSON on stdout.
6
+ * Auto-restart on crash, health checks via heartbeat.
7
+ *
8
+ * CRITICAL: NEVER use console.log() - stdout is JSON-RPC protocol.
9
+ *
10
+ * @module services/python-pool
11
+ */
12
+ import { EventEmitter } from 'events';
13
+ export interface PoolConfig {
14
+ /** Number of worker processes to maintain (default: 3) */
15
+ poolSize: number;
16
+ /** Restart worker after this many tasks (default: 100) */
17
+ maxTasksPerWorker: number;
18
+ /** Health check interval in ms (default: 30000) */
19
+ healthCheckIntervalMs: number;
20
+ /** Task timeout in ms (default: 120000) */
21
+ taskTimeoutMs: number;
22
+ }
23
+ export interface PoolStatus {
24
+ total: number;
25
+ busy: number;
26
+ idle: number;
27
+ queued: number;
28
+ }
29
+ export declare class PythonPool extends EventEmitter {
30
+ private workers;
31
+ private taskQueue;
32
+ private readonly config;
33
+ private healthCheckTimer;
34
+ private nextWorkerId;
35
+ private shuttingDown;
36
+ private readonly pythonCommand;
37
+ constructor(config?: Partial<PoolConfig>);
38
+ /**
39
+ * Start the pool with the given Python script.
40
+ *
41
+ * @param scriptPath - Path to the Python worker script
42
+ * @throws Error if pool is shutting down
43
+ */
44
+ start(scriptPath: string): void;
45
+ /**
46
+ * Execute a command on the next available worker.
47
+ *
48
+ * If all workers are busy, the task is queued and dispatched when
49
+ * a worker becomes available.
50
+ *
51
+ * @param command - JSON-serializable command object
52
+ * @returns Promise resolving with the worker's JSON response
53
+ * @throws Error if pool is shutting down or task times out
54
+ */
55
+ execute(command: Record<string, unknown>): Promise<unknown>;
56
+ /**
57
+ * Shut down all workers and reject queued tasks.
58
+ */
59
+ shutdown(): Promise<void>;
60
+ /**
61
+ * Get pool status for diagnostics.
62
+ */
63
+ getStatus(): PoolStatus;
64
+ private spawnWorker;
65
+ private getAvailableWorker;
66
+ private dispatchTask;
67
+ private processQueue;
68
+ private healthCheck;
69
+ }
70
+ //# sourceMappingURL=python-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python-pool.d.ts","sourceRoot":"","sources":["../../src/services/python-pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAMtC,MAAM,WAAW,UAAU;IACzB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mDAAmD;IACnD,qBAAqB,EAAE,MAAM,CAAC;IAC9B,2CAA2C;IAC3C,aAAa,EAAE,MAAM,CAAC;CACvB;AAiBD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;gBAE3B,MAAM,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC;IAWxC;;;;;OAKG;IACH,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAe/B;;;;;;;;;OASG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAwBjE;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAmC/B;;OAEG;IACH,SAAS,IAAI,UAAU;IAmBvB,OAAO,CAAC,WAAW;IA2CnB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,YAAY;IA+EpB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,WAAW;CAcpB"}