@remnic/core 9.69.102 → 9.69.104

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 (366) hide show
  1. package/dist/access-admin-ops-surface.js +53 -52
  2. package/dist/access-authorization-probe.js +54 -53
  3. package/dist/access-boundary.js +53 -52
  4. package/dist/access-cli.js +153 -150
  5. package/dist/access-cli.js.map +1 -1
  6. package/dist/access-extraction-force-flush.js +53 -52
  7. package/dist/access-http-briefing.js +54 -53
  8. package/dist/access-http-query.js +55 -54
  9. package/dist/access-http.js +77 -76
  10. package/dist/access-identity-continuity-surface.js +53 -52
  11. package/dist/access-lcm-surface.js +53 -52
  12. package/dist/access-mcp.js +66 -65
  13. package/dist/access-namespace-preflight.js +53 -52
  14. package/dist/access-observe-write-category.js +9 -9
  15. package/dist/access-observe-write-surface.js +53 -52
  16. package/dist/access-offline-manifest.js +6 -6
  17. package/dist/access-operations-batch.js +57 -56
  18. package/dist/access-operations.js +64 -63
  19. package/dist/access-recall-concurrency.js +53 -52
  20. package/dist/access-recall-response.js +53 -52
  21. package/dist/access-recall-surface.js +53 -52
  22. package/dist/access-schema.js +8 -8
  23. package/dist/access-service.js +53 -52
  24. package/dist/access-surface-catalog.js +55 -54
  25. package/dist/access-surface-catalog.js.map +1 -1
  26. package/dist/active-recall.js +21 -20
  27. package/dist/active-recall.js.map +1 -1
  28. package/dist/adapters/index.js +4 -4
  29. package/dist/adapters/registry.js +2 -2
  30. package/dist/briefing.js +14 -13
  31. package/dist/buffer.js +5 -5
  32. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
  33. package/dist/{capsule-merge-ZCXUPLNJ.js → capsule-merge-42GJGDUC.js} +4 -3
  34. package/dist/{capsule-merge-ZCXUPLNJ.js.map → capsule-merge-42GJGDUC.js.map} +1 -1
  35. package/dist/causal-behavior.js +2 -2
  36. package/dist/causal-chain.js +2 -2
  37. package/dist/causal-consolidation.js +17 -16
  38. package/dist/causal-consolidation.js.map +1 -1
  39. package/dist/causal-retrieval.js +2 -2
  40. package/dist/causal-trajectory-graph.js +3 -3
  41. package/dist/causal-trajectory.js +1 -1
  42. package/dist/{chunk-47LTKAGL.js → chunk-2COXDQ6C.js} +21 -6
  43. package/dist/chunk-2COXDQ6C.js.map +1 -0
  44. package/dist/{chunk-IOYY6ROU.js → chunk-2MMBJE53.js} +7 -7
  45. package/dist/{chunk-QSXEQPC4.js → chunk-2OFDC3AK.js} +2 -2
  46. package/dist/{chunk-4MP2Q2EI.js → chunk-2TCNEJ36.js} +4 -4
  47. package/dist/{chunk-5FAGCOZD.js → chunk-2U3R3DDH.js} +9 -9
  48. package/dist/{chunk-SCXURCVT.js → chunk-2UPTRDGM.js} +3 -3
  49. package/dist/{chunk-XVZA6VXC.js → chunk-3SL52JKD.js} +4 -4
  50. package/dist/{chunk-SBOCJ47I.js → chunk-5R4YPRAR.js} +19 -6
  51. package/dist/chunk-5R4YPRAR.js.map +1 -0
  52. package/dist/{chunk-ANPRNTPT.js → chunk-63LFM77Z.js} +15 -2
  53. package/dist/chunk-63LFM77Z.js.map +1 -0
  54. package/dist/{chunk-DINOVGA5.js → chunk-6WRHNA4I.js} +48 -48
  55. package/dist/chunk-6WRHNA4I.js.map +1 -0
  56. package/dist/{chunk-DSPWVQZ6.js → chunk-73R4HOOK.js} +3 -3
  57. package/dist/chunk-7CT3AI52.js +84 -0
  58. package/dist/chunk-7CT3AI52.js.map +1 -0
  59. package/dist/{chunk-PHBH74Q6.js → chunk-7NBUE5VY.js} +2 -2
  60. package/dist/{chunk-S533KGX6.js → chunk-7X7A7KVN.js} +2 -2
  61. package/dist/{chunk-XEATJBNB.js → chunk-7YQR6XHY.js} +71 -71
  62. package/dist/{chunk-F5MINS3R.js → chunk-A6WNTVA7.js} +3 -3
  63. package/dist/{chunk-F5MINS3R.js.map → chunk-A6WNTVA7.js.map} +1 -1
  64. package/dist/{chunk-533RHNHB.js → chunk-ATFFWIKL.js} +2 -2
  65. package/dist/{chunk-QCYUIZK2.js → chunk-AU43D3IT.js} +7 -7
  66. package/dist/{chunk-JZ66PN72.js → chunk-AWSP3WNM.js} +2 -2
  67. package/dist/{chunk-IY47KPML.js → chunk-B3OFQP5Y.js} +6 -6
  68. package/dist/{chunk-4DXNOVNW.js → chunk-B454SHPU.js} +6 -6
  69. package/dist/{chunk-3LMOJXZR.js → chunk-BKVCTTEN.js} +2 -2
  70. package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
  71. package/dist/{chunk-CZN53OT5.js → chunk-CGBE3N7T.js} +2 -2
  72. package/dist/{chunk-HWLIMQE2.js → chunk-CHDGJJV6.js} +2 -2
  73. package/dist/{chunk-UYPQOASU.js → chunk-CNBGAFDY.js} +2 -2
  74. package/dist/{chunk-JTC3PBNH.js → chunk-DB6XFMOF.js} +3 -3
  75. package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
  76. package/dist/{chunk-UFIZRMQZ.js → chunk-E4XLFYHV.js} +61 -29
  77. package/dist/chunk-E4XLFYHV.js.map +1 -0
  78. package/dist/{chunk-4OXXDL3X.js → chunk-EWWK65CI.js} +2 -2
  79. package/dist/{chunk-DFPG47ET.js → chunk-EZ3F4YIN.js} +11 -11
  80. package/dist/{chunk-V3I4NLZP.js → chunk-FYX2LXIX.js} +2 -2
  81. package/dist/{chunk-PNVOKGAX.js → chunk-G5I5ZT6O.js} +2 -2
  82. package/dist/{chunk-7Z2UKRNJ.js → chunk-GQ6ZF4LD.js} +2 -2
  83. package/dist/{chunk-PEZAHDDU.js → chunk-GZ2KV2RO.js} +5 -5
  84. package/dist/chunk-H6Z3RNW3.js +330 -0
  85. package/dist/chunk-H6Z3RNW3.js.map +1 -0
  86. package/dist/{chunk-645WOU5I.js → chunk-H7BZBSP6.js} +4 -4
  87. package/dist/{chunk-AXHU56C3.js → chunk-HWGFTTPS.js} +2 -2
  88. package/dist/{chunk-2SGLMP2E.js → chunk-IDSZNHIP.js} +2 -2
  89. package/dist/{chunk-LO4UKPKX.js → chunk-IFCKHPY4.js} +2 -2
  90. package/dist/{chunk-ZHXSOMYH.js → chunk-IOMLGJHG.js} +4 -4
  91. package/dist/{chunk-YRULQW5J.js → chunk-ISX7GVZE.js} +4 -4
  92. package/dist/{chunk-5PHZSD75.js → chunk-J3ZJBX7I.js} +2 -2
  93. package/dist/{chunk-X5TAWDRO.js → chunk-JC7QQ2DJ.js} +2 -2
  94. package/dist/{chunk-RFQT7IZO.js → chunk-JRDL3FGM.js} +3 -3
  95. package/dist/{chunk-OGZC2WUX.js → chunk-JWFTPRYD.js} +2 -2
  96. package/dist/{chunk-7OA4JWP5.js → chunk-KFHEZJQZ.js} +2 -2
  97. package/dist/{chunk-P3WRFSYF.js → chunk-KMN2JE4D.js} +2 -2
  98. package/dist/{chunk-GNBZB43J.js → chunk-KV7LFOPF.js} +2 -2
  99. package/dist/{chunk-L6YCGS7I.js → chunk-KYUVFCT2.js} +2 -2
  100. package/dist/{chunk-5BVL2XUD.js → chunk-LHDSCWDK.js} +17 -17
  101. package/dist/{chunk-SF7CWSR6.js → chunk-LXJZUNLX.js} +2 -2
  102. package/dist/{chunk-XCB6QDL6.js → chunk-M5GVCJSJ.js} +8 -2
  103. package/dist/chunk-M5GVCJSJ.js.map +1 -0
  104. package/dist/{chunk-DGS34QSY.js → chunk-MFZACYZ6.js} +2 -2
  105. package/dist/{chunk-PYYQCHJC.js → chunk-MZOQ26LH.js} +2 -2
  106. package/dist/{chunk-R2TVWQLR.js → chunk-NT2Q6AHC.js} +2 -2
  107. package/dist/{chunk-ABGM2BN4.js → chunk-O43AAJFQ.js} +2 -2
  108. package/dist/{chunk-G3BW6SDE.js → chunk-OFGTRDWX.js} +3 -3
  109. package/dist/{chunk-6Z263Z3E.js → chunk-OWV6LKNZ.js} +2 -2
  110. package/dist/{chunk-HIHN4XHL.js → chunk-PQ7EB5AD.js} +3 -3
  111. package/dist/{chunk-VVYLVE6R.js → chunk-PQKZLBCJ.js} +1 -1
  112. package/dist/{chunk-OFFW73OZ.js → chunk-PRNR47DI.js} +2 -2
  113. package/dist/{chunk-UL7KDVLC.js → chunk-PZ2QQULY.js} +11 -11
  114. package/dist/{chunk-55NZVUNI.js → chunk-QAIVTLL2.js} +3 -3
  115. package/dist/{chunk-M7T2NKET.js → chunk-QKCGOECM.js} +2 -2
  116. package/dist/{chunk-ARY6O3JN.js → chunk-QUNCLKHM.js} +2 -2
  117. package/dist/{chunk-Z3O53WZR.js → chunk-QWUJWBZ5.js} +2 -2
  118. package/dist/{chunk-RZXFXKWY.js → chunk-QX3K3INR.js} +2 -2
  119. package/dist/{chunk-HFOY2SBG.js → chunk-RYN4AIRM.js} +7 -5
  120. package/dist/chunk-RYN4AIRM.js.map +1 -0
  121. package/dist/{chunk-4LNCLZNK.js → chunk-S2GR3T7W.js} +2 -2
  122. package/dist/{chunk-VPOAMPDD.js → chunk-SFDBLCZV.js} +59 -59
  123. package/dist/{chunk-2IWBHZ3H.js → chunk-SIGDETMB.js} +2 -2
  124. package/dist/chunk-SP4DB6SX.js +19 -0
  125. package/dist/chunk-SP4DB6SX.js.map +1 -0
  126. package/dist/{chunk-DBWNTLLI.js → chunk-STQC2FYQ.js} +6 -6
  127. package/dist/{chunk-S5R77WHV.js → chunk-SWXPR5SE.js} +2 -2
  128. package/dist/{chunk-3DNTFZAT.js → chunk-T32YYUT2.js} +2 -2
  129. package/dist/{chunk-W5JQSVPZ.js → chunk-T6RQNV7E.js} +2 -2
  130. package/dist/{chunk-O23QMYN4.js → chunk-TRN56SPQ.js} +2 -2
  131. package/dist/{chunk-NM3BT2OH.js → chunk-TXTRHF3B.js} +2 -2
  132. package/dist/{chunk-7AUIGOH4.js → chunk-VDVHIRCK.js} +2 -2
  133. package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
  134. package/dist/{chunk-ZGYLPCWN.js → chunk-VO2BNAA2.js} +3 -3
  135. package/dist/{chunk-WVEECBCG.js → chunk-VV2MVHCJ.js} +2 -2
  136. package/dist/{chunk-HVDEKJJR.js → chunk-VYIBRCVW.js} +70 -61
  137. package/dist/chunk-VYIBRCVW.js.map +1 -0
  138. package/dist/{chunk-B3O3IRZN.js → chunk-VZBW6CDG.js} +1 -1
  139. package/dist/{chunk-JPKK466T.js → chunk-W5XWHTDO.js} +2 -2
  140. package/dist/{chunk-CYG3K2T2.js → chunk-WR66CTVU.js} +6 -6
  141. package/dist/{chunk-JNAOTN7B.js → chunk-XLWMNDQR.js} +4 -4
  142. package/dist/chunk-XLWMNDQR.js.map +1 -0
  143. package/dist/{chunk-RP7RSENW.js → chunk-XQWKB6PY.js} +2 -2
  144. package/dist/{chunk-64S6X4IU.js → chunk-XTN54NML.js} +4 -4
  145. package/dist/{chunk-UCPGOUDZ.js → chunk-Y57GJDG5.js} +108 -3
  146. package/dist/chunk-Y57GJDG5.js.map +1 -0
  147. package/dist/{chunk-KYLYXGKD.js → chunk-YI6XIFQV.js} +2 -2
  148. package/dist/{chunk-EZ25VE3G.js → chunk-YNDLCWXS.js} +4 -4
  149. package/dist/{chunk-Y7427SL7.js → chunk-Z6EZCN6Z.js} +10 -10
  150. package/dist/{chunk-5K2ALMSZ.js → chunk-ZRUC7FD3.js} +2 -2
  151. package/dist/cli.js +103 -102
  152. package/dist/coding/export-okf-codegraph.js +13 -12
  153. package/dist/coding/export-okf-codegraph.js.map +1 -1
  154. package/dist/coding/pre-action-gate.js +2 -2
  155. package/dist/compounding/engine.js +14 -13
  156. package/dist/config.js +21 -20
  157. package/dist/connectors/codex-materialize-runner.js +14 -13
  158. package/dist/connectors/index.js +14 -13
  159. package/dist/consolidation-provenance-check.js +4 -3
  160. package/dist/consolidation-undo.js +3 -2
  161. package/dist/consolidation-undo.js.map +1 -1
  162. package/dist/contradiction/index.js +3 -2
  163. package/dist/convergence-refresh.js +16 -15
  164. package/dist/corpus-watermark.js +16 -15
  165. package/dist/dashboard-runtime.js +2 -2
  166. package/dist/deep-recall-http-glue.js +9 -9
  167. package/dist/deep-recall.js +2 -2
  168. package/dist/embedding-fallback.d.ts +2 -1
  169. package/dist/embedding-fallback.d.ts.map +1 -1
  170. package/dist/embedding-fallback.js +2 -2
  171. package/dist/embedding-index-storage.d.ts +28 -1
  172. package/dist/embedding-index-storage.d.ts.map +1 -1
  173. package/dist/embedding-index-storage.js +1 -1
  174. package/dist/entity-mention-carry.d.ts +16 -0
  175. package/dist/entity-mention-carry.d.ts.map +1 -0
  176. package/dist/entity-mention-carry.js +8 -0
  177. package/dist/entity-mention-epoch.d.ts +22 -0
  178. package/dist/entity-mention-epoch.d.ts.map +1 -0
  179. package/dist/entity-mention-epoch.js +8 -0
  180. package/dist/entity-mention-index-cache.d.ts +28 -0
  181. package/dist/entity-mention-index-cache.d.ts.map +1 -0
  182. package/dist/entity-mention-index-cache.js +29 -0
  183. package/dist/entity-mention-index-cache.js.map +1 -0
  184. package/dist/entity-retrieval.d.ts.map +1 -1
  185. package/dist/entity-retrieval.js +18 -15
  186. package/dist/event-order-recall.js +2 -2
  187. package/dist/external-wiki-access.js +54 -53
  188. package/dist/extraction-span-materialize.js +2 -2
  189. package/dist/extraction.js +21 -20
  190. package/dist/{graph-edge-decay-MKIRZ762.js → graph-edge-decay-PVKDKLQK.js} +6 -6
  191. package/dist/graph-edge-decay-PVKDKLQK.js.map +1 -0
  192. package/dist/graph-jsonl.js +4 -4
  193. package/dist/graph-snapshot.js +4 -4
  194. package/dist/graph.js +5 -5
  195. package/dist/harmonic-retrieval.js +1 -1
  196. package/dist/index.js +187 -184
  197. package/dist/lcm/engine.js +4 -4
  198. package/dist/lcm/index.js +13 -13
  199. package/dist/location/index.js +16 -15
  200. package/dist/maintenance/memory-governance.js +14 -13
  201. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +14 -13
  202. package/dist/maintenance/rebuild-memory-projection.js +15 -14
  203. package/dist/memory-browse-operations.js +54 -53
  204. package/dist/memory-browse.js +5 -5
  205. package/dist/memory-corpus-version.d.ts +8 -3
  206. package/dist/memory-corpus-version.d.ts.map +1 -1
  207. package/dist/memory-corpus-version.js +2 -1
  208. package/dist/namespaces/migrate.js +15 -14
  209. package/dist/namespaces/search.js +7 -7
  210. package/dist/namespaces/storage.js +14 -13
  211. package/dist/offline-sync-changeset-generations.js +4 -4
  212. package/dist/offline-sync-embedding-generation.js +3 -3
  213. package/dist/offline-sync-exclude-globs.d.ts +8 -0
  214. package/dist/offline-sync-exclude-globs.d.ts.map +1 -1
  215. package/dist/offline-sync-exclude-globs.js +3 -1
  216. package/dist/offline-sync-snapshot-stream.js +6 -6
  217. package/dist/offline-sync.d.ts.map +1 -1
  218. package/dist/offline-sync.js +9 -9
  219. package/dist/operator-doctor-corpus.js +17 -16
  220. package/dist/operator-toolkit.js +34 -33
  221. package/dist/orchestration/maintenance.js +22 -21
  222. package/dist/orchestrator.js +153 -150
  223. package/dist/page-versioning.js +3 -2
  224. package/dist/preferences/preference-drift.d.ts.map +1 -1
  225. package/dist/procedural/library-maintenance.d.ts.map +1 -1
  226. package/dist/qmd.js +4 -4
  227. package/dist/recall-navigation-operations.js +54 -53
  228. package/dist/recall-navigation.js +53 -52
  229. package/dist/recall-state-view-admission.js +5 -5
  230. package/dist/recall-why-service.js +5 -5
  231. package/dist/{resolution-BROE3TRO.js → resolution-RSG4HZTL.js} +4 -3
  232. package/dist/resolution-RSG4HZTL.js.map +1 -0
  233. package/dist/resume-bundles.js +22 -21
  234. package/dist/search/factory.js +6 -6
  235. package/dist/search/index.js +12 -12
  236. package/dist/semantic-consolidation.js +15 -14
  237. package/dist/semantic-rule-promotion.js +14 -13
  238. package/dist/semantic-rule-verifier.js +14 -13
  239. package/dist/source-agent-qualifier.js +17 -16
  240. package/dist/standup/build.js +14 -13
  241. package/dist/storage/entity-mention-frontmatter-hold.d.ts +14 -0
  242. package/dist/storage/entity-mention-frontmatter-hold.d.ts.map +1 -0
  243. package/dist/storage.d.ts +13 -9
  244. package/dist/storage.d.ts.map +1 -1
  245. package/dist/storage.js +13 -12
  246. package/dist/support-passport/index.js +56 -55
  247. package/dist/transfer/backup.js +2 -2
  248. package/dist/transfer/capsule-export.js +2 -2
  249. package/dist/transfer/capsule-import.js +5 -4
  250. package/dist/transfer/export-okf.js +14 -13
  251. package/dist/verified-recall.js +14 -13
  252. package/dist/who-knows-cli.js +15 -14
  253. package/dist/who-knows.js +14 -13
  254. package/package.json +2 -2
  255. package/src/embedding-fallback-cross-process.test.ts +533 -0
  256. package/src/embedding-fallback.ts +19 -7
  257. package/src/embedding-index-storage.test.ts +482 -2
  258. package/src/embedding-index-storage.ts +131 -2
  259. package/src/entity-mention-carry.ts +31 -0
  260. package/src/entity-mention-epoch.ts +120 -0
  261. package/src/entity-mention-index-cache.ts +443 -0
  262. package/src/entity-retrieval.ts +72 -71
  263. package/src/maintenance/rebuild-memory-projection.ts +1 -1
  264. package/src/memory-corpus-version.ts +13 -3
  265. package/src/offline-sync-exclude-globs.ts +23 -0
  266. package/src/offline-sync.test.ts +325 -0
  267. package/src/offline-sync.ts +17 -1
  268. package/src/preferences/preference-drift.ts +5 -3
  269. package/src/procedural/library-maintenance.ts +4 -3
  270. package/src/semantic-rule-promotion.ts +1 -1
  271. package/src/storage/entity-mention-frontmatter-hold.ts +44 -0
  272. package/src/storage.ts +40 -38
  273. package/dist/chunk-47LTKAGL.js.map +0 -1
  274. package/dist/chunk-ANPRNTPT.js.map +0 -1
  275. package/dist/chunk-DINOVGA5.js.map +0 -1
  276. package/dist/chunk-HFOY2SBG.js.map +0 -1
  277. package/dist/chunk-HVDEKJJR.js.map +0 -1
  278. package/dist/chunk-JNAOTN7B.js.map +0 -1
  279. package/dist/chunk-SBOCJ47I.js.map +0 -1
  280. package/dist/chunk-UCPGOUDZ.js.map +0 -1
  281. package/dist/chunk-UFIZRMQZ.js.map +0 -1
  282. package/dist/chunk-XCB6QDL6.js.map +0 -1
  283. /package/dist/{capsule-crypto-7FJQINUR.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
  284. /package/dist/{chunk-IOYY6ROU.js.map → chunk-2MMBJE53.js.map} +0 -0
  285. /package/dist/{chunk-QSXEQPC4.js.map → chunk-2OFDC3AK.js.map} +0 -0
  286. /package/dist/{chunk-4MP2Q2EI.js.map → chunk-2TCNEJ36.js.map} +0 -0
  287. /package/dist/{chunk-5FAGCOZD.js.map → chunk-2U3R3DDH.js.map} +0 -0
  288. /package/dist/{chunk-SCXURCVT.js.map → chunk-2UPTRDGM.js.map} +0 -0
  289. /package/dist/{chunk-XVZA6VXC.js.map → chunk-3SL52JKD.js.map} +0 -0
  290. /package/dist/{chunk-DSPWVQZ6.js.map → chunk-73R4HOOK.js.map} +0 -0
  291. /package/dist/{chunk-PHBH74Q6.js.map → chunk-7NBUE5VY.js.map} +0 -0
  292. /package/dist/{chunk-S533KGX6.js.map → chunk-7X7A7KVN.js.map} +0 -0
  293. /package/dist/{chunk-XEATJBNB.js.map → chunk-7YQR6XHY.js.map} +0 -0
  294. /package/dist/{chunk-533RHNHB.js.map → chunk-ATFFWIKL.js.map} +0 -0
  295. /package/dist/{chunk-QCYUIZK2.js.map → chunk-AU43D3IT.js.map} +0 -0
  296. /package/dist/{chunk-JZ66PN72.js.map → chunk-AWSP3WNM.js.map} +0 -0
  297. /package/dist/{chunk-IY47KPML.js.map → chunk-B3OFQP5Y.js.map} +0 -0
  298. /package/dist/{chunk-4DXNOVNW.js.map → chunk-B454SHPU.js.map} +0 -0
  299. /package/dist/{chunk-3LMOJXZR.js.map → chunk-BKVCTTEN.js.map} +0 -0
  300. /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  301. /package/dist/{chunk-CZN53OT5.js.map → chunk-CGBE3N7T.js.map} +0 -0
  302. /package/dist/{chunk-HWLIMQE2.js.map → chunk-CHDGJJV6.js.map} +0 -0
  303. /package/dist/{chunk-UYPQOASU.js.map → chunk-CNBGAFDY.js.map} +0 -0
  304. /package/dist/{chunk-JTC3PBNH.js.map → chunk-DB6XFMOF.js.map} +0 -0
  305. /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
  306. /package/dist/{chunk-4OXXDL3X.js.map → chunk-EWWK65CI.js.map} +0 -0
  307. /package/dist/{chunk-DFPG47ET.js.map → chunk-EZ3F4YIN.js.map} +0 -0
  308. /package/dist/{chunk-V3I4NLZP.js.map → chunk-FYX2LXIX.js.map} +0 -0
  309. /package/dist/{chunk-PNVOKGAX.js.map → chunk-G5I5ZT6O.js.map} +0 -0
  310. /package/dist/{chunk-7Z2UKRNJ.js.map → chunk-GQ6ZF4LD.js.map} +0 -0
  311. /package/dist/{chunk-PEZAHDDU.js.map → chunk-GZ2KV2RO.js.map} +0 -0
  312. /package/dist/{chunk-645WOU5I.js.map → chunk-H7BZBSP6.js.map} +0 -0
  313. /package/dist/{chunk-AXHU56C3.js.map → chunk-HWGFTTPS.js.map} +0 -0
  314. /package/dist/{chunk-2SGLMP2E.js.map → chunk-IDSZNHIP.js.map} +0 -0
  315. /package/dist/{chunk-LO4UKPKX.js.map → chunk-IFCKHPY4.js.map} +0 -0
  316. /package/dist/{chunk-ZHXSOMYH.js.map → chunk-IOMLGJHG.js.map} +0 -0
  317. /package/dist/{chunk-YRULQW5J.js.map → chunk-ISX7GVZE.js.map} +0 -0
  318. /package/dist/{chunk-5PHZSD75.js.map → chunk-J3ZJBX7I.js.map} +0 -0
  319. /package/dist/{chunk-X5TAWDRO.js.map → chunk-JC7QQ2DJ.js.map} +0 -0
  320. /package/dist/{chunk-RFQT7IZO.js.map → chunk-JRDL3FGM.js.map} +0 -0
  321. /package/dist/{chunk-OGZC2WUX.js.map → chunk-JWFTPRYD.js.map} +0 -0
  322. /package/dist/{chunk-7OA4JWP5.js.map → chunk-KFHEZJQZ.js.map} +0 -0
  323. /package/dist/{chunk-P3WRFSYF.js.map → chunk-KMN2JE4D.js.map} +0 -0
  324. /package/dist/{chunk-GNBZB43J.js.map → chunk-KV7LFOPF.js.map} +0 -0
  325. /package/dist/{chunk-L6YCGS7I.js.map → chunk-KYUVFCT2.js.map} +0 -0
  326. /package/dist/{chunk-5BVL2XUD.js.map → chunk-LHDSCWDK.js.map} +0 -0
  327. /package/dist/{chunk-SF7CWSR6.js.map → chunk-LXJZUNLX.js.map} +0 -0
  328. /package/dist/{chunk-DGS34QSY.js.map → chunk-MFZACYZ6.js.map} +0 -0
  329. /package/dist/{chunk-PYYQCHJC.js.map → chunk-MZOQ26LH.js.map} +0 -0
  330. /package/dist/{chunk-R2TVWQLR.js.map → chunk-NT2Q6AHC.js.map} +0 -0
  331. /package/dist/{chunk-ABGM2BN4.js.map → chunk-O43AAJFQ.js.map} +0 -0
  332. /package/dist/{chunk-G3BW6SDE.js.map → chunk-OFGTRDWX.js.map} +0 -0
  333. /package/dist/{chunk-6Z263Z3E.js.map → chunk-OWV6LKNZ.js.map} +0 -0
  334. /package/dist/{chunk-HIHN4XHL.js.map → chunk-PQ7EB5AD.js.map} +0 -0
  335. /package/dist/{chunk-VVYLVE6R.js.map → chunk-PQKZLBCJ.js.map} +0 -0
  336. /package/dist/{chunk-OFFW73OZ.js.map → chunk-PRNR47DI.js.map} +0 -0
  337. /package/dist/{chunk-UL7KDVLC.js.map → chunk-PZ2QQULY.js.map} +0 -0
  338. /package/dist/{chunk-55NZVUNI.js.map → chunk-QAIVTLL2.js.map} +0 -0
  339. /package/dist/{chunk-M7T2NKET.js.map → chunk-QKCGOECM.js.map} +0 -0
  340. /package/dist/{chunk-ARY6O3JN.js.map → chunk-QUNCLKHM.js.map} +0 -0
  341. /package/dist/{chunk-Z3O53WZR.js.map → chunk-QWUJWBZ5.js.map} +0 -0
  342. /package/dist/{chunk-RZXFXKWY.js.map → chunk-QX3K3INR.js.map} +0 -0
  343. /package/dist/{chunk-4LNCLZNK.js.map → chunk-S2GR3T7W.js.map} +0 -0
  344. /package/dist/{chunk-VPOAMPDD.js.map → chunk-SFDBLCZV.js.map} +0 -0
  345. /package/dist/{chunk-2IWBHZ3H.js.map → chunk-SIGDETMB.js.map} +0 -0
  346. /package/dist/{chunk-DBWNTLLI.js.map → chunk-STQC2FYQ.js.map} +0 -0
  347. /package/dist/{chunk-S5R77WHV.js.map → chunk-SWXPR5SE.js.map} +0 -0
  348. /package/dist/{chunk-3DNTFZAT.js.map → chunk-T32YYUT2.js.map} +0 -0
  349. /package/dist/{chunk-W5JQSVPZ.js.map → chunk-T6RQNV7E.js.map} +0 -0
  350. /package/dist/{chunk-O23QMYN4.js.map → chunk-TRN56SPQ.js.map} +0 -0
  351. /package/dist/{chunk-NM3BT2OH.js.map → chunk-TXTRHF3B.js.map} +0 -0
  352. /package/dist/{chunk-7AUIGOH4.js.map → chunk-VDVHIRCK.js.map} +0 -0
  353. /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
  354. /package/dist/{chunk-ZGYLPCWN.js.map → chunk-VO2BNAA2.js.map} +0 -0
  355. /package/dist/{chunk-WVEECBCG.js.map → chunk-VV2MVHCJ.js.map} +0 -0
  356. /package/dist/{chunk-B3O3IRZN.js.map → chunk-VZBW6CDG.js.map} +0 -0
  357. /package/dist/{chunk-JPKK466T.js.map → chunk-W5XWHTDO.js.map} +0 -0
  358. /package/dist/{chunk-CYG3K2T2.js.map → chunk-WR66CTVU.js.map} +0 -0
  359. /package/dist/{chunk-RP7RSENW.js.map → chunk-XQWKB6PY.js.map} +0 -0
  360. /package/dist/{chunk-64S6X4IU.js.map → chunk-XTN54NML.js.map} +0 -0
  361. /package/dist/{chunk-KYLYXGKD.js.map → chunk-YI6XIFQV.js.map} +0 -0
  362. /package/dist/{chunk-EZ25VE3G.js.map → chunk-YNDLCWXS.js.map} +0 -0
  363. /package/dist/{chunk-Y7427SL7.js.map → chunk-Z6EZCN6Z.js.map} +0 -0
  364. /package/dist/{chunk-5K2ALMSZ.js.map → chunk-ZRUC7FD3.js.map} +0 -0
  365. /package/dist/{graph-edge-decay-MKIRZ762.js.map → entity-mention-carry.js.map} +0 -0
  366. /package/dist/{resolution-BROE3TRO.js.map → entity-mention-epoch.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/preferences/preference-drift.ts","../src/contradiction/resolution.ts"],"sourcesContent":["/**\n * Preference drift detection (issue #2371).\n *\n * Remnic already handles *explicit* preference change: the contradiction scan\n * catches a new statement that conflicts with a stored one, and temporal\n * supersession retires a fact that gets restated. Both require new evidence to\n * arrive. This module covers the opposite failure mode the agent-memory survey\n * calls stale preference reuse: a `category: preference` memory keeps being\n * injected at full prominence even though the last N days of conversation\n * contain no corroboration for it — or contain behavioral evidence pointing the\n * other way that never rose to an explicit contradiction.\n *\n * Per aging preference the scan gathers recent same-namespace evidence, then\n * classifies:\n *\n * - `corroborated` — recent evidence restates or is consistent with it.\n * - `stale` — the lookback window held nothing either way.\n * - `drifted` — recent evidence points away from it (judge verdict\n * `contradicts`), so a review item is opened.\n * - `skipped` — the classification could not be made honestly:\n * `backend_unavailable` (evidence lookup failed — §22:\n * never counted as \"no evidence\") or\n * `verification_unavailable` (evidence exists but no LLM\n * could judge it, so neither a positive nor a negative\n * claim is warranted).\n *\n * Apply mode stamps `lastCorroborated` / `driftState` and opens review items.\n * It never auto-deletes and never auto-supersedes: drift is inference, and the\n * least-privileged default for an inferred change to user state is \"ask\"\n * (Review Prevention Checklist §36). Resolution runs through the existing\n * review queue and `review_resolve`, with the drift verbs `keep`, `supersede`,\n * and `archive`.\n *\n * Deliberately NOT part of `runMemoryGovernance` — same isolation decision as\n * procedure mining and procedure-library maintenance.\n */\n\nimport path from \"node:path\";\nimport type { MemoryFile, MemoryStatus, PluginConfig } from \"../types.js\";\nimport type { StorageManager } from \"../storage.js\";\nimport type { LocalLlmClient } from \"../local-llm.js\";\nimport type { FallbackLlmClient } from \"../fallback-llm.js\";\nimport type { SemanticDedupHit, SemanticDedupLookup } from \"../dedup/semantic.js\";\nimport {\n judgeContradictionPairs,\n type ContradictionJudgeInput,\n type ContradictionJudgeResult,\n} from \"../contradiction/contradiction-judge.js\";\nimport {\n computeMemoryContentHash,\n writePairs,\n type ContradictionPair,\n} from \"../contradiction/contradiction-review.js\";\nimport { resolveScanStorage, type ScanStorageResolution } from \"../contradiction/contradiction-scan.js\";\nimport { bumpMemoryCorpusVersionForDir } from \"../memory-corpus-version.js\";\nimport { composeMemoryEnvelope } from \"../write-envelope.js\";\nimport { readJsonFile, writeJsonFileAtomic } from \"../json-store.js\";\nimport { log } from \"../logger.js\";\n\nconst DRIFT_ACTOR = \"preference-drift\";\nconst DRIFT_RULE_VERSION = \"preference-drift:1\";\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\n/** Evidence hits fetched per preference. Bounded so one scan cannot fan out. */\nconst EVIDENCE_LOOKUP_LIMIT = 5;\n\nexport type PreferenceDriftClassification =\n | \"corroborated\"\n | \"stale\"\n | \"drifted\"\n | \"skipped\";\n\nexport type PreferenceDriftSkipReason =\n | \"backend_unavailable\"\n | \"verification_unavailable\";\n\nexport interface PreferenceDriftEvidence {\n memoryId: string;\n /** Similarity score reported by the evidence lookup. */\n score: number;\n /** `updated` (or `created`) of the evidence memory, ISO 8601. */\n observedAt: string;\n}\n\nexport interface PreferenceDriftFinding {\n memoryId: string;\n classification: PreferenceDriftClassification;\n /** Set only for `classification: \"skipped\"`. */\n skipped?: PreferenceDriftSkipReason;\n /** Age of the preference in whole days at the run instant. */\n ageDays: number;\n /** Existing `lastCorroborated` stamp, or null when never corroborated. */\n lastCorroborated: string | null;\n reason: string;\n evidence: PreferenceDriftEvidence[];\n /** Review pair id opened for a `drifted` finding in apply mode. */\n reviewPairId?: string;\n}\n\nexport interface PreferenceDriftReport {\n schemaVersion: 1;\n generatedAt: string;\n mode: \"shadow\" | \"apply\";\n namespace?: string;\n /** Active preferences examined after the min-age filter and per-run cap. */\n scanned: number;\n /** Active preferences that passed the category/status filter before the cap. */\n eligible: number;\n findings: PreferenceDriftFinding[];\n counts: Record<PreferenceDriftClassification, number>;\n /** Frontmatter stamps + review items actually written. Always 0 in shadow mode. */\n appliedCount: number;\n reviewItemsOpened: number;\n elapsedMs: number;\n skippedReason?: \"drift_disabled\" | \"scan_disabled\";\n}\n\nexport interface PreferenceDriftMarker {\n schemaVersion: 1;\n lastRunAt: string;\n lastApplyAt: string | null;\n appliedCount: number;\n}\n\nexport interface PreferenceDriftDependencies {\n storage: StorageManager;\n config: PluginConfig;\n memoryDir: string;\n /** Pre-built evidence lookup. Superseded by `embeddingLookupFactory`. */\n embeddingLookup?: SemanticDedupLookup;\n /** Builds a namespace-scoped evidence lookup from the scan's own storage. */\n embeddingLookupFactory?: (storage: StorageManager) => SemanticDedupLookup | undefined;\n storageForNamespace?: (\n namespace: string | undefined,\n ) => StorageManager | ScanStorageResolution | Promise<StorageManager | ScanStorageResolution>;\n localLlm: LocalLlmClient | null;\n fallbackLlm: FallbackLlmClient | null;\n namespace?: string;\n /** When true (and `driftDetection.enabled`), stamps and review items are written. */\n apply?: boolean;\n now?: Date;\n}\n\nfunction driftMarkerPath(memoryDir: string): string {\n return path.join(memoryDir, \"state\", \"preference-drift.json\");\n}\n\n/** Read the last-run marker. Absent marker (or shadow-only history) → null apply timestamp. */\nexport async function readPreferenceDriftMarker(\n memoryDir: string,\n): Promise<PreferenceDriftMarker | null> {\n try {\n const raw = await readJsonFile(driftMarkerPath(memoryDir));\n if (raw === null || typeof raw !== \"object\" || Array.isArray(raw)) return null;\n const m = raw as Record<string, unknown>;\n if (typeof m.lastRunAt !== \"string\") return null;\n return {\n schemaVersion: 1,\n lastRunAt: m.lastRunAt,\n lastApplyAt: typeof m.lastApplyAt === \"string\" ? m.lastApplyAt : null,\n appliedCount: typeof m.appliedCount === \"number\" ? m.appliedCount : 0,\n };\n } catch {\n return null;\n }\n}\n\nfunction tsMs(value: unknown): number | null {\n if (typeof value !== \"string\") return null;\n const ms = Date.parse(value);\n return Number.isFinite(ms) ? ms : null;\n}\n\n/**\n * Statuses that make a memory a drift candidate. Stated as an inclusion set,\n * never an exclusion list, so a newly added status can never leak through\n * (§41): `superseded`, `archived`, `quarantined`, `rejected`, and\n * `pending_review` preferences are all excluded by construction.\n */\nconst CANDIDATE_STATUSES: Partial<Record<MemoryStatus, true>> = { active: true };\n\n/**\n * Deterministic candidate order (§12): oldest preference first, stable id\n * tiebreak, so the per-run cap always selects the same slice on identical\n * fixtures.\n */\nfunction compareCandidates(a: MemoryFile, b: MemoryFile): number {\n const aMs = tsMs(a.frontmatter.created) ?? tsMs(a.frontmatter.updated) ?? 0;\n const bMs = tsMs(b.frontmatter.created) ?? tsMs(b.frontmatter.updated) ?? 0;\n if (aMs !== bMs) return aMs < bMs ? -1 : 1;\n const aId = a.frontmatter.id ?? \"\";\n const bId = b.frontmatter.id ?? \"\";\n if (aId !== bId) return aId < bId ? -1 : 1;\n return 0;\n}\n\ntype EvidenceResult =\n | { ok: true; hits: PreferenceDriftEvidence[]; hitMemories: MemoryFile[] }\n | { ok: false; reason: \"backend_unavailable\" };\n\n/**\n * Gather recent same-namespace evidence for one preference.\n *\n * §22: an empty result and a failed backend are DIFFERENT outcomes. The\n * `SemanticDedupLookup` contract is that implementations throw when the\n * embedding backend is unavailable and return `[]` only when a reachable\n * backend reports no hits, so the throw is the failure signal — it must never\n * be swallowed into \"no evidence\", which would mark a live preference stale.\n */\nasync function gatherEvidence(\n preference: MemoryFile,\n lookup: SemanticDedupLookup,\n byId: ReadonlyMap<string, MemoryFile>,\n windowStartMs: number,\n nowMs: number,\n): Promise<EvidenceResult> {\n let raw: SemanticDedupHit[];\n try {\n raw = await lookup(preference.content, EVIDENCE_LOOKUP_LIMIT);\n } catch (err) {\n log.debug(\"[preference-drift] evidence lookup failed\", {\n memoryId: preference.frontmatter.id,\n error: err instanceof Error ? err.message : String(err),\n });\n return { ok: false, reason: \"backend_unavailable\" };\n }\n\n const hits: PreferenceDriftEvidence[] = [];\n const hitMemories: MemoryFile[] = [];\n for (const hit of raw) {\n if (hit.id === preference.frontmatter.id) continue;\n const memory = byId.get(hit.id);\n if (!memory) continue;\n const observedMs = tsMs(memory.frontmatter.updated) ?? tsMs(memory.frontmatter.created);\n if (observedMs === null) continue;\n // Half-open window [windowStart, now): a memory observed exactly at the\n // window start counts, one observed exactly at the run instant does not\n // (§23).\n if (observedMs < windowStartMs || observedMs >= nowMs) continue;\n hits.push({\n memoryId: hit.id,\n score: hit.score,\n observedAt: memory.frontmatter.updated ?? memory.frontmatter.created ?? \"\",\n });\n hitMemories.push(memory);\n }\n return { ok: true, hits, hitMemories };\n}\n\n/**\n * Map judge verdicts over a preference's evidence to a drift classification.\n *\n * - `contradicts` on any hit wins: the preference has drifted.\n * - `duplicates` means the evidence restates the preference → corroborated.\n * - `independent` is evidence about something else, so it corroborates\n * nothing; with no better verdict the preference is stale.\n * - `needs-user` (which is also what the judge returns when no LLM is\n * reachable) leaves the question genuinely unanswered. Stamping\n * `lastCorroborated` would assert something unverified and stamping `stale`\n * would contradict the evidence we did find, so the honest outcome is\n * `skipped: verification_unavailable`.\n */\nfunction classifyFromVerdicts(\n verdicts: readonly ContradictionJudgeResult[],\n): { classification: PreferenceDriftClassification; skipped?: PreferenceDriftSkipReason; reason: string; driftedAgainst?: string } {\n const contradiction = verdicts.find((v) => v.verdict === \"contradicts\");\n if (contradiction) {\n return {\n classification: \"drifted\",\n reason: `recent evidence points away from this preference: ${contradiction.rationale}`,\n driftedAgainst: contradiction.memoryIdB,\n };\n }\n const restatement = verdicts.find((v) => v.verdict === \"duplicates\");\n if (restatement) {\n return {\n classification: \"corroborated\",\n reason: `recent evidence restates this preference: ${restatement.rationale}`,\n };\n }\n if (verdicts.some((v) => v.verdict === \"needs-user\")) {\n return {\n classification: \"skipped\",\n skipped: \"verification_unavailable\",\n reason: \"recent evidence found but no judge verdict was available to classify it\",\n };\n }\n return {\n classification: \"stale\",\n reason: \"recent evidence is independent of this preference — no corroboration either way\",\n };\n}\n\n/**\n * Run one preference-drift pass over a namespace.\n *\n * Shadow mode (the default) performs NO writes — not even the run marker.\n * Applying requires `apply: true` AND `driftDetection.enabled: true`.\n */\nexport async function runPreferenceDriftScan(\n deps: PreferenceDriftDependencies,\n): Promise<PreferenceDriftReport> {\n const startTime = Date.now();\n const now = deps.now ?? new Date();\n const nowIso = now.toISOString();\n const nowMs = now.getTime();\n const mode: \"shadow\" | \"apply\" = deps.apply === true ? \"apply\" : \"shadow\";\n const cfg = deps.config.driftDetection;\n\n const emptyCounts: Record<PreferenceDriftClassification, number> = {\n corroborated: 0,\n stale: 0,\n drifted: 0,\n skipped: 0,\n };\n\n if (cfg?.enabled !== true) {\n return {\n schemaVersion: 1,\n generatedAt: nowIso,\n mode,\n scanned: 0,\n eligible: 0,\n findings: [],\n counts: emptyCounts,\n appliedCount: 0,\n reviewItemsOpened: 0,\n elapsedMs: Date.now() - startTime,\n skippedReason: \"drift_disabled\",\n };\n }\n // `0` is the documented disable value and must behave as a true zero (§33).\n if (cfg.maxCandidatesPerRun === 0) {\n return {\n schemaVersion: 1,\n generatedAt: nowIso,\n mode,\n scanned: 0,\n eligible: 0,\n findings: [],\n counts: emptyCounts,\n appliedCount: 0,\n reviewItemsOpened: 0,\n elapsedMs: Date.now() - startTime,\n skippedReason: \"scan_disabled\",\n };\n }\n\n const { storage, namespace } = await resolveScanStorage(deps, deps.namespace?.trim() || undefined);\n const lookup = deps.embeddingLookupFactory\n ? deps.embeddingLookupFactory(storage)\n : deps.embeddingLookup;\n\n let all: MemoryFile[];\n try {\n all = await storage.readAllMemories();\n } catch (err) {\n log.warn(\n `[preference-drift] failed to read memories: ${err instanceof Error ? err.message : String(err)}`,\n );\n all = [];\n }\n\n const byId = new Map<string, MemoryFile>();\n for (const m of all) {\n const id = m.frontmatter.id;\n if (typeof id === \"string\" && id.length > 0) byId.set(id, m);\n }\n\n const minAgeMs = cfg.minAgeDays * DAY_MS;\n const eligible = all.filter((m) => {\n const fm = m.frontmatter;\n if (fm.category !== \"preference\") return false;\n if (CANDIDATE_STATUSES[fm.status ?? \"active\"] !== true) return false;\n if (typeof fm.id !== \"string\" || fm.id.length === 0) return false;\n if (!m.content || m.content.trim().length === 0) return false;\n const bornMs = tsMs(fm.created) ?? tsMs(fm.updated);\n if (bornMs === null) return false;\n return nowMs - bornMs >= minAgeMs;\n });\n\n const candidates = [...eligible].sort(compareCandidates).slice(0, cfg.maxCandidatesPerRun);\n\n const report: PreferenceDriftReport = {\n schemaVersion: 1,\n generatedAt: nowIso,\n mode,\n namespace,\n scanned: candidates.length,\n eligible: eligible.length,\n findings: [],\n counts: { ...emptyCounts },\n appliedCount: 0,\n reviewItemsOpened: 0,\n elapsedMs: 0,\n };\n\n const windowStartMs = nowMs - cfg.lookbackDays * DAY_MS;\n // One judge cache per run so the module-level singleton never leaks across\n // namespaces or scans.\n const judgeCache = new Map<string, ContradictionJudgeResult>();\n const driftedPairs: Array<{ preference: MemoryFile; evidenceId: string; finding: PreferenceDriftFinding; rationale: string; confidence: number }> = [];\n const stamps: Array<{ memory: MemoryFile; patch: { driftState?: \"stale\"; lastCorroborated?: string }; reasonCode: string }> = [];\n\n for (const preference of candidates) {\n const bornMs = tsMs(preference.frontmatter.created) ?? tsMs(preference.frontmatter.updated) ?? nowMs;\n const finding: PreferenceDriftFinding = {\n memoryId: preference.frontmatter.id,\n classification: \"stale\",\n ageDays: Math.floor((nowMs - bornMs) / DAY_MS),\n lastCorroborated: preference.frontmatter.lastCorroborated ?? null,\n reason: \"\",\n evidence: [],\n };\n\n if (!lookup) {\n finding.classification = \"skipped\";\n finding.skipped = \"backend_unavailable\";\n finding.reason = \"no evidence lookup is configured, so corroboration cannot be checked\";\n report.findings.push(finding);\n report.counts.skipped += 1;\n continue;\n }\n\n const evidence = await gatherEvidence(preference, lookup, byId, windowStartMs, nowMs);\n if (!evidence.ok) {\n finding.classification = \"skipped\";\n finding.skipped = evidence.reason;\n finding.reason = \"evidence lookup backend was unavailable — not classified as stale\";\n report.findings.push(finding);\n report.counts.skipped += 1;\n continue;\n }\n finding.evidence = evidence.hits;\n\n if (evidence.hits.length === 0) {\n finding.classification = \"stale\";\n finding.reason = `no corroborating evidence in the last ${cfg.lookbackDays} days`;\n report.findings.push(finding);\n report.counts.stale += 1;\n stamps.push({ memory: preference, patch: { driftState: \"stale\" }, reasonCode: \"drift_stale\" });\n continue;\n }\n\n // The judge call happens only when candidate evidence exists.\n const judgeInputs: ContradictionJudgeInput[] = evidence.hitMemories.map((hit) => ({\n memoryIdA: preference.frontmatter.id,\n memoryIdB: hit.frontmatter.id,\n textA: preference.content,\n textB: hit.content,\n categoryA: preference.frontmatter.category,\n categoryB: hit.frontmatter.category,\n }));\n const judged = await judgeContradictionPairs(\n judgeInputs,\n deps.config,\n deps.localLlm,\n deps.fallbackLlm,\n judgeCache,\n );\n // Preserve evidence order (score desc) so the verdict scan is deterministic\n // rather than dependent on Map iteration of the judge's keyed results.\n const orderedVerdicts: ContradictionJudgeResult[] = [];\n for (const input of judgeInputs) {\n for (const result of judged.results.values()) {\n if (result.memoryIdA === input.memoryIdA && result.memoryIdB === input.memoryIdB) {\n orderedVerdicts.push(result);\n break;\n }\n }\n }\n\n const outcome = classifyFromVerdicts(orderedVerdicts);\n finding.classification = outcome.classification;\n finding.reason = outcome.reason;\n if (outcome.skipped) finding.skipped = outcome.skipped;\n report.findings.push(finding);\n report.counts[outcome.classification] += 1;\n\n if (outcome.classification === \"corroborated\") {\n stamps.push({\n memory: preference,\n patch: { lastCorroborated: nowIso, driftState: undefined },\n reasonCode: \"drift_corroborated\",\n });\n } else if (outcome.classification === \"stale\") {\n stamps.push({ memory: preference, patch: { driftState: \"stale\" }, reasonCode: \"drift_stale\" });\n } else if (outcome.classification === \"drifted\" && outcome.driftedAgainst) {\n const verdict = orderedVerdicts.find((v) => v.verdict === \"contradicts\");\n driftedPairs.push({\n preference,\n evidenceId: outcome.driftedAgainst,\n finding,\n rationale: verdict?.rationale ?? outcome.reason,\n confidence: verdict?.confidence ?? 0,\n });\n }\n }\n\n if (mode === \"shadow\") {\n report.elapsedMs = Date.now() - startTime;\n return report;\n }\n\n let writes = 0;\n for (const stamp of stamps) {\n try {\n // `driftState: undefined` is an explicit clear: writeMemoryFrontmatter\n // merges the patch over existing frontmatter, and the serializer omits\n // undefined fields, so a corroborated preference loses its stale mark.\n await storage.writeMemoryFrontmatter(stamp.memory, { ...stamp.patch, updated: nowIso }, {\n at: now,\n actor: DRIFT_ACTOR,\n reasonCode: stamp.reasonCode,\n ruleVersion: DRIFT_RULE_VERSION,\n });\n writes += 1;\n report.appliedCount += 1;\n } catch (err) {\n log.warn(\n `[preference-drift] stamp ${stamp.reasonCode} on ${stamp.memory.frontmatter.id} failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n\n if (driftedPairs.length > 0) {\n const queueEntries: Array<Omit<ContradictionPair, \"pairId\"> & { memoryIds: [string, string] }> =\n driftedPairs.map((d) => ({\n memoryIds: [d.preference.frontmatter.id, d.evidenceId],\n kind: \"preference-drift\",\n // A drift finding IS a detected conflict, so the honest verdict is\n // `contradicts`; `kind` is what distinguishes it from a pair the\n // contradiction scan produced. Existing review surfaces render it\n // unchanged.\n verdict: \"contradicts\",\n rationale: d.rationale,\n confidence: d.confidence,\n detectedAt: nowIso,\n memoryContentHashes: {\n [d.preference.frontmatter.id]: computeMemoryContentHash(\n d.preference.content,\n d.preference.frontmatter.category,\n ),\n },\n namespace,\n }));\n const written = writePairs(deps.memoryDir, queueEntries);\n report.reviewItemsOpened = written.length;\n report.appliedCount += written.length;\n for (const entry of written) {\n const match = driftedPairs.find((d) => d.preference.frontmatter.id === entry.memoryIds[0]);\n if (match) match.finding.reviewPairId = entry.pairId;\n }\n }\n\n if (writes > 0) {\n // Frontmatter stamps bypass the extraction write pipeline, so bump the\n // shared corpus version out of band — otherwise hot recall caches keep\n // serving pre-stamp frontmatter and the damping stage never sees the new\n // `driftState` (§25/§31).\n bumpMemoryCorpusVersionForDir(storage.dir, { indexedText: false });\n if (storage.dir !== deps.memoryDir) {\n bumpMemoryCorpusVersionForDir(deps.memoryDir, { indexedText: false });\n }\n }\n try {\n await writeJsonFileAtomic(driftMarkerPath(deps.memoryDir), {\n schemaVersion: 1,\n lastRunAt: nowIso,\n lastApplyAt: nowIso,\n appliedCount: report.appliedCount,\n } satisfies PreferenceDriftMarker);\n } catch (err) {\n log.warn(\n `[preference-drift] failed to persist run marker: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n report.elapsedMs = Date.now() - startTime;\n return report;\n}\n\n// ── Review resolution ────────────────────────────────────────────────────────\n\nexport interface PreferenceDriftResolutionOptions {\n /** Replacement preference text. Required for `supersede`. */\n mergedContent?: string;\n /** Fires after a resolution leaves a durable memory mutation in the namespace. */\n onMemoryWritten?: (namespace: string | undefined, storageDir: string) => void;\n now?: Date;\n}\n\nexport interface PreferenceDriftResolutionResult {\n affectedIds: string[];\n message: string;\n}\n\n/**\n * Execute a `kind: \"preference-drift\"` resolution verb.\n *\n * The first memory id on the item is the aging preference; the second is the\n * evidence that pointed away from it. Only the preference is ever mutated —\n * the evidence memory is a witness, not a target.\n *\n * - `keep` — the preference still holds: stamp `lastCorroborated`, clear\n * `driftState`.\n * - `supersede` — write the corrected preference and retire the old one\n * through the normal supersession path.\n * - `archive` — demote the preference to `archived`. Demotion, never\n * deletion; page versioning snapshots the overwrite.\n *\n * Callers resolve the pair record itself (`resolvePair`); this function owns\n * only the memory-side effects.\n */\nexport async function resolvePreferenceDrift(\n storage: StorageManager,\n pair: Pick<ContradictionPair, \"pairId\" | \"memoryIds\" | \"namespace\">,\n verb: \"keep\" | \"supersede\" | \"archive\",\n options: PreferenceDriftResolutionOptions = {},\n): Promise<PreferenceDriftResolutionResult> {\n const now = options.now ?? new Date();\n const nowIso = now.toISOString();\n const preferenceId = pair.memoryIds[0];\n const preference = await storage.getMemoryById(preferenceId);\n if (!preference) {\n return { affectedIds: [], message: `Preference ${preferenceId} not found; not resolving ${pair.pairId}` };\n }\n\n const touched = (): void => {\n try {\n options.onMemoryWritten?.(pair.namespace, storage.dir);\n } catch (err) {\n log.warn(\n `[preference-drift] catalog write touch failed for ${pair.pairId}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n };\n\n if (verb === \"keep\") {\n await storage.writeMemoryFrontmatter(\n preference,\n { lastCorroborated: nowIso, driftState: undefined, updated: nowIso },\n { at: now, actor: DRIFT_ACTOR, reasonCode: \"drift_kept\", ruleVersion: DRIFT_RULE_VERSION },\n );\n bumpMemoryCorpusVersionForDir(storage.dir, { indexedText: false });\n touched();\n return { affectedIds: [preferenceId], message: `Preference ${preferenceId} confirmed still current` };\n }\n\n if (verb === \"archive\") {\n const archivedPath = await storage.archiveMemory(preference, {\n at: now,\n actor: DRIFT_ACTOR,\n reasonCode: \"drift_archived\",\n ruleVersion: DRIFT_RULE_VERSION,\n relatedMemoryIds: [pair.memoryIds[1]],\n });\n if (archivedPath === null) {\n return { affectedIds: [], message: `Preference ${preferenceId} could not be archived; not resolving` };\n }\n bumpMemoryCorpusVersionForDir(storage.dir);\n touched();\n return { affectedIds: [preferenceId], message: `Preference ${preferenceId} archived` };\n }\n\n const replacementText = options.mergedContent?.trim();\n if (!replacementText) {\n return {\n affectedIds: [],\n message: \"supersede requires mergedContent carrying the updated preference; no memories changed\",\n };\n }\n\n // Sealed-envelope write: the replacement text is user- or LLM-supplied, so\n // compose with salvage and warn-log any dropped optional field rather than\n // failing the whole resolution on a cosmetic value.\n const envelope = composeMemoryEnvelope(\n {\n content: replacementText,\n category: \"preference\",\n confidence: preference.frontmatter.confidence ?? 0.8,\n tags: [\"preference-drift\", \"supersede\"],\n entityRef: preference.frontmatter.entityRef,\n },\n { source: DRIFT_ACTOR },\n { salvage: true },\n );\n if (envelope.salvageNotes.length > 0) {\n log.warn(`[preference-drift] supersede write salvaged invalid fields: ${envelope.salvageNotes.join(\"; \")}`);\n }\n const written = await storage.writeSealedMemory(envelope, {\n actor: DRIFT_ACTOR,\n lineage: [preferenceId],\n // `update` is the operator for \"newer version of the same claim\" — the\n // drift replacement restates one preference, it does not merge two.\n derivedVia: \"update\",\n });\n // A tombstone-blocked replacement is NOT active, so superseding the old\n // preference to it would retire the only live copy (§14: never destroy old\n // state before the new state is confirmed viable).\n if (written.tombstoneBlocked) {\n return {\n affectedIds: [],\n message: `Replacement preference for ${pair.pairId} was tombstone-blocked (pending_review); not resolving — original kept active`,\n };\n }\n const superseded = await storage.supersedeMemory(\n preferenceId,\n written.id,\n `preference drift resolved by supersede (${pair.pairId})`,\n undefined,\n { actor: DRIFT_ACTOR },\n );\n bumpMemoryCorpusVersionForDir(storage.dir);\n touched();\n if (!superseded) {\n return {\n affectedIds: [written.id],\n message: `Replacement ${written.id} written but superseding ${preferenceId} failed; both remain — re-run resolution`,\n };\n }\n return {\n affectedIds: [preferenceId, written.id],\n message: `Preference ${preferenceId} superseded by ${written.id}`,\n };\n}\n","/**\n * Resolution Verbs — executes user-chosen resolution actions on contradiction pairs (issue #520).\n *\n * All resolution paths delegate to StorageManager.supersedeMemory. Do not\n * reimplement supersession logic here (rule 22: deduplicate resolution).\n */\n\nimport { log } from \"../logger.js\";\nimport { composeMemoryEnvelope } from \"../write-envelope.js\";\nimport type { StorageManager } from \"../storage.js\";\nimport type { MemoryCategory, MemoryFile } from \"../types.js\";\nimport type { ResolutionVerb } from \"./contradiction-review.js\";\nimport {\n CONTRADICTION_VERBS,\n PREFERENCE_DRIFT_VERBS,\n readPair,\n resolvePair,\n} from \"./contradiction-review.js\";\nimport { resolvePreferenceDrift } from \"../preferences/preference-drift.js\";\n\nexport interface ResolutionResult {\n pairId: string;\n verb: ResolutionVerb;\n /** Memory IDs affected by the resolution. */\n affectedIds: string[];\n /** Human-readable status. */\n message: string;\n}\n\nexport interface ExecuteResolutionOptions {\n /** Existing merged memory to supersede both source memories to. */\n mergedMemoryId?: string;\n /** Content for a new merged memory. Required for merge when mergedMemoryId is omitted. */\n mergedContent?: string;\n /** Category for a newly created merged memory. Defaults to the shared source category, or fact. */\n mergedCategory?: MemoryCategory;\n /** Resolve storage for the pair namespace, or the default namespace for legacy unscoped pairs. */\n storageForNamespace?: (namespace: string | undefined) => StorageManager | Promise<StorageManager>;\n /**\n * Best-effort hook invoked after a contradiction resolution leaves a durable\n * mutation in the namespace's memory files (issue #1499 sweep, NH1dX / NH3X3).\n * Every mutating verb — `merge` (creates a new memory and supersedes both\n * sources), `keep-a`, and `keep-b` (supersede the losing source + rewrite\n * frontmatter) — writes directly to the pair's (possibly DYNAMIC) namespace\n * storage, bypassing the extraction write path that records catalog writes. So\n * without this the namespace's `lastWriteAt` stays stale and QMD maintenance /\n * `writtenSince` can skip a namespace whose only post-write mutation is\n * resolving a contradiction. It fires after the resolution commits, or after a\n * failed resolution/rollback path when durable memory changes are still left on\n * disk. If a failure rolls back cleanly, this is never called, so the catalog\n * never records a write that did not survive (rule #25). Non-mutating verbs\n * (`both-valid`, `needs-more-context`) never trigger it. Callers wire this to\n * `Orchestrator.recordCatalogWrite(namespace, storageDir)`. Must be\n * failure-tolerant: it is fire-and-forget and must never affect resolution.\n */\n onMergedMemoryWritten?: (namespace: string | undefined, storageDir: string) => void;\n}\n\n/**\n * Every verb the `review_resolve` surface accepts, across both review-item\n * kinds (issue #2371). This is a *surface-level* gate only: per-kind validity\n * is enforced inside {@link executeResolution}, which is the first place the\n * item's `kind` is known. Callers therefore reject an unknown verb early and\n * a cross-kind verb precisely.\n */\nconst VALID_VERBS: readonly ResolutionVerb[] = [...CONTRADICTION_VERBS, ...PREFERENCE_DRIFT_VERBS];\n\nexport function isValidResolutionVerb(value: string): value is ResolutionVerb {\n return VALID_VERBS.includes(value as ResolutionVerb);\n}\n\n/**\n * Execute a resolution verb on a contradiction pair.\n *\n * - `keep-a`: Supersede B, keep A active.\n * - `keep-b`: Supersede A, keep B active.\n * - `merge`: Create or verify a real merged memory, then supersede both inputs.\n * - `both-valid`: Mark pair as reviewed; no memories are superseded.\n * - `needs-more-context`: Defer; no action, short cooldown.\n */\nexport async function executeResolution(\n memoryDir: string,\n storage: StorageManager,\n pairId: string,\n verb: ResolutionVerb,\n options: ExecuteResolutionOptions = {},\n): Promise<ResolutionResult> {\n if (typeof verb !== \"string\" || !isValidResolutionVerb(verb)) {\n throw new Error(`Invalid contradiction resolution verb: ${String(verb)}`);\n }\n\n const pair = readPair(memoryDir, pairId);\n if (!pair) {\n return { pairId, verb, affectedIds: [], message: `Pair ${pairId} not found` };\n }\n\n if (pair.namespace && !options.storageForNamespace) {\n throw new Error(\n \"contradiction resolution requires storageForNamespace for namespaced pairs so callers resolve the correct namespace storage\",\n );\n }\n\n const resolutionStorage = options.storageForNamespace\n ? await options.storageForNamespace(pair.namespace)\n : storage;\n\n if (pair.resolution && pair.resolution !== \"needs-more-context\") {\n return { pairId, verb, affectedIds: [], message: `Pair already resolved with verb \"${pair.resolution}\"` };\n }\n // Verb validity is per review-item kind (issue #2371). A preference-drift\n // item never accepts keep-a/keep-b/merge (there is no \"B\" to keep — the\n // second id is witness evidence, not a competing claim), and a contradiction\n // pair never accepts keep/supersede/archive. Rejecting the cross-kind verb\n // here, after the record is loaded, is the only place both kinds are known.\n const isDriftItem = pair.kind === \"preference-drift\";\n const verbMatchesKind = isDriftItem\n ? PREFERENCE_DRIFT_VERBS.includes(verb)\n : CONTRADICTION_VERBS.includes(verb);\n if (!verbMatchesKind) {\n const allowed = (isDriftItem ? PREFERENCE_DRIFT_VERBS : CONTRADICTION_VERBS).join(\", \");\n return {\n pairId,\n verb,\n affectedIds: [],\n message: `Verb \"${verb}\" is not valid for a ${isDriftItem ? \"preference-drift\" : \"contradiction\"} item. Valid: ${allowed}`,\n };\n }\n\n if (isDriftItem) {\n const outcome = await resolvePreferenceDrift(\n resolutionStorage,\n pair,\n verb as \"keep\" | \"supersede\" | \"archive\",\n {\n mergedContent: options.mergedContent,\n onMemoryWritten: options.onMergedMemoryWritten,\n },\n );\n // Only record the terminal resolution when memories actually changed;\n // a refused resolution must stay actionable in the queue.\n if (outcome.affectedIds.length > 0) resolvePair(memoryDir, pairId, verb);\n return { pairId, verb, affectedIds: outcome.affectedIds, message: outcome.message };\n }\n\n\n const [idA, idB] = pair.memoryIds;\n const affectedIds: string[] = [];\n let message = \"\";\n let supersedeFailed = false;\n let rollbackAfterResolveFailure: (() => Promise<boolean>) | null = null;\n // Deferred catalog-write touch for any resolution that leaves durable namespace\n // memory mutations (issue #1499 sweep, NH1dX / NH3X3). Rule #25: never record a\n // catalog touch for a write that is fully rolled back. Successful mutating\n // resolutions invoke it after `resolvePair` persists. Failed paths invoke it\n // only when rollback inspection shows the namespace still differs from the\n // pre-mutation snapshot.\n let recordCatalogWriteTouch: (() => void) | null = null;\n // Returns the deferred touch fn for a mutating verb (or null when the caller\n // wired no catalog hook), so each branch assigns `recordCatalogWriteTouch`\n // directly in the function body — keeping TS control-flow narrowing intact at\n // the post-commit invocation below.\n const buildCatalogTouch = (): (() => void) | null => {\n if (!options.onMergedMemoryWritten) return null;\n const onMergedMemoryWritten = options.onMergedMemoryWritten;\n const namespace = pair.namespace;\n const storageDir = resolutionStorage.dir;\n return () => onMergedMemoryWritten(namespace, storageDir);\n };\n const catalogWriteTouch = buildCatalogTouch();\n const recordCatalogWriteTouchSafely = (context: string, touch = catalogWriteTouch): void => {\n if (!touch) return;\n try {\n touch();\n } catch (err) {\n log.warn(\n \"[contradiction-resolution] catalog write touch failed for pair=%s context=%s: %s\",\n pairId,\n context,\n err instanceof Error ? err.message : err,\n );\n }\n };\n const touchCatalogIfRollbackLeftChange = async (\n context: string,\n snapshots: MemoryFile[],\n replacement?: Extract<MergeReplacement, { ok: true }>,\n ): Promise<void> => {\n if (!catalogWriteTouch) return;\n if (await rollbackLeftDurableMutation(resolutionStorage, snapshots, replacement)) {\n recordCatalogWriteTouchSafely(context);\n }\n };\n\n switch (verb) {\n case \"keep-a\": {\n const keepTarget = await validateKeepTarget(resolutionStorage, pairId, idA);\n if (!keepTarget.ok) {\n supersedeFailed = true;\n message = keepTarget.message;\n break;\n }\n const sourceB = await loadSourceSnapshot(resolutionStorage, idB);\n const ok = sourceB\n ? await supersedeSafe(resolutionStorage, idB, idA, \"contradiction-resolution:keep-a\")\n : false;\n if (ok) {\n affectedIds.push(idB);\n rollbackAfterResolveFailure = async () =>\n restoreMemorySnapshot(resolutionStorage, sourceB!, \"contradiction-resolution:keep-a-rollback\");\n // keep-a superseded idB in this namespace — record a catalog touch once\n // the resolution durably commits (NH3X3).\n recordCatalogWriteTouch = catalogWriteTouch;\n message = `Kept ${idA}, superseded ${idB}`;\n }\n else {\n supersedeFailed = true;\n const rolledBack = sourceB\n ? await restoreMemorySnapshot(resolutionStorage, sourceB, \"contradiction-resolution:keep-a-rollback\")\n : false;\n if (sourceB && !rolledBack) {\n await touchCatalogIfRollbackLeftChange(\"keep-a-rollback-incomplete\", [sourceB]);\n }\n message = rolledBack\n ? `Supersede failed for ${idB}; restored ${idB} and did not resolve`\n : `Supersede failed for ${idB}; rollback incomplete for ${idB} and pair is not resolved`;\n }\n break;\n }\n case \"keep-b\": {\n const keepTarget = await validateKeepTarget(resolutionStorage, pairId, idB);\n if (!keepTarget.ok) {\n supersedeFailed = true;\n message = keepTarget.message;\n break;\n }\n const sourceA = await loadSourceSnapshot(resolutionStorage, idA);\n const ok = sourceA\n ? await supersedeSafe(resolutionStorage, idA, idB, \"contradiction-resolution:keep-b\")\n : false;\n if (ok) {\n affectedIds.push(idA);\n rollbackAfterResolveFailure = async () =>\n restoreMemorySnapshot(resolutionStorage, sourceA!, \"contradiction-resolution:keep-b-rollback\");\n // keep-b superseded idA in this namespace — record a catalog touch once\n // the resolution durably commits (NH3X3).\n recordCatalogWriteTouch = catalogWriteTouch;\n message = `Kept ${idB}, superseded ${idA}`;\n }\n else {\n supersedeFailed = true;\n const rolledBack = sourceA\n ? await restoreMemorySnapshot(resolutionStorage, sourceA, \"contradiction-resolution:keep-b-rollback\")\n : false;\n if (sourceA && !rolledBack) {\n await touchCatalogIfRollbackLeftChange(\"keep-b-rollback-incomplete\", [sourceA]);\n }\n message = rolledBack\n ? `Supersede failed for ${idA}; restored ${idA} and did not resolve`\n : `Supersede failed for ${idA}; rollback incomplete for ${idA} and pair is not resolved`;\n }\n break;\n }\n case \"merge\": {\n const replacement = await prepareMergeReplacement(resolutionStorage, pairId, idA, idB, options);\n if (!replacement.ok) {\n supersedeFailed = true;\n message = replacement.message;\n break;\n }\n\n const okA = await supersedeSafe(resolutionStorage, idA, replacement.mergedId, \"contradiction-resolution:merge\");\n if (!okA) {\n supersedeFailed = true;\n const rolledBackA = await restoreMemorySnapshot(resolutionStorage, replacement.sourceA);\n message = rolledBackA\n ? `Merge failed for ${idA}; restored ${idA} and did not resolve`\n : `Merge failed for ${idA}; rollback incomplete for ${idA} and pair is not resolved`;\n if (rolledBackA) {\n await cleanupCreatedReplacement(resolutionStorage, replacement);\n }\n else {\n await touchCatalogIfRollbackLeftChange(\"merge-first-rollback-incomplete\", [replacement.sourceA], replacement);\n }\n break;\n }\n\n const okB = await supersedeSafe(resolutionStorage, idB, replacement.mergedId, \"contradiction-resolution:merge\");\n if (!okB) {\n supersedeFailed = true;\n const rolledBackA = await restoreMemorySnapshot(resolutionStorage, replacement.sourceA);\n const rolledBackB = await restoreMemorySnapshot(resolutionStorage, replacement.sourceB);\n message = rolledBackA && rolledBackB\n ? `Merge failed for ${idB}; restored ${idA} and ${idB} and did not resolve`\n : `Merge failed for ${idB}; rollback incomplete for ${[\n rolledBackA ? undefined : idA,\n rolledBackB ? undefined : idB,\n ].filter(Boolean).join(\", \")} and pair is not resolved`;\n if (rolledBackA && rolledBackB) {\n await cleanupCreatedReplacement(resolutionStorage, replacement);\n }\n else {\n await touchCatalogIfRollbackLeftChange(\n \"merge-second-rollback-incomplete\",\n [replacement.sourceA, replacement.sourceB],\n replacement,\n );\n }\n break;\n }\n\n affectedIds.push(idA, idB);\n rollbackAfterResolveFailure = async () => {\n const rolledBackA = await restoreMemorySnapshot(resolutionStorage, replacement.sourceA);\n const rolledBackB = await restoreMemorySnapshot(resolutionStorage, replacement.sourceB);\n if (rolledBackA && rolledBackB) {\n await cleanupCreatedReplacement(resolutionStorage, replacement);\n }\n return rolledBackA && rolledBackB;\n };\n // Catalog write touch (issue #1499 sweep): the merge supersedes BOTH sources\n // (and, when created, writes a fresh merged memory) in the pair's (possibly\n // dynamic) namespace storage — but the resolution is not durable yet\n // (resolvePair persists below, and a failure rolls the merge back). Defer\n // the touch so it fires ONLY after the resolution commits past the rollback\n // point (NH1dX, rule #25). Arm it for EVERY successful merge — even reusing\n // an existing merged-id still supersedes both sources, a namespace mutation\n // that must refresh `lastWriteAt` (NH3X3). Otherwise a dynamic namespace\n // whose only durable mutation is a contradiction merge stays invisible to\n // QMD maintenance / `writtenSince`. Best-effort on the caller side.\n recordCatalogWriteTouch = catalogWriteTouch;\n message = `Both memories superseded by merged ${replacement.mergedId}`;\n break;\n }\n case \"both-valid\": {\n message = \"Pair marked as both-valid; cooldown applied\";\n break;\n }\n case \"needs-more-context\": {\n message = \"Deferred; no action taken, short cooldown applied\";\n break;\n }\n }\n\n if (!supersedeFailed) {\n let resolved = false;\n try {\n resolved = resolvePair(memoryDir, pairId, verb) !== null;\n } catch (err) {\n log.warn(\n \"[contradiction-resolution] failed to persist pair=%s verb=%s: %s\",\n pairId,\n verb,\n err instanceof Error ? err.message : err,\n );\n }\n if (!resolved) {\n if (rollbackAfterResolveFailure) {\n const rolledBack = await rollbackAfterResolveFailure();\n affectedIds.length = 0;\n message = rolledBack\n ? `Resolution persistence failed; rolled back memory changes and did not resolve ${pairId}`\n : \"Resolution persistence failed; rollback incomplete and pair is not resolved\";\n if (!rolledBack && recordCatalogWriteTouch) {\n recordCatalogWriteTouchSafely(\"resolve-persistence-rollback-incomplete\", recordCatalogWriteTouch);\n }\n } else {\n message = \"Resolution persistence failed; pair is not resolved\";\n }\n } else if (recordCatalogWriteTouch) {\n // The resolution durably committed (memory mutated AND the resolution\n // persisted past the rollback point). Only now is it safe to record the\n // catalog write for the namespace mutation (NH1dX / NH3X3, rule #25).\n // Best-effort: the caller's callback swallows errors; guard here so a\n // throwing callback never derails a successful resolution.\n recordCatalogWriteTouchSafely(\"resolved\", recordCatalogWriteTouch);\n }\n }\n log.info(\"[contradiction-resolution] pair=%s verb=%s affected=%d\", pairId, verb, affectedIds.length);\n return { pairId, verb, affectedIds, message };\n}\n\ntype MergeReplacement =\n | {\n ok: true;\n mergedId: string;\n sourceA: MemoryFile;\n sourceB: MemoryFile;\n created: boolean;\n }\n | {\n ok: false;\n message: string;\n };\n\nasync function prepareMergeReplacement(\n storage: StorageManager,\n pairId: string,\n idA: string,\n idB: string,\n options: ExecuteResolutionOptions,\n): Promise<MergeReplacement> {\n const sourceA = await storage.getMemoryById(idA);\n const sourceB = await storage.getMemoryById(idB);\n if (!sourceA || !sourceB) {\n return { ok: false, message: `Merge requires both source memories to exist; not resolving ${pairId}` };\n }\n\n const requestedMergedId = options.mergedMemoryId?.trim();\n if (requestedMergedId) {\n if (requestedMergedId === idA || requestedMergedId === idB) {\n return { ok: false, message: \"Merge replacement must be distinct from both source memories; not resolving\" };\n }\n const replacement = await storage.getMemoryById(requestedMergedId);\n if (!replacement) {\n return { ok: false, message: `Merged memory ${requestedMergedId} not found; not resolving` };\n }\n const replacementStatus = replacement.frontmatter.status ?? \"active\";\n if (replacementStatus !== \"active\") {\n return {\n ok: false,\n message: `Merged memory ${requestedMergedId} is ${replacementStatus}; not resolving`,\n };\n }\n return { ok: true, mergedId: requestedMergedId, sourceA, sourceB, created: false };\n }\n\n const mergedContent = options.mergedContent;\n if (typeof mergedContent !== \"string\" || mergedContent.trim().length === 0) {\n return {\n ok: false,\n message: \"Merge requires mergedMemoryId or mergedContent; no memories changed\",\n };\n }\n\n const category = options.mergedCategory ?? mergedMemoryCategory(sourceA, sourceB);\n let mergedId: string;\n try {\n // Sealed-envelope write (issue #1989 PR4): merged content is\n // LLM-produced — salvage; drops are warn-logged.\n const mergeEnvelope = composeMemoryEnvelope(\n {\n content: mergedContent,\n category,\n confidence: Math.min(sourceA.frontmatter.confidence ?? 0.8, sourceB.frontmatter.confidence ?? 0.8),\n tags: [\"contradiction-resolution\", \"merge\"],\n },\n { source: \"contradiction-resolution\" },\n { salvage: true },\n );\n if (mergeEnvelope.salvageNotes.length > 0) {\n log.warn(`contradiction-resolution write salvaged invalid fields: ${mergeEnvelope.salvageNotes.join(\"; \")}`);\n }\n const mergeResult = await storage.writeSealedMemory(mergeEnvelope, {\n actor: \"contradiction-resolution\",\n lineage: [idA, idB],\n derivedVia: \"merge\",\n });\n mergedId = mergeResult.id;\n if (mergeResult.tombstoneBlocked) {\n // #1645: merged content matched a tombstone (pending_review). Don't\n // supersede both sources to a non-active replacement — that retires\n // the only active copies. Clean up the pending merge and abort the pair.\n await cleanupMemoryId(storage, mergedId);\n return { ok: false, message: `Merged memory for ${pairId} was tombstone-blocked (pending_review); not resolving — sources kept active` };\n }\n } catch (err) {\n log.warn(\n \"[contradiction-resolution] merged memory creation failed for %s: %s\",\n pairId,\n err instanceof Error ? err.message : err,\n );\n return { ok: false, message: `Merged memory could not be created; not resolving ${pairId}` };\n }\n const replacement = await storage.getMemoryById(mergedId);\n if (!replacement) {\n await cleanupMemoryId(storage, mergedId);\n return { ok: false, message: `Merged memory ${mergedId} could not be verified; not resolving` };\n }\n return { ok: true, mergedId, sourceA, sourceB, created: true };\n}\n\nfunction mergedMemoryCategory(sourceA: MemoryFile, sourceB: MemoryFile): MemoryCategory {\n return sourceA.frontmatter.category === sourceB.frontmatter.category\n ? sourceA.frontmatter.category\n : \"fact\";\n}\n\ntype KeepTargetValidation =\n | { ok: true }\n | { ok: false; message: string };\n\nasync function validateKeepTarget(\n storage: StorageManager,\n pairId: string,\n keepId: string,\n): Promise<KeepTargetValidation> {\n const target = await loadSourceSnapshot(storage, keepId);\n if (!target) {\n return { ok: false, message: `Kept memory ${keepId} not found; not resolving ${pairId}` };\n }\n\n const status = target.frontmatter.status ?? \"active\";\n if (status !== \"active\") {\n return { ok: false, message: `Kept memory ${keepId} is ${status}; not resolving ${pairId}` };\n }\n\n return { ok: true };\n}\n\nasync function loadSourceSnapshot(storage: StorageManager, memoryId: string): Promise<MemoryFile | null> {\n try {\n return await storage.getMemoryById(memoryId);\n } catch (err) {\n log.warn(\n \"[contradiction-resolution] source snapshot failed for %s: %s\",\n memoryId,\n err instanceof Error ? err.message : err,\n );\n return null;\n }\n}\n\nasync function restoreMemorySnapshot(\n storage: StorageManager,\n memory: MemoryFile,\n reasonCode = \"contradiction-resolution:merge-rollback\",\n): Promise<boolean> {\n try {\n const current = await storage.getMemoryById(memory.frontmatter.id);\n if (!current) return false;\n const restoredFrontmatter: Partial<MemoryFile[\"frontmatter\"]> = {\n ...memory.frontmatter,\n status: memory.frontmatter.status,\n supersededBy: memory.frontmatter.supersededBy,\n supersededAt: memory.frontmatter.supersededAt,\n };\n return await storage.writeMemoryFrontmatter(current, restoredFrontmatter, {\n actor: \"contradiction-resolution\",\n reasonCode,\n });\n } catch (err) {\n log.warn(\n \"[contradiction-resolution] rollback failed for %s: %s\",\n memory.frontmatter.id,\n err instanceof Error ? err.message : err,\n );\n return false;\n }\n}\n\nasync function rollbackLeftDurableMutation(\n storage: StorageManager,\n snapshots: MemoryFile[],\n replacement?: Extract<MergeReplacement, { ok: true }>,\n): Promise<boolean> {\n for (const snapshot of snapshots) {\n try {\n const current = await storage.getMemoryById(snapshot.frontmatter.id);\n if (!current) return true;\n if (supersessionStateChanged(current, snapshot)) return true;\n } catch (err) {\n log.warn(\n \"[contradiction-resolution] rollback inspection failed for %s: %s\",\n snapshot.frontmatter.id,\n err instanceof Error ? err.message : err,\n );\n return true;\n }\n }\n\n if (replacement?.created) {\n try {\n return (await storage.getMemoryById(replacement.mergedId)) !== null;\n } catch (err) {\n log.warn(\n \"[contradiction-resolution] rollback replacement inspection failed for %s: %s\",\n replacement.mergedId,\n err instanceof Error ? err.message : err,\n );\n return true;\n }\n }\n\n return false;\n}\n\nfunction supersessionStateChanged(current: MemoryFile, snapshot: MemoryFile): boolean {\n return (\n current.frontmatter.status !== snapshot.frontmatter.status ||\n current.frontmatter.supersededBy !== snapshot.frontmatter.supersededBy ||\n current.frontmatter.supersededAt !== snapshot.frontmatter.supersededAt\n );\n}\n\nasync function cleanupCreatedReplacement(storage: StorageManager, replacement: Extract<MergeReplacement, { ok: true }>): Promise<void> {\n if (!replacement.created) return;\n await cleanupMemoryId(storage, replacement.mergedId);\n}\n\nasync function cleanupMemoryId(storage: StorageManager, memoryId: string): Promise<void> {\n try {\n const memory = await storage.getMemoryById(memoryId);\n const invalidated = await storage.invalidateMemory(memoryId);\n if (invalidated && memory?.frontmatter.category === \"fact\") {\n await storage.removeFactContentHashesForMemories([memory]);\n }\n } catch (err) {\n log.warn(\n \"[contradiction-resolution] cleanup failed for merged memory %s: %s\",\n memoryId,\n err instanceof Error ? err.message : err,\n );\n }\n}\n\nasync function supersedeSafe(\n storage: StorageManager,\n oldId: string,\n newId: string,\n reason: string,\n): Promise<boolean> {\n try {\n const result = await storage.supersedeMemory(oldId, newId, reason);\n if (result === false) {\n log.warn(\"[contradiction-resolution] supersede returned false for %s → %s\", oldId, newId);\n return false;\n }\n return true;\n } catch (err) {\n log.warn(\n \"[contradiction-resolution] supersede failed %s → %s: %s\",\n oldId,\n newId,\n err instanceof Error ? err.message : err,\n );\n return false;\n }\n}\n"],"mappings":"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","names":["replacement"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  parseFrontmatter
3
- } from "./chunk-UFIZRMQZ.js";
3
+ } from "./chunk-E4XLFYHV.js";
4
4
  import {
5
5
  activityDigestPath,
6
6
  isValidActivityDate
@@ -199,4 +199,4 @@ export {
199
199
  buildStandup,
200
200
  standupHelp
201
201
  };
202
- //# sourceMappingURL=chunk-4LNCLZNK.js.map
202
+ //# sourceMappingURL=chunk-S2GR3T7W.js.map
@@ -1,3 +1,6 @@
1
+ import {
2
+ chatgptReplayNormalizer
3
+ } from "./chunk-MMACM5G2.js";
1
4
  import {
2
5
  claudeReplayNormalizer
3
6
  } from "./chunk-54BGIBCR.js";
@@ -5,21 +8,21 @@ import {
5
8
  openclawReplayNormalizer
6
9
  } from "./chunk-H4CKS5B2.js";
7
10
  import {
8
- chatgptReplayNormalizer
9
- } from "./chunk-MMACM5G2.js";
11
+ importMarkdownBundle
12
+ } from "./chunk-HDDRVXX4.js";
13
+ import {
14
+ importSqlite
15
+ } from "./chunk-PYHOAXTI.js";
16
+ import {
17
+ exportJsonBundle
18
+ } from "./chunk-UP6MOYCB.js";
10
19
  import {
11
20
  exportOkfBundle,
12
21
  parseIncludeStatus
13
- } from "./chunk-ABGM2BN4.js";
22
+ } from "./chunk-O43AAJFQ.js";
14
23
  import {
15
24
  exportSqlite
16
25
  } from "./chunk-BV2TIZ4F.js";
