@remnic/core 10.0.59 → 10.0.61
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 -50
- package/dist/access-authorization-probe.js +54 -51
- package/dist/access-boundary.js +53 -50
- package/dist/access-cli.js +143 -140
- package/dist/access-cli.js.map +1 -1
- package/dist/access-extraction-force-flush.js +53 -50
- package/dist/access-http-briefing.js +54 -51
- package/dist/access-http-query.js +55 -52
- package/dist/access-http.js +76 -73
- package/dist/access-identity-continuity-surface.js +53 -50
- package/dist/access-lcm-surface.js +53 -50
- package/dist/access-mcp.js +64 -61
- package/dist/access-namespace-preflight.js +53 -50
- package/dist/access-observe-write-category.js +10 -10
- package/dist/access-observe-write-surface.js +53 -50
- package/dist/access-offline-manifest.js +7 -7
- package/dist/access-operations-batch.js +56 -53
- package/dist/access-operations.js +63 -60
- package/dist/access-recall-concurrency.js +53 -50
- package/dist/access-recall-response.js +53 -50
- package/dist/access-recall-surface.js +53 -50
- package/dist/access-schema.js +9 -9
- package/dist/access-service.js +53 -50
- package/dist/access-surface-catalog.js +55 -52
- package/dist/access-surface-catalog.js.map +1 -1
- package/dist/active-recall.js +24 -20
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +7 -7
- package/dist/adapters/registry.js +3 -3
- package/dist/briefing.js +16 -12
- package/dist/buffer-persistence.d.ts +14 -3
- package/dist/buffer-persistence.d.ts.map +1 -1
- package/dist/buffer-persistence.js +1 -1
- package/dist/buffer-turn-helpers.d.ts +7 -0
- package/dist/buffer-turn-helpers.d.ts.map +1 -1
- package/dist/buffer-turn-helpers.js +5 -3
- package/dist/buffer.d.ts +2 -0
- package/dist/buffer.d.ts.map +1 -1
- package/dist/buffer.js +7 -7
- package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-GWVG7LGC.js} +2 -2
- package/dist/causal-behavior.js +2 -2
- package/dist/causal-chain.js +2 -2
- package/dist/causal-consolidation.js +19 -15
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-retrieval.js +2 -2
- package/dist/causal-trajectory-graph.js +2 -2
- package/dist/causal-trajectory.js +1 -1
- package/dist/{chunk-ZAZZOQAQ.js → chunk-23OEPU3K.js} +2 -2
- package/dist/{chunk-XDKEHZUC.js → chunk-264B57GV.js} +2 -2
- package/dist/{chunk-5U2BBF7E.js → chunk-46U6L5DM.js} +20 -10
- package/dist/chunk-46U6L5DM.js.map +1 -0
- package/dist/chunk-4LZ7SVKM.js +211 -0
- package/dist/chunk-4LZ7SVKM.js.map +1 -0
- package/dist/{chunk-NRGQ5HJO.js → chunk-4P4VLPGB.js} +1 -1
- package/dist/{chunk-GIRWNTMV.js → chunk-4PG5R6BJ.js} +2 -2
- package/dist/{chunk-52II7PB6.js → chunk-645WOU5I.js} +4 -4
- package/dist/{chunk-RG3I2663.js → chunk-64JLBFCQ.js} +2 -2
- package/dist/{chunk-G3T6YMBO.js → chunk-64S6X4IU.js} +7 -7
- package/dist/{chunk-WASVDS6G.js → chunk-6HTEPYOI.js} +4 -4
- package/dist/{chunk-6AEKSOWV.js → chunk-6I6DFULH.js} +8 -8
- package/dist/{chunk-DJR37Q37.js → chunk-6T4CMKNP.js} +2 -2
- package/dist/{chunk-RHJ5VGB3.js → chunk-73A2DDDR.js} +2 -2
- package/dist/{chunk-4B73TQQV.js → chunk-7AKPLEJV.js} +2 -2
- package/dist/{chunk-UHH67NLU.js → chunk-7OKYO2UC.js} +2 -2
- package/dist/{chunk-KAL5SXPP.js → chunk-7ULSP7AU.js} +6 -6
- package/dist/{chunk-USNU3BEQ.js → chunk-A4FZLM6Q.js} +2 -2
- package/dist/{chunk-VV73XT3A.js → chunk-BJLCV2P3.js} +2 -2
- package/dist/{chunk-KQAFEZQX.js → chunk-BUKK5SWA.js} +2 -2
- package/dist/{chunk-DJFULNXK.js → chunk-C2AYUXEF.js} +2 -2
- package/dist/{chunk-QY24FSXT.js → chunk-D3BYJSHX.js} +51 -51
- package/dist/{chunk-JZRQY7ZQ.js → chunk-D4WR56FR.js} +2 -2
- package/dist/{chunk-3E3Z6UA3.js → chunk-DMYNM3WG.js} +124 -97
- package/dist/chunk-DMYNM3WG.js.map +1 -0
- package/dist/{chunk-FB4JQEFS.js → chunk-DP22K7IC.js} +2 -2
- package/dist/{chunk-EJFOGYF3.js → chunk-DTQJ7BRN.js} +3 -3
- package/dist/{chunk-MLUPSZFK.js → chunk-DZL5PBEJ.js} +2 -2
- package/dist/{chunk-JD5F5MYN.js → chunk-EGCC5OJE.js} +3 -3
- package/dist/{chunk-IQSRVR6Z.js → chunk-EJ4RS7I7.js} +2 -2
- package/dist/{chunk-WBN66HPI.js → chunk-ELHJK7LM.js} +6 -6
- package/dist/{chunk-EH46DHBU.js → chunk-ENAPZQA6.js} +2 -2
- package/dist/{chunk-LLG5VNK7.js → chunk-F2UAAI6B.js} +2 -2
- package/dist/{chunk-YZNTAOPZ.js → chunk-FKNNWH7P.js} +2 -2
- package/dist/{chunk-AAANTXCQ.js → chunk-FZVZYU5C.js} +2 -2
- package/dist/{chunk-ON77FQXH.js → chunk-G6GMZJQ4.js} +2 -2
- package/dist/{chunk-OL7A7NKH.js → chunk-GNP4BV4Z.js} +2 -2
- package/dist/{chunk-GDYLZ6FR.js → chunk-HJ3UTGIW.js} +3 -3
- package/dist/{chunk-CCL2OXFO.js → chunk-HSHLDSPX.js} +3 -3
- package/dist/{chunk-R4BR62UO.js → chunk-HWMGQDZI.js} +2 -2
- package/dist/{chunk-BPIAXMGC.js → chunk-IIUEHIQ2.js} +2 -2
- package/dist/{chunk-RTJJPW3C.js → chunk-ILMB3X4X.js} +5 -5
- package/dist/{chunk-RFT4OPYI.js → chunk-IPN67KVR.js} +2 -2
- package/dist/chunk-JCL7RO2G.js +674 -0
- package/dist/chunk-JCL7RO2G.js.map +1 -0
- package/dist/{chunk-IEW6NDHX.js → chunk-JGSWWD33.js} +9 -9
- package/dist/{chunk-A3UFV4K3.js → chunk-JIYJIH5N.js} +2 -2
- package/dist/{chunk-4G2A7MH3.js → chunk-JKUVPVKR.js} +3 -3
- package/dist/{chunk-YJHOVA42.js → chunk-JL5FHZ7O.js} +30 -6
- package/dist/chunk-JL5FHZ7O.js.map +1 -0
- package/dist/{chunk-VCLNU6MY.js → chunk-L2HSSVVD.js} +2 -2
- package/dist/{chunk-U2A56LLF.js → chunk-L334PSLW.js} +8 -8
- package/dist/{chunk-HQUYENKK.js → chunk-LIUI46BX.js} +3 -3
- package/dist/{chunk-ERMT5WQM.js → chunk-MKE5DP3S.js} +2 -2
- package/dist/{chunk-4OFXLQJD.js → chunk-MPDLLLOG.js} +8 -3
- package/dist/chunk-MPDLLLOG.js.map +1 -0
- package/dist/{chunk-6BO27AWQ.js → chunk-MPJ7VHHA.js} +2 -2
- package/dist/{chunk-WXBVGKS6.js → chunk-N7RAABFM.js} +182 -421
- package/dist/chunk-N7RAABFM.js.map +1 -0
- package/dist/{chunk-KMJDH4KX.js → chunk-NSUGAIIB.js} +16 -16
- package/dist/{chunk-7NT3FKAF.js → chunk-NXHBQC2O.js} +2 -2
- package/dist/{chunk-JEX2JL3U.js → chunk-OH55F76C.js} +2 -2
- package/dist/{chunk-37VTMUAL.js → chunk-OUJ4DVR5.js} +2 -2
- package/dist/{chunk-2NLLXCJG.js → chunk-OWHERGF2.js} +2 -2
- package/dist/{chunk-2IVK5IDY.js → chunk-P5F7ISLV.js} +2 -2
- package/dist/{chunk-PM4PKC3Y.js → chunk-PNVQNAJM.js} +3 -3
- package/dist/{chunk-FXWX7VD3.js → chunk-PRYDNBCO.js} +12 -12
- package/dist/{chunk-YDDLSGYE.js → chunk-PUTH5REB.js} +2 -2
- package/dist/{chunk-GFAEKSFR.js → chunk-QBK3IM6W.js} +5 -5
- package/dist/{chunk-KRAMCBIW.js → chunk-QKXPOLQD.js} +4 -4
- package/dist/{chunk-YDT3OEYF.js → chunk-R4ZHF4K2.js} +2 -2
- package/dist/{chunk-ISNPYOXR.js → chunk-RBUR6USI.js} +5 -5
- package/dist/{chunk-WZYAXOGO.js → chunk-RZSHIJYY.js} +2 -2
- package/dist/{chunk-TYSD7UQO.js → chunk-SVTIWBSA.js} +2 -2
- package/dist/{chunk-AMKIIRLL.js → chunk-TBFAQHQZ.js} +2 -2
- package/dist/{chunk-ZE5N4JSY.js → chunk-TKCJI7WA.js} +2 -2
- package/dist/{chunk-RYB553SS.js → chunk-TLOAAOT3.js} +2 -2
- package/dist/{chunk-RKRX4C4H.js → chunk-TPKB7T6Z.js} +2 -2
- package/dist/{chunk-JZCBMKR5.js → chunk-TUCEP2LS.js} +5 -5
- package/dist/{chunk-KZMRMKC7.js → chunk-U7MIMS2Y.js} +11 -1
- package/dist/chunk-U7MIMS2Y.js.map +1 -0
- package/dist/{chunk-OMWQO7H6.js → chunk-UEDC2VGP.js} +2 -2
- package/dist/{chunk-X7Y7WX73.js → chunk-UVYI6VIX.js} +1 -1
- package/dist/{chunk-JY2BGCYN.js → chunk-VCYH2XUY.js} +2 -2
- package/dist/{chunk-NGH74LDV.js → chunk-WD2QH3JM.js} +9 -9
- package/dist/{chunk-G6A3SGCE.js → chunk-WVEEVYMH.js} +8 -25
- package/dist/chunk-WVEEVYMH.js.map +1 -0
- package/dist/{chunk-UGTYADB4.js → chunk-WWSJQ7MP.js} +3 -3
- package/dist/{chunk-UQBOPCDK.js → chunk-X4PAATLA.js} +2 -2
- package/dist/{chunk-KBOQQEVC.js → chunk-XAFSZ4DP.js} +2 -2
- package/dist/{chunk-2S6JADBB.js → chunk-XICJL56Z.js} +2 -2
- package/dist/{chunk-Y5KESB7T.js → chunk-XJDSZFBZ.js} +45 -45
- package/dist/{chunk-24SIB3EW.js → chunk-XWE3EOWX.js} +2 -2
- package/dist/{chunk-Y77FXULH.js → chunk-XWXBXBOX.js} +2 -2
- package/dist/{chunk-VKQI47DJ.js → chunk-Y7427SL7.js} +4 -4
- package/dist/{chunk-TEH5MDX5.js → chunk-YH7HJNWV.js} +22 -22
- package/dist/chunk-YHTG64XV.js +117 -0
- package/dist/chunk-YHTG64XV.js.map +1 -0
- package/dist/{chunk-EZ25VE3G.js → chunk-YNDLCWXS.js} +4 -4
- package/dist/{chunk-2M36PR7R.js → chunk-Z2T5BPOZ.js} +2 -2
- package/dist/cli.js +100 -97
- package/dist/coding/export-okf-codegraph.js +15 -11
- package/dist/coding/export-okf-codegraph.js.map +1 -1
- package/dist/coding/pre-action-gate.js +2 -2
- package/dist/compounding/engine.js +17 -13
- package/dist/config.js +24 -20
- package/dist/connectors/codex-materialize-runner.js +16 -12
- package/dist/connectors/index.js +16 -12
- package/dist/convergence-refresh.js +18 -14
- package/dist/corpus-scan-worker-host.d.ts +109 -0
- package/dist/corpus-scan-worker-host.d.ts.map +1 -0
- package/dist/corpus-scan-worker-host.js +15 -0
- package/dist/corpus-scan-worker.entry.d.ts +21 -0
- package/dist/corpus-scan-worker.entry.d.ts.map +1 -0
- package/dist/corpus-scan-worker.entry.js +60 -0
- package/dist/corpus-scan-worker.entry.js.map +1 -0
- package/dist/corpus-scan-worker.entry.mjs +176 -0
- package/dist/corpus-scan.d.ts +71 -0
- package/dist/corpus-scan.d.ts.map +1 -0
- package/dist/corpus-scan.js +16 -0
- package/dist/corpus-watermark.d.ts.map +1 -1
- package/dist/corpus-watermark.js +18 -14
- package/dist/dashboard-runtime.js +2 -2
- package/dist/deep-recall-http-glue.js +10 -10
- package/dist/embedding-fallback.js +2 -2
- package/dist/{entity-canonical-id-migration-F3JVG6K6.js → entity-canonical-id-migration-CUDCKWPF.js} +4 -2
- package/dist/entity-canonical-id-migration-CUDCKWPF.js.map +1 -0
- package/dist/entity-retrieval.js +18 -14
- package/dist/event-order-recall.js +3 -3
- package/dist/external-wiki-access.js +54 -51
- package/dist/extraction.js +21 -17
- package/dist/{graph-edge-decay-IU75NV42.js → graph-edge-decay-2BZTY2IM.js} +5 -5
- package/dist/graph-edge-decay-2BZTY2IM.js.map +1 -0
- package/dist/graph-jsonl.js +3 -3
- package/dist/graph-snapshot.js +3 -3
- package/dist/graph.js +2 -2
- package/dist/harmonic-retrieval.js +16 -12
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +174 -169
- package/dist/lcm/engine.js +2 -2
- package/dist/lcm/index.js +5 -5
- package/dist/location/index.js +18 -14
- package/dist/maintenance/memory-governance.js +16 -12
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +16 -12
- package/dist/maintenance/rebuild-memory-projection-runner.js +18 -14
- package/dist/maintenance/rebuild-memory-projection.js +17 -13
- package/dist/memory-browse-operations.js +54 -51
- package/dist/memory-browse.js +5 -5
- package/dist/namespaces/migrate.js +17 -13
- package/dist/namespaces/search.js +7 -7
- package/dist/namespaces/storage.js +16 -12
- package/dist/offline-sync-changeset-generations.js +4 -4
- package/dist/offline-sync-embedding-generation.js +3 -3
- package/dist/offline-sync-snapshot-stream.js +7 -7
- package/dist/offline-sync.js +6 -6
- package/dist/operator-doctor-corpus.js +19 -15
- package/dist/operator-toolkit.js +35 -31
- package/dist/orchestration/buffer-drain-gate.d.ts +21 -0
- package/dist/orchestration/buffer-drain-gate.d.ts.map +1 -0
- package/dist/orchestration/buffer-drain-runner.d.ts +79 -0
- package/dist/orchestration/buffer-drain-runner.d.ts.map +1 -0
- package/dist/orchestration/buffer-drain-runner.js +780 -0
- package/dist/orchestration/buffer-drain-runner.js.map +1 -0
- package/dist/orchestration/buffer-swap.d.ts +12 -0
- package/dist/orchestration/buffer-swap.d.ts.map +1 -0
- package/dist/orchestration/maintenance.js +26 -22
- package/dist/orchestration/turn-ingestion.d.ts.map +1 -1
- package/dist/orchestrator.d.ts +4 -1
- package/dist/orchestrator.d.ts.map +1 -1
- package/dist/orchestrator.js +143 -140
- package/dist/qmd.js +4 -4
- package/dist/recall-navigation-operations.js +54 -51
- package/dist/recall-navigation.js +53 -50
- package/dist/recall-state-view-admission.js +5 -5
- package/dist/recall-why-service.js +5 -5
- package/dist/resume-bundles.js +25 -21
- package/dist/search/factory.js +6 -6
- package/dist/search/index.js +12 -12
- package/dist/semantic-consolidation.js +17 -13
- package/dist/semantic-rule-promotion.js +16 -12
- package/dist/semantic-rule-verifier.js +16 -12
- package/dist/source-agent-qualifier.js +19 -15
- package/dist/standup/build.js +16 -12
- package/dist/storage/buffer-drain-claims.d.ts +159 -0
- package/dist/storage/buffer-drain-claims.d.ts.map +1 -0
- package/dist/storage/buffer-drain-claims.js +18 -0
- package/dist/storage/buffer-drain-claims.js.map +1 -0
- package/dist/storage/buffer-session-files.d.ts +14 -2
- package/dist/storage/buffer-session-files.d.ts.map +1 -1
- package/dist/storage/buffer-session-files.js +22 -0
- package/dist/storage/buffer-session-files.js.map +1 -0
- package/dist/storage/entity-canonical-id-migration.d.ts.map +1 -1
- package/dist/storage/memory-read-store.d.ts +5 -9
- package/dist/storage/memory-read-store.d.ts.map +1 -1
- package/dist/storage.d.ts +6 -1
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +17 -13
- package/dist/support-passport/index.js +56 -53
- 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 +16 -12
- package/dist/verified-recall.js +16 -12
- package/dist/who-knows-cli.js +17 -13
- package/dist/who-knows.js +16 -12
- package/package.json +32 -2
- package/scripts/build-with-heap.mjs +8 -0
- package/src/buffer-drain-handover.test.ts +307 -0
- package/src/buffer-persistence.ts +27 -5
- package/src/buffer-turn-helpers.ts +16 -0
- package/src/buffer.ts +32 -2
- package/src/corpus-scan-worker-host.ts +314 -0
- package/src/corpus-scan-worker.entry.mjs +176 -0
- package/src/corpus-scan-worker.entry.ts +95 -0
- package/src/corpus-scan.ts +215 -0
- package/src/corpus-watermark.ts +28 -12
- package/src/index.ts +1 -1
- package/src/orchestration/buffer-drain-gate.test.ts +40 -0
- package/src/orchestration/buffer-drain-gate.ts +38 -0
- package/src/orchestration/buffer-drain-runner.ts +312 -0
- package/src/orchestration/buffer-swap.ts +27 -0
- package/src/orchestration/turn-ingestion.ts +2 -0
- package/src/orchestrator.ts +9 -6
- package/src/storage/buffer-drain-claims.test.ts +448 -0
- package/src/storage/buffer-drain-claims.ts +593 -0
- package/src/storage/buffer-session-files.ts +50 -3
- package/src/storage/entity-canonical-id-migration.ts +4 -26
- package/src/storage/memory-read-store.ts +17 -99
- package/src/storage.ts +8 -11
- package/src/testing/subjects/extraction-lifecycle.test.ts +34 -0
- package/dist/chunk-3E3Z6UA3.js.map +0 -1
- package/dist/chunk-4OFXLQJD.js.map +0 -1
- package/dist/chunk-5U2BBF7E.js.map +0 -1
- package/dist/chunk-G6A3SGCE.js.map +0 -1
- package/dist/chunk-KZMRMKC7.js.map +0 -1
- package/dist/chunk-WXBVGKS6.js.map +0 -1
- package/dist/chunk-YJHOVA42.js.map +0 -1
- /package/dist/{capsule-crypto-7FJQINUR.js.map → capsule-crypto-GWVG7LGC.js.map} +0 -0
- /package/dist/{chunk-ZAZZOQAQ.js.map → chunk-23OEPU3K.js.map} +0 -0
- /package/dist/{chunk-XDKEHZUC.js.map → chunk-264B57GV.js.map} +0 -0
- /package/dist/{chunk-NRGQ5HJO.js.map → chunk-4P4VLPGB.js.map} +0 -0
- /package/dist/{chunk-GIRWNTMV.js.map → chunk-4PG5R6BJ.js.map} +0 -0
- /package/dist/{chunk-52II7PB6.js.map → chunk-645WOU5I.js.map} +0 -0
- /package/dist/{chunk-RG3I2663.js.map → chunk-64JLBFCQ.js.map} +0 -0
- /package/dist/{chunk-G3T6YMBO.js.map → chunk-64S6X4IU.js.map} +0 -0
- /package/dist/{chunk-WASVDS6G.js.map → chunk-6HTEPYOI.js.map} +0 -0
- /package/dist/{chunk-6AEKSOWV.js.map → chunk-6I6DFULH.js.map} +0 -0
- /package/dist/{chunk-DJR37Q37.js.map → chunk-6T4CMKNP.js.map} +0 -0
- /package/dist/{chunk-RHJ5VGB3.js.map → chunk-73A2DDDR.js.map} +0 -0
- /package/dist/{chunk-4B73TQQV.js.map → chunk-7AKPLEJV.js.map} +0 -0
- /package/dist/{chunk-UHH67NLU.js.map → chunk-7OKYO2UC.js.map} +0 -0
- /package/dist/{chunk-KAL5SXPP.js.map → chunk-7ULSP7AU.js.map} +0 -0
- /package/dist/{chunk-USNU3BEQ.js.map → chunk-A4FZLM6Q.js.map} +0 -0
- /package/dist/{chunk-VV73XT3A.js.map → chunk-BJLCV2P3.js.map} +0 -0
- /package/dist/{chunk-KQAFEZQX.js.map → chunk-BUKK5SWA.js.map} +0 -0
- /package/dist/{chunk-DJFULNXK.js.map → chunk-C2AYUXEF.js.map} +0 -0
- /package/dist/{chunk-QY24FSXT.js.map → chunk-D3BYJSHX.js.map} +0 -0
- /package/dist/{chunk-JZRQY7ZQ.js.map → chunk-D4WR56FR.js.map} +0 -0
- /package/dist/{chunk-FB4JQEFS.js.map → chunk-DP22K7IC.js.map} +0 -0
- /package/dist/{chunk-EJFOGYF3.js.map → chunk-DTQJ7BRN.js.map} +0 -0
- /package/dist/{chunk-MLUPSZFK.js.map → chunk-DZL5PBEJ.js.map} +0 -0
- /package/dist/{chunk-JD5F5MYN.js.map → chunk-EGCC5OJE.js.map} +0 -0
- /package/dist/{chunk-IQSRVR6Z.js.map → chunk-EJ4RS7I7.js.map} +0 -0
- /package/dist/{chunk-WBN66HPI.js.map → chunk-ELHJK7LM.js.map} +0 -0
- /package/dist/{chunk-EH46DHBU.js.map → chunk-ENAPZQA6.js.map} +0 -0
- /package/dist/{chunk-LLG5VNK7.js.map → chunk-F2UAAI6B.js.map} +0 -0
- /package/dist/{chunk-YZNTAOPZ.js.map → chunk-FKNNWH7P.js.map} +0 -0
- /package/dist/{chunk-AAANTXCQ.js.map → chunk-FZVZYU5C.js.map} +0 -0
- /package/dist/{chunk-ON77FQXH.js.map → chunk-G6GMZJQ4.js.map} +0 -0
- /package/dist/{chunk-OL7A7NKH.js.map → chunk-GNP4BV4Z.js.map} +0 -0
- /package/dist/{chunk-GDYLZ6FR.js.map → chunk-HJ3UTGIW.js.map} +0 -0
- /package/dist/{chunk-CCL2OXFO.js.map → chunk-HSHLDSPX.js.map} +0 -0
- /package/dist/{chunk-R4BR62UO.js.map → chunk-HWMGQDZI.js.map} +0 -0
- /package/dist/{chunk-BPIAXMGC.js.map → chunk-IIUEHIQ2.js.map} +0 -0
- /package/dist/{chunk-RTJJPW3C.js.map → chunk-ILMB3X4X.js.map} +0 -0
- /package/dist/{chunk-RFT4OPYI.js.map → chunk-IPN67KVR.js.map} +0 -0
- /package/dist/{chunk-IEW6NDHX.js.map → chunk-JGSWWD33.js.map} +0 -0
- /package/dist/{chunk-A3UFV4K3.js.map → chunk-JIYJIH5N.js.map} +0 -0
- /package/dist/{chunk-4G2A7MH3.js.map → chunk-JKUVPVKR.js.map} +0 -0
- /package/dist/{chunk-VCLNU6MY.js.map → chunk-L2HSSVVD.js.map} +0 -0
- /package/dist/{chunk-U2A56LLF.js.map → chunk-L334PSLW.js.map} +0 -0
- /package/dist/{chunk-HQUYENKK.js.map → chunk-LIUI46BX.js.map} +0 -0
- /package/dist/{chunk-ERMT5WQM.js.map → chunk-MKE5DP3S.js.map} +0 -0
- /package/dist/{chunk-6BO27AWQ.js.map → chunk-MPJ7VHHA.js.map} +0 -0
- /package/dist/{chunk-KMJDH4KX.js.map → chunk-NSUGAIIB.js.map} +0 -0
- /package/dist/{chunk-7NT3FKAF.js.map → chunk-NXHBQC2O.js.map} +0 -0
- /package/dist/{chunk-JEX2JL3U.js.map → chunk-OH55F76C.js.map} +0 -0
- /package/dist/{chunk-37VTMUAL.js.map → chunk-OUJ4DVR5.js.map} +0 -0
- /package/dist/{chunk-2NLLXCJG.js.map → chunk-OWHERGF2.js.map} +0 -0
- /package/dist/{chunk-2IVK5IDY.js.map → chunk-P5F7ISLV.js.map} +0 -0
- /package/dist/{chunk-PM4PKC3Y.js.map → chunk-PNVQNAJM.js.map} +0 -0
- /package/dist/{chunk-FXWX7VD3.js.map → chunk-PRYDNBCO.js.map} +0 -0
- /package/dist/{chunk-YDDLSGYE.js.map → chunk-PUTH5REB.js.map} +0 -0
- /package/dist/{chunk-GFAEKSFR.js.map → chunk-QBK3IM6W.js.map} +0 -0
- /package/dist/{chunk-KRAMCBIW.js.map → chunk-QKXPOLQD.js.map} +0 -0
- /package/dist/{chunk-YDT3OEYF.js.map → chunk-R4ZHF4K2.js.map} +0 -0
- /package/dist/{chunk-ISNPYOXR.js.map → chunk-RBUR6USI.js.map} +0 -0
- /package/dist/{chunk-WZYAXOGO.js.map → chunk-RZSHIJYY.js.map} +0 -0
- /package/dist/{chunk-TYSD7UQO.js.map → chunk-SVTIWBSA.js.map} +0 -0
- /package/dist/{chunk-AMKIIRLL.js.map → chunk-TBFAQHQZ.js.map} +0 -0
- /package/dist/{chunk-ZE5N4JSY.js.map → chunk-TKCJI7WA.js.map} +0 -0
- /package/dist/{chunk-RYB553SS.js.map → chunk-TLOAAOT3.js.map} +0 -0
- /package/dist/{chunk-RKRX4C4H.js.map → chunk-TPKB7T6Z.js.map} +0 -0
- /package/dist/{chunk-JZCBMKR5.js.map → chunk-TUCEP2LS.js.map} +0 -0
- /package/dist/{chunk-OMWQO7H6.js.map → chunk-UEDC2VGP.js.map} +0 -0
- /package/dist/{chunk-X7Y7WX73.js.map → chunk-UVYI6VIX.js.map} +0 -0
- /package/dist/{chunk-JY2BGCYN.js.map → chunk-VCYH2XUY.js.map} +0 -0
- /package/dist/{chunk-NGH74LDV.js.map → chunk-WD2QH3JM.js.map} +0 -0
- /package/dist/{chunk-UGTYADB4.js.map → chunk-WWSJQ7MP.js.map} +0 -0
- /package/dist/{chunk-UQBOPCDK.js.map → chunk-X4PAATLA.js.map} +0 -0
- /package/dist/{chunk-KBOQQEVC.js.map → chunk-XAFSZ4DP.js.map} +0 -0
- /package/dist/{chunk-2S6JADBB.js.map → chunk-XICJL56Z.js.map} +0 -0
- /package/dist/{chunk-Y5KESB7T.js.map → chunk-XJDSZFBZ.js.map} +0 -0
- /package/dist/{chunk-24SIB3EW.js.map → chunk-XWE3EOWX.js.map} +0 -0
- /package/dist/{chunk-Y77FXULH.js.map → chunk-XWXBXBOX.js.map} +0 -0
- /package/dist/{chunk-VKQI47DJ.js.map → chunk-Y7427SL7.js.map} +0 -0
- /package/dist/{chunk-TEH5MDX5.js.map → chunk-YH7HJNWV.js.map} +0 -0
- /package/dist/{chunk-EZ25VE3G.js.map → chunk-YNDLCWXS.js.map} +0 -0
- /package/dist/{chunk-2M36PR7R.js.map → chunk-Z2T5BPOZ.js.map} +0 -0
- /package/dist/{entity-canonical-id-migration-F3JVG6K6.js.map → corpus-scan-worker-host.js.map} +0 -0
- /package/dist/{graph-edge-decay-IU75NV42.js.map → corpus-scan.js.map} +0 -0
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
import path from "node:path";
|
|
14
14
|
import { lstatSync, readFileSync } from "node:fs";
|
|
15
15
|
import { z } from "zod";
|
|
16
|
+
import { corpusScanWorker } from "../corpus-scan-worker-host.js";
|
|
16
17
|
import { computeSupersessionKey, normalizeSupersessionKey } from "../temporal-supersession.js";
|
|
17
18
|
import type { EntityFile, MemoryFile } from "../types.js";
|
|
18
19
|
import { log } from "../logger.js";
|
|
@@ -102,31 +103,6 @@ async function fingerprintPath(filePath: string): Promise<string> {
|
|
|
102
103
|
: "missing";
|
|
103
104
|
}
|
|
104
105
|
|
|
105
|
-
async function fingerprintEntityEntries(entitiesDir: string): Promise<string> {
|
|
106
|
-
let names: string[];
|
|
107
|
-
try {
|
|
108
|
-
names = (await readdir(entitiesDir))
|
|
109
|
-
.filter((name) => path.extname(name) === ".md" && !isMacOsReplicationJunkBasename(name))
|
|
110
|
-
.sort();
|
|
111
|
-
} catch (error) {
|
|
112
|
-
if (isErrnoCode(error, "ENOENT")) return "missing";
|
|
113
|
-
throw error;
|
|
114
|
-
}
|
|
115
|
-
const hash = createHash("sha256");
|
|
116
|
-
for (const name of names) {
|
|
117
|
-
hash.update(`${name.length}:${name}:`);
|
|
118
|
-
try {
|
|
119
|
-
const entry = await lstat(path.join(entitiesDir, name), { bigint: true });
|
|
120
|
-
hash.update(`${entry.dev}:${entry.ino}:${entry.size}:${entry.mtimeNs}:${entry.ctimeNs}`);
|
|
121
|
-
} catch (error) {
|
|
122
|
-
if (!isErrnoCode(error, "ENOENT")) throw error;
|
|
123
|
-
hash.update("missing");
|
|
124
|
-
}
|
|
125
|
-
hash.update("\n");
|
|
126
|
-
}
|
|
127
|
-
return hash.digest("hex");
|
|
128
|
-
}
|
|
129
|
-
|
|
130
106
|
/**
|
|
131
107
|
* Completion fingerprint for migration inputs only. Entity entry identities
|
|
132
108
|
* catch same-path edits that do not change the directory inode; the cooperative
|
|
@@ -146,7 +122,9 @@ export async function getFingerprint(
|
|
|
146
122
|
consumingFingerprint,
|
|
147
123
|
] = await Promise.all([
|
|
148
124
|
fingerprintPath(entitiesDir),
|
|
149
|
-
|
|
125
|
+
// The entry enumeration is one lstat per entity file — a corpus-sized
|
|
126
|
+
// syscall storm on the main thread. It runs in the corpus-scan worker.
|
|
127
|
+
corpusScanWorker.request({ kind: "entity-entries-fingerprint", entitiesDir }),
|
|
150
128
|
fingerprintPath(path.join(baseDir, "config", "aliases.json")),
|
|
151
129
|
fingerprintPath(path.join(baseDir, "state", ENTITY_CANONICAL_ID_RECONCILE_MARKER)),
|
|
152
130
|
fingerprintPath(path.join(baseDir, "state", ENTITY_CANONICAL_ID_RECONCILE_CONSUMING_MARKER)),
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import type { Dirent, Stats } from "node:fs";
|
|
13
|
-
import { lstat, readdir,
|
|
13
|
+
import { lstat, readdir, stat } from "node:fs/promises";
|
|
14
14
|
import path from "node:path";
|
|
15
15
|
import { toMemoryPathRel } from "../memory-lifecycle-ledger-utils.js";
|
|
16
16
|
import { SecureStoreLockedError, readMaybeEncryptedFile } from "../secure-store/secure-fs.js";
|
|
@@ -30,6 +30,7 @@ import {
|
|
|
30
30
|
StorageManager,
|
|
31
31
|
} from "../storage.js";
|
|
32
32
|
import { rememberRawFrontmatter } from "./memory-frontmatter-metadata.js";
|
|
33
|
+
import { corpusScanWorker } from "../corpus-scan-worker-host.js";
|
|
33
34
|
|
|
34
35
|
export interface MemoryReadStoreDeps {
|
|
35
36
|
/** Live class object of the host instance — shared static caches (see storage.ts storageManagerClass). */
|
|
@@ -85,19 +86,6 @@ export interface MemoryReadStoreDeps {
|
|
|
85
86
|
readonly wearablesDir: string;
|
|
86
87
|
}
|
|
87
88
|
|
|
88
|
-
/**
|
|
89
|
-
* A backend READ failure worth propagating from a strict (census) scan: an
|
|
90
|
-
* errno-coded fs error that is NOT `ENOENT`. `ENOENT` (an absent dir) and
|
|
91
|
-
* code-less rejections are expected and skipped; `EACCES`/`EIO`/… mean the
|
|
92
|
-
* corpus is unreadable and a divergence census must fail loud rather than
|
|
93
|
-
* silently publish a partial count (issue #2156 round-5). Non-strict (recall)
|
|
94
|
-
* callers ignore this and degrade to a best-effort partial scan.
|
|
95
|
-
*/
|
|
96
|
-
function isPropagatableReadError(err: unknown): boolean {
|
|
97
|
-
const code = (err as NodeJS.ErrnoException).code;
|
|
98
|
-
return typeof code === "string" && code !== "ENOENT";
|
|
99
|
-
}
|
|
100
|
-
|
|
101
89
|
/**
|
|
102
90
|
* Markdown under this store's `entities/` directory. The first relative
|
|
103
91
|
* segment must be `entities`; a memory root whose absolute path contains
|
|
@@ -233,15 +221,11 @@ export class MemoryReadStore {
|
|
|
233
221
|
* escape: a category dir symlinked outside memoryDir (e.g. decisions/ -> an
|
|
234
222
|
* external dir) must NOT pull out-of-store files into a scan (info leak).
|
|
235
223
|
*
|
|
236
|
-
*
|
|
237
|
-
*
|
|
238
|
-
*
|
|
239
|
-
*
|
|
240
|
-
*
|
|
241
|
-
* `realpath` cost one syscall per markdown file (hundreds of thousands per
|
|
242
|
-
* corpus scan) to re-derive a fact the directory-level checks already
|
|
243
|
-
* establish; reads refuse symlinked files at open time with `O_NOFOLLOW`, so
|
|
244
|
-
* a path swapped to a symlink mid-scan is refused rather than followed.
|
|
224
|
+
* The walk runs in the corpus-scan worker: it is one `readdir` + `lstat` per
|
|
225
|
+
* directory over the whole corpus, and on the main event loop that starves
|
|
226
|
+
* observe, recall and the extraction queue behind it. The implementation is
|
|
227
|
+
* shared (src/corpus-scan.ts) and the host runs it inline when no worker
|
|
228
|
+
* can start, so the collected path set is the same either way.
|
|
245
229
|
* Paths only — no frontmatter parse.
|
|
246
230
|
*/
|
|
247
231
|
private async collectContainedMarkdownPaths(
|
|
@@ -249,82 +233,16 @@ export class MemoryReadStore {
|
|
|
249
233
|
propagateReadErrors = false,
|
|
250
234
|
options?: CorpusReadOptions,
|
|
251
235
|
): Promise<string[]> {
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
if (propagateReadErrors && isPropagatableReadError(err)) throw err;
|
|
263
|
-
return filePaths;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
const collectPaths = async (dir: string): Promise<void> => {
|
|
267
|
-
checkCorpusReadAbort(options);
|
|
268
|
-
// Directory-level guard, isolated from per-entry handling: skip symlinked
|
|
269
|
-
// or non-directory category dirs. A failure here means the whole subtree
|
|
270
|
-
// does not exist or escaped the store — fail closed by skipping it.
|
|
271
|
-
let dirStat: Stats;
|
|
272
|
-
try {
|
|
273
|
-
dirStat = await lstat(dir);
|
|
274
|
-
} catch (err) {
|
|
275
|
-
// ENOENT (absent category dir) is expected; a backend read error
|
|
276
|
-
// (EACCES/EIO/…) propagates in strict census mode.
|
|
277
|
-
if (propagateReadErrors && isPropagatableReadError(err)) throw err;
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
if (dirStat.isSymbolicLink()) return; // never follow symlinks out of the store (both modes)
|
|
281
|
-
if (!dirStat.isDirectory()) {
|
|
282
|
-
// A category root that EXISTS but is not a directory (e.g. `facts/`
|
|
283
|
-
// replaced by a regular file) is a layout/backend failure: a strict
|
|
284
|
-
// census must not silently publish the remaining categories as healthy.
|
|
285
|
-
// Non-strict (recall) stays best-effort and skips it (issue #2156 round-10).
|
|
286
|
-
if (propagateReadErrors) {
|
|
287
|
-
throw new Error(`corpus scan: expected a directory but found a non-directory at ${dir}`);
|
|
288
|
-
}
|
|
289
|
-
return;
|
|
290
|
-
}
|
|
291
|
-
let entries: Dirent[];
|
|
292
|
-
try {
|
|
293
|
-
entries = await readdir(dir, { withFileTypes: true });
|
|
294
|
-
} catch (err) {
|
|
295
|
-
// A backend read error (EACCES …) propagates in strict census mode so a
|
|
296
|
-
// partial subtree is not silently counted. ENOENT (vanished mid-scan)
|
|
297
|
-
// and other non-propagatable failures skip the directory.
|
|
298
|
-
if (propagateReadErrors && isPropagatableReadError(err)) throw err;
|
|
299
|
-
return;
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
const subdirs: string[] = [];
|
|
303
|
-
for (const entry of entries) {
|
|
304
|
-
// Outside the per-entry handling below, which deliberately swallows
|
|
305
|
-
// non-propagatable errors — a cancellation must never be swallowed with
|
|
306
|
-
// them (issue #2307).
|
|
307
|
-
checkCorpusReadAbort(options);
|
|
308
|
-
// Never follow symlinked entries out of the store.
|
|
309
|
-
if (entry.isSymbolicLink()) continue;
|
|
310
|
-
if (isMacOsReplicationJunkBasename(entry.name)) continue;
|
|
311
|
-
const fullPath = path.join(dir, entry.name);
|
|
312
|
-
if (entry.isDirectory()) {
|
|
313
|
-
subdirs.push(fullPath);
|
|
314
|
-
} else if (entry.name.endsWith(".md")) {
|
|
315
|
-
filePaths.push(fullPath);
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
// Recurse into real subdirectories regardless of any single poisoned entry
|
|
319
|
-
// above, so valid nested in-store memories are never dropped.
|
|
320
|
-
for (const subdir of subdirs) {
|
|
321
|
-
await collectPaths(subdir);
|
|
322
|
-
}
|
|
323
|
-
};
|
|
324
|
-
|
|
325
|
-
for (const dir of startDirs) {
|
|
326
|
-
await collectPaths(dir);
|
|
327
|
-
}
|
|
236
|
+
checkCorpusReadAbort(options);
|
|
237
|
+
const filePaths = await corpusScanWorker.request(
|
|
238
|
+
{
|
|
239
|
+
kind: "walk",
|
|
240
|
+
baseDir: this.deps.baseDir,
|
|
241
|
+
startDirs: [...startDirs],
|
|
242
|
+
propagateReadErrors,
|
|
243
|
+
},
|
|
244
|
+
options?.abortSignal,
|
|
245
|
+
);
|
|
328
246
|
// A signal that fired during the last directory read would otherwise return a
|
|
329
247
|
// truncated path list as if it were the whole corpus (issue #2307 review).
|
|
330
248
|
checkCorpusReadAbort(options);
|
package/src/storage.ts
CHANGED
|
@@ -144,6 +144,7 @@ import {
|
|
|
144
144
|
} from "./lifecycle/tombstones.js";
|
|
145
145
|
import { supersessionKeysForFact } from "./temporal-supersession.js";
|
|
146
146
|
import { BufferSessionFiles } from "./storage/buffer-session-files.js";
|
|
147
|
+
import { BufferDrainClaims, type BufferSessionSaveOutcome } from "./storage/buffer-drain-claims.js";
|
|
147
148
|
import { runSupersessionSideEffects, type SupersessionAuditOptions } from "./storage/supersession-side-effects.js";
|
|
148
149
|
import { saveDroppedExtractionChunk as saveDroppedChunk } from "./storage/dropped-extraction-chunk.js";
|
|
149
150
|
import type {
|
|
@@ -5144,18 +5145,10 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
|
|
|
5144
5145
|
);
|
|
5145
5146
|
} catch (err) {
|
|
5146
5147
|
if (priorDest === null) {
|
|
5147
|
-
await recordArchiveDelete(this.baseDir, destPath, () =>
|
|
5148
|
-
unlink(destPath).then(
|
|
5149
|
-
() => true,
|
|
5150
|
-
() => false
|
|
5151
|
-
)
|
|
5152
|
-
);
|
|
5148
|
+
await recordArchiveDelete(this.baseDir, destPath, () => unlink(destPath).then(() => true, () => false));
|
|
5153
5149
|
} else {
|
|
5154
5150
|
await recordArchiveDelete(this.baseDir, destPath, () =>
|
|
5155
|
-
this.writeStorageSecureFile(destPath, priorDest).then(
|
|
5156
|
-
() => true,
|
|
5157
|
-
() => false
|
|
5158
|
-
)
|
|
5151
|
+
this.writeStorageSecureFile(destPath, priorDest).then(() => true, () => false)
|
|
5159
5152
|
);
|
|
5160
5153
|
}
|
|
5161
5154
|
throw err;
|
|
@@ -5524,8 +5517,12 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
|
|
|
5524
5517
|
}
|
|
5525
5518
|
async loadBuffer(): Promise<BufferState> { return this.bufferSessionFiles().load(); }
|
|
5526
5519
|
async saveBuffer(state: BufferState): Promise<void> { await this.bufferSessionFiles().reconcile(state); }
|
|
5527
|
-
async saveBufferSession(key: string, entry: BufferEntryState): Promise<
|
|
5520
|
+
async saveBufferSession(key: string, entry: BufferEntryState): Promise<BufferSessionSaveOutcome> { return await this.bufferSessionFiles().save(key, entry); }
|
|
5528
5521
|
async deleteBufferSession(key: string): Promise<void> { await this.bufferSessionFiles().remove(key); }
|
|
5522
|
+
/** Sync gate check for the extraction queue: is this session claimed by a buffer drain? */
|
|
5523
|
+
isBufferSessionClaimed(key: string): boolean { return this.bufferSessionFiles().isClaimed(key); }
|
|
5524
|
+
/** The drain-claim store for this memory root (CLI drain + worker). */
|
|
5525
|
+
bufferDrainClaims(): BufferDrainClaims { return this.bufferSessionFiles().claims; }
|
|
5529
5526
|
saveDroppedExtractionChunk(bufferKey: string, reason: string, turns: readonly import("./types.js").BufferTurn[]): Promise<string> { // storage/dropped-extraction-chunk.ts
|
|
5530
5527
|
return saveDroppedChunk(this.stateDir, (file, content) => this.writeStorageSecureFile(file, content), bufferKey, reason, turns);
|
|
5531
5528
|
}
|
|
@@ -17,6 +17,7 @@ import assert from "node:assert/strict";
|
|
|
17
17
|
import path from "node:path";
|
|
18
18
|
|
|
19
19
|
import { Orchestrator } from "../../orchestrator.js";
|
|
20
|
+
import { BufferDrainRunner } from "../../orchestration/buffer-drain-runner.js";
|
|
20
21
|
import { resolveNamespaceStorageRoot } from "../../namespaces/storage.js";
|
|
21
22
|
import type { BufferTurn, PluginConfig } from "../../types.js";
|
|
22
23
|
import {
|
|
@@ -135,6 +136,37 @@ async function assertHarmonicEpisode(memoryDir: string, sessionKey?: string): Pr
|
|
|
135
136
|
if (sessionKey) assert.equal(status.latestNode?.sessionKey, sessionKey);
|
|
136
137
|
}
|
|
137
138
|
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* The out-of-process drain path: a buffered session is claimed into a drain
|
|
142
|
+
* claim, the drain extracts it through the same pipeline, and the claim ends
|
|
143
|
+
* empty. The live buffer keeps its in-memory copy; the drain tombstone makes
|
|
144
|
+
* the owner subtract the drained turn instead of writing it back.
|
|
145
|
+
*/
|
|
146
|
+
async function exerciseBufferDrain(state: ExtractionLifecycleState): Promise<void> {
|
|
147
|
+
// Its own memory root and orchestrator: the drain must not perturb the
|
|
148
|
+
// row's own extraction calls or fact counts.
|
|
149
|
+
const memoryDir = await mkTempMemoryDir("extraction-drain-row");
|
|
150
|
+
const cfg = makeHarmonicLifecycleConfig(memoryDir, { extraction: { spanMode: "on" } });
|
|
151
|
+
const orchestrator = new Orchestrator(cfg);
|
|
152
|
+
state.orchestrators.push(orchestrator);
|
|
153
|
+
stubExtraction(orchestrator, (turns) => spanBearingResult(turns));
|
|
154
|
+
const sessionKey = "drain-row-session";
|
|
155
|
+
const content = "The drain row retains the canary gate detail for the teal dashboard.";
|
|
156
|
+
await orchestrator.buffer.addTurn(sessionKey, {
|
|
157
|
+
role: "user",
|
|
158
|
+
content,
|
|
159
|
+
timestamp: new Date().toISOString(),
|
|
160
|
+
sessionKey,
|
|
161
|
+
});
|
|
162
|
+
await orchestrator.buffer.save();
|
|
163
|
+
const runner = new BufferDrainRunner(orchestrator);
|
|
164
|
+
assert.equal(await runner.claim(sessionKey, "subject-drain"), true, "the drain claims the buffered session");
|
|
165
|
+
const outcome = await runner.drainSession(sessionKey, { ownerId: "subject-drain" });
|
|
166
|
+
assert.equal(outcome.status, "drained", "the drain empties the claimed session");
|
|
167
|
+
assert.equal(outcome.turnsRemaining, 0, "no turn is left claimed");
|
|
168
|
+
}
|
|
169
|
+
|
|
138
170
|
const subject: LifecycleSubject<ExtractionLifecycleState> = {
|
|
139
171
|
async setup(row: MatrixRow): Promise<ExtractionLifecycleState> {
|
|
140
172
|
const memoryDir = await mkTempMemoryDir(`extraction-${row.id}`);
|
|
@@ -254,6 +286,7 @@ const subject: LifecycleSubject<ExtractionLifecycleState> = {
|
|
|
254
286
|
return;
|
|
255
287
|
}
|
|
256
288
|
case "before-reset": {
|
|
289
|
+
await exerciseBufferDrain(state);
|
|
257
290
|
// Buffer a low-signal turn, then fire a before_reset flush whose abort
|
|
258
291
|
// trips mid-extraction. The abort wiring (the signal threaded from
|
|
259
292
|
// flushSession into runExtraction, guarding `before_persist` and
|
|
@@ -419,6 +452,7 @@ const subject: LifecycleSubject<ExtractionLifecycleState> = {
|
|
|
419
452
|
return;
|
|
420
453
|
}
|
|
421
454
|
case "before-reset": {
|
|
455
|
+
await exerciseBufferDrain(state);
|
|
422
456
|
assert.equal(
|
|
423
457
|
state.abortFlushRejected,
|
|
424
458
|
true,
|