@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,56 @@
1
+ /**
2
+ * Read-side queries for active memory projections.
3
+ */
4
+ import pg from 'pg';
5
+ import { type EpisodeRow, type MemoryRow, type SearchResult } from './repository-types.js';
6
+ import type { AgentScope } from './repository-types.js';
7
+ export declare function getEpisode(pool: pg.Pool, id: string): Promise<EpisodeRow | null>;
8
+ export declare function getMemory(pool: pg.Pool, id: string, userId?: string, includeDeleted?: boolean): Promise<MemoryRow | null>;
9
+ export declare function getMemoryWithClient(client: pg.PoolClient, id: string, userId?: string, includeDeleted?: boolean): Promise<MemoryRow | null>;
10
+ export declare function listMemories(pool: pg.Pool, userId: string, limit: number, offset: number, sourceSite?: string, episodeId?: string): Promise<MemoryRow[]>;
11
+ export declare function listMemoriesInWorkspace(pool: pg.Pool, workspaceId: string, limit: number, offset: number, callerAgentId?: string): Promise<MemoryRow[]>;
12
+ export declare function getMemoryInWorkspace(pool: pg.Pool, id: string, workspaceId: string, callerAgentId?: string): Promise<MemoryRow | null>;
13
+ export declare function listMemoriesByNamespace(pool: pg.Pool, userId: string, namespace: string, limit?: number): Promise<MemoryRow[]>;
14
+ export declare function getMemoryStats(pool: pg.Pool, userId: string): Promise<{
15
+ count: number;
16
+ avgImportance: number;
17
+ sourceDistribution: Record<string, number>;
18
+ }>;
19
+ export declare function searchSimilar(pool: pg.Pool, userId: string, queryEmbedding: number[], limit: number, sourceSite?: string, referenceTime?: Date): Promise<SearchResult[]>;
20
+ export declare function searchHybridSimilar(pool: pg.Pool, userId: string, queryText: string, queryEmbedding: number[], limit: number, sourceSite?: string, referenceTime?: Date): Promise<SearchResult[]>;
21
+ export declare function searchKeywordSimilar(pool: pg.Pool, userId: string, queryText: string, limit: number, sourceSite?: string): Promise<SearchResult[]>;
22
+ export declare function findNearDuplicates(pool: pg.Pool, userId: string, embedding: number[], threshold: number, limit: number): Promise<import("./repository-vector-search.js").CandidateRow[]>;
23
+ /**
24
+ * Workspace-scoped vector search with agent filtering and visibility enforcement.
25
+ */
26
+ export declare function searchSimilarInWorkspace(pool: pg.Pool, workspaceId: string, queryEmbedding: number[], limit: number, agentScope?: AgentScope, callerAgentId?: string, referenceTime?: Date): Promise<SearchResult[]>;
27
+ /**
28
+ * Find near-duplicate memories within a workspace scope for AUDN conflict detection.
29
+ */
30
+ export declare function findNearDuplicatesInWorkspace(pool: pg.Pool, workspaceId: string, embedding: number[], threshold: number, limit: number, agentScope?: AgentScope, callerAgentId?: string): Promise<import("./repository-vector-search.js").CandidateRow[]>;
31
+ export declare function findKeywordCandidates(pool: pg.Pool, userId: string, keywords: string[], limit: number, includeExpired?: boolean): Promise<any[]>;
32
+ /**
33
+ * Find candidate memories by topic-embedding similarity (Sprint 3 EO experiment).
34
+ *
35
+ * Returns rows whose `topic_embedding` (LLM-generated 3-7 word topic, embedded
36
+ * separately from the raw fact) is closest to the query embedding. Used as a
37
+ * dedicated RRF channel by the search pipeline when topicSearchEnabled=true.
38
+ *
39
+ * Skips rows with NULL topic_embedding so legacy memories don't pollute the
40
+ * candidate set. The HNSW index on the partial column makes this fast.
41
+ */
42
+ export declare function findTopicCandidates(pool: pg.Pool, userId: string, queryEmbedding: number[], limit: number): Promise<{
43
+ id: string;
44
+ content: string;
45
+ topic_abstraction: string;
46
+ importance: number;
47
+ similarity: number;
48
+ }[]>;
49
+ export declare function countMemories(pool: pg.Pool, userId?: string): Promise<number>;
50
+ export declare function countNeedsClarification(pool: pg.Pool, userId: string): Promise<number>;
51
+ /**
52
+ * Finds memories created within a time window of the given anchor timestamps.
53
+ * Used for 1-hop temporal-neighbor expansion: surfaces facts from the same
54
+ * conversation session that the initial top-K results originated from.
55
+ */
56
+ export declare function findTemporalNeighbors(pool: pg.Pool, userId: string, anchorTimestamps: Date[], queryEmbedding: number[], windowMinutes: number, excludeIds: Set<string>, limit: number, referenceTime?: Date): Promise<SearchResult[]>;
@@ -0,0 +1,271 @@
1
+ /**
2
+ * Read-side queries for active memory projections.
3
+ */
4
+ import { config } from '../config.js';
5
+ import { normalizeMemoryRow, normalizeSearchRow, } from './repository-types.js';
6
+ import { findDuplicateVectors, findDuplicateVectorsInWorkspace, searchHybrid, searchKeyword, searchVectors, searchVectorsInWorkspace, } from './repository-vector-search.js';
7
+ export async function getEpisode(pool, id) {
8
+ const result = await pool.query('SELECT * FROM episodes WHERE id = $1', [id]);
9
+ return result.rows[0] ?? null;
10
+ }
11
+ export async function getMemory(pool, id, userId, includeDeleted = false) {
12
+ return getMemoryWithClient(pool, id, userId, includeDeleted);
13
+ }
14
+ export async function getMemoryWithClient(client, id, userId, includeDeleted = false) {
15
+ const clauses = ['id = $1'];
16
+ const params = [id];
17
+ if (userId) {
18
+ clauses.push(`user_id = $${params.length + 1}`);
19
+ params.push(userId);
20
+ }
21
+ if (!includeDeleted) {
22
+ clauses.push('deleted_at IS NULL');
23
+ clauses.push('expired_at IS NULL');
24
+ }
25
+ const result = await client.query(`SELECT * FROM memories WHERE ${clauses.join(' AND ')}`, params);
26
+ return result.rows[0] ? normalizeMemoryRow(result.rows[0]) : null;
27
+ }
28
+ export async function listMemories(pool, userId, limit, offset, sourceSite, episodeId) {
29
+ const params = [userId, limit, offset];
30
+ let extraClauses = '';
31
+ if (sourceSite) {
32
+ params.push(sourceSite);
33
+ extraClauses += ` AND source_site = $${params.length}`;
34
+ }
35
+ if (episodeId) {
36
+ params.push(episodeId);
37
+ extraClauses += ` AND episode_id = $${params.length}`;
38
+ }
39
+ const result = await pool.query(`SELECT * FROM memories
40
+ WHERE user_id = $1 AND deleted_at IS NULL AND expired_at IS NULL AND status = 'active'
41
+ AND workspace_id IS NULL${extraClauses}
42
+ ORDER BY created_at DESC LIMIT $2 OFFSET $3`, params);
43
+ return result.rows.map(normalizeMemoryRow);
44
+ }
45
+ export async function listMemoriesInWorkspace(pool, workspaceId, limit, offset, callerAgentId) {
46
+ const params = [workspaceId];
47
+ let visibilityClause = '';
48
+ if (callerAgentId) {
49
+ params.push(callerAgentId);
50
+ visibilityClause = buildVisibilityClause(params.length);
51
+ }
52
+ params.push(limit, offset);
53
+ const result = await pool.query(`SELECT * FROM memories
54
+ WHERE workspace_id = $1 AND deleted_at IS NULL AND expired_at IS NULL AND status = 'active'
55
+ ${visibilityClause}
56
+ ORDER BY created_at DESC LIMIT $${params.length - 1} OFFSET $${params.length}`, params);
57
+ return result.rows.map(normalizeMemoryRow);
58
+ }
59
+ export async function getMemoryInWorkspace(pool, id, workspaceId, callerAgentId) {
60
+ const params = [id, workspaceId];
61
+ let visibilityClause = '';
62
+ if (callerAgentId) {
63
+ params.push(callerAgentId);
64
+ visibilityClause = buildVisibilityClause(params.length);
65
+ }
66
+ const result = await pool.query(`SELECT * FROM memories WHERE id = $1 AND workspace_id = $2 AND deleted_at IS NULL ${visibilityClause}`, params);
67
+ return result.rows[0] ? normalizeMemoryRow(result.rows[0]) : null;
68
+ }
69
+ /**
70
+ * Build agent visibility enforcement clause.
71
+ * Replicates the logic from buildVisibilityClauseForSearch in repository-vector-search.ts.
72
+ */
73
+ function buildVisibilityClause(agentParamIndex) {
74
+ return `AND (
75
+ visibility = 'workspace'
76
+ OR visibility IS NULL
77
+ OR (visibility = 'agent_only' AND agent_id = $${agentParamIndex})
78
+ OR (visibility = 'restricted' AND (
79
+ agent_id = $${agentParamIndex}
80
+ OR EXISTS (
81
+ SELECT 1 FROM memory_visibility_grants g
82
+ WHERE g.memory_id = memories.id AND g.grantee_agent_id = $${agentParamIndex}
83
+ )
84
+ ))
85
+ )`;
86
+ }
87
+ export async function listMemoriesByNamespace(pool, userId, namespace, limit = 20) {
88
+ const result = await pool.query(`SELECT * FROM memories
89
+ WHERE user_id = $1
90
+ AND namespace = $2
91
+ AND deleted_at IS NULL
92
+ AND expired_at IS NULL
93
+ AND status = 'active'
94
+ ORDER BY created_at DESC
95
+ LIMIT $3`, [userId, namespace, limit]);
96
+ return result.rows.map(normalizeMemoryRow);
97
+ }
98
+ export async function getMemoryStats(pool, userId) {
99
+ const counts = await pool.query(`SELECT COUNT(*)::int AS count, AVG(importance) AS avg_importance
100
+ FROM memories WHERE user_id = $1 AND deleted_at IS NULL AND expired_at IS NULL AND status = 'active'`, [userId]);
101
+ const sources = await pool.query(`SELECT source_site, COUNT(*)::int AS count
102
+ FROM memories WHERE user_id = $1 AND deleted_at IS NULL AND expired_at IS NULL AND status = 'active'
103
+ GROUP BY source_site`, [userId]);
104
+ return {
105
+ count: counts.rows[0].count ?? 0,
106
+ avgImportance: Number(counts.rows[0].avg_importance ?? 0),
107
+ sourceDistribution: Object.fromEntries(sources.rows.map((row) => [row.source_site, row.count])),
108
+ };
109
+ }
110
+ export async function searchSimilar(pool, userId, queryEmbedding, limit, sourceSite, referenceTime) {
111
+ return searchVectors(pool, userId, queryEmbedding, limit, sourceSite, referenceTime);
112
+ }
113
+ export async function searchHybridSimilar(pool, userId, queryText, queryEmbedding, limit, sourceSite, referenceTime) {
114
+ return searchHybrid(pool, userId, queryText, queryEmbedding, limit, sourceSite, referenceTime);
115
+ }
116
+ export async function searchKeywordSimilar(pool, userId, queryText, limit, sourceSite) {
117
+ return searchKeyword(pool, userId, queryText, limit, sourceSite);
118
+ }
119
+ export async function findNearDuplicates(pool, userId, embedding, threshold, limit) {
120
+ return findDuplicateVectors(pool, userId, embedding, threshold, limit);
121
+ }
122
+ /**
123
+ * Workspace-scoped vector search with agent filtering and visibility enforcement.
124
+ */
125
+ export async function searchSimilarInWorkspace(pool, workspaceId, queryEmbedding, limit, agentScope = 'all', callerAgentId, referenceTime) {
126
+ return searchVectorsInWorkspace(pool, workspaceId, queryEmbedding, limit, agentScope, callerAgentId, referenceTime);
127
+ }
128
+ /**
129
+ * Find near-duplicate memories within a workspace scope for AUDN conflict detection.
130
+ */
131
+ export async function findNearDuplicatesInWorkspace(pool, workspaceId, embedding, threshold, limit, agentScope = 'all', callerAgentId) {
132
+ return findDuplicateVectorsInWorkspace(pool, workspaceId, embedding, threshold, limit, agentScope, callerAgentId);
133
+ }
134
+ export async function findKeywordCandidates(pool, userId, keywords, limit, includeExpired = false) {
135
+ if (keywords.length === 0)
136
+ return [];
137
+ const candidateLimit = Math.max(limit * 4, limit);
138
+ const expiredClause = includeExpired ? '' : 'AND expired_at IS NULL';
139
+ const result = await pool.query(`SELECT id, content, importance
140
+ FROM memories
141
+ WHERE user_id = $1
142
+ AND deleted_at IS NULL
143
+ ${expiredClause}
144
+ AND status = 'active'
145
+ AND workspace_id IS NULL
146
+ AND content ILIKE ANY($2::text[])
147
+ ORDER BY importance DESC, created_at DESC
148
+ LIMIT $3`, [userId, keywords.map((keyword) => `%${keyword}%`), candidateLimit]);
149
+ return result.rows
150
+ .map((row) => ({
151
+ ...row,
152
+ similarity: estimateKeywordSimilarity(row.content, keywords),
153
+ }))
154
+ .sort((left, right) => {
155
+ if (right.similarity !== left.similarity) {
156
+ return right.similarity - left.similarity;
157
+ }
158
+ return Number(right.importance) - Number(left.importance);
159
+ })
160
+ .slice(0, limit);
161
+ }
162
+ /**
163
+ * Find candidate memories by topic-embedding similarity (Sprint 3 EO experiment).
164
+ *
165
+ * Returns rows whose `topic_embedding` (LLM-generated 3-7 word topic, embedded
166
+ * separately from the raw fact) is closest to the query embedding. Used as a
167
+ * dedicated RRF channel by the search pipeline when topicSearchEnabled=true.
168
+ *
169
+ * Skips rows with NULL topic_embedding so legacy memories don't pollute the
170
+ * candidate set. The HNSW index on the partial column makes this fast.
171
+ */
172
+ export async function findTopicCandidates(pool, userId, queryEmbedding, limit) {
173
+ const result = await pool.query(`SELECT id, content, topic_abstraction, importance,
174
+ 1 - (topic_embedding <=> $2::vector) AS similarity
175
+ FROM memories
176
+ WHERE user_id = $1
177
+ AND deleted_at IS NULL
178
+ AND expired_at IS NULL
179
+ AND status = 'active'
180
+ AND workspace_id IS NULL
181
+ AND topic_embedding IS NOT NULL
182
+ ORDER BY topic_embedding <=> $2::vector
183
+ LIMIT $3`, [userId, JSON.stringify(queryEmbedding), limit]);
184
+ return result.rows.map((row) => ({
185
+ id: row.id,
186
+ content: row.content,
187
+ topic_abstraction: row.topic_abstraction,
188
+ importance: Number(row.importance),
189
+ similarity: Number(row.similarity),
190
+ }));
191
+ }
192
+ export async function countMemories(pool, userId) {
193
+ const query = userId
194
+ ? `SELECT COUNT(*)::int AS count FROM memories WHERE user_id = $1 AND deleted_at IS NULL AND expired_at IS NULL AND status = 'active'`
195
+ : `SELECT COUNT(*)::int AS count FROM memories WHERE deleted_at IS NULL AND expired_at IS NULL AND status = 'active'`;
196
+ const result = await pool.query(query, userId ? [userId] : []);
197
+ return result.rows[0].count;
198
+ }
199
+ export async function countNeedsClarification(pool, userId) {
200
+ const result = await pool.query(`SELECT COUNT(*)::int AS count
201
+ FROM memories WHERE user_id = $1 AND deleted_at IS NULL AND expired_at IS NULL AND status = 'needs_clarification'`, [userId]);
202
+ return result.rows[0].count;
203
+ }
204
+ /**
205
+ * Finds memories created within a time window of the given anchor timestamps.
206
+ * Used for 1-hop temporal-neighbor expansion: surfaces facts from the same
207
+ * conversation session that the initial top-K results originated from.
208
+ */
209
+ export async function findTemporalNeighbors(pool, userId, anchorTimestamps, queryEmbedding, windowMinutes, excludeIds, limit, referenceTime) {
210
+ if (anchorTimestamps.length === 0 || limit <= 0)
211
+ return [];
212
+ const pgvector = await import('pgvector/pg');
213
+ const excludeArray = [...excludeIds];
214
+ const windowInterval = `${windowMinutes} minutes`;
215
+ const wSim = config.scoringWeightSimilarity;
216
+ const wImp = config.scoringWeightImportance;
217
+ const wRec = config.scoringWeightRecency;
218
+ const refTime = (referenceTime ?? new Date()).toISOString();
219
+ const result = await pool.query(`SELECT *,
220
+ 1 - (embedding <=> $1) AS similarity,
221
+ (
222
+ $7 * (1 - (embedding <=> $1))
223
+ + $8 * importance
224
+ + $9 * EXP(-EXTRACT(EPOCH FROM ($10::timestamptz - last_accessed_at)) / 2592000.0)
225
+ ) * COALESCE(trust_score, 1.0) AS score
226
+ FROM memories
227
+ WHERE user_id = $2
228
+ AND deleted_at IS NULL
229
+ AND expired_at IS NULL
230
+ AND status = 'active'
231
+ AND workspace_id IS NULL
232
+ AND id != ALL($3::uuid[])
233
+ AND EXISTS (
234
+ SELECT 1 FROM unnest($4::timestamptz[]) AS anchor
235
+ WHERE memories.created_at BETWEEN anchor - $5::interval AND anchor + $5::interval
236
+ )
237
+ ORDER BY score DESC
238
+ LIMIT $6`, [
239
+ pgvector.default.toSql(queryEmbedding),
240
+ userId,
241
+ excludeArray,
242
+ anchorTimestamps,
243
+ windowInterval,
244
+ limit,
245
+ wSim, wImp, wRec, refTime,
246
+ ]);
247
+ return result.rows.map(normalizeSearchRow);
248
+ }
249
+ function estimateKeywordSimilarity(content, keywords) {
250
+ const lower = content.toLowerCase();
251
+ const weights = keywords.map((keyword) => keywordWeight(keyword));
252
+ const totalWeight = weights.reduce((sum, weight) => sum + weight, 0);
253
+ if (totalWeight === 0)
254
+ return 0.45;
255
+ let matchedWeight = 0;
256
+ for (let i = 0; i < keywords.length; i++) {
257
+ if (lower.includes(keywords[i].toLowerCase())) {
258
+ matchedWeight += weights[i];
259
+ }
260
+ }
261
+ return Math.min(0.89, 0.45 + (0.44 * matchedWeight / totalWeight));
262
+ }
263
+ function keywordWeight(keyword) {
264
+ if (keyword.includes(' '))
265
+ return 2.5;
266
+ if (/^[A-Z]{3,}$/.test(keyword) || /[A-Z]/.test(keyword.slice(1)))
267
+ return 2;
268
+ if (keyword.length >= 8)
269
+ return 1.5;
270
+ return 1;
271
+ }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Repository for the Recap layer (Sprint 3 v1).
3
+ *
4
+ * Handles read + write for the `episodes` table and the cross-table
5
+ * "find unconsolidated clusters" query that drives the Recap builder's
6
+ * background pass.
7
+ */
8
+ import pg from 'pg';
9
+ export interface RecapRow {
10
+ id: string;
11
+ user_id: string;
12
+ recap_text: string;
13
+ /** Pre-computed recap embedding — surfaced so downstream MMR can compute cosine similarity without re-embedding. */
14
+ recap_embedding: number[];
15
+ topic: string;
16
+ member_count: number;
17
+ similarity: number;
18
+ }
19
+ export interface UnconsolidatedCluster {
20
+ topic: string;
21
+ member_ids: string[];
22
+ member_contents: string[];
23
+ time_range_start: Date | null;
24
+ time_range_end: Date | null;
25
+ }
26
+ export interface StoreRecapInput {
27
+ userId: string;
28
+ recapText: string;
29
+ recapEmbedding: number[];
30
+ topic: string;
31
+ memberMemoryIds: string[];
32
+ timeRangeStart: Date | null;
33
+ timeRangeEnd: Date | null;
34
+ }
35
+ export type RecapClusterPivot = 'topic' | 'session';
36
+ /**
37
+ * Find clusters of un-consolidated memories for a given user.
38
+ *
39
+ * Two pivots supported:
40
+ * 'topic' — cluster by topic_abstraction (requires topic-abstraction
41
+ * layer ON at ingest). Original Sprint 3 v1 design.
42
+ * Empirically regressed fact-anchored abilities; v2 backlog #2
43
+ * re-pivots to 'session'.
44
+ * 'session' — cluster by user_id + observed_at hour bucket. Captures
45
+ * cross-turn aggregation within a conversation/session window
46
+ * without depending on the broken topic-abstraction layer.
47
+ */
48
+ export declare function findUnconsolidatedClusters(pool: pg.Pool, userId: string, minSize: number, pivot?: RecapClusterPivot): Promise<UnconsolidatedCluster[]>;
49
+ /**
50
+ * Insert a new episode and mark its member memories as consolidated.
51
+ * Wrapped in a transaction so member-flag updates can't drift from the
52
+ * episode insert.
53
+ */
54
+ export declare function storeRecap(pool: pg.Pool, input: StoreRecapInput): Promise<string>;
55
+ /**
56
+ * Find episode candidates by embedding similarity. Used as a dedicated
57
+ * RRF channel at retrieval.
58
+ */
59
+ export declare function findRecapCandidates(pool: pg.Pool, userId: string, queryEmbedding: number[], limit: number): Promise<RecapRow[]>;
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Repository for the Recap layer (Sprint 3 v1).
3
+ *
4
+ * Handles read + write for the `episodes` table and the cross-table
5
+ * "find unconsolidated clusters" query that drives the Recap builder's
6
+ * background pass.
7
+ */
8
+ /** Parse pgvector's text representation `[1.2, 3.4, ...]` into number[]. */
9
+ function parsePgVector(s) {
10
+ if (!s)
11
+ return [];
12
+ const trimmed = s.trim().replace(/^\[|\]$/g, '');
13
+ if (!trimmed)
14
+ return [];
15
+ return trimmed.split(',').map((x) => Number(x.trim()));
16
+ }
17
+ /**
18
+ * Find clusters of un-consolidated memories for a given user.
19
+ *
20
+ * Two pivots supported:
21
+ * 'topic' — cluster by topic_abstraction (requires topic-abstraction
22
+ * layer ON at ingest). Original Sprint 3 v1 design.
23
+ * Empirically regressed fact-anchored abilities; v2 backlog #2
24
+ * re-pivots to 'session'.
25
+ * 'session' — cluster by user_id + observed_at hour bucket. Captures
26
+ * cross-turn aggregation within a conversation/session window
27
+ * without depending on the broken topic-abstraction layer.
28
+ */
29
+ export async function findUnconsolidatedClusters(pool, userId, minSize, pivot = 'topic') {
30
+ return pivot === 'session'
31
+ ? findUnconsolidatedSessionClusters(pool, userId, minSize)
32
+ : findUnconsolidatedTopicClusters(pool, userId, minSize);
33
+ }
34
+ async function findUnconsolidatedTopicClusters(pool, userId, minSize) {
35
+ const result = await pool.query(`SELECT topic_abstraction AS topic,
36
+ array_agg(id ORDER BY observed_at) AS member_ids,
37
+ array_agg(content ORDER BY observed_at) AS member_contents,
38
+ MIN(observed_at) AS time_start,
39
+ MAX(observed_at) AS time_end,
40
+ COUNT(*) AS n
41
+ FROM memories
42
+ WHERE user_id = $1
43
+ AND deleted_at IS NULL
44
+ AND expired_at IS NULL
45
+ AND status = 'active'
46
+ AND workspace_id IS NULL
47
+ AND topic_abstraction IS NOT NULL
48
+ AND topic_abstraction <> ''
49
+ AND recap_id IS NULL
50
+ GROUP BY topic_abstraction
51
+ HAVING COUNT(*) >= $2
52
+ ORDER BY COUNT(*) DESC
53
+ LIMIT 32`, [userId, minSize]);
54
+ return result.rows.map((row) => ({
55
+ topic: row.topic,
56
+ member_ids: row.member_ids,
57
+ member_contents: row.member_contents,
58
+ time_range_start: row.time_start,
59
+ time_range_end: row.time_end,
60
+ }));
61
+ }
62
+ /**
63
+ * Session-clustered variant: groups un-consolidated memories within a
64
+ * sliding 6-hour observed_at window for the same user. The "topic" field
65
+ * returned is a synthetic label `session-<bucket-iso>` so downstream
66
+ * storage layout is unchanged. Doesn't depend on topic_abstraction —
67
+ * works on raw observed_at, available since AM ingest start.
68
+ */
69
+ async function findUnconsolidatedSessionClusters(pool, userId, minSize) {
70
+ const result = await pool.query(`SELECT 'session-' || to_char(date_trunc('hour', observed_at - INTERVAL '0 hours'), 'YYYY-MM-DD"T"HH24') AS topic,
71
+ array_agg(id ORDER BY observed_at) AS member_ids,
72
+ array_agg(content ORDER BY observed_at) AS member_contents,
73
+ MIN(observed_at) AS time_start,
74
+ MAX(observed_at) AS time_end,
75
+ COUNT(*) AS n
76
+ FROM memories
77
+ WHERE user_id = $1
78
+ AND deleted_at IS NULL
79
+ AND expired_at IS NULL
80
+ AND status = 'active'
81
+ AND workspace_id IS NULL
82
+ AND recap_id IS NULL
83
+ GROUP BY date_trunc('hour', observed_at)
84
+ HAVING COUNT(*) >= $2
85
+ ORDER BY MAX(observed_at) DESC
86
+ LIMIT 32`, [userId, minSize]);
87
+ return result.rows.map((row) => ({
88
+ topic: row.topic,
89
+ member_ids: row.member_ids,
90
+ member_contents: row.member_contents,
91
+ time_range_start: row.time_start,
92
+ time_range_end: row.time_end,
93
+ }));
94
+ }
95
+ /**
96
+ * Insert a new episode and mark its member memories as consolidated.
97
+ * Wrapped in a transaction so member-flag updates can't drift from the
98
+ * episode insert.
99
+ */
100
+ export async function storeRecap(pool, input) {
101
+ const client = await pool.connect();
102
+ try {
103
+ await client.query('BEGIN');
104
+ const insertResult = await client.query(`INSERT INTO recaps
105
+ (user_id, recap_text, recap_embedding, topic,
106
+ member_memory_ids, member_count,
107
+ time_range_start, time_range_end)
108
+ VALUES ($1, $2, $3::vector, $4, $5::uuid[], $6, $7, $8)
109
+ RETURNING id`, [
110
+ input.userId,
111
+ input.recapText,
112
+ JSON.stringify(input.recapEmbedding),
113
+ input.topic,
114
+ input.memberMemoryIds,
115
+ input.memberMemoryIds.length,
116
+ input.timeRangeStart,
117
+ input.timeRangeEnd,
118
+ ]);
119
+ const episodeId = insertResult.rows[0].id;
120
+ if (input.memberMemoryIds.length > 0) {
121
+ await client.query(`UPDATE memories
122
+ SET recap_id = $1
123
+ WHERE id = ANY($2::uuid[]) AND user_id = $3`, [episodeId, input.memberMemoryIds, input.userId]);
124
+ }
125
+ await client.query('COMMIT');
126
+ return episodeId;
127
+ }
128
+ catch (err) {
129
+ await client.query('ROLLBACK').catch(() => undefined);
130
+ throw err;
131
+ }
132
+ finally {
133
+ client.release();
134
+ }
135
+ }
136
+ /**
137
+ * Find episode candidates by embedding similarity. Used as a dedicated
138
+ * RRF channel at retrieval.
139
+ */
140
+ export async function findRecapCandidates(pool, userId, queryEmbedding, limit) {
141
+ const result = await pool.query(`SELECT id, user_id, recap_text, recap_embedding::text AS recap_embedding,
142
+ topic, member_count,
143
+ 1 - (recap_embedding <=> $2::vector) AS similarity
144
+ FROM recaps
145
+ WHERE user_id = $1
146
+ AND workspace_id IS NULL
147
+ ORDER BY recap_embedding <=> $2::vector
148
+ LIMIT $3`, [userId, JSON.stringify(queryEmbedding), limit]);
149
+ return result.rows.map((row) => ({
150
+ id: row.id,
151
+ user_id: row.user_id,
152
+ recap_text: row.recap_text,
153
+ recap_embedding: parsePgVector(row.recap_embedding),
154
+ topic: row.topic,
155
+ member_count: Number(row.member_count),
156
+ similarity: Number(row.similarity),
157
+ }));
158
+ }
@@ -0,0 +1,48 @@
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 pg from 'pg';
7
+ import { type AtomicFactRow, type AtomicFactType, type ForesightRow, type ForesightType, type SearchResult } from './repository-types.js';
8
+ type Queryable = Pick<pg.Pool, 'query'> | pg.PoolClient;
9
+ export interface StoreAtomicFactInput {
10
+ userId: string;
11
+ parentMemoryId: string;
12
+ factText: string;
13
+ embedding: number[];
14
+ factType: AtomicFactType;
15
+ importance: number;
16
+ sourceSite: string;
17
+ sourceUrl?: string;
18
+ episodeId?: string;
19
+ keywords?: string;
20
+ metadata?: Record<string, unknown>;
21
+ /** Phase 5: workspace scope for workspace-originated facts. NULL for user-scoped. */
22
+ workspaceId?: string;
23
+ agentId?: string;
24
+ }
25
+ export interface StoreForesightInput {
26
+ userId: string;
27
+ parentMemoryId: string;
28
+ content: string;
29
+ embedding: number[];
30
+ foresightType: ForesightType;
31
+ sourceSite: string;
32
+ sourceUrl?: string;
33
+ episodeId?: string;
34
+ metadata?: Record<string, unknown>;
35
+ validFrom?: Date;
36
+ validTo?: Date | null;
37
+ /** Phase 5: workspace scope for workspace-originated foresight. NULL for user-scoped. */
38
+ workspaceId?: string;
39
+ agentId?: string;
40
+ }
41
+ export declare function storeAtomicFacts(queryable: Queryable, facts: StoreAtomicFactInput[]): Promise<string[]>;
42
+ export declare function replaceAtomicFactsForMemory(queryable: Queryable, userId: string, parentMemoryId: string, facts: StoreAtomicFactInput[]): Promise<string[]>;
43
+ export declare function listAtomicFactsForMemory(queryable: Queryable, userId: string, parentMemoryId: string): Promise<AtomicFactRow[]>;
44
+ export declare function storeForesight(queryable: Queryable, foresight: StoreForesightInput[]): Promise<string[]>;
45
+ export declare function replaceForesightForMemory(queryable: Queryable, userId: string, parentMemoryId: string, foresight: StoreForesightInput[]): Promise<string[]>;
46
+ export declare function listForesightForMemory(queryable: Queryable, userId: string, parentMemoryId: string): Promise<ForesightRow[]>;
47
+ export declare function searchAtomicFactsHybrid(pool: pg.Pool, userId: string, queryText: string, queryEmbedding: number[], limit: number, sourceSite?: string, referenceTime?: Date): Promise<SearchResult[]>;
48
+ export {};