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,552 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ GPU Embedding Worker for OCR Provenance MCP System
4
+
5
+ Generates 768-dimensional embeddings using nomic-embed-text-v1.5.
6
+ Auto-detects best available device: CUDA > MPS > CPU.
7
+
8
+ CRITICAL CONSTRAINTS:
9
+ - CP-004: Local inference ONLY - NEVER fall back to cloud
10
+ - AP-008: NO Flash Attention
11
+ - Task prefixes: "search_document: " for chunks, "search_query: " for queries
12
+
13
+ Usage:
14
+ # Embed chunks (document mode)
15
+ python embedding_worker.py --chunks "text1" "text2" --json
16
+
17
+ # Embed query (search mode)
18
+ python embedding_worker.py --query "search text" --json
19
+
20
+ # From stdin (for large batches from TypeScript)
21
+ echo '["text1", "text2"]' | python embedding_worker.py --stdin --json
22
+ """
23
+
24
+ from __future__ import annotations
25
+
26
+ import argparse
27
+ import json
28
+ import logging
29
+ import os
30
+ import sys
31
+ import time
32
+ from dataclasses import asdict, dataclass
33
+ from pathlib import Path
34
+
35
+ import numpy as np
36
+ import torch
37
+ from sentence_transformers import SentenceTransformer
38
+
39
+ try:
40
+ # When run as a script from python/ directory
41
+ from gpu_utils import EmbeddingModelError, GPUNotAvailableError, GPUOutOfMemoryError
42
+ except ImportError:
43
+ # When imported as part of python package
44
+ from .gpu_utils import EmbeddingModelError, GPUNotAvailableError, GPUOutOfMemoryError
45
+
46
+ # Configure logging
47
+ logging.basicConfig(
48
+ level=logging.INFO,
49
+ format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
50
+ stream=sys.stderr,
51
+ )
52
+ logger = logging.getLogger(__name__)
53
+
54
+
55
+ # =============================================================================
56
+ # Constants - DO NOT CHANGE
57
+ # =============================================================================
58
+
59
+ def _resolve_model_path() -> Path:
60
+ """Resolve embedding model path from env var or default locations."""
61
+ env_path = os.environ.get("EMBEDDING_MODEL_PATH")
62
+ if env_path:
63
+ return Path(env_path)
64
+ # Default: package-relative (works for dev and global npm install)
65
+ pkg_path = Path(__file__).resolve().parent.parent / "models" / "nomic-embed-text-v1.5"
66
+ if pkg_path.exists():
67
+ return pkg_path
68
+ # Fallback: user home directory
69
+ return Path.home() / ".ocr-provenance" / "models" / "nomic-embed-text-v1.5"
70
+
71
+ MODEL_PATH = _resolve_model_path()
72
+ EMBEDDING_DIM = 768
73
+ MODEL_NAME = "nomic-embed-text-v1.5"
74
+ MODEL_VERSION = "1.5.0"
75
+
76
+ # Task prefixes - REQUIRED by nomic model
77
+ PREFIX_DOCUMENT = "search_document: "
78
+ PREFIX_QUERY = "search_query: "
79
+
80
+ # Batch configuration
81
+ DEFAULT_BATCH_SIZE = 512
82
+ MIN_BATCH_SIZE = 1 # Must support single-item batches for VLM descriptions
83
+
84
+ # Device configuration
85
+ DEFAULT_DEVICE = "auto"
86
+
87
+
88
+ # =============================================================================
89
+ # Data Classes - MUST match TypeScript interfaces
90
+ # =============================================================================
91
+
92
+
93
+ @dataclass
94
+ class EmbeddingResult:
95
+ """
96
+ Result from batch embedding generation.
97
+ MUST match src/models/embedding.ts EmbeddingGenerationResult
98
+ """
99
+
100
+ success: bool
101
+ embeddings: list[list[float]] # (n, 768) as nested list for JSON
102
+ count: int
103
+ elapsed_ms: float
104
+ ms_per_chunk: float
105
+ device: str
106
+ batch_size: int
107
+ model: str = MODEL_NAME
108
+ model_version: str = MODEL_VERSION
109
+ vram_used_gb: float = 0.0
110
+ error: str | None = None
111
+
112
+
113
+ @dataclass
114
+ class QueryEmbeddingResult:
115
+ """Result from single query embedding."""
116
+
117
+ success: bool
118
+ embedding: list[float] # (768,) as list for JSON
119
+ elapsed_ms: float
120
+ device: str
121
+ model: str = MODEL_NAME
122
+ error: str | None = None
123
+
124
+
125
+ # =============================================================================
126
+ # Global Model Singleton
127
+ # =============================================================================
128
+
129
+ _model: SentenceTransformer | None = None
130
+ _device: str | None = None
131
+
132
+
133
+ # =============================================================================
134
+ # Core Functions
135
+ # =============================================================================
136
+
137
+
138
+ def resolve_device(requested: str = DEFAULT_DEVICE) -> str:
139
+ """
140
+ Resolve the best available compute device.
141
+
142
+ Priority: CUDA > MPS (Apple Silicon) > CPU.
143
+ If a specific device is requested and available, use it.
144
+ If 'auto', detect the best available.
145
+
146
+ Args:
147
+ requested: Requested device string ('auto', 'cuda', 'cuda:0', 'mps', 'cpu')
148
+
149
+ Returns:
150
+ Resolved device string (e.g., 'cuda:0', 'mps', 'cpu')
151
+ """
152
+ if requested == "auto":
153
+ if torch.cuda.is_available():
154
+ device = "cuda:0"
155
+ logger.info("Auto-detected device: %s (%s)", device, torch.cuda.get_device_name(0))
156
+ return device
157
+ if hasattr(torch.backends, "mps") and torch.backends.mps.is_available():
158
+ logger.info("Auto-detected device: mps (Apple Silicon)")
159
+ return "mps"
160
+ logger.info("Auto-detected device: cpu (no GPU available)")
161
+ return "cpu"
162
+
163
+ # Specific CUDA device requested
164
+ if requested.startswith("cuda"):
165
+ if torch.cuda.is_available():
166
+ return requested
167
+ logger.warning("Requested %s but CUDA unavailable, falling back to auto-detect", requested)
168
+ return resolve_device("auto")
169
+
170
+ # MPS requested
171
+ if requested == "mps":
172
+ if hasattr(torch.backends, "mps") and torch.backends.mps.is_available():
173
+ return "mps"
174
+ logger.warning("Requested mps but MPS unavailable, falling back to auto-detect")
175
+ return resolve_device("auto")
176
+
177
+ # CPU or unknown - use as-is
178
+ return requested
179
+
180
+
181
+ def load_model(device: str = DEFAULT_DEVICE) -> SentenceTransformer:
182
+ """
183
+ Load nomic-embed-text-v1.5 to the best available device.
184
+
185
+ Auto-detects device when 'auto' is specified: CUDA > MPS > CPU.
186
+
187
+ Args:
188
+ device: Device string ('auto', 'cuda:0', 'mps', 'cpu')
189
+
190
+ Returns:
191
+ Loaded SentenceTransformer model
192
+
193
+ Raises:
194
+ EmbeddingModelError: Model not found or failed to load
195
+ """
196
+ global _model, _device
197
+
198
+ # Resolve 'auto' to actual device
199
+ device = resolve_device(device)
200
+
201
+ # Return cached model if same device
202
+ if _model is not None and _device == device:
203
+ return _model
204
+
205
+ logger.info("Loading embedding model to %s...", device)
206
+
207
+ if not MODEL_PATH.exists():
208
+ raise EmbeddingModelError(
209
+ f"Model not found at {MODEL_PATH}. Download with: "
210
+ "huggingface-cli download nomic-ai/nomic-embed-text-v1.5 "
211
+ "--local-dir models/nomic-embed-text-v1.5",
212
+ model_path=str(MODEL_PATH),
213
+ )
214
+
215
+ # Check required files
216
+ required = ["config.json", "model.safetensors", "tokenizer.json"]
217
+ missing = [f for f in required if not (MODEL_PATH / f).exists()]
218
+ if missing:
219
+ raise EmbeddingModelError(f"Missing model files: {missing}", model_path=str(MODEL_PATH))
220
+
221
+ try:
222
+ # Load model - trust_remote_code required for NomicBertModel
223
+ _model = SentenceTransformer(str(MODEL_PATH), device=device, trust_remote_code=True)
224
+ _device = device
225
+
226
+ # Verify dimensions
227
+ dim = _model.get_sentence_embedding_dimension()
228
+ if dim != EMBEDDING_DIM:
229
+ raise EmbeddingModelError(
230
+ f"Wrong embedding dimension: {dim}, expected {EMBEDDING_DIM}",
231
+ model_path=str(MODEL_PATH),
232
+ )
233
+
234
+ logger.info("Model loaded: %s, dim=%d, device=%s", MODEL_NAME, EMBEDDING_DIM, device)
235
+ return _model
236
+
237
+ except (GPUNotAvailableError, EmbeddingModelError):
238
+ raise
239
+ except Exception as e:
240
+ raise EmbeddingModelError(
241
+ f"Failed to load model: {e}", model_path=str(MODEL_PATH), cause=e
242
+ ) from e
243
+
244
+
245
+ def embed_chunks(
246
+ chunks: list[str], batch_size: int = DEFAULT_BATCH_SIZE, device: str = DEFAULT_DEVICE
247
+ ) -> np.ndarray:
248
+ """
249
+ Embed document chunks with "search_document: " prefix.
250
+
251
+ Args:
252
+ chunks: Text chunks to embed
253
+ batch_size: GPU batch size (default 512)
254
+ device: CUDA device
255
+
256
+ Returns:
257
+ np.ndarray of shape (n_chunks, 768), dtype float32
258
+
259
+ Raises:
260
+ GPUNotAvailableError: No GPU
261
+ EmbeddingModelError: Model error
262
+ """
263
+ if not chunks:
264
+ return np.zeros((0, EMBEDDING_DIM), dtype=np.float32)
265
+
266
+ model = load_model(device)
267
+ resolved = resolve_device(device)
268
+
269
+ # Add task prefix - REQUIRED by nomic model
270
+ prefixed = [f"{PREFIX_DOCUMENT}{chunk}" for chunk in chunks]
271
+
272
+ # Generate embeddings
273
+ embeddings = model.encode(
274
+ prefixed,
275
+ batch_size=batch_size,
276
+ convert_to_numpy=True,
277
+ normalize_embeddings=True, # L2 normalize for cosine similarity
278
+ show_progress_bar=False,
279
+ device=resolved,
280
+ )
281
+
282
+ return embeddings.astype(np.float32)
283
+
284
+
285
+ def embed_query(query: str, device: str = DEFAULT_DEVICE) -> np.ndarray:
286
+ """
287
+ Embed search query with "search_query: " prefix.
288
+
289
+ Args:
290
+ query: Search query text
291
+ device: Device string ('auto', 'cuda:0', 'mps', 'cpu')
292
+
293
+ Returns:
294
+ np.ndarray of shape (768,), dtype float32
295
+ """
296
+ model = load_model(device)
297
+ resolved = resolve_device(device)
298
+
299
+ # Add query task prefix
300
+ prefixed = f"{PREFIX_QUERY}{query}"
301
+
302
+ embedding = model.encode(
303
+ [prefixed],
304
+ convert_to_numpy=True,
305
+ normalize_embeddings=True,
306
+ show_progress_bar=False,
307
+ device=resolved,
308
+ )
309
+
310
+ return embedding[0].astype(np.float32)
311
+
312
+
313
+ def embed_with_oom_recovery(
314
+ chunks: list[str],
315
+ initial_batch_size: int = DEFAULT_BATCH_SIZE,
316
+ device: str = DEFAULT_DEVICE,
317
+ ) -> tuple[np.ndarray, int]:
318
+ """
319
+ Embed with automatic OOM recovery via batch size reduction.
320
+
321
+ Halves batch size on OOM until MIN_BATCH_SIZE.
322
+
323
+ Args:
324
+ chunks: Text chunks to embed
325
+ initial_batch_size: Starting batch size
326
+ device: CUDA device
327
+
328
+ Returns:
329
+ Tuple of (embeddings, final_batch_size)
330
+
331
+ Raises:
332
+ GPUOutOfMemoryError: OOM at minimum batch size
333
+ """
334
+ batch_size = initial_batch_size
335
+ is_cuda = resolve_device(device).startswith("cuda")
336
+
337
+ while batch_size >= MIN_BATCH_SIZE:
338
+ try:
339
+ if is_cuda:
340
+ torch.cuda.empty_cache()
341
+ embeddings = embed_chunks(chunks, batch_size, device)
342
+ return embeddings, batch_size
343
+ except (torch.cuda.OutOfMemoryError, MemoryError, RuntimeError) as e:
344
+ if isinstance(e, RuntimeError) and "out of memory" not in str(e).lower():
345
+ raise
346
+ if is_cuda:
347
+ torch.cuda.empty_cache()
348
+ batch_size //= 2
349
+ if batch_size >= MIN_BATCH_SIZE:
350
+ logger.warning("OOM: Reducing batch size to %d", batch_size)
351
+
352
+ raise GPUOutOfMemoryError(
353
+ f"OOM with {len(chunks)} chunks on {device}. "
354
+ f"Tried batch sizes {initial_batch_size} down to {MIN_BATCH_SIZE}.",
355
+ vram_required=None,
356
+ vram_available=None,
357
+ )
358
+
359
+
360
+ def generate_embeddings(
361
+ chunks: list[str],
362
+ batch_size: int = DEFAULT_BATCH_SIZE,
363
+ device: str = DEFAULT_DEVICE,
364
+ ) -> EmbeddingResult:
365
+ """
366
+ Generate embeddings with full metrics for TypeScript bridge.
367
+
368
+ This is the main entry point for batch embedding.
369
+
370
+ Args:
371
+ chunks: Text chunks to embed
372
+ batch_size: Initial batch size
373
+ device: CUDA device
374
+
375
+ Returns:
376
+ EmbeddingResult with embeddings and metrics
377
+ """
378
+ start_time = time.perf_counter()
379
+ resolved_device = resolve_device(device)
380
+ is_cuda = resolved_device.startswith("cuda")
381
+
382
+ # Reset VRAM tracking (CUDA only)
383
+ if is_cuda:
384
+ torch.cuda.reset_peak_memory_stats()
385
+
386
+ try:
387
+ embeddings_np, final_batch_size = embed_with_oom_recovery(chunks, batch_size, device)
388
+
389
+ elapsed_ms = (time.perf_counter() - start_time) * 1000
390
+ ms_per_chunk = elapsed_ms / len(chunks) if chunks else 0
391
+ vram_gb = torch.cuda.max_memory_allocated() / (1024**3) if is_cuda else 0.0
392
+
393
+ # H-8: Convert to list and delete numpy array to avoid ~7x memory overlap
394
+ # (numpy float32 ~1.5MB vs Python float64 list ~10.7MB for 500x768)
395
+ embeddings_list = embeddings_np.tolist()
396
+ del embeddings_np
397
+
398
+ return EmbeddingResult(
399
+ success=True,
400
+ embeddings=embeddings_list,
401
+ count=len(chunks),
402
+ elapsed_ms=round(elapsed_ms, 2),
403
+ ms_per_chunk=round(ms_per_chunk, 4),
404
+ device=resolved_device,
405
+ batch_size=final_batch_size,
406
+ vram_used_gb=round(vram_gb, 3),
407
+ error=None,
408
+ )
409
+
410
+ except Exception as e:
411
+ elapsed_ms = (time.perf_counter() - start_time) * 1000
412
+ logger.error("Embedding generation failed: %s", e)
413
+ return EmbeddingResult(
414
+ success=False,
415
+ embeddings=[],
416
+ count=0,
417
+ elapsed_ms=round(elapsed_ms, 2),
418
+ ms_per_chunk=0,
419
+ device=resolved_device,
420
+ batch_size=batch_size,
421
+ error=str(e),
422
+ )
423
+
424
+
425
+ def generate_query_embedding(query: str, device: str = DEFAULT_DEVICE) -> QueryEmbeddingResult:
426
+ """
427
+ Generate query embedding with metrics.
428
+
429
+ Args:
430
+ query: Search query text
431
+ device: CUDA device
432
+
433
+ Returns:
434
+ QueryEmbeddingResult with embedding and metrics
435
+ """
436
+ start_time = time.perf_counter()
437
+ resolved_device = resolve_device(device)
438
+
439
+ try:
440
+ embedding = embed_query(query, device)
441
+ elapsed_ms = (time.perf_counter() - start_time) * 1000
442
+
443
+ return QueryEmbeddingResult(
444
+ success=True,
445
+ embedding=embedding.tolist(),
446
+ elapsed_ms=round(elapsed_ms, 2),
447
+ device=resolved_device,
448
+ error=None,
449
+ )
450
+
451
+ except Exception as e:
452
+ elapsed_ms = (time.perf_counter() - start_time) * 1000
453
+ logger.error("Query embedding failed: %s", e)
454
+ return QueryEmbeddingResult(
455
+ success=False,
456
+ embedding=[],
457
+ elapsed_ms=round(elapsed_ms, 2),
458
+ device=resolved_device,
459
+ error=str(e),
460
+ )
461
+
462
+
463
+ # =============================================================================
464
+ # CLI Entry Point
465
+ # =============================================================================
466
+
467
+
468
+ def main() -> None:
469
+ """CLI entry point for embedding worker."""
470
+ parser = argparse.ArgumentParser(
471
+ description="GPU Embedding Worker - nomic-embed-text-v1.5",
472
+ formatter_class=argparse.RawDescriptionHelpFormatter,
473
+ epilog="""
474
+ Examples:
475
+ python embedding_worker.py --chunks "text1" "text2" --json
476
+ python embedding_worker.py --query "search text" --json
477
+ echo '["text1", "text2"]' | python embedding_worker.py --stdin --json
478
+ """,
479
+ )
480
+
481
+ # Input modes (mutually exclusive)
482
+ input_group = parser.add_mutually_exclusive_group(required=True)
483
+ input_group.add_argument("--chunks", nargs="+", help="Texts to embed")
484
+ input_group.add_argument("--query", help="Search query to embed")
485
+ input_group.add_argument("--stdin", action="store_true", help="Read JSON array from stdin")
486
+
487
+ # Configuration
488
+ parser.add_argument(
489
+ "--batch-size", type=int, default=DEFAULT_BATCH_SIZE, help="Batch size for GPU"
490
+ )
491
+ parser.add_argument("--device", default=DEFAULT_DEVICE, help="CUDA device")
492
+ parser.add_argument("--model-path", help="Path to embedding model directory")
493
+ parser.add_argument("--json", action="store_true", help="JSON output for TypeScript bridge")
494
+
495
+ args = parser.parse_args()
496
+
497
+ # Override model path if specified via CLI
498
+ if args.model_path:
499
+ global MODEL_PATH
500
+ MODEL_PATH = Path(args.model_path)
501
+
502
+ try:
503
+ if args.query:
504
+ # Query mode
505
+ result = generate_query_embedding(args.query, args.device)
506
+
507
+ else:
508
+ # Chunk mode
509
+ if args.stdin:
510
+ chunks = json.load(sys.stdin)
511
+ if not isinstance(chunks, list):
512
+ raise ValueError("stdin must be a JSON array of strings")
513
+ else:
514
+ chunks = args.chunks
515
+
516
+ result = generate_embeddings(chunks, args.batch_size, args.device)
517
+
518
+ if args.json:
519
+ print(json.dumps(asdict(result)))
520
+ else:
521
+ # Human readable output
522
+ if isinstance(result, EmbeddingResult):
523
+ if result.success:
524
+ throughput = 1000 / result.ms_per_chunk if result.ms_per_chunk > 0 else 0
525
+ print(f"Embedded {result.count} chunks in {result.elapsed_ms}ms")
526
+ print(f"Throughput: {throughput:.0f} chunks/sec")
527
+ print(f"VRAM used: {result.vram_used_gb:.3f} GB")
528
+ else:
529
+ print(f"ERROR: {result.error}", file=sys.stderr)
530
+ sys.exit(1)
531
+ else:
532
+ if result.success:
533
+ print(f"Query embedded in {result.elapsed_ms}ms")
534
+ else:
535
+ print(f"ERROR: {result.error}", file=sys.stderr)
536
+ sys.exit(1)
537
+
538
+ except Exception as e:
539
+ error_result = {
540
+ "success": False,
541
+ "error": str(e),
542
+ "error_type": type(e).__name__,
543
+ }
544
+ if args.json:
545
+ print(json.dumps(error_result))
546
+ else:
547
+ print(f"ERROR: {e}", file=sys.stderr)
548
+ sys.exit(1)
549
+
550
+
551
+ if __name__ == "__main__":
552
+ main()