@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,6 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
LcmSummarizer
|
|
3
|
+
} from "./chunk-AQNHEDXP.js";
|
|
4
|
+
import {
|
|
5
|
+
LcmArchive
|
|
6
|
+
} from "./chunk-SDL22RRW.js";
|
|
7
|
+
import {
|
|
8
|
+
LcmDag
|
|
9
|
+
} from "./chunk-7N4KAIGN.js";
|
|
1
10
|
import {
|
|
2
11
|
LcmWorkQueue
|
|
3
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-QNN4FYBD.js";
|
|
4
13
|
import {
|
|
5
14
|
assembleCompressedHistoryWithTrace
|
|
6
15
|
} from "./chunk-UXPUUL3G.js";
|
|
@@ -8,15 +17,6 @@ import {
|
|
|
8
17
|
ensureLcmStateDir,
|
|
9
18
|
openLcmDatabase
|
|
10
19
|
} from "./chunk-DDA47TES.js";
|
|
11
|
-
import {
|
|
12
|
-
LcmSummarizer
|
|
13
|
-
} from "./chunk-KOLJJN5G.js";
|
|
14
|
-
import {
|
|
15
|
-
LcmArchive
|
|
16
|
-
} from "./chunk-WVP2I6C5.js";
|
|
17
|
-
import {
|
|
18
|
-
LcmDag
|
|
19
|
-
} from "./chunk-7N4KAIGN.js";
|
|
20
20
|
import {
|
|
21
21
|
nativeBindingRecoveryHint
|
|
22
22
|
} from "./chunk-LD72P4YS.js";
|
|
@@ -74,6 +74,9 @@ var EMPTY_LCM_STATS = {
|
|
|
74
74
|
totalSummaryNodes: 0,
|
|
75
75
|
maxDepth: -1
|
|
76
76
|
};
|
|
77
|
+
var LCM_SUMMARIZE_MAX_LEAF_BATCHES_PER_JOB = 16;
|
|
78
|
+
var LCM_SUMMARIZE_RETRY_BASE_MS = 500;
|
|
79
|
+
var LCM_SUMMARIZE_RETRY_MAX_MS = 3e4;
|
|
77
80
|
var LcmEngine = class {
|
|
78
81
|
constructor(pluginConfig, summarizeFn) {
|
|
79
82
|
this.summarizeFn = summarizeFn;
|
|
@@ -90,6 +93,14 @@ var LcmEngine = class {
|
|
|
90
93
|
config;
|
|
91
94
|
memoryDir;
|
|
92
95
|
initPromise = null;
|
|
96
|
+
summarizeRetryTimers = /* @__PURE__ */ new Map();
|
|
97
|
+
summarizeRetryAttempts = /* @__PURE__ */ new Map();
|
|
98
|
+
/** Resolved when the session's pending retry timer has fired or been cleared. */
|
|
99
|
+
summarizeRetryWaiters = /* @__PURE__ */ new Map();
|
|
100
|
+
/** Explicit idle waiters per session; referenced only while nonzero. */
|
|
101
|
+
summarizeRetryIdleWaiters = /* @__PURE__ */ new Map();
|
|
102
|
+
/** Base backoff delay; tests shrink it to keep the retry loop fast. */
|
|
103
|
+
summarizeRetryBaseMs = LCM_SUMMARIZE_RETRY_BASE_MS;
|
|
93
104
|
pendingObserveInitCounts = /* @__PURE__ */ new Map();
|
|
94
105
|
pendingObserveInitWaiters = /* @__PURE__ */ new Map();
|
|
95
106
|
pendingObserveInitIdleWaiters = [];
|
|
@@ -130,8 +141,8 @@ var LcmEngine = class {
|
|
|
130
141
|
);
|
|
131
142
|
const observeQueue = new LcmWorkQueue({
|
|
132
143
|
concurrency: this.config.observeConcurrency,
|
|
133
|
-
worker: async (sessionId
|
|
134
|
-
await this.
|
|
144
|
+
worker: async (sessionId) => {
|
|
145
|
+
await this.processSummarizeJob(sessionId);
|
|
135
146
|
},
|
|
136
147
|
hooks: {
|
|
137
148
|
onJobStart: ({ sessionId, depth, inFlight, waitMs }) => {
|
|
@@ -169,47 +180,73 @@ var LcmEngine = class {
|
|
|
169
180
|
this.dag = dag;
|
|
170
181
|
this.summarizer = summarizer;
|
|
171
182
|
this.observeQueue = observeQueue;
|
|
183
|
+
this.resumeOutstandingSummaries();
|
|
172
184
|
log.info("LCM engine initialized");
|
|
173
185
|
}
|
|
174
186
|
/**
|
|
175
|
-
*
|
|
176
|
-
*
|
|
187
|
+
* Restart resume: sessions whose durable archive still holds complete
|
|
188
|
+
* unsummarized batches get a summary job without any new observe call.
|
|
189
|
+
* Only session references are queued — the content already lives in SQLite.
|
|
190
|
+
*/
|
|
191
|
+
resumeOutstandingSummaries() {
|
|
192
|
+
if (!this.archive || !this.observeQueue) return;
|
|
193
|
+
const sessions = this.archive.listSessionsWithUnsummarizedTurns(
|
|
194
|
+
this.config.leafBatchSize
|
|
195
|
+
);
|
|
196
|
+
if (sessions.length === 0) return;
|
|
197
|
+
for (const sessionId of sessions) this.observeQueue.enqueue(sessionId);
|
|
198
|
+
log.info(`LCM resume scheduled summary jobs: sessions=${sessions.length}`);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Archive observed messages and schedule background summarization.
|
|
202
|
+
*
|
|
203
|
+
* The archive append completes BEFORE this resolves: an accepted observe is
|
|
204
|
+
* already durable in SQLite, so a crash cannot lose it. Only the
|
|
205
|
+
* summarization is background work, and it resumes from the durable archive.
|
|
177
206
|
*/
|
|
178
207
|
async observeMessages(sessionId, messages) {
|
|
179
208
|
const normalizedSessionId = normalizeLcmSessionId(sessionId);
|
|
180
209
|
if (!normalizedSessionId) return;
|
|
181
|
-
this.enqueueObserveMessages(normalizedSessionId, messages);
|
|
210
|
+
await this.enqueueObserveMessages(normalizedSessionId, messages);
|
|
182
211
|
}
|
|
183
|
-
/**
|
|
184
|
-
|
|
185
|
-
|
|
212
|
+
/**
|
|
213
|
+
* Durably archive messages, then queue a metadata-only summary job.
|
|
214
|
+
*
|
|
215
|
+
* Rejects when the archive append fails — callers must not treat a failed
|
|
216
|
+
* archive as an accepted observation.
|
|
217
|
+
*/
|
|
218
|
+
async enqueueObserveMessages(sessionId, messages) {
|
|
219
|
+
if (!this.config.enabled) return;
|
|
220
|
+
if (this.closed) throw new Error("LCM engine is closed");
|
|
186
221
|
const normalizedSessionId = normalizeLcmSessionId(sessionId);
|
|
187
222
|
if (!normalizedSessionId) return;
|
|
188
223
|
if (messages.length === 0) return;
|
|
189
224
|
this.reservePendingObserveInit(normalizedSessionId);
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
this.
|
|
225
|
+
try {
|
|
226
|
+
await this.ensureInitialized();
|
|
227
|
+
if (this.closed) throw new Error("LCM engine is closed");
|
|
228
|
+
if (!this.archive || !this.observeQueue) {
|
|
229
|
+
throw new Error("LCM engine is not initialized");
|
|
230
|
+
}
|
|
231
|
+
const archived = this.archiveObservedMessages(normalizedSessionId, messages);
|
|
232
|
+
this.observeQueue.enqueue(normalizedSessionId);
|
|
193
233
|
log.debug(
|
|
194
|
-
`LCM observe
|
|
234
|
+
`LCM observe archived: session=${normalizedSessionId}, messages=${archived}, depth=${this.observeQueue.depth}, inFlight=${this.observeQueue.inFlightCount}`
|
|
195
235
|
);
|
|
196
|
-
}
|
|
197
|
-
if (this.closed) return;
|
|
236
|
+
} catch (err) {
|
|
198
237
|
log.error(
|
|
199
|
-
`LCM observe
|
|
238
|
+
`LCM observe archive failed: session=${normalizedSessionId}, error=${err}${nativeBindingRecoveryHint(err)}`
|
|
200
239
|
);
|
|
201
|
-
|
|
240
|
+
throw err;
|
|
241
|
+
} finally {
|
|
202
242
|
this.releasePendingObserveInit(normalizedSessionId);
|
|
203
|
-
}
|
|
243
|
+
}
|
|
204
244
|
}
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
await this.ensureInitialized();
|
|
208
|
-
if (this.closed || !this.archive || !this.summarizer) return;
|
|
209
|
-
if (messages.length === 0) return;
|
|
245
|
+
/** Append observed messages to the archive; returns the number of rows. */
|
|
246
|
+
archiveObservedMessages(sessionId, messages) {
|
|
210
247
|
const currentMax = this.archive.getMaxTurnIndex(sessionId);
|
|
211
248
|
const { messagePartsEnabled } = this.config;
|
|
212
|
-
const
|
|
249
|
+
const rows = messages.map((m, i) => ({
|
|
213
250
|
turnIndex: currentMax + 1 + i,
|
|
214
251
|
role: m.role,
|
|
215
252
|
content: m.content,
|
|
@@ -217,14 +254,90 @@ var LcmEngine = class {
|
|
|
217
254
|
rawContent: messagePartsEnabled ? m.rawContent : void 0,
|
|
218
255
|
sourceFormat: messagePartsEnabled ? m.sourceFormat : void 0
|
|
219
256
|
}));
|
|
220
|
-
this.archive.appendMessages(sessionId,
|
|
221
|
-
|
|
222
|
-
|
|
257
|
+
this.archive.appendMessages(sessionId, rows, { messagePartsEnabled });
|
|
258
|
+
return rows.length;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Summarize one session's durable backlog.
|
|
262
|
+
*
|
|
263
|
+
* The pass is capped so a long backlog never holds a job open indefinitely;
|
|
264
|
+
* remaining batches stay durable and the job re-queues itself.
|
|
265
|
+
*/
|
|
266
|
+
async processSummarizeJob(sessionId) {
|
|
267
|
+
if (this.closed) return;
|
|
268
|
+
await this.ensureInitialized();
|
|
269
|
+
if (this.closed || !this.archive || !this.summarizer || !this.observeQueue)
|
|
270
|
+
return;
|
|
223
271
|
try {
|
|
224
|
-
await this.summarizer.summarizeIncremental(sessionId
|
|
272
|
+
await this.summarizer.summarizeIncremental(sessionId, {
|
|
273
|
+
maxLeafBatches: LCM_SUMMARIZE_MAX_LEAF_BATCHES_PER_JOB
|
|
274
|
+
});
|
|
225
275
|
} catch (err) {
|
|
226
|
-
log.
|
|
276
|
+
log.error(`LCM incremental summarization failed: session=${sessionId}, error=${err}`);
|
|
277
|
+
this.scheduleSummarizeRetry(sessionId);
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
this.clearSummarizeRetry(sessionId);
|
|
281
|
+
if (this.hasCompleteBatchPending(sessionId)) {
|
|
282
|
+
this.observeQueue.enqueue(sessionId);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Schedule a metadata-only retry for a failed summary pass.
|
|
287
|
+
*
|
|
288
|
+
* The retry keeps trying for as long as the engine is open and complete
|
|
289
|
+
* batches remain — a transient failure must never strand durable work.
|
|
290
|
+
* What is bounded is the RATE, not the ability to retry: one pending timer
|
|
291
|
+
* per session, exponential backoff capped at
|
|
292
|
+
* {@link LCM_SUMMARIZE_RETRY_MAX_MS}, and an unreferenced timer that is
|
|
293
|
+
* cleared when the engine closes.
|
|
294
|
+
*/
|
|
295
|
+
scheduleSummarizeRetry(sessionId) {
|
|
296
|
+
if (this.closed || this.summarizeRetryTimers.has(sessionId)) return;
|
|
297
|
+
const attempt = (this.summarizeRetryAttempts.get(sessionId) ?? 0) + 1;
|
|
298
|
+
this.summarizeRetryAttempts.set(sessionId, attempt);
|
|
299
|
+
const delayMs = Math.min(
|
|
300
|
+
LCM_SUMMARIZE_RETRY_MAX_MS,
|
|
301
|
+
this.summarizeRetryBaseMs * 2 ** Math.min(attempt - 1, 16)
|
|
302
|
+
);
|
|
303
|
+
const retry = Promise.withResolvers();
|
|
304
|
+
this.summarizeRetryWaiters.set(sessionId, retry);
|
|
305
|
+
const timer = setTimeout(() => {
|
|
306
|
+
this.summarizeRetryTimers.delete(sessionId);
|
|
307
|
+
this.summarizeRetryWaiters.delete(sessionId);
|
|
308
|
+
if (this.closed) {
|
|
309
|
+
retry.resolve();
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
if (!this.hasCompleteBatchPending(sessionId)) {
|
|
313
|
+
this.summarizeRetryAttempts.delete(sessionId);
|
|
314
|
+
retry.resolve();
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
this.observeQueue?.enqueue(sessionId);
|
|
318
|
+
retry.resolve();
|
|
319
|
+
}, delayMs);
|
|
320
|
+
timer.unref?.();
|
|
321
|
+
this.summarizeRetryTimers.set(sessionId, timer);
|
|
322
|
+
}
|
|
323
|
+
/** True when the session still holds a complete unsummarized batch. */
|
|
324
|
+
hasCompleteBatchPending(sessionId) {
|
|
325
|
+
if (!this.archive) return false;
|
|
326
|
+
return this.archive.countUnsummarizedMessages(sessionId) >= this.config.leafBatchSize;
|
|
327
|
+
}
|
|
328
|
+
/** Drop a pending retry, its attempt counter, and release idle waiters. */
|
|
329
|
+
clearSummarizeRetry(sessionId) {
|
|
330
|
+
const timer = this.summarizeRetryTimers.get(sessionId);
|
|
331
|
+
if (timer) {
|
|
332
|
+
clearTimeout(timer);
|
|
333
|
+
this.summarizeRetryTimers.delete(sessionId);
|
|
334
|
+
}
|
|
335
|
+
const waiter = this.summarizeRetryWaiters.get(sessionId);
|
|
336
|
+
if (waiter) {
|
|
337
|
+
this.summarizeRetryWaiters.delete(sessionId);
|
|
338
|
+
waiter.resolve();
|
|
227
339
|
}
|
|
340
|
+
this.summarizeRetryAttempts.delete(sessionId);
|
|
228
341
|
}
|
|
229
342
|
get observeQueueDepth() {
|
|
230
343
|
return this.observeQueue?.depth ?? 0;
|
|
@@ -232,12 +345,21 @@ var LcmEngine = class {
|
|
|
232
345
|
get observeQueueInFlightCount() {
|
|
233
346
|
return this.observeQueue?.inFlightCount ?? 0;
|
|
234
347
|
}
|
|
235
|
-
async waitForObserveQueueIdle() {
|
|
348
|
+
async waitForObserveQueueIdle(abortSignal) {
|
|
349
|
+
abortSignal?.throwIfAborted();
|
|
236
350
|
if (!this.config.enabled || this.closed) return;
|
|
237
351
|
await this.ensureInitialized();
|
|
352
|
+
abortSignal?.throwIfAborted();
|
|
238
353
|
if (this.closed) return;
|
|
239
|
-
|
|
240
|
-
|
|
354
|
+
for (; ; ) {
|
|
355
|
+
abortSignal?.throwIfAborted();
|
|
356
|
+
await this.waitForPendingObserveInitIdle(void 0, abortSignal);
|
|
357
|
+
await this.observeQueue?.whenIdle(abortSignal);
|
|
358
|
+
abortSignal?.throwIfAborted();
|
|
359
|
+
const entry = [...this.summarizeRetryWaiters.entries()][0];
|
|
360
|
+
if (!entry) return;
|
|
361
|
+
await this.awaitSummarizeRetry(entry[0], entry[1], abortSignal);
|
|
362
|
+
}
|
|
241
363
|
}
|
|
242
364
|
async waitForSessionObserveIdle(sessionId, abortSignal) {
|
|
243
365
|
abortSignal?.throwIfAborted();
|
|
@@ -247,8 +369,34 @@ var LcmEngine = class {
|
|
|
247
369
|
await this.ensureInitialized();
|
|
248
370
|
abortSignal?.throwIfAborted();
|
|
249
371
|
if (this.closed) return;
|
|
250
|
-
|
|
251
|
-
|
|
372
|
+
for (; ; ) {
|
|
373
|
+
await this.waitForPendingObserveInitIdle(normalizedSessionId, abortSignal);
|
|
374
|
+
await this.observeQueue?.whenSessionIdle(normalizedSessionId, abortSignal) ?? Promise.resolve();
|
|
375
|
+
const waiter = this.summarizeRetryWaiters.get(normalizedSessionId);
|
|
376
|
+
if (!waiter) return;
|
|
377
|
+
await this.awaitSummarizeRetry(normalizedSessionId, waiter, abortSignal);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Park an explicit idle wait on a pending retry. While any wait is parked,
|
|
382
|
+
* the retry timer is referenced so a one-shot host cannot exit under the
|
|
383
|
+
* wait; with no waiters the timer stays unreferenced background work.
|
|
384
|
+
*/
|
|
385
|
+
async awaitSummarizeRetry(sessionId, waiter, abortSignal) {
|
|
386
|
+
const waiters = (this.summarizeRetryIdleWaiters.get(sessionId) ?? 0) + 1;
|
|
387
|
+
this.summarizeRetryIdleWaiters.set(sessionId, waiters);
|
|
388
|
+
this.summarizeRetryTimers.get(sessionId)?.ref?.();
|
|
389
|
+
try {
|
|
390
|
+
await abortOnSignal(abortSignal, waiter.promise);
|
|
391
|
+
} finally {
|
|
392
|
+
const remaining = (this.summarizeRetryIdleWaiters.get(sessionId) ?? 1) - 1;
|
|
393
|
+
if (remaining <= 0) {
|
|
394
|
+
this.summarizeRetryIdleWaiters.delete(sessionId);
|
|
395
|
+
this.summarizeRetryTimers.get(sessionId)?.unref?.();
|
|
396
|
+
} else {
|
|
397
|
+
this.summarizeRetryIdleWaiters.set(sessionId, remaining);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
252
400
|
}
|
|
253
401
|
reservePendingObserveInit(sessionId) {
|
|
254
402
|
const count = this.pendingObserveInitCounts.get(sessionId) ?? 0;
|
|
@@ -296,8 +444,18 @@ var LcmEngine = class {
|
|
|
296
444
|
return;
|
|
297
445
|
}
|
|
298
446
|
if (this.pendingObserveInitCounts.size === 0) return;
|
|
299
|
-
await new Promise((resolve) => {
|
|
300
|
-
|
|
447
|
+
await new Promise((resolve, reject) => {
|
|
448
|
+
const finish = () => {
|
|
449
|
+
abortSignal?.removeEventListener("abort", onAbort);
|
|
450
|
+
resolve();
|
|
451
|
+
};
|
|
452
|
+
const onAbort = () => {
|
|
453
|
+
const remaining = this.pendingObserveInitIdleWaiters.filter((waiter) => waiter !== finish);
|
|
454
|
+
this.pendingObserveInitIdleWaiters.splice(0, this.pendingObserveInitIdleWaiters.length, ...remaining);
|
|
455
|
+
reject(abortSignal?.reason instanceof Error ? abortSignal.reason : new DOMException("Aborted", "AbortError"));
|
|
456
|
+
};
|
|
457
|
+
this.pendingObserveInitIdleWaiters.push(finish);
|
|
458
|
+
abortSignal?.addEventListener("abort", onAbort, { once: true });
|
|
301
459
|
});
|
|
302
460
|
}
|
|
303
461
|
/** Build the compressed history recall section for a session. */
|
|
@@ -536,22 +694,24 @@ ${preview}`,
|
|
|
536
694
|
};
|
|
537
695
|
}
|
|
538
696
|
/** Clear all LCM archive and summary state for one session. */
|
|
539
|
-
async clearSession(sessionId) {
|
|
697
|
+
async clearSession(sessionId, abortSignal) {
|
|
540
698
|
if (!this.config.enabled || this.closed) return;
|
|
541
699
|
const normalizedSessionId = normalizeLcmSessionId(sessionId);
|
|
542
700
|
if (!normalizedSessionId) return;
|
|
543
701
|
await this.ensureInitialized();
|
|
544
702
|
if (this.closed || !this.archive || !this.dag) return;
|
|
545
|
-
await this.waitForSessionObserveIdle(normalizedSessionId);
|
|
703
|
+
await this.waitForSessionObserveIdle(normalizedSessionId, abortSignal);
|
|
704
|
+
abortSignal?.throwIfAborted();
|
|
546
705
|
this.dag.deleteSession(normalizedSessionId);
|
|
547
706
|
this.archive.deleteSession(normalizedSessionId);
|
|
548
707
|
}
|
|
549
708
|
/** Clear all LCM archive and summary state without closing the engine. */
|
|
550
|
-
async clearAll() {
|
|
709
|
+
async clearAll(abortSignal) {
|
|
551
710
|
if (!this.config.enabled || this.closed) return;
|
|
552
711
|
await this.ensureInitialized();
|
|
553
712
|
if (this.closed || !this.archive || !this.dag) return;
|
|
554
|
-
await this.waitForObserveQueueIdle();
|
|
713
|
+
await this.waitForObserveQueueIdle(abortSignal);
|
|
714
|
+
abortSignal?.throwIfAborted();
|
|
555
715
|
this.dag.deleteAll();
|
|
556
716
|
this.archive.deleteAll();
|
|
557
717
|
}
|
|
@@ -570,6 +730,12 @@ ${preview}`,
|
|
|
570
730
|
/** Close the database connection. */
|
|
571
731
|
close() {
|
|
572
732
|
this.closed = true;
|
|
733
|
+
for (const timer of this.summarizeRetryTimers.values()) clearTimeout(timer);
|
|
734
|
+
this.summarizeRetryTimers.clear();
|
|
735
|
+
this.summarizeRetryAttempts.clear();
|
|
736
|
+
for (const retry of this.summarizeRetryWaiters.values()) retry.resolve();
|
|
737
|
+
this.summarizeRetryWaiters.clear();
|
|
738
|
+
this.summarizeRetryIdleWaiters.clear();
|
|
573
739
|
if (this.db) {
|
|
574
740
|
this.db.close();
|
|
575
741
|
}
|
|
@@ -602,4 +768,4 @@ export {
|
|
|
602
768
|
extractLcmConfig,
|
|
603
769
|
LcmEngine
|
|
604
770
|
};
|
|
605
|
-
//# sourceMappingURL=chunk-
|
|
771
|
+
//# sourceMappingURL=chunk-ZG4GNPRE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lcm/engine.ts"],"sourcesContent":["import type Database from \"better-sqlite3\";\nimport { openLcmDatabase, ensureLcmStateDir } from \"./schema.js\";\nimport { LcmArchive, type LcmMessage, type LcmStructuredRecallMatch } from \"./archive.js\";\nimport { LcmDag } from \"./dag.js\";\nimport { LcmSummarizer, type SummarizeFn } from \"./summarizer.js\";\nimport {\n assembleCompressedHistoryWithTrace,\n type LcmRecallConfig,\n type LcmRecallWithTraceResult,\n} from \"./recall.js\";\nimport { LcmWorkQueue, type LcmObserveMessage } from \"./queue.js\";\nimport type { PluginConfig } from \"../types.js\";\nimport { estimateTokenCount } from \"../token-estimate.js\";\nimport { log } from \"../logger.js\";\nimport { nativeBindingRecoveryHint } from \"../native-binding-hint.js\";\nexport interface LcmEngineConfig {\n enabled: boolean;\n leafBatchSize: number;\n rollupFanIn: number;\n freshTailTurns: number;\n maxDepth: number;\n deterministicMaxTokens: number;\n archiveRetentionDays: number;\n recallBudgetShare: number;\n observeConcurrency: number;\n telemetryPrefilterEnabled: boolean;\n messagePartsEnabled: boolean;\n messagePartsRecallMaxResults: number;\n}\n\n/** An expanded archive row with stable lineage identity; content may be budget-truncated. */\nexport interface LcmExpandedMessage {\n id: number;\n session_id: string;\n turn_index: number;\n role: string;\n content: string;\n}\n\nfunction positiveInteger(value: unknown, fallback: number, min = 1): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return fallback;\n return Math.max(min, Math.floor(value));\n}\n\nfunction abortOnSignal<T>(abortSignal: AbortSignal | undefined, work: Promise<T>): Promise<T> {\n if (abortSignal === undefined) return work;\n abortSignal.throwIfAborted();\n return new Promise((resolve, reject) => {\n const onAbort = (): void => {\n reject(abortSignal.reason instanceof Error ? abortSignal.reason : new DOMException(\"Aborted\", \"AbortError\"));\n };\n abortSignal.addEventListener(\"abort\", onAbort, { once: true });\n work.then(resolve, reject).finally(() => abortSignal.removeEventListener(\"abort\", onAbort));\n });\n}\n\nexport function extractLcmConfig(cfg: PluginConfig): LcmEngineConfig {\n return {\n enabled: (cfg as any).lcmEnabled === true,\n leafBatchSize: positiveInteger((cfg as any).lcmLeafBatchSize, 8),\n rollupFanIn: positiveInteger((cfg as any).lcmRollupFanIn, 4, 2),\n freshTailTurns: positiveInteger((cfg as any).lcmFreshTailTurns, 16),\n maxDepth: positiveInteger((cfg as any).lcmMaxDepth, 5),\n deterministicMaxTokens: positiveInteger((cfg as any).lcmDeterministicMaxTokens, 512),\n archiveRetentionDays: positiveInteger((cfg as any).lcmArchiveRetentionDays, 90, 0),\n recallBudgetShare: (cfg as any).lcmRecallBudgetShare ?? 0.15,\n observeConcurrency:\n typeof (cfg as any).lcmObserveConcurrency === \"number\" &&\n Number.isFinite((cfg as any).lcmObserveConcurrency)\n ? Math.max(1, Math.floor((cfg as any).lcmObserveConcurrency))\n : 1,\n telemetryPrefilterEnabled: (cfg as any).lcmTelemetryPrefilterEnabled !== false,\n messagePartsEnabled: (cfg as any).messagePartsEnabled === true,\n messagePartsRecallMaxResults:\n typeof (cfg as any).messagePartsRecallMaxResults === \"number\"\n ? Math.max(0, Math.floor((cfg as any).messagePartsRecallMaxResults))\n : 6,\n };\n}\n\nfunction normalizeLcmSessionId(sessionId: string): string {\n return sessionId.trim();\n}\n\nfunction normalizeOptionalLcmSessionId(sessionId?: string): string | undefined {\n if (sessionId === undefined) {\n return undefined;\n }\n const normalized = normalizeLcmSessionId(sessionId);\n return normalized.length > 0 ? normalized : undefined;\n}\n\nconst EMPTY_LCM_STATS = {\n totalMessages: 0,\n totalSummaryNodes: 0,\n maxDepth: -1,\n} as const;\n\n/**\n * Upper bound on leaf batches summarized by one background job. Keeps a single\n * job's archive read and wall time bounded; leftover batches stay durable and\n * the job re-queues itself.\n */\nconst LCM_SUMMARIZE_MAX_LEAF_BATCHES_PER_JOB = 16;\n\n/** Retry pacing for a failed summary pass: base delay and backoff ceiling. */\nconst LCM_SUMMARIZE_RETRY_BASE_MS = 500;\nconst LCM_SUMMARIZE_RETRY_MAX_MS = 30_000;\n\nexport class LcmEngine {\n private db: Database.Database | null = null;\n private archive: LcmArchive | null = null;\n private dag: LcmDag | null = null;\n private summarizer: LcmSummarizer | null = null;\n private observeQueue: LcmWorkQueue | null = null;\n private closed = false;\n private readonly config: LcmEngineConfig;\n private readonly memoryDir: string;\n private initPromise: Promise<void> | null = null;\n private readonly summarizeRetryTimers = new Map<string, NodeJS.Timeout>();\n private readonly summarizeRetryAttempts = new Map<string, number>();\n /** Resolved when the session's pending retry timer has fired or been cleared. */\n private readonly summarizeRetryWaiters = new Map<\n string,\n { promise: Promise<void>; resolve: () => void }\n >();\n /** Explicit idle waiters per session; referenced only while nonzero. */\n private readonly summarizeRetryIdleWaiters = new Map<string, number>();\n /** Base backoff delay; tests shrink it to keep the retry loop fast. */\n private summarizeRetryBaseMs = LCM_SUMMARIZE_RETRY_BASE_MS;\n private readonly pendingObserveInitCounts = new Map<string, number>();\n private readonly pendingObserveInitWaiters = new Map<string, Array<() => void>>();\n private readonly pendingObserveInitIdleWaiters: Array<() => void> = [];\n\n constructor(\n pluginConfig: PluginConfig,\n private readonly summarizeFn: SummarizeFn,\n ) {\n this.config = extractLcmConfig(pluginConfig);\n this.memoryDir = pluginConfig.memoryDir;\n }\n\n get enabled(): boolean {\n return this.config.enabled;\n }\n\n /** Lazy init — open database on first use. */\n async ensureInitialized(): Promise<void> {\n if (this.closed) return;\n if (this.db) return;\n if (this.initPromise) {\n await this.initPromise;\n return;\n }\n this.initPromise = this.doInit().catch((err) => {\n // Reset so next call retries instead of caching the failure\n this.initPromise = null;\n throw err;\n });\n await this.initPromise;\n }\n\n private async doInit(): Promise<void> {\n await ensureLcmStateDir(this.memoryDir);\n const db = openLcmDatabase(this.memoryDir);\n const archive = new LcmArchive(db);\n const dag = new LcmDag(db);\n const { telemetryPrefilterEnabled } = this.config;\n const summarizer = new LcmSummarizer(\n archive,\n dag,\n this.summarizeFn,\n {\n leafBatchSize: this.config.leafBatchSize,\n rollupFanIn: this.config.rollupFanIn,\n maxDepth: this.config.maxDepth,\n deterministicMaxTokens: this.config.deterministicMaxTokens,\n telemetryPrefilterEnabled,\n },\n );\n const observeQueue = new LcmWorkQueue({\n concurrency: this.config.observeConcurrency,\n worker: async (sessionId) => {\n await this.processSummarizeJob(sessionId);\n },\n hooks: {\n onJobStart: ({ sessionId, depth, inFlight, waitMs }) => {\n log.debug(\n `LCM observe queue start: session=${sessionId}, depth=${depth}, inFlight=${inFlight}, wait=${waitMs}ms`,\n );\n },\n onJobFinish: ({\n sessionId,\n depth,\n inFlight,\n waitMs,\n runMs,\n totalMs,\n error,\n }) => {\n if (error) {\n log.error(\n `LCM observe queue failure: session=${sessionId}, depth=${depth}, inFlight=${inFlight}, wait=${waitMs}ms, run=${runMs}ms, total=${totalMs}ms, error=${error}`,\n );\n return;\n }\n\n log.debug(\n `LCM observe queue finish: session=${sessionId}, depth=${depth}, inFlight=${inFlight}, wait=${waitMs}ms, run=${runMs}ms, total=${totalMs}ms`,\n );\n },\n },\n });\n\n if (this.closed) {\n db.close();\n return;\n }\n\n this.db = db;\n this.archive = archive;\n this.dag = dag;\n this.summarizer = summarizer;\n this.observeQueue = observeQueue;\n this.resumeOutstandingSummaries();\n log.info(\"LCM engine initialized\");\n }\n\n /**\n * Restart resume: sessions whose durable archive still holds complete\n * unsummarized batches get a summary job without any new observe call.\n * Only session references are queued — the content already lives in SQLite.\n */\n private resumeOutstandingSummaries(): void {\n if (!this.archive || !this.observeQueue) return;\n const sessions = this.archive.listSessionsWithUnsummarizedTurns(\n this.config.leafBatchSize,\n );\n if (sessions.length === 0) return;\n for (const sessionId of sessions) this.observeQueue.enqueue(sessionId);\n log.info(`LCM resume scheduled summary jobs: sessions=${sessions.length}`);\n }\n\n /**\n * Archive observed messages and schedule background summarization.\n *\n * The archive append completes BEFORE this resolves: an accepted observe is\n * already durable in SQLite, so a crash cannot lose it. Only the\n * summarization is background work, and it resumes from the durable archive.\n */\n async observeMessages(\n sessionId: string,\n messages: LcmObserveMessage[],\n ): Promise<void> {\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return;\n await this.enqueueObserveMessages(normalizedSessionId, messages);\n }\n\n /**\n * Durably archive messages, then queue a metadata-only summary job.\n *\n * Rejects when the archive append fails — callers must not treat a failed\n * archive as an accepted observation.\n */\n async enqueueObserveMessages(\n sessionId: string,\n messages: LcmObserveMessage[],\n ): Promise<void> {\n // LCM off is a feature gate (the caller reports \"not archived\"); a closed\n // engine is a failure — accepting the turn and archiving nothing would\n // acknowledge a turn the archive never stored.\n if (!this.config.enabled) return;\n if (this.closed) throw new Error(\"LCM engine is closed\");\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return;\n if (messages.length === 0) return;\n\n this.reservePendingObserveInit(normalizedSessionId);\n\n try {\n await this.ensureInitialized();\n if (this.closed) throw new Error(\"LCM engine is closed\");\n if (!this.archive || !this.observeQueue) {\n throw new Error(\"LCM engine is not initialized\");\n }\n\n const archived = this.archiveObservedMessages(normalizedSessionId, messages);\n this.observeQueue.enqueue(normalizedSessionId);\n log.debug(\n `LCM observe archived: session=${normalizedSessionId}, messages=${archived}, depth=${this.observeQueue.depth}, inFlight=${this.observeQueue.inFlightCount}`,\n );\n } catch (err) {\n log.error(\n `LCM observe archive failed: session=${normalizedSessionId}, error=${err}${nativeBindingRecoveryHint(err)}`,\n );\n throw err;\n } finally {\n this.releasePendingObserveInit(normalizedSessionId);\n }\n }\n\n /** Append observed messages to the archive; returns the number of rows. */\n private archiveObservedMessages(\n sessionId: string,\n messages: LcmObserveMessage[],\n ): number {\n const currentMax = this.archive!.getMaxTurnIndex(sessionId);\n const { messagePartsEnabled } = this.config;\n const rows = messages.map((m, i) => ({\n turnIndex: currentMax + 1 + i,\n role: m.role,\n content: m.content,\n parts: messagePartsEnabled ? m.parts : undefined,\n rawContent: messagePartsEnabled ? m.rawContent : undefined,\n sourceFormat: messagePartsEnabled ? m.sourceFormat : undefined,\n }));\n\n this.archive!.appendMessages(sessionId, rows, { messagePartsEnabled });\n return rows.length;\n }\n\n /**\n * Summarize one session's durable backlog.\n *\n * The pass is capped so a long backlog never holds a job open indefinitely;\n * remaining batches stay durable and the job re-queues itself.\n */\n private async processSummarizeJob(sessionId: string): Promise<void> {\n if (this.closed) return;\n await this.ensureInitialized();\n if (this.closed || !this.archive || !this.summarizer || !this.observeQueue)\n return;\n\n try {\n await this.summarizer.summarizeIncremental(sessionId, {\n maxLeafBatches: LCM_SUMMARIZE_MAX_LEAF_BATCHES_PER_JOB,\n });\n } catch (err) {\n // The archived turns are durable; a failed pass must not strand them\n // until the next observe or a restart.\n log.error(`LCM incremental summarization failed: session=${sessionId}, error=${err}`);\n this.scheduleSummarizeRetry(sessionId);\n return;\n }\n\n this.clearSummarizeRetry(sessionId);\n\n if (this.hasCompleteBatchPending(sessionId)) {\n this.observeQueue.enqueue(sessionId);\n }\n }\n\n /**\n * Schedule a metadata-only retry for a failed summary pass.\n *\n * The retry keeps trying for as long as the engine is open and complete\n * batches remain — a transient failure must never strand durable work.\n * What is bounded is the RATE, not the ability to retry: one pending timer\n * per session, exponential backoff capped at\n * {@link LCM_SUMMARIZE_RETRY_MAX_MS}, and an unreferenced timer that is\n * cleared when the engine closes.\n */\n private scheduleSummarizeRetry(sessionId: string): void {\n if (this.closed || this.summarizeRetryTimers.has(sessionId)) return;\n const attempt = (this.summarizeRetryAttempts.get(sessionId) ?? 0) + 1;\n this.summarizeRetryAttempts.set(sessionId, attempt);\n const delayMs = Math.min(\n LCM_SUMMARIZE_RETRY_MAX_MS,\n this.summarizeRetryBaseMs * 2 ** Math.min(attempt - 1, 16),\n );\n // The waiter makes the pending retry visible to idle waits, so a direct\n // flush (pre-compaction) serializes with the retry instead of racing it.\n const retry = Promise.withResolvers<void>();\n this.summarizeRetryWaiters.set(sessionId, retry);\n const timer = setTimeout(() => {\n this.summarizeRetryTimers.delete(sessionId);\n this.summarizeRetryWaiters.delete(sessionId);\n if (this.closed) {\n retry.resolve();\n return;\n }\n if (!this.hasCompleteBatchPending(sessionId)) {\n this.summarizeRetryAttempts.delete(sessionId);\n retry.resolve();\n return;\n }\n // Re-queue before releasing the waiter: an idle wait released by the\n // retry must observe the queued job, never run beside it.\n this.observeQueue?.enqueue(sessionId);\n retry.resolve();\n }, delayMs);\n // Pure background: unreferenced, so a one-shot host is never kept alive\n // by a retry loop. An explicit idle waiter (see waitForSessionObserveIdle)\n // references it for the duration of the wait, and close() clears all.\n timer.unref?.();\n this.summarizeRetryTimers.set(sessionId, timer);\n }\n\n /** True when the session still holds a complete unsummarized batch. */\n private hasCompleteBatchPending(sessionId: string): boolean {\n if (!this.archive) return false;\n return (\n this.archive.countUnsummarizedMessages(sessionId) >=\n this.config.leafBatchSize\n );\n }\n\n /** Drop a pending retry, its attempt counter, and release idle waiters. */\n private clearSummarizeRetry(sessionId: string): void {\n const timer = this.summarizeRetryTimers.get(sessionId);\n if (timer) {\n clearTimeout(timer);\n this.summarizeRetryTimers.delete(sessionId);\n }\n const waiter = this.summarizeRetryWaiters.get(sessionId);\n if (waiter) {\n this.summarizeRetryWaiters.delete(sessionId);\n waiter.resolve();\n }\n this.summarizeRetryAttempts.delete(sessionId);\n }\n\n get observeQueueDepth(): number {\n return this.observeQueue?.depth ?? 0;\n }\n\n get observeQueueInFlightCount(): number {\n return this.observeQueue?.inFlightCount ?? 0;\n }\n\n async waitForObserveQueueIdle(abortSignal?: AbortSignal): Promise<void> {\n abortSignal?.throwIfAborted();\n if (!this.config.enabled || this.closed) return;\n await this.ensureInitialized();\n abortSignal?.throwIfAborted();\n if (this.closed) return;\n for (;;) {\n abortSignal?.throwIfAborted();\n await this.waitForPendingObserveInitIdle(undefined, abortSignal);\n await this.observeQueue?.whenIdle(abortSignal);\n abortSignal?.throwIfAborted();\n const entry = [...this.summarizeRetryWaiters.entries()][0];\n if (!entry) return;\n await this.awaitSummarizeRetry(entry[0], entry[1], abortSignal);\n // A fired retry may have re-queued a session: wait for the queue again.\n }\n }\n\n async waitForSessionObserveIdle(sessionId: string, abortSignal?: AbortSignal): Promise<void> {\n abortSignal?.throwIfAborted();\n if (!this.config.enabled || this.closed) return;\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return;\n await this.ensureInitialized();\n abortSignal?.throwIfAborted();\n if (this.closed) return;\n // Serialize with pending summary retries: a direct flush (pre-compaction)\n // must not run beside a retry pass for the same session.\n for (;;) {\n await this.waitForPendingObserveInitIdle(normalizedSessionId, abortSignal);\n await this.observeQueue?.whenSessionIdle(normalizedSessionId, abortSignal) ?? Promise.resolve();\n const waiter = this.summarizeRetryWaiters.get(normalizedSessionId);\n if (!waiter) return;\n await this.awaitSummarizeRetry(normalizedSessionId, waiter, abortSignal);\n // The retry fired and may have re-queued the session: wait again.\n }\n }\n\n /**\n * Park an explicit idle wait on a pending retry. While any wait is parked,\n * the retry timer is referenced so a one-shot host cannot exit under the\n * wait; with no waiters the timer stays unreferenced background work.\n */\n private async awaitSummarizeRetry(\n sessionId: string,\n waiter: { promise: Promise<void>; resolve: () => void },\n abortSignal?: AbortSignal,\n ): Promise<void> {\n const waiters = (this.summarizeRetryIdleWaiters.get(sessionId) ?? 0) + 1;\n this.summarizeRetryIdleWaiters.set(sessionId, waiters);\n this.summarizeRetryTimers.get(sessionId)?.ref?.();\n try {\n await abortOnSignal(abortSignal, waiter.promise);\n } finally {\n const remaining = (this.summarizeRetryIdleWaiters.get(sessionId) ?? 1) - 1;\n if (remaining <= 0) {\n this.summarizeRetryIdleWaiters.delete(sessionId);\n this.summarizeRetryTimers.get(sessionId)?.unref?.();\n } else {\n this.summarizeRetryIdleWaiters.set(sessionId, remaining);\n }\n }\n }\n\n private reservePendingObserveInit(sessionId: string): void {\n const count = this.pendingObserveInitCounts.get(sessionId) ?? 0;\n this.pendingObserveInitCounts.set(sessionId, count + 1);\n }\n\n private releasePendingObserveInit(sessionId: string): void {\n const count = this.pendingObserveInitCounts.get(sessionId);\n if (!count) return;\n\n if (count === 1) {\n this.pendingObserveInitCounts.delete(sessionId);\n const waiters = this.pendingObserveInitWaiters.get(sessionId) ?? [];\n this.pendingObserveInitWaiters.delete(sessionId);\n for (const resolve of waiters) resolve();\n if (this.pendingObserveInitCounts.size === 0) {\n const idleWaiters = this.pendingObserveInitIdleWaiters.splice(\n 0,\n this.pendingObserveInitIdleWaiters.length,\n );\n for (const resolve of idleWaiters) resolve();\n }\n return;\n }\n\n this.pendingObserveInitCounts.set(sessionId, count - 1);\n }\n\n private async waitForPendingObserveInitIdle(sessionId?: string, abortSignal?: AbortSignal): Promise<void> {\n abortSignal?.throwIfAborted();\n if (sessionId) {\n if (!this.pendingObserveInitCounts.has(sessionId)) return;\n await new Promise<void>((resolve, reject) => {\n const finish = (): void => {\n abortSignal?.removeEventListener(\"abort\", onAbort);\n resolve();\n };\n const onAbort = (): void => {\n const remaining = (this.pendingObserveInitWaiters.get(sessionId) ?? []).filter((waiter) => waiter !== finish);\n if (remaining.length === 0) this.pendingObserveInitWaiters.delete(sessionId);\n else this.pendingObserveInitWaiters.set(sessionId, remaining);\n reject(abortSignal?.reason instanceof Error ? abortSignal.reason : new DOMException(\"Aborted\", \"AbortError\"));\n };\n const waiters = this.pendingObserveInitWaiters.get(sessionId) ?? [];\n waiters.push(finish);\n this.pendingObserveInitWaiters.set(sessionId, waiters);\n abortSignal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n return;\n }\n\n if (this.pendingObserveInitCounts.size === 0) return;\n await new Promise<void>((resolve, reject) => {\n const finish = (): void => {\n abortSignal?.removeEventListener(\"abort\", onAbort);\n resolve();\n };\n const onAbort = (): void => {\n const remaining = this.pendingObserveInitIdleWaiters.filter((waiter) => waiter !== finish);\n this.pendingObserveInitIdleWaiters.splice(0, this.pendingObserveInitIdleWaiters.length, ...remaining);\n reject(abortSignal?.reason instanceof Error ? abortSignal.reason : new DOMException(\"Aborted\", \"AbortError\"));\n };\n this.pendingObserveInitIdleWaiters.push(finish);\n abortSignal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n\n /** Build the compressed history recall section for a session. */\n async assembleRecall(\n sessionId: string,\n budgetChars: number,\n ): Promise<string> {\n return (await this.assembleRecallWithTrace(sessionId, budgetChars)).text;\n }\n\n /** Build compressed recall plus content-free selected-summary receipts. */\n async assembleRecallWithTrace(\n sessionId: string,\n budgetChars: number,\n ): Promise<LcmRecallWithTraceResult> {\n if (!this.config.enabled) return { text: \"\", selectedSummaries: [] };\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return { text: \"\", selectedSummaries: [] };\n await this.ensureInitialized();\n\n const effectiveBudget = Math.ceil(\n budgetChars * this.config.recallBudgetShare,\n );\n if (effectiveBudget <= 0) return { text: \"\", selectedSummaries: [] };\n\n return assembleCompressedHistoryWithTrace(this.dag!, this.archive!, normalizedSessionId, {\n freshTailTurns: this.config.freshTailTurns,\n budgetChars: effectiveBudget,\n });\n }\n\n async searchStructuredParts(\n sessionId: string,\n query: string,\n limit = this.config.messagePartsRecallMaxResults,\n ): Promise<LcmStructuredRecallMatch[]> {\n const { messagePartsEnabled } = this.config;\n if (!this.config.enabled || !messagePartsEnabled) return [];\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return [];\n await this.ensureInitialized();\n if (!this.archive) return [];\n return this.archive.searchStructuredParts(query, limit, normalizedSessionId);\n }\n\n formatStructuredRecall(\n matches: LcmStructuredRecallMatch[],\n budgetChars: number,\n ): string {\n if (matches.length === 0 || budgetChars <= 0) return \"\";\n const lines: string[] = [];\n let used = \"## Structured Session Matches\\n\\n\".length;\n for (const match of matches) {\n const label = match.file_path\n ? `${match.kind} ${match.file_path}`\n : match.tool_name\n ? `${match.kind} ${match.tool_name}`\n : match.kind;\n const excerpt = match.content.replace(/\\s+/g, \" \").slice(0, 220);\n const line = `- turn ${match.turn_index} (${match.role}): ${label} — ${excerpt}`;\n if (used + line.length + 1 > budgetChars) break;\n lines.push(line);\n used += line.length + 1;\n }\n return lines.length > 0 ? `## Structured Session Matches\\n\\n${lines.join(\"\\n\")}` : \"\";\n }\n\n /** Flush pending summaries before compaction (called from before_compaction hook). */\n async preCompactionFlush(sessionId: string, abortSignal?: AbortSignal): Promise<void> {\n abortSignal?.throwIfAborted();\n if (!this.config.enabled) return;\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return;\n await this.ensureInitialized();\n abortSignal?.throwIfAborted();\n await this.waitForSessionObserveIdle(normalizedSessionId, abortSignal);\n abortSignal?.throwIfAborted();\n\n try {\n await abortOnSignal(abortSignal, this.summarizer!.summarizeIncremental(normalizedSessionId));\n } catch (err) {\n if (abortSignal?.aborted) throw err;\n log.debug(`LCM pre-compaction flush error: ${err}`);\n }\n }\n\n /** Record a compaction event with real token counts (called from after_compaction hook). */\n async recordCompaction(\n sessionId: string,\n tokensBefore: number,\n tokensAfter: number,\n ): Promise<void> {\n if (!this.config.enabled) return;\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return;\n await this.ensureInitialized();\n await this.waitForSessionObserveIdle(normalizedSessionId);\n\n const maxTurn = this.archive!.getMaxTurnIndex(normalizedSessionId);\n\n this.dag!.recordCompaction(normalizedSessionId, maxTurn, tokensBefore, tokensAfter);\n log.info(\n `LCM compaction recorded: session=${normalizedSessionId}, turn=${maxTurn}, tokens ${tokensBefore}→${tokensAfter}`,\n );\n }\n\n /** Verify archive coverage after compaction. */\n async verifyPostCompaction(sessionId: string): Promise<void> {\n if (!this.config.enabled) return;\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return;\n await this.ensureInitialized();\n\n const msgCount = this.archive!.getMessageCount(normalizedSessionId);\n const nodeCount = this.dag!.getNodeCount(normalizedSessionId);\n log.debug(\n `LCM post-compaction verify: session=${normalizedSessionId}, messages=${msgCount}, summaryNodes=${nodeCount}`,\n );\n }\n\n // ── MCP Tool implementations ──\n\n /** Search across all conversation history via FTS (snippet mode). */\n async searchContext(\n query: string,\n limit: number,\n sessionId?: string,\n sessionPrefix?: string,\n ): Promise<\n Array<{\n turn_index: number;\n role: string;\n snippet: string;\n session_id: string;\n }>\n > {\n if (!this.config.enabled) return [];\n const normalizedSessionId = normalizeOptionalLcmSessionId(sessionId);\n if (sessionId !== undefined && !normalizedSessionId) return [];\n const normalizedSessionPrefix = normalizeOptionalLcmSessionId(sessionPrefix);\n if (sessionPrefix !== undefined && !normalizedSessionPrefix) return [];\n await this.ensureInitialized();\n return this.archive!.search(query, limit, normalizedSessionId, normalizedSessionPrefix);\n }\n\n /** Search via FTS returning full message content (not snippets). */\n async searchContextFull(\n query: string,\n limit: number,\n sessionId?: string,\n sessionPrefix?: string,\n ): Promise<\n Array<{\n id: number;\n turn_index: number;\n role: string;\n content: string;\n session_id: string;\n score: number;\n }>\n > {\n if (!this.config.enabled) return [];\n const normalizedSessionId = normalizeOptionalLcmSessionId(sessionId);\n if (sessionId !== undefined && !normalizedSessionId) return [];\n const normalizedSessionPrefix = normalizeOptionalLcmSessionId(sessionPrefix);\n if (sessionPrefix !== undefined && !normalizedSessionPrefix) return [];\n await this.ensureInitialized();\n return this.archive!.searchWithContent(\n query,\n limit,\n normalizedSessionId,\n 1000,\n normalizedSessionPrefix,\n );\n }\n\n /** Get a compressed summary of a turn range. */\n async describeContext(\n sessionId: string,\n fromTurn: number,\n toTurn: number,\n ): Promise<{ summary: string; turn_count: number; depth: number } | null> {\n if (!this.config.enabled) return null;\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return null;\n await this.ensureInitialized();\n\n const nodes = this.dag!.getCoveringNodes(normalizedSessionId, fromTurn, toTurn);\n if (nodes.length === 0) {\n // No summary exists — build a description from raw messages\n const messages = this.archive!.getMessages(normalizedSessionId, fromTurn, toTurn);\n if (messages.length === 0) return null;\n const preview = messages\n .slice(0, 5)\n .map((m) => `[${m.role}] ${m.content.slice(0, 100)}`)\n .join(\"\\n\");\n return {\n summary: `No summary available for this range. Preview of ${messages.length} messages:\\n${preview}`,\n turn_count: messages.length,\n depth: -1,\n };\n }\n\n // Use the deepest covering node\n const best = nodes[0]; // Already sorted by depth DESC\n return {\n summary: best.summary_text,\n turn_count: best.msg_end - best.msg_start + 1,\n depth: best.depth,\n };\n }\n\n /**\n * Retrieve raw archived messages for a turn range (inclusive bounds),\n * read-only and unshaped — no token-budget trimming (issue #2331\n * episodic-context). Callers own truncation and cleaning.\n */\n async getTurnRange(\n sessionId: string,\n fromTurn: number,\n toTurn: number,\n ): Promise<LcmMessage[]> {\n if (!this.config.enabled) return [];\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return [];\n await this.ensureInitialized();\n return this.archive!.getMessages(normalizedSessionId, fromTurn, toTurn);\n }\n\n /** Retrieve raw messages for a turn range (lossless expansion). */\n async expandContext(\n sessionId: string,\n fromTurn: number,\n toTurn: number,\n maxTokens: number,\n ): Promise<LcmExpandedMessage[]> {\n if (!this.config.enabled) return [];\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return [];\n await this.ensureInitialized();\n\n const messages = this.archive!.getMessages(normalizedSessionId, fromTurn, toTurn);\n if (messages.length === 0) return [];\n\n // Enforce the token budget while keeping the existing first/last shape.\n const tokenBudget = Math.max(0, Math.floor(maxTokens));\n if (tokenBudget === 0) return [];\n const totalTokens = messages.reduce(\n (sum, message) => sum + estimateTokenCount(message.content),\n 0,\n );\n if (totalTokens <= tokenBudget) {\n return messages.map((m) => ({\n id: m.id,\n session_id: m.session_id,\n turn_index: m.turn_index,\n role: m.role,\n content: m.content,\n }));\n }\n\n const result: LcmExpandedMessage[] = [];\n const lastMsg = messages[messages.length - 1];\n const reservedLastTokens = Math.min(\n estimateTokenCount(lastMsg.content),\n Math.max(1, Math.floor(tokenBudget * 0.3)),\n );\n let remainingTokens = tokenBudget - reservedLastTokens;\n\n for (let i = 0; i < messages.length - 1; i++) {\n if (remainingTokens <= 0) break;\n const content = truncateToTokenBudget(\n messages[i].content,\n remainingTokens,\n );\n if (!content) continue;\n result.push({\n id: messages[i].id,\n session_id: messages[i].session_id,\n turn_index: messages[i].turn_index,\n role: messages[i].role,\n content,\n });\n remainingTokens -= estimateTokenCount(content);\n }\n\n const lastContent = truncateToTokenBudget(\n lastMsg.content,\n reservedLastTokens + remainingTokens,\n );\n if (lastContent) {\n result.push({\n id: lastMsg.id,\n session_id: lastMsg.session_id,\n turn_index: lastMsg.turn_index,\n role: lastMsg.role,\n content: lastContent,\n });\n }\n return result;\n }\n\n\n /** Get statistics about the LCM archive. */\n async getStats(sessionId?: string): Promise<{\n totalMessages: number;\n totalSummaryNodes: number;\n maxDepth: number;\n maxTurnIndex?: number;\n }> {\n if (!this.config.enabled)\n return { totalMessages: 0, totalSummaryNodes: 0, maxDepth: -1 };\n const normalizedSessionId = normalizeOptionalLcmSessionId(sessionId);\n if (sessionId !== undefined && !normalizedSessionId) {\n return { ...EMPTY_LCM_STATS };\n }\n await this.ensureInitialized();\n\n if (normalizedSessionId) {\n return {\n totalMessages: this.archive!.getMessageCount(normalizedSessionId),\n totalSummaryNodes: this.dag!.getNodeCount(normalizedSessionId),\n maxDepth: this.dag!.getMaxDepth(normalizedSessionId),\n maxTurnIndex: this.archive!.getMaxTurnIndex(normalizedSessionId),\n };\n }\n\n return {\n totalMessages: this.archive!.getTotalMessageCount(),\n totalSummaryNodes: 0, // Would need a global count query\n maxDepth: -1,\n };\n }\n\n /** Clear all LCM archive and summary state for one session. */\n async clearSession(sessionId: string, abortSignal?: AbortSignal): Promise<void> {\n if (!this.config.enabled || this.closed) return;\n const normalizedSessionId = normalizeLcmSessionId(sessionId);\n if (!normalizedSessionId) return;\n await this.ensureInitialized();\n if (this.closed || !this.archive || !this.dag) return;\n await this.waitForSessionObserveIdle(normalizedSessionId, abortSignal);\n abortSignal?.throwIfAborted();\n this.dag.deleteSession(normalizedSessionId);\n this.archive.deleteSession(normalizedSessionId);\n }\n\n /** Clear all LCM archive and summary state without closing the engine. */\n async clearAll(abortSignal?: AbortSignal): Promise<void> {\n if (!this.config.enabled || this.closed) return;\n await this.ensureInitialized();\n if (this.closed || !this.archive || !this.dag) return;\n await this.waitForObserveQueueIdle(abortSignal);\n abortSignal?.throwIfAborted();\n this.dag.deleteAll();\n this.archive.deleteAll();\n }\n\n /** Prune old data beyond retention period. */\n async prune(): Promise<{ messagesPruned: number; nodesPruned: number }> {\n if (!this.config.enabled) return { messagesPruned: 0, nodesPruned: 0 };\n await this.ensureInitialized();\n\n const messagesPruned = this.archive!.pruneOldMessages(\n this.config.archiveRetentionDays,\n );\n const nodesPruned = this.dag!.pruneOldNodes(\n this.config.archiveRetentionDays,\n );\n return { messagesPruned, nodesPruned };\n }\n\n /** Close the database connection. */\n close(): void {\n this.closed = true;\n for (const timer of this.summarizeRetryTimers.values()) clearTimeout(timer);\n this.summarizeRetryTimers.clear();\n this.summarizeRetryAttempts.clear();\n for (const retry of this.summarizeRetryWaiters.values()) retry.resolve();\n this.summarizeRetryWaiters.clear();\n this.summarizeRetryIdleWaiters.clear();\n if (this.db) {\n this.db.close();\n }\n this.db = null;\n this.archive = null;\n this.dag = null;\n this.summarizer = null;\n this.observeQueue = null;\n this.initPromise = null;\n }\n}\nfunction truncateToTokenBudget(text: string, maxTokens: number): string {\n if (maxTokens <= 0) return \"\";\n if (estimateTokenCount(text) <= maxTokens) return text;\n const codePoints = [...text];\n let low = 0;\n let high = codePoints.length;\n while (low < high) {\n const mid = Math.ceil((low + high) / 2);\n if (estimateTokenCount(codePoints.slice(0, mid).join(\"\")) <= maxTokens) {\n low = mid;\n } else {\n high = mid - 1;\n }\n }\n return codePoints.slice(0, low).join(\"\");\n}\n"],"mappings":"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","names":[]}
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
} from "./chunk-B7RWBZXW.js";
|
|
4
4
|
import {
|
|
5
5
|
StorageManager
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-ILD7N3XC.js";
|
|
7
7
|
import {
|
|
8
8
|
getCachedEpisodeMap,
|
|
9
9
|
setCachedEpisodeMap
|
|
@@ -109,4 +109,4 @@ export {
|
|
|
109
109
|
compareVerifiedEpisodeResults,
|
|
110
110
|
searchVerifiedEpisodes
|
|
111
111
|
};
|
|
112
|
-
//# sourceMappingURL=chunk-
|
|
112
|
+
//# sourceMappingURL=chunk-ZS5LREUZ.js.map
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
PROJECTION_REBUILD_RUNNER_FLAG
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-HNF7IMYQ.js";
|
|
4
|
+
import {
|
|
5
|
+
startLocationAutoSync
|
|
6
|
+
} from "./chunk-THFSCUFC.js";
|
|
4
7
|
import {
|
|
5
8
|
ensureContradictionScanCron,
|
|
6
9
|
ensureDaySummaryCron,
|
|
@@ -10,25 +13,22 @@ import {
|
|
|
10
13
|
ensureProceduralMiningCron,
|
|
11
14
|
graphEdgeDecayCadenceToCronExpr
|
|
12
15
|
} from "./chunk-666A3MOW.js";
|
|
13
|
-
import {
|
|
14
|
-
startLocationAutoSync
|
|
15
|
-
} from "./chunk-O5ZINWW3.js";
|
|
16
16
|
import {
|
|
17
17
|
CompoundingEngine,
|
|
18
18
|
isIsoWeekId,
|
|
19
19
|
msUntilNextIsoWeek,
|
|
20
20
|
previousIsoWeekId
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-XR4QR3JT.js";
|
|
22
22
|
import {
|
|
23
23
|
rebuildMemoryLifecycleLedger
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-2YPIFJHL.js";
|
|
25
25
|
import {
|
|
26
26
|
planNamespaceMaintenance,
|
|
27
27
|
runNamespaceMaintenanceBatchPlan
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-MCFI6G7U.js";
|
|
29
29
|
import {
|
|
30
30
|
rebuildMemoryProjection
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-66PEACZP.js";
|
|
32
32
|
import {
|
|
33
33
|
DEFAULT_TIMELINE_CATEGORIES,
|
|
34
34
|
TIMELINE_RESERVED_IDLE,
|
|
@@ -45,7 +45,7 @@ import {
|
|
|
45
45
|
} from "./chunk-EWMRFW3F.js";
|
|
46
46
|
import {
|
|
47
47
|
LocalLlmClient
|
|
48
|
-
} from "./chunk-
|
|
48
|
+
} from "./chunk-5RW247F5.js";
|
|
49
49
|
import {
|
|
50
50
|
FallbackLlmClient
|
|
51
51
|
} from "./chunk-AVVCPA7U.js";
|
|
@@ -2874,4 +2874,4 @@ export {
|
|
|
2874
2874
|
ActivitySyncScheduler,
|
|
2875
2875
|
MaintenanceScheduler
|
|
2876
2876
|
};
|
|
2877
|
-
//# sourceMappingURL=chunk-
|
|
2877
|
+
//# sourceMappingURL=chunk-ZYEWTVNQ.js.map
|