@remnic/core 9.69.102 → 9.69.104
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/access-admin-ops-surface.js +53 -52
- package/dist/access-authorization-probe.js +54 -53
- package/dist/access-boundary.js +53 -52
- package/dist/access-cli.js +153 -150
- package/dist/access-cli.js.map +1 -1
- package/dist/access-extraction-force-flush.js +53 -52
- package/dist/access-http-briefing.js +54 -53
- package/dist/access-http-query.js +55 -54
- package/dist/access-http.js +77 -76
- package/dist/access-identity-continuity-surface.js +53 -52
- package/dist/access-lcm-surface.js +53 -52
- package/dist/access-mcp.js +66 -65
- package/dist/access-namespace-preflight.js +53 -52
- package/dist/access-observe-write-category.js +9 -9
- package/dist/access-observe-write-surface.js +53 -52
- package/dist/access-offline-manifest.js +6 -6
- package/dist/access-operations-batch.js +57 -56
- package/dist/access-operations.js +64 -63
- package/dist/access-recall-concurrency.js +53 -52
- package/dist/access-recall-response.js +53 -52
- package/dist/access-recall-surface.js +53 -52
- package/dist/access-schema.js +8 -8
- package/dist/access-service.js +53 -52
- package/dist/access-surface-catalog.js +55 -54
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/active-recall.js +21 -20
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/registry.js +2 -2
- package/dist/briefing.js +14 -13
- package/dist/buffer.js +5 -5
- package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
- package/dist/{capsule-merge-ZCXUPLNJ.js → capsule-merge-42GJGDUC.js} +4 -3
- package/dist/{capsule-merge-ZCXUPLNJ.js.map → capsule-merge-42GJGDUC.js.map} +1 -1
- package/dist/causal-behavior.js +2 -2
- package/dist/causal-chain.js +2 -2
- package/dist/causal-consolidation.js +17 -16
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-retrieval.js +2 -2
- package/dist/causal-trajectory-graph.js +3 -3
- package/dist/causal-trajectory.js +1 -1
- package/dist/{chunk-47LTKAGL.js → chunk-2COXDQ6C.js} +21 -6
- package/dist/chunk-2COXDQ6C.js.map +1 -0
- package/dist/{chunk-IOYY6ROU.js → chunk-2MMBJE53.js} +7 -7
- package/dist/{chunk-QSXEQPC4.js → chunk-2OFDC3AK.js} +2 -2
- package/dist/{chunk-4MP2Q2EI.js → chunk-2TCNEJ36.js} +4 -4
- package/dist/{chunk-5FAGCOZD.js → chunk-2U3R3DDH.js} +9 -9
- package/dist/{chunk-SCXURCVT.js → chunk-2UPTRDGM.js} +3 -3
- package/dist/{chunk-XVZA6VXC.js → chunk-3SL52JKD.js} +4 -4
- package/dist/{chunk-SBOCJ47I.js → chunk-5R4YPRAR.js} +19 -6
- package/dist/chunk-5R4YPRAR.js.map +1 -0
- package/dist/{chunk-ANPRNTPT.js → chunk-63LFM77Z.js} +15 -2
- package/dist/chunk-63LFM77Z.js.map +1 -0
- package/dist/{chunk-DINOVGA5.js → chunk-6WRHNA4I.js} +48 -48
- package/dist/chunk-6WRHNA4I.js.map +1 -0
- package/dist/{chunk-DSPWVQZ6.js → chunk-73R4HOOK.js} +3 -3
- package/dist/chunk-7CT3AI52.js +84 -0
- package/dist/chunk-7CT3AI52.js.map +1 -0
- package/dist/{chunk-PHBH74Q6.js → chunk-7NBUE5VY.js} +2 -2
- package/dist/{chunk-S533KGX6.js → chunk-7X7A7KVN.js} +2 -2
- package/dist/{chunk-XEATJBNB.js → chunk-7YQR6XHY.js} +71 -71
- package/dist/{chunk-F5MINS3R.js → chunk-A6WNTVA7.js} +3 -3
- package/dist/{chunk-F5MINS3R.js.map → chunk-A6WNTVA7.js.map} +1 -1
- package/dist/{chunk-533RHNHB.js → chunk-ATFFWIKL.js} +2 -2
- package/dist/{chunk-QCYUIZK2.js → chunk-AU43D3IT.js} +7 -7
- package/dist/{chunk-JZ66PN72.js → chunk-AWSP3WNM.js} +2 -2
- package/dist/{chunk-IY47KPML.js → chunk-B3OFQP5Y.js} +6 -6
- package/dist/{chunk-4DXNOVNW.js → chunk-B454SHPU.js} +6 -6
- package/dist/{chunk-3LMOJXZR.js → chunk-BKVCTTEN.js} +2 -2
- package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
- package/dist/{chunk-CZN53OT5.js → chunk-CGBE3N7T.js} +2 -2
- package/dist/{chunk-HWLIMQE2.js → chunk-CHDGJJV6.js} +2 -2
- package/dist/{chunk-UYPQOASU.js → chunk-CNBGAFDY.js} +2 -2
- package/dist/{chunk-JTC3PBNH.js → chunk-DB6XFMOF.js} +3 -3
- package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
- package/dist/{chunk-UFIZRMQZ.js → chunk-E4XLFYHV.js} +61 -29
- package/dist/chunk-E4XLFYHV.js.map +1 -0
- package/dist/{chunk-4OXXDL3X.js → chunk-EWWK65CI.js} +2 -2
- package/dist/{chunk-DFPG47ET.js → chunk-EZ3F4YIN.js} +11 -11
- package/dist/{chunk-V3I4NLZP.js → chunk-FYX2LXIX.js} +2 -2
- package/dist/{chunk-PNVOKGAX.js → chunk-G5I5ZT6O.js} +2 -2
- package/dist/{chunk-7Z2UKRNJ.js → chunk-GQ6ZF4LD.js} +2 -2
- package/dist/{chunk-PEZAHDDU.js → chunk-GZ2KV2RO.js} +5 -5
- package/dist/chunk-H6Z3RNW3.js +330 -0
- package/dist/chunk-H6Z3RNW3.js.map +1 -0
- package/dist/{chunk-645WOU5I.js → chunk-H7BZBSP6.js} +4 -4
- package/dist/{chunk-AXHU56C3.js → chunk-HWGFTTPS.js} +2 -2
- package/dist/{chunk-2SGLMP2E.js → chunk-IDSZNHIP.js} +2 -2
- package/dist/{chunk-LO4UKPKX.js → chunk-IFCKHPY4.js} +2 -2
- package/dist/{chunk-ZHXSOMYH.js → chunk-IOMLGJHG.js} +4 -4
- package/dist/{chunk-YRULQW5J.js → chunk-ISX7GVZE.js} +4 -4
- package/dist/{chunk-5PHZSD75.js → chunk-J3ZJBX7I.js} +2 -2
- package/dist/{chunk-X5TAWDRO.js → chunk-JC7QQ2DJ.js} +2 -2
- package/dist/{chunk-RFQT7IZO.js → chunk-JRDL3FGM.js} +3 -3
- package/dist/{chunk-OGZC2WUX.js → chunk-JWFTPRYD.js} +2 -2
- package/dist/{chunk-7OA4JWP5.js → chunk-KFHEZJQZ.js} +2 -2
- package/dist/{chunk-P3WRFSYF.js → chunk-KMN2JE4D.js} +2 -2
- package/dist/{chunk-GNBZB43J.js → chunk-KV7LFOPF.js} +2 -2
- package/dist/{chunk-L6YCGS7I.js → chunk-KYUVFCT2.js} +2 -2
- package/dist/{chunk-5BVL2XUD.js → chunk-LHDSCWDK.js} +17 -17
- package/dist/{chunk-SF7CWSR6.js → chunk-LXJZUNLX.js} +2 -2
- package/dist/{chunk-XCB6QDL6.js → chunk-M5GVCJSJ.js} +8 -2
- package/dist/chunk-M5GVCJSJ.js.map +1 -0
- package/dist/{chunk-DGS34QSY.js → chunk-MFZACYZ6.js} +2 -2
- package/dist/{chunk-PYYQCHJC.js → chunk-MZOQ26LH.js} +2 -2
- package/dist/{chunk-R2TVWQLR.js → chunk-NT2Q6AHC.js} +2 -2
- package/dist/{chunk-ABGM2BN4.js → chunk-O43AAJFQ.js} +2 -2
- package/dist/{chunk-G3BW6SDE.js → chunk-OFGTRDWX.js} +3 -3
- package/dist/{chunk-6Z263Z3E.js → chunk-OWV6LKNZ.js} +2 -2
- package/dist/{chunk-HIHN4XHL.js → chunk-PQ7EB5AD.js} +3 -3
- package/dist/{chunk-VVYLVE6R.js → chunk-PQKZLBCJ.js} +1 -1
- package/dist/{chunk-OFFW73OZ.js → chunk-PRNR47DI.js} +2 -2
- package/dist/{chunk-UL7KDVLC.js → chunk-PZ2QQULY.js} +11 -11
- package/dist/{chunk-55NZVUNI.js → chunk-QAIVTLL2.js} +3 -3
- package/dist/{chunk-M7T2NKET.js → chunk-QKCGOECM.js} +2 -2
- package/dist/{chunk-ARY6O3JN.js → chunk-QUNCLKHM.js} +2 -2
- package/dist/{chunk-Z3O53WZR.js → chunk-QWUJWBZ5.js} +2 -2
- package/dist/{chunk-RZXFXKWY.js → chunk-QX3K3INR.js} +2 -2
- package/dist/{chunk-HFOY2SBG.js → chunk-RYN4AIRM.js} +7 -5
- package/dist/chunk-RYN4AIRM.js.map +1 -0
- package/dist/{chunk-4LNCLZNK.js → chunk-S2GR3T7W.js} +2 -2
- package/dist/{chunk-VPOAMPDD.js → chunk-SFDBLCZV.js} +59 -59
- package/dist/{chunk-2IWBHZ3H.js → chunk-SIGDETMB.js} +2 -2
- package/dist/chunk-SP4DB6SX.js +19 -0
- package/dist/chunk-SP4DB6SX.js.map +1 -0
- package/dist/{chunk-DBWNTLLI.js → chunk-STQC2FYQ.js} +6 -6
- package/dist/{chunk-S5R77WHV.js → chunk-SWXPR5SE.js} +2 -2
- package/dist/{chunk-3DNTFZAT.js → chunk-T32YYUT2.js} +2 -2
- package/dist/{chunk-W5JQSVPZ.js → chunk-T6RQNV7E.js} +2 -2
- package/dist/{chunk-O23QMYN4.js → chunk-TRN56SPQ.js} +2 -2
- package/dist/{chunk-NM3BT2OH.js → chunk-TXTRHF3B.js} +2 -2
- package/dist/{chunk-7AUIGOH4.js → chunk-VDVHIRCK.js} +2 -2
- package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
- package/dist/{chunk-ZGYLPCWN.js → chunk-VO2BNAA2.js} +3 -3
- package/dist/{chunk-WVEECBCG.js → chunk-VV2MVHCJ.js} +2 -2
- package/dist/{chunk-HVDEKJJR.js → chunk-VYIBRCVW.js} +70 -61
- package/dist/chunk-VYIBRCVW.js.map +1 -0
- package/dist/{chunk-B3O3IRZN.js → chunk-VZBW6CDG.js} +1 -1
- package/dist/{chunk-JPKK466T.js → chunk-W5XWHTDO.js} +2 -2
- package/dist/{chunk-CYG3K2T2.js → chunk-WR66CTVU.js} +6 -6
- package/dist/{chunk-JNAOTN7B.js → chunk-XLWMNDQR.js} +4 -4
- package/dist/chunk-XLWMNDQR.js.map +1 -0
- package/dist/{chunk-RP7RSENW.js → chunk-XQWKB6PY.js} +2 -2
- package/dist/{chunk-64S6X4IU.js → chunk-XTN54NML.js} +4 -4
- package/dist/{chunk-UCPGOUDZ.js → chunk-Y57GJDG5.js} +108 -3
- package/dist/chunk-Y57GJDG5.js.map +1 -0
- package/dist/{chunk-KYLYXGKD.js → chunk-YI6XIFQV.js} +2 -2
- package/dist/{chunk-EZ25VE3G.js → chunk-YNDLCWXS.js} +4 -4
- package/dist/{chunk-Y7427SL7.js → chunk-Z6EZCN6Z.js} +10 -10
- package/dist/{chunk-5K2ALMSZ.js → chunk-ZRUC7FD3.js} +2 -2
- package/dist/cli.js +103 -102
- package/dist/coding/export-okf-codegraph.js +13 -12
- package/dist/coding/export-okf-codegraph.js.map +1 -1
- package/dist/coding/pre-action-gate.js +2 -2
- package/dist/compounding/engine.js +14 -13
- package/dist/config.js +21 -20
- package/dist/connectors/codex-materialize-runner.js +14 -13
- package/dist/connectors/index.js +14 -13
- package/dist/consolidation-provenance-check.js +4 -3
- package/dist/consolidation-undo.js +3 -2
- package/dist/consolidation-undo.js.map +1 -1
- package/dist/contradiction/index.js +3 -2
- package/dist/convergence-refresh.js +16 -15
- package/dist/corpus-watermark.js +16 -15
- package/dist/dashboard-runtime.js +2 -2
- package/dist/deep-recall-http-glue.js +9 -9
- package/dist/deep-recall.js +2 -2
- package/dist/embedding-fallback.d.ts +2 -1
- package/dist/embedding-fallback.d.ts.map +1 -1
- package/dist/embedding-fallback.js +2 -2
- package/dist/embedding-index-storage.d.ts +28 -1
- package/dist/embedding-index-storage.d.ts.map +1 -1
- package/dist/embedding-index-storage.js +1 -1
- package/dist/entity-mention-carry.d.ts +16 -0
- package/dist/entity-mention-carry.d.ts.map +1 -0
- package/dist/entity-mention-carry.js +8 -0
- package/dist/entity-mention-epoch.d.ts +22 -0
- package/dist/entity-mention-epoch.d.ts.map +1 -0
- package/dist/entity-mention-epoch.js +8 -0
- package/dist/entity-mention-index-cache.d.ts +28 -0
- package/dist/entity-mention-index-cache.d.ts.map +1 -0
- package/dist/entity-mention-index-cache.js +29 -0
- package/dist/entity-mention-index-cache.js.map +1 -0
- package/dist/entity-retrieval.d.ts.map +1 -1
- package/dist/entity-retrieval.js +18 -15
- package/dist/event-order-recall.js +2 -2
- package/dist/external-wiki-access.js +54 -53
- package/dist/extraction-span-materialize.js +2 -2
- package/dist/extraction.js +21 -20
- package/dist/{graph-edge-decay-MKIRZ762.js → graph-edge-decay-PVKDKLQK.js} +6 -6
- package/dist/graph-edge-decay-PVKDKLQK.js.map +1 -0
- package/dist/graph-jsonl.js +4 -4
- package/dist/graph-snapshot.js +4 -4
- package/dist/graph.js +5 -5
- package/dist/harmonic-retrieval.js +1 -1
- package/dist/index.js +187 -184
- package/dist/lcm/engine.js +4 -4
- package/dist/lcm/index.js +13 -13
- package/dist/location/index.js +16 -15
- package/dist/maintenance/memory-governance.js +14 -13
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +14 -13
- package/dist/maintenance/rebuild-memory-projection.js +15 -14
- package/dist/memory-browse-operations.js +54 -53
- package/dist/memory-browse.js +5 -5
- package/dist/memory-corpus-version.d.ts +8 -3
- package/dist/memory-corpus-version.d.ts.map +1 -1
- package/dist/memory-corpus-version.js +2 -1
- package/dist/namespaces/migrate.js +15 -14
- package/dist/namespaces/search.js +7 -7
- package/dist/namespaces/storage.js +14 -13
- package/dist/offline-sync-changeset-generations.js +4 -4
- package/dist/offline-sync-embedding-generation.js +3 -3
- package/dist/offline-sync-exclude-globs.d.ts +8 -0
- package/dist/offline-sync-exclude-globs.d.ts.map +1 -1
- package/dist/offline-sync-exclude-globs.js +3 -1
- package/dist/offline-sync-snapshot-stream.js +6 -6
- package/dist/offline-sync.d.ts.map +1 -1
- package/dist/offline-sync.js +9 -9
- package/dist/operator-doctor-corpus.js +17 -16
- package/dist/operator-toolkit.js +34 -33
- package/dist/orchestration/maintenance.js +22 -21
- package/dist/orchestrator.js +153 -150
- package/dist/page-versioning.js +3 -2
- package/dist/preferences/preference-drift.d.ts.map +1 -1
- package/dist/procedural/library-maintenance.d.ts.map +1 -1
- package/dist/qmd.js +4 -4
- package/dist/recall-navigation-operations.js +54 -53
- package/dist/recall-navigation.js +53 -52
- package/dist/recall-state-view-admission.js +5 -5
- package/dist/recall-why-service.js +5 -5
- package/dist/{resolution-BROE3TRO.js → resolution-RSG4HZTL.js} +4 -3
- package/dist/resolution-RSG4HZTL.js.map +1 -0
- package/dist/resume-bundles.js +22 -21
- package/dist/search/factory.js +6 -6
- package/dist/search/index.js +12 -12
- package/dist/semantic-consolidation.js +15 -14
- package/dist/semantic-rule-promotion.js +14 -13
- package/dist/semantic-rule-verifier.js +14 -13
- package/dist/source-agent-qualifier.js +17 -16
- package/dist/standup/build.js +14 -13
- package/dist/storage/entity-mention-frontmatter-hold.d.ts +14 -0
- package/dist/storage/entity-mention-frontmatter-hold.d.ts.map +1 -0
- package/dist/storage.d.ts +13 -9
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +13 -12
- package/dist/support-passport/index.js +56 -55
- package/dist/transfer/backup.js +2 -2
- package/dist/transfer/capsule-export.js +2 -2
- package/dist/transfer/capsule-import.js +5 -4
- package/dist/transfer/export-okf.js +14 -13
- package/dist/verified-recall.js +14 -13
- package/dist/who-knows-cli.js +15 -14
- package/dist/who-knows.js +14 -13
- package/package.json +2 -2
- package/src/embedding-fallback-cross-process.test.ts +533 -0
- package/src/embedding-fallback.ts +19 -7
- package/src/embedding-index-storage.test.ts +482 -2
- package/src/embedding-index-storage.ts +131 -2
- package/src/entity-mention-carry.ts +31 -0
- package/src/entity-mention-epoch.ts +120 -0
- package/src/entity-mention-index-cache.ts +443 -0
- package/src/entity-retrieval.ts +72 -71
- package/src/maintenance/rebuild-memory-projection.ts +1 -1
- package/src/memory-corpus-version.ts +13 -3
- package/src/offline-sync-exclude-globs.ts +23 -0
- package/src/offline-sync.test.ts +325 -0
- package/src/offline-sync.ts +17 -1
- package/src/preferences/preference-drift.ts +5 -3
- package/src/procedural/library-maintenance.ts +4 -3
- package/src/semantic-rule-promotion.ts +1 -1
- package/src/storage/entity-mention-frontmatter-hold.ts +44 -0
- package/src/storage.ts +40 -38
- package/dist/chunk-47LTKAGL.js.map +0 -1
- package/dist/chunk-ANPRNTPT.js.map +0 -1
- package/dist/chunk-DINOVGA5.js.map +0 -1
- package/dist/chunk-HFOY2SBG.js.map +0 -1
- package/dist/chunk-HVDEKJJR.js.map +0 -1
- package/dist/chunk-JNAOTN7B.js.map +0 -1
- package/dist/chunk-SBOCJ47I.js.map +0 -1
- package/dist/chunk-UCPGOUDZ.js.map +0 -1
- package/dist/chunk-UFIZRMQZ.js.map +0 -1
- package/dist/chunk-XCB6QDL6.js.map +0 -1
- /package/dist/{capsule-crypto-7FJQINUR.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
- /package/dist/{chunk-IOYY6ROU.js.map → chunk-2MMBJE53.js.map} +0 -0
- /package/dist/{chunk-QSXEQPC4.js.map → chunk-2OFDC3AK.js.map} +0 -0
- /package/dist/{chunk-4MP2Q2EI.js.map → chunk-2TCNEJ36.js.map} +0 -0
- /package/dist/{chunk-5FAGCOZD.js.map → chunk-2U3R3DDH.js.map} +0 -0
- /package/dist/{chunk-SCXURCVT.js.map → chunk-2UPTRDGM.js.map} +0 -0
- /package/dist/{chunk-XVZA6VXC.js.map → chunk-3SL52JKD.js.map} +0 -0
- /package/dist/{chunk-DSPWVQZ6.js.map → chunk-73R4HOOK.js.map} +0 -0
- /package/dist/{chunk-PHBH74Q6.js.map → chunk-7NBUE5VY.js.map} +0 -0
- /package/dist/{chunk-S533KGX6.js.map → chunk-7X7A7KVN.js.map} +0 -0
- /package/dist/{chunk-XEATJBNB.js.map → chunk-7YQR6XHY.js.map} +0 -0
- /package/dist/{chunk-533RHNHB.js.map → chunk-ATFFWIKL.js.map} +0 -0
- /package/dist/{chunk-QCYUIZK2.js.map → chunk-AU43D3IT.js.map} +0 -0
- /package/dist/{chunk-JZ66PN72.js.map → chunk-AWSP3WNM.js.map} +0 -0
- /package/dist/{chunk-IY47KPML.js.map → chunk-B3OFQP5Y.js.map} +0 -0
- /package/dist/{chunk-4DXNOVNW.js.map → chunk-B454SHPU.js.map} +0 -0
- /package/dist/{chunk-3LMOJXZR.js.map → chunk-BKVCTTEN.js.map} +0 -0
- /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
- /package/dist/{chunk-CZN53OT5.js.map → chunk-CGBE3N7T.js.map} +0 -0
- /package/dist/{chunk-HWLIMQE2.js.map → chunk-CHDGJJV6.js.map} +0 -0
- /package/dist/{chunk-UYPQOASU.js.map → chunk-CNBGAFDY.js.map} +0 -0
- /package/dist/{chunk-JTC3PBNH.js.map → chunk-DB6XFMOF.js.map} +0 -0
- /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
- /package/dist/{chunk-4OXXDL3X.js.map → chunk-EWWK65CI.js.map} +0 -0
- /package/dist/{chunk-DFPG47ET.js.map → chunk-EZ3F4YIN.js.map} +0 -0
- /package/dist/{chunk-V3I4NLZP.js.map → chunk-FYX2LXIX.js.map} +0 -0
- /package/dist/{chunk-PNVOKGAX.js.map → chunk-G5I5ZT6O.js.map} +0 -0
- /package/dist/{chunk-7Z2UKRNJ.js.map → chunk-GQ6ZF4LD.js.map} +0 -0
- /package/dist/{chunk-PEZAHDDU.js.map → chunk-GZ2KV2RO.js.map} +0 -0
- /package/dist/{chunk-645WOU5I.js.map → chunk-H7BZBSP6.js.map} +0 -0
- /package/dist/{chunk-AXHU56C3.js.map → chunk-HWGFTTPS.js.map} +0 -0
- /package/dist/{chunk-2SGLMP2E.js.map → chunk-IDSZNHIP.js.map} +0 -0
- /package/dist/{chunk-LO4UKPKX.js.map → chunk-IFCKHPY4.js.map} +0 -0
- /package/dist/{chunk-ZHXSOMYH.js.map → chunk-IOMLGJHG.js.map} +0 -0
- /package/dist/{chunk-YRULQW5J.js.map → chunk-ISX7GVZE.js.map} +0 -0
- /package/dist/{chunk-5PHZSD75.js.map → chunk-J3ZJBX7I.js.map} +0 -0
- /package/dist/{chunk-X5TAWDRO.js.map → chunk-JC7QQ2DJ.js.map} +0 -0
- /package/dist/{chunk-RFQT7IZO.js.map → chunk-JRDL3FGM.js.map} +0 -0
- /package/dist/{chunk-OGZC2WUX.js.map → chunk-JWFTPRYD.js.map} +0 -0
- /package/dist/{chunk-7OA4JWP5.js.map → chunk-KFHEZJQZ.js.map} +0 -0
- /package/dist/{chunk-P3WRFSYF.js.map → chunk-KMN2JE4D.js.map} +0 -0
- /package/dist/{chunk-GNBZB43J.js.map → chunk-KV7LFOPF.js.map} +0 -0
- /package/dist/{chunk-L6YCGS7I.js.map → chunk-KYUVFCT2.js.map} +0 -0
- /package/dist/{chunk-5BVL2XUD.js.map → chunk-LHDSCWDK.js.map} +0 -0
- /package/dist/{chunk-SF7CWSR6.js.map → chunk-LXJZUNLX.js.map} +0 -0
- /package/dist/{chunk-DGS34QSY.js.map → chunk-MFZACYZ6.js.map} +0 -0
- /package/dist/{chunk-PYYQCHJC.js.map → chunk-MZOQ26LH.js.map} +0 -0
- /package/dist/{chunk-R2TVWQLR.js.map → chunk-NT2Q6AHC.js.map} +0 -0
- /package/dist/{chunk-ABGM2BN4.js.map → chunk-O43AAJFQ.js.map} +0 -0
- /package/dist/{chunk-G3BW6SDE.js.map → chunk-OFGTRDWX.js.map} +0 -0
- /package/dist/{chunk-6Z263Z3E.js.map → chunk-OWV6LKNZ.js.map} +0 -0
- /package/dist/{chunk-HIHN4XHL.js.map → chunk-PQ7EB5AD.js.map} +0 -0
- /package/dist/{chunk-VVYLVE6R.js.map → chunk-PQKZLBCJ.js.map} +0 -0
- /package/dist/{chunk-OFFW73OZ.js.map → chunk-PRNR47DI.js.map} +0 -0
- /package/dist/{chunk-UL7KDVLC.js.map → chunk-PZ2QQULY.js.map} +0 -0
- /package/dist/{chunk-55NZVUNI.js.map → chunk-QAIVTLL2.js.map} +0 -0
- /package/dist/{chunk-M7T2NKET.js.map → chunk-QKCGOECM.js.map} +0 -0
- /package/dist/{chunk-ARY6O3JN.js.map → chunk-QUNCLKHM.js.map} +0 -0
- /package/dist/{chunk-Z3O53WZR.js.map → chunk-QWUJWBZ5.js.map} +0 -0
- /package/dist/{chunk-RZXFXKWY.js.map → chunk-QX3K3INR.js.map} +0 -0
- /package/dist/{chunk-4LNCLZNK.js.map → chunk-S2GR3T7W.js.map} +0 -0
- /package/dist/{chunk-VPOAMPDD.js.map → chunk-SFDBLCZV.js.map} +0 -0
- /package/dist/{chunk-2IWBHZ3H.js.map → chunk-SIGDETMB.js.map} +0 -0
- /package/dist/{chunk-DBWNTLLI.js.map → chunk-STQC2FYQ.js.map} +0 -0
- /package/dist/{chunk-S5R77WHV.js.map → chunk-SWXPR5SE.js.map} +0 -0
- /package/dist/{chunk-3DNTFZAT.js.map → chunk-T32YYUT2.js.map} +0 -0
- /package/dist/{chunk-W5JQSVPZ.js.map → chunk-T6RQNV7E.js.map} +0 -0
- /package/dist/{chunk-O23QMYN4.js.map → chunk-TRN56SPQ.js.map} +0 -0
- /package/dist/{chunk-NM3BT2OH.js.map → chunk-TXTRHF3B.js.map} +0 -0
- /package/dist/{chunk-7AUIGOH4.js.map → chunk-VDVHIRCK.js.map} +0 -0
- /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
- /package/dist/{chunk-ZGYLPCWN.js.map → chunk-VO2BNAA2.js.map} +0 -0
- /package/dist/{chunk-WVEECBCG.js.map → chunk-VV2MVHCJ.js.map} +0 -0
- /package/dist/{chunk-B3O3IRZN.js.map → chunk-VZBW6CDG.js.map} +0 -0
- /package/dist/{chunk-JPKK466T.js.map → chunk-W5XWHTDO.js.map} +0 -0
- /package/dist/{chunk-CYG3K2T2.js.map → chunk-WR66CTVU.js.map} +0 -0
- /package/dist/{chunk-RP7RSENW.js.map → chunk-XQWKB6PY.js.map} +0 -0
- /package/dist/{chunk-64S6X4IU.js.map → chunk-XTN54NML.js.map} +0 -0
- /package/dist/{chunk-KYLYXGKD.js.map → chunk-YI6XIFQV.js.map} +0 -0
- /package/dist/{chunk-EZ25VE3G.js.map → chunk-YNDLCWXS.js.map} +0 -0
- /package/dist/{chunk-Y7427SL7.js.map → chunk-Z6EZCN6Z.js.map} +0 -0
- /package/dist/{chunk-5K2ALMSZ.js.map → chunk-ZRUC7FD3.js.map} +0 -0
- /package/dist/{graph-edge-decay-MKIRZ762.js.map → entity-mention-carry.js.map} +0 -0
- /package/dist/{resolution-BROE3TRO.js.map → entity-mention-epoch.js.map} +0 -0
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* caching or provider logic (that lives in `embedding-fallback.ts`).
|
|
15
15
|
*/
|
|
16
16
|
import path from "node:path";
|
|
17
|
+
import { randomUUID } from "node:crypto";
|
|
17
18
|
import { constants as bufferConstants } from "node:buffer";
|
|
18
19
|
import { lstat, mkdir, mkdtemp, realpath, readFile, readdir, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
19
20
|
import { log } from "./logger.js";
|
|
@@ -165,6 +166,21 @@ function replacementBackupPath(shardDir: string): string {
|
|
|
165
166
|
return path.join(path.dirname(shardDir), "embeddings.pre-replace.tmp");
|
|
166
167
|
}
|
|
167
168
|
|
|
169
|
+
/**
|
|
170
|
+
* Warm-cache generation marker (`<stateDir>/embeddings.generation`).
|
|
171
|
+
* Two-phase publication barrier: in-flight before a publication's first
|
|
172
|
+
* destructive write, fresh unique value after its last write. A stamp is
|
|
173
|
+
* therefore stable only for a completed generation — readers can never
|
|
174
|
+
* cache a stamp that stays stable while generation bytes change, and an
|
|
175
|
+
* in-flight stamp never repeats, so probes cached during a failed
|
|
176
|
+
* completion keep revalidating (PR #3176 codex P2). Plain fs like the
|
|
177
|
+
* status file.
|
|
178
|
+
*/
|
|
179
|
+
const GENERATION_MARKER_BASENAME = "embeddings.generation";
|
|
180
|
+
|
|
181
|
+
/** Reserved in-flight marker value; never equals a completion marker. */
|
|
182
|
+
const GENERATION_MARKER_IN_FLIGHT = "in-flight";
|
|
183
|
+
|
|
168
184
|
/**
|
|
169
185
|
* Stable FNV-1a shard assignment: an entry always hashes to the same shard,
|
|
170
186
|
* so an update or removal never needs a manifest to find its file.
|
|
@@ -469,7 +485,9 @@ export class EmbeddingIndexFileStore {
|
|
|
469
485
|
* the published position after an interrupted replacement. Returns true
|
|
470
486
|
* when a rollback happened. Only fires in the actual rename gap
|
|
471
487
|
* (published directory absent); callers must invalidate any cached index
|
|
472
|
-
* view when this returns true.
|
|
488
|
+
* view when this returns true. A successful rollback finalizes the
|
|
489
|
+
* generation marker strictly: a failed completion write fails the
|
|
490
|
+
* recovery instead of leaving every search reloading forever.
|
|
473
491
|
*/
|
|
474
492
|
async recoverIfInterrupted(fence?: EmbeddingGenerationFence): Promise<boolean> {
|
|
475
493
|
// Only the rename gap (published directory absent) is recoverable. When
|
|
@@ -492,6 +510,7 @@ export class EmbeddingIndexFileStore {
|
|
|
492
510
|
// The rollback rename is destructive: reassert lock ownership first.
|
|
493
511
|
await fence?.();
|
|
494
512
|
await rename(backupPath, this.shardDir);
|
|
513
|
+
await this.writeGenerationMarker(randomUUID());
|
|
495
514
|
log.warn(
|
|
496
515
|
`embedding index: recovered interrupted replacement; former generation restored from ${backupPath}`,
|
|
497
516
|
);
|
|
@@ -514,6 +533,97 @@ export class EmbeddingIndexFileStore {
|
|
|
514
533
|
}
|
|
515
534
|
}
|
|
516
535
|
|
|
536
|
+
/** Barrier first half: strict, so bytes can never change under a stable stamp. */
|
|
537
|
+
private async beginGenerationMarker(): Promise<void> {
|
|
538
|
+
await this.writeGenerationMarker(GENERATION_MARKER_IN_FLIGHT);
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
/**
|
|
542
|
+
* Barrier second half: written after the last content write. Best-effort:
|
|
543
|
+
* a failure leaves the in-flight marker, whose stamp identityStamp()
|
|
544
|
+
* never repeats, so cached probes revalidate on every search until a
|
|
545
|
+
* publication completes.
|
|
546
|
+
*/
|
|
547
|
+
private async completeGenerationMarker(): Promise<void> {
|
|
548
|
+
await this.writeGenerationMarker(randomUUID()).catch((err) => {
|
|
549
|
+
log.warn(`embedding index: could not write generation completion marker: ${err instanceof Error ? err.message : String(err)}`);
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
private async writeGenerationMarker(value: string): Promise<void> {
|
|
554
|
+
await this.writeAtomicFile(
|
|
555
|
+
path.join(path.dirname(this.shardDir), GENERATION_MARKER_BASENAME),
|
|
556
|
+
value,
|
|
557
|
+
{ bypassSecureIo: true },
|
|
558
|
+
);
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
/** Marker value, or null when absent/unreadable (pre-marker stores keep the stat stamp). */
|
|
562
|
+
private async readGenerationMarker(): Promise<string | null> {
|
|
563
|
+
try {
|
|
564
|
+
const raw = await readFile(
|
|
565
|
+
path.join(path.dirname(this.shardDir), GENERATION_MARKER_BASENAME),
|
|
566
|
+
"utf-8",
|
|
567
|
+
);
|
|
568
|
+
const value = raw.trim();
|
|
569
|
+
return value.length > 0 ? value : null;
|
|
570
|
+
} catch {
|
|
571
|
+
return null;
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
/**
|
|
576
|
+
* Warm-cache stamp. A completed generation marker alone would freeze the
|
|
577
|
+
* stamp for a pre-marker writer in a rolling deployment (it publishes
|
|
578
|
+
* shard/index changes without updating the marker), so the marker is
|
|
579
|
+
* combined with the watched path's stat: the marker keeps consecutive
|
|
580
|
+
* publications distinct on coarse-tick filesystems, the stat keeps
|
|
581
|
+
* legacy writers visible. In-flight never repeats, forcing revalidation
|
|
582
|
+
* until a publication completes. Stores never published through this
|
|
583
|
+
* module keep the plain stat stamp — a directory stat alone aliases
|
|
584
|
+
* consecutive publications on coarse-tick filesystems and across inode
|
|
585
|
+
* reuse.
|
|
586
|
+
*/
|
|
587
|
+
async identityStamp(): Promise<string> {
|
|
588
|
+
const layout = await this.detectLayout();
|
|
589
|
+
if (layout === "sharded") {
|
|
590
|
+
const info = await lstat(this.shardDir).catch((err) => {
|
|
591
|
+
// SAFETY: only the errno code is inspected; any other rejection shape rethrows uninterpreted.
|
|
592
|
+
if ((err as NodeJS.ErrnoException).code === "ENOENT") return null;
|
|
593
|
+
throw new EmbeddingIndexStorageError(
|
|
594
|
+
`cannot stat embedding index shard directory ${this.shardDir}: ${err instanceof Error ? err.message : String(err)}`,
|
|
595
|
+
);
|
|
596
|
+
});
|
|
597
|
+
if (!info) return "rename-gap";
|
|
598
|
+
const marker = await this.readGenerationMarker();
|
|
599
|
+
// An in-flight marker must never produce a repeatable stamp: a probe
|
|
600
|
+
// that cached one (completion write failed) must revalidate on every
|
|
601
|
+
// later probe until a publication completes.
|
|
602
|
+
if (marker) {
|
|
603
|
+
if (marker === GENERATION_MARKER_IN_FLIGHT) return `gen:${randomUUID()}`;
|
|
604
|
+
return `gen:${marker}:${info.ino}:${info.mtimeMs}`;
|
|
605
|
+
}
|
|
606
|
+
return `shard:${info.ino}:${info.mtimeMs}`;
|
|
607
|
+
}
|
|
608
|
+
if (layout === "legacy") {
|
|
609
|
+
const info = await stat(this.indexPath).catch((err) => {
|
|
610
|
+
// SAFETY: only the errno code is inspected; any other rejection shape rethrows uninterpreted.
|
|
611
|
+
if ((err as NodeJS.ErrnoException).code === "ENOENT") return null;
|
|
612
|
+
throw new EmbeddingIndexStorageError(
|
|
613
|
+
`cannot stat embedding index file ${this.indexPath}: ${err instanceof Error ? err.message : String(err)}`,
|
|
614
|
+
);
|
|
615
|
+
});
|
|
616
|
+
if (!info) return "rename-gap";
|
|
617
|
+
const marker = await this.readGenerationMarker();
|
|
618
|
+
if (marker) {
|
|
619
|
+
if (marker === GENERATION_MARKER_IN_FLIGHT) return `gen:${randomUUID()}`;
|
|
620
|
+
return `gen:${marker}:${info.ino}:${info.mtimeMs}`;
|
|
621
|
+
}
|
|
622
|
+
return `legacy:${info.ino}:${info.mtimeMs}`;
|
|
623
|
+
}
|
|
624
|
+
return "empty";
|
|
625
|
+
}
|
|
626
|
+
|
|
517
627
|
/** Header identity of the authoritative generation, read leniently. */
|
|
518
628
|
async identityFromDisk(): Promise<EmbeddingIndexIdentity | null> {
|
|
519
629
|
const layout = await this.detectLayout();
|
|
@@ -751,6 +861,8 @@ export class EmbeddingIndexFileStore {
|
|
|
751
861
|
// Serialization is done: reassert lock ownership immediately before
|
|
752
862
|
// the destructive live-generation writes.
|
|
753
863
|
await opts.fence?.();
|
|
864
|
+
await this.beginGenerationMarker();
|
|
865
|
+
await opts.fence?.();
|
|
754
866
|
for (const payload of payloads) {
|
|
755
867
|
await this.writeAtomicFile(
|
|
756
868
|
path.join(this.shardDir, shardFileName(payload.shardIndex)),
|
|
@@ -764,6 +876,7 @@ export class EmbeddingIndexFileStore {
|
|
|
764
876
|
await rm(path.join(this.shardDir, shardFileName(shardIndex)), { force: true });
|
|
765
877
|
}
|
|
766
878
|
}
|
|
879
|
+
await this.completeGenerationMarker();
|
|
767
880
|
return;
|
|
768
881
|
}
|
|
769
882
|
|
|
@@ -779,7 +892,10 @@ export class EmbeddingIndexFileStore {
|
|
|
779
892
|
// Serialized above: reassert lock ownership immediately before the
|
|
780
893
|
// destructive atomic write.
|
|
781
894
|
await opts.fence?.();
|
|
895
|
+
await this.beginGenerationMarker();
|
|
896
|
+
await opts.fence?.();
|
|
782
897
|
await this.writeAtomicFile(this.indexPath, whole);
|
|
898
|
+
await this.completeGenerationMarker();
|
|
783
899
|
return;
|
|
784
900
|
}
|
|
785
901
|
|
|
@@ -920,6 +1036,9 @@ export class EmbeddingIndexFileStore {
|
|
|
920
1036
|
// delay between the cleanup and the rename still allows a stale-break,
|
|
921
1037
|
// and publishing now would clobber the peer's write.
|
|
922
1038
|
await fence?.();
|
|
1039
|
+
// Publication barrier: in-flight before the renames, final at commit.
|
|
1040
|
+
await this.beginGenerationMarker();
|
|
1041
|
+
await fence?.();
|
|
923
1042
|
let demoted = false;
|
|
924
1043
|
try {
|
|
925
1044
|
await stat(this.shardDir);
|
|
@@ -931,9 +1050,19 @@ export class EmbeddingIndexFileStore {
|
|
|
931
1050
|
try {
|
|
932
1051
|
await rename(stagingDir, this.shardDir);
|
|
933
1052
|
} catch (err) {
|
|
934
|
-
if (demoted)
|
|
1053
|
+
if (demoted) {
|
|
1054
|
+
try {
|
|
1055
|
+
await rename(backupPath, this.shardDir);
|
|
1056
|
+
await this.completeGenerationMarker();
|
|
1057
|
+
} catch (rollbackErr) {
|
|
1058
|
+
log.warn(`embedding index: publication rollback did not restore the generation; marker stays in-flight: ${rollbackErr instanceof Error ? rollbackErr.message : String(rollbackErr)}`);
|
|
1059
|
+
}
|
|
1060
|
+
} else {
|
|
1061
|
+
await this.completeGenerationMarker();
|
|
1062
|
+
}
|
|
935
1063
|
throw err;
|
|
936
1064
|
}
|
|
1065
|
+
await this.completeGenerationMarker();
|
|
937
1066
|
await rm(backupPath, { recursive: true, force: true }).catch((err) => {
|
|
938
1067
|
log.warn(`embedding index: could not remove replacement backup ${backupPath}: ${err}`);
|
|
939
1068
|
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export type CarriedMemorySnippet = {
|
|
2
|
+
memorySnippets: string[];
|
|
3
|
+
memorySnippetOrigins?: Array<string | undefined>;
|
|
4
|
+
};
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Copy snippets from the previous index onto entities that already existed.
|
|
8
|
+
* A canonical id with nothing to copy was created after that index, so any
|
|
9
|
+
* memory that already pointed at it was skipped. The caller schedules one
|
|
10
|
+
* full reconcile for that case.
|
|
11
|
+
*/
|
|
12
|
+
export function applyCarriedMemorySnippets(
|
|
13
|
+
entities: Iterable<{
|
|
14
|
+
canonicalId: string;
|
|
15
|
+
memorySnippets: string[];
|
|
16
|
+
memorySnippetOrigins?: Array<string | undefined>;
|
|
17
|
+
}>,
|
|
18
|
+
carried: ReadonlyMap<string, CarriedMemorySnippet>,
|
|
19
|
+
): boolean {
|
|
20
|
+
let missing = false;
|
|
21
|
+
for (const entry of entities) {
|
|
22
|
+
const previous = carried.get(entry.canonicalId);
|
|
23
|
+
if (!previous) {
|
|
24
|
+
missing = true;
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
entry.memorySnippets = previous.memorySnippets.slice();
|
|
28
|
+
if (previous.memorySnippetOrigins) entry.memorySnippetOrigins = previous.memorySnippetOrigins.slice();
|
|
29
|
+
}
|
|
30
|
+
return missing;
|
|
31
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { appendFileSync, mkdirSync, statSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Entity-mention freshness, separate from the hot-memories corpus sentinel.
|
|
7
|
+
*
|
|
8
|
+
* Every memory write bumps the corpus version so the hot cache stays coherent.
|
|
9
|
+
* The entity mention index does not depend on heat, decay, lifecycle, or
|
|
10
|
+
* lastValidatedAt, so those rewrites must not force a fact-file rescan.
|
|
11
|
+
* Content, entityRef, and origin changes bump this epoch. Metadata-only
|
|
12
|
+
* frontmatter rewrites run inside `hold()` and leave it alone.
|
|
13
|
+
*
|
|
14
|
+
* The on-disk sentinel is the byte size of `state/.entity-mention-epoch.log`
|
|
15
|
+
* (same pattern as the other version logs). A failed append adds one to an
|
|
16
|
+
* in-process extra, and `current` is the file size plus that extra. A later
|
|
17
|
+
* successful append, including one from another process, grows the file and
|
|
18
|
+
* moves `current` past those failed bumps. `reset` drops caches that
|
|
19
|
+
* registered at load (the mention index).
|
|
20
|
+
*/
|
|
21
|
+
const fallbackByDir = new Map<string, { extra: number; disk: number }>();
|
|
22
|
+
const suppression = new AsyncLocalStorage<true>();
|
|
23
|
+
let onReset: (() => void) | null = null;
|
|
24
|
+
|
|
25
|
+
type MentionFrontmatter = {
|
|
26
|
+
entityRef?: unknown;
|
|
27
|
+
origin?: unknown;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
function epochFile(dir: string): string {
|
|
31
|
+
return path.join(path.resolve(dir), "state", ".entity-mention-epoch.log");
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function mentionField(value: unknown): string | undefined {
|
|
35
|
+
return typeof value === "string" ? value : undefined;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function diskSize(filePath: string): number {
|
|
39
|
+
try {
|
|
40
|
+
return statSync(filePath).size;
|
|
41
|
+
} catch {
|
|
42
|
+
return 0;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function localEpoch(key: string, disk: number): { extra: number; disk: number } {
|
|
47
|
+
const existing = fallbackByDir.get(key);
|
|
48
|
+
if (existing) return existing;
|
|
49
|
+
const created = { extra: 0, disk };
|
|
50
|
+
fallbackByDir.set(key, created);
|
|
51
|
+
return created;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function bump(dir: string): void {
|
|
55
|
+
const key = path.resolve(dir);
|
|
56
|
+
const filePath = epochFile(dir);
|
|
57
|
+
const before = diskSize(filePath);
|
|
58
|
+
let appended = false;
|
|
59
|
+
try {
|
|
60
|
+
mkdirSync(path.dirname(filePath), { recursive: true });
|
|
61
|
+
appendFileSync(filePath, "x");
|
|
62
|
+
appended = true;
|
|
63
|
+
} catch {
|
|
64
|
+
// The file can still be stat-able (read-only, or the disk is full). The
|
|
65
|
+
// in-process counter has to move or this process keeps serving a stale index.
|
|
66
|
+
}
|
|
67
|
+
const after = diskSize(filePath);
|
|
68
|
+
const local = localEpoch(key, before);
|
|
69
|
+
if (!appended || after <= before) local.extra += 1;
|
|
70
|
+
noteDisk(local, after);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function noteDisk(local: { extra: number; disk: number }, disk: number): void {
|
|
74
|
+
if (disk < local.disk) local.extra += local.disk - disk;
|
|
75
|
+
local.disk = disk;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function current(dir: string): number {
|
|
79
|
+
const key = path.resolve(dir);
|
|
80
|
+
const disk = diskSize(epochFile(dir));
|
|
81
|
+
const local = fallbackByDir.get(key);
|
|
82
|
+
if (!local) return disk;
|
|
83
|
+
noteDisk(local, disk);
|
|
84
|
+
// Failed appends stay ahead of the file. A peer's later successful append
|
|
85
|
+
// grows `disk` and must not land on the same number as those local failures.
|
|
86
|
+
return disk + local.extra;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function suppressed(): boolean {
|
|
90
|
+
return suppression.getStore() === true;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function hold<T>(fn: () => T): T {
|
|
94
|
+
return suppression.run(true, fn);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function registerReset(fn: () => void): void {
|
|
98
|
+
onReset = fn;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function reset(): void {
|
|
102
|
+
onReset?.();
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function neutral(before: MentionFrontmatter, after: MentionFrontmatter): boolean {
|
|
106
|
+
return (
|
|
107
|
+
mentionField(before.entityRef) === mentionField(after.entityRef) &&
|
|
108
|
+
mentionField(before.origin) === mentionField(after.origin)
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export const entityMentionEpoch = {
|
|
113
|
+
bump,
|
|
114
|
+
current,
|
|
115
|
+
suppressed,
|
|
116
|
+
hold,
|
|
117
|
+
neutral,
|
|
118
|
+
registerReset,
|
|
119
|
+
reset,
|
|
120
|
+
};
|