@remnic/core 9.50.2 → 9.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (483) hide show
  1. package/dist/access-admin-ops-surface.d.ts +13 -11
  2. package/dist/access-admin-ops-surface.js +41 -39
  3. package/dist/access-authorization-probe.d.ts +13 -11
  4. package/dist/access-authorization-probe.js +42 -40
  5. package/dist/access-boundary.d.ts +13 -11
  6. package/dist/access-boundary.js +41 -39
  7. package/dist/access-cli.js +109 -104
  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 +13 -11
  11. package/dist/access-extraction-force-flush.js +41 -39
  12. package/dist/access-health-types.d.ts +3 -1
  13. package/dist/access-http-lcm-compaction.d.ts +13 -11
  14. package/dist/access-http-lifecycle-flush.d.ts +13 -11
  15. package/dist/access-http-offline-stream.d.ts +13 -11
  16. package/dist/access-http-query.js +41 -39
  17. package/dist/access-http.d.ts +13 -11
  18. package/dist/access-http.js +52 -50
  19. package/dist/access-identity-continuity-surface.d.ts +11 -9
  20. package/dist/access-identity-continuity-surface.js +41 -39
  21. package/dist/access-lcm-surface.d.ts +13 -11
  22. package/dist/access-lcm-surface.js +41 -39
  23. package/dist/access-mcp.d.ts +13 -11
  24. package/dist/access-mcp.js +47 -45
  25. package/dist/access-memory-search-fanout.d.ts +4 -2
  26. package/dist/{access-namespace-preflight-Dj2QolFE.d.ts → access-namespace-preflight-Ds6CGlCP.d.ts} +1 -1
  27. package/dist/access-namespace-preflight.d.ts +5 -3
  28. package/dist/access-namespace-preflight.js +41 -39
  29. package/dist/access-observe-write-surface.d.ts +13 -11
  30. package/dist/access-observe-write-surface.js +41 -39
  31. package/dist/access-offline-manifest.d.ts +11 -9
  32. package/dist/access-operations-batch.js +43 -41
  33. package/dist/access-operations.d.ts +13 -11
  34. package/dist/access-operations.js +46 -44
  35. package/dist/access-recall-concurrency.d.ts +13 -11
  36. package/dist/access-recall-concurrency.js +41 -39
  37. package/dist/access-recall-response.d.ts +13 -11
  38. package/dist/access-recall-response.js +41 -39
  39. package/dist/access-recall-surface.d.ts +13 -11
  40. package/dist/access-recall-surface.js +41 -39
  41. package/dist/access-schema.js +3 -3
  42. package/dist/{access-service-DesbnTSa.d.ts → access-service-BY0KJ44c.d.ts} +7 -7
  43. package/dist/access-service-helpers.d.ts +13 -11
  44. package/dist/access-service.d.ts +13 -11
  45. package/dist/access-service.js +41 -39
  46. package/dist/access-surface-catalog.d.ts +13 -11
  47. package/dist/access-wearables-meetings-surface.d.ts +5 -3
  48. package/dist/action-confidence.d.ts +3 -1
  49. package/dist/active-memory-bridge.d.ts +3 -1
  50. package/dist/active-recall.d.ts +3 -1
  51. package/dist/active-recall.js +5 -3
  52. package/dist/active-recall.js.map +1 -1
  53. package/dist/adapters/index.js +4 -4
  54. package/dist/adapters/registry.js +2 -2
  55. package/dist/ambient-provenance.d.ts +3 -1
  56. package/dist/archive-mutation-version.d.ts +9 -0
  57. package/dist/archive-mutation-version.js +20 -0
  58. package/dist/artifact-search.d.ts +3 -1
  59. package/dist/behavior-learner.d.ts +3 -1
  60. package/dist/behavior-signals.d.ts +3 -1
  61. package/dist/bootstrap.d.ts +11 -9
  62. package/dist/briefing.d.ts +4 -2
  63. package/dist/briefing.js +10 -9
  64. package/dist/buffer-surprise-report.d.ts +3 -1
  65. package/dist/buffer-turn-helpers.d.ts +3 -1
  66. package/dist/buffer.d.ts +4 -2
  67. package/dist/buffer.js +5 -5
  68. package/dist/bulk-import/index.d.ts +5 -3
  69. package/dist/calibration.d.ts +3 -1
  70. package/dist/capabilities.d.ts +3 -1
  71. package/dist/{catalog-D-G7RgXR.d.ts → catalog-D3B4RDy1.d.ts} +1 -1
  72. package/dist/causal-behavior.d.ts +3 -1
  73. package/dist/causal-behavior.js +2 -2
  74. package/dist/causal-chain.js +2 -2
  75. package/dist/causal-consolidation.d.ts +3 -1
  76. package/dist/causal-consolidation.js +13 -12
  77. package/dist/causal-consolidation.js.map +1 -1
  78. package/dist/causal-retrieval.js +2 -2
  79. package/dist/causal-trajectory-graph.d.ts +4 -2
  80. package/dist/causal-trajectory-graph.js +2 -1
  81. package/dist/causal-trajectory-graph.js.map +1 -1
  82. package/dist/causal-trajectory.js +1 -1
  83. package/dist/{chunk-KDG2KTWW.js → chunk-33SV3E43.js} +4 -4
  84. package/dist/{chunk-2HGUDBRJ.js → chunk-37ZO6LLJ.js} +2 -2
  85. package/dist/{chunk-QW3WFHKU.js → chunk-45BRYON6.js} +2 -2
  86. package/dist/{chunk-GZICBRWK.js → chunk-4F6X3RXW.js} +2 -2
  87. package/dist/{chunk-7BAYBYY5.js → chunk-4PC4PRJE.js} +2 -2
  88. package/dist/{chunk-VJXY5ZCT.js → chunk-52UKFTUK.js} +2 -2
  89. package/dist/{chunk-ESG7Z255.js → chunk-5UDMFE3Q.js} +2 -2
  90. package/dist/{chunk-JPHEOE6Z.js → chunk-6MTSFX7A.js} +15 -15
  91. package/dist/chunk-6ZN34ISG.js +44 -0
  92. package/dist/chunk-6ZN34ISG.js.map +1 -0
  93. package/dist/{chunk-M4MP34AQ.js → chunk-AHZOMHWN.js} +1 -1
  94. package/dist/{chunk-Z3RHPGSY.js → chunk-AIUBBHSF.js} +3 -3
  95. package/dist/{chunk-S3AYIQCU.js → chunk-AXIDQG5A.js} +12 -12
  96. package/dist/{chunk-QN7NTKRC.js → chunk-AZ2QBGYB.js} +1 -1
  97. package/dist/{chunk-47J4EDGR.js → chunk-AZM4CCAC.js} +8 -8
  98. package/dist/{chunk-IXXABW5A.js → chunk-BHXYAVUM.js} +11 -5
  99. package/dist/chunk-BHXYAVUM.js.map +1 -0
  100. package/dist/{chunk-L2DPF4DF.js → chunk-BIJAWZYW.js} +54 -12
  101. package/dist/chunk-BIJAWZYW.js.map +1 -0
  102. package/dist/{chunk-LEJPSMKM.js → chunk-C5QLI33R.js} +3 -3
  103. package/dist/{chunk-SV3PSA7Y.js → chunk-CV6BBVYV.js} +5 -5
  104. package/dist/{chunk-V7X767RT.js → chunk-DCZBSE4F.js} +52 -52
  105. package/dist/chunk-FC67T4E6.js +70 -0
  106. package/dist/chunk-FC67T4E6.js.map +1 -0
  107. package/dist/{chunk-7PKFPLLZ.js → chunk-FXTYIA46.js} +2 -2
  108. package/dist/{chunk-64BHFFKZ.js → chunk-HLYR2TQL.js} +5 -5
  109. package/dist/{chunk-5C2HNJMO.js → chunk-J5LLX6IL.js} +32 -32
  110. package/dist/{chunk-RKNJBZ55.js → chunk-JBPKEARU.js} +4 -4
  111. package/dist/{chunk-PLKFO2HJ.js → chunk-JL43BVDE.js} +2 -2
  112. package/dist/{chunk-2S72LWKX.js → chunk-JYL3BVVZ.js} +2 -2
  113. package/dist/{chunk-IPLYGWQF.js → chunk-KQAFEZQX.js} +5 -5
  114. package/dist/chunk-LXY5VVGM.js +61 -0
  115. package/dist/chunk-LXY5VVGM.js.map +1 -0
  116. package/dist/{chunk-PYKKWQZ2.js → chunk-M7BXDKPR.js} +6 -6
  117. package/dist/{chunk-Z54EM5YZ.js → chunk-MAXVH44E.js} +7 -7
  118. package/dist/{chunk-LYMNZZIM.js → chunk-NIS256NW.js} +2 -2
  119. package/dist/{chunk-67QG75MJ.js → chunk-NLK2VZYZ.js} +2 -2
  120. package/dist/{chunk-A4QMKFFO.js → chunk-O5FFBO2M.js} +14 -28
  121. package/dist/chunk-O5FFBO2M.js.map +1 -0
  122. package/dist/{chunk-JYIFGGEM.js → chunk-OUKBMQ2O.js} +2 -2
  123. package/dist/{chunk-75XOWNRS.js → chunk-OYESWJ43.js} +4 -4
  124. package/dist/{chunk-TS4AJ2GI.js → chunk-PA45XCUD.js} +3 -3
  125. package/dist/{chunk-BJYET5TX.js → chunk-PRDJMOST.js} +7 -1
  126. package/dist/chunk-PRDJMOST.js.map +1 -0
  127. package/dist/{chunk-4MBPIL4V.js → chunk-PUSLMZBQ.js} +2 -2
  128. package/dist/{chunk-RVO6TCTU.js → chunk-QCECHYZL.js} +6 -6
  129. package/dist/{chunk-GFIKG4FR.js → chunk-QGR6OVGT.js} +2 -2
  130. package/dist/{chunk-NSGU76YO.js → chunk-QHFV6VNU.js} +6 -2
  131. package/dist/chunk-QHFV6VNU.js.map +1 -0
  132. package/dist/{chunk-PDEKQWDV.js → chunk-QT2FRYI4.js} +18 -2
  133. package/dist/chunk-QT2FRYI4.js.map +1 -0
  134. package/dist/{chunk-HNZKVLAN.js → chunk-S354QO4R.js} +2 -2
  135. package/dist/{chunk-NO37MR45.js → chunk-SOEN6KCF.js} +2 -2
  136. package/dist/{chunk-FXX6RQYC.js → chunk-TPTECFWR.js} +2 -2
  137. package/dist/{chunk-GDDGZVFI.js → chunk-UEVLYVNW.js} +2 -2
  138. package/dist/{chunk-YQ4IQ2GA.js → chunk-UT5BV5OG.js} +2 -2
  139. package/dist/{chunk-LAQ33B5D.js → chunk-UU3G6GUP.js} +1 -1
  140. package/dist/chunk-UU3G6GUP.js.map +1 -0
  141. package/dist/{chunk-LNTUXKBT.js → chunk-UYYW2KPU.js} +2 -2
  142. package/dist/{chunk-BOFVT6P3.js → chunk-VBHPOWBJ.js} +175 -98
  143. package/dist/chunk-VBHPOWBJ.js.map +1 -0
  144. package/dist/{chunk-QSYL5CXK.js → chunk-VKXWK44Q.js} +3 -3
  145. package/dist/{chunk-KMWYZTIE.js → chunk-VMMQDEN5.js} +2 -2
  146. package/dist/{chunk-JB6D7EFB.js → chunk-VVG2BOKA.js} +2 -2
  147. package/dist/chunk-W5BIQOAJ.js +69 -0
  148. package/dist/chunk-W5BIQOAJ.js.map +1 -0
  149. package/dist/{chunk-V5H6OJCR.js → chunk-W5XVQFLM.js} +2 -2
  150. package/dist/{chunk-OIOZ6MOP.js → chunk-W6FNX2LP.js} +2 -2
  151. package/dist/{chunk-6QPHF6RR.js → chunk-WQM326GS.js} +2 -2
  152. package/dist/{chunk-TQFHQPWD.js → chunk-XADV5IZ3.js} +8 -8
  153. package/dist/{chunk-DATDLJAO.js → chunk-XAPMEU3K.js} +2 -2
  154. package/dist/chunk-XXSOVESA.js +42 -0
  155. package/dist/chunk-XXSOVESA.js.map +1 -0
  156. package/dist/{chunk-IK6X5QPO.js → chunk-ZHY5TMJG.js} +1193 -443
  157. package/dist/chunk-ZHY5TMJG.js.map +1 -0
  158. package/dist/{chunk-N3LL5NEU.js → chunk-ZMYDYNI4.js} +2 -2
  159. package/dist/{cli-D4vvtxjY.d.ts → cli-CnOkH9hA.d.ts} +6 -6
  160. package/dist/cli.d.ts +15 -13
  161. package/dist/cli.js +74 -70
  162. package/dist/coding/pre-action-gate.d.ts +3 -1
  163. package/dist/coding/pre-action-gate.js +2 -2
  164. package/dist/compounding/engine.d.ts +4 -2
  165. package/dist/compounding/engine.js +10 -9
  166. package/dist/compounding/preference-consolidator.d.ts +3 -1
  167. package/dist/compression-optimizer.d.ts +3 -1
  168. package/dist/config.d.ts +3 -1
  169. package/dist/config.js +5 -3
  170. package/dist/connectors/codex-materialize-runner.d.ts +3 -1
  171. package/dist/connectors/codex-materialize-runner.js +10 -9
  172. package/dist/connectors/codex-materialize.d.ts +3 -1
  173. package/dist/connectors/index.d.ts +3 -1
  174. package/dist/connectors/index.js +10 -9
  175. package/dist/consolidation-provenance-check.d.ts +4 -2
  176. package/dist/consolidation-undo.d.ts +4 -2
  177. package/dist/contradiction/index.d.ts +4 -2
  178. package/dist/contradiction-config.d.ts +29 -0
  179. package/dist/contradiction-config.js +12 -0
  180. package/dist/contradiction-config.js.map +1 -0
  181. package/dist/converge-config.d.ts +3 -1
  182. package/dist/convergence-refresh.d.ts +4 -2
  183. package/dist/convergence-refresh.js +12 -11
  184. package/dist/conversation-index/backend.d.ts +3 -1
  185. package/dist/conversation-index/chunker.d.ts +3 -1
  186. package/dist/conversation-index/faiss-adapter.d.ts +3 -1
  187. package/dist/conversation-index/indexer.d.ts +3 -1
  188. package/dist/conversation-index/search.d.ts +3 -1
  189. package/dist/corpus-watermark.d.ts +3 -1
  190. package/dist/corpus-watermark.js +21 -20
  191. package/dist/day-summary.d.ts +3 -1
  192. package/dist/delinearize.d.ts +3 -1
  193. package/dist/dependency-propagation-config.d.ts +3 -1
  194. package/dist/direct-answer-wiring.d.ts +3 -1
  195. package/dist/direct-answer.d.ts +3 -1
  196. package/dist/embedding-fallback.d.ts +3 -1
  197. package/dist/enrichment/index.d.ts +3 -1
  198. package/dist/entity-retrieval.d.ts +4 -2
  199. package/dist/entity-retrieval.js +10 -9
  200. package/dist/entity-schema.d.ts +3 -1
  201. package/dist/explicit-capture.d.ts +11 -9
  202. package/dist/explicit-capture.js +3 -2
  203. package/dist/external-wiki-access.d.ts +13 -11
  204. package/dist/external-wiki-access.js +42 -40
  205. package/dist/external-wiki-collection-registration.d.ts +3 -1
  206. package/dist/external-wiki-collection.d.ts +3 -1
  207. package/dist/external-wiki-mcp-tools.d.ts +13 -11
  208. package/dist/extraction-error-classification.d.ts +3 -1
  209. package/dist/extraction-faithfulness.d.ts +3 -1
  210. package/dist/extraction-judge-telemetry.d.ts +3 -1
  211. package/dist/extraction-judge-training.d.ts +3 -1
  212. package/dist/extraction-judge.d.ts +3 -1
  213. package/dist/extraction-liveness.d.ts +3 -1
  214. package/dist/extraction-normalization.d.ts +3 -1
  215. package/dist/extraction-prompt.d.ts +3 -1
  216. package/dist/extraction-source-grounding-rules.d.ts +3 -1
  217. package/dist/extraction-source-grounding.d.ts +3 -1
  218. package/dist/extraction.d.ts +3 -1
  219. package/dist/extraction.js +22 -21
  220. package/dist/fallback-llm.d.ts +3 -1
  221. package/dist/graph-444E-DrF.d.ts +349 -0
  222. package/dist/graph-dashboard-diff.d.ts +4 -2
  223. package/dist/graph-dashboard-key.d.ts +4 -2
  224. package/dist/graph-dashboard-parser.d.ts +4 -2
  225. package/dist/{graph-edge-decay-Z6ENALU2.js → graph-edge-decay-65KMOJWY.js} +4 -3
  226. package/dist/graph-edge-decay-65KMOJWY.js.map +1 -0
  227. package/dist/graph-edge-reinforcement.d.ts +4 -2
  228. package/dist/graph-path-reconstruction.d.ts +10 -0
  229. package/dist/graph-path-reconstruction.js +12 -0
  230. package/dist/graph-path-reconstruction.js.map +1 -0
  231. package/dist/graph-path-scoring-config.d.ts +8 -0
  232. package/dist/graph-path-scoring-config.js +10 -0
  233. package/dist/graph-path-scoring-config.js.map +1 -0
  234. package/dist/graph-path-scoring.d.ts +36 -0
  235. package/dist/graph-path-scoring.js +11 -0
  236. package/dist/graph-path-scoring.js.map +1 -0
  237. package/dist/graph-snapshot.d.ts +4 -2
  238. package/dist/graph-snapshot.js +3 -2
  239. package/dist/graph.d.ts +5 -318
  240. package/dist/graph.js +5 -1
  241. package/dist/harmonic-retrieval.js +1 -1
  242. package/dist/importance.d.ts +3 -1
  243. package/dist/importers/index.d.ts +3 -1
  244. package/dist/in-flight-reads.d.ts +3 -1
  245. package/dist/index.d.ts +22 -20
  246. package/dist/index.js +149 -144
  247. package/dist/intent.d.ts +3 -1
  248. package/dist/lcm/engine.d.ts +3 -1
  249. package/dist/lcm/engine.js +3 -3
  250. package/dist/lcm/index.d.ts +3 -1
  251. package/dist/lcm/index.js +6 -6
  252. package/dist/lcm/tools.d.ts +3 -1
  253. package/dist/lifecycle.d.ts +3 -1
  254. package/dist/live-connectors-runner.d.ts +3 -1
  255. package/dist/local-llm.d.ts +3 -1
  256. package/dist/local-model-endpoint.d.ts +3 -1
  257. package/dist/maintenance/memory-governance.d.ts +3 -1
  258. package/dist/maintenance/memory-governance.js +10 -9
  259. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +4 -2
  260. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +10 -9
  261. package/dist/maintenance/rebuild-memory-projection.d.ts +4 -2
  262. package/dist/maintenance/rebuild-memory-projection.js +11 -10
  263. package/dist/{maintenance-ClmUVpGI.d.ts → maintenance-CKwxpdRx.d.ts} +3 -3
  264. package/dist/mcp-memory-inspector-app.d.ts +13 -11
  265. package/dist/memory-action-policy.d.ts +3 -1
  266. package/dist/memory-cache.d.ts +3 -1
  267. package/dist/memory-lifecycle-ledger-utils.d.ts +3 -1
  268. package/dist/memory-projection-store.d.ts +3 -1
  269. package/dist/memory-provenance.d.ts +3 -1
  270. package/dist/memory-snapshot.d.ts +3 -1
  271. package/dist/memory-worth-outcomes.d.ts +4 -2
  272. package/dist/models-json.d.ts +3 -1
  273. package/dist/namespaces/migrate.d.ts +5 -3
  274. package/dist/namespaces/migrate.js +20 -19
  275. package/dist/namespaces/principal.d.ts +3 -1
  276. package/dist/namespaces/search.d.ts +3 -1
  277. package/dist/namespaces/search.js +7 -7
  278. package/dist/namespaces/storage.d.ts +5 -3
  279. package/dist/namespaces/storage.js +10 -9
  280. package/dist/native-knowledge.d.ts +3 -1
  281. package/dist/offline-sync-impression-drain.d.ts +3 -1
  282. package/dist/operator-doctor-corpus.d.ts +3 -1
  283. package/dist/operator-doctor-corpus.js +22 -21
  284. package/dist/operator-doctor-replica.d.ts +3 -1
  285. package/dist/operator-toolkit.d.ts +6 -4
  286. package/dist/operator-toolkit.js +33 -29
  287. package/dist/orchestration/compression-guideline-coordinator.d.ts +4 -2
  288. package/dist/orchestration/maintenance.d.ts +6 -4
  289. package/dist/orchestration/maintenance.js +15 -14
  290. package/dist/{orchestrator-qJ07zI8H.d.ts → orchestrator-BshGam-o.d.ts} +45 -19
  291. package/dist/orchestrator.d.ts +11 -9
  292. package/dist/orchestrator.js +109 -104
  293. package/dist/patterns-cli.d.ts +3 -1
  294. package/dist/{pipeline-WFCxhHOn.d.ts → pipeline-D21Rs6gW.d.ts} +1 -1
  295. package/dist/policy-runtime.d.ts +3 -1
  296. package/dist/proactive-contention.d.ts +3 -1
  297. package/dist/provenance.d.ts +3 -1
  298. package/dist/{qmd-5tzkQ44y.d.ts → qmd-Dhle1P4X.d.ts} +1 -1
  299. package/dist/qmd-preflight.d.ts +4 -2
  300. package/dist/qmd-recall-cache.d.ts +3 -1
  301. package/dist/qmd.d.ts +4 -2
  302. package/dist/qmd.js +4 -4
  303. package/dist/recall-concurrency-config.d.ts +3 -1
  304. package/dist/recall-disclosure-escalation.d.ts +3 -1
  305. package/dist/recall-explain-renderer.d.ts +3 -1
  306. package/dist/recall-explain-renderer.js +3 -3
  307. package/dist/recall-memory-map.d.ts +3 -1
  308. package/dist/recall-planner-llm.d.ts +3 -1
  309. package/dist/recall-planner-llm.js +3 -3
  310. package/dist/recall-state.d.ts +7 -1
  311. package/dist/recall-state.js +1 -1
  312. package/dist/recall-tag-filter.d.ts +3 -1
  313. package/dist/recall-timings.d.ts +3 -1
  314. package/dist/recall-xray-cli.d.ts +3 -1
  315. package/dist/recall-xray-cli.js +4 -4
  316. package/dist/recall-xray-renderer.d.ts +3 -1
  317. package/dist/recall-xray-renderer.js +3 -3
  318. package/dist/recall-xray.d.ts +7 -1
  319. package/dist/recall-xray.js +2 -2
  320. package/dist/reconcile/cursor.d.ts +3 -1
  321. package/dist/reconcile/manifest.d.ts +3 -1
  322. package/dist/reconcile/plan.d.ts +3 -1
  323. package/dist/replay/normalizers/chatgpt.d.ts +3 -1
  324. package/dist/replay/normalizers/claude.d.ts +3 -1
  325. package/dist/replay/normalizers/openclaw.d.ts +3 -1
  326. package/dist/replay/normalizers/shared.d.ts +3 -1
  327. package/dist/replay/runner.d.ts +3 -1
  328. package/dist/replay/types.d.ts +3 -1
  329. package/dist/replica-divergence.d.ts +3 -1
  330. package/dist/replica-peers-config.d.ts +3 -1
  331. package/dist/resolve-auth-token.d.ts +3 -1
  332. package/dist/resume-bundles.js +6 -4
  333. package/dist/retrieval-agents.d.ts +4 -2
  334. package/dist/retrieval-tiers.d.ts +3 -1
  335. package/dist/routing/engine.d.ts +3 -1
  336. package/dist/routing/store.d.ts +3 -1
  337. package/dist/salvage-envelope.d.ts +3 -1
  338. package/dist/{scope-profiles--vfXPl3X.d.ts → scope-profiles-NzGPDXLn.d.ts} +1 -1
  339. package/dist/search/embed-helper.d.ts +3 -1
  340. package/dist/search/factory.d.ts +3 -1
  341. package/dist/search/factory.js +6 -6
  342. package/dist/search/index.d.ts +3 -1
  343. package/dist/search/index.js +12 -12
  344. package/dist/search/lancedb-backend.d.ts +3 -1
  345. package/dist/search/meilisearch-backend.d.ts +3 -1
  346. package/dist/search/noop-backend.d.ts +3 -1
  347. package/dist/search/orama-backend.d.ts +3 -1
  348. package/dist/search/port.d.ts +3 -1
  349. package/dist/search/remote-backend.d.ts +3 -1
  350. package/dist/{semantic-consolidation-BBDuP9nJ.d.ts → semantic-consolidation-DLDKvyy5.d.ts} +1 -1
  351. package/dist/semantic-consolidation.d.ts +4 -2
  352. package/dist/semantic-consolidation.js +11 -10
  353. package/dist/semantic-rule-promotion.js +10 -9
  354. package/dist/semantic-rule-verifier.d.ts +3 -1
  355. package/dist/semantic-rule-verifier.js +10 -9
  356. package/dist/{service-B8DtbpCM.d.ts → service-BIgVM7fL.d.ts} +2 -2
  357. package/dist/session-observer-bands.d.ts +3 -1
  358. package/dist/session-observer-state.d.ts +3 -1
  359. package/dist/shared-context/manager.d.ts +3 -1
  360. package/dist/signal.d.ts +3 -1
  361. package/dist/source-agent-qualifier.d.ts +3 -1
  362. package/dist/source-agent-qualifier.js +18 -17
  363. package/dist/{storage-BkYN1RIy.d.ts → storage-CVfGWqCI.d.ts} +7 -6
  364. package/dist/storage.d.ts +4 -2
  365. package/dist/storage.js +9 -8
  366. package/dist/summarizer.d.ts +3 -1
  367. package/dist/summary-snapshot.d.ts +3 -1
  368. package/dist/temporal-supersession.d.ts +4 -2
  369. package/dist/temporal-timeline-recall.d.ts +3 -1
  370. package/dist/temporal-validity.d.ts +3 -1
  371. package/dist/threading.d.ts +3 -1
  372. package/dist/tier-migration.d.ts +4 -2
  373. package/dist/tier-routing.d.ts +3 -1
  374. package/dist/topics.d.ts +3 -1
  375. package/dist/transcript.d.ts +3 -1
  376. package/dist/transfer/autodetect.js +1 -1
  377. package/dist/transfer/backup.js +1 -1
  378. package/dist/transfer/capsule-export.js +2 -2
  379. package/dist/trust-score-stage.d.ts +3 -1
  380. package/dist/trust-score.d.ts +3 -1
  381. package/dist/{types-u2s9j1uD.d.ts → types-CkiDUorT.d.ts} +10 -16
  382. package/dist/types.d.ts +3 -1
  383. package/dist/types.js +1 -1
  384. package/dist/utility-runtime.d.ts +3 -1
  385. package/dist/verified-recall.js +10 -9
  386. package/dist/write-envelope.d.ts +3 -1
  387. package/package.json +2 -2
  388. package/src/archive-mutation-version.ts +59 -0
  389. package/src/config.test.ts +45 -0
  390. package/src/config.ts +10 -30
  391. package/src/contradiction/contradiction.test.ts +86 -1
  392. package/src/contradiction-config.ts +92 -0
  393. package/src/graph-path-reconstruction.ts +91 -0
  394. package/src/graph-path-scoring-config.ts +55 -0
  395. package/src/graph-path-scoring.test.ts +238 -0
  396. package/src/graph-path-scoring.ts +77 -0
  397. package/src/graph.test.ts +225 -5
  398. package/src/graph.ts +72 -5
  399. package/src/orchestration/contradiction-linking-coordinator.ts +246 -76
  400. package/src/orchestration/contradiction-localization.integration.test.ts +1953 -0
  401. package/src/orchestration/extraction-anchor-snapshot.ts +83 -0
  402. package/src/orchestration/extraction-persist-deps.ts +8 -2
  403. package/src/orchestration/extraction-persist.ts +43 -34
  404. package/src/orchestration/graph-path-state-loader.test.ts +801 -0
  405. package/src/orchestration/graph-path-state-loader.ts +318 -0
  406. package/src/orchestration/graph-recall-coordinator.integration.test.ts +1163 -0
  407. package/src/orchestration/graph-recall-coordinator.ts +206 -29
  408. package/src/orchestration/graph-recall-seam.ts +19 -0
  409. package/src/orchestration/recall-internal-deps.ts +7 -13
  410. package/src/orchestration/recall-internal.ts +5 -0
  411. package/src/orchestration/recall-introspection.ts +9 -1
  412. package/src/orchestration/recall-search-pipeline.ts +8 -13
  413. package/src/orchestration/update-localization.test.ts +784 -0
  414. package/src/orchestration/update-localization.ts +173 -0
  415. package/src/orchestrator.ts +19 -18
  416. package/src/recall-state.test.ts +29 -1
  417. package/src/recall-state.ts +13 -0
  418. package/src/recall-xray-renderer.test.ts +45 -0
  419. package/src/recall-xray-renderer.ts +16 -0
  420. package/src/recall-xray.ts +13 -0
  421. package/src/storage/supersession-side-effects.ts +97 -0
  422. package/src/storage/tombstone-blocked-capture-sync.ts +13 -5
  423. package/src/storage-contract/cache-coherence.test.ts +299 -0
  424. package/src/storage.ts +86 -88
  425. package/src/types.ts +12 -15
  426. package/dist/chunk-A4QMKFFO.js.map +0 -1
  427. package/dist/chunk-BJYET5TX.js.map +0 -1
  428. package/dist/chunk-BOFVT6P3.js.map +0 -1
  429. package/dist/chunk-IK6X5QPO.js.map +0 -1
  430. package/dist/chunk-IXXABW5A.js.map +0 -1
  431. package/dist/chunk-L2DPF4DF.js.map +0 -1
  432. package/dist/chunk-LAQ33B5D.js.map +0 -1
  433. package/dist/chunk-NSGU76YO.js.map +0 -1
  434. package/dist/chunk-PDEKQWDV.js.map +0 -1
  435. /package/dist/{graph-edge-decay-Z6ENALU2.js.map → archive-mutation-version.js.map} +0 -0
  436. /package/dist/{chunk-KDG2KTWW.js.map → chunk-33SV3E43.js.map} +0 -0
  437. /package/dist/{chunk-2HGUDBRJ.js.map → chunk-37ZO6LLJ.js.map} +0 -0
  438. /package/dist/{chunk-QW3WFHKU.js.map → chunk-45BRYON6.js.map} +0 -0
  439. /package/dist/{chunk-GZICBRWK.js.map → chunk-4F6X3RXW.js.map} +0 -0
  440. /package/dist/{chunk-7BAYBYY5.js.map → chunk-4PC4PRJE.js.map} +0 -0
  441. /package/dist/{chunk-VJXY5ZCT.js.map → chunk-52UKFTUK.js.map} +0 -0
  442. /package/dist/{chunk-ESG7Z255.js.map → chunk-5UDMFE3Q.js.map} +0 -0
  443. /package/dist/{chunk-JPHEOE6Z.js.map → chunk-6MTSFX7A.js.map} +0 -0
  444. /package/dist/{chunk-M4MP34AQ.js.map → chunk-AHZOMHWN.js.map} +0 -0
  445. /package/dist/{chunk-Z3RHPGSY.js.map → chunk-AIUBBHSF.js.map} +0 -0
  446. /package/dist/{chunk-S3AYIQCU.js.map → chunk-AXIDQG5A.js.map} +0 -0
  447. /package/dist/{chunk-QN7NTKRC.js.map → chunk-AZ2QBGYB.js.map} +0 -0
  448. /package/dist/{chunk-47J4EDGR.js.map → chunk-AZM4CCAC.js.map} +0 -0
  449. /package/dist/{chunk-LEJPSMKM.js.map → chunk-C5QLI33R.js.map} +0 -0
  450. /package/dist/{chunk-SV3PSA7Y.js.map → chunk-CV6BBVYV.js.map} +0 -0
  451. /package/dist/{chunk-V7X767RT.js.map → chunk-DCZBSE4F.js.map} +0 -0
  452. /package/dist/{chunk-7PKFPLLZ.js.map → chunk-FXTYIA46.js.map} +0 -0
  453. /package/dist/{chunk-64BHFFKZ.js.map → chunk-HLYR2TQL.js.map} +0 -0
  454. /package/dist/{chunk-5C2HNJMO.js.map → chunk-J5LLX6IL.js.map} +0 -0
  455. /package/dist/{chunk-RKNJBZ55.js.map → chunk-JBPKEARU.js.map} +0 -0
  456. /package/dist/{chunk-PLKFO2HJ.js.map → chunk-JL43BVDE.js.map} +0 -0
  457. /package/dist/{chunk-2S72LWKX.js.map → chunk-JYL3BVVZ.js.map} +0 -0
  458. /package/dist/{chunk-IPLYGWQF.js.map → chunk-KQAFEZQX.js.map} +0 -0
  459. /package/dist/{chunk-PYKKWQZ2.js.map → chunk-M7BXDKPR.js.map} +0 -0
  460. /package/dist/{chunk-Z54EM5YZ.js.map → chunk-MAXVH44E.js.map} +0 -0
  461. /package/dist/{chunk-LYMNZZIM.js.map → chunk-NIS256NW.js.map} +0 -0
  462. /package/dist/{chunk-67QG75MJ.js.map → chunk-NLK2VZYZ.js.map} +0 -0
  463. /package/dist/{chunk-JYIFGGEM.js.map → chunk-OUKBMQ2O.js.map} +0 -0
  464. /package/dist/{chunk-75XOWNRS.js.map → chunk-OYESWJ43.js.map} +0 -0
  465. /package/dist/{chunk-TS4AJ2GI.js.map → chunk-PA45XCUD.js.map} +0 -0
  466. /package/dist/{chunk-4MBPIL4V.js.map → chunk-PUSLMZBQ.js.map} +0 -0
  467. /package/dist/{chunk-RVO6TCTU.js.map → chunk-QCECHYZL.js.map} +0 -0
  468. /package/dist/{chunk-GFIKG4FR.js.map → chunk-QGR6OVGT.js.map} +0 -0
  469. /package/dist/{chunk-HNZKVLAN.js.map → chunk-S354QO4R.js.map} +0 -0
  470. /package/dist/{chunk-NO37MR45.js.map → chunk-SOEN6KCF.js.map} +0 -0
  471. /package/dist/{chunk-FXX6RQYC.js.map → chunk-TPTECFWR.js.map} +0 -0
  472. /package/dist/{chunk-GDDGZVFI.js.map → chunk-UEVLYVNW.js.map} +0 -0
  473. /package/dist/{chunk-YQ4IQ2GA.js.map → chunk-UT5BV5OG.js.map} +0 -0
  474. /package/dist/{chunk-LNTUXKBT.js.map → chunk-UYYW2KPU.js.map} +0 -0
  475. /package/dist/{chunk-QSYL5CXK.js.map → chunk-VKXWK44Q.js.map} +0 -0
  476. /package/dist/{chunk-KMWYZTIE.js.map → chunk-VMMQDEN5.js.map} +0 -0
  477. /package/dist/{chunk-JB6D7EFB.js.map → chunk-VVG2BOKA.js.map} +0 -0
  478. /package/dist/{chunk-V5H6OJCR.js.map → chunk-W5XVQFLM.js.map} +0 -0
  479. /package/dist/{chunk-OIOZ6MOP.js.map → chunk-W6FNX2LP.js.map} +0 -0
  480. /package/dist/{chunk-6QPHF6RR.js.map → chunk-WQM326GS.js.map} +0 -0
  481. /package/dist/{chunk-TQFHQPWD.js.map → chunk-XADV5IZ3.js.map} +0 -0
  482. /package/dist/{chunk-DATDLJAO.js.map → chunk-XAPMEU3K.js.map} +0 -0
  483. /package/dist/{chunk-N3LL5NEU.js.map → chunk-ZMYDYNI4.js.map} +0 -0
