@remnic/core 9.69.22 → 9.69.24
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/abstraction-nodes.js +3 -2
- package/dist/access-admin-ops-surface.d.ts +14 -12
- package/dist/access-admin-ops-surface.js +94 -91
- package/dist/access-authorization-probe.d.ts +14 -12
- package/dist/access-authorization-probe.js +95 -92
- package/dist/access-boundary.d.ts +14 -12
- package/dist/access-boundary.js +94 -91
- package/dist/access-citation-namespace.js +3 -3
- package/dist/access-cli.js +200 -195
- package/dist/access-cli.js.map +1 -1
- package/dist/access-coding-context-resolution.d.ts +2 -1
- package/dist/access-extraction-force-flush.d.ts +14 -12
- package/dist/access-extraction-force-flush.js +94 -91
- package/dist/access-health-types.d.ts +2 -1
- package/dist/access-http-briefing.d.ts +156 -0
- package/dist/access-http-briefing.js +233 -0
- package/dist/access-http-lcm-compaction.d.ts +14 -12
- package/dist/access-http-lifecycle-flush.d.ts +14 -12
- package/dist/access-http-offline-stream.d.ts +14 -12
- package/dist/access-http-query.d.ts +3 -2
- package/dist/access-http-query.js +96 -93
- package/dist/access-http.d.ts +15 -13
- package/dist/access-http.js +119 -114
- package/dist/access-identity-continuity-surface.d.ts +12 -10
- package/dist/access-identity-continuity-surface.js +94 -91
- package/dist/access-lcm-surface.d.ts +14 -12
- package/dist/access-lcm-surface.js +94 -91
- package/dist/access-mcp.d.ts +14 -12
- package/dist/access-mcp.js +105 -101
- package/dist/access-memory-search-fanout.d.ts +3 -2
- package/dist/{access-namespace-preflight-BMHhxoL9.d.ts → access-namespace-preflight-BsvmyENS.d.ts} +1 -1
- package/dist/access-namespace-preflight.d.ts +4 -3
- package/dist/access-namespace-preflight.js +94 -91
- package/dist/access-observe-transcript.d.ts +12 -10
- package/dist/access-observe-write-surface.d.ts +14 -12
- package/dist/access-observe-write-surface.js +94 -91
- package/dist/access-offline-manifest.d.ts +12 -10
- package/dist/access-offline-manifest.js +15 -15
- package/dist/access-operations-batch.js +99 -95
- package/dist/access-operations.d.ts +14 -12
- package/dist/access-operations.js +104 -100
- package/dist/access-recall-concurrency.d.ts +14 -12
- package/dist/access-recall-concurrency.js +94 -91
- package/dist/access-recall-response.d.ts +14 -12
- package/dist/access-recall-response.js +94 -91
- package/dist/access-recall-surface.d.ts +14 -12
- package/dist/access-recall-surface.js +94 -91
- package/dist/access-schema.js +8 -7
- package/dist/{access-service-BlsNXFwx.d.ts → access-service-DWdY9Mlk.d.ts} +7 -7
- package/dist/access-service-helpers.d.ts +14 -12
- package/dist/access-service.d.ts +14 -12
- package/dist/access-service.js +94 -91
- package/dist/access-surface-catalog.d.ts +14 -12
- package/dist/access-surface-catalog.js +97 -93
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/access-wearables-meetings-surface.d.ts +4 -3
- package/dist/action-confidence.d.ts +2 -1
- package/dist/active-memory-bridge.d.ts +2 -1
- package/dist/active-recall.d.ts +2 -1
- package/dist/active-recall.js +16 -13
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +7 -7
- package/dist/adapters/registry.js +3 -3
- package/dist/ambient-provenance.d.ts +2 -1
- package/dist/artifact-search.d.ts +2 -1
- package/dist/{auto-sync-GRUJFD2F.js → auto-sync-WNGG2GC2.js} +9 -9
- package/dist/behavior-learner.d.ts +2 -1
- package/dist/behavior-signals.d.ts +2 -1
- package/dist/bootstrap.d.ts +12 -10
- package/dist/briefing-window.d.ts +3 -2
- package/dist/briefing.d.ts +3 -2
- package/dist/briefing.js +36 -36
- package/dist/buffer-surprise-report.d.ts +2 -1
- package/dist/buffer-turn-helpers.d.ts +2 -1
- package/dist/buffer.d.ts +3 -2
- package/dist/buffer.js +13 -13
- package/dist/bulk-import/index.d.ts +4 -3
- package/dist/calibration.d.ts +2 -1
- package/dist/calibration.js +2 -1
- package/dist/calibration.js.map +1 -1
- package/dist/capabilities.d.ts +2 -1
- package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
- package/dist/{capsule-merge-SEHERWWP.js → capsule-merge-IPG4IOFP.js} +5 -5
- package/dist/{catalog-C1qHsGew.d.ts → catalog-CDZLyiXL.d.ts} +1 -1
- package/dist/causal-behavior.d.ts +2 -1
- package/dist/causal-behavior.js +4 -3
- package/dist/causal-behavior.js.map +1 -1
- package/dist/causal-chain.js +4 -3
- package/dist/causal-consolidation.d.ts +2 -1
- package/dist/causal-consolidation.js +42 -42
- package/dist/causal-retrieval.js +4 -3
- package/dist/causal-retrieval.js.map +1 -1
- package/dist/causal-trajectory-graph.d.ts +5 -2
- package/dist/causal-trajectory-graph.js +6 -2
- package/dist/causal-trajectory-graph.js.map +1 -1
- package/dist/causal-trajectory.js +3 -2
- package/dist/{chunk-KTVSPFCQ.js → chunk-22FVR2KE.js} +2 -2
- package/dist/{chunk-7Y5V3LAP.js → chunk-27QVNSQ3.js} +2 -2
- package/dist/{chunk-R7LY4YKF.js → chunk-2EKJDQZB.js} +2 -2
- package/dist/{chunk-FCATYKQA.js → chunk-2IOHTUP3.js} +263 -13
- package/dist/chunk-2IOHTUP3.js.map +1 -0
- package/dist/{chunk-HOUST5UX.js → chunk-2ITE4C2Z.js} +2 -2
- package/dist/{chunk-JOYC4RYC.js → chunk-2JVJ7UHC.js} +2 -2
- package/dist/{chunk-X2NFFBTO.js → chunk-2L5FSNPC.js} +7 -7
- package/dist/{chunk-DUAJKRR2.js → chunk-2SGLMP2E.js} +2 -2
- package/dist/{chunk-6FUMA6AA.js → chunk-2Z4GS5E6.js} +2 -2
- package/dist/{chunk-G6MXN2G5.js → chunk-37KUQPX4.js} +6 -6
- package/dist/{chunk-DDQQY2E3.js → chunk-3BTFBQLO.js} +7 -7
- package/dist/chunk-3BTFBQLO.js.map +1 -0
- package/dist/{chunk-UR6PBX2J.js → chunk-3K7V3HE6.js} +35 -60
- package/dist/chunk-3K7V3HE6.js.map +1 -0
- package/dist/{chunk-WKAXBXVA.js → chunk-3QQTXYZ6.js} +2 -2
- package/dist/{chunk-DJUKBGAD.js → chunk-46EST7JO.js} +5 -5
- package/dist/chunk-46EST7JO.js.map +1 -0
- package/dist/{chunk-4ZWCQJNM.js → chunk-46WM6JX2.js} +5 -5
- package/dist/{chunk-CASWJ2HM.js → chunk-46ZPIGWI.js} +3 -3
- package/dist/{chunk-HTIIXNJQ.js → chunk-4FIH6MPS.js} +6 -3
- package/dist/chunk-4FIH6MPS.js.map +1 -0
- package/dist/{chunk-MCA2X4WH.js → chunk-4IHBN6WU.js} +2 -2
- package/dist/{chunk-W7IGLX4G.js → chunk-4O6WRBGE.js} +7 -7
- package/dist/chunk-4O6WRBGE.js.map +1 -0
- package/dist/{chunk-FB7LAJQM.js → chunk-4TKJGOCJ.js} +2 -2
- package/dist/{chunk-H7BZBSP6.js → chunk-52II7PB6.js} +4 -4
- package/dist/{chunk-N4Y5T6VD.js → chunk-54WHLA65.js} +4 -4
- package/dist/chunk-56Y6EKZN.js +24 -0
- package/dist/chunk-56Y6EKZN.js.map +1 -0
- package/dist/{chunk-YVLENSNS.js → chunk-5ATKSPEQ.js} +2 -2
- package/dist/{chunk-OLT3YTDH.js → chunk-5FAGCOZD.js} +37 -24
- package/dist/chunk-5FAGCOZD.js.map +1 -0
- package/dist/{chunk-ZVZHG7AI.js → chunk-5UBH37SL.js} +3 -3
- package/dist/{chunk-N3WZU76A.js → chunk-66OJSCI6.js} +2 -2
- package/dist/{chunk-D35XLYQ7.js → chunk-6CVNSDCZ.js} +11 -11
- package/dist/{chunk-KA2HZCMG.js → chunk-6NXSYYGP.js} +2 -2
- package/dist/{chunk-2HIJHXB3.js → chunk-6WHJ2EAB.js} +2 -2
- package/dist/{chunk-ZZM476NV.js → chunk-6XL73HQ4.js} +4 -4
- package/dist/{chunk-EJ5RKUXW.js → chunk-AQ7SYDVO.js} +2 -2
- package/dist/{chunk-2Z3DG5CQ.js → chunk-B3O3IRZN.js} +2 -2
- package/dist/{chunk-P77QX3ID.js → chunk-B6O2YLUR.js} +21 -20
- package/dist/chunk-B6O2YLUR.js.map +1 -0
- package/dist/{chunk-RACZB5HT.js → chunk-BD7JTBYP.js} +4 -4
- package/dist/{chunk-I762GW7V.js → chunk-BLJWYCNO.js} +5 -5
- package/dist/{chunk-ACPCA4NO.js → chunk-BMWN7B3Y.js} +6 -6
- package/dist/chunk-BMWN7B3Y.js.map +1 -0
- package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
- package/dist/{chunk-KK66P5GQ.js → chunk-C553ZTLF.js} +46 -48
- package/dist/chunk-C553ZTLF.js.map +1 -0
- package/dist/{chunk-GCASGYIO.js → chunk-C7HJ3NEI.js} +2 -2
- package/dist/{chunk-C24UZSFW.js → chunk-CEH2AFXG.js} +6 -6
- package/dist/{chunk-WVGXCBOC.js → chunk-D5F7TKMH.js} +2 -2
- package/dist/chunk-DGS34QSY.js +141 -0
- package/dist/chunk-DGS34QSY.js.map +1 -0
- package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
- package/dist/{chunk-2OXIPF3A.js → chunk-DZD3WGCD.js} +4 -4
- package/dist/{chunk-UMEOXLIZ.js → chunk-E2P7TZTF.js} +5 -5
- package/dist/{chunk-6FC3IZ26.js → chunk-EBA5DA77.js} +2 -2
- package/dist/{chunk-N7JK2RKG.js → chunk-EOQ6FSQP.js} +2 -2
- package/dist/chunk-EUT2WCWS.js +54 -0
- package/dist/chunk-EUT2WCWS.js.map +1 -0
- package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
- package/dist/{chunk-XDMI5VKE.js → chunk-FVOP3NT7.js} +2 -2
- package/dist/{chunk-NRLELHAY.js → chunk-G7NYVKD6.js} +2 -2
- package/dist/{chunk-B3W7GWQB.js → chunk-GHTSNGBZ.js} +2 -2
- package/dist/chunk-GKCXTSFF.js +17 -0
- package/dist/chunk-GKCXTSFF.js.map +1 -0
- package/dist/{chunk-LUDBXTBJ.js → chunk-H272ZPQ3.js} +5 -5
- package/dist/{chunk-SN4JXNLL.js → chunk-H3TKENU4.js} +2 -2
- package/dist/{chunk-4HYNMLT6.js → chunk-H4SEGIZY.js} +2 -2
- package/dist/{chunk-ACZN5ZXD.js → chunk-H54VWRPS.js} +13 -13
- package/dist/{chunk-HTP6XRUI.js → chunk-HM7RHKS4.js} +2 -2
- package/dist/{chunk-Z3SQEEB6.js → chunk-HWLIMQE2.js} +2 -2
- package/dist/{chunk-NQFCLAYT.js → chunk-ICKJ52PE.js} +99 -322
- package/dist/chunk-ICKJ52PE.js.map +1 -0
- package/dist/{chunk-2QSZNTDO.js → chunk-JBPKEARU.js} +7 -7
- package/dist/{chunk-DK6GMO6D.js → chunk-JEC4DVM3.js} +16 -16
- package/dist/chunk-JEC4DVM3.js.map +1 -0
- package/dist/{chunk-ET2CNMLD.js → chunk-JN72EPOE.js} +2 -2
- package/dist/{chunk-U62OK7BB.js → chunk-JPKK466T.js} +188 -21
- package/dist/chunk-JPKK466T.js.map +1 -0
- package/dist/{chunk-JCCWJHOP.js → chunk-JYZSRNR7.js} +2 -2
- package/dist/{chunk-7D6HXODY.js → chunk-K7724CH2.js} +2 -2
- package/dist/{chunk-X33MJFD2.js → chunk-KAXCYM66.js} +3 -3
- package/dist/{chunk-7RRUHJPG.js → chunk-KB2G2I6Q.js} +3 -3
- package/dist/{chunk-ZXBTTMGZ.js → chunk-KEF46KL2.js} +5 -5
- package/dist/{chunk-5UZXUTVO.js → chunk-KNA3BXXL.js} +6 -2
- package/dist/chunk-KNA3BXXL.js.map +1 -0
- package/dist/{chunk-UWTDARPF.js → chunk-KTWG7CNY.js} +6 -6
- package/dist/{chunk-XQYTSZW3.js → chunk-L7Z57SID.js} +6 -6
- package/dist/{chunk-JMAG7WZ7.js → chunk-LO4UKPKX.js} +3 -3
- package/dist/{chunk-LDWIPYJ6.js → chunk-LS2FHUML.js} +3 -3
- package/dist/{chunk-GDB4J2H3.js → chunk-MPC7TYTZ.js} +2 -2
- package/dist/{chunk-2GF27PGH.js → chunk-MRPOZBJC.js} +3 -3
- package/dist/{chunk-BR3OOQZQ.js → chunk-MWN6QEI2.js} +2 -2
- package/dist/{chunk-NZGO2GKL.js → chunk-MY5EDR46.js} +4 -4
- package/dist/{chunk-LCMUZDBZ.js → chunk-N3ZOP7KC.js} +3 -3
- package/dist/{chunk-TVW4C7PV.js → chunk-NB3LRY4T.js} +6 -6
- package/dist/{chunk-QJCWK2A7.js → chunk-ND6IQGSZ.js} +2 -2
- package/dist/{chunk-NOB2T2FC.js → chunk-NHLLKEKK.js} +2 -2
- package/dist/{chunk-7GSSHAXC.js → chunk-NLYVH66G.js} +6 -6
- package/dist/chunk-NLYVH66G.js.map +1 -0
- package/dist/{chunk-EJIWBTVM.js → chunk-O6ZNNVSP.js} +2 -2
- package/dist/{chunk-AG46P24C.js → chunk-OB3XMWX5.js} +4 -4
- package/dist/{chunk-NYRB7BKY.js → chunk-OEYZXDQI.js} +6 -6
- package/dist/chunk-OEYZXDQI.js.map +1 -0
- package/dist/{chunk-46QMN7I7.js → chunk-PAZY2ZKP.js} +6 -6
- package/dist/{chunk-EF4JUM55.js → chunk-PX4UMA5Z.js} +2 -2
- package/dist/chunk-QLK3SL7Q.js +242 -0
- package/dist/chunk-QLK3SL7Q.js.map +1 -0
- package/dist/{chunk-GGYDJJBO.js → chunk-QOOBICJF.js} +5 -5
- package/dist/chunk-QOOBICJF.js.map +1 -0
- package/dist/{chunk-NNZFPYYX.js → chunk-R7QY5ZVB.js} +2 -2
- package/dist/{chunk-RO2X2EYM.js → chunk-R7RTXEYG.js} +2 -2
- package/dist/{chunk-3LJPSRAN.js → chunk-RBCQVOVJ.js} +3 -3
- package/dist/{chunk-N4F7ZSSG.js → chunk-RC5DXXWC.js} +2 -2
- package/dist/{chunk-VLAQV4HT.js → chunk-RJYJ7KR7.js} +1636 -611
- package/dist/chunk-RJYJ7KR7.js.map +1 -0
- package/dist/{chunk-5CF2R4NS.js → chunk-RKBLRTNT.js} +2 -2
- package/dist/{chunk-5QZR2RA3.js → chunk-ROBHL3GL.js} +2 -2
- package/dist/{chunk-D5ZNOKR7.js → chunk-S7T2TY65.js} +3 -3
- package/dist/{chunk-C2JCVZWX.js → chunk-SCXURCVT.js} +25 -13
- package/dist/chunk-SCXURCVT.js.map +1 -0
- package/dist/{chunk-3LADWWMA.js → chunk-SJDQ5RSN.js} +3 -3
- package/dist/{chunk-45XVII3J.js → chunk-SMWTZLHE.js} +99 -89
- package/dist/{chunk-45XVII3J.js.map → chunk-SMWTZLHE.js.map} +1 -1
- package/dist/{chunk-XOQGUGJL.js → chunk-SO7SV523.js} +1 -1
- package/dist/{chunk-XOQGUGJL.js.map → chunk-SO7SV523.js.map} +1 -1
- package/dist/{chunk-CHWUICVY.js → chunk-SV4Z2S67.js} +4 -4
- package/dist/{chunk-JHP45LO5.js → chunk-SVXJLDDC.js} +9 -7
- package/dist/{chunk-JHP45LO5.js.map → chunk-SVXJLDDC.js.map} +1 -1
- package/dist/{chunk-SEF4IOFE.js → chunk-SWIKABKI.js} +2 -2
- package/dist/{chunk-JRRQ747T.js → chunk-TBXAY2SS.js} +13 -13
- package/dist/{chunk-J6A3CX5N.js → chunk-TG3FAM2S.js} +33 -8
- package/dist/{chunk-J6A3CX5N.js.map → chunk-TG3FAM2S.js.map} +1 -1
- package/dist/{chunk-XZBXINXZ.js → chunk-TNSCIPBQ.js} +4 -4
- package/dist/{chunk-S37NN23M.js → chunk-TVEONGBU.js} +2 -2
- package/dist/{chunk-5RPMTFB6.js → chunk-TWF35IC6.js} +3 -3
- package/dist/{chunk-BZTJEILZ.js → chunk-U6N5IBVY.js} +2 -2
- package/dist/{chunk-7TUB6JWA.js → chunk-UCKYTA2T.js} +3 -3
- package/dist/{chunk-PPOT6SPR.js → chunk-UNNPNBR2.js} +11 -11
- package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
- package/dist/{chunk-J2R275FN.js → chunk-VVX5PZFS.js} +4 -4
- package/dist/{chunk-ME35HVDJ.js → chunk-VYCOJKSX.js} +2 -2
- package/dist/{chunk-F5UWQ4LX.js → chunk-W24T5YMW.js} +2 -2
- package/dist/{chunk-HDQUQBPW.js → chunk-W3K3HITK.js} +2 -2
- package/dist/{chunk-GDASG7NC.js → chunk-W4F3C7N7.js} +2 -2
- package/dist/{chunk-LFK623SF.js → chunk-WJHGDE7X.js} +5 -5
- package/dist/{chunk-DP4EBV7C.js → chunk-WMLEPWMO.js} +16 -16
- package/dist/chunk-WMLEPWMO.js.map +1 -0
- package/dist/{chunk-3Q6RD76J.js → chunk-WQZZDN5M.js} +5 -5
- package/dist/{chunk-ZJWDWPX6.js → chunk-X5K5TAQZ.js} +4 -4
- package/dist/{chunk-ZL3XX5LW.js → chunk-XM24CDZX.js} +3 -3
- package/dist/{chunk-JTWZKNUH.js → chunk-XOVKXJEP.js} +3 -3
- package/dist/{chunk-OGTKQ5MJ.js → chunk-XSGUMQQQ.js} +62 -50
- package/dist/chunk-XSGUMQQQ.js.map +1 -0
- package/dist/{chunk-X5YYSAZX.js → chunk-XUE46UYW.js} +3 -3
- package/dist/{chunk-DJORULH3.js → chunk-YRLHEEQT.js} +2 -2
- package/dist/{chunk-TA7UZZMW.js → chunk-Z3O53WZR.js} +2 -2
- package/dist/{chunk-4LG4CPOC.js → chunk-Z6COGHHN.js} +2 -2
- package/dist/{chunk-RE3H6Y2X.js → chunk-ZIW5JVRM.js} +2 -2
- package/dist/{cli-BNtvR-nU.d.ts → cli-DD0P-lu8.d.ts} +6 -6
- package/dist/cli.d.ts +16 -14
- package/dist/cli.js +154 -149
- package/dist/coding/export-okf-codegraph.d.ts +2 -1
- package/dist/coding/export-okf-codegraph.js +37 -37
- package/dist/coding/pre-action-gate.d.ts +2 -1
- package/dist/coding/pre-action-gate.js +4 -3
- package/dist/commitment-ledger.js +3 -2
- package/dist/compounding/engine.d.ts +3 -2
- package/dist/compounding/engine.js +37 -37
- package/dist/compounding/preference-consolidator.d.ts +2 -1
- package/dist/compression-optimizer.d.ts +2 -1
- package/dist/config.d.ts +2 -1
- package/dist/config.js +16 -13
- package/dist/connectors/codex-materialize-runner.d.ts +2 -1
- package/dist/connectors/codex-materialize-runner.js +38 -38
- package/dist/connectors/codex-materialize.d.ts +2 -1
- package/dist/connectors/codex-materialize.js +4 -4
- package/dist/connectors/index.d.ts +2 -1
- package/dist/connectors/index.js +38 -38
- package/dist/consolidation-provenance-check.d.ts +3 -2
- package/dist/consolidation-provenance-check.js +4 -4
- package/dist/consolidation-undo.d.ts +3 -2
- package/dist/consolidation-undo.js +3 -3
- package/dist/contradiction/index.d.ts +4 -3
- package/dist/contradiction/index.js +9 -9
- package/dist/converge-config.d.ts +2 -1
- package/dist/convergence-refresh.d.ts +3 -2
- package/dist/convergence-refresh.js +38 -38
- package/dist/conversation-index/backend.d.ts +2 -1
- package/dist/conversation-index/chunker.d.ts +2 -1
- package/dist/conversation-index/faiss-adapter.d.ts +2 -1
- package/dist/conversation-index/indexer.d.ts +2 -1
- package/dist/conversation-index/search.d.ts +2 -1
- package/dist/corpus-watermark.d.ts +2 -1
- package/dist/corpus-watermark.js +38 -38
- package/dist/cross-lingual-recall.d.ts +2 -1
- package/dist/cue-anchors.js +4 -3
- package/dist/dashboard-runtime.js +2 -2
- package/dist/day-summary.d.ts +2 -1
- package/dist/deep-recall-http-glue.d.ts +14 -12
- package/dist/deep-recall-http-glue.js +9 -8
- package/dist/deep-recall-mcp-tools.d.ts +14 -12
- package/dist/deep-recall-policy-llm.d.ts +2 -1
- package/dist/deep-recall-seeds.d.ts +2 -1
- package/dist/deep-recall.js +2 -2
- package/dist/delinearize.d.ts +2 -1
- package/dist/dependency-propagation-config.d.ts +2 -1
- package/dist/{dependency-propagation-delivery-DjpUlhLi.d.ts → dependency-propagation-delivery-CQPCu0o5.d.ts} +1 -1
- package/dist/direct-answer-wiring.d.ts +2 -1
- package/dist/direct-answer.d.ts +2 -1
- package/dist/embedding-fallback.d.ts +2 -1
- package/dist/enrichment/index.d.ts +2 -1
- package/dist/entity-origin-fields.d.ts +2 -1
- package/dist/entity-retrieval.d.ts +3 -2
- package/dist/entity-retrieval.js +36 -36
- package/dist/entity-schema.d.ts +2 -1
- package/dist/episodic-context.d.ts +2 -1
- package/dist/eval-trajectory-contracts.d.ts +2 -1
- package/dist/eval-trajectory-store.d.ts +2 -1
- package/dist/eval-trajectory-store.js +4 -3
- package/dist/eval-trajectory.d.ts +2 -1
- package/dist/eval-trajectory.js +4 -3
- package/dist/evals.js +3 -2
- package/dist/event-order-recall.js +2 -2
- package/dist/explicit-capture.d.ts +12 -10
- package/dist/explicit-capture.js +10 -10
- package/dist/external-wiki-access.d.ts +14 -12
- package/dist/external-wiki-access.js +95 -92
- package/dist/external-wiki-collection-registration.d.ts +2 -1
- package/dist/external-wiki-collection.d.ts +2 -1
- package/dist/external-wiki-mcp-tools.d.ts +14 -12
- package/dist/extraction-error-classification.d.ts +2 -1
- package/dist/extraction-faithfulness.d.ts +2 -1
- package/dist/extraction-judge-telemetry.d.ts +2 -1
- package/dist/extraction-judge-training.d.ts +2 -1
- package/dist/extraction-judge.d.ts +2 -1
- package/dist/extraction-liveness.d.ts +2 -1
- package/dist/extraction-normalization.d.ts +2 -1
- package/dist/extraction-prompt.d.ts +2 -1
- package/dist/extraction-source-grounding-rules.d.ts +2 -1
- package/dist/extraction-source-grounding.d.ts +2 -1
- package/dist/extraction.d.ts +2 -1
- package/dist/extraction.js +43 -43
- package/dist/fallback-llm.d.ts +2 -1
- package/dist/{first-start-migration-KHIMCBIC.js → first-start-migration-RC345GPL.js} +6 -5
- package/dist/{first-start-migration-KHIMCBIC.js.map → first-start-migration-RC345GPL.js.map} +1 -1
- package/dist/{forget-2AE4MDK3.js → forget-SZ2BXDGF.js} +3 -3
- package/dist/{graph-444E-DrF.d.ts → graph-DRkl22KE.d.ts} +10 -12
- package/dist/graph-append-error.d.ts +40 -0
- package/dist/graph-append-error.js +8 -0
- package/dist/graph-dashboard-diff.d.ts +5 -2
- package/dist/graph-dashboard-key.d.ts +5 -2
- package/dist/graph-dashboard-parser.d.ts +5 -2
- package/dist/{graph-edge-decay-DGTBFALQ.js → graph-edge-decay-MKIRZ762.js} +10 -4
- package/dist/graph-edge-decay-MKIRZ762.js.map +1 -0
- package/dist/graph-edge-reinforcement.d.ts +5 -2
- package/dist/graph-jsonl.d.ts +82 -0
- package/dist/graph-jsonl.js +23 -0
- package/dist/graph-jsonl.js.map +1 -0
- package/dist/graph-path-reconstruction.d.ts +5 -2
- package/dist/graph-path-scoring.d.ts +5 -2
- package/dist/graph-snapshot.d.ts +5 -2
- package/dist/graph-snapshot.js +7 -3
- package/dist/graph-write-lock.d.ts +84 -0
- package/dist/graph-write-lock.js +15 -0
- package/dist/graph-write-lock.js.map +1 -0
- package/dist/graph.d.ts +5 -2
- package/dist/graph.js +10 -3
- package/dist/harmonic-construction.js +5 -4
- package/dist/harmonic-retrieval.js +5 -4
- package/dist/importance.d.ts +2 -1
- package/dist/importers/index.d.ts +2 -1
- package/dist/in-flight-reads.d.ts +2 -1
- package/dist/{index-CsUrdMyL.d.ts → index-C9VXenR8.d.ts} +2 -2
- package/dist/index.d.ts +39 -25
- package/dist/index.js +291 -284
- package/dist/intent.d.ts +2 -1
- package/dist/json-store.js +2 -1
- package/dist/lcm/engine.d.ts +2 -1
- package/dist/lcm/engine.js +3 -3
- package/dist/lcm/index.d.ts +2 -1
- package/dist/lcm/index.js +6 -6
- package/dist/lcm/tools.d.ts +2 -1
- package/dist/lifecycle.d.ts +2 -1
- package/dist/live-connectors-runner.d.ts +2 -1
- package/dist/live-connectors-runner.js +3 -2
- package/dist/local-llm.d.ts +2 -1
- package/dist/local-model-endpoint.d.ts +2 -1
- package/dist/location/index.d.ts +4 -3
- package/dist/location/index.js +39 -39
- package/dist/maintenance/memory-governance.d.ts +2 -1
- package/dist/maintenance/memory-governance.js +36 -36
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +36 -36
- package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
- package/dist/maintenance/rebuild-memory-projection.js +37 -37
- package/dist/{maintenance-D1GRGLTE.d.ts → maintenance-C14sorKa.d.ts} +3 -3
- package/dist/mcp-memory-inspector-app.d.ts +14 -12
- package/dist/memory-action-policy.d.ts +2 -1
- package/dist/memory-cache.d.ts +2 -1
- package/dist/memory-controller.d.ts +2 -1
- package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
- package/dist/memory-projection-mutations.js +3 -3
- package/dist/memory-projection-store.d.ts +2 -1
- package/dist/memory-provenance.d.ts +2 -1
- package/dist/memory-snapshot.d.ts +2 -1
- package/dist/memory-subject-cli.d.ts +14 -12
- package/dist/memory-subject.d.ts +14 -12
- package/dist/memory-subject.js +5 -5
- package/dist/memory-worth-outcomes.d.ts +3 -2
- package/dist/models-json.d.ts +2 -1
- package/dist/namespaces/migrate.d.ts +4 -3
- package/dist/namespaces/migrate.js +37 -37
- package/dist/namespaces/principal.d.ts +2 -1
- package/dist/namespaces/search.d.ts +2 -1
- package/dist/namespaces/search.js +11 -11
- package/dist/namespaces/storage.d.ts +4 -3
- package/dist/namespaces/storage.js +36 -36
- package/dist/native-knowledge.d.ts +2 -1
- package/dist/objective-state-writers.js +4 -3
- package/dist/objective-state.js +3 -2
- package/dist/offline-sync-file-io.js +4 -3
- package/dist/offline-sync-impression-drain.d.ts +2 -1
- package/dist/offline-sync-impression-drain.js +7 -7
- package/dist/offline-sync.js +5 -4
- package/dist/operator-doctor-corpus.d.ts +2 -1
- package/dist/operator-doctor-corpus.js +39 -39
- package/dist/operator-doctor-replica.d.ts +2 -1
- package/dist/operator-toolkit.d.ts +6 -4
- package/dist/operator-toolkit.js +61 -58
- package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
- package/dist/orchestration/maintenance.d.ts +5 -4
- package/dist/orchestration/maintenance.js +46 -46
- package/dist/{orchestrator-DeqaPGT5.d.ts → orchestrator-DgyvFfPR.d.ts} +9 -9
- package/dist/orchestrator.d.ts +12 -10
- package/dist/orchestrator.js +201 -196
- package/dist/page-versioning.d.ts +73 -4
- package/dist/page-versioning.js +11 -3
- package/dist/patterns-cli.d.ts +2 -1
- package/dist/{pipeline-umUzU0D1.d.ts → pipeline-DRUwHb1X.d.ts} +1 -1
- package/dist/policy-runtime.d.ts +2 -1
- package/dist/proactive-contention.d.ts +2 -1
- package/dist/provenance.d.ts +2 -1
- package/dist/{public-http-Bevrjll9.d.ts → public-http-C4i8Opxc.d.ts} +1 -1
- package/dist/{purge-OP6BEDFY.js → purge-TZKRE6ZQ.js} +5 -5
- package/dist/purge-TZKRE6ZQ.js.map +1 -0
- package/dist/{qmd-BasT78PP.d.ts → qmd-BVWlg1YS.d.ts} +1 -1
- package/dist/qmd-preflight.d.ts +3 -2
- package/dist/qmd-recall-cache.d.ts +2 -1
- package/dist/qmd.d.ts +3 -2
- package/dist/qmd.js +4 -4
- package/dist/recall-concurrency-config.d.ts +2 -1
- package/dist/recall-disclosure-escalation.d.ts +2 -1
- package/dist/recall-explain-renderer.d.ts +2 -1
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-memory-map.d.ts +2 -1
- package/dist/recall-navigate-access.d.ts +2 -1
- package/dist/recall-navigate-access.js +2 -2
- package/dist/recall-navigate-disclosure.d.ts +2 -1
- package/dist/recall-navigate-disclosure.js +1 -1
- package/dist/recall-navigate.d.ts +2 -1
- package/dist/recall-navigate.js +2 -2
- package/dist/recall-planner-llm.d.ts +2 -1
- package/dist/recall-state.d.ts +2 -1
- package/dist/recall-state.js +3 -3
- package/dist/recall-tag-filter.d.ts +2 -1
- package/dist/recall-timings.d.ts +2 -1
- package/dist/recall-xray-cli.d.ts +2 -1
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.d.ts +2 -1
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.d.ts +2 -1
- package/dist/recall-xray.js +2 -2
- package/dist/reconcile/cursor.d.ts +2 -1
- package/dist/reconcile/manifest.d.ts +2 -1
- package/dist/reconcile/manifest.js +7 -7
- package/dist/reconcile/plan.d.ts +2 -1
- package/dist/replay/normalizers/chatgpt.d.ts +2 -1
- package/dist/replay/normalizers/claude.d.ts +2 -1
- package/dist/replay/normalizers/openclaw.d.ts +2 -1
- package/dist/replay/normalizers/shared.d.ts +2 -1
- package/dist/replay/runner.d.ts +2 -1
- package/dist/replay/types.d.ts +2 -1
- package/dist/replica-divergence.d.ts +2 -1
- package/dist/replica-peers-config.d.ts +2 -1
- package/dist/{resolution-4DLI3IOR.js → resolution-VKATP2HT.js} +10 -10
- package/dist/resolution-VKATP2HT.js.map +1 -0
- package/dist/resolve-auth-token.d.ts +2 -1
- package/dist/resume-bundles.js +21 -18
- package/dist/retrieval-agents.d.ts +3 -2
- package/dist/retrieval-tiers.d.ts +2 -1
- package/dist/routing/engine.d.ts +2 -1
- package/dist/routing/store.d.ts +2 -1
- package/dist/salvage-envelope.d.ts +2 -1
- package/dist/salvage-envelope.js +7 -7
- package/dist/{scope-profiles-DXYzyOXW.d.ts → scope-profiles-Vl00B1KU.d.ts} +1 -1
- package/dist/search/document-scanner.js +3 -3
- package/dist/search/embed-helper.d.ts +2 -1
- package/dist/search/factory.d.ts +2 -1
- package/dist/search/factory.js +10 -10
- package/dist/search/index.d.ts +2 -1
- package/dist/search/index.js +16 -16
- package/dist/search/lancedb-backend.d.ts +2 -1
- package/dist/search/lancedb-backend.js +4 -4
- package/dist/search/meilisearch-backend.d.ts +2 -1
- package/dist/search/meilisearch-backend.js +4 -4
- package/dist/search/noop-backend.d.ts +2 -1
- package/dist/search/orama-backend.d.ts +2 -1
- package/dist/search/orama-backend.js +4 -4
- package/dist/search/port.d.ts +2 -1
- package/dist/search/remote-backend.d.ts +2 -1
- package/dist/secure-store/index.js +3 -3
- package/dist/{semantic-consolidation-CqDeaY0U.d.ts → semantic-consolidation-BC9-GFuT.d.ts} +1 -1
- package/dist/semantic-consolidation.d.ts +3 -2
- package/dist/semantic-consolidation.js +39 -39
- package/dist/semantic-merge-config.d.ts +17 -0
- package/dist/semantic-merge-config.js +1 -0
- package/dist/semantic-merge-config.js.map +1 -0
- package/dist/semantic-rule-promotion.js +36 -36
- package/dist/semantic-rule-verifier.d.ts +2 -1
- package/dist/semantic-rule-verifier.js +36 -36
- package/dist/{service-BKD-DVYZ.d.ts → service-BOy6dHfc.d.ts} +2 -2
- package/dist/session-observer-bands.d.ts +2 -1
- package/dist/session-observer-state.d.ts +2 -1
- package/dist/shared-context/manager.d.ts +2 -1
- package/dist/signal.d.ts +2 -1
- package/dist/source-agent-qualifier.d.ts +2 -1
- package/dist/source-agent-qualifier.js +42 -42
- package/dist/source-attribution.d.ts +18 -6
- package/dist/source-attribution.js +3 -1
- package/dist/standup/build.js +36 -36
- package/dist/{storage-BcFd1lN_.d.ts → storage-BLJRnFi6.d.ts} +15 -8
- package/dist/storage.d.ts +3 -2
- package/dist/storage.js +35 -35
- package/dist/subject-config.d.ts +2 -1
- package/dist/subject-config.js +6 -6
- package/dist/summarizer.d.ts +2 -1
- package/dist/summary-snapshot.d.ts +2 -1
- package/dist/support-passport/index.d.ts +17 -15
- package/dist/support-passport/index.js +97 -94
- package/dist/temporal-supersession.d.ts +3 -2
- package/dist/temporal-timeline-recall.d.ts +2 -1
- package/dist/temporal-validity.d.ts +2 -1
- package/dist/threading.d.ts +2 -1
- package/dist/tier-migration.d.ts +3 -2
- package/dist/tier-routing.d.ts +2 -1
- package/dist/{tier-stats-2TOW3QNL.js → tier-stats-KA6OZX2C.js} +6 -5
- package/dist/{tier-stats-2TOW3QNL.js.map → tier-stats-KA6OZX2C.js.map} +1 -1
- package/dist/topics.d.ts +2 -1
- package/dist/transcript.d.ts +2 -1
- package/dist/transfer/backup.js +2 -2
- package/dist/transfer/capsule-export.js +2 -2
- package/dist/transfer/capsule-import.js +6 -6
- package/dist/transfer/export-okf.d.ts +2 -1
- package/dist/transfer/export-okf.js +37 -37
- package/dist/trust-score-stage.d.ts +2 -1
- package/dist/trust-score.d.ts +2 -1
- package/dist/trust-zones.js +3 -2
- package/dist/{types-BRg3tMyp.d.ts → types-YY-eKKU7.d.ts} +3 -0
- package/dist/types.d.ts +2 -1
- package/dist/types.js +1 -1
- package/dist/utility-learner.js +4 -3
- package/dist/utility-runtime.d.ts +2 -1
- package/dist/utility-runtime.js +5 -4
- package/dist/utility-telemetry.js +3 -2
- package/dist/verified-recall.js +36 -36
- package/dist/who-knows-cli.d.ts +14 -12
- package/dist/who-knows-cli.js +37 -37
- package/dist/who-knows.d.ts +14 -12
- package/dist/who-knows.js +36 -36
- package/dist/work/board.js +3 -3
- package/dist/work/storage.js +2 -2
- package/dist/work-product-ledger.js +3 -2
- package/dist/write-envelope.d.ts +2 -1
- package/dist/write-envelope.js +6 -6
- package/package.json +2 -2
- package/src/abstraction-nodes.ts +1 -4
- package/src/access-http-briefing.ts +35 -0
- package/src/access-http.test.ts +76 -0
- package/src/access-http.ts +20 -23
- package/src/access-surface-catalog.test.ts +9 -0
- package/src/access-surface-catalog.ts +1 -0
- package/src/binary-lifecycle/backend.ts +2 -1
- package/src/config.ts +2 -0
- package/src/connectors/live/github.ts +10 -17
- package/src/connectors/live/gmail.ts +8 -19
- package/src/connectors/live/google-drive.ts +6 -13
- package/src/connectors/live/notion.ts +11 -21
- package/src/cue-anchors.ts +1 -6
- package/src/dedup/connector-scope.ts +39 -0
- package/src/dedup/merge-content.test.ts +21 -0
- package/src/dedup/merge-content.ts +21 -7
- package/src/dedup/merge-judge.ts +146 -0
- package/src/dedup/merge.test.ts +3542 -0
- package/src/dedup/merge.ts +384 -0
- package/src/dedup/novelty-gate.ts +12 -10
- package/src/dedup/semantic.ts +7 -9
- package/src/graph-append-error.ts +28 -0
- package/src/graph-jsonl.ts +267 -0
- package/src/graph-write-lock.test.ts +228 -0
- package/src/graph-write-lock.ts +132 -0
- package/src/graph.ts +49 -45
- package/src/harmonic-construction.test.ts +329 -0
- package/src/json-store.ts +17 -20
- package/src/live-connectors-runner.ts +2 -1
- package/src/location/store.ts +1 -4
- package/src/maintenance/graph-edge-decay.ts +24 -13
- package/src/maintenance/purge.ts +2 -5
- package/src/maintenance/rebuild-memory-lifecycle-ledger.ts +3 -6
- package/src/maintenance/rebuild-memory-projection.ts +2 -5
- package/src/namespaces/catalog.ts +1 -9
- package/src/offline-sync-file-io.test.ts +39 -0
- package/src/offline-sync-file-io.ts +3 -7
- package/src/orchestration/contradiction-localization.integration.test.ts +35 -0
- package/src/orchestration/extraction-anchor-snapshot.ts +6 -1
- package/src/orchestration/extraction-persist-deps.ts +2 -1
- package/src/orchestration/extraction-persist-profile-promotion.test.ts +456 -0
- package/src/orchestration/extraction-persist-promotion.test.ts +534 -0
- package/src/orchestration/extraction-persist-promotion.ts +387 -1
- package/src/orchestration/extraction-persist.ts +95 -94
- package/src/orchestration/harmonic-construction-persist.test.ts +69 -0
- package/src/orchestration/harmonic-construction-persist.ts +55 -0
- package/src/orchestration/persistence-index.ts +35 -7
- package/src/orchestration/semantic-merge-commit-effects.ts +354 -0
- package/src/orchestration/semantic-merge-persist.ts +1095 -0
- package/src/orchestration/semantic-merge-promotion-payload.ts +161 -0
- package/src/orchestrator.ts +2 -2
- package/src/page-versioning.ts +396 -22
- package/src/procedural/procedure-miner.ts +1 -9
- package/src/search/document-scanner.ts +3 -6
- package/src/semantic-merge-config.ts +16 -0
- package/src/semantic-rule-promotion.ts +1 -4
- package/src/source-attribution-roundtrip.test.ts +21 -0
- package/src/source-attribution.ts +57 -17
- package/src/storage-contract/versioning.test.ts +500 -1
- package/src/storage.ts +30 -30
- package/src/testing/subjects/graph-edge-decay.test.ts +163 -0
- package/src/testing/subjects/semantic-merge-lifecycle.test.ts +1175 -0
- package/src/types.ts +2 -0
- package/src/utils/errno.test.ts +31 -0
- package/src/utils/errno.ts +5 -0
- package/src/wearables/index.ts +1 -0
- package/src/wearables/registry.ts +23 -0
- package/dist/chunk-5UZXUTVO.js.map +0 -1
- package/dist/chunk-7GSSHAXC.js.map +0 -1
- package/dist/chunk-ACPCA4NO.js.map +0 -1
- package/dist/chunk-C2JCVZWX.js.map +0 -1
- package/dist/chunk-DDQQY2E3.js.map +0 -1
- package/dist/chunk-DJUKBGAD.js.map +0 -1
- package/dist/chunk-DK6GMO6D.js.map +0 -1
- package/dist/chunk-DP4EBV7C.js.map +0 -1
- package/dist/chunk-FCATYKQA.js.map +0 -1
- package/dist/chunk-GGYDJJBO.js.map +0 -1
- package/dist/chunk-HTIIXNJQ.js.map +0 -1
- package/dist/chunk-KK66P5GQ.js.map +0 -1
- package/dist/chunk-NQFCLAYT.js.map +0 -1
- package/dist/chunk-NYRB7BKY.js.map +0 -1
- package/dist/chunk-OGTKQ5MJ.js.map +0 -1
- package/dist/chunk-OLT3YTDH.js.map +0 -1
- package/dist/chunk-P77QX3ID.js.map +0 -1
- package/dist/chunk-U62OK7BB.js.map +0 -1
- package/dist/chunk-UR6PBX2J.js.map +0 -1
- package/dist/chunk-VLAQV4HT.js.map +0 -1
- package/dist/chunk-W7IGLX4G.js.map +0 -1
- package/dist/purge-OP6BEDFY.js.map +0 -1
- /package/dist/{capsule-crypto-7FJQINUR.js.map → access-http-briefing.js.map} +0 -0
- /package/dist/{auto-sync-GRUJFD2F.js.map → auto-sync-WNGG2GC2.js.map} +0 -0
- /package/dist/{graph-edge-decay-DGTBFALQ.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
- /package/dist/{capsule-merge-SEHERWWP.js.map → capsule-merge-IPG4IOFP.js.map} +0 -0
- /package/dist/{chunk-KTVSPFCQ.js.map → chunk-22FVR2KE.js.map} +0 -0
- /package/dist/{chunk-7Y5V3LAP.js.map → chunk-27QVNSQ3.js.map} +0 -0
- /package/dist/{chunk-R7LY4YKF.js.map → chunk-2EKJDQZB.js.map} +0 -0
- /package/dist/{chunk-HOUST5UX.js.map → chunk-2ITE4C2Z.js.map} +0 -0
- /package/dist/{chunk-JOYC4RYC.js.map → chunk-2JVJ7UHC.js.map} +0 -0
- /package/dist/{chunk-X2NFFBTO.js.map → chunk-2L5FSNPC.js.map} +0 -0
- /package/dist/{chunk-DUAJKRR2.js.map → chunk-2SGLMP2E.js.map} +0 -0
- /package/dist/{chunk-6FUMA6AA.js.map → chunk-2Z4GS5E6.js.map} +0 -0
- /package/dist/{chunk-G6MXN2G5.js.map → chunk-37KUQPX4.js.map} +0 -0
- /package/dist/{chunk-WKAXBXVA.js.map → chunk-3QQTXYZ6.js.map} +0 -0
- /package/dist/{chunk-4ZWCQJNM.js.map → chunk-46WM6JX2.js.map} +0 -0
- /package/dist/{chunk-CASWJ2HM.js.map → chunk-46ZPIGWI.js.map} +0 -0
- /package/dist/{chunk-MCA2X4WH.js.map → chunk-4IHBN6WU.js.map} +0 -0
- /package/dist/{chunk-FB7LAJQM.js.map → chunk-4TKJGOCJ.js.map} +0 -0
- /package/dist/{chunk-H7BZBSP6.js.map → chunk-52II7PB6.js.map} +0 -0
- /package/dist/{chunk-N4Y5T6VD.js.map → chunk-54WHLA65.js.map} +0 -0
- /package/dist/{chunk-YVLENSNS.js.map → chunk-5ATKSPEQ.js.map} +0 -0
- /package/dist/{chunk-ZVZHG7AI.js.map → chunk-5UBH37SL.js.map} +0 -0
- /package/dist/{chunk-N3WZU76A.js.map → chunk-66OJSCI6.js.map} +0 -0
- /package/dist/{chunk-D35XLYQ7.js.map → chunk-6CVNSDCZ.js.map} +0 -0
- /package/dist/{chunk-KA2HZCMG.js.map → chunk-6NXSYYGP.js.map} +0 -0
- /package/dist/{chunk-2HIJHXB3.js.map → chunk-6WHJ2EAB.js.map} +0 -0
- /package/dist/{chunk-ZZM476NV.js.map → chunk-6XL73HQ4.js.map} +0 -0
- /package/dist/{chunk-EJ5RKUXW.js.map → chunk-AQ7SYDVO.js.map} +0 -0
- /package/dist/{chunk-2Z3DG5CQ.js.map → chunk-B3O3IRZN.js.map} +0 -0
- /package/dist/{chunk-RACZB5HT.js.map → chunk-BD7JTBYP.js.map} +0 -0
- /package/dist/{chunk-I762GW7V.js.map → chunk-BLJWYCNO.js.map} +0 -0
- /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
- /package/dist/{chunk-GCASGYIO.js.map → chunk-C7HJ3NEI.js.map} +0 -0
- /package/dist/{chunk-C24UZSFW.js.map → chunk-CEH2AFXG.js.map} +0 -0
- /package/dist/{chunk-WVGXCBOC.js.map → chunk-D5F7TKMH.js.map} +0 -0
- /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
- /package/dist/{chunk-2OXIPF3A.js.map → chunk-DZD3WGCD.js.map} +0 -0
- /package/dist/{chunk-UMEOXLIZ.js.map → chunk-E2P7TZTF.js.map} +0 -0
- /package/dist/{chunk-6FC3IZ26.js.map → chunk-EBA5DA77.js.map} +0 -0
- /package/dist/{chunk-N7JK2RKG.js.map → chunk-EOQ6FSQP.js.map} +0 -0
- /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
- /package/dist/{chunk-XDMI5VKE.js.map → chunk-FVOP3NT7.js.map} +0 -0
- /package/dist/{chunk-NRLELHAY.js.map → chunk-G7NYVKD6.js.map} +0 -0
- /package/dist/{chunk-B3W7GWQB.js.map → chunk-GHTSNGBZ.js.map} +0 -0
- /package/dist/{chunk-LUDBXTBJ.js.map → chunk-H272ZPQ3.js.map} +0 -0
- /package/dist/{chunk-SN4JXNLL.js.map → chunk-H3TKENU4.js.map} +0 -0
- /package/dist/{chunk-4HYNMLT6.js.map → chunk-H4SEGIZY.js.map} +0 -0
- /package/dist/{chunk-ACZN5ZXD.js.map → chunk-H54VWRPS.js.map} +0 -0
- /package/dist/{chunk-HTP6XRUI.js.map → chunk-HM7RHKS4.js.map} +0 -0
- /package/dist/{chunk-Z3SQEEB6.js.map → chunk-HWLIMQE2.js.map} +0 -0
- /package/dist/{chunk-2QSZNTDO.js.map → chunk-JBPKEARU.js.map} +0 -0
- /package/dist/{chunk-ET2CNMLD.js.map → chunk-JN72EPOE.js.map} +0 -0
- /package/dist/{chunk-JCCWJHOP.js.map → chunk-JYZSRNR7.js.map} +0 -0
- /package/dist/{chunk-7D6HXODY.js.map → chunk-K7724CH2.js.map} +0 -0
- /package/dist/{chunk-X33MJFD2.js.map → chunk-KAXCYM66.js.map} +0 -0
- /package/dist/{chunk-7RRUHJPG.js.map → chunk-KB2G2I6Q.js.map} +0 -0
- /package/dist/{chunk-ZXBTTMGZ.js.map → chunk-KEF46KL2.js.map} +0 -0
- /package/dist/{chunk-UWTDARPF.js.map → chunk-KTWG7CNY.js.map} +0 -0
- /package/dist/{chunk-XQYTSZW3.js.map → chunk-L7Z57SID.js.map} +0 -0
- /package/dist/{chunk-JMAG7WZ7.js.map → chunk-LO4UKPKX.js.map} +0 -0
- /package/dist/{chunk-LDWIPYJ6.js.map → chunk-LS2FHUML.js.map} +0 -0
- /package/dist/{chunk-GDB4J2H3.js.map → chunk-MPC7TYTZ.js.map} +0 -0
- /package/dist/{chunk-2GF27PGH.js.map → chunk-MRPOZBJC.js.map} +0 -0
- /package/dist/{chunk-BR3OOQZQ.js.map → chunk-MWN6QEI2.js.map} +0 -0
- /package/dist/{chunk-NZGO2GKL.js.map → chunk-MY5EDR46.js.map} +0 -0
- /package/dist/{chunk-LCMUZDBZ.js.map → chunk-N3ZOP7KC.js.map} +0 -0
- /package/dist/{chunk-TVW4C7PV.js.map → chunk-NB3LRY4T.js.map} +0 -0
- /package/dist/{chunk-QJCWK2A7.js.map → chunk-ND6IQGSZ.js.map} +0 -0
- /package/dist/{chunk-NOB2T2FC.js.map → chunk-NHLLKEKK.js.map} +0 -0
- /package/dist/{chunk-EJIWBTVM.js.map → chunk-O6ZNNVSP.js.map} +0 -0
- /package/dist/{chunk-AG46P24C.js.map → chunk-OB3XMWX5.js.map} +0 -0
- /package/dist/{chunk-46QMN7I7.js.map → chunk-PAZY2ZKP.js.map} +0 -0
- /package/dist/{chunk-EF4JUM55.js.map → chunk-PX4UMA5Z.js.map} +0 -0
- /package/dist/{chunk-NNZFPYYX.js.map → chunk-R7QY5ZVB.js.map} +0 -0
- /package/dist/{chunk-RO2X2EYM.js.map → chunk-R7RTXEYG.js.map} +0 -0
- /package/dist/{chunk-3LJPSRAN.js.map → chunk-RBCQVOVJ.js.map} +0 -0
- /package/dist/{chunk-N4F7ZSSG.js.map → chunk-RC5DXXWC.js.map} +0 -0
- /package/dist/{chunk-5CF2R4NS.js.map → chunk-RKBLRTNT.js.map} +0 -0
- /package/dist/{chunk-5QZR2RA3.js.map → chunk-ROBHL3GL.js.map} +0 -0
- /package/dist/{chunk-D5ZNOKR7.js.map → chunk-S7T2TY65.js.map} +0 -0
- /package/dist/{chunk-3LADWWMA.js.map → chunk-SJDQ5RSN.js.map} +0 -0
- /package/dist/{chunk-CHWUICVY.js.map → chunk-SV4Z2S67.js.map} +0 -0
- /package/dist/{chunk-SEF4IOFE.js.map → chunk-SWIKABKI.js.map} +0 -0
- /package/dist/{chunk-JRRQ747T.js.map → chunk-TBXAY2SS.js.map} +0 -0
- /package/dist/{chunk-XZBXINXZ.js.map → chunk-TNSCIPBQ.js.map} +0 -0
- /package/dist/{chunk-S37NN23M.js.map → chunk-TVEONGBU.js.map} +0 -0
- /package/dist/{chunk-5RPMTFB6.js.map → chunk-TWF35IC6.js.map} +0 -0
- /package/dist/{chunk-BZTJEILZ.js.map → chunk-U6N5IBVY.js.map} +0 -0
- /package/dist/{chunk-7TUB6JWA.js.map → chunk-UCKYTA2T.js.map} +0 -0
- /package/dist/{chunk-PPOT6SPR.js.map → chunk-UNNPNBR2.js.map} +0 -0
- /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
- /package/dist/{chunk-J2R275FN.js.map → chunk-VVX5PZFS.js.map} +0 -0
- /package/dist/{chunk-ME35HVDJ.js.map → chunk-VYCOJKSX.js.map} +0 -0
- /package/dist/{chunk-F5UWQ4LX.js.map → chunk-W24T5YMW.js.map} +0 -0
- /package/dist/{chunk-HDQUQBPW.js.map → chunk-W3K3HITK.js.map} +0 -0
- /package/dist/{chunk-GDASG7NC.js.map → chunk-W4F3C7N7.js.map} +0 -0
- /package/dist/{chunk-LFK623SF.js.map → chunk-WJHGDE7X.js.map} +0 -0
- /package/dist/{chunk-3Q6RD76J.js.map → chunk-WQZZDN5M.js.map} +0 -0
- /package/dist/{chunk-ZJWDWPX6.js.map → chunk-X5K5TAQZ.js.map} +0 -0
- /package/dist/{chunk-ZL3XX5LW.js.map → chunk-XM24CDZX.js.map} +0 -0
- /package/dist/{chunk-JTWZKNUH.js.map → chunk-XOVKXJEP.js.map} +0 -0
- /package/dist/{chunk-X5YYSAZX.js.map → chunk-XUE46UYW.js.map} +0 -0
- /package/dist/{chunk-DJORULH3.js.map → chunk-YRLHEEQT.js.map} +0 -0
- /package/dist/{chunk-TA7UZZMW.js.map → chunk-Z3O53WZR.js.map} +0 -0
- /package/dist/{chunk-4LG4CPOC.js.map → chunk-Z6COGHHN.js.map} +0 -0
- /package/dist/{chunk-RE3H6Y2X.js.map → chunk-ZIW5JVRM.js.map} +0 -0
- /package/dist/{forget-2AE4MDK3.js.map → forget-SZ2BXDGF.js.map} +0 -0
- /package/dist/{resolution-4DLI3IOR.js.map → graph-append-error.js.map} +0 -0
package/src/page-versioning.ts
CHANGED
|
@@ -16,13 +16,15 @@
|
|
|
16
16
|
* 2.md <- version 2 snapshot
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
-
import { createHash } from "node:crypto";
|
|
19
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
20
20
|
import path from "node:path";
|
|
21
21
|
import {
|
|
22
22
|
access,
|
|
23
|
+
appendFile,
|
|
23
24
|
mkdir,
|
|
24
25
|
readFile,
|
|
25
26
|
writeFile,
|
|
27
|
+
rename,
|
|
26
28
|
unlink,
|
|
27
29
|
} from "node:fs/promises";
|
|
28
30
|
import { ALL_CATEGORY_DIRS, RECALL_FALLBACK_DIRS } from "./utils/category-dir.js";
|
|
@@ -32,6 +34,7 @@ import {
|
|
|
32
34
|
requestEntityCanonicalIdReconcile,
|
|
33
35
|
} from "./storage/entity-canonical-id-references.js";
|
|
34
36
|
import { withRawEntityPageMutation } from "./storage/entity-canonical-id-lock.js";
|
|
37
|
+
import { withHeldFileLock, type HeldFileLockController } from "./utils/serialize-mutations.js";
|
|
35
38
|
|
|
36
39
|
// ---------------------------------------------------------------------------
|
|
37
40
|
// Public interfaces
|
|
@@ -44,9 +47,33 @@ export interface PageVersion {
|
|
|
44
47
|
sizeBytes: number;
|
|
45
48
|
trigger: VersionTrigger;
|
|
46
49
|
note?: string;
|
|
50
|
+
/**
|
|
51
|
+
* True while the snapshot is STAGED by a guarded write that has not yet
|
|
52
|
+
* committed (issue #2330 round N+15 B). Pruning counts — and removes —
|
|
53
|
+
* only committed snapshots: a pending entry belongs to a writer whose
|
|
54
|
+
* compare-and-swap may still fail, so trading it for an older rollback
|
|
55
|
+
* point would leave history short of the cap once that writer aborts
|
|
56
|
+
* (removeVersion). The staging writer clears the flag when its write
|
|
57
|
+
* commits (pruneVersions `committedVersionId`) or drops the entry; a
|
|
58
|
+
* finalization that FAILS after the commit records the id via
|
|
59
|
+
* recordStrandedCommit, and the next pruneVersions clears it (round
|
|
60
|
+
* N+22).
|
|
61
|
+
*/
|
|
62
|
+
pending?: boolean;
|
|
47
63
|
}
|
|
48
64
|
|
|
49
|
-
|
|
65
|
+
/**
|
|
66
|
+
* Snapshot triggers. The runtime allow-list in `readManifest` is derived from
|
|
67
|
+
* this array, so adding a trigger cannot leave a written manifest unreadable.
|
|
68
|
+
*/
|
|
69
|
+
export const VERSION_TRIGGERS = Object.freeze([
|
|
70
|
+
"write",
|
|
71
|
+
"consolidation",
|
|
72
|
+
"revert",
|
|
73
|
+
"manual",
|
|
74
|
+
"semantic-merge",
|
|
75
|
+
] as const);
|
|
76
|
+
export type VersionTrigger = (typeof VERSION_TRIGGERS)[number];
|
|
50
77
|
|
|
51
78
|
export interface VersionHistory {
|
|
52
79
|
pagePath: string;
|
|
@@ -87,6 +114,79 @@ function withPageLock<T>(pageKey: string, fn: () => Promise<T>): Promise<T> {
|
|
|
87
114
|
return next;
|
|
88
115
|
}
|
|
89
116
|
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
// Cross-process manifest lock (issue #2330 round N+16 B)
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
|
|
121
|
+
// withPageLock serializes manifest mutations only within ONE Remnic process.
|
|
122
|
+
// Two processes sharing a memory directory could both read a manifest,
|
|
123
|
+
// compute the SAME next version id, and stage colliding snapshots — and a
|
|
124
|
+
// merge whose content CAS then lost called removeVersion on that shared id,
|
|
125
|
+
// deleting the WINNER's committed rollback point (and concurrent
|
|
126
|
+
// non-atomic manifest writes tore the JSON outright). The mutation now also
|
|
127
|
+
// holds a cross-process advisory lock — the established withHeldFileLock
|
|
128
|
+
// primitive, as a sibling `<manifest>.lock` file (the same `<data>.lock`
|
|
129
|
+
// placement tombstones.jsonl and fact-hashes.txt use). A lock that cannot be
|
|
130
|
+
// taken within the bounded wait FAILS the mutation: staging falls back to
|
|
131
|
+
// the create path, and removal/prune callers already treat a throw as
|
|
132
|
+
// non-fatal — no caller ever proceeds unsynchronized into the collision the
|
|
133
|
+
// lock exists to prevent.
|
|
134
|
+
const MANIFEST_LOCK_STALE_MS = 30_000;
|
|
135
|
+
const MANIFEST_LOCK_MAX_WAIT_MS = 10_000;
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* A manifest mutation lost its advisory lock mid-section — a peer stale-broke
|
|
139
|
+
* and replaced it, and the section must abort rather than publish over the
|
|
140
|
+
* peer's committed mutation.
|
|
141
|
+
*/
|
|
142
|
+
class ManifestLockLostError extends Error {
|
|
143
|
+
constructor(mPath: string) {
|
|
144
|
+
super(
|
|
145
|
+
`page-versioning: manifest lock for ${mPath} was lost mid-section — a peer stale-broke it; aborting so the peer's mutation survives`,
|
|
146
|
+
);
|
|
147
|
+
this.name = "ManifestLockLostError";
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Revalidate lock ownership immediately before a destructive write (final
|
|
153
|
+
* round B). The lock's mtime heartbeat is a TIMER — it cannot fire while the
|
|
154
|
+
* process is paused past the stale window (CPU-bound section, suspended
|
|
155
|
+
* machine), so a peer can break the lock and commit its own newer mutation
|
|
156
|
+
* while THIS section still believes it holds it. Every mutation calls this
|
|
157
|
+
* immediately before each destructive write (snapshot writeFile, manifest
|
|
158
|
+
* rename, snapshot unlink) and aborts on loss — the same pattern the graph
|
|
159
|
+
* JSONL lock adopted (GraphWriteLockSection / assertGraphLockHeld). A held
|
|
160
|
+
* result also re-stamps the mtime, so the bounded write that follows cannot
|
|
161
|
+
* itself be judged stale mid-write.
|
|
162
|
+
*/
|
|
163
|
+
async function assertManifestLockHeld(
|
|
164
|
+
mPath: string,
|
|
165
|
+
lock: HeldFileLockController,
|
|
166
|
+
): Promise<void> {
|
|
167
|
+
if (!(await lock.refresh())) throw new ManifestLockLostError(mPath);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function withManifestLock<T>(
|
|
171
|
+
mPath: string,
|
|
172
|
+
fn: (lock: HeldFileLockController) => Promise<T>,
|
|
173
|
+
): Promise<T> {
|
|
174
|
+
return withPageLock(mPath, () =>
|
|
175
|
+
withHeldFileLock(
|
|
176
|
+
`${mPath}.lock`,
|
|
177
|
+
{ staleMs: MANIFEST_LOCK_STALE_MS, maxWaitMs: MANIFEST_LOCK_MAX_WAIT_MS },
|
|
178
|
+
async (acquired, lock) => {
|
|
179
|
+
if (!acquired) {
|
|
180
|
+
throw new Error(
|
|
181
|
+
`page-versioning: could not acquire the manifest lock for ${mPath} within ${MANIFEST_LOCK_MAX_WAIT_MS}ms — another process holds it`,
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
return fn(lock);
|
|
185
|
+
},
|
|
186
|
+
),
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
|
|
90
190
|
// ---------------------------------------------------------------------------
|
|
91
191
|
// Internal helpers
|
|
92
192
|
// ---------------------------------------------------------------------------
|
|
@@ -158,7 +258,8 @@ async function readManifest(
|
|
|
158
258
|
typeof version.contentHash !== "string" ||
|
|
159
259
|
typeof version.sizeBytes !== "number" ||
|
|
160
260
|
!Number.isFinite(version.sizeBytes) ||
|
|
161
|
-
!
|
|
261
|
+
!(VERSION_TRIGGERS as readonly string[]).includes(String(version.trigger)) ||
|
|
262
|
+
(version.pending !== undefined && typeof version.pending !== "boolean")
|
|
162
263
|
) {
|
|
163
264
|
throw new Error(`manifest version ${index} has invalid shape`);
|
|
164
265
|
}
|
|
@@ -183,7 +284,43 @@ async function writeManifest(
|
|
|
183
284
|
const dir = sidecarDir(memoryDir, sidecar, pagePath);
|
|
184
285
|
await mkdir(dir, { recursive: true });
|
|
185
286
|
const mp = manifestPath(memoryDir, sidecar, pagePath);
|
|
186
|
-
|
|
287
|
+
// Final round (A): publish atomically — write the temp file, then rename
|
|
288
|
+
// it over the manifest. A crash or transient failure can no longer leave a
|
|
289
|
+
// torn or truncated manifest behind, and the publish-before-cleanup
|
|
290
|
+
// ordering in every mutation guarantees a failed publication never strands
|
|
291
|
+
// a manifest entry whose snapshot file is already gone.
|
|
292
|
+
const tmp = `${mp}.${process.pid}.${randomUUID()}.tmp`;
|
|
293
|
+
try {
|
|
294
|
+
await writeFile(tmp, JSON.stringify(history, null, 2) + "\n", "utf8");
|
|
295
|
+
await rename(tmp, mp);
|
|
296
|
+
} catch (err) {
|
|
297
|
+
await unlink(tmp).catch(() => undefined);
|
|
298
|
+
throw err;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// Round N+22: stranded-commit marker. A finalization whose merge had
|
|
303
|
+
// ALREADY committed can still fail (manifest lock timeout, transient I/O),
|
|
304
|
+
// leaving its staged entry `pending` forever — pruneExcessVersions excludes
|
|
305
|
+
// pending entries, so every such failure stranded one unprunable snapshot
|
|
306
|
+
// and repeated failures grew history past maxVersionsPerPage. The failed
|
|
307
|
+
// finalization appends the (known-committed) version id to this marker (a
|
|
308
|
+
// sibling `<manifest>.stranded` file, one id per line); the next
|
|
309
|
+
// pruneVersions for the page reconciles those ids under the manifest lock.
|
|
310
|
+
// Append-only by design: a one-line O_APPEND write is atomic, and a
|
|
311
|
+
// clear-side rewrite could clobber an id appended by a finalization that
|
|
312
|
+
// just failed against the very lock the clear holds. Ids whose entry is gone
|
|
313
|
+
// or already committed are read-side no-ops, so stale lines cost one skipped
|
|
314
|
+
// lookup each and the file is bounded by finalization failures (one small
|
|
315
|
+
// line each). A writer that CRASHES mid-attempt records nothing — that case
|
|
316
|
+
// stays covered by the pending-exclusion itself.
|
|
317
|
+
async function readStrandedCommits(markerPath: string): Promise<string[]> {
|
|
318
|
+
try {
|
|
319
|
+
const raw = await readFile(markerPath, "utf-8");
|
|
320
|
+
return raw.split("\n").filter((line) => /^\d+$/.test(line.trim()));
|
|
321
|
+
} catch {
|
|
322
|
+
return [];
|
|
323
|
+
}
|
|
187
324
|
}
|
|
188
325
|
|
|
189
326
|
// ---------------------------------------------------------------------------
|
|
@@ -198,7 +335,14 @@ async function writeManifest(
|
|
|
198
335
|
* `content` is snapshotted as version 1.
|
|
199
336
|
*
|
|
200
337
|
* Pruning: when the number of versions exceeds `config.maxVersionsPerPage`,
|
|
201
|
-
* the oldest snapshots (and their files) are removed.
|
|
338
|
+
* the oldest snapshots (and their files) are removed. Pass
|
|
339
|
+
* `options.deferPrune` to stage the snapshot WITHOUT pruning and finalize
|
|
340
|
+
* with {@link pruneVersions} once the guarded write that staged it commits —
|
|
341
|
+
* a failed attempt then leaves the history untouched instead of discarding
|
|
342
|
+
* the oldest rollback point (issue #2330 round N+11 C). A deferred snapshot
|
|
343
|
+
* is recorded `pending` until its writer commits (round N+15 B); pruning
|
|
344
|
+
* counts only committed snapshots, so no prune can trade another writer's
|
|
345
|
+
* staged entry for an older rollback point.
|
|
202
346
|
*/
|
|
203
347
|
export async function createVersion(
|
|
204
348
|
pagePath: string,
|
|
@@ -208,12 +352,13 @@ export async function createVersion(
|
|
|
208
352
|
log: VersioningLogger = NOOP_LOGGER,
|
|
209
353
|
note?: string,
|
|
210
354
|
memoryDir?: string,
|
|
355
|
+
options?: { deferPrune?: boolean },
|
|
211
356
|
): Promise<PageVersion> {
|
|
212
357
|
const { sidecarDir: sidecar, maxVersionsPerPage } = config;
|
|
213
358
|
const resolvedMemoryDir = memoryDir ?? resolveMemoryDir(pagePath);
|
|
214
359
|
const mPath = manifestPath(resolvedMemoryDir, sidecar, relPath(pagePath, resolvedMemoryDir));
|
|
215
360
|
|
|
216
|
-
return
|
|
361
|
+
return withManifestLock(mPath, async (lock) => {
|
|
217
362
|
const history = await readManifest(resolvedMemoryDir, sidecar, relPath(pagePath, resolvedMemoryDir));
|
|
218
363
|
const nextId = String(history.versions.length > 0
|
|
219
364
|
? Math.max(...history.versions.map((v) => Number(v.versionId))) + 1
|
|
@@ -224,41 +369,270 @@ export async function createVersion(
|
|
|
224
369
|
versionId: nextId,
|
|
225
370
|
timestamp: new Date().toISOString(),
|
|
226
371
|
contentHash: hash,
|
|
227
|
-
sizeBytes: Buffer.byteLength(content, "
|
|
372
|
+
sizeBytes: Buffer.byteLength(content, "utf8"),
|
|
228
373
|
trigger,
|
|
229
374
|
...(note !== undefined ? { note } : {}),
|
|
375
|
+
...(options?.deferPrune === true ? { pending: true } : {}),
|
|
230
376
|
};
|
|
231
377
|
|
|
232
|
-
// Write snapshot file
|
|
233
378
|
const dir = sidecarDir(resolvedMemoryDir, sidecar, relPath(pagePath, resolvedMemoryDir));
|
|
234
379
|
await mkdir(dir, { recursive: true });
|
|
235
380
|
const ext = path.extname(pagePath) || ".md";
|
|
236
381
|
const snapshotPath = path.join(dir, `${nextId}${ext}`);
|
|
237
|
-
|
|
382
|
+
// Final round (B): revalidate ownership immediately before the staged
|
|
383
|
+
// snapshot write — a peer that stale-broke the lock may have committed a
|
|
384
|
+
// mutation reusing this id, and overwriting its file would corrupt the
|
|
385
|
+
// peer's published rollback point.
|
|
386
|
+
await assertManifestLockHeld(mPath, lock);
|
|
387
|
+
await writeFile(snapshotPath, content, "utf8");
|
|
238
388
|
|
|
239
389
|
history.versions.push(version);
|
|
240
390
|
history.currentVersion = nextId;
|
|
241
391
|
|
|
242
|
-
//
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
392
|
+
// Final round (A): the prune only COMPUTES the removal here; the
|
|
393
|
+
// manifest publishes it (atomic rename), and only then are the pruned
|
|
394
|
+
// snapshot files unlinked — a publication failure leaves the manifest
|
|
395
|
+
// and the files exactly as they were, never a dangling reference.
|
|
396
|
+
// The prune is skipped when the caller deferred it until its guarded
|
|
397
|
+
// write commits (issue #2330 round N+11 C).
|
|
398
|
+
const pruned = options?.deferPrune === true
|
|
399
|
+
? []
|
|
400
|
+
: pruneExcessVersions(history, maxVersionsPerPage);
|
|
401
|
+
await assertManifestLockHeld(mPath, lock);
|
|
255
402
|
await writeManifest(resolvedMemoryDir, sidecar, relPath(pagePath, resolvedMemoryDir), history);
|
|
403
|
+
await unlinkPublishedSnapshots(mPath, lock, dir, ext, pruned, log);
|
|
256
404
|
log.debug(`page-versioning: created version ${nextId} for ${pagePath} (trigger=${trigger})`);
|
|
257
405
|
|
|
258
406
|
return version;
|
|
259
407
|
});
|
|
260
408
|
}
|
|
261
409
|
|
|
410
|
+
/**
|
|
411
|
+
* Compute the excess COMMITTED snapshots and drop them from `history`,
|
|
412
|
+
* returning the pruned entries WITHOUT touching any file — the caller
|
|
413
|
+
* publishes the manifest first and unlinks the files only afterwards
|
|
414
|
+
* ({@link unlinkPublishedSnapshots}, final round A). The caller holds the
|
|
415
|
+
* manifest lock.
|
|
416
|
+
*/
|
|
417
|
+
function pruneExcessVersions(
|
|
418
|
+
history: VersionHistory,
|
|
419
|
+
maxVersionsPerPage: number,
|
|
420
|
+
): PageVersion[] {
|
|
421
|
+
if (!(maxVersionsPerPage > 0)) return [];
|
|
422
|
+
// Round N+15 (B): count only COMMITTED snapshots. Two concurrent merges
|
|
423
|
+
// can both stage (deferPrune) before either commits; a prune that counted
|
|
424
|
+
// the other writer's pending entry would drop one more rollback point
|
|
425
|
+
// than the cap requires, and that writer's abort (removeVersion) then
|
|
426
|
+
// leaves history SHORT of the cap. Pending entries are skipped entirely —
|
|
427
|
+
// never counted, never removed. (ponytail: a writer that dies mid-attempt
|
|
428
|
+
// leaves its entry pending forever — bounded by one entry per crash;
|
|
429
|
+
// age-based expiry if crash loops ever make that matter. A finalization
|
|
430
|
+
// that fails AFTER its merge committed no longer strands its entry —
|
|
431
|
+
// pruneVersions reconciles those from the stranded-commit marker, round
|
|
432
|
+
// N+22.)
|
|
433
|
+
const excess =
|
|
434
|
+
history.versions.filter((version) => version.pending !== true).length -
|
|
435
|
+
maxVersionsPerPage;
|
|
436
|
+
if (excess <= 0) return [];
|
|
437
|
+
const toRemove = new Set<PageVersion>();
|
|
438
|
+
for (const version of history.versions) {
|
|
439
|
+
if (toRemove.size >= excess) break;
|
|
440
|
+
if (version.pending === true) continue;
|
|
441
|
+
toRemove.add(version);
|
|
442
|
+
}
|
|
443
|
+
history.versions = history.versions.filter((version) => !toRemove.has(version));
|
|
444
|
+
return [...toRemove];
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* Best-effort removal of snapshot files whose removal the manifest has
|
|
449
|
+
* ALREADY published (final round A). Ownership is revalidated first: after a
|
|
450
|
+
* lock loss, a peer's fresh mutation may have reused a removed id, and
|
|
451
|
+
* unlinking its file would leave the PEER's manifest with a dangling
|
|
452
|
+
* reference — so a lost lock aborts the cleanup (the caller surfaces the
|
|
453
|
+
* error; the already-published manifest stays consistent, and the skipped
|
|
454
|
+
* files are unreferenced orphans, never dangling references).
|
|
455
|
+
*/
|
|
456
|
+
async function unlinkPublishedSnapshots(
|
|
457
|
+
mPath: string,
|
|
458
|
+
lock: HeldFileLockController,
|
|
459
|
+
dir: string,
|
|
460
|
+
ext: string,
|
|
461
|
+
pruned: PageVersion[],
|
|
462
|
+
log: VersioningLogger,
|
|
463
|
+
): Promise<void> {
|
|
464
|
+
if (pruned.length === 0) return;
|
|
465
|
+
await assertManifestLockHeld(mPath, lock);
|
|
466
|
+
for (const old of pruned) {
|
|
467
|
+
const oldPath = path.join(dir, `${old.versionId}${ext}`);
|
|
468
|
+
try {
|
|
469
|
+
await unlink(oldPath);
|
|
470
|
+
} catch {
|
|
471
|
+
log.debug(`page-versioning: could not remove old snapshot ${oldPath}`);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* Finalize a deferred prune: drop the oldest COMMITTED snapshots (and their
|
|
478
|
+
* files) until the history is back at `config.maxVersionsPerPage`. Call only
|
|
479
|
+
* after the guarded write that staged the snapshot has committed — a failed
|
|
480
|
+
* attempt never calls this, so it cannot discard rollback points. Pass
|
|
481
|
+
* `options.committedVersionId` to clear the staging writer's `pending` flag
|
|
482
|
+
* under the SAME page lock as the prune (round N+15 B): the entry becomes
|
|
483
|
+
* countable exactly when — and only when — its writer's write has committed,
|
|
484
|
+
* so a concurrent still-pending writer's entry is never counted or removed.
|
|
485
|
+
*
|
|
486
|
+
* Round N+22: each call also reconciles entries stranded by an EARLIER
|
|
487
|
+
* finalization that failed after its merge committed (see
|
|
488
|
+
* {@link recordStrandedCommit}) — their `pending` flags clear here, under
|
|
489
|
+
* the same lock, so a transient finalization failure cannot permanently
|
|
490
|
+
* exclude a committed snapshot from the prune bound.
|
|
491
|
+
*/
|
|
492
|
+
export async function pruneVersions(
|
|
493
|
+
pagePath: string,
|
|
494
|
+
config: VersioningConfig,
|
|
495
|
+
log: VersioningLogger = NOOP_LOGGER,
|
|
496
|
+
memoryDir?: string,
|
|
497
|
+
options?: { committedVersionId?: string },
|
|
498
|
+
): Promise<void> {
|
|
499
|
+
const resolvedMemoryDir = memoryDir ?? resolveMemoryDir(pagePath);
|
|
500
|
+
const rel = relPath(pagePath, resolvedMemoryDir);
|
|
501
|
+
const mPath = manifestPath(resolvedMemoryDir, config.sidecarDir, rel);
|
|
502
|
+
await withManifestLock(mPath, async (lock) => {
|
|
503
|
+
const history = await readManifest(resolvedMemoryDir, config.sidecarDir, rel);
|
|
504
|
+
const before = history.versions.length;
|
|
505
|
+
let committedCleared = false;
|
|
506
|
+
if (options?.committedVersionId !== undefined) {
|
|
507
|
+
const staged = history.versions.find(
|
|
508
|
+
(version) =>
|
|
509
|
+
version.versionId === options.committedVersionId && version.pending === true,
|
|
510
|
+
);
|
|
511
|
+
if (staged) {
|
|
512
|
+
delete staged.pending;
|
|
513
|
+
committedCleared = true;
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
// Marker ids are known-COMMITTED by construction: only a finalization
|
|
517
|
+
// failure for an already-committed merge records one, so clearing them
|
|
518
|
+
// here can never trade away a concurrent still-pending writer's entry.
|
|
519
|
+
let strandedCleared = 0;
|
|
520
|
+
for (const id of await readStrandedCommits(`${mPath}.stranded`)) {
|
|
521
|
+
const stranded = history.versions.find(
|
|
522
|
+
(version) => version.versionId === id && version.pending === true,
|
|
523
|
+
);
|
|
524
|
+
if (stranded) {
|
|
525
|
+
delete stranded.pending;
|
|
526
|
+
strandedCleared += 1;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
// Final round (A): compute the prune, PUBLISH the manifest (atomic
|
|
530
|
+
// rename), and only then unlink the pruned snapshot files best-effort —
|
|
531
|
+
// a publication failure leaves manifest and files mutually consistent.
|
|
532
|
+
const pruned = pruneExcessVersions(history, config.maxVersionsPerPage);
|
|
533
|
+
if (history.versions.length !== before || committedCleared || strandedCleared > 0) {
|
|
534
|
+
await assertManifestLockHeld(mPath, lock);
|
|
535
|
+
await writeManifest(resolvedMemoryDir, config.sidecarDir, rel, history);
|
|
536
|
+
}
|
|
537
|
+
await unlinkPublishedSnapshots(
|
|
538
|
+
mPath,
|
|
539
|
+
lock,
|
|
540
|
+
sidecarDir(resolvedMemoryDir, config.sidecarDir, rel),
|
|
541
|
+
path.extname(pagePath) || ".md",
|
|
542
|
+
pruned,
|
|
543
|
+
log,
|
|
544
|
+
);
|
|
545
|
+
if (strandedCleared > 0) {
|
|
546
|
+
log.debug(
|
|
547
|
+
`page-versioning: reconciled ${strandedCleared} stranded committed snapshot(s) for ${pagePath}`,
|
|
548
|
+
);
|
|
549
|
+
}
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
/**
|
|
554
|
+
* Record that the guarded write behind `versionId` COMMITTED but its
|
|
555
|
+
* finalizing prune failed (round N+22) — the entry's `pending` flag could
|
|
556
|
+
* not be cleared, so without this record the snapshot stayed excluded from
|
|
557
|
+
* pruning forever. The next {@link pruneVersions} for the page reconciles
|
|
558
|
+
* the id from the marker. Best-effort: a marker-write failure is logged and
|
|
559
|
+
* never thrown (the caller is already on an error path).
|
|
560
|
+
*/
|
|
561
|
+
export async function recordStrandedCommit(
|
|
562
|
+
pagePath: string,
|
|
563
|
+
config: VersioningConfig,
|
|
564
|
+
versionId: string,
|
|
565
|
+
log: VersioningLogger = NOOP_LOGGER,
|
|
566
|
+
memoryDir?: string,
|
|
567
|
+
): Promise<void> {
|
|
568
|
+
const resolvedMemoryDir = memoryDir ?? resolveMemoryDir(pagePath);
|
|
569
|
+
const rel = relPath(pagePath, resolvedMemoryDir);
|
|
570
|
+
try {
|
|
571
|
+
await appendFile(
|
|
572
|
+
`${manifestPath(resolvedMemoryDir, config.sidecarDir, rel)}.stranded`,
|
|
573
|
+
`${versionId}\n`,
|
|
574
|
+
"utf-8",
|
|
575
|
+
);
|
|
576
|
+
} catch (err) {
|
|
577
|
+
log.warn(
|
|
578
|
+
`page-versioning: could not record stranded commit ${versionId} (non-fatal): ${err instanceof Error ? err.message : String(err)}`,
|
|
579
|
+
);
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
/**
|
|
584
|
+
* Remove ONE version from the manifest and delete its snapshot file.
|
|
585
|
+
* Idempotent: a version already gone (or never present) is a no-op.
|
|
586
|
+
*
|
|
587
|
+
* Used by guarded-write callers whose staged snapshot must not survive an
|
|
588
|
+
* aborted attempt (issue #2330 round N+13 B): staging itself mutates
|
|
589
|
+
* history, and without this rollback repeated failed attempts grow history
|
|
590
|
+
* past `maxVersionsPerPage`, so a later successful commit's prune trades
|
|
591
|
+
* real rollback states for duplicate failed-attempt snapshots of a body that
|
|
592
|
+
* never changed. Never call this for a version a committed write relies on.
|
|
593
|
+
* `currentVersion` returns to the newest remaining snapshot (or `"0"` when
|
|
594
|
+
* history emptied) — never to a removed id.
|
|
595
|
+
*/
|
|
596
|
+
export async function removeVersion(
|
|
597
|
+
pagePath: string,
|
|
598
|
+
versionId: string,
|
|
599
|
+
config: VersioningConfig,
|
|
600
|
+
log: VersioningLogger = NOOP_LOGGER,
|
|
601
|
+
memoryDir?: string,
|
|
602
|
+
): Promise<void> {
|
|
603
|
+
const resolvedMemoryDir = memoryDir ?? resolveMemoryDir(pagePath);
|
|
604
|
+
const rel = relPath(pagePath, resolvedMemoryDir);
|
|
605
|
+
const mPath = manifestPath(resolvedMemoryDir, config.sidecarDir, rel);
|
|
606
|
+
await withManifestLock(mPath, async (lock) => {
|
|
607
|
+
const history = await readManifest(resolvedMemoryDir, config.sidecarDir, rel);
|
|
608
|
+
const index = history.versions.findIndex((version) => version.versionId === versionId);
|
|
609
|
+
if (index === -1) return;
|
|
610
|
+
const removed = history.versions[index];
|
|
611
|
+
history.versions.splice(index, 1);
|
|
612
|
+
history.currentVersion = history.versions.length > 0
|
|
613
|
+
? String(Math.max(...history.versions.map((version) => Number(version.versionId))))
|
|
614
|
+
: "0";
|
|
615
|
+
// Final round (A): PUBLISH the manifest (atomic rename) BEFORE touching
|
|
616
|
+
// the snapshot file. The old order unlinked first — a publication
|
|
617
|
+
// failure (transient I/O, full disk) then left the on-disk manifest
|
|
618
|
+
// referencing a now-missing snapshot: an unusable rollback entry that
|
|
619
|
+
// getVersion/revert fail on and prune never cleans. Publish-first means
|
|
620
|
+
// a failed publication leaves manifest AND file untouched; the unlink
|
|
621
|
+
// only runs once the removal is durably published.
|
|
622
|
+
await assertManifestLockHeld(mPath, lock);
|
|
623
|
+
await writeManifest(resolvedMemoryDir, config.sidecarDir, rel, history);
|
|
624
|
+
await unlinkPublishedSnapshots(
|
|
625
|
+
mPath,
|
|
626
|
+
lock,
|
|
627
|
+
sidecarDir(resolvedMemoryDir, config.sidecarDir, rel),
|
|
628
|
+
path.extname(pagePath) || ".md",
|
|
629
|
+
[removed],
|
|
630
|
+
log,
|
|
631
|
+
);
|
|
632
|
+
log.debug(`page-versioning: removed version ${versionId} for ${pagePath}`);
|
|
633
|
+
});
|
|
634
|
+
}
|
|
635
|
+
|
|
262
636
|
/**
|
|
263
637
|
* List all versions for a page.
|
|
264
638
|
*/
|
|
@@ -16,6 +16,7 @@ import { buildProcedurePersistBody, normalizeProcedureSteps, type ProcedureStep
|
|
|
16
16
|
import { clusterByKey } from "./reinforcement-core.js";
|
|
17
17
|
import { log } from "../logger.js";
|
|
18
18
|
import { composeMemoryEnvelope, STRUCTURED_ATTRIBUTE_LIMITS } from "../write-envelope.js";
|
|
19
|
+
import { isErrnoCode } from "../utils/errno.js";
|
|
19
20
|
|
|
20
21
|
/** Must match truncation on `procedure_cluster` structured attribute (dedupe + storage). */
|
|
21
22
|
const PROCEDURE_CLUSTER_ATTR_MAX = 500;
|
|
@@ -53,15 +54,6 @@ function clusterKeyHash(cluster: string): string {
|
|
|
53
54
|
return createHash("sha256").update(cluster).digest("hex");
|
|
54
55
|
}
|
|
55
56
|
|
|
56
|
-
function isErrnoCode(error: unknown, code: string): boolean {
|
|
57
|
-
return (
|
|
58
|
-
typeof error === "object" &&
|
|
59
|
-
error !== null &&
|
|
60
|
-
"code" in error &&
|
|
61
|
-
(error as { code?: unknown }).code === code
|
|
62
|
-
);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
57
|
function sleep(ms: number): Promise<void> {
|
|
66
58
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
67
59
|
}
|
|
@@ -2,6 +2,7 @@ import path from "node:path";
|
|
|
2
2
|
import { lstat, readdir, readFile, realpath } from "node:fs/promises";
|
|
3
3
|
import { RECALL_FALLBACK_DIRS } from "../utils/category-dir.js";
|
|
4
4
|
import { assertPathInsideRoot } from "../utils/path-containment.js";
|
|
5
|
+
import { isErrnoCode } from "../utils/errno.js";
|
|
5
6
|
|
|
6
7
|
export interface IndexableDocument {
|
|
7
8
|
/** Memory ID from frontmatter or filename stem */
|
|
@@ -83,7 +84,7 @@ async function scanDir(dir: string, memoryRootReal: string): Promise<IndexableDo
|
|
|
83
84
|
}
|
|
84
85
|
}
|
|
85
86
|
} catch (err) {
|
|
86
|
-
if (
|
|
87
|
+
if (isErrnoCode(err, "ENOENT")) {
|
|
87
88
|
// Optional category directories may not exist yet.
|
|
88
89
|
return docs;
|
|
89
90
|
}
|
|
@@ -92,10 +93,6 @@ async function scanDir(dir: string, memoryRootReal: string): Promise<IndexableDo
|
|
|
92
93
|
return docs;
|
|
93
94
|
}
|
|
94
95
|
|
|
95
|
-
function isNodeError(err: unknown): err is NodeJS.ErrnoException {
|
|
96
|
-
return typeof err === "object" && err !== null && "code" in err;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
96
|
/**
|
|
100
97
|
* Scan every recall category subdir of memoryDir for indexable markdown
|
|
101
98
|
* documents. The directory set is derived from `RECALL_FALLBACK_DIRS`
|
|
@@ -114,7 +111,7 @@ export async function scanMemoryDir(memoryDir: string): Promise<IndexableDocumen
|
|
|
114
111
|
try {
|
|
115
112
|
memoryRootReal = await realpath(memoryDir);
|
|
116
113
|
} catch (err) {
|
|
117
|
-
if (
|
|
114
|
+
if (isErrnoCode(err, "ENOENT")) {
|
|
118
115
|
return [];
|
|
119
116
|
}
|
|
120
117
|
throw err;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration shape for judge-mediated merge-on-write (issue #2330).
|
|
3
|
+
*
|
|
4
|
+
* Kept in its own module rather than in `types.ts`, which sits at its
|
|
5
|
+
* grandfathered size ceiling (issue #1995). This file deliberately imports
|
|
6
|
+
* nothing: `types.ts` re-exports the type and `dedup/` consumes it, so a
|
|
7
|
+
* shared leaf module is what keeps that from becoming an import cycle.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export interface SemanticMergeConfig {
|
|
11
|
+
enabled: boolean;
|
|
12
|
+
minSimilarity: number;
|
|
13
|
+
maxCandidates: number;
|
|
14
|
+
categories: readonly string[];
|
|
15
|
+
shadowMode: boolean;
|
|
16
|
+
}
|
|
@@ -6,6 +6,7 @@ import path from "node:path";
|
|
|
6
6
|
import { setTimeout as sleep } from "node:timers/promises";
|
|
7
7
|
import { StorageManager } from "./storage.js";
|
|
8
8
|
import type { MemoryFile, MemoryLink } from "./types.js";
|
|
9
|
+
import { isErrnoCode } from "./utils/errno.js";
|
|
9
10
|
|
|
10
11
|
export interface SemanticRulePromotionCandidate {
|
|
11
12
|
id: string;
|
|
@@ -79,10 +80,6 @@ function promotionLockHeartbeatMs(): number {
|
|
|
79
80
|
return testHooks?.heartbeatMs ?? PROMOTION_LOCK_HEARTBEAT_MS;
|
|
80
81
|
}
|
|
81
82
|
|
|
82
|
-
function isErrnoCode(err: unknown, code: string): boolean {
|
|
83
|
-
return typeof err === "object" && err !== null && "code" in err && (err as { code?: unknown }).code === code;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
83
|
function promotionLockDir(memoryDir: string, ruleKey: string): string {
|
|
87
84
|
const digest = createHash("sha256").update(ruleKey).digest("hex");
|
|
88
85
|
return path.join(path.resolve(memoryDir), "state", "semantic-rule-promotion-locks", `${digest}.lock`);
|
|
@@ -119,6 +119,27 @@ test("stripCitationForTemplate: custom template — strips custom citation", ()
|
|
|
119
119
|
assert.equal(result, body);
|
|
120
120
|
});
|
|
121
121
|
|
|
122
|
+
// #2330 round N+8 (P2-C): a body tagged under the DEFAULT format can later
|
|
123
|
+
// receive a CUSTOM template marker after a config change. Canonicalization
|
|
124
|
+
// must strip BOTH recognized forms in either order — the default fast path
|
|
125
|
+
// alone left the custom marker inside the hash input.
|
|
126
|
+
test("stripCitationForTemplate: mixed default + custom markers — strips both, in either order", () => {
|
|
127
|
+
const body = "Cache TTL is 30 seconds.";
|
|
128
|
+
const template = "[src:{agent}@{date}]";
|
|
129
|
+
const defaultCited = `[Source: agent=planner, session=main, ts=2026-04-10T00:00:00Z]`;
|
|
130
|
+
const customCited = `[src:scout@2026-04-11]`;
|
|
131
|
+
assert.equal(
|
|
132
|
+
stripCitationForTemplate(`${body} ${defaultCited} ${customCited}`, template),
|
|
133
|
+
body,
|
|
134
|
+
"default marker first: both forms stripped",
|
|
135
|
+
);
|
|
136
|
+
assert.equal(
|
|
137
|
+
stripCitationForTemplate(`${body} ${customCited} ${defaultCited}`, template),
|
|
138
|
+
body,
|
|
139
|
+
"custom marker first: both forms stripped",
|
|
140
|
+
);
|
|
141
|
+
});
|
|
142
|
+
|
|
122
143
|
test("stripCitationForTemplate: all-placeholder template (no literal anchors) — text returned unchanged", () => {
|
|
123
144
|
// A template with no literal prefix, suffix, or separator between
|
|
124
145
|
// placeholders cannot produce a reliable matcher. hasCitationForTemplate
|