@remnic/core 9.44.0 → 9.45.1

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 (384) hide show
  1. package/dist/access-admin-ops-surface.d.ts +10 -10
  2. package/dist/access-admin-ops-surface.js +26 -25
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-authorization-probe.d.ts +10 -10
  5. package/dist/access-authorization-probe.js +27 -26
  6. package/dist/access-boundary.d.ts +10 -10
  7. package/dist/access-boundary.js +26 -25
  8. package/dist/access-cli.js +70 -68
  9. package/dist/access-cli.js.map +1 -1
  10. package/dist/access-extraction-force-flush.d.ts +10 -10
  11. package/dist/access-extraction-force-flush.js +26 -25
  12. package/dist/access-health-types.d.ts +1 -1
  13. package/dist/access-http-lcm-compaction.d.ts +10 -10
  14. package/dist/access-http-lifecycle-flush.d.ts +10 -10
  15. package/dist/access-http-query.js +26 -25
  16. package/dist/access-http.d.ts +10 -10
  17. package/dist/access-http.js +34 -33
  18. package/dist/access-identity-continuity-surface.d.ts +8 -8
  19. package/dist/access-identity-continuity-surface.js +26 -25
  20. package/dist/access-lcm-surface.d.ts +10 -10
  21. package/dist/access-lcm-surface.js +26 -25
  22. package/dist/access-mcp.d.ts +10 -10
  23. package/dist/access-mcp.js +30 -29
  24. package/dist/access-memory-search-fanout.d.ts +2 -2
  25. package/dist/{access-namespace-preflight-47dOyty9.d.ts → access-namespace-preflight-5yZ4g6F8.d.ts} +1 -1
  26. package/dist/access-namespace-preflight.d.ts +3 -3
  27. package/dist/access-namespace-preflight.js +26 -25
  28. package/dist/access-observe-write-surface.d.ts +10 -10
  29. package/dist/access-observe-write-surface.js +26 -25
  30. package/dist/access-operations-batch.js +28 -27
  31. package/dist/access-operations.d.ts +10 -10
  32. package/dist/access-operations.js +29 -28
  33. package/dist/access-recall-concurrency.d.ts +10 -10
  34. package/dist/access-recall-concurrency.js +26 -25
  35. package/dist/access-recall-response.d.ts +10 -10
  36. package/dist/access-recall-response.js +26 -25
  37. package/dist/access-recall-surface.d.ts +10 -10
  38. package/dist/access-recall-surface.js +26 -25
  39. package/dist/{access-service-BCZJbX0f.d.ts → access-service-CiJRsgAB.d.ts} +7 -7
  40. package/dist/access-service-helpers.d.ts +10 -10
  41. package/dist/access-service.d.ts +10 -10
  42. package/dist/access-service.js +26 -25
  43. package/dist/access-surface-catalog.d.ts +10 -10
  44. package/dist/access-wearables-meetings-surface.d.ts +3 -3
  45. package/dist/action-confidence.d.ts +1 -1
  46. package/dist/active-memory-bridge.d.ts +1 -1
  47. package/dist/active-recall.d.ts +1 -1
  48. package/dist/active-recall.js +3 -2
  49. package/dist/active-recall.js.map +1 -1
  50. package/dist/adapters/index.js +4 -4
  51. package/dist/adapters/registry.js +2 -2
  52. package/dist/behavior-learner.d.ts +1 -1
  53. package/dist/behavior-signals.d.ts +1 -1
  54. package/dist/bootstrap.d.ts +8 -8
  55. package/dist/briefing.d.ts +2 -2
  56. package/dist/briefing.js +10 -9
  57. package/dist/buffer-surprise-report.d.ts +1 -1
  58. package/dist/buffer-turn-helpers.d.ts +1 -1
  59. package/dist/buffer.d.ts +2 -2
  60. package/dist/bulk-import/index.d.ts +3 -3
  61. package/dist/calibration.d.ts +1 -1
  62. package/dist/capabilities.d.ts +1 -1
  63. package/dist/{catalog-DPQynQZG.d.ts → catalog-scBmy0sO.d.ts} +1 -1
  64. package/dist/causal-behavior.d.ts +1 -1
  65. package/dist/causal-behavior.js +2 -2
  66. package/dist/causal-chain.js +2 -2
  67. package/dist/causal-consolidation.d.ts +1 -1
  68. package/dist/causal-consolidation.js +13 -12
  69. package/dist/causal-consolidation.js.map +1 -1
  70. package/dist/causal-retrieval.js +2 -2
  71. package/dist/causal-trajectory-graph.d.ts +1 -1
  72. package/dist/causal-trajectory-graph.js +2 -2
  73. package/dist/causal-trajectory.js +1 -1
  74. package/dist/{chunk-CH2WTP6R.js → chunk-33PLLLL7.js} +2 -2
  75. package/dist/{chunk-TXBU7YDV.js → chunk-3TBLDMJA.js} +2 -2
  76. package/dist/{chunk-MUKLQDJP.js → chunk-4UH4BTGK.js} +35 -35
  77. package/dist/{chunk-N7LPS4Z3.js → chunk-5SM35XZR.js} +2 -2
  78. package/dist/{chunk-TVVEYCNW.js → chunk-7K5Q6COX.js} +4 -4
  79. package/dist/{chunk-YUOKZ3LJ.js → chunk-A5OJCXZL.js} +2 -2
  80. package/dist/{chunk-I22U5YYD.js → chunk-AAIUERNB.js} +2 -2
  81. package/dist/{chunk-UUQLB2HJ.js → chunk-BJKPPZ6Z.js} +2 -2
  82. package/dist/{chunk-EUVPB5TA.js → chunk-CJ2ZR7UA.js} +17 -17
  83. package/dist/{chunk-TM72UOX2.js → chunk-CUM2BBPN.js} +5 -1
  84. package/dist/chunk-CUM2BBPN.js.map +1 -0
  85. package/dist/{chunk-WMHO3WLC.js → chunk-D3J5SLQK.js} +2 -2
  86. package/dist/{chunk-PJUHQC4T.js → chunk-DL7ZD3JH.js} +2 -2
  87. package/dist/{chunk-O4BADU6R.js → chunk-DNWXFTLD.js} +2 -2
  88. package/dist/{chunk-IXFI6E3Q.js → chunk-E53DSZEN.js} +2 -2
  89. package/dist/{chunk-WX6KOVVK.js → chunk-E5UK4VPE.js} +2 -2
  90. package/dist/{chunk-OHLNFI6Z.js → chunk-E6PNLPGJ.js} +25 -23
  91. package/dist/{chunk-OHLNFI6Z.js.map → chunk-E6PNLPGJ.js.map} +1 -1
  92. package/dist/{chunk-Z54EM5YZ.js → chunk-GF22HWS2.js} +4 -4
  93. package/dist/chunk-HBVPYRDW.js +39 -0
  94. package/dist/chunk-HBVPYRDW.js.map +1 -0
  95. package/dist/{chunk-W6ROK2KU.js → chunk-HNZKVLAN.js} +2 -2
  96. package/dist/{chunk-GDC4INBF.js → chunk-HO3QBJEY.js} +2 -2
  97. package/dist/{chunk-J43XN7N3.js → chunk-HREE4JHI.js} +50 -50
  98. package/dist/{chunk-GSL47NPM.js → chunk-J7VGGECD.js} +1 -1
  99. package/dist/chunk-J7VGGECD.js.map +1 -0
  100. package/dist/{chunk-RKNJBZ55.js → chunk-JBPKEARU.js} +4 -4
  101. package/dist/{chunk-WUDWRUGK.js → chunk-JE7EK33X.js} +2 -2
  102. package/dist/{chunk-IADUAH35.js → chunk-JVLCVFQ4.js} +2 -2
  103. package/dist/{chunk-UZGJFIIG.js → chunk-JYIFGGEM.js} +2 -2
  104. package/dist/chunk-K442KOID.js +443 -0
  105. package/dist/chunk-K442KOID.js.map +1 -0
  106. package/dist/{chunk-3SHB4YAW.js → chunk-L2DPF4DF.js} +4 -4
  107. package/dist/{chunk-JDDTNK5P.js → chunk-LZ4LDKHZ.js} +2 -2
  108. package/dist/{chunk-PO5LSKQO.js → chunk-MU7ZHSZE.js} +2 -2
  109. package/dist/{chunk-CAGPP5NB.js → chunk-NRV4Y3PM.js} +1 -1
  110. package/dist/{chunk-7PLHD7EO.js → chunk-OAEQLRCY.js} +2 -2
  111. package/dist/{chunk-HGFILS2Q.js → chunk-OQ5PRDDS.js} +2 -2
  112. package/dist/{chunk-E6JYVPBK.js → chunk-P4DRWEYC.js} +2 -2
  113. package/dist/{chunk-MYFFOPO2.js → chunk-PDLBLTOK.js} +2 -2
  114. package/dist/{chunk-EMC5GT4H.js → chunk-PKNLM44P.js} +4 -4
  115. package/dist/{chunk-35IC3EVP.js → chunk-QN25OCUF.js} +2 -2
  116. package/dist/{chunk-OZL7KB6B.js → chunk-RN7DY3FC.js} +5 -5
  117. package/dist/{chunk-2FTRRQKZ.js → chunk-RVLJEII5.js} +30 -511
  118. package/dist/chunk-RVLJEII5.js.map +1 -0
  119. package/dist/{chunk-G24HJJ67.js → chunk-S2NCTZGJ.js} +6 -6
  120. package/dist/chunk-S5SLVSVY.js +517 -0
  121. package/dist/chunk-S5SLVSVY.js.map +1 -0
  122. package/dist/{chunk-R4Q7CQGZ.js → chunk-TDHTVMPG.js} +2 -2
  123. package/dist/{chunk-FXGLFGIG.js → chunk-TIHMZFIV.js} +3 -3
  124. package/dist/{chunk-U5SX74DV.js → chunk-U7GW7NE7.js} +7 -7
  125. package/dist/{chunk-PLQCPMJA.js → chunk-UVIKWC7M.js} +10 -10
  126. package/dist/{chunk-2QR2RRH6.js → chunk-UYLMNVY6.js} +4 -4
  127. package/dist/{chunk-OPVOUBHT.js → chunk-VUPTKTDV.js} +2 -2
  128. package/dist/{chunk-HXTUA7QM.js → chunk-VWAXN2BN.js} +7 -7
  129. package/dist/{chunk-TRBIJS2T.js → chunk-XYTOI63Z.js} +2 -2
  130. package/dist/{cli-U30A3jyx.d.ts → cli-BUGN3d6_.d.ts} +5 -5
  131. package/dist/cli.d.ts +12 -12
  132. package/dist/cli.js +53 -51
  133. package/dist/compounding/engine.d.ts +2 -2
  134. package/dist/compounding/engine.js +10 -9
  135. package/dist/compounding/preference-consolidator.d.ts +1 -1
  136. package/dist/compression-optimizer.d.ts +1 -1
  137. package/dist/config.d.ts +1 -1
  138. package/dist/config.js +3 -2
  139. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  140. package/dist/connectors/codex-materialize-runner.js +10 -9
  141. package/dist/connectors/codex-materialize.d.ts +1 -1
  142. package/dist/connectors/index.d.ts +1 -1
  143. package/dist/connectors/index.js +10 -9
  144. package/dist/consolidation-provenance-check.d.ts +2 -2
  145. package/dist/consolidation-undo.d.ts +2 -2
  146. package/dist/contradiction/index.d.ts +2 -2
  147. package/dist/converge-config.d.ts +11 -0
  148. package/dist/converge-config.js +12 -0
  149. package/dist/convergence-refresh.d.ts +2 -2
  150. package/dist/convergence-refresh.js +12 -11
  151. package/dist/conversation-index/backend.d.ts +1 -1
  152. package/dist/conversation-index/chunker.d.ts +1 -1
  153. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  154. package/dist/conversation-index/indexer.d.ts +1 -1
  155. package/dist/conversation-index/search.d.ts +1 -1
  156. package/dist/corpus-watermark.d.ts +1 -1
  157. package/dist/corpus-watermark.js +12 -11
  158. package/dist/day-summary.d.ts +1 -1
  159. package/dist/delinearize.d.ts +1 -1
  160. package/dist/direct-answer-wiring.d.ts +1 -1
  161. package/dist/direct-answer.d.ts +1 -1
  162. package/dist/embedding-fallback.d.ts +1 -1
  163. package/dist/enrichment/index.d.ts +1 -1
  164. package/dist/entity-retrieval.d.ts +2 -2
  165. package/dist/entity-retrieval.js +10 -9
  166. package/dist/entity-schema.d.ts +1 -1
  167. package/dist/explicit-capture.d.ts +8 -8
  168. package/dist/explicit-capture.js +3 -2
  169. package/dist/extraction-error-classification.d.ts +1 -1
  170. package/dist/extraction-faithfulness.d.ts +1 -1
  171. package/dist/extraction-judge-telemetry.d.ts +1 -1
  172. package/dist/extraction-judge-training.d.ts +1 -1
  173. package/dist/extraction-judge.d.ts +1 -1
  174. package/dist/extraction-liveness.d.ts +1 -1
  175. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  176. package/dist/extraction-source-grounding.d.ts +1 -1
  177. package/dist/extraction.d.ts +1 -1
  178. package/dist/extraction.js +12 -11
  179. package/dist/fallback-llm.d.ts +1 -1
  180. package/dist/graph-dashboard-diff.d.ts +1 -1
  181. package/dist/graph-dashboard-key.d.ts +1 -1
  182. package/dist/graph-dashboard-parser.d.ts +1 -1
  183. package/dist/{graph-edge-decay-GF3ZSGSP.js → graph-edge-decay-Z6ENALU2.js} +4 -4
  184. package/dist/graph-edge-decay-Z6ENALU2.js.map +1 -0
  185. package/dist/graph-edge-reinforcement.d.ts +1 -1
  186. package/dist/graph-snapshot.d.ts +1 -1
  187. package/dist/graph-snapshot.js +3 -3
  188. package/dist/graph.d.ts +1 -1
  189. package/dist/graph.js +2 -2
  190. package/dist/importance.d.ts +1 -1
  191. package/dist/importers/index.d.ts +1 -1
  192. package/dist/in-flight-reads.d.ts +1 -1
  193. package/dist/index.d.ts +20 -19
  194. package/dist/index.js +78 -71
  195. package/dist/intent.d.ts +1 -1
  196. package/dist/lcm/engine.d.ts +1 -1
  197. package/dist/lcm/engine.js +2 -2
  198. package/dist/lcm/index.d.ts +1 -1
  199. package/dist/lcm/index.js +4 -4
  200. package/dist/lcm/tools.d.ts +1 -1
  201. package/dist/lifecycle.d.ts +1 -1
  202. package/dist/live-connectors-runner.d.ts +1 -1
  203. package/dist/local-llm.d.ts +1 -1
  204. package/dist/local-model-endpoint.d.ts +1 -1
  205. package/dist/maintenance/memory-governance.d.ts +1 -1
  206. package/dist/maintenance/memory-governance.js +10 -9
  207. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  208. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +10 -9
  209. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  210. package/dist/maintenance/rebuild-memory-projection.js +11 -10
  211. package/dist/{maintenance-DVBLXkFw.d.ts → maintenance-LbuS2rUA.d.ts} +3 -3
  212. package/dist/mcp-memory-inspector-app.d.ts +10 -10
  213. package/dist/memory-action-policy.d.ts +1 -1
  214. package/dist/memory-cache.d.ts +1 -1
  215. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  216. package/dist/memory-projection-store.d.ts +1 -1
  217. package/dist/memory-provenance.d.ts +1 -1
  218. package/dist/memory-worth-outcomes.d.ts +2 -2
  219. package/dist/models-json.d.ts +1 -1
  220. package/dist/namespaces/migrate.d.ts +3 -3
  221. package/dist/namespaces/migrate.js +11 -10
  222. package/dist/namespaces/principal.d.ts +1 -1
  223. package/dist/namespaces/search.d.ts +1 -1
  224. package/dist/namespaces/storage.d.ts +3 -3
  225. package/dist/namespaces/storage.js +10 -9
  226. package/dist/native-knowledge.d.ts +1 -1
  227. package/dist/offline-sync-impression-drain.d.ts +1 -1
  228. package/dist/operator-doctor-corpus.d.ts +1 -1
  229. package/dist/operator-doctor-corpus.js +13 -12
  230. package/dist/operator-doctor-replica.d.ts +1 -1
  231. package/dist/operator-toolkit.d.ts +3 -3
  232. package/dist/operator-toolkit.js +21 -19
  233. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  234. package/dist/orchestration/maintenance.d.ts +4 -4
  235. package/dist/orchestration/maintenance.js +15 -14
  236. package/dist/{orchestrator-DUxbhhqO.d.ts → orchestrator-rHiWt32X.d.ts} +7 -7
  237. package/dist/orchestrator.d.ts +8 -8
  238. package/dist/orchestrator.js +70 -68
  239. package/dist/patterns-cli.d.ts +1 -1
  240. package/dist/{pipeline-Cs76XC-p.d.ts → pipeline-W_97O8BV.d.ts} +1 -1
  241. package/dist/policy-runtime.d.ts +1 -1
  242. package/dist/proactive-contention.d.ts +1 -1
  243. package/dist/provenance.d.ts +1 -1
  244. package/dist/{qmd-WJwvBgiF.d.ts → qmd-LWtMofAf.d.ts} +1 -1
  245. package/dist/qmd-preflight.d.ts +2 -2
  246. package/dist/qmd-recall-cache.d.ts +1 -1
  247. package/dist/qmd.d.ts +2 -2
  248. package/dist/recall-concurrency-config.d.ts +1 -1
  249. package/dist/recall-disclosure-escalation.d.ts +1 -1
  250. package/dist/recall-explain-renderer.d.ts +1 -1
  251. package/dist/recall-explain-renderer.js +3 -3
  252. package/dist/recall-memory-map.d.ts +1 -1
  253. package/dist/recall-planner-llm.d.ts +1 -1
  254. package/dist/recall-state.d.ts +1 -1
  255. package/dist/recall-tag-filter.d.ts +1 -1
  256. package/dist/recall-timings.d.ts +1 -1
  257. package/dist/recall-xray-cli.d.ts +1 -1
  258. package/dist/recall-xray-cli.js +4 -4
  259. package/dist/recall-xray-renderer.d.ts +1 -1
  260. package/dist/recall-xray-renderer.js +3 -3
  261. package/dist/recall-xray.d.ts +1 -1
  262. package/dist/recall-xray.js +2 -2
  263. package/dist/reconcile/manifest.d.ts +33 -0
  264. package/dist/reconcile/manifest.js +249 -0
  265. package/dist/reconcile/manifest.js.map +1 -0
  266. package/dist/reconcile/plan.d.ts +19 -24
  267. package/dist/reconcile/plan.js +9 -404
  268. package/dist/reconcile/plan.js.map +1 -1
  269. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  270. package/dist/replay/normalizers/claude.d.ts +1 -1
  271. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  272. package/dist/replay/normalizers/shared.d.ts +1 -1
  273. package/dist/replay/runner.d.ts +1 -1
  274. package/dist/replay/types.d.ts +1 -1
  275. package/dist/replica-divergence.d.ts +1 -1
  276. package/dist/replica-peers-config.d.ts +1 -1
  277. package/dist/resolve-auth-token.d.ts +1 -1
  278. package/dist/resume-bundles.js +4 -3
  279. package/dist/retrieval-agents.d.ts +2 -2
  280. package/dist/retrieval-tiers.d.ts +1 -1
  281. package/dist/routing/engine.d.ts +1 -1
  282. package/dist/routing/store.d.ts +1 -1
  283. package/dist/salvage-envelope.d.ts +1 -1
  284. package/dist/{scope-profiles-CQ0NAleS.d.ts → scope-profiles-BiQKOE-p.d.ts} +1 -1
  285. package/dist/search/embed-helper.d.ts +1 -1
  286. package/dist/search/factory.d.ts +1 -1
  287. package/dist/search/index.d.ts +1 -1
  288. package/dist/search/lancedb-backend.d.ts +1 -1
  289. package/dist/search/meilisearch-backend.d.ts +1 -1
  290. package/dist/search/noop-backend.d.ts +1 -1
  291. package/dist/search/orama-backend.d.ts +1 -1
  292. package/dist/search/port.d.ts +1 -1
  293. package/dist/search/remote-backend.d.ts +1 -1
  294. package/dist/{semantic-consolidation-BWxOBMtz.d.ts → semantic-consolidation-dHYCyqgh.d.ts} +1 -1
  295. package/dist/semantic-consolidation.d.ts +2 -2
  296. package/dist/semantic-consolidation.js +11 -10
  297. package/dist/semantic-rule-promotion.js +10 -9
  298. package/dist/semantic-rule-verifier.d.ts +1 -1
  299. package/dist/semantic-rule-verifier.js +10 -9
  300. package/dist/{service-CLuMO-pa.d.ts → service-DJG3KCQ4.d.ts} +2 -2
  301. package/dist/session-observer-bands.d.ts +1 -1
  302. package/dist/session-observer-state.d.ts +1 -1
  303. package/dist/shared-context/manager.d.ts +1 -1
  304. package/dist/signal.d.ts +1 -1
  305. package/dist/source-agent-qualifier.d.ts +1 -1
  306. package/dist/source-agent-qualifier.js +10 -9
  307. package/dist/{storage-Blr71GpS.d.ts → storage-F9FVh-w9.d.ts} +13 -1
  308. package/dist/storage.d.ts +2 -2
  309. package/dist/storage.js +9 -8
  310. package/dist/summarizer.d.ts +1 -1
  311. package/dist/summary-snapshot.d.ts +1 -1
  312. package/dist/temporal-supersession.d.ts +2 -2
  313. package/dist/temporal-timeline-recall.d.ts +1 -1
  314. package/dist/temporal-validity.d.ts +1 -1
  315. package/dist/threading.d.ts +1 -1
  316. package/dist/tier-migration.d.ts +2 -2
  317. package/dist/tier-routing.d.ts +1 -1
  318. package/dist/topics.d.ts +1 -1
  319. package/dist/transcript.d.ts +1 -1
  320. package/dist/trust-score-stage.d.ts +1 -1
  321. package/dist/trust-score.d.ts +1 -1
  322. package/dist/{types-CqWwMPr_.d.ts → types-rEwubvim.d.ts} +6 -1
  323. package/dist/types.d.ts +1 -1
  324. package/dist/types.js +1 -1
  325. package/dist/utility-runtime.d.ts +1 -1
  326. package/dist/verified-recall.js +10 -9
  327. package/dist/write-envelope.d.ts +1 -1
  328. package/package.json +12 -2
  329. package/src/config.test.ts +24 -0
  330. package/src/config.ts +3 -0
  331. package/src/converge-config.ts +39 -0
  332. package/src/index.ts +1 -2
  333. package/src/reconcile/manifest.test.ts +261 -0
  334. package/src/reconcile/manifest.ts +278 -0
  335. package/src/reconcile/plan.test.ts +40 -52
  336. package/src/reconcile/plan.ts +79 -63
  337. package/src/storage/content-hash-index.ts +26 -0
  338. package/src/types.ts +5 -0
  339. package/dist/chunk-2FTRRQKZ.js.map +0 -1
  340. package/dist/chunk-GSL47NPM.js.map +0 -1
  341. package/dist/chunk-TM72UOX2.js.map +0 -1
  342. /package/dist/{chunk-CH2WTP6R.js.map → chunk-33PLLLL7.js.map} +0 -0
  343. /package/dist/{chunk-TXBU7YDV.js.map → chunk-3TBLDMJA.js.map} +0 -0
  344. /package/dist/{chunk-MUKLQDJP.js.map → chunk-4UH4BTGK.js.map} +0 -0
  345. /package/dist/{chunk-N7LPS4Z3.js.map → chunk-5SM35XZR.js.map} +0 -0
  346. /package/dist/{chunk-TVVEYCNW.js.map → chunk-7K5Q6COX.js.map} +0 -0
  347. /package/dist/{chunk-YUOKZ3LJ.js.map → chunk-A5OJCXZL.js.map} +0 -0
  348. /package/dist/{chunk-I22U5YYD.js.map → chunk-AAIUERNB.js.map} +0 -0
  349. /package/dist/{chunk-UUQLB2HJ.js.map → chunk-BJKPPZ6Z.js.map} +0 -0
  350. /package/dist/{chunk-EUVPB5TA.js.map → chunk-CJ2ZR7UA.js.map} +0 -0
  351. /package/dist/{chunk-WMHO3WLC.js.map → chunk-D3J5SLQK.js.map} +0 -0
  352. /package/dist/{chunk-PJUHQC4T.js.map → chunk-DL7ZD3JH.js.map} +0 -0
  353. /package/dist/{chunk-O4BADU6R.js.map → chunk-DNWXFTLD.js.map} +0 -0
  354. /package/dist/{chunk-IXFI6E3Q.js.map → chunk-E53DSZEN.js.map} +0 -0
  355. /package/dist/{chunk-WX6KOVVK.js.map → chunk-E5UK4VPE.js.map} +0 -0
  356. /package/dist/{chunk-Z54EM5YZ.js.map → chunk-GF22HWS2.js.map} +0 -0
  357. /package/dist/{chunk-W6ROK2KU.js.map → chunk-HNZKVLAN.js.map} +0 -0
  358. /package/dist/{chunk-GDC4INBF.js.map → chunk-HO3QBJEY.js.map} +0 -0
  359. /package/dist/{chunk-J43XN7N3.js.map → chunk-HREE4JHI.js.map} +0 -0
  360. /package/dist/{chunk-RKNJBZ55.js.map → chunk-JBPKEARU.js.map} +0 -0
  361. /package/dist/{chunk-WUDWRUGK.js.map → chunk-JE7EK33X.js.map} +0 -0
  362. /package/dist/{chunk-IADUAH35.js.map → chunk-JVLCVFQ4.js.map} +0 -0
  363. /package/dist/{chunk-UZGJFIIG.js.map → chunk-JYIFGGEM.js.map} +0 -0
  364. /package/dist/{chunk-3SHB4YAW.js.map → chunk-L2DPF4DF.js.map} +0 -0
  365. /package/dist/{chunk-JDDTNK5P.js.map → chunk-LZ4LDKHZ.js.map} +0 -0
  366. /package/dist/{chunk-PO5LSKQO.js.map → chunk-MU7ZHSZE.js.map} +0 -0
  367. /package/dist/{chunk-CAGPP5NB.js.map → chunk-NRV4Y3PM.js.map} +0 -0
  368. /package/dist/{chunk-7PLHD7EO.js.map → chunk-OAEQLRCY.js.map} +0 -0
  369. /package/dist/{chunk-HGFILS2Q.js.map → chunk-OQ5PRDDS.js.map} +0 -0
  370. /package/dist/{chunk-E6JYVPBK.js.map → chunk-P4DRWEYC.js.map} +0 -0
  371. /package/dist/{chunk-MYFFOPO2.js.map → chunk-PDLBLTOK.js.map} +0 -0
  372. /package/dist/{chunk-EMC5GT4H.js.map → chunk-PKNLM44P.js.map} +0 -0
  373. /package/dist/{chunk-35IC3EVP.js.map → chunk-QN25OCUF.js.map} +0 -0
  374. /package/dist/{chunk-OZL7KB6B.js.map → chunk-RN7DY3FC.js.map} +0 -0
  375. /package/dist/{chunk-G24HJJ67.js.map → chunk-S2NCTZGJ.js.map} +0 -0
  376. /package/dist/{chunk-R4Q7CQGZ.js.map → chunk-TDHTVMPG.js.map} +0 -0
  377. /package/dist/{chunk-FXGLFGIG.js.map → chunk-TIHMZFIV.js.map} +0 -0
  378. /package/dist/{chunk-U5SX74DV.js.map → chunk-U7GW7NE7.js.map} +0 -0
  379. /package/dist/{chunk-PLQCPMJA.js.map → chunk-UVIKWC7M.js.map} +0 -0
  380. /package/dist/{chunk-2QR2RRH6.js.map → chunk-UYLMNVY6.js.map} +0 -0
  381. /package/dist/{chunk-OPVOUBHT.js.map → chunk-VUPTKTDV.js.map} +0 -0
  382. /package/dist/{chunk-HXTUA7QM.js.map → chunk-VWAXN2BN.js.map} +0 -0
  383. /package/dist/{chunk-TRBIJS2T.js.map → chunk-XYTOI63Z.js.map} +0 -0
  384. /package/dist/{graph-edge-decay-GF3ZSGSP.js.map → converge-config.js.map} +0 -0
