@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
@@ -1,4 +1,4 @@
1
- import { Q as QmdSearchResult, M as MemoryFile } from './types-CqWwMPr_.js';
1
+ import { Q as QmdSearchResult, M as MemoryFile } 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';
@@ -1,4 +1,4 @@
1
- import { R as RecallPlanMode, P as PluginConfig } from './types-CqWwMPr_.js';
1
+ import { R as RecallPlanMode, P as PluginConfig } from './types-rEwubvim.js';
2
2
  import { CapabilitySet } from './capabilities.js';
3
3
  import { FallbackLlmClient, FallbackLlmOptions } from './fallback-llm.js';
4
4
  import './message-parts/index.js';
@@ -1,6 +1,6 @@
1
1
  import { HeldFileLockOptions } from './utils/serialize-mutations.js';
2
2
  import { SearchDegradation } from './search/port.js';
3
- import { R as RecallPlanMode, I as IdentityInjectionMode, c as RecallTierExplain } from './types-CqWwMPr_.js';
3
+ import { R as RecallPlanMode, I as IdentityInjectionMode, c as RecallTierExplain } from './types-rEwubvim.js';
4
4
  import './message-parts/index.js';
5
5
  import './bounded-jsonl-state.js';
6
6
  import './operator-doctor-types.js';
@@ -1,6 +1,6 @@
1
1
  import { RecallFilterTrace } from './recall-xray.js';
2
2
  import './memory-provenance.js';
3
- import './types-CqWwMPr_.js';
3
+ import './types-rEwubvim.js';
4
4
  import './message-parts/index.js';
5
5
  import './bounded-jsonl-state.js';
6
6
  import './operator-doctor-types.js';
@@ -1,4 +1,4 @@
1
- import { P as PluginConfig } from './types-CqWwMPr_.js';
1
+ import { P as PluginConfig } 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';
@@ -1,5 +1,5 @@
1
1
  import { RecallXrayFormat } from './recall-xray-renderer.js';
2
- import { b as RecallDisclosure } from './types-CqWwMPr_.js';
2
+ import { b as RecallDisclosure } from './types-rEwubvim.js';
3
3
  import './recall-xray.js';
4
4
  import './memory-provenance.js';
5
5
  import './user-model.js';
@@ -2,11 +2,11 @@ import {
2
2
  parseXrayBudgetFlag,
3
3
  parseXrayCliOptions,
4
4
  parseXrayDisclosureFlag
5
- } from "./chunk-FXGLFGIG.js";
6
- import "./chunk-TXBU7YDV.js";
5
+ } from "./chunk-TIHMZFIV.js";
6
+ import "./chunk-3TBLDMJA.js";
7
7
  import "./chunk-SOBJ6NEY.js";
8
- import "./chunk-R4Q7CQGZ.js";
9
- import "./chunk-GSL47NPM.js";
8
+ import "./chunk-TDHTVMPG.js";
9
+ import "./chunk-J7VGGECD.js";
10
10
  import "./chunk-I4WBNM3M.js";
11
11
  import "./chunk-SOAU2OE2.js";
12
12
  import "./chunk-PZ5AY32C.js";
@@ -1,6 +1,6 @@
1
1
  import { RecallXraySnapshot } from './recall-xray.js';
2
2
  import './memory-provenance.js';
3
- import './types-CqWwMPr_.js';
3
+ import './types-rEwubvim.js';
4
4
  import './message-parts/index.js';
5
5
  import './bounded-jsonl-state.js';
6
6
  import './operator-doctor-types.js';
@@ -5,10 +5,10 @@ import {
5
5
  renderXrayJson,
6
6
  renderXrayMarkdown,
7
7
  renderXrayText
8
- } from "./chunk-TXBU7YDV.js";
8
+ } from "./chunk-3TBLDMJA.js";
9
9
  import "./chunk-SOBJ6NEY.js";
10
- import "./chunk-R4Q7CQGZ.js";
11
- import "./chunk-GSL47NPM.js";
10
+ import "./chunk-TDHTVMPG.js";
11
+ import "./chunk-J7VGGECD.js";
12
12
  import "./chunk-I4WBNM3M.js";
13
13
  import "./chunk-SOAU2OE2.js";
14
14
  import "./chunk-PZ5AY32C.js";
@@ -1,5 +1,5 @@
1
1
  import { RetrievedMemoryProvenance } from './memory-provenance.js';
2
- import { c as RecallTierExplain, b as RecallDisclosure } from './types-CqWwMPr_.js';
2
+ import { c as RecallTierExplain, b as RecallDisclosure } from './types-rEwubvim.js';
3
3
  import './user-model.js';