17
- import {
18
- importMarkdownBundle
19
- } from "./chunk-HDDRVXX4.js";
20
- import {
21
- importSqlite
22
- } from "./chunk-PYHOAXTI.js";
23
26
  import {
24
27
  detectImportFormat
25
28
  } from "./chunk-OZKVVUJB.js";
@@ -28,13 +31,10 @@ import {
28
31
  } from "./chunk-2DL3OFLD.js";
29
32
  import {
30
33
  backupMemoryDir
31
- } from "./chunk-2NLLXCJG.js";
34
+ } from "./chunk-BXLOS5AJ.js";
32
35
  import {
33
36
  exportMarkdownBundle
34
37
  } from "./chunk-765K3SAT.js";
35
- import {
36
- exportJsonBundle
37
- } from "./chunk-UP6MOYCB.js";
38
38
  import {
39
39
  buildReplayNormalizerRegistry,
40
40
  clampBatchSize,
@@ -53,6 +53,12 @@ import {
53
53
  import {
54
54
  WebDavServer
55
55
  } from "./chunk-PYIFUBRK.js";
56
+ import {
57
+ migrateObservations
58
+ } from "./chunk-IIFFC3RL.js";
59
+ import {
60
+ rebuildMemoryLifecycleLedger
61
+ } from "./chunk-T32YYUT2.js";
56
62
  import {
57
63
  rebuildObservations
58
64
  } from "./chunk-DQTCGVFK.js";
@@ -60,11 +66,11 @@ import {
60
66
  archiveObservations
61
67
  } from "./chunk-YLBE6PLR.js";
62
68
  import {
63
- migrateObservations
64
- } from "./chunk-IIFFC3RL.js";
65
- import {
66
- rebuildMemoryLifecycleLedger
67
- } from "./chunk-3DNTFZAT.js";
69
+ getBulkImportSource,
70
+ listBulkImportSources,
71
+ registerBulkImportSource,
72
+ runBulkImportPipeline
73
+ } from "./chunk-HSSERO3E.js";
68
74
  import {
69
75
  lintOkfDir
70
76
  } from "./chunk-G2STTRYB.js";
@@ -72,11 +78,8 @@ import {
72
78
  runCompatChecks
73
79
  } from "./chunk-2524MOWK.js";
74
80
  import {
75
- getBulkImportSource,
76
- listBulkImportSources,
77
- registerBulkImportSource,
78
- runBulkImportPipeline
79
- } from "./chunk-HSSERO3E.js";
81
+ searchVerifiedEpisodes
82
+ } from "./chunk-SWXPR5SE.js";
80
83
  import {
81
84
  getUtilityLearningStatus,
82
85
  learnUtilityPromotionWeights
@@ -85,23 +88,20 @@ import {
85
88
  getUtilityTelemetryStatus,
86
89
  recordUtilityTelemetryEvent
87
90
  } from "./chunk-EBA5DA77.js";
88
- import {
89
- searchVerifiedEpisodes
90
- } from "./chunk-S5R77WHV.js";
91
91
  import {
92
92
  ThreadingManager
93
93
  } from "./chunk-OJP3N7UK.js";
94
94
  import {
95
95
  promoteSemanticRuleFromMemory
96
- } from "./chunk-F5MINS3R.js";
96
+ } from "./chunk-A6WNTVA7.js";
97
97
  import {
98
98
  searchVerifiedSemanticRules
99
- } from "./chunk-QSXEQPC4.js";
99
+ } from "./chunk-2OFDC3AK.js";
100
100
  import {
101
101
  buildResumeBundleFromState,
102
102
  getResumeBundleStatus,
103
103
  recordResumeBundle
104
- } from "./chunk-PYYQCHJC.js";
104
+ } from "./chunk-MZOQ26LH.js";
105
105
  import {
106
106
  getWorkProductLedgerStatus,
107
107
  recordWorkProductLedgerEntry,
@@ -113,6 +113,15 @@ import {
113
113
  import {
114
114
  parseXrayCliOptions
115
115
  } from "./chunk-BTOHGPHC.js";
116
+ import {
117
+ collectPatternMemories,
118
+ explainPatternMemory,
119
+ parsePatternsExplainOptions,
120
+ parsePatternsListOptions,
121
+ parseStrictCliDate,
122
+ renderPatternExplain,
123
+ renderPatternsList
124
+ } from "./chunk-3T74IZB3.js";
116
125
  import {
117
126
  readRuntimePolicySnapshot,
118
127
  sanitizeRuntimePolicyValues
@@ -125,21 +134,12 @@ import {
125
134
  runOperatorInventory,
126
135
  runOperatorRepair,
127
136
  runOperatorSetup
128
- } from "./chunk-UL7KDVLC.js";
137
+ } from "./chunk-PZ2QQULY.js";
129
138
  import {
130
139
  analyzeSessionIntegrity,
131
140
  applySessionRepair,
132
141
  planSessionRepair
133
142
  } from "./chunk-KFY3SGN7.js";
134
- import {
135
- collectPatternMemories,
136
- explainPatternMemory,
137
- parsePatternsExplainOptions,
138
- parsePatternsListOptions,
139
- parseStrictCliDate,
140
- renderPatternExplain,
141
- renderPatternsList
142
- } from "./chunk-3T74IZB3.js";
143
143
  import {
144
144
  GITHUB_CONNECTOR_ID,
145
145
  GMAIL_CONNECTOR_ID,
@@ -171,12 +171,12 @@ import {
171
171
  } from "./chunk-4IHBN6WU.js";
172
172
  import {
173
173
  GraphDashboardServer
174
- } from "./chunk-EZ25VE3G.js";
174
+ } from "./chunk-YNDLCWXS.js";
175
175
  import {
176
176
  rebuildMemoryProjection,
177
177
  repairMemoryProjection,
178
178
  verifyMemoryProjection
179
- } from "./chunk-JNAOTN7B.js";
179
+ } from "./chunk-XLWMNDQR.js";
180
180
  import {
181
181
  buildConnectorRowsFromDefinitions,
182
182
  parseConnectorsListOptions,
@@ -197,7 +197,7 @@ import {
197
197
  } from "./chunk-6TBIWIAG.js";
198
198
  import {
199
199
  parseConfig
200
- } from "./chunk-55NZVUNI.js";
200
+ } from "./chunk-QAIVTLL2.js";
201
201
  import {
202
202
  applyManagedRegion,
203
203
  expandVaultTemplateTokens,
@@ -210,7 +210,7 @@ import {
210
210
  import {
211
211
  EngramAccessHttpServer,
212
212
  MeetingsInputError
213
- } from "./chunk-5BVL2XUD.js";
213
+ } from "./chunk-LHDSCWDK.js";
214
214
  import {
215
215
  WearablesInputError
216
216
  } from "./chunk-V7IZKJI3.js";
@@ -220,10 +220,10 @@ import {
220
220
  loadChatSession,
221
221
  processChatMessage,
222
222
  sessionBelongsToPrincipal
223
- } from "./chunk-QCYUIZK2.js";
223
+ } from "./chunk-AU43D3IT.js";
224
224
  import {
225
225
  EngramAccessService
226
- } from "./chunk-DINOVGA5.js";
226
+ } from "./chunk-6WRHNA4I.js";
227
227
  import {
228
228
  WorkStorage
229
229
  } from "./chunk-MPC7TYTZ.js";
