@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,50 @@
1
+ /**
2
+ * Composite staleness filtering for retrieval.
3
+ *
4
+ * Phase 1 policy from the composite-vs-atomic retrieval contract:
5
+ * exclude composites from default retrieval if any covered member memory is no
6
+ * longer active. This catches superseded members (expired), invalidated or
7
+ * deleted members, and dangling member IDs left behind after deletes.
8
+ */
9
+ export async function excludeStaleComposites(repo, userId, memories) {
10
+ const memberIds = collectCompositeMemberIds(memories);
11
+ if (memberIds.length === 0) {
12
+ return { filtered: memories, removedCompositeIds: [] };
13
+ }
14
+ const activeIds = await loadActiveMemberIds(repo, userId, memberIds);
15
+ const removedCompositeIds = [];
16
+ const filtered = memories.filter((memory) => {
17
+ if (!isComposite(memory))
18
+ return true;
19
+ if (!hasStaleMember(memory, activeIds))
20
+ return true;
21
+ removedCompositeIds.push(memory.id);
22
+ return false;
23
+ });
24
+ return { filtered, removedCompositeIds };
25
+ }
26
+ function collectCompositeMemberIds(memories) {
27
+ return [...new Set(memories
28
+ .filter(isComposite)
29
+ .flatMap((memory) => parseMemberIds(memory))
30
+ .filter((id) => typeof id === 'string'))];
31
+ }
32
+ async function loadActiveMemberIds(repo, userId, memberIds) {
33
+ const rows = await Promise.all(memberIds.map((id) => repo.getMemory(id, userId)));
34
+ return new Set(rows.filter((row) => row !== null).map((row) => row.id));
35
+ }
36
+ function hasStaleMember(memory, activeIds) {
37
+ const memberIds = parseMemberIds(memory);
38
+ if (memberIds.length === 0)
39
+ return false;
40
+ return memberIds.some((id) => !activeIds.has(id));
41
+ }
42
+ function isComposite(memory) {
43
+ return memory.memory_type === 'composite';
44
+ }
45
+ function parseMemberIds(memory) {
46
+ const candidate = memory.metadata?.memberMemoryIds;
47
+ if (!Array.isArray(candidate))
48
+ return [];
49
+ return candidate.filter((id) => typeof id === 'string');
50
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Conciseness preference for retrieval results.
3
+ *
4
+ * Penalizes over-broad composite memories when they compete with concise
5
+ * atomic facts for narrow queries. Without this, a composite that happens
6
+ * to contain the answer (among many irrelevant facts) can outrank a focused
7
+ * atomic fact because its centroid embedding is generically close to many
8
+ * query types.
9
+ *
10
+ * The penalty is proportional to how much longer a result is compared to the
11
+ * median result length. Results at or below median get no penalty.
12
+ */
13
+ import type { SearchResult } from '../db/memory-repository.js';
14
+ export declare function applyConcisenessPenalty(results: SearchResult[]): SearchResult[];
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Conciseness preference for retrieval results.
3
+ *
4
+ * Penalizes over-broad composite memories when they compete with concise
5
+ * atomic facts for narrow queries. Without this, a composite that happens
6
+ * to contain the answer (among many irrelevant facts) can outrank a focused
7
+ * atomic fact because its centroid embedding is generically close to many
8
+ * query types.
9
+ *
10
+ * The penalty is proportional to how much longer a result is compared to the
11
+ * median result length. Results at or below median get no penalty.
12
+ */
13
+ /**
14
+ * Maximum penalty applied to the longest result relative to median.
15
+ * A 0.15 penalty means a 5-point result becomes 4.25 at most.
16
+ * Tuned to demote broad composites without destroying their ranking
17
+ * when they genuinely contain the best answer.
18
+ */
19
+ const MAX_PENALTY_FRACTION = 0.15;
20
+ /**
21
+ * Results shorter than this get no penalty regardless of median.
22
+ * Prevents penalizing normal-length memories.
23
+ */
24
+ const PENALTY_FREE_THRESHOLD_CHARS = 150;
25
+ export function applyConcisenessPenalty(results) {
26
+ if (results.length < 2)
27
+ return results;
28
+ const lengths = results.map((r) => r.content.length).sort((a, b) => a - b);
29
+ const median = lengths[Math.floor(lengths.length / 2)];
30
+ if (median === 0)
31
+ return results;
32
+ return results.map((result) => {
33
+ const len = result.content.length;
34
+ if (len <= PENALTY_FREE_THRESHOLD_CHARS || len <= median) {
35
+ return result;
36
+ }
37
+ const excessRatio = (len - median) / median;
38
+ const penalty = Math.min(excessRatio * 0.1, MAX_PENALTY_FRACTION);
39
+ const penalizedScore = result.score * (1 - penalty);
40
+ return { ...result, score: penalizedScore };
41
+ }).sort((a, b) => b.score - a.score);
42
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Conflict policy helpers for AUDN clarification and candidate expansion.
3
+ */
4
+ import type { AUDNDecision } from './extraction.js';
5
+ export interface CandidateMemory {
6
+ id: string;
7
+ content: string;
8
+ similarity: number;
9
+ importance: number;
10
+ agent_id?: string;
11
+ }
12
+ export declare function applyClarificationOverrides(decision: AUDNDecision, factText: string, candidates: CandidateMemory[], factKeywords?: string[], factType?: string | null): AUDNDecision;
13
+ export declare function extractConflictKeywords(text: string): string[];
14
+ export declare function mergeCandidates(primary: CandidateMemory[], secondary: CandidateMemory[]): CandidateMemory[];
15
+ /** Trust context for multi-agent conflict resolution. */
16
+ export interface TrustContext {
17
+ callerAgentId: string;
18
+ callerTrustLevel: number;
19
+ candidateTrustLevels: Map<string, number>;
20
+ }
@@ -0,0 +1,335 @@
1
+ /**
2
+ * Conflict policy helpers for AUDN clarification and candidate expansion.
3
+ */
4
+ import { config } from '../config.js';
5
+ const UNCERTAIN_MARKERS = ['maybe', 'might', 'not sure', 'i think', 'perhaps', 'tomorrow'];
6
+ const UNCERTAIN_PATTERNS = [
7
+ /\b(?:need|needs|needed|will|should)\s+to\s+check\b/i,
8
+ /\bcheck\s+(?:later|tomorrow|again|back)\b/i,
9
+ ];
10
+ const GENERIC_CONFLICT_MARKERS = [
11
+ 'user',
12
+ 'users',
13
+ 'january',
14
+ 'february',
15
+ 'march',
16
+ 'april',
17
+ 'june',
18
+ 'july',
19
+ 'august',
20
+ 'september',
21
+ 'october',
22
+ 'november',
23
+ 'december',
24
+ ];
25
+ const SAFETY_RISK_MARKERS = ['allergic', 'life-threatening', 'anaphyl', 'avoid', 'cannot eat', "can't eat", 'severe'];
26
+ const SAFETY_CLEARANCE_MARKERS = ['ate', 'eat', 'eating', 'cookie', 'meal', 'dish', 'okay', 'fine', 'safe'];
27
+ const SAFE_REUSE_MIN_SIMILARITY = config.audnSafeReuseMinSimilarity;
28
+ const SAFE_REUSE_MIN_SHARED_KEYWORDS = 2;
29
+ const TRANSITION_MARKERS = ['switched away from', 'switched from', 'migrated from', 'moved from', 'previously used'];
30
+ const POLICIES = [
31
+ resolveExplicitReplacementOnClarify,
32
+ preserveLowConfidenceClarify,
33
+ detectUncertainConflict,
34
+ resolveCriticalConflict,
35
+ preserveRecommendationAttribution,
36
+ separateStateTransition,
37
+ supersedeInsteadOfUpdate,
38
+ ];
39
+ export function applyClarificationOverrides(decision, factText, candidates, factKeywords = [], factType = null) {
40
+ const ctx = { decision, factText, candidates, factKeywords, factType };
41
+ for (const policy of POLICIES) {
42
+ const result = policy(ctx);
43
+ if (result !== null)
44
+ return result;
45
+ }
46
+ return preserveAtomicFacts(decision, factText, candidates, factKeywords, factType);
47
+ }
48
+ /**
49
+ * AUDN returned CLARIFY but the new fact carries an explicit replacement
50
+ * signal ("replacing X", "no longer Y", "instead of Z", "correction: ..."):
51
+ * - With a target that's present in the candidate set: upgrade to
52
+ * SUPERSEDE so the stale memory is expired.
53
+ * - Without a target, or with a stale/invalid target ID that doesn't
54
+ * resolve to any candidate: keep the CLARIFY hold. memory-audn would
55
+ * reject a SUPERSEDE against a missing target and fall back to
56
+ * canonical storage, which leaves the old memory active — same bug
57
+ * as routing through promoteToAdd.
58
+ */
59
+ function resolveExplicitReplacementOnClarify(ctx) {
60
+ if (ctx.decision.action !== 'CLARIFY')
61
+ return null;
62
+ if (!containsExplicitReplacementSignal(ctx.factText))
63
+ return null;
64
+ const targetId = ctx.decision.targetMemoryId;
65
+ const targetInCandidates = targetId !== null && targetId !== undefined
66
+ && ctx.candidates.some((candidate) => candidate.id === targetId);
67
+ return targetInCandidates ? supersede(ctx.decision) : ctx.decision;
68
+ }
69
+ function preserveLowConfidenceClarify(ctx) {
70
+ if (!shouldClarifyConflict(ctx.decision))
71
+ return null;
72
+ if (containsExplicitReplacementSignal(ctx.factText))
73
+ return null;
74
+ return ctx.decision;
75
+ }
76
+ function detectUncertainConflict(ctx) {
77
+ if (!isUncertainConflict(ctx.factText, ctx.candidates))
78
+ return null;
79
+ return clarify(ctx.decision, 'Uncertain contradiction detected in new fact');
80
+ }
81
+ /**
82
+ * If the new fact contradicts a high-importance memory, require clarification
83
+ * unless an explicit replacement signal is present (and the action is
84
+ * already destructive). Otherwise promote to ADD so a non-contradictory
85
+ * specialization doesn't overwrite the original.
86
+ */
87
+ function resolveCriticalConflict(ctx) {
88
+ if (!isCriticalConflict(ctx.decision, ctx.factText, ctx.candidates))
89
+ return null;
90
+ const target = resolveDecisionTarget(ctx.decision, ctx.candidates);
91
+ if (target && containsContradictionSignal(ctx.factText, target.content)) {
92
+ if (canApplyExplicitReplacement(ctx.decision, ctx.factText)) {
93
+ return ctx.decision.action === 'UPDATE' ? supersede(ctx.decision) : ctx.decision;
94
+ }
95
+ return clarify(ctx.decision, 'Critical existing memory requires clarification before replacement');
96
+ }
97
+ return promoteToAdd(ctx.decision);
98
+ }
99
+ function preserveRecommendationAttribution(ctx) {
100
+ if (!shouldPreserveRecommendationAttribution(ctx.decision, ctx.factText, ctx.candidates))
101
+ return null;
102
+ return promoteToAdd(ctx.decision);
103
+ }
104
+ function separateStateTransition(ctx) {
105
+ if (!shouldSeparateStateTransition(ctx.decision, ctx.factText))
106
+ return null;
107
+ return promoteToAdd(ctx.decision);
108
+ }
109
+ function supersedeInsteadOfUpdate(ctx) {
110
+ if (!shouldSupersedeInsteadOfUpdate(ctx.decision, ctx.factText, ctx.candidates))
111
+ return null;
112
+ return supersede(ctx.decision);
113
+ }
114
+ export function extractConflictKeywords(text) {
115
+ const words = text.toLowerCase().match(/[a-z]{4,}/g) ?? [];
116
+ return [...new Set(words.filter((word) => !UNCERTAIN_MARKERS.includes(word) && !GENERIC_CONFLICT_MARKERS.includes(word)))];
117
+ }
118
+ export function mergeCandidates(primary, secondary) {
119
+ const merged = new Map();
120
+ for (const candidate of [...primary, ...secondary]) {
121
+ const existing = merged.get(candidate.id);
122
+ if (!existing || candidate.similarity > existing.similarity) {
123
+ merged.set(candidate.id, candidate);
124
+ }
125
+ }
126
+ return [...merged.values()].sort((left, right) => right.similarity - left.similarity);
127
+ }
128
+ function shouldClarifyConflict(decision) {
129
+ if (decision.action === 'CLARIFY')
130
+ return true;
131
+ if (decision.action !== 'SUPERSEDE' && decision.action !== 'DELETE')
132
+ return false;
133
+ if (decision.contradictionConfidence === null)
134
+ return false;
135
+ // DELETE is more destructive than SUPERSEDE — require higher confidence
136
+ const threshold = decision.action === 'DELETE'
137
+ ? Math.min(config.clarificationConflictThreshold + 0.1, 1.0)
138
+ : config.clarificationConflictThreshold;
139
+ return decision.contradictionConfidence < threshold;
140
+ }
141
+ function isUncertainConflict(factText, candidates) {
142
+ if (candidates.length === 0)
143
+ return false;
144
+ const lower = factText.toLowerCase();
145
+ return UNCERTAIN_MARKERS.some((marker) => lower.includes(marker))
146
+ || UNCERTAIN_PATTERNS.some((pattern) => pattern.test(factText));
147
+ }
148
+ function isCriticalConflict(decision, factText, candidates) {
149
+ // Only apply critical-conflict protection to destructive actions (SUPERSEDE/DELETE).
150
+ // ADD is not a conflict — it stores new info alongside existing memories.
151
+ if (decision.action === 'ADD' || decision.action === 'NOOP')
152
+ return false;
153
+ const criticalCandidate = candidates.find((candidate) => candidate.importance >= 0.9 && hasSharedKeyword(factText, candidate.content));
154
+ if (!criticalCandidate)
155
+ return false;
156
+ if (decision.action === 'UPDATE')
157
+ return hasSafetyConflictSignal(factText, criticalCandidate.content);
158
+ return true;
159
+ }
160
+ function hasSafetyConflictSignal(factText, candidateText) {
161
+ return containsAny(candidateText, SAFETY_RISK_MARKERS) && containsAny(factText, SAFETY_CLEARANCE_MARKERS);
162
+ }
163
+ function containsAny(text, markers) {
164
+ const lower = text.toLowerCase();
165
+ return markers.some((marker) => lower.includes(marker));
166
+ }
167
+ function hasSharedKeyword(left, right) {
168
+ const leftWords = new Set(extractConflictKeywords(left));
169
+ return extractConflictKeywords(right).some((word) => leftWords.has(word));
170
+ }
171
+ function supersede(decision) {
172
+ return {
173
+ ...decision,
174
+ action: 'SUPERSEDE',
175
+ updatedContent: null,
176
+ };
177
+ }
178
+ function shouldSupersedeInsteadOfUpdate(decision, factText, candidates) {
179
+ if (decision.action !== 'UPDATE')
180
+ return false;
181
+ if (!decision.targetMemoryId || !decision.updatedContent)
182
+ return false;
183
+ const target = candidates.find((c) => c.id === decision.targetMemoryId);
184
+ if (!target)
185
+ return false;
186
+ return containsContradictionSignal(factText, target.content);
187
+ }
188
+ const SWITCH_MARKERS = ['switched', 'changed', 'moved to', 'replaced', 'replacing', 'no longer', 'instead of', 'now using', 'now use', 'corrected from', 'correction:', 'correction '];
189
+ const EXPLICIT_REPLACEMENT_PATTERNS = [
190
+ /\breplac(?:e|ed|ing)\b/i,
191
+ /\bno longer\b/i,
192
+ /\binstead of\b/i,
193
+ /\bcorrect(?:ed|ion)\b/i,
194
+ ];
195
+ function containsExplicitReplacementSignal(factText) {
196
+ return EXPLICIT_REPLACEMENT_PATTERNS.some((pattern) => pattern.test(factText));
197
+ }
198
+ function canApplyExplicitReplacement(decision, factText) {
199
+ if (decision.action !== 'SUPERSEDE' && decision.action !== 'UPDATE')
200
+ return false;
201
+ return containsExplicitReplacementSignal(factText);
202
+ }
203
+ function containsContradictionSignal(factText, candidateText) {
204
+ if (containsExplicitReplacementSignal(factText))
205
+ return true;
206
+ const candidateKeywords = extractConflictKeywords(candidateText);
207
+ const negationPattern = candidateKeywords.some((kw) => {
208
+ const negated = new RegExp(`(not|no longer|stopped|quit|don'?t)\\s+\\w*\\s*${kw}`, 'i');
209
+ return negated.test(factText);
210
+ });
211
+ return negationPattern;
212
+ }
213
+ function shouldPreserveRecommendationAttribution(decision, factText, candidates) {
214
+ if (decision.action !== 'SUPERSEDE' && decision.action !== 'DELETE')
215
+ return false;
216
+ if (!/\b(recommended|suggested)\b/i.test(factText))
217
+ return false;
218
+ const target = resolveDecisionTarget(decision, candidates);
219
+ if (!target)
220
+ return false;
221
+ return !containsContradictionSignal(factText, target.content);
222
+ }
223
+ function clarify(decision, note) {
224
+ return {
225
+ ...decision,
226
+ action: 'CLARIFY',
227
+ clarificationNote: decision.clarificationNote ?? note,
228
+ contradictionConfidence: decision.contradictionConfidence ?? 0.35,
229
+ };
230
+ }
231
+ function preserveAtomicFacts(decision, factText, candidates, factKeywords, factType) {
232
+ if (!shouldPreserveAtomicBoundary(factText, factType))
233
+ return decision;
234
+ if (decision.action !== 'UPDATE' && decision.action !== 'NOOP')
235
+ return decision;
236
+ if (isStateTransitionFact(factText))
237
+ return promoteToAdd(decision);
238
+ const target = resolveDecisionTarget(decision, candidates);
239
+ if (!target)
240
+ return promoteToAdd(decision);
241
+ if (decision.action === 'UPDATE' && isContentGrowthExcessive(decision.updatedContent, target.content)) {
242
+ return promoteToAdd(decision);
243
+ }
244
+ if (isSafeReuse(target, factText, factKeywords))
245
+ return decision;
246
+ return promoteToAdd(decision);
247
+ }
248
+ const MAX_UPDATE_GROWTH_RATIO = 1.5;
249
+ /** Reject UPDATE if merged content would grow more than 50% vs original. */
250
+ function isContentGrowthExcessive(updatedContent, originalContent) {
251
+ if (!updatedContent)
252
+ return false;
253
+ return updatedContent.length > originalContent.length * MAX_UPDATE_GROWTH_RATIO;
254
+ }
255
+ function resolveDecisionTarget(decision, candidates) {
256
+ if (decision.targetMemoryId) {
257
+ return candidates.find((candidate) => candidate.id === decision.targetMemoryId) ?? null;
258
+ }
259
+ return candidates[0] ?? null;
260
+ }
261
+ function isSafeReuse(candidate, factText, factKeywords) {
262
+ if (candidate.similarity < SAFE_REUSE_MIN_SIMILARITY)
263
+ return false;
264
+ const sharedFactKeywords = countSharedFactKeywords(factKeywords, candidate.content);
265
+ if (sharedFactKeywords >= SAFE_REUSE_MIN_SHARED_KEYWORDS)
266
+ return true;
267
+ return sharedFactKeywords === 1
268
+ && candidate.similarity >= 0.95
269
+ && countSharedKeywords(factText, candidate.content) >= SAFE_REUSE_MIN_SHARED_KEYWORDS;
270
+ }
271
+ function countSharedKeywords(left, right) {
272
+ const leftWords = new Set(extractConflictKeywords(left));
273
+ return extractConflictKeywords(right).filter((word) => leftWords.has(word)).length;
274
+ }
275
+ function countSharedFactKeywords(keywords, content) {
276
+ const lowerContent = content.toLowerCase();
277
+ return keywords
278
+ .map((keyword) => keyword.trim().toLowerCase())
279
+ .filter((keyword) => keyword.length > 0)
280
+ .filter((keyword) => lowerContent.includes(keyword))
281
+ .length;
282
+ }
283
+ function isStateTransitionFact(text) {
284
+ const lower = text.toLowerCase();
285
+ return TRANSITION_MARKERS.some((marker) => lower.includes(marker));
286
+ }
287
+ function shouldSeparateStateTransition(decision, factText) {
288
+ if (!isStateTransitionFact(factText))
289
+ return false;
290
+ return decision.action === 'UPDATE' || decision.action === 'NOOP' || decision.action === 'SUPERSEDE';
291
+ }
292
+ function shouldPreserveAtomicBoundary(_factText, _factType) {
293
+ // Apply atomic boundary protection to ALL fact types.
294
+ // Previously gated to factType==='project' and recommendation facts only,
295
+ // which allowed non-project facts to be merged via UPDATE/NOOP without
296
+ // the similarity+keyword safety check. This caused 21-vs-51 memory count
297
+ // swings across runs (AUDN non-determinism in merge decisions).
298
+ return true;
299
+ }
300
+ function promoteToAdd(decision) {
301
+ return {
302
+ ...decision,
303
+ action: 'ADD',
304
+ targetMemoryId: null,
305
+ updatedContent: null,
306
+ };
307
+ }
308
+ /**
309
+ * Applies trust-based overrides to AUDN decisions when the caller agent has
310
+ * lower trust than the target memory's agent. Forces CLARIFY instead of
311
+ * SUPERSEDE/DELETE/UPDATE to prevent low-trust agents from silently overwriting
312
+ * high-trust memories.
313
+ */
314
+ function applyTrustOverrides(decision, candidates, trustContext) {
315
+ if (!trustContext)
316
+ return decision;
317
+ if (!isDestructiveAction(decision))
318
+ return decision;
319
+ if (!decision.targetMemoryId)
320
+ return decision;
321
+ const targetCandidate = candidates.find((c) => c.id === decision.targetMemoryId);
322
+ if (!targetCandidate?.agent_id)
323
+ return decision;
324
+ const targetAgentId = targetCandidate.agent_id;
325
+ if (targetAgentId === trustContext.callerAgentId)
326
+ return decision;
327
+ const targetTrust = trustContext.candidateTrustLevels.get(targetAgentId) ?? 0.5;
328
+ if (trustContext.callerTrustLevel >= targetTrust)
329
+ return decision;
330
+ return clarify(decision, `Low-trust agent (${trustContext.callerTrustLevel.toFixed(2)}) cannot ${decision.action.toLowerCase()} ` +
331
+ `memory from higher-trust agent (${targetTrust.toFixed(2)})`);
332
+ }
333
+ function isDestructiveAction(decision) {
334
+ return decision.action === 'SUPERSEDE' || decision.action === 'DELETE' || decision.action === 'UPDATE';
335
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Consensus extraction — stabilizes LLM fact extraction by running
3
+ * extractFacts() multiple times and keeping only facts that appear
4
+ * consistently across runs.
5
+ *
6
+ * For each run, facts are compared by semantic similarity. A fact is
7
+ * "stable" if it appears (with similarity >= threshold) in at least
8
+ * ceil(N/2) of N runs. Unstable facts are discarded.
9
+ *
10
+ * This reduces variance from LLM non-determinism at the cost of
11
+ * N× extraction API calls.
12
+ */
13
+ import { type ExtractedFact } from './extraction.js';
14
+ /**
15
+ * Config subset consumed by consensusExtractFacts. Kept narrow so callers
16
+ * only need to thread through the fields the function actually reads —
17
+ * a `Pick<IngestRuntimeConfig, ...>` of the deps.config bundle.
18
+ */
19
+ export interface ConsensusExtractionConfig {
20
+ consensusExtractionEnabled: boolean;
21
+ consensusExtractionRuns: number;
22
+ chunkedExtractionEnabled: boolean;
23
+ chunkedExtractionFallbackEnabled: boolean;
24
+ chunkSizeTurns: number;
25
+ chunkOverlapTurns: number;
26
+ extractionCacheEnabled: boolean;
27
+ observationDateExtractionEnabled: boolean;
28
+ quotedEntityExtractionEnabled: boolean;
29
+ }
30
+ /**
31
+ * Run extraction N times and return facts based on mode:
32
+ * - "consensus" (default): Keep only facts that appear in majority of runs.
33
+ * - "union": Keep all unique facts found across all runs (improves recall).
34
+ * Falls back to single extraction when consensus is disabled.
35
+ *
36
+ * Config is passed explicitly — consumers thread their `deps.config`
37
+ * through. This module no longer reads the module-level config singleton.
38
+ */
39
+ export declare function consensusExtractFacts(conversationText: string, config: ConsensusExtractionConfig): Promise<ExtractedFact[]>;
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Consensus extraction — stabilizes LLM fact extraction by running
3
+ * extractFacts() multiple times and keeping only facts that appear
4
+ * consistently across runs.
5
+ *
6
+ * For each run, facts are compared by semantic similarity. A fact is
7
+ * "stable" if it appears (with similarity >= threshold) in at least
8
+ * ceil(N/2) of N runs. Unstable facts are discarded.
9
+ *
10
+ * This reduces variance from LLM non-determinism at the cost of
11
+ * N× extraction API calls.
12
+ */
13
+ import { extractFacts } from './extraction.js';
14
+ import { cachedExtractFacts } from './extraction-cache.js';
15
+ import { chunkedExtractFacts } from './chunked-extraction.js';
16
+ import { cosineSimilarity, embedText } from './embedding.js';
17
+ import { classifyNetwork } from './memory-network.js';
18
+ import { mergeQuotedEntityFacts } from './quoted-entity-extraction.js';
19
+ const SIMILARITY_THRESHOLD = 0.90;
20
+ /**
21
+ * Run extraction N times and return facts based on mode:
22
+ * - "consensus" (default): Keep only facts that appear in majority of runs.
23
+ * - "union": Keep all unique facts found across all runs (improves recall).
24
+ * Falls back to single extraction when consensus is disabled.
25
+ *
26
+ * Config is passed explicitly — consumers thread their `deps.config`
27
+ * through. This module no longer reads the module-level config singleton.
28
+ */
29
+ export async function consensusExtractFacts(conversationText, config) {
30
+ if (!config.consensusExtractionEnabled) {
31
+ const options = buildExtractionOptions(config);
32
+ const facts = await extractOnce(conversationText, options, config);
33
+ return applyOptionalQuotedEntityExtraction(facts, conversationText, config);
34
+ }
35
+ const allRunFacts = await runMultipleExtractions(conversationText, config);
36
+ const mode = (process.env.CONSENSUS_MODE || 'consensus').toLowerCase();
37
+ if (mode === 'union') {
38
+ const unique = await deduplicateFacts(allRunFacts.flat());
39
+ return applyNetworkClassification(applyOptionalQuotedEntityExtraction(unique, conversationText, config));
40
+ }
41
+ const stableFacts = await filterByMajorityVote(allRunFacts);
42
+ return applyNetworkClassification(applyOptionalQuotedEntityExtraction(stableFacts, conversationText, config));
43
+ }
44
+ function applyOptionalQuotedEntityExtraction(facts, conversationText, config) {
45
+ return config.quotedEntityExtractionEnabled
46
+ ? mergeQuotedEntityFacts(facts, conversationText)
47
+ : facts;
48
+ }
49
+ /** Run extractFacts() N times to get independent LLM samples. */
50
+ async function runMultipleExtractions(conversationText, config) {
51
+ const allRunFacts = [];
52
+ const options = buildExtractionOptions(config);
53
+ for (let i = 0; i < config.consensusExtractionRuns; i++) {
54
+ allRunFacts.push(await extractFacts(conversationText, options));
55
+ }
56
+ return allRunFacts;
57
+ }
58
+ function buildExtractionOptions(config) {
59
+ return {
60
+ observationDateExtractionEnabled: config.observationDateExtractionEnabled,
61
+ };
62
+ }
63
+ function buildChunkingConfig(config) {
64
+ return {
65
+ chunkSizeTurns: config.chunkSizeTurns,
66
+ chunkOverlapTurns: config.chunkOverlapTurns,
67
+ extractionCacheEnabled: config.extractionCacheEnabled,
68
+ };
69
+ }
70
+ async function extractOnce(conversationText, options, config) {
71
+ if (config.chunkedExtractionEnabled) {
72
+ return chunkedExtractFacts(conversationText, options, buildChunkingConfig(config));
73
+ }
74
+ // Branch on the per-request runtime config rather than the singleton.
75
+ // cachedExtractFacts internally checks the singleton; if a benchmark sets
76
+ // config_override.extractionCacheEnabled=false but the singleton is true,
77
+ // routing through cachedExtractFacts would silently cache anyway.
78
+ const facts = config.extractionCacheEnabled
79
+ ? await cachedExtractFacts(conversationText, options)
80
+ : await extractFacts(conversationText, options);
81
+ if (!shouldUseChunkedFallback(conversationText, facts, config))
82
+ return facts;
83
+ return chunkedExtractFacts(conversationText, options, buildChunkingConfig(config));
84
+ }
85
+ function shouldUseChunkedFallback(conversationText, facts, config) {
86
+ return config.chunkedExtractionFallbackEnabled
87
+ && facts.length === 0
88
+ && countConversationTurns(conversationText) > config.chunkSizeTurns;
89
+ }
90
+ function countConversationTurns(conversationText) {
91
+ return conversationText
92
+ .split('\n')
93
+ .filter((line) => /^\w[\w\s]*:/.test(line.trim()))
94
+ .length;
95
+ }
96
+ /** Keep only facts from run[0] that appear in a majority of all runs. */
97
+ async function filterByMajorityVote(allRunFacts) {
98
+ const referenceFacts = allRunFacts[0];
99
+ if (referenceFacts.length === 0)
100
+ return [];
101
+ const majority = Math.ceil(allRunFacts.length / 2);
102
+ const refWithEmbeddings = await embedFacts(referenceFacts);
103
+ const otherRunEmbeddings = await Promise.all(allRunFacts.slice(1).map((facts) => embedFacts(facts)));
104
+ return refWithEmbeddings
105
+ .filter((ref) => countMatches(ref, otherRunEmbeddings) + 1 >= majority)
106
+ .map((ref) => ref.fact);
107
+ }
108
+ /** Embed all facts in a batch. */
109
+ async function embedFacts(facts) {
110
+ return Promise.all(facts.map(async (fact) => ({ fact, embedding: await embedText(fact.fact) })));
111
+ }
112
+ /** Count how many other runs contain a similar fact. */
113
+ function countMatches(ref, otherRuns) {
114
+ let count = 0;
115
+ for (const run of otherRuns) {
116
+ const hasMatch = run.some((other) => cosineSimilarity(ref.embedding, other.embedding) >= SIMILARITY_THRESHOLD);
117
+ if (hasMatch)
118
+ count++;
119
+ }
120
+ return count;
121
+ }
122
+ /** Deduplicate facts using embedding similarity. */
123
+ async function deduplicateFacts(facts) {
124
+ if (facts.length <= 1)
125
+ return facts;
126
+ const withEmb = await Promise.all(facts.map(async (f) => ({ fact: f, embedding: await embedText(f.fact) })));
127
+ const kept = new Array(facts.length).fill(true);
128
+ for (let i = 0; i < withEmb.length; i++) {
129
+ if (!kept[i])
130
+ continue;
131
+ for (let j = i + 1; j < withEmb.length; j++) {
132
+ if (!kept[j])
133
+ continue;
134
+ if (cosineSimilarity(withEmb[i].embedding, withEmb[j].embedding) >= SIMILARITY_THRESHOLD) {
135
+ kept[j] = false;
136
+ }
137
+ }
138
+ }
139
+ return withEmb.filter((_, i) => kept[i]).map((e) => e.fact);
140
+ }
141
+ /** Classify each fact into its memory network (world/experience/opinion). */
142
+ function applyNetworkClassification(facts) {
143
+ return facts.map((fact) => {
144
+ const { network, opinionConfidence } = classifyNetwork(fact);
145
+ return { ...fact, network, opinionConfidence };
146
+ });
147
+ }