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,495 @@
1
+ /**
2
+ * Workflow and Approval Chain Tools
3
+ *
4
+ * Provides 8 MCP tools for document workflow state management and
5
+ * multi-step approval chains:
6
+ * - ocr_workflow_submit/review/assign/status/queue (5 workflow tools)
7
+ * - ocr_approval_chain_create/apply (2 approval chain tools)
8
+ * - ocr_approval_step_decide (1 approval step tool)
9
+ *
10
+ * CRITICAL: NEVER use console.log() - stdout is reserved for JSON-RPC protocol.
11
+ *
12
+ * @module tools/workflow
13
+ */
14
+ import { z } from 'zod';
15
+ import { formatResponse, handleError } from './shared.js';
16
+ import { successResult } from '../server/types.js';
17
+ import { requireDatabase } from '../server/state.js';
18
+ import { validateInput } from '../utils/validation.js';
19
+ import { getLatestWorkflowState, createWorkflowState, listWorkflowQueue, getWorkflowHistory, } from '../services/storage/database/workflow-operations.js';
20
+ import { createApprovalChain, applyApprovalChain, getCurrentApprovalStep, decideApprovalStep, getApprovalProgress, } from '../services/storage/database/approval-operations.js';
21
+ // =============================================================================
22
+ // SCHEMAS
23
+ // =============================================================================
24
+ const WorkflowDecisionSchema = z.enum(['approved', 'rejected', 'changes_requested']);
25
+ const ApprovalDecisionSchema = z.enum(['approved', 'rejected']);
26
+ // =============================================================================
27
+ // TOOL 3.1: ocr_workflow_submit
28
+ // =============================================================================
29
+ async function handleWorkflowSubmit(params) {
30
+ try {
31
+ const input = validateInput(z.object({
32
+ document_id: z.string().min(1),
33
+ assigned_to: z.string().min(1).optional(),
34
+ due_date: z.string().min(1).optional(),
35
+ metadata: z.record(z.unknown()).optional(),
36
+ }), params);
37
+ const { db } = requireDatabase();
38
+ const conn = db.getConnection();
39
+ // Check current state - create draft first if no workflow history exists
40
+ const current = getLatestWorkflowState(conn, input.document_id);
41
+ if (!current) {
42
+ // No workflow history - create draft first, then submit
43
+ createWorkflowState(conn, {
44
+ document_id: input.document_id,
45
+ state: 'draft',
46
+ });
47
+ }
48
+ // Now transition to submitted
49
+ const submitted = createWorkflowState(conn, {
50
+ document_id: input.document_id,
51
+ state: 'submitted',
52
+ assigned_to: input.assigned_to,
53
+ due_date: input.due_date,
54
+ metadata: input.metadata,
55
+ });
56
+ return formatResponse(successResult({
57
+ workflow_state: submitted,
58
+ next_steps: [
59
+ { tool: 'ocr_workflow_status', description: 'Check workflow status for this document' },
60
+ { tool: 'ocr_workflow_assign', description: 'Assign a reviewer to this document' },
61
+ { tool: 'ocr_workflow_queue', description: 'View all pending review documents' },
62
+ ],
63
+ }));
64
+ }
65
+ catch (error) {
66
+ return handleError(error);
67
+ }
68
+ }
69
+ // =============================================================================
70
+ // TOOL 3.2: ocr_workflow_review
71
+ // =============================================================================
72
+ async function handleWorkflowReview(params) {
73
+ try {
74
+ const input = validateInput(z.object({
75
+ document_id: z.string().min(1),
76
+ decision: WorkflowDecisionSchema,
77
+ reason: z.string().max(2000).optional(),
78
+ }), params);
79
+ // Reason required for reject/changes_requested
80
+ if ((input.decision === 'rejected' || input.decision === 'changes_requested') && !input.reason) {
81
+ throw new Error(`Reason is required when decision is "${input.decision}"`);
82
+ }
83
+ const { db } = requireDatabase();
84
+ const conn = db.getConnection();
85
+ // Verify current state is in_review
86
+ const current = getLatestWorkflowState(conn, input.document_id);
87
+ if (!current) {
88
+ throw new Error(`No workflow history found for document ${input.document_id}`);
89
+ }
90
+ if (current.state !== 'in_review') {
91
+ throw new Error(`Cannot review document ${input.document_id}: current state is "${current.state}", ` +
92
+ `must be "in_review". Use ocr_workflow_status to check the current state.`);
93
+ }
94
+ const reviewed = createWorkflowState(conn, {
95
+ document_id: input.document_id,
96
+ state: input.decision,
97
+ reason: input.reason,
98
+ assigned_to: current.assigned_to,
99
+ });
100
+ const nextSteps = [];
101
+ if (input.decision === 'approved') {
102
+ nextSteps.push({ tool: 'ocr_workflow_status', description: 'View updated workflow status' }, { tool: 'ocr_approval_chain_apply', description: 'Apply an approval chain for formal sign-off' });
103
+ }
104
+ else if (input.decision === 'changes_requested') {
105
+ nextSteps.push({ tool: 'ocr_workflow_status', description: 'View updated workflow status' }, { tool: 'ocr_annotation_create', description: 'Add annotations detailing requested changes' });
106
+ }
107
+ else {
108
+ nextSteps.push({ tool: 'ocr_workflow_status', description: 'View updated workflow status' });
109
+ }
110
+ return formatResponse(successResult({
111
+ workflow_state: reviewed,
112
+ decision: input.decision,
113
+ next_steps: nextSteps,
114
+ }));
115
+ }
116
+ catch (error) {
117
+ return handleError(error);
118
+ }
119
+ }
120
+ // =============================================================================
121
+ // TOOL 3.3: ocr_workflow_assign
122
+ // =============================================================================
123
+ async function handleWorkflowAssign(params) {
124
+ try {
125
+ const input = validateInput(z.object({
126
+ document_id: z.string().min(1),
127
+ user_id: z.string().min(1),
128
+ assigned_by: z.string().min(1).optional(),
129
+ }), params);
130
+ const { db } = requireDatabase();
131
+ const conn = db.getConnection();
132
+ // Get current workflow state
133
+ const current = getLatestWorkflowState(conn, input.document_id);
134
+ if (!current) {
135
+ throw new Error(`No workflow history found for document ${input.document_id}`);
136
+ }
137
+ // Only allow assignment when in submitted or in_review state
138
+ if (current.state !== 'submitted' && current.state !== 'in_review') {
139
+ throw new Error(`Cannot assign reviewer: document ${input.document_id} is in state "${current.state}". ` +
140
+ `Document must be in "submitted" or "in_review" state.`);
141
+ }
142
+ // If submitted, transition to in_review with the assigned reviewer
143
+ if (current.state === 'submitted') {
144
+ const inReview = createWorkflowState(conn, {
145
+ document_id: input.document_id,
146
+ state: 'in_review',
147
+ assigned_to: input.user_id,
148
+ assigned_by: input.assigned_by,
149
+ due_date: current.due_date,
150
+ });
151
+ return formatResponse(successResult({
152
+ workflow_state: inReview,
153
+ assigned_to: input.user_id,
154
+ transitioned_to: 'in_review',
155
+ next_steps: [
156
+ { tool: 'ocr_workflow_review', description: 'Review this document (approve/reject/request changes)' },
157
+ { tool: 'ocr_workflow_status', description: 'Check workflow status' },
158
+ ],
159
+ }));
160
+ }
161
+ // Already in_review - update assignment via metadata
162
+ // We create a new in_review state with the updated assignment
163
+ // (This is valid because in_review -> in_review is not in transitions,
164
+ // so we update the current row directly instead)
165
+ conn.prepare(`
166
+ UPDATE workflow_states SET assigned_to = ?, assigned_by = ?
167
+ WHERE id = ?
168
+ `).run(input.user_id, input.assigned_by ?? null, current.id);
169
+ const updated = conn.prepare('SELECT * FROM workflow_states WHERE id = ?').get(current.id);
170
+ return formatResponse(successResult({
171
+ workflow_state: updated,
172
+ assigned_to: input.user_id,
173
+ reassigned: true,
174
+ next_steps: [
175
+ { tool: 'ocr_workflow_review', description: 'Review this document' },
176
+ { tool: 'ocr_workflow_status', description: 'Check workflow status' },
177
+ ],
178
+ }));
179
+ }
180
+ catch (error) {
181
+ return handleError(error);
182
+ }
183
+ }
184
+ // =============================================================================
185
+ // TOOL 3.4: ocr_workflow_status
186
+ // =============================================================================
187
+ async function handleWorkflowStatus(params) {
188
+ try {
189
+ const input = validateInput(z.object({
190
+ document_id: z.string().min(1),
191
+ }), params);
192
+ const { db } = requireDatabase();
193
+ const conn = db.getConnection();
194
+ const current = getLatestWorkflowState(conn, input.document_id);
195
+ const history = getWorkflowHistory(conn, input.document_id);
196
+ if (!current) {
197
+ return formatResponse(successResult({
198
+ document_id: input.document_id,
199
+ current_state: null,
200
+ history: [],
201
+ message: 'No workflow history for this document',
202
+ next_steps: [
203
+ { tool: 'ocr_workflow_submit', description: 'Submit this document for review' },
204
+ ],
205
+ }));
206
+ }
207
+ // Check for approval chains applied to this document
208
+ const approvalSteps = conn.prepare('SELECT DISTINCT chain_id FROM approval_steps WHERE document_id = ?').all(input.document_id);
209
+ const nextSteps = [];
210
+ switch (current.state) {
211
+ case 'draft':
212
+ nextSteps.push({ tool: 'ocr_workflow_submit', description: 'Submit for review' });
213
+ break;
214
+ case 'submitted':
215
+ nextSteps.push({ tool: 'ocr_workflow_assign', description: 'Assign a reviewer' }, { tool: 'ocr_workflow_queue', description: 'View review queue' });
216
+ break;
217
+ case 'in_review':
218
+ nextSteps.push({ tool: 'ocr_workflow_review', description: 'Make a review decision' });
219
+ break;
220
+ case 'changes_requested':
221
+ nextSteps.push({ tool: 'ocr_workflow_submit', description: 'Re-submit after changes' });
222
+ break;
223
+ case 'approved':
224
+ nextSteps.push({ tool: 'ocr_approval_chain_apply', description: 'Apply an approval chain' }, { tool: 'ocr_workflow_queue', description: 'View review queue' });
225
+ break;
226
+ default:
227
+ nextSteps.push({ tool: 'ocr_workflow_queue', description: 'View review queue' });
228
+ }
229
+ return formatResponse(successResult({
230
+ document_id: input.document_id,
231
+ current_state: current,
232
+ history,
233
+ approval_chains_applied: approvalSteps.map((s) => s.chain_id),
234
+ next_steps: nextSteps,
235
+ }));
236
+ }
237
+ catch (error) {
238
+ return handleError(error);
239
+ }
240
+ }
241
+ // =============================================================================
242
+ // TOOL 3.5: ocr_workflow_queue
243
+ // =============================================================================
244
+ async function handleWorkflowQueue(params) {
245
+ try {
246
+ const input = validateInput(z.object({
247
+ assigned_to: z.string().min(1).optional(),
248
+ state: z.string().min(1).optional(),
249
+ due_before: z.string().min(1).optional(),
250
+ limit: z.number().int().min(1).max(200).default(50),
251
+ offset: z.number().int().min(0).default(0),
252
+ }), params);
253
+ const { db } = requireDatabase();
254
+ const conn = db.getConnection();
255
+ const limit = input.limit ?? 50;
256
+ const offset = input.offset ?? 0;
257
+ const result = listWorkflowQueue(conn, {
258
+ assigned_to: input.assigned_to,
259
+ state: input.state,
260
+ due_before: input.due_before,
261
+ limit,
262
+ offset,
263
+ });
264
+ const hasMore = offset + result.items.length < result.total;
265
+ return formatResponse(successResult({
266
+ items: result.items,
267
+ total: result.total,
268
+ limit,
269
+ offset,
270
+ has_more: hasMore,
271
+ next_steps: hasMore
272
+ ? [{ tool: 'ocr_workflow_queue', description: `Get next page with offset=${offset + limit}` }]
273
+ : [
274
+ { tool: 'ocr_workflow_status', description: 'Get details for a specific document' },
275
+ { tool: 'ocr_workflow_review', description: 'Review a document from the queue' },
276
+ { tool: 'ocr_workflow_assign', description: 'Assign a reviewer to a document' },
277
+ ],
278
+ }));
279
+ }
280
+ catch (error) {
281
+ return handleError(error);
282
+ }
283
+ }
284
+ // =============================================================================
285
+ // TOOL 3.6: ocr_approval_chain_create
286
+ // =============================================================================
287
+ async function handleApprovalChainCreate(params) {
288
+ try {
289
+ const input = validateInput(z.object({
290
+ name: z.string().min(1).max(200),
291
+ description: z.string().max(1000).optional(),
292
+ steps: z.array(z.object({
293
+ role: z.string().min(1),
294
+ required_approvals: z.number().int().min(1).optional(),
295
+ auto_advance: z.boolean().optional(),
296
+ })).min(1),
297
+ created_by: z.string().min(1).optional(),
298
+ }), params);
299
+ const { db } = requireDatabase();
300
+ const conn = db.getConnection();
301
+ const chain = createApprovalChain(conn, {
302
+ name: input.name,
303
+ description: input.description,
304
+ steps: input.steps,
305
+ created_by: input.created_by,
306
+ });
307
+ return formatResponse(successResult({
308
+ chain,
309
+ steps_count: input.steps.length,
310
+ next_steps: [
311
+ { tool: 'ocr_approval_chain_apply', description: 'Apply this chain to a document' },
312
+ { tool: 'ocr_approval_chain_create', description: 'Create another approval chain' },
313
+ ],
314
+ }));
315
+ }
316
+ catch (error) {
317
+ return handleError(error);
318
+ }
319
+ }
320
+ // =============================================================================
321
+ // TOOL 3.7: ocr_approval_chain_apply
322
+ // =============================================================================
323
+ async function handleApprovalChainApply(params) {
324
+ try {
325
+ const input = validateInput(z.object({
326
+ document_id: z.string().min(1),
327
+ chain_id: z.string().min(1),
328
+ }), params);
329
+ const { db } = requireDatabase();
330
+ const conn = db.getConnection();
331
+ const steps = applyApprovalChain(conn, input.document_id, input.chain_id);
332
+ const currentStep = steps.length > 0 ? steps[0] : null;
333
+ return formatResponse(successResult({
334
+ document_id: input.document_id,
335
+ chain_id: input.chain_id,
336
+ steps_created: steps.length,
337
+ steps,
338
+ current_step: currentStep,
339
+ next_steps: [
340
+ { tool: 'ocr_approval_step_decide', description: 'Decide on the current approval step' },
341
+ { tool: 'ocr_workflow_status', description: 'View full workflow status including approvals' },
342
+ ],
343
+ }));
344
+ }
345
+ catch (error) {
346
+ return handleError(error);
347
+ }
348
+ }
349
+ // =============================================================================
350
+ // TOOL 3.8: ocr_approval_step_decide
351
+ // =============================================================================
352
+ async function handleApprovalStepDecide(params) {
353
+ try {
354
+ const input = validateInput(z.object({
355
+ document_id: z.string().min(1),
356
+ chain_id: z.string().min(1),
357
+ decision: ApprovalDecisionSchema,
358
+ user_id: z.string().min(1),
359
+ reason: z.string().max(2000).optional(),
360
+ }), params);
361
+ if (input.decision === 'rejected' && !input.reason) {
362
+ throw new Error('Reason is required when rejecting an approval step');
363
+ }
364
+ const { db } = requireDatabase();
365
+ const conn = db.getConnection();
366
+ // Get the current step for this document+chain
367
+ const currentStep = getCurrentApprovalStep(conn, input.document_id, input.chain_id);
368
+ if (!currentStep) {
369
+ // Check if chain is applied
370
+ const anySteps = conn.prepare('SELECT id FROM approval_steps WHERE document_id = ? AND chain_id = ? LIMIT 1').get(input.document_id, input.chain_id);
371
+ if (!anySteps) {
372
+ throw new Error(`No approval chain applied. Use ocr_approval_chain_apply first to apply chain ${input.chain_id} to document ${input.document_id}`);
373
+ }
374
+ throw new Error(`All approval steps for this chain have already been decided. No pending steps remain.`);
375
+ }
376
+ const decided = decideApprovalStep(conn, currentStep.id, input.decision, input.user_id, input.reason);
377
+ // Get updated progress
378
+ const progress = getApprovalProgress(conn, input.document_id, input.chain_id);
379
+ const nextSteps = [];
380
+ if (progress.current_step) {
381
+ nextSteps.push({
382
+ tool: 'ocr_approval_step_decide',
383
+ description: `Decide on next step (${progress.current_step.required_role}, order ${progress.current_step.step_order})`,
384
+ });
385
+ }
386
+ if (progress.is_complete && !progress.is_rejected) {
387
+ nextSteps.push({ tool: 'ocr_workflow_status', description: 'View final workflow status' });
388
+ }
389
+ if (progress.is_rejected) {
390
+ nextSteps.push({ tool: 'ocr_workflow_status', description: 'View workflow status after rejection' });
391
+ }
392
+ if (nextSteps.length === 0) {
393
+ nextSteps.push({ tool: 'ocr_workflow_status', description: 'View workflow status' });
394
+ }
395
+ return formatResponse(successResult({
396
+ step: decided,
397
+ progress: {
398
+ total_steps: progress.total_steps,
399
+ completed_steps: progress.completed_steps,
400
+ is_complete: progress.is_complete,
401
+ is_rejected: progress.is_rejected,
402
+ current_step: progress.current_step,
403
+ },
404
+ next_steps: nextSteps,
405
+ }));
406
+ }
407
+ catch (error) {
408
+ return handleError(error);
409
+ }
410
+ }
411
+ // =============================================================================
412
+ // TOOL DEFINITIONS EXPORT
413
+ // =============================================================================
414
+ export const workflowTools = {
415
+ ocr_workflow_submit: {
416
+ description: '[MANAGE] Submit a document for review. Creates a draft state first if no workflow history exists, then transitions to submitted. Optionally assign a reviewer and set a due date.',
417
+ inputSchema: {
418
+ document_id: z.string().min(1).describe('Document ID to submit for review'),
419
+ assigned_to: z.string().min(1).optional().describe('User ID of the reviewer to assign'),
420
+ due_date: z.string().min(1).optional().describe('Due date for review (ISO 8601 datetime)'),
421
+ metadata: z.record(z.unknown()).optional().describe('Optional metadata object to attach to the workflow state'),
422
+ },
423
+ handler: handleWorkflowSubmit,
424
+ },
425
+ ocr_workflow_review: {
426
+ description: '[MANAGE] Review a document: approve, reject, or request changes. Document must be in "in_review" state. Reason is required for reject or changes_requested decisions.',
427
+ inputSchema: {
428
+ document_id: z.string().min(1).describe('Document ID to review'),
429
+ decision: WorkflowDecisionSchema.describe('Review decision: approved, rejected, or changes_requested'),
430
+ reason: z.string().max(2000).optional().describe('Reason for the decision (required for reject/changes_requested)'),
431
+ },
432
+ handler: handleWorkflowReview,
433
+ },
434
+ ocr_workflow_assign: {
435
+ description: '[MANAGE] Assign or reassign a reviewer to a document. If the document is in "submitted" state, it transitions to "in_review". If already "in_review", updates the assignment.',
436
+ inputSchema: {
437
+ document_id: z.string().min(1).describe('Document ID to assign reviewer to'),
438
+ user_id: z.string().min(1).describe('User ID of the reviewer to assign'),
439
+ assigned_by: z.string().min(1).optional().describe('User ID of the person making the assignment'),
440
+ },
441
+ handler: handleWorkflowAssign,
442
+ },
443
+ ocr_workflow_status: {
444
+ description: '[STATUS] Get the current workflow state and full history for a document. Shows current state, all transitions, and any applied approval chains.',
445
+ inputSchema: {
446
+ document_id: z.string().min(1).describe('Document ID to check workflow status for'),
447
+ },
448
+ handler: handleWorkflowStatus,
449
+ },
450
+ ocr_workflow_queue: {
451
+ description: '[STATUS] List documents in the workflow queue. Filter by assigned reviewer, state, or due date. Returns paginated results sorted by due date then creation time.',
452
+ inputSchema: {
453
+ assigned_to: z.string().min(1).optional().describe('Filter by assigned reviewer user ID'),
454
+ state: z.string().min(1).optional().describe('Filter by workflow state (e.g., "submitted", "in_review")'),
455
+ due_before: z.string().min(1).optional().describe('Filter documents due before this ISO 8601 datetime'),
456
+ limit: z.number().int().min(1).max(200).default(50).describe('Max results (1-200, default 50)'),
457
+ offset: z.number().int().min(0).default(0).describe('Pagination offset'),
458
+ },
459
+ handler: handleWorkflowQueue,
460
+ },
461
+ ocr_approval_chain_create: {
462
+ description: '[MANAGE] Create a reusable approval chain with ordered steps. Each step specifies a required role. Chains can be applied to multiple documents for formal multi-step approval.',
463
+ inputSchema: {
464
+ name: z.string().min(1).max(200).describe('Name for the approval chain'),
465
+ description: z.string().max(1000).optional().describe('Description of the approval chain'),
466
+ steps: z.array(z.object({
467
+ role: z.string().min(1).describe('Required role for this step (e.g., "reviewer", "legal", "manager")'),
468
+ required_approvals: z.number().int().min(1).optional().describe('Number of approvals needed (default 1)'),
469
+ auto_advance: z.boolean().optional().describe('Auto-advance to next step on approval (default true)'),
470
+ })).min(1).describe('Ordered list of approval steps'),
471
+ created_by: z.string().min(1).optional().describe('User ID of the chain creator'),
472
+ },
473
+ handler: handleApprovalChainCreate,
474
+ },
475
+ ocr_approval_chain_apply: {
476
+ description: '[MANAGE] Apply an existing approval chain to a document. Creates pending approval steps for each step in the chain. Steps must be decided in order.',
477
+ inputSchema: {
478
+ document_id: z.string().min(1).describe('Document ID to apply the approval chain to'),
479
+ chain_id: z.string().min(1).describe('Approval chain ID to apply'),
480
+ },
481
+ handler: handleApprovalChainApply,
482
+ },
483
+ ocr_approval_step_decide: {
484
+ description: '[MANAGE] Decide on the current approval step for a document. Approve to advance to the next step, or reject to stop the chain (remaining steps are skipped). Reason is required for rejection.',
485
+ inputSchema: {
486
+ document_id: z.string().min(1).describe('Document ID'),
487
+ chain_id: z.string().min(1).describe('Approval chain ID'),
488
+ decision: ApprovalDecisionSchema.describe('Decision: approved or rejected'),
489
+ user_id: z.string().min(1).describe('User ID making the decision'),
490
+ reason: z.string().max(2000).optional().describe('Reason for the decision (required for rejection)'),
491
+ },
492
+ handler: handleApprovalStepDecide,
493
+ },
494
+ };
495
+ //# sourceMappingURL=workflow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/tools/workflow.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Exponential Backoff with Jitter
3
+ *
4
+ * Replaces fixed waits for rate limits with exponential backoff.
5
+ * Base delay doubles each attempt: 1s, 2s, 4s, 8s, 16s (capped at 30s).
6
+ * Jitter adds +/-25% randomness to prevent thundering herd.
7
+ *
8
+ * CRITICAL: NEVER use console.log() - stdout is JSON-RPC protocol.
9
+ *
10
+ * @module utils/backoff
11
+ */
12
+ export interface BackoffConfig {
13
+ /** Base delay in milliseconds (default: 1000) */
14
+ baseDelayMs: number;
15
+ /** Maximum delay in milliseconds (default: 30000) */
16
+ maxDelayMs: number;
17
+ /** Maximum number of retry attempts (default: 3) */
18
+ maxAttempts: number;
19
+ /** Jitter fraction +/- (default: 0.25 = +/-25%) */
20
+ jitterFraction: number;
21
+ }
22
+ /**
23
+ * Calculate delay for a given attempt (0-indexed) with jitter.
24
+ *
25
+ * Formula: min(baseDelay * 2^attempt, maxDelay) +/- jitter
26
+ *
27
+ * @param attempt - Zero-indexed attempt number
28
+ * @param config - Optional partial backoff configuration
29
+ * @returns Delay in milliseconds (always >= 0)
30
+ */
31
+ export declare function calculateBackoffDelay(attempt: number, config?: Partial<BackoffConfig>): number;
32
+ /**
33
+ * Sleep for the backoff duration.
34
+ *
35
+ * @param attempt - Zero-indexed attempt number
36
+ * @param config - Optional partial backoff configuration
37
+ * @returns Promise that resolves after the delay
38
+ */
39
+ export declare function backoffSleep(attempt: number, config?: Partial<BackoffConfig>): Promise<void>;
40
+ /**
41
+ * Execute a function with automatic retry and exponential backoff.
42
+ *
43
+ * Retries on errors that pass the shouldRetry predicate, up to maxAttempts.
44
+ * Non-retryable errors are re-thrown immediately.
45
+ *
46
+ * @param fn - Async function to execute
47
+ * @param shouldRetry - Predicate to determine if an error is retryable
48
+ * @param config - Optional partial backoff configuration
49
+ * @returns The result of fn on success
50
+ * @throws The last error if all attempts fail
51
+ */
52
+ export declare function withRetry<T>(fn: () => Promise<T>, shouldRetry: (error: unknown) => boolean, config?: Partial<BackoffConfig>): Promise<T>;
53
+ //# sourceMappingURL=backoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backoff.d.ts","sourceRoot":"","sources":["../../src/utils/backoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,aAAa;IAC5B,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,cAAc,EAAE,MAAM,CAAC;CACxB;AASD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,MAAM,CAU9F;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5F;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,EACxC,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAC9B,OAAO,CAAC,CAAC,CAAC,CAiBZ"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Exponential Backoff with Jitter
3
+ *
4
+ * Replaces fixed waits for rate limits with exponential backoff.
5
+ * Base delay doubles each attempt: 1s, 2s, 4s, 8s, 16s (capped at 30s).
6
+ * Jitter adds +/-25% randomness to prevent thundering herd.
7
+ *
8
+ * CRITICAL: NEVER use console.log() - stdout is JSON-RPC protocol.
9
+ *
10
+ * @module utils/backoff
11
+ */
12
+ const DEFAULT_BACKOFF = {
13
+ baseDelayMs: 1000,
14
+ maxDelayMs: 30000,
15
+ maxAttempts: 3,
16
+ jitterFraction: 0.25,
17
+ };
18
+ /**
19
+ * Calculate delay for a given attempt (0-indexed) with jitter.
20
+ *
21
+ * Formula: min(baseDelay * 2^attempt, maxDelay) +/- jitter
22
+ *
23
+ * @param attempt - Zero-indexed attempt number
24
+ * @param config - Optional partial backoff configuration
25
+ * @returns Delay in milliseconds (always >= 0)
26
+ */
27
+ export function calculateBackoffDelay(attempt, config) {
28
+ const cfg = { ...DEFAULT_BACKOFF, ...config };
29
+ const exponentialDelay = cfg.baseDelayMs * Math.pow(2, attempt);
30
+ const cappedDelay = Math.min(exponentialDelay, cfg.maxDelayMs);
31
+ // Add jitter: +/-jitterFraction
32
+ const jitterRange = cappedDelay * cfg.jitterFraction;
33
+ const jitter = (Math.random() * 2 - 1) * jitterRange;
34
+ return Math.max(0, Math.round(cappedDelay + jitter));
35
+ }
36
+ /**
37
+ * Sleep for the backoff duration.
38
+ *
39
+ * @param attempt - Zero-indexed attempt number
40
+ * @param config - Optional partial backoff configuration
41
+ * @returns Promise that resolves after the delay
42
+ */
43
+ export function backoffSleep(attempt, config) {
44
+ const delay = calculateBackoffDelay(attempt, config);
45
+ console.error(`[Backoff] Attempt ${attempt + 1}: waiting ${delay}ms`);
46
+ return new Promise((resolve) => setTimeout(resolve, delay));
47
+ }
48
+ /**
49
+ * Execute a function with automatic retry and exponential backoff.
50
+ *
51
+ * Retries on errors that pass the shouldRetry predicate, up to maxAttempts.
52
+ * Non-retryable errors are re-thrown immediately.
53
+ *
54
+ * @param fn - Async function to execute
55
+ * @param shouldRetry - Predicate to determine if an error is retryable
56
+ * @param config - Optional partial backoff configuration
57
+ * @returns The result of fn on success
58
+ * @throws The last error if all attempts fail
59
+ */
60
+ export async function withRetry(fn, shouldRetry, config) {
61
+ const cfg = { ...DEFAULT_BACKOFF, ...config };
62
+ let lastError;
63
+ for (let attempt = 0; attempt < cfg.maxAttempts; attempt++) {
64
+ try {
65
+ return await fn();
66
+ }
67
+ catch (error) {
68
+ lastError = error;
69
+ if (!shouldRetry(error))
70
+ throw error;
71
+ if (attempt < cfg.maxAttempts - 1) {
72
+ await backoffSleep(attempt, cfg);
73
+ }
74
+ }
75
+ }
76
+ throw lastError;
77
+ }
78
+ //# sourceMappingURL=backoff.js.map