@@ -243,16 +243,16 @@ import {
243
243
  } from "./chunk-32HO62I4.js";
244
244
  import {
245
245
  readAggregateExtractionWatermark
246
- } from "./chunk-PNVOKGAX.js";
246
+ } from "./chunk-G5I5ZT6O.js";
247
247
  import {
248
248
  getObjectiveStateStoreStatus
249
249
  } from "./chunk-HM7RHKS4.js";
250
250
  import {
251
251
  journalPath
252
- } from "./chunk-OGZC2WUX.js";
252
+ } from "./chunk-JWFTPRYD.js";
253
253
  import {
254
254
  searchHarmonicRetrieval
255
- } from "./chunk-VVYLVE6R.js";
255
+ } from "./chunk-PQKZLBCJ.js";
256
256
  import {
257
257
  getCueAnchorStoreStatus
258
258
  } from "./chunk-BMWN7B3Y.js";
@@ -261,18 +261,18 @@ import {
261
261
  readMemoryGovernanceRunArtifact,
262
262
  restoreMemoryGovernanceRun,
263
263
  runMemoryGovernance
264
- } from "./chunk-ZGYLPCWN.js";
264
+ } from "./chunk-VO2BNAA2.js";
265
265
  import {
266
266
  listNamespaces,
267
267
  runNamespaceMigration,
268
268
  verifyNamespaces
269
- } from "./chunk-DSPWVQZ6.js";
269
+ } from "./chunk-73R4HOOK.js";
270
270
  import {
271
271
  resolveNamespaceChildRoot
272
272
  } from "./chunk-3UXOZBHV.js";