4
4
  import './message-parts/index.js';
5
5
  import './bounded-jsonl-state.js';
@@ -5,8 +5,8 @@ import {
5
5
  estimateRecallTokens,
6
6
  isRecallXrayServedBy,
7
7
  summarizeDisclosureTokens
8
- } from "./chunk-R4Q7CQGZ.js";
9
- import "./chunk-GSL47NPM.js";
8
+ } from "./chunk-TDHTVMPG.js";
9
+ import "./chunk-J7VGGECD.js";
10
10
  import "./chunk-I4WBNM3M.js";
11
11
  import "./chunk-SOAU2OE2.js";
12
12
  import "./chunk-PZ5AY32C.js";
@@ -0,0 +1,33 @@
1
+ import { x as MemoryStatus } from '../types-rEwubvim.js';
2
+ import { ReconcileFileState, ReconcilePlan } from './plan.js';
3
+ import '../message-parts/index.js';
4
+ import '../bounded-jsonl-state.js';
5
+ import '../operator-doctor-types.js';
6
+ import '../types-continuity.js';
7
+ import '../offline-sync.js';
8
+
9
+ declare const RECONCILE_MANIFEST_FORMAT = "remnic-reconcile-manifest";
10
+ declare const RECONCILE_MANIFEST_SCHEMA_VERSION = 1;
11
+ interface ReconcileMemoryIdentity {
12
+ id: string;
13
+ category: string;
14
+ contentHash: string;
15
+ status: MemoryStatus;
16
+ }
17
+ interface ReconcileManifestFile extends ReconcileFileState {
18
+ memory?: ReconcileMemoryIdentity;
19
+ }
20
+ interface ReconcileManifest {
21
+ format: typeof RECONCILE_MANIFEST_FORMAT;
22
+ schemaVersion: typeof RECONCILE_MANIFEST_SCHEMA_VERSION;
23
+ files: ReconcileManifestFile[];
24
+ }
25
+ interface BuildReconcileManifestOptions {
26
+ files: Iterable<ReconcileFileState>;
27
+ readFile: (file: ReconcileFileState) => Promise<Buffer | string | null>;
28
+ cachedFiles?: Iterable<ReconcileManifestFile>;
29
+ }
30
+ declare function buildReconcileManifest(options: BuildReconcileManifestOptions): Promise<ReconcileManifest>;
31
+ declare function collapseActiveFactDuplicates(plan: ReconcilePlan, localManifests: ReadonlyMap<string, ReconcileManifest>, peerManifests: ReadonlyMap<string, ReconcileManifest>): ReconcilePlan;
32
+
33
+ export { type BuildReconcileManifestOptions, RECONCILE_MANIFEST_FORMAT, RECONCILE_MANIFEST_SCHEMA_VERSION, type ReconcileManifest, type ReconcileManifestFile, type ReconcileMemoryIdentity, buildReconcileManifest, collapseActiveFactDuplicates };
@@ -0,0 +1,249 @@
1
+ import {
2
+ summarizeReconcilePlan
3
+ } from "../chunk-K442KOID.js";
4
+ import "../chunk-HBVPYRDW.js";
5
+ import "../chunk-EGGE52UU.js";
6
+ import {
7
+ inferMemoryStatus
8
+ } from "../chunk-7RJUVTVF.js";
9
+ import {
10
+ ContentHashIndex
11
+ } from "../chunk-S5SLVSVY.js";
12
+ import "../chunk-W5H6ZRPT.js";
13
+ import "../chunk-FFAZ2XFU.js";
14
+ import "../chunk-7XC2HX75.js";
15
+ import "../chunk-UI3NYK34.js";
16
+ import "../chunk-GCGJW34D.js";
17
+ import "../chunk-AREGMX2J.js";
18
+ import "../chunk-P7FMDTKL.js";
19
+ import "../chunk-5TFP4CUL.js";
20
+ import "../chunk-A6XUJE5D.js";
21
+ import "../chunk-5UZXUTVO.js";
22
+ import {
23
+ RECALL_FALLBACK_DIRS
24
+ } from "../chunk-VS2IYZRU.js";
25
+ import "../chunk-3WCASNQZ.js";
26
+ import "../chunk-PZ5AY32C.js";
27
+
28
+ // src/reconcile/manifest.ts
29
+ import { createHash } from "crypto";
30
+ var RECONCILE_MANIFEST_FORMAT = "remnic-reconcile-manifest";
31
+ var RECONCILE_MANIFEST_SCHEMA_VERSION = 1;
32
+ var SHA256_PATTERN = /^[a-f0-9]{64}$/i;
33
+ var MEMORY_DIRS = new Set(RECALL_FALLBACK_DIRS);
34
+ function isMemoryPath(filePath) {
35
+ if (!filePath.endsWith(".md")) return false;
36
+ const segments = filePath.split("/");
37
+ let index = 0;
38
+ if (segments[index] === "cold" || segments[index] === "archive") index += 1;
39
+ return MEMORY_DIRS.has(segments[index] ?? "");
40
+ }
41
+ function parseScalar(value) {
42
+ if (value === void 0) return void 0;
43
+ const trimmed = value.trim();
44
+ if (trimmed.length === 0) return void 0;
45
+ if (trimmed.startsWith('"') && trimmed.endsWith('"')) {
46
+ try {
47
+ const parsed = JSON.parse(trimmed);
48
+ return typeof parsed === "string" ? parsed : trimmed;
49
+ } catch {
50
+ return trimmed.slice(1, -1).replace(/\\"/g, '"');
51
+ }
52
+ }
53
+ if (trimmed.startsWith("'") && trimmed.endsWith("'")) {
54
+ return trimmed.slice(1, -1).replace(/''/g, "'");
55
+ }
56
+ return trimmed;
57
+ }
58
+ function parsedMemoryIdentity(filePath, raw) {
59
+ if (!isMemoryPath(filePath)) return void 0;
60
+ const match = (Buffer.isBuffer(raw) ? raw.toString("utf8") : raw).match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
61
+ if (!match) return void 0;
62
+ const fields = /* @__PURE__ */ new Map();
63
+ for (const line of match[1].split("\n")) {
64
+ const separator = line.indexOf(":");
65
+ if (separator > 0) fields.set(line.slice(0, separator).trim(), line.slice(separator + 1).trim());
66
+ }
67
+ const id = parseScalar(fields.get("id"));
68
+ if (!id) return void 0;
69
+ const category = parseScalar(fields.get("category")) ?? "fact";
70
+ const storedHash = parseScalar(fields.get("contentHash"));
71
+ const contentHash = storedHash && SHA256_PATTERN.test(storedHash) ? storedHash.toLowerCase() : ContentHashIndex.computeHash(match[2].trim());
72
+ const status = inferMemoryStatus(
73
+ {
74
+ status: parseScalar(fields.get("status")),
75
+ archivedAt: parseScalar(fields.get("archivedAt"))
76
+ },
77
+ filePath
78
+ );
79
+ return { id, category, contentHash, status };
80
+ }
81
+ async function buildReconcileManifest(options) {
82
+ const cachedByPath = /* @__PURE__ */ new Map();
83
+ for (const cached of options.cachedFiles ?? []) {
84
+ cachedByPath.set(cached.path, cached);
85
+ }
86
+ const files = [];
87
+ for (const file of options.files) {
88
+ const cached = cachedByPath.get(file.path);
89
+ if (cached?.sha256.toLowerCase() === file.sha256.toLowerCase()) {
90
+ files.push({ ...file, ...cached.memory ? { memory: cached.memory } : {} });
91
+ continue;
92
+ }
93
+ let raw = null;
94
+ if (isMemoryPath(file.path)) {
95
+ try {
96
+ raw = await options.readFile(file);
97
+ } catch {
98
+ raw = null;
99
+ }
100
+ }
101
+ if (raw !== null && createHash("sha256").update(raw).digest("hex") !== file.sha256.toLowerCase()) {
102
+ raw = null;
103
+ }
104
+ const memory = raw === null ? void 0 : parsedMemoryIdentity(file.path, raw);
105
+ files.push({ ...file, ...memory ? { memory } : {} });
106
+ }
107
+ files.sort((left, right) => left.path < right.path ? -1 : left.path > right.path ? 1 : 0);
108
+ return {
109
+ format: RECONCILE_MANIFEST_FORMAT,
110
+ schemaVersion: RECONCILE_MANIFEST_SCHEMA_VERSION,
111
+ files
112
+ };
113
+ }
114
+ function activeFactByPath(manifest) {
115
+ const result = /* @__PURE__ */ new Map();
116
+ for (const file of manifest?.files ?? []) {
117
+ if (file.memory?.category === "fact" && file.memory.status === "active") {
118
+ result.set(file.path, file);
119
+ }
120
+ }
121
+ return result;
122
+ }
123
+ function contentHashRows(files) {
124
+ const rows = [];
125
+ for (const file of files) {
126
+ rows.push({ path: file.path, contentHash: file.memory.contentHash });
127
+ }
128
+ return rows;
129
+ }
130
+ function comparePlanEntries(left, right) {
131
+ if (left.namespace !== right.namespace) return left.namespace < right.namespace ? -1 : 1;
132
+ return left.path < right.path ? -1 : left.path > right.path ? 1 : 0;
133
+ }
134
+ function collapseActiveFactDuplicates(plan, localManifests, peerManifests) {
135
+ const entriesByNamespace = /* @__PURE__ */ new Map();
136
+ for (const entry of plan.entries) {
137
+ const entries2 = entriesByNamespace.get(entry.namespace) ?? [];
138
+ entries2.push({ ...entry });
139
+ entriesByNamespace.set(entry.namespace, entries2);
140
+ }
141
+ let changed = false;
142
+ for (const namespace of /* @__PURE__ */ new Set([...localManifests.keys(), ...peerManifests.keys()])) {
143
+ const entries2 = entriesByNamespace.get(namespace) ?? [];
144
+ const localManifest = localManifests.get(namespace);
145
+ const peerManifest = peerManifests.get(namespace);
146
+ const localByPath = activeFactByPath(localManifest);
147
+ const peerByPath = activeFactByPath(peerManifest);
148
+ const localFilesByPath = new Map((localManifest?.files ?? []).map((file) => [file.path, file]));
149
+ const peerFilesByPath = new Map((peerManifest?.files ?? []).map((file) => [file.path, file]));
150
+ const localByHash = /* @__PURE__ */ new Map();
151
+ const peerByHash = /* @__PURE__ */ new Map();
152
+ for (const file of localByPath.values()) {
153
+ const hash = file.memory.contentHash;
154
+ const bucket = localByHash.get(hash) ?? [];
155
+ bucket.push(file);
156
+ localByHash.set(hash, bucket);
157
+ }
158
+ for (const file of peerByPath.values()) {
159
+ const hash = file.memory.contentHash;
160
+ const bucket = peerByHash.get(hash) ?? [];
161
+ bucket.push(file);
162
+ peerByHash.set(hash, bucket);
163
+ }
164
+ const removed = /* @__PURE__ */ new Set();
165
+ const replacements = [];
166
+ for (const hash of /* @__PURE__ */ new Set([...localByHash.keys(), ...peerByHash.keys()])) {
167
+ const localCandidates = (localByHash.get(hash) ?? []).filter((file) => {
168
+ const opposite = peerFilesByPath.get(file.path);
169
+ const activeOpposite = peerByPath.get(file.path);
170
+ return opposite === void 0 || activeOpposite?.memory.contentHash === hash;
171
+ });
172
+ const peerCandidates = (peerByHash.get(hash) ?? []).filter((file) => {
173
+ const opposite = localFilesByPath.get(file.path);
174
+ const activeOpposite = localByPath.get(file.path);
175
+ return opposite === void 0 || activeOpposite?.memory.contentHash === hash;
176
+ });
177
+ const localPath = ContentHashIndex.resolvePathByHash(hash, contentHashRows(localCandidates));
178
+ const peerPath = ContentHashIndex.resolvePathByHash(hash, contentHashRows(peerCandidates));
179
+ if (localPath && peerPath && localPath !== peerPath) {
180
+ const localFile = localByPath.get(localPath);
181
+ const peerFile = peerByPath.get(peerPath);
182
+ if (!localFile || !peerFile) continue;
183
+ const duplicatePaths = /* @__PURE__ */ new Set([
184
+ ...localCandidates.map((file) => file.path),
185
+ ...peerCandidates.map((file) => file.path)
186
+ ]);
187
+ const unsafeEntry = entries2.some(
188
+ (entry) => duplicatePaths.has(entry.path) && (entry.action === "suppress" || entry.action === "conflict")
189
+ );
190
+ if (unsafeEntry) continue;
191
+ for (const entry of entries2) {
192
+ if (duplicatePaths.has(entry.path) && (entry.action === "pull" || entry.action === "push" || entry.action === "identical")) {
193
+ removed.add(entry);
194
+ }
195
+ }
196
+ replacements.push({
197
+ path: localPath < peerPath ? localPath : peerPath,
198
+ namespace,
199
+ action: "identical",
200
+ reason: "semantic_duplicate",
201
+ localSha256: localFile.sha256,
202
+ peerSha256: peerFile.sha256
203
+ });
204
+ changed = true;
205
+ continue;
206
+ }
207
+ const sameSideEntries = entries2.filter((entry) => {
208
+ if (localPath && entry.reason === "local_only") {
209
+ return localCandidates.some((file) => file.path === entry.path);
210
+ }
211
+ if (peerPath && entry.reason === "peer_only") {
212
+ return peerCandidates.some((file) => file.path === entry.path);
213
+ }
214
+ return false;
215
+ });
216
+ const canonicalPath = localPath ?? peerPath;
217
+ const hasSharedCanonical = localPath !== void 0 && localPath === peerPath;
218
+ if (!canonicalPath || sameSideEntries.length === 0 || !hasSharedCanonical && sameSideEntries.length < 2) {
219
+ continue;
220
+ }
221
+ for (const entry of sameSideEntries) {
222
+ if (entry.path !== canonicalPath) {
223
+ removed.add(entry);
224
+ changed = true;
225
+ }
226
+ }
227
+ }
228
+ if (removed.size > 0 || replacements.length > 0) {
229
+ entriesByNamespace.set(
230
+ namespace,
231
+ [...entries2.filter((entry) => !removed.has(entry)), ...replacements].sort(comparePlanEntries)
232
+ );
233
+ }
234
+ }
235
+ if (!changed) return plan;
236
+ const entries = [...entriesByNamespace.values()].flat().sort(comparePlanEntries);
237
+ return {
238
+ entries,
239
+ byNamespace: summarizeReconcilePlan(entries),
240
+ converged: entries.every((entry) => entry.action === "identical")
241
+ };
242
+ }
243
+ export {
244
+ RECONCILE_MANIFEST_FORMAT,
245
+ RECONCILE_MANIFEST_SCHEMA_VERSION,
246
+ buildReconcileManifest,
247
+ collapseActiveFactDuplicates
248
+ };
249
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/reconcile/manifest.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { inferMemoryStatus } from \"../memory-lifecycle-ledger-utils.js\";\nimport { ContentHashIndex, type ContentHashPathEntry } from \"../storage/content-hash-index.js\";\nimport type { MemoryFrontmatter, MemoryStatus } from \"../types.js\";\nimport { RECALL_FALLBACK_DIRS } from \"../utils/category-dir.js\";\nimport {\n type ReconcileFileState,\n type ReconcilePlan,\n type ReconcilePlanEntry,\n summarizeReconcilePlan,\n} from \"./plan.js\";\n\nexport const RECONCILE_MANIFEST_FORMAT = \"remnic-reconcile-manifest\";\nexport const RECONCILE_MANIFEST_SCHEMA_VERSION = 1;\n\nexport interface ReconcileMemoryIdentity {\n id: string;\n category: string;\n contentHash: string;\n status: MemoryStatus;\n}\n\nexport interface ReconcileManifestFile extends ReconcileFileState {\n memory?: ReconcileMemoryIdentity;\n}\n\ntype ActiveFactManifestFile = ReconcileManifestFile & { memory: ReconcileMemoryIdentity };\n\nexport interface ReconcileManifest {\n format: typeof RECONCILE_MANIFEST_FORMAT;\n schemaVersion: typeof RECONCILE_MANIFEST_SCHEMA_VERSION;\n files: ReconcileManifestFile[];\n}\n\nexport interface BuildReconcileManifestOptions {\n files: Iterable<ReconcileFileState>;\n readFile: (file: ReconcileFileState) => Promise<Buffer | string | null>;\n cachedFiles?: Iterable<ReconcileManifestFile>;\n}\n\nconst SHA256_PATTERN = /^[a-f0-9]{64}$/i;\nconst MEMORY_DIRS = new Set(RECALL_FALLBACK_DIRS);\n\nfunction isMemoryPath(filePath: string): boolean {\n if (!filePath.endsWith(\".md\")) return false;\n const segments = filePath.split(\"/\");\n let index = 0;\n if (segments[index] === \"cold\" || segments[index] === \"archive\") index += 1;\n return MEMORY_DIRS.has(segments[index] ?? \"\");\n}\n\nfunction parseScalar(value: string | undefined): string | undefined {\n if (value === undefined) return undefined;\n const trimmed = value.trim();\n if (trimmed.length === 0) return undefined;\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return typeof parsed === \"string\" ? parsed : trimmed;\n } catch {\n return trimmed.slice(1, -1).replace(/\\\\\"/g, '\"');\n }\n }\n if (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")) {\n return trimmed.slice(1, -1).replace(/''/g, \"'\");\n }\n return trimmed;\n}\n\nfunction parsedMemoryIdentity(filePath: string, raw: Buffer | string): ReconcileMemoryIdentity | undefined {\n if (!isMemoryPath(filePath)) return undefined;\n const match = (Buffer.isBuffer(raw) ? raw.toString(\"utf8\") : raw).match(/^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/);\n if (!match) return undefined;\n const fields = new Map<string, string>();\n for (const line of match[1].split(\"\\n\")) {\n const separator = line.indexOf(\":\");\n if (separator > 0) fields.set(line.slice(0, separator).trim(), line.slice(separator + 1).trim());\n }\n const id = parseScalar(fields.get(\"id\"));\n if (!id) return undefined;\n const category = parseScalar(fields.get(\"category\")) ?? \"fact\";\n const storedHash = parseScalar(fields.get(\"contentHash\"));\n const contentHash =\n storedHash && SHA256_PATTERN.test(storedHash)\n ? storedHash.toLowerCase()\n : ContentHashIndex.computeHash(match[2].trim());\n const status = inferMemoryStatus(\n {\n status: parseScalar(fields.get(\"status\")) as MemoryStatus | undefined,\n archivedAt: parseScalar(fields.get(\"archivedAt\")),\n } as MemoryFrontmatter,\n filePath\n );\n return { id, category, contentHash, status };\n}\n\nexport async function buildReconcileManifest(options: BuildReconcileManifestOptions): Promise<ReconcileManifest> {\n const cachedByPath = new Map<string, ReconcileManifestFile>();\n for (const cached of options.cachedFiles ?? []) {\n cachedByPath.set(cached.path, cached);\n }\n\n const files: ReconcileManifestFile[] = [];\n for (const file of options.files) {\n const cached = cachedByPath.get(file.path);\n if (cached?.sha256.toLowerCase() === file.sha256.toLowerCase()) {\n files.push({ ...file, ...(cached.memory ? { memory: cached.memory } : {}) });\n continue;\n }\n\n let raw: Buffer | string | null = null;\n if (isMemoryPath(file.path)) {\n try {\n raw = await options.readFile(file);\n } catch {\n raw = null;\n }\n }\n if (raw !== null && createHash(\"sha256\").update(raw).digest(\"hex\") !== file.sha256.toLowerCase()) {\n raw = null;\n }\n const memory = raw === null ? undefined : parsedMemoryIdentity(file.path, raw);\n files.push({ ...file, ...(memory ? { memory } : {}) });\n }\n files.sort((left, right) => (left.path < right.path ? -1 : left.path > right.path ? 1 : 0));\n return {\n format: RECONCILE_MANIFEST_FORMAT,\n schemaVersion: RECONCILE_MANIFEST_SCHEMA_VERSION,\n files,\n };\n}\n\nfunction activeFactByPath(manifest: ReconcileManifest | undefined): Map<string, ActiveFactManifestFile> {\n const result = new Map<string, ActiveFactManifestFile>();\n for (const file of manifest?.files ?? []) {\n if (file.memory?.category === \"fact\" && file.memory.status === \"active\") {\n result.set(file.path, file as ActiveFactManifestFile);\n }\n }\n return result;\n}\n\nfunction contentHashRows(files: Iterable<ActiveFactManifestFile>): ContentHashPathEntry[] {\n const rows: ContentHashPathEntry[] = [];\n for (const file of files) {\n rows.push({ path: file.path, contentHash: file.memory.contentHash });\n }\n return rows;\n}\n\nfunction comparePlanEntries(left: ReconcilePlanEntry, right: ReconcilePlanEntry): number {\n if (left.namespace !== right.namespace) return left.namespace < right.namespace ? -1 : 1;\n return left.path < right.path ? -1 : left.path > right.path ? 1 : 0;\n}\n\nexport function collapseActiveFactDuplicates(\n plan: ReconcilePlan,\n localManifests: ReadonlyMap<string, ReconcileManifest>,\n peerManifests: ReadonlyMap<string, ReconcileManifest>\n): ReconcilePlan {\n const entriesByNamespace = new Map<string, ReconcilePlanEntry[]>();\n for (const entry of plan.entries) {\n const entries = entriesByNamespace.get(entry.namespace) ?? [];\n entries.push({ ...entry });\n entriesByNamespace.set(entry.namespace, entries);\n }\n\n let changed = false;\n for (const namespace of new Set([...localManifests.keys(), ...peerManifests.keys()])) {\n const entries = entriesByNamespace.get(namespace) ?? [];\n const localManifest = localManifests.get(namespace);\n const peerManifest = peerManifests.get(namespace);\n const localByPath = activeFactByPath(localManifest);\n const peerByPath = activeFactByPath(peerManifest);\n const localFilesByPath = new Map((localManifest?.files ?? []).map((file) => [file.path, file]));\n const peerFilesByPath = new Map((peerManifest?.files ?? []).map((file) => [file.path, file]));\n const localByHash = new Map<string, ActiveFactManifestFile[]>();\n const peerByHash = new Map<string, ActiveFactManifestFile[]>();\n\n for (const file of localByPath.values()) {\n const hash = file.memory.contentHash;\n const bucket = localByHash.get(hash) ?? [];\n bucket.push(file);\n localByHash.set(hash, bucket);\n }\n for (const file of peerByPath.values()) {\n const hash = file.memory.contentHash;\n const bucket = peerByHash.get(hash) ?? [];\n bucket.push(file);\n peerByHash.set(hash, bucket);\n }\n\n const removed = new Set<ReconcilePlanEntry>();\n const replacements: ReconcilePlanEntry[] = [];\n for (const hash of new Set([...localByHash.keys(), ...peerByHash.keys()])) {\n const localCandidates = (localByHash.get(hash) ?? []).filter((file) => {\n const opposite = peerFilesByPath.get(file.path);\n const activeOpposite = peerByPath.get(file.path);\n return opposite === undefined || activeOpposite?.memory.contentHash === hash;\n });\n const peerCandidates = (peerByHash.get(hash) ?? []).filter((file) => {\n const opposite = localFilesByPath.get(file.path);\n const activeOpposite = localByPath.get(file.path);\n return opposite === undefined || activeOpposite?.memory.contentHash === hash;\n });\n const localPath = ContentHashIndex.resolvePathByHash(hash, contentHashRows(localCandidates));\n const peerPath = ContentHashIndex.resolvePathByHash(hash, contentHashRows(peerCandidates));\n\n if (localPath && peerPath && localPath !== peerPath) {\n const localFile = localByPath.get(localPath);\n const peerFile = peerByPath.get(peerPath);\n if (!localFile || !peerFile) continue;\n const duplicatePaths = new Set([\n ...localCandidates.map((file) => file.path),\n ...peerCandidates.map((file) => file.path),\n ]);\n const unsafeEntry = entries.some(\n (entry) => duplicatePaths.has(entry.path) && (entry.action === \"suppress\" || entry.action === \"conflict\")\n );\n if (unsafeEntry) continue;\n for (const entry of entries) {\n if (\n duplicatePaths.has(entry.path) &&\n (entry.action === \"pull\" || entry.action === \"push\" || entry.action === \"identical\")\n ) {\n removed.add(entry);\n }\n }\n replacements.push({\n path: localPath < peerPath ? localPath : peerPath,\n namespace,\n action: \"identical\",\n reason: \"semantic_duplicate\",\n localSha256: localFile.sha256,\n peerSha256: peerFile.sha256,\n });\n changed = true;\n continue;\n }\n\n const sameSideEntries = entries.filter((entry) => {\n if (localPath && entry.reason === \"local_only\") {\n return localCandidates.some((file) => file.path === entry.path);\n }\n if (peerPath && entry.reason === \"peer_only\") {\n return peerCandidates.some((file) => file.path === entry.path);\n }\n return false;\n });\n const canonicalPath = localPath ?? peerPath;\n const hasSharedCanonical = localPath !== undefined && localPath === peerPath;\n if (!canonicalPath || sameSideEntries.length === 0 || (!hasSharedCanonical && sameSideEntries.length < 2)) {\n continue;\n }\n for (const entry of sameSideEntries) {\n if (entry.path !== canonicalPath) {\n removed.add(entry);\n changed = true;\n }\n }\n }\n\n if (removed.size > 0 || replacements.length > 0) {\n entriesByNamespace.set(\n namespace,\n [...entries.filter((entry) => !removed.has(entry)), ...replacements].sort(comparePlanEntries)\n );\n }\n }\n\n if (!changed) return plan;\n const entries = [...entriesByNamespace.values()].flat().sort(comparePlanEntries);\n return {\n entries,\n byNamespace: summarizeReconcilePlan(entries),\n converged: entries.every((entry) => entry.action === \"identical\"),\n };\n}\n"],"mappings":"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","names":["entries"]}
@@ -1,4 +1,9 @@
1
1
  import { OfflineSyncFileState } from '../offline-sync.js';
