@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,542 @@
1
+ /**
2
+ * @file Zod schemas for every /v1/memories/* route.
3
+ *
4
+ * Each request body schema authors fields in **snake_case** (the wire
5
+ * format) and `.transform()`s to a camelCase output consumed by
6
+ * handlers. The output shape of each schema was chosen to drop-in
7
+ * replace the value previously returned by `parseIngestBody` /
8
+ * `parseSearchBody` etc. so handler bodies don't change.
9
+ *
10
+ * ⚠️ Behavior-preservation invariants worth noting:
11
+ * - `requireBodyString` rejects empty string AND non-string with
12
+ * the same 400 message. `requiredStringBody(label)` below emits
13
+ * the exact "${label} (string) is required" text for every
14
+ * failure mode (missing, null, wrong type, empty).
15
+ * - `parseOptionalWorkspaceContext` / `parseOptionalAgentScope`
16
+ * NEVER 400 on invalid shapes — they silently drop to undefined.
17
+ * Composition here uses the `.catch(undefined)` primitives from
18
+ * `./common`.
19
+ * - `parseOptionalIsoTimestamp` treats `''` and `null` as absent,
20
+ * rejects other invalid strings. `IsoTimestamp` in `./common`
21
+ * preserves that with a preprocess step.
22
+ * - `retrieval_mode` absence is silent (undefined), invalid values
23
+ * throw the exact message from memories.ts:553-555.
24
+ * - `token_budget` must be a finite number in [100, 50000], floored
25
+ * on success. Matches memories.ts:560-568.
26
+ * - `limit` on POST /search / /search/fast bodies: non-number yields
27
+ * undefined (not an error); number is clamped to
28
+ * [1, MAX_SEARCH_LIMIT=100] and floored. Matches memories.ts:629-632.
29
+ * - `conversation` max length = 100_000 chars. Over the limit
30
+ * throws 'conversation exceeds max length of 100000 characters'.
31
+ *
32
+ * Source: `src/routes/memories.ts:515-647` (the inline parsers this
33
+ * file replaces).
34
+ */
35
+ import { z } from './zod-setup.js';
36
+ import { IsoTimestamp, AgentScopeSchema, WorkspaceIdField, AgentIdField, VisibilityField, OptionalBodyString, requiredStringBody, } from './common.js';
37
+ import { RESERVED_METADATA_KEYS } from '../db/repository-types.js';
38
+ // ---------------------------------------------------------------------------
39
+ // Constants mirroring memories.ts limits
40
+ // ---------------------------------------------------------------------------
41
+ const MAX_CONVERSATION_LENGTH = 100_000;
42
+ const MAX_METADATA_SERIALIZED_BYTES = 32 * 1024;
43
+ const MAX_SEARCH_LIMIT = 100;
44
+ const MAX_TOKEN_BUDGET = 50_000;
45
+ const MIN_TOKEN_BUDGET = 100;
46
+ const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
47
+ // ---------------------------------------------------------------------------
48
+ // Reusable body-level field schemas
49
+ // ---------------------------------------------------------------------------
50
+ // `OptionalBodyString` and `requiredStringBody` are imported from
51
+ // `./common.js` so /v1/documents/* and other future resource schemas can
52
+ // reuse the same wire-contract behavior without copying the helpers.
53
+ /** Boolean field that silently coerces non-boolean inputs to undefined. */
54
+ const OptionalBooleanField = (description) => z
55
+ .unknown()
56
+ .transform(v => (typeof v === 'boolean' ? v : undefined))
57
+ .openapi({ type: 'boolean', ...(description ? { description } : {}) });
58
+ /**
59
+ * Build a schema that produces `"${label} (string[]) is required"` for
60
+ * every failure mode that the old array guard threw on. Matches the
61
+ * memory_ids check at memories.ts:213-215.
62
+ */
63
+ function requiredStringArrayBody(label) {
64
+ const message = `${label} (string[]) is required`;
65
+ return z
66
+ .unknown()
67
+ .refine((v) => Array.isArray(v) && v.every(x => typeof x === 'string'), { message })
68
+ .transform(v => v)
69
+ .openapi({
70
+ type: 'array',
71
+ items: { type: 'string' },
72
+ description: `Required. ${label}.`,
73
+ });
74
+ }
75
+ /** POST /search and /search/fast accept body.limit as a number only; other types → undefined. */
76
+ const SearchBodyLimit = z
77
+ .preprocess(v => (typeof v === 'number' && Number.isFinite(v) ? v : undefined), z.number().optional())
78
+ .transform(n => typeof n === 'number'
79
+ ? Math.max(1, Math.min(MAX_SEARCH_LIMIT, Math.floor(n)))
80
+ : undefined)
81
+ .openapi({ type: 'integer', minimum: 1, maximum: MAX_SEARCH_LIMIT });
82
+ /** token_budget: finite number in [100, 50000], floored. Throws on invalid. */
83
+ const TokenBudgetSchema = optionalFiniteNumber('token_budget')
84
+ .refine(v => v === undefined ||
85
+ (typeof v === 'number' &&
86
+ v >= MIN_TOKEN_BUDGET &&
87
+ v <= MAX_TOKEN_BUDGET), {
88
+ message: `token_budget must be between ${MIN_TOKEN_BUDGET} and ${MAX_TOKEN_BUDGET}`,
89
+ })
90
+ .transform(v => (typeof v === 'number' ? Math.floor(v) : undefined))
91
+ .openapi({ type: 'integer', minimum: MIN_TOKEN_BUDGET, maximum: MAX_TOKEN_BUDGET });
92
+ /** threshold: normalized relevance floor in [0, 1]. Throws on invalid. */
93
+ const SearchThresholdSchema = optionalFiniteNumber('threshold')
94
+ .refine(v => v === undefined || (v >= 0 && v <= 1), { message: 'threshold must be between 0 and 1' })
95
+ .transform(v => (typeof v === 'number' ? v : undefined))
96
+ .openapi({
97
+ type: 'number',
98
+ minimum: 0,
99
+ maximum: 1,
100
+ description: 'Optional normalized relevance threshold. Results below this semantic relevance floor are excluded before injection packaging.',
101
+ });
102
+ function optionalFiniteNumber(label) {
103
+ return z
104
+ .preprocess(v => (v === undefined || v === null ? undefined : v), z.unknown().optional())
105
+ .refine((v) => v === undefined ||
106
+ (typeof v === 'number' && Number.isFinite(v)), { message: `${label} must be a finite number` });
107
+ }
108
+ /**
109
+ * retrieval_mode: string enum or undefined. Absent/null → undefined;
110
+ * wrong type → throw 'retrieval_mode must be a string'; wrong enum
111
+ * value → throw the full valid-list message. Matches memories.ts:551-557.
112
+ */
113
+ const RetrievalModeField = z
114
+ .preprocess(v => (v === undefined || v === null ? undefined : v), z.unknown().optional())
115
+ .superRefine((v, ctx) => {
116
+ if (v === undefined)
117
+ return;
118
+ if (typeof v !== 'string') {
119
+ ctx.addIssue({ code: 'custom', message: 'retrieval_mode must be a string' });
120
+ return;
121
+ }
122
+ if (!['flat', 'tiered', 'abstract-aware'].includes(v)) {
123
+ ctx.addIssue({
124
+ code: 'custom',
125
+ message: `retrieval_mode must be one of: ${['flat', 'tiered', 'abstract-aware'].join(', ')}`,
126
+ });
127
+ }
128
+ })
129
+ .transform(v => (v === undefined ? undefined : v))
130
+ .openapi({
131
+ type: 'string',
132
+ enum: ['flat', 'tiered', 'abstract-aware'],
133
+ });
134
+ // ---------------------------------------------------------------------------
135
+ // Per-request config override
136
+ // ---------------------------------------------------------------------------
137
+ /**
138
+ * Per-request overlay on the startup RuntimeConfig. Applied as a shallow
139
+ * merge (`{ ...startup, ...override }`) onto the effective request-scope
140
+ * config.
141
+ *
142
+ * **Shape is permissive by design.** The schema accepts any object whose
143
+ * values are primitives (boolean, number, string, null) — no
144
+ * enumerated field list. This is deliberate: enumerating fields would
145
+ * couple every new overlay-eligible RuntimeConfig field to a core
146
+ * release, which defeats the purpose of a per-request config mechanism.
147
+ *
148
+ * **Unknown-key handling is soft**, not a 400:
149
+ * - If an override key doesn't match a `RuntimeConfig` field at
150
+ * request-handling time, the merge is still performed (the key rides
151
+ * along on the effective config object), but the route handler emits
152
+ * a `X-Atomicmem-Unknown-Override-Keys` response header listing the
153
+ * unmatched keys and logs a warning. This catches typos without
154
+ * rejecting a request that would otherwise be valid once the field
155
+ * lands in a future release.
156
+ * - If you want a typed, IDE-autocompleted experience, import
157
+ * `RuntimeConfig` from `src/config.ts` and type your override as
158
+ * `Partial<RuntimeConfig>` on the caller side.
159
+ *
160
+ * **`config_override` absent →** zero-cost path, no headers emitted,
161
+ * startup config used as-is.
162
+ */
163
+ export const ConfigOverrideSchema = z
164
+ .record(z.string(), z.union([z.boolean(), z.number(), z.string(), z.null()]))
165
+ .openapi({
166
+ description: 'Optional per-request overlay on RuntimeConfig. Keys correspond to RuntimeConfig field names; values must be primitives (boolean / number / string / null). Unknown keys are accepted but surfaced via the X-Atomicmem-Unknown-Override-Keys response header and a server-side warning log — they do not cause a 400. Scope: just this request — no server mutation.',
167
+ });
168
+ // ---------------------------------------------------------------------------
169
+ // Ingest
170
+ // ---------------------------------------------------------------------------
171
+ export const IngestBodySchema = z
172
+ .object({
173
+ user_id: requiredStringBody('user_id'),
174
+ conversation: requiredStringBody('conversation').refine(s => s.length <= MAX_CONVERSATION_LENGTH, { message: `conversation exceeds max length of ${MAX_CONVERSATION_LENGTH} characters` }),
175
+ source_site: requiredStringBody('source_site'),
176
+ source_url: OptionalBodyString,
177
+ workspace_id: WorkspaceIdField,
178
+ agent_id: AgentIdField,
179
+ visibility: VisibilityField,
180
+ /** Only POST /ingest/quick reads this — safely ignored elsewhere. */
181
+ skip_extraction: OptionalBooleanField(),
182
+ config_override: ConfigOverrideSchema.optional(),
183
+ /**
184
+ * Caller-supplied metadata, persisted alongside the memory. Only
185
+ * honored on POST /v1/memories/ingest/quick with skip_extraction=true
186
+ * and no workspace context — rejected with 400 on every other branch.
187
+ * Reserved keys (RESERVED_METADATA_KEYS in repository-types) are
188
+ * rejected. Max 32 KB UTF-8 serialized.
189
+ */
190
+ metadata: z
191
+ .record(z.string(), z.unknown())
192
+ .optional()
193
+ .openapi({
194
+ description: 'Caller-supplied metadata, persisted alongside the memory. ' +
195
+ 'Honored ONLY on /v1/memories/ingest/quick with skip_extraction=true ' +
196
+ 'and no workspace context — rejected with 400 on every other branch. ' +
197
+ 'Reserved keys (RESERVED_METADATA_KEYS in repository-types) are rejected. ' +
198
+ 'Max 32 KB UTF-8 serialized.',
199
+ }),
200
+ })
201
+ .refine(b => !b.metadata ||
202
+ Buffer.byteLength(JSON.stringify(b.metadata), 'utf8') <=
203
+ MAX_METADATA_SERIALIZED_BYTES, {
204
+ message: `metadata exceeds max serialized size of ${MAX_METADATA_SERIALIZED_BYTES} bytes (utf-8)`,
205
+ })
206
+ .superRefine((b, ctx) => {
207
+ if (!b.metadata)
208
+ return;
209
+ const reserved = Object.keys(b.metadata).filter(k => RESERVED_METADATA_KEYS.has(k));
210
+ if (reserved.length > 0) {
211
+ ctx.addIssue({
212
+ code: 'custom',
213
+ message: `metadata contains reserved key(s) [${reserved.join(', ')}] — ` +
214
+ `these are core-internal and cannot be set by callers. ` +
215
+ `See RESERVED_METADATA_KEYS in repository-types.`,
216
+ });
217
+ }
218
+ })
219
+ .transform(b => ({
220
+ userId: b.user_id,
221
+ conversation: b.conversation,
222
+ sourceSite: b.source_site,
223
+ sourceUrl: b.source_url ?? '',
224
+ workspace: buildWorkspaceContext(b.workspace_id, b.agent_id, b.visibility),
225
+ skipExtraction: b.skip_extraction === true,
226
+ configOverride: b.config_override,
227
+ metadata: b.metadata,
228
+ }))
229
+ .openapi({
230
+ description: 'Ingest a conversation transcript. User-scoped unless workspace_id + agent_id are both provided.',
231
+ });
232
+ // ---------------------------------------------------------------------------
233
+ // Search
234
+ // ---------------------------------------------------------------------------
235
+ export const SearchBodySchema = z
236
+ .object({
237
+ user_id: requiredStringBody('user_id'),
238
+ query: requiredStringBody('query'),
239
+ // source_site / namespace_scope intentionally preserve empty
240
+ // string — optionalBodyString() did not collapse '' to undefined.
241
+ source_site: OptionalBodyString,
242
+ limit: SearchBodyLimit,
243
+ as_of: IsoTimestamp,
244
+ retrieval_mode: RetrievalModeField,
245
+ token_budget: TokenBudgetSchema,
246
+ threshold: SearchThresholdSchema,
247
+ namespace_scope: OptionalBodyString,
248
+ skip_repair: OptionalBooleanField(),
249
+ workspace_id: WorkspaceIdField,
250
+ agent_id: AgentIdField,
251
+ visibility: VisibilityField,
252
+ agent_scope: AgentScopeSchema,
253
+ config_override: ConfigOverrideSchema.optional(),
254
+ })
255
+ .transform(b => ({
256
+ userId: b.user_id,
257
+ query: b.query,
258
+ sourceSite: b.source_site,
259
+ limit: b.limit,
260
+ asOf: b.as_of,
261
+ retrievalMode: b.retrieval_mode,
262
+ tokenBudget: b.token_budget,
263
+ relevanceThreshold: b.threshold,
264
+ namespaceScope: b.namespace_scope,
265
+ skipRepair: b.skip_repair === true,
266
+ workspace: buildWorkspaceContext(b.workspace_id, b.agent_id, b.visibility),
267
+ agentScope: b.agent_scope,
268
+ configOverride: b.config_override,
269
+ }))
270
+ .openapi({
271
+ description: 'Search memories. User-scoped unless workspace_id + agent_id are both provided.',
272
+ });
273
+ // ---------------------------------------------------------------------------
274
+ // Expand
275
+ // ---------------------------------------------------------------------------
276
+ export const ExpandBodySchema = z
277
+ .object({
278
+ user_id: requiredStringBody('user_id'),
279
+ memory_ids: requiredStringArrayBody('memory_ids'),
280
+ workspace_id: WorkspaceIdField,
281
+ agent_id: AgentIdField,
282
+ visibility: VisibilityField,
283
+ })
284
+ .transform(b => ({
285
+ userId: b.user_id,
286
+ memoryIds: b.memory_ids,
287
+ workspace: buildWorkspaceContext(b.workspace_id, b.agent_id, b.visibility),
288
+ }))
289
+ .openapi({
290
+ description: 'Expand a list of memory IDs into full objects.',
291
+ });
292
+ // ---------------------------------------------------------------------------
293
+ // Verify (H5 — Sprint 3 v1.7)
294
+ // ---------------------------------------------------------------------------
295
+ export const VerifyBodySchema = z
296
+ .object({
297
+ question: requiredStringBody('question'),
298
+ context: requiredStringBody('context'),
299
+ candidate_answer: requiredStringBody('candidate_answer'),
300
+ })
301
+ .transform(b => ({
302
+ question: b.question,
303
+ context: b.context,
304
+ candidateAnswer: b.candidate_answer,
305
+ }))
306
+ .openapi({
307
+ description: 'Re-ground a candidate answer against retrieved context. Returns the original answer if all specifics are grounded, or a rewritten answer if not.',
308
+ });
309
+ // ---------------------------------------------------------------------------
310
+ // Admin routes (consolidate / decay / cap / reset-source / reconcile)
311
+ // ---------------------------------------------------------------------------
312
+ export const ConsolidateBodySchema = z
313
+ .object({
314
+ user_id: requiredStringBody('user_id'),
315
+ execute: OptionalBooleanField(),
316
+ })
317
+ .transform(b => ({ userId: b.user_id, execute: b.execute === true }));
318
+ export const DecayBodySchema = z
319
+ .object({
320
+ user_id: requiredStringBody('user_id'),
321
+ /** Defaults to true — false means actually archive. */
322
+ dry_run: OptionalBooleanField(),
323
+ })
324
+ .transform(b => ({ userId: b.user_id, dryRun: b.dry_run !== false }));
325
+ export const ReconcileBodySchema = z
326
+ .object({
327
+ // user_id is genuinely optional on this route — empty string
328
+ // behaves the same as absent (falls back to reconcileDeferredAll).
329
+ user_id: OptionalBodyString,
330
+ })
331
+ .transform(b => ({
332
+ userId: typeof b.user_id === 'string' && b.user_id.length > 0 ? b.user_id : undefined,
333
+ }));
334
+ export const ResetSourceBodySchema = z
335
+ .object({
336
+ user_id: requiredStringBody('user_id'),
337
+ source_site: requiredStringBody('source_site'),
338
+ })
339
+ .transform(b => ({ userId: b.user_id, sourceSite: b.source_site }));
340
+ // ---------------------------------------------------------------------------
341
+ // Lessons
342
+ // ---------------------------------------------------------------------------
343
+ export const LessonReportBodySchema = z
344
+ .object({
345
+ user_id: requiredStringBody('user_id'),
346
+ pattern: requiredStringBody('pattern'),
347
+ source_memory_ids: z
348
+ .unknown()
349
+ .transform(v => Array.isArray(v) && v.every((x) => typeof x === 'string')
350
+ ? v
351
+ : [])
352
+ .openapi({ type: 'array', items: { type: 'string' } }),
353
+ severity: z.unknown().optional(),
354
+ })
355
+ .transform(b => ({
356
+ userId: b.user_id,
357
+ pattern: b.pattern,
358
+ sourceMemoryIds: Array.isArray(b.source_memory_ids) ? b.source_memory_ids : [],
359
+ severity: b.severity,
360
+ }));
361
+ // ---------------------------------------------------------------------------
362
+ // Queries
363
+ // ---------------------------------------------------------------------------
364
+ /** requireQueryString: truthy + typeof string. Matches memories.ts:580-583. */
365
+ const RequiredQueryString = z.string().min(1);
366
+ export const UserIdQuerySchema = z
367
+ .object({ user_id: RequiredQueryString })
368
+ .transform(q => ({ userId: q.user_id }));
369
+ /** Auto-converts limit to number with default; matches parseUserIdAndLimit. */
370
+ export const UserIdLimitQuerySchema = z
371
+ .object({
372
+ user_id: RequiredQueryString,
373
+ limit: z.string().optional(),
374
+ })
375
+ .transform(q => ({
376
+ userId: q.user_id,
377
+ limit: parseIntegerLimit(q.limit, 20),
378
+ }));
379
+ export const ListQuerySchema = z
380
+ .object({
381
+ user_id: RequiredQueryString,
382
+ limit: z.string().optional(),
383
+ offset: z.string().optional(),
384
+ workspace_id: OptionalQueryField(),
385
+ agent_id: OptionalUuidQueryField('agent_id'),
386
+ source_site: OptionalQueryField(),
387
+ episode_id: OptionalUuidQueryField('episode_id'),
388
+ })
389
+ .transform(q => ({
390
+ userId: q.user_id,
391
+ limit: parseIntegerLimit(q.limit, 20),
392
+ offset: parseIntegerLimit(q.offset, 0),
393
+ workspaceId: q.workspace_id,
394
+ agentId: q.agent_id,
395
+ sourceSite: q.source_site,
396
+ episodeId: q.episode_id,
397
+ }))
398
+ .refine(q => !(q.workspaceId && !q.agentId), {
399
+ message: 'agent_id is required for workspace queries',
400
+ });
401
+ /** Used by GET /:id and DELETE /:id. Same workspace-requires-agent rule. */
402
+ export const MemoryByIdQuerySchema = z
403
+ .object({
404
+ user_id: RequiredQueryString,
405
+ workspace_id: OptionalQueryField(),
406
+ agent_id: OptionalUuidQueryField('agent_id'),
407
+ })
408
+ .transform(q => ({
409
+ userId: q.user_id,
410
+ workspaceId: q.workspace_id,
411
+ agentId: q.agent_id,
412
+ }))
413
+ .refine(q => !(q.workspaceId && !q.agentId), {
414
+ message: 'agent_id is required for workspace queries',
415
+ });
416
+ /**
417
+ * Anti-amplification cap for `GET /v1/memories/event-chains`. The endpoint
418
+ * fans out per entity (one chain hydration each); without an upper bound a
419
+ * single request can pull tens of thousands of rows.
420
+ */
421
+ const MAX_ENTITY_IDS_PER_REQUEST = 100;
422
+ /**
423
+ * Query for `GET /v1/memories/event-chains`. Accepts a comma-separated list
424
+ * of entity UUIDs and returns the per-entity ordered event chain.
425
+ * `entity_ids` is parsed as comma-separated, trimmed, deduplicated; empty
426
+ * tokens skipped. At least one valid UUID required, capped at
427
+ * MAX_ENTITY_IDS_PER_REQUEST entries.
428
+ */
429
+ export const EventChainsQuerySchema = z
430
+ .object({
431
+ user_id: RequiredQueryString,
432
+ entity_ids: RequiredQueryString,
433
+ })
434
+ .transform(q => {
435
+ const ids = [...new Set(q.entity_ids
436
+ .split(',')
437
+ .map(s => s.trim())
438
+ .filter(s => s.length > 0))];
439
+ return { userId: q.user_id, entityIds: ids };
440
+ })
441
+ .refine(q => q.entityIds.length > 0, {
442
+ message: 'entity_ids must contain at least one non-empty value',
443
+ })
444
+ .refine(q => q.entityIds.length <= MAX_ENTITY_IDS_PER_REQUEST, {
445
+ message: `entity_ids must contain at most ${MAX_ENTITY_IDS_PER_REQUEST} values`,
446
+ })
447
+ .refine(q => q.entityIds.every(id => UUID_REGEX.test(id)), {
448
+ message: 'entity_ids entries must be valid UUIDs',
449
+ });
450
+ /**
451
+ * Body for `POST /v1/memories/first-mentions/extract`. Accepts the full
452
+ * conversation transcript plus a turn-id-to-memory-id mapping (the harness
453
+ * provides this — the in-core ingest pipeline does not retain turn
454
+ * structure). The service runs a single LLM call to identify chronological
455
+ * topic-introduction events and persists them.
456
+ */
457
+ export const FirstMentionsExtractBodySchema = z
458
+ .object({
459
+ user_id: z.string().min(1),
460
+ conversation_text: z.string().min(1).max(MAX_CONVERSATION_LENGTH),
461
+ source_site: z.string().min(1),
462
+ // Values must be UUIDs — they're inserted into a UUID column
463
+ // (`first_mention_events.memory_id`). Validate at the schema layer so a
464
+ // bad value returns 400 instead of leaking a Postgres "invalid input
465
+ // syntax for type uuid" error as a 500.
466
+ memory_ids_by_turn_id: z.record(z.string(), z.string().uuid()),
467
+ })
468
+ .transform(b => {
469
+ const map = new Map();
470
+ for (const [k, v] of Object.entries(b.memory_ids_by_turn_id)) {
471
+ const n = Number(k);
472
+ if (Number.isFinite(n) && Number.isInteger(n))
473
+ map.set(n, v);
474
+ }
475
+ return {
476
+ userId: b.user_id,
477
+ conversationText: b.conversation_text,
478
+ sourceSite: b.source_site,
479
+ memoryIdsByTurnId: map,
480
+ };
481
+ });
482
+ // ---------------------------------------------------------------------------
483
+ // Path params
484
+ // ---------------------------------------------------------------------------
485
+ export const UuidIdParamSchema = z
486
+ .object({
487
+ // The .openapi() tag pins `format: "uuid"` in the emitted spec
488
+ // instead of letting zod-to-openapi stringify the JS regex literal
489
+ // (including the `/i` flag) as a JSON Schema `pattern`, which is
490
+ // not a valid regex string per the OpenAPI pattern spec.
491
+ id: z
492
+ .string()
493
+ .regex(UUID_REGEX, 'id must be a valid UUID')
494
+ .openapi({ type: 'string', format: 'uuid' }),
495
+ })
496
+ .transform(p => ({ id: p.id }));
497
+ /** Non-UUID :id used by DELETE /lessons/:id (lessonId is a free string). */
498
+ export const FreeIdParamSchema = z
499
+ .object({
500
+ id: z.string().min(1),
501
+ })
502
+ .transform(p => ({ id: p.id }));
503
+ // ---------------------------------------------------------------------------
504
+ // Config (PUT /config) — special case
505
+ // ---------------------------------------------------------------------------
506
+ /**
507
+ * PUT /config body is intentionally loose: the handler enforces the
508
+ * startup-only-fields + 410 checks. We expose the body as an open
509
+ * object so the 410-first-check-then-reject-then-apply flow stays in
510
+ * the handler where it belongs.
511
+ */
512
+ export const ConfigBodySchema = z
513
+ .object({})
514
+ .passthrough()
515
+ .openapi({ description: 'Runtime config mutation. See handler for 410 and rejected[] paths.' });
516
+ // ---------------------------------------------------------------------------
517
+ // Internal helpers
518
+ // ---------------------------------------------------------------------------
519
+ function buildWorkspaceContext(workspaceId, agentId, visibility) {
520
+ if (!workspaceId || !agentId)
521
+ return undefined;
522
+ return { workspaceId, agentId, visibility };
523
+ }
524
+ /** parseInt with default. Non-numeric strings → NaN → handler falls back. */
525
+ function parseIntegerLimit(raw, defaultVal) {
526
+ return parseInt(String(raw ?? String(defaultVal)), 10);
527
+ }
528
+ function OptionalQueryField() {
529
+ return z
530
+ .unknown()
531
+ .transform(v => (typeof v === 'string' && v.length > 0 ? v : undefined))
532
+ .openapi({ type: 'string' });
533
+ }
534
+ function OptionalUuidQueryField(label) {
535
+ return z
536
+ .unknown()
537
+ .transform(v => (typeof v === 'string' && v.length > 0 ? v : undefined))
538
+ .refine(s => s === undefined || UUID_REGEX.test(s), {
539
+ message: `${label} must be a valid UUID`,
540
+ })
541
+ .openapi({ type: 'string', format: 'uuid' });
542
+ }
@@ -0,0 +1,24 @@
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
+ export declare const API_TITLE = "AtomicMemory HTTP API";
21
+ export declare const API_VERSION = "1.0.0";
22
+ export declare const API_DESCRIPTION = "Semantic memory engine for AI applications. Request/response bodies are JSON; fields on the wire use snake_case.";
23
+ /** Build and populate the OpenAPI registry. */
24
+ export declare function buildRegistry(): OpenAPIRegistry;