273
273
  import {
274
274
  analyzeGraphHealth
275
- } from "./chunk-5FAGCOZD.js";
275
+ } from "./chunk-2U3R3DDH.js";
276
276
  import {
277
277
  hostSecretRefResolver,
278
278
  loadHostSecretRefResolver,
@@ -300,10 +300,10 @@ import {
300
300
  } from "./chunk-QDW3E4RD.js";
301
301
  import {
302
302
  getCausalTrajectoryStoreStatus
303
- } from "./chunk-B3O3IRZN.js";
303
+ } from "./chunk-VZBW6CDG.js";
304
304
  import {
305
305
  meetingIdDate
306
- } from "./chunk-UFIZRMQZ.js";
306
+ } from "./chunk-E4XLFYHV.js";
307
307
  import {
308
308
  isValidTranscriptDate
309
309
  } from "./chunk-UHVXE24Y.js";
@@ -316,7 +316,7 @@ import {
316
316
  } from "./chunk-SCU65EZI.js";
317
317
  import {
318
318
  bumpMemoryCorpusVersionForDir
319
- } from "./chunk-XCB6QDL6.js";
319
+ } from "./chunk-M5GVCJSJ.js";
320
320
  import {
321
321
  renderQmdBacklogStatus
322
322
  } from "./chunk-IUM3VSHI.js";