2
+ import { ai as ConvergeConflictPolicy } from '../types-rEwubvim.js';
3
+ import '../message-parts/index.js';
4
+ import '../bounded-jsonl-state.js';
5
+ import '../operator-doctor-types.js';
6
+ import '../types-continuity.js';
2
7
 
3
8
  /**
4
9
  * Bootstrap reconciliation planner for two peer daemons whose corpora have
@@ -19,20 +24,11 @@ import { OfflineSyncFileState } from '../offline-sync.js';
19
24
  */
20
25
  /** Which way a path must move for the two corpora to agree. */
21
26
  type ReconcileAction = "pull" | "push" | "identical" | "conflict" | "suppress";
22
- /**
23
- * How a path present on BOTH sides with different content is settled.
24
- *
25
- * `manual` is the safe default: on a bootstrap merge the two sides are equally
26
- * authoritative, so silently picking one is data loss with extra steps. An
27
- * operator opts into an automatic rule once they know the shape of their split.
28
- */
29
- type ReconcileConflictPolicy = "manual" | "newest-wins" | "keep-both";
30
27
  /**
31
28
  * What the planner decided for a conflicting path.
32
- *
33
- * `keep-both` never overwrites: the older side is retained and linked as
34
- * superseded by the newer one, which is the only resolution that cannot lose a
35
- * fact neither corpus has seen.
29
+ * `supersede-link` records that both revisions need durable preservation when
30
+ * timestamps cannot safely select a winner. Apply must stop until transport
31
+ * can assign distinct durable identities to both revisions.
36
32
  */
