@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,410 @@
1
+ /**
2
+ * Postgres queries for the document pipeline (Phase 1 — pointer-only).
3
+ *
4
+ * Function-style module mirroring `repository-write.ts`. The split
5
+ * `*WithClient` variants exist so `deleteBySource` can include
6
+ * document soft-deletion inside its existing transaction.
7
+ *
8
+ * Phase 1 contract: callers only ever pass `storageMode = 'pointer_only'`.
9
+ * The CHECK constraint on `raw_documents.storage_mode` accepts
10
+ * `managed_blob` and `inline_small_text` as well, but the service layer
11
+ * rejects them until those phases land. No raw content is ever written
12
+ * by this module — `storage_uri` and `storage_provider` are NEVER set
13
+ * in Phase 1.
14
+ */
15
+ import { createStorageArtifact } from './storage-artifact-repository.js';
16
+ import { EXTERNAL_POINTER_PROVIDER } from './storage-artifact-providers.js';
17
+ const RAW_SOURCE_COLUMNS = 'id, user_id, source_site, provider, account_id, storage_mode, retention_policy, consent_policy, created_at, updated_at';
18
+ /**
19
+ * Full column set on `raw_documents`. Exported so the Phase D list /
20
+ * recovery / passport-feed repositories (which moved to focused
21
+ * modules to keep this file under the 400 LOC rule) can build their
22
+ * SELECT lists from the same canonical source.
23
+ */
24
+ export const RAW_DOCUMENT_COLUMNS = 'id, user_id, raw_source_id, external_id, external_uri, display_name, mime_type, size_bytes, content_hash, provider_version, source_modified_at, storage_mode, storage_uri, storage_provider, registration_status, raw_storage_status, raw_storage_metadata, metadata, created_at, updated_at, deleted_at, indexed_content_hash, indexed_at, extraction_status, semantic_index_status, last_error, raw_storage_claim_id, raw_storage_claimed_at, raw_storage_last_checked_at, raw_storage_next_check_at, raw_storage_reconcile_attempts, raw_storage_pending_since, storage_artifact_id';
25
+ // ---------------------------------------------------------------------------
26
+ // raw_sources
27
+ // ---------------------------------------------------------------------------
28
+ /**
29
+ * Idempotently insert (or update) a `raw_sources` row keyed on
30
+ * `(user_id, source_site, provider, COALESCE(account_id, ''))`. Returns
31
+ * the persisted row.
32
+ *
33
+ * On conflict the storage_mode + retention/consent policies are
34
+ * **overwritten** with the input values — those describe the caller's
35
+ * current intent, and silently keeping a stale policy on the existing
36
+ * row would mask configuration drift.
37
+ */
38
+ export async function upsertRawSource(pool, input) {
39
+ const accountId = input.accountId ?? null;
40
+ const storageMode = input.storageMode ?? 'pointer_only';
41
+ const retentionPolicy = input.retentionPolicy ?? {};
42
+ const consentPolicy = input.consentPolicy ?? {};
43
+ const result = await pool.query(`INSERT INTO raw_sources (user_id, source_site, provider, account_id, storage_mode, retention_policy, consent_policy)
44
+ VALUES ($1, $2, $3, $4, $5, $6::jsonb, $7::jsonb)
45
+ ON CONFLICT (user_id, source_site, provider, COALESCE(account_id, ''))
46
+ DO UPDATE SET
47
+ storage_mode = EXCLUDED.storage_mode,
48
+ retention_policy = EXCLUDED.retention_policy,
49
+ consent_policy = EXCLUDED.consent_policy,
50
+ updated_at = NOW()
51
+ RETURNING ${RAW_SOURCE_COLUMNS}`, [
52
+ input.userId,
53
+ input.sourceSite,
54
+ input.provider,
55
+ accountId,
56
+ storageMode,
57
+ JSON.stringify(retentionPolicy),
58
+ JSON.stringify(consentPolicy),
59
+ ]);
60
+ return rowToRawSource(result.rows[0]);
61
+ }
62
+ // ---------------------------------------------------------------------------
63
+ // raw_documents
64
+ // ---------------------------------------------------------------------------
65
+ /**
66
+ * Idempotently register a `raw_documents` row. Returns
67
+ * `{ document, created: true }` when a fresh row was inserted, or
68
+ * `{ document, created: false }` when an active row already existed
69
+ * (matched on `idx_raw_documents_active_unique`).
70
+ *
71
+ * Implemented as a single atomic `INSERT ... ON CONFLICT DO NOTHING
72
+ * RETURNING ...` followed by a fallback SELECT when no row was
73
+ * inserted. Two concurrent calls for the same namespace see exactly
74
+ * one INSERT win and one fallback SELECT — neither caller observes
75
+ * the unique-violation error that the previous find-then-insert
76
+ * pattern could surface.
77
+ *
78
+ * Soft-deleted rows are excluded by the partial unique index, so a
79
+ * re-registration after `softDeleteRawDocument` always inserts a new id.
80
+ */
81
+ export async function registerRawDocument(pool, input) {
82
+ // Step 7 of the storage-sibling plan: when the caller supplies an
83
+ // `external_uri`, this insert ALSO writes a paired pointer-mode
84
+ // `storage_artifacts` row and links `raw_documents.storage_artifact_id`
85
+ // in the same transaction. Documents registered without an
86
+ // `external_uri` remain pure registration stubs (NULL link). A
87
+ // later managed upload (Phase β2 in `document-upload.ts`) is the
88
+ // first place the row gets a managed artifact.
89
+ if (input.externalUri)
90
+ return registerWithPointerArtifact(pool, input);
91
+ return registerWithoutArtifact(pool, input);
92
+ }
93
+ async function registerWithoutArtifact(pool, input) {
94
+ const inserted = await tryInsertRawDocument(pool, input);
95
+ if (inserted)
96
+ return { document: inserted, created: true };
97
+ const existing = await findActiveDocumentRow(pool, input);
98
+ if (existing)
99
+ return { document: existing, created: false };
100
+ throw new Error('raw_documents: concurrent soft-delete observed during registration');
101
+ }
102
+ /**
103
+ * Registration that pairs the new document with a pointer-mode
104
+ * `storage_artifacts` row in one transaction. On idempotent re-
105
+ * registration (the partial-unique index already has an active row),
106
+ * the caller's external_uri is ignored and the existing artifact
107
+ * link is preserved.
108
+ */
109
+ async function registerWithPointerArtifact(pool, input) {
110
+ const client = await pool.connect();
111
+ try {
112
+ await client.query('BEGIN');
113
+ const inserted = await tryInsertRawDocumentWithClient(client, input);
114
+ if (inserted === null) {
115
+ await client.query('COMMIT');
116
+ const existing = await findActiveDocumentRow(pool, input);
117
+ if (existing)
118
+ return { document: existing, created: false };
119
+ throw new Error('raw_documents: concurrent soft-delete observed during registration');
120
+ }
121
+ const artifact = await createStorageArtifact(client, {
122
+ userId: input.userId,
123
+ provider: EXTERNAL_POINTER_PROVIDER,
124
+ mode: 'pointer',
125
+ uri: input.externalUri,
126
+ status: 'stored',
127
+ sizeBytes: input.sizeBytes ?? null,
128
+ contentType: input.mimeType ?? null,
129
+ contentEncoding: 'identity',
130
+ discloseContentHash: false,
131
+ identifiers: input.contentHash ? { contentHash: input.contentHash } : {},
132
+ metadata: {},
133
+ });
134
+ const linked = await client.query(`UPDATE raw_documents SET storage_artifact_id = $1, updated_at = NOW()
135
+ WHERE id = $2 RETURNING ${RAW_DOCUMENT_COLUMNS}`, [artifact.id, inserted.id]);
136
+ await client.query('COMMIT');
137
+ return { document: rowToRawDocument(linked.rows[0]), created: true };
138
+ }
139
+ catch (err) {
140
+ await client.query('ROLLBACK').catch(() => undefined);
141
+ throw err;
142
+ }
143
+ finally {
144
+ client.release();
145
+ }
146
+ }
147
+ const INSERT_RAW_DOCUMENT_COLUMNS = 'user_id, raw_source_id, external_id, external_uri, display_name, mime_type, size_bytes, content_hash, provider_version, source_modified_at, storage_mode, metadata, extraction_status, semantic_index_status';
148
+ const INSERT_RAW_DOCUMENT_PLACEHOLDERS = '$1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12::jsonb, $13, $14';
149
+ /**
150
+ * Treat `undefined` as `null` at the wire-to-SQL boundary. Tiny helper so
151
+ * the param builder doesn't fan out one `?? null` branch per nullable
152
+ * column — keeping the builder's cyclomatic complexity at one path.
153
+ */
154
+ function nullify(value) {
155
+ return value ?? null;
156
+ }
157
+ function buildInsertRawDocumentParams(input) {
158
+ return [
159
+ input.userId,
160
+ input.rawSourceId,
161
+ input.externalId,
162
+ nullify(input.externalUri),
163
+ nullify(input.displayName),
164
+ nullify(input.mimeType),
165
+ nullify(input.sizeBytes),
166
+ nullify(input.contentHash),
167
+ nullify(input.providerVersion),
168
+ nullify(input.sourceModifiedAt),
169
+ input.storageMode ?? 'pointer_only',
170
+ JSON.stringify(input.metadata ?? {}),
171
+ // Phase B — restricted-initial-state writes. Default
172
+ // `'not_required'` matches the column default; clients that opt
173
+ // into the document pipeline pass `'pending'` (see
174
+ // `RegisterDocumentBodySchema` for the wire-side guard).
175
+ input.extractionStatus ?? 'not_required',
176
+ input.semanticIndexStatus ?? 'not_required',
177
+ ];
178
+ }
179
+ /**
180
+ * Atomic INSERT on the active-unique partial index. Returns the
181
+ * persisted row when this call won the insert; null when an active
182
+ * row already exists (a concurrent caller, or this was a re-register
183
+ * with the same namespace).
184
+ */
185
+ async function tryInsertRawDocument(pool, input) {
186
+ return tryInsertRawDocumentWithClient(pool, input);
187
+ }
188
+ async function tryInsertRawDocumentWithClient(q, input) {
189
+ const result = await q.query(`INSERT INTO raw_documents (${INSERT_RAW_DOCUMENT_COLUMNS})
190
+ VALUES (${INSERT_RAW_DOCUMENT_PLACEHOLDERS})
191
+ ON CONFLICT (user_id, raw_source_id, external_id, COALESCE(provider_version, ''))
192
+ WHERE deleted_at IS NULL DO NOTHING
193
+ RETURNING ${RAW_DOCUMENT_COLUMNS}`, buildInsertRawDocumentParams(input));
194
+ if (result.rows.length === 0)
195
+ return null;
196
+ return rowToRawDocument(result.rows[0]);
197
+ }
198
+ async function findActiveDocumentRow(pool, input) {
199
+ const result = await pool.query(`SELECT ${RAW_DOCUMENT_COLUMNS}
200
+ FROM raw_documents
201
+ WHERE user_id = $1
202
+ AND raw_source_id = $2
203
+ AND external_id = $3
204
+ AND COALESCE(provider_version, '') = COALESCE($4, '')
205
+ AND deleted_at IS NULL`, [input.userId, input.rawSourceId, input.externalId, input.providerVersion ?? null]);
206
+ if (result.rows.length === 0)
207
+ return null;
208
+ return rowToRawDocument(result.rows[0]);
209
+ }
210
+ /**
211
+ * Fetch one active document by id, scoped to a user. Returns null when
212
+ * the row is missing, deleted, or owned by a different user.
213
+ */
214
+ export async function getRawDocumentById(q, userId, id) {
215
+ const result = await q.query(`SELECT ${RAW_DOCUMENT_COLUMNS}
216
+ FROM raw_documents
217
+ WHERE id = $1 AND user_id = $2 AND deleted_at IS NULL`, [id, userId]);
218
+ if (result.rows.length === 0)
219
+ return null;
220
+ return rowToRawDocument(result.rows[0]);
221
+ }
222
+ /**
223
+ * List active documents for a user, optionally filtered by source_site.
224
+ * Limit is clamped to [1, 100]; offset is non-negative.
225
+ */
226
+ export async function listRawDocuments(pool, input) {
227
+ const limit = Math.max(1, Math.min(100, Math.floor(input.limit ?? 20)));
228
+ const offset = Math.max(0, Math.floor(input.offset ?? 0));
229
+ const params = [input.userId, limit, offset];
230
+ let where = `d.user_id = $1 AND d.deleted_at IS NULL`;
231
+ if (input.sourceSite) {
232
+ params.push(input.sourceSite);
233
+ where += ` AND s.source_site = $${params.length}`;
234
+ }
235
+ const result = await pool.query(`SELECT ${RAW_DOCUMENT_COLUMNS.split(', ').map(c => `d.${c}`).join(', ')}
236
+ FROM raw_documents d
237
+ JOIN raw_sources s ON s.id = d.raw_source_id
238
+ WHERE ${where}
239
+ ORDER BY d.created_at DESC
240
+ LIMIT $2 OFFSET $3`, params);
241
+ return result.rows.map(rowToRawDocument);
242
+ }
243
+ /**
244
+ * Soft-delete one document by id, scoped to a user. Returns true when
245
+ * a row transitioned from active to deleted; false when the row was
246
+ * missing, already deleted, or owned by a different user.
247
+ */
248
+ export async function softDeleteRawDocument(q, userId, id) {
249
+ const result = await q.query(`UPDATE raw_documents
250
+ SET deleted_at = NOW(), updated_at = NOW()
251
+ WHERE id = $1 AND user_id = $2 AND deleted_at IS NULL`, [id, userId]);
252
+ return (result.rowCount ?? 0) > 0;
253
+ }
254
+ /**
255
+ * Fetch one active document together with its parent source's
256
+ * `source_site`. The Phase 2 indexer uses `source_site` to populate the
257
+ * `memories.source_site` column on derived memories without needing a
258
+ * second round-trip.
259
+ */
260
+ export async function getDocumentWithSourceSite(q, userId, id) {
261
+ const result = await q.query(`SELECT ${RAW_DOCUMENT_COLUMNS.split(', ').map((c) => `d.${c}`).join(', ')}, s.source_site
262
+ FROM raw_documents d
263
+ JOIN raw_sources s ON s.id = d.raw_source_id
264
+ WHERE d.id = $1 AND d.user_id = $2 AND d.deleted_at IS NULL`, [id, userId]);
265
+ if (result.rows.length === 0)
266
+ return null;
267
+ const row = result.rows[0];
268
+ return {
269
+ document: rowToRawDocument(row),
270
+ sourceSite: row.source_site,
271
+ };
272
+ }
273
+ /**
274
+ * Update the indexed-text fingerprint on an active document. Called by
275
+ * the Phase 2 indexer on a successful re-chunk pass so subsequent index
276
+ * calls can short-circuit on byte-identical input.
277
+ *
278
+ * Writes only `indexed_content_hash` + `indexed_at` (and `updated_at`).
279
+ * `content_hash` is reserved for the upstream/provider raw-content
280
+ * fingerprint and must not be touched by the indexer.
281
+ */
282
+ export async function setRawDocumentIndexedHashWithClient(client, userId, id, indexedContentHash) {
283
+ await client.query(`UPDATE raw_documents
284
+ SET indexed_content_hash = $1,
285
+ indexed_at = NOW(),
286
+ updated_at = NOW()
287
+ WHERE id = $2 AND user_id = $3 AND deleted_at IS NULL`, [indexedContentHash, id, userId]);
288
+ }
289
+ /**
290
+ * Soft-delete every active document whose source_site matches.
291
+ * Joins through `raw_sources` so callers don't need to know
292
+ * `raw_source_id`. Used by `deleteBySource` to keep document deletion
293
+ * inside the same transactional reset.
294
+ */
295
+ export async function deleteDocumentsBySourceWithClient(client, userId, sourceSite) {
296
+ const result = await client.query(`UPDATE raw_documents d
297
+ SET deleted_at = NOW(), updated_at = NOW()
298
+ FROM raw_sources s
299
+ WHERE d.raw_source_id = s.id
300
+ AND d.user_id = $1
301
+ AND s.source_site = $2
302
+ AND d.deleted_at IS NULL`, [userId, sourceSite]);
303
+ return result.rowCount ?? 0;
304
+ }
305
+ // ---------------------------------------------------------------------------
306
+ // Row mappers — accept the snake_case shape Postgres returns and emit
307
+ // the camelCase TypeScript types the rest of the codebase consumes.
308
+ // ---------------------------------------------------------------------------
309
+ function rowToRawSource(row) {
310
+ return {
311
+ id: row.id,
312
+ userId: row.user_id,
313
+ sourceSite: row.source_site,
314
+ provider: row.provider,
315
+ accountId: row.account_id ?? null,
316
+ storageMode: row.storage_mode,
317
+ retentionPolicy: row.retention_policy ?? {},
318
+ consentPolicy: row.consent_policy ?? {},
319
+ createdAt: row.created_at,
320
+ updatedAt: row.updated_at,
321
+ };
322
+ }
323
+ function nullableString(value) {
324
+ return value ?? null;
325
+ }
326
+ function nullableDate(value) {
327
+ return value ?? null;
328
+ }
329
+ function nullableBigInt(value) {
330
+ return value === null || value === undefined ? null : Number(value);
331
+ }
332
+ /** Identifying fields shared by every active raw_documents row. */
333
+ function rowToRawDocumentIdentity(row) {
334
+ return {
335
+ id: row.id,
336
+ userId: row.user_id,
337
+ rawSourceId: row.raw_source_id,
338
+ externalId: row.external_id,
339
+ };
340
+ }
341
+ /** Provider/source-side metadata fields. */
342
+ function rowToRawDocumentSourceMeta(row) {
343
+ return {
344
+ externalUri: nullableString(row.external_uri),
345
+ displayName: nullableString(row.display_name),
346
+ mimeType: nullableString(row.mime_type),
347
+ sizeBytes: nullableBigInt(row.size_bytes),
348
+ contentHash: nullableString(row.content_hash),
349
+ providerVersion: nullableString(row.provider_version),
350
+ sourceModifiedAt: nullableDate(row.source_modified_at),
351
+ };
352
+ }
353
+ /** Storage + lifecycle status fields. */
354
+ function rowToRawDocumentStatus(row) {
355
+ return {
356
+ storageMode: row.storage_mode,
357
+ storageUri: nullableString(row.storage_uri),
358
+ storageProvider: nullableString(row.storage_provider),
359
+ registrationStatus: row.registration_status,
360
+ rawStorageStatus: row.raw_storage_status,
361
+ rawStorageMetadata: row.raw_storage_metadata ?? {},
362
+ };
363
+ }
364
+ /**
365
+ * Phase 5 / Phase 6 private worker columns. Read into RawDocumentRow
366
+ * so the upload service and the reconciler can drive their state
367
+ * machines off typed fields; never projected to the wire.
368
+ */
369
+ function rowToRawDocumentWorkerState(row) {
370
+ return {
371
+ rawStorageClaimId: nullableString(row.raw_storage_claim_id),
372
+ rawStorageClaimedAt: nullableDate(row.raw_storage_claimed_at),
373
+ rawStorageLastCheckedAt: nullableDate(row.raw_storage_last_checked_at),
374
+ rawStorageNextCheckAt: nullableDate(row.raw_storage_next_check_at),
375
+ rawStorageReconcileAttempts: typeof row.raw_storage_reconcile_attempts === 'number'
376
+ ? row.raw_storage_reconcile_attempts
377
+ : 0,
378
+ rawStoragePendingSince: nullableDate(row.raw_storage_pending_since),
379
+ };
380
+ }
381
+ /** Phase B — per-layer status fields + last_error envelope. */
382
+ function rowToRawDocumentLayerStatus(row) {
383
+ return {
384
+ extractionStatus: row.extraction_status,
385
+ semanticIndexStatus: row.semantic_index_status,
386
+ lastError: row.last_error ?? null,
387
+ };
388
+ }
389
+ /**
390
+ * Map a flat Postgres row into the typed `RawDocumentRow` shape.
391
+ * Exported so the Phase D list / recovery / passport-feed
392
+ * repositories can reuse it without re-implementing the column-by-
393
+ * column projection.
394
+ */
395
+ export function rowToRawDocument(row) {
396
+ return {
397
+ ...rowToRawDocumentIdentity(row),
398
+ ...rowToRawDocumentSourceMeta(row),
399
+ ...rowToRawDocumentStatus(row),
400
+ ...rowToRawDocumentLayerStatus(row),
401
+ ...rowToRawDocumentWorkerState(row),
402
+ metadata: row.metadata ?? {},
403
+ createdAt: row.created_at,
404
+ updatedAt: row.updated_at,
405
+ deletedAt: nullableDate(row.deleted_at),
406
+ indexedContentHash: nullableString(row.indexed_content_hash),
407
+ indexedAt: nullableDate(row.indexed_at),
408
+ storageArtifactId: nullableString(row.storage_artifact_id),
409
+ };
410
+ }
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Per-layer status repository helpers (Phase B).
3
+ *
4
+ * The audit at
5
+ * `Atomicmemory-research/docs/core-repo/design/document-ingest-audit.md`
6
+ * and the rev-18 hardening plan call for **service-owned** transitions
7
+ * of `extraction_status`, `semantic_index_status`, `raw_storage_status`
8
+ * and the `last_error` JSONB envelope. This module exposes the SQL
9
+ * primitives that the indexer (`document-indexer.ts`), the upload
10
+ * service (`document-upload.ts`), and any future async worker call to
11
+ * record those transitions.
12
+ *
13
+ * Design notes (cross-referenced from the plan):
14
+ *
15
+ * * Each helper accepts `pg.Pool | pg.PoolClient` so it works inside
16
+ * an in-flight transaction (e.g. the indexer's running-tx) and
17
+ * from a **fresh** statement after a parent rolled back. The catch
18
+ * paths in `document-upload.ts` and `document-indexer.ts` use the
19
+ * fresh-statement form deliberately so the durable failure write
20
+ * survives the rollback that drops the in-tx work.
21
+ *
22
+ * * Mark helpers are scoped by `user_id` + `id` and skip soft-deleted
23
+ * rows. They are **idempotent** at the SQL level - re-applying the
24
+ * same status (e.g. `'failed'` -> `'failed'` with the same code)
25
+ * returns the row unchanged.
26
+ *
27
+ * * `last_error` write rule: a failure transition writes the supplied
28
+ * envelope; a success transition clears `last_error` **only when
29
+ * the existing envelope was scoped to the same layer**. A
30
+ * successful semantic-index pass should not silently erase a
31
+ * previous extraction failure that someone else still needs to
32
+ * reconcile.
33
+ */
34
+ import pg from 'pg';
35
+ import type { ExtractionStatus, LastError, LastErrorLayer, SemanticIndexStatus } from './raw-document-types.js';
36
+ /** Pool or in-flight client - matches the union the rest of the repo uses. */
37
+ type Querier = pg.Pool | pg.PoolClient;
38
+ interface MarkArgs {
39
+ q: Querier;
40
+ userId: string;
41
+ documentId: string;
42
+ }
43
+ /**
44
+ * Update `extraction_status` on an active row. Pass `lastError` for
45
+ * failure / unsupported transitions; success transitions clear the
46
+ * column when the prior `last_error` was scoped to the extraction
47
+ * layer.
48
+ */
49
+ export declare function markExtractionStatus(args: MarkArgs & {
50
+ status: ExtractionStatus;
51
+ lastError?: LastError | null;
52
+ }): Promise<void>;
53
+ /**
54
+ * Update `semantic_index_status` on an active row. Same `last_error`
55
+ * scoping rule as {@link markExtractionStatus} - a successful
56
+ * indexing pass clears the column only when it was last set by the
57
+ * semantic-index layer.
58
+ */
59
+ export declare function markSemanticIndexStatus(args: MarkArgs & {
60
+ status: SemanticIndexStatus;
61
+ lastError?: LastError | null;
62
+ }): Promise<void>;
63
+ /**
64
+ * Mark a row as `raw_storage_status='raw_storage_failed'` from a
65
+ * **document id** (not a storage URI). The audit fix the upload
66
+ * service relies on: when `store.put` throws before returning a URI
67
+ * the URI-keyed marker can't fire, so this doc-id form lives next to
68
+ * it and runs in the catch path of `uploadRawDocument` in a fresh
69
+ * statement after the parent transaction rolled back.
70
+ */
71
+ export declare function markRawStorageFailedByDocumentId(args: MarkArgs & {
72
+ lastError: LastError;
73
+ }): Promise<void>;
74
+ /**
75
+ * Clear `last_error` on a row when the existing envelope is scoped to
76
+ * `layer`. Optional helper for retry paths that want to reset only
77
+ * one layer's failure marker without touching status fields.
78
+ */
79
+ export declare function clearLastError(args: MarkArgs & {
80
+ layer: LastErrorLayer;
81
+ }): Promise<void>;
82
+ /**
83
+ * Hard cap on the persisted `last_error.message` length (UTF-16 code
84
+ * units, the JS string-length unit). Producer-facing failure messages
85
+ * vary widely - DB-driver stack traces, embedding-provider error
86
+ * blobs, file-extractor exceptions - and persisting them verbatim
87
+ * risks (a) blowing JSONB row-size budgets on operational noise and
88
+ * (b) leaking sensitive operational strings (URIs, keys baked into
89
+ * exception messages). This cap is the central knob; producers funnel
90
+ * through {@link buildLastError} so the cap applies uniformly to every
91
+ * `last_error` write.
92
+ *
93
+ * The number is sized to fit a useful human-readable detail line
94
+ * (e.g. one stack-frame's worth of context) without becoming a
95
+ * dumping ground for raw exception text.
96
+ */
97
+ export declare const MAX_LAST_ERROR_MESSAGE_CHARS = 1000;
98
+ /**
99
+ * Normalize a producer-supplied error message before persisting it on
100
+ * `raw_documents.last_error`:
101
+ * * control chars (including TAB, CR, LF, and NUL) are replaced
102
+ * with a single space - keeps multi-line stack traces from
103
+ * breaking the UI's row layout and prevents NUL bytes from
104
+ * reaching clients that mishandle them;
105
+ * * runs of whitespace collapse to a single space - the message
106
+ * reads as a single line of operator detail;
107
+ * * the result is truncated to {@link MAX_LAST_ERROR_MESSAGE_CHARS}
108
+ * code units. No truncation marker is appended; readers compare
109
+ * against the cap if they want to flag truncation client-side.
110
+ *
111
+ * Exported so producer-side code paths (route handlers, services
112
+ * that need to build envelopes outside `buildLastError`) can apply
113
+ * the same sanitization rule without re-implementing it.
114
+ */
115
+ export declare function sanitizeLastErrorMessage(raw: string): string;
116
+ /**
117
+ * Build a `LastError` envelope. Producers should funnel through this
118
+ * helper so the wire / JSONB shape stays uniform AND the message is
119
+ * sanitized + capped (see {@link sanitizeLastErrorMessage}).
120
+ */
121
+ export declare function buildLastError(layer: LastErrorLayer, code: string, message: string, occurredAt?: Date): LastError;
122
+ export {};