@@ -6698,7 +6698,7 @@ function registerCli(api, orchestrator, registerOptions = {}) {
6698
6698
  }
6699
6699
  }
6700
6700
  if (sourceArchive.endsWith(".enc")) {
6701
- const { isEncryptedCapsuleFile } = await import("./capsule-crypto-7FJQINUR.js");
6701
+ const { isEncryptedCapsuleFile } = await import("./capsule-crypto-YO5QJ6L3.js");
6702
6702
  const encDetected = await isEncryptedCapsuleFile(sourceArchive).catch(() => true);
6703
6703
  if (encDetected) {
6704
6704
  throw new Error(
@@ -6706,7 +6706,7 @@ function registerCli(api, orchestrator, registerOptions = {}) {
6706
6706
  );
6707
6707
  }
6708
6708
  }
6709
- const { mergeCapsule } = await import("./capsule-merge-ZCXUPLNJ.js");
6709
+ const { mergeCapsule } = await import("./capsule-merge-42GJGDUC.js");
6710
6710
  const result = await mergeCapsule({
6711
6711
  sourceArchive,
6712
6712
  targetRoot: memoryDir,
@@ -6861,7 +6861,7 @@ function registerCli(api, orchestrator, registerOptions = {}) {
6861
6861
  const { parseExportBundle } = await import("./transfer/types.js");
6862
6862
  let decryptedBuf;
6863
6863
  try {
6864
- const { decryptCapsuleFileInMemory } = await import("./capsule-crypto-7FJQINUR.js");
6864
+ const { decryptCapsuleFileInMemory } = await import("./capsule-crypto-YO5QJ6L3.js");
6865
6865
  decryptedBuf = await decryptCapsuleFileInMemory(archivePath, memoryDir);
6866
6866
  } catch (decErr) {
6867
6867
  const msg = decErr instanceof Error ? decErr.message : String(decErr);
@@ -9351,7 +9351,7 @@ Semantic consolidation complete. clusters=${result.clustersFound}, consolidated=
9351
9351
  console.error("--verb is required. Must be one of: keep-a, keep-b, merge, both-valid, needs-more-context");
9352
9352
  process.exit(1);
9353
9353
  }
9354
- const { isValidResolutionVerb, executeResolution } = await import("./resolution-BROE3TRO.js");
9354
+ const { isValidResolutionVerb, executeResolution } = await import("./resolution-RSG4HZTL.js");
9355
9355
  if (!isValidResolutionVerb(verb)) {
9356
9356
  console.error(`Invalid verb: ${verb}. Must be one of: keep-a, keep-b, merge, both-valid, needs-more-context`);
9357
9357
  process.exit(1);
@@ -10136,4 +10136,4 @@ export {
10136
10136
  listMemoryMarkdownFilePaths,
10137
10137
  registerCli
10138
10138
  };
10139
- //# sourceMappingURL=chunk-VPOAMPDD.js.map
10139
+ //# sourceMappingURL=chunk-SFDBLCZV.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-5HFVWYHL.js";
4
4
  import {
5
5
  isGenericRecallExcludedPath
6
- } from "./chunk-OGZC2WUX.js";
6
+ } from "./chunk-JWFTPRYD.js";
7
7
  import {
8
8
  planRecallMode
9
9
  } from "./chunk-CSAKJVXW.js";
@@ -132,4 +132,4 @@ async function findExpectedMemory(orchestrator, namespaces, expect) {
132
132
  export {
133
133
  runRecallWhy
134
134
  };
135
- //# sourceMappingURL=chunk-2IWBHZ3H.js.map
135
+ //# sourceMappingURL=chunk-SIGDETMB.js.map
@@ -0,0 +1,19 @@
1
+ // src/entity-mention-carry.ts
2
+ function applyCarriedMemorySnippets(entities, carried) {
3
+ let missing = false;
4
+ for (const entry of entities) {
5
+ const previous = carried.get(entry.canonicalId);
6
+ if (!previous) {
7
+ missing = true;
8
+ continue;
9
+ }
10
+ entry.memorySnippets = previous.memorySnippets.slice();
11
+ if (previous.memorySnippetOrigins) entry.memorySnippetOrigins = previous.memorySnippetOrigins.slice();
12
+ }
13
+ return missing;
14
+ }
15
+
16
+ export {
17
+ applyCarriedMemorySnippets
18
+ };
19
+ //# sourceMappingURL=chunk-SP4DB6SX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/entity-mention-carry.ts"],"sourcesContent":["export type CarriedMemorySnippet = {\n memorySnippets: string[];\n memorySnippetOrigins?: Array<string | undefined>;\n};\n\n/**\n * Copy snippets from the previous index onto entities that already existed.\n * A canonical id with nothing to copy was created after that index, so any\n * memory that already pointed at it was skipped. The caller schedules one\n * full reconcile for that case.\n */\nexport function applyCarriedMemorySnippets(\n entities: Iterable<{\n canonicalId: string;\n memorySnippets: string[];\n memorySnippetOrigins?: Array<string | undefined>;\n }>,\n carried: ReadonlyMap<string, CarriedMemorySnippet>,\n): boolean {\n let missing = false;\n for (const entry of entities) {\n const previous = carried.get(entry.canonicalId);\n if (!previous) {\n missing = true;\n continue;\n }\n entry.memorySnippets = previous.memorySnippets.slice();\n if (previous.memorySnippetOrigins) entry.memorySnippetOrigins = previous.memorySnippetOrigins.slice();\n }\n return missing;\n}\n"],"mappings":";AAWO,SAAS,2BACd,UAKA,SACS;AACT,MAAI,UAAU;AACd,aAAW,SAAS,UAAU;AAC5B,UAAM,WAAW,QAAQ,IAAI,MAAM,WAAW;AAC9C,QAAI,CAAC,UAAU;AACb,gBAAU;AACV;AAAA,IACF;AACA,UAAM,iBAAiB,SAAS,eAAe,MAAM;AACrD,QAAI,SAAS,qBAAsB,OAAM,uBAAuB,SAAS,qBAAqB,MAAM;AAAA,EACtG;AACA,SAAO;AACT;","names":[]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  buildStandup,
3
3
  parseStandupDate
4
- } from "./chunk-4LNCLZNK.js";
4
+ } from "./chunk-S2GR3T7W.js";
5
5
  import {
6
6
  backfillMemoryStorage,
7
7
  runLocationBackfill,
@@ -9,23 +9,23 @@ import {
9
9
  runLocationDay,
10
10
  runLocationStatus,
11
11
  runLocationSync
12
- } from "./chunk-HIHN4XHL.js";
12
+ } from "./chunk-PQ7EB5AD.js";
13
13
  import {
14
14
  externalWikiSearchOperation
15
- } from "./chunk-7OA4JWP5.js";
15
+ } from "./chunk-KFHEZJQZ.js";
16
16
  import {
17
17
  DECISION_SUBCOMMANDS,
18
18
  DELTA_SUBCOMMANDS,
19
19
  defineOperation,
20
20
  isCodegraphToolName
21
- } from "./chunk-DINOVGA5.js";
21
+ } from "./chunk-6WRHNA4I.js";
22
22
  import {
23
23
  CorrectionContractError
24
24
  } from "./chunk-QLK3SL7Q.js";
25
25
  import {
26
26
  memoryStoreRequestSchema,
27
27
  retainedCategoryAlias
28
- } from "./chunk-G3BW6SDE.js";
28
+ } from "./chunk-OFGTRDWX.js";
29
29
  import {
30
30
  serializeMutations,
31
31
  withHeldFileLock
@@ -1914,4 +1914,4 @@ export {
1914
1914
  codegraphIngestTracesOperation,
1915
1915
  REGISTERED_OPERATIONS
1916
1916
  };
1917
- //# sourceMappingURL=chunk-DBWNTLLI.js.map
1917
+ //# sourceMappingURL=chunk-STQC2FYQ.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-B7RWBZXW.js";
4
4
  import {
5
5
  StorageManager
6
- } from "./chunk-UFIZRMQZ.js";
6
+ } from "./chunk-E4XLFYHV.js";
7
7
  import {
8
8
  getCachedEpisodeMap,
9
9
  setCachedEpisodeMap
@@ -109,4 +109,4 @@ export {
109
109
  compareVerifiedEpisodeResults,
110
110
  searchVerifiedEpisodes
111
111
  };
112
- //# sourceMappingURL=chunk-S5R77WHV.js.map
112
+ //# sourceMappingURL=chunk-SWXPR5SE.js.map
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-KJTKLXTH.js";
4
4
  import {
5
5
  StorageManager
6
- } from "./chunk-UFIZRMQZ.js";
6
+ } from "./chunk-E4XLFYHV.js";
7
7
  import {
8
8
  assertInjectedStorageRooted
9
9
  } from "./chunk-22DYJLFN.js";