@@ -4,10 +4,9 @@
4
4
  * Owns the write-path semantic-analysis subsystem: contradiction detection
5
5
  * (QMD similarity search + LLM verification), deferred contradiction
6
6
  * auto-resolve (#1645 — retires superseded memories only after the new write's
7
- * tombstone status is known), and memory link suggestion. Behavior-preserving
8
- * move from orchestrator.ts no logic changes; the orchestrator constructs one
9
- * instance and keeps thin delegating methods so existing call sites (writeMemory
10
- * fact-write branches) continue to work.
7
+ * tombstone status is known), and memory link suggestion. The orchestrator
8
+ * constructs one instance and keeps thin delegating methods so existing call
9
+ * sites (writeMemory fact-write branches) continue to work.
11
10
  *
12
11
  * Config, storage, search, namespace resolution, and the extraction engine are
13
12
  * accessed through getter callbacks (not captured at construction) so that
@@ -22,6 +21,7 @@ import type {
22
21
  PluginConfig,
23
22
  QmdSearchResult,
24
23
  } from "../types.js";
24
+ import { coerceBool } from "../connectors/coerce.js";
25
25
  // StorageManager type comes from the package barrel (type-only) so this
26
26
  // module does not add a direct storage.ts import (ratchet #1533).
27
27
  import type { StorageManager } from "../index.js";
