@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,56 @@
1
+ /**
2
+ * @file Paired DB transactions for `StorageService.deleteArtifact`'s
3
+ * `policy=with_documents` finalization.
4
+ *
5
+ * Step 7 follow-up fix: the artifact's CAS-on-claim update and the
6
+ * cascaded `raw_documents.raw_storage_status` propagation must
7
+ * commit or roll back together. If they were two separate DB
8
+ * operations a partial-commit could leave the artifact terminal
9
+ * (`deleted` / `delete_failed`) while the linked raw_documents
10
+ * stayed at `blob_stored`/`blob_available`, and the
11
+ * `deleteArtifact` retry path would not heal it (a second DELETE
12
+ * on a `deleted` artifact short-circuits early; a `delete_failed`
13
+ * artifact skips the reference gate).
14
+ *
15
+ * Backend.delete itself runs OUTSIDE the transaction (it is a
16
+ * network call); the DB finalization of `artifact + cascaded docs`
17
+ * is what must be atomic.
18
+ */
19
+ import pg from 'pg';
20
+ import { type StorageArtifactRow } from './storage-artifact-repository.js';
21
+ export interface FinalizeArtifactDeleteSuccessInput {
22
+ userId: string;
23
+ artifactId: string;
24
+ claimId: string;
25
+ cascadedDocumentIds: ReadonlyArray<string>;
26
+ /** Backend's delete semantics — drives the cascaded doc state. */
27
+ semantics: 'deleted' | 'unpinned' | 'tombstoned';
28
+ }
29
+ export interface FinalizeArtifactDeleteFailureInput {
30
+ userId: string;
31
+ artifactId: string;
32
+ claimId: string;
33
+ cascadedDocumentIds: ReadonlyArray<string>;
34
+ /** Error envelope for the artifact's `last_error` + each cascaded doc. */
35
+ lastError: Record<string, unknown>;
36
+ }
37
+ /**
38
+ * Success-path transaction. CAS-flips the artifact to `deleted` AND
39
+ * advances every cascaded raw_documents row to its terminal
40
+ * `blob_deleted` / `blob_tombstoned` state in one BEGIN..COMMIT.
41
+ * Either both commit or both roll back; a partial-commit cannot
42
+ * leave the rows in a drifted state.
43
+ */
44
+ export declare function finalizeArtifactDeleteSuccessTx(pool: pg.Pool, input: FinalizeArtifactDeleteSuccessInput): Promise<StorageArtifactRow>;
45
+ /**
46
+ * Failure-path transaction. CAS-flips the artifact to `delete_failed`
47
+ * (recording `last_error`) AND advances every cascaded
48
+ * raw_documents row to `raw_storage_failed` with the same envelope,
49
+ * atomically.
50
+ */
51
+ export declare function finalizeArtifactDeleteFailureTx(pool: pg.Pool, input: FinalizeArtifactDeleteFailureInput): Promise<StorageArtifactRow>;
52
+ export declare class CascadedRawDocumentMismatchError extends Error {
53
+ readonly matched: number;
54
+ readonly expectedIds: ReadonlyArray<string>;
55
+ constructor(matched: number, expectedIds: ReadonlyArray<string>);
56
+ }
@@ -0,0 +1,123 @@
1
+ /**
2
+ * @file Paired DB transactions for `StorageService.deleteArtifact`'s
3
+ * `policy=with_documents` finalization.
4
+ *
5
+ * Step 7 follow-up fix: the artifact's CAS-on-claim update and the
6
+ * cascaded `raw_documents.raw_storage_status` propagation must
7
+ * commit or roll back together. If they were two separate DB
8
+ * operations a partial-commit could leave the artifact terminal
9
+ * (`deleted` / `delete_failed`) while the linked raw_documents
10
+ * stayed at `blob_stored`/`blob_available`, and the
11
+ * `deleteArtifact` retry path would not heal it (a second DELETE
12
+ * on a `deleted` artifact short-circuits early; a `delete_failed`
13
+ * artifact skips the reference gate).
14
+ *
15
+ * Backend.delete itself runs OUTSIDE the transaction (it is a
16
+ * network call); the DB finalization of `artifact + cascaded docs`
17
+ * is what must be atomic.
18
+ */
19
+ import { markDeleteFailed, markDeleteSuccess, } from './storage-artifact-repository.js';
20
+ /**
21
+ * Success-path transaction. CAS-flips the artifact to `deleted` AND
22
+ * advances every cascaded raw_documents row to its terminal
23
+ * `blob_deleted` / `blob_tombstoned` state in one BEGIN..COMMIT.
24
+ * Either both commit or both roll back; a partial-commit cannot
25
+ * leave the rows in a drifted state.
26
+ */
27
+ export async function finalizeArtifactDeleteSuccessTx(pool, input) {
28
+ const client = await pool.connect();
29
+ try {
30
+ await client.query('BEGIN');
31
+ const artifact = await markDeleteSuccess(client, {
32
+ userId: input.userId,
33
+ id: input.artifactId,
34
+ claimId: input.claimId,
35
+ });
36
+ await propagateRawStorageTerminalWithClient(client, input.userId, input.cascadedDocumentIds, input.semantics);
37
+ await client.query('COMMIT');
38
+ return artifact;
39
+ }
40
+ catch (err) {
41
+ await client.query('ROLLBACK').catch(() => undefined);
42
+ throw err;
43
+ }
44
+ finally {
45
+ client.release();
46
+ }
47
+ }
48
+ /**
49
+ * Failure-path transaction. CAS-flips the artifact to `delete_failed`
50
+ * (recording `last_error`) AND advances every cascaded
51
+ * raw_documents row to `raw_storage_failed` with the same envelope,
52
+ * atomically.
53
+ */
54
+ export async function finalizeArtifactDeleteFailureTx(pool, input) {
55
+ const client = await pool.connect();
56
+ try {
57
+ await client.query('BEGIN');
58
+ const artifact = await markDeleteFailed(client, {
59
+ userId: input.userId,
60
+ id: input.artifactId,
61
+ claimId: input.claimId,
62
+ lastError: input.lastError,
63
+ });
64
+ await propagateRawStorageFailureWithClient(client, input.userId, input.cascadedDocumentIds, input.lastError);
65
+ await client.query('COMMIT');
66
+ return artifact;
67
+ }
68
+ catch (err) {
69
+ await client.query('ROLLBACK').catch(() => undefined);
70
+ throw err;
71
+ }
72
+ finally {
73
+ client.release();
74
+ }
75
+ }
76
+ async function propagateRawStorageTerminalWithClient(client, userId, ids, semantics) {
77
+ if (ids.length === 0)
78
+ return;
79
+ const uniqueIds = Array.from(new Set(ids));
80
+ const newStatus = semantics === 'deleted' ? 'blob_deleted' : 'blob_tombstoned';
81
+ const result = await client.query(`UPDATE raw_documents
82
+ SET raw_storage_status = $1, updated_at = NOW()
83
+ WHERE user_id = $2 AND id = ANY($3::uuid[]) AND deleted_at IS NOT NULL`, [newStatus, userId, uniqueIds]);
84
+ assertCascadedRowCount(result.rowCount ?? 0, uniqueIds);
85
+ }
86
+ async function propagateRawStorageFailureWithClient(client, userId, ids, lastError) {
87
+ if (ids.length === 0)
88
+ return;
89
+ const uniqueIds = Array.from(new Set(ids));
90
+ const result = await client.query(`UPDATE raw_documents
91
+ SET raw_storage_status = 'raw_storage_failed',
92
+ last_error = $1::jsonb,
93
+ updated_at = NOW()
94
+ WHERE user_id = $2 AND id = ANY($3::uuid[]) AND deleted_at IS NOT NULL`, [JSON.stringify(lastError), userId, uniqueIds]);
95
+ assertCascadedRowCount(result.rowCount ?? 0, uniqueIds);
96
+ }
97
+ /**
98
+ * Refuse to commit the paired tx when the cascaded raw_documents
99
+ * UPDATE matched fewer rows than the caller asked us to propagate
100
+ * onto. SQL UPDATE success is not semantic success — a stale id,
101
+ * wrong-owner id, or not-yet-soft-deleted id would otherwise let the
102
+ * artifact finalize as `deleted` / `delete_failed` while at least
103
+ * one intended raw_document stayed at `blob_stored` / `blob_available`,
104
+ * and no retry path heals that drift. Throwing rolls back the whole
105
+ * tx so caller + DB stay consistent.
106
+ */
107
+ function assertCascadedRowCount(matched, uniqueIds) {
108
+ if (matched === uniqueIds.length)
109
+ return;
110
+ throw new CascadedRawDocumentMismatchError(matched, uniqueIds);
111
+ }
112
+ export class CascadedRawDocumentMismatchError extends Error {
113
+ matched;
114
+ expectedIds;
115
+ constructor(matched, expectedIds) {
116
+ super(`finalize cascade matched ${matched} of ${expectedIds.length} raw_documents ` +
117
+ `(ids: ${expectedIds.join(', ')}) — refusing to finalize artifact while ` +
118
+ 'a cascaded row remains stale');
119
+ this.matched = matched;
120
+ this.expectedIds = expectedIds;
121
+ this.name = 'CascadedRawDocumentMismatchError';
122
+ }
123
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @file Neutral constants for `storage_artifacts.provider` values.
3
+ *
4
+ * Step 7 originally exported `EXTERNAL_POINTER_PROVIDER` from
5
+ * `services/document-upload-artifact-sync.ts`, but that reversed the
6
+ * dependency direction: `db/raw-document-repository.ts` (a low-level
7
+ * persistence module) had to import from a service. Moving the
8
+ * constant here keeps the DB and service layers free to share it
9
+ * without the cycle.
10
+ */
11
+ /**
12
+ * `provider` value for pointer-mode `storage_artifacts` rows created
13
+ * at document-registration time. The bytes live at a caller-supplied
14
+ * URI managed by some external system; the AtomicMemory deployment
15
+ * is NOT the provider — it only tracks the reference. Treated as a
16
+ * backend-agnostic external pointer; the redaction allowlist
17
+ * (`src/storage/artifact-public-redaction.ts`) does not have an
18
+ * entry for `'external_pointer'`, so `identifiers` /
19
+ * `provider_details` come back as empty objects on the wire.
20
+ */
21
+ export declare const EXTERNAL_POINTER_PROVIDER: "external_pointer";
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @file Neutral constants for `storage_artifacts.provider` values.
3
+ *
4
+ * Step 7 originally exported `EXTERNAL_POINTER_PROVIDER` from
5
+ * `services/document-upload-artifact-sync.ts`, but that reversed the
6
+ * dependency direction: `db/raw-document-repository.ts` (a low-level
7
+ * persistence module) had to import from a service. Moving the
8
+ * constant here keeps the DB and service layers free to share it
9
+ * without the cycle.
10
+ */
11
+ /**
12
+ * `provider` value for pointer-mode `storage_artifacts` rows created
13
+ * at document-registration time. The bytes live at a caller-supplied
14
+ * URI managed by some external system; the AtomicMemory deployment
15
+ * is NOT the provider — it only tracks the reference. Treated as a
16
+ * backend-agnostic external pointer; the redaction allowlist
17
+ * (`src/storage/artifact-public-redaction.ts`) does not have an
18
+ * entry for `'external_pointer'`, so `identifiers` /
19
+ * `provider_details` come back as empty objects on the wire.
20
+ */
21
+ export const EXTERNAL_POINTER_PROVIDER = 'external_pointer';
@@ -0,0 +1,66 @@
1
+ /**
2
+ * @file Storage-level recovery-hint repository.
3
+ *
4
+ * `recordStorageUploadRecoveryHint` writes an
5
+ * `internal_recovery_hint` envelope onto `storage_artifacts.last_error`
6
+ * for a pending row, scoped by `(id, user_id, put_attempt_id)` CAS.
7
+ * The helper exists as its own module (not folded into
8
+ * `storage-artifact-repository.ts`) so the existing 800-line repo
9
+ * file stays under the workspace LOC cap and so the recovery
10
+ * envelope shape is documented in a single place.
11
+ *
12
+ * v1 path: reuses the existing `last_error` JSONB column. A
13
+ * dedicated `storage_recovery_events` table is deferred — multi-step
14
+ * recovery state machines can land that table when a real consumer
15
+ * shows up.
16
+ *
17
+ * Document-side recovery (the rarer post-put orphan branch in
18
+ * `storage-put-recovery.ts`) writes its own envelopes. This helper
19
+ * is for non-document storage flows that produce a recovery hint
20
+ * BEFORE the row leaves the `pending` state — direct
21
+ * `POST /v1/storage/artifacts` uploads, the future Filecoin
22
+ * readiness gate, etc. The envelope shape matches the existing
23
+ * `{ layer, code, message, occurred_at }` contract so log readers
24
+ * see one consistent shape.
25
+ */
26
+ import type pg from 'pg';
27
+ /**
28
+ * Closed type for the recovery hint code. New entries land here as
29
+ * the contract grows; ad-hoc strings are rejected at the API
30
+ * boundary so log consumers can rely on a stable enum.
31
+ */
32
+ export type StorageUploadRecoveryHintCode = 'manual_delete_required' | 'awaiting_provider_readiness' | 'awaiting_payment_authorization' | 'operator_intervention_required';
33
+ export interface StorageUploadRecoveryHintInput {
34
+ readonly artifactId: string;
35
+ readonly userId: string;
36
+ readonly putAttemptId: string;
37
+ readonly hint: StorageUploadRecoveryHintCode;
38
+ readonly message?: string;
39
+ readonly storageProvider?: string;
40
+ }
41
+ /**
42
+ * Shape of the JSONB envelope written to `storage_artifacts.last_error`.
43
+ * Exported so tests + downstream log consumers can construct or
44
+ * inspect envelopes without re-typing the field set.
45
+ */
46
+ export interface StorageUploadRecoveryHintEnvelope {
47
+ readonly layer: 'raw_storage';
48
+ readonly code: 'internal_recovery_hint';
49
+ readonly internal_recovery_hint: StorageUploadRecoveryHintCode;
50
+ readonly message: string;
51
+ readonly storage_provider?: string;
52
+ readonly occurred_at: string;
53
+ }
54
+ export declare function buildRecoveryHintEnvelope(input: StorageUploadRecoveryHintInput, now?: () => Date): StorageUploadRecoveryHintEnvelope;
55
+ /**
56
+ * CAS-write a recovery hint onto `storage_artifacts.last_error` for
57
+ * a pending row. Returns `true` when the CAS matched (`id`,
58
+ * `user_id`, `put_attempt_id`, `status='pending'`), `false` when
59
+ * the row was finalized or claimed by another worker.
60
+ *
61
+ * The hint is RECORDED ONLY — this helper does not mutate `status`,
62
+ * `put_attempt_id`, or any other column. The next phase (manual
63
+ * operator intervention, retry, etc.) is responsible for clearing
64
+ * or replacing the hint via the existing CAS helpers.
65
+ */
66
+ export declare function recordStorageUploadRecoveryHint(q: pg.Pool | pg.PoolClient, input: StorageUploadRecoveryHintInput, now?: () => Date): Promise<boolean>;
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @file Storage-level recovery-hint repository.
3
+ *
4
+ * `recordStorageUploadRecoveryHint` writes an
5
+ * `internal_recovery_hint` envelope onto `storage_artifacts.last_error`
6
+ * for a pending row, scoped by `(id, user_id, put_attempt_id)` CAS.
7
+ * The helper exists as its own module (not folded into
8
+ * `storage-artifact-repository.ts`) so the existing 800-line repo
9
+ * file stays under the workspace LOC cap and so the recovery
10
+ * envelope shape is documented in a single place.
11
+ *
12
+ * v1 path: reuses the existing `last_error` JSONB column. A
13
+ * dedicated `storage_recovery_events` table is deferred — multi-step
14
+ * recovery state machines can land that table when a real consumer
15
+ * shows up.
16
+ *
17
+ * Document-side recovery (the rarer post-put orphan branch in
18
+ * `storage-put-recovery.ts`) writes its own envelopes. This helper
19
+ * is for non-document storage flows that produce a recovery hint
20
+ * BEFORE the row leaves the `pending` state — direct
21
+ * `POST /v1/storage/artifacts` uploads, the future Filecoin
22
+ * readiness gate, etc. The envelope shape matches the existing
23
+ * `{ layer, code, message, occurred_at }` contract so log readers
24
+ * see one consistent shape.
25
+ */
26
+ export function buildRecoveryHintEnvelope(input, now = () => new Date()) {
27
+ const envelope = {
28
+ layer: 'raw_storage',
29
+ code: 'internal_recovery_hint',
30
+ internal_recovery_hint: input.hint,
31
+ message: input.message ?? input.hint,
32
+ ...(input.storageProvider ? { storage_provider: input.storageProvider } : {}),
33
+ occurred_at: now().toISOString(),
34
+ };
35
+ return envelope;
36
+ }
37
+ /**
38
+ * CAS-write a recovery hint onto `storage_artifacts.last_error` for
39
+ * a pending row. Returns `true` when the CAS matched (`id`,
40
+ * `user_id`, `put_attempt_id`, `status='pending'`), `false` when
41
+ * the row was finalized or claimed by another worker.
42
+ *
43
+ * The hint is RECORDED ONLY — this helper does not mutate `status`,
44
+ * `put_attempt_id`, or any other column. The next phase (manual
45
+ * operator intervention, retry, etc.) is responsible for clearing
46
+ * or replacing the hint via the existing CAS helpers.
47
+ */
48
+ export async function recordStorageUploadRecoveryHint(q, input, now = () => new Date()) {
49
+ const envelope = buildRecoveryHintEnvelope(input, now);
50
+ const result = await q.query(`UPDATE storage_artifacts
51
+ SET last_error = $4::jsonb,
52
+ updated_at = NOW()
53
+ WHERE id = $1
54
+ AND user_id = $2
55
+ AND put_attempt_id = $3
56
+ AND status = 'pending'`, [input.artifactId, input.userId, input.putAttemptId, JSON.stringify(envelope)]);
57
+ return (result.rowCount ?? 0) > 0;
58
+ }
@@ -0,0 +1,329 @@
1
+ /**
2
+ * @file Postgres queries for the `storage_artifacts` table.
3
+ *
4
+ * Step 4 of the storage-sibling plan. Single DB seam for everything
5
+ * artifact-shaped. No HTTP routes, no business logic, no response
6
+ * formatters — those land in Step 5.
7
+ *
8
+ * Owner-scoping rule: every public method except `createStorageArtifact`
9
+ * takes `userId` and routes it into the WHERE clause. Cross-user reads
10
+ * and writes return `null` / zero / no rows; they never throw. The
11
+ * route layer (Step 5) is responsible for translating that into the
12
+ * correct 404 envelope.
13
+ *
14
+ * Internal columns:
15
+ * * `plaintext_hash` / `stored_hash` — visible on the repository's
16
+ * row type for diagnostic queries. The Step-5 response formatter
17
+ * is the only call site that decides whether to expose them on
18
+ * the wire (gated by `discloseContentHash`).
19
+ * * `last_error` — internal failure envelope; same story.
20
+ *
21
+ * The repo writes a closed set of `status` values:
22
+ *
23
+ * stored | pending | available | unavailable | deleting | deleted
24
+ * | delete_failed | failed
25
+ *
26
+ * Mirrors the SDK's `StorageArtifactStatus` and is enforced by the
27
+ * `storage_artifacts_status_check` constraint in `schema.sql`.
28
+ */
29
+ import pg from 'pg';
30
+ /** Internal lifecycle state — closed enum mirrored from the SDK. */
31
+ export type StorageArtifactStatus = 'stored' | 'pending' | 'available' | 'unavailable' | 'deleting' | 'deleted' | 'delete_failed' | 'failed';
32
+ export type StorageArtifactMode = 'pointer' | 'managed';
33
+ export type StorageContentEncoding = 'identity' | 'aes_gcm';
34
+ /**
35
+ * Full column projection. Carries the internal-only columns
36
+ * (`plaintext_hash`, `stored_hash`, `last_error`) — Step-5 wire
37
+ * projection is responsible for redaction.
38
+ */
39
+ export interface StorageArtifactRow {
40
+ id: string;
41
+ userId: string;
42
+ orgId: string | null;
43
+ projectId: string | null;
44
+ provider: string;
45
+ mode: StorageArtifactMode;
46
+ /**
47
+ * Adapter URI. NULL while a managed row is in `pending` (the
48
+ * backend hasn't returned a URI yet) or `failed` (backend.put
49
+ * threw). Always set on `pointer` rows and on managed rows that
50
+ * reached `stored` / `available`.
51
+ */
52
+ uri: string | null;
53
+ status: StorageArtifactStatus;
54
+ sizeBytes: number | null;
55
+ contentType: string | null;
56
+ plaintextHash: string | null;
57
+ storedHash: string | null;
58
+ contentEncoding: StorageContentEncoding;
59
+ discloseContentHash: boolean;
60
+ identifiers: Record<string, unknown>;
61
+ lifecycle: Record<string, unknown>;
62
+ replication: Record<string, unknown> | null;
63
+ verification: Record<string, unknown> | null;
64
+ retrieval: Record<string, unknown> | null;
65
+ providerDetails: Record<string, unknown> | null;
66
+ metadata: Record<string, unknown>;
67
+ lastError: Record<string, unknown> | null;
68
+ /** CAS token for the upload pipeline (pending → stored / failed). */
69
+ putAttemptId: string | null;
70
+ deleteAttemptId: string | null;
71
+ createdAt: Date;
72
+ updatedAt: Date;
73
+ deletedAt: Date | null;
74
+ }
75
+ export interface CreateStorageArtifactInput {
76
+ userId: string;
77
+ orgId?: string | null;
78
+ projectId?: string | null;
79
+ provider: string;
80
+ mode: StorageArtifactMode;
81
+ uri: string;
82
+ status: StorageArtifactStatus;
83
+ sizeBytes?: number | null;
84
+ contentType?: string | null;
85
+ plaintextHash?: string | null;
86
+ storedHash?: string | null;
87
+ contentEncoding?: StorageContentEncoding;
88
+ discloseContentHash?: boolean;
89
+ identifiers?: Record<string, unknown>;
90
+ lifecycle?: Record<string, unknown>;
91
+ replication?: Record<string, unknown> | null;
92
+ verification?: Record<string, unknown> | null;
93
+ retrieval?: Record<string, unknown> | null;
94
+ providerDetails?: Record<string, unknown> | null;
95
+ metadata?: Record<string, unknown>;
96
+ }
97
+ export interface StorageArtifactListCursor {
98
+ createdAt: string;
99
+ id: string;
100
+ }
101
+ export interface ListArtifactsOptions {
102
+ limit: number;
103
+ cursor?: StorageArtifactListCursor;
104
+ }
105
+ export interface ListArtifactsResult {
106
+ rows: StorageArtifactRow[];
107
+ nextCursor: StorageArtifactListCursor | null;
108
+ }
109
+ export interface MarkDeleteSuccessInput {
110
+ userId: string;
111
+ id: string;
112
+ claimId: string;
113
+ }
114
+ export interface MarkDeleteFailedInput {
115
+ userId: string;
116
+ id: string;
117
+ claimId: string;
118
+ lastError: Record<string, unknown>;
119
+ }
120
+ /**
121
+ * Insert a new artifact row. Status, provider, and mode must already
122
+ * be validated by the caller — the DB-level CHECKs are a backstop, not
123
+ * a substitute for service-layer input validation.
124
+ */
125
+ export declare function createStorageArtifact(q: pg.Pool | pg.PoolClient, input: CreateStorageArtifactInput): Promise<StorageArtifactRow>;
126
+ /**
127
+ * Pending-row-first upload helpers — see
128
+ * `StorageService.putManaged` for the full lifecycle. The flow:
129
+ *
130
+ * 1. `claimPendingArtifact` inserts `status='pending'`, `uri=NULL`,
131
+ * `put_attempt_id=<fresh uuid>`. Returns the row + claim id.
132
+ * 2. Service calls `backend.put(...)` OUTSIDE the DB.
133
+ * 3a. On success: `recordUploadedArtifact` CAS-flips the row to
134
+ * `status='stored'`, sets `uri` + hashes + size, clears
135
+ * `put_attempt_id`. Returns the updated row.
136
+ * 3b. On `backend.put` failure: `markPutFailed` CAS-flips the row
137
+ * to `status='failed'`, records `last_error`, clears
138
+ * `put_attempt_id`.
139
+ * 3c. On post-put DB failure: the service's recovery path runs
140
+ * backend cleanup and writes a durable failed marker on the
141
+ * row (`put_post_persist_failed_cleaned_up` envelope) so ops
142
+ * sees `status='failed'`. When cleanup also fails, a durable
143
+ * `put_post_persist_unrecoverable` envelope captures the
144
+ * orphan URI on `last_error` server-side so the reconciler
145
+ * can find and delete the abandoned bytes later. See
146
+ * `services/storage-put-recovery.ts` for the full branch tree.
147
+ */
148
+ export interface ClaimPendingArtifactInput {
149
+ userId: string;
150
+ orgId?: string | null;
151
+ projectId?: string | null;
152
+ provider: string;
153
+ contentType?: string | null;
154
+ contentEncoding?: StorageContentEncoding;
155
+ discloseContentHash?: boolean;
156
+ metadata?: Record<string, unknown>;
157
+ }
158
+ export interface ClaimPendingArtifactResult {
159
+ row: StorageArtifactRow;
160
+ claimId: string;
161
+ }
162
+ /**
163
+ * Insert a `status='pending'` managed artifact row with a fresh
164
+ * `put_attempt_id`. The URI is NULL — set by `recordUploadedArtifact`
165
+ * after the backend put succeeds.
166
+ */
167
+ export declare function claimPendingArtifact(q: pg.Pool | pg.PoolClient, input: ClaimPendingArtifactInput): Promise<ClaimPendingArtifactResult>;
168
+ export interface RecordUploadedArtifactInput {
169
+ userId: string;
170
+ artifactId: string;
171
+ putAttemptId: string;
172
+ uri: string;
173
+ sizeBytes: number;
174
+ plaintextHash: string;
175
+ storedHash: string;
176
+ identifiers?: Record<string, unknown>;
177
+ providerDetails?: Record<string, unknown> | null;
178
+ }
179
+ /**
180
+ * CAS-flip a pending row to `status='stored'`. Matches on
181
+ * `(id, user_id, put_attempt_id, status='pending')` so a stale
182
+ * caller cannot finalize someone else's claim. Returns the updated
183
+ * row when the CAS succeeded; `null` when it lost the race.
184
+ */
185
+ export declare function recordUploadedArtifact(q: pg.Pool | pg.PoolClient, input: RecordUploadedArtifactInput): Promise<StorageArtifactRow | null>;
186
+ export interface MarkPutFailedInput {
187
+ userId: string;
188
+ artifactId: string;
189
+ putAttemptId: string;
190
+ lastError: Record<string, unknown>;
191
+ }
192
+ /**
193
+ * CAS-flip a pending row to `status='failed'` with the supplied
194
+ * `last_error` envelope. Same CAS shape as `recordUploadedArtifact`.
195
+ * Returns the failed row when the CAS succeeded; `null` when it
196
+ * lost the race (claim already cleared by another caller).
197
+ */
198
+ export declare function markPutFailed(q: pg.Pool | pg.PoolClient, input: MarkPutFailedInput): Promise<StorageArtifactRow | null>;
199
+ /** Owner-scoped lookup. Returns `null` for cross-user / missing / deleted rows. */
200
+ export declare function getStorageArtifactById(pool: pg.Pool, userId: string, id: string): Promise<StorageArtifactRow | null>;
201
+ /**
202
+ * Owner-scoped lookup that DOES return soft-deleted rows. Used by
203
+ * the delete-policy state machine so a second `DELETE` on an
204
+ * already-deleted artifact can return the prior terminal envelope
205
+ * (the plan's idempotency contract) instead of a 404.
206
+ */
207
+ export declare function getStorageArtifactByIdIncludingDeleted(pool: pg.Pool, userId: string, id: string): Promise<StorageArtifactRow | null>;
208
+ /**
209
+ * Mark an artifact `status='deleted'` + stamp `deleted_at`. Used by
210
+ * Step 7's document-ingestion refactor when a managed upload
211
+ * replaces a previously-linked pointer artifact (or when a managed
212
+ * artifact's bytes are cleaned up post-document-delete). Owner-
213
+ * scoped + idempotent: a row that is already `deleted` stays so.
214
+ *
215
+ * Distinct from `markDeleteSuccess` because there is no claim id
216
+ * to CAS on — the caller has already confirmed the row should be
217
+ * tombstoned (e.g. the upload service holds the document-row
218
+ * advisory lock).
219
+ */
220
+ export declare function softDeleteArtifactByIdWithClient(q: pg.Pool | pg.PoolClient, userId: string, id: string): Promise<void>;
221
+ /**
222
+ * Count active `raw_documents` rows that reference this artifact for
223
+ * the supplied owner. The Step-5 delete route uses this to enforce
224
+ * the `artifact_in_use` 409 envelope when callers omit
225
+ * `policy=with_documents`.
226
+ *
227
+ * Owner-scope invariant: the count includes a row only when BOTH the
228
+ * artifact and the referencing document belong to `$userId`. The
229
+ * schema-level composite FK on `raw_documents(storage_artifact_id,
230
+ * user_id) -> storage_artifacts(id, user_id)` makes the cross-user
231
+ * row impossible, but this join restates the invariant explicitly so
232
+ * the query is unambiguous against any DB that pre-dates the
233
+ * composite FK.
234
+ */
235
+ export declare function countReferencingDocuments(pool: pg.Pool, userId: string, artifactId: string): Promise<number>;
236
+ /**
237
+ * Return the ids of active `raw_documents` rows that reference this
238
+ * artifact for the supplied owner. Same owner-scope invariant as
239
+ * `countReferencingDocuments`. Used by the delete `with_documents`
240
+ * cascade path so the service can soft-delete each referencing
241
+ * document before flipping the artifact's status.
242
+ */
243
+ export declare function listReferencingDocumentIds(pool: pg.Pool, userId: string, artifactId: string): Promise<string[]>;
244
+ /**
245
+ * Atomically transition an artifact into `status='deleting'` and stamp
246
+ * a fresh `delete_attempt_id`. Returns the new claim id on success,
247
+ * `null` when the row is missing, cross-user, or already in a state
248
+ * that forbids a new claim (`deleting` / `deleted`).
249
+ *
250
+ * `delete_failed` rows ARE re-claimable so the delete-retry path can
251
+ * make forward progress; the plan defines the second `DELETE` on a
252
+ * `delete_failed` row as a retry, not an error. The retry path also
253
+ * clears the prior `last_error` so the in-flight artifact never
254
+ * reports `status='deleting'` alongside a stale provider error — the
255
+ * field is repopulated only if THIS attempt fails.
256
+ */
257
+ export declare function claimDeleteAttempt(pool: pg.Pool, userId: string, id: string): Promise<{
258
+ claimId: string;
259
+ } | null>;
260
+ /**
261
+ * Finalize a successful delete. The row's `status` flips to `deleted`,
262
+ * `deleted_at` is stamped, and the `delete_attempt_id` is cleared.
263
+ * The CAS condition (matching claim id + current `status='deleting'`)
264
+ * means a stale caller cannot finalize someone else's claim.
265
+ *
266
+ * Throws when no row matches — callers MUST hold a current claim.
267
+ */
268
+ export declare function markDeleteSuccess(q: pg.Pool | pg.PoolClient, args: MarkDeleteSuccessInput): Promise<StorageArtifactRow>;
269
+ /**
270
+ * Record a provider-cleanup failure. Same CAS guard as
271
+ * `markDeleteSuccess`; `last_error` is replaced with the supplied
272
+ * envelope so the caller can retry against a clean state. Status
273
+ * lands on `delete_failed`, which is re-claimable by a subsequent
274
+ * `claimDeleteAttempt`.
275
+ */
276
+ export declare function markDeleteFailed(q: pg.Pool | pg.PoolClient, args: MarkDeleteFailedInput): Promise<StorageArtifactRow>;
277
+ export interface ReleaseDeleteClaimInput {
278
+ userId: string;
279
+ id: string;
280
+ claimId: string;
281
+ /** Status the row must revert to (typically the pre-claim status). */
282
+ restoreStatus: StorageArtifactStatus;
283
+ /** `last_error` the row had before the claim cleared it. */
284
+ restoreLastError: Record<string, unknown> | null;
285
+ }
286
+ /**
287
+ * Release a `deleting` claim without finalizing. Used by the
288
+ * delete-cascade race fix (Commit D): claim runs BEFORE the
289
+ * reference-count gate so concurrent INSERTs cannot slip in a new
290
+ * link, but if the gate then throws `ArtifactInUseError` we must
291
+ * revert the row from `deleting` back to its pre-claim status
292
+ * (and restore the pre-claim `last_error`, since `claimDeleteAttempt`
293
+ * cleared it). CAS-scoped to the row's `(user_id, delete_attempt_id,
294
+ * status='deleting')` so a stale caller cannot revert someone
295
+ * else's claim. Returns true on a real revert, false on CAS miss
296
+ * (e.g., concurrent recovery already finalized the row).
297
+ */
298
+ export declare function releaseDeleteClaim(pool: pg.Pool, args: ReleaseDeleteClaimInput): Promise<boolean>;
299
+ /**
300
+ * Sentinel thrown by `assertArtifactLinkable` when a caller tries
301
+ * to link a `raw_documents.storage_artifact_id` to an artifact
302
+ * that has already entered (or completed) its delete lifecycle.
303
+ * The link-write sites surface this so a concurrent delete cannot
304
+ * race with a fresh link and end up with a document pointing at
305
+ * deleted content.
306
+ */
307
+ export declare class ArtifactNotLinkableError extends Error {
308
+ readonly artifactId: string;
309
+ readonly status: StorageArtifactStatus;
310
+ constructor(artifactId: string, status: StorageArtifactStatus);
311
+ }
312
+ /**
313
+ * Refuse to link a `raw_documents` row to an artifact whose status
314
+ * is in `UNLINKABLE_STATUSES`. Throws `ArtifactNotLinkableError`
315
+ * on a hit; no-ops otherwise. Takes a `PoolClient` so the caller
316
+ * can scope the check to its own transaction.
317
+ */
318
+ export declare function assertArtifactLinkable(q: pg.Pool | pg.PoolClient, userId: string, artifactId: string): Promise<void>;
319
+ /**
320
+ * List a user's artifacts in `(created_at DESC, id DESC)` order with
321
+ * keyset pagination. The cursor encodes the last row of the previous
322
+ * page; pass `undefined` for the first page. Returns `nextCursor=null`
323
+ * when the caller has reached the end of the user's rows.
324
+ *
325
+ * Soft-deleted rows (`deleted_at IS NOT NULL`) are excluded from the
326
+ * listing — the Step-5 list endpoint does NOT show tombstones by
327
+ * default.
328
+ */
329
+ export declare function listArtifactsForUser(pool: pg.Pool, userId: string, opts: ListArtifactsOptions): Promise<ListArtifactsResult>;