@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,42 @@
1
+ /**
2
+ * @file PII-safe storage-key prefix derivation.
3
+ *
4
+ * The storage-sibling plan removed plaintext `users/${userId}/...`
5
+ * path segments from every provider key/URI we hand to a backend.
6
+ * Replacement: an HMAC-SHA256 prefix that is:
7
+ *
8
+ * - deterministic (same `(secret, userId)` → same 32-hex prefix),
9
+ * so retries / same-bytes re-uploads still collide on the same
10
+ * key and the idempotency contract holds end-to-end;
11
+ * - non-reversible (HMAC of a server-side secret), so an
12
+ * operator scanning backend listings cannot recover the
13
+ * `user_id` from a key — addresses the PII leak that motivated
14
+ * this commit;
15
+ * - per-user (different `userId` derives a different prefix), so
16
+ * ownership is still visually separable in the backend listing
17
+ * (one prefix = one user).
18
+ *
19
+ * Output shape: the leading 32 hex chars (16 bytes) of the HMAC.
20
+ * 16 bytes is enough collision resistance — birthday at 2^64 over
21
+ * the user-space — while keeping keys short. The `s/<hex32>/`
22
+ * route is the only consumer; do NOT slice differently elsewhere.
23
+ *
24
+ * The secret is required at startup via
25
+ * `RuntimeConfig.storageKeyHmacSecret`; callers thread it through
26
+ * the service constructors. NEVER read `process.env` directly here.
27
+ */
28
+ /**
29
+ * Length of the hex slice we keep as the per-user prefix.
30
+ * Workspace constant — do not change without a key-migration plan
31
+ * (existing keys would no longer collide with their re-upload).
32
+ */
33
+ export declare const STORAGE_KEY_PREFIX_LENGTH = 32;
34
+ /**
35
+ * Derive the per-user HMAC prefix used at the head of every
36
+ * managed-storage key. Stable across retries; non-reversible.
37
+ *
38
+ * `secret` is the deployment-wide `STORAGE_KEY_HMAC_SECRET`. The
39
+ * caller MUST source it from `RuntimeConfig.storageKeyHmacSecret`
40
+ * (validated at startup as >=64 hex chars); never read env here.
41
+ */
42
+ export declare function deriveStorageKeyPrefix(secret: string, userId: string): string;
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @file PII-safe storage-key prefix derivation.
3
+ *
4
+ * The storage-sibling plan removed plaintext `users/${userId}/...`
5
+ * path segments from every provider key/URI we hand to a backend.
6
+ * Replacement: an HMAC-SHA256 prefix that is:
7
+ *
8
+ * - deterministic (same `(secret, userId)` → same 32-hex prefix),
9
+ * so retries / same-bytes re-uploads still collide on the same
10
+ * key and the idempotency contract holds end-to-end;
11
+ * - non-reversible (HMAC of a server-side secret), so an
12
+ * operator scanning backend listings cannot recover the
13
+ * `user_id` from a key — addresses the PII leak that motivated
14
+ * this commit;
15
+ * - per-user (different `userId` derives a different prefix), so
16
+ * ownership is still visually separable in the backend listing
17
+ * (one prefix = one user).
18
+ *
19
+ * Output shape: the leading 32 hex chars (16 bytes) of the HMAC.
20
+ * 16 bytes is enough collision resistance — birthday at 2^64 over
21
+ * the user-space — while keeping keys short. The `s/<hex32>/`
22
+ * route is the only consumer; do NOT slice differently elsewhere.
23
+ *
24
+ * The secret is required at startup via
25
+ * `RuntimeConfig.storageKeyHmacSecret`; callers thread it through
26
+ * the service constructors. NEVER read `process.env` directly here.
27
+ */
28
+ import { createHmac } from 'node:crypto';
29
+ /**
30
+ * Length of the hex slice we keep as the per-user prefix.
31
+ * Workspace constant — do not change without a key-migration plan
32
+ * (existing keys would no longer collide with their re-upload).
33
+ */
34
+ export const STORAGE_KEY_PREFIX_LENGTH = 32;
35
+ /**
36
+ * Derive the per-user HMAC prefix used at the head of every
37
+ * managed-storage key. Stable across retries; non-reversible.
38
+ *
39
+ * `secret` is the deployment-wide `STORAGE_KEY_HMAC_SECRET`. The
40
+ * caller MUST source it from `RuntimeConfig.storageKeyHmacSecret`
41
+ * (validated at startup as >=64 hex chars); never read env here.
42
+ */
43
+ export function deriveStorageKeyPrefix(secret, userId) {
44
+ return createHmac('sha256', secret).update(userId).digest('hex').slice(0, STORAGE_KEY_PREFIX_LENGTH);
45
+ }
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @file Pending-row-first put recovery helpers for `StorageService`.
3
+ *
4
+ * `storage-service.ts` orchestrates managed-mode puts: claim a
5
+ * pending row, call `backend.put`, finalize via a CAS to `'stored'`.
6
+ * This module owns every branch the orchestrator hands off to when
7
+ * something on either side fails, plus the closed-set event names
8
+ * the helpers emit:
9
+ *
10
+ * - `persistUploadedOrRecover` — happy success + retry, then
11
+ * reconciliation (commit-after-throw), then recovery.
12
+ * - `recordBackendPutFailure` — `backend.put` threw before
13
+ * finalization; CAS-flip to `'failed'`.
14
+ * - the post-put recovery branches (cleanup OK / cleanup failed)
15
+ * and the durable orphan-URI marker that the reconciler reads.
16
+ *
17
+ * Extracted from `storage-service.ts` to keep that file under the
18
+ * workspace 400-LOC cap. No behavior change vs the inline form.
19
+ */
20
+ import type pg from 'pg';
21
+ import { type StorageArtifactRow } from '../db/storage-artifact-repository.js';
22
+ import type { PutBackendResult, StorageBackend } from '../storage/storage-backend.js';
23
+ /** Re-export of the backend `put` result shape used by the recovery helpers. */
24
+ export type PutResult = PutBackendResult;
25
+ /**
26
+ * Closed enum of structured-log event names emitted by the put
27
+ * recovery pipeline. Adding a name here is the explicit permission
28
+ * to surface it in the `[STORAGE]` log stream; the TS checker
29
+ * blocks accidental typos.
30
+ */
31
+ export type StorageEventName = 'storage.put.post_put_unrecoverable' | 'storage.put.post_put_failed_cleaned_up' | 'storage.put.post_put_unrecoverable_mark_error' | 'storage.put.post_put_failed_cleaned_up_mark_error' | 'storage.put.backend_put_failed_mark_skipped' | 'storage.put.backend_put_failed_mark_error';
32
+ /**
33
+ * Normalize an arbitrary thrown value into a single-line string.
34
+ * Exported because `StorageService.executeBackendDelete` also
35
+ * needs to format `backend.delete` errors into `last_error`
36
+ * envelopes; the function shape is identical to the one the
37
+ * recovery helpers use so they share a single implementation.
38
+ */
39
+ export declare function errorMessage(err: unknown): string;
40
+ export interface PutClaim {
41
+ row: StorageArtifactRow;
42
+ claimId: string;
43
+ }
44
+ /**
45
+ * Success-path orchestrator: CAS-flip the pending row to `stored`,
46
+ * with one retry. On every failure mode (throw, CAS miss, or the
47
+ * commit-after-throw race) call `reconcileAlreadyFinalized` BEFORE
48
+ * recovery so an already-finalized row is not erroneously cleaned
49
+ * up.
50
+ */
51
+ export declare function persistUploadedOrRecover(args: {
52
+ pool: pg.Pool;
53
+ userId: string;
54
+ backend: StorageBackend;
55
+ claim: PutClaim;
56
+ putResult: PutResult;
57
+ }): Promise<StorageArtifactRow>;
58
+ /**
59
+ * Failure branch invoked from `putManaged` when `backend.put`
60
+ * itself threw. CAS-flip the pending row to `'failed'`. If the CAS
61
+ * marker misses or its UPDATE throws, emit a typed event so the
62
+ * failure stays observable; the caller re-throws the original put
63
+ * error regardless.
64
+ */
65
+ export declare function recordBackendPutFailure(args: {
66
+ pool: pg.Pool;
67
+ userId: string;
68
+ claim: PutClaim;
69
+ provider: string;
70
+ putError: unknown;
71
+ }): Promise<void>;
@@ -0,0 +1,269 @@
1
+ /**
2
+ * @file Pending-row-first put recovery helpers for `StorageService`.
3
+ *
4
+ * `storage-service.ts` orchestrates managed-mode puts: claim a
5
+ * pending row, call `backend.put`, finalize via a CAS to `'stored'`.
6
+ * This module owns every branch the orchestrator hands off to when
7
+ * something on either side fails, plus the closed-set event names
8
+ * the helpers emit:
9
+ *
10
+ * - `persistUploadedOrRecover` — happy success + retry, then
11
+ * reconciliation (commit-after-throw), then recovery.
12
+ * - `recordBackendPutFailure` — `backend.put` threw before
13
+ * finalization; CAS-flip to `'failed'`.
14
+ * - the post-put recovery branches (cleanup OK / cleanup failed)
15
+ * and the durable orphan-URI marker that the reconciler reads.
16
+ *
17
+ * Extracted from `storage-service.ts` to keep that file under the
18
+ * workspace 400-LOC cap. No behavior change vs the inline form.
19
+ */
20
+ import { getStorageArtifactByIdIncludingDeleted, markPutFailed, recordUploadedArtifact, } from '../db/storage-artifact-repository.js';
21
+ import { projectArtifactProviderFields } from '../storage/provider-metadata-projection.js';
22
+ import { PutPostPersistError } from './storage-service-errors.js';
23
+ /** Emit a structured `[STORAGE]` event to stderr (one JSON line). */
24
+ function emitStorageEvent(event, detail) {
25
+ const payload = { event, timestamp: new Date().toISOString(), detail };
26
+ process.stderr.write(`[STORAGE] ${JSON.stringify(payload)}\n`);
27
+ }
28
+ /**
29
+ * Normalize an arbitrary thrown value into a single-line string.
30
+ * Exported because `StorageService.executeBackendDelete` also
31
+ * needs to format `backend.delete` errors into `last_error`
32
+ * envelopes; the function shape is identical to the one the
33
+ * recovery helpers use so they share a single implementation.
34
+ */
35
+ export function errorMessage(err) {
36
+ if (err instanceof Error)
37
+ return err.message;
38
+ return String(err ?? 'unknown error');
39
+ }
40
+ /**
41
+ * Success-path orchestrator: CAS-flip the pending row to `stored`,
42
+ * with one retry. On every failure mode (throw, CAS miss, or the
43
+ * commit-after-throw race) call `reconcileAlreadyFinalized` BEFORE
44
+ * recovery so an already-finalized row is not erroneously cleaned
45
+ * up.
46
+ */
47
+ export async function persistUploadedOrRecover(args) {
48
+ const projected = projectArtifactProviderFields(args.backend.provider, args.putResult.providerMetadata);
49
+ const recordInput = {
50
+ userId: args.userId,
51
+ artifactId: args.claim.row.id,
52
+ putAttemptId: args.claim.claimId,
53
+ uri: args.putResult.uri,
54
+ sizeBytes: args.putResult.sizeBytes,
55
+ plaintextHash: args.putResult.plaintextHash,
56
+ storedHash: args.putResult.storedHash,
57
+ identifiers: projected.identifiers,
58
+ providerDetails: projected.providerDetails,
59
+ };
60
+ let firstError;
61
+ try {
62
+ const recorded = await recordUploadedArtifact(args.pool, recordInput);
63
+ if (recorded !== null)
64
+ return recorded;
65
+ }
66
+ catch (err) {
67
+ firstError = err;
68
+ }
69
+ const reconciled = await reconcileAlreadyFinalized(args.pool, args.userId, args.claim.row.id, args.putResult);
70
+ if (reconciled !== null)
71
+ return reconciled;
72
+ let retryError;
73
+ try {
74
+ const retried = await recordUploadedArtifact(args.pool, recordInput);
75
+ if (retried !== null)
76
+ return retried;
77
+ }
78
+ catch (err) {
79
+ retryError = err;
80
+ }
81
+ const reconciledAfterRetry = await reconcileAlreadyFinalized(args.pool, args.userId, args.claim.row.id, args.putResult);
82
+ if (reconciledAfterRetry !== null)
83
+ return reconciledAfterRetry;
84
+ // Synthesize a typed error so recovery has a meaningful message
85
+ // when both calls returned null without throwing. URI stays
86
+ // server-side; only the artifact id is in the message.
87
+ const persistError = firstError ?? retryError ?? new Error(`recordUploadedArtifact CAS missed twice for artifact '${args.claim.row.id}' ` +
88
+ 'and the row was not reconcilable; treating as post-put DB failure');
89
+ return recoverPostPutFailure({
90
+ pool: args.pool,
91
+ userId: args.userId,
92
+ claim: args.claim,
93
+ backend: args.backend,
94
+ putResult: args.putResult,
95
+ persistError,
96
+ });
97
+ }
98
+ /**
99
+ * Commit-after-throw reconciliation. Reads the row by id (within
100
+ * the user scope) and returns it if `status='stored'` AND its
101
+ * `(uri, plaintextHash, storedHash)` match the bytes we just
102
+ * uploaded. Returns null otherwise.
103
+ */
104
+ async function reconcileAlreadyFinalized(pool, userId, artifactId, putResult) {
105
+ const row = await getStorageArtifactByIdIncludingDeleted(pool, userId, artifactId);
106
+ if (row === null)
107
+ return null;
108
+ if (row.status !== 'stored')
109
+ return null;
110
+ if (row.uri !== putResult.uri)
111
+ return null;
112
+ if (row.plaintextHash !== putResult.plaintextHash)
113
+ return null;
114
+ if (row.storedHash !== putResult.storedHash)
115
+ return null;
116
+ return row;
117
+ }
118
+ /**
119
+ * Cleanup-then-mark recovery. Attempts `backend.delete(uri)` to
120
+ * roll back the just-uploaded bytes; depending on the outcome
121
+ * either marks the row `failed` with `put_post_persist_failed_cleaned_up`
122
+ * and re-throws the original DB error, OR persists a durable
123
+ * `put_post_persist_unrecoverable` marker (with the orphan URI on
124
+ * the internal `last_error` envelope) and throws `PutPostPersistError`.
125
+ */
126
+ async function recoverPostPutFailure(args) {
127
+ const persistMessage = errorMessage(args.persistError);
128
+ try {
129
+ await args.backend.delete(args.putResult.uri);
130
+ }
131
+ catch (cleanupError) {
132
+ await markPostPutUnrecoverableBestEffort({
133
+ pool: args.pool,
134
+ userId: args.userId,
135
+ artifactId: args.claim.row.id,
136
+ putAttemptId: args.claim.claimId,
137
+ provider: args.backend.provider,
138
+ uri: args.putResult.uri,
139
+ persistMessage,
140
+ cleanupMessage: errorMessage(cleanupError),
141
+ });
142
+ throw new PutPostPersistError(args.claim.row.id, args.backend.provider, args.putResult.uri, persistMessage);
143
+ }
144
+ await markCleanedUpBestEffort({
145
+ pool: args.pool,
146
+ userId: args.userId,
147
+ artifactId: args.claim.row.id,
148
+ putAttemptId: args.claim.claimId,
149
+ provider: args.backend.provider,
150
+ persistMessage,
151
+ });
152
+ throw args.persistError;
153
+ }
154
+ async function markCleanedUpBestEffort(args) {
155
+ const envelope = {
156
+ layer: 'raw_storage',
157
+ code: 'put_post_persist_failed_cleaned_up',
158
+ message: args.persistMessage,
159
+ storage_provider: args.provider,
160
+ occurred_at: new Date().toISOString(),
161
+ };
162
+ const matched = await runScopedFailureMarker({
163
+ pool: args.pool,
164
+ userId: args.userId,
165
+ artifactId: args.artifactId,
166
+ putAttemptId: args.putAttemptId,
167
+ envelope,
168
+ dbErrorEvent: 'storage.put.post_put_failed_cleaned_up_mark_error',
169
+ });
170
+ if (!matched) {
171
+ emitStorageEvent('storage.put.post_put_failed_cleaned_up', {
172
+ artifact_id: args.artifactId,
173
+ provider: args.provider,
174
+ persist_error: args.persistMessage,
175
+ reason: 'cas_miss_or_db_error',
176
+ });
177
+ }
178
+ }
179
+ async function markPostPutUnrecoverableBestEffort(args) {
180
+ const envelope = {
181
+ layer: 'raw_storage',
182
+ code: 'put_post_persist_unrecoverable',
183
+ message: args.persistMessage,
184
+ cleanup_error: args.cleanupMessage,
185
+ orphan_uri: args.uri,
186
+ storage_provider: args.provider,
187
+ occurred_at: new Date().toISOString(),
188
+ };
189
+ const matched = await runScopedFailureMarker({
190
+ pool: args.pool,
191
+ userId: args.userId,
192
+ artifactId: args.artifactId,
193
+ putAttemptId: args.putAttemptId,
194
+ envelope,
195
+ dbErrorEvent: 'storage.put.post_put_unrecoverable_mark_error',
196
+ });
197
+ emitStorageEvent('storage.put.post_put_unrecoverable', {
198
+ artifact_id: args.artifactId,
199
+ provider: args.provider,
200
+ uri: args.uri,
201
+ persist_error: args.persistMessage,
202
+ cleanup_error: args.cleanupMessage,
203
+ marker_persisted: matched,
204
+ });
205
+ }
206
+ /** Shared CAS-scoped failure marker — CAS on
207
+ * `(id, user_id, put_attempt_id, status='pending')`. Emits the
208
+ * supplied typed event on DB error; never swallows. */
209
+ async function runScopedFailureMarker(args) {
210
+ try {
211
+ const result = await args.pool.query(`UPDATE storage_artifacts
212
+ SET status = 'failed',
213
+ last_error = $4::jsonb,
214
+ put_attempt_id = NULL,
215
+ updated_at = NOW()
216
+ WHERE id = $1
217
+ AND user_id = $2
218
+ AND put_attempt_id = $3
219
+ AND status = 'pending'`, [args.artifactId, args.userId, args.putAttemptId, JSON.stringify(args.envelope)]);
220
+ return (result.rowCount ?? 0) > 0;
221
+ }
222
+ catch (markError) {
223
+ emitStorageEvent(args.dbErrorEvent, {
224
+ artifact_id: args.artifactId,
225
+ mark_error: errorMessage(markError),
226
+ });
227
+ return false;
228
+ }
229
+ }
230
+ /**
231
+ * Failure branch invoked from `putManaged` when `backend.put`
232
+ * itself threw. CAS-flip the pending row to `'failed'`. If the CAS
233
+ * marker misses or its UPDATE throws, emit a typed event so the
234
+ * failure stays observable; the caller re-throws the original put
235
+ * error regardless.
236
+ */
237
+ export async function recordBackendPutFailure(args) {
238
+ const envelope = {
239
+ layer: 'raw_storage',
240
+ code: 'backend_put_failed',
241
+ message: errorMessage(args.putError),
242
+ storage_provider: args.provider,
243
+ occurred_at: new Date().toISOString(),
244
+ };
245
+ try {
246
+ const marked = await markPutFailed(args.pool, {
247
+ userId: args.userId,
248
+ artifactId: args.claim.row.id,
249
+ putAttemptId: args.claim.claimId,
250
+ lastError: envelope,
251
+ });
252
+ if (marked !== null)
253
+ return;
254
+ emitStorageEvent('storage.put.backend_put_failed_mark_skipped', {
255
+ artifact_id: args.claim.row.id,
256
+ provider: args.provider,
257
+ reason: 'cas_miss',
258
+ put_error: envelope.message,
259
+ });
260
+ }
261
+ catch (markError) {
262
+ emitStorageEvent('storage.put.backend_put_failed_mark_error', {
263
+ artifact_id: args.claim.row.id,
264
+ provider: args.provider,
265
+ put_error: envelope.message,
266
+ mark_error: errorMessage(markError),
267
+ });
268
+ }
269
+ }
@@ -0,0 +1,124 @@
1
+ /**
2
+ * @file Typed errors thrown by `StorageService`.
3
+ *
4
+ * The route layer pattern-matches these by `instanceof` to emit the
5
+ * correct HTTP status + error envelope. Service code never embeds
6
+ * status codes itself; the route is the single place where service
7
+ * outcomes map to HTTP.
8
+ */
9
+ export declare class StorageArtifactNotFoundError extends Error {
10
+ readonly artifactId: string;
11
+ constructor(artifactId: string);
12
+ }
13
+ export declare class PointerContentNotManagedError extends Error {
14
+ readonly artifactId: string;
15
+ readonly uri: string;
16
+ constructor(artifactId: string, uri: string);
17
+ }
18
+ export declare class FilecoinDirectStorageNotSupportedError extends Error {
19
+ readonly provider: string;
20
+ constructor(provider?: string);
21
+ }
22
+ export declare class UnsupportedPointerSchemeError extends Error {
23
+ readonly uri: string;
24
+ readonly allowedSchemes: ReadonlyArray<string>;
25
+ constructor(uri: string, allowedSchemes: ReadonlyArray<string>);
26
+ }
27
+ export declare class ArtifactInUseError extends Error {
28
+ readonly artifactId: string;
29
+ readonly referencedByDocumentCount: number;
30
+ constructor(artifactId: string, count: number);
31
+ }
32
+ export declare class ManagedStorageDisabledError extends Error {
33
+ constructor();
34
+ }
35
+ export declare class InvalidArtifactMetadataError extends Error {
36
+ readonly reason: string;
37
+ constructor(reason: string);
38
+ }
39
+ /**
40
+ * Thrown when a managed-mode artifact row's `provider` is not
41
+ * registered with the active `StorageBackendRegistry`. This is an
42
+ * operational unavailability (the deployment dropped a backend that
43
+ * still has live data), NOT a 5xx crash — the route layer maps it
44
+ * to HTTP 503 `storage_backend_unavailable`. The envelope carries
45
+ * only `provider_id`; internal stack/error details stay server-side.
46
+ */
47
+ export declare class BackendNotRegisteredError extends Error {
48
+ readonly providerId: string;
49
+ readonly artifactId: string;
50
+ constructor(providerId: string, artifactId: string);
51
+ }
52
+ /**
53
+ * Thrown by `StorageService.putManaged` when the put would write
54
+ * through a backend whose provider isn't part of the registry's
55
+ * known set (registered backends + the pointer-only marker). The
56
+ * route maps this to HTTP 503 `storage_backend_unavailable`. Unlike
57
+ * `BackendNotRegisteredError` (which fires on read against an
58
+ * already-persisted row), this fires BEFORE any DB write — the
59
+ * upload is rejected at the entry point.
60
+ */
61
+ export declare class UnregisteredProviderError extends Error {
62
+ readonly providerId: string;
63
+ constructor(providerId: string);
64
+ }
65
+ /**
66
+ * Thrown by `StorageService.putManaged` when `backend.put` succeeded
67
+ * but the post-put DB update and the subsequent recovery (DB retry +
68
+ * backend cleanup of the just-uploaded bytes) ALL failed. At that
69
+ * point the bytes survive at the backend AND the DB does not know
70
+ * the URI. The route maps this to HTTP 503 `put_post_persist_failed`
71
+ * with the artifact id and provider so ops can investigate. The
72
+ * orphan URI is captured server-side (in the row's `last_error`
73
+ * envelope + a structured `storage.put.post_put_unrecoverable`
74
+ * event) but NEVER on the wire.
75
+ */
76
+ export declare class PutPostPersistError extends Error {
77
+ readonly artifactId: string;
78
+ readonly providerId: string;
79
+ /** Orphan URI — internal only; the route never surfaces this on the wire. */
80
+ readonly uri: string;
81
+ constructor(artifactId: string, providerId: string, uri: string, cause: string);
82
+ }
83
+ /**
84
+ * Thrown when a public API caller requests bytes or verifies an
85
+ * artifact whose managed upload is still in flight (`status='pending'`).
86
+ * Route maps this to HTTP 409 `artifact_not_ready`. Distinct from
87
+ * `ArtifactUnavailableError` (terminal `failed`) because the row
88
+ * MIGHT still reach `stored` if the upload finishes.
89
+ */
90
+ export declare class ArtifactNotReadyError extends Error {
91
+ readonly artifactId: string;
92
+ constructor(artifactId: string);
93
+ }
94
+ /**
95
+ * Thrown when a public API caller requests bytes or verifies an
96
+ * artifact whose managed upload terminally failed (`status='failed'`
97
+ * with no URI). The row exists for ops visibility — the caller's
98
+ * action against it would never succeed because the backend never
99
+ * persisted the bytes. Route maps this to HTTP 410 `artifact_unavailable`.
100
+ */
101
+ export declare class ArtifactUnavailableError extends Error {
102
+ readonly artifactId: string;
103
+ readonly reason: string;
104
+ constructor(artifactId: string, reason: string);
105
+ }
106
+ /**
107
+ * Thrown by `deleteArtifact` when `claimDeleteAttempt` returns null
108
+ * AND the row is currently in `status='deleting'` — another caller
109
+ * holds an active claim and is mid-cascade / mid-backend-delete.
110
+ *
111
+ * Distinct from the idempotent terminal `status='deleted'` path
112
+ * (which still returns the prior terminal envelope as success) and
113
+ * from `StorageArtifactNotFoundError` (missing / cross-user). Route
114
+ * maps this to HTTP 409 `delete_in_flight` with `retryable=true` so
115
+ * the caller knows the action isn't fatal — just contended — and a
116
+ * later retry will either find the row `deleted` (idempotent
117
+ * success) or re-claim it (if the other caller's attempt failed
118
+ * and the row transitioned to `delete_failed`).
119
+ */
120
+ export declare class ArtifactDeleteInFlightError extends Error {
121
+ readonly artifactId: string;
122
+ readonly currentStatus: string;
123
+ constructor(artifactId: string, currentStatus: string);
124
+ }