@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,66 @@
1
+ /**
2
+ * Affinity-Based Memory Clustering.
3
+ *
4
+ * Identifies groups of related memories that are candidates for
5
+ * consolidation (LLM-based synthesis into abstract memories).
6
+ * Runs as a batch process during off-peak times.
7
+ *
8
+ * Pipeline:
9
+ * 1. Compute pairwise affinity scores (semantic + temporal proximity)
10
+ * 2. Greedy cluster assignment (threshold-based)
11
+ * 3. Return clusters for LLM synthesis (separate step, requires API)
12
+ *
13
+ * Source: SimpleMem consolidation pattern.
14
+ */
15
+ export interface AffinityConfig {
16
+ /** Minimum affinity to consider two memories related. */
17
+ threshold: number;
18
+ /** Minimum cluster size to keep. */
19
+ minClusterSize: number;
20
+ /** Weight for semantic vs temporal signal (0=temporal only, 1=semantic only). */
21
+ beta: number;
22
+ /** Temporal decay rate (higher = faster decay with time distance). */
23
+ temporalLambda: number;
24
+ }
25
+ export declare const DEFAULT_AFFINITY_CONFIG: AffinityConfig;
26
+ export interface ClusterableMemory {
27
+ id: string;
28
+ embedding: number[];
29
+ createdAt: Date;
30
+ content: string;
31
+ importance: number;
32
+ }
33
+ export interface AffinityPair {
34
+ idA: string;
35
+ idB: string;
36
+ score: number;
37
+ semanticSim: number;
38
+ temporalProx: number;
39
+ }
40
+ export interface MemoryCluster {
41
+ members: ClusterableMemory[];
42
+ avgAffinity: number;
43
+ }
44
+ /**
45
+ * Compute affinity between two memories.
46
+ * affinity = β × semanticSim + (1-β) × temporalProximity
47
+ */
48
+ export declare function computeAffinity(a: ClusterableMemory, b: ClusterableMemory, config?: AffinityConfig): AffinityPair;
49
+ /**
50
+ * Temporal proximity between two timestamps.
51
+ * Returns exp(-λ × |t1 - t2| / MS_PER_HOUR) — decays with time distance.
52
+ */
53
+ export declare function computeTemporalProximity(t1: Date, t2: Date, lambda?: number): number;
54
+ /**
55
+ * Find all pairwise affinities above threshold.
56
+ * Returns pairs sorted by affinity descending.
57
+ */
58
+ export declare function findAffinePairs(memories: ClusterableMemory[], config?: AffinityConfig): AffinityPair[];
59
+ /**
60
+ * Greedy cluster formation from pairwise affinities.
61
+ *
62
+ * For each unassigned memory, find all unassigned neighbors with
63
+ * affinity >= threshold. If the resulting group meets minClusterSize,
64
+ * it becomes a cluster. Each memory is assigned to at most one cluster.
65
+ */
66
+ export declare function formClusters(memories: ClusterableMemory[], config?: AffinityConfig): MemoryCluster[];
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Affinity-Based Memory Clustering.
3
+ *
4
+ * Identifies groups of related memories that are candidates for
5
+ * consolidation (LLM-based synthesis into abstract memories).
6
+ * Runs as a batch process during off-peak times.
7
+ *
8
+ * Pipeline:
9
+ * 1. Compute pairwise affinity scores (semantic + temporal proximity)
10
+ * 2. Greedy cluster assignment (threshold-based)
11
+ * 3. Return clusters for LLM synthesis (separate step, requires API)
12
+ *
13
+ * Source: SimpleMem consolidation pattern.
14
+ */
15
+ import { cosineSimilarity } from './entropy-gate.js';
16
+ const DEFAULT_AFFINITY_THRESHOLD = 0.85;
17
+ const DEFAULT_MIN_CLUSTER_SIZE = 3;
18
+ const DEFAULT_BETA = 0.5;
19
+ const DEFAULT_TEMPORAL_LAMBDA = 0.1;
20
+ const MS_PER_HOUR = 3_600_000;
21
+ export const DEFAULT_AFFINITY_CONFIG = {
22
+ threshold: DEFAULT_AFFINITY_THRESHOLD,
23
+ minClusterSize: DEFAULT_MIN_CLUSTER_SIZE,
24
+ beta: DEFAULT_BETA,
25
+ temporalLambda: DEFAULT_TEMPORAL_LAMBDA,
26
+ };
27
+ /**
28
+ * Compute affinity between two memories.
29
+ * affinity = β × semanticSim + (1-β) × temporalProximity
30
+ */
31
+ export function computeAffinity(a, b, config = DEFAULT_AFFINITY_CONFIG) {
32
+ const semanticSim = cosineSimilarity(a.embedding, b.embedding);
33
+ const temporalProx = computeTemporalProximity(a.createdAt, b.createdAt, config.temporalLambda);
34
+ const score = config.beta * semanticSim + (1 - config.beta) * temporalProx;
35
+ return {
36
+ idA: a.id,
37
+ idB: b.id,
38
+ score,
39
+ semanticSim,
40
+ temporalProx,
41
+ };
42
+ }
43
+ /**
44
+ * Temporal proximity between two timestamps.
45
+ * Returns exp(-λ × |t1 - t2| / MS_PER_HOUR) — decays with time distance.
46
+ */
47
+ export function computeTemporalProximity(t1, t2, lambda = DEFAULT_TEMPORAL_LAMBDA) {
48
+ const hoursDiff = Math.abs(t1.getTime() - t2.getTime()) / MS_PER_HOUR;
49
+ return Math.exp(-lambda * hoursDiff);
50
+ }
51
+ /**
52
+ * Find all pairwise affinities above threshold.
53
+ * Returns pairs sorted by affinity descending.
54
+ */
55
+ export function findAffinePairs(memories, config = DEFAULT_AFFINITY_CONFIG) {
56
+ const pairs = [];
57
+ for (let i = 0; i < memories.length; i++) {
58
+ for (let j = i + 1; j < memories.length; j++) {
59
+ const pair = computeAffinity(memories[i], memories[j], config);
60
+ if (pair.score >= config.threshold) {
61
+ pairs.push(pair);
62
+ }
63
+ }
64
+ }
65
+ return pairs.sort((a, b) => b.score - a.score);
66
+ }
67
+ /**
68
+ * Greedy cluster formation from pairwise affinities.
69
+ *
70
+ * For each unassigned memory, find all unassigned neighbors with
71
+ * affinity >= threshold. If the resulting group meets minClusterSize,
72
+ * it becomes a cluster. Each memory is assigned to at most one cluster.
73
+ */
74
+ export function formClusters(memories, config = DEFAULT_AFFINITY_CONFIG) {
75
+ const pairs = findAffinePairs(memories, config);
76
+ const adjacency = buildAdjacencyMap(pairs, config.threshold);
77
+ const assigned = new Set();
78
+ const clusters = [];
79
+ const memoryMap = new Map(memories.map((m) => [m.id, m]));
80
+ const sortedMemories = [...memories].sort((a, b) => b.importance - a.importance);
81
+ for (const memory of sortedMemories) {
82
+ if (assigned.has(memory.id))
83
+ continue;
84
+ const neighbors = (adjacency.get(memory.id) ?? [])
85
+ .filter((id) => !assigned.has(id));
86
+ const clusterIds = [memory.id, ...neighbors];
87
+ if (clusterIds.length < config.minClusterSize)
88
+ continue;
89
+ const members = clusterIds
90
+ .map((id) => memoryMap.get(id))
91
+ .filter((m) => m !== undefined);
92
+ const avgAffinity = computeAvgClusterAffinity(members, config);
93
+ clusters.push({ members, avgAffinity });
94
+ for (const id of clusterIds)
95
+ assigned.add(id);
96
+ }
97
+ return clusters;
98
+ }
99
+ function buildAdjacencyMap(pairs, threshold) {
100
+ const adj = new Map();
101
+ for (const pair of pairs) {
102
+ if (pair.score < threshold)
103
+ continue;
104
+ if (!adj.has(pair.idA))
105
+ adj.set(pair.idA, []);
106
+ if (!adj.has(pair.idB))
107
+ adj.set(pair.idB, []);
108
+ adj.get(pair.idA).push(pair.idB);
109
+ adj.get(pair.idB).push(pair.idA);
110
+ }
111
+ return adj;
112
+ }
113
+ function computeAvgClusterAffinity(members, config) {
114
+ if (members.length < 2)
115
+ return 0;
116
+ let total = 0;
117
+ let count = 0;
118
+ for (let i = 0; i < members.length; i++) {
119
+ for (let j = i + 1; j < members.length; j++) {
120
+ total += computeAffinity(members[i], members[j], config).score;
121
+ count++;
122
+ }
123
+ }
124
+ return count > 0 ? total / count : 0;
125
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Agentic multi-round retrieval (EverMemOS-inspired).
3
+ *
4
+ * After initial retrieval, an LLM sufficiency check determines whether
5
+ * the retrieved memories are adequate to answer the query. If not, the
6
+ * query is decomposed into 2-3 complementary sub-queries, each retrieved
7
+ * in parallel, and results are fused via weighted merge.
8
+ *
9
+ * This specifically targets multi-hop questions where a single query
10
+ * embedding can't capture all the required facts.
11
+ *
12
+ * Trade-offs:
13
+ * - Adds 1 LLM call (sufficiency check + decomposition) when triggered
14
+ * - Adds N embedding calls for sub-queries
15
+ * - Only fires when initial retrieval is deemed insufficient
16
+ * - Latency: ~1-2s additional when triggered
17
+ */
18
+ import type { CoreRuntimeConfig } from '../app/runtime-container.js';
19
+ import type { SearchResult } from '../db/repository-types.js';
20
+ import type { SearchStore } from '../db/stores.js';
21
+ type AgenticRetrievalRuntimeConfig = Pick<CoreRuntimeConfig, 'hybridSearchEnabled' | 'retrievalProfileSettings' | 'maxSearchResults'>;
22
+ export interface AgenticRetrievalResult {
23
+ memories: SearchResult[];
24
+ triggered: boolean;
25
+ subQueries: string[];
26
+ reason: string;
27
+ }
28
+ /**
29
+ * Agentic multi-round retrieval: check sufficiency of initial results,
30
+ * decompose query if insufficient, retrieve sub-queries, and fuse.
31
+ *
32
+ * Only fires when:
33
+ * 1. agenticRetrievalEnabled is true in config
34
+ * 2. Initial results have low top similarity OR few results
35
+ * 3. The sufficiency check says memories are insufficient
36
+ */
37
+ export declare function applyAgenticRetrieval(repo: SearchStore, userId: string, query: string, initialResults: SearchResult[], candidateDepth: number, sourceSite?: string, referenceTime?: Date, policyConfig?: AgenticRetrievalRuntimeConfig): Promise<AgenticRetrievalResult>;
38
+ export {};
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Agentic multi-round retrieval (EverMemOS-inspired).
3
+ *
4
+ * After initial retrieval, an LLM sufficiency check determines whether
5
+ * the retrieved memories are adequate to answer the query. If not, the
6
+ * query is decomposed into 2-3 complementary sub-queries, each retrieved
7
+ * in parallel, and results are fused via weighted merge.
8
+ *
9
+ * This specifically targets multi-hop questions where a single query
10
+ * embedding can't capture all the required facts.
11
+ *
12
+ * Trade-offs:
13
+ * - Adds 1 LLM call (sufficiency check + decomposition) when triggered
14
+ * - Adds N embedding calls for sub-queries
15
+ * - Only fires when initial retrieval is deemed insufficient
16
+ * - Latency: ~1-2s additional when triggered
17
+ */
18
+ import { llm } from './llm.js';
19
+ import { embedText } from './embedding.js';
20
+ import { mergeSearchResults } from './retrieval-policy.js';
21
+ import { config } from '../config.js';
22
+ const SUFFICIENCY_AND_DECOMPOSE_PROMPT = `You are a memory retrieval assistant. Given a user's question and the memories retrieved so far, determine if the memories are SUFFICIENT to answer the question fully.
23
+
24
+ RULES:
25
+ - A question is SUFFICIENT if the retrieved memories contain all the information needed for a complete answer.
26
+ - A question is INSUFFICIENT if key information is missing — especially for multi-hop questions that require connecting multiple facts.
27
+ - For simple factual questions with a direct match, mark as SUFFICIENT.
28
+ - For questions requiring temporal reasoning, relationship inference, or connecting multiple facts, be stricter about sufficiency.
29
+
30
+ If INSUFFICIENT, generate 2-3 complementary search queries that would retrieve the missing information. Each sub-query should target a DIFFERENT aspect of the original question.
31
+
32
+ Respond in JSON:
33
+ {
34
+ "sufficient": true/false,
35
+ "reason": "brief explanation",
36
+ "subQueries": ["query1", "query2"] // only if insufficient, empty if sufficient
37
+ }`;
38
+ /**
39
+ * Check if retrieved memories are sufficient and decompose if not.
40
+ * Returns null if sufficient (no additional retrieval needed).
41
+ */
42
+ async function checkSufficiencyAndDecompose(query, memories) {
43
+ const memorySummary = memories.length === 0
44
+ ? 'No memories retrieved.'
45
+ : memories
46
+ .slice(0, 10)
47
+ .map((m, i) => `[${i + 1}] ${m.content}`)
48
+ .join('\n');
49
+ const userMessage = `Question: ${query}\n\nRetrieved memories:\n${memorySummary}`;
50
+ const response = await llm.chat([
51
+ { role: 'system', content: SUFFICIENCY_AND_DECOMPOSE_PROMPT },
52
+ { role: 'user', content: userMessage },
53
+ ], { temperature: 0, maxTokens: 300 });
54
+ try {
55
+ const cleaned = response.replace(/```json\n?/g, '').replace(/```\n?/g, '').trim();
56
+ const parsed = JSON.parse(cleaned);
57
+ return {
58
+ sufficient: parsed.sufficient === true,
59
+ reason: parsed.reason ?? '',
60
+ subQueries: Array.isArray(parsed.subQueries)
61
+ ? parsed.subQueries.filter((q) => typeof q === 'string' && q.length > 0).slice(0, 3)
62
+ : [],
63
+ };
64
+ }
65
+ catch {
66
+ console.error('[agentic-retrieval] Failed to parse sufficiency response:', response.slice(0, 200));
67
+ return { sufficient: true, reason: 'parse-error', subQueries: [] };
68
+ }
69
+ }
70
+ /**
71
+ * Execute sub-queries in parallel and retrieve additional memories.
72
+ */
73
+ async function retrieveSubQueries(repo, userId, subQueries, candidateDepth, policyConfig, sourceSite, referenceTime) {
74
+ const retrievalPromises = subQueries.map(async (subQuery) => {
75
+ const embedding = await embedText(subQuery, 'query');
76
+ if (policyConfig.hybridSearchEnabled) {
77
+ return repo.searchHybrid(userId, subQuery, embedding, candidateDepth, sourceSite, referenceTime);
78
+ }
79
+ return repo.searchSimilar(userId, embedding, candidateDepth, sourceSite, referenceTime);
80
+ });
81
+ const results = await Promise.all(retrievalPromises);
82
+ // Fuse all sub-query results via weighted merge
83
+ let fused = [];
84
+ for (const subResult of results) {
85
+ fused = mergeSearchResults(fused, subResult, candidateDepth, policyConfig);
86
+ }
87
+ return fused;
88
+ }
89
+ /**
90
+ * Agentic multi-round retrieval: check sufficiency of initial results,
91
+ * decompose query if insufficient, retrieve sub-queries, and fuse.
92
+ *
93
+ * Only fires when:
94
+ * 1. agenticRetrievalEnabled is true in config
95
+ * 2. Initial results have low top similarity OR few results
96
+ * 3. The sufficiency check says memories are insufficient
97
+ */
98
+ export async function applyAgenticRetrieval(repo, userId, query, initialResults, candidateDepth, sourceSite, referenceTime, policyConfig = config) {
99
+ // Quick gate: skip for queries that already have strong results
100
+ if (initialResults.length >= 3 && initialResults[0].similarity >= 0.85) {
101
+ return { memories: initialResults, triggered: false, subQueries: [], reason: 'strong-initial-results' };
102
+ }
103
+ const sufficiency = await checkSufficiencyAndDecompose(query, initialResults);
104
+ if (sufficiency.sufficient || sufficiency.subQueries.length === 0) {
105
+ return {
106
+ memories: initialResults,
107
+ triggered: false,
108
+ subQueries: [],
109
+ reason: sufficiency.reason || 'sufficient',
110
+ };
111
+ }
112
+ console.log(`[agentic-retrieval] Insufficient: "${sufficiency.reason}". Decomposing into ${sufficiency.subQueries.length} sub-queries`);
113
+ for (const sq of sufficiency.subQueries) {
114
+ console.log(`[agentic-retrieval] → "${sq}"`);
115
+ }
116
+ const subQueryResults = await retrieveSubQueries(repo, userId, sufficiency.subQueries, candidateDepth, policyConfig, sourceSite, referenceTime);
117
+ // Merge initial + sub-query results
118
+ const merged = mergeSearchResults(initialResults, subQueryResults, candidateDepth, policyConfig);
119
+ console.log(`[agentic-retrieval] Merged: ${initialResults.length} initial + ${subQueryResults.length} sub-query → ${merged.length} total`);
120
+ return {
121
+ memories: merged,
122
+ triggered: true,
123
+ subQueries: sufficiency.subQueries,
124
+ reason: sufficiency.reason,
125
+ };
126
+ }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Answer-format alignment (Sprint 5 Layer 1).
3
+ *
4
+ * Classifies an incoming query into a fixed set of question types and emits a
5
+ * per-type output-format hint that is prepended to the retrieval-injection
6
+ * prompt sent to the answer LLM.
7
+ *
8
+ * Motivation: Sprint 2/3 diagnostics on BEAM-100K showed >95% of failures
9
+ * classified as `synthesis_failure`, 0% as `low_retrieval`. The right facts
10
+ * are being retrieved, but the answer LLM produces nuanced prose that misses
11
+ * the judge's literal-string rubric (e.g. "Approximately three weeks" instead
12
+ * of "21 days"). Stronger models hurt themselves on rigid rubrics. Mem0's
13
+ * extraction algorithm hardcodes output schemas per question type; this
14
+ * module replicates that signal for the answer-format side of the pipeline.
15
+ *
16
+ * Classification is pure regex over the query string — deterministic, no LLM
17
+ * call, no I/O. Disabled by default behind `answerFormatAlignmentEnabled`.
18
+ */
19
+ /** Coarse-grained question taxonomy used to dispatch per-type format hints. */
20
+ export declare enum QuestionType {
21
+ NUMERIC_COUNT = "numeric_count",
22
+ EXACT_DATE = "exact_date",
23
+ ORDERED_LIST = "ordered_list",
24
+ CONTRADICTION = "contradiction",
25
+ SUMMARY = "summary",
26
+ PREFERENCE = "preference",
27
+ ABSTAIN = "abstain",
28
+ OTHER = "other"
29
+ }
30
+ /**
31
+ * Classify a query into a `QuestionType`. Patterns are evaluated in priority
32
+ * order: numeric count first (most rubric-rigid), date next, then list,
33
+ * contradiction, summary, preference. Everything unmatched falls to OTHER.
34
+ *
35
+ * ABSTAIN is intentionally never produced here — abstain decisions belong to
36
+ * the existing abstain-policy layer, which sees retrieval state we don't.
37
+ */
38
+ export declare function classifyQuestion(query: string): QuestionType;
39
+ /** Return the literal format-hint template for a question type. Empty string
40
+ * means "no hint" — the caller must leave the prompt unchanged. */
41
+ export declare function getOutputFormatHint(type: QuestionType): string;
42
+ /**
43
+ * Returns true when `query` matches the v42 KU-style framing pattern (
44
+ * "what is the average/current/latest/daily X", "how often/frequently").
45
+ * Exposed so callers (e.g. memory-search packaging) can gate KU-specific
46
+ * behavior — like recency reordering — without duplicating the regex.
47
+ */
48
+ export declare function isKuStyleQuery(query: string): boolean;
49
+ /**
50
+ * Prepend a per-type format hint to `prompt`. When `enabled` is false, returns
51
+ * the prompt unchanged. When the classified type has no hint (OTHER,
52
+ * PREFERENCE, ABSTAIN), returns the prompt unchanged. Otherwise returns
53
+ * `${hint}\n\n${prompt}`. The two-newline separator keeps the hint visually
54
+ * distinct from the retrieval injection that follows.
55
+ */
56
+ export declare function applyFormatHint(prompt: string, query: string, enabled: boolean): string;
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Answer-format alignment (Sprint 5 Layer 1).
3
+ *
4
+ * Classifies an incoming query into a fixed set of question types and emits a
5
+ * per-type output-format hint that is prepended to the retrieval-injection
6
+ * prompt sent to the answer LLM.
7
+ *
8
+ * Motivation: Sprint 2/3 diagnostics on BEAM-100K showed >95% of failures
9
+ * classified as `synthesis_failure`, 0% as `low_retrieval`. The right facts
10
+ * are being retrieved, but the answer LLM produces nuanced prose that misses
11
+ * the judge's literal-string rubric (e.g. "Approximately three weeks" instead
12
+ * of "21 days"). Stronger models hurt themselves on rigid rubrics. Mem0's
13
+ * extraction algorithm hardcodes output schemas per question type; this
14
+ * module replicates that signal for the answer-format side of the pipeline.
15
+ *
16
+ * Classification is pure regex over the query string — deterministic, no LLM
17
+ * call, no I/O. Disabled by default behind `answerFormatAlignmentEnabled`.
18
+ */
19
+ /** Coarse-grained question taxonomy used to dispatch per-type format hints. */
20
+ export var QuestionType;
21
+ (function (QuestionType) {
22
+ QuestionType["NUMERIC_COUNT"] = "numeric_count";
23
+ QuestionType["EXACT_DATE"] = "exact_date";
24
+ QuestionType["ORDERED_LIST"] = "ordered_list";
25
+ QuestionType["CONTRADICTION"] = "contradiction";
26
+ QuestionType["SUMMARY"] = "summary";
27
+ QuestionType["PREFERENCE"] = "preference";
28
+ QuestionType["ABSTAIN"] = "abstain";
29
+ QuestionType["OTHER"] = "other";
30
+ })(QuestionType || (QuestionType = {}));
31
+ const NUMERIC_COUNT_PATTERN = /\b(how many|how much|total|count|number of|across all)\b/i;
32
+ const EXACT_DATE_PATTERN = /\b(when does|when did|what date|deadline for|until when)\b/i;
33
+ // KU-style metric/state queries (v42): "what is the average response time?",
34
+ // "what's my current accuracy?", "what is the daily call quota?". These should
35
+ // route to NUMERIC_COUNT so they pick up the forced-commit prefix and rubric
36
+ // phrasing matches gold of the form "state: 250ms" / "state: 1,200 calls".
37
+ const KU_STYLE_PATTERN = /\b(?:what(?:'s|\s+is)\s+(?:(?:my|the)\s+)?(?:current|average|latest|daily|total)\b|what(?:'s|\s+is)\s+my\s+\w+\s+(?:percentage|rate|score|quota|count|level)\b|how (?:often|frequently))/i;
38
+ // Requires either:
39
+ // (a) an explicit ordering phrase ("list ... in order", "order in which", "chronological order"), OR
40
+ // (b) ordering verb + a spelled-out or digit count token ("three", "5", "ONLY five items")
41
+ // This prevents false-positives on generic "list X" / "list common errors" queries that
42
+ // don't need ordered enumeration.
43
+ const ORDERED_LIST_NUMERIC = /\b(\d+|one|two|three|four|five|six|seven|eight|nine|ten)\b/i;
44
+ const ORDERED_LIST_HINT = /\b(list|sequence|order|chronological|mention)\b/i;
45
+ const ORDERED_LIST_EXPLICIT = /\b(list\s+(?:.*?\s+)?in order|order in which|chronological order)\b/i;
46
+ const CONTRADICTION_PATTERN = /\b(have I ever|did I ever|contradict|conflicting)\b/i;
47
+ const SUMMARY_PATTERN = /\b(summary|summarize|comprehensive|walk me through|overview)\b/i;
48
+ const PREFERENCE_PATTERN = /\b(what would you|what should I|suggest|recommend)\b/i;
49
+ /**
50
+ * Classify a query into a `QuestionType`. Patterns are evaluated in priority
51
+ * order: numeric count first (most rubric-rigid), date next, then list,
52
+ * contradiction, summary, preference. Everything unmatched falls to OTHER.
53
+ *
54
+ * ABSTAIN is intentionally never produced here — abstain decisions belong to
55
+ * the existing abstain-policy layer, which sees retrieval state we don't.
56
+ */
57
+ export function classifyQuestion(query) {
58
+ // KU-style metric/state queries fire first so they reach the forced
59
+ // NUMERIC_COUNT prefix path before generic "what is" fallthrough.
60
+ if (KU_STYLE_PATTERN.test(query))
61
+ return QuestionType.NUMERIC_COUNT;
62
+ if (NUMERIC_COUNT_PATTERN.test(query))
63
+ return QuestionType.NUMERIC_COUNT;
64
+ if (EXACT_DATE_PATTERN.test(query))
65
+ return QuestionType.EXACT_DATE;
66
+ if (ORDERED_LIST_EXPLICIT.test(query))
67
+ return QuestionType.ORDERED_LIST;
68
+ if (ORDERED_LIST_HINT.test(query) && ORDERED_LIST_NUMERIC.test(query)) {
69
+ return QuestionType.ORDERED_LIST;
70
+ }
71
+ if (CONTRADICTION_PATTERN.test(query))
72
+ return QuestionType.CONTRADICTION;
73
+ if (SUMMARY_PATTERN.test(query))
74
+ return QuestionType.SUMMARY;
75
+ if (PREFERENCE_PATTERN.test(query))
76
+ return QuestionType.PREFERENCE;
77
+ return QuestionType.OTHER;
78
+ }
79
+ const FORMAT_HINTS = {
80
+ [QuestionType.NUMERIC_COUNT]: "FORMAT: Begin with the exact number, then list each item. Example: '3: feature A, feature B, feature C.'",
81
+ [QuestionType.EXACT_DATE]: "FORMAT: Answer with the exact date or duration as it appears in the retrieved facts. Do not paraphrase ('21 days' not 'about three weeks').",
82
+ [QuestionType.ORDERED_LIST]: "FORMAT: Numbered list. Include all requested items if retrievable from the facts; otherwise list only the items that ARE retrievable and state that fewer items are available. Format: '1) {item}, 2) {item}, ...'",
83
+ [QuestionType.CONTRADICTION]: "FORMAT: 'You said X but also Y. Which is correct?'",
84
+ [QuestionType.SUMMARY]: 'FORMAT: Multi-paragraph comprehensive summary covering all topics in the retrieved facts.',
85
+ [QuestionType.PREFERENCE]: '',
86
+ [QuestionType.ABSTAIN]: '',
87
+ [QuestionType.OTHER]: '',
88
+ };
89
+ /** Return the literal format-hint template for a question type. Empty string
90
+ * means "no hint" — the caller must leave the prompt unchanged. */
91
+ export function getOutputFormatHint(type) {
92
+ return FORMAT_HINTS[type] ?? '';
93
+ }
94
+ /**
95
+ * Returns true when `query` matches the v42 KU-style framing pattern (
96
+ * "what is the average/current/latest/daily X", "how often/frequently").
97
+ * Exposed so callers (e.g. memory-search packaging) can gate KU-specific
98
+ * behavior — like recency reordering — without duplicating the regex.
99
+ */
100
+ export function isKuStyleQuery(query) {
101
+ return KU_STYLE_PATTERN.test(query);
102
+ }
103
+ /**
104
+ * Prepend a per-type format hint to `prompt`. When `enabled` is false, returns
105
+ * the prompt unchanged. When the classified type has no hint (OTHER,
106
+ * PREFERENCE, ABSTAIN), returns the prompt unchanged. Otherwise returns
107
+ * `${hint}\n\n${prompt}`. The two-newline separator keeps the hint visually
108
+ * distinct from the retrieval injection that follows.
109
+ */
110
+ export function applyFormatHint(prompt, query, enabled) {
111
+ if (!enabled)
112
+ return prompt;
113
+ const type = classifyQuestion(query);
114
+ const hint = getOutputFormatHint(type);
115
+ if (!hint)
116
+ return prompt;
117
+ return `${hint}\n\n${prompt}`;
118
+ }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Answer-rescue layer: detects over-abstention in answer LLM output and
3
+ * applies up to two rescue steps:
4
+ * 1) iterative retrieval — second retrieval pass with extracted keywords
5
+ * 2) Sonnet fallback — retry with a more confident model
6
+ *
7
+ * Gated behind ABSTENTION_RESCUE_ENABLED (default false).
8
+ *
9
+ * Background: Haiku frequently writes answers like "context does not contain
10
+ * information (March 10, 2024)" — citing the answer while claiming not to
11
+ * find it. This is a model-calibration issue we compensate for in the
12
+ * answer-generation step rather than in retrieval architecture.
13
+ *
14
+ * The confidence prefix is prepended to injectionText so the external answer
15
+ * LLM (in the AMB harness) sees it on every prompt when rescue is enabled.
16
+ * The iterative-retrieval and Sonnet-rescue paths fire inside core when the
17
+ * harness calls POST /v1/memories/search and passes back the answer for
18
+ * re-evaluation via the rescueAnswer entry point (future: answer-verify route).
19
+ */
20
+ import { QuestionType } from './answer-format.js';
21
+ /**
22
+ * Returns true if the answer string matches any known abstention pattern.
23
+ * Used to decide whether to trigger rescue steps.
24
+ */
25
+ export declare function detectAbstention(answer: string): boolean;
26
+ /**
27
+ * Pull high-signal keywords from a question for re-retrieval.
28
+ * Heuristics:
29
+ * - Quoted strings
30
+ * - Hyphenated compounds (Flask-Login)
31
+ * - Capitalized multi-word phrases
32
+ * - Domain tokens (numbers, percentages — these often appear in gold)
33
+ */
34
+ export declare function extractKeywordsFromQuery(query: string): string;
35
+ /**
36
+ * Confidence-priming instruction prepended to every answer-LLM prompt when
37
+ * abstention rescue is enabled. Forces Haiku to commit when the context
38
+ * supports an answer rather than hedging.
39
+ */
40
+ export declare const CONFIDENCE_PREFIX: string;
41
+ /** Options governing per-question-type adaptive prefix selection. */
42
+ export interface ConfidencePrefixOptions {
43
+ /** When true, choose forced/soft/none by `questionType`. When false, always forced. */
44
+ adaptive: boolean;
45
+ /** Classified question type. Ignored unless adaptive=true. */
46
+ questionType?: QuestionType;
47
+ }
48
+ /**
49
+ * Prepend the confidence prefix to the injection prompt when rescue is enabled.
50
+ * Returns the prompt unchanged when disabled (zero-allocation fast path).
51
+ * When `options.adaptive` is true, selects the forced/soft/none variant based
52
+ * on classified question type (see selectPrefixForQuestionType). Default
53
+ * behavior (no options) preserves the v34 forced-commit prompt for backward
54
+ * compatibility with existing tests + the prior baseline.
55
+ */
56
+ export declare function applyConfidencePrefix(prompt: string, enabled: boolean, options?: ConfidencePrefixOptions): string;
57
+ /** Dependencies for the Sonnet rescue step. */
58
+ export interface SonnetRescueDeps {
59
+ /** Anthropic model ID for the rescue attempt (e.g. 'claude-sonnet-4-5'). */
60
+ model: string;
61
+ /** Anthropic API key. Sourced from runtime config — never read process.env here. */
62
+ apiKey: string;
63
+ }
64
+ /**
65
+ * Call Sonnet with the same context and confidence prefix. Returns the model's
66
+ * text response, or an empty string if no text block is present.
67
+ *
68
+ * This is a last-resort fallback: only fires when Haiku abstains after both the
69
+ * confidence-prefix pass and the iterative-retrieval pass. Sonnet is less prone
70
+ * to over-abstention on fact-anchored questions.
71
+ */
72
+ export declare function callSonnetRescue(deps: SonnetRescueDeps, systemPrompt: string, userMessage: string): Promise<string>;