@remnic/core 9.65.2 → 9.65.4
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.
- package/dist/access-admin-ops-surface.d.ts +44 -44
- package/dist/access-admin-ops-surface.js +21 -19
- package/dist/access-authorization-probe.d.ts +38 -38
- package/dist/access-authorization-probe.js +22 -20
- package/dist/access-boundary.d.ts +40 -40
- package/dist/access-boundary.js +21 -19
- package/dist/access-cli.js +62 -60
- package/dist/access-cli.js.map +1 -1
- package/dist/access-coding-context-resolution.d.ts +3 -1
- package/dist/access-extraction-force-flush.d.ts +25 -25
- package/dist/access-extraction-force-flush.js +21 -19
- package/dist/access-health-types.d.ts +3 -1
- package/dist/access-http-lcm-compaction.d.ts +39 -39
- package/dist/access-http-lifecycle-flush.d.ts +39 -39
- package/dist/access-http-offline-stream.d.ts +25 -25
- package/dist/access-http-query.d.ts +4 -2
- package/dist/access-http-query.js +23 -21
- package/dist/access-http.d.ts +51 -44
- package/dist/access-http.js +37 -35
- package/dist/access-identity-continuity-surface.d.ts +12 -12
- package/dist/access-identity-continuity-surface.js +21 -19
- package/dist/access-lcm-surface.d.ts +27 -27
- package/dist/access-lcm-surface.js +21 -19
- package/dist/access-mcp-admin-tools.d.ts +9 -1
- package/dist/access-mcp-admin-tools.js +3 -1
- package/dist/access-mcp-output-schemas.js +1 -1
- package/dist/access-mcp.d.ts +39 -39
- package/dist/access-mcp.js +31 -29
- package/dist/access-memory-search-fanout.d.ts +4 -2
- package/dist/{access-namespace-preflight-Dhvcl-T0.d.ts → access-namespace-preflight-D_6mo8ms.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +5 -3
- package/dist/access-namespace-preflight.js +21 -19
- package/dist/access-observe-write-surface.d.ts +39 -39
- package/dist/access-observe-write-surface.js +21 -19
- package/dist/access-offline-manifest.d.ts +12 -12
- package/dist/access-offline-manifest.js +3 -3
- package/dist/access-operations-batch.js +25 -23
- package/dist/access-operations.d.ts +40 -40
- package/dist/access-operations.js +28 -26
- package/dist/access-recall-concurrency.d.ts +40 -40
- package/dist/access-recall-concurrency.js +21 -19
- package/dist/access-recall-response.d.ts +24 -24
- package/dist/access-recall-response.js +21 -19
- package/dist/access-recall-surface.d.ts +24 -24
- package/dist/access-recall-surface.js +21 -19
- package/dist/access-schema.d.ts +45 -45
- package/dist/{access-service-Bke1alZO.d.ts → access-service-DqPa3hy4.d.ts} +219 -75
- package/dist/access-service-helpers.d.ts +40 -40
- package/dist/access-service.d.ts +47 -47
- package/dist/access-service.js +21 -19
- package/dist/access-surface-catalog.d.ts +40 -40
- package/dist/access-surface-catalog.js +27 -21
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/access-wearables-meetings-surface.d.ts +5 -3
- package/dist/action-confidence.d.ts +3 -1
- package/dist/active-memory-bridge.d.ts +3 -1
- package/dist/active-recall.d.ts +3 -1
- package/dist/active-recall.js +10 -1
- package/dist/active-recall.js.map +1 -1
- package/dist/ambient-provenance.d.ts +3 -1
- package/dist/artifact-search.d.ts +3 -1
- package/dist/{auto-sync-H64ZCNIR.js → auto-sync-XVMLL2RH.js} +5 -5
- package/dist/behavior-learner.d.ts +3 -1
- package/dist/behavior-signals.d.ts +3 -1
- package/dist/bootstrap.d.ts +12 -12
- package/dist/briefing-window.d.ts +4 -2
- package/dist/briefing.d.ts +4 -2
- package/dist/briefing.js +4 -4
- package/dist/buffer-surprise-report.d.ts +3 -1
- package/dist/buffer-turn-helpers.d.ts +3 -1
- package/dist/buffer.d.ts +4 -2
- package/dist/bulk-import/index.d.ts +5 -3
- package/dist/calibration.d.ts +3 -1
- package/dist/capabilities.d.ts +3 -1
- package/dist/{catalog-DV6qnbr7.d.ts → catalog-DO_7zfkv.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +1 -1
- package/dist/causal-consolidation.d.ts +3 -1
- package/dist/causal-consolidation.js +12 -9
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-trajectory-graph.d.ts +1 -1
- package/dist/chunk-236PXYG7.js +232 -0
- package/dist/chunk-236PXYG7.js.map +1 -0
- package/dist/{chunk-YB42WZCY.js → chunk-2IXQSGCU.js} +2 -2
- package/dist/{chunk-PE255F4T.js → chunk-2MVTAIL3.js} +2 -2
- package/dist/{chunk-LGO6A7GJ.js → chunk-3JZBPTLD.js} +338 -80
- package/dist/chunk-3JZBPTLD.js.map +1 -0
- package/dist/{chunk-GDFVPUJ5.js → chunk-3NH3VP3U.js} +2 -2
- package/dist/{chunk-TBOJ76ER.js → chunk-AB3A7EFH.js} +18 -2
- package/dist/{chunk-TBOJ76ER.js.map → chunk-AB3A7EFH.js.map} +1 -1
- package/dist/{chunk-GNCCUR6K.js → chunk-AXGFOFNY.js} +2 -2
- package/dist/{chunk-SB7D4BT7.js → chunk-AZLLH6YA.js} +1554 -114
- package/dist/chunk-AZLLH6YA.js.map +1 -0
- package/dist/{chunk-5YQ63T4B.js → chunk-BK5G2MHO.js} +2 -2
- package/dist/{chunk-LZH5FR2W.js → chunk-CQBIN77D.js} +2 -2
- package/dist/{chunk-35NN3ZFA.js → chunk-CTVWELNK.js} +21 -3
- package/dist/chunk-CTVWELNK.js.map +1 -0
- package/dist/{chunk-NKKD4ZAU.js → chunk-DORFF5N5.js} +2 -2
- package/dist/{chunk-BWLRUMOG.js → chunk-DPNXADEI.js} +441 -2
- package/dist/chunk-DPNXADEI.js.map +1 -0
- package/dist/{chunk-SQI57UCJ.js → chunk-DUEDOYZD.js} +2 -2
- package/dist/{chunk-5NM4OH4P.js → chunk-DUZARALI.js} +3 -3
- package/dist/{chunk-2E36UXVW.js → chunk-ECLJ4LA2.js} +2 -2
- package/dist/{chunk-TZNQUNKL.js → chunk-FC7TIRFS.js} +15 -1
- package/dist/chunk-FC7TIRFS.js.map +1 -0
- package/dist/{chunk-IID2CMUU.js → chunk-GHD2LLG4.js} +2 -2
- package/dist/{chunk-ZQHI2BZB.js → chunk-HF5BUTI6.js} +2 -2
- package/dist/{chunk-3DVBKTSO.js → chunk-HSZMX3ZJ.js} +4 -4
- package/dist/{chunk-S2DPMJXH.js → chunk-I23ZHYSL.js} +2 -2
- package/dist/{chunk-ODZG724P.js → chunk-I2HTKOOP.js} +2 -2
- package/dist/chunk-I32NKXE2.js +879 -0
- package/dist/chunk-I32NKXE2.js.map +1 -0
- package/dist/{chunk-NTWN6HB2.js → chunk-IURMJBGP.js} +2 -2
- package/dist/{chunk-OCZIYAE5.js → chunk-IWKGOCL6.js} +3 -3
- package/dist/{chunk-UXO5IMBK.js → chunk-J3ATBB7M.js} +2 -2
- package/dist/{chunk-Y7DK7HHJ.js → chunk-JPAKBNTM.js} +2 -2
- package/dist/{chunk-SPUJNJJC.js → chunk-KFIOPZ25.js} +2 -2
- package/dist/{chunk-JYYBA7TF.js → chunk-KOO37E4Y.js} +2 -2
- package/dist/{chunk-OTHZWLUD.js → chunk-KPB2QHJZ.js} +2 -2
- package/dist/{chunk-SBDCZ2AX.js → chunk-LBFFNDFM.js} +1 -1
- package/dist/chunk-LBFFNDFM.js.map +1 -0
- package/dist/{chunk-CT56C22C.js → chunk-LYBIHM4N.js} +4 -4
- package/dist/{chunk-3I7ASZN3.js → chunk-MFOSZUIT.js} +2 -2
- package/dist/{chunk-DZUJ46DO.js → chunk-NLEH4RTB.js} +2 -2
- package/dist/{chunk-ZO6AXLEH.js → chunk-OCCHUEZB.js} +2 -2
- package/dist/{chunk-EILZG5VC.js → chunk-OU34IQXV.js} +2 -2
- package/dist/{chunk-2XDWWPTN.js → chunk-OZDFB22S.js} +2 -2
- package/dist/{chunk-UIN2BWDD.js → chunk-PTZQYCJ4.js} +2 -2
- package/dist/{chunk-7BY7V4YX.js → chunk-Q4WONDMJ.js} +4 -3
- package/dist/{chunk-7BY7V4YX.js.map → chunk-Q4WONDMJ.js.map} +1 -1
- package/dist/{chunk-Z7PBQPJ4.js → chunk-QJW4MZSW.js} +2 -2
- package/dist/{chunk-R7JAM2XF.js → chunk-R2MZCYA6.js} +3 -3
- package/dist/{chunk-TF77C7SV.js → chunk-SR5LNI6Q.js} +7 -5
- package/dist/chunk-SR5LNI6Q.js.map +1 -0
- package/dist/{chunk-LBWQ65SX.js → chunk-T42L3S6A.js} +4 -4
- package/dist/{chunk-J275IYMG.js → chunk-THVI4Y7X.js} +34 -7
- package/dist/chunk-THVI4Y7X.js.map +1 -0
- package/dist/{chunk-QOS5LBZN.js → chunk-TJFI3K2O.js} +15 -3
- package/dist/chunk-TJFI3K2O.js.map +1 -0
- package/dist/{chunk-2YI72KM3.js → chunk-UCKG36HO.js} +2 -2
- package/dist/{chunk-SIHSCCUQ.js → chunk-UFR6HX7A.js} +1 -1
- package/dist/{chunk-CDUUDBWJ.js → chunk-VFYRYFLL.js} +2 -2
- package/dist/{chunk-XRYZRW54.js → chunk-WDXD6ITO.js} +2 -2
- package/dist/{chunk-4KYOLI6M.js → chunk-XGM3VQWG.js} +120 -14
- package/dist/chunk-XGM3VQWG.js.map +1 -0
- package/dist/{chunk-MN4KB2A4.js → chunk-YDKF4MSJ.js} +3 -3
- package/dist/{chunk-YLDXWCZP.js → chunk-YHGCT462.js} +14 -9
- package/dist/chunk-YHGCT462.js.map +1 -0
- package/dist/{chunk-7YQ4IYS2.js → chunk-YOXVZJFM.js} +2 -2
- package/dist/{chunk-ZWXJBFZU.js → chunk-YZJM6CLF.js} +8 -8
- package/dist/chunk-ZCUTSMR2.js +61 -0
- package/dist/chunk-ZCUTSMR2.js.map +1 -0
- package/dist/{chunk-LUNJ3WFO.js → chunk-ZK4BFABK.js} +4 -4
- package/dist/{chunk-V3MXUL3D.js → chunk-ZPOHEB5Z.js} +329 -653
- package/dist/chunk-ZPOHEB5Z.js.map +1 -0
- package/dist/{chunk-RDFF2NAU.js → chunk-ZXBTTMGZ.js} +184 -88
- package/dist/chunk-ZXBTTMGZ.js.map +1 -0
- package/dist/{cli-cShQ13XG.d.ts → cli-DO3i14pM.d.ts} +5 -5
- package/dist/cli.d.ts +25 -25
- package/dist/cli.js +51 -48
- package/dist/coding/pre-action-gate.d.ts +2 -60
- package/dist/compounding/engine.d.ts +4 -2
- package/dist/compounding/engine.js +4 -4
- package/dist/compounding/preference-consolidator.d.ts +3 -1
- package/dist/compression-optimizer.d.ts +3 -1
- package/dist/config.d.ts +3 -1
- package/dist/config.js +10 -1
- package/dist/connectors/codex-materialize-runner.d.ts +3 -1
- package/dist/connectors/codex-materialize-runner.js +8 -5
- package/dist/connectors/codex-materialize.d.ts +16 -1
- package/dist/connectors/codex-materialize.js +10 -1
- package/dist/connectors/index.d.ts +3 -1
- package/dist/connectors/index.js +8 -5
- package/dist/consolidation-provenance-check.d.ts +4 -2
- package/dist/consolidation-undo.d.ts +4 -2
- package/dist/contradiction/index.d.ts +10 -270
- package/dist/contradiction/index.js +12 -7
- package/dist/{contradiction-review-QKJH5DKD.js → contradiction-review-WRVLRWHS.js} +6 -2
- package/dist/{contradiction-scan-VOTQRRSX.js → contradiction-scan-AKUWPX5N.js} +5 -3
- package/dist/converge-config.d.ts +3 -1
- package/dist/convergence-refresh.d.ts +4 -2
- package/dist/convergence-refresh.js +6 -6
- package/dist/conversation-index/backend.d.ts +3 -1
- package/dist/conversation-index/chunker.d.ts +3 -1
- package/dist/conversation-index/faiss-adapter.d.ts +3 -1
- package/dist/conversation-index/indexer.d.ts +3 -1
- package/dist/conversation-index/search.d.ts +3 -1
- package/dist/corpus-watermark.d.ts +3 -1
- package/dist/corpus-watermark.js +6 -6
- package/dist/cross-lingual-recall.d.ts +3 -1
- package/dist/day-summary.d.ts +3 -1
- package/dist/delinearize.d.ts +3 -1
- package/dist/dependency-propagation-config.d.ts +3 -1
- package/dist/{dependency-propagation-delivery-CsGg-VwS.d.ts → dependency-propagation-delivery-D23_x-s5.d.ts} +1 -1
- package/dist/direct-answer-wiring.d.ts +3 -1
- package/dist/direct-answer.d.ts +3 -1
- package/dist/embedding-fallback.d.ts +3 -1
- package/dist/enrichment/index.d.ts +3 -1
- package/dist/entity-origin-fields.d.ts +3 -1
- package/dist/entity-retrieval.d.ts +4 -2
- package/dist/entity-retrieval.js +4 -4
- package/dist/entity-schema.d.ts +3 -1
- package/dist/episodic-context.d.ts +3 -1
- package/dist/explicit-capture.d.ts +12 -12
- package/dist/explicit-capture.js +1 -1
- package/dist/external-wiki-access.d.ts +40 -40
- package/dist/external-wiki-access.js +22 -20
- package/dist/external-wiki-collection-registration.d.ts +3 -1
- package/dist/external-wiki-collection.d.ts +3 -1
- package/dist/external-wiki-mcp-tools.d.ts +40 -40
- package/dist/extraction-error-classification.d.ts +3 -1
- package/dist/extraction-faithfulness.d.ts +3 -1
- package/dist/extraction-judge-telemetry.d.ts +3 -1
- package/dist/extraction-judge-training.d.ts +3 -1
- package/dist/extraction-judge.d.ts +3 -1
- package/dist/extraction-judge.js +2 -2
- package/dist/extraction-liveness.d.ts +3 -1
- package/dist/extraction-normalization.d.ts +3 -1
- package/dist/extraction-prompt.d.ts +3 -1
- package/dist/extraction-source-grounding-rules.d.ts +3 -1
- package/dist/extraction-source-grounding.d.ts +3 -1
- package/dist/extraction.d.ts +3 -1
- package/dist/extraction.js +9 -7
- package/dist/fallback-llm.d.ts +3 -1
- package/dist/graph-dashboard-diff.d.ts +3 -1
- package/dist/graph-dashboard-key.d.ts +3 -1
- package/dist/graph-dashboard-parser.d.ts +3 -1
- package/dist/graph-edge-reinforcement.d.ts +3 -1
- package/dist/graph-path-reconstruction.d.ts +3 -1
- package/dist/graph-path-scoring.d.ts +3 -1
- package/dist/graph-snapshot.d.ts +3 -1
- package/dist/graph.d.ts +3 -1
- package/dist/harmonic-retrieval.js +1 -1
- package/dist/importance.d.ts +3 -1
- package/dist/importers/index.d.ts +3 -1
- package/dist/in-flight-reads.d.ts +3 -1
- package/dist/index--QhGIXF2.d.ts +284 -0
- package/dist/index.d.ts +314 -45
- package/dist/index.js +163 -88
- package/dist/intent.d.ts +3 -1
- package/dist/lcm/engine.d.ts +3 -1
- package/dist/lcm/index.d.ts +3 -1
- package/dist/lcm/tools.d.ts +3 -1
- package/dist/lifecycle.d.ts +3 -1
- package/dist/live-connectors-runner.d.ts +3 -1
- package/dist/local-llm.d.ts +3 -1
- package/dist/local-model-endpoint.d.ts +3 -1
- package/dist/maintenance/memory-governance.d.ts +3 -1
- package/dist/maintenance/memory-governance.js +4 -4
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +4 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +4 -4
- package/dist/maintenance/rebuild-memory-projection.d.ts +4 -2
- package/dist/maintenance/rebuild-memory-projection.js +5 -5
- package/dist/{maintenance-jhMpeGne.d.ts → maintenance-PFvY1Pw_.d.ts} +3 -3
- package/dist/mcp-memory-inspector-app.d.ts +37 -37
- package/dist/memory-action-policy.d.ts +3 -1
- package/dist/memory-cache.d.ts +3 -1
- package/dist/memory-lifecycle-ledger-utils.d.ts +3 -1
- package/dist/memory-projection-store.d.ts +3 -1
- package/dist/memory-provenance.d.ts +3 -1
- package/dist/memory-snapshot.d.ts +3 -1
- package/dist/memory-subject-cli.d.ts +40 -40
- package/dist/memory-subject.d.ts +42 -42
- package/dist/memory-worth-outcomes.d.ts +4 -2
- package/dist/models-json.d.ts +3 -1
- package/dist/namespaces/migrate.d.ts +5 -3
- package/dist/namespaces/migrate.js +5 -5
- package/dist/namespaces/principal.d.ts +3 -1
- package/dist/namespaces/search.d.ts +3 -1
- package/dist/namespaces/storage.d.ts +5 -3
- package/dist/namespaces/storage.js +4 -4
- package/dist/native-knowledge.d.ts +3 -1
- package/dist/offline-sync-impression-drain.d.ts +3 -1
- package/dist/operator-doctor-corpus.d.ts +3 -1
- package/dist/operator-doctor-corpus.js +7 -7
- package/dist/operator-doctor-replica.d.ts +3 -1
- package/dist/operator-toolkit.d.ts +5 -3
- package/dist/operator-toolkit.js +19 -13
- package/dist/orchestration/compression-guideline-coordinator.d.ts +4 -2
- package/dist/orchestration/maintenance.d.ts +6 -4
- package/dist/orchestration/maintenance.js +10 -10
- package/dist/{orchestrator-DyGUC7re.d.ts → orchestrator-4wzJrPVm.d.ts} +23 -9
- package/dist/orchestrator.d.ts +12 -12
- package/dist/orchestrator.js +62 -60
- package/dist/patterns-cli.d.ts +3 -1
- package/dist/{pipeline-C25Oxtp1.d.ts → pipeline-CgXgdIrF.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +3 -1
- package/dist/proactive-contention.d.ts +3 -1
- package/dist/provenance.d.ts +3 -1
- package/dist/{public-http-CMe7NQzj.d.ts → public-http-DhIXYBYI.d.ts} +1 -1
- package/dist/{qmd-DkDVCbgF.d.ts → qmd-BppGGxsi.d.ts} +1 -1
- package/dist/qmd-preflight.d.ts +4 -2
- package/dist/qmd-recall-cache.d.ts +3 -1
- package/dist/qmd.d.ts +4 -2
- package/dist/recall-concurrency-config.d.ts +3 -1
- package/dist/recall-disclosure-escalation.d.ts +3 -1
- package/dist/recall-explain-renderer.d.ts +3 -1
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-memory-map.d.ts +3 -1
- package/dist/recall-planner-llm.d.ts +3 -1
- package/dist/recall-state.d.ts +3 -1
- package/dist/recall-tag-filter.d.ts +3 -1
- package/dist/recall-timings.d.ts +3 -1
- package/dist/recall-xray-cli.d.ts +3 -1
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.d.ts +3 -1
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.d.ts +3 -1
- package/dist/recall-xray.js +2 -2
- package/dist/reconcile/cursor.d.ts +3 -1
- package/dist/reconcile/manifest.d.ts +3 -1
- package/dist/reconcile/manifest.js +2 -2
- package/dist/reconcile/plan.d.ts +3 -1
- package/dist/replay/normalizers/chatgpt.d.ts +3 -1
- package/dist/replay/normalizers/claude.d.ts +3 -1
- package/dist/replay/normalizers/openclaw.d.ts +3 -1
- package/dist/replay/normalizers/shared.d.ts +3 -1
- package/dist/replay/runner.d.ts +3 -1
- package/dist/replay/types.d.ts +3 -1
- package/dist/replica-divergence.d.ts +3 -1
- package/dist/replica-peers-config.d.ts +3 -1
- package/dist/{resolution-MFY72STR.js → resolution-4552BNRV.js} +14 -4
- package/dist/resolve-auth-token.d.ts +3 -1
- package/dist/resume-bundles.js +8 -2
- package/dist/retrieval-agents.d.ts +4 -2
- package/dist/retrieval-tiers.d.ts +3 -1
- package/dist/routing/engine.d.ts +3 -1
- package/dist/routing/store.d.ts +3 -1
- package/dist/salvage-envelope.d.ts +3 -1
- package/dist/salvage-envelope.js +1 -1
- package/dist/schemas.d.ts +44 -44
- package/dist/{scope-profiles-B9xMoFO-.d.ts → scope-profiles-ChZUtxDU.d.ts} +1 -1
- package/dist/search/embed-helper.d.ts +3 -1
- package/dist/search/factory.d.ts +3 -1
- package/dist/search/index.d.ts +3 -1
- package/dist/search/lancedb-backend.d.ts +3 -1
- package/dist/search/meilisearch-backend.d.ts +3 -1
- package/dist/search/noop-backend.d.ts +3 -1
- package/dist/search/orama-backend.d.ts +3 -1
- package/dist/search/port.d.ts +3 -1
- package/dist/search/remote-backend.d.ts +3 -1
- package/dist/{semantic-TddhF0y7.d.ts → semantic-BalR6EXU.d.ts} +1 -1
- package/dist/{semantic-consolidation-C4uykW84.d.ts → semantic-consolidation-mSPwQSmF.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +4 -2
- package/dist/semantic-consolidation.js +9 -6
- package/dist/semantic-rule-promotion.js +4 -4
- package/dist/semantic-rule-verifier.d.ts +3 -1
- package/dist/semantic-rule-verifier.js +4 -4
- package/dist/{service-DCZDZNcV.d.ts → service-BICWLwSP.d.ts} +2 -2
- package/dist/session-observer-bands.d.ts +3 -1
- package/dist/session-observer-state.d.ts +3 -1
- package/dist/shared-context/manager.d.ts +3 -1
- package/dist/signal.d.ts +3 -1
- package/dist/skills-registry.js +4 -56
- package/dist/skills-registry.js.map +1 -1
- package/dist/source-agent-qualifier.d.ts +3 -1
- package/dist/source-agent-qualifier.js +8 -5
- package/dist/{storage-CcKmEjL8.d.ts → storage-B7urx1K3.d.ts} +1 -1
- package/dist/storage.d.ts +4 -2
- package/dist/storage.js +6 -6
- package/dist/subject-config.d.ts +3 -1
- package/dist/summarizer.d.ts +3 -1
- package/dist/summary-snapshot.d.ts +3 -1
- package/dist/support-passport/index.d.ts +43 -43
- package/dist/support-passport/index.js +24 -22
- package/dist/temporal-supersession.d.ts +4 -2
- package/dist/temporal-timeline-recall.d.ts +3 -1
- package/dist/temporal-validity.d.ts +3 -1
- package/dist/threading.d.ts +3 -1
- package/dist/tier-migration.d.ts +4 -2
- package/dist/tier-routing.d.ts +3 -1
- package/dist/topics.d.ts +3 -1
- package/dist/transcript.d.ts +3 -1
- package/dist/transfer/types.d.ts +20 -20
- package/dist/trust-score-stage.d.ts +3 -1
- package/dist/trust-score.d.ts +3 -1
- package/dist/{types-Pi0lfaEt.d.ts → types-ETU5N6nB.d.ts} +433 -7
- package/dist/types.d.ts +3 -1
- package/dist/types.js +1 -1
- package/dist/utility-runtime.d.ts +3 -1
- package/dist/verified-recall.js +4 -4
- package/dist/who-knows-cli.d.ts +40 -40
- package/dist/who-knows-cli.js +5 -5
- package/dist/who-knows.d.ts +42 -42
- package/dist/who-knows.js +4 -4
- package/dist/write-envelope.d.ts +3 -1
- package/dist/write-envelope.js +1 -1
- package/package.json +2 -2
- package/src/access-boundary.ts +4 -0
- package/src/access-http.ts +6 -5
- package/src/access-mcp-admin-tools.ts +24 -0
- package/src/access-mcp-output-schemas.ts +14 -0
- package/src/access-mcp.ts +2 -2
- package/src/access-operations-batch.ts +5 -0
- package/src/access-service.ts +27 -0
- package/src/access-surface-catalog.test.ts +24 -0
- package/src/access-surface-catalog.ts +4 -0
- package/src/cli/skills-commands.ts +150 -0
- package/src/cli.ts +4 -2
- package/src/coding/action-gate.test.ts +341 -0
- package/src/coding/action-gate.ts +556 -0
- package/src/config.ts +9 -2
- package/src/connectors/codex-materialize-runner.ts +16 -0
- package/src/connectors/codex-materialize-skills.test.ts +141 -0
- package/src/connectors/codex-materialize.ts +58 -40
- package/src/connectors/materialize-paths.ts +50 -0
- package/src/connectors/materialize-skills.ts +127 -0
- package/src/contradiction/contradiction-review.ts +50 -4
- package/src/contradiction/contradiction-scan.ts +14 -3
- package/src/contradiction/resolution.ts +50 -2
- package/src/index.ts +9 -13
- package/src/orchestration/recall-rerank-coordinator.ts +123 -4
- package/src/orchestration/recall-result-formatter.ts +6 -2
- package/src/orchestration/recall-search-pipeline.ts +14 -1
- package/src/preferences/drift-config.ts +118 -0
- package/src/preferences/drift-recall.ts +133 -0
- package/src/preferences/drift-types.ts +87 -0
- package/src/preferences/index.ts +12 -0
- package/src/preferences/preference-drift.test.ts +690 -0
- package/src/preferences/preference-drift.ts +724 -0
- package/src/procedural/skill-io.test.ts +190 -0
- package/src/procedural/skill-io.ts +220 -0
- package/src/procedural/skill-projection.test.ts +214 -0
- package/src/procedural/skill-projection.ts +356 -0
- package/src/review/review-deck-access.test.ts +325 -0
- package/src/review/review-deck-http-base.ts +133 -0
- package/src/review/review-deck-mutation.test.ts +417 -0
- package/src/review/review-deck-mutation.ts +677 -0
- package/src/review/review-deck-snapshot.ts +196 -0
- package/src/review/review-deck-surface.ts +117 -0
- package/src/review/review-deck.test.ts +347 -0
- package/src/review/review-deck.ts +311 -0
- package/src/storage.ts +4 -6
- package/src/types.ts +9 -6
- package/dist/chunk-35NN3ZFA.js.map +0 -1
- package/dist/chunk-4KYOLI6M.js.map +0 -1
- package/dist/chunk-BWLRUMOG.js.map +0 -1
- package/dist/chunk-J275IYMG.js.map +0 -1
- package/dist/chunk-LGO6A7GJ.js.map +0 -1
- package/dist/chunk-QOS5LBZN.js.map +0 -1
- package/dist/chunk-RDFF2NAU.js.map +0 -1
- package/dist/chunk-SB7D4BT7.js.map +0 -1
- package/dist/chunk-SBDCZ2AX.js.map +0 -1
- package/dist/chunk-TF77C7SV.js.map +0 -1
- package/dist/chunk-TZNQUNKL.js.map +0 -1
- package/dist/chunk-V3MXUL3D.js.map +0 -1
- package/dist/chunk-XCTXS7VY.js +0 -402
- package/dist/chunk-XCTXS7VY.js.map +0 -1
- package/dist/chunk-YLDXWCZP.js.map +0 -1
- /package/dist/{auto-sync-H64ZCNIR.js.map → auto-sync-XVMLL2RH.js.map} +0 -0
- /package/dist/{chunk-YB42WZCY.js.map → chunk-2IXQSGCU.js.map} +0 -0
- /package/dist/{chunk-PE255F4T.js.map → chunk-2MVTAIL3.js.map} +0 -0
- /package/dist/{chunk-GDFVPUJ5.js.map → chunk-3NH3VP3U.js.map} +0 -0
- /package/dist/{chunk-GNCCUR6K.js.map → chunk-AXGFOFNY.js.map} +0 -0
- /package/dist/{chunk-5YQ63T4B.js.map → chunk-BK5G2MHO.js.map} +0 -0
- /package/dist/{chunk-LZH5FR2W.js.map → chunk-CQBIN77D.js.map} +0 -0
- /package/dist/{chunk-NKKD4ZAU.js.map → chunk-DORFF5N5.js.map} +0 -0
- /package/dist/{chunk-SQI57UCJ.js.map → chunk-DUEDOYZD.js.map} +0 -0
- /package/dist/{chunk-5NM4OH4P.js.map → chunk-DUZARALI.js.map} +0 -0
- /package/dist/{chunk-2E36UXVW.js.map → chunk-ECLJ4LA2.js.map} +0 -0
- /package/dist/{chunk-IID2CMUU.js.map → chunk-GHD2LLG4.js.map} +0 -0
- /package/dist/{chunk-ZQHI2BZB.js.map → chunk-HF5BUTI6.js.map} +0 -0
- /package/dist/{chunk-3DVBKTSO.js.map → chunk-HSZMX3ZJ.js.map} +0 -0
- /package/dist/{chunk-S2DPMJXH.js.map → chunk-I23ZHYSL.js.map} +0 -0
- /package/dist/{chunk-ODZG724P.js.map → chunk-I2HTKOOP.js.map} +0 -0
- /package/dist/{chunk-NTWN6HB2.js.map → chunk-IURMJBGP.js.map} +0 -0
- /package/dist/{chunk-OCZIYAE5.js.map → chunk-IWKGOCL6.js.map} +0 -0
- /package/dist/{chunk-UXO5IMBK.js.map → chunk-J3ATBB7M.js.map} +0 -0
- /package/dist/{chunk-Y7DK7HHJ.js.map → chunk-JPAKBNTM.js.map} +0 -0
- /package/dist/{chunk-SPUJNJJC.js.map → chunk-KFIOPZ25.js.map} +0 -0
- /package/dist/{chunk-JYYBA7TF.js.map → chunk-KOO37E4Y.js.map} +0 -0
- /package/dist/{chunk-OTHZWLUD.js.map → chunk-KPB2QHJZ.js.map} +0 -0
- /package/dist/{chunk-CT56C22C.js.map → chunk-LYBIHM4N.js.map} +0 -0
- /package/dist/{chunk-3I7ASZN3.js.map → chunk-MFOSZUIT.js.map} +0 -0
- /package/dist/{chunk-DZUJ46DO.js.map → chunk-NLEH4RTB.js.map} +0 -0
- /package/dist/{chunk-ZO6AXLEH.js.map → chunk-OCCHUEZB.js.map} +0 -0
- /package/dist/{chunk-EILZG5VC.js.map → chunk-OU34IQXV.js.map} +0 -0
- /package/dist/{chunk-2XDWWPTN.js.map → chunk-OZDFB22S.js.map} +0 -0
- /package/dist/{chunk-UIN2BWDD.js.map → chunk-PTZQYCJ4.js.map} +0 -0
- /package/dist/{chunk-Z7PBQPJ4.js.map → chunk-QJW4MZSW.js.map} +0 -0
- /package/dist/{chunk-R7JAM2XF.js.map → chunk-R2MZCYA6.js.map} +0 -0
- /package/dist/{chunk-LBWQ65SX.js.map → chunk-T42L3S6A.js.map} +0 -0
- /package/dist/{chunk-2YI72KM3.js.map → chunk-UCKG36HO.js.map} +0 -0
- /package/dist/{chunk-SIHSCCUQ.js.map → chunk-UFR6HX7A.js.map} +0 -0
- /package/dist/{chunk-CDUUDBWJ.js.map → chunk-VFYRYFLL.js.map} +0 -0
- /package/dist/{chunk-XRYZRW54.js.map → chunk-WDXD6ITO.js.map} +0 -0
- /package/dist/{chunk-MN4KB2A4.js.map → chunk-YDKF4MSJ.js.map} +0 -0
- /package/dist/{chunk-7YQ4IYS2.js.map → chunk-YOXVZJFM.js.map} +0 -0
- /package/dist/{chunk-ZWXJBFZU.js.map → chunk-YZJM6CLF.js.map} +0 -0
- /package/dist/{chunk-LUNJ3WFO.js.map → chunk-ZK4BFABK.js.map} +0 -0
- /package/dist/{contradiction-review-QKJH5DKD.js.map → contradiction-review-WRVLRWHS.js.map} +0 -0
- /package/dist/{contradiction-scan-VOTQRRSX.js.map → contradiction-scan-AKUWPX5N.js.map} +0 -0
- /package/dist/{resolution-MFY72STR.js.map → resolution-4552BNRV.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);\n if (storage.dir !== deps.memoryDir) bumpMemoryCorpusVersionForDir(deps.memoryDir);\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);\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
|
StorageManager
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-THVI4Y7X.js";
|
|
4
4
|
import {
|
|
5
5
|
normalizeEntityName
|
|
6
6
|
} from "./chunk-YXZG5TVN.js";
|
|
@@ -957,4 +957,4 @@ export {
|
|
|
957
957
|
resolveBriefingSaveDir,
|
|
958
958
|
briefingFilename
|
|
959
959
|
};
|
|
960
|
-
//# sourceMappingURL=chunk-
|
|
960
|
+
//# sourceMappingURL=chunk-IURMJBGP.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
externalWikiSearchOperation
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-GHD2LLG4.js";
|
|
4
4
|
import {
|
|
5
5
|
memoryStoreRequestSchema
|
|
6
6
|
} from "./chunk-W675UJCZ.js";
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
DELTA_SUBCOMMANDS,
|
|
11
11
|
defineOperation,
|
|
12
12
|
isCodegraphToolName
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-AZLLH6YA.js";
|
|
14
14
|
import {
|
|
15
15
|
serializeMutations,
|
|
16
16
|
withHeldFileLock
|
|
@@ -1818,4 +1818,4 @@ export {
|
|
|
1818
1818
|
codegraphIngestTracesOperation,
|
|
1819
1819
|
REGISTERED_OPERATIONS
|
|
1820
1820
|
};
|
|
1821
|
-
//# sourceMappingURL=chunk-
|
|
1821
|
+
//# sourceMappingURL=chunk-IWKGOCL6.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
StorageManager
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-THVI4Y7X.js";
|
|
4
4
|
import {
|
|
5
5
|
composeMemoryEnvelope
|
|
6
6
|
} from "./chunk-RAIUTAZZ.js";
|
|
@@ -546,4 +546,4 @@ export {
|
|
|
546
546
|
setSemanticRulePromotionTestHooks,
|
|
547
547
|
promoteSemanticRuleFromMemory
|
|
548
548
|
};
|
|
549
|
-
//# sourceMappingURL=chunk-
|
|
549
|
+
//# sourceMappingURL=chunk-J3ATBB7M.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
rebuildMemoryProjection
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-DUZARALI.js";
|
|
4
4
|
|
|
5
5
|
// src/convergence-refresh.ts
|
|
6
6
|
async function refreshConvergedNamespaces(namespaces, namespaceSearchRouter, getStorage, searchEnabled) {
|
|
@@ -32,4 +32,4 @@ async function refreshConvergedNamespaces(namespaces, namespaceSearchRouter, get
|
|
|
32
32
|
export {
|
|
33
33
|
refreshConvergedNamespaces
|
|
34
34
|
};
|
|
35
|
-
//# sourceMappingURL=chunk-
|
|
35
|
+
//# sourceMappingURL=chunk-JPAKBNTM.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
parseEntityFile
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-THVI4Y7X.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-
|
|
256
|
+
//# sourceMappingURL=chunk-KFIOPZ25.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
StorageManager
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-THVI4Y7X.js";
|
|
4
4
|
import {
|
|
5
5
|
bumpMemoryCorpusVersionForDir
|
|
6
6
|
} from "./chunk-XCB6QDL6.js";
|
|
@@ -765,4 +765,4 @@ export {
|
|
|
765
765
|
listMemoryGovernanceRuns,
|
|
766
766
|
readMemoryGovernanceRunArtifact
|
|
767
767
|
};
|
|
768
|
-
//# sourceMappingURL=chunk-
|
|
768
|
+
//# sourceMappingURL=chunk-KOO37E4Y.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
SupportPassportCreateGrantRequestSchema,
|
|
3
3
|
defineOperation
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-AZLLH6YA.js";
|
|
5
5
|
import {
|
|
6
6
|
SupportPassportCardCategorySchema,
|
|
7
7
|
SupportPassportMemoryIdSchema,
|
|
@@ -220,4 +220,4 @@ var supportPassportGrantAskOperation = defineOperation({
|
|
|
220
220
|
result: await ctx.service.supportPassportAskGrant(grantId, secret, question, ctx.abortSignal)
|
|
221
221
|
})
|
|
222
222
|
});
|
|
223
|
-
//# sourceMappingURL=chunk-
|
|
223
|
+
//# sourceMappingURL=chunk-KPB2QHJZ.js.map
|