@remnic/core 10.0.68 → 10.0.70
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 +80 -77
- package/dist/access-authorization-probe.js +81 -78
- package/dist/access-boundary.js +80 -77
- package/dist/access-cli.js +194 -191
- package/dist/access-cli.js.map +1 -1
- package/dist/access-extraction-force-flush.js +80 -77
- package/dist/access-http-briefing.js +81 -78
- package/dist/access-http-query.js +82 -79
- package/dist/access-http.js +104 -101
- package/dist/access-identity-continuity-surface.js +80 -77
- package/dist/access-lcm-surface.js +80 -77
- package/dist/access-mcp.js +93 -90
- package/dist/access-namespace-preflight.js +80 -77
- package/dist/access-observe-lcm-archive.d.ts +5 -0
- package/dist/access-observe-lcm-archive.d.ts.map +1 -0
- package/dist/access-observe-lcm-archive.js +9 -0
- package/dist/access-observe-objective-state.d.ts +8 -0
- package/dist/access-observe-objective-state.d.ts.map +1 -0
- package/dist/access-observe-objective-state.js +17 -0
- package/dist/access-observe-stage-timing.d.ts +11 -0
- package/dist/access-observe-stage-timing.d.ts.map +1 -0
- package/dist/access-observe-stage-timing.js +9 -0
- package/dist/access-observe-stage-timing.js.map +1 -0
- package/dist/access-observe-write-category.js +13 -13
- package/dist/access-observe-write-surface.d.ts.map +1 -1
- package/dist/access-observe-write-surface.js +80 -77
- package/dist/access-offline-manifest.js +8 -8
- package/dist/access-operations-batch.js +83 -80
- package/dist/access-operations.js +90 -87
- package/dist/access-recall-concurrency.js +80 -77
- package/dist/access-recall-response.js +80 -77
- package/dist/access-recall-surface.js +80 -77
- package/dist/access-schema.js +12 -12
- package/dist/access-service.d.ts +1 -0
- package/dist/access-service.d.ts.map +1 -1
- package/dist/access-service.js +80 -77
- package/dist/access-surface-catalog.js +82 -79
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/active-recall.js +24 -24
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/registry.js +2 -2
- package/dist/briefing.js +15 -15
- package/dist/buffer.js +8 -8
- package/dist/calibration.js +4 -4
- package/dist/{capsule-crypto-GWVG7LGC.js → capsule-crypto-7FJQINUR.js} +2 -2
- package/dist/capsule-crypto-7FJQINUR.js.map +1 -0
- package/dist/causal-behavior.js +2 -2
- package/dist/causal-chain.js +2 -2
- package/dist/causal-consolidation.js +20 -20
- 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-NCZGGGWI.js → chunk-2BBMCMJS.js} +12 -12
- package/dist/{chunk-UVVFPCPX.js → chunk-2GV24KFD.js} +2 -2
- package/dist/{chunk-OWHERGF2.js → chunk-2NLLXCJG.js} +2 -2
- package/dist/{chunk-QDZWQBLU.js → chunk-2R7OCBRR.js} +2 -2
- package/dist/{chunk-U2CAGMUD.js → chunk-2YPIFJHL.js} +2 -2
- package/dist/{chunk-4SOWMA55.js → chunk-3AASGFR4.js} +3 -3
- package/dist/{chunk-CI3MAAIY.js → chunk-3F7N4I5I.js} +2 -2
- package/dist/{chunk-PLCYKAWH.js → chunk-3ICAWZUU.js} +4 -4
- package/dist/{chunk-B4DXREWC.js → chunk-3W37NITP.js} +2 -2
- package/dist/{chunk-R4ZHF4K2.js → chunk-43FLJLT2.js} +4 -4
- package/dist/{chunk-RLVI2M5Q.js → chunk-4BOBW6H4.js} +2 -2
- package/dist/{chunk-HXFIILGF.js → chunk-4RASUAN3.js} +4 -4
- package/dist/{chunk-JLMOH5JA.js → chunk-5FMGPV34.js} +2 -2
- package/dist/{chunk-EI6M5NVK.js → chunk-5JBVPJCT.js} +2 -2
- package/dist/{chunk-74AY3S7U.js → chunk-5RW247F5.js} +10 -10
- package/dist/{chunk-P4TV3TQ2.js → chunk-5VQSKBNF.js} +5 -5
- package/dist/{chunk-H5DIRCZP.js → chunk-64U42JL5.js} +18 -18
- package/dist/{chunk-4XINO77L.js → chunk-66JOLMWS.js} +2 -2
- package/dist/{chunk-WHROVQ5Q.js → chunk-66PEACZP.js} +3 -3
- package/dist/{chunk-GKL6QYZO.js → chunk-6L63IN3M.js} +1 -1
- package/dist/{chunk-Y3XPSGNF.js → chunk-6QS5NQJH.js} +2 -2
- package/dist/{chunk-KOLJJN5G.js → chunk-AQNHEDXP.js} +11 -4
- package/dist/chunk-AQNHEDXP.js.map +1 -0
- package/dist/{chunk-6WKWL53V.js → chunk-B7YAIHAV.js} +127 -121
- package/dist/chunk-B7YAIHAV.js.map +1 -0
- package/dist/{chunk-M4IEZGCK.js → chunk-BFBS7OFQ.js} +7 -7
- package/dist/{chunk-4PG5R6BJ.js → chunk-BNU5TQLR.js} +2 -2
- package/dist/{chunk-B3MWELZ3.js → chunk-BW33YTF3.js} +2 -2
- package/dist/{chunk-H6VJSITJ.js → chunk-CIL4GHMD.js} +3 -3
- package/dist/{chunk-5UM4H64E.js → chunk-D3AGBN6G.js} +2 -2
- package/dist/{chunk-IG3EZ3TF.js → chunk-DM3UZUCN.js} +2 -2
- package/dist/{chunk-PMDOGXA2.js → chunk-EF3HNVL4.js} +2 -2
- package/dist/{chunk-TVE7W67N.js → chunk-EIZ4MK33.js} +2 -2
- package/dist/{chunk-AUFPPBC3.js → chunk-ENPJX3BB.js} +3 -3
- package/dist/{chunk-63A2BU2B.js → chunk-F4ZHKDBW.js} +5 -5
- package/dist/{chunk-3LBDEGQA.js → chunk-FDUCIUQ5.js} +2 -2
- package/dist/{chunk-CTH2CQCB.js → chunk-FM6UKZAE.js} +2 -2
- package/dist/{chunk-XVZA6VXC.js → chunk-FZVROZKC.js} +4 -4
- package/dist/{chunk-IAGVM7EY.js → chunk-GMSRLDVR.js} +2 -2
- package/dist/{chunk-HPB5TF55.js → chunk-GT4G2S2Y.js} +3 -3
- package/dist/{chunk-645WOU5I.js → chunk-H7BZBSP6.js} +4 -4
- package/dist/{chunk-5MGKGEL7.js → chunk-HNF7IMYQ.js} +2 -2
- package/dist/{chunk-W7K5BP3M.js → chunk-HQPFACXO.js} +2 -2
- package/dist/{chunk-TECK5IVY.js → chunk-HZNURRDS.js} +2 -2
- package/dist/{chunk-SXTVZ6JL.js → chunk-I6HRHJRA.js} +2 -2
- package/dist/{chunk-NHWDTOBN.js → chunk-ILD7N3XC.js} +20 -20
- package/dist/{chunk-4NV7O76Q.js → chunk-J5TVHCDG.js} +2 -2
- package/dist/{chunk-AL3TCNSJ.js → chunk-J6GZ2254.js} +4 -4
- package/dist/{chunk-OH55F76C.js → chunk-JEX2JL3U.js} +2 -2
- package/dist/{chunk-AVGDYYMA.js → chunk-JGQEF33K.js} +3 -3
- package/dist/{chunk-6P7U3HWG.js → chunk-K36RMINQ.js} +3 -3
- package/dist/{chunk-UW6LBFYN.js → chunk-K47G2CBP.js} +6 -6
- package/dist/{chunk-3RHU5MD7.js → chunk-K7LLGCPH.js} +2 -2
- package/dist/{chunk-BUKK5SWA.js → chunk-KQAFEZQX.js} +2 -2
- package/dist/chunk-L3E7MLMK.js +20 -0
- package/dist/chunk-L3E7MLMK.js.map +1 -0
- package/dist/{chunk-R2BIVU2Z.js → chunk-LTST4R7U.js} +2 -2
- package/dist/{chunk-IZBIDPMY.js → chunk-LYTKNK5O.js} +2 -2
- package/dist/{chunk-HH73M65H.js → chunk-MCFI6G7U.js} +3 -3
- package/dist/{chunk-V6SBA5O7.js → chunk-MFKBYXBY.js} +5 -5
- package/dist/{chunk-AYJQ644F.js → chunk-MK7HXGM6.js} +2 -2
- package/dist/{chunk-MOIJWWNA.js → chunk-MKMIY3E7.js} +13 -13
- package/dist/{chunk-EXQJMFRF.js → chunk-MRN2MKB7.js} +2 -2
- package/dist/{chunk-W26D2USW.js → chunk-MUH7RR6T.js} +6 -6
- package/dist/{chunk-64JLBFCQ.js → chunk-N7NAGECH.js} +2 -2
- package/dist/{chunk-75DCOS6I.js → chunk-OAKOAOEG.js} +67 -67
- package/dist/{chunk-FAF4A76Q.js → chunk-OAQO5AZJ.js} +512 -378
- package/dist/chunk-OAQO5AZJ.js.map +1 -0
- package/dist/{chunk-OPFVXM2D.js → chunk-OX6GY22Q.js} +2 -2
- package/dist/chunk-QCFZDYYG.js +34 -0
- package/dist/chunk-QCFZDYYG.js.map +1 -0
- package/dist/{chunk-MMCO4SRG.js → chunk-QNN4FYBD.js} +19 -11
- package/dist/chunk-QNN4FYBD.js.map +1 -0
- package/dist/{chunk-XWE3EOWX.js → chunk-RZED7FAU.js} +2 -2
- package/dist/{chunk-YSATDEBY.js → chunk-SBRUTD5O.js} +5 -5
- package/dist/{chunk-WVP2I6C5.js → chunk-SDL22RRW.js} +50 -11
- package/dist/chunk-SDL22RRW.js.map +1 -0
- package/dist/{chunk-ZORS5BG5.js → chunk-SQO5SEKA.js} +10 -10
- package/dist/{chunk-PRKNAIGZ.js → chunk-T6T2RMWW.js} +5 -5
- package/dist/{chunk-O5ZINWW3.js → chunk-THFSCUFC.js} +2 -2
- package/dist/{chunk-CIEEYVUB.js → chunk-TPX7XXY4.js} +2 -2
- package/dist/{chunk-OCK4D5PC.js → chunk-TSZP7GGJ.js} +2 -2
- package/dist/{chunk-L334PSLW.js → chunk-U2A56LLF.js} +8 -8
- package/dist/{chunk-TGQW3AMK.js → chunk-UIFWZMO7.js} +23 -23
- package/dist/{chunk-LN4X2NDA.js → chunk-UJ2FP2RV.js} +10 -10
- package/dist/{chunk-4MPAKYZU.js → chunk-VDYRXI3E.js} +5 -5
- package/dist/{chunk-IHCXMYSE.js → chunk-VPEIWMUT.js} +2 -2
- package/dist/{chunk-ELHJK7LM.js → chunk-WBN66HPI.js} +6 -6
- package/dist/{chunk-BJLCV2P3.js → chunk-WGRAB3KB.js} +2 -2
- package/dist/{chunk-IVUVQPTQ.js → chunk-WIW4LOZL.js} +2 -2
- package/dist/{chunk-5KDDAQ6K.js → chunk-WN2DASTS.js} +10 -10
- package/dist/chunk-WZU5AGO6.js +38 -0
- package/dist/chunk-WZU5AGO6.js.map +1 -0
- package/dist/{chunk-UVYI6VIX.js → chunk-X7Y7WX73.js} +1 -1
- package/dist/{chunk-5Y6VA6X2.js → chunk-XDUP6SWG.js} +2 -2
- package/dist/{chunk-GHHQLSSY.js → chunk-XR4QR3JT.js} +3 -3
- package/dist/{chunk-64S6X4IU.js → chunk-XTN54NML.js} +4 -4
- package/dist/{chunk-QGFR73SN.js → chunk-YIG4HPY4.js} +2 -2
- package/dist/{chunk-UYUFDTIX.js → chunk-YIXWY4OZ.js} +2 -2
- package/dist/{chunk-GJ4HU6LK.js → chunk-YLMTFRZR.js} +2 -2
- package/dist/{chunk-GGD2YDS6.js → chunk-YRMSHA7H.js} +2 -2
- package/dist/{chunk-Y7427SL7.js → chunk-ZG4GNPRE.js} +216 -50
- package/dist/chunk-ZG4GNPRE.js.map +1 -0
- package/dist/{chunk-KZZ5EZ7O.js → chunk-ZS5LREUZ.js} +2 -2
- package/dist/{chunk-JLGBJ4AX.js → chunk-ZYEWTVNQ.js} +10 -10
- package/dist/cli.js +131 -128
- package/dist/coding/export-okf-codegraph.js +14 -14
- package/dist/coding/pre-action-gate.js +2 -2
- package/dist/compounding/engine.js +16 -16
- package/dist/config.js +24 -24
- package/dist/connectors/codex-materialize-runner.js +17 -17
- package/dist/connectors/codex-materialize.js +2 -2
- package/dist/connectors/index.js +18 -18
- package/dist/consolidation-provenance-check.js +2 -2
- package/dist/convergence-refresh.js +18 -18
- package/dist/corpus-watermark.js +18 -18
- package/dist/deep-recall-http-glue.js +13 -13
- package/dist/deep-recall.js +2 -2
- package/dist/embedding-fallback.js +2 -2
- package/dist/entity-retrieval.js +18 -18
- package/dist/event-order-recall.js +2 -2
- package/dist/external-wiki-access.js +81 -78
- package/dist/extraction-span-materialize.js +2 -2
- package/dist/extraction.js +30 -30
- package/dist/{graph-edge-decay-OEX5OGMI.js → graph-edge-decay-CXTNJ7IQ.js} +6 -6
- package/dist/graph-edge-decay-CXTNJ7IQ.js.map +1 -0
- package/dist/graph-jsonl.js +4 -4
- package/dist/graph-snapshot.js +4 -4
- package/dist/graph.js +3 -3
- package/dist/harmonic-retrieval.js +15 -15
- package/dist/index.js +279 -276
- package/dist/lcm/archive.d.ts +12 -2
- package/dist/lcm/archive.d.ts.map +1 -1
- package/dist/lcm/archive.js +2 -2
- package/dist/lcm/engine.d.ts +59 -8
- package/dist/lcm/engine.d.ts.map +1 -1
- package/dist/lcm/engine.js +6 -6
- package/dist/lcm/index.js +16 -16
- package/dist/lcm/queue.d.ts +7 -3
- package/dist/lcm/queue.d.ts.map +1 -1
- package/dist/lcm/queue.js +1 -1
- package/dist/lcm/summarizer.d.ts +8 -1
- package/dist/lcm/summarizer.d.ts.map +1 -1
- package/dist/lcm/summarizer.js +3 -3
- package/dist/local-llm.js +4 -4
- package/dist/location/index.js +17 -17
- package/dist/maintenance/memory-governance.js +16 -16
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +15 -15
- package/dist/maintenance/rebuild-memory-projection-runner.js +18 -18
- package/dist/maintenance/rebuild-memory-projection.js +17 -17
- package/dist/memory-browse-operations.js +81 -78
- package/dist/memory-browse.js +6 -6
- package/dist/namespaces/migrate.js +16 -16
- package/dist/namespaces/search.js +7 -7
- package/dist/namespaces/storage.js +15 -15
- package/dist/offline-sync-changeset-generations.js +5 -5
- package/dist/offline-sync-embedding-generation.js +4 -4
- package/dist/offline-sync-snapshot-stream.js +7 -7
- package/dist/offline-sync.js +9 -9
- package/dist/operator-doctor-corpus.js +19 -19
- package/dist/operator-toolkit.js +39 -39
- package/dist/orchestration/buffer-drain-runner.js +194 -191
- package/dist/orchestration/buffer-drain-runner.js.map +1 -1
- package/dist/orchestration/extraction-persist.d.ts.map +1 -1
- package/dist/orchestration/maintenance.js +31 -31
- package/dist/orchestration/promotion-dedup-window.d.ts +118 -0
- package/dist/orchestration/promotion-dedup-window.d.ts.map +1 -0
- package/dist/orchestrator.js +195 -192
- package/dist/qmd.js +4 -4
- package/dist/recall-navigation-operations.js +81 -78
- package/dist/recall-navigation.js +80 -77
- package/dist/recall-state-view-admission.js +6 -6
- package/dist/recall-why-service.js +6 -6
- package/dist/resume-bundles.js +27 -27
- package/dist/search/factory.js +6 -6
- package/dist/search/index.js +12 -12
- package/dist/semantic-consolidation.js +23 -23
- package/dist/semantic-rule-promotion.js +15 -15
- package/dist/semantic-rule-verifier.js +15 -15
- package/dist/source-agent-qualifier.js +22 -22
- package/dist/standup/build.js +15 -15
- package/dist/storage.js +14 -14
- package/dist/summarizer.js +6 -6
- package/dist/support-passport/index.js +83 -80
- package/dist/transfer/backup.js +2 -2
- package/dist/transfer/capsule-export.js +2 -2
- package/dist/transfer/capsule-import.js +2 -2
- package/dist/transfer/export-okf.js +15 -15
- package/dist/verified-recall.js +15 -15
- package/dist/who-knows-cli.js +16 -16
- package/dist/who-knows.js +15 -15
- package/package.json +2 -2
- package/src/access-observe-lcm-archive.ts +30 -0
- package/src/access-observe-lcm-fail-closed.test.ts +118 -0
- package/src/access-observe-objective-state.ts +40 -0
- package/src/access-observe-stage-timing.test.ts +246 -0
- package/src/access-observe-stage-timing.ts +58 -0
- package/src/access-observe-write-surface.ts +45 -45
- package/src/access-service.ts +1 -0
- package/src/extraction-shared-promotion-parallel-dedup.test.ts +212 -0
- package/src/lcm/archive.ts +59 -7
- package/src/lcm/engine.ts +256 -53
- package/src/lcm/queue.test.ts +32 -14
- package/src/lcm/queue.ts +24 -16
- package/src/lcm/summarizer.ts +15 -2
- package/src/lcm-durability.test.ts +856 -0
- package/src/lcm-engine.test.ts +12 -3
- package/src/orchestration/extraction-persist.ts +40 -35
- package/src/orchestration/promotion-dedup-window.ts +319 -0
- package/dist/chunk-6WKWL53V.js.map +0 -1
- package/dist/chunk-FAF4A76Q.js.map +0 -1
- package/dist/chunk-KOLJJN5G.js.map +0 -1
- package/dist/chunk-MMCO4SRG.js.map +0 -1
- package/dist/chunk-WVP2I6C5.js.map +0 -1
- package/dist/chunk-Y7427SL7.js.map +0 -1
- /package/dist/{capsule-crypto-GWVG7LGC.js.map → access-observe-lcm-archive.js.map} +0 -0
- /package/dist/{graph-edge-decay-OEX5OGMI.js.map → access-observe-objective-state.js.map} +0 -0
- /package/dist/{chunk-NCZGGGWI.js.map → chunk-2BBMCMJS.js.map} +0 -0
- /package/dist/{chunk-UVVFPCPX.js.map → chunk-2GV24KFD.js.map} +0 -0
- /package/dist/{chunk-OWHERGF2.js.map → chunk-2NLLXCJG.js.map} +0 -0
- /package/dist/{chunk-QDZWQBLU.js.map → chunk-2R7OCBRR.js.map} +0 -0
- /package/dist/{chunk-U2CAGMUD.js.map → chunk-2YPIFJHL.js.map} +0 -0
- /package/dist/{chunk-4SOWMA55.js.map → chunk-3AASGFR4.js.map} +0 -0
- /package/dist/{chunk-CI3MAAIY.js.map → chunk-3F7N4I5I.js.map} +0 -0
- /package/dist/{chunk-PLCYKAWH.js.map → chunk-3ICAWZUU.js.map} +0 -0
- /package/dist/{chunk-B4DXREWC.js.map → chunk-3W37NITP.js.map} +0 -0
- /package/dist/{chunk-R4ZHF4K2.js.map → chunk-43FLJLT2.js.map} +0 -0
- /package/dist/{chunk-RLVI2M5Q.js.map → chunk-4BOBW6H4.js.map} +0 -0
- /package/dist/{chunk-HXFIILGF.js.map → chunk-4RASUAN3.js.map} +0 -0
- /package/dist/{chunk-JLMOH5JA.js.map → chunk-5FMGPV34.js.map} +0 -0
- /package/dist/{chunk-EI6M5NVK.js.map → chunk-5JBVPJCT.js.map} +0 -0
- /package/dist/{chunk-74AY3S7U.js.map → chunk-5RW247F5.js.map} +0 -0
- /package/dist/{chunk-P4TV3TQ2.js.map → chunk-5VQSKBNF.js.map} +0 -0
- /package/dist/{chunk-H5DIRCZP.js.map → chunk-64U42JL5.js.map} +0 -0
- /package/dist/{chunk-4XINO77L.js.map → chunk-66JOLMWS.js.map} +0 -0
- /package/dist/{chunk-WHROVQ5Q.js.map → chunk-66PEACZP.js.map} +0 -0
- /package/dist/{chunk-GKL6QYZO.js.map → chunk-6L63IN3M.js.map} +0 -0
- /package/dist/{chunk-Y3XPSGNF.js.map → chunk-6QS5NQJH.js.map} +0 -0
- /package/dist/{chunk-M4IEZGCK.js.map → chunk-BFBS7OFQ.js.map} +0 -0
- /package/dist/{chunk-4PG5R6BJ.js.map → chunk-BNU5TQLR.js.map} +0 -0
- /package/dist/{chunk-B3MWELZ3.js.map → chunk-BW33YTF3.js.map} +0 -0
- /package/dist/{chunk-H6VJSITJ.js.map → chunk-CIL4GHMD.js.map} +0 -0
- /package/dist/{chunk-5UM4H64E.js.map → chunk-D3AGBN6G.js.map} +0 -0
- /package/dist/{chunk-IG3EZ3TF.js.map → chunk-DM3UZUCN.js.map} +0 -0
- /package/dist/{chunk-PMDOGXA2.js.map → chunk-EF3HNVL4.js.map} +0 -0
- /package/dist/{chunk-TVE7W67N.js.map → chunk-EIZ4MK33.js.map} +0 -0
- /package/dist/{chunk-AUFPPBC3.js.map → chunk-ENPJX3BB.js.map} +0 -0
- /package/dist/{chunk-63A2BU2B.js.map → chunk-F4ZHKDBW.js.map} +0 -0
- /package/dist/{chunk-3LBDEGQA.js.map → chunk-FDUCIUQ5.js.map} +0 -0
- /package/dist/{chunk-CTH2CQCB.js.map → chunk-FM6UKZAE.js.map} +0 -0
- /package/dist/{chunk-XVZA6VXC.js.map → chunk-FZVROZKC.js.map} +0 -0
- /package/dist/{chunk-IAGVM7EY.js.map → chunk-GMSRLDVR.js.map} +0 -0
- /package/dist/{chunk-HPB5TF55.js.map → chunk-GT4G2S2Y.js.map} +0 -0
- /package/dist/{chunk-645WOU5I.js.map → chunk-H7BZBSP6.js.map} +0 -0
- /package/dist/{chunk-5MGKGEL7.js.map → chunk-HNF7IMYQ.js.map} +0 -0
- /package/dist/{chunk-W7K5BP3M.js.map → chunk-HQPFACXO.js.map} +0 -0
- /package/dist/{chunk-TECK5IVY.js.map → chunk-HZNURRDS.js.map} +0 -0
- /package/dist/{chunk-SXTVZ6JL.js.map → chunk-I6HRHJRA.js.map} +0 -0
- /package/dist/{chunk-NHWDTOBN.js.map → chunk-ILD7N3XC.js.map} +0 -0
- /package/dist/{chunk-4NV7O76Q.js.map → chunk-J5TVHCDG.js.map} +0 -0
- /package/dist/{chunk-AL3TCNSJ.js.map → chunk-J6GZ2254.js.map} +0 -0
- /package/dist/{chunk-OH55F76C.js.map → chunk-JEX2JL3U.js.map} +0 -0
- /package/dist/{chunk-AVGDYYMA.js.map → chunk-JGQEF33K.js.map} +0 -0
- /package/dist/{chunk-6P7U3HWG.js.map → chunk-K36RMINQ.js.map} +0 -0
- /package/dist/{chunk-UW6LBFYN.js.map → chunk-K47G2CBP.js.map} +0 -0
- /package/dist/{chunk-3RHU5MD7.js.map → chunk-K7LLGCPH.js.map} +0 -0
- /package/dist/{chunk-BUKK5SWA.js.map → chunk-KQAFEZQX.js.map} +0 -0
- /package/dist/{chunk-R2BIVU2Z.js.map → chunk-LTST4R7U.js.map} +0 -0
- /package/dist/{chunk-IZBIDPMY.js.map → chunk-LYTKNK5O.js.map} +0 -0
- /package/dist/{chunk-HH73M65H.js.map → chunk-MCFI6G7U.js.map} +0 -0
- /package/dist/{chunk-V6SBA5O7.js.map → chunk-MFKBYXBY.js.map} +0 -0
- /package/dist/{chunk-AYJQ644F.js.map → chunk-MK7HXGM6.js.map} +0 -0
- /package/dist/{chunk-MOIJWWNA.js.map → chunk-MKMIY3E7.js.map} +0 -0
- /package/dist/{chunk-EXQJMFRF.js.map → chunk-MRN2MKB7.js.map} +0 -0
- /package/dist/{chunk-W26D2USW.js.map → chunk-MUH7RR6T.js.map} +0 -0
- /package/dist/{chunk-64JLBFCQ.js.map → chunk-N7NAGECH.js.map} +0 -0
- /package/dist/{chunk-75DCOS6I.js.map → chunk-OAKOAOEG.js.map} +0 -0
- /package/dist/{chunk-OPFVXM2D.js.map → chunk-OX6GY22Q.js.map} +0 -0
- /package/dist/{chunk-XWE3EOWX.js.map → chunk-RZED7FAU.js.map} +0 -0
- /package/dist/{chunk-YSATDEBY.js.map → chunk-SBRUTD5O.js.map} +0 -0
- /package/dist/{chunk-ZORS5BG5.js.map → chunk-SQO5SEKA.js.map} +0 -0
- /package/dist/{chunk-PRKNAIGZ.js.map → chunk-T6T2RMWW.js.map} +0 -0
- /package/dist/{chunk-O5ZINWW3.js.map → chunk-THFSCUFC.js.map} +0 -0
- /package/dist/{chunk-CIEEYVUB.js.map → chunk-TPX7XXY4.js.map} +0 -0
- /package/dist/{chunk-OCK4D5PC.js.map → chunk-TSZP7GGJ.js.map} +0 -0
- /package/dist/{chunk-L334PSLW.js.map → chunk-U2A56LLF.js.map} +0 -0
- /package/dist/{chunk-TGQW3AMK.js.map → chunk-UIFWZMO7.js.map} +0 -0
- /package/dist/{chunk-LN4X2NDA.js.map → chunk-UJ2FP2RV.js.map} +0 -0
- /package/dist/{chunk-4MPAKYZU.js.map → chunk-VDYRXI3E.js.map} +0 -0
- /package/dist/{chunk-IHCXMYSE.js.map → chunk-VPEIWMUT.js.map} +0 -0
- /package/dist/{chunk-ELHJK7LM.js.map → chunk-WBN66HPI.js.map} +0 -0
- /package/dist/{chunk-BJLCV2P3.js.map → chunk-WGRAB3KB.js.map} +0 -0
- /package/dist/{chunk-IVUVQPTQ.js.map → chunk-WIW4LOZL.js.map} +0 -0
- /package/dist/{chunk-5KDDAQ6K.js.map → chunk-WN2DASTS.js.map} +0 -0
- /package/dist/{chunk-UVYI6VIX.js.map → chunk-X7Y7WX73.js.map} +0 -0
- /package/dist/{chunk-5Y6VA6X2.js.map → chunk-XDUP6SWG.js.map} +0 -0
- /package/dist/{chunk-GHHQLSSY.js.map → chunk-XR4QR3JT.js.map} +0 -0
- /package/dist/{chunk-64S6X4IU.js.map → chunk-XTN54NML.js.map} +0 -0
- /package/dist/{chunk-QGFR73SN.js.map → chunk-YIG4HPY4.js.map} +0 -0
- /package/dist/{chunk-UYUFDTIX.js.map → chunk-YIXWY4OZ.js.map} +0 -0
- /package/dist/{chunk-GJ4HU6LK.js.map → chunk-YLMTFRZR.js.map} +0 -0
- /package/dist/{chunk-GGD2YDS6.js.map → chunk-YRMSHA7H.js.map} +0 -0
- /package/dist/{chunk-KZZ5EZ7O.js.map → chunk-ZS5LREUZ.js.map} +0 -0
- /package/dist/{chunk-JLGBJ4AX.js.map → chunk-ZYEWTVNQ.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/orchestration/buffer-drain-runner.ts"],"sourcesContent":["/**\n * Out-of-process extraction-buffer drain (`remnic buffer drain`).\n *\n * The runner owns ONE claimed session at a time and drives it through the\n * SAME extraction pipeline the daemon uses — the same chunking\n * (`chunkExtractionWindow` + the model's input budget), the same retry /\n * provider-circuit semantics, the same dropped-chunk side-file recovery. It\n * adds no extraction logic of its own.\n *\n * The difference is ownership: the claimed session's turns live in a drain\n * claim (a durable file), not in a live buffer. So the runner wires a\n * claim-backed `SmartBuffer` into the extraction queue instead of the live\n * one. Every chunk that extracts successfully is removed from the claim\n * immediately, which makes the drain resumable: a kill at any instant\n * leaves the un-extracted turns in the claim, and the next run continues\n * from there.\n *\n * Concurrency lives in the CLI (worker processes, one session each at a\n * time): the in-process extraction queue is serial by design, so a single\n * runner never runs two sessions' extractions at once.\n */\n\nimport type { BufferStorage } from \"../buffer-persistence.js\";\nimport { BufferDrainClaims, type DrainLease } from \"../storage/buffer-drain-claims.js\";\nimport type { BufferEntryState, BufferState } from \"../types.js\";\nimport { hostname } from \"node:os\";\nimport { describeError } from \"../buffer-turn-helpers.js\";\nimport { log } from \"../logger.js\";\nimport { selfDeps } from \"./self-deps.js\";\nimport { TurnIngestionCoordinator, type TurnIngestionDeps } from \"./turn-ingestion.js\";\nimport type { ExtractionRunResult } from \"./extraction-run.js\";\nimport type { Orchestrator } from \"../orchestrator.js\";\n\nexport type DrainSessionStatus = \"drained\" | \"deferred\" | \"failed\" | \"skipped\";\n\nexport interface DrainSessionOutcome {\n key: string;\n status: DrainSessionStatus;\n /** Turns the claim held when the drain started. */\n turnsAtStart: number;\n /** Turns still in the claim when the drain stopped. */\n turnsRemaining: number;\n /** Facts the extraction persisted during this run. */\n persistedCount: number;\n /** Durable outputs (memories + entities) the extraction wrote. */\n durableOutputCount: number;\n /** Why the session was skipped or deferred (machine-readable). */\n reason?: string;\n}\n\nexport interface BufferDrainRunnerOptions {\n /** Identity of this drainer; owns the lease it takes. */\n ownerId: string;\n /** Lease lifetime in ms. The heartbeat keeps it alive while draining. */\n leaseMs?: number;\n /** Cancels the run at the next chunk boundary. */\n signal?: AbortSignal;\n /** Progress callback (per session, and per claim transition). */\n onEvent?: (event: DrainRunnerEvent) => void;\n}\n\n/** A failed drain run: the reason a chunk or the session could not finish. */\nexport type DrainExtractionError = Error;\n\nexport type DrainRunnerEvent =\n | { type: \"session_started\"; key: string; turns: number }\n | { type: \"session_finished\"; key: string; outcome: DrainSessionOutcome };\n\nconst DEFAULT_LEASE_MS = 120_000;\n\n/**\n * A `BufferStorage` view of one drain claim: the claim file IS the buffer.\n * Writes are the drain's progress (what is left to extract), so every\n * successfully extracted chunk is durably removed before the next one runs.\n */\nclass ClaimBufferStorage implements BufferStorage {\n constructor(\n private readonly claims: BufferDrainClaims,\n private readonly key: string,\n private readonly ownerId: string,\n private readonly entry: BufferEntryState,\n ) {}\n\n async loadBuffer(): Promise<BufferState> {\n const entries: NonNullable<BufferState[\"entries\"]> = Object.create(null);\n entries[this.key] = {\n turns: this.entry.turns,\n retainedTurns: this.entry.retainedTurns,\n lastExtractionAt: this.entry.lastExtractionAt,\n extractionCount: this.entry.extractionCount,\n };\n return {\n turns: this.entry.turns,\n lastExtractionAt: this.entry.lastExtractionAt,\n extractionCount: this.entry.extractionCount,\n entries,\n };\n }\n\n async saveBuffer(state: BufferState): Promise<void> {\n // Whole-state fallback (the claim covers one session): persist the entry.\n const entry = state.entries?.[this.key];\n await this.claims.writeEntry(this.key, this.ownerId, entry ?? { turns: [], lastExtractionAt: null, extractionCount: 0 }, this.entry);\n }\n\n async saveBufferSession(key: string, entry: BufferEntryState): Promise<void> {\n await this.claims.writeEntry(key, this.ownerId, entry, key === this.key ? this.entry : undefined);\n }\n\n async deleteBufferSession(): Promise<void> {\n // The claim is removed by the ack path, never by a buffer eviction: the\n // drain decides when the session is finished.\n }\n}\n\nexport class BufferDrainRunner {\n constructor(private readonly orchestrator: Orchestrator) {}\n\n /** The claim store of this orchestrator's memory root. */\n get claims(): BufferDrainClaims {\n return this.orchestrator.storage.bufferDrainClaims();\n }\n\n /**\n * Drain one claimed session. The caller owns the lease (it may have taken\n * it already); this method verifies ownership before touching content.\n */\n async drainSession(key: string, options: BufferDrainRunnerOptions): Promise<DrainSessionOutcome> {\n const claims = this.claims;\n const leaseMs = options.leaseMs ?? DEFAULT_LEASE_MS;\n const lease: DrainLease = {\n ownerId: options.ownerId,\n pid: process.pid,\n host: hostname(),\n acquiredAt: new Date().toISOString(),\n heartbeatAt: new Date().toISOString(),\n leaseMs,\n };\n const claim = await claims.load(key);\n if (!claim) {\n return { key, status: \"skipped\", turnsAtStart: 0, turnsRemaining: 0, persistedCount: 0, durableOutputCount: 0, reason: \"not_claimed\" };\n }\n const turnsAtStart = claim.entry.turns.length + (claim.entry.retainedTurns?.length ?? 0);\n options.onEvent?.({ type: \"session_started\", key, turns: turnsAtStart });\n\n // Take the lease unless this drainer already holds it.\n const held = await claims.adopt(key, lease);\n if (held === \"busy\") {\n const outcome: DrainSessionOutcome = {\n key,\n status: \"skipped\",\n turnsAtStart,\n turnsRemaining: turnsAtStart,\n persistedCount: 0,\n durableOutputCount: 0,\n reason: \"claimed_by_another_drain\",\n };\n options.onEvent?.({ type: \"session_finished\", key, outcome });\n return outcome;\n }\n\n // The claim is the buffer for this run: every successful chunk is\n // removed from it, so a kill leaves exactly the un-extracted turns.\n // The swap covers the whole extraction (its clear path reads the live\n // buffer), so progress lands in the claim, not in a session file.\n const claimStorage = new ClaimBufferStorage(claims, key, options.ownerId, claim.entry);\n const coordinator = new TurnIngestionCoordinator(selfDeps<TurnIngestionDeps>(this.orchestrator));\n\n // The claim's turns (retained first, like the live buffer's order).\n const turns = [...(claim.entry.retainedTurns ?? []), ...claim.entry.turns];\n if (turns.length === 0) {\n await claims.ack(key, options.ownerId);\n const outcome: DrainSessionOutcome = {\n key,\n status: \"drained\",\n turnsAtStart,\n turnsRemaining: 0,\n persistedCount: 0,\n durableOutputCount: 0,\n };\n options.onEvent?.({ type: \"session_finished\", key, outcome });\n return outcome;\n }\n\n // Keep the lease alive while a long extraction runs; a lost lease means\n // another drainer took the claim, so this run must stop instead of\n // writing progress into a claim it no longer owns.\n const abort = new AbortController();\n const signal = options.signal ? AbortSignal.any([options.signal, abort.signal]) : abort.signal;\n const heartbeat = setInterval(() => {\n void claims\n .heartbeat(key, options.ownerId, leaseMs)\n .then((state) => {\n if (state === \"lost\") abort.abort(new Error(`buffer drain: lease lost for session ${key}`));\n })\n .catch((err: Error) => {\n // A heartbeat that cannot be renewed is a lease that cannot be\n // held: another drainer may adopt the claim, so stop this run\n // cleanly at the next chunk boundary (the next run resumes it).\n abort.abort(new Error(`buffer drain: lease heartbeat failed for session ${key}: ${describeError(err)}`));\n });\n }, Math.max(1_000, Math.floor(leaseMs / 3)));\n heartbeat.unref?.();\n\n const settledResult = await this.orchestrator.withBufferStorage(claimStorage, async () => {\n const swapTurns = this.orchestrator.buffer.getTurns(key);\n const { promise, resolve } = Promise.withResolvers<{ error?: unknown; result?: ExtractionRunResult }>();\n let settled = false;\n void coordinator\n .queueBufferedExtraction(swapTurns, \"trigger_mode\", {\n bufferKey: key,\n clearBufferAfterExtraction: true,\n // The drain owns this session's content: the daemon's own dedupe\n // gate must not skip it, and the thresholds do not apply to a\n // backlog.\n skipDedupeCheck: true,\n skipCharThreshold: true,\n skipUserTurnThreshold: true,\n abortSignal: signal,\n onTaskSettled: (error, result) => {\n if (settled) return;\n settled = true;\n resolve({ error, result });\n },\n })\n .catch((error: DrainExtractionError) => {\n if (settled) return;\n settled = true;\n resolve({ error });\n });\n return await promise;\n });\n clearInterval(heartbeat);\n const remaining = await claims.load(key);\n const turnsRemaining = remaining\n ? remaining.entry.turns.length + (remaining.entry.retainedTurns?.length ?? 0)\n : 0;\n const result = settledResult.result;\n const persistedCount = result?.persistedCount ?? 0;\n const durableOutputCount = result?.durableOutputCount ?? 0;\n\n let status: DrainSessionStatus;\n let reason: string | undefined;\n if (turnsRemaining === 0) {\n // Everything extracted (or dropped with a recovery side-file): the\n // claim is finished and the session file is gone for good.\n await claims.ack(key, options.ownerId);\n status = \"drained\";\n } else if (settledResult.error) {\n // A failed run keeps the remaining turns for the next attempt.\n await claims.releaseLease(key, options.ownerId);\n status = \"failed\";\n reason = describeError(settledResult.error);\n } else {\n // Deferred: provider breaker / backoff / a chunk still pending. The\n // content stays claimed and the next run resumes it.\n await claims.releaseLease(key, options.ownerId);\n status = \"deferred\";\n reason = result?.reason ?? \"deferred\";\n }\n log.info(\n `buffer drain: session ${key} ${status} (${turnsRemaining} turn(s) remaining)`,\n );\n const outcome: DrainSessionOutcome = {\n key,\n status,\n turnsAtStart,\n turnsRemaining,\n persistedCount,\n durableOutputCount,\n };\n if (reason !== undefined) outcome.reason = reason;\n options.onEvent?.({ type: \"session_finished\", key, outcome });\n return outcome;\n }\n\n /** Claim a session file for the drain. Returns false when it is not claimable. */\n async claim(key: string, ownerId: string, leaseMs = DEFAULT_LEASE_MS): Promise<boolean> {\n const lease: DrainLease = {\n ownerId,\n pid: process.pid,\n host: hostname(),\n acquiredAt: new Date().toISOString(),\n heartbeatAt: new Date().toISOString(),\n leaseMs,\n };\n return (await this.claims.claimFromSessionFile(key, lease)) === \"claimed\";\n }\n\n /** Sessions with buffered turns, claimed or not (CLI scan). */\n async scan(): Promise<{ key: string; turns: number; claimed: boolean }[]> {\n const sessions = await this.orchestrator.storage.loadBuffer();\n const entries = sessions.entries ?? {};\n const out: { key: string; turns: number; claimed: boolean }[] = [];\n const seen = new Set<string>();\n for (const [key, entry] of Object.entries(entries)) {\n seen.add(key);\n const claim = this.claims.isClaimed(key) ? await this.claims.load(key) : null;\n const turns = claim\n ? claim.entry.turns.length + (claim.entry.retainedTurns?.length ?? 0)\n : entry.turns.length + (entry.retainedTurns?.length ?? 0);\n out.push({ key, turns, claimed: claim !== null });\n }\n // Claims the buffer state no longer lists (drained by an earlier run\n // whose claim file outlived its session file).\n for (const listed of await this.claims.list()) {\n if (seen.has(listed.key)) continue;\n out.push({ key: listed.key, turns: listed.turnCount, claimed: true });\n }\n return out;\n }\n}\n"],"mappings":"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","names":["outcome","result"]}
|
|
1
|
+
{"version":3,"sources":["../../src/orchestration/buffer-drain-runner.ts"],"sourcesContent":["/**\n * Out-of-process extraction-buffer drain (`remnic buffer drain`).\n *\n * The runner owns ONE claimed session at a time and drives it through the\n * SAME extraction pipeline the daemon uses — the same chunking\n * (`chunkExtractionWindow` + the model's input budget), the same retry /\n * provider-circuit semantics, the same dropped-chunk side-file recovery. It\n * adds no extraction logic of its own.\n *\n * The difference is ownership: the claimed session's turns live in a drain\n * claim (a durable file), not in a live buffer. So the runner wires a\n * claim-backed `SmartBuffer` into the extraction queue instead of the live\n * one. Every chunk that extracts successfully is removed from the claim\n * immediately, which makes the drain resumable: a kill at any instant\n * leaves the un-extracted turns in the claim, and the next run continues\n * from there.\n *\n * Concurrency lives in the CLI (worker processes, one session each at a\n * time): the in-process extraction queue is serial by design, so a single\n * runner never runs two sessions' extractions at once.\n */\n\nimport type { BufferStorage } from \"../buffer-persistence.js\";\nimport { BufferDrainClaims, type DrainLease } from \"../storage/buffer-drain-claims.js\";\nimport type { BufferEntryState, BufferState } from \"../types.js\";\nimport { hostname } from \"node:os\";\nimport { describeError } from \"../buffer-turn-helpers.js\";\nimport { log } from \"../logger.js\";\nimport { selfDeps } from \"./self-deps.js\";\nimport { TurnIngestionCoordinator, type TurnIngestionDeps } from \"./turn-ingestion.js\";\nimport type { ExtractionRunResult } from \"./extraction-run.js\";\nimport type { Orchestrator } from \"../orchestrator.js\";\n\nexport type DrainSessionStatus = \"drained\" | \"deferred\" | \"failed\" | \"skipped\";\n\nexport interface DrainSessionOutcome {\n key: string;\n status: DrainSessionStatus;\n /** Turns the claim held when the drain started. */\n turnsAtStart: number;\n /** Turns still in the claim when the drain stopped. */\n turnsRemaining: number;\n /** Facts the extraction persisted during this run. */\n persistedCount: number;\n /** Durable outputs (memories + entities) the extraction wrote. */\n durableOutputCount: number;\n /** Why the session was skipped or deferred (machine-readable). */\n reason?: string;\n}\n\nexport interface BufferDrainRunnerOptions {\n /** Identity of this drainer; owns the lease it takes. */\n ownerId: string;\n /** Lease lifetime in ms. The heartbeat keeps it alive while draining. */\n leaseMs?: number;\n /** Cancels the run at the next chunk boundary. */\n signal?: AbortSignal;\n /** Progress callback (per session, and per claim transition). */\n onEvent?: (event: DrainRunnerEvent) => void;\n}\n\n/** A failed drain run: the reason a chunk or the session could not finish. */\nexport type DrainExtractionError = Error;\n\nexport type DrainRunnerEvent =\n | { type: \"session_started\"; key: string; turns: number }\n | { type: \"session_finished\"; key: string; outcome: DrainSessionOutcome };\n\nconst DEFAULT_LEASE_MS = 120_000;\n\n/**\n * A `BufferStorage` view of one drain claim: the claim file IS the buffer.\n * Writes are the drain's progress (what is left to extract), so every\n * successfully extracted chunk is durably removed before the next one runs.\n */\nclass ClaimBufferStorage implements BufferStorage {\n constructor(\n private readonly claims: BufferDrainClaims,\n private readonly key: string,\n private readonly ownerId: string,\n private readonly entry: BufferEntryState,\n ) {}\n\n async loadBuffer(): Promise<BufferState> {\n const entries: NonNullable<BufferState[\"entries\"]> = Object.create(null);\n entries[this.key] = {\n turns: this.entry.turns,\n retainedTurns: this.entry.retainedTurns,\n lastExtractionAt: this.entry.lastExtractionAt,\n extractionCount: this.entry.extractionCount,\n };\n return {\n turns: this.entry.turns,\n lastExtractionAt: this.entry.lastExtractionAt,\n extractionCount: this.entry.extractionCount,\n entries,\n };\n }\n\n async saveBuffer(state: BufferState): Promise<void> {\n // Whole-state fallback (the claim covers one session): persist the entry.\n const entry = state.entries?.[this.key];\n await this.claims.writeEntry(this.key, this.ownerId, entry ?? { turns: [], lastExtractionAt: null, extractionCount: 0 }, this.entry);\n }\n\n async saveBufferSession(key: string, entry: BufferEntryState): Promise<void> {\n await this.claims.writeEntry(key, this.ownerId, entry, key === this.key ? this.entry : undefined);\n }\n\n async deleteBufferSession(): Promise<void> {\n // The claim is removed by the ack path, never by a buffer eviction: the\n // drain decides when the session is finished.\n }\n}\n\nexport class BufferDrainRunner {\n constructor(private readonly orchestrator: Orchestrator) {}\n\n /** The claim store of this orchestrator's memory root. */\n get claims(): BufferDrainClaims {\n return this.orchestrator.storage.bufferDrainClaims();\n }\n\n /**\n * Drain one claimed session. The caller owns the lease (it may have taken\n * it already); this method verifies ownership before touching content.\n */\n async drainSession(key: string, options: BufferDrainRunnerOptions): Promise<DrainSessionOutcome> {\n const claims = this.claims;\n const leaseMs = options.leaseMs ?? DEFAULT_LEASE_MS;\n const lease: DrainLease = {\n ownerId: options.ownerId,\n pid: process.pid,\n host: hostname(),\n acquiredAt: new Date().toISOString(),\n heartbeatAt: new Date().toISOString(),\n leaseMs,\n };\n const claim = await claims.load(key);\n if (!claim) {\n return { key, status: \"skipped\", turnsAtStart: 0, turnsRemaining: 0, persistedCount: 0, durableOutputCount: 0, reason: \"not_claimed\" };\n }\n const turnsAtStart = claim.entry.turns.length + (claim.entry.retainedTurns?.length ?? 0);\n options.onEvent?.({ type: \"session_started\", key, turns: turnsAtStart });\n\n // Take the lease unless this drainer already holds it.\n const held = await claims.adopt(key, lease);\n if (held === \"busy\") {\n const outcome: DrainSessionOutcome = {\n key,\n status: \"skipped\",\n turnsAtStart,\n turnsRemaining: turnsAtStart,\n persistedCount: 0,\n durableOutputCount: 0,\n reason: \"claimed_by_another_drain\",\n };\n options.onEvent?.({ type: \"session_finished\", key, outcome });\n return outcome;\n }\n\n // The claim is the buffer for this run: every successful chunk is\n // removed from it, so a kill leaves exactly the un-extracted turns.\n // The swap covers the whole extraction (its clear path reads the live\n // buffer), so progress lands in the claim, not in a session file.\n const claimStorage = new ClaimBufferStorage(claims, key, options.ownerId, claim.entry);\n const coordinator = new TurnIngestionCoordinator(selfDeps<TurnIngestionDeps>(this.orchestrator));\n\n // The claim's turns (retained first, like the live buffer's order).\n const turns = [...(claim.entry.retainedTurns ?? []), ...claim.entry.turns];\n if (turns.length === 0) {\n await claims.ack(key, options.ownerId);\n const outcome: DrainSessionOutcome = {\n key,\n status: \"drained\",\n turnsAtStart,\n turnsRemaining: 0,\n persistedCount: 0,\n durableOutputCount: 0,\n };\n options.onEvent?.({ type: \"session_finished\", key, outcome });\n return outcome;\n }\n\n // Keep the lease alive while a long extraction runs; a lost lease means\n // another drainer took the claim, so this run must stop instead of\n // writing progress into a claim it no longer owns.\n const abort = new AbortController();\n const signal = options.signal ? AbortSignal.any([options.signal, abort.signal]) : abort.signal;\n const heartbeat = setInterval(() => {\n void claims\n .heartbeat(key, options.ownerId, leaseMs)\n .then((state) => {\n if (state === \"lost\") abort.abort(new Error(`buffer drain: lease lost for session ${key}`));\n })\n .catch((err: Error) => {\n // A heartbeat that cannot be renewed is a lease that cannot be\n // held: another drainer may adopt the claim, so stop this run\n // cleanly at the next chunk boundary (the next run resumes it).\n abort.abort(new Error(`buffer drain: lease heartbeat failed for session ${key}: ${describeError(err)}`));\n });\n }, Math.max(1_000, Math.floor(leaseMs / 3)));\n heartbeat.unref?.();\n\n const settledResult = await this.orchestrator.withBufferStorage(claimStorage, async () => {\n const swapTurns = this.orchestrator.buffer.getTurns(key);\n const { promise, resolve } = Promise.withResolvers<{ error?: unknown; result?: ExtractionRunResult }>();\n let settled = false;\n void coordinator\n .queueBufferedExtraction(swapTurns, \"trigger_mode\", {\n bufferKey: key,\n clearBufferAfterExtraction: true,\n // The drain owns this session's content: the daemon's own dedupe\n // gate must not skip it, and the thresholds do not apply to a\n // backlog.\n skipDedupeCheck: true,\n skipCharThreshold: true,\n skipUserTurnThreshold: true,\n abortSignal: signal,\n onTaskSettled: (error, result) => {\n if (settled) return;\n settled = true;\n resolve({ error, result });\n },\n })\n .catch((error: DrainExtractionError) => {\n if (settled) return;\n settled = true;\n resolve({ error });\n });\n return await promise;\n });\n clearInterval(heartbeat);\n const remaining = await claims.load(key);\n const turnsRemaining = remaining\n ? remaining.entry.turns.length + (remaining.entry.retainedTurns?.length ?? 0)\n : 0;\n const result = settledResult.result;\n const persistedCount = result?.persistedCount ?? 0;\n const durableOutputCount = result?.durableOutputCount ?? 0;\n\n let status: DrainSessionStatus;\n let reason: string | undefined;\n if (turnsRemaining === 0) {\n // Everything extracted (or dropped with a recovery side-file): the\n // claim is finished and the session file is gone for good.\n await claims.ack(key, options.ownerId);\n status = \"drained\";\n } else if (settledResult.error) {\n // A failed run keeps the remaining turns for the next attempt.\n await claims.releaseLease(key, options.ownerId);\n status = \"failed\";\n reason = describeError(settledResult.error);\n } else {\n // Deferred: provider breaker / backoff / a chunk still pending. The\n // content stays claimed and the next run resumes it.\n await claims.releaseLease(key, options.ownerId);\n status = \"deferred\";\n reason = result?.reason ?? \"deferred\";\n }\n log.info(\n `buffer drain: session ${key} ${status} (${turnsRemaining} turn(s) remaining)`,\n );\n const outcome: DrainSessionOutcome = {\n key,\n status,\n turnsAtStart,\n turnsRemaining,\n persistedCount,\n durableOutputCount,\n };\n if (reason !== undefined) outcome.reason = reason;\n options.onEvent?.({ type: \"session_finished\", key, outcome });\n return outcome;\n }\n\n /** Claim a session file for the drain. Returns false when it is not claimable. */\n async claim(key: string, ownerId: string, leaseMs = DEFAULT_LEASE_MS): Promise<boolean> {\n const lease: DrainLease = {\n ownerId,\n pid: process.pid,\n host: hostname(),\n acquiredAt: new Date().toISOString(),\n heartbeatAt: new Date().toISOString(),\n leaseMs,\n };\n return (await this.claims.claimFromSessionFile(key, lease)) === \"claimed\";\n }\n\n /** Sessions with buffered turns, claimed or not (CLI scan). */\n async scan(): Promise<{ key: string; turns: number; claimed: boolean }[]> {\n const sessions = await this.orchestrator.storage.loadBuffer();\n const entries = sessions.entries ?? {};\n const out: { key: string; turns: number; claimed: boolean }[] = [];\n const seen = new Set<string>();\n for (const [key, entry] of Object.entries(entries)) {\n seen.add(key);\n const claim = this.claims.isClaimed(key) ? await this.claims.load(key) : null;\n const turns = claim\n ? claim.entry.turns.length + (claim.entry.retainedTurns?.length ?? 0)\n : entry.turns.length + (entry.retainedTurns?.length ?? 0);\n out.push({ key, turns, claimed: claim !== null });\n }\n // Claims the buffer state no longer lists (drained by an earlier run\n // whose claim file outlived its session file).\n for (const listed of await this.claims.list()) {\n if (seen.has(listed.key)) continue;\n out.push({ key: listed.key, turns: listed.turnCount, claimed: true });\n }\n return out;\n }\n}\n"],"mappings":"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","names":["outcome","result"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extraction-persist.d.ts","sourceRoot":"","sources":["../../src/orchestration/extraction-persist.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"extraction-persist.d.ts","sourceRoot":"","sources":["../../src/orchestration/extraction-persist.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAiBxG,OAAO,EAA6C,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAM7F,OAAO,EAUgE,KAAK,8BAA8B,EACxG,KAAK,4BAA4B,EAClC,MAAM,oBAAoB,CAAC;AAqD5B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAGhF,OAAO,KAAK,EAEV,gBAAgB,EAQjB,MAAM,aAAa,CAAC;AAWrB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAmB1E,6FAA6F;AAC7F,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,4EAA4E;IAC5E,aAAa,EAAE,MAAM,CAAC;IACtB,kFAAkF;IAClF,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,qBAAa,4BAA4B;IAErC,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,qBAAqB;IAE9C,OAAO,KAAK,MAAM,GAEjB;IACD,OAAO,KAAK,6BAA6B,GAGxC;IAEK,iBAAiB,CACrB,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,cAAc,EACvB,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,EACrC,aAAa,CAAC,EAAE,uBAAuB,EACvC,aAAa,CAAC,EAAE,MAAM,EACtB,qBAAqB,CAAC,EAAE,wBAAwB,GAAG,IAAI,EACvD,UAAU,CAAC,EAAE,MAAM,EACnB,SAAS,GAAE,8BAAuF,EAClG,aAAa,GAAE,4BAAmF,GACjG,OAAO,CAAC,uBAAuB,CAAC;CA8wFpC"}
|
|
@@ -1,46 +1,44 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MaintenanceScheduler
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import "../chunk-
|
|
3
|
+
} from "../chunk-ZYEWTVNQ.js";
|
|
4
|
+
import "../chunk-HNF7IMYQ.js";
|
|
5
|
+
import "../chunk-THFSCUFC.js";
|
|
5
6
|
import "../chunk-666A3MOW.js";
|
|
6
|
-
import "../chunk-
|
|
7
|
-
import "../chunk-GHHQLSSY.js";
|
|
7
|
+
import "../chunk-XR4QR3JT.js";
|
|
8
8
|
import "../chunk-5KBIOI4G.js";
|
|
9
|
-
import "../chunk-
|
|
10
|
-
import "../chunk-
|
|
11
|
-
import "../chunk-
|
|
9
|
+
import "../chunk-2YPIFJHL.js";
|
|
10
|
+
import "../chunk-MCFI6G7U.js";
|
|
11
|
+
import "../chunk-66PEACZP.js";
|
|
12
12
|
import "../chunk-KJTKLXTH.js";
|
|
13
13
|
import "../chunk-2DQ2XREU.js";
|
|
14
14
|
import "../chunk-J5WI4QRP.js";
|
|
15
15
|
import "../chunk-EWMRFW3F.js";
|
|
16
|
-
import "../chunk-
|
|
17
|
-
import "../chunk-
|
|
16
|
+
import "../chunk-3AASGFR4.js";
|
|
17
|
+
import "../chunk-3F7N4I5I.js";
|
|
18
18
|
import "../chunk-OGXXGHW6.js";
|
|
19
19
|
import "../chunk-YUTT4ZTI.js";
|
|
20
|
-
import "../chunk-
|
|
21
|
-
import "../chunk-
|
|
22
|
-
import "../chunk-
|
|
23
|
-
import "../chunk-T6OZW2WR.js";
|
|
24
|
-
import "../chunk-QEDLJDHP.js";
|
|
20
|
+
import "../chunk-5VQSKBNF.js";
|
|
21
|
+
import "../chunk-D3AGBN6G.js";
|
|
22
|
+
import "../chunk-5RW247F5.js";
|
|
25
23
|
import "../chunk-U4LUIE6Y.js";
|
|
24
|
+
import "../chunk-T6OZW2WR.js";
|
|
26
25
|
import "../chunk-5YQXWVCP.js";
|
|
27
|
-
import "../chunk-
|
|
28
|
-
import "../chunk-
|
|
29
|
-
import "../chunk-NHWDTOBN.js";
|
|
30
|
-
import "../chunk-UHVXE24Y.js";
|
|
26
|
+
import "../chunk-QEDLJDHP.js";
|
|
27
|
+
import "../chunk-ILD7N3XC.js";
|
|
31
28
|
import "../chunk-QGVCFVX6.js";
|
|
29
|
+
import "../chunk-UHVXE24Y.js";
|
|
32
30
|
import "../chunk-IGOW4TJE.js";
|
|
33
31
|
import "../chunk-ZOBYTRBU.js";
|
|
34
32
|
import "../chunk-G6OFEGUR.js";
|
|
35
|
-
import "../chunk-
|
|
36
|
-
import "../chunk-
|
|
33
|
+
import "../chunk-JEX2JL3U.js";
|
|
34
|
+
import "../chunk-U2A56LLF.js";
|
|
35
|
+
import "../chunk-DOJBV6WR.js";
|
|
36
|
+
import "../chunk-PFUXPTBT.js";
|
|
37
37
|
import "../chunk-CYEPCZN5.js";
|
|
38
38
|
import "../chunk-DLZGSZVC.js";
|
|
39
39
|
import "../chunk-OVZIYLBZ.js";
|
|
40
|
-
import "../chunk-EXYT52NR.js";
|
|
41
|
-
import "../chunk-DOJBV6WR.js";
|
|
42
|
-
import "../chunk-PFUXPTBT.js";
|
|
43
40
|
import "../chunk-WNEVEMJ3.js";
|
|
41
|
+
import "../chunk-EXYT52NR.js";
|
|
44
42
|
import "../chunk-Y5NLBXPV.js";
|
|
45
43
|
import "../chunk-TFA6HPOA.js";
|
|
46
44
|
import "../chunk-F4TWWUMP.js";
|
|
@@ -58,14 +56,15 @@ import "../chunk-WXPBDEMW.js";
|
|
|
58
56
|
import "../chunk-AAD2ZS6P.js";
|
|
59
57
|
import "../chunk-BV2BRHD4.js";
|
|
60
58
|
import "../chunk-ZIKENA2C.js";
|
|
59
|
+
import "../chunk-3ONXXHQO.js";
|
|
61
60
|
import "../chunk-YXZG5TVN.js";
|
|
62
61
|
import "../chunk-3OUGSOJP.js";
|
|
63
62
|
import "../chunk-SCU65EZI.js";
|
|
64
|
-
import "../chunk-3ONXXHQO.js";
|
|
65
|
-
import "../chunk-3WU7XOFN.js";
|
|
66
63
|
import "../chunk-P4GUQSK3.js";
|
|
67
64
|
import "../chunk-4LZ7SVKM.js";
|
|
68
65
|
import "../chunk-YHTG64XV.js";
|
|
66
|
+
import "../chunk-3WU7XOFN.js";
|
|
67
|
+
import "../chunk-G7D6GZ5J.js";
|
|
69
68
|
import "../chunk-ER7XANP3.js";
|
|
70
69
|
import "../chunk-M5GVCJSJ.js";
|
|
71
70
|
import "../chunk-RBOJCG4T.js";
|
|
@@ -73,18 +72,17 @@ import "../chunk-IAYUTGF2.js";
|
|
|
73
72
|
import "../chunk-5WITETWU.js";
|
|
74
73
|
import "../chunk-6CIAGZ6X.js";
|
|
75
74
|
import "../chunk-7CT3AI52.js";
|
|
76
|
-
import "../chunk-G7D6GZ5J.js";
|
|
77
75
|
import "../chunk-7VLBZKNB.js";
|
|
78
76
|
import "../chunk-Y33KJ556.js";
|
|
79
|
-
import "../chunk-
|
|
80
|
-
import "../chunk-IUM3VSHI.js";
|
|
77
|
+
import "../chunk-WBN66HPI.js";
|
|
81
78
|
import "../chunk-NWA6IXR3.js";
|
|
82
79
|
import "../chunk-VILPVT4S.js";
|
|
83
80
|
import "../chunk-AF2XMJKD.js";
|
|
84
81
|
import "../chunk-OR42ZI54.js";
|
|
85
|
-
import "../chunk-
|
|
82
|
+
import "../chunk-IUM3VSHI.js";
|
|
86
83
|
import "../chunk-C64XATK7.js";
|
|
87
84
|
import "../chunk-42JKGUFJ.js";
|
|
85
|
+
import "../chunk-23G5P7TA.js";
|
|
88
86
|
import "../chunk-U7MIMS2Y.js";
|
|
89
87
|
import "../chunk-AVVCPA7U.js";
|
|
90
88
|
import "../chunk-I55KAVET.js";
|
|
@@ -92,13 +90,15 @@ import "../chunk-L2EXJQJP.js";
|
|
|
92
90
|
import "../chunk-45GF7Y3V.js";
|
|
93
91
|
import "../chunk-YIJECSIX.js";
|
|
94
92
|
import "../chunk-E2AWJ7KQ.js";
|
|
93
|
+
import "../chunk-W5BIQOAJ.js";
|
|
95
94
|
import "../chunk-HADD45AR.js";
|
|
96
95
|
import "../chunk-RNFMFC37.js";
|
|
97
96
|
import "../chunk-C5C7IJ4Q.js";
|
|
97
|
+
import "../chunk-TBBDFYXW.js";
|
|
98
98
|
import "../chunk-YCVB7X56.js";
|
|
99
|
+
import "../chunk-TOTT6S2V.js";
|
|
99
100
|
import "../chunk-PQVCH2AE.js";
|
|
100
101
|
import "../chunk-PJKTFXE2.js";
|
|
101
|
-
import "../chunk-W5BIQOAJ.js";
|
|
102
102
|
import "../chunk-V4XE263I.js";
|
|
103
103
|
import "../chunk-YBA52OKG.js";
|
|
104
104
|
import "../chunk-2D7BTSDW.js";
|
|
@@ -118,8 +118,8 @@ import "../chunk-7RJUVTVF.js";
|
|
|
118
118
|
import "../chunk-AL3UYZ5N.js";
|
|
119
119
|
import "../chunk-RL6NEVXT.js";
|
|
120
120
|
import "../chunk-YET735EZ.js";
|
|
121
|
-
import "../chunk-PWPIERBM.js";
|
|
122
121
|
import "../chunk-YO2JEX2Z.js";
|
|
122
|
+
import "../chunk-PWPIERBM.js";
|
|
123
123
|
import "../chunk-KQUSP6LB.js";
|
|
124
124
|
import "../chunk-5FVVY2EB.js";
|
|
125
125
|
import "../chunk-BTNNL7ZW.js";
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Promotion destination writes under the fact-dedup commit window (codex P2,
|
|
3
|
+
* PRRT_kwDORJXyws6zzdG4 / #3311). The persist-time promotion gates run
|
|
4
|
+
* OUTSIDE the window that serializes source writes, so with
|
|
5
|
+
* extractionQueueConcurrency > 1 two sessions promoting the same fact from
|
|
6
|
+
* different source namespaces can both gate-miss and both write the shared
|
|
7
|
+
* destination — duplicate active copies, because writeMemory mints a fresh id
|
|
8
|
+
* per write and does not coalesce active duplicates. This module wraps each
|
|
9
|
+
* promotion destination write in `persistUnderFactDedupWindow` keyed on the
|
|
10
|
+
* DESTINATION storage dir and rechecks with the same connector/content
|
|
11
|
+
* predicate the promotion gates confirm with, so a twin promotion committed
|
|
12
|
+
* between the gate and the write is suppressed instead of duplicated.
|
|
13
|
+
*
|
|
14
|
+
* Split out of extraction-persist.ts for the structural ratchet (#1995);
|
|
15
|
+
* behavior is a verbatim move of the wrapped writes the persist closure
|
|
16
|
+
* previously inlined.
|
|
17
|
+
*/
|
|
18
|
+
import { type StorageManager } from "../index.js";
|
|
19
|
+
import type { ImportanceScore, MemoryFrontmatter, ProvenanceSource } from "../types.js";
|
|
20
|
+
import type { SealedMemoryEnvelope } from "../write-envelope.js";
|
|
21
|
+
import type { DependencyPropagationDeliveryPort } from "./dependency-propagation-delivery.js";
|
|
22
|
+
import { type FactDedupWindowOutcome } from "./fact-dedup-window.js";
|
|
23
|
+
/**
|
|
24
|
+
* The promotion fields the windowed write and its suppression-path bounds
|
|
25
|
+
* backfill read. Structurally satisfied by both promotion closures' options
|
|
26
|
+
* objects in extraction-persist.ts (profile-target and shared).
|
|
27
|
+
*/
|
|
28
|
+
export interface PromotionDedupWriteFields {
|
|
29
|
+
category: string;
|
|
30
|
+
sourceMemoryId: string;
|
|
31
|
+
importance?: ImportanceScore;
|
|
32
|
+
intentGoal?: string;
|
|
33
|
+
intentActionType?: string;
|
|
34
|
+
intentEntityTypes?: string[];
|
|
35
|
+
memoryKind?: MemoryFrontmatter["memoryKind"];
|
|
36
|
+
validAt?: string;
|
|
37
|
+
invalidAt?: string;
|
|
38
|
+
observedAt?: string;
|
|
39
|
+
eventTimeSource?: "extracted" | "assumed";
|
|
40
|
+
sources?: ProvenanceSource[];
|
|
41
|
+
provenance?: "verified" | "unverified" | "none";
|
|
42
|
+
toolScoped?: true;
|
|
43
|
+
}
|
|
44
|
+
export interface PromotionDedupWriteArgs {
|
|
45
|
+
/** Promotion DESTINATION storage — the commit window is keyed on its dir. */
|
|
46
|
+
destination: StorageManager;
|
|
47
|
+
/** Composed sealed envelope for the promoted copy. */
|
|
48
|
+
envelope: SealedMemoryEnvelope;
|
|
49
|
+
/** The promotion closure's options (read structurally). */
|
|
50
|
+
promotion: PromotionDedupWriteFields;
|
|
51
|
+
/** Fact hash-key content (attrs-suffixed); pre-citation raw for others. */
|
|
52
|
+
dedupContent: string;
|
|
53
|
+
rawContent: string;
|
|
54
|
+
/** promotionWithholdsToolScope() result (shared) / forwarded marker (profile). */
|
|
55
|
+
toolScoped: boolean;
|
|
56
|
+
/** Raw source connector: trimmed for the recheck, raw for bounds backfill. */
|
|
57
|
+
connector: string | undefined;
|
|
58
|
+
citationEnabled: boolean;
|
|
59
|
+
citationTemplate: string;
|
|
60
|
+
/** lifecycleCaps.temporalSupersession on the shared path; false on the
|
|
61
|
+
* profile path (its gate predicate has no entity filter). When true AND the
|
|
62
|
+
* envelope carries an entityRef with non-empty surviving attrs, the recheck
|
|
63
|
+
* additionally requires the same entity (PR #402 Uybg guard parity). */
|
|
64
|
+
sameEntityGuardEnabled: boolean;
|
|
65
|
+
/** Envelope-surviving structured attributes (PR #402 Uybg guard input). */
|
|
66
|
+
survivingAttrs?: Record<string, string> | null;
|
|
67
|
+
/** When set, the suppression path runs the post-write supersession pass
|
|
68
|
+
* against the winning copy (PRRT_kwDORJXyws6z18qb): a suppressed
|
|
69
|
+
* later-dated promotion must still retire a conflicting shared fact dated
|
|
70
|
+
* between the events, mirroring the gate's hash-dedup-hit pass. */
|
|
71
|
+
supersession?: {
|
|
72
|
+
/** Caller's lifecycleCaps.temporalSupersession — without it the pass
|
|
73
|
+
* must not run even though the event-time `enabled` gate passes
|
|
74
|
+
* (PRRT_kwDORJXyws6z2o1t). */
|
|
75
|
+
supersessionEnabled: boolean;
|
|
76
|
+
dependencyPropagationDelivery?: DependencyPropagationDeliveryPort;
|
|
77
|
+
namespaceScope?: string;
|
|
78
|
+
};
|
|
79
|
+
backfillTemporalBoundsOnDedupHit: ExtractionPersistDeps["backfillTemporalBoundsOnDedupHit"];
|
|
80
|
+
}
|
|
81
|
+
type ExtractionPersistDeps = {
|
|
82
|
+
backfillTemporalBoundsOnDedupHit: (targetStorage: StorageManager, dedupContent: string, bounds: {
|
|
83
|
+
invalidAt?: string;
|
|
84
|
+
validFrom?: string;
|
|
85
|
+
observedAt?: string;
|
|
86
|
+
eventTimeSource?: "extracted" | "assumed";
|
|
87
|
+
}, entityRef?: string, sourceConnector?: string) => Promise<void>;
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* In-window race confirm for a promotion destination. Authoritative index +
|
|
91
|
+
* miss is a clean NOT-duplicate answered WITHOUT the corpus scan, mirroring
|
|
92
|
+
* `confirmActiveFactDuplicate` and the window contract (one corpus confirm +
|
|
93
|
+
* one write, not a scan-length lock) — PRRT_kwDORJXyws6z18qS. On a hit, a
|
|
94
|
+
* non-authoritative index, or a probe failure, confirm against the corpus
|
|
95
|
+
* with the gates' predicate.
|
|
96
|
+
*/
|
|
97
|
+
export declare function confirmPromotionRaceDuplicate(args: {
|
|
98
|
+
storage: StorageManager;
|
|
99
|
+
dedupContent: string;
|
|
100
|
+
category: string;
|
|
101
|
+
connector: string | undefined;
|
|
102
|
+
citationEnabled: boolean;
|
|
103
|
+
citationTemplate: string;
|
|
104
|
+
entityKeyNorm?: string;
|
|
105
|
+
}): Promise<boolean>;
|
|
106
|
+
/**
|
|
107
|
+
* Run one promotion destination write inside the destination-dir fact-dedup
|
|
108
|
+
* commit window: recheck (facts only; the same confirm the persist-time gate
|
|
109
|
+
* used, now under the lock) and suppress as a duplicate when a concurrent
|
|
110
|
+
* promotion committed the same content first. A suppressed promotion backfills
|
|
111
|
+
* temporal bounds onto the winning copy (#1671 parity with the gates' skip
|
|
112
|
+
* paths) and reports `{ suppressed: true }`. Lock contention throws
|
|
113
|
+
* fail-closed to the caller — never an unlocked write; the durable source
|
|
114
|
+
* fact is unaffected.
|
|
115
|
+
*/
|
|
116
|
+
export declare function writePromotionUnderFactDedupWindow(args: PromotionDedupWriteArgs): Promise<FactDedupWindowOutcome<Awaited<ReturnType<StorageManager["writeSealedMemory"]>>>>;
|
|
117
|
+
export {};
|
|
118
|
+
//# sourceMappingURL=promotion-dedup-window.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promotion-dedup-window.d.ts","sourceRoot":"","sources":["../../src/orchestration/promotion-dedup-window.ts"],"names":[],"mappings":"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"}
|