@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,325 @@
1
+ /**
2
+ * Document service — Phases 1 and 2 of the large-file ingestion plan.
3
+ *
4
+ * Phase 1: pointer-only registry (register / get / list / delete).
5
+ * Phase 2: text indexing — `indexText` chunks supplied text, embeds
6
+ * the chunks via the existing core embedding stack, persists chunks to
7
+ * `document_chunks`, and writes one provenance-linked memory per chunk
8
+ * so `/v1/memories/search` can retrieve them. Implementation lives in
9
+ * `document-indexer.ts`; this service is a thin facade.
10
+ *
11
+ * Schema validation lives in `src/schemas/documents.ts`; this service
12
+ * trusts the validated input shape and only enforces the Phase 1
13
+ * storage-mode invariant defensively (so direct in-process callers
14
+ * can't bypass the Zod gate). No managed blob storage, no fact
15
+ * extraction — those are Phase 3+.
16
+ *
17
+ * See `Atomicmemory-research/docs/core-repo/design/large-file-ingestion-and-raw-storage-plan-2026-05-08.md`.
18
+ */
19
+ import { getRawDocumentById, listRawDocuments, registerRawDocument, upsertRawSource, } from '../db/raw-document-repository.js';
20
+ import { listDocumentsForUser, listDocumentsWithoutMemoriesForUser, } from '../db/document-list-repository.js';
21
+ import { listPassportFeed, } from '../db/passport-feed-repository.js';
22
+ import { decodeListCursor } from '../db/document-list-cursor.js';
23
+ import { listOrphanedManagedBlobsForDocument, } from '../db/raw-document-blob-repository.js';
24
+ import { softDeleteDocumentCascade } from '../db/repository-document-delete.js';
25
+ import { cleanupManagedBlobs, ManagedBlobCleanupError } from '../storage/cleanup.js';
26
+ import { buildRawStorageCleanupFailureEnvelope, markCleanupFailedAndSyncArtifact, markCleanupSuccessAndSyncArtifact, } from '../db/raw-doc-artifact-sync.js';
27
+ import { singleStoreRegistry, } from '../storage/store-registry.js';
28
+ import { indexDocumentText, } from './document-indexer.js';
29
+ import { uploadRawDocument, } from './document-upload.js';
30
+ import { markExtractionFailure as markExtractionFailureCore, markIndexFailure as markIndexFailureCore, } from './document-failure-markers.js';
31
+ import { emitFilecoinEvent } from './filecoin-observability.js';
32
+ import { NoopRawContentCodec } from '../storage/codecs/noop-codec.js';
33
+ const PHASE_1_STORAGE_MODE = 'pointer_only';
34
+ const DEFAULT_UPLOAD_CONFIG = {
35
+ rawStorageMode: 'pointer_only',
36
+ rawStoragePrefix: '',
37
+ };
38
+ /**
39
+ * Document service. Phase 1 covers register/get/list/delete; Phase 2
40
+ * adds `indexText`; Phase 3 adds `uploadRaw` (managed-blob storage).
41
+ * The Phase-3 dependencies (`rawContentStore`, raw-storage config) are
42
+ * optional so existing test contexts that only need pointer-only
43
+ * registration don't have to thread the new wiring.
44
+ */
45
+ export class DocumentService {
46
+ pool;
47
+ rawContentStore;
48
+ storeRegistry;
49
+ codec;
50
+ uploadConfig;
51
+ constructor(pool, options = {}) {
52
+ this.pool = pool;
53
+ this.rawContentStore = options.rawContentStore ?? null;
54
+ this.storeRegistry = options.storeRegistry ?? singleStoreRegistry(this.rawContentStore);
55
+ this.codec = options.codec ?? new NoopRawContentCodec();
56
+ this.uploadConfig = options.config ?? DEFAULT_UPLOAD_CONFIG;
57
+ }
58
+ /**
59
+ * Per-row provider dispatch registry. Exposed so the route layer's
60
+ * Phase 7a formatters can resolve `delete_semantics` from each
61
+ * row's `storage_provider` without rebuilding the registry. The
62
+ * registry is read-only at the route boundary.
63
+ */
64
+ getStoreRegistry() {
65
+ return this.storeRegistry;
66
+ }
67
+ /**
68
+ * Idempotently register a document pointer. Looks up (or inserts) the
69
+ * matching `raw_sources` row, then registers the document.
70
+ *
71
+ * Returns `{ document, created }` where `created = false` when an
72
+ * active row already existed for the (user, source, external_id,
73
+ * provider_version) namespace (route handler maps that to a 200; new
74
+ * inserts map to 201).
75
+ */
76
+ async register(input) {
77
+ assertPointerOnly(input.storageMode);
78
+ const source = await upsertRawSource(this.pool, {
79
+ userId: input.userId,
80
+ sourceSite: input.sourceSite,
81
+ provider: input.provider,
82
+ accountId: input.accountId,
83
+ storageMode: input.storageMode,
84
+ retentionPolicy: input.retentionPolicy,
85
+ consentPolicy: input.consentPolicy,
86
+ });
87
+ return registerRawDocument(this.pool, {
88
+ userId: input.userId,
89
+ rawSourceId: source.id,
90
+ externalId: input.externalId,
91
+ externalUri: input.externalUri,
92
+ displayName: input.displayName,
93
+ mimeType: input.mimeType,
94
+ sizeBytes: input.sizeBytes,
95
+ contentHash: input.contentHash,
96
+ providerVersion: input.providerVersion,
97
+ sourceModifiedAt: input.sourceModifiedAt,
98
+ storageMode: input.storageMode,
99
+ metadata: input.metadata,
100
+ extractionStatus: input.extractionStatus,
101
+ semanticIndexStatus: input.semanticIndexStatus,
102
+ });
103
+ }
104
+ /** Fetch one active document by id; null when missing/deleted/cross-user. */
105
+ async get(userId, id) {
106
+ return getRawDocumentById(this.pool, userId, id);
107
+ }
108
+ /** List active documents for a user, optionally filtered by source_site. */
109
+ async list(input) {
110
+ return listRawDocuments(this.pool, input);
111
+ }
112
+ /**
113
+ * Phase D — cursor-paginated user-scoped document list with optional
114
+ * recovery-status bucket filter. Distinct from {@link list} which uses
115
+ * offset/limit + source_site filter (kept for backwards
116
+ * compatibility with `GET /v1/documents/list`). The route layer
117
+ * decodes the opaque `cursor` query param via `decodeListCursor`
118
+ * BEFORE calling this method, so a malformed cursor surfaces as 400
119
+ * upstream rather than a 500 from the SQL layer.
120
+ */
121
+ async listForUser(input) {
122
+ const decoded = input.cursor !== undefined
123
+ ? decodeListCursor(input.cursor)
124
+ : null;
125
+ if (input.cursor !== undefined && decoded === null) {
126
+ throw new InvalidDocumentListCursorError();
127
+ }
128
+ const repoInput = {
129
+ userId: input.userId,
130
+ limit: input.limit,
131
+ cursor: decoded,
132
+ statusFilter: input.statusFilter,
133
+ };
134
+ return listDocumentsForUser(this.pool, repoInput);
135
+ }
136
+ /**
137
+ * Phase D — list active documents WITHOUT non-deleted memories,
138
+ * narrowed by the layer-aware recovery filter. Backs the
139
+ * passport server-side merge document-only stream and the
140
+ * `GET /v1/documents/without-memories` endpoint.
141
+ */
142
+ async listWithoutMemoriesForUser(input) {
143
+ const decoded = input.cursor !== undefined
144
+ ? decodeListCursor(input.cursor)
145
+ : null;
146
+ if (input.cursor !== undefined && decoded === null) {
147
+ throw new InvalidDocumentListCursorError();
148
+ }
149
+ const repoInput = {
150
+ userId: input.userId,
151
+ limit: input.limit,
152
+ cursor: decoded,
153
+ statusFilter: input.statusFilter,
154
+ };
155
+ return listDocumentsWithoutMemoriesForUser(this.pool, repoInput);
156
+ }
157
+ /**
158
+ * Phase D — passport feed (data-layer grouped query). Backs
159
+ * `GET /v1/documents/passport-feed`. The webapp's
160
+ * `/api/context/passport` route consumes this as the memory-feed
161
+ * stream of its server-side two-stream merge.
162
+ *
163
+ * Cursor decoding mirrors the other Phase D list facades; a
164
+ * malformed cursor (incl. structurally-valid-but-non-server
165
+ * sortAt) throws `InvalidDocumentListCursorError` so the route
166
+ * layer maps it to 400 invalid_cursor.
167
+ */
168
+ async listPassportFeed(input) {
169
+ const decoded = input.cursor !== undefined
170
+ ? decodeListCursor(input.cursor)
171
+ : null;
172
+ if (input.cursor !== undefined && decoded === null) {
173
+ throw new InvalidDocumentListCursorError();
174
+ }
175
+ const repoInput = {
176
+ userId: input.userId,
177
+ limit: input.limit ?? 50,
178
+ cursor: decoded,
179
+ };
180
+ return listPassportFeed(this.pool, repoInput);
181
+ }
182
+ /**
183
+ * Soft-delete one document together with its Phase 2 derived chunks
184
+ * and provenance-linked memories, in one transaction with a per-doc
185
+ * advisory lock. `alreadyDeleted = true` when the row was missing or
186
+ * previously tombstoned — keeps DELETE idempotent.
187
+ */
188
+ async delete(userId, id) {
189
+ const { removed, blobs: freshBlobs } = await softDeleteDocumentCascade(this.pool, userId, id);
190
+ // When the document was already tombstoned by a prior call but
191
+ // its managed blob still needs cleanup (raw_storage_failed),
192
+ // pick those orphans up here. Otherwise an `alreadyDeleted=true`
193
+ // response would hide a still-orphaned blob.
194
+ const blobs = freshBlobs.length > 0
195
+ ? freshBlobs
196
+ : await listOrphanedManagedBlobsForDocument(this.pool, userId, id);
197
+ if (blobs.length > 0) {
198
+ await this.runBlobCleanupOrThrow(userId, blobs);
199
+ }
200
+ return { success: true, alreadyDeleted: !removed };
201
+ }
202
+ /**
203
+ * Run cleanup against `blobs`; on failure mark each failing row
204
+ * `raw_storage_failed` and throw, on success flip the rows to the
205
+ * terminal `blob_deleted` state so a future retry of `DELETE
206
+ * /v1/documents/:id` short-circuits cleanly.
207
+ */
208
+ async runBlobCleanupOrThrow(userId, blobs) {
209
+ const result = await cleanupManagedBlobs(this.storeRegistry, blobs);
210
+ // Mark partial successes *before* surfacing the error so a retry
211
+ // doesn't re-attempt cleanup on URIs that are already clean. Per
212
+ // Phase 4a §1, the marker is chosen by the adapter's `semantics`
213
+ // field — `'deleted'` writes `blob_deleted`, `'unpinned'` /
214
+ // `'tombstoned'` write `blob_tombstoned`. Both terminal states
215
+ // are clean; the orphan-lookup helpers skip both.
216
+ //
217
+ // Step 7 of the storage-sibling plan: each marker write is
218
+ // paired with a sync onto the linked `storage_artifacts` row so
219
+ // the artifact's `status` follows `raw_documents` through the
220
+ // terminal state.
221
+ for (const success of result.successes) {
222
+ // Step 7 paired marker + artifact sync. Each `success` carries
223
+ // its `rawDocumentId` (the cleanup blob-ref now threads the
224
+ // source-row id) so we never disambiguate by URI.
225
+ await markCleanupSuccessAndSyncArtifact(this.pool, {
226
+ userId,
227
+ rawDocumentId: success.rawDocumentId,
228
+ storageUri: success.storageUri,
229
+ semantics: success.semantics,
230
+ });
231
+ emitDeleteEvent(userId, success.storageProvider, success.semantics);
232
+ }
233
+ if (result.failures.length > 0) {
234
+ for (const failure of result.failures) {
235
+ await markCleanupFailedAndSyncArtifact(this.pool, {
236
+ userId,
237
+ rawDocumentId: failure.rawDocumentId,
238
+ lastError: buildRawStorageCleanupFailureEnvelope(failure.message, failure.storageProvider),
239
+ });
240
+ }
241
+ throw new ManagedBlobCleanupError(result);
242
+ }
243
+ }
244
+ /**
245
+ * Phase 2 indexing entry point. Idempotent on byte-identical text
246
+ * + current `chunker_version`; otherwise re-chunks (soft-deleting
247
+ * the prior generation of chunks + derived memories first). The
248
+ * heavy lifting lives in `document-indexer.ts`.
249
+ */
250
+ async indexText(input) {
251
+ return indexDocumentText(this.pool, input);
252
+ }
253
+ /**
254
+ * Phase 3 managed-blob upload. Throws `ManagedStorageDisabledError`
255
+ * (→ 503) when the deployment runs `rawStorageMode='pointer_only'`,
256
+ * `UploadDocumentNotFoundError` (→ 404) when the document is missing
257
+ * or owned by a different user. Idempotent on byte-identical input.
258
+ */
259
+ async uploadRaw(input) {
260
+ return uploadRawDocument(this.pool, this.rawContentStore, this.codec, this.uploadConfig, input);
261
+ }
262
+ /**
263
+ * Phase C constrained extraction-layer transition. See
264
+ * `services/document-failure-markers.ts` for the full state-machine
265
+ * docstring; this is a thin facade so route handlers can call into
266
+ * the service the same way they do for `register` / `indexText` /
267
+ * `uploadRaw`.
268
+ */
269
+ async markExtractionFailure(input) {
270
+ return markExtractionFailureCore(this.pool, input);
271
+ }
272
+ /**
273
+ * Phase C constrained semantic-index-layer transition.
274
+ */
275
+ async markIndexFailure(input) {
276
+ return markIndexFailureCore(this.pool, input);
277
+ }
278
+ }
279
+ /**
280
+ * Phase D — sentinel thrown by {@link DocumentService.listForUser}
281
+ * when the supplied opaque cursor is malformed. Route handlers map
282
+ * this to 400 with `error: 'invalid_cursor'`.
283
+ */
284
+ export class InvalidDocumentListCursorError extends Error {
285
+ constructor() {
286
+ super('cursor: invalid base64 / malformed payload');
287
+ this.name = 'InvalidDocumentListCursorError';
288
+ }
289
+ }
290
+ /**
291
+ * Phase 1 storage-mode invariant. The schema layer rejects non-pointer
292
+ * modes with 400, so this only fires on direct in-process callers; when
293
+ * it does, it's a contract violation and a 500 is the right outcome.
294
+ */
295
+ function assertPointerOnly(mode) {
296
+ if (mode !== PHASE_1_STORAGE_MODE) {
297
+ throw new Error(`DocumentService: storage_mode '${mode}' is not yet supported — Phase 1 implements pointer_only only`);
298
+ }
299
+ }
300
+ /**
301
+ * Phase 8.5 — emit a delete-path observability event keyed to the
302
+ * adapter's `semantics`. The event taxonomy is `filecoin.delete.*`
303
+ * so we ONLY emit when the row's `storageProvider === 'filecoin'`
304
+ * (review-fix HIGH 3); a hypothetical future immediate provider
305
+ * with `'unpinned'` semantics (e.g. an S3-Glacier-style adapter)
306
+ * would need its own provider-prefixed event name.
307
+ *
308
+ * `'deleted'` semantics (local_fs / s3) emits nothing — the
309
+ * Filecoin event stream is for Filecoin-shaped lifecycle moments
310
+ * only.
311
+ */
312
+ function emitDeleteEvent(userId, storageProvider, semantics) {
313
+ if (storageProvider !== 'filecoin')
314
+ return;
315
+ if (semantics === 'deleted')
316
+ return;
317
+ const name = semantics === 'tombstoned'
318
+ ? 'filecoin.delete.tombstoned'
319
+ : 'filecoin.delete.unpinned';
320
+ emitFilecoinEvent(name, {
321
+ userId,
322
+ provider: storageProvider,
323
+ statusAfter: 'blob_tombstoned',
324
+ });
325
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * @file Step-7 storage-sibling artifact wiring for the upload pipeline.
3
+ *
4
+ * Extracted from `document-upload.ts` so that file stays under the
5
+ * workspace 400-non-comment-LOC cap. Owns:
6
+ *
7
+ * - `recordUploadResultAndSwapArtifact` — Phase β2 transactional
8
+ * helper that records the upload, soft-deletes any prior pointer
9
+ * artifact, and inserts a new managed artifact in
10
+ * `status='pending'`.
11
+ * - `finalizeUploadAndSyncArtifact` — paired Phase γ transaction
12
+ * that runs `finalizeUploadStatusWithClient` AND the artifact
13
+ * sync in one BEGIN..COMMIT, so the document's
14
+ * `raw_storage_status` and the artifact's `status` either both
15
+ * commit or both roll back.
16
+ * - `failClaimedUploadAndSyncArtifact` — paired failure tx that
17
+ * marks the upload row `raw_storage_failed` AND syncs the
18
+ * linked artifact.
19
+ *
20
+ * The pointer-mode provider constant `EXTERNAL_POINTER_PROVIDER`
21
+ * lives in `../db/storage-artifact-providers.ts` (DB-layer, no
22
+ * service-layer dependency); import it from there directly.
23
+ */
24
+ import pg from 'pg';
25
+ import type { RawDocumentRow } from '../db/raw-document-types.js';
26
+ import type { StoredRawContent } from '../storage/raw-content-store.js';
27
+ export interface RecordUploadResultInput {
28
+ userId: string;
29
+ documentId: string;
30
+ claimId: string;
31
+ storageUri: string;
32
+ storageProvider: string;
33
+ rawStorageMetadata: Record<string, unknown>;
34
+ }
35
+ export interface SwapToManagedInput {
36
+ document: Pick<RawDocumentRow, 'id' | 'userId' | 'mimeType'>;
37
+ contentHash: string;
38
+ stored: StoredRawContent;
39
+ }
40
+ /**
41
+ * Phase β2 atomic combo: writes the URI/provider/metadata via
42
+ * `recordUploadResultWithClient`, soft-deletes any prior pointer
43
+ * artifact, inserts a new managed artifact in `status='pending'`,
44
+ * and links the document. All within a single BEGIN..COMMIT so the
45
+ * row never sees a half-applied transition.
46
+ *
47
+ * Returns the new artifact id. Throws when the claim was lost (the
48
+ * caller maps this to `UploadClaimLostError` and runs compensation).
49
+ */
50
+ export declare function recordUploadResultAndSwapArtifact(pool: pg.Pool, args: RecordUploadResultInput & SwapToManagedInput): Promise<{
51
+ rowCount: number;
52
+ artifactId: string | null;
53
+ }>;
54
+ export interface FinalizeUploadAndSyncInput {
55
+ userId: string;
56
+ documentId: string;
57
+ claimId: string;
58
+ finalStatus: 'blob_stored' | 'blob_pending' | 'blob_available';
59
+ }
60
+ /**
61
+ * Phase γ paired transition: flip `raw_storage_status` to the final
62
+ * terminal state AND sync the artifact in the same transaction.
63
+ * Returns 0 when the CAS-on-claim missed (caller maps to
64
+ * `UploadClaimLostError`).
65
+ */
66
+ export declare function finalizeUploadAndSyncArtifact(pool: pg.Pool, args: FinalizeUploadAndSyncInput): Promise<number>;
67
+ export interface FailClaimedUploadAndSyncInput {
68
+ userId: string;
69
+ documentId: string;
70
+ claimId: string;
71
+ lastError: Record<string, unknown>;
72
+ }
73
+ /**
74
+ * Phase β failure path: mark the upload row `raw_storage_failed`
75
+ * AND sync the artifact to `failed` in one transaction. Errors are
76
+ * not swallowed — the caller decides whether to propagate, but the
77
+ * marker write and the sync share the same atomicity guarantee as
78
+ * every other paired transition in Step 7.
79
+ */
80
+ export declare function failClaimedUploadAndSyncArtifact(pool: pg.Pool, args: FailClaimedUploadAndSyncInput): Promise<number>;
@@ -0,0 +1,162 @@
1
+ /**
2
+ * @file Step-7 storage-sibling artifact wiring for the upload pipeline.
3
+ *
4
+ * Extracted from `document-upload.ts` so that file stays under the
5
+ * workspace 400-non-comment-LOC cap. Owns:
6
+ *
7
+ * - `recordUploadResultAndSwapArtifact` — Phase β2 transactional
8
+ * helper that records the upload, soft-deletes any prior pointer
9
+ * artifact, and inserts a new managed artifact in
10
+ * `status='pending'`.
11
+ * - `finalizeUploadAndSyncArtifact` — paired Phase γ transaction
12
+ * that runs `finalizeUploadStatusWithClient` AND the artifact
13
+ * sync in one BEGIN..COMMIT, so the document's
14
+ * `raw_storage_status` and the artifact's `status` either both
15
+ * commit or both roll back.
16
+ * - `failClaimedUploadAndSyncArtifact` — paired failure tx that
17
+ * marks the upload row `raw_storage_failed` AND syncs the
18
+ * linked artifact.
19
+ *
20
+ * The pointer-mode provider constant `EXTERNAL_POINTER_PROVIDER`
21
+ * lives in `../db/storage-artifact-providers.ts` (DB-layer, no
22
+ * service-layer dependency); import it from there directly.
23
+ */
24
+ import { failClaimedUploadWithClient, finalizeUploadStatusWithClient, recordUploadResultWithClient, } from '../db/raw-document-blob-repository.js';
25
+ import { assertArtifactLinkable, createStorageArtifact, softDeleteArtifactByIdWithClient, } from '../db/storage-artifact-repository.js';
26
+ import { projectArtifactProviderFields } from '../storage/provider-metadata-projection.js';
27
+ import { syncArtifactStatusFromRawDocument } from '../db/raw-doc-artifact-sync.js';
28
+ /**
29
+ * Phase β2 atomic combo: writes the URI/provider/metadata via
30
+ * `recordUploadResultWithClient`, soft-deletes any prior pointer
31
+ * artifact, inserts a new managed artifact in `status='pending'`,
32
+ * and links the document. All within a single BEGIN..COMMIT so the
33
+ * row never sees a half-applied transition.
34
+ *
35
+ * Returns the new artifact id. Throws when the claim was lost (the
36
+ * caller maps this to `UploadClaimLostError` and runs compensation).
37
+ */
38
+ export async function recordUploadResultAndSwapArtifact(pool, args) {
39
+ const client = await pool.connect();
40
+ try {
41
+ await client.query('BEGIN');
42
+ const rowCount = await recordUploadResultWithClient(client, {
43
+ userId: args.userId,
44
+ documentId: args.documentId,
45
+ claimId: args.claimId,
46
+ storageUri: args.storageUri,
47
+ storageProvider: args.storageProvider,
48
+ rawStorageMetadata: args.rawStorageMetadata,
49
+ });
50
+ if (rowCount === 0) {
51
+ await client.query('ROLLBACK');
52
+ return { rowCount: 0, artifactId: null };
53
+ }
54
+ const artifactId = await swapToManagedArtifact(client, args);
55
+ await client.query('COMMIT');
56
+ return { rowCount, artifactId };
57
+ }
58
+ catch (err) {
59
+ await client.query('ROLLBACK').catch(() => undefined);
60
+ throw err;
61
+ }
62
+ finally {
63
+ client.release();
64
+ }
65
+ }
66
+ async function swapToManagedArtifact(client, args) {
67
+ const priorLookup = await client.query(`SELECT storage_artifact_id FROM raw_documents WHERE id = $1`, [args.document.id]);
68
+ const priorArtifactId = priorLookup.rows[0]?.storage_artifact_id ?? null;
69
+ if (priorArtifactId !== null) {
70
+ // Refuse the swap if the prior artifact's delete lifecycle has
71
+ // already started (`deleting` / `deleted` / `delete_failed`).
72
+ // Otherwise the swap's own soft-delete races with the original
73
+ // caller's claim-and-finalize flow, leaving the doc's cascade
74
+ // attached to whichever caller wins. Throwing
75
+ // `ArtifactNotLinkableError` here is preferable: the upload
76
+ // caller retries after the in-flight delete completes.
77
+ await assertArtifactLinkable(client, args.document.userId, priorArtifactId);
78
+ await softDeleteArtifactByIdWithClient(client, args.document.userId, priorArtifactId);
79
+ }
80
+ const projected = projectArtifactProviderFields(args.stored.storageProvider, args.stored.providerMetadata);
81
+ const artifact = await createStorageArtifact(client, {
82
+ userId: args.document.userId,
83
+ provider: args.stored.storageProvider,
84
+ mode: 'managed',
85
+ uri: args.stored.storageUri,
86
+ status: 'pending',
87
+ sizeBytes: args.stored.sizeBytes,
88
+ contentType: args.document.mimeType ?? null,
89
+ plaintextHash: args.contentHash,
90
+ storedHash: args.stored.contentHash,
91
+ contentEncoding: 'identity',
92
+ discloseContentHash: false,
93
+ identifiers: projected.identifiers,
94
+ providerDetails: projected.providerDetails,
95
+ metadata: {},
96
+ });
97
+ await client.query(`UPDATE raw_documents SET storage_artifact_id = $1, updated_at = NOW()
98
+ WHERE id = $2`, [artifact.id, args.document.id]);
99
+ return artifact.id;
100
+ }
101
+ /**
102
+ * Phase γ paired transition: flip `raw_storage_status` to the final
103
+ * terminal state AND sync the artifact in the same transaction.
104
+ * Returns 0 when the CAS-on-claim missed (caller maps to
105
+ * `UploadClaimLostError`).
106
+ */
107
+ export async function finalizeUploadAndSyncArtifact(pool, args) {
108
+ const client = await pool.connect();
109
+ try {
110
+ await client.query('BEGIN');
111
+ const rowCount = await finalizeUploadStatusWithClient(client, args);
112
+ if (rowCount === 0) {
113
+ await client.query('ROLLBACK');
114
+ return 0;
115
+ }
116
+ await syncArtifactStatusFromRawDocument(client, {
117
+ rawDocumentId: args.documentId,
118
+ newRawStatus: args.finalStatus,
119
+ });
120
+ await client.query('COMMIT');
121
+ return rowCount;
122
+ }
123
+ catch (err) {
124
+ await client.query('ROLLBACK').catch(() => undefined);
125
+ throw err;
126
+ }
127
+ finally {
128
+ client.release();
129
+ }
130
+ }
131
+ /**
132
+ * Phase β failure path: mark the upload row `raw_storage_failed`
133
+ * AND sync the artifact to `failed` in one transaction. Errors are
134
+ * not swallowed — the caller decides whether to propagate, but the
135
+ * marker write and the sync share the same atomicity guarantee as
136
+ * every other paired transition in Step 7.
137
+ */
138
+ export async function failClaimedUploadAndSyncArtifact(pool, args) {
139
+ const client = await pool.connect();
140
+ try {
141
+ await client.query('BEGIN');
142
+ const rowCount = await failClaimedUploadWithClient(client, args);
143
+ if (rowCount === 0) {
144
+ await client.query('ROLLBACK');
145
+ return 0;
146
+ }
147
+ await syncArtifactStatusFromRawDocument(client, {
148
+ rawDocumentId: args.documentId,
149
+ newRawStatus: 'raw_storage_failed',
150
+ lastError: args.lastError,
151
+ });
152
+ await client.query('COMMIT');
153
+ return rowCount;
154
+ }
155
+ catch (err) {
156
+ await client.query('ROLLBACK').catch(() => undefined);
157
+ throw err;
158
+ }
159
+ finally {
160
+ client.release();
161
+ }
162
+ }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Phase β2 orphan-bytes compensation + raw-document failure-marker
3
+ * helpers for the managed-blob upload pipeline.
4
+ *
5
+ * Extracted from `document-upload.ts` so the orchestration module
6
+ * stays under the workspace 400-non-comment-LOC cap. The two
7
+ * exported helpers cover the post-`store.put` failure window:
8
+ *
9
+ * - `compensateOrphanedBlob` runs a best-effort `store.delete`
10
+ * for bytes that were durably written but never linked
11
+ * (e.g. the prior artifact entered a delete lifecycle between
12
+ * our claim and the swap, so `ArtifactNotLinkableError` fires).
13
+ * - `markBeta2FailureOnDocument` flips the raw_document to
14
+ * `raw_storage_failed` with a typed envelope so the public
15
+ * status surfaces stop saying "upload in progress" for a doc
16
+ * whose upload actually failed. When cleanup also failed the
17
+ * envelope carries `internal_recovery_hint` so a reconciler /
18
+ * ops can find the abandoned bytes. The wire formatter
19
+ * (`document-response-formatters.ts`) strips `internal_*`
20
+ * keys before exposing `last_error` on the public response.
21
+ */
22
+ import type pg from 'pg';
23
+ import type { StoredRawContent } from '../storage/raw-content-store.js';
24
+ import type { RawContentStore } from '../storage/raw-content-store.js';
25
+ import type { RawDocumentRow } from '../db/raw-document-types.js';
26
+ export type Beta2Compensation = {
27
+ cleanupSucceeded: true;
28
+ } | {
29
+ cleanupSucceeded: false;
30
+ cleanupError: string;
31
+ };
32
+ /**
33
+ * Best-effort `store.delete` for the orphan-bytes window between
34
+ * `store.put` returning and `recordUploadResultAndSwapArtifact`
35
+ * committing the artifact swap. Returns whether cleanup succeeded
36
+ * (the caller uses this to decide whether to embed the orphan
37
+ * URI/provider in the raw_document's recovery-hint envelope).
38
+ *
39
+ * A cleanup failure is also logged with the originating error so
40
+ * a `grep '[STORAGE]'` operator can correlate.
41
+ */
42
+ export declare function compensateOrphanedBlob(store: RawContentStore, storageUri: string, documentId: string, cause: unknown): Promise<Beta2Compensation>;
43
+ export interface Beta2FailureMarkerArgs {
44
+ pool: pg.Pool;
45
+ document: Pick<RawDocumentRow, 'id' | 'userId'>;
46
+ claimId: string;
47
+ stored: StoredRawContent & {
48
+ codecMetadata: Record<string, unknown>;
49
+ };
50
+ reasonCode: 'artifact_not_linkable' | 'beta2_swap_failed';
51
+ reasonMessage: string;
52
+ compensation: Beta2Compensation;
53
+ }
54
+ /**
55
+ * Mark the doc `raw_storage_failed` with the `artifact_not_linkable`
56
+ * envelope (or generic `beta2_swap_failed` for other throws).
57
+ *
58
+ * Uses the raw-document-only `failClaimedUploadWithClient` — NOT
59
+ * the paired `failClaimedUploadAndSyncArtifact`. Syncing here
60
+ * would clobber the prior artifact's state, which is already in
61
+ * its OWN delete lifecycle and owned by the caller that's
62
+ * tombstoning it.
63
+ *
64
+ * CAS-guarded by `claim_id`: a no-op when the claim was lost,
65
+ * which prevents a stale marker from overwriting a fresh
66
+ * worker's state.
67
+ *
68
+ * Orphan recovery hint: when cleanup failed the envelope carries
69
+ * `internal_recovery_hint: { storage_uri, storage_provider, cleanup_error }`
70
+ * so a reconciler / ops can find the abandoned bytes.
71
+ */
72
+ export declare function markBeta2FailureOnDocument(args: Beta2FailureMarkerArgs): Promise<void>;