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,55 @@
1
+ /**
2
+ * EmbeddingService - Embedding generation orchestrator
3
+ *
4
+ * CP-001: Complete provenance (EMBEDDING records, chain_depth=3)
5
+ * CP-002: original_text denormalized in every embedding
6
+ * CP-004: Local GPU only - NO cloud fallback
7
+ *
8
+ * ATOMIC: All operations succeed or none are stored. FAIL FAST.
9
+ *
10
+ * @module services/embedding/embedder
11
+ */
12
+ import { NomicEmbeddingClient, EmbeddingError } from './nomic.js';
13
+ import { DatabaseService } from '../storage/database/index.js';
14
+ import { VectorService } from '../storage/vector.js';
15
+ import type { Chunk } from '../../models/chunk.js';
16
+ interface DocumentInfo {
17
+ documentId: string;
18
+ filePath: string;
19
+ fileName: string;
20
+ fileHash: string;
21
+ documentProvenanceId: string;
22
+ }
23
+ interface EmbedResult {
24
+ success: boolean;
25
+ embeddingIds: string[];
26
+ provenanceIds: string[];
27
+ totalChunks: number;
28
+ elapsedMs: number;
29
+ error?: string;
30
+ }
31
+ /**
32
+ * Build a section-aware context prefix from chunk metadata.
33
+ * This prefix is prepended to the chunk text before embedding to make
34
+ * embeddings section-aware WITHOUT changing stored text.
35
+ *
36
+ * @param chunk - Chunk with section/heading/content_types metadata
37
+ * @returns Prefix string (may be empty if no relevant metadata)
38
+ */
39
+ export declare function buildSectionPrefix(chunk: Chunk): string;
40
+ export declare class EmbeddingService {
41
+ private readonly client;
42
+ private readonly batchSize;
43
+ constructor(options?: {
44
+ batchSize?: number;
45
+ client?: NomicEmbeddingClient;
46
+ });
47
+ embedDocumentChunks(db: DatabaseService, vectorService: VectorService, chunks: Chunk[], documentInfo: DocumentInfo): Promise<EmbedResult>;
48
+ embedSearchQuery(query: string): Promise<Float32Array>;
49
+ processPendingChunks(db: DatabaseService, vectorService: VectorService, documentInfo: DocumentInfo): Promise<EmbedResult>;
50
+ private createProvenance;
51
+ }
52
+ export declare function getEmbeddingService(): EmbeddingService;
53
+ export declare function resetEmbeddingService(): void;
54
+ export { EmbeddingError };
55
+ //# sourceMappingURL=embedder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedder.d.ts","sourceRoot":"","sources":["../../../src/services/embedding/embedder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EACL,oBAAoB,EAEpB,cAAc,EAKf,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AASnD,UAAU,YAAY;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,UAAU,WAAW;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAOD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAoBvD;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,oBAAoB,CAAA;KAAE;IAKrE,mBAAmB,CACvB,EAAE,EAAE,eAAe,EACnB,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,KAAK,EAAE,EACf,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,WAAW,CAAC;IA8FjB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAItD,oBAAoB,CACxB,EAAE,EAAE,eAAe,EACnB,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,WAAW,CAAC;IAWvB,OAAO,CAAC,gBAAgB;CAoDzB;AAID,wBAAgB,mBAAmB,IAAI,gBAAgB,CAKtD;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * EmbeddingService - Embedding generation orchestrator
3
+ *
4
+ * CP-001: Complete provenance (EMBEDDING records, chain_depth=3)
5
+ * CP-002: original_text denormalized in every embedding
6
+ * CP-004: Local GPU only - NO cloud fallback
7
+ *
8
+ * ATOMIC: All operations succeed or none are stored. FAIL FAST.
9
+ *
10
+ * @module services/embedding/embedder
11
+ */
12
+ import { v4 as uuidv4 } from 'uuid';
13
+ import { getEmbeddingClient, EmbeddingError, EMBEDDING_DIM, MODEL_NAME, MODEL_VERSION, DEFAULT_BATCH_SIZE, } from './nomic.js';
14
+ import { computeHash } from '../../utils/hash.js';
15
+ import { normalizeForEmbedding } from '../chunking/text-normalizer.js';
16
+ const CHAIN_PATH = JSON.stringify(['DOCUMENT', 'OCR_RESULT', 'CHUNK', 'EMBEDDING']);
17
+ /** Section-aware embedding processor version */
18
+ const SECTION_AWARE_VERSION = '1.5.0-section';
19
+ /**
20
+ * Build a section-aware context prefix from chunk metadata.
21
+ * This prefix is prepended to the chunk text before embedding to make
22
+ * embeddings section-aware WITHOUT changing stored text.
23
+ *
24
+ * @param chunk - Chunk with section/heading/content_types metadata
25
+ * @returns Prefix string (may be empty if no relevant metadata)
26
+ */
27
+ export function buildSectionPrefix(chunk) {
28
+ const parts = [];
29
+ if (chunk.section_path) {
30
+ parts.push(`[Section: ${chunk.section_path}]`);
31
+ }
32
+ else if (chunk.heading_context) {
33
+ parts.push(`[Heading: ${chunk.heading_context}]`);
34
+ }
35
+ if (chunk.content_types) {
36
+ try {
37
+ const types = JSON.parse(chunk.content_types);
38
+ if (types.includes('table'))
39
+ parts.push('[Table]');
40
+ if (types.includes('code'))
41
+ parts.push('[Code]');
42
+ }
43
+ catch (error) {
44
+ console.error(`[embedder] Failed to parse content_types JSON for chunk ${chunk.id}: ${error instanceof Error ? error.message : String(error)}`);
45
+ }
46
+ }
47
+ return parts.length > 0 ? parts.join(' ') + ' ' : '';
48
+ }
49
+ export class EmbeddingService {
50
+ client;
51
+ batchSize;
52
+ constructor(options) {
53
+ this.client = options?.client ?? getEmbeddingClient();
54
+ this.batchSize = options?.batchSize ?? DEFAULT_BATCH_SIZE;
55
+ }
56
+ async embedDocumentChunks(db, vectorService, chunks, documentInfo) {
57
+ if (chunks.length === 0) {
58
+ return { success: true, embeddingIds: [], provenanceIds: [], totalChunks: 0, elapsedMs: 0 };
59
+ }
60
+ const startMs = Date.now();
61
+ const vectors = await this.client.embedChunks(chunks.map((c) => buildSectionPrefix(c) + normalizeForEmbedding(c.text)), this.batchSize);
62
+ if (vectors.length !== chunks.length) {
63
+ throw new EmbeddingError(`Vector count mismatch: got ${vectors.length}, expected ${chunks.length}`, 'EMBEDDING_FAILED', { vectorCount: vectors.length, chunkCount: chunks.length });
64
+ }
65
+ // Get actual device from last successful embedding operation
66
+ const actualDevice = this.client.getLastDevice();
67
+ const result = db.transaction(() => {
68
+ const embeddingIds = [];
69
+ const provenanceIds = [];
70
+ // H-7/M-16: Sub-batch vector storage to avoid accumulating all Float32Array vectors in memory
71
+ const VECTOR_SUB_BATCH = 50;
72
+ let vectorBatch = [];
73
+ for (let i = 0; i < chunks.length; i++) {
74
+ const chunk = chunks[i];
75
+ const vector = vectors[i];
76
+ const embeddingId = uuidv4();
77
+ const now = new Date().toISOString();
78
+ const provenanceId = this.createProvenance(db, chunk, documentInfo, actualDevice);
79
+ provenanceIds.push(provenanceId);
80
+ const embedding = {
81
+ id: embeddingId,
82
+ chunk_id: chunk.id,
83
+ image_id: null, // Text embeddings don't have an image
84
+ extraction_id: null, // Text embeddings don't have an extraction
85
+ document_id: documentInfo.documentId,
86
+ original_text: chunk.text,
87
+ original_text_length: chunk.text.length,
88
+ source_file_path: documentInfo.filePath,
89
+ source_file_name: documentInfo.fileName,
90
+ source_file_hash: documentInfo.fileHash,
91
+ page_number: chunk.page_number,
92
+ page_range: chunk.page_range,
93
+ character_start: chunk.character_start,
94
+ character_end: chunk.character_end,
95
+ chunk_index: chunk.chunk_index,
96
+ total_chunks: chunks.length,
97
+ model_name: MODEL_NAME,
98
+ model_version: MODEL_VERSION,
99
+ task_type: 'search_document',
100
+ inference_mode: 'local',
101
+ gpu_device: actualDevice,
102
+ provenance_id: provenanceId,
103
+ content_hash: computeHash(chunk.text),
104
+ generation_duration_ms: null,
105
+ };
106
+ db.insertEmbedding(embedding);
107
+ embeddingIds.push(embeddingId);
108
+ vectorBatch.push({ embeddingId, vector });
109
+ // H-7/M-16: Flush vector sub-batch to avoid accumulating all vectors in memory
110
+ if (vectorBatch.length >= VECTOR_SUB_BATCH) {
111
+ vectorService.batchStoreVectors(vectorBatch);
112
+ vectorBatch = [];
113
+ }
114
+ db.updateChunkEmbeddingStatus(chunk.id, 'complete', now);
115
+ }
116
+ // Flush remaining vectors
117
+ if (vectorBatch.length > 0) {
118
+ vectorService.batchStoreVectors(vectorBatch);
119
+ }
120
+ return { embeddingIds, provenanceIds };
121
+ });
122
+ return {
123
+ success: true,
124
+ embeddingIds: result.embeddingIds,
125
+ provenanceIds: result.provenanceIds,
126
+ totalChunks: chunks.length,
127
+ elapsedMs: Date.now() - startMs,
128
+ };
129
+ }
130
+ async embedSearchQuery(query) {
131
+ return this.client.embedQuery(query);
132
+ }
133
+ async processPendingChunks(db, vectorService, documentInfo) {
134
+ const allChunks = db.getChunksByDocumentId(documentInfo.documentId);
135
+ const pendingChunks = allChunks.filter((c) => c.embedding_status === 'pending');
136
+ if (pendingChunks.length === 0) {
137
+ return { success: true, embeddingIds: [], provenanceIds: [], totalChunks: 0, elapsedMs: 0 };
138
+ }
139
+ return this.embedDocumentChunks(db, vectorService, pendingChunks, documentInfo);
140
+ }
141
+ createProvenance(db, chunk, documentInfo, device) {
142
+ const provenanceId = uuidv4();
143
+ const now = new Date().toISOString();
144
+ const chunkProv = db.getProvenance(chunk.provenance_id);
145
+ const existingParents = chunkProv?.parent_ids
146
+ ? JSON.parse(chunkProv.parent_ids)
147
+ : [];
148
+ const parentIds = [...existingParents, chunk.provenance_id];
149
+ const record = {
150
+ id: provenanceId,
151
+ type: 'EMBEDDING',
152
+ created_at: now,
153
+ processed_at: now,
154
+ source_file_created_at: null,
155
+ source_file_modified_at: null,
156
+ source_type: 'EMBEDDING',
157
+ source_path: null,
158
+ source_id: chunk.provenance_id,
159
+ root_document_id: documentInfo.documentProvenanceId,
160
+ location: {
161
+ chunk_index: chunk.chunk_index,
162
+ character_start: chunk.character_start,
163
+ character_end: chunk.character_end,
164
+ page_number: chunk.page_number ?? undefined,
165
+ },
166
+ content_hash: computeHash(chunk.text),
167
+ input_hash: chunk.text_hash,
168
+ file_hash: documentInfo.fileHash,
169
+ processor: MODEL_NAME,
170
+ processor_version: SECTION_AWARE_VERSION,
171
+ processing_params: {
172
+ dimensions: EMBEDDING_DIM,
173
+ task_type: 'search_document',
174
+ inference_mode: 'local',
175
+ device,
176
+ dtype: 'float16',
177
+ batch_size: this.batchSize,
178
+ section_aware: true,
179
+ },
180
+ processing_duration_ms: null,
181
+ processing_quality_score: null,
182
+ parent_id: chunk.provenance_id,
183
+ parent_ids: JSON.stringify(parentIds),
184
+ chain_depth: 3,
185
+ chain_path: CHAIN_PATH,
186
+ };
187
+ db.insertProvenance(record);
188
+ return provenanceId;
189
+ }
190
+ }
191
+ let _service = null;
192
+ export function getEmbeddingService() {
193
+ if (!_service) {
194
+ _service = new EmbeddingService();
195
+ }
196
+ return _service;
197
+ }
198
+ export function resetEmbeddingService() {
199
+ _service = null;
200
+ }
201
+ export { EmbeddingError };
202
+ //# sourceMappingURL=embedder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedder.js","sourceRoot":"","sources":["../../../src/services/embedding/embedder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * NomicEmbeddingClient - TypeScript bridge to python/embedding_worker.py
3
+ *
4
+ * CP-004: Local GPU inference ONLY - throws EmbeddingError on GPU unavailable.
5
+ * NO cloud fallback, NO CPU fallback. FAIL FAST with robust error logging.
6
+ *
7
+ * @module services/embedding/nomic
8
+ */
9
+ type EmbeddingErrorCode = 'GPU_NOT_AVAILABLE' | 'EMBEDDING_FAILED' | 'PARSE_ERROR' | 'WORKER_ERROR' | 'MODEL_NOT_FOUND';
10
+ export declare class EmbeddingError extends Error {
11
+ readonly code: EmbeddingErrorCode;
12
+ readonly details?: Record<string, unknown> | undefined;
13
+ constructor(message: string, code: EmbeddingErrorCode, details?: Record<string, unknown> | undefined);
14
+ }
15
+ export declare const EMBEDDING_DIM = 768;
16
+ export declare const MODEL_NAME = "nomic-embed-text-v1.5";
17
+ export declare const MODEL_VERSION = "1.5.0";
18
+ export declare const DEFAULT_BATCH_SIZE = 64;
19
+ export declare class NomicEmbeddingClient {
20
+ private readonly workerPath;
21
+ private readonly pythonPath;
22
+ private _lastDevice;
23
+ constructor(options?: {
24
+ workerPath?: string;
25
+ pythonPath?: string;
26
+ });
27
+ /**
28
+ * Maximum chunks per Python worker call to prevent memory issues.
29
+ * Reduced from 500 to 100: XLSX audit trails produce 37K+ chunks,
30
+ * and 500 chunks at once causes CUDA driver-level OOM during tokenization
31
+ * (not caught by PyTorch's OOM recovery).
32
+ */
33
+ private static readonly MAX_CHUNKS_PER_CALL;
34
+ /**
35
+ * DC-01: Read embedding_batch_size from server config if available,
36
+ * falling back to the caller-provided value or DEFAULT_BATCH_SIZE.
37
+ * DC-02: Read embedding_device from server config if available,
38
+ * falling back to the Python worker's auto-detection.
39
+ */
40
+ private getEffectiveBatchSize;
41
+ private getEffectiveDevice;
42
+ embedChunks(chunks: string[], batchSize?: number): Promise<Float32Array[]>;
43
+ /**
44
+ * Process chunks in sub-batches, calling Python worker multiple times.
45
+ * Prevents memory exhaustion for large documents (1000+ chunks).
46
+ */
47
+ private embedChunksInBatches;
48
+ /**
49
+ * Embed a single batch of chunks via Python worker.
50
+ */
51
+ private embedChunksSingle;
52
+ /**
53
+ * Get the device used by the last successful embedding operation.
54
+ * Populated by the Python worker result (e.g., 'cuda:0', 'cpu', 'mps').
55
+ */
56
+ getLastDevice(): string;
57
+ embedQuery(query: string): Promise<Float32Array>;
58
+ /** Embedding worker timeout: 5 minutes (CUDA hang protection) */
59
+ private static readonly WORKER_TIMEOUT_MS;
60
+ /** Max stderr accumulation: 10KB */
61
+ private static readonly MAX_STDERR_LENGTH;
62
+ private runWorker;
63
+ private classifyError;
64
+ }
65
+ export declare function getEmbeddingClient(): NomicEmbeddingClient;
66
+ export {};
67
+ //# sourceMappingURL=nomic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nomic.d.ts","sourceRoot":"","sources":["../../../src/services/embedding/nomic.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,KAAK,kBAAkB,GACnB,mBAAmB,GACnB,kBAAkB,GAClB,aAAa,GACb,cAAc,GACd,iBAAiB,CAAC;AAEtB,qBAAa,cAAe,SAAQ,KAAK;aAGrB,IAAI,EAAE,kBAAkB;aACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAFjD,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,kBAAkB,EACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAMpD;AA2BD,eAAO,MAAM,aAAa,MAAM,CAAC;AACjC,eAAO,MAAM,UAAU,0BAA0B,CAAC;AAClD,eAAO,MAAM,aAAa,UAAU,CAAC;AACrC,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAChD,OAAO,CAAC,WAAW,CAAqB;gBAE5B,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;IAMlE;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAO;IAElD;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,kBAAkB;IAIpB,WAAW,CACf,MAAM,EAAE,MAAM,EAAE,EAChB,SAAS,GAAE,MAA2B,GACrC,OAAO,CAAC,YAAY,EAAE,CAAC;IAc1B;;;OAGG;YACW,oBAAoB;IAoBlC;;OAEG;YACW,iBAAiB;IA2C/B;;;OAGG;IACH,aAAa,IAAI,MAAM;IAIjB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAkCtD,iEAAiE;IACjE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAW;IAEpD,oCAAoC;IACpC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAU;YAErC,SAAS;IAsJvB,OAAO,CAAC,aAAa;CAetB;AAID,wBAAgB,kBAAkB,IAAI,oBAAoB,CAKzD"}
@@ -0,0 +1,280 @@
1
+ /**
2
+ * NomicEmbeddingClient - TypeScript bridge to python/embedding_worker.py
3
+ *
4
+ * CP-004: Local GPU inference ONLY - throws EmbeddingError on GPU unavailable.
5
+ * NO cloud fallback, NO CPU fallback. FAIL FAST with robust error logging.
6
+ *
7
+ * @module services/embedding/nomic
8
+ */
9
+ import { PythonShell } from 'python-shell';
10
+ import path from 'path';
11
+ import { fileURLToPath } from 'url';
12
+ import { state } from '../../server/state.js';
13
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
14
+ export class EmbeddingError extends Error {
15
+ code;
16
+ details;
17
+ constructor(message, code, details) {
18
+ super(message);
19
+ this.code = code;
20
+ this.details = details;
21
+ this.name = 'EmbeddingError';
22
+ Error.captureStackTrace?.(this, EmbeddingError);
23
+ }
24
+ }
25
+ export const EMBEDDING_DIM = 768;
26
+ export const MODEL_NAME = 'nomic-embed-text-v1.5';
27
+ export const MODEL_VERSION = '1.5.0';
28
+ export const DEFAULT_BATCH_SIZE = 64;
29
+ export class NomicEmbeddingClient {
30
+ workerPath;
31
+ pythonPath;
32
+ _lastDevice = 'unknown';
33
+ constructor(options) {
34
+ this.workerPath =
35
+ options?.workerPath ?? path.resolve(__dirname, '../../../python/embedding_worker.py');
36
+ this.pythonPath = options?.pythonPath;
37
+ }
38
+ /**
39
+ * Maximum chunks per Python worker call to prevent memory issues.
40
+ * Reduced from 500 to 100: XLSX audit trails produce 37K+ chunks,
41
+ * and 500 chunks at once causes CUDA driver-level OOM during tokenization
42
+ * (not caught by PyTorch's OOM recovery).
43
+ */
44
+ static MAX_CHUNKS_PER_CALL = 100;
45
+ /**
46
+ * DC-01: Read embedding_batch_size from server config if available,
47
+ * falling back to the caller-provided value or DEFAULT_BATCH_SIZE.
48
+ * DC-02: Read embedding_device from server config if available,
49
+ * falling back to the Python worker's auto-detection.
50
+ */
51
+ getEffectiveBatchSize(callerBatchSize) {
52
+ const configBatchSize = state.config?.embeddingBatchSize;
53
+ return configBatchSize && configBatchSize > 0 ? configBatchSize : callerBatchSize;
54
+ }
55
+ getEffectiveDevice() {
56
+ return state.config?.embeddingDevice || undefined;
57
+ }
58
+ async embedChunks(chunks, batchSize = DEFAULT_BATCH_SIZE) {
59
+ // Empty input returns empty output
60
+ if (chunks.length === 0) {
61
+ return [];
62
+ }
63
+ // For large chunk counts, process in sub-batches to prevent memory issues
64
+ if (chunks.length > NomicEmbeddingClient.MAX_CHUNKS_PER_CALL) {
65
+ return this.embedChunksInBatches(chunks, batchSize);
66
+ }
67
+ return this.embedChunksSingle(chunks, batchSize);
68
+ }
69
+ /**
70
+ * Process chunks in sub-batches, calling Python worker multiple times.
71
+ * Prevents memory exhaustion for large documents (1000+ chunks).
72
+ */
73
+ async embedChunksInBatches(chunks, batchSize) {
74
+ const allEmbeddings = [];
75
+ const maxPerCall = NomicEmbeddingClient.MAX_CHUNKS_PER_CALL;
76
+ for (let i = 0; i < chunks.length; i += maxPerCall) {
77
+ const batch = chunks.slice(i, i + maxPerCall);
78
+ const batchNum = Math.floor(i / maxPerCall) + 1;
79
+ const totalBatches = Math.ceil(chunks.length / maxPerCall);
80
+ console.error(`[EMBED] Processing batch ${batchNum}/${totalBatches} (${batch.length} chunks)`);
81
+ const embeddings = await this.embedChunksSingle(batch, batchSize);
82
+ allEmbeddings.push(...embeddings);
83
+ }
84
+ return allEmbeddings;
85
+ }
86
+ /**
87
+ * Embed a single batch of chunks via Python worker.
88
+ */
89
+ async embedChunksSingle(chunks, batchSize) {
90
+ // DC-01: Use config-aware batch size; DC-02: Use config-aware device
91
+ const effectiveBatchSize = this.getEffectiveBatchSize(batchSize);
92
+ const args = ['--stdin', '--batch-size', effectiveBatchSize.toString(), '--json'];
93
+ const device = this.getEffectiveDevice();
94
+ if (device) {
95
+ args.push('--device', device);
96
+ }
97
+ // Use stdin for reliability with special characters and large inputs
98
+ const result = await this.runWorker(args, JSON.stringify(chunks));
99
+ if (!result.success) {
100
+ throw new EmbeddingError(result.error ?? 'Embedding generation failed with no error message', this.classifyError(result.error), {
101
+ count: chunks.length,
102
+ batchSize,
103
+ device: result.device,
104
+ elapsed_ms: result.elapsed_ms,
105
+ });
106
+ }
107
+ // Validate output dimensions
108
+ for (let i = 0; i < result.embeddings.length; i++) {
109
+ if (result.embeddings[i].length !== EMBEDDING_DIM) {
110
+ throw new EmbeddingError(`Embedding ${i} has wrong dimensions: ${result.embeddings[i].length}, expected ${EMBEDDING_DIM}`, 'EMBEDDING_FAILED', { index: i, actualDim: result.embeddings[i].length });
111
+ }
112
+ }
113
+ // Track actual device used (from Python worker result)
114
+ this._lastDevice = result.device ?? 'unknown';
115
+ // Convert to Float32Array for efficient storage
116
+ return result.embeddings.map((e) => new Float32Array(e));
117
+ }
118
+ /**
119
+ * Get the device used by the last successful embedding operation.
120
+ * Populated by the Python worker result (e.g., 'cuda:0', 'cpu', 'mps').
121
+ */
122
+ getLastDevice() {
123
+ return this._lastDevice;
124
+ }
125
+ async embedQuery(query) {
126
+ if (!query || query.trim().length === 0) {
127
+ throw new EmbeddingError('Query cannot be empty', 'EMBEDDING_FAILED', { query });
128
+ }
129
+ // DC-02: Pass configured device to query embedding worker
130
+ const queryArgs = ['--query', query, '--json'];
131
+ const device = this.getEffectiveDevice();
132
+ if (device) {
133
+ queryArgs.push('--device', device);
134
+ }
135
+ const result = await this.runWorker(queryArgs);
136
+ if (!result.success) {
137
+ throw new EmbeddingError(result.error ?? 'Query embedding failed with no error message', this.classifyError(result.error), { query: query.substring(0, 100), device: result.device });
138
+ }
139
+ // Validate dimensions
140
+ if (result.embedding.length !== EMBEDDING_DIM) {
141
+ throw new EmbeddingError(`Query embedding has wrong dimensions: ${result.embedding.length}, expected ${EMBEDDING_DIM}`, 'EMBEDDING_FAILED', { actualDim: result.embedding.length });
142
+ }
143
+ return new Float32Array(result.embedding);
144
+ }
145
+ /** Embedding worker timeout: 5 minutes (CUDA hang protection) */
146
+ static WORKER_TIMEOUT_MS = 300_000;
147
+ /** Max stderr accumulation: 10KB */
148
+ static MAX_STDERR_LENGTH = 10_240;
149
+ async runWorker(args, stdin) {
150
+ return new Promise((resolve, reject) => {
151
+ let settled = false;
152
+ const options = {
153
+ mode: 'text',
154
+ pythonPath: this.pythonPath,
155
+ pythonOptions: ['-u'],
156
+ args,
157
+ };
158
+ const shell = new PythonShell(this.workerPath, options);
159
+ let stderr = '';
160
+ let sigkillTimer = null;
161
+ const cleanup = () => {
162
+ if (sigkillTimer) {
163
+ clearTimeout(sigkillTimer);
164
+ sigkillTimer = null;
165
+ }
166
+ };
167
+ // Timeout: kill the Python process if CUDA hangs
168
+ const timer = setTimeout(() => {
169
+ if (settled)
170
+ return;
171
+ try {
172
+ shell.kill();
173
+ }
174
+ catch (error) {
175
+ console.error('[NomicEmbedding] Failed to kill shell on timeout:', error instanceof Error ? error.message : String(error));
176
+ /* ignore */
177
+ }
178
+ // M-6: SIGKILL escalation if SIGTERM doesn't exit within 5s
179
+ sigkillTimer = setTimeout(() => {
180
+ if (!settled) {
181
+ console.error(`[NomicEmbedding] Process did not exit after SIGTERM, sending SIGKILL (pid: ${shell.childProcess?.pid})`);
182
+ try {
183
+ shell.childProcess?.kill('SIGKILL');
184
+ }
185
+ catch (error) {
186
+ console.error('[NomicEmbedding] Failed to SIGKILL process (may already be gone):', error instanceof Error ? error.message : String(error));
187
+ }
188
+ }
189
+ if (!settled) {
190
+ settled = true;
191
+ reject(new EmbeddingError(`Embedding worker timeout after ${NomicEmbeddingClient.WORKER_TIMEOUT_MS}ms (SIGKILL after 5s grace)`, 'WORKER_ERROR', { stderr: stderr.substring(0, 1000) }));
192
+ }
193
+ }, 5000);
194
+ }, NomicEmbeddingClient.WORKER_TIMEOUT_MS);
195
+ const outputChunks = [];
196
+ shell.on('message', (msg) => {
197
+ outputChunks.push(msg);
198
+ });
199
+ shell.on('stderr', (err) => {
200
+ // Cap stderr accumulation to prevent unbounded memory growth
201
+ if (stderr.length < NomicEmbeddingClient.MAX_STDERR_LENGTH) {
202
+ stderr += err + '\n';
203
+ }
204
+ });
205
+ const handleEnd = (err) => {
206
+ clearTimeout(timer);
207
+ cleanup();
208
+ if (settled)
209
+ return;
210
+ settled = true;
211
+ if (err) {
212
+ console.error('[EmbeddingWorker] Error:', err.message);
213
+ if (stderr)
214
+ console.error('[EmbeddingWorker] Stderr:', stderr.substring(0, 1000));
215
+ reject(new EmbeddingError(`Worker error: ${err.message}`, this.classifyError(stderr || err.message), { stderr: stderr.substring(0, 1000), stack: err.stack }));
216
+ return;
217
+ }
218
+ const output = outputChunks.join('\n');
219
+ if (!output.trim()) {
220
+ reject(new EmbeddingError('Worker produced no output', 'WORKER_ERROR', {
221
+ stderr: stderr.substring(0, 1000),
222
+ }));
223
+ return;
224
+ }
225
+ // Parse the last JSON line (torch/sentence_transformers may output non-JSON to stdout)
226
+ const lines = output.trim().split('\n');
227
+ let parsed;
228
+ for (let i = lines.length - 1; i >= 0; i--) {
229
+ try {
230
+ parsed = JSON.parse(lines[i].trim());
231
+ break;
232
+ }
233
+ catch (error) {
234
+ console.error('[NomicEmbedding] JSON parse failed for output line, trying previous:', error instanceof Error ? error.message : String(error));
235
+ /* not JSON, try previous line */
236
+ }
237
+ }
238
+ if (parsed !== undefined) {
239
+ // Basic structural validation: worker output must be an object or array
240
+ if (typeof parsed !== 'object' || parsed === null) {
241
+ reject(new EmbeddingError(`Worker returned unexpected type "${typeof parsed}" instead of object/array`, 'PARSE_ERROR', { output: output.substring(0, 1000) }));
242
+ return;
243
+ }
244
+ resolve(parsed);
245
+ }
246
+ else {
247
+ console.error('[EmbeddingWorker] Parse error: no valid JSON in output');
248
+ console.error('[EmbeddingWorker] Raw output:', output.substring(0, 500));
249
+ reject(new EmbeddingError('Failed to parse worker output as JSON', 'PARSE_ERROR', {
250
+ output: output.substring(0, 1000),
251
+ stderr: stderr.substring(0, 1000),
252
+ }));
253
+ }
254
+ };
255
+ if (stdin)
256
+ shell.send(stdin);
257
+ shell.end(handleEnd);
258
+ });
259
+ }
260
+ classifyError(error) {
261
+ if (!error)
262
+ return 'EMBEDDING_FAILED';
263
+ const lower = error.toLowerCase();
264
+ if (lower.includes('gpu') || lower.includes('cuda') || lower.includes('no device')) {
265
+ return 'GPU_NOT_AVAILABLE';
266
+ }
267
+ if (lower.includes('model not found') || lower.includes('no such file')) {
268
+ return 'MODEL_NOT_FOUND';
269
+ }
270
+ return 'EMBEDDING_FAILED';
271
+ }
272
+ }
273
+ let _client = null;
274
+ export function getEmbeddingClient() {
275
+ if (!_client) {
276
+ _client = new NomicEmbeddingClient();
277
+ }
278
+ return _client;
279
+ }
280
+ //# sourceMappingURL=nomic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nomic.js","sourceRoot":"","sources":["../../../src/services/embedding/nomic.ts"],"names":[],"mappings":"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"}