@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,48 @@
1
+ /**
2
+ * Search and retrieval orchestration for MemoryService.
3
+ * Pure orchestration: delegates formatting to retrieval-format, dedup to
4
+ * composite-dedup, side effects to retrieval-side-effects, lesson recording
5
+ * to lesson-service, and the main retrieval to search-pipeline.
6
+ */
7
+ import type { AgentScope, WorkspaceContext } from '../db/repository-types.js';
8
+ import type { MemoryServiceDeps, RetrievalOptions, RetrievalResult } from './memory-service-types.js';
9
+ /** Full search with lesson check, URI resolution, pipeline, post-processing, and packaging. */
10
+ export declare function performSearch(deps: MemoryServiceDeps, userId: string, query: string, sourceSite?: string, limit?: number, asOf?: string, referenceTime?: Date, namespaceScope?: string, retrievalOptions?: RetrievalOptions): Promise<RetrievalResult>;
11
+ /**
12
+ * Latency-optimized search that skips repair/reranking for simple and medium
13
+ * queries, but escalates to the full pipeline for multi-hop, aggregation, and
14
+ * complex queries where the LLM rewrite materially improves retrieval.
15
+ */
16
+ export declare function performFastSearch(deps: MemoryServiceDeps, userId: string, query: string, sourceSite?: string, limit?: number, namespaceScope?: string, retrievalOptions?: RetrievalOptions): Promise<RetrievalResult>;
17
+ /**
18
+ * Options for the abstention-rescue retrieval pass.
19
+ */
20
+ export interface RescueSearchOptions {
21
+ /** Original query that produced the abstaining answer. */
22
+ query: string;
23
+ /** Answer text produced by the first LLM pass (checked for abstention). */
24
+ candidateAnswer: string;
25
+ /** userId scoping this retrieval. */
26
+ userId: string;
27
+ /** Injection text from the first pass (used as system context for Sonnet rescue). */
28
+ firstInjectionText: string;
29
+ }
30
+ /**
31
+ * Abstention-rescue search: runs a second retrieval pass with keyword-augmented
32
+ * query and returns either a merged injectionText (for Haiku re-prompt) or a
33
+ * Sonnet-rescue answer (via specialistAnswer) when Haiku still abstains.
34
+ *
35
+ * Only fires when `abstentionRescueEnabled` is true in deps.config.
36
+ * Returns null when rescue is disabled or abstention was not detected.
37
+ */
38
+ export declare function performRescueSearch(deps: MemoryServiceDeps, opts: RescueSearchOptions): Promise<Pick<RetrievalResult, 'injectionText' | 'specialistAnswer'> | null>;
39
+ /**
40
+ * Workspace-scoped search: retrieves memories from the workspace memory pool.
41
+ * Uses workspace-filtered vector search with agent scope and visibility enforcement.
42
+ */
43
+ export declare function performWorkspaceSearch(deps: MemoryServiceDeps, userId: string, query: string, workspace: WorkspaceContext, options?: {
44
+ agentScope?: AgentScope;
45
+ limit?: number;
46
+ referenceTime?: Date;
47
+ retrievalOptions?: RetrievalOptions;
48
+ }): Promise<RetrievalResult>;
@@ -0,0 +1,505 @@
1
+ /**
2
+ * Search and retrieval orchestration for MemoryService.
3
+ * Pure orchestration: delegates formatting to retrieval-format, dedup to
4
+ * composite-dedup, side effects to retrieval-side-effects, lesson recording
5
+ * to lesson-service, and the main retrieval to search-pipeline.
6
+ */
7
+ import { checkLessons, recordConsensusLessons } from './lesson-service.js';
8
+ import { validateConsensus } from './consensus-validation.js';
9
+ import { embedText } from './embedding.js';
10
+ import { resolveSearchLimitDetailed, classifyQueryDetailed } from './retrieval-policy.js';
11
+ import { runSearchPipelineWithTrace } from './search-pipeline.js';
12
+ import { buildCitations as buildRichCitations, buildInjection, computePackagingSignal } from './retrieval-format.js';
13
+ import { QuestionType, classifyQuestion, isKuStyleQuery } from './answer-format.js';
14
+ import { fetchEntityFactsForInjection, fetchEpisodesForInjection, fetchUserProfileText, } from './episode-fetcher.js';
15
+ import { finalizePackagingTrace } from './packaging-observability.js';
16
+ import { isCurrentStateQuery } from './current-state-ranking.js';
17
+ import { TraceCollector } from './retrieval-trace.js';
18
+ import { excludeStaleComposites } from './composite-staleness.js';
19
+ import { applyFlatPackagingPolicy } from './composite-dedup.js';
20
+ import { recordSearchSideEffects } from './retrieval-side-effects.js';
21
+ import { applyRelevanceFilter, resolveRelevanceGate, } from './relevance-policy.js';
22
+ import { appendTllAugmentation } from './tll-augmentation.js';
23
+ import { dispatchSpecialists } from './specialists/dispatch.js';
24
+ import { applyConfidencePrefix, detectAbstention, extractKeywordsFromQuery, callSonnetRescue, } from './answer-rescue.js';
25
+ import { buildContradictionsBlock, enrichTopKWithContradictions, } from './contradiction-surfacing.js';
26
+ import { isMsrQuery } from './msr-detector.js';
27
+ import { aggregateByConversation } from './msr-aggregator.js';
28
+ import { llm as defaultLlm } from './llm.js';
29
+ import { applyTemporalStateRerank } from './temporal-rerank.js';
30
+ import { TemporalIntent, classifyTemporalIntent } from './temporal-intent.js';
31
+ /**
32
+ * Fetch a contradiction counterpart memory and shape it as a SearchResult.
33
+ * Includes expired rows because contradiction counterparts may have been
34
+ * superseded by an earlier (pre-bilateral) AUDN path and we still want
35
+ * to surface them when their pair is active.
36
+ * Returns null if the row is missing or hard-deleted.
37
+ */
38
+ async function fetchCounterpartAsSearchResult(deps, userId, memoryId, queryEmbedding) {
39
+ const rows = await deps.stores.search.fetchMemoriesByIds(userId, [memoryId], queryEmbedding, undefined, true);
40
+ return rows[0] ?? null;
41
+ }
42
+ /**
43
+ * MSR cross-conversation aggregation (v39-multihop). Returns an aggregated
44
+ * per-conversation summary block when the flag is on AND the query is
45
+ * classified as multi-session-reasoning. Returns undefined otherwise so the
46
+ * caller can skip the channel without branching.
47
+ *
48
+ * Fail-closed by delegation: `aggregateByConversation` throws on any LLM
49
+ * error, which propagates and aborts the search — matching the AUDN-style
50
+ * "no silent degradation" invariant.
51
+ */
52
+ async function maybeBuildMsrAggregationBlock(deps, memories, query) {
53
+ if (!deps.config.msrAggregatorEnabled)
54
+ return undefined;
55
+ if (!isMsrQuery(query))
56
+ return undefined;
57
+ if (memories.length === 0)
58
+ return undefined;
59
+ const aggregated = await aggregateByConversation(memories, query, {
60
+ llm: defaultLlm,
61
+ model: deps.config.llmModel,
62
+ });
63
+ return aggregated.length > 0 ? aggregated : undefined;
64
+ }
65
+ /** Check lessons safety gate; returns undefined if lessons disabled. */
66
+ async function checkSearchLessons(deps, userId, query) {
67
+ if (!deps.config.lessonsEnabled || !deps.stores.lesson)
68
+ return undefined;
69
+ return checkLessons(deps.stores.lesson, userId, query);
70
+ }
71
+ /**
72
+ * Always-on ENTITY_CARD channel renderer. Reads the top entity cards for
73
+ * the active conversation and renders them as a `## ENTITY_STATE` block.
74
+ * Returns undefined when the channel is off, the store is missing, or the
75
+ * conversationId is not in the request — never throws so a degraded
76
+ * channel does not break retrieval.
77
+ */
78
+ async function fetchEntityStateBlock(deps, userId, conversationId, questionType) {
79
+ if (!deps.config.entityCardEnabled)
80
+ return undefined;
81
+ // Per-question-type gating: v27b c1 A/B under gpt-5.4-mini-semantic showed
82
+ // ENTITY_CARDS lift PF by +0.375 but regress CR by -0.125 and SUM by -0.20.
83
+ // Card synthesis compresses contradictions (loses both sides) and trims
84
+ // narrative breadth (hurts comprehensive summaries). Suppress the channel
85
+ // for those two question types; keep it on by default for everything else.
86
+ if (questionType === QuestionType.CONTRADICTION)
87
+ return undefined;
88
+ if (questionType === QuestionType.SUMMARY)
89
+ return undefined;
90
+ const store = deps.stores.entityCards;
91
+ if (!store)
92
+ return undefined;
93
+ // BEAM/AMB note: the AMB adapter encodes BEAM's conversation_id INTO user_id
94
+ // (each conversation lives in its own user-id namespace). When no explicit
95
+ // conversationId is in the request, fall back to userId so the channel still
96
+ // fires in benchmark harnesses that do not forward conversation_id.
97
+ const convScope = conversationId ?? userId;
98
+ const cards = await store.findByConversation(userId, convScope, 5);
99
+ if (cards.length === 0)
100
+ return undefined;
101
+ const userCard = cards.find((c) => c.entityName.toLowerCase() === 'user');
102
+ const ordered = userCard
103
+ ? [userCard, ...cards.filter((c) => c !== userCard)]
104
+ : cards;
105
+ const sections = ordered.map((c) => `### ${c.entityName.toUpperCase()}\n${c.cardText}`);
106
+ return `## ENTITY_STATE (pre-synthesized, always-on)\n${sections.join('\n')}\n\n`;
107
+ }
108
+ /** Try to resolve an atomicmem:// URI query. Returns result or null. */
109
+ async function tryUriResolution(deps, query, userId, retrievalOptions, trace) {
110
+ if (!query.startsWith('atomicmem://'))
111
+ return null;
112
+ const uriTier = retrievalOptions?.retrievalMode === 'flat' ? 'L2' : 'L1';
113
+ const resolved = await deps.uriResolver.resolve(query, userId, uriTier);
114
+ if (!resolved)
115
+ return null;
116
+ const resultMemories = Array.isArray(resolved.data) ? resolved.data : [resolved.data];
117
+ trace.event('uri-resolution', { uri: query, type: resolved.type, tier: uriTier });
118
+ trace.finalize(resultMemories);
119
+ return {
120
+ memories: resultMemories,
121
+ injectionText: deps.uriResolver.format(resolved),
122
+ citations: resultMemories.map((m) => m.id),
123
+ retrievalMode: retrievalOptions?.retrievalMode ?? 'flat',
124
+ budgetConstrained: false,
125
+ };
126
+ }
127
+ /** Execute the core search (as-of or pipeline). */
128
+ async function executeSearchStep(deps, userId, query, effectiveLimit, sourceSite, referenceTime, namespaceScope, retrievalOptions, asOf, trace) {
129
+ if (asOf) {
130
+ const queryEmbedding = await embedText(query, 'query');
131
+ const memories = await deps.stores.claim.searchClaimVersions(userId, queryEmbedding, effectiveLimit, asOf, sourceSite);
132
+ trace.stage('as-of-search', memories, { asOf });
133
+ return { memories, activeTrace: trace, queryEmbedding, chainResult: { chains: [] }, reflections: [], questionType: QuestionType.OTHER };
134
+ }
135
+ const pipelineStores = {
136
+ search: deps.stores.search,
137
+ link: deps.stores.link,
138
+ memory: deps.stores.memory,
139
+ entity: deps.stores.entity,
140
+ summaries: deps.stores.summaries,
141
+ recap: deps.stores.recap,
142
+ reflections: deps.stores.reflections,
143
+ pool: deps.stores.pool,
144
+ };
145
+ const pipelineResult = await runSearchPipelineWithTrace(pipelineStores, userId, query, effectiveLimit, sourceSite, referenceTime, {
146
+ namespaceScope,
147
+ retrievalMode: retrievalOptions?.retrievalMode,
148
+ searchStrategy: retrievalOptions?.searchStrategy,
149
+ skipRepairLoop: retrievalOptions?.skipRepairLoop,
150
+ skipReranking: retrievalOptions?.skipReranking,
151
+ runtimeConfig: deps.config,
152
+ });
153
+ return {
154
+ memories: pipelineResult.filtered,
155
+ activeTrace: pipelineResult.trace,
156
+ queryEmbedding: pipelineResult.queryEmbedding,
157
+ chainResult: pipelineResult.chainResult,
158
+ reflections: pipelineResult.reflections,
159
+ questionType: pipelineResult.questionType,
160
+ };
161
+ }
162
+ /** Filter workspace-scoped, stale composites, and consensus-violating memories. */
163
+ async function postProcessResults(deps, rawMemories, activeTrace, userId, query, asOf, sourceSite, retrievalOptions) {
164
+ let memories = rawMemories.filter((m) => !m.workspace_id);
165
+ if (!asOf) {
166
+ const compositeResult = await excludeStaleComposites(deps.stores.memory, userId, memories);
167
+ if (compositeResult.removedCompositeIds.length > 0) {
168
+ memories = compositeResult.filtered;
169
+ activeTrace.stage('stale-composite-filter', memories, {
170
+ removedCount: compositeResult.removedCompositeIds.length,
171
+ removedIds: compositeResult.removedCompositeIds,
172
+ });
173
+ }
174
+ }
175
+ let consensusResult;
176
+ if (deps.config.consensusValidationEnabled && memories.length >= deps.config.consensusMinMemories) {
177
+ consensusResult = await validateConsensus(query, memories);
178
+ if (consensusResult.removedMemoryIds.length > 0) {
179
+ const removedSet = new Set(consensusResult.removedMemoryIds);
180
+ memories = memories.filter((m) => !removedSet.has(m.id));
181
+ activeTrace.stage('consensus-filter', memories, {
182
+ removedCount: consensusResult.removedMemoryIds.length,
183
+ removedIds: consensusResult.removedMemoryIds,
184
+ });
185
+ if (deps.config.lessonsEnabled && deps.stores.lesson) {
186
+ recordConsensusLessons(deps.stores.lesson, userId, consensusResult, memories).catch((err) => console.error('Consensus lesson recording failed:', err));
187
+ }
188
+ }
189
+ }
190
+ const relevanceFilter = applySearchRelevanceFilter(memories, activeTrace, query, retrievalOptions, deps.config, { asOf, sourceSite });
191
+ return { memories: relevanceFilter.memories, consensusResult, relevanceFilter };
192
+ }
193
+ function applySearchRelevanceFilter(memories, activeTrace, query, retrievalOptions, runtimeConfig, gateContext = {}) {
194
+ const gate = resolveRelevanceGate(query, retrievalOptions?.relevanceThreshold, runtimeConfig, gateContext);
195
+ const result = applyRelevanceFilter(memories, gate);
196
+ const summary = {
197
+ threshold: gate.threshold,
198
+ source: gate.source,
199
+ reason: gate.reason,
200
+ queryLabel: gate.queryLabel,
201
+ removedIds: result.removedIds,
202
+ decisions: result.decisions,
203
+ };
204
+ activeTrace.stage('relevance-filter', result.memories, {
205
+ ...summary,
206
+ removedCount: result.removedIds.length,
207
+ });
208
+ return { ...summary, memories: result.memories };
209
+ }
210
+ /** Package memories, build injection text, and assemble the final response. */
211
+ async function assembleResponse(deps, postProcessed, query, userId, activeTrace, retrievalOptions, asOf, sourceSite, lessonCheck, queryEmbedding, chainResult, reflections, questionType = QuestionType.OTHER) {
212
+ // Phase 2 specialist short-circuit — runs before buildInjection + answer LLM.
213
+ if (deps.config.phase2SpecialistsEnabled) {
214
+ const specialistResult = await dispatchSpecialists({
215
+ memories: postProcessed.memories.map((m) => ({
216
+ id: m.id,
217
+ text: m.content,
218
+ observedAt: m.observed_at,
219
+ })),
220
+ query,
221
+ userId,
222
+ model: deps.config.llmModel,
223
+ beliefEdges: deps.stores.beliefEdges ?? null,
224
+ memoryRepo: deps.stores.memory,
225
+ entityValues: deps.stores.entityValues ?? null,
226
+ });
227
+ if (specialistResult.handled) {
228
+ return {
229
+ memories: postProcessed.memories,
230
+ injectionText: '',
231
+ citations: postProcessed.memories.map((m) => m.id),
232
+ retrievalMode: retrievalOptions?.retrievalMode ?? 'flat',
233
+ budgetConstrained: false,
234
+ lessonCheck,
235
+ consensusResult: postProcessed.consensusResult,
236
+ specialistAnswer: specialistResult.answer,
237
+ };
238
+ }
239
+ }
240
+ const userProfileText = await fetchUserProfileText(deps, userId);
241
+ const episodes = deps.config.episodesChannelEnabled
242
+ ? await fetchEpisodesForInjection(deps, userId, queryEmbedding)
243
+ : [];
244
+ const entityFacts = await fetchEntityFactsForInjection(deps, userId, query);
245
+ const entityStateBlock = await fetchEntityStateBlock(deps, userId, retrievalOptions?.conversationId, questionType);
246
+ // BEAM CR fix: bilateral surfacing. When the flag is on, augment top-K with
247
+ // contradiction counterparts and capture both-sides verbatim pairs to
248
+ // render as `## CONTRADICTIONS_DETECTED`.
249
+ const enrichment = await enrichTopKWithContradictions({
250
+ userId,
251
+ memories: postProcessed.memories,
252
+ contradictions: deps.stores.contradictions,
253
+ enabled: deps.config.contradictionSurfacingEnabled,
254
+ fetchCounterpart: (memoryId) => fetchCounterpartAsSearchResult(deps, userId, memoryId, queryEmbedding),
255
+ });
256
+ const enrichedPostProcessed = {
257
+ ...postProcessed,
258
+ memories: enrichment.memories,
259
+ };
260
+ const contradictionsBlock = buildContradictionsBlock(enrichment.pairs, questionType);
261
+ const msrAggregationBlock = await maybeBuildMsrAggregationBlock(deps, enrichment.memories, query);
262
+ const packaged = packageSearchOutput(enrichedPostProcessed, query, activeTrace, retrievalOptions, userProfileText, episodes, entityFacts, deps.config, chainResult, reflections, questionType, entityStateBlock, contradictionsBlock, msrAggregationBlock);
263
+ recordSearchSideEffects(deps, packaged.outputMemories, userId, query, sourceSite, asOf);
264
+ updateRetrievalSummary(activeTrace, packaged.outputMemories, query, retrievalOptions, postProcessed.relevanceFilter);
265
+ activeTrace.finalize(packaged.outputMemories);
266
+ return buildRetrievalResult(postProcessed, packaged, activeTrace, lessonCheck);
267
+ }
268
+ /**
269
+ * BEAM v42 KU recency reorder. Gated by `kuRecencySortEnabled`, restricted to
270
+ * NUMERIC_COUNT queries that also match the KU-style framing
271
+ * ("what is the average/current/latest/daily X"). Reorders packaged retrieval
272
+ * by observed_at DESC so the most recent measurement appears first for the
273
+ * answer LLM. Keeps ALL memories — pure reorder. Targets KU Mode B
274
+ * (wrong-value-forced) where Haiku picks the earlier of two competing values.
275
+ */
276
+ function maybeApplyKuRecencySort(packaged, query, questionType, runtimeConfig, activeTrace) {
277
+ if (!runtimeConfig.kuRecencySortEnabled)
278
+ return packaged;
279
+ if (questionType !== QuestionType.NUMERIC_COUNT)
280
+ return packaged;
281
+ if (!isKuStyleQuery(query))
282
+ return packaged;
283
+ const sorted = [...packaged].sort((a, b) => b.observed_at.getTime() - a.observed_at.getTime());
284
+ activeTrace.event('ku-recency-sort', {
285
+ candidateCount: sorted.length,
286
+ orderedIds: sorted.map((m) => m.id),
287
+ });
288
+ return sorted;
289
+ }
290
+ // fallow-ignore-next-line complexity
291
+ function packageSearchOutput(postProcessed, query, activeTrace, retrievalOptions, userProfileText, episodes, entityFacts, runtimeConfig, chainResult, reflections, questionType = QuestionType.OTHER, entityStateBlock, contradictionsBlock, msrAggregationBlock) {
292
+ const mode = retrievalOptions?.retrievalMode ?? 'flat';
293
+ const packaged = applyFlatPackagingPolicy(postProcessed.memories, query, mode, activeTrace);
294
+ const baseOrdered = isCurrentStateQuery(query) ? packaged.sort((a, b) => b.score - a.score) : packaged;
295
+ const outputMemories = maybeApplyKuRecencySort(baseOrdered, query, questionType, runtimeConfig, activeTrace);
296
+ const buildResult = buildInjection(outputMemories, query, mode, retrievalOptions?.tokenBudget, userProfileText, episodes, entityFacts, chainResult?.chains, reflections, questionType);
297
+ const { tierAssignments, expandIds, estimatedContextTokens } = buildResult;
298
+ const renderedMemories = buildResult.includedMemories;
299
+ // CONTRADICTIONS_DETECTED block (BEAM CR fix) is prepended above
300
+ // ENTITY_STATE so the answer LLM sees both sides verbatim before any
301
+ // compressed entity summary that may have lost the contradiction.
302
+ const bodyWithContradictions = contradictionsBlock
303
+ ? `${contradictionsBlock}${buildResult.injectionText}`
304
+ : buildResult.injectionText;
305
+ // ENTITY_STATE channel: prepend the always-on per-entity cards block above
306
+ // every other channel so the answer LLM has canonical user state up front.
307
+ const bodyWithEntityState = entityStateBlock
308
+ ? `${entityStateBlock}${bodyWithContradictions}`
309
+ : bodyWithContradictions;
310
+ // MSR cross-conversation aggregation (v39-multihop): prepend above
311
+ // ENTITY_STATE so the answer LLM sees per-conversation summaries BEFORE
312
+ // the raw chunks that triggered the misjoin.
313
+ const bodyWithMsr = msrAggregationBlock
314
+ ? `## CROSS-SESSION SUMMARY\n${msrAggregationBlock}\n\n${bodyWithEntityState}`
315
+ : bodyWithEntityState;
316
+ // Confidence-priming prefix: prepend when abstention rescue is enabled so the
317
+ // external answer LLM commits to facts it can see rather than hedging.
318
+ const injectionText = applyConfidencePrefix(bodyWithMsr, runtimeConfig.abstentionRescueEnabled, {
319
+ adaptive: runtimeConfig.confidencePrefixAdaptiveEnabled,
320
+ questionType,
321
+ });
322
+ const { packagingSummary, assemblySummary } = finalizePackagingTrace(activeTrace, {
323
+ outputMemories: renderedMemories, mode, injectionText, estimatedContextTokens, tierAssignments,
324
+ tokenBudget: retrievalOptions?.tokenBudget,
325
+ });
326
+ return {
327
+ mode,
328
+ outputMemories: renderedMemories,
329
+ injectionText,
330
+ tierAssignments,
331
+ expandIds,
332
+ estimatedContextTokens,
333
+ budgetConstrained: buildResult.budgetConstrained,
334
+ packagingSummary,
335
+ assemblySummary,
336
+ };
337
+ }
338
+ function updateRetrievalSummary(activeTrace, outputMemories, query, retrievalOptions, relevanceFilter) {
339
+ const priorSummary = activeTrace.getRetrievalSummary();
340
+ activeTrace.setRetrievalSummary({
341
+ candidateIds: outputMemories.map((memory) => memory.id),
342
+ candidateCount: outputMemories.length,
343
+ queryText: priorSummary?.queryText ?? query,
344
+ skipRepair: priorSummary?.skipRepair ?? retrievalOptions?.skipRepairLoop ?? false,
345
+ relevanceThreshold: relevanceFilter.threshold,
346
+ relevanceFilterSource: relevanceFilter.source,
347
+ relevanceFilterReason: relevanceFilter.reason,
348
+ filteredCandidateIds: relevanceFilter.removedIds,
349
+ filterDecisions: relevanceFilter.decisions,
350
+ });
351
+ }
352
+ function buildRetrievalResult(postProcessed, packaged, activeTrace, lessonCheck) {
353
+ return {
354
+ memories: packaged.outputMemories,
355
+ injectionText: packaged.injectionText,
356
+ citations: buildRichCitations(packaged.outputMemories).map((c) => c.memory_id),
357
+ retrievalMode: packaged.mode,
358
+ tierAssignments: packaged.tierAssignments,
359
+ expandIds: packaged.expandIds,
360
+ estimatedContextTokens: packaged.estimatedContextTokens,
361
+ budgetConstrained: packaged.budgetConstrained,
362
+ lessonCheck, consensusResult: postProcessed.consensusResult,
363
+ packagingSignal: computePackagingSignal(packaged.outputMemories),
364
+ retrievalSummary: activeTrace.getRetrievalSummary(),
365
+ packagingSummary: packaged.packagingSummary,
366
+ assemblySummary: packaged.assemblySummary,
367
+ };
368
+ }
369
+ /** Full search with lesson check, URI resolution, pipeline, post-processing, and packaging. */
370
+ export async function performSearch(deps, userId, query, sourceSite, limit, asOf, referenceTime, namespaceScope, retrievalOptions) {
371
+ const lessonCheck = await checkSearchLessons(deps, userId, query);
372
+ if (lessonCheck && !lessonCheck.safe) {
373
+ return {
374
+ memories: [],
375
+ injectionText: '',
376
+ citations: [],
377
+ retrievalMode: retrievalOptions?.retrievalMode ?? 'flat',
378
+ budgetConstrained: false,
379
+ lessonCheck,
380
+ };
381
+ }
382
+ const { limit: effectiveLimit, classification } = resolveSearchLimitDetailed(query, limit, deps.config);
383
+ const trace = new TraceCollector(query, userId);
384
+ trace.event('query-classification', { label: classification.label, limit: effectiveLimit, matchedMarker: classification.matchedMarker });
385
+ const uriResult = await tryUriResolution(deps, query, userId, retrievalOptions, trace);
386
+ if (uriResult)
387
+ return uriResult;
388
+ const { memories: rawMemories, activeTrace, queryEmbedding, chainResult, reflections, questionType } = await executeSearchStep(deps, userId, query, effectiveLimit, sourceSite, referenceTime, namespaceScope, retrievalOptions, asOf, trace);
389
+ const filteredMemories = await postProcessResults(deps, rawMemories, activeTrace, userId, query, asOf, sourceSite, retrievalOptions);
390
+ const reranked = maybeApplyTemporalRerank(filteredMemories, query, deps.config, activeTrace);
391
+ const augmented = await appendTllAugmentation(deps, userId, query, reranked, effectiveLimit, activeTrace);
392
+ return assembleResponse(deps, augmented, query, userId, activeTrace, retrievalOptions, asOf, sourceSite, lessonCheck, queryEmbedding, chainResult, reflections, questionType);
393
+ }
394
+ /**
395
+ * BEAM v38 read seam — when `temporalStateEnabled` is on and the query
396
+ * intent is CURRENT_STATE, additively rerank candidates by their
397
+ * state_key activity. Always returns the same record shape so the rest
398
+ * of the pipeline is unaware of the optional channel.
399
+ */
400
+ function maybeApplyTemporalRerank(postProcessed, query, runtimeConfig, activeTrace) {
401
+ if (!runtimeConfig.temporalStateEnabled)
402
+ return postProcessed;
403
+ const intent = classifyTemporalIntent(query);
404
+ if (intent !== TemporalIntent.CURRENT_STATE)
405
+ return postProcessed;
406
+ const reranked = applyTemporalStateRerank(postProcessed.memories);
407
+ activeTrace.event('temporal-state-rerank', {
408
+ intent,
409
+ candidateCount: reranked.length,
410
+ activeIds: reranked
411
+ .filter((m) => m.state_key && (m.event_end === null || m.event_end === undefined))
412
+ .map((m) => m.id),
413
+ });
414
+ return { ...postProcessed, memories: reranked };
415
+ }
416
+ /**
417
+ * Latency-optimized search that skips repair/reranking for simple and medium
418
+ * queries, but escalates to the full pipeline for multi-hop, aggregation, and
419
+ * complex queries where the LLM rewrite materially improves retrieval.
420
+ */
421
+ export async function performFastSearch(deps, userId, query, sourceSite, limit, namespaceScope, retrievalOptions) {
422
+ const label = classifyQueryDetailed(query).label;
423
+ const escalate = label === 'multi-hop' || label === 'aggregation' || label === 'complex';
424
+ // Fast search owns these latency toggles based on query class; caller options
425
+ // still flow through for packaging, threshold, and strategy controls.
426
+ return performSearch(deps, userId, query, sourceSite, limit, undefined, undefined, namespaceScope, {
427
+ ...retrievalOptions,
428
+ skipRepairLoop: !escalate,
429
+ skipReranking: !escalate,
430
+ });
431
+ }
432
+ /**
433
+ * Abstention-rescue search: runs a second retrieval pass with keyword-augmented
434
+ * query and returns either a merged injectionText (for Haiku re-prompt) or a
435
+ * Sonnet-rescue answer (via specialistAnswer) when Haiku still abstains.
436
+ *
437
+ * Only fires when `abstentionRescueEnabled` is true in deps.config.
438
+ * Returns null when rescue is disabled or abstention was not detected.
439
+ */
440
+ // fallow-ignore-next-line unused-export
441
+ export async function performRescueSearch(deps, opts) {
442
+ if (!deps.config.abstentionRescueEnabled)
443
+ return null;
444
+ if (!detectAbstention(opts.candidateAnswer))
445
+ return null;
446
+ const keywords = extractKeywordsFromQuery(opts.query);
447
+ const augmentedQuery = keywords ? `${opts.query} ${keywords}` : opts.query;
448
+ const rescueK = deps.config.abstentionRescueRetrieveK;
449
+ const rescueResult = await performSearch(deps, opts.userId, augmentedQuery, undefined, rescueK);
450
+ const { injectionText: rescueInjection } = rescueResult;
451
+ const mergedInjection = applyConfidencePrefix(opts.firstInjectionText + '\n\n' + rescueInjection, true, {
452
+ adaptive: deps.config.confidencePrefixAdaptiveEnabled,
453
+ questionType: classifyQuestion(opts.query),
454
+ });
455
+ if (!detectAbstention(opts.candidateAnswer)) {
456
+ return { injectionText: mergedInjection };
457
+ }
458
+ const apiKey = deps.config.anthropicApiKey ?? '';
459
+ const sonnetAnswer = await callSonnetRescue({ model: deps.config.abstentionRescueSonnetModel, apiKey }, mergedInjection, opts.query);
460
+ return { injectionText: mergedInjection, specialistAnswer: sonnetAnswer || undefined };
461
+ }
462
+ /**
463
+ * Workspace-scoped search: retrieves memories from the workspace memory pool.
464
+ * Uses workspace-filtered vector search with agent scope and visibility enforcement.
465
+ */
466
+ export async function performWorkspaceSearch(deps, userId, query, workspace, options = {}) {
467
+ const { limit: effectiveLimit } = resolveSearchLimitDetailed(query, options.limit, deps.config);
468
+ const queryEmbedding = await embedText(query, 'query');
469
+ const memories = await deps.stores.search.searchSimilarInWorkspace(workspace.workspaceId, queryEmbedding, effectiveLimit, options.agentScope ?? 'all', workspace.agentId, options.referenceTime);
470
+ const trace = new TraceCollector(query, userId);
471
+ trace.stage('workspace-search', memories, {
472
+ workspaceId: workspace.workspaceId,
473
+ agentId: workspace.agentId,
474
+ agentScope: options.agentScope ?? 'all',
475
+ });
476
+ const { filtered: staleFilteredMemories, removedCompositeIds } = await excludeStaleComposites(deps.stores.memory, userId, memories);
477
+ if (removedCompositeIds.length > 0) {
478
+ trace.stage('stale-composite-filter', staleFilteredMemories, {
479
+ removedCount: removedCompositeIds.length,
480
+ removedIds: removedCompositeIds,
481
+ });
482
+ }
483
+ const relevanceFilter = applySearchRelevanceFilter(staleFilteredMemories, trace, query, options.retrievalOptions, deps.config);
484
+ const filteredMemories = relevanceFilter.memories;
485
+ for (const m of filteredMemories)
486
+ deps.stores.memory.touchMemory(m.id).catch(() => { });
487
+ const mode = options.retrievalOptions?.retrievalMode ?? 'flat';
488
+ const workspaceQuestionType = classifyQuestion(query);
489
+ const rawInjection = buildInjection(filteredMemories, query, mode, options.retrievalOptions?.tokenBudget, undefined, undefined, undefined, undefined, undefined, workspaceQuestionType);
490
+ const wsInjectionText = applyConfidencePrefix(rawInjection.injectionText, deps.config.abstentionRescueEnabled, {
491
+ adaptive: deps.config.confidencePrefixAdaptiveEnabled,
492
+ questionType: workspaceQuestionType,
493
+ });
494
+ const injection = { ...rawInjection, injectionText: wsInjectionText };
495
+ const outputMemories = injection.includedMemories;
496
+ updateRetrievalSummary(trace, outputMemories, query, options.retrievalOptions, relevanceFilter);
497
+ trace.finalize(outputMemories);
498
+ return {
499
+ memories: outputMemories,
500
+ citations: outputMemories.map((m) => m.id),
501
+ retrievalMode: mode,
502
+ retrievalSummary: trace.getRetrievalSummary(),
503
+ ...injection,
504
+ };
505
+ }