@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,1038 @@
1
+ /**
2
+ * @file OpenAPI 3.1 registry — single source of truth for the spec.
3
+ *
4
+ * Wires every /v1/memories/*, /v1/agents/*, and /v1/documents/* route
5
+ * into an OpenAPIRegistry. `scripts/generate-openapi.ts` walks this
6
+ * registry to emit `openapi.yaml` + `openapi.json` at repo root.
7
+ *
8
+ * Each route entry records:
9
+ * - method + path (the public wire contract with the `/v1` prefix)
10
+ * - operationId (stable identifier clients can reference)
11
+ * - tag (groups routes under logical sections in the rendered docs)
12
+ * - request body and/or query / path params (Zod schemas from
13
+ * `./memories.ts` + `./agents.ts`)
14
+ * - per-route response inventory — includes every status code the
15
+ * real handler can emit, not a generic 200+400+500 default. The
16
+ * special 410 + rich-400 envelopes on PUT /config and 404 on
17
+ * GET/DELETE /:id are spelled out.
18
+ */
19
+ import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';
20
+ import { z } from './zod-setup.js';
21
+ import { ErrorBasicSchema, ErrorConfig400Schema, ErrorConfig410Schema, ErrorUpstreamProviderSchema, } from './errors.js';
22
+ import { IngestBodySchema, SearchBodySchema, ExpandBodySchema, ConsolidateBodySchema, DecayBodySchema, ReconcileBodySchema, ResetSourceBodySchema, LessonReportBodySchema, ConfigBodySchema, UserIdQuerySchema, UserIdLimitQuerySchema, ListQuerySchema, MemoryByIdQuerySchema, UuidIdParamSchema, FreeIdParamSchema, } from './memories.js';
23
+ import { SetTrustBodySchema, GetTrustQuerySchema, UserIdFromQuerySchema, UserIdFromBodySchema, ConflictIdParamSchema, ResolveConflictBodySchema, } from './agents.js';
24
+ import { RegisterDocumentBodySchema, DocumentIdParamSchema, DocumentByIdQuerySchema, ExtractionFailureBodySchema, IndexDocumentBodySchema, IndexFailureBodySchema, ListDocumentsQuerySchema, UploadRawDocumentQuerySchema, } from './documents.js';
25
+ import { DocumentListRootQuerySchema, ListDocumentsWithoutMemoriesQuerySchema, PassportFeedQuerySchema, } from './document-list-schemas.js';
26
+ import { PassportFeedResponseSchema } from './document-list-responses.js';
27
+ import { DeleteArtifactPolicySchema, DeleteArtifactResultSchema, PutArtifactBodySchema, StorageCapabilitiesResponseSchema, StoredArtifactResponseSchema, VerifyArtifactResultSchema, } from './storage-schemas.js';
28
+ import * as R from './responses.js';
29
+ export const API_TITLE = 'AtomicMemory HTTP API';
30
+ export const API_VERSION = '1.0.0';
31
+ export const API_DESCRIPTION = 'Semantic memory engine for AI applications. Request/response bodies are JSON; fields on the wire use snake_case.';
32
+ const TAG_MEMORIES = 'Memories';
33
+ const TAG_LIFECYCLE = 'Lifecycle';
34
+ const TAG_AUDIT = 'Audit';
35
+ const TAG_LESSONS = 'Lessons';
36
+ const TAG_CONFIG = 'Configuration';
37
+ const TAG_AGENTS = 'Agents';
38
+ const TAG_DOCUMENTS = 'Documents';
39
+ const TAG_STORAGE = 'Storage';
40
+ /** Build and populate the OpenAPI registry. */
41
+ export function buildRegistry() {
42
+ const registry = new OpenAPIRegistry();
43
+ // Bearer auth scheme — matches the `requireBearer(coreApiKey)`
44
+ // middleware mounted on every SDK-facing `/v1/*` router in
45
+ // `create-app.ts`. The unversioned `/health` and `/openapi.json`
46
+ // probes stay outside that scope, but neither is registered in
47
+ // this OpenAPI surface so every documented route is auth-gated.
48
+ registry.registerComponent('securitySchemes', 'bearerAuth', {
49
+ type: 'http',
50
+ scheme: 'bearer',
51
+ description: "Send `Authorization: Bearer <CORE_API_KEY>` on every request. " +
52
+ 'The key is the deployment-wide secret configured via ' +
53
+ "`CORE_API_KEY`; the middleware uses constant-time comparison.",
54
+ });
55
+ registry.register('ErrorBasic', ErrorBasicSchema);
56
+ registry.register('ErrorConfig400', ErrorConfig400Schema);
57
+ registry.register('ErrorConfig410', ErrorConfig410Schema);
58
+ registry.register('ErrorUpstreamProvider', ErrorUpstreamProviderSchema);
59
+ registerMemoryCoreRoutes(registry);
60
+ registerMemoryLifecycleRoutes(registry);
61
+ registerMemoryAuditRoutes(registry);
62
+ registerMemoryLessonRoutes(registry);
63
+ registerMemoryConfigRoutes(registry);
64
+ registerAgentRoutes(registry);
65
+ registerDocumentRoutes(registry);
66
+ registerStorageRoutes(registry);
67
+ return registry;
68
+ }
69
+ // ---------------------------------------------------------------------------
70
+ // Shared response-object builders
71
+ // ---------------------------------------------------------------------------
72
+ const RESPONSE_400 = {
73
+ description: 'Input validation error',
74
+ content: { 'application/json': { schema: ErrorBasicSchema } },
75
+ };
76
+ const RESPONSE_500 = {
77
+ description: 'Internal server error',
78
+ content: { 'application/json': { schema: ErrorBasicSchema } },
79
+ };
80
+ const RESPONSE_502 = {
81
+ description: 'Upstream AI provider returned an unrecoverable failure (auth, non-retryable 4xx).',
82
+ content: { 'application/json': { schema: ErrorUpstreamProviderSchema } },
83
+ };
84
+ const RESPONSE_503 = {
85
+ description: 'Upstream AI provider is rate-limited, quota-exhausted, or returned 5xx; consult `retryable`.',
86
+ content: { 'application/json': { schema: ErrorUpstreamProviderSchema } },
87
+ };
88
+ const RESPONSE_404 = {
89
+ description: 'Memory not found',
90
+ content: { 'application/json': { schema: ErrorBasicSchema } },
91
+ };
92
+ /** Catch-all schema used for responses whose internal shape is large + still evolving. */
93
+ const GenericObjectResponse = z.object({}).passthrough();
94
+ function ok(description, schema = GenericObjectResponse) {
95
+ return { description, content: { 'application/json': { schema } } };
96
+ }
97
+ // ---------------------------------------------------------------------------
98
+ // /v1/memories — core routes (ingest, search, expand, list, get, delete)
99
+ // ---------------------------------------------------------------------------
100
+ function registerMemoryCoreRoutes(registry) {
101
+ registry.registerPath({
102
+ method: 'post',
103
+ path: '/v1/memories/ingest',
104
+ operationId: 'ingestMemory',
105
+ tags: [TAG_MEMORIES],
106
+ summary: 'Ingest a conversation transcript with full extraction.',
107
+ description: 'Full-extraction ingest. The `metadata` field on the body schema is ' +
108
+ '**rejected with 400** on this route — caller metadata is only supported ' +
109
+ 'on `POST /v1/memories/ingest/quick` with `skip_extraction=true` and no ' +
110
+ 'workspace context.',
111
+ request: { body: { content: { 'application/json': { schema: IngestBodySchema } }, required: true } },
112
+ responses: {
113
+ 200: ok('Ingest result with extracted facts.', R.IngestResponseSchema),
114
+ 400: RESPONSE_400,
115
+ 500: RESPONSE_500,
116
+ 502: RESPONSE_502,
117
+ 503: RESPONSE_503,
118
+ },
119
+ });
120
+ registry.registerPath({
121
+ method: 'post',
122
+ path: '/v1/memories/ingest/quick',
123
+ operationId: 'ingestMemoryQuick',
124
+ tags: [TAG_MEMORIES],
125
+ summary: 'Quick ingest (storeVerbatim when skip_extraction=true).',
126
+ description: 'Quick or verbatim ingest. The `metadata` field is **honored only** when ' +
127
+ '`skip_extraction=true` and no workspace context (`workspace_id` / ' +
128
+ '`agent_id` / `visibility`) is provided; otherwise rejected with 400.',
129
+ request: { body: { content: { 'application/json': { schema: IngestBodySchema } }, required: true } },
130
+ responses: {
131
+ 200: ok('Ingest result.', R.IngestResponseSchema),
132
+ 400: RESPONSE_400,
133
+ 500: RESPONSE_500,
134
+ 502: RESPONSE_502,
135
+ 503: RESPONSE_503,
136
+ },
137
+ });
138
+ registry.registerPath({
139
+ method: 'post',
140
+ path: '/v1/memories/search',
141
+ operationId: 'searchMemories',
142
+ tags: [TAG_MEMORIES],
143
+ summary: 'Full semantic search with optional temporal / retrieval-mode / token-budget controls.',
144
+ request: { body: { content: { 'application/json': { schema: SearchBodySchema } }, required: true } },
145
+ responses: {
146
+ 200: ok('Search results with injection_text and citations.', R.SearchResponseSchema),
147
+ 400: RESPONSE_400,
148
+ 500: RESPONSE_500,
149
+ 502: RESPONSE_502,
150
+ 503: RESPONSE_503,
151
+ },
152
+ });
153
+ registry.registerPath({
154
+ method: 'post',
155
+ path: '/v1/memories/search/fast',
156
+ operationId: 'searchMemoriesFast',
157
+ tags: [TAG_MEMORIES],
158
+ summary: 'Latency-optimized search (skips LLM repair loop). ~88% lower latency than /search.',
159
+ request: { body: { content: { 'application/json': { schema: SearchBodySchema } }, required: true } },
160
+ responses: {
161
+ 200: ok('Search results.', R.SearchResponseSchema),
162
+ 400: RESPONSE_400,
163
+ 500: RESPONSE_500,
164
+ 502: RESPONSE_502,
165
+ 503: RESPONSE_503,
166
+ },
167
+ });
168
+ registry.registerPath({
169
+ method: 'post',
170
+ path: '/v1/memories/expand',
171
+ operationId: 'expandMemories',
172
+ tags: [TAG_MEMORIES],
173
+ summary: 'Expand a list of memory IDs into full objects.',
174
+ request: { body: { content: { 'application/json': { schema: ExpandBodySchema } }, required: true } },
175
+ responses: {
176
+ 200: ok('Expanded memories array.', R.ExpandResponseSchema),
177
+ 400: RESPONSE_400,
178
+ 500: RESPONSE_500,
179
+ 502: RESPONSE_502,
180
+ 503: RESPONSE_503,
181
+ },
182
+ });
183
+ registry.registerPath({
184
+ method: 'get',
185
+ path: '/v1/memories/list',
186
+ operationId: 'listMemories',
187
+ tags: [TAG_MEMORIES],
188
+ summary: 'List memories for a user (or workspace).',
189
+ request: { query: ListQuerySchema },
190
+ responses: {
191
+ 200: ok('Paginated memory list.', R.ListResponseSchema),
192
+ 400: RESPONSE_400,
193
+ 500: RESPONSE_500,
194
+ 502: RESPONSE_502,
195
+ 503: RESPONSE_503,
196
+ },
197
+ });
198
+ registry.registerPath({
199
+ method: 'get',
200
+ path: '/v1/memories/{id}',
201
+ operationId: 'getMemory',
202
+ tags: [TAG_MEMORIES],
203
+ summary: 'Fetch a single memory by UUID.',
204
+ request: { params: UuidIdParamSchema, query: MemoryByIdQuerySchema },
205
+ responses: {
206
+ 200: ok('Memory object.', R.GetMemoryResponseSchema),
207
+ 400: RESPONSE_400,
208
+ 404: RESPONSE_404,
209
+ 500: RESPONSE_500,
210
+ 502: RESPONSE_502,
211
+ 503: RESPONSE_503,
212
+ },
213
+ });
214
+ registry.registerPath({
215
+ method: 'delete',
216
+ path: '/v1/memories/{id}',
217
+ operationId: 'deleteMemory',
218
+ tags: [TAG_MEMORIES],
219
+ summary: 'Delete a single memory by UUID.',
220
+ request: { params: UuidIdParamSchema, query: MemoryByIdQuerySchema },
221
+ responses: {
222
+ 200: ok('Deletion success.', R.SuccessResponseSchema),
223
+ 400: RESPONSE_400,
224
+ 404: RESPONSE_404,
225
+ 500: RESPONSE_500,
226
+ 502: RESPONSE_502,
227
+ 503: RESPONSE_503,
228
+ },
229
+ });
230
+ registry.registerPath({
231
+ method: 'get',
232
+ path: '/v1/memories/stats',
233
+ operationId: 'getStats',
234
+ tags: [TAG_MEMORIES],
235
+ summary: 'Aggregate memory statistics for a user.',
236
+ request: { query: UserIdQuerySchema },
237
+ responses: {
238
+ 200: ok('Stats payload.', R.StatsResponseSchema),
239
+ 400: RESPONSE_400,
240
+ 500: RESPONSE_500,
241
+ 502: RESPONSE_502,
242
+ 503: RESPONSE_503,
243
+ },
244
+ });
245
+ }
246
+ // ---------------------------------------------------------------------------
247
+ // /v1/memories — lifecycle admin ops
248
+ // ---------------------------------------------------------------------------
249
+ function registerMemoryLifecycleRoutes(registry) {
250
+ registry.registerPath({
251
+ method: 'post',
252
+ path: '/v1/memories/consolidate',
253
+ operationId: 'consolidateMemories',
254
+ tags: [TAG_LIFECYCLE],
255
+ summary: 'Compute consolidation candidates; optionally execute (execute=true).',
256
+ request: { body: { content: { 'application/json': { schema: ConsolidateBodySchema } }, required: true } },
257
+ responses: {
258
+ 200: ok('Consolidation result.', R.ConsolidateResponseSchema),
259
+ 400: RESPONSE_400,
260
+ 500: RESPONSE_500,
261
+ 502: RESPONSE_502,
262
+ 503: RESPONSE_503,
263
+ },
264
+ });
265
+ registry.registerPath({
266
+ method: 'post',
267
+ path: '/v1/memories/decay',
268
+ operationId: 'evaluateDecay',
269
+ tags: [TAG_LIFECYCLE],
270
+ summary: 'Evaluate decay candidates. dry_run=false archives them.',
271
+ request: { body: { content: { 'application/json': { schema: DecayBodySchema } }, required: true } },
272
+ responses: {
273
+ 200: ok('Decay evaluation + archived count.', R.DecayResponseSchema),
274
+ 400: RESPONSE_400,
275
+ 500: RESPONSE_500,
276
+ 502: RESPONSE_502,
277
+ 503: RESPONSE_503,
278
+ },
279
+ });
280
+ registry.registerPath({
281
+ method: 'get',
282
+ path: '/v1/memories/cap',
283
+ operationId: 'checkMemoryCap',
284
+ tags: [TAG_LIFECYCLE],
285
+ summary: "Memory-cap status for a user's store.",
286
+ request: { query: UserIdQuerySchema },
287
+ responses: {
288
+ 200: ok('Cap status.', R.CapResponseSchema),
289
+ 400: RESPONSE_400,
290
+ 500: RESPONSE_500,
291
+ 502: RESPONSE_502,
292
+ 503: RESPONSE_503,
293
+ },
294
+ });
295
+ registry.registerPath({
296
+ method: 'post',
297
+ path: '/v1/memories/reconcile',
298
+ operationId: 'reconcileDeferred',
299
+ tags: [TAG_LIFECYCLE],
300
+ summary: 'Reconcile deferred mutations for a user (or all users when user_id is absent).',
301
+ request: { body: { content: { 'application/json': { schema: ReconcileBodySchema } }, required: false } },
302
+ responses: {
303
+ 200: ok('Reconciliation result.', R.ReconciliationResponseSchema),
304
+ 400: RESPONSE_400,
305
+ 500: RESPONSE_500,
306
+ 502: RESPONSE_502,
307
+ 503: RESPONSE_503,
308
+ },
309
+ });
310
+ registry.registerPath({
311
+ method: 'get',
312
+ path: '/v1/memories/reconcile/status',
313
+ operationId: 'getReconcileStatus',
314
+ tags: [TAG_LIFECYCLE],
315
+ summary: 'Get deferred-mutation reconciliation status.',
316
+ request: { query: UserIdQuerySchema },
317
+ responses: {
318
+ 200: ok('Status payload.', R.ReconcileStatusResponseSchema),
319
+ 400: RESPONSE_400,
320
+ 500: RESPONSE_500,
321
+ 502: RESPONSE_502,
322
+ 503: RESPONSE_503,
323
+ },
324
+ });
325
+ registry.registerPath({
326
+ method: 'post',
327
+ path: '/v1/memories/reset-source',
328
+ operationId: 'resetBySource',
329
+ tags: [TAG_LIFECYCLE],
330
+ summary: 'Delete all memories for a given user + source_site.',
331
+ request: { body: { content: { 'application/json': { schema: ResetSourceBodySchema } }, required: true } },
332
+ responses: {
333
+ 200: ok('Reset result.', R.ResetSourceResponseSchema),
334
+ 400: RESPONSE_400,
335
+ 500: RESPONSE_500,
336
+ 502: RESPONSE_502,
337
+ 503: RESPONSE_503,
338
+ },
339
+ });
340
+ }
341
+ // ---------------------------------------------------------------------------
342
+ // /v1/memories — audit
343
+ // ---------------------------------------------------------------------------
344
+ function registerMemoryAuditRoutes(registry) {
345
+ registry.registerPath({
346
+ method: 'get',
347
+ path: '/v1/memories/audit/summary',
348
+ operationId: 'getAuditSummary',
349
+ tags: [TAG_AUDIT],
350
+ summary: "Aggregate mutation statistics for a user's memory store.",
351
+ request: { query: UserIdQuerySchema },
352
+ responses: {
353
+ 200: ok('Mutation summary.', R.MutationSummaryResponseSchema),
354
+ 400: RESPONSE_400,
355
+ 500: RESPONSE_500,
356
+ 502: RESPONSE_502,
357
+ 503: RESPONSE_503,
358
+ },
359
+ });
360
+ registry.registerPath({
361
+ method: 'get',
362
+ path: '/v1/memories/audit/recent',
363
+ operationId: 'getRecentAudit',
364
+ tags: [TAG_AUDIT],
365
+ summary: 'Recent mutations for a user, limit-bounded.',
366
+ request: { query: UserIdLimitQuerySchema },
367
+ responses: {
368
+ 200: ok('Recent mutations.', R.AuditRecentResponseSchema),
369
+ 400: RESPONSE_400,
370
+ 500: RESPONSE_500,
371
+ 502: RESPONSE_502,
372
+ 503: RESPONSE_503,
373
+ },
374
+ });
375
+ registry.registerPath({
376
+ method: 'get',
377
+ path: '/v1/memories/{id}/audit',
378
+ operationId: 'getMemoryAuditTrail',
379
+ tags: [TAG_AUDIT],
380
+ summary: 'Per-memory version history.',
381
+ request: { params: UuidIdParamSchema, query: UserIdQuerySchema },
382
+ responses: {
383
+ 200: ok('Audit trail.', R.AuditTrailResponseSchema),
384
+ 400: RESPONSE_400,
385
+ 500: RESPONSE_500,
386
+ 502: RESPONSE_502,
387
+ 503: RESPONSE_503,
388
+ },
389
+ });
390
+ }
391
+ // ---------------------------------------------------------------------------
392
+ // /v1/memories — lessons
393
+ // ---------------------------------------------------------------------------
394
+ function registerMemoryLessonRoutes(registry) {
395
+ registry.registerPath({
396
+ method: 'get',
397
+ path: '/v1/memories/lessons',
398
+ operationId: 'listLessons',
399
+ tags: [TAG_LESSONS],
400
+ summary: 'List active lessons for a user.',
401
+ request: { query: UserIdQuerySchema },
402
+ responses: {
403
+ 200: ok('Lessons list.', R.LessonsListResponseSchema),
404
+ 400: RESPONSE_400,
405
+ 500: RESPONSE_500,
406
+ 502: RESPONSE_502,
407
+ 503: RESPONSE_503,
408
+ },
409
+ });
410
+ registry.registerPath({
411
+ method: 'get',
412
+ path: '/v1/memories/lessons/stats',
413
+ operationId: 'getLessonStats',
414
+ tags: [TAG_LESSONS],
415
+ summary: 'Lesson statistics for a user.',
416
+ request: { query: UserIdQuerySchema },
417
+ responses: {
418
+ 200: ok('Stats.', R.LessonStatsResponseSchema),
419
+ 400: RESPONSE_400,
420
+ 500: RESPONSE_500,
421
+ 502: RESPONSE_502,
422
+ 503: RESPONSE_503,
423
+ },
424
+ });
425
+ registry.registerPath({
426
+ method: 'post',
427
+ path: '/v1/memories/lessons/report',
428
+ operationId: 'reportLesson',
429
+ tags: [TAG_LESSONS],
430
+ summary: 'Report a new lesson.',
431
+ request: { body: { content: { 'application/json': { schema: LessonReportBodySchema } }, required: true } },
432
+ responses: {
433
+ 200: ok('Lesson id.', R.LessonReportResponseSchema),
434
+ 400: RESPONSE_400,
435
+ 500: RESPONSE_500,
436
+ 502: RESPONSE_502,
437
+ 503: RESPONSE_503,
438
+ },
439
+ });
440
+ registry.registerPath({
441
+ method: 'delete',
442
+ path: '/v1/memories/lessons/{id}',
443
+ operationId: 'deactivateLesson',
444
+ tags: [TAG_LESSONS],
445
+ summary: 'Deactivate a lesson by id.',
446
+ request: { params: FreeIdParamSchema, query: UserIdQuerySchema },
447
+ responses: {
448
+ 200: ok('Success.', R.SuccessResponseSchema),
449
+ 400: RESPONSE_400,
450
+ 500: RESPONSE_500,
451
+ 502: RESPONSE_502,
452
+ 503: RESPONSE_503,
453
+ },
454
+ });
455
+ }
456
+ // ---------------------------------------------------------------------------
457
+ // /v1/memories — config + health
458
+ // ---------------------------------------------------------------------------
459
+ function registerMemoryConfigRoutes(registry) {
460
+ registry.registerPath({
461
+ method: 'get',
462
+ path: '/v1/memories/health',
463
+ operationId: 'getMemoryHealth',
464
+ tags: [TAG_CONFIG],
465
+ summary: 'Subsystem liveness + current runtime config snapshot.',
466
+ responses: {
467
+ 200: ok('Status + config snapshot.', R.HealthResponseSchema),
468
+ },
469
+ });
470
+ registry.registerPath({
471
+ method: 'put',
472
+ path: '/v1/memories/config',
473
+ operationId: 'updateConfig',
474
+ tags: [TAG_CONFIG],
475
+ summary: 'Mutate runtime config (dev/test only). 410 when disabled.',
476
+ description: 'Set CORE_RUNTIME_CONFIG_MUTATION_ENABLED=true to enable. Startup-only fields (embedding_provider/model, llm_provider/model) return 400 with a `rejected` array listing the offending fields.',
477
+ request: { body: { content: { 'application/json': { schema: ConfigBodySchema } }, required: true } },
478
+ responses: {
479
+ 200: ok('Applied changes + config snapshot.', R.ConfigUpdateResponseSchema),
480
+ 400: {
481
+ // Two shapes are possible:
482
+ // 1. Basic `{ error }` when the validateBody middleware
483
+ // catches a schema violation on the request body.
484
+ // 2. Richer `{ error, detail, rejected }` when the handler
485
+ // detects startup-only fields (embedding_provider etc.).
486
+ description: 'Input validation error OR startup-only fields were supplied.',
487
+ content: {
488
+ 'application/json': {
489
+ schema: {
490
+ oneOf: [
491
+ { $ref: '#/components/schemas/ErrorBasic' },
492
+ { $ref: '#/components/schemas/ErrorConfig400' },
493
+ ],
494
+ },
495
+ },
496
+ },
497
+ },
498
+ 410: {
499
+ description: 'Runtime config mutation is disabled in production.',
500
+ content: { 'application/json': { schema: ErrorConfig410Schema } },
501
+ },
502
+ 500: RESPONSE_500,
503
+ 502: RESPONSE_502,
504
+ 503: RESPONSE_503,
505
+ },
506
+ });
507
+ }
508
+ // ---------------------------------------------------------------------------
509
+ // /v1/agents
510
+ // ---------------------------------------------------------------------------
511
+ function registerAgentRoutes(registry) {
512
+ registry.registerPath({
513
+ method: 'put',
514
+ path: '/v1/agents/trust',
515
+ operationId: 'setAgentTrust',
516
+ tags: [TAG_AGENTS],
517
+ summary: "Set the calling user's trust level for a given agent.",
518
+ request: { body: { content: { 'application/json': { schema: SetTrustBodySchema } }, required: true } },
519
+ responses: {
520
+ 200: ok('Agent id + applied trust level.', R.TrustResponseSchema),
521
+ 400: RESPONSE_400,
522
+ 500: RESPONSE_500,
523
+ 502: RESPONSE_502,
524
+ 503: RESPONSE_503,
525
+ },
526
+ });
527
+ registry.registerPath({
528
+ method: 'get',
529
+ path: '/v1/agents/trust',
530
+ operationId: 'getAgentTrust',
531
+ tags: [TAG_AGENTS],
532
+ summary: 'Look up the trust level for a (user, agent) pair.',
533
+ request: { query: GetTrustQuerySchema },
534
+ responses: {
535
+ 200: ok('Agent id + trust level.', R.TrustResponseSchema),
536
+ 400: RESPONSE_400,
537
+ 500: RESPONSE_500,
538
+ 502: RESPONSE_502,
539
+ 503: RESPONSE_503,
540
+ },
541
+ });
542
+ registry.registerPath({
543
+ method: 'get',
544
+ path: '/v1/agents/conflicts',
545
+ operationId: 'listAgentConflicts',
546
+ tags: [TAG_AGENTS],
547
+ summary: 'List open agent conflicts for a user.',
548
+ request: { query: UserIdFromQuerySchema },
549
+ responses: {
550
+ 200: ok('Conflicts list.', R.ConflictsListResponseSchema),
551
+ 400: RESPONSE_400,
552
+ 500: RESPONSE_500,
553
+ 502: RESPONSE_502,
554
+ 503: RESPONSE_503,
555
+ },
556
+ });
557
+ registry.registerPath({
558
+ method: 'put',
559
+ path: '/v1/agents/conflicts/{id}/resolve',
560
+ operationId: 'resolveAgentConflict',
561
+ tags: [TAG_AGENTS],
562
+ summary: 'Resolve a specific conflict with one of the three enum variants.',
563
+ request: {
564
+ params: ConflictIdParamSchema,
565
+ body: { content: { 'application/json': { schema: ResolveConflictBodySchema } }, required: true },
566
+ },
567
+ responses: {
568
+ 200: ok('Resolution confirmation.', R.ResolveConflictResponseSchema),
569
+ 400: RESPONSE_400,
570
+ 500: RESPONSE_500,
571
+ 502: RESPONSE_502,
572
+ 503: RESPONSE_503,
573
+ },
574
+ });
575
+ registry.registerPath({
576
+ method: 'post',
577
+ path: '/v1/agents/conflicts/auto-resolve',
578
+ operationId: 'autoResolveAgentConflicts',
579
+ tags: [TAG_AGENTS],
580
+ summary: 'Auto-resolve all expired conflicts for a user.',
581
+ request: { body: { content: { 'application/json': { schema: UserIdFromBodySchema } }, required: true } },
582
+ responses: {
583
+ 200: ok('Count of resolved conflicts.', R.AutoResolveConflictsResponseSchema),
584
+ 400: RESPONSE_400,
585
+ 500: RESPONSE_500,
586
+ 502: RESPONSE_502,
587
+ 503: RESPONSE_503,
588
+ },
589
+ });
590
+ }
591
+ // ---------------------------------------------------------------------------
592
+ // /v1/documents — pointer-only registration. Managed-blob ingestion uses
593
+ // the upload route after registration; the registration body rejects
594
+ // `storage_mode` values other than `pointer_only` with a 400.
595
+ // ---------------------------------------------------------------------------
596
+ const DOCUMENT_NOT_FOUND_RESPONSE = {
597
+ description: 'Document not found',
598
+ content: { 'application/json': { schema: ErrorBasicSchema } },
599
+ };
600
+ function registerDocumentRoutes(registry) {
601
+ registry.registerPath({
602
+ method: 'post',
603
+ path: '/v1/documents',
604
+ operationId: 'registerDocument',
605
+ tags: [TAG_DOCUMENTS],
606
+ summary: 'Register a pointer-only document.',
607
+ description: 'Idempotent on (user_id, source_site, provider, external_id, provider_version). ' +
608
+ 'Returns 201 on first registration; 200 on a re-register that matches an active ' +
609
+ "row. Registration accepts `storage_mode = 'pointer_only'`; managed_blob and " +
610
+ 'inline_small_text return 400.',
611
+ request: {
612
+ body: { content: { 'application/json': { schema: RegisterDocumentBodySchema } }, required: true },
613
+ },
614
+ responses: {
615
+ 200: ok('Idempotent re-registration; document already existed.', R.RegisterDocumentResponseSchema),
616
+ 201: ok('Document registered.', R.RegisterDocumentResponseSchema),
617
+ 400: RESPONSE_400,
618
+ 500: RESPONSE_500,
619
+ 502: RESPONSE_502,
620
+ 503: RESPONSE_503,
621
+ },
622
+ });
623
+ registry.registerPath({
624
+ method: 'get',
625
+ path: '/v1/documents/limits',
626
+ operationId: 'getDocumentLimits',
627
+ tags: [TAG_DOCUMENTS],
628
+ summary: 'Read upload + index byte caps and raw-storage capability.',
629
+ description: 'Public preflight surface. Clients call this to size requests and ' +
630
+ 'decide whether to attempt a managed-blob upload. The values are a ' +
631
+ 'composition-time snapshot of the runtime config; no PII, no ' +
632
+ 'per-user state. Mirrors the auth posture of `/health`.',
633
+ responses: {
634
+ 200: ok('Document limits + raw_storage capability.', R.DocumentLimitsResponseSchema),
635
+ 500: RESPONSE_500,
636
+ 502: RESPONSE_502,
637
+ 503: RESPONSE_503,
638
+ },
639
+ });
640
+ registry.registerPath({
641
+ method: 'get',
642
+ path: '/v1/documents/list',
643
+ operationId: 'listDocuments',
644
+ tags: [TAG_DOCUMENTS],
645
+ summary: 'List active documents for a user, optionally filtered by source_site.',
646
+ request: { query: ListDocumentsQuerySchema },
647
+ responses: {
648
+ 200: ok('Document list with count.', R.ListDocumentsResponseSchema),
649
+ 400: RESPONSE_400,
650
+ 500: RESPONSE_500,
651
+ 502: RESPONSE_502,
652
+ 503: RESPONSE_503,
653
+ },
654
+ });
655
+ registry.registerPath({
656
+ method: 'get',
657
+ path: '/v1/documents/passport-feed',
658
+ operationId: 'listPassportFeed',
659
+ tags: [TAG_DOCUMENTS],
660
+ summary: 'Memory-backed passport feed: grouped doc rows + standalone memories.',
661
+ description: 'Single SQL UNION ALL: one row per documentId-with-' +
662
+ 'memories (grouped on `raw_document_id`, joined to ' +
663
+ '`raw_documents` for the status envelope) plus 1:1 ' +
664
+ 'standalone-memory rows (memories whose `raw_document_id IS ' +
665
+ 'NULL`). Sorted by `(sort_at DESC, sort_id DESC)`; the webapp ' +
666
+ "passport route consumes this as the memory-feed stream of its " +
667
+ 'server-side two-stream merge. Cursor + limit semantics match ' +
668
+ 'the other document list routes; opaque `next_cursor` is the ' +
669
+ 'tuple of the last consumed row.',
670
+ request: { query: PassportFeedQuerySchema },
671
+ responses: {
672
+ 200: ok('Passport feed page.', PassportFeedResponseSchema),
673
+ 400: RESPONSE_400,
674
+ 500: RESPONSE_500,
675
+ 502: RESPONSE_502,
676
+ 503: RESPONSE_503,
677
+ },
678
+ });
679
+ registry.registerPath({
680
+ method: 'get',
681
+ path: '/v1/documents/without-memories',
682
+ operationId: 'listDocumentsWithoutMemories',
683
+ tags: [TAG_DOCUMENTS],
684
+ summary: 'Documents WITHOUT non-deleted memories, narrowed by recovery-status filter.',
685
+ description: 'Backs the passport synthetic-row stream and the UI ' +
686
+ '"uploaded but unindexed" surface. A row appears when it has ' +
687
+ 'zero non-deleted memories AND at least one layer status sits in ' +
688
+ "the supplied filter. Filter omitted -> server default '" +
689
+ "recovery-relevant set (extraction in pending/failed/unsupported, " +
690
+ "semantic_index in pending/failed, raw_storage in raw_storage_failed). " +
691
+ 'Cursor + limit semantics match `GET /v1/documents`.',
692
+ request: { query: ListDocumentsWithoutMemoriesQuerySchema },
693
+ responses: {
694
+ 200: ok('Cursor-paginated unbacked-document list.', R.DocumentListRootResponseSchema),
695
+ 400: RESPONSE_400,
696
+ 500: RESPONSE_500,
697
+ 502: RESPONSE_502,
698
+ 503: RESPONSE_503,
699
+ },
700
+ });
701
+ registry.registerPath({
702
+ method: 'get',
703
+ path: '/v1/documents',
704
+ operationId: 'listDocumentsForUser',
705
+ tags: [TAG_DOCUMENTS],
706
+ summary: 'Cursor-paginated user-scoped document list with status-bucket filter.',
707
+ description: 'Returns active documents for the supplied `user_id`, ' +
708
+ 'ordered `(created_at DESC, id DESC)`. The opaque `cursor` is the ' +
709
+ '`next_cursor` from the previous page (base64-url JSON tuple); ' +
710
+ 'malformed cursors return 400. The `status` query param buckets ' +
711
+ "rows for the recovery surfaces: `'failed'` (any layer failed), " +
712
+ "`'unsupported'` (extraction marked unsupported), `'pending'` " +
713
+ "(extraction or semantic_index in pending/running), or `'all'` " +
714
+ '(default — every active row).',
715
+ request: { query: DocumentListRootQuerySchema },
716
+ responses: {
717
+ 200: ok('Cursor-paginated document list.', R.DocumentListRootResponseSchema),
718
+ 400: RESPONSE_400,
719
+ 500: RESPONSE_500,
720
+ 502: RESPONSE_502,
721
+ 503: RESPONSE_503,
722
+ },
723
+ });
724
+ registry.registerPath({
725
+ method: 'get',
726
+ path: '/v1/documents/{id}',
727
+ operationId: 'getDocument',
728
+ tags: [TAG_DOCUMENTS],
729
+ summary: 'Fetch a single document by UUID.',
730
+ request: { params: DocumentIdParamSchema, query: DocumentByIdQuerySchema },
731
+ responses: {
732
+ 200: ok('Document record.', R.RawDocumentResponseSchema),
733
+ 400: RESPONSE_400,
734
+ 404: DOCUMENT_NOT_FOUND_RESPONSE,
735
+ 500: RESPONSE_500,
736
+ 502: RESPONSE_502,
737
+ 503: RESPONSE_503,
738
+ },
739
+ });
740
+ registry.registerPath({
741
+ method: 'delete',
742
+ path: '/v1/documents/{id}',
743
+ operationId: 'deleteDocument',
744
+ tags: [TAG_DOCUMENTS],
745
+ summary: 'Soft-delete (tombstone) a document.',
746
+ description: 'Idempotent: a second DELETE on the same id returns success with ' +
747
+ '`already_deleted: true`. Subsequent GETs of the deleted id return 404.',
748
+ request: { params: DocumentIdParamSchema, query: DocumentByIdQuerySchema },
749
+ responses: {
750
+ 200: ok('Soft-delete acknowledgement.', R.DeleteDocumentResponseSchema),
751
+ 400: RESPONSE_400,
752
+ 500: RESPONSE_500,
753
+ 502: RESPONSE_502,
754
+ 503: RESPONSE_503,
755
+ },
756
+ });
757
+ registry.registerPath({
758
+ method: 'post',
759
+ path: '/v1/documents/{id}/index',
760
+ operationId: 'indexDocument',
761
+ tags: [TAG_DOCUMENTS],
762
+ summary: 'Chunk + embed text for a registered document.',
763
+ description: 'Deterministic char-window chunking, batched embeddings via the ' +
764
+ "core embedding provider, and one provenance-linked memory per chunk. " +
765
+ 'Idempotent on byte-identical text under the current chunker_version: ' +
766
+ "the response's `idempotent_skip` flag indicates whether work was performed. " +
767
+ 'A re-index with new text soft-deletes the prior generation of chunks + ' +
768
+ 'derived memories before inserting the fresh one.',
769
+ request: {
770
+ params: DocumentIdParamSchema,
771
+ body: { content: { 'application/json': { schema: IndexDocumentBodySchema } }, required: true },
772
+ },
773
+ responses: {
774
+ 200: ok('Indexing result with chunk + memory counts.', R.IndexDocumentResponseSchema),
775
+ 400: RESPONSE_400,
776
+ 404: DOCUMENT_NOT_FOUND_RESPONSE,
777
+ 500: RESPONSE_500,
778
+ 502: RESPONSE_502,
779
+ 503: RESPONSE_503,
780
+ },
781
+ });
782
+ registry.registerPath({
783
+ method: 'put',
784
+ path: '/v1/documents/{id}/raw',
785
+ operationId: 'uploadRawDocument',
786
+ tags: [TAG_DOCUMENTS],
787
+ summary: 'Upload managed raw bytes for a registered document.',
788
+ description: 'Stores the request body as the document\'s managed blob via the ' +
789
+ "configured `RawContentStore` adapter (`local_fs` or `s3`), and " +
790
+ "promotes the document row to `storage_mode='managed_blob'` / " +
791
+ "`raw_storage_status='blob_stored'`. Idempotent on byte-identical " +
792
+ 'input under the same document. Different bytes against an already-' +
793
+ 'stored managed blob return 409 because the managed slot is ' +
794
+ 'immutable per row to avoid orphaning the prior blob. Returns 503 ' +
795
+ "when the deployment runs `rawStorageMode='pointer_only'`.",
796
+ request: {
797
+ params: DocumentIdParamSchema,
798
+ query: UploadRawDocumentQuerySchema,
799
+ body: {
800
+ content: {
801
+ 'application/octet-stream': {
802
+ schema: { type: 'string', format: 'binary' },
803
+ },
804
+ },
805
+ required: true,
806
+ },
807
+ },
808
+ responses: {
809
+ 200: ok('Upload result with storage URI + content hash + size.', R.UploadRawDocumentResponseSchema),
810
+ 400: RESPONSE_400,
811
+ 404: DOCUMENT_NOT_FOUND_RESPONSE,
812
+ 409: {
813
+ description: 'Conflict: the document already has a managed blob with a ' +
814
+ 'different content_hash. Register a fresh document for the ' +
815
+ 'new bytes — the existing blob is not overwritten.',
816
+ content: { 'application/json': { schema: ErrorBasicSchema } },
817
+ },
818
+ 500: RESPONSE_500,
819
+ 502: RESPONSE_502,
820
+ 503: RESPONSE_503,
821
+ },
822
+ });
823
+ registry.registerPath({
824
+ method: 'post',
825
+ path: '/v1/documents/{id}/extraction-failure',
826
+ operationId: 'markExtractionFailure',
827
+ tags: [TAG_DOCUMENTS],
828
+ summary: 'Mark the document as extraction-failed.',
829
+ description: 'Service-owned status transition: callers declare *that* extraction ' +
830
+ 'failed and *what category* via a bounded `error_code`. The route ' +
831
+ 'service-truncates `error_message` to a fixed cap and rejects ' +
832
+ 'arbitrary status combinations. Idempotent on retry; 409 on ' +
833
+ 'invalid source state with the row\'s current per-layer status ' +
834
+ 'echoed in the response body.',
835
+ request: {
836
+ params: DocumentIdParamSchema,
837
+ body: { content: { 'application/json': { schema: ExtractionFailureBodySchema } }, required: true },
838
+ },
839
+ responses: {
840
+ 200: ok('Marker write acknowledgement; durable row echoed.', R.DocumentFailureMarkerResponseSchema),
841
+ 400: RESPONSE_400,
842
+ 404: DOCUMENT_NOT_FOUND_RESPONSE,
843
+ 409: {
844
+ description: 'Invalid extraction state transition. The response body ' +
845
+ 'echoes `current.{raw_storage_status,extraction_status,semantic_index_status}` ' +
846
+ 'so the caller can reason about retries.',
847
+ content: { 'application/json': { schema: ErrorBasicSchema } },
848
+ },
849
+ 500: RESPONSE_500,
850
+ 502: RESPONSE_502,
851
+ 503: RESPONSE_503,
852
+ },
853
+ });
854
+ registry.registerPath({
855
+ method: 'post',
856
+ path: '/v1/documents/{id}/index-failure',
857
+ operationId: 'markIndexFailure',
858
+ tags: [TAG_DOCUMENTS],
859
+ summary: 'Mark the document as index-failed.',
860
+ description: 'Service-owned status transition. The `index_text_too_large` ' +
861
+ "code on a `extraction_status='pending'` row atomically " +
862
+ "advances extraction to `'complete'` AND writes " +
863
+ "`semantic_index_status='failed'` so the durable row reflects " +
864
+ 'the upload-pipeline sequence. Idempotent on retry; 409 on ' +
865
+ 'invalid source state.',
866
+ request: {
867
+ params: DocumentIdParamSchema,
868
+ body: { content: { 'application/json': { schema: IndexFailureBodySchema } }, required: true },
869
+ },
870
+ responses: {
871
+ 200: ok('Marker write acknowledgement; durable row echoed.', R.DocumentFailureMarkerResponseSchema),
872
+ 400: RESPONSE_400,
873
+ 404: DOCUMENT_NOT_FOUND_RESPONSE,
874
+ 409: {
875
+ description: 'Invalid index state transition; current per-layer status echoed.',
876
+ content: { 'application/json': { schema: ErrorBasicSchema } },
877
+ },
878
+ 500: RESPONSE_500,
879
+ 502: RESPONSE_502,
880
+ 503: RESPONSE_503,
881
+ },
882
+ });
883
+ }
884
+ function registerStorageRoutes(registry) {
885
+ registry.registerPath({
886
+ method: 'get',
887
+ path: '/v1/storage/capabilities',
888
+ operationId: 'getStorageCapabilities',
889
+ tags: [TAG_STORAGE],
890
+ summary: 'Read the direct storage API capability snapshot.',
891
+ description: 'Public preflight surface for the storage API. Clients call ' +
892
+ 'this before attempting a managed-mode artifact upload. The ' +
893
+ 'response describes what the direct `/v1/storage/artifacts/*` ' +
894
+ 'API supports for the active backend — Filecoin direct managed ' +
895
+ 'upload is not yet supported in v1, so every capability flag ' +
896
+ 'reports `false` for Filecoin here. Filecoin still has full ' +
897
+ 'feature support through document ingestion (see ' +
898
+ '`/v1/documents/limits`).',
899
+ responses: {
900
+ 200: ok('Capability snapshot for the direct storage API.', StorageCapabilitiesResponseSchema),
901
+ 500: RESPONSE_500,
902
+ 502: RESPONSE_502,
903
+ 503: RESPONSE_503,
904
+ },
905
+ });
906
+ registry.registerPath({
907
+ method: 'post',
908
+ path: '/v1/storage/artifacts',
909
+ operationId: 'putStorageArtifact',
910
+ tags: [TAG_STORAGE],
911
+ summary: 'Register a pointer artifact or upload a managed artifact.',
912
+ description: 'Pointer mode sends a JSON body with `mode: "pointer"` plus a ' +
913
+ 'caller-supplied `uri`; the server stores the reference but ' +
914
+ 'NEVER fetches the URI. Managed mode sends the raw bytes with ' +
915
+ '`?mode=managed[&disclose_content_hash=true]` and an optional ' +
916
+ '`X-AtomicMemory-Metadata` base64-JSON header. Filecoin direct ' +
917
+ 'managed uploads return 501 in v1.',
918
+ request: {
919
+ body: {
920
+ content: { 'application/json': { schema: PutArtifactBodySchema } },
921
+ required: true,
922
+ },
923
+ },
924
+ responses: {
925
+ 201: ok('Artifact created.', StoredArtifactResponseSchema),
926
+ 400: RESPONSE_400,
927
+ 411: {
928
+ description: 'Content-Length is required for managed uploads.',
929
+ content: { 'application/json': { schema: ErrorBasicSchema } },
930
+ },
931
+ 413: {
932
+ description: 'Managed upload body exceeds the configured cap.',
933
+ content: { 'application/json': { schema: ErrorBasicSchema } },
934
+ },
935
+ 501: {
936
+ description: 'Direct Filecoin managed upload is not supported in v1.',
937
+ content: { 'application/json': { schema: ErrorBasicSchema } },
938
+ },
939
+ 503: {
940
+ description: 'Managed storage is disabled for this deployment.',
941
+ content: { 'application/json': { schema: ErrorBasicSchema } },
942
+ },
943
+ 500: RESPONSE_500,
944
+ },
945
+ });
946
+ registry.registerPath({
947
+ method: 'get',
948
+ path: '/v1/storage/artifacts/{id}',
949
+ operationId: 'getStorageArtifact',
950
+ tags: [TAG_STORAGE],
951
+ summary: 'Read an artifact metadata projection.',
952
+ request: { params: UuidIdParamSchema },
953
+ responses: {
954
+ 200: ok('Artifact metadata.', StoredArtifactResponseSchema),
955
+ 404: {
956
+ description: 'Artifact not found.',
957
+ content: { 'application/json': { schema: ErrorBasicSchema } },
958
+ },
959
+ 500: RESPONSE_500,
960
+ },
961
+ });
962
+ registry.registerPath({
963
+ method: 'get',
964
+ path: '/v1/storage/artifacts/{id}/content',
965
+ operationId: 'getStorageArtifactContent',
966
+ tags: [TAG_STORAGE],
967
+ summary: 'Read the raw bytes for a managed artifact.',
968
+ description: 'Returns the artifact bytes for managed-mode artifacts. ' +
969
+ 'Pointer-mode artifacts return 409 `pointer_content_not_managed` — ' +
970
+ 'the server never proxies pointer content.',
971
+ request: { params: UuidIdParamSchema },
972
+ responses: {
973
+ 200: { description: 'Raw bytes.' },
974
+ 404: {
975
+ description: 'Artifact not found.',
976
+ content: { 'application/json': { schema: ErrorBasicSchema } },
977
+ },
978
+ 409: {
979
+ description: 'Pointer-mode artifact; fetch the URI directly.',
980
+ content: { 'application/json': { schema: ErrorBasicSchema } },
981
+ },
982
+ 503: {
983
+ description: 'Managed storage is disabled for this deployment.',
984
+ content: { 'application/json': { schema: ErrorBasicSchema } },
985
+ },
986
+ 500: RESPONSE_500,
987
+ },
988
+ });
989
+ registry.registerPath({
990
+ method: 'delete',
991
+ path: '/v1/storage/artifacts/{id}',
992
+ operationId: 'deleteStorageArtifact',
993
+ tags: [TAG_STORAGE],
994
+ summary: 'Soft-delete an artifact (optionally cascading documents).',
995
+ description: "Reference-aware delete. Default `policy=artifact_only` returns " +
996
+ '409 `artifact_in_use` if any active document references the ' +
997
+ 'artifact; `policy=with_documents` cascades a soft-delete to ' +
998
+ 'those documents first. No `force` parameter is supported.',
999
+ request: {
1000
+ params: UuidIdParamSchema,
1001
+ query: z.object({ policy: DeleteArtifactPolicySchema.optional() }).strict(),
1002
+ },
1003
+ responses: {
1004
+ 200: ok('Artifact deleted (or delete failed at the backend).', DeleteArtifactResultSchema),
1005
+ 400: RESPONSE_400,
1006
+ 404: {
1007
+ description: 'Artifact not found.',
1008
+ content: { 'application/json': { schema: ErrorBasicSchema } },
1009
+ },
1010
+ 409: {
1011
+ description: 'Artifact is referenced by active documents ' +
1012
+ '(`error_code: artifact_in_use`) OR another caller holds an ' +
1013
+ 'active delete claim and this caller never ran the delete ' +
1014
+ '(`error_code: delete_in_flight`, `retryable: true`).',
1015
+ content: { 'application/json': { schema: ErrorBasicSchema } },
1016
+ },
1017
+ 500: RESPONSE_500,
1018
+ },
1019
+ });
1020
+ registry.registerPath({
1021
+ method: 'post',
1022
+ path: '/v1/storage/artifacts/{id}/verify',
1023
+ operationId: 'verifyStorageArtifact',
1024
+ tags: [TAG_STORAGE],
1025
+ summary: "Run the backend's verification (head-probe in v1).",
1026
+ description: "Pointer-mode artifacts always return `kind: 'unsupported'` — " +
1027
+ 'the server never fetches the registered URI.',
1028
+ request: { params: UuidIdParamSchema },
1029
+ responses: {
1030
+ 200: ok('Verification result.', VerifyArtifactResultSchema),
1031
+ 404: {
1032
+ description: 'Artifact not found.',
1033
+ content: { 'application/json': { schema: ErrorBasicSchema } },
1034
+ },
1035
+ 500: RESPONSE_500,
1036
+ },
1037
+ });
1038
+ }