@remnic/core 9.65.1 → 9.65.3

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 (576) hide show
  1. package/dist/access-admin-ops-surface.d.ts +44 -44
  2. package/dist/access-admin-ops-surface.js +36 -35
  3. package/dist/access-authorization-probe.d.ts +39 -40
  4. package/dist/access-authorization-probe.js +37 -36
  5. package/dist/access-boundary.d.ts +41 -185
  6. package/dist/access-boundary.js +36 -35
  7. package/dist/access-cli.js +110 -107
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-coding-context-resolution.d.ts +3 -1
  10. package/dist/access-extraction-force-flush.d.ts +25 -25
  11. package/dist/access-extraction-force-flush.js +36 -35
  12. package/dist/access-health-types.d.ts +3 -1
  13. package/dist/access-http-lcm-compaction.d.ts +39 -39
  14. package/dist/access-http-lifecycle-flush.d.ts +40 -41
  15. package/dist/access-http-offline-stream.d.ts +25 -25
  16. package/dist/access-http-query.d.ts +4 -2
  17. package/dist/access-http-query.js +38 -37
  18. package/dist/access-http.d.ts +51 -44
  19. package/dist/access-http.js +57 -56
  20. package/dist/access-identity-continuity-surface.d.ts +12 -12
  21. package/dist/access-identity-continuity-surface.js +36 -35
  22. package/dist/access-lcm-surface.d.ts +27 -27
  23. package/dist/access-lcm-surface.js +36 -35
  24. package/dist/access-mcp-admin-tools.d.ts +9 -1
  25. package/dist/access-mcp-admin-tools.js +3 -1
  26. package/dist/access-mcp-output-schemas.js +1 -1
  27. package/dist/access-mcp.d.ts +39 -39
  28. package/dist/access-mcp.js +50 -47
  29. package/dist/access-memory-search-fanout.d.ts +4 -2
  30. package/dist/{access-namespace-preflight-BKUnKsBv.d.ts → access-namespace-preflight-B7Usyz-K.d.ts} +1 -1
  31. package/dist/access-namespace-preflight.d.ts +5 -3
  32. package/dist/access-namespace-preflight.js +36 -35
  33. package/dist/access-observe-write-surface.d.ts +39 -39
  34. package/dist/access-observe-write-surface.js +36 -35
  35. package/dist/access-offline-manifest.d.ts +12 -12
  36. package/dist/access-offline-manifest.js +5 -5
  37. package/dist/access-operations-batch.js +41 -40
  38. package/dist/access-operations.d.ts +46 -47
  39. package/dist/access-operations.js +44 -43
  40. package/dist/access-recall-concurrency.d.ts +40 -40
  41. package/dist/access-recall-concurrency.js +36 -35
  42. package/dist/access-recall-response.d.ts +24 -24
  43. package/dist/access-recall-response.js +36 -35
  44. package/dist/access-recall-surface.d.ts +24 -24
  45. package/dist/access-recall-surface.js +36 -35
  46. package/dist/access-schema.d.ts +139 -139
  47. package/dist/access-schema.js +3 -3
  48. package/dist/{access-service-B1Lbb-nQ.d.ts → access-service-DkaIG3n8.d.ts} +688 -140
  49. package/dist/access-service-helpers.d.ts +40 -40
  50. package/dist/access-service.d.ts +47 -47
  51. package/dist/access-service.js +36 -35
  52. package/dist/access-surface-catalog.d.ts +41 -42
  53. package/dist/access-surface-catalog.js +44 -37
  54. package/dist/access-surface-catalog.js.map +1 -1
  55. package/dist/access-wearables-meetings-surface.d.ts +5 -3
  56. package/dist/action-confidence.d.ts +3 -1
  57. package/dist/active-memory-bridge.d.ts +3 -1
  58. package/dist/active-recall.d.ts +3 -1
  59. package/dist/active-recall.js +11 -1
  60. package/dist/active-recall.js.map +1 -1
  61. package/dist/adapters/index.js +4 -4
  62. package/dist/adapters/registry.js +2 -2
  63. package/dist/ambient-provenance.d.ts +3 -1
  64. package/dist/artifact-search.d.ts +3 -1
  65. package/dist/{auto-sync-5L7EUZ27.js → auto-sync-H64ZCNIR.js} +13 -5
  66. package/dist/{auto-sync-5L7EUZ27.js.map → auto-sync-H64ZCNIR.js.map} +1 -1
  67. package/dist/behavior-learner.d.ts +3 -1
  68. package/dist/behavior-signals.d.ts +3 -1
  69. package/dist/bootstrap.d.ts +12 -12
  70. package/dist/briefing-window.d.ts +4 -2
  71. package/dist/briefing.d.ts +4 -2
  72. package/dist/briefing.js +16 -15
  73. package/dist/buffer-surprise-report.d.ts +3 -1
  74. package/dist/buffer-turn-helpers.d.ts +3 -1
  75. package/dist/buffer.d.ts +4 -2
  76. package/dist/buffer.js +4 -4
  77. package/dist/bulk-import/index.d.ts +5 -3
  78. package/dist/calibration.d.ts +3 -1
  79. package/dist/calibration.js +1 -1
  80. package/dist/capabilities.d.ts +3 -1
  81. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
  82. package/dist/{catalog-DjVhJoRM.d.ts → catalog-CX2BZEJh.d.ts} +1 -1
  83. package/dist/causal-behavior.d.ts +1 -1
  84. package/dist/causal-consolidation.d.ts +3 -1
  85. package/dist/causal-consolidation.js +20 -19
  86. package/dist/causal-consolidation.js.map +1 -1
  87. package/dist/causal-trajectory-graph.d.ts +1 -1
  88. package/dist/{chunk-MIBKEW7A.js → chunk-2VXWFYJE.js} +3 -3
  89. package/dist/{chunk-3YTTAGPB.js → chunk-3DVBKTSO.js} +2 -2
  90. package/dist/{chunk-EIR5VLIH.js → chunk-4K7IW3F7.js} +2 -2
  91. package/dist/chunk-4K7IW3F7.js.map +1 -0
  92. package/dist/{chunk-JTSVMJHV.js → chunk-4XDGYCZI.js} +3 -3
  93. package/dist/chunk-573TEZCD.js +88 -0
  94. package/dist/chunk-573TEZCD.js.map +1 -0
  95. package/dist/{chunk-HQSBYI5X.js → chunk-57HVIG5U.js} +2 -2
  96. package/dist/{chunk-PMVPCZJZ.js → chunk-6433HV72.js} +2 -2
  97. package/dist/{chunk-N6TRHP72.js → chunk-6TAX66IA.js} +2 -2
  98. package/dist/{chunk-AGKIG3YA.js → chunk-6VALIZKG.js} +2 -2
  99. package/dist/{chunk-YQ3CBLL4.js → chunk-76PL4XLG.js} +512 -8
  100. package/dist/chunk-76PL4XLG.js.map +1 -0
  101. package/dist/{chunk-4NZHHGVL.js → chunk-7BDZTALN.js} +4 -1
  102. package/dist/chunk-7BDZTALN.js.map +1 -0
  103. package/dist/{chunk-NS5ETDYD.js → chunk-7BEPVIH3.js} +3 -3
  104. package/dist/{chunk-JG22O53B.js → chunk-7CBKAQIG.js} +2 -1
  105. package/dist/chunk-7CBKAQIG.js.map +1 -0
  106. package/dist/{chunk-LYIZXQYY.js → chunk-7KFIMGMP.js} +2 -2
  107. package/dist/{chunk-LWVO2QZV.js → chunk-7QOO4LGC.js} +56 -56
  108. package/dist/chunk-AAXJNINV.js +55 -0
  109. package/dist/chunk-AAXJNINV.js.map +1 -0
  110. package/dist/{chunk-56BSXSHC.js → chunk-AB3A7EFH.js} +31 -2
  111. package/dist/{chunk-56BSXSHC.js.map → chunk-AB3A7EFH.js.map} +1 -1
  112. package/dist/{chunk-CCTVAVTT.js → chunk-AUO2LJ3K.js} +2 -2
  113. package/dist/{chunk-ALCJRQ72.js → chunk-AYDDB3XI.js} +2 -2
  114. package/dist/{chunk-3TMYV3LP.js → chunk-AYYGRVRP.js} +5 -5
  115. package/dist/{chunk-W6TSGWYS.js → chunk-AZAA5DNP.js} +2 -2
  116. package/dist/{chunk-WTOE7CW4.js → chunk-BKYPJUQL.js} +122 -16
  117. package/dist/chunk-BKYPJUQL.js.map +1 -0
  118. package/dist/{chunk-6JJT5AKI.js → chunk-BQUEAVNW.js} +2 -2
  119. package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
  120. package/dist/{chunk-CEH2AFXG.js → chunk-C24UZSFW.js} +6 -6
  121. package/dist/{chunk-ZPN7W3OP.js → chunk-CDUUDBWJ.js} +3 -3
  122. package/dist/{chunk-35NN3ZFA.js → chunk-CTVWELNK.js} +21 -3
  123. package/dist/chunk-CTVWELNK.js.map +1 -0
  124. package/dist/{chunk-Y23B2QXP.js → chunk-D27J626P.js} +2 -2
  125. package/dist/{chunk-2572MRP2.js → chunk-DHTQP334.js} +2 -2
  126. package/dist/{chunk-HJQZQUPC.js → chunk-DJZWNKFO.js} +5 -5
  127. package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
  128. package/dist/{chunk-VJ6ECBIP.js → chunk-E4MVQQVX.js} +2 -2
  129. package/dist/{chunk-SYJ6EKKE.js → chunk-EIVIB73I.js} +2 -2
  130. package/dist/{chunk-HUNSEO5U.js → chunk-EV3YFLCB.js} +2 -2
  131. package/dist/{chunk-GEULB2VI.js → chunk-FC7TIRFS.js} +21 -1
  132. package/dist/chunk-FC7TIRFS.js.map +1 -0
  133. package/dist/{chunk-VPGRXEAB.js → chunk-G57LQRP6.js} +2 -2
  134. package/dist/{chunk-BC4QD3FM.js → chunk-GN55KU2P.js} +2 -2
  135. package/dist/{chunk-4W6INNXO.js → chunk-GUXS322H.js} +2 -2
  136. package/dist/{chunk-DBXZZIDU.js → chunk-H5FW4S5Q.js} +434 -693
  137. package/dist/chunk-H5FW4S5Q.js.map +1 -0
  138. package/dist/chunk-I32NKXE2.js +879 -0
  139. package/dist/chunk-I32NKXE2.js.map +1 -0
  140. package/dist/{chunk-3MADV4YC.js → chunk-IQSC3V2E.js} +2 -2
  141. package/dist/{chunk-UYCIS6V5.js → chunk-JCWY73FK.js} +2 -2
  142. package/dist/{chunk-T42L3S6A.js → chunk-LBWQ65SX.js} +4 -4
  143. package/dist/{chunk-MSTNSVXI.js → chunk-LDBFXD4F.js} +2 -1
  144. package/dist/chunk-LDBFXD4F.js.map +1 -0
  145. package/dist/{chunk-CEQF6L5K.js → chunk-LUNJ3WFO.js} +9 -7
  146. package/dist/chunk-LUNJ3WFO.js.map +1 -0
  147. package/dist/{chunk-256FBCVX.js → chunk-M4AHBM72.js} +7 -7
  148. package/dist/{chunk-YEQEGSJA.js → chunk-MBDJJTAT.js} +3 -3
  149. package/dist/{chunk-IAY7YBXS.js → chunk-MRTUN665.js} +2 -2
  150. package/dist/{chunk-JFJ3MHGV.js → chunk-NXKJHSDN.js} +1 -1
  151. package/dist/chunk-NXKJHSDN.js.map +1 -0
  152. package/dist/{chunk-R3AAOKR2.js → chunk-NZWEEALH.js} +2 -2
  153. package/dist/{chunk-I2HTKOOP.js → chunk-ODZG724P.js} +2 -2
  154. package/dist/{chunk-7QFBLYFP.js → chunk-OJD4WS2E.js} +3 -3
  155. package/dist/{chunk-CUS6S7PN.js → chunk-OLWTCWQ2.js} +9 -9
  156. package/dist/chunk-OLWTCWQ2.js.map +1 -0
  157. package/dist/{chunk-53ENM6F6.js → chunk-P4DHENRE.js} +2 -2
  158. package/dist/{chunk-DEFI2QBT.js → chunk-PAYGC3BD.js} +52 -22
  159. package/dist/chunk-PAYGC3BD.js.map +1 -0
  160. package/dist/{chunk-KPBLJCCV.js → chunk-PDVQ5JU3.js} +2 -2
  161. package/dist/{chunk-7BY7V4YX.js → chunk-Q4WONDMJ.js} +4 -3
  162. package/dist/{chunk-7BY7V4YX.js.map → chunk-Q4WONDMJ.js.map} +1 -1
  163. package/dist/{chunk-ESCQ6LY7.js → chunk-QFMO32TO.js} +3 -3
  164. package/dist/{chunk-HQSPXTQO.js → chunk-QXIQPCCN.js} +1 -1
  165. package/dist/{chunk-CFRBTATE.js → chunk-R47WINCY.js} +3 -3
  166. package/dist/{chunk-G72IPMR7.js → chunk-R4OCGPSH.js} +2 -2
  167. package/dist/{chunk-LCU5R6TQ.js → chunk-RAIUTAZZ.js} +22 -3
  168. package/dist/chunk-RAIUTAZZ.js.map +1 -0
  169. package/dist/chunk-RIAM7DND.js +167 -0
  170. package/dist/chunk-RIAM7DND.js.map +1 -0
  171. package/dist/{chunk-VZVP2W4O.js → chunk-RK4WXUI2.js} +2 -2
  172. package/dist/{chunk-JBPKEARU.js → chunk-RKNJBZ55.js} +4 -4
  173. package/dist/{chunk-6L27N6YI.js → chunk-S7Q5CM7E.js} +2 -2
  174. package/dist/{chunk-CTQRPANJ.js → chunk-SVSRPG6M.js} +2 -2
  175. package/dist/{chunk-GXWDWOWP.js → chunk-TDKSCV62.js} +2 -2
  176. package/dist/{chunk-S2VBSTTA.js → chunk-THG4GYIE.js} +2 -2
  177. package/dist/{chunk-IXRC7EQG.js → chunk-TR7DGXGI.js} +2 -2
  178. package/dist/{chunk-63FHSH7E.js → chunk-TYUS5TLG.js} +4 -4
  179. package/dist/{chunk-7PWWGYGO.js → chunk-URHCUXKI.js} +2 -2
  180. package/dist/{chunk-Z54TXZ2F.js → chunk-VA5KMSAE.js} +16 -7
  181. package/dist/chunk-VA5KMSAE.js.map +1 -0
  182. package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
  183. package/dist/{chunk-MUJ4QFUQ.js → chunk-W4BMEGQA.js} +4 -4
  184. package/dist/{chunk-5HK3CJAR.js → chunk-W675UJCZ.js} +2 -2
  185. package/dist/{chunk-3PXVYJMC.js → chunk-WN5FSGLE.js} +2077 -215
  186. package/dist/chunk-WN5FSGLE.js.map +1 -0
  187. package/dist/{chunk-3RHFGGI5.js → chunk-YF6UHWOV.js} +30 -10
  188. package/dist/chunk-YF6UHWOV.js.map +1 -0
  189. package/dist/{chunk-X5SDZMO7.js → chunk-YHCBJULX.js} +2 -2
  190. package/dist/{chunk-5UYSCYR7.js → chunk-Z4RPXHJH.js} +4 -4
  191. package/dist/{cli-Pulnz-qm.d.ts → cli-ChKeYMZv.d.ts} +5 -5
  192. package/dist/cli.d.ts +25 -25
  193. package/dist/cli.js +81 -78
  194. package/dist/coding/pre-action-gate.d.ts +2 -60
  195. package/dist/compounding/engine.d.ts +4 -2
  196. package/dist/compounding/engine.js +17 -16
  197. package/dist/compounding/preference-consolidator.d.ts +3 -1
  198. package/dist/compression-optimizer.d.ts +3 -1
  199. package/dist/config.d.ts +3 -1
  200. package/dist/config.js +11 -1
  201. package/dist/connectors/codex-materialize-runner.d.ts +3 -1
  202. package/dist/connectors/codex-materialize-runner.js +16 -15
  203. package/dist/connectors/codex-materialize.d.ts +3 -1
  204. package/dist/connectors/index.d.ts +3 -1
  205. package/dist/connectors/index.js +16 -15
  206. package/dist/consolidation-provenance-check.d.ts +4 -2
  207. package/dist/consolidation-undo.d.ts +4 -2
  208. package/dist/contradiction/index.d.ts +10 -270
  209. package/dist/contradiction/index.js +20 -7
  210. package/dist/{contradiction-review-QKJH5DKD.js → contradiction-review-WRVLRWHS.js} +6 -2
  211. package/dist/{contradiction-scan-VOTQRRSX.js → contradiction-scan-AKUWPX5N.js} +5 -3
  212. package/dist/converge-config.d.ts +3 -1
  213. package/dist/convergence-refresh.d.ts +4 -2
  214. package/dist/convergence-refresh.js +18 -17
  215. package/dist/conversation-index/backend.d.ts +3 -1
  216. package/dist/conversation-index/chunker.d.ts +3 -1
  217. package/dist/conversation-index/faiss-adapter.d.ts +3 -1
  218. package/dist/conversation-index/indexer.d.ts +3 -1
  219. package/dist/conversation-index/search.d.ts +3 -1
  220. package/dist/corpus-watermark.d.ts +3 -1
  221. package/dist/corpus-watermark.js +18 -17
  222. package/dist/cross-lingual-recall.d.ts +3 -1
  223. package/dist/day-summary.d.ts +3 -1
  224. package/dist/delinearize.d.ts +3 -1
  225. package/dist/dependency-propagation-config.d.ts +3 -1
  226. package/dist/{dependency-propagation-delivery-Co17gxYb.d.ts → dependency-propagation-delivery-B8ZMBBCY.d.ts} +1 -1
  227. package/dist/direct-answer-wiring.d.ts +3 -1
  228. package/dist/direct-answer.d.ts +3 -1
  229. package/dist/embedding-fallback.d.ts +3 -1
  230. package/dist/enrichment/index.d.ts +3 -1
  231. package/dist/entity-origin-fields.d.ts +3 -1
  232. package/dist/entity-retrieval.d.ts +4 -2
  233. package/dist/entity-retrieval.js +16 -15
  234. package/dist/entity-schema.d.ts +3 -1
  235. package/dist/episodic-context.d.ts +3 -1
  236. package/dist/explicit-capture.d.ts +12 -12
  237. package/dist/explicit-capture.js +7 -6
  238. package/dist/external-wiki-access.d.ts +41 -42
  239. package/dist/external-wiki-access.js +37 -36
  240. package/dist/external-wiki-collection-registration.d.ts +3 -1
  241. package/dist/external-wiki-collection.d.ts +3 -1
  242. package/dist/external-wiki-mcp-tools.d.ts +40 -40
  243. package/dist/extraction-error-classification.d.ts +3 -1
  244. package/dist/extraction-faithfulness.d.ts +3 -1
  245. package/dist/extraction-judge-telemetry.d.ts +3 -1
  246. package/dist/extraction-judge-training.d.ts +3 -1
  247. package/dist/extraction-judge.d.ts +3 -1
  248. package/dist/extraction-judge.js +2 -2
  249. package/dist/extraction-liveness.d.ts +3 -1
  250. package/dist/extraction-normalization.d.ts +3 -1
  251. package/dist/extraction-normalization.js +2 -2
  252. package/dist/extraction-prompt.d.ts +4 -2
  253. package/dist/extraction-prompt.js +1 -1
  254. package/dist/extraction-source-grounding-rules.d.ts +3 -1
  255. package/dist/extraction-source-grounding.d.ts +3 -1
  256. package/dist/extraction.d.ts +3 -1
  257. package/dist/extraction.js +22 -21
  258. package/dist/fallback-llm.d.ts +3 -1
  259. package/dist/graph-dashboard-diff.d.ts +3 -1
  260. package/dist/graph-dashboard-key.d.ts +3 -1
  261. package/dist/graph-dashboard-parser.d.ts +3 -1
  262. package/dist/graph-edge-reinforcement.d.ts +3 -1
  263. package/dist/graph-path-reconstruction.d.ts +3 -1
  264. package/dist/graph-path-scoring.d.ts +3 -1
  265. package/dist/graph-snapshot.d.ts +3 -1
  266. package/dist/graph.d.ts +3 -1
  267. package/dist/harmonic-retrieval.js +1 -1
  268. package/dist/importance.d.ts +3 -1
  269. package/dist/importers/index.d.ts +3 -1
  270. package/dist/in-flight-reads.d.ts +3 -1
  271. package/dist/index-CexDrJzC.d.ts +284 -0
  272. package/dist/index.d.ts +946 -707
  273. package/dist/index.js +253 -151
  274. package/dist/intent.d.ts +3 -1
  275. package/dist/lcm/engine.d.ts +3 -1
  276. package/dist/lcm/engine.js +3 -3
  277. package/dist/lcm/index.d.ts +3 -1
  278. package/dist/lcm/index.js +6 -6
  279. package/dist/lcm/tools.d.ts +3 -1
  280. package/dist/lifecycle.d.ts +3 -1
  281. package/dist/live-connectors-runner.d.ts +3 -1
  282. package/dist/local-llm.d.ts +3 -1
  283. package/dist/local-model-endpoint.d.ts +3 -1
  284. package/dist/maintenance/memory-governance.d.ts +3 -1
  285. package/dist/maintenance/memory-governance.js +16 -15
  286. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +4 -2
  287. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +16 -15
  288. package/dist/maintenance/rebuild-memory-projection.d.ts +4 -2
  289. package/dist/maintenance/rebuild-memory-projection.js +17 -16
  290. package/dist/{maintenance-DiSLtVN7.d.ts → maintenance-nkdtSrVr.d.ts} +3 -3
  291. package/dist/mcp-memory-inspector-app.d.ts +37 -37
  292. package/dist/mcp-read-only-tools.js +1 -1
  293. package/dist/memory-action-policy.d.ts +3 -1
  294. package/dist/memory-cache.d.ts +3 -1
  295. package/dist/memory-lifecycle-ledger-utils.d.ts +3 -1
  296. package/dist/memory-projection-store.d.ts +3 -1
  297. package/dist/memory-provenance.d.ts +3 -1
  298. package/dist/memory-snapshot.d.ts +3 -1
  299. package/dist/memory-subject-cli.d.ts +177 -0
  300. package/dist/memory-subject-cli.js +16 -0
  301. package/dist/memory-subject.d.ts +128 -0
  302. package/dist/memory-subject.js +44 -0
  303. package/dist/memory-subject.js.map +1 -0
  304. package/dist/memory-worth-outcomes.d.ts +7 -4
  305. package/dist/memory-worth-outcomes.js +1 -1
  306. package/dist/models-json.d.ts +3 -1
  307. package/dist/namespaces/migrate.d.ts +5 -3
  308. package/dist/namespaces/migrate.js +17 -16
  309. package/dist/namespaces/principal.d.ts +3 -1
  310. package/dist/namespaces/search.d.ts +3 -1
  311. package/dist/namespaces/search.js +6 -6
  312. package/dist/namespaces/storage.d.ts +5 -3
  313. package/dist/namespaces/storage.js +16 -15
  314. package/dist/native-knowledge.d.ts +3 -1
  315. package/dist/offline-sync-impression-drain.d.ts +3 -1
  316. package/dist/operator-doctor-corpus.d.ts +3 -1
  317. package/dist/operator-doctor-corpus.js +19 -18
  318. package/dist/operator-doctor-replica.d.ts +3 -1
  319. package/dist/operator-toolkit.d.ts +5 -3
  320. package/dist/operator-toolkit.js +29 -24
  321. package/dist/orchestration/compression-guideline-coordinator.d.ts +4 -2
  322. package/dist/orchestration/maintenance.d.ts +6 -4
  323. package/dist/orchestration/maintenance.js +22 -21
  324. package/dist/{orchestrator-DzCaxNS4.d.ts → orchestrator-Bvq1-RQs.d.ts} +23 -9
  325. package/dist/orchestrator.d.ts +12 -12
  326. package/dist/orchestrator.js +111 -108
  327. package/dist/patterns-cli.d.ts +3 -1
  328. package/dist/{pipeline-HJ8DKbFl.d.ts → pipeline-C8vfIiTX.d.ts} +1 -1
  329. package/dist/policy-runtime.d.ts +3 -1
  330. package/dist/proactive-contention.d.ts +3 -1
  331. package/dist/provenance.d.ts +3 -1
  332. package/dist/{public-http-DwXauTX3.d.ts → public-http-Cy0aYbys.d.ts} +1 -1
  333. package/dist/{qmd-BzxluoLt.d.ts → qmd-B9p1SZTZ.d.ts} +1 -1
  334. package/dist/qmd-preflight.d.ts +4 -2
  335. package/dist/qmd-recall-cache.d.ts +3 -1
  336. package/dist/qmd.d.ts +4 -2
  337. package/dist/qmd.js +4 -4
  338. package/dist/recall-concurrency-config.d.ts +3 -1
  339. package/dist/recall-disclosure-escalation.d.ts +3 -1
  340. package/dist/recall-explain-renderer.d.ts +3 -1
  341. package/dist/recall-explain-renderer.js +3 -3
  342. package/dist/recall-memory-map.d.ts +3 -1
  343. package/dist/recall-planner-llm.d.ts +3 -1
  344. package/dist/recall-state.d.ts +3 -1
  345. package/dist/recall-tag-filter.d.ts +3 -1
  346. package/dist/recall-timings.d.ts +3 -1
  347. package/dist/recall-xray-cli.d.ts +3 -1
  348. package/dist/recall-xray-cli.js +4 -4
  349. package/dist/recall-xray-renderer.d.ts +3 -1
  350. package/dist/recall-xray-renderer.js +3 -3
  351. package/dist/recall-xray.d.ts +3 -1
  352. package/dist/recall-xray.js +2 -2
  353. package/dist/reconcile/cursor.d.ts +3 -1
  354. package/dist/reconcile/manifest.d.ts +3 -1
  355. package/dist/reconcile/manifest.js +3 -3
  356. package/dist/reconcile/plan.d.ts +3 -1
  357. package/dist/replay/normalizers/chatgpt.d.ts +3 -1
  358. package/dist/replay/normalizers/claude.d.ts +3 -1
  359. package/dist/replay/normalizers/openclaw.d.ts +3 -1
  360. package/dist/replay/normalizers/shared.d.ts +3 -1
  361. package/dist/replay/runner.d.ts +3 -1
  362. package/dist/replay/types.d.ts +3 -1
  363. package/dist/replica-divergence.d.ts +3 -1
  364. package/dist/replica-peers-config.d.ts +3 -1
  365. package/dist/resolution-4552BNRV.js +36 -0
  366. package/dist/resolution-4552BNRV.js.map +1 -0
  367. package/dist/resolve-auth-token.d.ts +3 -1
  368. package/dist/resume-bundles.js +9 -2
  369. package/dist/retrieval-agents.d.ts +4 -2
  370. package/dist/retrieval-tiers.d.ts +3 -1
  371. package/dist/routing/engine.d.ts +3 -1
  372. package/dist/routing/store.d.ts +3 -1
  373. package/dist/salvage-envelope.d.ts +3 -1
  374. package/dist/salvage-envelope.js +10 -2
  375. package/dist/schemas.d.ts +130 -116
  376. package/dist/schemas.js +1 -1
  377. package/dist/{scope-profiles-CEMZz0t5.d.ts → scope-profiles-DLrRxFWR.d.ts} +1 -1
  378. package/dist/search/embed-helper.d.ts +3 -1
  379. package/dist/search/factory.d.ts +3 -1
  380. package/dist/search/factory.js +5 -5
  381. package/dist/search/index.d.ts +3 -1
  382. package/dist/search/index.js +9 -9
  383. package/dist/search/lancedb-backend.d.ts +3 -1
  384. package/dist/search/meilisearch-backend.d.ts +3 -1
  385. package/dist/search/noop-backend.d.ts +3 -1
  386. package/dist/search/orama-backend.d.ts +3 -1
  387. package/dist/search/port.d.ts +3 -1
  388. package/dist/search/remote-backend.d.ts +3 -1
  389. package/dist/{semantic-TddhF0y7.d.ts → semantic-BalR6EXU.d.ts} +1 -1
  390. package/dist/{semantic-consolidation-D9dYj6vu.d.ts → semantic-consolidation-DlN6xe20.d.ts} +1 -1
  391. package/dist/semantic-consolidation.d.ts +4 -2
  392. package/dist/semantic-consolidation.js +17 -16
  393. package/dist/semantic-rule-promotion.js +16 -15
  394. package/dist/semantic-rule-verifier.d.ts +3 -1
  395. package/dist/semantic-rule-verifier.js +16 -15
  396. package/dist/{service-_qgST_0y.d.ts → service-GkYyVfm9.d.ts} +2 -2
  397. package/dist/session-observer-bands.d.ts +3 -1
  398. package/dist/session-observer-state.d.ts +3 -1
  399. package/dist/shared-context/manager.d.ts +13 -11
  400. package/dist/signal.d.ts +3 -1
  401. package/dist/source-agent-qualifier.d.ts +3 -1
  402. package/dist/source-agent-qualifier.js +18 -17
  403. package/dist/{storage-B9lbNTYE.d.ts → storage-BIDzuKIn.d.ts} +3 -2
  404. package/dist/storage.d.ts +4 -2
  405. package/dist/storage.js +18 -17
  406. package/dist/subject-config.d.ts +40 -0
  407. package/dist/subject-config.js +20 -0
  408. package/dist/subject-config.js.map +1 -0
  409. package/dist/summarizer.d.ts +3 -1
  410. package/dist/summary-snapshot.d.ts +3 -1
  411. package/dist/support-passport/index.d.ts +43 -43
  412. package/dist/support-passport/index.js +39 -38
  413. package/dist/temporal-supersession.d.ts +4 -2
  414. package/dist/temporal-timeline-recall.d.ts +3 -1
  415. package/dist/temporal-validity.d.ts +3 -1
  416. package/dist/threading.d.ts +3 -1
  417. package/dist/tier-migration.d.ts +4 -2
  418. package/dist/tier-routing.d.ts +3 -1
  419. package/dist/topics.d.ts +3 -1
  420. package/dist/transcript.d.ts +3 -1
  421. package/dist/transfer/backup.js +2 -2
  422. package/dist/transfer/capsule-export.js +2 -2
  423. package/dist/transfer/capsule-import.js +2 -2
  424. package/dist/transfer/types.d.ts +86 -86
  425. package/dist/trust-score-stage.d.ts +3 -1
  426. package/dist/trust-score.d.ts +3 -1
  427. package/dist/{types-BrEzuxPA.d.ts → types-BxAcOl5Q.d.ts} +360 -32
  428. package/dist/types.d.ts +3 -1
  429. package/dist/types.js +1 -1
  430. package/dist/utility-runtime.d.ts +3 -1
  431. package/dist/verified-recall.js +16 -15
  432. package/dist/who-knows-cli.d.ts +40 -40
  433. package/dist/who-knows-cli.js +17 -16
  434. package/dist/who-knows.d.ts +42 -42
  435. package/dist/who-knows.js +16 -15
  436. package/dist/write-envelope.d.ts +7 -2
  437. package/dist/write-envelope.js +10 -1
  438. package/package.json +2 -2
  439. package/scripts/build-with-heap.mjs +1 -1
  440. package/src/access-boundary.ts +6 -0
  441. package/src/access-http.ts +6 -5
  442. package/src/access-mcp-admin-tools.ts +38 -0
  443. package/src/access-mcp-output-schemas.ts +20 -0
  444. package/src/access-mcp.ts +8 -8
  445. package/src/access-operations-batch.ts +13 -0
  446. package/src/access-service.ts +112 -0
  447. package/src/access-surface-catalog.test.ts +24 -0
  448. package/src/access-surface-catalog.ts +6 -0
  449. package/src/coding/action-gate.test.ts +341 -0
  450. package/src/coding/action-gate.ts +556 -0
  451. package/src/config.ts +15 -17
  452. package/src/contradiction/contradiction-review.ts +50 -4
  453. package/src/contradiction/contradiction-scan.ts +14 -3
  454. package/src/contradiction/resolution.ts +50 -2
  455. package/src/extraction-prompt.ts +1 -0
  456. package/src/extraction.ts +4 -1
  457. package/src/index.ts +9 -9
  458. package/src/mcp-read-only-tools.ts +1 -0
  459. package/src/memory-subject-cli.ts +135 -0
  460. package/src/memory-subject.test.ts +48 -0
  461. package/src/memory-subject.ts +314 -0
  462. package/src/memory-worth-outcomes.test.ts +6 -2
  463. package/src/memory-worth-outcomes.ts +11 -7
  464. package/src/operator-toolkit.ts +1 -1
  465. package/src/orchestration/extraction-persist.ts +48 -48
  466. package/src/orchestration/recall-internal.ts +6 -5
  467. package/src/orchestration/recall-rerank-coordinator.ts +123 -4
  468. package/src/orchestration/recall-result-formatter.ts +6 -2
  469. package/src/orchestration/recall-search-pipeline.ts +14 -1
  470. package/src/preferences/drift-config.ts +118 -0
  471. package/src/preferences/drift-recall.ts +133 -0
  472. package/src/preferences/drift-types.ts +87 -0
  473. package/src/preferences/index.ts +12 -0
  474. package/src/preferences/preference-drift.test.ts +690 -0
  475. package/src/preferences/preference-drift.ts +724 -0
  476. package/src/procedural/library-maintenance.test.ts +582 -0
  477. package/src/procedural/library-maintenance.ts +546 -0
  478. package/src/procedural/maintenance-config.ts +78 -0
  479. package/src/procedural/procedure-recall.ts +29 -1
  480. package/src/procedural/procedure-stats.ts +20 -0
  481. package/src/review/review-deck-access.test.ts +325 -0
  482. package/src/review/review-deck-http-base.ts +133 -0
  483. package/src/review/review-deck-mutation.test.ts +417 -0
  484. package/src/review/review-deck-mutation.ts +677 -0
  485. package/src/review/review-deck-snapshot.ts +196 -0
  486. package/src/review/review-deck-surface.ts +117 -0
  487. package/src/review/review-deck.test.ts +347 -0
  488. package/src/review/review-deck.ts +311 -0
  489. package/src/schemas.ts +7 -0
  490. package/src/spaces/index.ts +38 -2
  491. package/src/storage.ts +10 -8
  492. package/src/subject-config.ts +80 -0
  493. package/src/types.ts +33 -32
  494. package/src/write-envelope.test.ts +14 -0
  495. package/src/write-envelope.ts +24 -3
  496. package/dist/chunk-35NN3ZFA.js.map +0 -1
  497. package/dist/chunk-3PXVYJMC.js.map +0 -1
  498. package/dist/chunk-3RHFGGI5.js.map +0 -1
  499. package/dist/chunk-4NZHHGVL.js.map +0 -1
  500. package/dist/chunk-CEQF6L5K.js.map +0 -1
  501. package/dist/chunk-CUS6S7PN.js.map +0 -1
  502. package/dist/chunk-DBXZZIDU.js.map +0 -1
  503. package/dist/chunk-DEFI2QBT.js.map +0 -1
  504. package/dist/chunk-EIR5VLIH.js.map +0 -1
  505. package/dist/chunk-GEULB2VI.js.map +0 -1
  506. package/dist/chunk-JFJ3MHGV.js.map +0 -1
  507. package/dist/chunk-JG22O53B.js.map +0 -1
  508. package/dist/chunk-LCU5R6TQ.js.map +0 -1
  509. package/dist/chunk-MDVBCPOS.js +0 -402
  510. package/dist/chunk-MDVBCPOS.js.map +0 -1
  511. package/dist/chunk-MSTNSVXI.js.map +0 -1
  512. package/dist/chunk-WTOE7CW4.js.map +0 -1
  513. package/dist/chunk-YQ3CBLL4.js.map +0 -1
  514. package/dist/chunk-Z54TXZ2F.js.map +0 -1
  515. package/dist/resolution-DKMBPXHI.js +0 -18
  516. /package/dist/{capsule-crypto-7FJQINUR.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
  517. /package/dist/{chunk-MIBKEW7A.js.map → chunk-2VXWFYJE.js.map} +0 -0
  518. /package/dist/{chunk-3YTTAGPB.js.map → chunk-3DVBKTSO.js.map} +0 -0
  519. /package/dist/{chunk-JTSVMJHV.js.map → chunk-4XDGYCZI.js.map} +0 -0
  520. /package/dist/{chunk-HQSBYI5X.js.map → chunk-57HVIG5U.js.map} +0 -0
  521. /package/dist/{chunk-PMVPCZJZ.js.map → chunk-6433HV72.js.map} +0 -0
  522. /package/dist/{chunk-N6TRHP72.js.map → chunk-6TAX66IA.js.map} +0 -0
  523. /package/dist/{chunk-AGKIG3YA.js.map → chunk-6VALIZKG.js.map} +0 -0
  524. /package/dist/{chunk-NS5ETDYD.js.map → chunk-7BEPVIH3.js.map} +0 -0
  525. /package/dist/{chunk-LYIZXQYY.js.map → chunk-7KFIMGMP.js.map} +0 -0
  526. /package/dist/{chunk-LWVO2QZV.js.map → chunk-7QOO4LGC.js.map} +0 -0
  527. /package/dist/{chunk-CCTVAVTT.js.map → chunk-AUO2LJ3K.js.map} +0 -0
  528. /package/dist/{chunk-ALCJRQ72.js.map → chunk-AYDDB3XI.js.map} +0 -0
  529. /package/dist/{chunk-3TMYV3LP.js.map → chunk-AYYGRVRP.js.map} +0 -0
  530. /package/dist/{chunk-W6TSGWYS.js.map → chunk-AZAA5DNP.js.map} +0 -0
  531. /package/dist/{chunk-6JJT5AKI.js.map → chunk-BQUEAVNW.js.map} +0 -0
  532. /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  533. /package/dist/{chunk-CEH2AFXG.js.map → chunk-C24UZSFW.js.map} +0 -0
  534. /package/dist/{chunk-ZPN7W3OP.js.map → chunk-CDUUDBWJ.js.map} +0 -0
  535. /package/dist/{chunk-Y23B2QXP.js.map → chunk-D27J626P.js.map} +0 -0
  536. /package/dist/{chunk-2572MRP2.js.map → chunk-DHTQP334.js.map} +0 -0
  537. /package/dist/{chunk-HJQZQUPC.js.map → chunk-DJZWNKFO.js.map} +0 -0
  538. /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
  539. /package/dist/{chunk-VJ6ECBIP.js.map → chunk-E4MVQQVX.js.map} +0 -0
  540. /package/dist/{chunk-SYJ6EKKE.js.map → chunk-EIVIB73I.js.map} +0 -0
  541. /package/dist/{chunk-HUNSEO5U.js.map → chunk-EV3YFLCB.js.map} +0 -0
  542. /package/dist/{chunk-VPGRXEAB.js.map → chunk-G57LQRP6.js.map} +0 -0
  543. /package/dist/{chunk-BC4QD3FM.js.map → chunk-GN55KU2P.js.map} +0 -0
  544. /package/dist/{chunk-4W6INNXO.js.map → chunk-GUXS322H.js.map} +0 -0
  545. /package/dist/{chunk-3MADV4YC.js.map → chunk-IQSC3V2E.js.map} +0 -0
  546. /package/dist/{chunk-UYCIS6V5.js.map → chunk-JCWY73FK.js.map} +0 -0
  547. /package/dist/{chunk-T42L3S6A.js.map → chunk-LBWQ65SX.js.map} +0 -0
  548. /package/dist/{chunk-256FBCVX.js.map → chunk-M4AHBM72.js.map} +0 -0
  549. /package/dist/{chunk-YEQEGSJA.js.map → chunk-MBDJJTAT.js.map} +0 -0
  550. /package/dist/{chunk-IAY7YBXS.js.map → chunk-MRTUN665.js.map} +0 -0
  551. /package/dist/{chunk-R3AAOKR2.js.map → chunk-NZWEEALH.js.map} +0 -0
  552. /package/dist/{chunk-I2HTKOOP.js.map → chunk-ODZG724P.js.map} +0 -0
  553. /package/dist/{chunk-7QFBLYFP.js.map → chunk-OJD4WS2E.js.map} +0 -0
  554. /package/dist/{chunk-53ENM6F6.js.map → chunk-P4DHENRE.js.map} +0 -0
  555. /package/dist/{chunk-KPBLJCCV.js.map → chunk-PDVQ5JU3.js.map} +0 -0
  556. /package/dist/{chunk-ESCQ6LY7.js.map → chunk-QFMO32TO.js.map} +0 -0
  557. /package/dist/{chunk-HQSPXTQO.js.map → chunk-QXIQPCCN.js.map} +0 -0
  558. /package/dist/{chunk-CFRBTATE.js.map → chunk-R47WINCY.js.map} +0 -0
  559. /package/dist/{chunk-G72IPMR7.js.map → chunk-R4OCGPSH.js.map} +0 -0
  560. /package/dist/{chunk-VZVP2W4O.js.map → chunk-RK4WXUI2.js.map} +0 -0
  561. /package/dist/{chunk-JBPKEARU.js.map → chunk-RKNJBZ55.js.map} +0 -0
  562. /package/dist/{chunk-6L27N6YI.js.map → chunk-S7Q5CM7E.js.map} +0 -0
  563. /package/dist/{chunk-CTQRPANJ.js.map → chunk-SVSRPG6M.js.map} +0 -0
  564. /package/dist/{chunk-GXWDWOWP.js.map → chunk-TDKSCV62.js.map} +0 -0
  565. /package/dist/{chunk-S2VBSTTA.js.map → chunk-THG4GYIE.js.map} +0 -0
  566. /package/dist/{chunk-IXRC7EQG.js.map → chunk-TR7DGXGI.js.map} +0 -0
  567. /package/dist/{chunk-63FHSH7E.js.map → chunk-TYUS5TLG.js.map} +0 -0
  568. /package/dist/{chunk-7PWWGYGO.js.map → chunk-URHCUXKI.js.map} +0 -0
  569. /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
  570. /package/dist/{chunk-MUJ4QFUQ.js.map → chunk-W4BMEGQA.js.map} +0 -0
  571. /package/dist/{chunk-5HK3CJAR.js.map → chunk-W675UJCZ.js.map} +0 -0
  572. /package/dist/{chunk-X5SDZMO7.js.map → chunk-YHCBJULX.js.map} +0 -0
  573. /package/dist/{chunk-5UYSCYR7.js.map → chunk-Z4RPXHJH.js.map} +0 -0
  574. /package/dist/{contradiction-review-QKJH5DKD.js.map → contradiction-review-WRVLRWHS.js.map} +0 -0
  575. /package/dist/{contradiction-scan-VOTQRRSX.js.map → contradiction-scan-AKUWPX5N.js.map} +0 -0
  576. /package/dist/{resolution-DKMBPXHI.js.map → memory-subject-cli.js.map} +0 -0
@@ -0,0 +1,879 @@
1
+ import {
2
+ judgeContradictionPairs,
3
+ resolveScanStorage
4
+ } from "./chunk-Q4WONDMJ.js";
5
+ import {
6
+ CONTRADICTION_VERBS,
7
+ PREFERENCE_DRIFT_VERBS,
8
+ computeMemoryContentHash,
9
+ readPair,
10
+ resolvePair,
11
+ writePairs
12
+ } from "./chunk-CTVWELNK.js";
13
+ import {
14
+ composeMemoryEnvelope
15
+ } from "./chunk-RAIUTAZZ.js";
16
+ import {
17
+ bumpMemoryCorpusVersionForDir
18
+ } from "./chunk-XCB6QDL6.js";
19
+ import {
20
+ readJsonFile,
21
+ writeJsonFileAtomic
22
+ } from "./chunk-P77QX3ID.js";
23
+ import {
24
+ log
25
+ } from "./chunk-3WCASNQZ.js";
26
+
27
+ // src/preferences/preference-drift.ts
28
+ import path from "path";
29
+ var DRIFT_ACTOR = "preference-drift";
30
+ var DRIFT_RULE_VERSION = "preference-drift:1";
31
+ var DAY_MS = 24 * 60 * 60 * 1e3;
32
+ var EVIDENCE_LOOKUP_LIMIT = 5;
33
+ function driftMarkerPath(memoryDir) {
34
+ return path.join(memoryDir, "state", "preference-drift.json");
35
+ }
36
+ async function readPreferenceDriftMarker(memoryDir) {
37
+ try {
38
+ const raw = await readJsonFile(driftMarkerPath(memoryDir));
39
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw)) return null;
40
+ const m = raw;
41
+ if (typeof m.lastRunAt !== "string") return null;
42
+ return {
43
+ schemaVersion: 1,
44
+ lastRunAt: m.lastRunAt,
45
+ lastApplyAt: typeof m.lastApplyAt === "string" ? m.lastApplyAt : null,
46
+ appliedCount: typeof m.appliedCount === "number" ? m.appliedCount : 0
47
+ };
48
+ } catch {
49
+ return null;
50
+ }
51
+ }
52
+ function tsMs(value) {
53
+ if (typeof value !== "string") return null;
54
+ const ms = Date.parse(value);
55
+ return Number.isFinite(ms) ? ms : null;
56
+ }
57
+ var CANDIDATE_STATUSES = { active: true };
58
+ function compareCandidates(a, b) {
59
+ const aMs = tsMs(a.frontmatter.created) ?? tsMs(a.frontmatter.updated) ?? 0;
60
+ const bMs = tsMs(b.frontmatter.created) ?? tsMs(b.frontmatter.updated) ?? 0;
61
+ if (aMs !== bMs) return aMs < bMs ? -1 : 1;
62
+ const aId = a.frontmatter.id ?? "";
63
+ const bId = b.frontmatter.id ?? "";
64
+ if (aId !== bId) return aId < bId ? -1 : 1;
65
+ return 0;
66
+ }
67
+ async function gatherEvidence(preference, lookup, byId, windowStartMs, nowMs) {
68
+ let raw;
69
+ try {
70
+ raw = await lookup(preference.content, EVIDENCE_LOOKUP_LIMIT);
71
+ } catch (err) {
72
+ log.debug("[preference-drift] evidence lookup failed", {
73
+ memoryId: preference.frontmatter.id,
74
+ error: err instanceof Error ? err.message : String(err)
75
+ });
76
+ return { ok: false, reason: "backend_unavailable" };
77
+ }
78
+ const hits = [];
79
+ const hitMemories = [];
80
+ for (const hit of raw) {
81
+ if (hit.id === preference.frontmatter.id) continue;
82
+ const memory = byId.get(hit.id);
83
+ if (!memory) continue;
84
+ const observedMs = tsMs(memory.frontmatter.updated) ?? tsMs(memory.frontmatter.created);
85
+ if (observedMs === null) continue;
86
+ if (observedMs < windowStartMs || observedMs >= nowMs) continue;
87
+ hits.push({
88
+ memoryId: hit.id,
89
+ score: hit.score,
90
+ observedAt: memory.frontmatter.updated ?? memory.frontmatter.created ?? ""
91
+ });
92
+ hitMemories.push(memory);
93
+ }
94
+ return { ok: true, hits, hitMemories };
95
+ }
96
+ function classifyFromVerdicts(verdicts) {
97
+ const contradiction = verdicts.find((v) => v.verdict === "contradicts");
98
+ if (contradiction) {
99
+ return {
100
+ classification: "drifted",
101
+ reason: `recent evidence points away from this preference: ${contradiction.rationale}`,
102
+ driftedAgainst: contradiction.memoryIdB
103
+ };
104
+ }
105
+ const restatement = verdicts.find((v) => v.verdict === "duplicates");
106
+ if (restatement) {
107
+ return {
108
+ classification: "corroborated",
109
+ reason: `recent evidence restates this preference: ${restatement.rationale}`
110
+ };
111
+ }
112
+ if (verdicts.some((v) => v.verdict === "needs-user")) {
113
+ return {
114
+ classification: "skipped",
115
+ skipped: "verification_unavailable",
116
+ reason: "recent evidence found but no judge verdict was available to classify it"
117
+ };
118
+ }
119
+ return {
120
+ classification: "stale",
121
+ reason: "recent evidence is independent of this preference \u2014 no corroboration either way"
122
+ };
123
+ }
124
+ async function runPreferenceDriftScan(deps) {
125
+ const startTime = Date.now();
126
+ const now = deps.now ?? /* @__PURE__ */ new Date();
127
+ const nowIso = now.toISOString();
128
+ const nowMs = now.getTime();
129
+ const mode = deps.apply === true ? "apply" : "shadow";
130
+ const cfg = deps.config.driftDetection;
131
+ const emptyCounts = {
132
+ corroborated: 0,
133
+ stale: 0,
134
+ drifted: 0,
135
+ skipped: 0
136
+ };
137
+ if (cfg?.enabled !== true) {
138
+ return {
139
+ schemaVersion: 1,
140
+ generatedAt: nowIso,
141
+ mode,
142
+ scanned: 0,
143
+ eligible: 0,
144
+ findings: [],
145
+ counts: emptyCounts,
146
+ appliedCount: 0,
147
+ reviewItemsOpened: 0,
148
+ elapsedMs: Date.now() - startTime,
149
+ skippedReason: "drift_disabled"
150
+ };
151
+ }
152
+ if (cfg.maxCandidatesPerRun === 0) {
153
+ return {
154
+ schemaVersion: 1,
155
+ generatedAt: nowIso,
156
+ mode,
157
+ scanned: 0,
158
+ eligible: 0,
159
+ findings: [],
160
+ counts: emptyCounts,
161
+ appliedCount: 0,
162
+ reviewItemsOpened: 0,
163
+ elapsedMs: Date.now() - startTime,
164
+ skippedReason: "scan_disabled"
165
+ };
166
+ }
167
+ const { storage, namespace } = await resolveScanStorage(deps, deps.namespace?.trim() || void 0);
168
+ const lookup = deps.embeddingLookupFactory ? deps.embeddingLookupFactory(storage) : deps.embeddingLookup;
169
+ let all;
170
+ try {
171
+ all = await storage.readAllMemories();
172
+ } catch (err) {
173
+ log.warn(
174
+ `[preference-drift] failed to read memories: ${err instanceof Error ? err.message : String(err)}`
175
+ );
176
+ all = [];
177
+ }
178
+ const byId = /* @__PURE__ */ new Map();
179
+ for (const m of all) {
180
+ const id = m.frontmatter.id;
181
+ if (typeof id === "string" && id.length > 0) byId.set(id, m);
182
+ }
183
+ const minAgeMs = cfg.minAgeDays * DAY_MS;
184
+ const eligible = all.filter((m) => {
185
+ const fm = m.frontmatter;
186
+ if (fm.category !== "preference") return false;
187
+ if (CANDIDATE_STATUSES[fm.status ?? "active"] !== true) return false;
188
+ if (typeof fm.id !== "string" || fm.id.length === 0) return false;
189
+ if (!m.content || m.content.trim().length === 0) return false;
190
+ const bornMs = tsMs(fm.created) ?? tsMs(fm.updated);
191
+ if (bornMs === null) return false;
192
+ return nowMs - bornMs >= minAgeMs;
193
+ });
194
+ const candidates = [...eligible].sort(compareCandidates).slice(0, cfg.maxCandidatesPerRun);
195
+ const report = {
196
+ schemaVersion: 1,
197
+ generatedAt: nowIso,
198
+ mode,
199
+ namespace,
200
+ scanned: candidates.length,
201
+ eligible: eligible.length,
202
+ findings: [],
203
+ counts: { ...emptyCounts },
204
+ appliedCount: 0,
205
+ reviewItemsOpened: 0,
206
+ elapsedMs: 0
207
+ };
208
+ const windowStartMs = nowMs - cfg.lookbackDays * DAY_MS;
209
+ const judgeCache = /* @__PURE__ */ new Map();
210
+ const driftedPairs = [];
211
+ const stamps = [];
212
+ for (const preference of candidates) {
213
+ const bornMs = tsMs(preference.frontmatter.created) ?? tsMs(preference.frontmatter.updated) ?? nowMs;
214
+ const finding = {
215
+ memoryId: preference.frontmatter.id,
216
+ classification: "stale",
217
+ ageDays: Math.floor((nowMs - bornMs) / DAY_MS),
218
+ lastCorroborated: preference.frontmatter.lastCorroborated ?? null,
219
+ reason: "",
220
+ evidence: []
221
+ };
222
+ if (!lookup) {
223
+ finding.classification = "skipped";
224
+ finding.skipped = "backend_unavailable";
225
+ finding.reason = "no evidence lookup is configured, so corroboration cannot be checked";
226
+ report.findings.push(finding);
227
+ report.counts.skipped += 1;
228
+ continue;
229
+ }
230
+ const evidence = await gatherEvidence(preference, lookup, byId, windowStartMs, nowMs);
231
+ if (!evidence.ok) {
232
+ finding.classification = "skipped";
233
+ finding.skipped = evidence.reason;
234
+ finding.reason = "evidence lookup backend was unavailable \u2014 not classified as stale";
235
+ report.findings.push(finding);
236
+ report.counts.skipped += 1;
237
+ continue;
238
+ }
239
+ finding.evidence = evidence.hits;
240
+ if (evidence.hits.length === 0) {
241
+ finding.classification = "stale";
242
+ finding.reason = `no corroborating evidence in the last ${cfg.lookbackDays} days`;
243
+ report.findings.push(finding);
244
+ report.counts.stale += 1;
245
+ stamps.push({ memory: preference, patch: { driftState: "stale" }, reasonCode: "drift_stale" });
246
+ continue;
247
+ }
248
+ const judgeInputs = evidence.hitMemories.map((hit) => ({
249
+ memoryIdA: preference.frontmatter.id,
250
+ memoryIdB: hit.frontmatter.id,
251
+ textA: preference.content,
252
+ textB: hit.content,
253
+ categoryA: preference.frontmatter.category,
254
+ categoryB: hit.frontmatter.category
255
+ }));
256
+ const judged = await judgeContradictionPairs(
257
+ judgeInputs,
258
+ deps.config,
259
+ deps.localLlm,
260
+ deps.fallbackLlm,
261
+ judgeCache
262
+ );
263
+ const orderedVerdicts = [];
264
+ for (const input of judgeInputs) {
265
+ for (const result of judged.results.values()) {
266
+ if (result.memoryIdA === input.memoryIdA && result.memoryIdB === input.memoryIdB) {
267
+ orderedVerdicts.push(result);
268
+ break;
269
+ }
270
+ }
271
+ }
272
+ const outcome = classifyFromVerdicts(orderedVerdicts);
273
+ finding.classification = outcome.classification;
274
+ finding.reason = outcome.reason;
275
+ if (outcome.skipped) finding.skipped = outcome.skipped;
276
+ report.findings.push(finding);
277
+ report.counts[outcome.classification] += 1;
278
+ if (outcome.classification === "corroborated") {
279
+ stamps.push({
280
+ memory: preference,
281
+ patch: { lastCorroborated: nowIso, driftState: void 0 },
282
+ reasonCode: "drift_corroborated"
283
+ });
284
+ } else if (outcome.classification === "stale") {
285
+ stamps.push({ memory: preference, patch: { driftState: "stale" }, reasonCode: "drift_stale" });
286
+ } else if (outcome.classification === "drifted" && outcome.driftedAgainst) {
287
+ const verdict = orderedVerdicts.find((v) => v.verdict === "contradicts");
288
+ driftedPairs.push({
289
+ preference,
290
+ evidenceId: outcome.driftedAgainst,
291
+ finding,
292
+ rationale: verdict?.rationale ?? outcome.reason,
293
+ confidence: verdict?.confidence ?? 0
294
+ });
295
+ }
296
+ }
297
+ if (mode === "shadow") {
298
+ report.elapsedMs = Date.now() - startTime;
299
+ return report;
300
+ }
301
+ let writes = 0;
302
+ for (const stamp of stamps) {
303
+ try {
304
+ await storage.writeMemoryFrontmatter(stamp.memory, { ...stamp.patch, updated: nowIso }, {
305
+ at: now,
306
+ actor: DRIFT_ACTOR,
307
+ reasonCode: stamp.reasonCode,
308
+ ruleVersion: DRIFT_RULE_VERSION
309
+ });
310
+ writes += 1;
311
+ report.appliedCount += 1;
312
+ } catch (err) {
313
+ log.warn(
314
+ `[preference-drift] stamp ${stamp.reasonCode} on ${stamp.memory.frontmatter.id} failed: ${err instanceof Error ? err.message : String(err)}`
315
+ );
316
+ }
317
+ }
318
+ if (driftedPairs.length > 0) {
319
+ const queueEntries = driftedPairs.map((d) => ({
320
+ memoryIds: [d.preference.frontmatter.id, d.evidenceId],
321
+ kind: "preference-drift",
322
+ // A drift finding IS a detected conflict, so the honest verdict is
323
+ // `contradicts`; `kind` is what distinguishes it from a pair the
324
+ // contradiction scan produced. Existing review surfaces render it
325
+ // unchanged.
326
+ verdict: "contradicts",
327
+ rationale: d.rationale,
328
+ confidence: d.confidence,
329
+ detectedAt: nowIso,
330
+ memoryContentHashes: {
331
+ [d.preference.frontmatter.id]: computeMemoryContentHash(
332
+ d.preference.content,
333
+ d.preference.frontmatter.category
334
+ )
335
+ },
336
+ namespace
337
+ }));
338
+ const written = writePairs(deps.memoryDir, queueEntries);
339
+ report.reviewItemsOpened = written.length;
340
+ report.appliedCount += written.length;
341
+ for (const entry of written) {
342
+ const match = driftedPairs.find((d) => d.preference.frontmatter.id === entry.memoryIds[0]);
343
+ if (match) match.finding.reviewPairId = entry.pairId;
344
+ }
345
+ }
346
+ if (writes > 0) {
347
+ bumpMemoryCorpusVersionForDir(storage.dir);
348
+ if (storage.dir !== deps.memoryDir) bumpMemoryCorpusVersionForDir(deps.memoryDir);
349
+ }
350
+ try {
351
+ await writeJsonFileAtomic(driftMarkerPath(deps.memoryDir), {
352
+ schemaVersion: 1,
353
+ lastRunAt: nowIso,
354
+ lastApplyAt: nowIso,
355
+ appliedCount: report.appliedCount
356
+ });
357
+ } catch (err) {
358
+ log.warn(
359
+ `[preference-drift] failed to persist run marker: ${err instanceof Error ? err.message : String(err)}`
360
+ );
361
+ }
362
+ report.elapsedMs = Date.now() - startTime;
363
+ return report;
364
+ }
365
+ async function resolvePreferenceDrift(storage, pair, verb, options = {}) {
366
+ const now = options.now ?? /* @__PURE__ */ new Date();
367
+ const nowIso = now.toISOString();
368
+ const preferenceId = pair.memoryIds[0];
369
+ const preference = await storage.getMemoryById(preferenceId);
370
+ if (!preference) {
371
+ return { affectedIds: [], message: `Preference ${preferenceId} not found; not resolving ${pair.pairId}` };
372
+ }
373
+ const touched = () => {
374
+ try {
375
+ options.onMemoryWritten?.(pair.namespace, storage.dir);
376
+ } catch (err) {
377
+ log.warn(
378
+ `[preference-drift] catalog write touch failed for ${pair.pairId}: ${err instanceof Error ? err.message : String(err)}`
379
+ );
380
+ }
381
+ };
382
+ if (verb === "keep") {
383
+ await storage.writeMemoryFrontmatter(
384
+ preference,
385
+ { lastCorroborated: nowIso, driftState: void 0, updated: nowIso },
386
+ { at: now, actor: DRIFT_ACTOR, reasonCode: "drift_kept", ruleVersion: DRIFT_RULE_VERSION }
387
+ );
388
+ bumpMemoryCorpusVersionForDir(storage.dir);
389
+ touched();
390
+ return { affectedIds: [preferenceId], message: `Preference ${preferenceId} confirmed still current` };
391
+ }
392
+ if (verb === "archive") {
393
+ const archivedPath = await storage.archiveMemory(preference, {
394
+ at: now,
395
+ actor: DRIFT_ACTOR,
396
+ reasonCode: "drift_archived",
397
+ ruleVersion: DRIFT_RULE_VERSION,
398
+ relatedMemoryIds: [pair.memoryIds[1]]
399
+ });
400
+ if (archivedPath === null) {
401
+ return { affectedIds: [], message: `Preference ${preferenceId} could not be archived; not resolving` };
402
+ }
403
+ bumpMemoryCorpusVersionForDir(storage.dir);
404
+ touched();
405
+ return { affectedIds: [preferenceId], message: `Preference ${preferenceId} archived` };
406
+ }
407
+ const replacementText = options.mergedContent?.trim();
408
+ if (!replacementText) {
409
+ return {
410
+ affectedIds: [],
411
+ message: "supersede requires mergedContent carrying the updated preference; no memories changed"
412
+ };
413
+ }
414
+ const envelope = composeMemoryEnvelope(
415
+ {
416
+ content: replacementText,
417
+ category: "preference",
418
+ confidence: preference.frontmatter.confidence ?? 0.8,
419
+ tags: ["preference-drift", "supersede"],
420
+ entityRef: preference.frontmatter.entityRef
421
+ },
422
+ { source: DRIFT_ACTOR },
423
+ { salvage: true }
424
+ );
425
+ if (envelope.salvageNotes.length > 0) {
426
+ log.warn(`[preference-drift] supersede write salvaged invalid fields: ${envelope.salvageNotes.join("; ")}`);
427
+ }
428
+ const written = await storage.writeSealedMemory(envelope, {
429
+ actor: DRIFT_ACTOR,
430
+ lineage: [preferenceId],
431
+ // `update` is the operator for "newer version of the same claim" — the
432
+ // drift replacement restates one preference, it does not merge two.
433
+ derivedVia: "update"
434
+ });
435
+ if (written.tombstoneBlocked) {
436
+ return {
437
+ affectedIds: [],
438
+ message: `Replacement preference for ${pair.pairId} was tombstone-blocked (pending_review); not resolving \u2014 original kept active`
439
+ };
440
+ }
441
+ const superseded = await storage.supersedeMemory(
442
+ preferenceId,
443
+ written.id,
444
+ `preference drift resolved by supersede (${pair.pairId})`,
445
+ void 0,
446
+ { actor: DRIFT_ACTOR }
447
+ );
448
+ bumpMemoryCorpusVersionForDir(storage.dir);
449
+ touched();
450
+ if (!superseded) {
451
+ return {
452
+ affectedIds: [written.id],
453
+ message: `Replacement ${written.id} written but superseding ${preferenceId} failed; both remain \u2014 re-run resolution`
454
+ };
455
+ }
456
+ return {
457
+ affectedIds: [preferenceId, written.id],
458
+ message: `Preference ${preferenceId} superseded by ${written.id}`
459
+ };
460
+ }
461
+
462
+ // src/contradiction/resolution.ts
463
+ var VALID_VERBS = [...CONTRADICTION_VERBS, ...PREFERENCE_DRIFT_VERBS];
464
+ function isValidResolutionVerb(value) {
465
+ return VALID_VERBS.includes(value);
466
+ }
467
+ async function executeResolution(memoryDir, storage, pairId, verb, options = {}) {
468
+ if (typeof verb !== "string" || !isValidResolutionVerb(verb)) {
469
+ throw new Error(`Invalid contradiction resolution verb: ${String(verb)}`);
470
+ }
471
+ const pair = readPair(memoryDir, pairId);
472
+ if (!pair) {
473
+ return { pairId, verb, affectedIds: [], message: `Pair ${pairId} not found` };
474
+ }
475
+ if (pair.namespace && !options.storageForNamespace) {
476
+ throw new Error(
477
+ "contradiction resolution requires storageForNamespace for namespaced pairs so callers resolve the correct namespace storage"
478
+ );
479
+ }
480
+ const resolutionStorage = options.storageForNamespace ? await options.storageForNamespace(pair.namespace) : storage;
481
+ if (pair.resolution && pair.resolution !== "needs-more-context") {
482
+ return { pairId, verb, affectedIds: [], message: `Pair already resolved with verb "${pair.resolution}"` };
483
+ }
484
+ const isDriftItem = pair.kind === "preference-drift";
485
+ const verbMatchesKind = isDriftItem ? PREFERENCE_DRIFT_VERBS.includes(verb) : CONTRADICTION_VERBS.includes(verb);
486
+ if (!verbMatchesKind) {
487
+ const allowed = (isDriftItem ? PREFERENCE_DRIFT_VERBS : CONTRADICTION_VERBS).join(", ");
488
+ return {
489
+ pairId,
490
+ verb,
491
+ affectedIds: [],
492
+ message: `Verb "${verb}" is not valid for a ${isDriftItem ? "preference-drift" : "contradiction"} item. Valid: ${allowed}`
493
+ };
494
+ }
495
+ if (isDriftItem) {
496
+ const outcome = await resolvePreferenceDrift(
497
+ resolutionStorage,
498
+ pair,
499
+ verb,
500
+ {
501
+ mergedContent: options.mergedContent,
502
+ onMemoryWritten: options.onMergedMemoryWritten
503
+ }
504
+ );
505
+ if (outcome.affectedIds.length > 0) resolvePair(memoryDir, pairId, verb);
506
+ return { pairId, verb, affectedIds: outcome.affectedIds, message: outcome.message };
507
+ }
508
+ const [idA, idB] = pair.memoryIds;
509
+ const affectedIds = [];
510
+ let message = "";
511
+ let supersedeFailed = false;
512
+ let rollbackAfterResolveFailure = null;
513
+ let recordCatalogWriteTouch = null;
514
+ const buildCatalogTouch = () => {
515
+ if (!options.onMergedMemoryWritten) return null;
516
+ const onMergedMemoryWritten = options.onMergedMemoryWritten;
517
+ const namespace = pair.namespace;
518
+ const storageDir = resolutionStorage.dir;
519
+ return () => onMergedMemoryWritten(namespace, storageDir);
520
+ };
521
+ const catalogWriteTouch = buildCatalogTouch();
522
+ const recordCatalogWriteTouchSafely = (context, touch = catalogWriteTouch) => {
523
+ if (!touch) return;
524
+ try {
525
+ touch();
526
+ } catch (err) {
527
+ log.warn(
528
+ "[contradiction-resolution] catalog write touch failed for pair=%s context=%s: %s",
529
+ pairId,
530
+ context,
531
+ err instanceof Error ? err.message : err
532
+ );
533
+ }
534
+ };
535
+ const touchCatalogIfRollbackLeftChange = async (context, snapshots, replacement) => {
536
+ if (!catalogWriteTouch) return;
537
+ if (await rollbackLeftDurableMutation(resolutionStorage, snapshots, replacement)) {
538
+ recordCatalogWriteTouchSafely(context);
539
+ }
540
+ };
541
+ switch (verb) {
542
+ case "keep-a": {
543
+ const keepTarget = await validateKeepTarget(resolutionStorage, pairId, idA);
544
+ if (!keepTarget.ok) {
545
+ supersedeFailed = true;
546
+ message = keepTarget.message;
547
+ break;
548
+ }
549
+ const sourceB = await loadSourceSnapshot(resolutionStorage, idB);
550
+ const ok = sourceB ? await supersedeSafe(resolutionStorage, idB, idA, "contradiction-resolution:keep-a") : false;
551
+ if (ok) {
552
+ affectedIds.push(idB);
553
+ rollbackAfterResolveFailure = async () => restoreMemorySnapshot(resolutionStorage, sourceB, "contradiction-resolution:keep-a-rollback");
554
+ recordCatalogWriteTouch = catalogWriteTouch;
555
+ message = `Kept ${idA}, superseded ${idB}`;
556
+ } else {
557
+ supersedeFailed = true;
558
+ const rolledBack = sourceB ? await restoreMemorySnapshot(resolutionStorage, sourceB, "contradiction-resolution:keep-a-rollback") : false;
559
+ if (sourceB && !rolledBack) {
560
+ await touchCatalogIfRollbackLeftChange("keep-a-rollback-incomplete", [sourceB]);
561
+ }
562
+ message = rolledBack ? `Supersede failed for ${idB}; restored ${idB} and did not resolve` : `Supersede failed for ${idB}; rollback incomplete for ${idB} and pair is not resolved`;
563
+ }
564
+ break;
565
+ }
566
+ case "keep-b": {
567
+ const keepTarget = await validateKeepTarget(resolutionStorage, pairId, idB);
568
+ if (!keepTarget.ok) {
569
+ supersedeFailed = true;
570
+ message = keepTarget.message;
571
+ break;
572
+ }
573
+ const sourceA = await loadSourceSnapshot(resolutionStorage, idA);
574
+ const ok = sourceA ? await supersedeSafe(resolutionStorage, idA, idB, "contradiction-resolution:keep-b") : false;
575
+ if (ok) {
576
+ affectedIds.push(idA);
577
+ rollbackAfterResolveFailure = async () => restoreMemorySnapshot(resolutionStorage, sourceA, "contradiction-resolution:keep-b-rollback");
578
+ recordCatalogWriteTouch = catalogWriteTouch;
579
+ message = `Kept ${idB}, superseded ${idA}`;
580
+ } else {
581
+ supersedeFailed = true;
582
+ const rolledBack = sourceA ? await restoreMemorySnapshot(resolutionStorage, sourceA, "contradiction-resolution:keep-b-rollback") : false;
583
+ if (sourceA && !rolledBack) {
584
+ await touchCatalogIfRollbackLeftChange("keep-b-rollback-incomplete", [sourceA]);
585
+ }
586
+ message = rolledBack ? `Supersede failed for ${idA}; restored ${idA} and did not resolve` : `Supersede failed for ${idA}; rollback incomplete for ${idA} and pair is not resolved`;
587
+ }
588
+ break;
589
+ }
590
+ case "merge": {
591
+ const replacement = await prepareMergeReplacement(resolutionStorage, pairId, idA, idB, options);
592
+ if (!replacement.ok) {
593
+ supersedeFailed = true;
594
+ message = replacement.message;
595
+ break;
596
+ }
597
+ const okA = await supersedeSafe(resolutionStorage, idA, replacement.mergedId, "contradiction-resolution:merge");
598
+ if (!okA) {
599
+ supersedeFailed = true;
600
+ const rolledBackA = await restoreMemorySnapshot(resolutionStorage, replacement.sourceA);
601
+ message = rolledBackA ? `Merge failed for ${idA}; restored ${idA} and did not resolve` : `Merge failed for ${idA}; rollback incomplete for ${idA} and pair is not resolved`;
602
+ if (rolledBackA) {
603
+ await cleanupCreatedReplacement(resolutionStorage, replacement);
604
+ } else {
605
+ await touchCatalogIfRollbackLeftChange("merge-first-rollback-incomplete", [replacement.sourceA], replacement);
606
+ }
607
+ break;
608
+ }
609
+ const okB = await supersedeSafe(resolutionStorage, idB, replacement.mergedId, "contradiction-resolution:merge");
610
+ if (!okB) {
611
+ supersedeFailed = true;
612
+ const rolledBackA = await restoreMemorySnapshot(resolutionStorage, replacement.sourceA);
613
+ const rolledBackB = await restoreMemorySnapshot(resolutionStorage, replacement.sourceB);
614
+ message = rolledBackA && rolledBackB ? `Merge failed for ${idB}; restored ${idA} and ${idB} and did not resolve` : `Merge failed for ${idB}; rollback incomplete for ${[
615
+ rolledBackA ? void 0 : idA,
616
+ rolledBackB ? void 0 : idB
617
+ ].filter(Boolean).join(", ")} and pair is not resolved`;
618
+ if (rolledBackA && rolledBackB) {
619
+ await cleanupCreatedReplacement(resolutionStorage, replacement);
620
+ } else {
621
+ await touchCatalogIfRollbackLeftChange(
622
+ "merge-second-rollback-incomplete",
623
+ [replacement.sourceA, replacement.sourceB],
624
+ replacement
625
+ );
626
+ }
627
+ break;
628
+ }
629
+ affectedIds.push(idA, idB);
630
+ rollbackAfterResolveFailure = async () => {
631
+ const rolledBackA = await restoreMemorySnapshot(resolutionStorage, replacement.sourceA);
632
+ const rolledBackB = await restoreMemorySnapshot(resolutionStorage, replacement.sourceB);
633
+ if (rolledBackA && rolledBackB) {
634
+ await cleanupCreatedReplacement(resolutionStorage, replacement);
635
+ }
636
+ return rolledBackA && rolledBackB;
637
+ };
638
+ recordCatalogWriteTouch = catalogWriteTouch;
639
+ message = `Both memories superseded by merged ${replacement.mergedId}`;
640
+ break;
641
+ }
642
+ case "both-valid": {
643
+ message = "Pair marked as both-valid; cooldown applied";
644
+ break;
645
+ }
646
+ case "needs-more-context": {
647
+ message = "Deferred; no action taken, short cooldown applied";
648
+ break;
649
+ }
650
+ }
651
+ if (!supersedeFailed) {
652
+ let resolved = false;
653
+ try {
654
+ resolved = resolvePair(memoryDir, pairId, verb) !== null;
655
+ } catch (err) {
656
+ log.warn(
657
+ "[contradiction-resolution] failed to persist pair=%s verb=%s: %s",
658
+ pairId,
659
+ verb,
660
+ err instanceof Error ? err.message : err
661
+ );
662
+ }
663
+ if (!resolved) {
664
+ if (rollbackAfterResolveFailure) {
665
+ const rolledBack = await rollbackAfterResolveFailure();
666
+ affectedIds.length = 0;
667
+ message = rolledBack ? `Resolution persistence failed; rolled back memory changes and did not resolve ${pairId}` : "Resolution persistence failed; rollback incomplete and pair is not resolved";
668
+ if (!rolledBack && recordCatalogWriteTouch) {
669
+ recordCatalogWriteTouchSafely("resolve-persistence-rollback-incomplete", recordCatalogWriteTouch);
670
+ }
671
+ } else {
672
+ message = "Resolution persistence failed; pair is not resolved";
673
+ }
674
+ } else if (recordCatalogWriteTouch) {
675
+ recordCatalogWriteTouchSafely("resolved", recordCatalogWriteTouch);
676
+ }
677
+ }
678
+ log.info("[contradiction-resolution] pair=%s verb=%s affected=%d", pairId, verb, affectedIds.length);
679
+ return { pairId, verb, affectedIds, message };
680
+ }
681
+ async function prepareMergeReplacement(storage, pairId, idA, idB, options) {
682
+ const sourceA = await storage.getMemoryById(idA);
683
+ const sourceB = await storage.getMemoryById(idB);
684
+ if (!sourceA || !sourceB) {
685
+ return { ok: false, message: `Merge requires both source memories to exist; not resolving ${pairId}` };
686
+ }
687
+ const requestedMergedId = options.mergedMemoryId?.trim();
688
+ if (requestedMergedId) {
689
+ if (requestedMergedId === idA || requestedMergedId === idB) {
690
+ return { ok: false, message: "Merge replacement must be distinct from both source memories; not resolving" };
691
+ }
692
+ const replacement2 = await storage.getMemoryById(requestedMergedId);
693
+ if (!replacement2) {
694
+ return { ok: false, message: `Merged memory ${requestedMergedId} not found; not resolving` };
695
+ }
696
+ const replacementStatus = replacement2.frontmatter.status ?? "active";
697
+ if (replacementStatus !== "active") {
698
+ return {
699
+ ok: false,
700
+ message: `Merged memory ${requestedMergedId} is ${replacementStatus}; not resolving`
701
+ };
702
+ }
703
+ return { ok: true, mergedId: requestedMergedId, sourceA, sourceB, created: false };
704
+ }
705
+ const mergedContent = options.mergedContent;
706
+ if (typeof mergedContent !== "string" || mergedContent.trim().length === 0) {
707
+ return {
708
+ ok: false,
709
+ message: "Merge requires mergedMemoryId or mergedContent; no memories changed"
710
+ };
711
+ }
712
+ const category = options.mergedCategory ?? mergedMemoryCategory(sourceA, sourceB);
713
+ let mergedId;
714
+ try {
715
+ const mergeEnvelope = composeMemoryEnvelope(
716
+ {
717
+ content: mergedContent,
718
+ category,
719
+ confidence: Math.min(sourceA.frontmatter.confidence ?? 0.8, sourceB.frontmatter.confidence ?? 0.8),
720
+ tags: ["contradiction-resolution", "merge"]
721
+ },
722
+ { source: "contradiction-resolution" },
723
+ { salvage: true }
724
+ );
725
+ if (mergeEnvelope.salvageNotes.length > 0) {
726
+ log.warn(`contradiction-resolution write salvaged invalid fields: ${mergeEnvelope.salvageNotes.join("; ")}`);
727
+ }
728
+ const mergeResult = await storage.writeSealedMemory(mergeEnvelope, {
729
+ actor: "contradiction-resolution",
730
+ lineage: [idA, idB],
731
+ derivedVia: "merge"
732
+ });
733
+ mergedId = mergeResult.id;
734
+ if (mergeResult.tombstoneBlocked) {
735
+ await cleanupMemoryId(storage, mergedId);
736
+ return { ok: false, message: `Merged memory for ${pairId} was tombstone-blocked (pending_review); not resolving \u2014 sources kept active` };
737
+ }
738
+ } catch (err) {
739
+ log.warn(
740
+ "[contradiction-resolution] merged memory creation failed for %s: %s",
741
+ pairId,
742
+ err instanceof Error ? err.message : err
743
+ );
744
+ return { ok: false, message: `Merged memory could not be created; not resolving ${pairId}` };
745
+ }
746
+ const replacement = await storage.getMemoryById(mergedId);
747
+ if (!replacement) {
748
+ await cleanupMemoryId(storage, mergedId);
749
+ return { ok: false, message: `Merged memory ${mergedId} could not be verified; not resolving` };
750
+ }
751
+ return { ok: true, mergedId, sourceA, sourceB, created: true };
752
+ }
753
+ function mergedMemoryCategory(sourceA, sourceB) {
754
+ return sourceA.frontmatter.category === sourceB.frontmatter.category ? sourceA.frontmatter.category : "fact";
755
+ }
756
+ async function validateKeepTarget(storage, pairId, keepId) {
757
+ const target = await loadSourceSnapshot(storage, keepId);
758
+ if (!target) {
759
+ return { ok: false, message: `Kept memory ${keepId} not found; not resolving ${pairId}` };
760
+ }
761
+ const status = target.frontmatter.status ?? "active";
762
+ if (status !== "active") {
763
+ return { ok: false, message: `Kept memory ${keepId} is ${status}; not resolving ${pairId}` };
764
+ }
765
+ return { ok: true };
766
+ }
767
+ async function loadSourceSnapshot(storage, memoryId) {
768
+ try {
769
+ return await storage.getMemoryById(memoryId);
770
+ } catch (err) {
771
+ log.warn(
772
+ "[contradiction-resolution] source snapshot failed for %s: %s",
773
+ memoryId,
774
+ err instanceof Error ? err.message : err
775
+ );
776
+ return null;
777
+ }
778
+ }
779
+ async function restoreMemorySnapshot(storage, memory, reasonCode = "contradiction-resolution:merge-rollback") {
780
+ try {
781
+ const current = await storage.getMemoryById(memory.frontmatter.id);
782
+ if (!current) return false;
783
+ const restoredFrontmatter = {
784
+ ...memory.frontmatter,
785
+ status: memory.frontmatter.status,
786
+ supersededBy: memory.frontmatter.supersededBy,
787
+ supersededAt: memory.frontmatter.supersededAt
788
+ };
789
+ return await storage.writeMemoryFrontmatter(current, restoredFrontmatter, {
790
+ actor: "contradiction-resolution",
791
+ reasonCode
792
+ });
793
+ } catch (err) {
794
+ log.warn(
795
+ "[contradiction-resolution] rollback failed for %s: %s",
796
+ memory.frontmatter.id,
797
+ err instanceof Error ? err.message : err
798
+ );
799
+ return false;
800
+ }
801
+ }
802
+ async function rollbackLeftDurableMutation(storage, snapshots, replacement) {
803
+ for (const snapshot of snapshots) {
804
+ try {
805
+ const current = await storage.getMemoryById(snapshot.frontmatter.id);
806
+ if (!current) return true;
807
+ if (supersessionStateChanged(current, snapshot)) return true;
808
+ } catch (err) {
809
+ log.warn(
810
+ "[contradiction-resolution] rollback inspection failed for %s: %s",
811
+ snapshot.frontmatter.id,
812
+ err instanceof Error ? err.message : err
813
+ );
814
+ return true;
815
+ }
816
+ }
817
+ if (replacement?.created) {
818
+ try {
819
+ return await storage.getMemoryById(replacement.mergedId) !== null;
820
+ } catch (err) {
821
+ log.warn(
822
+ "[contradiction-resolution] rollback replacement inspection failed for %s: %s",
823
+ replacement.mergedId,
824
+ err instanceof Error ? err.message : err
825
+ );
826
+ return true;
827
+ }
828
+ }
829
+ return false;
830
+ }
831
+ function supersessionStateChanged(current, snapshot) {
832
+ return current.frontmatter.status !== snapshot.frontmatter.status || current.frontmatter.supersededBy !== snapshot.frontmatter.supersededBy || current.frontmatter.supersededAt !== snapshot.frontmatter.supersededAt;
833
+ }
834
+ async function cleanupCreatedReplacement(storage, replacement) {
835
+ if (!replacement.created) return;
836
+ await cleanupMemoryId(storage, replacement.mergedId);
837
+ }
838
+ async function cleanupMemoryId(storage, memoryId) {
839
+ try {
840
+ const memory = await storage.getMemoryById(memoryId);
841
+ const invalidated = await storage.invalidateMemory(memoryId);
842
+ if (invalidated && memory?.frontmatter.category === "fact") {
843
+ await storage.removeFactContentHashesForMemories([memory]);
844
+ }
845
+ } catch (err) {
846
+ log.warn(
847
+ "[contradiction-resolution] cleanup failed for merged memory %s: %s",
848
+ memoryId,
849
+ err instanceof Error ? err.message : err
850
+ );
851
+ }
852
+ }
853
+ async function supersedeSafe(storage, oldId, newId, reason) {
854
+ try {
855
+ const result = await storage.supersedeMemory(oldId, newId, reason);
856
+ if (result === false) {
857
+ log.warn("[contradiction-resolution] supersede returned false for %s \u2192 %s", oldId, newId);
858
+ return false;
859
+ }
860
+ return true;
861
+ } catch (err) {
862
+ log.warn(
863
+ "[contradiction-resolution] supersede failed %s \u2192 %s: %s",
864
+ oldId,
865
+ newId,
866
+ err instanceof Error ? err.message : err
867
+ );
868
+ return false;
869
+ }
870
+ }
871
+
872
+ export {
873
+ readPreferenceDriftMarker,
874
+ runPreferenceDriftScan,
875
+ resolvePreferenceDrift,
876
+ isValidResolutionVerb,
877
+ executeResolution
878
+ };
879
+ //# sourceMappingURL=chunk-I32NKXE2.js.map