@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
|
@@ -443,6 +443,45 @@ export function hasCitationForTemplate(text: string, template: string): boolean
|
|
|
443
443
|
return matcher.test(text);
|
|
444
444
|
}
|
|
445
445
|
|
|
446
|
+
/**
|
|
447
|
+
* Return the LAST citation marker in `text` for the given template (or the
|
|
448
|
+
* default `[Source: ...]` shape). `attachCitation` always appends at the
|
|
449
|
+
* trimmed end, so the last occurrence is the most recently attached marker —
|
|
450
|
+
* callers use this to lift a just-attached citation off a cited body and
|
|
451
|
+
* re-attach it to a derived body (the merged-target commit path). Returns
|
|
452
|
+
* null when the text carries no marker of this template (including
|
|
453
|
+
* all-placeholder templates that cannot be matched reliably).
|
|
454
|
+
*/
|
|
455
|
+
export function lastCitationMarkerForTemplate(
|
|
456
|
+
text: string,
|
|
457
|
+
template: string = DEFAULT_CITATION_FORMAT,
|
|
458
|
+
): string | null {
|
|
459
|
+
if (typeof text !== "string" || text.length === 0) return null;
|
|
460
|
+
let matcher: RegExp | null;
|
|
461
|
+
if (template === DEFAULT_CITATION_FORMAT) {
|
|
462
|
+
matcher = defaultCitationMatcher();
|
|
463
|
+
} else if (!PLACEHOLDER_REGEX.test(template)) {
|
|
464
|
+
// Fully-literal template: presence is exact inclusion (no placeholders
|
|
465
|
+
// to widen the match).
|
|
466
|
+
PLACEHOLDER_REGEX.lastIndex = 0;
|
|
467
|
+
return text.includes(template) ? template : null;
|
|
468
|
+
} else {
|
|
469
|
+
PLACEHOLDER_REGEX.lastIndex = 0;
|
|
470
|
+
matcher = templateMatcher(template);
|
|
471
|
+
}
|
|
472
|
+
if (!matcher) return null;
|
|
473
|
+
const global = new RegExp(
|
|
474
|
+
matcher.source,
|
|
475
|
+
matcher.flags.includes("g") ? matcher.flags : matcher.flags + "g",
|
|
476
|
+
);
|
|
477
|
+
let last: string | null = null;
|
|
478
|
+
for (let match = global.exec(text); match !== null; match = global.exec(text)) {
|
|
479
|
+
last = match[0];
|
|
480
|
+
if (match[0].length === 0) global.lastIndex++;
|
|
481
|
+
}
|
|
482
|
+
return last;
|
|
483
|
+
}
|
|
484
|
+
|
|
446
485
|
/**
|
|
447
486
|
* Attach an inline citation to fact text.
|
|
448
487
|
*
|
|
@@ -589,12 +628,14 @@ export function stripCitation(text: string): string {
|
|
|
589
628
|
* templates that differ from the default `[Source: ...]` pattern.
|
|
590
629
|
*
|
|
591
630
|
* Behaviour:
|
|
592
|
-
* - If the text has a **default-format** citation,
|
|
593
|
-
*
|
|
594
|
-
* -
|
|
631
|
+
* - If the text has a **default-format** citation, strips it first
|
|
632
|
+
* (always safe).
|
|
633
|
+
* - Then, if the result has a **custom-template** citation detected by
|
|
595
634
|
* `hasCitationForTemplate`, builds the template regex and removes every
|
|
596
|
-
* occurrence
|
|
597
|
-
*
|
|
635
|
+
* occurrence. BOTH passes run when a body carries both forms — a target
|
|
636
|
+
* written under the default format can carry the default marker plus a
|
|
637
|
+
* custom marker appended after a config change; returning after the
|
|
638
|
+
* default pass alone left the custom marker inside hash inputs (#2330).
|
|
598
639
|
* - All-placeholder templates (no literal prefix/suffix/separator) cannot
|
|
599
640
|
* produce a reliable matcher. `hasCitationForTemplate` already returns
|
|
600
641
|
* `false` for such templates, so this function never attempts to strip an
|
|
@@ -611,19 +652,18 @@ export function stripCitationForTemplate(
|
|
|
611
652
|
): string {
|
|
612
653
|
if (typeof text !== "string" || text.length === 0) return text;
|
|
613
654
|
|
|
614
|
-
//
|
|
615
|
-
|
|
655
|
+
// First pass: the default-format marker, if any. A second pass below still
|
|
656
|
+
// runs — a body can carry the default marker AND the custom template's
|
|
657
|
+
// marker, and canonicalization must remove every recognized form.
|
|
658
|
+
const afterDefault = hasCitation(text) ? stripCitation(text) : text;
|
|
616
659
|
|
|
617
|
-
|
|
618
|
-
// hasCitationForTemplate returns false for all-placeholder templates (no
|
|
619
|
-
// reliable matcher), so those pass through unchanged below.
|
|
620
|
-
if (!hasCitationForTemplate(text, template)) return text;
|
|
660
|
+
if (!hasCitationForTemplate(afterDefault, template)) return afterDefault;
|
|
621
661
|
|
|
622
662
|
// Build the template matcher. hasCitationForTemplate already returned true,
|
|
623
663
|
// which means templateMatcher produced a non-null result. The null branch
|
|
624
|
-
// here is a defensive fallback only —
|
|
664
|
+
// here is a defensive fallback only — the default pass already ran.
|
|
625
665
|
const matcher = templateMatcher(template);
|
|
626
|
-
if (!matcher) return
|
|
666
|
+
if (!matcher) return afterDefault;
|
|
627
667
|
|
|
628
668
|
// The matcher regex was built without the global flag; add it for exec loop.
|
|
629
669
|
const globalMatcher = new RegExp(
|
|
@@ -634,12 +674,12 @@ export function stripCitationForTemplate(
|
|
|
634
674
|
let lastIndex = 0;
|
|
635
675
|
let match: RegExpExecArray | null;
|
|
636
676
|
|
|
637
|
-
while ((match = globalMatcher.exec(
|
|
677
|
+
while ((match = globalMatcher.exec(afterDefault)) !== null) {
|
|
638
678
|
const matchEnd = match.index + match[0].length;
|
|
639
|
-
const enclosure = enclosingDelimiterRange(
|
|
679
|
+
const enclosure = enclosingDelimiterRange(afterDefault, match.index, matchEnd);
|
|
640
680
|
const removalStart = enclosure?.start ?? match.index;
|
|
641
681
|
const removalEnd = enclosure?.end ?? matchEnd;
|
|
642
|
-
const before =
|
|
682
|
+
const before = afterDefault.slice(lastIndex, removalStart).replace(/[ \t]+$/, "");
|
|
643
683
|
result += before;
|
|
644
684
|
lastIndex = removalEnd;
|
|
645
685
|
// Guard against zero-width matches causing an infinite loop.
|
|
@@ -648,7 +688,7 @@ export function stripCitationForTemplate(
|
|
|
648
688
|
}
|
|
649
689
|
}
|
|
650
690
|
|
|
651
|
-
const after =
|
|
691
|
+
const after = afterDefault.slice(lastIndex).replace(/^[ \t]+/, "");
|
|
652
692
|
if (after.length > 0) {
|
|
653
693
|
if (result.length > 0) result += " ";
|
|
654
694
|
result += after;
|
|
@@ -13,7 +13,9 @@
|
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
15
|
import assert from "node:assert/strict";
|
|
16
|
-
import { mkdtemp, rm, readFile, writeFile } from "node:fs/promises";
|
|
16
|
+
import { mkdtemp, mkdir, rm, readFile, writeFile, chmod, unlink } from "node:fs/promises";
|
|
17
|
+
import { existsSync } from "node:fs";
|
|
18
|
+
import { randomUUID } from "node:crypto";
|
|
17
19
|
import os from "node:os";
|
|
18
20
|
import path from "node:path";
|
|
19
21
|
import test from "node:test";
|
|
@@ -23,8 +25,13 @@ import {
|
|
|
23
25
|
listVersions,
|
|
24
26
|
revertToVersion,
|
|
25
27
|
getVersion,
|
|
28
|
+
pruneVersions,
|
|
29
|
+
removeVersion,
|
|
30
|
+
recordStrandedCommit,
|
|
31
|
+
sidecarKey,
|
|
26
32
|
type VersioningConfig,
|
|
27
33
|
} from "../page-versioning.js";
|
|
34
|
+
import { finalizeMergedVersionPrune } from "../orchestration/semantic-merge-commit-effects.js";
|
|
28
35
|
import { StorageManager } from "../storage.js";
|
|
29
36
|
import { resetStaticCaches } from "./harness.js";
|
|
30
37
|
|
|
@@ -137,3 +144,495 @@ test("versioning: createVersion → revertToVersion round-trip restores content"
|
|
|
137
144
|
await rm(dir, { recursive: true, force: true });
|
|
138
145
|
}
|
|
139
146
|
});
|
|
147
|
+
|
|
148
|
+
test("versioning: a final prune counts only COMMITTED snapshots — a staged writer's entry is never traded away (round N+15 B)", async () => {
|
|
149
|
+
// Two concurrent merges stage their pre-merge snapshots (deferPrune)
|
|
150
|
+
// before either compare-and-swap commits. Writer A commits and finalizes
|
|
151
|
+
// the prune while writer B is still pending: counting B's uncommitted
|
|
152
|
+
// snapshot would remove one MORE valid rollback point than the cap
|
|
153
|
+
// requires, and B's later abort would leave history short of the cap.
|
|
154
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-ver-pending-"));
|
|
155
|
+
try {
|
|
156
|
+
const pagePath = path.join(dir, "facts", "deploy-notes.md");
|
|
157
|
+
await mkdir(path.dirname(pagePath), { recursive: true });
|
|
158
|
+
const config: VersioningConfig = {
|
|
159
|
+
enabled: true,
|
|
160
|
+
maxVersionsPerPage: 3,
|
|
161
|
+
sidecarDir: ".versions",
|
|
162
|
+
};
|
|
163
|
+
for (let index = 1; index <= 3; index += 1) {
|
|
164
|
+
await writeFile(pagePath, `body v${index}`, "utf8");
|
|
165
|
+
await createVersion(pagePath, `body v${index}`, "write", config, undefined, undefined, dir);
|
|
166
|
+
}
|
|
167
|
+
const stagedA = await createVersion(pagePath, "body v3", "semantic-merge", config, undefined, undefined, dir, { deferPrune: true });
|
|
168
|
+
const stagedB = await createVersion(pagePath, "body v3", "semantic-merge", config, undefined, undefined, dir, { deferPrune: true });
|
|
169
|
+
|
|
170
|
+
// Writer A's guarded write commits and finalizes; writer B is still pending.
|
|
171
|
+
await pruneVersions(pagePath, config, undefined, dir, { committedVersionId: stagedA.versionId });
|
|
172
|
+
|
|
173
|
+
const history = await listVersions(pagePath, config, dir);
|
|
174
|
+
assert.deepEqual(
|
|
175
|
+
history.versions.map((version) => version.versionId),
|
|
176
|
+
["2", "3", stagedA.versionId, stagedB.versionId],
|
|
177
|
+
"exactly ONE committed rollback point (v1) removed; both staged entries stay",
|
|
178
|
+
);
|
|
179
|
+
assert.equal(
|
|
180
|
+
history.versions.find((version) => version.versionId === stagedB.versionId)?.pending,
|
|
181
|
+
true,
|
|
182
|
+
"writer B's staged entry is untouched and still pending",
|
|
183
|
+
);
|
|
184
|
+
assert.equal(
|
|
185
|
+
history.versions.find((version) => version.versionId === stagedA.versionId)?.pending,
|
|
186
|
+
undefined,
|
|
187
|
+
"writer A's finalize marked its own entry committed",
|
|
188
|
+
);
|
|
189
|
+
assert.equal(
|
|
190
|
+
await getVersion(pagePath, "2", config, dir),
|
|
191
|
+
"body v2",
|
|
192
|
+
"v2 survives as a rollback point",
|
|
193
|
+
);
|
|
194
|
+
await assert.rejects(
|
|
195
|
+
getVersion(pagePath, "1", config, dir),
|
|
196
|
+
/not found/,
|
|
197
|
+
"v1 is the one rollback point removed",
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
// Writer B's attempt then aborts (lost compare-and-swap): its entry
|
|
201
|
+
// leaves history without taking any committed rollback point with it.
|
|
202
|
+
await removeVersion(pagePath, stagedB.versionId, config, undefined, dir);
|
|
203
|
+
const after = await listVersions(pagePath, config, dir);
|
|
204
|
+
assert.deepEqual(
|
|
205
|
+
after.versions.map((version) => version.versionId),
|
|
206
|
+
["2", "3", stagedA.versionId],
|
|
207
|
+
);
|
|
208
|
+
} finally {
|
|
209
|
+
await rm(dir, { recursive: true, force: true });
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
test("versioning: a failed finalization is reconciled by the next successful one — history stays within maxVersionsPerPage (round N+22)", async () => {
|
|
214
|
+
// A finalization whose merge had ALREADY committed can fail transiently
|
|
215
|
+
// (manifest lock timeout, unreadable manifest). Pre-fix, the catch only
|
|
216
|
+
// logged: the staged entry stayed `pending` forever, pruneExcessVersions
|
|
217
|
+
// excludes pending entries, and every such failure stranded one
|
|
218
|
+
// unprunable snapshot beyond the cap. The next successful finalization
|
|
219
|
+
// must reconcile the stranded entry so the prune bounds history again.
|
|
220
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-ver-strand-"));
|
|
221
|
+
try {
|
|
222
|
+
const pagePath = path.join(dir, "facts", "strand-notes.md");
|
|
223
|
+
await mkdir(path.dirname(pagePath), { recursive: true });
|
|
224
|
+
const config: VersioningConfig = {
|
|
225
|
+
enabled: true,
|
|
226
|
+
maxVersionsPerPage: 3,
|
|
227
|
+
sidecarDir: ".versions",
|
|
228
|
+
};
|
|
229
|
+
for (let index = 1; index <= 3; index += 1) {
|
|
230
|
+
await writeFile(pagePath, `body v${index}`, "utf8");
|
|
231
|
+
await createVersion(pagePath, `body v${index}`, "write", config, undefined, undefined, dir);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Merge 1: stage the rollback snapshot, commit the merged body, then the
|
|
235
|
+
// finalizing prune FAILS — here via a transiently unreadable manifest
|
|
236
|
+
// (the lock-timeout production shape: pruneVersions throws, the catch is
|
|
237
|
+
// best-effort, the entry stays pending).
|
|
238
|
+
const staged1 = await createVersion(
|
|
239
|
+
pagePath,
|
|
240
|
+
"body v3",
|
|
241
|
+
"semantic-merge",
|
|
242
|
+
config,
|
|
243
|
+
undefined,
|
|
244
|
+
undefined,
|
|
245
|
+
dir,
|
|
246
|
+
{ deferPrune: true },
|
|
247
|
+
);
|
|
248
|
+
await writeFile(pagePath, "body merged 1", "utf8");
|
|
249
|
+
const manifestFile = path.join(
|
|
250
|
+
dir,
|
|
251
|
+
".versions",
|
|
252
|
+
sidecarKey(path.relative(dir, pagePath)),
|
|
253
|
+
"manifest.json",
|
|
254
|
+
);
|
|
255
|
+
const goodManifest = await readFile(manifestFile, "utf-8");
|
|
256
|
+
await writeFile(manifestFile, "{ transiently not json", "utf-8");
|
|
257
|
+
await finalizeMergedVersionPrune(pagePath, config, dir, "fact-strand", staged1.versionId);
|
|
258
|
+
await writeFile(manifestFile, goodManifest, "utf-8");
|
|
259
|
+
|
|
260
|
+
const stranded = await listVersions(pagePath, config, dir);
|
|
261
|
+
assert.equal(
|
|
262
|
+
stranded.versions.find((version) => version.versionId === staged1.versionId)?.pending,
|
|
263
|
+
true,
|
|
264
|
+
"the failed finalization left the committed merge's snapshot pending",
|
|
265
|
+
);
|
|
266
|
+
|
|
267
|
+
// Merge 2: stage, commit, and finalize SUCCESSFULLY. It must clear its
|
|
268
|
+
// own flag AND reconcile merge 1's stranded entry, so the committed set
|
|
269
|
+
// {v1, v2, v3, staged1, staged2} prunes back to the cap.
|
|
270
|
+
const staged2 = await createVersion(
|
|
271
|
+
pagePath,
|
|
272
|
+
"body merged 1",
|
|
273
|
+
"semantic-merge",
|
|
274
|
+
config,
|
|
275
|
+
undefined,
|
|
276
|
+
undefined,
|
|
277
|
+
dir,
|
|
278
|
+
{ deferPrune: true },
|
|
279
|
+
);
|
|
280
|
+
await writeFile(pagePath, "body merged 2", "utf8");
|
|
281
|
+
await finalizeMergedVersionPrune(pagePath, config, dir, "fact-strand", staged2.versionId);
|
|
282
|
+
|
|
283
|
+
const history = await listVersions(pagePath, config, dir);
|
|
284
|
+
assert.ok(
|
|
285
|
+
history.versions.length <= config.maxVersionsPerPage,
|
|
286
|
+
`total snapshot count must stay within maxVersionsPerPage=${config.maxVersionsPerPage} (got ${history.versions.length}: ${history.versions.map((v) => v.versionId).join(",")})`,
|
|
287
|
+
);
|
|
288
|
+
assert.deepEqual(
|
|
289
|
+
history.versions.map((version) => version.versionId),
|
|
290
|
+
["3", staged1.versionId, staged2.versionId],
|
|
291
|
+
"the two oldest committed rollback points are pruned; both merged snapshots stay",
|
|
292
|
+
);
|
|
293
|
+
assert.equal(
|
|
294
|
+
history.versions.filter((version) => version.pending === true).length,
|
|
295
|
+
0,
|
|
296
|
+
"no entry remains pending after the reconciling finalization",
|
|
297
|
+
);
|
|
298
|
+
} finally {
|
|
299
|
+
await rm(dir, { recursive: true, force: true });
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
test("versioning: stale stranded-commit ids — gone or already-committed entries — are no-ops (round N+22)", async () => {
|
|
304
|
+
// The marker is append-only and never rewritten, so it accumulates ids
|
|
305
|
+
// whose entry was later removed (aborted writer's id reused path) or
|
|
306
|
+
// already cleared by an earlier reconciliation. Reading them must neither
|
|
307
|
+
// throw, clear a still-pending concurrent writer's entry, nor remove any
|
|
308
|
+
// extra committed snapshot.
|
|
309
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-ver-stale-"));
|
|
310
|
+
try {
|
|
311
|
+
const pagePath = path.join(dir, "facts", "stale-notes.md");
|
|
312
|
+
await mkdir(path.dirname(pagePath), { recursive: true });
|
|
313
|
+
const config: VersioningConfig = {
|
|
314
|
+
enabled: true,
|
|
315
|
+
maxVersionsPerPage: 3,
|
|
316
|
+
sidecarDir: ".versions",
|
|
317
|
+
};
|
|
318
|
+
for (let index = 1; index <= 3; index += 1) {
|
|
319
|
+
await writeFile(pagePath, `body v${index}`, "utf8");
|
|
320
|
+
await createVersion(pagePath, `body v${index}`, "write", config, undefined, undefined, dir);
|
|
321
|
+
}
|
|
322
|
+
// A still-pending concurrent writer plus stale marker ids: one for an
|
|
323
|
+
// entry that does not exist (999) and one for an already-committed
|
|
324
|
+
// entry ("1"). Neither resolves to a clearable pending entry, and the
|
|
325
|
+
// still-pending writer's entry has NO marker record — only a writer's
|
|
326
|
+
// OWN failed finalization can record its id — so reconciliation must
|
|
327
|
+
// leave it pending and touch nothing else.
|
|
328
|
+
const pendingWriter = await createVersion(
|
|
329
|
+
pagePath,
|
|
330
|
+
"body v3",
|
|
331
|
+
"semantic-merge",
|
|
332
|
+
config,
|
|
333
|
+
undefined,
|
|
334
|
+
undefined,
|
|
335
|
+
dir,
|
|
336
|
+
{ deferPrune: true },
|
|
337
|
+
);
|
|
338
|
+
await recordStrandedCommit(pagePath, config, "999", undefined, dir);
|
|
339
|
+
await recordStrandedCommit(pagePath, config, "1", undefined, dir);
|
|
340
|
+
await recordStrandedCommit(pagePath, config, "999", undefined, dir);
|
|
341
|
+
|
|
342
|
+
await pruneVersions(pagePath, config, undefined, dir);
|
|
343
|
+
|
|
344
|
+
const history = await listVersions(pagePath, config, dir);
|
|
345
|
+
assert.equal(
|
|
346
|
+
history.versions.find((version) => version.versionId === pendingWriter.versionId)?.pending,
|
|
347
|
+
true,
|
|
348
|
+
"a still-pending writer's entry is never cleared by marker reconciliation — its id can only be recorded by its OWN failed finalization, never by a stale line",
|
|
349
|
+
);
|
|
350
|
+
assert.deepEqual(
|
|
351
|
+
history.versions.map((version) => version.versionId),
|
|
352
|
+
["1", "2", "3", pendingWriter.versionId],
|
|
353
|
+
"committed history is untouched by unresolvable marker ids",
|
|
354
|
+
);
|
|
355
|
+
} finally {
|
|
356
|
+
await rm(dir, { recursive: true, force: true });
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
// ── Final round (A): publish-before-cleanup ordering ────────────────────────
|
|
361
|
+
// An aborted merge's removeVersion, a cap prune, and a fresh stage all used to
|
|
362
|
+
// unlink/drop snapshot state BEFORE the manifest publication that records it.
|
|
363
|
+
// When the publication then failed (transient I/O, full disk), the on-disk
|
|
364
|
+
// manifest kept referencing a now-missing snapshot — a dangling reference that
|
|
365
|
+
// getVersion/revert fail on and prune never cleans. The invariant under test:
|
|
366
|
+
// after ANY publication failure, every manifest entry's snapshot stays
|
|
367
|
+
// readable, and the manifest either reflects the mutation or does not — never
|
|
368
|
+
// half of it.
|
|
369
|
+
|
|
370
|
+
test("versioning: a failed manifest publication during abort cleanup never leaves a dangling snapshot reference (final A)", async () => {
|
|
371
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-ver-dangling-"));
|
|
372
|
+
try {
|
|
373
|
+
const pagePath = path.join(dir, "facts", "dangling-notes.md");
|
|
374
|
+
await mkdir(path.dirname(pagePath), { recursive: true });
|
|
375
|
+
const config: VersioningConfig = {
|
|
376
|
+
enabled: true,
|
|
377
|
+
maxVersionsPerPage: 10,
|
|
378
|
+
sidecarDir: ".versions",
|
|
379
|
+
};
|
|
380
|
+
await writeFile(pagePath, "body v1", "utf8");
|
|
381
|
+
await createVersion(pagePath, "body v1", "write", config, undefined, undefined, dir);
|
|
382
|
+
const staged = await createVersion(
|
|
383
|
+
pagePath,
|
|
384
|
+
"body v1",
|
|
385
|
+
"semantic-merge",
|
|
386
|
+
config,
|
|
387
|
+
undefined,
|
|
388
|
+
undefined,
|
|
389
|
+
dir,
|
|
390
|
+
{ deferPrune: true },
|
|
391
|
+
);
|
|
392
|
+
await writeFile(pagePath, "body merged", "utf8");
|
|
393
|
+
|
|
394
|
+
// Transient publication failure: the manifest file itself is read-only,
|
|
395
|
+
// so a non-atomic overwrite fails while snapshot unlinks (directory
|
|
396
|
+
// permission) still succeed — the exact pre-fix dangling shape.
|
|
397
|
+
const manifestFile = path.join(
|
|
398
|
+
dir,
|
|
399
|
+
".versions",
|
|
400
|
+
sidecarKey(path.relative(dir, pagePath)),
|
|
401
|
+
"manifest.json",
|
|
402
|
+
);
|
|
403
|
+
await chmod(manifestFile, 0o444);
|
|
404
|
+
let removalCompleted = false;
|
|
405
|
+
try {
|
|
406
|
+
await removeVersion(pagePath, staged.versionId, config, undefined, dir);
|
|
407
|
+
removalCompleted = true;
|
|
408
|
+
} catch {
|
|
409
|
+
// a surfaced publication failure is the safe outcome
|
|
410
|
+
} finally {
|
|
411
|
+
await chmod(manifestFile, 0o644);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
const history = await listVersions(pagePath, config, dir);
|
|
415
|
+
const stillListed = history.versions.some(
|
|
416
|
+
(version) => version.versionId === staged.versionId,
|
|
417
|
+
);
|
|
418
|
+
assert.notEqual(
|
|
419
|
+
removalCompleted,
|
|
420
|
+
stillListed,
|
|
421
|
+
"the removal either completed (entry gone) or failed (entry stays) — never half-applied",
|
|
422
|
+
);
|
|
423
|
+
for (const version of history.versions) {
|
|
424
|
+
await assert.doesNotReject(
|
|
425
|
+
() => getVersion(pagePath, version.versionId, config, dir),
|
|
426
|
+
`snapshot ${version.versionId} listed in the manifest must stay readable (no dangling reference)`,
|
|
427
|
+
);
|
|
428
|
+
}
|
|
429
|
+
JSON.parse(await readFile(manifestFile, "utf-8"));
|
|
430
|
+
} finally {
|
|
431
|
+
await rm(dir, { recursive: true, force: true });
|
|
432
|
+
}
|
|
433
|
+
});
|
|
434
|
+
|
|
435
|
+
test("versioning: a failed manifest publication during a cap prune never leaves dangling references (final A)", async () => {
|
|
436
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-ver-prune-dangling-"));
|
|
437
|
+
try {
|
|
438
|
+
const pagePath = path.join(dir, "facts", "prune-notes.md");
|
|
439
|
+
await mkdir(path.dirname(pagePath), { recursive: true });
|
|
440
|
+
const config: VersioningConfig = {
|
|
441
|
+
enabled: true,
|
|
442
|
+
maxVersionsPerPage: 2,
|
|
443
|
+
sidecarDir: ".versions",
|
|
444
|
+
};
|
|
445
|
+
for (let index = 1; index <= 2; index += 1) {
|
|
446
|
+
await writeFile(pagePath, `body v${index}`, "utf8");
|
|
447
|
+
await createVersion(pagePath, `body v${index}`, "write", config, undefined, undefined, dir);
|
|
448
|
+
}
|
|
449
|
+
const manifestFile = path.join(
|
|
450
|
+
dir,
|
|
451
|
+
".versions",
|
|
452
|
+
sidecarKey(path.relative(dir, pagePath)),
|
|
453
|
+
"manifest.json",
|
|
454
|
+
);
|
|
455
|
+
await chmod(manifestFile, 0o444);
|
|
456
|
+
let stageCompleted = false;
|
|
457
|
+
try {
|
|
458
|
+
await writeFile(pagePath, "body v3", "utf8");
|
|
459
|
+
await createVersion(pagePath, "body v3", "write", config, undefined, undefined, dir);
|
|
460
|
+
stageCompleted = true;
|
|
461
|
+
} catch {
|
|
462
|
+
// a surfaced publication failure is the safe outcome
|
|
463
|
+
} finally {
|
|
464
|
+
await chmod(manifestFile, 0o644);
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
const history = await listVersions(pagePath, config, dir);
|
|
468
|
+
if (!stageCompleted) {
|
|
469
|
+
assert.deepEqual(
|
|
470
|
+
history.versions.map((version) => version.versionId),
|
|
471
|
+
["1", "2"],
|
|
472
|
+
"a failed stage leaves the manifest exactly as it was",
|
|
473
|
+
);
|
|
474
|
+
}
|
|
475
|
+
for (const version of history.versions) {
|
|
476
|
+
await assert.doesNotReject(
|
|
477
|
+
() => getVersion(pagePath, version.versionId, config, dir),
|
|
478
|
+
`snapshot ${version.versionId} listed in the manifest must stay readable (no dangling reference)`,
|
|
479
|
+
);
|
|
480
|
+
}
|
|
481
|
+
} finally {
|
|
482
|
+
await rm(dir, { recursive: true, force: true });
|
|
483
|
+
}
|
|
484
|
+
});
|
|
485
|
+
|
|
486
|
+
// ── Final round (B): ownership revalidation before destructive writes ───────
|
|
487
|
+
// The lock's mtime heartbeat is a timer; a section paused past the 30s stale
|
|
488
|
+
// window (CPU-bound pause, suspended process) cannot heartbeat, so a peer can
|
|
489
|
+
// break the lock and commit its own mutation. Every destructive write must
|
|
490
|
+
// revalidate ownership immediately before it lands and abort on loss — the
|
|
491
|
+
// same pattern the graph JSONL lock adopted (GraphWriteLockSection).
|
|
492
|
+
|
|
493
|
+
function fakeManifestEntries(count: number): string {
|
|
494
|
+
const versions = Array.from({ length: count }, (_, index) => ({
|
|
495
|
+
versionId: String(index + 1),
|
|
496
|
+
timestamp: "2026-08-22T00:00:00.000Z",
|
|
497
|
+
contentHash: `hash-${index + 1}`,
|
|
498
|
+
sizeBytes: 10,
|
|
499
|
+
trigger: "write",
|
|
500
|
+
}));
|
|
501
|
+
return `${JSON.stringify(
|
|
502
|
+
{ pagePath: "facts/notes.md", versions, currentVersion: String(count) },
|
|
503
|
+
null,
|
|
504
|
+
2,
|
|
505
|
+
)}\n`;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
test("versioning: removeVersion whose manifest lock was stale-broken aborts instead of clobbering the peer's committed manifest (final B)", async () => {
|
|
509
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-ver-locklost-"));
|
|
510
|
+
try {
|
|
511
|
+
const pagePath = path.join(dir, "facts", "locklost-notes.md");
|
|
512
|
+
await mkdir(path.dirname(pagePath), { recursive: true });
|
|
513
|
+
const config: VersioningConfig = {
|
|
514
|
+
enabled: true,
|
|
515
|
+
maxVersionsPerPage: 10,
|
|
516
|
+
sidecarDir: ".versions",
|
|
517
|
+
};
|
|
518
|
+
const sidecarPageDir = path.join(dir, ".versions", sidecarKey(path.relative(dir, pagePath)));
|
|
519
|
+
const manifestFile = path.join(sidecarPageDir, "manifest.json");
|
|
520
|
+
const lockPath = `${manifestFile}.lock`;
|
|
521
|
+
await mkdir(sidecarPageDir, { recursive: true });
|
|
522
|
+
// Our process's stale-but-current view: two versions.
|
|
523
|
+
await writeFile(manifestFile, fakeManifestEntries(2), "utf8");
|
|
524
|
+
await writeFile(path.join(sidecarPageDir, "1.md"), "body v1", "utf8");
|
|
525
|
+
await writeFile(path.join(sidecarPageDir, "2.md"), "body v2", "utf8");
|
|
526
|
+
|
|
527
|
+
// The peer: stale-breaks our lock mid-section, takes ownership, and
|
|
528
|
+
// commits a newer mutation (version 3) under its own lock.
|
|
529
|
+
const breakAsPeer = (async () => {
|
|
530
|
+
while (!existsSync(lockPath)) await new Promise<void>((resolve) => setImmediate(resolve));
|
|
531
|
+
await unlink(lockPath).catch(() => undefined);
|
|
532
|
+
await writeFile(lockPath, `${process.pid} peer-${randomUUID()} ${new Date().toISOString()}\n`, "utf8");
|
|
533
|
+
await writeFile(path.join(sidecarPageDir, "3.md"), "body v3", "utf8");
|
|
534
|
+
await writeFile(manifestFile, fakeManifestEntries(3), "utf8");
|
|
535
|
+
})();
|
|
536
|
+
|
|
537
|
+
let aborted = false;
|
|
538
|
+
try {
|
|
539
|
+
await removeVersion(pagePath, "2", config, undefined, dir);
|
|
540
|
+
} catch (err) {
|
|
541
|
+
aborted = err instanceof Error && /lost mid-section/.test(err.message);
|
|
542
|
+
}
|
|
543
|
+
await breakAsPeer;
|
|
544
|
+
assert.equal(aborted, true, "a removal whose lock was stale-broken must abort, not publish");
|
|
545
|
+
|
|
546
|
+
const history = await listVersions(pagePath, config, dir);
|
|
547
|
+
assert.deepEqual(
|
|
548
|
+
history.versions.map((version) => version.versionId),
|
|
549
|
+
["1", "2", "3"],
|
|
550
|
+
"the peer's committed version 3 survives — the stale writer never rewrote the manifest",
|
|
551
|
+
);
|
|
552
|
+
for (const version of history.versions) {
|
|
553
|
+
await assert.doesNotReject(
|
|
554
|
+
() => getVersion(pagePath, version.versionId, config, dir),
|
|
555
|
+
`peer-committed snapshot ${version.versionId} must stay readable`,
|
|
556
|
+
);
|
|
557
|
+
}
|
|
558
|
+
} finally {
|
|
559
|
+
await rm(dir, { recursive: true, force: true });
|
|
560
|
+
}
|
|
561
|
+
});
|
|
562
|
+
|
|
563
|
+
test("versioning: pruneVersions and createVersion whose manifest lock was stale-broken abort instead of publishing (final B)", async () => {
|
|
564
|
+
const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-ver-locklost2-"));
|
|
565
|
+
try {
|
|
566
|
+
const pagePath = path.join(dir, "facts", "locklost2-notes.md");
|
|
567
|
+
await mkdir(path.dirname(pagePath), { recursive: true });
|
|
568
|
+
const config: VersioningConfig = {
|
|
569
|
+
enabled: true,
|
|
570
|
+
maxVersionsPerPage: 2,
|
|
571
|
+
sidecarDir: ".versions",
|
|
572
|
+
};
|
|
573
|
+
const sidecarPageDir = path.join(dir, ".versions", sidecarKey(path.relative(dir, pagePath)));
|
|
574
|
+
const manifestFile = path.join(sidecarPageDir, "manifest.json");
|
|
575
|
+
const lockPath = `${manifestFile}.lock`;
|
|
576
|
+
await mkdir(sidecarPageDir, { recursive: true });
|
|
577
|
+
await writeFile(manifestFile, fakeManifestEntries(3), "utf8");
|
|
578
|
+
for (let index = 1; index <= 3; index += 1) {
|
|
579
|
+
await writeFile(path.join(sidecarPageDir, `${index}.md`), `body v${index}`, "utf8");
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
const breakAsPeer = (async () => {
|
|
583
|
+
while (!existsSync(lockPath)) await new Promise<void>((resolve) => setImmediate(resolve));
|
|
584
|
+
await unlink(lockPath).catch(() => undefined);
|
|
585
|
+
await writeFile(lockPath, `${process.pid} peer-${randomUUID()} ${new Date().toISOString()}\n`, "utf8");
|
|
586
|
+
})();
|
|
587
|
+
|
|
588
|
+
// The prune (over-cap by one) must refuse to publish on a broken lock.
|
|
589
|
+
let pruneAborted = false;
|
|
590
|
+
try {
|
|
591
|
+
await pruneVersions(pagePath, config, undefined, dir);
|
|
592
|
+
} catch (err) {
|
|
593
|
+
pruneAborted = err instanceof Error && /lost mid-section/.test(err.message);
|
|
594
|
+
}
|
|
595
|
+
await breakAsPeer;
|
|
596
|
+
assert.equal(pruneAborted, true, "a prune whose lock was stale-broken must abort, not publish");
|
|
597
|
+
|
|
598
|
+
let history = await listVersions(pagePath, config, dir);
|
|
599
|
+
assert.deepEqual(
|
|
600
|
+
history.versions.map((version) => version.versionId),
|
|
601
|
+
["1", "2", "3"],
|
|
602
|
+
"the peer's manifest is untouched by the refused prune",
|
|
603
|
+
);
|
|
604
|
+
// The fake peer never releases its lock; clear it so the stage below
|
|
605
|
+
// acquires fresh and the SECOND break lands mid-section, not as a busy
|
|
606
|
+
// 10s acquire timeout against a live-looking peer.
|
|
607
|
+
await unlink(lockPath).catch(() => undefined);
|
|
608
|
+
|
|
609
|
+
// Same contract for staging a new version.
|
|
610
|
+
const breakAsPeer2 = (async () => {
|
|
611
|
+
while (!existsSync(lockPath)) await new Promise<void>((resolve) => setImmediate(resolve));
|
|
612
|
+
await unlink(lockPath).catch(() => undefined);
|
|
613
|
+
await writeFile(lockPath, `${process.pid} peer-${randomUUID()} ${new Date().toISOString()}\n`, "utf8");
|
|
614
|
+
})();
|
|
615
|
+
let stageAborted = false;
|
|
616
|
+
try {
|
|
617
|
+
await createVersion(pagePath, "body v4", "write", config, undefined, undefined, dir);
|
|
618
|
+
} catch (err) {
|
|
619
|
+
stageAborted = err instanceof Error && /lost mid-section/.test(err.message);
|
|
620
|
+
}
|
|
621
|
+
await breakAsPeer2;
|
|
622
|
+
assert.equal(stageAborted, true, "a stage whose lock was stale-broken must abort, not write");
|
|
623
|
+
|
|
624
|
+
history = await listVersions(pagePath, config, dir);
|
|
625
|
+
assert.deepEqual(
|
|
626
|
+
history.versions.map((version) => version.versionId),
|
|
627
|
+
["1", "2", "3"],
|
|
628
|
+
"the peer's manifest is untouched by the refused stage",
|
|
629
|
+
);
|
|
630
|
+
assert.equal(
|
|
631
|
+
existsSync(path.join(sidecarPageDir, "4.md")),
|
|
632
|
+
false,
|
|
633
|
+
"the refused stage must not leave a snapshot file behind",
|
|
634
|
+
);
|
|
635
|
+
} finally {
|
|
636
|
+
await rm(dir, { recursive: true, force: true });
|
|
637
|
+
}
|
|
638
|
+
});
|