@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,109 @@
1
+ /**
2
+ * Score semantics and relevance threshold policy for retrieval packaging.
3
+ */
4
+ import { classifyQueryDetailed, resolveRecallBypass } from './retrieval-policy.js';
5
+ const INTEGRATION_SOURCE_PREFIXES = ['integration-', 'integration_', 'integration:', 'integration/'];
6
+ const KNOWN_INTEGRATION_SOURCE_SITES = new Set([
7
+ 'integration',
8
+ 'gmail',
9
+ 'gmail.com',
10
+ 'google-drive',
11
+ 'google_drive',
12
+ 'drive.google.com',
13
+ 'docs.google.com',
14
+ 'mail.google.com',
15
+ 'x.com',
16
+ 'twitter',
17
+ 'twitter.com',
18
+ ]);
19
+ export function resolveRelevanceGate(query, requestedThreshold, runtimeConfig, context = {}) {
20
+ const queryLabel = classifyQueryDetailed(query).label;
21
+ // Explicit caller policy is authoritative; recall-preserving bypasses below
22
+ // only relax the config default when the request has not supplied a floor.
23
+ if (requestedThreshold !== undefined) {
24
+ return buildGate(requestedThreshold, 'request', 'caller-threshold', queryLabel);
25
+ }
26
+ const bypassReason = resolveRecallBypass(query, queryLabel, context);
27
+ if (bypassReason)
28
+ return { threshold: null, source: 'disabled', reason: bypassReason, queryLabel };
29
+ return buildGate(runtimeConfig.similarityThreshold, 'config', 'direct-query-default', queryLabel);
30
+ }
31
+ export function applyRelevanceFilter(memories, gate) {
32
+ const scored = memories.map(withScoreSemantics);
33
+ const decisions = scored.map((memory) => buildDecision(memory, gate));
34
+ if (gate.threshold === null)
35
+ return { memories: scored, decisions, removedIds: [] };
36
+ const keptIds = new Set(decisions.filter((decision) => decision.decision === 'kept').map((decision) => decision.id));
37
+ return {
38
+ memories: scored.filter((memory) => keptIds.has(memory.id)),
39
+ decisions,
40
+ removedIds: decisions.filter((decision) => decision.decision === 'filtered').map((decision) => decision.id),
41
+ };
42
+ }
43
+ function withScoreSemantics(memory) {
44
+ const semanticSimilarity = finiteOrZero(memory.semantic_similarity ?? memory.similarity);
45
+ const rankingScore = finiteOrZero(memory.ranking_score ?? memory.score);
46
+ const relevance = clampUnit(memory.relevance ?? semanticSimilarity);
47
+ return {
48
+ ...memory,
49
+ semantic_similarity: semanticSimilarity,
50
+ ranking_score: rankingScore,
51
+ relevance,
52
+ };
53
+ }
54
+ function buildGate(rawThreshold, source, reason, queryLabel) {
55
+ const threshold = clampUnit(rawThreshold);
56
+ return { threshold, source, reason, queryLabel };
57
+ }
58
+ function buildDecision(memory, gate) {
59
+ const sourceKind = classifySourceKind(memory.source_site);
60
+ const threshold = gate.threshold;
61
+ const kept = threshold === null || memory.relevance >= threshold;
62
+ return {
63
+ id: memory.id,
64
+ sourceSite: memory.source_site,
65
+ sourceKind,
66
+ namespace: memory.namespace ?? null,
67
+ semanticSimilarity: memory.semantic_similarity,
68
+ rankingScore: memory.ranking_score,
69
+ relevance: memory.relevance,
70
+ threshold,
71
+ decision: kept ? 'kept' : 'filtered',
72
+ reason: buildReason(kept, gate, sourceKind),
73
+ };
74
+ }
75
+ function buildReason(kept, gate, sourceKind) {
76
+ if (gate.threshold === null)
77
+ return gate.reason;
78
+ if (sourceKind === 'integration') {
79
+ return kept ? 'integration-meets-threshold' : 'integration-below-threshold';
80
+ }
81
+ return kept ? 'meets-threshold' : 'below-threshold';
82
+ }
83
+ function classifySourceKind(sourceSite) {
84
+ const normalized = normalizeSourceSite(sourceSite);
85
+ if (INTEGRATION_SOURCE_PREFIXES.some((prefix) => normalized.startsWith(prefix))) {
86
+ return 'integration';
87
+ }
88
+ return KNOWN_INTEGRATION_SOURCE_SITES.has(normalized) ? 'integration' : 'local';
89
+ }
90
+ function normalizeSourceSite(sourceSite) {
91
+ const trimmed = sourceSite.trim().toLowerCase();
92
+ if (!trimmed)
93
+ return trimmed;
94
+ try {
95
+ const parsed = new URL(trimmed.includes('://') ? trimmed : `https://${trimmed}`);
96
+ return parsed.hostname.replace(/^www\./, '');
97
+ }
98
+ catch {
99
+ return trimmed;
100
+ }
101
+ }
102
+ function finiteOrZero(value) {
103
+ return Number.isFinite(value) ? value : 0;
104
+ }
105
+ function clampUnit(value) {
106
+ if (!Number.isFinite(value))
107
+ return 0;
108
+ return Math.max(0, Math.min(1, value));
109
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Cross-encoder reranker for search-pipeline RRF results.
3
+ *
4
+ * Re-scores the top-N candidates from the fused RRF output by asking an LLM
5
+ * to rate (query, candidate) relevance, then promotes the top-K. Mirrors the
6
+ * primitive Hindsight uses but at AM's latency tier (~50-150 ms added p95).
7
+ *
8
+ * Principled, no-regex: an LLM-learned scoring function. No query-text pattern
9
+ * matching. The reranker activates uniformly for all queries when the config
10
+ * flag is on.
11
+ *
12
+ * Feature flag: rerankerEnabled (default OFF).
13
+ *
14
+ * See benchmarks-sprint3/2026-05-10-am-baseline-and-rerank-design.md.
15
+ */
16
+ import type { LLMProvider } from './llm.js';
17
+ import type { SearchResult } from '../db/repository-types.js';
18
+ export declare class RerankerError extends Error {
19
+ readonly cause?: unknown | undefined;
20
+ constructor(message: string, cause?: unknown | undefined);
21
+ }
22
+ /**
23
+ * Rerank a list of search results by LLM-judged relevance to the query.
24
+ *
25
+ * Returns a new array sorted by reranker score (descending). Original
26
+ * SearchResult fields are preserved; the returned array preserves length
27
+ * (no candidates dropped).
28
+ *
29
+ * Fail-closed: throws RerankerError on LLM failure or invalid output.
30
+ * Caller is expected to catch and fall back to the un-reranked list.
31
+ */
32
+ export declare function llmRerank(query: string, candidates: SearchResult[], llmClient?: LLMProvider): Promise<SearchResult[]>;
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Cross-encoder reranker for search-pipeline RRF results.
3
+ *
4
+ * Re-scores the top-N candidates from the fused RRF output by asking an LLM
5
+ * to rate (query, candidate) relevance, then promotes the top-K. Mirrors the
6
+ * primitive Hindsight uses but at AM's latency tier (~50-150 ms added p95).
7
+ *
8
+ * Principled, no-regex: an LLM-learned scoring function. No query-text pattern
9
+ * matching. The reranker activates uniformly for all queries when the config
10
+ * flag is on.
11
+ *
12
+ * Feature flag: rerankerEnabled (default OFF).
13
+ *
14
+ * See benchmarks-sprint3/2026-05-10-am-baseline-and-rerank-design.md.
15
+ */
16
+ import { llm as defaultLlm } from './llm.js';
17
+ import { extractFirstJsonObject } from './extraction.js';
18
+ const RERANK_MAX_TOKENS = 512;
19
+ const RERANK_DEFAULT_TOP_N = 20;
20
+ const RERANK_CANDIDATE_CONTENT_CHARS = 600;
21
+ const RERANK_SYSTEM_PROMPT = [
22
+ 'You score memory snippets by how well each one helps answer the user query.',
23
+ '',
24
+ 'Rules:',
25
+ '- Read the query and each candidate carefully.',
26
+ '- For each candidate, return a relevance score in [0, 1] where:',
27
+ ' 1.0 = directly answers the query',
28
+ ' 0.5 = related but does not answer directly',
29
+ ' 0.0 = unrelated',
30
+ '- Output a JSON object: {"scores": [s0, s1, s2, ...]} in candidate order.',
31
+ '- Do NOT include text outside the JSON. No markdown fences.',
32
+ ].join('\n');
33
+ export class RerankerError extends Error {
34
+ cause;
35
+ constructor(message, cause) {
36
+ super(message);
37
+ this.cause = cause;
38
+ this.name = 'RerankerError';
39
+ }
40
+ }
41
+ /**
42
+ * Rerank a list of search results by LLM-judged relevance to the query.
43
+ *
44
+ * Returns a new array sorted by reranker score (descending). Original
45
+ * SearchResult fields are preserved; the returned array preserves length
46
+ * (no candidates dropped).
47
+ *
48
+ * Fail-closed: throws RerankerError on LLM failure or invalid output.
49
+ * Caller is expected to catch and fall back to the un-reranked list.
50
+ */
51
+ export async function llmRerank(query, candidates, llmClient = defaultLlm) {
52
+ if (candidates.length === 0)
53
+ return candidates;
54
+ const limit = Math.min(candidates.length, RERANK_DEFAULT_TOP_N);
55
+ const slice = candidates.slice(0, limit);
56
+ const messages = [
57
+ { role: 'system', content: RERANK_SYSTEM_PROMPT },
58
+ { role: 'user', content: buildRerankUserMessage(query, slice) },
59
+ ];
60
+ let raw;
61
+ try {
62
+ raw = await llmClient.chat(messages, {
63
+ temperature: 0,
64
+ jsonMode: true,
65
+ maxTokens: RERANK_MAX_TOKENS,
66
+ });
67
+ }
68
+ catch (err) {
69
+ throw new RerankerError(`reranker LLM call failed: ${err.message}`, err);
70
+ }
71
+ if (!raw)
72
+ throw new RerankerError('reranker returned empty content');
73
+ const cleaned = extractFirstJsonObject(raw);
74
+ let parsed;
75
+ try {
76
+ parsed = JSON.parse(cleaned);
77
+ }
78
+ catch (err) {
79
+ throw new RerankerError(`reranker returned non-JSON: ${cleaned.slice(0, 200)}`, err);
80
+ }
81
+ const scores = validateScores(parsed.scores, slice.length);
82
+ return applyScores(slice, scores, candidates.slice(limit));
83
+ }
84
+ function buildRerankUserMessage(query, candidates) {
85
+ const blocks = candidates.map((c, i) => {
86
+ const content = (c.content ?? '').trim().slice(0, RERANK_CANDIDATE_CONTENT_CHARS);
87
+ return `[${i}] ${content}`;
88
+ });
89
+ return [
90
+ 'QUERY:',
91
+ query.trim().slice(0, 2000),
92
+ '',
93
+ `CANDIDATES (${candidates.length}):`,
94
+ blocks.join('\n'),
95
+ '',
96
+ `Return JSON: {"scores": [${candidates.map(() => 's').join(', ')}]} where each s is in [0, 1].`,
97
+ ].join('\n');
98
+ }
99
+ function validateScores(raw, expectedLength) {
100
+ if (!Array.isArray(raw)) {
101
+ throw new RerankerError(`scores must be an array, got ${typeof raw}`);
102
+ }
103
+ if (raw.length !== expectedLength) {
104
+ throw new RerankerError(`scores length ${raw.length} != expected ${expectedLength}`);
105
+ }
106
+ return raw.map((s, i) => {
107
+ const n = typeof s === 'number' ? s : Number(s);
108
+ if (!Number.isFinite(n)) {
109
+ throw new RerankerError(`score[${i}] is not a finite number: ${String(s)}`);
110
+ }
111
+ return Math.max(0, Math.min(1, n));
112
+ });
113
+ }
114
+ function applyScores(scored, scores, unscored) {
115
+ const indexed = scored.map((c, i) => ({ result: c, score: scores[i] }));
116
+ indexed.sort((a, b) => b.score - a.score);
117
+ return [...indexed.map((x) => x.result), ...unscored];
118
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Cross-encoder reranker using a configurable Transformers.js sequence classifier.
3
+ *
4
+ * Scores (query, document) pairs jointly for more accurate relevance ranking
5
+ * than bi-encoder cosine similarity alone. Runs on CPU via ONNX Runtime.
6
+ *
7
+ * Enable via CROSS_ENCODER_ENABLED=true and choose the model with
8
+ * CROSS_ENCODER_MODEL.
9
+ */
10
+ import type { SearchResult } from '../db/memory-repository.js';
11
+ import { type CrossEncoderDtype } from '../config.js';
12
+ export interface RerankerRuntimeConfig {
13
+ crossEncoderModel: string;
14
+ crossEncoderDtype: CrossEncoderDtype;
15
+ }
16
+ /**
17
+ * Rerank candidates using cross-encoder scoring.
18
+ * Replaces .score on each SearchResult; preserves .similarity for MMR.
19
+ */
20
+ export declare function rerankCandidates(query: string, candidates: SearchResult[], runtimeConfig?: RerankerRuntimeConfig): Promise<SearchResult[]>;
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Cross-encoder reranker using a configurable Transformers.js sequence classifier.
3
+ *
4
+ * Scores (query, document) pairs jointly for more accurate relevance ranking
5
+ * than bi-encoder cosine similarity alone. Runs on CPU via ONNX Runtime.
6
+ *
7
+ * Enable via CROSS_ENCODER_ENABLED=true and choose the model with
8
+ * CROSS_ENCODER_MODEL.
9
+ */
10
+ import { config } from '../config.js';
11
+ let tokenizer = null;
12
+ let model = null;
13
+ let loadedModelKey = null;
14
+ let loadPromise = null;
15
+ /** Serialize ONNX inference to prevent mutex corruption (see onnx-stability-issue.md). */
16
+ let inferenceQueue = Promise.resolve();
17
+ async function loadTokenizer(modelId) {
18
+ const { AutoTokenizer } = await import('@huggingface/transformers');
19
+ return AutoTokenizer.from_pretrained(modelId);
20
+ }
21
+ async function loadModel(modelId, runtimeConfig) {
22
+ const { AutoModelForSequenceClassification } = await import('@huggingface/transformers');
23
+ return AutoModelForSequenceClassification.from_pretrained(modelId, {
24
+ dtype: runtimeConfig.crossEncoderDtype,
25
+ });
26
+ }
27
+ function buildRerankerConfigKey(runtimeConfig) {
28
+ return `${runtimeConfig.crossEncoderModel}:${runtimeConfig.crossEncoderDtype}`;
29
+ }
30
+ async function ensureLoaded(runtimeConfig = config) {
31
+ const modelId = runtimeConfig.crossEncoderModel;
32
+ const modelKey = buildRerankerConfigKey(runtimeConfig);
33
+ if (tokenizer && model && loadedModelKey === modelKey)
34
+ return;
35
+ if (loadPromise) {
36
+ await loadPromise;
37
+ return;
38
+ }
39
+ loadPromise = (async () => {
40
+ console.log(`[reranker] Loading ${modelId} (${runtimeConfig.crossEncoderDtype})...`);
41
+ const start = Date.now();
42
+ [tokenizer, model] = await Promise.all([loadTokenizer(modelId), loadModel(modelId, runtimeConfig)]);
43
+ loadedModelKey = modelKey;
44
+ console.log(`[reranker] Loaded ${modelId} (${runtimeConfig.crossEncoderDtype}) in ${Date.now() - start}ms`);
45
+ })();
46
+ try {
47
+ await loadPromise;
48
+ }
49
+ finally {
50
+ loadPromise = null;
51
+ }
52
+ }
53
+ function sigmoid(x) {
54
+ return 1 / (1 + Math.exp(-x));
55
+ }
56
+ /**
57
+ * Rerank candidates using cross-encoder scoring.
58
+ * Replaces .score on each SearchResult; preserves .similarity for MMR.
59
+ */
60
+ export async function rerankCandidates(query, candidates, runtimeConfig = config) {
61
+ if (candidates.length === 0)
62
+ return candidates;
63
+ await ensureLoaded(runtimeConfig);
64
+ const start = Date.now();
65
+ const queries = candidates.map(() => query);
66
+ const documents = candidates.map((c) => c.content);
67
+ const inputs = tokenizer(queries, {
68
+ text_pair: documents,
69
+ padding: true,
70
+ truncation: true,
71
+ });
72
+ const scores = await new Promise((resolve, reject) => {
73
+ inferenceQueue = inferenceQueue.then(async () => {
74
+ try {
75
+ const output = await model(inputs);
76
+ const logits = Array.from(output.logits.data);
77
+ resolve(logits.map(sigmoid));
78
+ }
79
+ catch (err) {
80
+ reject(err);
81
+ }
82
+ });
83
+ });
84
+ // Blend cross-encoder relevance with original temporal-aware score.
85
+ // The cross-encoder scores pure textual relevance (0-1) but has no temporal
86
+ // signal. Without blending, a semantically-closer old fact will always outrank
87
+ // a newer superseding fact. We normalize both signals to [0,1] and combine:
88
+ // blended = crossEncoderWeight * ceScore + (1 - crossEncoderWeight) * normalizedOriginal
89
+ const crossEncoderWeight = 0.7;
90
+ const maxOriginal = Math.max(...candidates.map((c) => c.score), 1e-9);
91
+ const reranked = candidates.map((candidate, i) => ({
92
+ ...candidate,
93
+ score: crossEncoderWeight * scores[i] + (1 - crossEncoderWeight) * (candidate.score / maxOriginal),
94
+ }));
95
+ reranked.sort((a, b) => b.score - a.score);
96
+ const ms = Date.now() - start;
97
+ console.log(`[reranker] Scored ${candidates.length} candidates with ${runtimeConfig.crossEncoderModel} (${runtimeConfig.crossEncoderDtype}) in ${ms}ms (top: ${reranked[0]?.score.toFixed(3)})`);
98
+ return reranked;
99
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Channel emission rules for retrieval-format injection.
3
+ *
4
+ * Each helper encodes which prompt channels are appropriate for a given
5
+ * question type. The principle: emit only the channels that aid that
6
+ * specific question type; suppress everything else so the answer LLM
7
+ * isn't distracted by paraphrased content competing with raw facts.
8
+ *
9
+ * Smoke v1/v2 evidence: emitting all channels for every query (the "OTHER
10
+ * keeps everything" rule) regressed IF/KU/IE by 0.25–0.75 because Haiku
11
+ * fixated on paraphrased TIMELINE/EVENT_CHAIN content above the raw fact
12
+ * block and produced "context does not contain information" even when
13
+ * the literal fact was present. Conservative default: OTHER gets NO
14
+ * auxiliary channels — let the LLM work with raw retrieved facts unless
15
+ * the question type explicitly benefits from a channel.
16
+ */
17
+ import { QuestionType } from './answer-format.js';
18
+ /**
19
+ * Whether to emit the ## EVENT_CHAIN channel.
20
+ * Only ORDERED_LIST queries need chronological per-entity event chains.
21
+ * OTHER suppresses it — chains paraphrase content and compete with raw facts.
22
+ */
23
+ export declare function shouldEmitEventChain(qt: QuestionType): boolean;
24
+ /**
25
+ * Whether to emit the ## OBSERVATIONS channel (Reflect-synthesized).
26
+ * Only CONTRADICTION and SUMMARY queries benefit; other types use raw facts.
27
+ */
28
+ export declare function shouldEmitObservations(qt: QuestionType): boolean;
29
+ /**
30
+ * Whether to apply the Layer 1 per-type format hint.
31
+ * Skipped for PREFERENCE (no hint exists) and OTHER (no classification
32
+ * matched, no rationale to constrain the answer format).
33
+ */
34
+ export declare function shouldApplyFormatHint(qt: QuestionType): boolean;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Channel emission rules for retrieval-format injection.
3
+ *
4
+ * Each helper encodes which prompt channels are appropriate for a given
5
+ * question type. The principle: emit only the channels that aid that
6
+ * specific question type; suppress everything else so the answer LLM
7
+ * isn't distracted by paraphrased content competing with raw facts.
8
+ *
9
+ * Smoke v1/v2 evidence: emitting all channels for every query (the "OTHER
10
+ * keeps everything" rule) regressed IF/KU/IE by 0.25–0.75 because Haiku
11
+ * fixated on paraphrased TIMELINE/EVENT_CHAIN content above the raw fact
12
+ * block and produced "context does not contain information" even when
13
+ * the literal fact was present. Conservative default: OTHER gets NO
14
+ * auxiliary channels — let the LLM work with raw retrieved facts unless
15
+ * the question type explicitly benefits from a channel.
16
+ */
17
+ import { QuestionType } from './answer-format.js';
18
+ /**
19
+ * Whether to emit the ## EVENT_CHAIN channel.
20
+ * Only ORDERED_LIST queries need chronological per-entity event chains.
21
+ * OTHER suppresses it — chains paraphrase content and compete with raw facts.
22
+ */
23
+ export function shouldEmitEventChain(qt) {
24
+ return qt === QuestionType.ORDERED_LIST;
25
+ }
26
+ /**
27
+ * Whether to emit the ## OBSERVATIONS channel (Reflect-synthesized).
28
+ * Only CONTRADICTION and SUMMARY queries benefit; other types use raw facts.
29
+ */
30
+ export function shouldEmitObservations(qt) {
31
+ return qt === QuestionType.CONTRADICTION
32
+ || qt === QuestionType.SUMMARY;
33
+ }
34
+ /**
35
+ * Whether to apply the Layer 1 per-type format hint.
36
+ * Skipped for PREFERENCE (no hint exists) and OTHER (no classification
37
+ * matched, no rationale to constrain the answer format).
38
+ */
39
+ export function shouldApplyFormatHint(qt) {
40
+ return qt !== QuestionType.PREFERENCE && qt !== QuestionType.OTHER;
41
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @file Per-request config overlay primitives.
3
+ *
4
+ * Supports the `config_override` request-body field on memory ingest
5
+ * and search routes. Three responsibilities:
6
+ *
7
+ * 1. `applyConfigOverride` — shallow-merge a validated flat override
8
+ * onto the startup `RuntimeConfig`. Because the override shape
9
+ * matches the flat `RuntimeConfig` field names one-for-one, this
10
+ * is a genuine single-line `{ ...base, ...override }` — no
11
+ * mapping layer, no nested traversal.
12
+ *
13
+ * 2. `hashEffectiveConfig` — stable SHA-256 over the effective config,
14
+ * serialized with deterministically-sorted keys, returned as
15
+ * `sha256:<hex>`. Emitted via the `X-Atomicmem-Effective-Config-Hash`
16
+ * response header so callers can link traces to a canonical config
17
+ * fingerprint.
18
+ *
19
+ * 3. `summarizeOverrideKeys` — comma-separated list of top-level keys
20
+ * present in the override object, for the
21
+ * `X-Atomicmem-Config-Override-Keys` header.
22
+ *
23
+ * Design reference: atomicmemory-research/docs/core-repo/design/
24
+ * per-request-config-override.md §2.3, §2.5.
25
+ */
26
+ import type { RuntimeConfig } from '../config.js';
27
+ /** Merge a validated override on top of the startup runtime config. */
28
+ export declare function applyConfigOverride(base: RuntimeConfig, override: Partial<RuntimeConfig>): RuntimeConfig;
29
+ /**
30
+ * SHA-256 fingerprint of the effective config. Keys are sorted before
31
+ * serialization so the hash is stable regardless of construction order.
32
+ * Returned in the `sha256:<hex>` form emitted on the response header.
33
+ */
34
+ export declare function hashEffectiveConfig(cfg: RuntimeConfig): string;
35
+ /** Comma-separated list of keys present in the override object. */
36
+ export declare function summarizeOverrideKeys(override: Partial<RuntimeConfig>): string;
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @file Per-request config overlay primitives.
3
+ *
4
+ * Supports the `config_override` request-body field on memory ingest
5
+ * and search routes. Three responsibilities:
6
+ *
7
+ * 1. `applyConfigOverride` — shallow-merge a validated flat override
8
+ * onto the startup `RuntimeConfig`. Because the override shape
9
+ * matches the flat `RuntimeConfig` field names one-for-one, this
10
+ * is a genuine single-line `{ ...base, ...override }` — no
11
+ * mapping layer, no nested traversal.
12
+ *
13
+ * 2. `hashEffectiveConfig` — stable SHA-256 over the effective config,
14
+ * serialized with deterministically-sorted keys, returned as
15
+ * `sha256:<hex>`. Emitted via the `X-Atomicmem-Effective-Config-Hash`
16
+ * response header so callers can link traces to a canonical config
17
+ * fingerprint.
18
+ *
19
+ * 3. `summarizeOverrideKeys` — comma-separated list of top-level keys
20
+ * present in the override object, for the
21
+ * `X-Atomicmem-Config-Override-Keys` header.
22
+ *
23
+ * Design reference: atomicmemory-research/docs/core-repo/design/
24
+ * per-request-config-override.md §2.3, §2.5.
25
+ */
26
+ import { createHash } from 'node:crypto';
27
+ /** Merge a validated override on top of the startup runtime config. */
28
+ export function applyConfigOverride(base, override) {
29
+ return { ...base, ...override };
30
+ }
31
+ /**
32
+ * SHA-256 fingerprint of the effective config. Keys are sorted before
33
+ * serialization so the hash is stable regardless of construction order.
34
+ * Returned in the `sha256:<hex>` form emitted on the response header.
35
+ */
36
+ export function hashEffectiveConfig(cfg) {
37
+ const canonical = JSON.stringify(cfg, Object.keys(cfg).sort());
38
+ const hex = createHash('sha256').update(canonical).digest('hex');
39
+ return `sha256:${hex}`;
40
+ }
41
+ /** Comma-separated list of keys present in the override object. */
42
+ export function summarizeOverrideKeys(override) {
43
+ return Object.keys(override).sort().join(',');
44
+ }
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Provenance-first retrieval formatting helpers.
3
+ *
4
+ * Supports two modes:
5
+ * - Full: each memory's complete content is included (default)
6
+ * - Staged (L0): only summaries are included, with memory IDs for
7
+ * on-demand expansion via POST /v1/memories/expand. Reduces injection
8
+ * tokens by ~80% for typical workloads.
9
+ */
10
+ import type { Reflection } from '../db/reflections-repository.js';
11
+ import type { EventChain } from './event-chain-detector.js';
12
+ import { QuestionType } from './answer-format.js';
13
+ import type { SearchResult } from '../db/memory-repository.js';
14
+ import type { TierAssignment } from './tiered-loading.js';
15
+ import type { RetrievalMode } from './memory-service-types.js';
16
+ /**
17
+ * Packaging observability signal — records whether and how packaging
18
+ * reordered memories vs. raw retrieval score order. Enables A/B evals
19
+ * to distinguish packaging-caused flips from retrieval noise.
20
+ */
21
+ export interface PackagingSignal {
22
+ /** True if packaging changed the memory order from score-descending. */
23
+ reordered: boolean;
24
+ /** Number of distinct episodes (sessions) in the result set. */
25
+ episodeCount: number;
26
+ /** Number of memories classified as answer-bearing by session-packaging heuristics. */
27
+ answerBearingCount: number;
28
+ /** Number of memories classified as context (non-answer-bearing). */
29
+ contextCount: number;
30
+ /** Kendall tau distance: number of pairwise swaps between score order and packaged order (0 = identical). */
31
+ reorderDistance: number;
32
+ }
33
+ /**
34
+ * Compare score-descending order to the order produced by packaging
35
+ * (session-priority sort, answer-bearing promotion, chronological).
36
+ */
37
+ export declare function computePackagingSignal(memories: SearchResult[]): PackagingSignal;
38
+ export interface RetrievalCitation {
39
+ memory_id: string;
40
+ source_site: string;
41
+ created_at: string;
42
+ importance: number;
43
+ }
44
+ /**
45
+ * Recap row promoted into the injection's `## EPISODES` channel.
46
+ * One element per recap; `topic` becomes the section header and
47
+ * `narrative` is the synthesized recap text.
48
+ */
49
+ export interface EpisodeForInjection {
50
+ topic: string;
51
+ narrative: string;
52
+ }
53
+ export interface RetrievalFormatOptions {
54
+ stagedLoadingEnabled?: boolean;
55
+ userProfileText?: string;
56
+ episodes?: EpisodeForInjection[];
57
+ entityFacts?: import('./episode-fetcher.js').EntityFactForInjection[];
58
+ }
59
+ export declare function buildCitations(memories: SearchResult[]): RetrievalCitation[];
60
+ /** Simple dash-delimited injection format (no XML). */
61
+ export declare function formatSimpleInjection(memories: SearchResult[]): string;
62
+ export declare function formatInjection(memories: SearchResult[], options?: RetrievalFormatOptions): string;
63
+ export interface FormatTieredOptions {
64
+ /**
65
+ * When `false`, the renderer omits the trailing temporal evidence
66
+ * block / timeline summary entirely. The caller is responsible for
67
+ * setting this when the budget can't fit the extra-block tokens
68
+ * after the included memories are accounted for — without this
69
+ * escape hatch, the rendered injection would silently exceed the
70
+ * caller's `tokenBudget`. Default `true` preserves prior behavior.
71
+ */
72
+ includeExtraBlock?: boolean;
73
+ }
74
+ /**
75
+ * Format injection using tier assignments from the budget allocator.
76
+ * Uses a compact line-oriented format so tier metadata does not erase
77
+ * the token savings from L0/L1 compression.
78
+ *
79
+ * Iteration is driven off `assignments`: the rendered output contains
80
+ * exactly the memories named by the assignment list, in chronological
81
+ * order. Memories present in the input but missing from `assignments`
82
+ * are not rendered — that's how excluded-by-budget memories stay
83
+ * absent from the package. Throws when an assignment references a
84
+ * memory id that isn't in the input list (caller bug).
85
+ */
86
+ export declare function formatTieredInjection(memories: SearchResult[], assignments: TierAssignment[], query?: string, options?: FormatTieredOptions): string;
87
+ export interface InjectionBuildResult {
88
+ injectionText: string;
89
+ tierAssignments?: TierAssignment[];
90
+ expandIds?: string[];
91
+ estimatedContextTokens?: number;
92
+ /**
93
+ * True when the requested token budget changed the package content
94
+ * relative to the unconstrained tiered package — either eligible
95
+ * memories were omitted because their L0 representation did not fit,
96
+ * or eligible memories were kept at a reduced tier solely because
97
+ * the budget prevented richer eligible content (including
98
+ * query-term-revealing upgrades). Quota-driven demotion (e.g.
99
+ * MAX_L2_MEMORIES) is packaging policy and is NOT flagged.
100
+ */
101
+ budgetConstrained: boolean;
102
+ /**
103
+ * Memories that actually contributed to the rendered package.
104
+ * In tiered mode this is `deduplicateCompositeMembersHard(memories) - excluded`.
105
+ * In flat mode this equals the input memories. Downstream consumers
106
+ * (response.memories, citations, side effects) should use this set
107
+ * so what they see matches what was injected.
108
+ */
109
+ includedMemories: SearchResult[];
110
+ }
111
+ /**
112
+ * Build injection text from search results, optionally using tiered packaging.
113
+ * Flat mode returns the existing chronological format.
114
+ * Tiered mode assigns L0/L1/L2 tiers under the caller's token budget.
115
+ * When no token budget is provided, tiered packaging is unbounded:
116
+ * quotas still shape rich-detail tiers, but budget_constrained remains
117
+ * false because no caller budget was applied.
118
+ */
119
+ export declare function buildInjection(memories: SearchResult[], query: string, mode: RetrievalMode, tokenBudget?: number, userProfileText?: string, episodes?: EpisodeForInjection[], entityFacts?: import('./episode-fetcher.js').EntityFactForInjection[], chains?: EventChain[], reflections?: readonly Reflection[], questionType?: QuestionType): InjectionBuildResult;