@@ -1227,6 +1227,10 @@ interface DreamsRunResult {
1227
1227
 
1228
1228
  type ReasoningEffort = "none" | "low" | "medium" | "high";
1229
1229
  type TriggerMode = "smart" | "every_n" | "time_based";
1230
+ type ConvergeConflictPolicy = "newest-wins" | "manual";
1231
+ interface ConvergeConfig {
1232
+ conflictPolicy: ConvergeConflictPolicy;
1233
+ }
1230
1234
  type SignalLevel = "none" | "low" | "medium" | "high";
1231
1235
  type MemoryCategory = "fact" | "preference" | "correction" | "entity" | "decision" | "relationship" | "principle" | "commitment" | "moment" | "skill" | "rule" | "procedure" | "reasoning_trace";
1232
1236
  type ConsolidationAction = "ADD" | "MERGE" | "UPDATE" | "INVALIDATE" | "SKIP";
@@ -2320,6 +2324,7 @@ interface PluginConfig extends BoundedJsonlStateConfig {
2320
2324
  procedural: ProceduralConfig;
2321
2325
  extractionLiveness: ExtractionLivenessConfig;
2322
2326
  replicaPeers: ReplicaPeersConfig;
2327
+ converge: ConvergeConfig;
2323
2328
  /** Claim-level provenance spans (#1575); see `ProvenanceConfig` for defaults. */
2324
2329
  provenance: ProvenanceConfig;
2325
2330
  /**
@@ -4672,4 +4677,4 @@ interface HourlySummary {
4672
4677
  generatedAt: string;
4673
4678
  }
4674
4679
 
4675
- export { type ExtractionFailureClass as $, type AgentPersonaModelConfig as A, type BriefingSections as B, type CalendarSource as C, type DreamsPhase as D, type EntityFile as E, type FaithfulnessFrontmatter as F, type GatewayConfig as G, type HourlySummary as H, type IdentityInjectionMode as I, type ExtractionResult as J, type ConsolidationResult as K, type LiveConnectorsConfig as L, type MemoryFile as M, type DaySummaryResult as N, type ProvenanceSource as O, type PluginConfig as P, type QmdSearchResult as Q, type RecallPlanMode as R, type SessionObserverBandConfig as S, type TranscriptEntry as T, type TrustWeights as U, type ConversationThread as V, type LifecycleState as W, type VerificationState as X, type PolicyClass as Y, type ReplicaPeersConfig as Z, type ReplicaPeerConfig as _, type DreamsRunResult as a, type WearableSourceStatus as a$, type ImportanceLevel as a0, type ActiveRecallChatType as a1, type ActiveRecallQueryMode as a2, type ActiveRecallPromptStyle as a3, type ActiveRecallThinking as a4, type ActiveRecallModelFallbackPolicy as a5, type BehaviorSignalEvent as a6, type BufferSurpriseEvent as a7, type ImportTurn as a8, type BulkImportOptions as a9, type TopicScore as aA, type QmdSearchExplain as aB, type ActivitySnapshot as aC, type ActivityConfig as aD, type ActivitySourceConfig as aE, type ActivitySourceClient as aF, type FusedWearableConversation as aG, type FusedDayMeta as aH, type FusedDayFile as aI, type MeetingRecord as aJ, type MeetingDetectionSource as aK, type FusedMeeting as aL, type EntityTimelineEntry as aM, type MemoryLink as aN, type BufferState as aO, type FileHygieneConfig as aP, type EntityRelationship as aQ, type EntityActivityEntry as aR, type AccessTrackingEntry as aS, type MemorySummary as aT, type WearableConversation as aU, type WearableSourceSettings as aV, type WearableNativeMemory as aW, type WearableMemoryMode as aX, type WearableSourceConnector as aY, type WearablesConfig as aZ, type WearableSyncSummary as a_, type BulkImportSource as aa, type BulkImportResult as ab, type CompressionGuidelineOptimizerEventCounts as ac, type CompressionGuidelineOptimizerActionSummary as ad, type CompressionGuidelineOptimizerRuleUpdate as ae, type MemoryActionType as af, type MemoryActionEvent as ag, type CompressionGuidelineOptimizerState as ah, type EntityMention as ai, type EntitySchemaDefinition as aj, type EntitySchemaSectionDefinition as ak, type EntityStructuredSection as al, type ProvenanceConfig as am, type ImportanceScore as an, type MemoryIntent as ao, type MemoryActionEligibilityContext as ap, type MemoryActionPolicyResult as aq, type MemoryLifecycleEventType as ar, type MemoryLifecycleStateSummary as as, type ModelProviderConfig as at, type NativeKnowledgeConfig as au, type ExtractionBufferSource as av, type MetaState as aw, summarizeExtractionLiveness as ax, type RetrievalTier as ay, type SignalScanResult as az, type RecallDisclosure as b, type ExtractionLivenessConfig as b$, type WearableDayTranscript as b0, type WearableCorrectionRule as b1, type MeetingBuildInput as b2, type MeetingsConfig as b3, type MeetingsDetectionInput as b4, type FusionConversationInput as b5, type MeetingActivitySnapshot as b6, type DetectedMeeting as b7, type CodingContext as b8, type DreamsStatusResult as b9, type BulkImportSourceAdapter as bA, type CodexCompatConfig as bB, DEFAULT_RECALL_DISCLOSURE as bC, type DisagreementKind as bD, type ExtractedFact as bE, type FusedContribution as bF, type FusedConversationProvenance as bG, type FusedSegmentProvenance as bH, type FusionSegmentInput as bI, type ImportSourceRole as bJ, type ImportTurnValidationIssue as bK, type MeetingScreenContextEvent as bL, type MeetingSummaryMode as bM, type MemoryActionEligibilitySource as bN, type MemoryObservation as bO, type MemoryScope as bP, RECALL_DISCLOSURE_LEVELS as bQ, type SegmentPickReason as bR, type WearableAuthCheck as bS, type WearableFetchOptions as bT, type WearableFetchPage as bU, type WearableNativeMemoryPage as bV, type WearableTranscriptSegment as bW, isImportRole as bX, isRecallDisclosure as bY, parseIsoTimestamp as bZ, validateImportTurn as b_, type RecallSectionConfig as ba, type BootstrapOptions as bb, type BootstrapResult as bc, type ConsolidationObservation as bd, type CodingModeConfig as be, type FusedSpeaker as bf, type FusedSegment as bg, type FusedDisagreement as bh, type FusionOptions as bi, type FusionDayResult as bj, type CodingKnowledgeConfig as bk, type WearableCleanupSettings as bl, type WearableFusionConfig as bm, type WearableDayTranscriptMeta as bn, type ActivityDayMeta as bo, type ActivityDayDigest as bp, type ActivitySourceCheck as bq, type ActivitySnapshotPage as br, type MeetingsDetectionConfig as bs, type MeetingAudioWindow as bt, type MeetingAppSpan as bu, type ActivityExtractionMode as bv, type BriefingConfig as bw, type BriefingOpenCommitment as bx, type BriefingWindow as by, type BulkImportError as bz, type RecallTierExplain as c, type HeartbeatDetectionMode as c$, ExtractionLivenessWarnThrottle as c0, type ExtractionRootStats as c1, type ExtractionWatermarkOrStorage as c2, type ExtractionWatermarkRead as c3, coerceExtractionWatermark as c4, computeExtractionLivenessStatus as c5, evaluateExtractionLiveness as c6, formatAgeMs as c7, gatherExtractionLivenessStatus as c8, parseExtractionLivenessConfig as c9, type CodingGraphLspConfig as cA, type CompressionGuidelineActivationState as cB, type CompressionGuidelineOptimizerSourceWindow as cC, type ConfidenceTier as cD, type ConsolidationAction as cE, type ConsolidationItem as cF, type ContradictionScanConfig as cG, type CronConversationRecallMode as cH, type CronRecallMode as cI, type DreamingConfig as cJ, type DreamingNarrativePromptStyle as cK, type DreamsDeepSleepConfig as cL, type DreamsLightSleepConfig as cM, type DreamsPhaseStatus as cN, type DreamsPhasesConfig as cO, type DreamsRemConfig as cP, type EngramTraceEvent as cQ, type ExtractedProcedureStep as cR, type ExtractedQuestion as cS, type ExtractedReasoningTrace as cT, type ExtractedReasoningTraceStep as cU, type ExtractedRelationship as cV, type ExtractionPassSource as cW, type GitHubLiveConnectorConfig as cX, type GmailLiveConnectorConfig as cY, type GoogleDriveLiveConnectorConfig as cZ, type HeartbeatConfig as c_, renderExtractionLivenessStats as ca, resolveExtractionLivenessConfig as cb, parseReplicaPeersConfig as cc, resolveReplicaPeersConfig as cd, type BufferTurnOwner as ce, ProbeTimeoutError as cf, bufferTurnArrayIsSuffixOfSnapshot as cg, bufferTurnArraysEqual as ch, bufferTurnsEqual as ci, copyBufferTurn as cj, describeError as ck, liveTurnsFromExtractionSnapshot as cl, matchingQueuedExtractionPrefixLength as cm, probeWithTimeout as cn, type AgentAccessHttpConfig as co, type AgentDefaultsConfig as cp, type AgentPersona as cq, type BehaviorLoopAdjustment as cr, type BehaviorSignalDirection as cs, type BehaviorSignalType as ct, type BriefingCalendarSourceError as cu, type BufferEntryState as cv, type ChatConfig as cw, type CodexCliReasoningEffort as cx, type CodexCompactionFlushMode as cy, type CodexConnectorConfig as cz, type BriefingFollowup as d, type LlmTraceCallback as d0, type LlmTraceEvent as d1, type MemoryActionOutcome as d2, type MemoryActionPolicyDecision as d3, type MemoryActionStatus as d4, type MemoryLinkType as d5, type MemoryOsPresetName as d6, type ModelApi as d7, type ModelDefinitionConfig as d8, type ModelProviderAuthMode as d9, type NamespacePolicy as da, type NativeKnowledgeFolderRuleConfig as db, type NativeKnowledgeObsidianVaultConfig as dc, type NativeKnowledgeOpenClawWorkspaceConfig as dd, type NotionLiveConnectorConfig as de, type PrincipalFromSessionKeyMode as df, type PrincipalRule as dg, type ProceduralConfig as dh, type QuestionEntry as di, type ReasoningEffort as dj, type RecallPipelineConfig as dk, type RecallTraceEvent as dl, type RelevanceFeedback as dm, SPECULATIVE_TTL_DAYS as dn, type ScopeProfileAutoPromoteConfig as dp, type ScopeProfileTeamProjectConfig as dq, type ScopeTeamConfig as dr, type ScoredEntity as ds, type SemanticChunkingConfigShape as dt, type SignalLevel as du, type SlotBehaviorConfig as dv, type SlotMismatchMode as dw, type TriggerMode as dx, confidenceTier as dy, type BriefingFocus as e, type CalendarEvent as f, type BriefingActiveThread as g, type BriefingResult as h, type BriefingRecentEntity as i, type BufferTurn as j, type ExtractionBufferSnapshot as k, type MemoryFrontmatter as l, type Checkpoint as m, type SourceConnectorProvenance as n, type ScopeProfileConfig as o, type ScopeProfileLayerId as p, type ScopeProfilePromotionTarget as q, type BehaviorLoopPolicyState as r, type SecretRef as s, type AgentAccessAuthToken as t, type ExtractionLivenessStatus as u, type MemoryCategory as v, type CaptureMode as w, type MemoryStatus as x, type MemoryProjectionCurrentState as y, type MemoryLifecycleEvent as z };
4680
+ export { type ExtractionFailureClass as $, type AgentPersonaModelConfig as A, type BriefingSections as B, type CalendarSource as C, type DreamsPhase as D, type EntityFile as E, type FaithfulnessFrontmatter as F, type GatewayConfig as G, type HourlySummary as H, type IdentityInjectionMode as I, type ExtractionResult as J, type ConsolidationResult as K, type LiveConnectorsConfig as L, type MemoryFile as M, type DaySummaryResult as N, type ProvenanceSource as O, type PluginConfig as P, type QmdSearchResult as Q, type RecallPlanMode as R, type SessionObserverBandConfig as S, type TranscriptEntry as T, type TrustWeights as U, type ConversationThread as V, type LifecycleState as W, type VerificationState as X, type PolicyClass as Y, type ReplicaPeersConfig as Z, type ReplicaPeerConfig as _, type DreamsRunResult as a, type WearablesConfig as a$, type ImportanceLevel as a0, type ActiveRecallChatType as a1, type ActiveRecallQueryMode as a2, type ActiveRecallPromptStyle as a3, type ActiveRecallThinking as a4, type ActiveRecallModelFallbackPolicy as a5, type BehaviorSignalEvent as a6, type BufferSurpriseEvent as a7, type ImportTurn as a8, type BulkImportOptions as a9, type RetrievalTier as aA, type SignalScanResult as aB, type TopicScore as aC, type QmdSearchExplain as aD, type ActivitySnapshot as aE, type ActivityConfig as aF, type ActivitySourceConfig as aG, type ActivitySourceClient as aH, type FusedWearableConversation as aI, type FusedDayMeta as aJ, type FusedDayFile as aK, type MeetingRecord as aL, type MeetingDetectionSource as aM, type FusedMeeting as aN, type EntityTimelineEntry as aO, type MemoryLink as aP, type BufferState as aQ, type FileHygieneConfig as aR, type EntityRelationship as aS, type EntityActivityEntry as aT, type AccessTrackingEntry as aU, type MemorySummary as aV, type WearableConversation as aW, type WearableSourceSettings as aX, type WearableNativeMemory as aY, type WearableMemoryMode as aZ, type WearableSourceConnector as a_, type BulkImportSource as aa, type BulkImportResult as ab, type CompressionGuidelineOptimizerEventCounts as ac, type CompressionGuidelineOptimizerActionSummary as ad, type CompressionGuidelineOptimizerRuleUpdate as ae, type MemoryActionType as af, type MemoryActionEvent as ag, type CompressionGuidelineOptimizerState as ah, type ConvergeConflictPolicy as ai, type ConvergeConfig as aj, type EntityMention as ak, type EntitySchemaDefinition as al, type EntitySchemaSectionDefinition as am, type EntityStructuredSection as an, type ProvenanceConfig as ao, type ImportanceScore as ap, type MemoryIntent as aq, type MemoryActionEligibilityContext as ar, type MemoryActionPolicyResult as as, type MemoryLifecycleEventType as at, type MemoryLifecycleStateSummary as au, type ModelProviderConfig as av, type NativeKnowledgeConfig as aw, type ExtractionBufferSource as ax, type MetaState as ay, summarizeExtractionLiveness as az, type RecallDisclosure as b, parseIsoTimestamp as b$, type WearableSyncSummary as b0, type WearableSourceStatus as b1, type WearableDayTranscript as b2, type WearableCorrectionRule as b3, type MeetingBuildInput as b4, type MeetingsConfig as b5, type MeetingsDetectionInput as b6, type FusionConversationInput as b7, type MeetingActivitySnapshot as b8, type DetectedMeeting as b9, type BriefingWindow as bA, type BulkImportError as bB, type BulkImportSourceAdapter as bC, type CodexCompatConfig as bD, DEFAULT_RECALL_DISCLOSURE as bE, type DisagreementKind as bF, type ExtractedFact as bG, type FusedContribution as bH, type FusedConversationProvenance as bI, type FusedSegmentProvenance as bJ, type FusionSegmentInput as bK, type ImportSourceRole as bL, type ImportTurnValidationIssue as bM, type MeetingScreenContextEvent as bN, type MeetingSummaryMode as bO, type MemoryActionEligibilitySource as bP, type MemoryObservation as bQ, type MemoryScope as bR, RECALL_DISCLOSURE_LEVELS as bS, type SegmentPickReason as bT, type WearableAuthCheck as bU, type WearableFetchOptions as bV, type WearableFetchPage as bW, type WearableNativeMemoryPage as bX, type WearableTranscriptSegment as bY, isImportRole as bZ, isRecallDisclosure as b_, type CodingContext as ba, type DreamsStatusResult as bb, type RecallSectionConfig as bc, type BootstrapOptions as bd, type BootstrapResult as be, type ConsolidationObservation as bf, type CodingModeConfig as bg, type FusedSpeaker as bh, type FusedSegment as bi, type FusedDisagreement as bj, type FusionOptions as bk, type FusionDayResult as bl, type CodingKnowledgeConfig as bm, type WearableCleanupSettings as bn, type WearableFusionConfig as bo, type WearableDayTranscriptMeta as bp, type ActivityDayMeta as bq, type ActivityDayDigest as br, type ActivitySourceCheck as bs, type ActivitySnapshotPage as bt, type MeetingsDetectionConfig as bu, type MeetingAudioWindow as bv, type MeetingAppSpan as bw, type ActivityExtractionMode as bx, type BriefingConfig as by, type BriefingOpenCommitment as bz, type RecallTierExplain as c, type GoogleDriveLiveConnectorConfig as c$, validateImportTurn as c0, type ExtractionLivenessConfig as c1, ExtractionLivenessWarnThrottle as c2, type ExtractionRootStats as c3, type ExtractionWatermarkOrStorage as c4, type ExtractionWatermarkRead as c5, coerceExtractionWatermark as c6, computeExtractionLivenessStatus as c7, evaluateExtractionLiveness as c8, formatAgeMs as c9, type CodexCompactionFlushMode as cA, type CodexConnectorConfig as cB, type CodingGraphLspConfig as cC, type CompressionGuidelineActivationState as cD, type CompressionGuidelineOptimizerSourceWindow as cE, type ConfidenceTier as cF, type ConsolidationAction as cG, type ConsolidationItem as cH, type ContradictionScanConfig as cI, type CronConversationRecallMode as cJ, type CronRecallMode as cK, type DreamingConfig as cL, type DreamingNarrativePromptStyle as cM, type DreamsDeepSleepConfig as cN, type DreamsLightSleepConfig as cO, type DreamsPhaseStatus as cP, type DreamsPhasesConfig as cQ, type DreamsRemConfig as cR, type EngramTraceEvent as cS, type ExtractedProcedureStep as cT, type ExtractedQuestion as cU, type ExtractedReasoningTrace as cV, type ExtractedReasoningTraceStep as cW, type ExtractedRelationship as cX, type ExtractionPassSource as cY, type GitHubLiveConnectorConfig as cZ, type GmailLiveConnectorConfig as c_, gatherExtractionLivenessStatus as ca, parseExtractionLivenessConfig as cb, renderExtractionLivenessStats as cc, resolveExtractionLivenessConfig as cd, parseReplicaPeersConfig as ce, resolveReplicaPeersConfig as cf, type BufferTurnOwner as cg, ProbeTimeoutError as ch, bufferTurnArrayIsSuffixOfSnapshot as ci, bufferTurnArraysEqual as cj, bufferTurnsEqual as ck, copyBufferTurn as cl, describeError as cm, liveTurnsFromExtractionSnapshot as cn, matchingQueuedExtractionPrefixLength as co, probeWithTimeout as cp, type AgentAccessHttpConfig as cq, type AgentDefaultsConfig as cr, type AgentPersona as cs, type BehaviorLoopAdjustment as ct, type BehaviorSignalDirection as cu, type BehaviorSignalType as cv, type BriefingCalendarSourceError as cw, type BufferEntryState as cx, type ChatConfig as cy, type CodexCliReasoningEffort as cz, type BriefingFollowup as d, type HeartbeatConfig as d0, type HeartbeatDetectionMode as d1, type LlmTraceCallback as d2, type LlmTraceEvent as d3, type MemoryActionOutcome as d4, type MemoryActionPolicyDecision as d5, type MemoryActionStatus as d6, type MemoryLinkType as d7, type MemoryOsPresetName as d8, type ModelApi as d9, confidenceTier as dA, type ModelDefinitionConfig as da, type ModelProviderAuthMode as db, type NamespacePolicy as dc, type NativeKnowledgeFolderRuleConfig as dd, type NativeKnowledgeObsidianVaultConfig as de, type NativeKnowledgeOpenClawWorkspaceConfig as df, type NotionLiveConnectorConfig as dg, type PrincipalFromSessionKeyMode as dh, type PrincipalRule as di, type ProceduralConfig as dj, type QuestionEntry as dk, type ReasoningEffort as dl, type RecallPipelineConfig as dm, type RecallTraceEvent as dn, type RelevanceFeedback as dp, SPECULATIVE_TTL_DAYS as dq, type ScopeProfileAutoPromoteConfig as dr, type ScopeProfileTeamProjectConfig as ds, type ScopeTeamConfig as dt, type ScoredEntity as du, type SemanticChunkingConfigShape as dv, type SignalLevel as dw, type SlotBehaviorConfig as dx, type SlotMismatchMode as dy, type TriggerMode as dz, type BriefingFocus as e, type CalendarEvent as f, type BriefingActiveThread as g, type BriefingResult as h, type BriefingRecentEntity as i, type BufferTurn as j, type ExtractionBufferSnapshot as k, type MemoryFrontmatter as l, type Checkpoint as m, type SourceConnectorProvenance as n, type ScopeProfileConfig as o, type ScopeProfileLayerId as p, type ScopeProfilePromotionTarget as q, type BehaviorLoopPolicyState as r, type SecretRef as s, type AgentAccessAuthToken as t, type ExtractionLivenessStatus as u, type MemoryCategory as v, type CaptureMode as w, type MemoryStatus as x, type MemoryProjectionCurrentState as y, type MemoryLifecycleEvent as z };
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { aS as AccessTrackingEntry, a1 as ActiveRecallChatType, a5 as ActiveRecallModelFallbackPolicy, a3 as ActiveRecallPromptStyle, a2 as ActiveRecallQueryMode, a4 as ActiveRecallThinking, t as AgentAccessAuthToken, co as AgentAccessHttpConfig, cp as AgentDefaultsConfig, cq as AgentPersona, A as AgentPersonaModelConfig, cr as BehaviorLoopAdjustment, r as BehaviorLoopPolicyState, cs as BehaviorSignalDirection, a6 as BehaviorSignalEvent, ct as BehaviorSignalType, bb as BootstrapOptions, bc as BootstrapResult, g as BriefingActiveThread, cu as BriefingCalendarSourceError, bw as BriefingConfig, e as BriefingFocus, d as BriefingFollowup, bx as BriefingOpenCommitment, i as BriefingRecentEntity, h as BriefingResult, B as BriefingSections, by as BriefingWindow, cv as BufferEntryState, aO as BufferState, a7 as BufferSurpriseEvent, j as BufferTurn, f as CalendarEvent, C as CalendarSource, w as CaptureMode, cw as ChatConfig, m as Checkpoint, cx as CodexCliReasoningEffort, cy as CodexCompactionFlushMode, bB as CodexCompatConfig, cz as CodexConnectorConfig, b8 as CodingContext, cA as CodingGraphLspConfig, bk as CodingKnowledgeConfig, be as CodingModeConfig, cB as CompressionGuidelineActivationState, ad as CompressionGuidelineOptimizerActionSummary, ac as CompressionGuidelineOptimizerEventCounts, ae as CompressionGuidelineOptimizerRuleUpdate, cC as CompressionGuidelineOptimizerSourceWindow, ah as CompressionGuidelineOptimizerState, cD as ConfidenceTier, cE as ConsolidationAction, cF as ConsolidationItem, bd as ConsolidationObservation, K as ConsolidationResult, cG as ContradictionScanConfig, V as ConversationThread, cH as CronConversationRecallMode, cI as CronRecallMode, bC as DEFAULT_RECALL_DISCLOSURE, N as DaySummaryResult, cJ as DreamingConfig, cK as DreamingNarrativePromptStyle, cL as DreamsDeepSleepConfig, cM as DreamsLightSleepConfig, D as DreamsPhase, cN as DreamsPhaseStatus, cO as DreamsPhasesConfig, cP as DreamsRemConfig, a as DreamsRunResult, b9 as DreamsStatusResult, cQ as EngramTraceEvent, aR as EntityActivityEntry, E as EntityFile, ai as EntityMention, aQ as EntityRelationship, aj as EntitySchemaDefinition, ak as EntitySchemaSectionDefinition, al as EntityStructuredSection, aM as EntityTimelineEntry, bE as ExtractedFact, cR as ExtractedProcedureStep, cS as ExtractedQuestion, cT as ExtractedReasoningTrace, cU as ExtractedReasoningTraceStep, cV as ExtractedRelationship, $ as ExtractionFailureClass, cW as ExtractionPassSource, J as ExtractionResult, F as FaithfulnessFrontmatter, aP as FileHygieneConfig, G as GatewayConfig, cX as GitHubLiveConnectorConfig, cY as GmailLiveConnectorConfig, cZ as GoogleDriveLiveConnectorConfig, c_ as HeartbeatConfig, c$ as HeartbeatDetectionMode, H as HourlySummary, I as IdentityInjectionMode, a0 as ImportanceLevel, an as ImportanceScore, W as LifecycleState, L as LiveConnectorsConfig, d0 as LlmTraceCallback, d1 as LlmTraceEvent, ap as MemoryActionEligibilityContext, bN as MemoryActionEligibilitySource, ag as MemoryActionEvent, d2 as MemoryActionOutcome, d3 as MemoryActionPolicyDecision, aq as MemoryActionPolicyResult, d4 as MemoryActionStatus, af as MemoryActionType, v as MemoryCategory, M as MemoryFile, l as MemoryFrontmatter, ao as MemoryIntent, z as MemoryLifecycleEvent, ar as MemoryLifecycleEventType, as as MemoryLifecycleStateSummary, aN as MemoryLink, d5 as MemoryLinkType, bO as MemoryObservation, d6 as MemoryOsPresetName, y as MemoryProjectionCurrentState, bP as MemoryScope, x as MemoryStatus, aT as MemorySummary, aw as MetaState, d7 as ModelApi, d8 as ModelDefinitionConfig, d9 as ModelProviderAuthMode, at as ModelProviderConfig, da as NamespacePolicy, au as NativeKnowledgeConfig, db as NativeKnowledgeFolderRuleConfig, dc as NativeKnowledgeObsidianVaultConfig, dd as NativeKnowledgeOpenClawWorkspaceConfig, de as NotionLiveConnectorConfig, P as PluginConfig, Y as PolicyClass, df as PrincipalFromSessionKeyMode, dg as PrincipalRule, dh as ProceduralConfig, am as ProvenanceConfig, O as ProvenanceSource, aB as QmdSearchExplain, Q as QmdSearchResult, di as QuestionEntry, bQ as RECALL_DISCLOSURE_LEVELS, dj as ReasoningEffort, b as RecallDisclosure, dk as RecallPipelineConfig, R as RecallPlanMode, ba as RecallSectionConfig, c as RecallTierExplain, dl as RecallTraceEvent, dm as RelevanceFeedback, ay as RetrievalTier, dn as SPECULATIVE_TTL_DAYS, dp as ScopeProfileAutoPromoteConfig, o as ScopeProfileConfig, p as ScopeProfileLayerId, q as ScopeProfilePromotionTarget, dq as ScopeProfileTeamProjectConfig, dr as ScopeTeamConfig, ds as ScoredEntity, s as SecretRef, dt as SemanticChunkingConfigShape, S as SessionObserverBandConfig, du as SignalLevel, az as SignalScanResult, dv as SlotBehaviorConfig, dw as SlotMismatchMode, n as SourceConnectorProvenance, aA as TopicScore, T as TranscriptEntry, dx as TriggerMode, U as TrustWeights, X as VerificationState, dy as confidenceTier, bY as isRecallDisclosure } from './types-CqWwMPr_.js';
1
+ export { aU as AccessTrackingEntry, a1 as ActiveRecallChatType, a5 as ActiveRecallModelFallbackPolicy, a3 as ActiveRecallPromptStyle, a2 as ActiveRecallQueryMode, a4 as ActiveRecallThinking, t as AgentAccessAuthToken, cq as AgentAccessHttpConfig, cr as AgentDefaultsConfig, cs as AgentPersona, A as AgentPersonaModelConfig, ct as BehaviorLoopAdjustment, r as BehaviorLoopPolicyState, cu as BehaviorSignalDirection, a6 as BehaviorSignalEvent, cv as BehaviorSignalType, bd as BootstrapOptions, be as BootstrapResult, g as BriefingActiveThread, cw as BriefingCalendarSourceError, by as BriefingConfig, e as BriefingFocus, d as BriefingFollowup, bz as BriefingOpenCommitment, i as BriefingRecentEntity, h as BriefingResult, B as BriefingSections, bA as BriefingWindow, cx as BufferEntryState, aQ as BufferState, a7 as BufferSurpriseEvent, j as BufferTurn, f as CalendarEvent, C as CalendarSource, w as CaptureMode, cy as ChatConfig, m as Checkpoint, cz as CodexCliReasoningEffort, cA as CodexCompactionFlushMode, bD as CodexCompatConfig, cB as CodexConnectorConfig, ba as CodingContext, cC as CodingGraphLspConfig, bm as CodingKnowledgeConfig, bg as CodingModeConfig, cD as CompressionGuidelineActivationState, ad as CompressionGuidelineOptimizerActionSummary, ac as CompressionGuidelineOptimizerEventCounts, ae as CompressionGuidelineOptimizerRuleUpdate, cE as CompressionGuidelineOptimizerSourceWindow, ah as CompressionGuidelineOptimizerState, cF as ConfidenceTier, cG as ConsolidationAction, cH as ConsolidationItem, bf as ConsolidationObservation, K as ConsolidationResult, cI as ContradictionScanConfig, aj as ConvergeConfig, ai as ConvergeConflictPolicy, V as ConversationThread, cJ as CronConversationRecallMode, cK as CronRecallMode, bE as DEFAULT_RECALL_DISCLOSURE, N as DaySummaryResult, cL as DreamingConfig, cM as DreamingNarrativePromptStyle, cN as DreamsDeepSleepConfig, cO as DreamsLightSleepConfig, D as DreamsPhase, cP as DreamsPhaseStatus, cQ as DreamsPhasesConfig, cR as DreamsRemConfig, a as DreamsRunResult, bb as DreamsStatusResult, cS as EngramTraceEvent, aT as EntityActivityEntry, E as EntityFile, ak as EntityMention, aS as EntityRelationship, al as EntitySchemaDefinition, am as EntitySchemaSectionDefinition, an as EntityStructuredSection, aO as EntityTimelineEntry, bG as ExtractedFact, cT as ExtractedProcedureStep, cU as ExtractedQuestion, cV as ExtractedReasoningTrace, cW as ExtractedReasoningTraceStep, cX as ExtractedRelationship, $ as ExtractionFailureClass, cY as ExtractionPassSource, J as ExtractionResult, F as FaithfulnessFrontmatter, aR as FileHygieneConfig, G as GatewayConfig, cZ as GitHubLiveConnectorConfig, c_ as GmailLiveConnectorConfig, c$ as GoogleDriveLiveConnectorConfig, d0 as HeartbeatConfig, d1 as HeartbeatDetectionMode, H as HourlySummary, I as IdentityInjectionMode, a0 as ImportanceLevel, ap as ImportanceScore, W as LifecycleState, L as LiveConnectorsConfig, d2 as LlmTraceCallback, d3 as LlmTraceEvent, ar as MemoryActionEligibilityContext, bP as MemoryActionEligibilitySource, ag as MemoryActionEvent, d4 as MemoryActionOutcome, d5 as MemoryActionPolicyDecision, as as MemoryActionPolicyResult, d6 as MemoryActionStatus, af as MemoryActionType, v as MemoryCategory, M as MemoryFile, l as MemoryFrontmatter, aq as MemoryIntent, z as MemoryLifecycleEvent, at as MemoryLifecycleEventType, au as MemoryLifecycleStateSummary, aP as MemoryLink, d7 as MemoryLinkType, bQ as MemoryObservation, d8 as MemoryOsPresetName, y as MemoryProjectionCurrentState, bR as MemoryScope, x as MemoryStatus, aV as MemorySummary, ay as MetaState, d9 as ModelApi, da as ModelDefinitionConfig, db as ModelProviderAuthMode, av as ModelProviderConfig, dc as NamespacePolicy, aw as NativeKnowledgeConfig, dd as NativeKnowledgeFolderRuleConfig, de as NativeKnowledgeObsidianVaultConfig, df as NativeKnowledgeOpenClawWorkspaceConfig, dg as NotionLiveConnectorConfig, P as PluginConfig, Y as PolicyClass, dh as PrincipalFromSessionKeyMode, di as PrincipalRule, dj as ProceduralConfig, ao as ProvenanceConfig, O as ProvenanceSource, aD as QmdSearchExplain, Q as QmdSearchResult, dk as QuestionEntry, bS as RECALL_DISCLOSURE_LEVELS, dl as ReasoningEffort, b as RecallDisclosure, dm as RecallPipelineConfig, R as RecallPlanMode, bc as RecallSectionConfig, c as RecallTierExplain, dn as RecallTraceEvent, dp as RelevanceFeedback, aA as RetrievalTier, dq as SPECULATIVE_TTL_DAYS, dr as ScopeProfileAutoPromoteConfig, o as ScopeProfileConfig, p as ScopeProfileLayerId, q as ScopeProfilePromotionTarget, ds as ScopeProfileTeamProjectConfig, dt as ScopeTeamConfig, du as ScoredEntity, s as SecretRef, dv as SemanticChunkingConfigShape, S as SessionObserverBandConfig, dw as SignalLevel, aB as SignalScanResult, dx as SlotBehaviorConfig, dy as SlotMismatchMode, n as SourceConnectorProvenance, aC as TopicScore, T as TranscriptEntry, dz as TriggerMode, U as TrustWeights, X as VerificationState, dA as confidenceTier, b_ as isRecallDisclosure } from './types-rEwubvim.js';
2
2
  import './message-parts/index.js';
3
3
  import './bounded-jsonl-state.js';
4
4
  export { ContinuityImprovementLoop, ContinuityIncidentCloseInput, ContinuityIncidentOpenInput, ContinuityIncidentRecord, ContinuityIncidentState, ContinuityLoopCadence, ContinuityLoopReviewInput, ContinuityLoopStatus, ContinuityLoopUpsertInput } from './types-continuity.js';
package/dist/types.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  SPECULATIVE_TTL_DAYS,
5
5
  confidenceTier,
6
6
  isRecallDisclosure
7
- } from "./chunk-GSL47NPM.js";
7
+ } from "./chunk-J7VGGECD.js";
8
8
  import "./chunk-PZ5AY32C.js";
9
9
  export {
10
10
  DEFAULT_RECALL_DISCLOSURE,
@@ -1,5 +1,5 @@
1
1
  import { TierRoutingPolicy } from './tier-routing.js';
2
- import './types-CqWwMPr_.js';
2
+ import './types-rEwubvim.js';
3
3
  import './message-parts/index.js';
4
4
  import './bounded-jsonl-state.js';
5
5
  import './operator-doctor-types.js';
@@ -1,32 +1,33 @@
1
1
  import {
2
2
  compareVerifiedEpisodeResults,
3
3
  searchVerifiedEpisodes
4
- } from "./chunk-HGFILS2Q.js";
4
+ } from "./chunk-OQ5PRDDS.js";
5
5
  import "./chunk-B7RWBZXW.js";
6
6
  import "./chunk-ZBJMUXZH.js";
7
- import "./chunk-OHLNFI6Z.js";
8
- import "./chunk-ENTCVTQR.js";
7
+ import "./chunk-E6PNLPGJ.js";
9
8
  import "./chunk-UHVXE24Y.js";
9
+ import "./chunk-ENTCVTQR.js";
10
10
  import "./chunk-WIPEXG6R.js";
11
11
  import "./chunk-J6A3CX5N.js";
12
- import "./chunk-GSL47NPM.js";
12
+ import "./chunk-J7VGGECD.js";
13
13
  import "./chunk-WUNIWKY4.js";
14
14
  import "./chunk-EGGE52UU.js";
15
15
  import "./chunk-ZA53AZND.js";
16
+ import "./chunk-SCU65EZI.js";
16
17
  import "./chunk-WRJVB3C2.js";
17
18
  import "./chunk-GCASGYIO.js";
18
19
  import "./chunk-7RJUVTVF.js";
19
- import "./chunk-SCU65EZI.js";
20
20
  import "./chunk-DM2T26WE.js";
21
21
  import "./chunk-LDXUBPMO.js";
22
- import "./chunk-2FTRRQKZ.js";
22
+ import "./chunk-JYIJNNN3.js";
23
+ import "./chunk-AAD2ZS6P.js";
24
+ import "./chunk-RVLJEII5.js";
25
+ import "./chunk-S5SLVSVY.js";
23
26
  import "./chunk-CGASUJVP.js";
24
27
  import "./chunk-R3DJVOSM.js";
25
28
  import "./chunk-BT7NVCML.js";
26
29
  import "./chunk-3CSX3ETE.js";
27
30
  import "./chunk-RL6NEVXT.js";
28
- import "./chunk-JYIJNNN3.js";
29
- import "./chunk-AAD2ZS6P.js";
30
31
  import "./chunk-YXZG5TVN.js";
31
32
  import "./chunk-W5H6ZRPT.js";
32
33
  import "./chunk-G7D6GZ5J.js";
@@ -46,8 +47,8 @@ import "./chunk-45GF7Y3V.js";
46
47
  import "./chunk-RGMVMVMF.js";
47
48
  import "./chunk-N7RWREIQ.js";
48
49
  import "./chunk-5I4M26Q7.js";
49
- import "./chunk-5GKPFL3S.js";
50
50
  import "./chunk-ZIKENA2C.js";
51
+ import "./chunk-5GKPFL3S.js";
51
52
  import "./chunk-PQVCH2AE.js";
52
53
  import "./chunk-EYIEWJNI.js";
53
54
  import "./chunk-JUC24CTX.js";
@@ -1,4 +1,4 @@
1
- import { v as MemoryCategory } from './types-CqWwMPr_.js';
1
+ import { v as MemoryCategory } from './types-rEwubvim.js';
2
2
  import './message-parts/index.js';
3
3
  import './bounded-jsonl-state.js';
4
4
  import './operator-doctor-types.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "9.44.0",
3
+ "version": "9.45.1",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -166,6 +166,16 @@
166
166
  "remnic-source": "./src/reconcile/plan.ts",
167
167
  "import": "./dist/reconcile/plan.js"
168
168
  },
169
+ "./reconcile/manifest": {
170
+ "types": "./dist/reconcile/manifest.d.ts",
171
+ "remnic-source": "./src/reconcile/manifest.ts",
172
+ "import": "./dist/reconcile/manifest.js"
173
+ },
174
+ "./reconcile/manifest.js": {
175
+ "types": "./dist/reconcile/manifest.d.ts",
176
+ "remnic-source": "./src/reconcile/manifest.ts",
177
+ "import": "./dist/reconcile/manifest.js"
178
+ },
169
179
  "./reconcile/cursor": {
170
180
  "types": "./dist/reconcile/cursor.d.ts",
171
181
  "remnic-source": "./src/reconcile/cursor.ts",
@@ -3096,7 +3106,7 @@
3096
3106
  "core"
3097
3107
  ],
3098
3108
  "peerDependencies": {
3099
- "@remnic/coding-graph": "^9.44.0"
3109
+ "@remnic/coding-graph": "^9.45.1"
3100
3110
  },
3101
3111
  "peerDependenciesMeta": {
3102
3112
  "@remnic/coding-graph": {
@@ -2416,3 +2416,27 @@ test("parseConfig forwards bridgeMode as a raw passthrough (validation is in res
2416
2416
  test("parseConfig leaves the OpenClaw delegate timeout to the plugin parser", () => {
2417
2417
  assert.equal("bridgeHealthTimeoutMs" in parseConfig({ bridgeHealthTimeoutMs: 7_500 }), false);
2418
2418
  });
2419
+
2420
+ test("parseConfig validates converge conflict policy and defaults to newest-wins", () => {
2421
+ assert.deepEqual(parseConfig({}).converge, { conflictPolicy: "newest-wins" });
2422
+
2423
+ for (const conflictPolicy of ["newest-wins", "manual"] as const) {
2424
+ assert.equal(parseConfig({ converge: { conflictPolicy } }).converge.conflictPolicy, conflictPolicy);
2425
+ }
2426
+
2427
+ for (const conflictPolicy of ["keep-both", "", "unknown", 0, false, null]) {
2428
+ assert.throws(
2429
+ () => parseConfig({ converge: { conflictPolicy } }),
2430
+ /converge\.conflictPolicy.*newest-wins.*manual/,
2431
+ );
2432
+ }
2433
+
2434
+ for (const converge of [0, null, [], new Date(), new Map()]) {
2435
+ assert.throws(() => parseConfig({ converge }), /converge must be a plain object/);
2436
+ }
2437
+
2438
+ assert.throws(
2439
+ () => parseConfig({ converge: { conflictPolciy: "manual" } }),
2440
+ /converge contains unknown key "conflictPolciy"/,
2441
+ );
2442
+ });
package/src/config.ts CHANGED
@@ -26,6 +26,7 @@ import type {
26
26
  TriggerMode,
27
27
  TrustWeights,
28
28
  } from "./types.js";
29
+ import { parseConvergeConfig } from "./converge-config.js";
29
30
  import { log } from "./logger.js";
30
31
  import { cloneDefaultSessionObserverBands } from "./session-observer-bands.js";
31
32
  import { readEnvVar, resolveHomeDir } from "./runtime/env.js";
@@ -80,6 +81,7 @@ const DEFAULT_WORKSPACE_DIR = path.join(
80
81
  );
81
82
 
82
83
  const DEFAULT_INIT_GATE_TIMEOUT_MS = 30_000;
84
+
83
85
  const CLIENT_SECRET_FIELD = ["client", "Secret"].join("") as "clientSecret";
84
86
  const REFRESH_TOKEN_FIELD = ["refresh", "Token"].join("") as "refreshToken";
85
87
  const LEGACY_ACTIVE_RECALL_CUSTOM_FIELD = [
@@ -2332,6 +2334,7 @@ export function parseConfig(
2332
2334
  procedural,
2333
2335
  extractionLiveness: parseExtractionLivenessConfig(cfg),
2334
2336
  replicaPeers: parseReplicaPeersConfig(cfg),
2337
+ converge: parseConvergeConfig(cfg.converge),
2335
2338
  wearables,
2336
2339
  meetings,
2337
2340
  activity,
@@ -0,0 +1,39 @@
1
+ import type { ConvergeConfig, ConvergeConflictPolicy } from "./types.js";
2
+
3
+ export const CONVERGE_CONFLICT_POLICIES = [
4
+ "newest-wins",
5
+ "manual",
6
+ ] as const satisfies readonly ConvergeConflictPolicy[];
7
+
8
+ export const DEFAULT_CONVERGE_CONFLICT_POLICY: ConvergeConflictPolicy = "newest-wins";
9
+
10
+ export function parseConvergeConfig(block: unknown): ConvergeConfig {
11
+ if (block === undefined) {
12
+ return { conflictPolicy: DEFAULT_CONVERGE_CONFLICT_POLICY };
13
+ }
14
+ if (block === null || typeof block !== "object" || Array.isArray(block)) {
15
+ throw new Error("converge must be a plain object");
16
+ }
17
+ const prototype = Object.getPrototypeOf(block);
18
+ if (prototype !== Object.prototype && prototype !== null) {
19
+ throw new Error("converge must be a plain object");
20
+ }
21
+ const { conflictPolicy, ...unknown } = block as Record<string, unknown>;
22
+ const unknownKey = Object.keys(unknown)[0];
23
+ if (unknownKey !== undefined) {
24
+ throw new Error(`converge contains unknown key ${JSON.stringify(unknownKey)}`);
25
+ }
26
+ if (conflictPolicy === undefined) {
27
+ return { conflictPolicy: DEFAULT_CONVERGE_CONFLICT_POLICY };
28
+ }
29
+ if (
30
+ typeof conflictPolicy === "string" &&
31
+ CONVERGE_CONFLICT_POLICIES.includes(conflictPolicy as ConvergeConflictPolicy)
32
+ ) {
33
+ return { conflictPolicy: conflictPolicy as ConvergeConflictPolicy };
34
+ }
35
+
36
+ throw new Error(
37
+ `converge.conflictPolicy must be one of ${CONVERGE_CONFLICT_POLICIES.join(", ")}; got ${JSON.stringify(conflictPolicy)}`
38
+ );
39
+ }
package/src/index.ts CHANGED
@@ -1394,8 +1394,7 @@ export type {
1394
1394
  CalendarSource,
1395
1395
  RecallDisclosure,
1396
1396
  } from "./types.js";
1397
-
1398
- // Recall disclosure depth (issue #677).
1397
+ export { CONVERGE_CONFLICT_POLICIES, DEFAULT_CONVERGE_CONFLICT_POLICY } from "./converge-config.js";
1399
1398
  export {
1400
1399
  DEFAULT_RECALL_DISCLOSURE,
1401
1400
  RECALL_DISCLOSURE_LEVELS,
@@ -0,0 +1,261 @@
1
+ import * as assert from "node:assert/strict";
2
+ import { createHash } from "node:crypto";
3
+ import { test } from "node:test";
4
+ import { ContentHashIndex } from "../storage/content-hash-index.js";
5
+ import { type ReconcileManifest, buildReconcileManifest, collapseActiveFactDuplicates } from "./manifest.js";
6
+ import { planReconciliation } from "./plan.js";
7
+
8
+ const fileHash = (content: string): string => createHash("sha256").update(content).digest("hex");
9
+
10
+ function memoryFile(options: {
11
+ id: string;
12
+ content: string;
13
+ contentHash?: string;
14
+ status?: string;
15
+ }): string {
16
+ return [
17
+ "---",
18
+ `id: ${options.id}`,
19
+ "category: fact",
20
+ "created: 2026-01-01T00:00:00.000Z",
21
+ "updated: 2026-01-01T00:00:00.000Z",
22
+ ...(options.contentHash ? [`contentHash: ${options.contentHash}`] : []),
23
+ ...(options.status ? [`status: ${options.status}`] : []),
24
+ "---",
25
+ options.content,
26
+ ].join("\n");
27
+ }
28
+
29
+ test("reconcile manifest keeps file identity separate from canonical semantic identity", async () => {
30
+ const content = "The deployment uses a durable queue with an enrichment suffix.";
31
+ const semanticHash = ContentHashIndex.computeHash("The deployment uses a durable queue.");
32
+ const serialized = memoryFile({ id: "fact-a", content, contentHash: semanticHash, status: "active" });
33
+ const serializedHash = fileHash(serialized);
34
+
35
+ const manifest = await buildReconcileManifest({
36
+ files: [{ path: "facts/fact-a.md", sha256: serializedHash, bytes: Buffer.byteLength(serialized) }],
37
+ readFile: async () => Buffer.from(serialized),
38
+ });
39
+
40
+ assert.equal(manifest.format, "remnic-reconcile-manifest");
41
+ assert.equal(manifest.schemaVersion, 1);
42
+ assert.equal(manifest.files[0]?.sha256, serializedHash);
43
+ assert.notEqual(serializedHash, semanticHash);
44
+ assert.deepEqual(manifest.files[0]?.memory, {
45
+ id: "fact-a",
46
+ category: "fact",
47
+ contentHash: semanticHash,
48
+ status: "active",
49
+ });
50
+ });
51
+
52
+ test("reconcile manifest hashes parsed legacy content and uses effective lifecycle status", async () => {
53
+ const active = memoryFile({ id: "legacy", content: "Legacy fact body" });
54
+ const archived = memoryFile({ id: "archived", content: "Archived fact body", status: "active" });
55
+ const rawByPath = new Map([
56
+ ["facts/legacy.md", Buffer.from(active)],
57
+ ["archive/facts/archived.md", Buffer.from(archived)],
58
+ ]);
59
+
60
+ const manifest = await buildReconcileManifest({
61
+ files: [...rawByPath].map(([path, raw]) => ({ path, sha256: fileHash(raw.toString()) })),
62
+ readFile: async (file) => rawByPath.get(file.path) ?? null,
63
+ });
64
+
65
+ assert.equal(manifest.files[0]?.memory?.contentHash, ContentHashIndex.computeHash("Archived fact body"));
66
+ assert.equal(manifest.files[0]?.memory?.status, "archived");
67
+ assert.equal(manifest.files[1]?.memory?.contentHash, ContentHashIndex.computeHash("Legacy fact body"));
68
+ assert.equal(manifest.files[1]?.memory?.status, "active");
69
+ });
70
+
71
+ test("reconcile manifest keeps file identity when memory bytes cannot be trusted", async () => {
72
+ const readable = memoryFile({ id: "readable", content: "Readable fact" });
73
+ const changed = memoryFile({ id: "changed", content: "Changed after census" });
74
+ const files = [
75
+ { path: "facts/readable.md", sha256: fileHash(readable) },
76
+ { path: "facts/locked.md", sha256: "f".repeat(64) },
77
+ { path: "facts/changed.md", sha256: fileHash("bytes from census") },
78
+ ];
79
+
80
+ const manifest = await buildReconcileManifest({
81
+ files,
82
+ readFile: async (file) => {
83
+ if (file.path === "facts/locked.md") throw new Error("locked");
84
+ return file.path === "facts/changed.md" ? changed : readable;
85
+ },
86
+ });
87
+
88
+ assert.equal(manifest.files.length, 3);
89
+ assert.equal(manifest.files.find((file) => file.path === "facts/readable.md")?.memory?.id, "readable");
90
+ assert.equal(manifest.files.find((file) => file.path === "facts/locked.md")?.memory, undefined);
91
+ assert.equal(manifest.files.find((file) => file.path === "facts/changed.md")?.memory, undefined);
92
+ });
93
+
94
+ test("ContentHashIndex resolves a semantic hash to a stable canonical path without changing membership", () => {
95
+ const semanticHash = ContentHashIndex.computeHash("same fact");
96
+ const entries = [
97
+ { path: "facts/z.md", contentHash: semanticHash },
98
+ { path: "facts/a.md", contentHash: semanticHash },
99
+ { path: "facts/other.md", contentHash: ContentHashIndex.computeHash("other fact") },
100
+ ];
101
+ const index = new ContentHashIndex("unused");
102
+
103
+ assert.equal(ContentHashIndex.resolvePathByHash(semanticHash, entries), "facts/a.md");
104
+ assert.equal(ContentHashIndex.resolvePathByHash("f".repeat(64), entries), undefined);
105
+ assert.equal(index.has("same fact"), false);
106
+ });
107
+
108
+ test("semantic collapse prevents different active fact paths from transferring both directions", () => {
109
+ const semanticHash = ContentHashIndex.computeHash("same active fact");
110
+ const localFile = { path: "facts/local-id.md", sha256: "a".repeat(64) };
111
+ const peerFile = { path: "facts/peer-id.md", sha256: "b".repeat(64) };
112
+ const plan = planReconciliation([{ namespace: "default", local: [localFile], peer: [peerFile] }]);
113
+ const local: ReconcileManifest = {
114
+ format: "remnic-reconcile-manifest",
115
+ schemaVersion: 1,
116
+ files: [
117
+ { ...localFile, memory: { id: "local-id", category: "fact", contentHash: semanticHash, status: "active" } },
118
+ ],
119
+ };
120
+ const peer: ReconcileManifest = {
121
+ format: "remnic-reconcile-manifest",
122
+ schemaVersion: 1,
123
+ files: [{ ...peerFile, memory: { id: "peer-id", category: "fact", contentHash: semanticHash, status: "active" } }],
124
+ };
125
+
126
+ const collapsed = collapseActiveFactDuplicates(plan, new Map([["default", local]]), new Map([["default", peer]]));
127
+
128
+ assert.equal(collapsed.converged, true);
129
+ assert.deepEqual(collapsed.entries, [
130
+ {
131
+ path: "facts/local-id.md",
132
+ namespace: "default",
133
+ action: "identical",
134
+ reason: "semantic_duplicate",
135
+ localSha256: localFile.sha256,
136
+ peerSha256: peerFile.sha256,
137
+ },
138
+ ]);
139
+ assert.equal(collapsed.byNamespace[0]?.identical, 1);
140
+ assert.equal(collapsed.byNamespace[0]?.pull, 0);
141
+ assert.equal(collapsed.byNamespace[0]?.push, 0);
142
+ });
143
+
144
+ test("semantic collapse does not fold non-active facts or unrelated path conflicts", () => {
145
+ const semanticHash = ContentHashIndex.computeHash("same inactive fact");
146
+ const localFile = { path: "facts/local.md", sha256: "a".repeat(64) };
147
+ const peerFile = { path: "facts/peer.md", sha256: "b".repeat(64) };
148
+ const plan = planReconciliation([{ namespace: "default", local: [localFile], peer: [peerFile] }]);
149
+ const manifest = (file: typeof localFile, id: string, status: "active" | "archived"): ReconcileManifest => ({
150
+ format: "remnic-reconcile-manifest",
151
+ schemaVersion: 1,
152
+ files: [{ ...file, memory: { id, category: "fact", contentHash: semanticHash, status } }],
153
+ });
154
+
155
+ const collapsed = collapseActiveFactDuplicates(
156
+ plan,
157
+ new Map([["default", manifest(localFile, "local", "active")]]),
158
+ new Map([["default", manifest(peerFile, "peer", "archived")]])
159
+ );
160
+
161
+ assert.deepEqual(collapsed, plan);
162
+ });
163
+
164
+ test("semantic collapse leaves tombstone suppression authoritative", () => {
165
+ const semanticHash = ContentHashIndex.computeHash("retracted fact");
166
+ const localFile = { path: "facts/local.md", sha256: "a".repeat(64) };
167
+ const peerFile = { path: "facts/peer.md", sha256: "b".repeat(64) };
168
+ const plan = planReconciliation([
169
+ {
170
+ namespace: "default",
171
+ local: [localFile],
172
+ peer: [peerFile],
173
+ tombstonedFileSha256: [localFile.sha256],
174
+ },
175
+ ]);
176
+ const manifest = (file: typeof localFile, id: string): ReconcileManifest => ({
177
+ format: "remnic-reconcile-manifest",
178
+ schemaVersion: 1,
179
+ files: [{ ...file, memory: { id, category: "fact", contentHash: semanticHash, status: "active" } }],
180
+ });
181
+
182
+ const collapsed = collapseActiveFactDuplicates(
183
+ plan,
184
+ new Map([["default", manifest(localFile, "local")]]),
185
+ new Map([["default", manifest(peerFile, "peer")]])
186
+ );
187
+
188
+ assert.deepEqual(collapsed, plan);
189
+ assert.equal(
190
+ collapsed.entries.some((entry) => entry.action === "suppress"),
191
+ true
192
+ );
193
+ });
194
+
195
+ test("semantic collapse preserves same-path metadata updates", () => {
196
+ const path = "facts/shared.md";
197
+ const localFile = { path, sha256: "a".repeat(64) };
198
+ const peerFile = { path, sha256: "b".repeat(64) };
199
+ const baseFile = { path, sha256: peerFile.sha256 };
200
+ const semanticHash = ContentHashIndex.computeHash("same raw fact");
201
+ const plan = planReconciliation([{ namespace: "default", local: [localFile], peer: [peerFile], base: [baseFile] }]);
202
+ const manifest = (file: typeof localFile, id: string): ReconcileManifest => ({
203
+ format: "remnic-reconcile-manifest",
204
+ schemaVersion: 1,
205
+ files: [{ ...file, memory: { id, category: "fact", contentHash: semanticHash, status: "active" } }],
206
+ });
207
+
208
+ const collapsed = collapseActiveFactDuplicates(
209
+ plan,
210
+ new Map([["default", manifest(localFile, "local")]]),
211
+ new Map([["default", manifest(peerFile, "peer")]])
212
+ );
213
+
214
+ assert.deepEqual(collapsed, plan);
215
+ assert.equal(collapsed.entries[0]?.action, "push");
216
+ });
217
+
218
+ test("semantic collapse remains converged after transferring the canonical one-sided duplicate", () => {
219
+ const semanticHash = ContentHashIndex.computeHash("same one-sided fact");
220
+ const canonical = { path: "facts/a.md", sha256: "a".repeat(64) };
221
+ const duplicate = { path: "facts/b.md", sha256: "b".repeat(64) };
222
+ const manifest = (files: Array<{ path: string; sha256: string }>): ReconcileManifest => ({
223
+ format: "remnic-reconcile-manifest",
224
+ schemaVersion: 1,
225
+ files: files.map((file) => ({
226
+ ...file,
227
+ memory: {
228
+ id: file.path,
229
+ category: "fact",
230
+ contentHash: semanticHash,
231
+ status: "active",
232
+ },
233
+ })),
234
+ });
235
+ const localManifest = manifest([canonical, duplicate]);
236
+ const firstPlan = planReconciliation([{ namespace: "default", local: [canonical, duplicate], peer: [] }]);
237
+
238
+ const firstCollapsed = collapseActiveFactDuplicates(
239
+ firstPlan,
240
+ new Map([["default", localManifest]]),
241
+ new Map([["default", manifest([])]])
242
+ );
243
+
244
+ assert.deepEqual(
245
+ firstCollapsed.entries.map((entry) => [entry.path, entry.action]),
246
+ [[canonical.path, "push"]]
247
+ );
248
+
249
+ const rerunPlan = planReconciliation([{ namespace: "default", local: [canonical, duplicate], peer: [canonical] }]);
250
+ const rerunCollapsed = collapseActiveFactDuplicates(
251
+ rerunPlan,
252
+ new Map([["default", localManifest]]),
253
+ new Map([["default", manifest([canonical])]])
254
+ );
255
+
256
+ assert.equal(rerunCollapsed.converged, true, JSON.stringify(rerunCollapsed));
257
+ assert.deepEqual(
258
+ rerunCollapsed.entries.map((entry) => [entry.path, entry.action]),
259
+ [[canonical.path, "identical"]]
260
+ );
261
+ });