@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,162 @@
1
+ /**
2
+ * Child representation storage for dual-write memory cells.
3
+ * Parent `memories` rows remain the packaging unit; atomic facts and foresight
4
+ * rows provide retrieval-optimized child views over the same memory.
5
+ */
6
+ import pgvector from 'pgvector/pg';
7
+ import { config } from '../config.js';
8
+ import { normalizeAtomicFactRow, normalizeForesightRow, normalizeSearchRow, } from './repository-types.js';
9
+ import { RRF_K, buildHybridSearchParams } from './query-helpers.js';
10
+ export async function storeAtomicFacts(queryable, facts) {
11
+ const insertedIds = [];
12
+ for (const fact of facts) {
13
+ const result = await queryable.query(`INSERT INTO memory_atomic_facts (
14
+ user_id, parent_memory_id, fact_text, embedding, fact_type, importance,
15
+ source_site, source_url, episode_id, keywords, metadata,
16
+ workspace_id, agent_id
17
+ )
18
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11::jsonb, $12, $13)
19
+ RETURNING id`, [
20
+ fact.userId,
21
+ fact.parentMemoryId,
22
+ fact.factText,
23
+ pgvector.toSql(fact.embedding),
24
+ fact.factType,
25
+ fact.importance,
26
+ fact.sourceSite,
27
+ fact.sourceUrl ?? '',
28
+ fact.episodeId ?? null,
29
+ fact.keywords ?? '',
30
+ JSON.stringify(fact.metadata ?? {}),
31
+ fact.workspaceId ?? null,
32
+ fact.agentId ?? null,
33
+ ]);
34
+ insertedIds.push(result.rows[0].id);
35
+ }
36
+ return insertedIds;
37
+ }
38
+ export async function replaceAtomicFactsForMemory(queryable, userId, parentMemoryId, facts) {
39
+ await queryable.query('DELETE FROM memory_atomic_facts WHERE user_id = $1 AND parent_memory_id = $2', [userId, parentMemoryId]);
40
+ if (facts.length === 0)
41
+ return [];
42
+ return storeAtomicFacts(queryable, facts);
43
+ }
44
+ export async function listAtomicFactsForMemory(queryable, userId, parentMemoryId) {
45
+ const result = await queryable.query(`SELECT * FROM memory_atomic_facts
46
+ WHERE user_id = $1 AND parent_memory_id = $2
47
+ ORDER BY created_at ASC`, [userId, parentMemoryId]);
48
+ return result.rows.map(normalizeAtomicFactRow);
49
+ }
50
+ export async function storeForesight(queryable, foresight) {
51
+ const insertedIds = [];
52
+ for (const entry of foresight) {
53
+ const result = await queryable.query(`INSERT INTO memory_foresight (
54
+ user_id, parent_memory_id, content, embedding, foresight_type, source_site,
55
+ source_url, episode_id, metadata, valid_from, valid_to,
56
+ workspace_id, agent_id
57
+ )
58
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9::jsonb, $10, $11, $12, $13)
59
+ RETURNING id`, [
60
+ entry.userId,
61
+ entry.parentMemoryId,
62
+ entry.content,
63
+ pgvector.toSql(entry.embedding),
64
+ entry.foresightType,
65
+ entry.sourceSite,
66
+ entry.sourceUrl ?? '',
67
+ entry.episodeId ?? null,
68
+ JSON.stringify(entry.metadata ?? {}),
69
+ (entry.validFrom ?? new Date()).toISOString(),
70
+ entry.validTo?.toISOString() ?? null,
71
+ entry.workspaceId ?? null,
72
+ entry.agentId ?? null,
73
+ ]);
74
+ insertedIds.push(result.rows[0].id);
75
+ }
76
+ return insertedIds;
77
+ }
78
+ export async function replaceForesightForMemory(queryable, userId, parentMemoryId, foresight) {
79
+ await queryable.query('DELETE FROM memory_foresight WHERE user_id = $1 AND parent_memory_id = $2', [userId, parentMemoryId]);
80
+ if (foresight.length === 0)
81
+ return [];
82
+ return storeForesight(queryable, foresight);
83
+ }
84
+ export async function listForesightForMemory(queryable, userId, parentMemoryId) {
85
+ const result = await queryable.query(`SELECT * FROM memory_foresight
86
+ WHERE user_id = $1 AND parent_memory_id = $2
87
+ ORDER BY valid_from ASC, created_at ASC`, [userId, parentMemoryId]);
88
+ return result.rows.map(normalizeForesightRow);
89
+ }
90
+ export async function searchAtomicFactsHybrid(pool, userId, queryText, queryEmbedding, limit, sourceSite, referenceTime) {
91
+ const { params, siteFilter } = buildHybridSearchParams(queryEmbedding, userId, queryText, limit, 'af.source_site', sourceSite, referenceTime);
92
+ const result = await pool.query(`WITH vector_ranked AS (
93
+ SELECT af.id, af.parent_memory_id, af.fact_text,
94
+ ROW_NUMBER() OVER (ORDER BY af.embedding <=> $1) AS vrank,
95
+ 1 - (af.embedding <=> $1) AS similarity
96
+ FROM memory_atomic_facts af
97
+ JOIN memories m ON m.id = af.parent_memory_id
98
+ WHERE af.user_id = $2
99
+ AND m.deleted_at IS NULL
100
+ AND m.expired_at IS NULL
101
+ AND m.status = 'active'
102
+ AND m.workspace_id IS NULL
103
+ ${siteFilter}
104
+ ORDER BY af.embedding <=> $1
105
+ LIMIT $4 * 6
106
+ ),
107
+ fts_ranked AS (
108
+ SELECT af.id, af.parent_memory_id, af.fact_text,
109
+ ROW_NUMBER() OVER (ORDER BY ts_rank(af.search_vector, plainto_tsquery('english', $3)) DESC) AS ftsrank
110
+ FROM memory_atomic_facts af
111
+ JOIN memories m ON m.id = af.parent_memory_id
112
+ WHERE af.user_id = $2
113
+ AND m.deleted_at IS NULL
114
+ AND m.expired_at IS NULL
115
+ AND m.status = 'active'
116
+ AND m.workspace_id IS NULL
117
+ ${siteFilter}
118
+ AND af.search_vector @@ plainto_tsquery('english', $3)
119
+ ORDER BY ts_rank(af.search_vector, plainto_tsquery('english', $3)) DESC
120
+ LIMIT $4 * 6
121
+ ),
122
+ fused_facts AS (
123
+ SELECT
124
+ COALESCE(v.id, f.id) AS fact_id,
125
+ COALESCE(v.parent_memory_id, f.parent_memory_id) AS parent_memory_id,
126
+ COALESCE(v.fact_text, f.fact_text) AS fact_text,
127
+ COALESCE(v.similarity, 0) AS similarity,
128
+ COALESCE(1.0 / (${RRF_K} + v.vrank), 0) + COALESCE(1.0 / (${RRF_K} + f.ftsrank), 0) AS rrf_score
129
+ FROM vector_ranked v
130
+ FULL OUTER JOIN fts_ranked f ON v.id = f.id
131
+ ),
132
+ parent_ranked AS (
133
+ SELECT
134
+ parent_memory_id,
135
+ MAX(similarity) AS similarity,
136
+ MAX(rrf_score) AS best_rrf_score,
137
+ (ARRAY_AGG(fact_text ORDER BY (similarity + rrf_score) DESC))[1:3] AS matched_facts,
138
+ (ARRAY_AGG(fact_id::text ORDER BY (similarity + rrf_score) DESC))[1:3] AS matched_fact_ids
139
+ FROM fused_facts
140
+ GROUP BY parent_memory_id
141
+ )
142
+ SELECT
143
+ m.*,
144
+ p.similarity,
145
+ (
146
+ $5 * p.similarity
147
+ + CASE WHEN p.similarity >= $9 THEN (
148
+ $6 * m.importance
149
+ + $7 * EXP(-EXTRACT(EPOCH FROM ($8::timestamptz - m.last_accessed_at)) / 2592000.0)
150
+ ) ELSE 0 END
151
+ -- Lexical RRF stays outside the semantic boost gate because exact text match is itself a relevance signal.
152
+ + ${config.retrievalProfileSettings.lexicalWeight} * p.best_rrf_score
153
+ ) * COALESCE(m.trust_score, 1.0) AS score,
154
+ p.matched_facts,
155
+ p.matched_fact_ids,
156
+ 'atomic_fact'::text AS retrieval_layer
157
+ FROM parent_ranked p
158
+ JOIN memories m ON m.id = p.parent_memory_id
159
+ ORDER BY score DESC
160
+ LIMIT $4`, params);
161
+ return result.rows.map(normalizeSearchRow);
162
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * BEAM v38: temporal-state repository helpers.
3
+ *
4
+ * Two operations are exposed:
5
+ * - `supersedePriorStateMemories` — UPDATE prior memories with the same
6
+ * (user_id, state_key) so they close their event_end window when a
7
+ * new memory takes over that key. Fails closed; the caller MUST
8
+ * propagate the error and abort the ingest if this throws.
9
+ * - `findActiveStateMemoryIds` — diagnostic / test helper returning the
10
+ * IDs of memories that are currently active (event_end IS NULL) for
11
+ * a (user_id, state_key) pair.
12
+ */
13
+ import type pg from 'pg';
14
+ /**
15
+ * Set `event_end = $eventEnd` on every prior, non-deleted memory whose
16
+ * (user_id, state_key) matches, EXCEPT the new memory itself. Returns
17
+ * the number of rows updated.
18
+ *
19
+ * Why fail closed: the supersede signal is the entire point of the
20
+ * temporal layer. Silently dropping it would leave both rows active
21
+ * and break the read-time rerank invariant.
22
+ */
23
+ export declare function supersedePriorStateMemories(pool: pg.Pool, args: {
24
+ userId: string;
25
+ stateKey: string;
26
+ newMemoryId: string;
27
+ eventEnd: Date;
28
+ }): Promise<number>;
29
+ /**
30
+ * Return the IDs of the active memories for a (user_id, state_key) pair.
31
+ * Used in tests and as a diagnostic seam — production retrieval does NOT
32
+ * call this; it reranks the candidates already in hand by their
33
+ * `event_end` field.
34
+ */
35
+ export declare function findActiveStateMemoryIds(pool: pg.Pool, userId: string, stateKey: string): Promise<string[]>;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * BEAM v38: temporal-state repository helpers.
3
+ *
4
+ * Two operations are exposed:
5
+ * - `supersedePriorStateMemories` — UPDATE prior memories with the same
6
+ * (user_id, state_key) so they close their event_end window when a
7
+ * new memory takes over that key. Fails closed; the caller MUST
8
+ * propagate the error and abort the ingest if this throws.
9
+ * - `findActiveStateMemoryIds` — diagnostic / test helper returning the
10
+ * IDs of memories that are currently active (event_end IS NULL) for
11
+ * a (user_id, state_key) pair.
12
+ */
13
+ /**
14
+ * Set `event_end = $eventEnd` on every prior, non-deleted memory whose
15
+ * (user_id, state_key) matches, EXCEPT the new memory itself. Returns
16
+ * the number of rows updated.
17
+ *
18
+ * Why fail closed: the supersede signal is the entire point of the
19
+ * temporal layer. Silently dropping it would leave both rows active
20
+ * and break the read-time rerank invariant.
21
+ */
22
+ export async function supersedePriorStateMemories(pool, args) {
23
+ const result = await pool.query(`UPDATE memories
24
+ SET event_end = $4
25
+ WHERE user_id = $1
26
+ AND state_key = $2
27
+ AND id <> $3::uuid
28
+ AND event_end IS NULL
29
+ AND deleted_at IS NULL`, [args.userId, args.stateKey, args.newMemoryId, args.eventEnd.toISOString()]);
30
+ return result.rowCount ?? 0;
31
+ }
32
+ /**
33
+ * Return the IDs of the active memories for a (user_id, state_key) pair.
34
+ * Used in tests and as a diagnostic seam — production retrieval does NOT
35
+ * call this; it reranks the candidates already in hand by their
36
+ * `event_end` field.
37
+ */
38
+ export async function findActiveStateMemoryIds(pool, userId, stateKey) {
39
+ const result = await pool.query(`SELECT id FROM memories
40
+ WHERE user_id = $1
41
+ AND state_key = $2
42
+ AND event_end IS NULL
43
+ AND deleted_at IS NULL
44
+ ORDER BY event_start DESC NULLS LAST`, [userId, stateKey]);
45
+ return result.rows.map((row) => row.id);
46
+ }
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Repository for the Temporal Linkage List (TLL) — per-entity sparse graph
3
+ * of event nodes connected by predecessor/successor edges.
4
+ *
5
+ * Purpose: maintain "what happened in what order, per entity" without
6
+ * paying the full graph-DB cost. Each new memory referencing an entity
7
+ * appends an event node; the predecessor pointer lets us traverse the
8
+ * chain backward at query time for EO/MSR/TR questions.
9
+ */
10
+ import pg from 'pg';
11
+ export interface TLLEvent {
12
+ memoryId: string;
13
+ predecessorMemoryId: string | null;
14
+ observationDate: Date;
15
+ positionInChain: number;
16
+ }
17
+ export declare class TllRepository {
18
+ private pool;
19
+ constructor(pool: pg.Pool);
20
+ /**
21
+ * Append an event node to each entity's chain. Idempotent on
22
+ * (user_id, entity_id, memory_id). Predecessor is the most-recent
23
+ * existing event for the entity; position is len(chain).
24
+ *
25
+ * Race-safety: each (user_id, entity_id) append runs inside a transaction
26
+ * guarded by `pg_advisory_xact_lock`. Concurrent appends targeting the
27
+ * same chain serialize on the lock, then compute the next position from
28
+ * committed rows via INSERT...SELECT. The
29
+ * `(user_id, entity_id, position_in_chain)` unique index is the
30
+ * defense-in-depth backstop that fails loudly if any caller bypasses the
31
+ * lock path.
32
+ */
33
+ append(userId: string, memoryId: string, entityIds: string[], observationDate: Date): Promise<void>;
34
+ /**
35
+ * Append one (entity, memory) row under an advisory lock keyed on the
36
+ * chain. The INSERT...SELECT computes predecessor + position inline from
37
+ * the latest committed row, so the read-then-write window the previous
38
+ * implementation exposed cannot reorder concurrent appends.
39
+ */
40
+ private appendOne;
41
+ /**
42
+ * Get the full event chain for an entity, ordered by observation_date
43
+ * (the conversation timestamp). Used for EO/TR/MSR queries that need
44
+ * chronological order — a backfilled event with an earlier
45
+ * observation_date surfaces in its true chronological position even
46
+ * though it was inserted last.
47
+ *
48
+ * `positionInChain` returned here is the 0-based chronological rank,
49
+ * derived via `ROW_NUMBER()` over the chronological order. The stored
50
+ * `position_in_chain` column is insertion-order audit metadata and is
51
+ * not exposed by this API. `predecessorMemoryId` is the immediate
52
+ * chronologically-prior memory (via `LAG()`) — also chronological,
53
+ * not the position-tip predecessor recorded at insert time.
54
+ *
55
+ * Tiebreaker for events sharing an `observation_date` (e.g. the same
56
+ * conversation timestamp) is the stored `position_in_chain` (insertion
57
+ * order), keeping the result deterministic.
58
+ */
59
+ chain(userId: string, entityId: string): Promise<TLLEvent[]>;
60
+ /**
61
+ * Bulk: get chains for multiple entities. Returns memory_ids in order
62
+ * across all entity chains, deduplicated. Used as a retrieval signal
63
+ * for queries that span multiple entities (MSR).
64
+ */
65
+ chainsFor(userId: string, entityIds: string[]): Promise<string[]>;
66
+ /**
67
+ * Bulk-retrieve enriched event chains: per-entity ordered list of events
68
+ * joined with memory content. Used by the event-chains HTTP endpoint and
69
+ * by EO-shaped read paths that need content alongside chain position.
70
+ *
71
+ * Returns one entry per entity; entities with no events are dropped.
72
+ * Within an entity, events are ordered by `observation_date` (the
73
+ * conversation timestamp), not insertion order — see `chain()` for
74
+ * the rationale and the `LAG`/`ROW_NUMBER` derivation of
75
+ * `predecessorMemoryId` and `positionInChain`. Tiebreaker for events
76
+ * sharing an observation_date is the stored insertion `position_in_chain`.
77
+ */
78
+ chainEventsForEntities(userId: string, entityIds: string[]): Promise<Array<{
79
+ entityId: string;
80
+ events: Array<{
81
+ memoryId: string;
82
+ content: string;
83
+ observationDate: Date;
84
+ positionInChain: number;
85
+ predecessorMemoryId: string | null;
86
+ }>;
87
+ }>>;
88
+ }
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Repository for the Temporal Linkage List (TLL) — per-entity sparse graph
3
+ * of event nodes connected by predecessor/successor edges.
4
+ *
5
+ * Purpose: maintain "what happened in what order, per entity" without
6
+ * paying the full graph-DB cost. Each new memory referencing an entity
7
+ * appends an event node; the predecessor pointer lets us traverse the
8
+ * chain backward at query time for EO/MSR/TR questions.
9
+ */
10
+ // Stable namespace for pg_advisory_xact_lock keying. Keeps TLL appends from
11
+ // colliding with unrelated advisory-lock callers in the same process.
12
+ const TLL_ADVISORY_LOCK_NAMESPACE = 0x544c4c00; // "TLL\0"
13
+ export class TllRepository {
14
+ pool;
15
+ constructor(pool) {
16
+ this.pool = pool;
17
+ }
18
+ /**
19
+ * Append an event node to each entity's chain. Idempotent on
20
+ * (user_id, entity_id, memory_id). Predecessor is the most-recent
21
+ * existing event for the entity; position is len(chain).
22
+ *
23
+ * Race-safety: each (user_id, entity_id) append runs inside a transaction
24
+ * guarded by `pg_advisory_xact_lock`. Concurrent appends targeting the
25
+ * same chain serialize on the lock, then compute the next position from
26
+ * committed rows via INSERT...SELECT. The
27
+ * `(user_id, entity_id, position_in_chain)` unique index is the
28
+ * defense-in-depth backstop that fails loudly if any caller bypasses the
29
+ * lock path.
30
+ */
31
+ async append(userId, memoryId, entityIds, observationDate) {
32
+ if (entityIds.length === 0)
33
+ return;
34
+ const uniqueEntities = [...new Set(entityIds)];
35
+ // Per-entity transactions keep the advisory-lock scope narrow and let
36
+ // independent chains proceed in parallel.
37
+ for (const entityId of uniqueEntities) {
38
+ await this.appendOne(userId, memoryId, entityId, observationDate);
39
+ }
40
+ }
41
+ /**
42
+ * Append one (entity, memory) row under an advisory lock keyed on the
43
+ * chain. The INSERT...SELECT computes predecessor + position inline from
44
+ * the latest committed row, so the read-then-write window the previous
45
+ * implementation exposed cannot reorder concurrent appends.
46
+ */
47
+ async appendOne(userId, memoryId, entityId, observationDate) {
48
+ const client = await this.pool.connect();
49
+ try {
50
+ await client.query('BEGIN');
51
+ await client.query('SELECT pg_advisory_xact_lock($1, hashtext($2))', [
52
+ TLL_ADVISORY_LOCK_NAMESPACE,
53
+ `${userId}:${entityId}`,
54
+ ]);
55
+ await client.query(`INSERT INTO temporal_linkage_list
56
+ (user_id, entity_id, memory_id, predecessor_memory_id,
57
+ observation_date, position_in_chain)
58
+ SELECT
59
+ $1, $2, $3,
60
+ (SELECT memory_id FROM temporal_linkage_list
61
+ WHERE user_id = $1 AND entity_id = $2
62
+ ORDER BY position_in_chain DESC LIMIT 1),
63
+ $4,
64
+ COALESCE(
65
+ (SELECT MAX(position_in_chain) FROM temporal_linkage_list
66
+ WHERE user_id = $1 AND entity_id = $2),
67
+ -1
68
+ ) + 1
69
+ ON CONFLICT (user_id, entity_id, memory_id) DO NOTHING`, [userId, entityId, memoryId, observationDate]);
70
+ await client.query('COMMIT');
71
+ }
72
+ catch (err) {
73
+ await client.query('ROLLBACK').catch((rollbackErr) => console.error('[tll] rollback failed:', rollbackErr instanceof Error ? rollbackErr.message : rollbackErr));
74
+ throw err;
75
+ }
76
+ finally {
77
+ client.release();
78
+ }
79
+ }
80
+ /**
81
+ * Get the full event chain for an entity, ordered by observation_date
82
+ * (the conversation timestamp). Used for EO/TR/MSR queries that need
83
+ * chronological order — a backfilled event with an earlier
84
+ * observation_date surfaces in its true chronological position even
85
+ * though it was inserted last.
86
+ *
87
+ * `positionInChain` returned here is the 0-based chronological rank,
88
+ * derived via `ROW_NUMBER()` over the chronological order. The stored
89
+ * `position_in_chain` column is insertion-order audit metadata and is
90
+ * not exposed by this API. `predecessorMemoryId` is the immediate
91
+ * chronologically-prior memory (via `LAG()`) — also chronological,
92
+ * not the position-tip predecessor recorded at insert time.
93
+ *
94
+ * Tiebreaker for events sharing an `observation_date` (e.g. the same
95
+ * conversation timestamp) is the stored `position_in_chain` (insertion
96
+ * order), keeping the result deterministic.
97
+ */
98
+ async chain(userId, entityId) {
99
+ const result = await this.pool.query(`SELECT memory_id,
100
+ observation_date,
101
+ LAG(memory_id) OVER w AS chronological_predecessor,
102
+ ROW_NUMBER() OVER w - 1 AS chronological_position
103
+ FROM temporal_linkage_list
104
+ WHERE user_id = $1 AND entity_id = $2
105
+ WINDOW w AS (ORDER BY observation_date ASC, position_in_chain ASC)
106
+ ORDER BY observation_date ASC, position_in_chain ASC`, [userId, entityId]);
107
+ return result.rows.map((row) => ({
108
+ memoryId: row.memory_id,
109
+ predecessorMemoryId: row.chronological_predecessor ?? null,
110
+ observationDate: row.observation_date,
111
+ positionInChain: Number(row.chronological_position),
112
+ }));
113
+ }
114
+ /**
115
+ * Bulk: get chains for multiple entities. Returns memory_ids in order
116
+ * across all entity chains, deduplicated. Used as a retrieval signal
117
+ * for queries that span multiple entities (MSR).
118
+ */
119
+ async chainsFor(userId, entityIds) {
120
+ if (entityIds.length === 0)
121
+ return [];
122
+ const result = await this.pool.query(`SELECT DISTINCT memory_id, observation_date
123
+ FROM temporal_linkage_list
124
+ WHERE user_id = $1 AND entity_id = ANY($2::uuid[])
125
+ ORDER BY observation_date ASC`, [userId, [...new Set(entityIds)]]);
126
+ return result.rows.map((row) => row.memory_id);
127
+ }
128
+ /**
129
+ * Bulk-retrieve enriched event chains: per-entity ordered list of events
130
+ * joined with memory content. Used by the event-chains HTTP endpoint and
131
+ * by EO-shaped read paths that need content alongside chain position.
132
+ *
133
+ * Returns one entry per entity; entities with no events are dropped.
134
+ * Within an entity, events are ordered by `observation_date` (the
135
+ * conversation timestamp), not insertion order — see `chain()` for
136
+ * the rationale and the `LAG`/`ROW_NUMBER` derivation of
137
+ * `predecessorMemoryId` and `positionInChain`. Tiebreaker for events
138
+ * sharing an observation_date is the stored insertion `position_in_chain`.
139
+ */
140
+ async chainEventsForEntities(userId, entityIds) {
141
+ if (entityIds.length === 0)
142
+ return [];
143
+ const unique = [...new Set(entityIds)];
144
+ // `m.workspace_id IS NULL` — this is the global event-chain endpoint;
145
+ // workspace-scoped memories must not surface here even if they share
146
+ // an entity with a global memory.
147
+ const result = await this.pool.query(`SELECT t.entity_id,
148
+ t.memory_id,
149
+ t.observation_date,
150
+ LAG(t.memory_id) OVER w AS chronological_predecessor,
151
+ ROW_NUMBER() OVER w - 1 AS chronological_position,
152
+ m.content
153
+ FROM temporal_linkage_list t
154
+ JOIN memories m ON m.id = t.memory_id
155
+ WHERE t.user_id = $1
156
+ AND t.entity_id = ANY($2::uuid[])
157
+ AND m.deleted_at IS NULL
158
+ AND m.status = 'active'
159
+ AND m.workspace_id IS NULL
160
+ WINDOW w AS (
161
+ PARTITION BY t.entity_id
162
+ ORDER BY t.observation_date ASC, t.position_in_chain ASC
163
+ )
164
+ ORDER BY t.entity_id, t.observation_date ASC, t.position_in_chain ASC`, [userId, unique]);
165
+ const grouped = new Map();
166
+ for (const row of result.rows) {
167
+ const list = grouped.get(row.entity_id) ?? [];
168
+ list.push({
169
+ memoryId: row.memory_id,
170
+ content: row.content,
171
+ observationDate: row.observation_date,
172
+ positionInChain: Number(row.chronological_position),
173
+ predecessorMemoryId: row.chronological_predecessor ?? null,
174
+ });
175
+ grouped.set(row.entity_id, list);
176
+ }
177
+ return [...grouped.entries()].map(([entityId, events]) => ({ entityId, events }));
178
+ }
179
+ }