37
33
  type ReconcileResolution = "local-wins" | "peer-wins" | "supersede-link" | "unresolved";
38
34
  interface ReconcilePlanEntry {
@@ -54,19 +50,10 @@ interface ReconcilePlanEntry {
54
50
  * delete the live copy instead of the retracted one.
55
51
  */
56
52
  suppressSide?: "local" | "peer" | "both";
57
- /**
58
- * Which revision is newer, set only for a `supersede-link` resolution.
59
- *
60
- * The contract is that the older revision is linked as superseded by the
61
- * newer one, so transport needs the direction. Absent when the timestamps
62
- * cannot order the two - which is exactly when `newest-wins` degrades to
63
- * `supersede-link` - and the link direction is then an operator decision.
64
- */
65
- newerSide?: "local" | "peer";
66
53
  }
67
54
  type ReconcileReason = "peer_only" | "local_only"
68
55
  /** Cursor showed only that side moved since agreement; both still hold the path. */
69
- | "peer_changed" | "local_changed" | "same_content" | "both_modified" | "peer_deleted" | "local_deleted"
56
+ | "peer_changed" | "local_changed" | "same_content" | "semantic_duplicate" | "both_modified" | "peer_deleted" | "local_deleted"
70
57
  /** Peer deleted it while this side edited it — the offline-sync delete/modify pair. */
71
58
  | "local_modified_peer_deleted" | "local_deleted_peer_modified" | "tombstoned";
72
59
  interface ReconcileNamespaceReport {
@@ -108,6 +95,14 @@ interface ReconcileNamespaceInput {
108
95
  * read as "never seen" rather than "deleted".
109
96
  */
110
97
  base?: Iterable<ReconcileFileState>;
98
+ /**
99
+ * Revision timestamps for paths deleted locally since the base cursor.
100
+ * A deletion is a revision and must carry a comparable time for
101
+ * `newest-wins`; absence alone has no timestamp.
102
+ */
103
+ localDeletionMtimeMs?: ReadonlyMap<string, number>;
104
+ /** Revision timestamps for paths deleted by the peer since the base cursor. */
105
+ peerDeletionMtimeMs?: ReadonlyMap<string, number>;
111
106
  /**
112
107
  * Digests of FILES this side has retracted, in the same form as
113
108
  * `ReconcileFileState.sha256` — a hash of the serialized file.
@@ -139,7 +134,7 @@ interface ReconcileNamespaceInput {
139
134
  peerTombstonedFileSha256?: Iterable<string>;
140
135
  }
141
136
  interface ReconcileOptions {
142
- conflictPolicy?: ReconcileConflictPolicy;
137
+ conflictPolicy?: ConvergeConflictPolicy;
143
138
  }
144
139
  /**
145
140
  * A census the planner refuses to reason about.
@@ -172,4 +167,4 @@ declare function summarizeReconcilePlan(entries: readonly ReconcilePlanEntry[]):
172
167
  */
173
168
  declare function planReconciliation(namespaces: readonly ReconcileNamespaceInput[], options?: ReconcileOptions): ReconcilePlan;
174
169
 
175
- export { type ReconcileAction, type ReconcileConflictPolicy, type ReconcileFileState, type ReconcileNamespaceInput, type ReconcileNamespaceReport, type ReconcileOptions, type ReconcilePlan, type ReconcilePlanEntry, ReconcilePlanInputError, type ReconcileReason, type ReconcileResolution, planNamespaceReconciliation, planReconciliation, summarizeReconcilePlan };
170
+ export { type ReconcileAction, type ReconcileFileState, type ReconcileNamespaceInput, type ReconcileNamespaceReport, type ReconcileOptions, type ReconcilePlan, type ReconcilePlanEntry, ReconcilePlanInputError, type ReconcileReason, type ReconcileResolution, planNamespaceReconciliation, planReconciliation, summarizeReconcilePlan };