@@ -260,4 +260,4 @@ export {
260
260
  backupExistingLedger,
261
261
  rebuildMemoryLifecycleLedger
262
262
  };
263
- //# sourceMappingURL=chunk-3DNTFZAT.js.map
263
+ //# sourceMappingURL=chunk-T32YYUT2.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  parseEntityFile
3
- } from "./chunk-UFIZRMQZ.js";
3
+ } from "./chunk-E4XLFYHV.js";
4
4
  import {
5
5
  inferMemoryStatus
6
6
  } from "./chunk-7RJUVTVF.js";
@@ -253,4 +253,4 @@ export {
253
253
  WHO_KNOWS_MCP_TOOLS,
254
254
  handleWhoKnowsHttpQuery
255
255
  };
256
- //# sourceMappingURL=chunk-W5JQSVPZ.js.map
256
+ //# sourceMappingURL=chunk-T6RQNV7E.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  listNamespaces
3
- } from "./chunk-DSPWVQZ6.js";
3
+ } from "./chunk-73R4HOOK.js";
4
4
  import {
5
5
  capabilityAllowsNamespace
6
6
  } from "./chunk-IG747LRN.js";
@@ -282,4 +282,4 @@ export {
282
282
  computeServiceCorpusWatermarks,
283
283
  computeServiceCorpusCensus
284
284
  };
285
- //# sourceMappingURL=chunk-O23QMYN4.js.map
285
+ //# sourceMappingURL=chunk-TRN56SPQ.js.map