@@ -29,6 +29,11 @@ import type { ExtractionEngine } from "../extraction.js";
29
29
  import { log } from "../logger.js";
30
30
  import { resolveIndexingCapabilities } from "../capabilities.js";
31
31
  import { deindexMemoryAsync } from "../temporal-index.js";
32
+ import {
33
+ inferLocalizationMemoryStatus,
34
+ localizeUpdateCandidates,
35
+ mergeMemorySnapshots,
36
+ } from "./update-localization.js";
32
37
  import { propagateInvalidation } from "./dependency-propagation.js";
33
38
 
34
39
  /** Result type of {@link ContradictionLinkingCoordinator.checkForContradiction}. */
@@ -41,6 +46,15 @@ export interface ContradictionResult {
41
46
  supersededTags: string[];
42
47
  }
43
48
 
49
+ /** Outcome of the post-write contradiction retirement attempt. */
50
+ export type ContradictionResolveOutcome =
51
+ | "not_attempted"
52
+ | "blocked"
53
+ | "resolved"
54
+ | "lost_race"
55
+ | "supersede_failed"
56
+ | "supersedes_clear_failed";
57
+
44
58
  /**
45
59
  * Subset of {@link ContradictionResult} used by
46
60
  * {@link ContradictionLinkingCoordinator.applyDeferredContradictionResolve}.
@@ -111,47 +125,156 @@ export class ContradictionLinkingCoordinator {
111
125
  content: string,
112
126
  category: string,
113
127
  namespaceScope: string,
128
+ anchor?: {
129
+ entityRef?: string;
130
+ structuredAttributes?: Record<string, string>;
131
+ attributes?: Record<string, string>;
132
+ storageSnapshot?: MemoryFile[];
133
+ },
114
134
  ): Promise<ContradictionResult | null> {
115
- if (!this.isSearchAvailable()) return null;
116
-
117
135
  const config = this.getConfig();
118
-
119
- // Search for similar memories
120
- const results = await this.searchAcrossNamespaces({
121
- query: content,
122
- namespaces: [namespaceScope],
123
- maxResults: 5,
124
- mode: "search",
125
- });
126
-
127
- for (const result of results) {
128
- // Check similarity threshold
129
- if (result.score < config.contradictionSimilarityThreshold) {
130
- continue;
136
+ const localization = config.contradictionLocalization;
137
+ const anchorEnabled = coerceBool(localization?.anchorEnabled) ?? true;
138
+ if (!anchorEnabled) {
139
+ if (!this.isSearchAvailable()) return null;
140
+ const results = await this.searchAcrossNamespaces({
141
+ query: content,
142
+ namespaces: [namespaceScope],
143
+ maxResults: 5,
144
+ mode: "search",
145
+ });
146
+ for (const result of results) {
147
+ if (result.score < config.contradictionSimilarityThreshold) continue;
148
+ const memoryId = this.extractMemoryIdsFromResults([result])[0];
149
+ if (!memoryId) continue;
150
+ const resultNamespace = this.namespaceFromPath(result.path);
151
+ if (resultNamespace !== namespaceScope) continue;
152
+ const resultStorage = await this.storageForNamespace(resultNamespace);
153
+ const existingMemory = await resultStorage.getMemoryById(memoryId);
154
+ if (!existingMemory) continue;
155
+ if (inferLocalizationMemoryStatus(existingMemory, resultStorage.dir) !== "active") continue;
156
+ const verification = await this.getExtraction().verifyContradiction(
157
+ { content, category },
158
+ {
159
+ id: existingMemory.frontmatter.id,
160
+ content: existingMemory.content,
161
+ category: existingMemory.frontmatter.category,
162
+ created: existingMemory.frontmatter.created,
163
+ },
164
+ );
165
+ if (!verification) continue;
166
+ if (
167
+ verification.isContradiction &&
168
+ verification.confidence >= config.contradictionMinConfidence
169
+ ) {
170
+ if (verification.whichIsNewer === "first") {
171
+ log.info(
172
+ `detected contradiction (confidence: ${verification.confidence}): ${existingMemory.frontmatter.id} vs new memory — existing is newer, incoming fact is stale`,
173
+ );
174
+ continue;
175
+ }
176
+ log.info(
177
+ `detected contradiction (confidence: ${verification.confidence}): ${existingMemory.frontmatter.id} vs new memory${config.contradictionAutoResolve ? " (auto-resolved)" : " (queued for manual review)"}`,
178
+ );
179
+ return {
180
+ supersededId: existingMemory.frontmatter.id,
181
+ confidence: verification.confidence,
182
+ reason: verification.reasoning,
183
+ supersededPath: existingMemory.path,
184
+ supersededCreated: existingMemory.frontmatter.created,
185
+ supersededTags: existingMemory.frontmatter.tags ?? [],
186
+ };
187
+ }
131
188
  }
189
+ return null;
190
+ }
132
191
 
133
- // Get the existing memory
134
- const memoryId = this.extractMemoryIdsFromResults([result])[0];
135
- if (!memoryId) continue;
136
-
137
- const resultNamespace = this.namespaceFromPath(result.path);
138
- if (resultNamespace !== namespaceScope) continue;
139
- const resultStorage = await this.storageForNamespace(resultNamespace);
140
- const existingMemory = await resultStorage.getMemoryById(memoryId);
141
- if (!existingMemory) continue;
192
+ const localizationOptions = localization ?? {
193
+ anchorEnabled: true,
194
+ anchorCandidates: 5,
195
+ searchCandidates: 5,
196
+ maxCandidates: 8,
197
+ };
198
+ const resultStorage = await this.storageForNamespace(namespaceScope);
199
+ let anchorSnapshot = anchor?.storageSnapshot;
200
+ const anchorLimit = localizationOptions.anchorCandidates;
201
+ if (
202
+ !anchorSnapshot &&
203
+ Number.isInteger(anchorLimit) &&
204
+ anchorLimit > 0 &&
205
+ typeof anchor?.entityRef === "string" &&
206
+ anchor?.entityRef.trim().length > 0
207
+ ) {
208
+ const [hot, cold] = await Promise.all([
209
+ resultStorage.readAllMemories(),
210
+ typeof resultStorage.readAllColdMemories === "function"
211
+ ? resultStorage.readAllColdMemories()
212
+ : Promise.resolve([]),
213
+ ]);
214
+ anchorSnapshot = mergeMemorySnapshots(hot, cold, resultStorage.dir);
215
+ }
216
+ const anchorMemoryById = anchorSnapshot
217
+ ? new Map(anchorSnapshot.map((memory) => [memory.frontmatter.id, memory]))
218
+ : undefined;
219
+ const candidates = await localizeUpdateCandidates(
220
+ {
221
+ storage: anchorSnapshot
222
+ ? {
223
+ dir: resultStorage.dir,
224
+ readAllMemories: async () => anchorSnapshot ?? [],
225
+ readAllColdMemories: async () => [],
226
+ }
227
+ : resultStorage,
228
+ qmdSearch: async (query, limit) => {
229
+ if (!this.isSearchAvailable()) {
230
+ log.warn("[contradiction-linking] QMD unavailable; continuing with anchor candidates");
231
+ return [];
232
+ }
233
+ const results = await this.searchAcrossNamespaces({
234
+ query,
235
+ namespaces: [namespaceScope],
236
+ maxResults: limit,
237
+ mode: "search",
238
+ });
239
+ const hits = [];
240
+ for (const result of results) {
241
+ if (result.score < config.contradictionSimilarityThreshold) continue;
242
+ const memoryId = this.extractMemoryIdsFromResults([result])[0];
243
+ if (!memoryId) continue;
244
+ if (this.namespaceFromPath(result.path) !== namespaceScope) continue;
245
+ const existingMemory =
246
+ anchorMemoryById?.get(memoryId) ?? (await resultStorage.getMemoryById(memoryId));
247
+ if (
248
+ !existingMemory ||
249
+ inferLocalizationMemoryStatus(existingMemory, resultStorage.dir) !== "active"
250
+ ) continue;
251
+ hits.push({
252
+ id: memoryId,
253
+ content: existingMemory.content,
254
+ category: existingMemory.frontmatter.category,
255
+ score: result.score,
256
+ });
257
+ }
258
+ return hits;
259
+ },
260
+ },
261
+ {
262
+ entityRef: anchor?.entityRef,
263
+ category,
264
+ attributes: anchor?.structuredAttributes ?? anchor?.attributes,
265
+ },
266
+ content,
267
+ localizationOptions,
268
+ );
142
269
 
143
- // Skip memories already resolved or explicitly forgotten. Other
144
- // non-active statuses remain valid contradiction candidates.
270
+ for (const candidate of candidates) {
271
+ const existingMemory =
272
+ anchorMemoryById?.get(candidate.id) ?? (await resultStorage.getMemoryById(candidate.id));
145
273
  if (
146
- existingMemory.frontmatter.status === "superseded" ||
147
- existingMemory.frontmatter.status === "forgotten"
148
- ) {
149
- continue;
150
- }
151
-
152
- // Verify contradiction with LLM
153
- const extraction = this.getExtraction();
154
- const verification = await extraction.verifyContradiction(
274
+ !existingMemory ||
275
+ inferLocalizationMemoryStatus(existingMemory, resultStorage.dir) !== "active"
276
+ ) continue;
277
+ const verification = await this.getExtraction().verifyContradiction(
155
278
  { content, category },
156
279
  {
157
280
  id: existingMemory.frontmatter.id,
@@ -160,38 +283,17 @@ export class ContradictionLinkingCoordinator {
160
283
  created: existingMemory.frontmatter.created,
161
284
  },
162
285
  );
163
-
164
286
  if (!verification) continue;
165
-
166
- // Check if it's a real contradiction with high confidence
167
287
  if (
168
288
  verification.isContradiction &&
169
289
  verification.confidence >= config.contradictionMinConfidence
170
290
  ) {
171
- // When the LLM says the existing memory is newer (whichIsNewer ===
172
- // "first") the incoming fact is the stale one in both resolve modes —
173
- // log and continue so the caller never marks contradictionDetected and
174
- // the semantic-skip gate can discard the outdated write normally.
175
291
  if (verification.whichIsNewer === "first") {
176
292
  log.info(
177
293
  `detected contradiction (confidence: ${verification.confidence}): ${existingMemory.frontmatter.id} vs new memory — existing is newer, incoming fact is stale`,
178
294
  );
179
295
  continue;
180
296
  }
181
-
182
- // The new fact is newer than the existing one. When auto-resolve is
183
- // enabled, the caller retires the old memory AFTER the new write lands
184
- // and its tombstone status is known (#1645: defer auto-resolve until
185
- // tombstone status is known — a tombstone-blocked new write must not
186
- // retire the only active copy, leaving neither memory active). When
187
- // disabled, the old memory stays active for manual review. The
188
- // contradiction info is returned in both cases so the caller can apply
189
- // the deferred retire post-write.
190
-
191
- // Return the contradiction info regardless of auto-resolve setting.
192
- // The caller uses this to set `contradictionDetected=true` which
193
- // prevents the semantic-skip guard from silently dropping a
194
- // legitimately contradictory update (the regression this fixes).
195
297
  log.info(
196
298
  `detected contradiction (confidence: ${verification.confidence}): ${existingMemory.frontmatter.id} vs new memory${config.contradictionAutoResolve ? " (auto-resolved)" : " (queued for manual review)"}`,
197
299
  );
@@ -205,10 +307,8 @@ export class ContradictionLinkingCoordinator {
205
307
  };
206
308
  }
207
309
  }
208
-
209
310
  return null;
210
311
  }
211
-
212
312
  /**
213
313
  * #1645: Complete the deferred contradiction auto-resolve after writeMemory
214
314
  * returns and the new write's tombstone status is known. Retires the old
@@ -222,7 +322,7 @@ export class ContradictionLinkingCoordinator {
222
322
  storage: StorageManager,
223
323
  newMemoryId: string,
224
324
  postWriteGuard: boolean,
225
- ): Promise<void> {
325
+ ): Promise<ContradictionResolveOutcome> {
226
326
  const config = this.getConfig();
227
327
  // #1645 yG2: clear the pre-write `supersedes` link from a blocked row so
228
328
  // it doesn't claim to supersede a still-active memory (best-effort).
@@ -243,25 +343,87 @@ export class ContradictionLinkingCoordinator {
243
343
  !config.contradictionAutoResolve ||
244
344
  postWriteGuard
245
345
  ) {
246
- return;
346
+ return postWriteGuard ? "blocked" : "not_attempted";
247
347
  }
248
348
 
249
349
  // Capture links before the primary supersession. The propagation hook is
250
350
  // orchestration-owned, so its own supersessions cannot recurse.
251
351
  let oldMemory: MemoryFile | null = null;
252
- try {
253
- oldMemory = await storage.getMemoryById(contradiction.supersededId);
254
- } catch (err) {
255
- log.warn(`contradiction propagation snapshot failed for ${contradiction.supersededId}: ${err}`);
352
+ if (coerceBool(config.dependencyPropagation?.enabled) === true) {
353
+ try {
354
+ const [hot, cold] = await Promise.all([
355
+ typeof storage.readAllMemories === "function"
356
+ ? storage.readAllMemories()
357
+ : storage.getMemoryById(contradiction.supersededId).then((memory) =>
358
+ memory ? [memory] : [],
359
+ ),
360
+ typeof storage.readAllColdMemories === "function"
361
+ ? storage.readAllColdMemories()
362
+ : Promise.resolve([]),
363
+ ]);
364
+ oldMemory = mergeMemorySnapshots(hot, cold, storage.dir).find(
365
+ (memory) => memory.frontmatter.id === contradiction.supersededId,
366
+ ) ?? null;
367
+ } catch (err) {
368
+ log.warn(`contradiction propagation snapshot failed for ${contradiction.supersededId}: ${err}`);
369
+ }
256
370
  }
257
-
258
371
  try {
259
372
  const superseded = await storage.supersedeMemory(
260
373
  contradiction.supersededId,
261
374
  newMemoryId,
262
375
  contradiction.reason,
263
376
  );
264
- if (!superseded) return;
377
+ if (!superseded) {
378
+ let mergedSnapshot: MemoryFile[];
379
+ try {
380
+ const [hot, cold] = await Promise.all([
381
+ typeof storage.readAllMemories === "function"
382
+ ? storage.readAllMemories()
383
+ : Promise.all([
384
+ storage.getMemoryById(contradiction.supersededId),
385
+ storage.getMemoryById(newMemoryId),
386
+ ]).then((memories) =>
387
+ memories.filter((memory): memory is MemoryFile => memory !== null),
388
+ ),
389
+ typeof storage.readAllColdMemories === "function"
390
+ ? storage.readAllColdMemories()
391
+ : Promise.resolve([]),
392
+ ]);
393
+ mergedSnapshot = mergeMemorySnapshots(hot, cold, storage.dir);
394
+ } catch (err) {
395
+ log.warn(
396
+ `contradiction auto-resolve race check failed for ${contradiction.supersededId}: ${err}`,
397
+ );
398
+ return "supersede_failed";
399
+ }
400
+ const target = mergedSnapshot.find(
401
+ (memory) => memory.frontmatter.id === contradiction.supersededId,
402
+ );
403
+ if (!target) return "supersede_failed";
404
+ const losingMemory = mergedSnapshot.find(
405
+ (memory) =>
406
+ memory.frontmatter.id === newMemoryId &&
407
+ inferLocalizationMemoryStatus(memory, storage.dir) === "active",
408
+ );
409
+ if (!losingMemory) return "supersede_failed";
410
+ try {
411
+ if (losingMemory.frontmatter.supersedes === contradiction.supersededId) {
412
+ const cleared = await storage.writeMemoryFrontmatter(losingMemory, {
413
+ supersedes: undefined,
414
+ });
415
+ if (cleared === false) return "supersedes_clear_failed";
416
+ }
417
+ } catch (err) {
418
+ log.warn(
419
+ `contradiction auto-resolve losing supersedes clear failed for ${newMemoryId}: ${err}`,
420
+ );
421
+ return "supersedes_clear_failed";
422
+ }
423
+ return inferLocalizationMemoryStatus(target, storage.dir) === "active"
424
+ ? "supersede_failed"
425
+ : "lost_race";
426
+ }
265
427
  if (oldMemory) {
266
428
  try {
267
429
  await propagateInvalidation(
@@ -287,17 +449,25 @@ export class ContradictionLinkingCoordinator {
287
449
  resolveIndexingCapabilities(config).queryAwareIndexing &&
288
450
  contradiction.supersededPath
289
451
  ) {
290
- await deindexMemoryAsync(
291
- config.memoryDir,
292
- contradiction.supersededPath,
293
- contradiction.supersededCreated,
294
- contradiction.supersededTags,
295
- );
452
+ try {
453
+ await deindexMemoryAsync(
454
+ config.memoryDir,
455
+ contradiction.supersededPath,
456
+ contradiction.supersededCreated,
457
+ contradiction.supersededTags,
458
+ );
459
+ } catch (err) {
460
+ log.warn(
461
+ `contradiction auto-resolve deindex failed for ${contradiction.supersededId}: ${err}`,
462
+ );
463
+ }
296
464
  }
465
+ return "resolved";
297
466
  } catch (err) {
298
467
  log.warn(
299
468
  `contradiction auto-resolve supersede failed for ${contradiction.supersededId}: ${err}`,
300
469
  );
470
+ return "supersede_failed";
301
471
  }
302
472
  }
303
473