@atomicmemory/core 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.
Files changed (589) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/LICENSE +201 -0
  3. package/README.md +314 -0
  4. package/dist/app/bind-ephemeral.d.ts +18 -0
  5. package/dist/app/bind-ephemeral.js +22 -0
  6. package/dist/app/cors-headers.d.ts +12 -0
  7. package/dist/app/cors-headers.js +18 -0
  8. package/dist/app/create-app.d.ts +25 -0
  9. package/dist/app/create-app.js +156 -0
  10. package/dist/app/runtime-config-route-snapshot.d.ts +27 -0
  11. package/dist/app/runtime-config-route-snapshot.js +27 -0
  12. package/dist/app/runtime-container.d.ts +281 -0
  13. package/dist/app/runtime-container.js +297 -0
  14. package/dist/app/startup-checks.d.ts +28 -0
  15. package/dist/app/startup-checks.js +45 -0
  16. package/dist/bin.d.ts +17 -0
  17. package/dist/bin.js +128 -0
  18. package/dist/config.d.ts +680 -0
  19. package/dist/config.js +808 -0
  20. package/dist/db/agent-trust-repository.d.ts +49 -0
  21. package/dist/db/agent-trust-repository.js +66 -0
  22. package/dist/db/belief-edges-repository.d.ts +68 -0
  23. package/dist/db/belief-edges-repository.js +124 -0
  24. package/dist/db/claim-repository.d.ts +6 -0
  25. package/dist/db/claim-repository.js +4 -0
  26. package/dist/db/contradictions-repository.d.ts +56 -0
  27. package/dist/db/contradictions-repository.js +88 -0
  28. package/dist/db/document-chunk-repository.d.ts +48 -0
  29. package/dist/db/document-chunk-repository.js +145 -0
  30. package/dist/db/document-chunk-types.d.ts +35 -0
  31. package/dist/db/document-chunk-types.js +9 -0
  32. package/dist/db/document-list-cursor.d.ts +45 -0
  33. package/dist/db/document-list-cursor.js +111 -0
  34. package/dist/db/document-list-repository.d.ts +103 -0
  35. package/dist/db/document-list-repository.js +204 -0
  36. package/dist/db/entity-cards-repository.d.ts +37 -0
  37. package/dist/db/entity-cards-repository.js +46 -0
  38. package/dist/db/entity-values-repository.d.ts +26 -0
  39. package/dist/db/entity-values-repository.js +57 -0
  40. package/dist/db/link-repository.d.ts +30 -0
  41. package/dist/db/link-repository.js +54 -0
  42. package/dist/db/memory-repository.d.ts +163 -0
  43. package/dist/db/memory-repository.js +232 -0
  44. package/dist/db/migrate.d.ts +6 -0
  45. package/dist/db/migrate.js +36 -0
  46. package/dist/db/mmr.d.ts +14 -0
  47. package/dist/db/mmr.js +57 -0
  48. package/dist/db/passport-feed-repository.d.ts +91 -0
  49. package/dist/db/passport-feed-repository.js +198 -0
  50. package/dist/db/pg-episode-store.d.ts +19 -0
  51. package/dist/db/pg-episode-store.js +17 -0
  52. package/dist/db/pg-link-store.d.ts +17 -0
  53. package/dist/db/pg-link-store.js +14 -0
  54. package/dist/db/pg-memory-store.d.ts +68 -0
  55. package/dist/db/pg-memory-store.js +53 -0
  56. package/dist/db/pg-recap-store.d.ts +13 -0
  57. package/dist/db/pg-recap-store.js +19 -0
  58. package/dist/db/pg-representation-store.d.ts +17 -0
  59. package/dist/db/pg-representation-store.js +17 -0
  60. package/dist/db/pg-search-store.d.ts +29 -0
  61. package/dist/db/pg-search-store.js +47 -0
  62. package/dist/db/pool.d.ts +5 -0
  63. package/dist/db/pool.js +21 -0
  64. package/dist/db/ppr.d.ts +56 -0
  65. package/dist/db/ppr.js +178 -0
  66. package/dist/db/query-helpers.d.ts +44 -0
  67. package/dist/db/query-helpers.js +60 -0
  68. package/dist/db/raw-doc-artifact-sync.d.ts +128 -0
  69. package/dist/db/raw-doc-artifact-sync.js +259 -0
  70. package/dist/db/raw-document-blob-repository.d.ts +148 -0
  71. package/dist/db/raw-document-blob-repository.js +300 -0
  72. package/dist/db/raw-document-repository.d.ts +104 -0
  73. package/dist/db/raw-document-repository.js +410 -0
  74. package/dist/db/raw-document-status-repository.d.ts +122 -0
  75. package/dist/db/raw-document-status-repository.js +183 -0
  76. package/dist/db/raw-document-types.d.ts +236 -0
  77. package/dist/db/raw-document-types.js +10 -0
  78. package/dist/db/raw-storage-reconciliation-repository.d.ts +110 -0
  79. package/dist/db/raw-storage-reconciliation-repository.js +200 -0
  80. package/dist/db/reflection-jobs-repository.d.ts +33 -0
  81. package/dist/db/reflection-jobs-repository.js +48 -0
  82. package/dist/db/reflections-repository.d.ts +41 -0
  83. package/dist/db/reflections-repository.js +83 -0
  84. package/dist/db/repository-claims.d.ts +141 -0
  85. package/dist/db/repository-claims.js +376 -0
  86. package/dist/db/repository-deferred-audn.d.ts +33 -0
  87. package/dist/db/repository-deferred-audn.js +69 -0
  88. package/dist/db/repository-document-delete.d.ts +53 -0
  89. package/dist/db/repository-document-delete.js +156 -0
  90. package/dist/db/repository-entities.d.ts +114 -0
  91. package/dist/db/repository-entities.js +317 -0
  92. package/dist/db/repository-entity-attributes.d.ts +41 -0
  93. package/dist/db/repository-entity-attributes.js +65 -0
  94. package/dist/db/repository-entity-graph.d.ts +32 -0
  95. package/dist/db/repository-entity-graph.js +87 -0
  96. package/dist/db/repository-first-mentions.d.ts +41 -0
  97. package/dist/db/repository-first-mentions.js +79 -0
  98. package/dist/db/repository-lessons.d.ts +51 -0
  99. package/dist/db/repository-lessons.js +90 -0
  100. package/dist/db/repository-links.d.ts +26 -0
  101. package/dist/db/repository-links.js +105 -0
  102. package/dist/db/repository-observation.d.ts +26 -0
  103. package/dist/db/repository-observation.js +51 -0
  104. package/dist/db/repository-read.d.ts +56 -0
  105. package/dist/db/repository-read.js +271 -0
  106. package/dist/db/repository-recaps.d.ts +59 -0
  107. package/dist/db/repository-recaps.js +158 -0
  108. package/dist/db/repository-representations.d.ts +48 -0
  109. package/dist/db/repository-representations.js +162 -0
  110. package/dist/db/repository-temporal-state.d.ts +35 -0
  111. package/dist/db/repository-temporal-state.js +46 -0
  112. package/dist/db/repository-tll.d.ts +88 -0
  113. package/dist/db/repository-tll.js +179 -0
  114. package/dist/db/repository-types.d.ts +313 -0
  115. package/dist/db/repository-types.js +142 -0
  116. package/dist/db/repository-user-profiles.d.ts +17 -0
  117. package/dist/db/repository-user-profiles.js +28 -0
  118. package/dist/db/repository-vector-search.d.ts +33 -0
  119. package/dist/db/repository-vector-search.js +373 -0
  120. package/dist/db/repository-wipe.d.ts +34 -0
  121. package/dist/db/repository-wipe.js +94 -0
  122. package/dist/db/repository-write.d.ts +61 -0
  123. package/dist/db/repository-write.js +279 -0
  124. package/dist/db/schema.sql +1355 -0
  125. package/dist/db/storage-artifact-delete-tx.d.ts +56 -0
  126. package/dist/db/storage-artifact-delete-tx.js +123 -0
  127. package/dist/db/storage-artifact-providers.d.ts +21 -0
  128. package/dist/db/storage-artifact-providers.js +21 -0
  129. package/dist/db/storage-artifact-recovery-repository.d.ts +66 -0
  130. package/dist/db/storage-artifact-recovery-repository.js +58 -0
  131. package/dist/db/storage-artifact-repository.d.ts +329 -0
  132. package/dist/db/storage-artifact-repository.js +497 -0
  133. package/dist/db/stores.d.ts +220 -0
  134. package/dist/db/stores.js +12 -0
  135. package/dist/db/summaries-repository.d.ts +74 -0
  136. package/dist/db/summaries-repository.js +125 -0
  137. package/dist/eval/beam-10m-loader.d.ts +98 -0
  138. package/dist/eval/beam-10m-loader.js +128 -0
  139. package/dist/index.d.ts +18 -0
  140. package/dist/index.js +17 -0
  141. package/dist/middleware/require-bearer.d.ts +27 -0
  142. package/dist/middleware/require-bearer.js +60 -0
  143. package/dist/middleware/validate-response.d.ts +33 -0
  144. package/dist/middleware/validate-response.js +55 -0
  145. package/dist/middleware/validate.d.ts +43 -0
  146. package/dist/middleware/validate.js +85 -0
  147. package/dist/routes/agents.d.ts +13 -0
  148. package/dist/routes/agents.js +89 -0
  149. package/dist/routes/document-response-formatters.d.ts +98 -0
  150. package/dist/routes/document-response-formatters.js +243 -0
  151. package/dist/routes/documents.d.ts +74 -0
  152. package/dist/routes/documents.js +425 -0
  153. package/dist/routes/memories.d.ts +29 -0
  154. package/dist/routes/memories.js +725 -0
  155. package/dist/routes/memory-response-formatters.d.ts +179 -0
  156. package/dist/routes/memory-response-formatters.js +210 -0
  157. package/dist/routes/public-raw-storage-metadata.d.ts +54 -0
  158. package/dist/routes/public-raw-storage-metadata.js +56 -0
  159. package/dist/routes/reflect.d.ts +14 -0
  160. package/dist/routes/reflect.js +19 -0
  161. package/dist/routes/response-schema-map.d.ts +14 -0
  162. package/dist/routes/response-schema-map.js +69 -0
  163. package/dist/routes/route-errors.d.ts +12 -0
  164. package/dist/routes/route-errors.js +30 -0
  165. package/dist/routes/storage-error-handlers.d.ts +34 -0
  166. package/dist/routes/storage-error-handlers.js +185 -0
  167. package/dist/routes/storage-response-formatters.d.ts +44 -0
  168. package/dist/routes/storage-response-formatters.js +155 -0
  169. package/dist/routes/storage.d.ts +38 -0
  170. package/dist/routes/storage.js +369 -0
  171. package/dist/routes/upstream-provider-errors.d.ts +19 -0
  172. package/dist/routes/upstream-provider-errors.js +95 -0
  173. package/dist/schemas/agents.d.ts +79 -0
  174. package/dist/schemas/agents.js +126 -0
  175. package/dist/schemas/common.d.ts +110 -0
  176. package/dist/schemas/common.js +190 -0
  177. package/dist/schemas/document-list-responses.d.ts +102 -0
  178. package/dist/schemas/document-list-responses.js +87 -0
  179. package/dist/schemas/document-list-schemas.d.ts +123 -0
  180. package/dist/schemas/document-list-schemas.js +174 -0
  181. package/dist/schemas/document-response-schemas.d.ts +610 -0
  182. package/dist/schemas/document-response-schemas.js +264 -0
  183. package/dist/schemas/document-status-envelope.d.ts +48 -0
  184. package/dist/schemas/document-status-envelope.js +54 -0
  185. package/dist/schemas/documents.d.ts +292 -0
  186. package/dist/schemas/documents.js +449 -0
  187. package/dist/schemas/errors.d.ts +75 -0
  188. package/dist/schemas/errors.js +105 -0
  189. package/dist/schemas/memories.d.ts +378 -0
  190. package/dist/schemas/memories.js +542 -0
  191. package/dist/schemas/openapi.d.ts +24 -0
  192. package/dist/schemas/openapi.js +1038 -0
  193. package/dist/schemas/response-scalars.d.ts +10 -0
  194. package/dist/schemas/response-scalars.js +10 -0
  195. package/dist/schemas/responses.d.ts +536 -0
  196. package/dist/schemas/responses.js +350 -0
  197. package/dist/schemas/search-response-parts.d.ts +97 -0
  198. package/dist/schemas/search-response-parts.js +103 -0
  199. package/dist/schemas/storage-schemas.d.ts +175 -0
  200. package/dist/schemas/storage-schemas.js +277 -0
  201. package/dist/schemas/zod-setup.d.ts +15 -0
  202. package/dist/schemas/zod-setup.js +17 -0
  203. package/dist/server.d.ts +13 -0
  204. package/dist/server.js +57 -0
  205. package/dist/services/abstract-query-policy.d.ts +13 -0
  206. package/dist/services/abstract-query-policy.js +50 -0
  207. package/dist/services/affinity-clustering.d.ts +66 -0
  208. package/dist/services/affinity-clustering.js +125 -0
  209. package/dist/services/agentic-retrieval.d.ts +38 -0
  210. package/dist/services/agentic-retrieval.js +126 -0
  211. package/dist/services/answer-format.d.ts +56 -0
  212. package/dist/services/answer-format.js +118 -0
  213. package/dist/services/answer-rescue.d.ts +72 -0
  214. package/dist/services/answer-rescue.js +177 -0
  215. package/dist/services/answer-verifier.d.ts +24 -0
  216. package/dist/services/answer-verifier.js +73 -0
  217. package/dist/services/api-retry.d.ts +6 -0
  218. package/dist/services/api-retry.js +41 -0
  219. package/dist/services/assistant-turn-filter.d.ts +20 -0
  220. package/dist/services/assistant-turn-filter.js +69 -0
  221. package/dist/services/atomicmem-uri.d.ts +33 -0
  222. package/dist/services/atomicmem-uri.js +86 -0
  223. package/dist/services/audit-events.d.ts +54 -0
  224. package/dist/services/audit-events.js +56 -0
  225. package/dist/services/chunked-extraction.d.ts +21 -0
  226. package/dist/services/chunked-extraction.js +108 -0
  227. package/dist/services/claim-slotting.d.ts +27 -0
  228. package/dist/services/claim-slotting.js +38 -0
  229. package/dist/services/claude-code-llm.d.ts +19 -0
  230. package/dist/services/claude-code-llm.js +96 -0
  231. package/dist/services/composite-dedup.d.ts +50 -0
  232. package/dist/services/composite-dedup.js +153 -0
  233. package/dist/services/composite-grouping.d.ts +41 -0
  234. package/dist/services/composite-grouping.js +111 -0
  235. package/dist/services/composite-staleness.d.ts +20 -0
  236. package/dist/services/composite-staleness.js +50 -0
  237. package/dist/services/conciseness-preference.d.ts +14 -0
  238. package/dist/services/conciseness-preference.js +42 -0
  239. package/dist/services/conflict-policy.d.ts +20 -0
  240. package/dist/services/conflict-policy.js +335 -0
  241. package/dist/services/consensus-extraction.d.ts +39 -0
  242. package/dist/services/consensus-extraction.js +147 -0
  243. package/dist/services/consensus-validation.d.ts +52 -0
  244. package/dist/services/consensus-validation.js +206 -0
  245. package/dist/services/consolidation-service.d.ts +60 -0
  246. package/dist/services/consolidation-service.js +171 -0
  247. package/dist/services/content-detection.d.ts +18 -0
  248. package/dist/services/content-detection.js +25 -0
  249. package/dist/services/contradiction-surfacing.d.ts +62 -0
  250. package/dist/services/contradiction-surfacing.js +111 -0
  251. package/dist/services/cost-telemetry.d.ts +39 -0
  252. package/dist/services/cost-telemetry.js +58 -0
  253. package/dist/services/counter-evidence.d.ts +34 -0
  254. package/dist/services/counter-evidence.js +92 -0
  255. package/dist/services/current-state-ranking.d.ts +21 -0
  256. package/dist/services/current-state-ranking.js +152 -0
  257. package/dist/services/deferred-audn.d.ts +47 -0
  258. package/dist/services/deferred-audn.js +162 -0
  259. package/dist/services/document-chunker.d.ts +50 -0
  260. package/dist/services/document-chunker.js +153 -0
  261. package/dist/services/document-failure-markers.d.ts +91 -0
  262. package/dist/services/document-failure-markers.js +305 -0
  263. package/dist/services/document-indexer.d.ts +122 -0
  264. package/dist/services/document-indexer.js +405 -0
  265. package/dist/services/document-service.d.ts +245 -0
  266. package/dist/services/document-service.js +325 -0
  267. package/dist/services/document-upload-artifact-sync.d.ts +80 -0
  268. package/dist/services/document-upload-artifact-sync.js +162 -0
  269. package/dist/services/document-upload-beta2-recovery.d.ts +72 -0
  270. package/dist/services/document-upload-beta2-recovery.js +94 -0
  271. package/dist/services/document-upload.d.ts +44 -0
  272. package/dist/services/document-upload.js +353 -0
  273. package/dist/services/embedding.d.ts +57 -0
  274. package/dist/services/embedding.js +416 -0
  275. package/dist/services/entity-attribute-extractor.d.ts +34 -0
  276. package/dist/services/entity-attribute-extractor.js +117 -0
  277. package/dist/services/entity-card-synthesis.d.ts +54 -0
  278. package/dist/services/entity-card-synthesis.js +92 -0
  279. package/dist/services/entity-dedup.d.ts +9 -0
  280. package/dist/services/entity-dedup.js +14 -0
  281. package/dist/services/entity-graph.d.ts +17 -0
  282. package/dist/services/entity-graph.js +135 -0
  283. package/dist/services/entropy-gate.d.ts +52 -0
  284. package/dist/services/entropy-gate.js +56 -0
  285. package/dist/services/episode-fetcher.d.ts +47 -0
  286. package/dist/services/episode-fetcher.js +128 -0
  287. package/dist/services/event-anchor-facts.d.ts +8 -0
  288. package/dist/services/event-anchor-facts.js +205 -0
  289. package/dist/services/event-chain-detector.d.ts +52 -0
  290. package/dist/services/event-chain-detector.js +83 -0
  291. package/dist/services/extraction-cache.d.ts +9 -0
  292. package/dist/services/extraction-cache.js +54 -0
  293. package/dist/services/extraction-enrichment.d.ts +9 -0
  294. package/dist/services/extraction-enrichment.js +223 -0
  295. package/dist/services/extraction.d.ts +69 -0
  296. package/dist/services/extraction.js +596 -0
  297. package/dist/services/fact-normalization.d.ts +12 -0
  298. package/dist/services/fact-normalization.js +248 -0
  299. package/dist/services/filecoin-observability.d.ts +127 -0
  300. package/dist/services/filecoin-observability.js +200 -0
  301. package/dist/services/first-mention-service.d.ts +76 -0
  302. package/dist/services/first-mention-service.js +186 -0
  303. package/dist/services/hierarchical-retrieval.d.ts +49 -0
  304. package/dist/services/hierarchical-retrieval.js +50 -0
  305. package/dist/services/ingest-fact-pipeline.d.ts +32 -0
  306. package/dist/services/ingest-fact-pipeline.js +212 -0
  307. package/dist/services/ingest-post-write.d.ts +50 -0
  308. package/dist/services/ingest-post-write.js +117 -0
  309. package/dist/services/ingest-trace.d.ts +32 -0
  310. package/dist/services/ingest-trace.js +60 -0
  311. package/dist/services/input-sanitizer.d.ts +41 -0
  312. package/dist/services/input-sanitizer.js +135 -0
  313. package/dist/services/iterative-retrieval.d.ts +26 -0
  314. package/dist/services/iterative-retrieval.js +139 -0
  315. package/dist/services/keyword-expansion.d.ts +10 -0
  316. package/dist/services/keyword-expansion.js +26 -0
  317. package/dist/services/lesson-service.d.ts +68 -0
  318. package/dist/services/lesson-service.js +178 -0
  319. package/dist/services/literal-extractor.d.ts +16 -0
  320. package/dist/services/literal-extractor.js +74 -0
  321. package/dist/services/literal-list-protection.d.ts +17 -0
  322. package/dist/services/literal-list-protection.js +134 -0
  323. package/dist/services/literal-query-expansion.d.ts +20 -0
  324. package/dist/services/literal-query-expansion.js +181 -0
  325. package/dist/services/llm.d.ts +61 -0
  326. package/dist/services/llm.js +265 -0
  327. package/dist/services/memcell-projection.d.ts +17 -0
  328. package/dist/services/memcell-projection.js +41 -0
  329. package/dist/services/memory-audn.d.ts +43 -0
  330. package/dist/services/memory-audn.js +419 -0
  331. package/dist/services/memory-crud.d.ts +93 -0
  332. package/dist/services/memory-crud.js +255 -0
  333. package/dist/services/memory-ingest.d.ts +21 -0
  334. package/dist/services/memory-ingest.js +249 -0
  335. package/dist/services/memory-lifecycle.d.ts +75 -0
  336. package/dist/services/memory-lifecycle.js +108 -0
  337. package/dist/services/memory-lineage.d.ts +181 -0
  338. package/dist/services/memory-lineage.js +232 -0
  339. package/dist/services/memory-network.d.ts +40 -0
  340. package/dist/services/memory-network.js +75 -0
  341. package/dist/services/memory-search-types.d.ts +25 -0
  342. package/dist/services/memory-search-types.js +10 -0
  343. package/dist/services/memory-search.d.ts +48 -0
  344. package/dist/services/memory-search.js +505 -0
  345. package/dist/services/memory-service-types.d.ts +371 -0
  346. package/dist/services/memory-service-types.js +8 -0
  347. package/dist/services/memory-service.d.ts +152 -0
  348. package/dist/services/memory-service.js +225 -0
  349. package/dist/services/memory-storage.d.ts +33 -0
  350. package/dist/services/memory-storage.js +328 -0
  351. package/dist/services/msr-aggregator.d.ts +38 -0
  352. package/dist/services/msr-aggregator.js +97 -0
  353. package/dist/services/msr-detector.d.ts +35 -0
  354. package/dist/services/msr-detector.js +65 -0
  355. package/dist/services/namespace-retrieval.d.ts +60 -0
  356. package/dist/services/namespace-retrieval.js +180 -0
  357. package/dist/services/observation-date-extraction.d.ts +12 -0
  358. package/dist/services/observation-date-extraction.js +50 -0
  359. package/dist/services/observation-service.d.ts +27 -0
  360. package/dist/services/observation-service.js +84 -0
  361. package/dist/services/packaging-observability.d.ts +29 -0
  362. package/dist/services/packaging-observability.js +146 -0
  363. package/dist/services/query-expansion.d.ts +83 -0
  364. package/dist/services/query-expansion.js +242 -0
  365. package/dist/services/query-keyword-matches.d.ts +6 -0
  366. package/dist/services/query-keyword-matches.js +56 -0
  367. package/dist/services/query-term-visibility.d.ts +28 -0
  368. package/dist/services/query-term-visibility.js +100 -0
  369. package/dist/services/quick-extraction.d.ts +25 -0
  370. package/dist/services/quick-extraction.js +431 -0
  371. package/dist/services/quoted-entity-extraction.d.ts +10 -0
  372. package/dist/services/quoted-entity-extraction.js +161 -0
  373. package/dist/services/raw-storage-reconciler-backoff.d.ts +8 -0
  374. package/dist/services/raw-storage-reconciler-backoff.js +14 -0
  375. package/dist/services/raw-storage-reconciler-scheduler.d.ts +29 -0
  376. package/dist/services/raw-storage-reconciler-scheduler.js +43 -0
  377. package/dist/services/raw-storage-reconciler.d.ts +71 -0
  378. package/dist/services/raw-storage-reconciler.js +278 -0
  379. package/dist/services/recap-builder.d.ts +49 -0
  380. package/dist/services/recap-builder.js +157 -0
  381. package/dist/services/reflect-jobs.d.ts +23 -0
  382. package/dist/services/reflect-jobs.js +36 -0
  383. package/dist/services/reflect-prompts.d.ts +71 -0
  384. package/dist/services/reflect-prompts.js +99 -0
  385. package/dist/services/reflect-retrieval.d.ts +33 -0
  386. package/dist/services/reflect-retrieval.js +30 -0
  387. package/dist/services/reflect.d.ts +49 -0
  388. package/dist/services/reflect.js +84 -0
  389. package/dist/services/relative-temporal.d.ts +14 -0
  390. package/dist/services/relative-temporal.js +163 -0
  391. package/dist/services/relevance-policy.d.ts +37 -0
  392. package/dist/services/relevance-policy.js +109 -0
  393. package/dist/services/rerank.d.ts +32 -0
  394. package/dist/services/rerank.js +118 -0
  395. package/dist/services/reranker.d.ts +20 -0
  396. package/dist/services/reranker.js +99 -0
  397. package/dist/services/retrieval-channel-rules.d.ts +34 -0
  398. package/dist/services/retrieval-channel-rules.js +41 -0
  399. package/dist/services/retrieval-config-overlay.d.ts +36 -0
  400. package/dist/services/retrieval-config-overlay.js +44 -0
  401. package/dist/services/retrieval-format.d.ts +119 -0
  402. package/dist/services/retrieval-format.js +559 -0
  403. package/dist/services/retrieval-policy.d.ts +69 -0
  404. package/dist/services/retrieval-policy.js +275 -0
  405. package/dist/services/retrieval-profiles.d.ts +37 -0
  406. package/dist/services/retrieval-profiles.js +90 -0
  407. package/dist/services/retrieval-side-effects.d.ts +14 -0
  408. package/dist/services/retrieval-side-effects.js +26 -0
  409. package/dist/services/retrieval-trace.d.ts +108 -0
  410. package/dist/services/retrieval-trace.js +147 -0
  411. package/dist/services/rrf-fusion.d.ts +18 -0
  412. package/dist/services/rrf-fusion.js +34 -0
  413. package/dist/services/search-pipeline.d.ts +71 -0
  414. package/dist/services/search-pipeline.js +788 -0
  415. package/dist/services/session-date.d.ts +20 -0
  416. package/dist/services/session-date.js +61 -0
  417. package/dist/services/session-packaging.d.ts +53 -0
  418. package/dist/services/session-packaging.js +182 -0
  419. package/dist/services/session-summary-generator.d.ts +53 -0
  420. package/dist/services/session-summary-generator.js +134 -0
  421. package/dist/services/specialists/cr-specialist.d.ts +52 -0
  422. package/dist/services/specialists/cr-specialist.js +121 -0
  423. package/dist/services/specialists/dispatch.d.ts +53 -0
  424. package/dist/services/specialists/dispatch.js +102 -0
  425. package/dist/services/specialists/ie-ku-specialist.d.ts +37 -0
  426. package/dist/services/specialists/ie-ku-specialist.js +63 -0
  427. package/dist/services/specialists/msr-specialist.d.ts +61 -0
  428. package/dist/services/specialists/msr-specialist.js +162 -0
  429. package/dist/services/specialists/tr-specialist.d.ts +37 -0
  430. package/dist/services/specialists/tr-specialist.js +146 -0
  431. package/dist/services/storage-key-prefix.d.ts +42 -0
  432. package/dist/services/storage-key-prefix.js +45 -0
  433. package/dist/services/storage-put-recovery.d.ts +71 -0
  434. package/dist/services/storage-put-recovery.js +269 -0
  435. package/dist/services/storage-service-errors.d.ts +124 -0
  436. package/dist/services/storage-service-errors.js +189 -0
  437. package/dist/services/storage-service.d.ts +176 -0
  438. package/dist/services/storage-service.js +423 -0
  439. package/dist/services/subject-aware-ranking.d.ts +19 -0
  440. package/dist/services/subject-aware-ranking.js +161 -0
  441. package/dist/services/supplemental-extraction.d.ts +7 -0
  442. package/dist/services/supplemental-extraction.js +116 -0
  443. package/dist/services/tbc-execution.d.ts +49 -0
  444. package/dist/services/tbc-execution.js +284 -0
  445. package/dist/services/temporal-classifier.d.ts +56 -0
  446. package/dist/services/temporal-classifier.js +94 -0
  447. package/dist/services/temporal-endpoint-evidence.d.ts +12 -0
  448. package/dist/services/temporal-endpoint-evidence.js +313 -0
  449. package/dist/services/temporal-fingerprint.d.ts +6 -0
  450. package/dist/services/temporal-fingerprint.js +12 -0
  451. package/dist/services/temporal-format.d.ts +9 -0
  452. package/dist/services/temporal-format.js +21 -0
  453. package/dist/services/temporal-intent.d.ts +39 -0
  454. package/dist/services/temporal-intent.js +78 -0
  455. package/dist/services/temporal-query-constraints.d.ts +16 -0
  456. package/dist/services/temporal-query-constraints.js +107 -0
  457. package/dist/services/temporal-query-expansion.d.ts +14 -0
  458. package/dist/services/temporal-query-expansion.js +131 -0
  459. package/dist/services/temporal-rerank.d.ts +22 -0
  460. package/dist/services/temporal-rerank.js +47 -0
  461. package/dist/services/temporal-result-protection.d.ts +7 -0
  462. package/dist/services/temporal-result-protection.js +60 -0
  463. package/dist/services/temporal-state-write.d.ts +57 -0
  464. package/dist/services/temporal-state-write.js +45 -0
  465. package/dist/services/tiered-context.d.ts +87 -0
  466. package/dist/services/tiered-context.js +214 -0
  467. package/dist/services/tiered-loading.d.ts +88 -0
  468. package/dist/services/tiered-loading.js +263 -0
  469. package/dist/services/timeline-pack.d.ts +36 -0
  470. package/dist/services/timeline-pack.js +50 -0
  471. package/dist/services/timing.d.ts +13 -0
  472. package/dist/services/timing.js +72 -0
  473. package/dist/services/tll-augmentation.d.ts +20 -0
  474. package/dist/services/tll-augmentation.js +125 -0
  475. package/dist/services/tll-retrieval.d.ts +55 -0
  476. package/dist/services/tll-retrieval.js +101 -0
  477. package/dist/services/topic-abstraction.d.ts +36 -0
  478. package/dist/services/topic-abstraction.js +105 -0
  479. package/dist/services/trust-scoring.d.ts +43 -0
  480. package/dist/services/trust-scoring.js +89 -0
  481. package/dist/services/typed-belief-calculus.d.ts +126 -0
  482. package/dist/services/typed-belief-calculus.js +204 -0
  483. package/dist/services/upload-config.d.ts +34 -0
  484. package/dist/services/upload-config.js +23 -0
  485. package/dist/services/upload-decision.d.ts +65 -0
  486. package/dist/services/upload-decision.js +98 -0
  487. package/dist/services/upload-helpers.d.ts +107 -0
  488. package/dist/services/upload-helpers.js +148 -0
  489. package/dist/services/user-profile-builder.d.ts +22 -0
  490. package/dist/services/user-profile-builder.js +109 -0
  491. package/dist/services/voyage-embedding.d.ts +22 -0
  492. package/dist/services/voyage-embedding.js +77 -0
  493. package/dist/services/write-security.d.ts +31 -0
  494. package/dist/services/write-security.js +64 -0
  495. package/dist/storage/artifact-public-redaction.d.ts +34 -0
  496. package/dist/storage/artifact-public-redaction.js +83 -0
  497. package/dist/storage/cleanup.d.ts +103 -0
  498. package/dist/storage/cleanup.js +138 -0
  499. package/dist/storage/codec-factory.d.ts +17 -0
  500. package/dist/storage/codec-factory.js +33 -0
  501. package/dist/storage/codecs/aes-gcm-codec.d.ts +44 -0
  502. package/dist/storage/codecs/aes-gcm-codec.js +108 -0
  503. package/dist/storage/codecs/noop-codec.d.ts +16 -0
  504. package/dist/storage/codecs/noop-codec.js +23 -0
  505. package/dist/storage/factory.d.ts +44 -0
  506. package/dist/storage/factory.js +99 -0
  507. package/dist/storage/filecoin-cid-validation.d.ts +82 -0
  508. package/dist/storage/filecoin-cid-validation.js +122 -0
  509. package/dist/storage/filecoin-public-metadata.d.ts +73 -0
  510. package/dist/storage/filecoin-public-metadata.js +110 -0
  511. package/dist/storage/local-fs-store.d.ts +39 -0
  512. package/dist/storage/local-fs-store.js +145 -0
  513. package/dist/storage/pointer-uri-allowlist.d.ts +38 -0
  514. package/dist/storage/pointer-uri-allowlist.js +70 -0
  515. package/dist/storage/provider-metadata-projection.d.ts +27 -0
  516. package/dist/storage/provider-metadata-projection.js +68 -0
  517. package/dist/storage/providers/filecoin/backend.d.ts +42 -0
  518. package/dist/storage/providers/filecoin/backend.js +250 -0
  519. package/dist/storage/providers/filecoin/config.d.ts +70 -0
  520. package/dist/storage/providers/filecoin/config.js +275 -0
  521. package/dist/storage/providers/filecoin/errors.d.ts +45 -0
  522. package/dist/storage/providers/filecoin/errors.js +56 -0
  523. package/dist/storage/providers/filecoin/filecoin-pin-car.d.ts +78 -0
  524. package/dist/storage/providers/filecoin/filecoin-pin-car.js +155 -0
  525. package/dist/storage/providers/filecoin/filecoin-pin-client.d.ts +92 -0
  526. package/dist/storage/providers/filecoin/filecoin-pin-client.js +199 -0
  527. package/dist/storage/providers/filecoin/filecoin-pin-mapping.d.ts +58 -0
  528. package/dist/storage/providers/filecoin/filecoin-pin-mapping.js +103 -0
  529. package/dist/storage/providers/filecoin/filecoin-pin-timeout.d.ts +30 -0
  530. package/dist/storage/providers/filecoin/filecoin-pin-timeout.js +53 -0
  531. package/dist/storage/providers/filecoin/filecoin-pin-vendor.d.ts +111 -0
  532. package/dist/storage/providers/filecoin/filecoin-pin-vendor.js +87 -0
  533. package/dist/storage/providers/filecoin/hints.d.ts +71 -0
  534. package/dist/storage/providers/filecoin/hints.js +123 -0
  535. package/dist/storage/providers/filecoin/index.d.ts +51 -0
  536. package/dist/storage/providers/filecoin/index.js +103 -0
  537. package/dist/storage/providers/filecoin/ipfs-cid.d.ts +50 -0
  538. package/dist/storage/providers/filecoin/ipfs-cid.js +64 -0
  539. package/dist/storage/providers/filecoin/metadata.d.ts +72 -0
  540. package/dist/storage/providers/filecoin/metadata.js +137 -0
  541. package/dist/storage/providers/filecoin/piece-cid.d.ts +48 -0
  542. package/dist/storage/providers/filecoin/piece-cid.js +57 -0
  543. package/dist/storage/providers/filecoin/provider-client.d.ts +234 -0
  544. package/dist/storage/providers/filecoin/provider-client.js +27 -0
  545. package/dist/storage/providers/filecoin/readiness.d.ts +62 -0
  546. package/dist/storage/providers/filecoin/readiness.js +85 -0
  547. package/dist/storage/providers/filecoin/retriever.d.ts +82 -0
  548. package/dist/storage/providers/filecoin/retriever.js +63 -0
  549. package/dist/storage/providers/filecoin/skeleton-client.d.ts +36 -0
  550. package/dist/storage/providers/filecoin/skeleton-client.js +55 -0
  551. package/dist/storage/providers/filecoin/synapse-client.d.ts +169 -0
  552. package/dist/storage/providers/filecoin/synapse-client.js +343 -0
  553. package/dist/storage/providers/filecoin/synapse-construction.d.ts +26 -0
  554. package/dist/storage/providers/filecoin/synapse-construction.js +47 -0
  555. package/dist/storage/providers/filecoin/synapse-error-mapping.d.ts +23 -0
  556. package/dist/storage/providers/filecoin/synapse-error-mapping.js +49 -0
  557. package/dist/storage/providers/filecoin/synapse-readiness.d.ts +37 -0
  558. package/dist/storage/providers/filecoin/synapse-readiness.js +231 -0
  559. package/dist/storage/providers/filecoin/uri.d.ts +49 -0
  560. package/dist/storage/providers/filecoin/uri.js +84 -0
  561. package/dist/storage/providers/filecoin/verified-fetch-lifecycle.d.ts +77 -0
  562. package/dist/storage/providers/filecoin/verified-fetch-lifecycle.js +196 -0
  563. package/dist/storage/providers/filecoin/verified-fetch-retriever.d.ts +54 -0
  564. package/dist/storage/providers/filecoin/verified-fetch-retriever.js +81 -0
  565. package/dist/storage/providers/filecoin/verified-fetch-vendor.d.ts +71 -0
  566. package/dist/storage/providers/filecoin/verified-fetch-vendor.js +94 -0
  567. package/dist/storage/raw-content-codec.d.ts +89 -0
  568. package/dist/storage/raw-content-codec.js +47 -0
  569. package/dist/storage/raw-content-store-backend-adapter.d.ts +28 -0
  570. package/dist/storage/raw-content-store-backend-adapter.js +67 -0
  571. package/dist/storage/raw-content-store.d.ts +228 -0
  572. package/dist/storage/raw-content-store.js +27 -0
  573. package/dist/storage/s3-store.d.ts +42 -0
  574. package/dist/storage/s3-store.js +181 -0
  575. package/dist/storage/storage-backend-registry.d.ts +58 -0
  576. package/dist/storage/storage-backend-registry.js +56 -0
  577. package/dist/storage/storage-backend.d.ts +82 -0
  578. package/dist/storage/storage-backend.js +14 -0
  579. package/dist/storage/storage-capabilities.d.ts +56 -0
  580. package/dist/storage/storage-capabilities.js +170 -0
  581. package/dist/storage/store-registry.d.ts +67 -0
  582. package/dist/storage/store-registry.js +77 -0
  583. package/dist/vector-math.d.ts +15 -0
  584. package/dist/vector-math.js +31 -0
  585. package/dist/xml-escape.d.ts +5 -0
  586. package/dist/xml-escape.js +7 -0
  587. package/openapi.json +15395 -0
  588. package/openapi.yaml +10794 -0
  589. package/package.json +119 -0
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Phase β2 orphan-bytes compensation + raw-document failure-marker
3
+ * helpers for the managed-blob upload pipeline.
4
+ *
5
+ * Extracted from `document-upload.ts` so the orchestration module
6
+ * stays under the workspace 400-non-comment-LOC cap. The two
7
+ * exported helpers cover the post-`store.put` failure window:
8
+ *
9
+ * - `compensateOrphanedBlob` runs a best-effort `store.delete`
10
+ * for bytes that were durably written but never linked
11
+ * (e.g. the prior artifact entered a delete lifecycle between
12
+ * our claim and the swap, so `ArtifactNotLinkableError` fires).
13
+ * - `markBeta2FailureOnDocument` flips the raw_document to
14
+ * `raw_storage_failed` with a typed envelope so the public
15
+ * status surfaces stop saying "upload in progress" for a doc
16
+ * whose upload actually failed. When cleanup also failed the
17
+ * envelope carries `internal_recovery_hint` so a reconciler /
18
+ * ops can find the abandoned bytes. The wire formatter
19
+ * (`document-response-formatters.ts`) strips `internal_*`
20
+ * keys before exposing `last_error` on the public response.
21
+ */
22
+ import { failClaimedUploadWithClient } from '../db/raw-document-blob-repository.js';
23
+ import { describeError } from './upload-helpers.js';
24
+ /**
25
+ * Best-effort `store.delete` for the orphan-bytes window between
26
+ * `store.put` returning and `recordUploadResultAndSwapArtifact`
27
+ * committing the artifact swap. Returns whether cleanup succeeded
28
+ * (the caller uses this to decide whether to embed the orphan
29
+ * URI/provider in the raw_document's recovery-hint envelope).
30
+ *
31
+ * A cleanup failure is also logged with the originating error so
32
+ * a `grep '[STORAGE]'` operator can correlate.
33
+ */
34
+ export async function compensateOrphanedBlob(store, storageUri, documentId, cause) {
35
+ try {
36
+ await store.delete(storageUri);
37
+ return { cleanupSucceeded: true };
38
+ }
39
+ catch (cleanupErr) {
40
+ const cleanupErrorMessage = describeError(cleanupErr);
41
+ // eslint-disable-next-line no-console
42
+ console.error(`runPhaseBeta2: failed to compensate orphan blob ` +
43
+ `(documentId=${documentId}, storageUri=${storageUri}) after ` +
44
+ `${describeError(cause)}; cleanup error: ${cleanupErrorMessage}`);
45
+ return { cleanupSucceeded: false, cleanupError: cleanupErrorMessage };
46
+ }
47
+ }
48
+ /**
49
+ * Mark the doc `raw_storage_failed` with the `artifact_not_linkable`
50
+ * envelope (or generic `beta2_swap_failed` for other throws).
51
+ *
52
+ * Uses the raw-document-only `failClaimedUploadWithClient` — NOT
53
+ * the paired `failClaimedUploadAndSyncArtifact`. Syncing here
54
+ * would clobber the prior artifact's state, which is already in
55
+ * its OWN delete lifecycle and owned by the caller that's
56
+ * tombstoning it.
57
+ *
58
+ * CAS-guarded by `claim_id`: a no-op when the claim was lost,
59
+ * which prevents a stale marker from overwriting a fresh
60
+ * worker's state.
61
+ *
62
+ * Orphan recovery hint: when cleanup failed the envelope carries
63
+ * `internal_recovery_hint: { storage_uri, storage_provider, cleanup_error }`
64
+ * so a reconciler / ops can find the abandoned bytes.
65
+ */
66
+ export async function markBeta2FailureOnDocument(args) {
67
+ const envelope = {
68
+ layer: 'raw_storage',
69
+ code: args.reasonCode,
70
+ message: args.reasonMessage,
71
+ occurred_at: new Date().toISOString(),
72
+ };
73
+ if (!args.compensation.cleanupSucceeded) {
74
+ envelope.internal_recovery_hint = {
75
+ storage_uri: args.stored.storageUri,
76
+ storage_provider: args.stored.storageProvider,
77
+ cleanup_error: args.compensation.cleanupError,
78
+ };
79
+ }
80
+ try {
81
+ await failClaimedUploadWithClient(args.pool, {
82
+ userId: args.document.userId,
83
+ documentId: args.document.id,
84
+ claimId: args.claimId,
85
+ lastError: envelope,
86
+ });
87
+ }
88
+ catch (markerErr) {
89
+ // eslint-disable-next-line no-console
90
+ console.error(`runPhaseBeta2: failed to mark raw_storage_failed for ` +
91
+ `document ${args.document.id} (claim ${args.claimId}); ` +
92
+ `marker error: ${describeError(markerErr)}; original reason: ${args.reasonMessage}`);
93
+ }
94
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Managed-blob upload pipeline for the document registry (the managed-upload
3
+ * α/β/β2/γ split).
4
+ *
5
+ * Atomicity model: the slow `store.put()` no longer runs inside a DB
6
+ * transaction. Instead the pipeline is split into four phases:
7
+ *
8
+ * - the claim step (short tx, advisory-locked): load the row, run
9
+ * `classifyIdempotent` against the incoming hash, either short-
10
+ * circuit (returnExisting) or claim the slot. The claim writes
11
+ * `raw_storage_status='blob_uploading'` + `raw_storage_claim_id`
12
+ * + plaintext `content_hash`/`size_bytes`. COMMIT, release lock.
13
+ * - the provider-write step (no DB locks): `codec.encode()` + `store.put()`. On
14
+ * throw, mark row `raw_storage_failed` via the per-claim guard.
15
+ * - the durable URI-write step (short tx): record `storage_uri`/`storage_provider`/
16
+ * `raw_storage_metadata` durably; status STAYS `blob_uploading`.
17
+ * Guarded by claim_id; 0-row means another worker reclaimed —
18
+ * compensate with `store.delete()`.
19
+ * - the finalization step (short tx): compare-and-set status flip to the final
20
+ * terminal state via `deriveFinalRawStorageStatus`. Clears claim;
21
+ * stamps `pending_since` for the observability metric.
22
+ *
23
+ * Same-bytes crash recovery (rev-10 / rev-11):
24
+ * - blob_uploading WITHOUT URI → reclaimAndUpload (re-run β/β2/γ).
25
+ * - blob_uploading WITH URI → finalize (skip β + β2; γ alone).
26
+ *
27
+ * Plaintext source of truth: `content_hash` and `size_bytes` written
28
+ * to the row are the PLAINTEXT hash + length; the encoded-byte hash +
29
+ * encoded size live only under `raw_storage_metadata.codec.*` for ops
30
+ * diagnostics (rev-2 §5).
31
+ */
32
+ import pg from 'pg';
33
+ import type { UploadConfig } from './upload-config.js';
34
+ import type { RawContentStore } from '../storage/raw-content-store.js';
35
+ import type { RawContentCodec } from '../storage/raw-content-codec.js';
36
+ import { type UploadRawInput, type UploadRawResult } from './upload-helpers.js';
37
+ export { ManagedStorageDisabledError, UploadDocumentConflictError, UploadDocumentNotFoundError, type UploadRawInput, type UploadRawResult, } from './upload-helpers.js';
38
+ /**
39
+ * Run the full the managed-upload α/β/β2/γ upload path. Idempotent on
40
+ * byte-identical input. Crash-recoverable: a process death between
41
+ * any two phases is resumable by a same-bytes retry — the claim step's
42
+ * classifyIdempotent decision table picks the right branch.
43
+ */
44
+ export declare function uploadRawDocument(pool: pg.Pool, store: RawContentStore | null, codec: RawContentCodec, cfg: UploadConfig, input: UploadRawInput): Promise<UploadRawResult>;
@@ -0,0 +1,353 @@
1
+ /**
2
+ * Managed-blob upload pipeline for the document registry (the managed-upload
3
+ * α/β/β2/γ split).
4
+ *
5
+ * Atomicity model: the slow `store.put()` no longer runs inside a DB
6
+ * transaction. Instead the pipeline is split into four phases:
7
+ *
8
+ * - the claim step (short tx, advisory-locked): load the row, run
9
+ * `classifyIdempotent` against the incoming hash, either short-
10
+ * circuit (returnExisting) or claim the slot. The claim writes
11
+ * `raw_storage_status='blob_uploading'` + `raw_storage_claim_id`
12
+ * + plaintext `content_hash`/`size_bytes`. COMMIT, release lock.
13
+ * - the provider-write step (no DB locks): `codec.encode()` + `store.put()`. On
14
+ * throw, mark row `raw_storage_failed` via the per-claim guard.
15
+ * - the durable URI-write step (short tx): record `storage_uri`/`storage_provider`/
16
+ * `raw_storage_metadata` durably; status STAYS `blob_uploading`.
17
+ * Guarded by claim_id; 0-row means another worker reclaimed —
18
+ * compensate with `store.delete()`.
19
+ * - the finalization step (short tx): compare-and-set status flip to the final
20
+ * terminal state via `deriveFinalRawStorageStatus`. Clears claim;
21
+ * stamps `pending_since` for the observability metric.
22
+ *
23
+ * Same-bytes crash recovery (rev-10 / rev-11):
24
+ * - blob_uploading WITHOUT URI → reclaimAndUpload (re-run β/β2/γ).
25
+ * - blob_uploading WITH URI → finalize (skip β + β2; γ alone).
26
+ *
27
+ * Plaintext source of truth: `content_hash` and `size_bytes` written
28
+ * to the row are the PLAINTEXT hash + length; the encoded-byte hash +
29
+ * encoded size live only under `raw_storage_metadata.codec.*` for ops
30
+ * diagnostics (rev-2 §5).
31
+ */
32
+ import { randomUUID } from 'node:crypto';
33
+ import { claimUploadSlotWithClient } from '../db/raw-document-blob-repository.js';
34
+ import { ArtifactNotLinkableError } from '../db/storage-artifact-repository.js';
35
+ import { deriveStorageKeyPrefix } from './storage-key-prefix.js';
36
+ import { failClaimedUploadAndSyncArtifact, finalizeUploadAndSyncArtifact, recordUploadResultAndSwapArtifact, } from './document-upload-artifact-sync.js';
37
+ import { compensateOrphanedBlob, markBeta2FailureOnDocument, } from './document-upload-beta2-recovery.js';
38
+ import { buildLastError } from '../db/raw-document-status-repository.js';
39
+ import { classifyIdempotent, deriveFinalRawStorageStatus, readPersistedStoredStatus, } from './upload-decision.js';
40
+ import { blobKey, buildPhaseBeta2Metadata, buildUploadResult, describeError, idempotentResult, loadActive, ManagedStorageDisabledError, markRawStorageFailureBestEffort, sha256Hex, UploadClaimLostError, UploadDocumentConflictError, UploadDocumentNotFoundError, } from './upload-helpers.js';
41
+ import { emitFilecoinEvent, sanitizeErrorMessage, } from './filecoin-observability.js';
42
+ export { ManagedStorageDisabledError, UploadDocumentConflictError, UploadDocumentNotFoundError, } from './upload-helpers.js';
43
+ /**
44
+ * Run the full the managed-upload α/β/β2/γ upload path. Idempotent on
45
+ * byte-identical input. Crash-recoverable: a process death between
46
+ * any two phases is resumable by a same-bytes retry — the claim step's
47
+ * classifyIdempotent decision table picks the right branch.
48
+ */
49
+ export async function uploadRawDocument(pool, store, codec, cfg, input) {
50
+ if (cfg.rawStorageMode !== 'managed_blob' || !store) {
51
+ await markRawStorageFailureBestEffort(pool, input.userId, input.documentId, 'managed_storage_disabled', 'managed_blob storage is not enabled for this deployment');
52
+ throw new ManagedStorageDisabledError();
53
+ }
54
+ const contentHash = sha256Hex(input.body);
55
+ const sizeBytes = input.body.length;
56
+ // upload-observability — drives `upload_latency_seconds` aggregation. The
57
+ // event taxonomy is `filecoin.upload.*` so we only emit when the
58
+ // active adapter is Filecoin storage. local_fs / s3 uploads
59
+ // produce no `[FILECOIN]` events.
60
+ const isFilecoin = store.provider === 'filecoin';
61
+ const startedAt = Date.now();
62
+ if (isFilecoin) {
63
+ emitFilecoinEvent('filecoin.upload.started', {
64
+ documentId: input.documentId,
65
+ userId: input.userId,
66
+ });
67
+ }
68
+ return runUploadPhases(pool, store, codec, cfg, contentHash, sizeBytes, input, {
69
+ startedAt, isFilecoin,
70
+ });
71
+ }
72
+ async function runUploadPhases(pool, store, codec, cfg, contentHash, sizeBytes, input, obs) {
73
+ try {
74
+ const alpha = await runPhaseAlpha(pool, contentHash, sizeBytes, input);
75
+ const result = alpha.kind === 'returnExisting'
76
+ ? alpha.result
77
+ : alpha.kind === 'finalize'
78
+ ? await runPhaseGammaOnly(pool, alpha, input)
79
+ : await runPhaseBetaThroughGamma(pool, store, codec, cfg, alpha, input);
80
+ if (obs.isFilecoin) {
81
+ emitFilecoinEvent('filecoin.upload.accepted', {
82
+ documentId: input.documentId,
83
+ userId: input.userId,
84
+ provider: result.storageProvider ?? undefined,
85
+ statusAfter: result.rawStorageStatus,
86
+ durationMs: Date.now() - obs.startedAt,
87
+ });
88
+ }
89
+ return result;
90
+ }
91
+ catch (err) {
92
+ if (obs.isFilecoin) {
93
+ emitFilecoinEvent('filecoin.upload.failed', {
94
+ documentId: input.documentId,
95
+ userId: input.userId,
96
+ errorCode: extractUploadErrorCode(err),
97
+ errorMessage: sanitizeErrorMessage(err),
98
+ durationMs: Date.now() - obs.startedAt,
99
+ });
100
+ }
101
+ throw err;
102
+ }
103
+ }
104
+ function extractUploadErrorCode(err) {
105
+ if (err instanceof Error) {
106
+ const candidate = err.code;
107
+ if (typeof candidate === 'string')
108
+ return candidate;
109
+ if (err.name === 'UploadDocumentConflictError')
110
+ return 'document_conflict';
111
+ if (err.name === 'UploadDocumentNotFoundError')
112
+ return 'document_not_found';
113
+ if (err.name === 'UploadClaimLostError')
114
+ return 'upload_claim_lost';
115
+ if (err.name === 'ManagedStorageDisabledError')
116
+ return 'managed_storage_disabled';
117
+ }
118
+ return 'unknown';
119
+ }
120
+ async function runPhaseAlpha(pool, contentHash, sizeBytes, input) {
121
+ const client = await pool.connect();
122
+ try {
123
+ await client.query('BEGIN');
124
+ await client.query('SELECT pg_advisory_xact_lock(hashtext($1))', [input.documentId]);
125
+ const document = await loadActive(client, input);
126
+ const decision = classifyIdempotent(document, contentHash);
127
+ const earlyReturn = checkPhaseAlphaEarlyExit(document, contentHash, sizeBytes, decision);
128
+ if (earlyReturn) {
129
+ await client.query('COMMIT');
130
+ if (earlyReturn.kind === 'throw')
131
+ throw earlyReturn.err;
132
+ return earlyReturn.result;
133
+ }
134
+ return await commitPhaseAlphaClaim(client, document, contentHash, sizeBytes, decision, input);
135
+ }
136
+ catch (err) {
137
+ await client.query('ROLLBACK').catch(() => undefined);
138
+ throw err;
139
+ }
140
+ finally {
141
+ client.release();
142
+ }
143
+ }
144
+ function checkPhaseAlphaEarlyExit(document, contentHash, sizeBytes, decision) {
145
+ if (decision?.kind === 'returnExisting') {
146
+ return {
147
+ kind: 'return',
148
+ result: { kind: 'returnExisting', result: idempotentResult(document, contentHash, sizeBytes) },
149
+ };
150
+ }
151
+ if (decision === null && hasConflictingManagedBlob(document, contentHash)) {
152
+ return {
153
+ kind: 'throw',
154
+ err: new UploadDocumentConflictError(document.id, document.contentHash ?? '', contentHash),
155
+ };
156
+ }
157
+ return null;
158
+ }
159
+ async function commitPhaseAlphaClaim(client, document, contentHash, sizeBytes, decision, input) {
160
+ // `checkPhaseAlphaEarlyExit` already handled returnExisting +
161
+ // conflict; what reaches us is reclaimAndUpload / finalize / null.
162
+ const branch = decision?.kind === 'finalize' ? 'finalize' : 'reclaimAndUpload';
163
+ // Finalize preserves the durable URI (the bytes are already on the
164
+ // provider); reclaim/fresh clear it so a crash before the durable URI-write step can't
165
+ // strand the row in a finalize-recovery window pointing at stale
166
+ // bytes (rev-fix HIGH 2).
167
+ const claimId = randomUUID();
168
+ const claimed = await claimUploadSlotWithClient(client, {
169
+ userId: input.userId, documentId: input.documentId, claimId, contentHash, sizeBytes,
170
+ clearDurableUri: branch === 'reclaimAndUpload',
171
+ });
172
+ if (claimed === 0) {
173
+ await client.query('COMMIT');
174
+ throw new UploadDocumentNotFoundError(input.documentId);
175
+ }
176
+ await client.query('COMMIT');
177
+ return { kind: branch, claimId, document, contentHash, sizeBytes };
178
+ }
179
+ async function runPhaseBetaThroughGamma(pool, store, codec, cfg, alpha, input) {
180
+ const stored = await runPhaseBeta(pool, store, codec, cfg, alpha, input);
181
+ await runPhaseBeta2(pool, store, alpha, stored);
182
+ return runPhaseGammaFromStored(pool, alpha, stored, input);
183
+ }
184
+ async function runPhaseBeta(pool, store, codec, cfg, alpha, input) {
185
+ try {
186
+ const encoded = await codec.encode({ body: input.body });
187
+ const userPrefix = deriveStorageKeyPrefix(cfg.storageKeyHmacSecret, input.userId);
188
+ const stored = await store.put({
189
+ key: blobKey(cfg.rawStoragePrefix, userPrefix, input.documentId, alpha.contentHash),
190
+ body: encoded.body,
191
+ contentType: input.contentType,
192
+ });
193
+ return { ...stored, codecMetadata: encoded.metadata };
194
+ }
195
+ catch (err) {
196
+ const lastError = buildLastError('raw_storage', 'transport_error', describeError(err));
197
+ // the paired artifact-sync implementation paired the provider-write step failure: flip raw_storage_status AND
198
+ // sync the linked artifact to 'failed' in one transaction so
199
+ // the two rows never diverge across a failed store.put().
200
+ //
201
+ // Marker failures used to swallow the inner error silently; we
202
+ // now log with context so a follow-up worker can see that the
203
+ // claim cleanup itself failed (the outer throw still wins so
204
+ // the upload pipeline surfaces the original store.put error).
205
+ try {
206
+ await failClaimedUploadAndSyncArtifact(pool, {
207
+ userId: input.userId,
208
+ documentId: input.documentId,
209
+ claimId: alpha.claimId,
210
+ lastError,
211
+ });
212
+ }
213
+ catch (markerErr) {
214
+ // eslint-disable-next-line no-console
215
+ console.error(`runPhaseBeta: failed to mark raw_storage_failed + sync artifact for ` +
216
+ `document ${input.documentId} after store.put error: ${describeError(markerErr)}`);
217
+ }
218
+ throw err;
219
+ }
220
+ }
221
+ async function runPhaseBeta2(pool, store, alpha, stored) {
222
+ const metadata = buildPhaseBeta2Metadata(stored);
223
+ // the paired artifact-sync implementation paired the durable URI-write step: URI write + artifact swap commit
224
+ // together. Two failure modes after `store.put` has durably
225
+ // written bytes:
226
+ //
227
+ // 1. `rowCount === 0` — the upload claim was lost (another
228
+ // worker reclaimed the row). The artifact swap helper
229
+ // rolled back; we compensate by deleting the bytes we
230
+ // wrote and throw `UploadClaimLostError`. The raw_document
231
+ // is now owned by the new worker so we DO NOT write to its
232
+ // `last_error`.
233
+ // 2. The swap helper THROWS (e.g. `ArtifactNotLinkableError`
234
+ // when the prior artifact entered a delete lifecycle
235
+ // between our claim and the swap). Without explicit
236
+ // compensation the bytes would orphan. We catch every
237
+ // throw, attempt provider cleanup, AND flip the doc's
238
+ // `raw_storage_status` to `raw_storage_failed` with a
239
+ // typed `artifact_not_linkable` envelope so the public
240
+ // status surfaces stop saying "upload in progress" for a
241
+ // doc whose upload actually failed.
242
+ //
243
+ // The cleanup `store.delete` call is best-effort. When it fails
244
+ // the orphan URI + provider are embedded in the raw_document's
245
+ // `last_error.internal_recovery_hint` (wire-stripped by the
246
+ // response formatter) so a reconciler / ops can find the
247
+ // abandoned bytes later.
248
+ let result;
249
+ try {
250
+ result = await recordUploadResultAndSwapArtifact(pool, {
251
+ userId: alpha.document.userId,
252
+ documentId: alpha.document.id,
253
+ claimId: alpha.claimId,
254
+ storageUri: stored.storageUri,
255
+ storageProvider: stored.storageProvider,
256
+ rawStorageMetadata: metadata,
257
+ document: alpha.document,
258
+ contentHash: alpha.contentHash,
259
+ stored,
260
+ });
261
+ }
262
+ catch (err) {
263
+ const compensation = await compensateOrphanedBlob(store, stored.storageUri, alpha.document.id, err);
264
+ await markBeta2FailureOnDocument({
265
+ pool, document: alpha.document, claimId: alpha.claimId, stored,
266
+ reasonCode: err instanceof ArtifactNotLinkableError ? 'artifact_not_linkable' : 'beta2_swap_failed',
267
+ reasonMessage: describeError(err),
268
+ compensation,
269
+ });
270
+ throw err;
271
+ }
272
+ if (result.rowCount === 0) {
273
+ // Lost-claim path: another worker now owns the row's lifecycle.
274
+ // Compensate the orphan bytes if we can, but DO NOT write to
275
+ // the row's `last_error` — that belongs to the new claim. The
276
+ // structured log event below carries the orphan info when
277
+ // cleanup fails (best we can do without clobbering the new
278
+ // claim's state).
279
+ await compensateOrphanedBlob(store, stored.storageUri, alpha.document.id, new UploadClaimLostError(alpha.document.id, alpha.claimId, 'beta2'));
280
+ throw new UploadClaimLostError(alpha.document.id, alpha.claimId, 'beta2');
281
+ }
282
+ }
283
+ async function runPhaseGammaFromStored(pool, alpha, stored, input) {
284
+ const finalStatus = deriveFinalRawStorageStatus({
285
+ storedStatus: stored.status,
286
+ storageProvider: stored.storageProvider,
287
+ });
288
+ const rowCount = await finalizeUploadAndSyncArtifact(pool, {
289
+ userId: input.userId, documentId: input.documentId,
290
+ claimId: alpha.claimId, finalStatus,
291
+ });
292
+ if (rowCount === 0) {
293
+ throw new UploadClaimLostError(input.documentId, alpha.claimId, 'gamma');
294
+ }
295
+ return buildUploadResult({
296
+ documentId: alpha.document.id,
297
+ storageProvider: stored.storageProvider,
298
+ storageUri: stored.storageUri,
299
+ contentHash: alpha.contentHash,
300
+ sizeBytes: alpha.sizeBytes,
301
+ finalStatus,
302
+ rawStorageMetadata: buildPhaseBeta2Metadata(stored),
303
+ idempotentSkip: false,
304
+ });
305
+ }
306
+ async function runPhaseGammaOnly(pool, alpha, input) {
307
+ const storedStatus = readPersistedStoredStatus(alpha.document.rawStorageMetadata);
308
+ if (storedStatus === null) {
309
+ throw new Error(`the finalization step finalize-recovery: row ${input.documentId} has blob_uploading + storage_uri but ` +
310
+ 'no raw_storage_metadata.upload_result.stored_status sidecar (the durable URI-write step incomplete?)');
311
+ }
312
+ const storageProvider = alpha.document.storageProvider;
313
+ if (!storageProvider) {
314
+ throw new Error(`the finalization step finalize-recovery: row ${input.documentId} has no storage_provider despite a durable URI`);
315
+ }
316
+ const finalStatus = deriveFinalRawStorageStatus({ storedStatus, storageProvider });
317
+ const rowCount = await finalizeUploadAndSyncArtifact(pool, {
318
+ userId: input.userId, documentId: input.documentId,
319
+ claimId: alpha.claimId, finalStatus,
320
+ });
321
+ if (rowCount === 0) {
322
+ throw new UploadClaimLostError(input.documentId, alpha.claimId, 'gamma');
323
+ }
324
+ return buildUploadResult({
325
+ documentId: alpha.document.id,
326
+ storageProvider,
327
+ storageUri: alpha.document.storageUri,
328
+ contentHash: alpha.contentHash,
329
+ sizeBytes: alpha.sizeBytes,
330
+ finalStatus,
331
+ rawStorageMetadata: alpha.document.rawStorageMetadata,
332
+ idempotentSkip: false,
333
+ });
334
+ }
335
+ function isManagedBlobOccupied(status) {
336
+ return status === 'blob_stored'
337
+ || status === 'blob_pending'
338
+ || status === 'blob_available'
339
+ || status === 'blob_uploading';
340
+ }
341
+ /**
342
+ * Conflict guard: fires on any occupied managed_blob state where the
343
+ * incoming hash disagrees with the persisted plaintext hash. Crucially
344
+ * does NOT require `storage_uri !== null` — a `blob_uploading` row
345
+ * whose the claim step recorded the plaintext hash but whose the durable URI-write step hasn't
346
+ * yet written the URI still owns the slot, and a different-hash
347
+ * caller arriving in that window must 409 (rev-fix HIGH 1).
348
+ */
349
+ function hasConflictingManagedBlob(document, contentHash) {
350
+ return (isManagedBlobOccupied(document.rawStorageStatus)
351
+ && document.contentHash !== null
352
+ && document.contentHash !== contentHash);
353
+ }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Embedding provider abstraction.
3
+ * Supports OpenAI, Ollama, OpenAI-compatible APIs, Voyage AI, and local
4
+ * WASM (via @huggingface/transformers with ONNX Runtime). Provider/model
5
+ * selection comes from the RuntimeConfig bound by createCoreRuntime().
6
+ */
7
+ import { type WriteCostEventConfig } from './cost-telemetry.js';
8
+ import type { EmbeddingProviderName } from '../config.js';
9
+ /**
10
+ * Config subset consumed by the embedding module. After Phase 7 Step 3c,
11
+ * provider/model selection is startup-only, so it's safe for embedding to
12
+ * hold this as module-level state and rebind only on explicit reinit.
13
+ *
14
+ * Includes WriteCostEventConfig so cost-telemetry calls can be threaded
15
+ * through without a second init.
16
+ */
17
+ export interface EmbeddingConfig extends WriteCostEventConfig {
18
+ embeddingProvider: EmbeddingProviderName;
19
+ embeddingModel: string;
20
+ embeddingDimensions: number;
21
+ embeddingApiUrl?: string;
22
+ embeddingApiKey?: string;
23
+ voyageApiKey?: string;
24
+ voyageDocumentModel: string;
25
+ voyageQueryModel: string;
26
+ openaiApiKey: string;
27
+ ollamaBaseUrl: string;
28
+ embeddingCacheEnabled: boolean;
29
+ extractionCacheDir: string;
30
+ }
31
+ /**
32
+ * Bind the embedding module's config. Called once by the composition
33
+ * root (`createCoreRuntime`). Calling again rebinds and invalidates the
34
+ * stateful provider cache — primarily for tests that need to swap
35
+ * providers within a process.
36
+ */
37
+ export declare function initEmbedding(config: EmbeddingConfig): void;
38
+ export type EmbeddingTask = 'query' | 'document';
39
+ export interface EmbeddingProvider {
40
+ embed(text: string, task: EmbeddingTask): Promise<number[]>;
41
+ embedBatch(texts: string[], task: EmbeddingTask): Promise<number[][]>;
42
+ }
43
+ /** Embed a single text — primary API used throughout the codebase. */
44
+ export declare function embedText(text: string, task?: EmbeddingTask): Promise<number[]>;
45
+ /** Embed multiple texts in one call, with per-text cache integration. */
46
+ export declare function embedTexts(texts: string[], task?: EmbeddingTask): Promise<number[][]>;
47
+ /** Get current cache size (for testing/monitoring). */
48
+ export declare function getEmbeddingCacheSize(): number;
49
+ /** Clear the embedding cache (for testing). */
50
+ export declare function clearEmbeddingCache(): void;
51
+ /**
52
+ * Detect the actual embedding width returned by the active provider.
53
+ * Some OpenAI-compatible backends ignore the requested dimensions parameter,
54
+ * so the database schema must align to the real vector width, not just config.
55
+ */
56
+ export declare function resolveEmbeddingDimensions(): Promise<number>;
57
+ export { cosineSimilarity } from '../vector-math.js';