@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,559 @@
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 { config } from '../config.js';
11
+ import { applyFormatHint, QuestionType } from './answer-format.js';
12
+ import { shouldApplyFormatHint, shouldEmitEventChain, shouldEmitObservations, } from './retrieval-channel-rules.js';
13
+ import { assignTiers as assignTierBudgets, estimateTokens, getContentAtTier, } from './tiered-loading.js';
14
+ import { isAnswerBearing, sortBySessionPriority } from './session-packaging.js';
15
+ import { deduplicateCompositeMembersHard } from './composite-dedup.js';
16
+ import { prefersAbstractAwareRetrieval } from './abstract-query-policy.js';
17
+ import { escapeXml } from '../xml-escape.js';
18
+ import { spansMultipleDates, buildTimelinePack, formatTimelinePack } from './timeline-pack.js';
19
+ import { buildTemporalEvidenceBlock } from './temporal-endpoint-evidence.js';
20
+ import { preserveQueryTermVisibility, sumAssignmentTokens } from './query-term-visibility.js';
21
+ import { formatDateLabel, formatDuration } from './temporal-format.js';
22
+ /**
23
+ * Compare score-descending order to the order produced by packaging
24
+ * (session-priority sort, answer-bearing promotion, chronological).
25
+ */
26
+ export function computePackagingSignal(memories) {
27
+ if (memories.length === 0) {
28
+ return { reordered: false, episodeCount: 0, answerBearingCount: 0, contextCount: 0, reorderDistance: 0 };
29
+ }
30
+ const scoreOrder = [...memories].sort((a, b) => b.score - a.score).map((m) => m.id);
31
+ const packagedOrder = sortBySessionPriority(memories).map((m) => m.id);
32
+ const reordered = !scoreOrder.every((id, i) => id === packagedOrder[i]);
33
+ const episodeCount = new Set(memories.map((m) => m.episode_id).filter(Boolean)).size;
34
+ const answerBearingCount = memories.filter((m) => isAnswerBearing(m.content)).length;
35
+ const contextCount = memories.length - answerBearingCount;
36
+ const reorderDistance = kendallTauDistance(scoreOrder, packagedOrder);
37
+ return { reordered, episodeCount, answerBearingCount, contextCount, reorderDistance };
38
+ }
39
+ /** Count pairwise inversions between two orderings of the same IDs. */
40
+ function kendallTauDistance(orderA, orderB) {
41
+ const posB = new Map(orderB.map((id, i) => [id, i]));
42
+ let inversions = 0;
43
+ for (let i = 0; i < orderA.length; i++) {
44
+ for (let j = i + 1; j < orderA.length; j++) {
45
+ const posI = posB.get(orderA[i]) ?? 0;
46
+ const posJ = posB.get(orderA[j]) ?? 0;
47
+ if (posI > posJ)
48
+ inversions++;
49
+ }
50
+ }
51
+ return inversions;
52
+ }
53
+ function buildEpisodesChannel(episodes) {
54
+ const sections = episodes.map((ep, i) => `### Episode ${i + 1}: ${ep.topic}\n${ep.narrative}`);
55
+ return `## EPISODES\n${sections.join('\n\n')}`;
56
+ }
57
+ function buildFactsChannel(facts) {
58
+ if (facts.length === 0)
59
+ return '';
60
+ const lines = facts
61
+ .map((f) => `- (${f.entity}.${f.attribute} = ${f.value}) [as of ${f.observedAt.toISOString().slice(0, 10)}]`)
62
+ .join('\n');
63
+ return `## FACTS\n${lines}`;
64
+ }
65
+ export function buildCitations(memories) {
66
+ return memories.map((memory) => ({
67
+ memory_id: memory.id,
68
+ source_site: memory.source_site,
69
+ created_at: memory.created_at.toISOString(),
70
+ importance: memory.importance,
71
+ }));
72
+ }
73
+ /**
74
+ * Effective timestamp for packaging. When enabled, observed_at represents
75
+ * the conversation-time ordering while created_at remains the ingest time.
76
+ */
77
+ function pickPackagingDate(memory) {
78
+ if (config.packagingUseObservedAt && memory.observed_at)
79
+ return memory.observed_at;
80
+ return memory.created_at;
81
+ }
82
+ /** Sort memories by effective packaging date ascending. */
83
+ function sortChronologically(memories) {
84
+ return [...memories].sort((a, b) => pickPackagingDate(a).getTime() - pickPackagingDate(b).getTime());
85
+ }
86
+ /**
87
+ * A2 injection: session-priority sort with answer-bearing tags, grouped by
88
+ * namespace. Flat subject headers for all groups (no timeline packs).
89
+ * Used by the packaging ablation to isolate session-pack effects from
90
+ * timeline-pack effects.
91
+ */
92
+ function formatSessionPackInjection(memories) {
93
+ if (memories.length === 0)
94
+ return '';
95
+ const groups = groupByNamespace(memories);
96
+ const sections = [...groups.entries()].map(([ns, groupMemories]) => formatSubjectSection(ns, groupMemories));
97
+ return appendTemporalSummary(sections, memories);
98
+ }
99
+ /** Simple dash-delimited injection format (no XML). */
100
+ export function formatSimpleInjection(memories) {
101
+ if (memories.length === 0)
102
+ return '';
103
+ const groups = groupByNamespace(memories);
104
+ const sections = [...groups.entries()].map(([ns, groupMemories]) => {
105
+ if (spansMultipleDates(groupMemories)) {
106
+ const pack = buildTimelinePack(ns, groupMemories);
107
+ return formatTimelinePack(pack);
108
+ }
109
+ return formatSubjectSection(ns, groupMemories);
110
+ });
111
+ return appendTemporalSummary(sections, memories);
112
+ }
113
+ /** Group memories by namespace for subject-partitioned injection. */
114
+ function groupByNamespace(memories) {
115
+ const groups = new Map();
116
+ for (const m of memories) {
117
+ const ns = m.namespace || 'general';
118
+ if (!groups.has(ns))
119
+ groups.set(ns, []);
120
+ groups.get(ns).push(m);
121
+ }
122
+ return groups;
123
+ }
124
+ /** Format a single namespace group as a subject section with answer/context labels. */
125
+ function formatSubjectSection(ns, groupMemories) {
126
+ const sorted = sortBySessionPriority(groupMemories);
127
+ const lines = sorted.map((m) => {
128
+ const date = pickPackagingDate(m).toISOString().slice(0, 10);
129
+ const kind = isAnswerBearing(m.content) ? 'answer' : 'context';
130
+ return `- [${date}] [${kind}] ${m.content}`;
131
+ }).join('\n');
132
+ return `### Subject: ${ns}\n${lines}`;
133
+ }
134
+ /** Join sections and append temporal summary if present. */
135
+ function appendTemporalSummary(sections, memories) {
136
+ const sortedAll = sortChronologically(memories);
137
+ const timeline = buildTemporalSummary(sortedAll);
138
+ const mainContent = sections.join('\n\n');
139
+ return timeline ? `${mainContent}\n\n${timeline}` : mainContent;
140
+ }
141
+ /**
142
+ * Build a timeline summary with computed time gaps between distinct dates.
143
+ * Helps weak LLMs answer temporal questions without doing date arithmetic.
144
+ */
145
+ function buildTemporalSummary(sortedMemories) {
146
+ const uniqueDates = getUniqueDates(sortedMemories);
147
+ if (uniqueDates.length < 2)
148
+ return '';
149
+ const gaps = [];
150
+ for (let i = 1; i < uniqueDates.length; i++) {
151
+ const prev = uniqueDates[i - 1];
152
+ const curr = uniqueDates[i];
153
+ const diffMs = curr.getTime() - prev.getTime();
154
+ const diffDays = Math.round(diffMs / 86400000);
155
+ if (diffDays === 0)
156
+ continue;
157
+ const duration = formatDuration(diffDays);
158
+ gaps.push(`- ${formatDateLabel(prev)} → ${formatDateLabel(curr)}: ${duration}`);
159
+ }
160
+ if (gaps.length === 0)
161
+ return '';
162
+ const first = uniqueDates[0];
163
+ const last = uniqueDates[uniqueDates.length - 1];
164
+ const totalDays = Math.round((last.getTime() - first.getTime()) / 86400000);
165
+ const totalLine = `Total span: ${formatDateLabel(first)} to ${formatDateLabel(last)} (${formatDuration(totalDays)})`;
166
+ const evidenceLines = buildTemporalEvidenceLines(sortedMemories, uniqueDates);
167
+ const evidenceBlock = evidenceLines.length > 0
168
+ ? `\nKey temporal evidence:\n${evidenceLines.join('\n')}`
169
+ : '';
170
+ return `Timeline:\n${gaps.join('\n')}\n${totalLine}${evidenceBlock}`;
171
+ }
172
+ function getUniqueDates(memories) {
173
+ const seen = new Set();
174
+ const dates = [];
175
+ for (const m of memories) {
176
+ const ts = pickPackagingDate(m);
177
+ const key = ts.toISOString().slice(0, 10);
178
+ if (!seen.has(key)) {
179
+ seen.add(key);
180
+ dates.push(ts);
181
+ }
182
+ }
183
+ return dates;
184
+ }
185
+ function buildTemporalEvidenceLines(memories, dates) {
186
+ return dates
187
+ .slice(0, 4)
188
+ .map((date) => buildTemporalEvidenceLine(memories, date))
189
+ .filter((line) => line !== null);
190
+ }
191
+ function buildTemporalEvidenceLine(memories, date) {
192
+ const key = formatDateLabel(date);
193
+ const sameDate = memories.filter((memory) => formatDateLabel(pickPackagingDate(memory)) === key);
194
+ const selected = sameDate.find((memory) => isAnswerBearing(memory.content)) ?? sameDate[0];
195
+ if (!selected)
196
+ return null;
197
+ return `- ${key}: ${truncateTemporalEvidence(selected.content)}`;
198
+ }
199
+ function truncateTemporalEvidence(content) {
200
+ const normalized = content.replace(/\s+/g, ' ').trim();
201
+ if (normalized.length <= 180)
202
+ return normalized;
203
+ return `${normalized.slice(0, 177)}...`;
204
+ }
205
+ const MIN_AFTER_FILTER = 3;
206
+ const DEDUP_FINGERPRINT_PREFIX = 80;
207
+ function answerOnlyFilter(memories) {
208
+ if (!config.answerOnlyRetrievalFilter)
209
+ return memories;
210
+ const filtered = memories.filter((memory) => isAnswerBearing(memory.content));
211
+ return filtered.length >= MIN_AFTER_FILTER ? filtered : memories;
212
+ }
213
+ function contentFingerprint(content) {
214
+ return content.toLowerCase().replace(/[^a-z0-9]/g, '').slice(0, DEDUP_FINGERPRINT_PREFIX);
215
+ }
216
+ function dedupNearDuplicates(memories) {
217
+ if (!config.retrievalDedupEnabled)
218
+ return memories;
219
+ const seen = new Set();
220
+ const result = [];
221
+ for (const memory of memories) {
222
+ const fingerprint = contentFingerprint(memory.content);
223
+ if (fingerprint.length === 0) {
224
+ result.push(memory);
225
+ continue;
226
+ }
227
+ if (seen.has(fingerprint))
228
+ continue;
229
+ seen.add(fingerprint);
230
+ result.push(memory);
231
+ }
232
+ return result.length >= MIN_AFTER_FILTER ? result : memories;
233
+ }
234
+ export function formatInjection(memories, options = {}) {
235
+ const filteredMemories = dedupNearDuplicates(answerOnlyFilter(memories));
236
+ const hasProfile = !!options.userProfileText && options.userProfileText.trim().length > 0;
237
+ const hasEpisodes = !!options.episodes && options.episodes.length > 0;
238
+ const hasFacts = !!options.entityFacts && options.entityFacts.length > 0;
239
+ if (filteredMemories.length === 0 && !hasProfile && !hasEpisodes && !hasFacts)
240
+ return '';
241
+ const stagedLoadingEnabled = options.stagedLoadingEnabled ?? config.stagedLoadingEnabled;
242
+ const profileBlock = hasProfile ? `## USER PROFILE\n${options.userProfileText}\n\n` : '';
243
+ const factsBlock = hasFacts ? `${buildFactsChannel(options.entityFacts)}\n\n` : '';
244
+ const episodesBlock = hasEpisodes ? `${buildEpisodesChannel(options.episodes)}\n\n` : '';
245
+ const body = filteredMemories.length === 0
246
+ ? ''
247
+ : (stagedLoadingEnabled ? formatStagedInjection(filteredMemories) : formatFullInjection(filteredMemories));
248
+ return `${profileBlock}${factsBlock}${episodesBlock}${body}`;
249
+ }
250
+ function formatFullInjection(memories) {
251
+ const sorted = sortChronologically(memories);
252
+ const lines = sorted.map((memory, index) => formatFullLine(memory, index));
253
+ const body = `<atomicmem_context count="${memories.length}">\n${lines.join('\n')}\n</atomicmem_context>`;
254
+ const timeline = config.timelineChannelEnabled ? buildTimelineChannel(memories) : '';
255
+ return timeline ? `${timeline}\n\n${body}` : body;
256
+ }
257
+ function buildTimelineChannel(memories) {
258
+ const dates = memories
259
+ .map((m) => m.observed_at)
260
+ .filter((d) => d instanceof Date)
261
+ .sort((a, b) => a.getTime() - b.getTime());
262
+ if (dates.length === 0)
263
+ return '';
264
+ const seen = new Set();
265
+ const unique = [];
266
+ for (const d of dates) {
267
+ const key = d.toISOString().slice(0, 10);
268
+ if (!seen.has(key)) {
269
+ seen.add(key);
270
+ unique.push(key);
271
+ }
272
+ }
273
+ const lines = unique.map((d) => `- ${d}`).join('\n');
274
+ return `## TIMELINE\n${lines}`;
275
+ }
276
+ function formatStagedInjection(memories) {
277
+ const sorted = sortChronologically(memories);
278
+ const lines = sorted.map((memory, index) => formatStagedLine(memory, index));
279
+ const ids = sorted.map((m) => m.id).join(',');
280
+ return [
281
+ `<atomicmem_context count="${memories.length}" mode="staged" expand_ids="${ids}">`,
282
+ lines.join('\n'),
283
+ '<expand_hint>To see full content for any memory, request expansion by ID.</expand_hint>',
284
+ '</atomicmem_context>',
285
+ ].join('\n');
286
+ }
287
+ function formatFullLine(memory, index) {
288
+ const attrs = buildCommonAttrs(memory, index);
289
+ return `<memory ${attrs}>\n${escapeXml(memory.content)}\n</memory>`;
290
+ }
291
+ function formatStagedLine(memory, index) {
292
+ const attrs = buildCommonAttrs(memory, index);
293
+ const summary = memory.summary || truncateContent(memory.content);
294
+ return `<memory ${attrs} staged="true">\n${escapeXml(summary)}\n</memory>`;
295
+ }
296
+ function buildCommonAttrs(memory, index) {
297
+ const date = pickPackagingDate(memory);
298
+ const attrs = [
299
+ `index="${index + 1}"`,
300
+ `source="${escapeXml(memory.source_site)}"`,
301
+ `memory_id="${memory.id}"`,
302
+ `created_at="${memory.created_at.toISOString()}"`,
303
+ ];
304
+ if (config.packagingDualDate
305
+ && memory.observed_at
306
+ && memory.observed_at.getTime() !== memory.created_at.getTime()) {
307
+ attrs.push(`observed_at="${memory.observed_at.toISOString()}"`);
308
+ }
309
+ attrs.push(`importance="${memory.importance.toFixed(1)}"`, `similarity="${memory.similarity.toFixed(2)}"`, `score="${memory.score.toFixed(2)}"`, `age="${formatAge(date)}"`);
310
+ return attrs.join(' ');
311
+ }
312
+ const STAGED_TRUNCATE_LENGTH = 60;
313
+ /** Fallback when no summary is stored: first 60 chars + ellipsis. */
314
+ function truncateContent(content) {
315
+ if (content.length <= STAGED_TRUNCATE_LENGTH)
316
+ return content;
317
+ return content.slice(0, STAGED_TRUNCATE_LENGTH) + '...';
318
+ }
319
+ /**
320
+ * Format injection using tier assignments from the budget allocator.
321
+ * Uses a compact line-oriented format so tier metadata does not erase
322
+ * the token savings from L0/L1 compression.
323
+ *
324
+ * Iteration is driven off `assignments`: the rendered output contains
325
+ * exactly the memories named by the assignment list, in chronological
326
+ * order. Memories present in the input but missing from `assignments`
327
+ * are not rendered — that's how excluded-by-budget memories stay
328
+ * absent from the package. Throws when an assignment references a
329
+ * memory id that isn't in the input list (caller bug).
330
+ */
331
+ export function formatTieredInjection(memories, assignments, query = '', options = {}) {
332
+ if (assignments.length === 0)
333
+ return '';
334
+ const memoryById = new Map(memories.map((m) => [m.id, m]));
335
+ const tierById = new Map(assignments.map((a) => [a.memoryId, a.tier]));
336
+ const assignedMemories = assignments.map((a) => {
337
+ const memory = memoryById.get(a.memoryId);
338
+ if (!memory) {
339
+ throw new Error(`formatTieredInjection: assignment references missing memory id "${a.memoryId}"`);
340
+ }
341
+ return memory;
342
+ });
343
+ const sorted = sortChronologically(assignedMemories);
344
+ const lines = sorted.map((memory) => formatTieredLine(memory, tierById.get(memory.id)));
345
+ const expandableIds = assignments
346
+ .filter((a) => a.tier !== 'L2')
347
+ .map((a) => a.memoryId)
348
+ .join(',');
349
+ const sections = expandableIds
350
+ ? [lines.join('\n'), `Expandable IDs: ${expandableIds}`]
351
+ : [lines.join('\n')];
352
+ if (options.includeExtraBlock === false)
353
+ return sections.join('\n\n');
354
+ const temporalEvidenceBlock = buildTemporalEvidenceBlock(sorted, query);
355
+ if (temporalEvidenceBlock) {
356
+ return [...sections, temporalEvidenceBlock].join('\n\n');
357
+ }
358
+ return appendTemporalSummary(sections, sorted);
359
+ }
360
+ function buildEventChainChannel(chains, enabled) {
361
+ if (!enabled || !chains || chains.length === 0)
362
+ return '';
363
+ const top = chains[0];
364
+ const lines = top.members.map((m, i) => {
365
+ const date = m.observedAt.toISOString().slice(0, 10);
366
+ return `${i + 1}) [${date}] ${m.text}`;
367
+ });
368
+ return `## EVENT_CHAIN [entity: ${top.entity}] (chronological)\n${lines.join('\n')}`;
369
+ }
370
+ function buildObservationsChannel(reflections) {
371
+ if (!reflections || reflections.length === 0)
372
+ return '';
373
+ const lines = reflections.map((r) => {
374
+ const evidence = r.evidenceMemoryIds.join(', ');
375
+ return `- [${r.observationType}] ${r.observation}\n evidence: ${evidence}`;
376
+ });
377
+ return `## OBSERVATIONS\n${lines.join('\n')}\n\n`;
378
+ }
379
+ function formatTieredLine(memory, tier) {
380
+ const date = pickPackagingDate(memory).toISOString().slice(0, 10);
381
+ const kind = memory.memory_type === 'composite' ? 'composite' : 'atomic';
382
+ const content = getContentAtTier(memory, tier);
383
+ return `- [${date}] [${tier}] [${kind}] ${content}`;
384
+ }
385
+ function formatAge(date) {
386
+ const hours = (Date.now() - date.getTime()) / 3600000;
387
+ if (hours < 1)
388
+ return 'just now';
389
+ if (hours < 24)
390
+ return `${Math.round(hours)}h ago`;
391
+ const days = Math.round(hours / 24);
392
+ if (days < 30)
393
+ return `${days}d ago`;
394
+ return `${Math.round(days / 30)}mo ago`;
395
+ }
396
+ const UNBOUNDED_INJECTION_TOKEN_BUDGET = Number.POSITIVE_INFINITY;
397
+ /**
398
+ * Build injection text from search results, optionally using tiered packaging.
399
+ * Flat mode returns the existing chronological format.
400
+ * Tiered mode assigns L0/L1/L2 tiers under the caller's token budget.
401
+ * When no token budget is provided, tiered packaging is unbounded:
402
+ * quotas still shape rich-detail tiers, but budget_constrained remains
403
+ * false because no caller budget was applied.
404
+ */
405
+ export function buildInjection(memories, query, mode, tokenBudget, userProfileText, episodes, entityFacts, chains, reflections, questionType = QuestionType.OTHER) {
406
+ const prefix = buildPromptChannelPrefix(userProfileText, episodes, entityFacts, chains, reflections, questionType);
407
+ const applyHint = shouldApplyFormatHint(questionType) && config.answerFormatAlignmentEnabled;
408
+ if (memories.length === 0) {
409
+ const text = applyHint && prefix ? applyFormatHint(prefix, query, true) : prefix;
410
+ return { injectionText: text, budgetConstrained: false, includedMemories: [] };
411
+ }
412
+ if (mode === 'flat') {
413
+ const body = `${prefix}${formatSimpleInjection(memories)}`;
414
+ return {
415
+ injectionText: applyHint ? applyFormatHint(body, query, true) : body,
416
+ budgetConstrained: false,
417
+ includedMemories: memories,
418
+ };
419
+ }
420
+ const tiered = buildTieredInjection(memories, query, mode, tokenBudget);
421
+ const body = `${prefix}${tiered.injectionText}`;
422
+ return {
423
+ ...tiered,
424
+ injectionText: applyHint ? applyFormatHint(body, query, true) : body,
425
+ };
426
+ }
427
+ function buildPromptChannelPrefix(userProfileText, episodes, entityFacts, chains, reflections, questionType) {
428
+ const profile = userProfileText?.trim();
429
+ const profileBlock = profile ? `## USER PROFILE\n${profile}\n\n` : '';
430
+ const factsBlock = entityFacts && entityFacts.length > 0 ? `${buildFactsChannel(entityFacts)}\n\n` : '';
431
+ const episodesBlock = episodes && episodes.length > 0 ? `${buildEpisodesChannel(episodes)}\n\n` : '';
432
+ const observationsBlock = shouldEmitObservations(questionType)
433
+ ? buildObservationsChannel(reflections)
434
+ : '';
435
+ const rawChainSection = shouldEmitEventChain(questionType)
436
+ ? buildEventChainChannel(chains, config.eventChainPackagingEnabled)
437
+ : '';
438
+ const eventChainBlock = rawChainSection ? `${rawChainSection}\n\n` : '';
439
+ return `${profileBlock}${factsBlock}${episodesBlock}${observationsBlock}${eventChainBlock}`;
440
+ }
441
+ /**
442
+ * Tiered-mode package: dedupe composites, reserve tokens for the
443
+ * "extra block" the renderer will append (temporal evidence on
444
+ * temporal queries, timeline summary otherwise — see
445
+ * `computeRenderedExtraTokens`) using a conservative upper-bound from
446
+ * the full deduplicated set, capped so the highest-ranked (top of
447
+ * list) memory's L0 always fits — see `computeExtraBlockReservation`.
448
+ * L0-fit + tier-assign on whatever survives. If the included
449
+ * memories' rendered tokens plus the actual extra block would
450
+ * overflow the budget, drop the extra block and rerun allocation
451
+ * with the full budget so the reserved tokens aren't wasted. Render
452
+ * and report from the surviving subset only.
453
+ */
454
+ function buildTieredInjection(memories, query, mode, tokenBudget) {
455
+ const deduplicated = deduplicateCompositeMembersHard(memories);
456
+ const budget = tokenBudget ?? UNBOUNDED_INJECTION_TOKEN_BUDGET;
457
+ const forceRichTopHit = prefersAbstractAwareRetrieval(mode, query);
458
+ // First pass: reserve budget for the extra block.
459
+ const reservation = computeExtraBlockReservation(deduplicated, query, budget);
460
+ let pass = runTieredPass(deduplicated, query, reservation.assignmentBudget, forceRichTopHit);
461
+ let extraBlockTokens = computeRenderedExtraTokens(pass.tier.includedMemories, query);
462
+ let extraBlockOmitted = false;
463
+ // If the extra block won't fit alongside the included memories, the
464
+ // reserved tokens are now wasted: rerun allocation against the FULL
465
+ // budget and render without the extra block. Without this second
466
+ // pass, the reservation cap silently shrinks the package even
467
+ // though the omitted block freed those tokens. Deterministic — no
468
+ // iteration, no timing.
469
+ if (pass.sumAssignments + extraBlockTokens > budget) {
470
+ extraBlockOmitted = true;
471
+ pass = runTieredPass(deduplicated, query, budget, forceRichTopHit);
472
+ extraBlockTokens = 0;
473
+ }
474
+ if (pass.tier.includedMemories.length === 0) {
475
+ return {
476
+ injectionText: '',
477
+ budgetConstrained: pass.tier.excludedMemoryIds.length > 0 || reservation.reservationCapped,
478
+ includedMemories: [],
479
+ };
480
+ }
481
+ const expandIds = pass.visibility.assignments.filter((a) => a.tier !== 'L2').map((a) => a.memoryId);
482
+ return {
483
+ injectionText: formatTieredInjection(pass.tier.includedMemories, pass.visibility.assignments, query, { includeExtraBlock: !extraBlockOmitted }),
484
+ tierAssignments: pass.visibility.assignments,
485
+ expandIds: expandIds.length > 0 ? expandIds : undefined,
486
+ estimatedContextTokens: pass.sumAssignments + extraBlockTokens,
487
+ budgetConstrained: computeBudgetConstrained(pass.tier, pass.visibility, reservation.reservationCapped, extraBlockOmitted),
488
+ includedMemories: pass.tier.includedMemories,
489
+ };
490
+ }
491
+ /**
492
+ * Run one allocation pass: tier-assign within `assignmentBudget`,
493
+ * then run query-term-visibility upgrades within the same budget.
494
+ * Returns empty-but-shaped state when no memory survives L0-fit so
495
+ * the caller can branch on `tier.includedMemories.length` without
496
+ * defensive nullability checks.
497
+ */
498
+ function runTieredPass(deduplicated, query, assignmentBudget, forceRichTopHit) {
499
+ const tier = assignTierBudgets(deduplicated, assignmentBudget, { forceRichTopHit });
500
+ if (tier.includedMemories.length === 0) {
501
+ return { tier, visibility: { assignments: [], budgetBlockedVisibilityIds: [] }, sumAssignments: 0 };
502
+ }
503
+ const visibility = preserveQueryTermVisibility(tier.includedMemories, tier.assignments, query, assignmentBudget);
504
+ return { tier, visibility, sumAssignments: sumAssignmentTokens(visibility.assignments) };
505
+ }
506
+ /**
507
+ * Reserve tokens for whatever extra block `formatTieredInjection`
508
+ * will append (temporal evidence OR timeline summary), capped so the
509
+ * highest-ranked memory's L0 representation can still fit. The cap is
510
+ * rank-aware (top of the list), not min-anywhere, because
511
+ * `selectL0Fit` does strict tail exclusion: a memory only enters the
512
+ * included set if every higher-ranked memory has already fit. A min-
513
+ * anywhere cap would leave room for a smaller lower-ranked memory
514
+ * while excluding the top, blanking the rendered package. When
515
+ * capping actually trims the desired reservation, surface that as a
516
+ * budget-constrained signal.
517
+ */
518
+ function computeExtraBlockReservation(deduplicated, query, budget) {
519
+ const desired = computeRenderedExtraTokens(deduplicated, query);
520
+ if (desired === 0) {
521
+ return { assignmentBudget: budget, reservationCapped: false };
522
+ }
523
+ const topL0 = deduplicated.length === 0
524
+ ? 0
525
+ : estimateTokens(getContentAtTier(deduplicated[0], 'L0'));
526
+ const maxReservation = Math.max(0, budget - topL0);
527
+ const reservation = Math.min(desired, maxReservation);
528
+ return {
529
+ assignmentBudget: Math.max(0, budget - reservation),
530
+ reservationCapped: reservation < desired,
531
+ };
532
+ }
533
+ /**
534
+ * Token cost of whatever extra block `formatTieredInjection` will
535
+ * append for these memories + this query. Mirrors the renderer's
536
+ * branch: try `buildTemporalEvidenceBlock` first; if empty, fall
537
+ * through to the timeline summary that `appendTemporalSummary`
538
+ * would emit. Keeping this in lockstep with the renderer is what
539
+ * guarantees `estimatedContextTokens` matches the rendered text —
540
+ * a previous version only counted the endpoint block, missing
541
+ * timeline tokens on non-temporal queries with multi-date memories.
542
+ */
543
+ function computeRenderedExtraTokens(memories, query) {
544
+ if (memories.length === 0)
545
+ return 0;
546
+ const sorted = sortChronologically(memories);
547
+ const endpoint = buildTemporalEvidenceBlock(sorted, query);
548
+ if (endpoint)
549
+ return estimateTokens(endpoint);
550
+ const timeline = buildTemporalSummary(sorted);
551
+ return timeline ? estimateTokens(timeline) : 0;
552
+ }
553
+ function computeBudgetConstrained(tier, visibility, reservationCapped, extraBlockOmitted) {
554
+ return (reservationCapped ||
555
+ extraBlockOmitted ||
556
+ tier.excludedMemoryIds.length > 0 ||
557
+ tier.budgetLimitedPromotionIds.length > 0 ||
558
+ visibility.budgetBlockedVisibilityIds.length > 0);
559
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Adaptive retrieval and repair-loop policy helpers.
3
+ */
4
+ import type { CoreRuntimeConfig } from '../app/runtime-container.js';
5
+ import type { SearchResult } from '../db/memory-repository.js';
6
+ export declare const AGGREGATION_QUERY_LIMIT = 25;
7
+ type AdaptiveLimitConfig = Pick<CoreRuntimeConfig, 'adaptiveRetrievalEnabled' | 'maxSearchResults' | 'adaptiveSimpleLimit' | 'adaptiveMediumLimit' | 'adaptiveComplexLimit' | 'adaptiveMultiHopLimit' | 'adaptiveAggregationLimit'>;
8
+ type RankingEligibilityConfig = Pick<CoreRuntimeConfig, 'retrievalProfileSettings'>;
9
+ export interface RankingEligibilityContext {
10
+ sourceSite?: string;
11
+ referenceTime?: Date;
12
+ }
13
+ export interface RecallBypassContext {
14
+ asOf?: string;
15
+ referenceTime?: Date;
16
+ sourceSite?: string;
17
+ }
18
+ export interface RankingEligibilityDecision {
19
+ id: string;
20
+ similarity: number;
21
+ threshold: number;
22
+ decision: 'eligible' | 'filtered';
23
+ reason: string;
24
+ }
25
+ export interface RankingEligibilityResult {
26
+ results: SearchResult[];
27
+ decisions: RankingEligibilityDecision[];
28
+ removedIds: string[];
29
+ threshold: number | null;
30
+ reason: string;
31
+ queryLabel: QueryComplexityLabel;
32
+ triggered: boolean;
33
+ }
34
+ export interface ResolvedLimit {
35
+ limit: number;
36
+ classification: QueryClassification;
37
+ }
38
+ export declare function resolveSearchLimit(query: string, requestedLimit: number | undefined, runtimeConfig: AdaptiveLimitConfig): number;
39
+ export declare function resolveSearchLimitDetailed(query: string, requestedLimit: number | undefined, runtimeConfig: AdaptiveLimitConfig): ResolvedLimit;
40
+ export declare function shouldRunRepairLoop(query: string, memories: SearchResult[], runtimeConfig: Pick<CoreRuntimeConfig, 'repairLoopEnabled' | 'repairLoopMinSimilarity'> & AdaptiveLimitConfig): boolean;
41
+ export interface RepairDecision {
42
+ accepted: boolean;
43
+ reason: 'no-repair-needed' | 'rewrite-unchanged' | 'delta-below-threshold' | 'below-confidence-floor' | 'sabotage-detected' | 'accepted';
44
+ initialTopSim: number;
45
+ repairedTopSim: number;
46
+ simDelta: number;
47
+ }
48
+ /**
49
+ * Decides whether to accept repaired results over initial results.
50
+ * Gates on two heuristics:
51
+ * 1. Similarity-delta anti-thrash: reject if top-1 similarity didn't improve enough.
52
+ * 2. Confidence floor: reject if repaired top-1 similarity is still too low.
53
+ * Both thresholds default to 0 (always accept) to preserve current behavior.
54
+ */
55
+ export declare function shouldAcceptRepair(initial: SearchResult[], repaired: SearchResult[], runtimeConfig: Pick<CoreRuntimeConfig, 'repairDeltaThreshold' | 'repairConfidenceFloor'>): RepairDecision;
56
+ export declare function mergeSearchResults(primary: SearchResult[], repair: SearchResult[], limit: number, runtimeConfig: Pick<CoreRuntimeConfig, 'retrievalProfileSettings' | 'maxSearchResults'>): SearchResult[];
57
+ export declare function resolveRerankDepth(limit: number, runtimeConfig: Pick<CoreRuntimeConfig, 'retrievalProfileSettings'>): number;
58
+ export declare function applyRankingEligibility(query: string, candidates: SearchResult[], runtimeConfig: RankingEligibilityConfig, context?: RankingEligibilityContext): RankingEligibilityResult;
59
+ export type QueryComplexityLabel = 'simple' | 'medium' | 'complex' | 'multi-hop' | 'aggregation';
60
+ export interface QueryClassification {
61
+ limit: number;
62
+ label: QueryComplexityLabel;
63
+ /** The marker that triggered a multi-hop or aggregation classification, if any. */
64
+ matchedMarker?: string;
65
+ }
66
+ export declare function classifyQueryDetailed(query: string): QueryClassification;
67
+ export declare function resolveRecallBypass(query: string, queryLabel: QueryComplexityLabel, context: RecallBypassContext): string | null;
68
+ export declare function isAggregationQuery(lowerQuery: string): boolean;
69
+ export {};