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,394 @@
1
+ /**
2
+ * Statistics operations for DatabaseService
3
+ *
4
+ * Handles database statistics retrieval.
5
+ */
6
+ import { statSync } from 'fs';
7
+ /**
8
+ * Get database statistics
9
+ *
10
+ * @param db - Database connection
11
+ * @param name - Database name
12
+ * @param path - Database file path
13
+ * @returns DatabaseStats - Live statistics from database
14
+ */
15
+ export function getStats(db, name, path) {
16
+ const docStats = db
17
+ .prepare(`
18
+ SELECT
19
+ COUNT(*) FILTER (WHERE status = 'pending') as pending,
20
+ COUNT(*) FILTER (WHERE status = 'processing') as processing,
21
+ COUNT(*) FILTER (WHERE status = 'complete') as complete,
22
+ COUNT(*) FILTER (WHERE status = 'failed') as failed,
23
+ COUNT(*) as total
24
+ FROM documents
25
+ `)
26
+ .get();
27
+ const chunkStats = db
28
+ .prepare(`
29
+ SELECT
30
+ COUNT(*) FILTER (WHERE embedding_status = 'pending') as pending,
31
+ COUNT(*) FILTER (WHERE embedding_status = 'complete') as complete,
32
+ COUNT(*) FILTER (WHERE embedding_status = 'failed') as failed,
33
+ COUNT(*) as total
34
+ FROM chunks
35
+ `)
36
+ .get();
37
+ const otherCounts = db
38
+ .prepare(`
39
+ SELECT
40
+ (SELECT COUNT(*) FROM ocr_results) as ocr_count,
41
+ (SELECT COUNT(*) FROM embeddings) as embedding_count,
42
+ (SELECT COUNT(*) FROM provenance) as provenance_count,
43
+ (SELECT COUNT(*) FROM images) as image_count,
44
+ (SELECT COUNT(*) FROM extractions) as extraction_count,
45
+ (SELECT COUNT(*) FROM form_fills) as form_fill_count,
46
+ (SELECT COUNT(*) FROM comparisons) as comparison_count,
47
+ (SELECT COUNT(*) FROM clusters) as cluster_count
48
+ `)
49
+ .get();
50
+ const embeddingCount = otherCounts.embedding_count;
51
+ const qualityCosts = db
52
+ .prepare(`
53
+ SELECT
54
+ (SELECT AVG(parse_quality_score) FROM ocr_results WHERE parse_quality_score IS NOT NULL) as avg_quality,
55
+ (SELECT MIN(parse_quality_score) FROM ocr_results WHERE parse_quality_score IS NOT NULL) as min_quality,
56
+ (SELECT MAX(parse_quality_score) FROM ocr_results WHERE parse_quality_score IS NOT NULL) as max_quality,
57
+ (SELECT COUNT(parse_quality_score) FROM ocr_results WHERE parse_quality_score IS NOT NULL) as quality_count,
58
+ (SELECT COALESCE(SUM(cost_cents), 0) FROM ocr_results) as total_ocr_cost,
59
+ (SELECT COALESCE(SUM(cost_cents), 0) FROM form_fills) as total_form_fill_cost
60
+ `)
61
+ .get();
62
+ const stats = statSync(path);
63
+ const avgChunksPerDocument = docStats.total > 0 ? chunkStats.total / docStats.total : 0;
64
+ const avgEmbeddingsPerChunk = chunkStats.total > 0 ? embeddingCount / chunkStats.total : 0;
65
+ return {
66
+ name,
67
+ total_documents: docStats.total,
68
+ documents_by_status: {
69
+ pending: docStats.pending,
70
+ processing: docStats.processing,
71
+ complete: docStats.complete,
72
+ failed: docStats.failed,
73
+ },
74
+ total_ocr_results: otherCounts.ocr_count,
75
+ total_chunks: chunkStats.total,
76
+ chunks_by_embedding_status: {
77
+ pending: chunkStats.pending,
78
+ complete: chunkStats.complete,
79
+ failed: chunkStats.failed,
80
+ },
81
+ total_embeddings: embeddingCount,
82
+ total_images: otherCounts.image_count,
83
+ total_extractions: otherCounts.extraction_count,
84
+ total_form_fills: otherCounts.form_fill_count,
85
+ total_comparisons: otherCounts.comparison_count,
86
+ total_clusters: otherCounts.cluster_count,
87
+ total_provenance: otherCounts.provenance_count,
88
+ storage_size_bytes: stats.size,
89
+ avg_chunks_per_document: avgChunksPerDocument,
90
+ avg_embeddings_per_chunk: avgEmbeddingsPerChunk,
91
+ ocr_quality: {
92
+ avg: qualityCosts.avg_quality,
93
+ min: qualityCosts.min_quality,
94
+ max: qualityCosts.max_quality,
95
+ scored_count: qualityCosts.quality_count,
96
+ },
97
+ costs: {
98
+ total_ocr_cost_cents: qualityCosts.total_ocr_cost,
99
+ total_form_fill_cost_cents: qualityCosts.total_form_fill_cost,
100
+ total_cost_cents: qualityCosts.total_ocr_cost + qualityCosts.total_form_fill_cost,
101
+ },
102
+ };
103
+ }
104
+ /**
105
+ * Update metadata counts from actual table counts
106
+ *
107
+ * @param db - Database connection
108
+ */
109
+ export function updateMetadataCounts(db) {
110
+ const now = new Date().toISOString();
111
+ // M-2: Single query for all counts instead of 4 separate COUNT(*) scans
112
+ const counts = db
113
+ .prepare(`
114
+ SELECT
115
+ (SELECT COUNT(*) FROM documents) as doc_count,
116
+ (SELECT COUNT(*) FROM ocr_results) as ocr_count,
117
+ (SELECT COUNT(*) FROM chunks) as chunk_count,
118
+ (SELECT COUNT(*) FROM embeddings) as emb_count
119
+ `)
120
+ .get();
121
+ db.prepare(`
122
+ UPDATE database_metadata
123
+ SET total_documents = ?, total_ocr_results = ?, total_chunks = ?,
124
+ total_embeddings = ?, last_modified_at = ?
125
+ WHERE id = 1
126
+ `).run(counts.doc_count, counts.ocr_count, counts.chunk_count, counts.emb_count, now);
127
+ }
128
+ /**
129
+ * Update metadata last_modified_at timestamp
130
+ *
131
+ * @param db - Database connection
132
+ */
133
+ export function updateMetadataModified(db) {
134
+ const now = new Date().toISOString();
135
+ const stmt = db.prepare(`
136
+ UPDATE database_metadata SET last_modified_at = ? WHERE id = 1
137
+ `);
138
+ stmt.run(now);
139
+ }
140
+ /**
141
+ * Get strftime format string for the given bucket type
142
+ */
143
+ function getBucketFormat(bucket) {
144
+ switch (bucket) {
145
+ case 'hourly':
146
+ return '%Y-%m-%d %H:00';
147
+ case 'daily':
148
+ return '%Y-%m-%d';
149
+ case 'weekly':
150
+ return '%Y-W%W';
151
+ case 'monthly':
152
+ return '%Y-%m';
153
+ }
154
+ }
155
+ /** Whitelist of valid table names for timeline stats queries */
156
+ const VALID_TIMELINE_TABLES = new Set(['documents', 'chunks', 'embeddings', 'images', 'ocr_results']);
157
+ /** Whitelist of valid date column names for timeline stats queries */
158
+ const VALID_DATE_COLUMNS = new Set(['created_at', 'processing_completed_at']);
159
+ /**
160
+ * Get processing volume over time buckets for various metrics.
161
+ *
162
+ * @param db - Database connection
163
+ * @param options - Bucket type, metric, optional date range
164
+ * @returns Array of { period, count, total? } data points
165
+ */
166
+ export function getTimelineStats(db, options) {
167
+ const format = getBucketFormat(options.bucket);
168
+ const conditions = [];
169
+ const params = [];
170
+ // Build metric-specific query
171
+ let table;
172
+ let dateColumn;
173
+ let selectExpr;
174
+ switch (options.metric) {
175
+ case 'documents':
176
+ table = 'documents';
177
+ dateColumn = 'created_at';
178
+ selectExpr = 'COUNT(*) as count';
179
+ break;
180
+ case 'pages':
181
+ table = 'documents';
182
+ dateColumn = 'created_at';
183
+ selectExpr = 'COALESCE(SUM(page_count), 0) as count';
184
+ break;
185
+ case 'chunks':
186
+ table = 'chunks';
187
+ dateColumn = 'created_at';
188
+ selectExpr = 'COUNT(*) as count';
189
+ break;
190
+ case 'embeddings':
191
+ table = 'embeddings';
192
+ dateColumn = 'created_at';
193
+ selectExpr = 'COUNT(*) as count';
194
+ break;
195
+ case 'images':
196
+ table = 'images';
197
+ dateColumn = 'created_at';
198
+ selectExpr = 'COUNT(*) as count';
199
+ break;
200
+ case 'cost':
201
+ table = 'ocr_results';
202
+ dateColumn = 'processing_completed_at';
203
+ selectExpr = 'COALESCE(SUM(cost_cents), 0) as count';
204
+ break;
205
+ }
206
+ // Whitelist validation for SQL-interpolated identifiers
207
+ if (!VALID_TIMELINE_TABLES.has(table)) {
208
+ throw new Error(`Invalid timeline table: ${table}`);
209
+ }
210
+ if (!VALID_DATE_COLUMNS.has(dateColumn)) {
211
+ throw new Error(`Invalid date column: ${dateColumn}`);
212
+ }
213
+ if (options.created_after) {
214
+ conditions.push(`${dateColumn} >= ?`);
215
+ params.push(options.created_after);
216
+ }
217
+ if (options.created_before) {
218
+ conditions.push(`${dateColumn} <= ?`);
219
+ params.push(options.created_before);
220
+ }
221
+ const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
222
+ const sql = `
223
+ SELECT
224
+ strftime('${format}', ${dateColumn}) as period,
225
+ ${selectExpr}
226
+ FROM ${table}
227
+ ${whereClause}
228
+ GROUP BY period
229
+ ORDER BY period ASC
230
+ `;
231
+ const rows = db.prepare(sql).all(...params);
232
+ // Filter out null periods (rows with null dateColumn values)
233
+ return rows
234
+ .filter((r) => r.period !== null)
235
+ .map((r) => ({
236
+ period: r.period,
237
+ count: r.count,
238
+ }));
239
+ }
240
+ /**
241
+ * Get quality score trends over time, optionally grouped by OCR mode or processor.
242
+ *
243
+ * Uses ocr_results.parse_quality_score for ocr_mode grouping,
244
+ * and provenance.processing_quality_score for processor grouping.
245
+ *
246
+ * @param db - Database connection
247
+ * @param options - Bucket type, group_by, optional date range
248
+ * @returns Array of quality trend data points
249
+ */
250
+ export function getQualityTrends(db, options) {
251
+ const format = getBucketFormat(options.bucket);
252
+ const groupBy = options.group_by || 'none';
253
+ // Whitelist validation for group_by parameter (used in SQL branching)
254
+ const VALID_GROUP_BY = new Set(['none', 'ocr_mode', 'processor']);
255
+ if (!VALID_GROUP_BY.has(groupBy)) {
256
+ throw new Error(`Invalid group_by value: ${groupBy}`);
257
+ }
258
+ const conditions = [];
259
+ const params = [];
260
+ if (groupBy === 'processor') {
261
+ // Use provenance table for processor grouping
262
+ conditions.push('processing_quality_score IS NOT NULL');
263
+ if (options.created_after) {
264
+ conditions.push('created_at >= ?');
265
+ params.push(options.created_after);
266
+ }
267
+ if (options.created_before) {
268
+ conditions.push('created_at <= ?');
269
+ params.push(options.created_before);
270
+ }
271
+ const whereClause = `WHERE ${conditions.join(' AND ')}`;
272
+ const sql = `
273
+ SELECT
274
+ strftime('${format}', created_at) as period,
275
+ processor as grp,
276
+ AVG(processing_quality_score) as avg_quality,
277
+ MIN(processing_quality_score) as min_quality,
278
+ MAX(processing_quality_score) as max_quality,
279
+ COUNT(*) as sample_count
280
+ FROM provenance
281
+ ${whereClause}
282
+ GROUP BY period, grp
283
+ ORDER BY period ASC, grp ASC
284
+ `;
285
+ const rows = db.prepare(sql).all(...params);
286
+ return rows
287
+ .filter((r) => r.period !== null)
288
+ .map((r) => ({
289
+ period: r.period,
290
+ avg_quality: Math.round(r.avg_quality * 100) / 100,
291
+ min_quality: Math.round(r.min_quality * 100) / 100,
292
+ max_quality: Math.round(r.max_quality * 100) / 100,
293
+ sample_count: r.sample_count,
294
+ group: r.grp,
295
+ }));
296
+ }
297
+ else {
298
+ // Use ocr_results table for no grouping or ocr_mode grouping
299
+ conditions.push('parse_quality_score IS NOT NULL');
300
+ if (options.created_after) {
301
+ conditions.push('processing_completed_at >= ?');
302
+ params.push(options.created_after);
303
+ }
304
+ if (options.created_before) {
305
+ conditions.push('processing_completed_at <= ?');
306
+ params.push(options.created_before);
307
+ }
308
+ const whereClause = `WHERE ${conditions.join(' AND ')}`;
309
+ const groupByColumn = groupBy === 'ocr_mode' ? ', datalab_mode' : '';
310
+ const selectGroup = groupBy === 'ocr_mode' ? ', datalab_mode as grp' : '';
311
+ const sql = `
312
+ SELECT
313
+ strftime('${format}', processing_completed_at) as period
314
+ ${selectGroup},
315
+ AVG(parse_quality_score) as avg_quality,
316
+ MIN(parse_quality_score) as min_quality,
317
+ MAX(parse_quality_score) as max_quality,
318
+ COUNT(*) as sample_count
319
+ FROM ocr_results
320
+ ${whereClause}
321
+ GROUP BY period${groupByColumn}
322
+ ORDER BY period ASC${groupBy === 'ocr_mode' ? ', grp ASC' : ''}
323
+ `;
324
+ const rows = db.prepare(sql).all(...params);
325
+ return rows
326
+ .filter((r) => r.period !== null)
327
+ .map((r) => ({
328
+ period: r.period,
329
+ avg_quality: Math.round(r.avg_quality * 100) / 100,
330
+ min_quality: Math.round(r.min_quality * 100) / 100,
331
+ max_quality: Math.round(r.max_quality * 100) / 100,
332
+ sample_count: r.sample_count,
333
+ ...(groupBy === 'ocr_mode' && r.grp !== undefined ? { group: r.grp } : {}),
334
+ }));
335
+ }
336
+ }
337
+ /**
338
+ * Get processing throughput metrics per time bucket.
339
+ *
340
+ * Queries provenance table for OCR_RESULT, EMBEDDING, and IMAGE types
341
+ * to compute per-bucket throughput rates.
342
+ *
343
+ * @param db - Database connection
344
+ * @param options - Bucket type, optional date range
345
+ * @returns Array of throughput data points per bucket
346
+ */
347
+ export function getThroughputAnalytics(db, options) {
348
+ const format = getBucketFormat(options.bucket);
349
+ const conditions = [];
350
+ const params = [];
351
+ if (options.created_after) {
352
+ conditions.push('p.created_at >= ?');
353
+ params.push(options.created_after);
354
+ }
355
+ if (options.created_before) {
356
+ conditions.push('p.created_at <= ?');
357
+ params.push(options.created_before);
358
+ }
359
+ const extraWhere = conditions.length > 0 ? `AND ${conditions.join(' AND ')}` : '';
360
+ // Use a single query with conditional aggregation across types
361
+ const sql = `
362
+ SELECT
363
+ strftime('${format}', p.created_at) as period,
364
+ COALESCE(SUM(CASE WHEN p.type = 'OCR_RESULT' THEN 1 ELSE 0 END), 0) as pages_processed,
365
+ COALESCE(SUM(CASE WHEN p.type = 'EMBEDDING' THEN 1 ELSE 0 END), 0) as embeddings_generated,
366
+ COALESCE(SUM(CASE WHEN p.type = 'IMAGE' THEN 1 ELSE 0 END), 0) as images_processed,
367
+ COALESCE(SUM(CASE WHEN p.type = 'OCR_RESULT' THEN p.processing_duration_ms ELSE 0 END), 0) as total_ocr_duration_ms,
368
+ COALESCE(SUM(CASE WHEN p.type = 'EMBEDDING' THEN p.processing_duration_ms ELSE 0 END), 0) as total_embedding_duration_ms
369
+ FROM provenance p
370
+ WHERE p.type IN ('OCR_RESULT', 'EMBEDDING', 'IMAGE')
371
+ ${extraWhere}
372
+ GROUP BY period
373
+ ORDER BY period ASC
374
+ `;
375
+ // Duplicate params for each condition usage (they apply once)
376
+ const rows = db.prepare(sql).all(...params);
377
+ return rows
378
+ .filter((r) => r.period !== null)
379
+ .map((r) => ({
380
+ period: r.period,
381
+ pages_processed: r.pages_processed,
382
+ embeddings_generated: r.embeddings_generated,
383
+ images_processed: r.images_processed,
384
+ total_ocr_duration_ms: r.total_ocr_duration_ms,
385
+ total_embedding_duration_ms: r.total_embedding_duration_ms,
386
+ avg_ms_per_page: r.pages_processed > 0
387
+ ? Math.round((r.total_ocr_duration_ms / r.pages_processed) * 100) / 100
388
+ : 0,
389
+ avg_ms_per_embedding: r.embeddings_generated > 0
390
+ ? Math.round((r.total_embedding_duration_ms / r.embeddings_generated) * 100) / 100
391
+ : 0,
392
+ }));
393
+ }
394
+ //# sourceMappingURL=stats-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats-operations.js","sourceRoot":"","sources":["../../../../src/services/storage/database/stats-operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Tag Operations for DatabaseService
3
+ *
4
+ * Provides CRUD operations for tags and entity_tags tables.
5
+ * Tags are user-defined annotations for cross-entity tagging.
6
+ *
7
+ * @module database/tag-operations
8
+ */
9
+ import type Database from 'better-sqlite3';
10
+ export interface Tag {
11
+ id: string;
12
+ name: string;
13
+ description: string | null;
14
+ color: string | null;
15
+ created_at: string;
16
+ }
17
+ export interface TagWithCount extends Tag {
18
+ usage_count: number;
19
+ }
20
+ export interface EntityTagResult {
21
+ entity_id: string;
22
+ entity_type: string;
23
+ tags: string[];
24
+ }
25
+ export declare const VALID_ENTITY_TYPES: readonly ["document", "chunk", "image", "extraction", "cluster"];
26
+ export type EntityType = (typeof VALID_ENTITY_TYPES)[number];
27
+ /**
28
+ * Create a new tag
29
+ * @throws Error if tag name already exists
30
+ */
31
+ export declare function createTag(db: Database.Database, tag: {
32
+ name: string;
33
+ description?: string;
34
+ color?: string;
35
+ }): Tag;
36
+ /**
37
+ * Get a tag by its name
38
+ */
39
+ export declare function getTagByName(db: Database.Database, name: string): Tag | null;
40
+ /**
41
+ * Get all tags
42
+ */
43
+ export declare function getAllTags(db: Database.Database): Tag[];
44
+ /**
45
+ * Get all tags with usage counts
46
+ */
47
+ export declare function getTagsWithCounts(db: Database.Database): TagWithCount[];
48
+ /**
49
+ * Apply a tag to an entity
50
+ * @returns The entity_tags record ID
51
+ * @throws Error if tag/entity_tag combination already exists
52
+ */
53
+ export declare function applyTag(db: Database.Database, tagId: string, entityId: string, entityType: string): string;
54
+ /**
55
+ * Remove a tag from an entity
56
+ * @returns true if a row was deleted, false if nothing to remove
57
+ */
58
+ export declare function removeTag(db: Database.Database, tagId: string, entityId: string, entityType: string): boolean;
59
+ /**
60
+ * Get all tags for an entity
61
+ */
62
+ export declare function getTagsForEntity(db: Database.Database, entityId: string, entityType: string): Tag[];
63
+ /**
64
+ * Search for entities that have specified tags
65
+ *
66
+ * @param tagNames - Array of tag names to search for
67
+ * @param entityType - Optional filter by entity type
68
+ * @param matchAll - If true, entity must have ALL tags. If false, ANY tag matches.
69
+ */
70
+ export declare function searchByTags(db: Database.Database, tagNames: string[], entityType?: string, matchAll?: boolean): EntityTagResult[];
71
+ /**
72
+ * Delete a tag and all its entity associations (CASCADE)
73
+ * @returns The number of entity_tag associations that were removed
74
+ */
75
+ export declare function deleteTag(db: Database.Database, tagId: string): number;
76
+ //# sourceMappingURL=tag-operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag-operations.d.ts","sourceRoot":"","sources":["../../../../src/services/storage/database/tag-operations.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAO3C,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAa,SAAQ,GAAG;IACvC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAGD,eAAO,MAAM,kBAAkB,kEAAmE,CAAC;AACnG,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAM7D;;;GAGG;AACH,wBAAgB,SAAS,CACvB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,GAAG,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D,GAAG,CAuBL;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAG5E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,GAAG,EAAE,CAEvD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,YAAY,EAAE,CAWvE;AAMD;;;;GAIG;AACH,wBAAgB,QAAQ,CACtB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,MAAM,CAmBR;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAOT;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,GAAG,EAAE,CAUP;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,QAAQ,EAAE,MAAM,EAAE,EAClB,UAAU,CAAC,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,OAAO,GACjB,eAAe,EAAE,CAsDnB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAatE"}
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Tag Operations for DatabaseService
3
+ *
4
+ * Provides CRUD operations for tags and entity_tags tables.
5
+ * Tags are user-defined annotations for cross-entity tagging.
6
+ *
7
+ * @module database/tag-operations
8
+ */
9
+ import { v4 as uuidv4 } from 'uuid';
10
+ // Valid entity types for tagging
11
+ export const VALID_ENTITY_TYPES = ['document', 'chunk', 'image', 'extraction', 'cluster'];
12
+ // ═══════════════════════════════════════════════════════════════════════════════
13
+ // TAG CRUD
14
+ // ═══════════════════════════════════════════════════════════════════════════════
15
+ /**
16
+ * Create a new tag
17
+ * @throws Error if tag name already exists
18
+ */
19
+ export function createTag(db, tag) {
20
+ const id = uuidv4();
21
+ const now = new Date().toISOString();
22
+ try {
23
+ db.prepare(`INSERT INTO tags (id, name, description, color, created_at)
24
+ VALUES (?, ?, ?, ?, ?)`).run(id, tag.name, tag.description ?? null, tag.color ?? null, now);
25
+ }
26
+ catch (error) {
27
+ if (error instanceof Error && error.message.includes('UNIQUE constraint failed')) {
28
+ throw new Error(`Tag with name "${tag.name}" already exists`);
29
+ }
30
+ throw error;
31
+ }
32
+ return {
33
+ id,
34
+ name: tag.name,
35
+ description: tag.description ?? null,
36
+ color: tag.color ?? null,
37
+ created_at: now,
38
+ };
39
+ }
40
+ /**
41
+ * Get a tag by its name
42
+ */
43
+ export function getTagByName(db, name) {
44
+ const row = db.prepare('SELECT * FROM tags WHERE name = ?').get(name);
45
+ return row ?? null;
46
+ }
47
+ /**
48
+ * Get all tags
49
+ */
50
+ export function getAllTags(db) {
51
+ return db.prepare('SELECT * FROM tags ORDER BY name LIMIT 10000').all();
52
+ }
53
+ /**
54
+ * Get all tags with usage counts
55
+ */
56
+ export function getTagsWithCounts(db) {
57
+ return db
58
+ .prepare(`SELECT t.*, COUNT(et.id) as usage_count
59
+ FROM tags t
60
+ LEFT JOIN entity_tags et ON et.tag_id = t.id
61
+ GROUP BY t.id
62
+ ORDER BY t.name
63
+ LIMIT 10000`)
64
+ .all();
65
+ }
66
+ // ═══════════════════════════════════════════════════════════════════════════════
67
+ // ENTITY TAG OPERATIONS
68
+ // ═══════════════════════════════════════════════════════════════════════════════
69
+ /**
70
+ * Apply a tag to an entity
71
+ * @returns The entity_tags record ID
72
+ * @throws Error if tag/entity_tag combination already exists
73
+ */
74
+ export function applyTag(db, tagId, entityId, entityType) {
75
+ const id = uuidv4();
76
+ const now = new Date().toISOString();
77
+ try {
78
+ db.prepare(`INSERT INTO entity_tags (id, tag_id, entity_id, entity_type, created_at)
79
+ VALUES (?, ?, ?, ?, ?)`).run(id, tagId, entityId, entityType, now);
80
+ }
81
+ catch (error) {
82
+ if (error instanceof Error && error.message.includes('UNIQUE constraint failed')) {
83
+ throw new Error(`Tag is already applied to this ${entityType} (entity_id: ${entityId})`);
84
+ }
85
+ throw error;
86
+ }
87
+ return id;
88
+ }
89
+ /**
90
+ * Remove a tag from an entity
91
+ * @returns true if a row was deleted, false if nothing to remove
92
+ */
93
+ export function removeTag(db, tagId, entityId, entityType) {
94
+ const result = db
95
+ .prepare(`DELETE FROM entity_tags WHERE tag_id = ? AND entity_id = ? AND entity_type = ?`)
96
+ .run(tagId, entityId, entityType);
97
+ return result.changes > 0;
98
+ }
99
+ /**
100
+ * Get all tags for an entity
101
+ */
102
+ export function getTagsForEntity(db, entityId, entityType) {
103
+ return db
104
+ .prepare(`SELECT t.*
105
+ FROM tags t
106
+ INNER JOIN entity_tags et ON et.tag_id = t.id
107
+ WHERE et.entity_id = ? AND et.entity_type = ?
108
+ ORDER BY t.name`)
109
+ .all(entityId, entityType);
110
+ }
111
+ /**
112
+ * Search for entities that have specified tags
113
+ *
114
+ * @param tagNames - Array of tag names to search for
115
+ * @param entityType - Optional filter by entity type
116
+ * @param matchAll - If true, entity must have ALL tags. If false, ANY tag matches.
117
+ */
118
+ export function searchByTags(db, tagNames, entityType, matchAll) {
119
+ if (tagNames.length === 0) {
120
+ return [];
121
+ }
122
+ const placeholders = tagNames.map(() => '?').join(',');
123
+ const params = [...tagNames];
124
+ let entityTypeClause = '';
125
+ if (entityType) {
126
+ entityTypeClause = 'AND et.entity_type = ?';
127
+ params.push(entityType);
128
+ }
129
+ const havingClause = matchAll
130
+ ? `HAVING COUNT(DISTINCT t.name) = ?`
131
+ : '';
132
+ if (matchAll) {
133
+ params.push(tagNames.length);
134
+ }
135
+ const sql = `
136
+ SELECT et.entity_id, et.entity_type,
137
+ (SELECT JSON_GROUP_ARRAY(sub.name) FROM (
138
+ SELECT DISTINCT t2.name
139
+ FROM tags t2
140
+ INNER JOIN entity_tags et2 ON et2.tag_id = t2.id
141
+ WHERE et2.entity_id = et.entity_id AND et2.entity_type = et.entity_type
142
+ AND t2.name IN (${placeholders})
143
+ ) sub) as tag_names
144
+ FROM entity_tags et
145
+ INNER JOIN tags t ON t.id = et.tag_id
146
+ WHERE t.name IN (${placeholders})
147
+ ${entityTypeClause}
148
+ GROUP BY et.entity_id, et.entity_type
149
+ ${havingClause}
150
+ ORDER BY et.entity_id
151
+ LIMIT 10000
152
+ `;
153
+ // Parameters: tagNames for subquery IN, then tagNames + entityType? + matchCount? for outer query
154
+ const allParams = [...tagNames, ...params];
155
+ const rows = db.prepare(sql).all(...allParams);
156
+ return rows.map((row) => ({
157
+ entity_id: row.entity_id,
158
+ entity_type: row.entity_type,
159
+ tags: JSON.parse(row.tag_names),
160
+ }));
161
+ }
162
+ /**
163
+ * Delete a tag and all its entity associations (CASCADE)
164
+ * @returns The number of entity_tag associations that were removed
165
+ */
166
+ export function deleteTag(db, tagId) {
167
+ // Count associations before delete (CASCADE will remove them)
168
+ const countRow = db
169
+ .prepare('SELECT COUNT(*) as cnt FROM entity_tags WHERE tag_id = ?')
170
+ .get(tagId);
171
+ const associationCount = countRow.cnt;
172
+ const result = db.prepare('DELETE FROM tags WHERE id = ?').run(tagId);
173
+ if (result.changes === 0) {
174
+ throw new Error(`Tag not found: ${tagId}`);
175
+ }
176
+ return associationCount;
177
+ }
178
+ //# sourceMappingURL=tag-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tag-operations.js","sourceRoot":"","sources":["../../../../src/services/storage/database/tag-operations.ts"],"names":[],"mappings":"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"}