@remnic/core 1.1.12 → 1.1.14
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-cli.d.ts +2 -1
- package/dist/access-cli.js +263 -82
- package/dist/access-cli.js.map +1 -1
- package/dist/access-http.d.ts +26 -60
- package/dist/access-http.js +43 -29
- package/dist/access-mcp.d.ts +24 -6
- package/dist/access-mcp.js +35 -28
- package/dist/access-schema.d.ts +9 -6
- package/dist/access-schema.js +7 -5
- package/dist/access-service-DcCDmNYC.d.ts +1542 -0
- package/dist/access-service.d.ts +25 -7
- package/dist/access-service.js +33 -26
- package/dist/active-memory-bridge.js +2 -2
- package/dist/active-recall.js +11 -3
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/claude-code.d.ts +24 -0
- package/dist/adapters/claude-code.js +9 -0
- package/dist/adapters/codex.d.ts +25 -0
- package/dist/adapters/codex.js +9 -0
- package/dist/adapters/hermes.d.ts +35 -0
- package/dist/adapters/hermes.js +9 -0
- package/dist/adapters/index.d.ts +6 -0
- package/dist/adapters/index.js +26 -0
- package/dist/adapters/registry.d.ts +20 -0
- package/dist/adapters/registry.js +13 -0
- package/dist/adapters/replit.d.ts +28 -0
- package/dist/adapters/replit.js +9 -0
- package/dist/adapters/types.d.ts +43 -0
- package/dist/adapters/types.js +8 -0
- package/dist/bootstrap.d.ts +20 -5
- package/dist/boxes.d.ts +7 -0
- package/dist/boxes.js +1 -1
- package/dist/briefing.d.ts +5 -3
- package/dist/briefing.js +9 -6
- package/dist/buffer-surprise-report.js +1 -1
- package/dist/buffer.d.ts +18 -4
- package/dist/buffer.js +1 -1
- package/dist/calibration.js +4 -4
- package/dist/capsule-cli.d.ts +4 -4
- package/dist/capsule-cli.js +1 -1
- package/dist/capsule-crypto-5CYAGVC5.js +18 -0
- package/dist/capsule-merge-4MGKE7C5.js +189 -0
- package/dist/causal-behavior.d.ts +8 -28
- package/dist/causal-behavior.js +6 -3
- package/dist/causal-behavior.js.map +1 -1
- package/dist/causal-chain.js +3 -2
- package/dist/causal-consolidation.d.ts +1 -1
- package/dist/causal-consolidation.js +24 -13
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-retrieval.js +3 -3
- package/dist/causal-trajectory.js +1 -1
- package/dist/chunk-25MQ7IHJ.js +427 -0
- package/dist/chunk-25MQ7IHJ.js.map +1 -0
- package/dist/chunk-2F2W355T.js +256 -0
- package/dist/chunk-2F2W355T.js.map +1 -0
- package/dist/chunk-2KI4QFHU.js +228 -0
- package/dist/chunk-2KI4QFHU.js.map +1 -0
- package/dist/chunk-2PRQG7PV.js +86 -0
- package/dist/chunk-2PRQG7PV.js.map +1 -0
- package/dist/chunk-2QR3XXIC.js +2272 -0
- package/dist/chunk-2QR3XXIC.js.map +1 -0
- package/dist/chunk-2WWLHTZY.js +121 -0
- package/dist/chunk-326G7DJK.js +2185 -0
- package/dist/chunk-326G7DJK.js.map +1 -0
- package/dist/chunk-34DQE4KF.js +174 -0
- package/dist/chunk-34DQE4KF.js.map +1 -0
- package/dist/chunk-3APJ5EVB.js +601 -0
- package/dist/chunk-3APJ5EVB.js.map +1 -0
- package/dist/chunk-3HPAPHUK.js +51 -0
- package/dist/chunk-3HPAPHUK.js.map +1 -0
- package/dist/chunk-3JXBXXM2.js +69 -0
- package/dist/chunk-3JXBXXM2.js.map +1 -0
- package/dist/chunk-3KW65B36.js +681 -0
- package/dist/chunk-3KW65B36.js.map +1 -0
- package/dist/chunk-3UXOZBHV.js +20 -0
- package/dist/chunk-3UXOZBHV.js.map +1 -0
- package/dist/chunk-3VAL7ZL2.js +266 -0
- package/dist/chunk-3VAL7ZL2.js.map +1 -0
- package/dist/chunk-3Y4P7RXM.js +31 -0
- package/dist/chunk-3Y4P7RXM.js.map +1 -0
- package/dist/chunk-47VWKCAF.js +273 -0
- package/dist/chunk-47VWKCAF.js.map +1 -0
- package/dist/chunk-4CRG46BG.js +271 -0
- package/dist/chunk-5375UYTQ.js +914 -0
- package/dist/chunk-5375UYTQ.js.map +1 -0
- package/dist/chunk-56K5QLHX.js +506 -0
- package/dist/chunk-56K5QLHX.js.map +1 -0
- package/dist/chunk-5RGLBDQF.js +596 -0
- package/dist/chunk-5RGLBDQF.js.map +1 -0
- package/dist/chunk-5UZXUTVO.js +9 -0
- package/dist/chunk-5UZXUTVO.js.map +1 -0
- package/dist/chunk-65PG43EQ.js +105 -0
- package/dist/chunk-65PG43EQ.js.map +1 -0
- package/dist/chunk-66DHUKLO.js +57 -0
- package/dist/chunk-66DHUKLO.js.map +1 -0
- package/dist/chunk-6FC5EGNV.js +46 -0
- package/dist/chunk-6FC5EGNV.js.map +1 -0
- package/dist/chunk-6H2TESSP.js +62 -0
- package/dist/chunk-6H2TESSP.js.map +1 -0
- package/dist/chunk-6LVVDPJ4.js +32 -0
- package/dist/chunk-6LVVDPJ4.js.map +1 -0
- package/dist/chunk-6RVI47ZR.js +159 -0
- package/dist/chunk-6RVI47ZR.js.map +1 -0
- package/dist/chunk-7AAT6G4Q.js +5117 -0
- package/dist/chunk-7AAT6G4Q.js.map +1 -0
- package/dist/chunk-7DTASS5T.js +29 -0
- package/dist/chunk-7DTASS5T.js.map +1 -0
- package/dist/chunk-7IASACLB.js +596 -0
- package/dist/chunk-7MNMYOFP.js +32 -0
- package/dist/chunk-7MNMYOFP.js.map +1 -0
- package/dist/chunk-7N4KAIGN.js +133 -0
- package/dist/chunk-7N4KAIGN.js.map +1 -0
- package/dist/chunk-7OZ53EXP.js +101 -0
- package/dist/chunk-7OZ53EXP.js.map +1 -0
- package/dist/chunk-7XYTQGCC.js +134 -0
- package/dist/chunk-7XYTQGCC.js.map +1 -0
- package/dist/chunk-A2XUIMJ3.js +341 -0
- package/dist/chunk-A2XUIMJ3.js.map +1 -0
- package/dist/chunk-AGZQD76C.js +201 -0
- package/dist/chunk-AGZQD76C.js.map +1 -0
- package/dist/chunk-APO3DCMU.js +361 -0
- package/dist/chunk-APO3DCMU.js.map +1 -0
- package/dist/chunk-BFBF3XEF.js +283 -0
- package/dist/chunk-BFBF3XEF.js.map +1 -0
- package/dist/chunk-BJ3KMYTB.js +1974 -0
- package/dist/chunk-BJ3KMYTB.js.map +1 -0
- package/dist/chunk-CHEL3SKB.js +6758 -0
- package/dist/chunk-CHEL3SKB.js.map +1 -0
- package/dist/chunk-CQZRLNMV.js +1491 -0
- package/dist/chunk-CQZRLNMV.js.map +1 -0
- package/dist/chunk-D46YSIYX.js +892 -0
- package/dist/chunk-D46YSIYX.js.map +1 -0
- package/dist/chunk-DINWEURR.js +648 -0
- package/dist/chunk-DINWEURR.js.map +1 -0
- package/dist/chunk-DK5LDEQM.js +530 -0
- package/dist/chunk-DK5LDEQM.js.map +1 -0
- package/dist/chunk-DOM4GKSW.js +34 -0
- package/dist/chunk-DOM4GKSW.js.map +1 -0
- package/dist/chunk-EDTHC6UD.js +1075 -0
- package/dist/chunk-EFJ3MQ4V.js +721 -0
- package/dist/chunk-EHRTFRWW.js +89 -0
- package/dist/chunk-EHRTFRWW.js.map +1 -0
- package/dist/chunk-FAJ7FZYM.js +11 -0
- package/dist/chunk-FAJ7FZYM.js.map +1 -0
- package/dist/chunk-FBYESMQ2.js +570 -0
- package/dist/chunk-FDU6HUUL.js +147 -0
- package/dist/chunk-FF4KLI5W.js +99 -0
- package/dist/chunk-FF4KLI5W.js.map +1 -0
- package/dist/chunk-FIT6DMX6.js +310 -0
- package/dist/chunk-FIT6DMX6.js.map +1 -0
- package/dist/chunk-FJ43PRLT.js +272 -0
- package/dist/chunk-FJ43PRLT.js.map +1 -0
- package/dist/chunk-FKFMOY3N.js +32 -0
- package/dist/chunk-FKFMOY3N.js.map +1 -0
- package/dist/chunk-FLTNHQK6.js +262 -0
- package/dist/chunk-FLTNHQK6.js.map +1 -0
- package/dist/chunk-GA454ALV.js +12436 -0
- package/dist/chunk-GA454ALV.js.map +1 -0
- package/dist/chunk-GGKRUQOO.js +228 -0
- package/dist/chunk-GIF42EW3.js +63 -0
- package/dist/chunk-GIF42EW3.js.map +1 -0
- package/dist/chunk-GL6I6MEQ.js +647 -0
- package/dist/chunk-H3ME6L6D.js +709 -0
- package/dist/chunk-H3ME6L6D.js.map +1 -0
- package/dist/chunk-HHLLAQGZ.js +1 -0
- package/dist/chunk-HXXBL2KD.js +2040 -0
- package/dist/chunk-I5V2VDIW.js +219 -0
- package/dist/chunk-I5V2VDIW.js.map +1 -0
- package/dist/chunk-I6K5FBRQ.js +35 -0
- package/dist/chunk-I6K5FBRQ.js.map +1 -0
- package/dist/chunk-ICRIXAP2.js +121 -0
- package/dist/chunk-ICRIXAP2.js.map +1 -0
- package/dist/chunk-J4EB7DNW.js +11 -0
- package/dist/chunk-J4EB7DNW.js.map +1 -0
- package/dist/chunk-JLFA7DQG.js +62 -0
- package/dist/chunk-JLFA7DQG.js.map +1 -0
- package/dist/chunk-KJTKLXTH.js +9 -0
- package/dist/chunk-KJTKLXTH.js.map +1 -0
- package/dist/chunk-KLAO5DGL.js +917 -0
- package/dist/chunk-KLAO5DGL.js.map +1 -0
- package/dist/chunk-KNKUID7G.js +183 -0
- package/dist/chunk-KOSORCJG.js +624 -0
- package/dist/chunk-KOSORCJG.js.map +1 -0
- package/dist/chunk-KUJVMMZQ.js +1262 -0
- package/dist/chunk-KUJVMMZQ.js.map +1 -0
- package/dist/chunk-LCR46JY5.js +123 -0
- package/dist/chunk-LCR46JY5.js.map +1 -0
- package/dist/chunk-LLQ2LLWF.js +148 -0
- package/dist/chunk-LLQ2LLWF.js.map +1 -0
- package/dist/chunk-LPMVBPA3.js +236 -0
- package/dist/chunk-LT3NLYSI.js +50 -0
- package/dist/chunk-LT3NLYSI.js.map +1 -0
- package/dist/chunk-LUDTDZLK.js +287 -0
- package/dist/chunk-LUDTDZLK.js.map +1 -0
- package/dist/chunk-M23FSH32.js +3963 -0
- package/dist/chunk-M23FSH32.js.map +1 -0
- package/dist/chunk-MC26UJIM.js +118 -0
- package/dist/chunk-ME6ESPZU.js +119 -0
- package/dist/chunk-ME6ESPZU.js.map +1 -0
- package/dist/chunk-MGKYQQYF.js +272 -0
- package/dist/chunk-MJFNCJXV.js +66 -0
- package/dist/chunk-MJFNCJXV.js.map +1 -0
- package/dist/chunk-MSWG7JI6.js +237 -0
- package/dist/chunk-MSWG7JI6.js.map +1 -0
- package/dist/chunk-MT25YHYH.js +141 -0
- package/dist/chunk-MT25YHYH.js.map +1 -0
- package/dist/chunk-MT4HVDUZ.js +53 -0
- package/dist/chunk-MY6TPVXW.js +219 -0
- package/dist/chunk-N2D6GXBM.js +267 -0
- package/dist/chunk-N2D6GXBM.js.map +1 -0
- package/dist/chunk-NJ3MJQZX.js +46 -0
- package/dist/chunk-NJ3MJQZX.js.map +1 -0
- package/dist/chunk-NMZY542O.js +335 -0
- package/dist/chunk-NMZY542O.js.map +1 -0
- package/dist/chunk-NNVTUXEB.js +23 -0
- package/dist/chunk-NZL6GGQE.js +375 -0
- package/dist/chunk-NZL6GGQE.js.map +1 -0
- package/dist/chunk-P4NEIHUT.js +108 -0
- package/dist/chunk-P7FMDTKL.js +103 -0
- package/dist/chunk-P7FMDTKL.js.map +1 -0
- package/dist/chunk-PHK3HARR.js +32 -0
- package/dist/chunk-PHK3HARR.js.map +1 -0
- package/dist/chunk-PIRJPV5T.js +98 -0
- package/dist/chunk-PIRJPV5T.js.map +1 -0
- package/dist/chunk-PK7H5L6Y.js +159 -0
- package/dist/chunk-PK7H5L6Y.js.map +1 -0
- package/dist/chunk-PR5FBTFU.js +233 -0
- package/dist/chunk-PR5FBTFU.js.map +1 -0
- package/dist/chunk-PU63GXWS.js +174 -0
- package/dist/chunk-PU63GXWS.js.map +1 -0
- package/dist/chunk-PZIAX57I.js +124 -0
- package/dist/chunk-PZIAX57I.js.map +1 -0
- package/dist/chunk-Q7P4WJDP.js +26 -0
- package/dist/chunk-Q7P4WJDP.js.map +1 -0
- package/dist/chunk-QQUAB63I.js +63 -0
- package/dist/chunk-QQUAB63I.js.map +1 -0
- package/dist/chunk-QRNI5JBH.js +18 -0
- package/dist/chunk-RHY3HH7P.js +601 -0
- package/dist/chunk-RHY3HH7P.js.map +1 -0
- package/dist/chunk-RRF5UOBJ.js +91 -0
- package/dist/chunk-RXDLTSWT.js +124 -0
- package/dist/chunk-RXDLTSWT.js.map +1 -0
- package/dist/chunk-RYED3SPJ.js +42 -0
- package/dist/chunk-RYED3SPJ.js.map +1 -0
- package/dist/chunk-S7KDBTWT.js +106 -0
- package/dist/chunk-S7KDBTWT.js.map +1 -0
- package/dist/chunk-SEDEKFYQ.js +1 -0
- package/dist/chunk-TECVW3JP.js +36 -0
- package/dist/chunk-TECVW3JP.js.map +1 -0
- package/dist/chunk-TFO23QT4.js +88 -0
- package/dist/chunk-TFO23QT4.js.map +1 -0
- package/dist/chunk-TK4UEOSK.js +76 -0
- package/dist/chunk-TK4UEOSK.js.map +1 -0
- package/dist/chunk-TKWGAOLV.js +122 -0
- package/dist/chunk-TKWGAOLV.js.map +1 -0
- package/dist/chunk-TMM4S4IJ.js +597 -0
- package/dist/chunk-TMM4S4IJ.js.map +1 -0
- package/dist/chunk-TMQLARTH.js +188 -0
- package/dist/chunk-TMQLARTH.js.map +1 -0
- package/dist/chunk-TPDBFYEG.js +130 -0
- package/dist/chunk-TPDBFYEG.js.map +1 -0
- package/dist/chunk-TPMQ3G6Z.js +145 -0
- package/dist/chunk-TPMQ3G6Z.js.map +1 -0
- package/dist/chunk-TZOLIGIG.js +61 -0
- package/dist/chunk-TZOLIGIG.js.map +1 -0
- package/dist/chunk-U3PN77QT.js +113 -0
- package/dist/chunk-U3WSW6PZ.js +277 -0
- package/dist/chunk-U4SCL7B7.js +640 -0
- package/dist/chunk-U4SCL7B7.js.map +1 -0
- package/dist/chunk-UWK5OXUJ.js +156 -0
- package/dist/chunk-UWK5OXUJ.js.map +1 -0
- package/dist/chunk-UWVJF25J.js +74 -0
- package/dist/chunk-UXHQAFNA.js +1317 -0
- package/dist/chunk-UXHQAFNA.js.map +1 -0
- package/dist/chunk-V5OCT34X.js +1 -0
- package/dist/chunk-VLXA6PI2.js +304 -0
- package/dist/chunk-VLXA6PI2.js.map +1 -0
- package/dist/chunk-VNO6ZJ35.js +500 -0
- package/dist/chunk-VNO6ZJ35.js.map +1 -0
- package/dist/chunk-VW676BEI.js +827 -0
- package/dist/chunk-VW676BEI.js.map +1 -0
- package/dist/chunk-W3LR522O.js +2296 -0
- package/dist/chunk-W4L6CZKA.js +96 -0
- package/dist/chunk-W4L6CZKA.js.map +1 -0
- package/dist/chunk-W4RVMTHR.js +372 -0
- package/dist/chunk-W4RVMTHR.js.map +1 -0
- package/dist/chunk-WEHSQBFR.js +188 -0
- package/dist/chunk-WEHSQBFR.js.map +1 -0
- package/dist/chunk-WELDCG6C.js +380 -0
- package/dist/chunk-WELDCG6C.js.map +1 -0
- package/dist/chunk-WZYKANL3.js +2800 -0
- package/dist/chunk-WZYKANL3.js.map +1 -0
- package/dist/chunk-XIG5PDM7.js +48 -0
- package/dist/chunk-XJNBEDFE.js +193 -0
- package/dist/chunk-XJNBEDFE.js.map +1 -0
- package/dist/chunk-XVVIG67A.js +291 -0
- package/dist/chunk-XVVIG67A.js.map +1 -0
- package/dist/chunk-XVZ7B3HG.js +135 -0
- package/dist/chunk-YBPYIAA5.js +73 -0
- package/dist/chunk-YBPYIAA5.js.map +1 -0
- package/dist/chunk-Z734BLO3.js +21 -0
- package/dist/chunk-Z734BLO3.js.map +1 -0
- package/dist/chunk-ZKSK55RC.js +269 -0
- package/dist/chunk-ZKSK55RC.js.map +1 -0
- package/dist/chunk-ZTFCYYEZ.js +69 -0
- package/dist/chunk-ZTFCYYEZ.js.map +1 -0
- package/dist/chunk-ZY2MNJR6.js +329 -0
- package/dist/chunk-ZY2MNJR6.js.map +1 -0
- package/dist/cli-D3VpkVwB.d.ts +1136 -0
- package/dist/cli.d.ts +39 -10
- package/dist/cli.js +108 -49
- package/dist/commitment-ledger.js +1 -1
- package/dist/compat/checks.d.ts +5 -0
- package/dist/compat/checks.js +11 -0
- package/dist/compat/checks.js.map +1 -0
- package/dist/compat/types.d.ts +30 -0
- package/dist/compat/types.js +1 -0
- package/dist/compat/types.js.map +1 -0
- package/dist/compounding/engine.d.ts +221 -0
- package/dist/compounding/engine.js +32 -0
- package/dist/compounding/engine.js.map +1 -0
- package/dist/compounding/preference-consolidator.d.ts +92 -0
- package/dist/compounding/preference-consolidator.js +553 -0
- package/dist/compounding/preference-consolidator.js.map +1 -0
- package/dist/config.d.ts +4 -2
- package/dist/config.js +9 -4
- package/dist/conflict-policy-DyJ2wd-h.d.ts +4 -0
- package/dist/connectors/codex-materialize-runner.d.ts +64 -0
- package/dist/connectors/codex-materialize-runner.js +33 -0
- package/dist/connectors/codex-materialize-runner.js.map +1 -0
- package/dist/connectors/codex-materialize.d.ts +195 -0
- package/dist/connectors/codex-materialize.js +38 -0
- package/dist/connectors/codex-materialize.js.map +1 -0
- package/dist/connectors/index.d.ts +444 -0
- package/dist/connectors/index.js +115 -0
- package/dist/connectors/index.js.map +1 -0
- package/dist/connectors-cli-CwbyjGR7.d.ts +257 -0
- package/dist/connectors-cli.d.ts +1 -1
- package/dist/consolidation-provenance-check.d.ts +3 -1
- package/dist/consolidation-undo.d.ts +3 -1
- package/dist/contradiction/index.d.ts +258 -0
- package/dist/contradiction/index.js +43 -0
- package/dist/contradiction/index.js.map +1 -0
- package/dist/contradiction-review-ATP4S6IC.js +30 -0
- package/dist/contradiction-review-ATP4S6IC.js.map +1 -0
- package/dist/contradiction-scan-5A4IDZV5.js +13 -0
- package/dist/contradiction-scan-5A4IDZV5.js.map +1 -0
- package/dist/conversation-index/backend.d.ts +97 -0
- package/dist/conversation-index/backend.js +13 -0
- package/dist/conversation-index/backend.js.map +1 -0
- package/dist/conversation-index/chunker.d.ts +16 -0
- package/dist/conversation-index/chunker.js +8 -0
- package/dist/conversation-index/chunker.js.map +1 -0
- package/dist/conversation-index/cleanup.d.ts +11 -0
- package/dist/conversation-index/cleanup.js +9 -0
- package/dist/conversation-index/cleanup.js.map +1 -0
- package/dist/conversation-index/faiss-adapter.d.ts +6 -0
- package/dist/conversation-index/faiss-adapter.js +16 -0
- package/dist/conversation-index/faiss-adapter.js.map +1 -0
- package/dist/conversation-index/indexer.d.ts +23 -0
- package/dist/conversation-index/indexer.js +15 -0
- package/dist/conversation-index/indexer.js.map +1 -0
- package/dist/conversation-index/search.d.ts +6 -0
- package/dist/conversation-index/search.js +11 -0
- package/dist/conversation-index/search.js.map +1 -0
- package/dist/embedding-fallback.js +2 -2
- package/dist/enrichment/index.d.ts +163 -0
- package/dist/enrichment/index.js +18 -0
- package/dist/enrichment/index.js.map +1 -0
- package/dist/entity-retrieval.d.ts +4 -2
- package/dist/entity-retrieval.js +8 -5
- package/dist/evals.js +1 -1
- package/dist/explicit-capture.d.ts +20 -5
- package/dist/explicit-capture.js +2 -2
- package/dist/extraction-judge-training.js +1 -1
- package/dist/extraction.js +8 -8
- package/dist/faiss-adapter-CzPghc4C.d.ts +70 -0
- package/dist/fallback-llm.d.ts +2 -0
- package/dist/fallback-llm.js +4 -4
- package/dist/graph-edge-decay-5DI5GUNL.js +207 -0
- package/dist/index.d.ts +66 -711
- package/dist/index.js +556 -2680
- package/dist/index.js.map +1 -1
- package/dist/lcm/archive.d.ts +89 -0
- package/dist/lcm/archive.js +12 -0
- package/dist/lcm/archive.js.map +1 -0
- package/dist/lcm/dag.d.ts +48 -0
- package/dist/lcm/dag.js +8 -0
- package/dist/lcm/dag.js.map +1 -0
- package/dist/lcm/engine.d.ts +116 -0
- package/dist/lcm/engine.js +20 -0
- package/dist/lcm/engine.js.map +1 -0
- package/dist/lcm/index.d.ts +12 -0
- package/dist/lcm/index.js +44 -0
- package/dist/lcm/index.js.map +1 -0
- package/dist/lcm/queue.d.ts +62 -0
- package/dist/lcm/queue.js +8 -0
- package/dist/lcm/queue.js.map +1 -0
- package/dist/lcm/recall.d.ts +20 -0
- package/dist/lcm/recall.js +8 -0
- package/dist/lcm/recall.js.map +1 -0
- package/dist/lcm/schema.d.ts +16 -0
- package/dist/lcm/schema.js +14 -0
- package/dist/lcm/schema.js.map +1 -0
- package/dist/lcm/summarizer.d.ts +38 -0
- package/dist/lcm/summarizer.js +12 -0
- package/dist/lcm/summarizer.js.map +1 -0
- package/dist/lcm/tools.d.ts +29 -0
- package/dist/lcm/tools.js +8 -0
- package/dist/lcm/tools.js.map +1 -0
- package/dist/live-connectors-runner.js +5 -5
- package/dist/local-llm.js +3 -3
- package/dist/maintenance/archive-observations.d.ts +18 -0
- package/dist/maintenance/archive-observations.js +8 -0
- package/dist/maintenance/archive-observations.js.map +1 -0
- package/dist/maintenance/backup-stamp.d.ts +3 -0
- package/dist/maintenance/backup-stamp.js +8 -0
- package/dist/maintenance/backup-stamp.js.map +1 -0
- package/dist/maintenance/memory-governance-cron.d.ts +85 -0
- package/dist/maintenance/memory-governance-cron.js +22 -0
- package/dist/maintenance/memory-governance-cron.js.map +1 -0
- package/dist/maintenance/memory-governance.d.ts +137 -0
- package/dist/maintenance/memory-governance.js +40 -0
- package/dist/maintenance/memory-governance.js.map +1 -0
- package/dist/maintenance/migrate-observations.d.ts +18 -0
- package/dist/maintenance/migrate-observations.js +9 -0
- package/dist/maintenance/migrate-observations.js.map +1 -0
- package/dist/maintenance/observation-ledger-utils.d.ts +10 -0
- package/dist/maintenance/observation-ledger-utils.js +10 -0
- package/dist/maintenance/observation-ledger-utils.js.map +1 -0
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +15 -0
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +28 -0
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js.map +1 -0
- package/dist/maintenance/rebuild-memory-projection.d.ts +77 -0
- package/dist/maintenance/rebuild-memory-projection.js +35 -0
- package/dist/maintenance/rebuild-memory-projection.js.map +1 -0
- package/dist/maintenance/rebuild-observations.d.ts +17 -0
- package/dist/maintenance/rebuild-observations.js +9 -0
- package/dist/maintenance/rebuild-observations.js.map +1 -0
- package/dist/mcp-memory-inspector-app.d.ts +24 -6
- package/dist/memory-projection-store.d.ts +108 -3
- package/dist/memory-projection-store.js +2 -1
- package/dist/memory-worth-outcomes.d.ts +4 -2
- package/dist/migrate/from-engram.d.ts +24 -0
- package/dist/migrate/from-engram.js +12 -0
- package/dist/migrate/from-engram.js.map +1 -0
- package/dist/namespaces/migrate.d.ts +50 -0
- package/dist/namespaces/migrate.js +50 -0
- package/dist/namespaces/migrate.js.map +1 -0
- package/dist/namespaces/principal.d.ts +17 -0
- package/dist/namespaces/principal.js +16 -0
- package/dist/namespaces/principal.js.map +1 -0
- package/dist/namespaces/search.d.ts +46 -0
- package/dist/namespaces/search.js +28 -0
- package/dist/namespaces/search.js.map +1 -0
- package/dist/namespaces/storage.d.ts +32 -0
- package/dist/namespaces/storage.js +28 -0
- package/dist/namespaces/storage.js.map +1 -0
- package/dist/network/tailscale.d.ts +41 -0
- package/dist/network/tailscale.js +9 -0
- package/dist/network/tailscale.js.map +1 -0
- package/dist/network/webdav.d.ts +39 -0
- package/dist/network/webdav.js +10 -0
- package/dist/network/webdav.js.map +1 -0
- package/dist/objective-state-writers.js +2 -2
- package/dist/operator-toolkit.d.ts +4 -2
- package/dist/operator-toolkit.js +32 -14
- package/dist/opik-exporter.js +2 -2
- package/dist/opik-exporter.js.map +1 -1
- package/dist/orchestrator-DuWl9Hwx.d.ts +1244 -0
- package/dist/orchestrator.d.ts +22 -7
- package/dist/orchestrator.js +79 -44
- package/dist/path-MR5JPYOP.js +9 -0
- package/dist/path-MR5JPYOP.js.map +1 -0
- package/dist/qmd-recall-cache.d.ts +1 -1
- package/dist/qmd.d.ts +102 -3
- package/dist/qmd.js +23 -5
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.js +2 -2
- package/dist/replay/normalizers/chatgpt.d.ts +6 -0
- package/dist/replay/normalizers/chatgpt.js +11 -0
- package/dist/replay/normalizers/chatgpt.js.map +1 -0
- package/dist/replay/normalizers/claude.d.ts +6 -0
- package/dist/replay/normalizers/claude.js +11 -0
- package/dist/replay/normalizers/claude.js.map +1 -0
- package/dist/replay/normalizers/openclaw.d.ts +6 -0
- package/dist/replay/normalizers/openclaw.js +11 -0
- package/dist/replay/normalizers/openclaw.js.map +1 -0
- package/dist/replay/normalizers/shared.d.ts +16 -0
- package/dist/replay/normalizers/shared.js +14 -0
- package/dist/replay/normalizers/shared.js.map +1 -0
- package/dist/replay/runner.d.ts +35 -0
- package/dist/replay/runner.js +16 -0
- package/dist/replay/runner.js.map +1 -0
- package/dist/replay/types.d.ts +57 -0
- package/dist/replay/types.js +19 -0
- package/dist/replay/types.js.map +1 -0
- package/dist/resolution-B7FNQSSP.js +12 -0
- package/dist/resolution-B7FNQSSP.js.map +1 -0
- package/dist/resolve-provider-secret.js +2 -2
- package/dist/resume-bundles.js +8 -6
- package/dist/retrieval-agents.d.ts +1 -1
- package/dist/routing/engine.d.ts +35 -0
- package/dist/routing/engine.js +16 -0
- package/dist/routing/engine.js.map +1 -0
- package/dist/routing/store.d.ts +27 -0
- package/dist/routing/store.js +10 -0
- package/dist/routing/store.js.map +1 -0
- package/dist/runtime/better-sqlite.d.ts +8 -0
- package/dist/runtime/better-sqlite.js +10 -0
- package/dist/runtime/better-sqlite.js.map +1 -0
- package/dist/runtime/child-process.d.ts +32 -0
- package/dist/runtime/child-process.js +10 -0
- package/dist/runtime/child-process.js.map +1 -0
- package/dist/runtime/env.d.ts +5 -0
- package/dist/runtime/env.js +12 -0
- package/dist/runtime/env.js.map +1 -0
- package/dist/schemas.d.ts +22 -22
- package/dist/sdk-compat.js +1 -1
- package/dist/search/document-scanner.d.ts +22 -0
- package/dist/search/document-scanner.js +8 -0
- package/dist/search/document-scanner.js.map +1 -0
- package/dist/search/embed-helper.d.ts +35 -0
- package/dist/search/embed-helper.js +9 -0
- package/dist/search/embed-helper.js.map +1 -0
- package/dist/search/factory.d.ts +32 -0
- package/dist/search/factory.js +29 -0
- package/dist/search/factory.js.map +1 -0
- package/dist/search/index.d.ts +15 -0
- package/dist/search/index.js +50 -0
- package/dist/search/index.js.map +1 -0
- package/dist/search/lancedb-backend.d.ts +51 -0
- package/dist/search/lancedb-backend.js +10 -0
- package/dist/search/lancedb-backend.js.map +1 -0
- package/dist/search/meilisearch-backend.d.ts +48 -0
- package/dist/search/meilisearch-backend.js +10 -0
- package/dist/search/meilisearch-backend.js.map +1 -0
- package/dist/search/noop-backend.d.ts +26 -0
- package/dist/search/noop-backend.js +8 -0
- package/dist/search/noop-backend.js.map +1 -0
- package/dist/search/orama-backend.d.ts +53 -0
- package/dist/search/orama-backend.js +10 -0
- package/dist/search/orama-backend.js.map +1 -0
- package/dist/search/port.d.ts +61 -0
- package/dist/search/port.js +1 -0
- package/dist/search/port.js.map +1 -0
- package/dist/search/remote-backend.d.ts +39 -0
- package/dist/search/remote-backend.js +9 -0
- package/dist/search/remote-backend.js.map +1 -0
- package/dist/secure-store/index.d.ts +890 -0
- package/dist/secure-store/index.js +156 -0
- package/dist/secure-store/index.js.map +1 -0
- package/dist/semantic-VwGI14Ok.d.ts +69 -0
- package/dist/semantic-consolidation-4HkHWgeI.d.ts +180 -0
- package/dist/semantic-consolidation.d.ts +2 -2
- package/dist/semantic-consolidation.js +13 -6
- package/dist/semantic-rule-promotion.js +8 -5
- package/dist/semantic-rule-verifier.js +8 -5
- package/dist/shared-context/manager.d.ts +131 -0
- package/dist/shared-context/manager.js +15 -0
- package/dist/shared-context/manager.js.map +1 -0
- package/dist/skills-registry.js +13 -1
- package/dist/skills-registry.js.map +1 -1
- package/dist/state-store-VZU2IA53.js +16 -0
- package/dist/state-store-VZU2IA53.js.map +1 -0
- package/dist/storage-paths.d.ts +9 -0
- package/dist/storage-paths.js +20 -0
- package/dist/storage-paths.js.map +1 -0
- package/dist/storage.d.ts +3 -1
- package/dist/storage.js +7 -4
- package/dist/summarizer.d.ts +5 -0
- package/dist/summarizer.js +9 -8
- package/dist/summary-snapshot.js +2 -1
- package/dist/surfaces/dreams.d.ts +16 -0
- package/dist/surfaces/dreams.js +282 -0
- package/dist/surfaces/dreams.js.map +1 -0
- package/dist/surfaces/heartbeat.d.ts +17 -0
- package/dist/surfaces/heartbeat.js +265 -0
- package/dist/surfaces/heartbeat.js.map +1 -0
- package/dist/temporal-supersession.d.ts +3 -1
- package/dist/threading.d.ts +5 -0
- package/dist/threading.js +2 -1
- package/dist/tier-migration.d.ts +4 -2
- package/dist/tokens.js +2 -2
- package/dist/transcript.d.ts +15 -1
- package/dist/transcript.js +2 -1
- package/dist/transfer/autodetect.d.ts +4 -0
- package/dist/transfer/autodetect.js +15 -0
- package/dist/transfer/autodetect.js.map +1 -0
- package/dist/transfer/backup.d.ts +21 -0
- package/dist/transfer/backup.js +17 -0
- package/dist/transfer/backup.js.map +1 -0
- package/dist/transfer/capsule-export.d.ts +113 -0
- package/dist/transfer/capsule-export.js +19 -0
- package/dist/transfer/capsule-export.js.map +1 -0
- package/dist/transfer/capsule-import.d.ts +124 -0
- package/dist/transfer/capsule-import.js +16 -0
- package/dist/transfer/capsule-import.js.map +1 -0
- package/dist/transfer/constants.d.ts +13 -0
- package/dist/transfer/constants.js +12 -0
- package/dist/transfer/constants.js.map +1 -0
- package/dist/transfer/export-json.d.ts +11 -0
- package/dist/transfer/export-json.js +11 -0
- package/dist/transfer/export-json.js.map +1 -0
- package/dist/transfer/export-md.d.ts +10 -0
- package/dist/transfer/export-md.js +13 -0
- package/dist/transfer/export-md.js.map +1 -0
- package/dist/transfer/export-sqlite.d.ts +9 -0
- package/dist/transfer/export-sqlite.js +12 -0
- package/dist/transfer/export-sqlite.js.map +1 -0
- package/dist/transfer/fs-utils.d.ts +61 -0
- package/dist/transfer/fs-utils.js +40 -0
- package/dist/transfer/fs-utils.js.map +1 -0
- package/dist/transfer/import-json.d.ts +16 -0
- package/dist/transfer/import-json.js +13 -0
- package/dist/transfer/import-json.js.map +1 -0
- package/dist/transfer/import-md.d.ts +14 -0
- package/dist/transfer/import-md.js +11 -0
- package/dist/transfer/import-md.js.map +1 -0
- package/dist/transfer/import-sqlite.d.ts +14 -0
- package/dist/transfer/import-sqlite.js +12 -0
- package/dist/transfer/import-sqlite.js.map +1 -0
- package/dist/transfer/sqlite-schema.d.ts +4 -0
- package/dist/transfer/sqlite-schema.js +10 -0
- package/dist/transfer/sqlite-schema.js.map +1 -0
- package/dist/transfer/types.d.ts +916 -0
- package/dist/transfer/types.js +30 -0
- package/dist/transfer/types.js.map +1 -0
- package/dist/types.d.ts +28 -1
- package/dist/types.js +1 -1
- package/dist/verified-recall.js +9 -6
- package/dist/work/board.d.ts +43 -0
- package/dist/work/board.js +14 -0
- package/dist/work/board.js.map +1 -0
- package/dist/work/boundary.d.ts +8 -0
- package/dist/work/boundary.js +14 -0
- package/dist/work/boundary.js.map +1 -0
- package/dist/work/storage.d.ts +39 -0
- package/dist/work/storage.js +11 -0
- package/dist/work/storage.js.map +1 -0
- package/dist/work/types.d.ts +75 -0
- package/dist/work/types.js +1 -0
- package/dist/work/types.js.map +1 -0
- package/package.json +2767 -6
- package/scripts/faiss_index.py +816 -0
- package/scripts/faiss_requirements.txt +3 -0
- package/skills/remnic-entities/SKILL.md +51 -0
- package/skills/remnic-memory-workflow/SKILL.md +61 -0
- package/skills/remnic-recall/SKILL.md +51 -0
- package/skills/remnic-remember/SKILL.md +56 -0
- package/skills/remnic-search/SKILL.md +51 -0
- package/skills/remnic-status/SKILL.md +51 -0
- package/src/abort-error.test.ts +49 -0
- package/src/abort-error.ts +46 -0
- package/src/abstraction-nodes.ts +162 -0
- package/src/access-audit.test.ts +178 -0
- package/src/access-audit.ts +125 -0
- package/src/access-cli.test.ts +439 -0
- package/src/access-cli.ts +438 -0
- package/src/access-http.test.ts +225 -0
- package/src/access-http.ts +1899 -0
- package/src/access-idempotency.ts +232 -0
- package/src/access-mcp.test.ts +568 -0
- package/src/access-mcp.ts +3056 -0
- package/src/access-schema-pi.test.ts +60 -0
- package/src/access-schema.ts +522 -0
- package/src/access-service-namespace.test.ts +123 -0
- package/src/access-service.ts +5629 -0
- package/src/action-confidence.test.ts +206 -0
- package/src/action-confidence.ts +466 -0
- package/src/active-memory-bridge.test.ts +285 -0
- package/src/active-memory-bridge.ts +217 -0
- package/src/active-recall.test.ts +484 -0
- package/src/active-recall.ts +459 -0
- package/src/adapters/claude-code.ts +56 -0
- package/src/adapters/codex.ts +57 -0
- package/src/adapters/hermes.ts +64 -0
- package/src/adapters/index.ts +6 -0
- package/src/adapters/registry.ts +41 -0
- package/src/adapters/replit.ts +55 -0
- package/src/adapters/types.ts +51 -0
- package/src/behavior-learner.ts +144 -0
- package/src/behavior-signals.ts +73 -0
- package/src/binary-lifecycle/backend.ts +117 -0
- package/src/binary-lifecycle/index.ts +35 -0
- package/src/binary-lifecycle/manifest.ts +79 -0
- package/src/binary-lifecycle/pipeline.ts +352 -0
- package/src/binary-lifecycle/scanner.ts +89 -0
- package/src/binary-lifecycle/types.ts +89 -0
- package/src/bootstrap.ts +178 -0
- package/src/boxes.ts +521 -0
- package/src/briefing.test.ts +1535 -0
- package/src/briefing.ts +1382 -0
- package/src/buffer-session.test.ts +443 -0
- package/src/buffer-surprise-report.ts +176 -0
- package/src/buffer-surprise-telemetry.test.ts +606 -0
- package/src/buffer-surprise-trigger.test.ts +766 -0
- package/src/buffer-surprise.test.ts +339 -0
- package/src/buffer-surprise.ts +203 -0
- package/src/buffer.ts +900 -0
- package/src/bulk-import/cli-command.test.ts +204 -0
- package/src/bulk-import/index.ts +34 -0
- package/src/bulk-import/pipeline.test.ts +445 -0
- package/src/bulk-import/pipeline.ts +178 -0
- package/src/bulk-import/registry.test.ts +151 -0
- package/src/bulk-import/registry.ts +72 -0
- package/src/bulk-import/types.test.ts +272 -0
- package/src/bulk-import/types.ts +145 -0
- package/src/calibration.ts +394 -0
- package/src/capsule-cli.test.ts +398 -0
- package/src/capsule-cli.ts +565 -0
- package/src/causal-behavior.ts +308 -0
- package/src/causal-chain.ts +419 -0
- package/src/causal-consolidation.ts +370 -0
- package/src/causal-retrieval.ts +286 -0
- package/src/causal-trajectory-graph.ts +60 -0
- package/src/causal-trajectory.ts +303 -0
- package/src/chunking.ts +220 -0
- package/src/citations.ts +232 -0
- package/src/cli.ts +9403 -0
- package/src/codex-cli-fallback.ts +162 -0
- package/src/codex-thread-key.ts +1 -0
- package/src/coding/access-coding-context.test.ts +197 -0
- package/src/coding/coding-branch-scope.test.ts +281 -0
- package/src/coding/coding-namespace.test.ts +360 -0
- package/src/coding/coding-namespace.ts +412 -0
- package/src/coding/coding-orchestrator.test.ts +249 -0
- package/src/coding/git-context.test.ts +507 -0
- package/src/coding/git-context.ts +336 -0
- package/src/coding/mcp-set-coding-context.test.ts +174 -0
- package/src/coding/review-context.test.ts +316 -0
- package/src/coding/review-context.ts +349 -0
- package/src/coding/wire-coding-context.test.ts +468 -0
- package/src/commitment-ledger.test.ts +78 -0
- package/src/commitment-ledger.ts +337 -0
- package/src/compat/checks.test.ts +206 -0
- package/src/compat/checks.ts +716 -0
- package/src/compat/types.ts +33 -0
- package/src/compounding/engine.ts +1686 -0
- package/src/compounding/preference-consolidator.ts +778 -0
- package/src/compression-optimizer.ts +312 -0
- package/src/config.test.ts +930 -0
- package/src/config.ts +3807 -0
- package/src/connectors/codex/instructions.md +160 -0
- package/src/connectors/codex/resources/namespace-cheatsheet.md +48 -0
- package/src/connectors/codex-marketplace.ts +500 -0
- package/src/connectors/codex-materialize-runner.ts +212 -0
- package/src/connectors/codex-materialize.ts +983 -0
- package/src/connectors/coerce.ts +62 -0
- package/src/connectors/index.test.ts +1570 -0
- package/src/connectors/index.ts +3222 -0
- package/src/connectors/live/framework.ts +164 -0
- package/src/connectors/live/github.test.ts +1218 -0
- package/src/connectors/live/github.ts +1068 -0
- package/src/connectors/live/gmail.test.ts +1706 -0
- package/src/connectors/live/gmail.ts +1293 -0
- package/src/connectors/live/google-drive.test.ts +696 -0
- package/src/connectors/live/google-drive.ts +724 -0
- package/src/connectors/live/index.ts +101 -0
- package/src/connectors/live/live-connectors.test.ts +689 -0
- package/src/connectors/live/notion.test.ts +1109 -0
- package/src/connectors/live/notion.ts +978 -0
- package/src/connectors/live/registry.ts +103 -0
- package/src/connectors/live/state-store.ts +399 -0
- package/src/connectors/live/transient-errors.ts +150 -0
- package/src/connectors/weclone-installer.test.ts +850 -0
- package/src/connectors-cli.ts +513 -0
- package/src/console/state.test.ts +224 -0
- package/src/console/state.ts +514 -0
- package/src/console/trace.test.ts +813 -0
- package/src/console/trace.ts +603 -0
- package/src/console/tui.test.ts +582 -0
- package/src/console/tui.ts +508 -0
- package/src/consolidation-operator.ts +182 -0
- package/src/consolidation-provenance-check.ts +551 -0
- package/src/consolidation-undo.ts +718 -0
- package/src/contradiction/contradiction-judge.test.ts +189 -0
- package/src/contradiction/contradiction-judge.ts +333 -0
- package/src/contradiction/contradiction-review.ts +574 -0
- package/src/contradiction/contradiction-scan.ts +504 -0
- package/src/contradiction/contradiction.test.ts +2230 -0
- package/src/contradiction/index.ts +37 -0
- package/src/contradiction/resolution.ts +383 -0
- package/src/conversation-index/backend.ts +323 -0
- package/src/conversation-index/chunker.ts +47 -0
- package/src/conversation-index/cleanup.ts +53 -0
- package/src/conversation-index/faiss-adapter.ts +384 -0
- package/src/conversation-index/indexer.test.ts +164 -0
- package/src/conversation-index/indexer.ts +192 -0
- package/src/conversation-index/search.ts +37 -0
- package/src/cross-namespace-budget.test.ts +275 -0
- package/src/cross-namespace-budget.ts +365 -0
- package/src/cue-anchors.ts +163 -0
- package/src/curation/index.ts +544 -0
- package/src/dashboard-runtime.ts +337 -0
- package/src/day-summary.ts +122 -0
- package/src/dedup/index.ts +330 -0
- package/src/dedup/semantic.test.ts +1577 -0
- package/src/dedup/semantic.ts +148 -0
- package/src/delinearize.ts +193 -0
- package/src/direct-answer-wiring.test.ts +473 -0
- package/src/direct-answer-wiring.ts +180 -0
- package/src/direct-answer.test.ts +484 -0
- package/src/direct-answer.ts +273 -0
- package/src/embedding-fallback.ts +565 -0
- package/src/enrichment/audit.ts +89 -0
- package/src/enrichment/index.ts +27 -0
- package/src/enrichment/pipeline.ts +197 -0
- package/src/enrichment/provider-registry.ts +85 -0
- package/src/enrichment/types.ts +100 -0
- package/src/enrichment/web-search-provider.ts +63 -0
- package/src/entity-retrieval.ts +774 -0
- package/src/entity-schema.ts +239 -0
- package/src/evals.ts +1312 -0
- package/src/event-order-recall.test.ts +4164 -0
- package/src/event-order-recall.ts +2802 -0
- package/src/evidence-pack.test.ts +89 -0
- package/src/evidence-pack.ts +388 -0
- package/src/explicit-capture.ts +530 -0
- package/src/explicit-cue-recall.test.ts +3019 -0
- package/src/explicit-cue-recall.ts +5545 -0
- package/src/extraction-judge-telemetry.ts +234 -0
- package/src/extraction-judge-training.ts +221 -0
- package/src/extraction-judge.ts +846 -0
- package/src/extraction-timeout.test.ts +265 -0
- package/src/extraction.ts +2719 -0
- package/src/fallback-llm.test.ts +1060 -0
- package/src/fallback-llm.ts +918 -0
- package/src/focused-list-recall.test.ts +734 -0
- package/src/focused-list-recall.ts +1160 -0
- package/src/graph-dashboard-diff.ts +35 -0
- package/src/graph-dashboard-key.ts +5 -0
- package/src/graph-dashboard-parser.ts +104 -0
- package/src/graph-edge-reinforcement.ts +192 -0
- package/src/graph-events.ts +151 -0
- package/src/graph-recall.test.ts +164 -0
- package/src/graph-recall.ts +189 -0
- package/src/graph-retrieval.test.ts +809 -0
- package/src/graph-retrieval.ts +823 -0
- package/src/graph-snapshot.ts +329 -0
- package/src/graph.ts +813 -0
- package/src/harmonic-retrieval.ts +223 -0
- package/src/himem.ts +154 -0
- package/src/hygiene.ts +87 -0
- package/src/identity-continuity.ts +333 -0
- package/src/importance.ts +328 -0
- package/src/importers/base.test.ts +294 -0
- package/src/importers/base.ts +436 -0
- package/src/importers/index.ts +21 -0
- package/src/index.ts +1204 -0
- package/src/intent.ts +154 -0
- package/src/json-extract.ts +85 -0
- package/src/json-store.ts +42 -0
- package/src/lcm/archive.ts +617 -0
- package/src/lcm/dag.ts +199 -0
- package/src/lcm/engine.ts +645 -0
- package/src/lcm/index.ts +7 -0
- package/src/lcm/queue.test.ts +178 -0
- package/src/lcm/queue.ts +200 -0
- package/src/lcm/recall.ts +117 -0
- package/src/lcm/schema.ts +154 -0
- package/src/lcm/summarizer.ts +235 -0
- package/src/lcm/tools.ts +191 -0
- package/src/lcm-engine.test.ts +660 -0
- package/src/legacy-hook-compat.test.ts +20 -0
- package/src/legacy-hook-compat.ts +45 -0
- package/src/lifecycle.ts +289 -0
- package/src/live-connectors-runner.ts +385 -0
- package/src/local-llm-qos.test.ts +303 -0
- package/src/local-llm-thinking.test.ts +292 -0
- package/src/local-llm.ts +1464 -0
- package/src/logger.ts +49 -0
- package/src/maintenance/archive-observations.ts +147 -0
- package/src/maintenance/backup-stamp.ts +3 -0
- package/src/maintenance/dreams-ledger.ts +516 -0
- package/src/maintenance/first-start-migration.ts +362 -0
- package/src/maintenance/forget.test.ts +206 -0
- package/src/maintenance/forget.ts +126 -0
- package/src/maintenance/graph-edge-decay.test.ts +409 -0
- package/src/maintenance/graph-edge-decay.ts +394 -0
- package/src/maintenance/memory-governance-cron.ts +447 -0
- package/src/maintenance/memory-governance.ts +1039 -0
- package/src/maintenance/migrate-observations.ts +216 -0
- package/src/maintenance/observation-ledger-utils.ts +54 -0
- package/src/maintenance/pattern-reinforcement.test.ts +875 -0
- package/src/maintenance/pattern-reinforcement.ts +369 -0
- package/src/maintenance/purge.ts +334 -0
- package/src/maintenance/rebuild-memory-lifecycle-ledger.ts +78 -0
- package/src/maintenance/rebuild-memory-projection.ts +1234 -0
- package/src/maintenance/rebuild-observations.ts +178 -0
- package/src/maintenance/tier-stats.test.ts +378 -0
- package/src/maintenance/tier-stats.ts +222 -0
- package/src/mcp-memory-inspector-app.ts +421 -0
- package/src/memory-action-policy.ts +80 -0
- package/src/memory-cache.ts +208 -0
- package/src/memory-extension/claude-code-publisher.ts +51 -0
- package/src/memory-extension/codex-publisher.ts +149 -0
- package/src/memory-extension/hermes-publisher.ts +51 -0
- package/src/memory-extension/index.ts +100 -0
- package/src/memory-extension/shared-instructions.ts +133 -0
- package/src/memory-extension/types.ts +86 -0
- package/src/memory-extension-host/host-discovery.ts +276 -0
- package/src/memory-extension-host/index.ts +14 -0
- package/src/memory-extension-host/render-extensions-block.ts +73 -0
- package/src/memory-extension-host/types.ts +21 -0
- package/src/memory-lifecycle-ledger-utils.ts +116 -0
- package/src/memory-projection-format.ts +11 -0
- package/src/memory-projection-store.ts +951 -0
- package/src/memory-provenance.test.ts +196 -0
- package/src/memory-provenance.ts +484 -0
- package/src/memory-worth-bench.test.ts +71 -0
- package/src/memory-worth-bench.ts +265 -0
- package/src/memory-worth-filter.test.ts +209 -0
- package/src/memory-worth-filter.ts +204 -0
- package/src/memory-worth-frontmatter.test.ts +311 -0
- package/src/memory-worth-outcomes.test.ts +316 -0
- package/src/memory-worth-outcomes.ts +286 -0
- package/src/memory-worth.test.ts +317 -0
- package/src/memory-worth.ts +215 -0
- package/src/message-parts/index.ts +806 -0
- package/src/message-parts/message-parts.test.ts +421 -0
- package/src/migrate/from-engram.ts +789 -0
- package/src/model-registry.ts +313 -0
- package/src/models-json.ts +76 -0
- package/src/namespaces/migrate.ts +187 -0
- package/src/namespaces/path.ts +25 -0
- package/src/namespaces/principal.test.ts +195 -0
- package/src/namespaces/principal.ts +86 -0
- package/src/namespaces/search.test.ts +105 -0
- package/src/namespaces/search.ts +233 -0
- package/src/namespaces/storage.ts +74 -0
- package/src/native-knowledge.ts +1823 -0
- package/src/negative.ts +72 -0
- package/src/network/tailscale.ts +179 -0
- package/src/network/webdav.ts +385 -0
- package/src/objective-state-writers.ts +951 -0
- package/src/objective-state.ts +320 -0
- package/src/onboarding/index.ts +529 -0
- package/src/openai-chat-compat.ts +56 -0
- package/src/operator-toolkit.ts +2132 -0
- package/src/opik-exporter.test.ts +72 -0
- package/src/opik-exporter.ts +587 -0
- package/src/orchestrator-extraction-queue.test.ts +197 -0
- package/src/orchestrator-flush.test.ts +1171 -0
- package/src/orchestrator-pattern-reinforcement.test.ts +128 -0
- package/src/orchestrator-source-attribution.test.ts +701 -0
- package/src/orchestrator.ts +16368 -0
- package/src/page-versioning.ts +450 -0
- package/src/patterns-cli.ts +574 -0
- package/src/peers/index.ts +54 -0
- package/src/peers/migrate-from-identity-anchor.test.ts +291 -0
- package/src/peers/migrate-from-identity-anchor.ts +350 -0
- package/src/peers/peers.test.ts +419 -0
- package/src/peers/profile-reasoner.ts +694 -0
- package/src/peers/storage.ts +1350 -0
- package/src/peers/types.ts +138 -0
- package/src/plugin-id.ts +84 -0
- package/src/policy-runtime.ts +209 -0
- package/src/procedural/procedure-miner.ts +150 -0
- package/src/procedural/procedure-recall.ts +93 -0
- package/src/procedural/procedure-stats.ts +213 -0
- package/src/procedural/procedure-types.ts +132 -0
- package/src/procedural/reinforcement-core.test.ts +132 -0
- package/src/procedural/reinforcement-core.ts +73 -0
- package/src/profiling.test.ts +263 -0
- package/src/profiling.ts +435 -0
- package/src/projection/index.ts +398 -0
- package/src/qmd-recall-cache.test.ts +138 -0
- package/src/qmd-recall-cache.ts +111 -0
- package/src/qmd.test.ts +258 -0
- package/src/qmd.ts +2614 -0
- package/src/reasoning-trace-recall.ts +201 -0
- package/src/reasoning-trace-types.ts +235 -0
- package/src/recall-audit-anomaly.test.ts +246 -0
- package/src/recall-audit-anomaly.ts +297 -0
- package/src/recall-audit.test.ts +51 -0
- package/src/recall-audit.ts +72 -0
- package/src/recall-budget-config.test.ts +87 -0
- package/src/recall-disclosure-escalation.test.ts +196 -0
- package/src/recall-disclosure-escalation.ts +158 -0
- package/src/recall-disclosure-shaping.test.ts +146 -0
- package/src/recall-disclosure.test.ts +214 -0
- package/src/recall-explain-renderer.test.ts +140 -0
- package/src/recall-explain-renderer.ts +356 -0
- package/src/recall-mmr.test.ts +808 -0
- package/src/recall-mmr.ts +607 -0
- package/src/recall-qos.test.ts +85 -0
- package/src/recall-qos.ts +82 -0
- package/src/recall-query-policy.ts +221 -0
- package/src/recall-state.test.ts +233 -0
- package/src/recall-state.ts +456 -0
- package/src/recall-tag-filter.ts +143 -0
- package/src/recall-tokenization.ts +35 -0
- package/src/recall-xray-cli.test.ts +118 -0
- package/src/recall-xray-cli.ts +100 -0
- package/src/recall-xray-disclosure-telemetry.test.ts +183 -0
- package/src/recall-xray-renderer.test.ts +539 -0
- package/src/recall-xray-renderer.ts +487 -0
- package/src/recall-xray.test.ts +503 -0
- package/src/recall-xray.ts +621 -0
- package/src/reconstruct.ts +41 -0
- package/src/release-changelog.ts +35 -0
- package/src/relevance.ts +67 -0
- package/src/replay/normalizers/chatgpt.ts +133 -0
- package/src/replay/normalizers/claude.ts +102 -0
- package/src/replay/normalizers/openclaw.ts +119 -0
- package/src/replay/normalizers/shared.ts +69 -0
- package/src/replay/runner.ts +197 -0
- package/src/replay/types.ts +143 -0
- package/src/rerank.test.ts +48 -0
- package/src/rerank.ts +176 -0
- package/src/resolve-auth-token.test.ts +226 -0
- package/src/resolve-auth-token.ts +151 -0
- package/src/resolve-provider-secret.test.ts +187 -0
- package/src/resolve-provider-secret.ts +410 -0
- package/src/response-guidance-recall.test.ts +3952 -0
- package/src/response-guidance-recall.ts +4431 -0
- package/src/resume-bundles.ts +415 -0
- package/src/retrieval-agents.ts +623 -0
- package/src/retrieval-tiers.ts +25 -0
- package/src/retrieval.ts +104 -0
- package/src/review/index.test.ts +201 -0
- package/src/review/index.ts +536 -0
- package/src/routing/engine.ts +162 -0
- package/src/routing/store.ts +321 -0
- package/src/runtime/better-sqlite.test.ts +32 -0
- package/src/runtime/better-sqlite.ts +76 -0
- package/src/runtime/child-process.ts +67 -0
- package/src/runtime/env.ts +48 -0
- package/src/sanitize.ts +58 -0
- package/src/schemas.ts +449 -0
- package/src/sdk-compat.ts +87 -0
- package/src/search/document-scanner.ts +96 -0
- package/src/search/embed-helper.ts +142 -0
- package/src/search/factory.ts +189 -0
- package/src/search/index.ts +10 -0
- package/src/search/lancedb-backend.ts +342 -0
- package/src/search/meilisearch-backend.ts +232 -0
- package/src/search/noop-backend.ts +57 -0
- package/src/search/orama-backend.ts +358 -0
- package/src/search/port.ts +86 -0
- package/src/search/remote-backend.ts +124 -0
- package/src/secure-store/cipher.ts +271 -0
- package/src/secure-store/cli-handlers.ts +355 -0
- package/src/secure-store/cli-renderer.ts +131 -0
- package/src/secure-store/header.ts +373 -0
- package/src/secure-store/index.ts +137 -0
- package/src/secure-store/kdf.ts +263 -0
- package/src/secure-store/keyring.ts +106 -0
- package/src/secure-store/metadata.ts +394 -0
- package/src/secure-store/passphrase-reader.ts +252 -0
- package/src/secure-store/secure-fs.ts +571 -0
- package/src/secure-store/secure-store.test.ts +755 -0
- package/src/semantic-chunking.ts +545 -0
- package/src/semantic-consolidation.test.ts +182 -0
- package/src/semantic-consolidation.ts +432 -0
- package/src/semantic-rule-promotion.ts +183 -0
- package/src/semantic-rule-verifier.ts +160 -0
- package/src/session-integrity.ts +569 -0
- package/src/session-observer-bands.ts +11 -0
- package/src/session-observer-state.ts +346 -0
- package/src/session-toggles.test.ts +96 -0
- package/src/session-toggles.ts +159 -0
- package/src/shared-context/manager.ts +810 -0
- package/src/signal.ts +84 -0
- package/src/skills-registry.test.ts +277 -0
- package/src/skills-registry.ts +120 -0
- package/src/source-attribution-roundtrip.test.ts +215 -0
- package/src/source-attribution.test.ts +1425 -0
- package/src/source-attribution.ts +639 -0
- package/src/spaces/index.ts +627 -0
- package/src/storage-paths.ts +117 -0
- package/src/storage.ts +6657 -0
- package/src/store-contract.ts +55 -0
- package/src/summarizer.ts +844 -0
- package/src/summary-snapshot.test.ts +681 -0
- package/src/summary-snapshot.ts +238 -0
- package/src/surfaces/dreams.test.ts +394 -0
- package/src/surfaces/dreams.ts +346 -0
- package/src/surfaces/heartbeat.test.ts +415 -0
- package/src/surfaces/heartbeat.ts +325 -0
- package/src/sync/index.ts +308 -0
- package/src/targeted-fact-recall.test.ts +1694 -0
- package/src/targeted-fact-recall.ts +2905 -0
- package/src/taxonomy/default-taxonomy.ts +87 -0
- package/src/taxonomy/index.ts +26 -0
- package/src/taxonomy/resolver-doc-generator.ts +57 -0
- package/src/taxonomy/resolver.ts +184 -0
- package/src/taxonomy/taxonomy-loader.ts +186 -0
- package/src/taxonomy/types.ts +48 -0
- package/src/telemetry-transcript.ts +70 -0
- package/src/temporal-index.ts +890 -0
- package/src/temporal-supersession.test.ts +2703 -0
- package/src/temporal-supersession.ts +493 -0
- package/src/temporal-validity.test.ts +448 -0
- package/src/temporal-validity.ts +123 -0
- package/src/threading.ts +395 -0
- package/src/tier-migration.ts +124 -0
- package/src/tier-routing.ts +102 -0
- package/src/tmt.ts +462 -0
- package/src/tokens.test.ts +178 -0
- package/src/tokens.ts +279 -0
- package/src/topics.ts +147 -0
- package/src/training-export/cli-date-validation.test.ts +258 -0
- package/src/training-export/converter.test.ts +452 -0
- package/src/training-export/converter.ts +319 -0
- package/src/training-export/date-parse.ts +117 -0
- package/src/training-export/index.ts +26 -0
- package/src/training-export/registry.test.ts +85 -0
- package/src/training-export/registry.ts +57 -0
- package/src/training-export/types.ts +31 -0
- package/src/transcript.ts +1179 -0
- package/src/transfer/autodetect.ts +30 -0
- package/src/transfer/backup.ts +138 -0
- package/src/transfer/capsule-crypto.ts +485 -0
- package/src/transfer/capsule-encrypt.test.ts +690 -0
- package/src/transfer/capsule-export.ts +543 -0
- package/src/transfer/capsule-fork.ts +375 -0
- package/src/transfer/capsule-import.ts +564 -0
- package/src/transfer/capsule-merge.ts +433 -0
- package/src/transfer/conflict-policy.ts +16 -0
- package/src/transfer/constants.ts +13 -0
- package/src/transfer/exclusions.ts +37 -0
- package/src/transfer/export-json.ts +65 -0
- package/src/transfer/export-md.ts +59 -0
- package/src/transfer/export-sqlite.ts +52 -0
- package/src/transfer/fs-utils.ts +269 -0
- package/src/transfer/import-json.ts +108 -0
- package/src/transfer/import-md.ts +84 -0
- package/src/transfer/import-sqlite.ts +100 -0
- package/src/transfer/integrity.ts +71 -0
- package/src/transfer/sqlite-schema.ts +16 -0
- package/src/transfer/types.ts +297 -0
- package/src/trust-zones.ts +1186 -0
- package/src/types.ts +3074 -0
- package/src/user-model.test.ts +124 -0
- package/src/user-model.ts +162 -0
- package/src/utility-learner.ts +353 -0
- package/src/utility-runtime.ts +88 -0
- package/src/utility-telemetry.ts +215 -0
- package/src/utils/category-dir.ts +44 -0
- package/src/utils/errno.ts +6 -0
- package/src/utils/iso-timestamp.test.ts +37 -0
- package/src/utils/iso-timestamp.ts +164 -0
- package/src/utils/path.ts +26 -0
- package/src/verified-recall.ts +138 -0
- package/src/version-utils.test.ts +10 -0
- package/src/version-utils.ts +9 -0
- package/src/whitespace.ts +10 -0
- package/src/work/board.ts +359 -0
- package/src/work/boundary.ts +107 -0
- package/src/work/storage.ts +436 -0
- package/src/work/types.ts +82 -0
- package/src/work-product-ledger.ts +265 -0
- package/dist/access-service-DDjzFALq.d.ts +0 -2088
- package/dist/capsule-crypto-SJS5VVAP.js +0 -18
- package/dist/capsule-export-7QNCBZOQ.js +0 -17
- package/dist/capsule-import-EPBHD2EN.js +0 -16
- package/dist/capsule-merge-DI7PNQ2H.js +0 -189
- package/dist/chunk-23ZZK64Y.js +0 -26
- package/dist/chunk-23ZZK64Y.js.map +0 -1
- package/dist/chunk-242S3I2A.js +0 -647
- package/dist/chunk-2LGMW3DJ.js +0 -111
- package/dist/chunk-3B6KIRBH.js +0 -5213
- package/dist/chunk-3B6KIRBH.js.map +0 -1
- package/dist/chunk-457A4P3L.js +0 -119
- package/dist/chunk-457A4P3L.js.map +0 -1
- package/dist/chunk-4IS4SXIQ.js +0 -2040
- package/dist/chunk-4YM32CRU.js +0 -721
- package/dist/chunk-6TBWYBJ3.js +0 -236
- package/dist/chunk-74EMIVE4.js +0 -329
- package/dist/chunk-74EMIVE4.js.map +0 -1
- package/dist/chunk-767ODGE6.js +0 -183
- package/dist/chunk-7V22HTMD.js +0 -623
- package/dist/chunk-7V22HTMD.js.map +0 -1
- package/dist/chunk-7ZM3BFKK.js +0 -9705
- package/dist/chunk-7ZM3BFKK.js.map +0 -1
- package/dist/chunk-AQJNPMOA.js +0 -643
- package/dist/chunk-AQJNPMOA.js.map +0 -1
- package/dist/chunk-ASAITVLA.js +0 -64
- package/dist/chunk-ASAITVLA.js.map +0 -1
- package/dist/chunk-BBE34QBJ.js +0 -275
- package/dist/chunk-BBE34QBJ.js.map +0 -1
- package/dist/chunk-BZSQEPRW.js +0 -14710
- package/dist/chunk-BZSQEPRW.js.map +0 -1
- package/dist/chunk-CPKTBRS2.js +0 -891
- package/dist/chunk-CPKTBRS2.js.map +0 -1
- package/dist/chunk-D4GAOFF6.js +0 -562
- package/dist/chunk-D4GAOFF6.js.map +0 -1
- package/dist/chunk-D54LZC5L.js +0 -147
- package/dist/chunk-DF3RVK3X.js +0 -119
- package/dist/chunk-DF3RVK3X.js.map +0 -1
- package/dist/chunk-DZZPC36E.js +0 -1451
- package/dist/chunk-DZZPC36E.js.map +0 -1
- package/dist/chunk-E2UCDP5S.js +0 -570
- package/dist/chunk-E6K4NIEU.js +0 -747
- package/dist/chunk-E6K4NIEU.js.map +0 -1
- package/dist/chunk-EEQLFRUM.js +0 -89
- package/dist/chunk-ETOW6ACV.js +0 -158
- package/dist/chunk-ETOW6ACV.js.map +0 -1
- package/dist/chunk-FMEBPEAO.js +0 -347
- package/dist/chunk-FMEBPEAO.js.map +0 -1
- package/dist/chunk-FQDPCE3I.js +0 -1837
- package/dist/chunk-FQDPCE3I.js.map +0 -1
- package/dist/chunk-FYIYMQ5N.js +0 -221
- package/dist/chunk-FYIYMQ5N.js.map +0 -1
- package/dist/chunk-G2WADRQ3.js +0 -219
- package/dist/chunk-G4SK7DSQ.js +0 -121
- package/dist/chunk-GVPWB7EY.js +0 -390
- package/dist/chunk-GVPWB7EY.js.map +0 -1
- package/dist/chunk-HELQZFZO.js +0 -1075
- package/dist/chunk-HL5LRPNA.js +0 -1914
- package/dist/chunk-HL5LRPNA.js.map +0 -1
- package/dist/chunk-HQZVVSVB.js +0 -147
- package/dist/chunk-HQZVVSVB.js.map +0 -1
- package/dist/chunk-HY3L4WKC.js +0 -2195
- package/dist/chunk-HY3L4WKC.js.map +0 -1
- package/dist/chunk-IB3BFHGN.js +0 -228
- package/dist/chunk-IXEJRKCZ.js +0 -18
- package/dist/chunk-JBMSGZEQ.js +0 -441
- package/dist/chunk-JBMSGZEQ.js.map +0 -1
- package/dist/chunk-JESOB2HO.js +0 -108
- package/dist/chunk-JKDVIE52.js +0 -272
- package/dist/chunk-JRNQ3RNA.js +0 -284
- package/dist/chunk-JRNQ3RNA.js.map +0 -1
- package/dist/chunk-K6WK37A6.js +0 -865
- package/dist/chunk-K6WK37A6.js.map +0 -1
- package/dist/chunk-MARWOCVP.js +0 -48
- package/dist/chunk-MNU6ZBWT.js +0 -4454
- package/dist/chunk-MNU6ZBWT.js.map +0 -1
- package/dist/chunk-N5AKDXAI.js +0 -74
- package/dist/chunk-OA3L7BFR.js +0 -183
- package/dist/chunk-OA3L7BFR.js.map +0 -1
- package/dist/chunk-OR64ZGRZ.js +0 -23
- package/dist/chunk-P77UEOU2.js +0 -1521
- package/dist/chunk-P77UEOU2.js.map +0 -1
- package/dist/chunk-PH4C2U43.js +0 -239
- package/dist/chunk-PH4C2U43.js.map +0 -1
- package/dist/chunk-RVPLBATS.js +0 -1586
- package/dist/chunk-RVPLBATS.js.map +0 -1
- package/dist/chunk-U5JMRGKX.js +0 -340
- package/dist/chunk-U5JMRGKX.js.map +0 -1
- package/dist/chunk-URB2WSKZ.js +0 -350
- package/dist/chunk-URB2WSKZ.js.map +0 -1
- package/dist/chunk-UVMUAWVT.js +0 -596
- package/dist/chunk-WEJG4TB5.js +0 -118
- package/dist/chunk-X7HPGUVG.js +0 -271
- package/dist/chunk-XAMBKFQS.js +0 -2777
- package/dist/chunk-XAMBKFQS.js.map +0 -1
- package/dist/chunk-XJKFSSDW.js +0 -726
- package/dist/chunk-XJKFSSDW.js.map +0 -1
- package/dist/chunk-XMHBH5H6.js +0 -283
- package/dist/chunk-XMHBH5H6.js.map +0 -1
- package/dist/chunk-XMVFHBHT.js +0 -277
- package/dist/chunk-Y3VMVTYX.js +0 -53
- package/dist/chunk-YNB73F22.js +0 -137
- package/dist/chunk-YNB73F22.js.map +0 -1
- package/dist/chunk-Z2E7VW55.js +0 -335
- package/dist/chunk-Z2E7VW55.js.map +0 -1
- package/dist/chunk-ZG7PTKBK.js +0 -2296
- package/dist/chunk-ZNQN6ZTA.js +0 -135
- package/dist/chunk-ZVTKDVVM.js +0 -827
- package/dist/chunk-ZVTKDVVM.js.map +0 -1
- package/dist/cli-BR8KpIU0.d.ts +0 -1259
- package/dist/codex-materialize-CQlLTzke.d.ts +0 -139
- package/dist/connectors-cli-DFGtY2DB.d.ts +0 -257
- package/dist/contradiction-review-5LTTVDQV.js +0 -22
- package/dist/contradiction-scan-QTXAMBUA.js +0 -414
- package/dist/contradiction-scan-QTXAMBUA.js.map +0 -1
- package/dist/engine-35M5BKQ7.js +0 -28
- package/dist/fs-utils-IRVUFB6G.js +0 -30
- package/dist/graph-edge-decay-PWB63GRE.js +0 -207
- package/dist/memory-governance-IMPQZXFC.js +0 -37
- package/dist/memory-projection-store-CY8TU40w.d.ts +0 -222
- package/dist/orchestrator-DDMPqU6R.d.ts +0 -1792
- package/dist/path-RMTY5Y5A.js +0 -9
- package/dist/port-B6VEDIkC.d.ts +0 -53
- package/dist/resolution-YGIBORXI.js +0 -101
- package/dist/resolution-YGIBORXI.js.map +0 -1
- package/dist/secure-store-4R2GSO7S.js +0 -156
- package/dist/semantic-consolidation-ByBXb-sf.d.ts +0 -180
- package/dist/state-store-3EH7HYIN.js +0 -16
- package/dist/types-V3FJ26TF.js +0 -30
- /package/dist/{capsule-crypto-SJS5VVAP.js.map → adapters/claude-code.js.map} +0 -0
- /package/dist/{capsule-export-7QNCBZOQ.js.map → adapters/codex.js.map} +0 -0
- /package/dist/{capsule-import-EPBHD2EN.js.map → adapters/hermes.js.map} +0 -0
- /package/dist/{contradiction-review-5LTTVDQV.js.map → adapters/index.js.map} +0 -0
- /package/dist/{engine-35M5BKQ7.js.map → adapters/registry.js.map} +0 -0
- /package/dist/{fs-utils-IRVUFB6G.js.map → adapters/replit.js.map} +0 -0
- /package/dist/{memory-governance-IMPQZXFC.js.map → adapters/types.js.map} +0 -0
- /package/dist/{path-RMTY5Y5A.js.map → capsule-crypto-5CYAGVC5.js.map} +0 -0
- /package/dist/{capsule-merge-DI7PNQ2H.js.map → capsule-merge-4MGKE7C5.js.map} +0 -0
- /package/dist/{chunk-G4SK7DSQ.js.map → chunk-2WWLHTZY.js.map} +0 -0
- /package/dist/{chunk-X7HPGUVG.js.map → chunk-4CRG46BG.js.map} +0 -0
- /package/dist/{chunk-UVMUAWVT.js.map → chunk-7IASACLB.js.map} +0 -0
- /package/dist/{chunk-HELQZFZO.js.map → chunk-EDTHC6UD.js.map} +0 -0
- /package/dist/{chunk-4YM32CRU.js.map → chunk-EFJ3MQ4V.js.map} +0 -0
- /package/dist/{chunk-E2UCDP5S.js.map → chunk-FBYESMQ2.js.map} +0 -0
- /package/dist/{chunk-D54LZC5L.js.map → chunk-FDU6HUUL.js.map} +0 -0
- /package/dist/{chunk-IB3BFHGN.js.map → chunk-GGKRUQOO.js.map} +0 -0
- /package/dist/{chunk-242S3I2A.js.map → chunk-GL6I6MEQ.js.map} +0 -0
- /package/dist/{secure-store-4R2GSO7S.js.map → chunk-HHLLAQGZ.js.map} +0 -0
- /package/dist/{chunk-4IS4SXIQ.js.map → chunk-HXXBL2KD.js.map} +0 -0
- /package/dist/{chunk-767ODGE6.js.map → chunk-KNKUID7G.js.map} +0 -0
- /package/dist/{chunk-6TBWYBJ3.js.map → chunk-LPMVBPA3.js.map} +0 -0
- /package/dist/{chunk-WEJG4TB5.js.map → chunk-MC26UJIM.js.map} +0 -0
- /package/dist/{chunk-JKDVIE52.js.map → chunk-MGKYQQYF.js.map} +0 -0
- /package/dist/{chunk-Y3VMVTYX.js.map → chunk-MT4HVDUZ.js.map} +0 -0
- /package/dist/{chunk-G2WADRQ3.js.map → chunk-MY6TPVXW.js.map} +0 -0
- /package/dist/{chunk-OR64ZGRZ.js.map → chunk-NNVTUXEB.js.map} +0 -0
- /package/dist/{chunk-JESOB2HO.js.map → chunk-P4NEIHUT.js.map} +0 -0
- /package/dist/{chunk-IXEJRKCZ.js.map → chunk-QRNI5JBH.js.map} +0 -0
- /package/dist/{chunk-EEQLFRUM.js.map → chunk-RRF5UOBJ.js.map} +0 -0
- /package/dist/{state-store-3EH7HYIN.js.map → chunk-SEDEKFYQ.js.map} +0 -0
- /package/dist/{chunk-2LGMW3DJ.js.map → chunk-U3PN77QT.js.map} +0 -0
- /package/dist/{chunk-XMVFHBHT.js.map → chunk-U3WSW6PZ.js.map} +0 -0
- /package/dist/{chunk-N5AKDXAI.js.map → chunk-UWVJF25J.js.map} +0 -0
- /package/dist/{types-V3FJ26TF.js.map → chunk-V5OCT34X.js.map} +0 -0
- /package/dist/{chunk-ZG7PTKBK.js.map → chunk-W3LR522O.js.map} +0 -0
- /package/dist/{chunk-MARWOCVP.js.map → chunk-XIG5PDM7.js.map} +0 -0
- /package/dist/{chunk-ZNQN6ZTA.js.map → chunk-XVZ7B3HG.js.map} +0 -0
- /package/dist/{graph-edge-decay-PWB63GRE.js.map → graph-edge-decay-5DI5GUNL.js.map} +0 -0
package/src/buffer.ts
ADDED
|
@@ -0,0 +1,900 @@
|
|
|
1
|
+
import { log } from "./logger.js";
|
|
2
|
+
import { scanSignals } from "./signal.js";
|
|
3
|
+
import type { StorageManager } from "./storage.js";
|
|
4
|
+
import type {
|
|
5
|
+
BufferEntryState,
|
|
6
|
+
BufferState,
|
|
7
|
+
BufferSurpriseEvent,
|
|
8
|
+
BufferTurn,
|
|
9
|
+
PluginConfig,
|
|
10
|
+
SignalLevel,
|
|
11
|
+
} from "./types.js";
|
|
12
|
+
|
|
13
|
+
export type TriggerDecision = "extract_now" | "extract_batch" | "keep_buffering";
|
|
14
|
+
|
|
15
|
+
export interface AddTurnOutcome {
|
|
16
|
+
decision: TriggerDecision;
|
|
17
|
+
extractionTurns?: BufferTurn[];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Optional surprise probe injected into `SmartBuffer`.
|
|
22
|
+
*
|
|
23
|
+
* Computes a D-MEM-style novelty score in `[0, 1]` for an incoming turn.
|
|
24
|
+
* The buffer treats the probe as purely additive: if it is not provided, if
|
|
25
|
+
* the feature flag is off, or if the probe throws/times out, the buffer
|
|
26
|
+
* falls back to the existing signal/turn-count/time triggers unchanged.
|
|
27
|
+
*
|
|
28
|
+
* Callers are responsible for sampling recent memories and passing them
|
|
29
|
+
* through the embedding pipeline — the buffer does not want to know about
|
|
30
|
+
* storage, embeddings, or QMD.
|
|
31
|
+
*
|
|
32
|
+
* @param bufferKey Identifier for the active buffer (session/thread).
|
|
33
|
+
* @param turn The incoming turn whose novelty is being scored.
|
|
34
|
+
* @param recentTurns Turns already buffered for this key (most recent first
|
|
35
|
+
* is NOT guaranteed — treat as unordered corpus).
|
|
36
|
+
* @returns A surprise score in `[0, 1]`, or `null` if no score could be
|
|
37
|
+
* produced (e.g. empty corpus, probe declined to embed).
|
|
38
|
+
*/
|
|
39
|
+
export interface BufferSurpriseProbe {
|
|
40
|
+
scoreTurn(
|
|
41
|
+
bufferKey: string,
|
|
42
|
+
turn: BufferTurn,
|
|
43
|
+
recentTurns: readonly BufferTurn[],
|
|
44
|
+
): Promise<number | null>;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const MAX_BUFFER_ENTRY_COUNT = 200;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Minimal data carried on the serialized telemetry write chain
|
|
51
|
+
* (issue #563 PR 3).
|
|
52
|
+
*
|
|
53
|
+
* We intentionally do NOT capture the full `BufferTurn` here: under
|
|
54
|
+
* slow filesystem latency the chain can back up, and retaining
|
|
55
|
+
* `turn.content` for every pending append causes memory pressure on
|
|
56
|
+
* large conversations. Only the fields the ledger row actually needs
|
|
57
|
+
* cross the chain boundary.
|
|
58
|
+
*/
|
|
59
|
+
interface SurpriseTelemetryQueueEntry {
|
|
60
|
+
bufferKey: string;
|
|
61
|
+
turnRole: "user" | "assistant";
|
|
62
|
+
sessionKey: string | null;
|
|
63
|
+
surpriseScore: number;
|
|
64
|
+
triggered: boolean;
|
|
65
|
+
turnCountInWindow: number;
|
|
66
|
+
/**
|
|
67
|
+
* ISO timestamp captured at the moment the turn was scored, NOT when
|
|
68
|
+
* the ledger append eventually runs. Backpressure on the serialized
|
|
69
|
+
* write chain could otherwise shift event timestamps away from the
|
|
70
|
+
* real decision moment and distort the distribution report (p90
|
|
71
|
+
* inflated, current-threshold row misidentified).
|
|
72
|
+
*/
|
|
73
|
+
timestamp: string;
|
|
74
|
+
/**
|
|
75
|
+
* Threshold value in force when `triggered` was computed. Must be
|
|
76
|
+
* snapshot here rather than read from `config` at emit time — a
|
|
77
|
+
* concurrent config change between queue and write would otherwise
|
|
78
|
+
* record `triggered=true` against a newer threshold the operator
|
|
79
|
+
* never set, distorting precision/recall interpretation.
|
|
80
|
+
*/
|
|
81
|
+
threshold: number;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
interface AddTurnMutationResult {
|
|
85
|
+
decision: TriggerDecision;
|
|
86
|
+
signalLevel: SignalLevel;
|
|
87
|
+
priorTurns: BufferTurn[];
|
|
88
|
+
turnSnapshot: BufferTurn;
|
|
89
|
+
turnCountInWindow: number;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export class SmartBuffer {
|
|
93
|
+
private state: BufferState;
|
|
94
|
+
private loaded = false;
|
|
95
|
+
private loadPromise: Promise<void> | null = null;
|
|
96
|
+
private readonly surpriseProbe: BufferSurpriseProbe | null;
|
|
97
|
+
private mutationChain: Promise<unknown> = Promise.resolve();
|
|
98
|
+
/**
|
|
99
|
+
* Serialized write chain for `BUFFER_SURPRISE` telemetry events.
|
|
100
|
+
*
|
|
101
|
+
* The telemetry path is fire-and-forget (`addTurn` does not await the
|
|
102
|
+
* ledger append), but multiple concurrent appends would still settle
|
|
103
|
+
* out of order under variable filesystem latency. The report path
|
|
104
|
+
* assumes chronological ordering — it slices the tail of the ledger
|
|
105
|
+
* and treats the most recent entry as the current threshold in force.
|
|
106
|
+
* Chaining ensures each append only runs after the previous settles,
|
|
107
|
+
* preserving wall-clock order.
|
|
108
|
+
*
|
|
109
|
+
* We include a `.catch` on every link so a rejected append does not
|
|
110
|
+
* poison the chain (CLAUDE.md rule #40).
|
|
111
|
+
*/
|
|
112
|
+
private surpriseTelemetryWriteChain: Promise<unknown> = Promise.resolve();
|
|
113
|
+
|
|
114
|
+
constructor(
|
|
115
|
+
private readonly config: PluginConfig,
|
|
116
|
+
private readonly storage: StorageManager,
|
|
117
|
+
surpriseProbe: BufferSurpriseProbe | null = null,
|
|
118
|
+
) {
|
|
119
|
+
this.state = { turns: [], lastExtractionAt: null, extractionCount: 0 };
|
|
120
|
+
this.surpriseProbe = surpriseProbe;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
private enqueueMutation<T>(op: () => Promise<T>): Promise<T> {
|
|
124
|
+
const run = this.mutationChain.catch(() => {}).then(op);
|
|
125
|
+
this.mutationChain = run.catch(() => {});
|
|
126
|
+
return run;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
private entryFor(key: string): BufferEntryState {
|
|
130
|
+
this.state.entries ??= {};
|
|
131
|
+
// Reject prototype-polluting keys outright so no downstream
|
|
132
|
+
// assignment can mutate Object.prototype.
|
|
133
|
+
if (key === "__proto__" || key === "constructor" || key === "prototype") {
|
|
134
|
+
key = `__safe_${key}`;
|
|
135
|
+
}
|
|
136
|
+
if (Object.hasOwn(this.state.entries, key)) {
|
|
137
|
+
const stored = this.state.entries[key];
|
|
138
|
+
// Guard against corrupted state/buffer.json — if the stored entry
|
|
139
|
+
// is not a valid object shape, discard it and recreate.
|
|
140
|
+
if (stored && typeof stored === "object" && Array.isArray(stored.turns)) {
|
|
141
|
+
return stored;
|
|
142
|
+
}
|
|
143
|
+
// Corrupted — fall through to recreate.
|
|
144
|
+
}
|
|
145
|
+
const created: BufferEntryState = {
|
|
146
|
+
turns: [],
|
|
147
|
+
lastExtractionAt: null,
|
|
148
|
+
extractionCount: 0,
|
|
149
|
+
};
|
|
150
|
+
this.state.entries[key] = created;
|
|
151
|
+
return created;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
private peekEntry(key: string): BufferEntryState | null {
|
|
155
|
+
// Apply the same prototype-pollution guard as entryFor so reads and
|
|
156
|
+
// writes use the same key namespace for dangerous keys.
|
|
157
|
+
if (key === "__proto__" || key === "constructor" || key === "prototype") {
|
|
158
|
+
key = `__safe_${key}`;
|
|
159
|
+
}
|
|
160
|
+
const existing = this.state.entries?.[key];
|
|
161
|
+
if (existing) return existing;
|
|
162
|
+
if (key !== "default") return null;
|
|
163
|
+
return {
|
|
164
|
+
turns: Array.isArray(this.state.turns) ? this.state.turns : [],
|
|
165
|
+
lastExtractionAt: this.state.lastExtractionAt ?? null,
|
|
166
|
+
extractionCount:
|
|
167
|
+
typeof this.state.extractionCount === "number" ? this.state.extractionCount : 0,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
private normalizeState(state: BufferState): BufferState {
|
|
172
|
+
const entries = state.entries ?? {};
|
|
173
|
+
if (!entries.default) {
|
|
174
|
+
entries.default = {
|
|
175
|
+
turns: Array.isArray(state.turns) ? [...state.turns] : [],
|
|
176
|
+
lastExtractionAt: state.lastExtractionAt ?? null,
|
|
177
|
+
extractionCount:
|
|
178
|
+
typeof state.extractionCount === "number" ? state.extractionCount : 0,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
turns: entries.default.turns,
|
|
183
|
+
lastExtractionAt: entries.default.lastExtractionAt,
|
|
184
|
+
extractionCount: entries.default.extractionCount,
|
|
185
|
+
entries,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
private entryActivityAt(entry: BufferEntryState): number {
|
|
190
|
+
const lastTurnAt = entry.turns.reduce((latest, turn) => {
|
|
191
|
+
const parsed = Date.parse(turn.timestamp);
|
|
192
|
+
return Number.isFinite(parsed) ? Math.max(latest, parsed) : latest;
|
|
193
|
+
}, -1);
|
|
194
|
+
const lastExtractionAt =
|
|
195
|
+
typeof entry.lastExtractionAt === "string"
|
|
196
|
+
? Date.parse(entry.lastExtractionAt)
|
|
197
|
+
: Number.NaN;
|
|
198
|
+
return Math.max(
|
|
199
|
+
lastTurnAt,
|
|
200
|
+
Number.isFinite(lastExtractionAt) ? lastExtractionAt : -1,
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
private pruneEntries(retainKeys: string[]): void {
|
|
205
|
+
const entries = this.state.entries;
|
|
206
|
+
if (!entries) return;
|
|
207
|
+
const keys = Object.keys(entries);
|
|
208
|
+
if (keys.length <= MAX_BUFFER_ENTRY_COUNT) return;
|
|
209
|
+
|
|
210
|
+
const insertionOrder = new Map(keys.map((key, index) => [key, index]));
|
|
211
|
+
const removable = keys
|
|
212
|
+
.filter((key) => key !== "default" && !retainKeys.includes(key))
|
|
213
|
+
.filter((key) => (entries[key]?.turns.length ?? 0) === 0)
|
|
214
|
+
.sort((left, right) => {
|
|
215
|
+
const leftAt = this.entryActivityAt(entries[left] ?? {
|
|
216
|
+
turns: [],
|
|
217
|
+
lastExtractionAt: null,
|
|
218
|
+
extractionCount: 0,
|
|
219
|
+
});
|
|
220
|
+
const rightAt = this.entryActivityAt(entries[right] ?? {
|
|
221
|
+
turns: [],
|
|
222
|
+
lastExtractionAt: null,
|
|
223
|
+
extractionCount: 0,
|
|
224
|
+
});
|
|
225
|
+
if (leftAt !== rightAt) return leftAt - rightAt;
|
|
226
|
+
return (insertionOrder.get(left) ?? 0) - (insertionOrder.get(right) ?? 0);
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
const removableCount = Math.max(0, keys.length - MAX_BUFFER_ENTRY_COUNT);
|
|
230
|
+
for (const key of removable.slice(0, removableCount)) {
|
|
231
|
+
delete entries[key];
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
private async loadUnlocked(): Promise<void> {
|
|
236
|
+
if (this.loaded) return;
|
|
237
|
+
if (!this.loadPromise) {
|
|
238
|
+
this.loadPromise = this.storage.loadBuffer()
|
|
239
|
+
.then((state) => {
|
|
240
|
+
this.state = this.normalizeState(state);
|
|
241
|
+
this.loaded = true;
|
|
242
|
+
})
|
|
243
|
+
.finally(() => {
|
|
244
|
+
this.loadPromise = null;
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
await this.loadPromise;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
async load(): Promise<void> {
|
|
251
|
+
await this.enqueueMutation(async () => this.loadUnlocked());
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Reset the buffer to an empty, usable state.
|
|
256
|
+
* Called when the persisted buffer file is corrupt and load() fails,
|
|
257
|
+
* so the buffer can still accept new turns for the rest of the session.
|
|
258
|
+
*/
|
|
259
|
+
resetToEmpty(): void {
|
|
260
|
+
this.state = { turns: [], lastExtractionAt: null, extractionCount: 0 };
|
|
261
|
+
this.loaded = true;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
private async saveUnlocked(): Promise<void> {
|
|
265
|
+
await this.storage.saveBuffer(this.state);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
async save(): Promise<void> {
|
|
269
|
+
await this.enqueueMutation(async () => this.saveUnlocked());
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
async addTurn(bufferKey: string, turn: BufferTurn): Promise<TriggerDecision> {
|
|
273
|
+
return (await this.addTurnWithOutcome(bufferKey, turn)).decision;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
async addTurnWithOutcome(
|
|
277
|
+
bufferKey: string,
|
|
278
|
+
turn: BufferTurn,
|
|
279
|
+
): Promise<AddTurnOutcome> {
|
|
280
|
+
const mutation = await this.enqueueMutation(() => this.recordTurnUnlocked(bufferKey, turn));
|
|
281
|
+
let decision = mutation.decision;
|
|
282
|
+
let extractionTurns: BufferTurn[] | undefined;
|
|
283
|
+
|
|
284
|
+
// Surprise-gated flush (issue #563). Additive only: if the probe is
|
|
285
|
+
// disabled, unavailable, or the score is below threshold, the decision
|
|
286
|
+
// from the existing trigger logic stands. The probe only ever *promotes*
|
|
287
|
+
// `keep_buffering` → `extract_now`; it never suppresses an existing
|
|
288
|
+
// flush. This preserves the invariant that enabling surprise cannot
|
|
289
|
+
// *reduce* extraction frequency.
|
|
290
|
+
if (
|
|
291
|
+
decision === "keep_buffering" &&
|
|
292
|
+
this.config.bufferSurpriseTriggerEnabled &&
|
|
293
|
+
this.surpriseProbe !== null &&
|
|
294
|
+
// Matching the existing "smart" branch: surprise is a lower-tier
|
|
295
|
+
// novelty signal that should not second-guess a high-signal hit
|
|
296
|
+
// (which already flushes) or fight `every_n` / `time_based` modes.
|
|
297
|
+
this.config.triggerMode === "smart" &&
|
|
298
|
+
mutation.signalLevel !== "high"
|
|
299
|
+
) {
|
|
300
|
+
const surprise = await this.computeSurpriseSafe(bufferKey, turn, mutation.priorTurns);
|
|
301
|
+
if (surprise !== null) {
|
|
302
|
+
const shouldPromote = surprise > this.config.bufferSurpriseThreshold;
|
|
303
|
+
let triggered = false;
|
|
304
|
+
if (shouldPromote) {
|
|
305
|
+
const currentTurns = await this.getExtractionTurnsIfTurnSnapshotStillCurrent(
|
|
306
|
+
bufferKey,
|
|
307
|
+
mutation.turnSnapshot,
|
|
308
|
+
);
|
|
309
|
+
if (currentTurns) {
|
|
310
|
+
log.debug(
|
|
311
|
+
`buffer[${bufferKey}]: surprise=${surprise.toFixed(3)} > threshold=${this.config.bufferSurpriseThreshold} → extract_now`,
|
|
312
|
+
);
|
|
313
|
+
decision = "extract_now";
|
|
314
|
+
triggered = true;
|
|
315
|
+
extractionTurns = currentTurns;
|
|
316
|
+
} else {
|
|
317
|
+
log.debug(
|
|
318
|
+
`buffer[${bufferKey}]: surprise=${surprise.toFixed(3)} ignored because buffer changed before probe resolved`,
|
|
319
|
+
);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
// Emit telemetry on every scored turn — both triggering and
|
|
323
|
+
// non-triggering — so operators can fit the threshold to real
|
|
324
|
+
// traffic distributions. Fire-and-forget: `addTurn` does NOT
|
|
325
|
+
// await the ledger append, so slow/contended filesystems cannot
|
|
326
|
+
// add JSONL-append latency to every `processTurn`. But we DO
|
|
327
|
+
// serialize writes through a promise chain so concurrent
|
|
328
|
+
// appends settle in wall-clock order — the report path assumes
|
|
329
|
+
// chronological tail rows and reads the most recent as the
|
|
330
|
+
// "current" threshold.
|
|
331
|
+
//
|
|
332
|
+
// Project only the fields we need into the queue entry rather
|
|
333
|
+
// than capturing the full `BufferTurn` — under slow filesystem
|
|
334
|
+
// latency the chain can back up, and we must not retain the
|
|
335
|
+
// (potentially large) `turn.content` string for every pending
|
|
336
|
+
// append.
|
|
337
|
+
this.queueSurpriseTelemetryWrite({
|
|
338
|
+
bufferKey,
|
|
339
|
+
turnRole: turn.role,
|
|
340
|
+
sessionKey:
|
|
341
|
+
typeof turn.sessionKey === "string" ? turn.sessionKey : null,
|
|
342
|
+
surpriseScore: surprise,
|
|
343
|
+
triggered,
|
|
344
|
+
turnCountInWindow: mutation.turnCountInWindow,
|
|
345
|
+
// Stamp at decision time so backpressure on the write chain
|
|
346
|
+
// does not shift the event's apparent moment away from when
|
|
347
|
+
// the turn was actually scored.
|
|
348
|
+
timestamp: new Date().toISOString(),
|
|
349
|
+
// Snapshot the threshold used to compute `triggered` so a
|
|
350
|
+
// concurrent config mutation cannot retroactively change
|
|
351
|
+
// what the ledger row claims the decision was against.
|
|
352
|
+
threshold: this.config.bufferSurpriseThreshold,
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
log.debug(
|
|
358
|
+
`buffer[${bufferKey}]: ${mutation.turnCountInWindow} turns, signal=${mutation.signalLevel}, decision=${decision}`,
|
|
359
|
+
);
|
|
360
|
+
return extractionTurns ? { decision, extractionTurns } : { decision };
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
private async recordTurnUnlocked(bufferKey: string, turn: BufferTurn): Promise<AddTurnMutationResult> {
|
|
364
|
+
await this.loadUnlocked();
|
|
365
|
+
const entry = this.entryFor(bufferKey);
|
|
366
|
+
const priorTurns = entry.turns.slice();
|
|
367
|
+
entry.turns.push(turn);
|
|
368
|
+
const turnSnapshot = copyBufferTurn(turn);
|
|
369
|
+
if (bufferKey === "default") {
|
|
370
|
+
this.state.turns = entry.turns;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
const signal = scanSignals(turn.content, this.config.highSignalPatterns);
|
|
374
|
+
const decision = this.evaluate(entry, signal.level);
|
|
375
|
+
const turnCountInWindow = entry.turns.length;
|
|
376
|
+
|
|
377
|
+
this.pruneEntries([bufferKey]);
|
|
378
|
+
await this.saveUnlocked();
|
|
379
|
+
return {
|
|
380
|
+
decision,
|
|
381
|
+
signalLevel: signal.level,
|
|
382
|
+
priorTurns,
|
|
383
|
+
turnSnapshot,
|
|
384
|
+
turnCountInWindow,
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
private async getExtractionTurnsIfTurnSnapshotStillCurrent(
|
|
389
|
+
bufferKey: string,
|
|
390
|
+
turnSnapshot: BufferTurn,
|
|
391
|
+
): Promise<BufferTurn[] | null> {
|
|
392
|
+
return this.enqueueMutation(async () => {
|
|
393
|
+
await this.loadUnlocked();
|
|
394
|
+
const entry = this.peekEntry(bufferKey);
|
|
395
|
+
if (!entry) return null;
|
|
396
|
+
const stillCurrent = entry.turns.some((turn) =>
|
|
397
|
+
bufferTurnsEqual(turn, turnSnapshot),
|
|
398
|
+
);
|
|
399
|
+
if (!stillCurrent) return null;
|
|
400
|
+
const retained = entry.retainedTurns ?? [];
|
|
401
|
+
return [...retained, ...entry.turns];
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* Enqueue a telemetry append on the serialized write chain.
|
|
407
|
+
*
|
|
408
|
+
* The chain is a classic `writeChain = writeChain.then(fn).catch(...)`
|
|
409
|
+
* — each link waits for the previous to settle before its append
|
|
410
|
+
* starts, so out-of-order chronology cannot happen even under
|
|
411
|
+
* variable filesystem latency. We always attach `.catch` so one
|
|
412
|
+
* rejection does not poison the chain for the rest of the session
|
|
413
|
+
* (CLAUDE.md rule #40). The error is logged through
|
|
414
|
+
* `emitSurpriseEventSafe` itself, which swallows its own rejections.
|
|
415
|
+
*
|
|
416
|
+
* Public surface is deliberately narrow — only `addTurn` should call
|
|
417
|
+
* this, so the surprise telemetry path stays centralized.
|
|
418
|
+
*/
|
|
419
|
+
private queueSurpriseTelemetryWrite(params: SurpriseTelemetryQueueEntry): void {
|
|
420
|
+
this.surpriseTelemetryWriteChain = this.surpriseTelemetryWriteChain
|
|
421
|
+
.then(() => this.emitSurpriseEventSafe(params))
|
|
422
|
+
.catch(() => {
|
|
423
|
+
// `emitSurpriseEventSafe` already handles the logging. We
|
|
424
|
+
// swallow here only so one failure does not break the chain
|
|
425
|
+
// for future writes.
|
|
426
|
+
});
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/**
|
|
430
|
+
* Append a single `BUFFER_SURPRISE` telemetry row (issue #563 PR 3).
|
|
431
|
+
*
|
|
432
|
+
* Deliberately swallows write errors: the buffer must never fail to
|
|
433
|
+
* record a turn because the observation ledger is read-only, out of
|
|
434
|
+
* disk, or otherwise unhappy. The log line at debug lets operators
|
|
435
|
+
* confirm the path fired without polluting the error channel.
|
|
436
|
+
*/
|
|
437
|
+
private async emitSurpriseEventSafe(
|
|
438
|
+
params: SurpriseTelemetryQueueEntry,
|
|
439
|
+
): Promise<void> {
|
|
440
|
+
const storage = this.storage as StorageManager & {
|
|
441
|
+
appendBufferSurpriseEvents?: (
|
|
442
|
+
events: BufferSurpriseEvent[],
|
|
443
|
+
) => Promise<number>;
|
|
444
|
+
};
|
|
445
|
+
if (typeof storage.appendBufferSurpriseEvents !== "function") {
|
|
446
|
+
// Older StorageManager / test double without the telemetry sink.
|
|
447
|
+
// Silently skip — core path is still covered by the log line above.
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
const event: BufferSurpriseEvent = {
|
|
451
|
+
event: "BUFFER_SURPRISE",
|
|
452
|
+
// Use the decision-time stamp captured when the event was
|
|
453
|
+
// queued, NOT `Date.now()` here — backpressure on the write
|
|
454
|
+
// chain could otherwise shift timestamps into the future relative
|
|
455
|
+
// to when the turn was scored.
|
|
456
|
+
timestamp: params.timestamp,
|
|
457
|
+
bufferKey: params.bufferKey,
|
|
458
|
+
sessionKey: params.sessionKey,
|
|
459
|
+
turnRole: params.turnRole,
|
|
460
|
+
surpriseScore: params.surpriseScore,
|
|
461
|
+
// Use the snapshotted threshold from the queue entry, not the
|
|
462
|
+
// live config — see `SurpriseTelemetryQueueEntry.threshold`
|
|
463
|
+
// doc for the rationale.
|
|
464
|
+
threshold: params.threshold,
|
|
465
|
+
triggeredFlush: params.triggered,
|
|
466
|
+
turnCountInWindow: params.turnCountInWindow,
|
|
467
|
+
};
|
|
468
|
+
try {
|
|
469
|
+
await storage.appendBufferSurpriseEvents([event]);
|
|
470
|
+
} catch (err) {
|
|
471
|
+
// Same guard as `computeSurpriseSafe`: non-Error rejections must
|
|
472
|
+
// not crash the telemetry helper, which would defeat the whole
|
|
473
|
+
// point of isolating the ledger write from the hot path.
|
|
474
|
+
log.debug(
|
|
475
|
+
`buffer[${params.bufferKey}]: surprise telemetry write failed, continuing: ${describeError(err)}`,
|
|
476
|
+
);
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/**
|
|
481
|
+
* Invoke the injected surprise probe defensively. Any error (probe throws,
|
|
482
|
+
* embedder unavailable, timeout) is swallowed and logged at debug: the
|
|
483
|
+
* surprise path must never crash the happy-path trigger evaluation. A
|
|
484
|
+
* `null` return indicates "no score available, fall through to existing
|
|
485
|
+
* triggers".
|
|
486
|
+
*/
|
|
487
|
+
private async computeSurpriseSafe(
|
|
488
|
+
bufferKey: string,
|
|
489
|
+
turn: BufferTurn,
|
|
490
|
+
priorTurns: readonly BufferTurn[],
|
|
491
|
+
): Promise<number | null> {
|
|
492
|
+
if (!this.surpriseProbe) return null;
|
|
493
|
+
try {
|
|
494
|
+
// Hard timeout around the probe so a hung embedder cannot stall
|
|
495
|
+
// `addTurn()` before `save()`. A slow probe would otherwise
|
|
496
|
+
// prevent the just-appended turn from ever being persisted. The
|
|
497
|
+
// timeout is a soft bound — we race it against the probe, take
|
|
498
|
+
// whichever settles first, and treat the timeout as
|
|
499
|
+
// "probe unavailable, fall through" rather than an error that
|
|
500
|
+
// surfaces to the caller.
|
|
501
|
+
const score = await probeWithTimeout(
|
|
502
|
+
this.surpriseProbe.scoreTurn(bufferKey, turn, priorTurns),
|
|
503
|
+
this.config.bufferSurpriseProbeTimeoutMs,
|
|
504
|
+
);
|
|
505
|
+
if (score === null) return null;
|
|
506
|
+
if (typeof score !== "number" || !Number.isFinite(score)) {
|
|
507
|
+
log.debug(
|
|
508
|
+
`buffer[${bufferKey}]: surprise probe returned non-finite score (${String(score)}), ignoring`,
|
|
509
|
+
);
|
|
510
|
+
return null;
|
|
511
|
+
}
|
|
512
|
+
// Defensive clamp: formula lives in buffer-surprise.ts, but we never
|
|
513
|
+
// want a misbehaving probe to inject an out-of-range value into the
|
|
514
|
+
// threshold comparison.
|
|
515
|
+
if (score < 0) return 0;
|
|
516
|
+
if (score > 1) return 1;
|
|
517
|
+
return score;
|
|
518
|
+
} catch (err) {
|
|
519
|
+
// `err` may be any thrown value — `throw null` and
|
|
520
|
+
// `Promise.reject("x")` are both legal. Accessing `.message` on a
|
|
521
|
+
// non-Error would itself throw and defeat the failure-isolation
|
|
522
|
+
// contract, so describe the value safely.
|
|
523
|
+
log.debug(
|
|
524
|
+
`buffer[${bufferKey}]: surprise probe failed, falling back to existing triggers: ${describeError(err)}`,
|
|
525
|
+
);
|
|
526
|
+
return null;
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
private evaluate(entry: BufferEntryState, signalLevel: SignalLevel): TriggerDecision {
|
|
531
|
+
if (this.config.triggerMode === "smart") {
|
|
532
|
+
if (signalLevel === "high") return "extract_now";
|
|
533
|
+
|
|
534
|
+
if (entry.turns.length >= this.config.bufferMaxTurns) {
|
|
535
|
+
return "extract_batch";
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
if (entry.lastExtractionAt) {
|
|
539
|
+
const elapsed =
|
|
540
|
+
Date.now() - new Date(entry.lastExtractionAt).getTime();
|
|
541
|
+
if (elapsed >= this.config.bufferMaxMinutes * 60_000) {
|
|
542
|
+
return "extract_batch";
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
return "keep_buffering";
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
if (this.config.triggerMode === "every_n") {
|
|
550
|
+
return entry.turns.length >= this.config.bufferMaxTurns
|
|
551
|
+
? "extract_batch"
|
|
552
|
+
: "keep_buffering";
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
if (this.config.triggerMode === "time_based") {
|
|
556
|
+
if (!entry.lastExtractionAt) {
|
|
557
|
+
return entry.turns.length >= this.config.bufferMaxTurns
|
|
558
|
+
? "extract_batch"
|
|
559
|
+
: "keep_buffering";
|
|
560
|
+
}
|
|
561
|
+
const elapsed =
|
|
562
|
+
Date.now() - new Date(entry.lastExtractionAt).getTime();
|
|
563
|
+
return elapsed >= this.config.bufferMaxMinutes * 60_000
|
|
564
|
+
? "extract_batch"
|
|
565
|
+
: "keep_buffering";
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
return "keep_buffering";
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
getTurns(bufferKey = "default"): BufferTurn[] {
|
|
572
|
+
const entry = this.peekEntry(bufferKey);
|
|
573
|
+
if (!entry) return [];
|
|
574
|
+
const retained = entry.retainedTurns ?? [];
|
|
575
|
+
// Retained turns (from a previous defer verdict, issue #562 PR 2) are
|
|
576
|
+
// prepended so the chronological order — oldest context first — is
|
|
577
|
+
// preserved for the next extraction pass.
|
|
578
|
+
return [...retained, ...entry.turns];
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
/**
|
|
582
|
+
* Retain a subset of the current turns across `clearAfterExtraction` so a
|
|
583
|
+
* future extraction pass sees the context behind a deferred candidate
|
|
584
|
+
* (issue #562, PR 2). Callers pass the turns that were seen during the
|
|
585
|
+
* current extraction; the buffer keeps the tail (latest `max` turns) as
|
|
586
|
+
* the retention window. Passing an empty array or `max <= 0` clears the
|
|
587
|
+
* retention slot instead.
|
|
588
|
+
*/
|
|
589
|
+
async retainDeferredTurns(
|
|
590
|
+
bufferKey: string,
|
|
591
|
+
turns: BufferTurn[],
|
|
592
|
+
max = 10,
|
|
593
|
+
): Promise<void> {
|
|
594
|
+
await this.enqueueMutation(async () => {
|
|
595
|
+
await this.loadUnlocked();
|
|
596
|
+
const entry = this.entryFor(bufferKey);
|
|
597
|
+
if (!Array.isArray(turns) || turns.length === 0 || max <= 0) {
|
|
598
|
+
delete entry.retainedTurns;
|
|
599
|
+
} else {
|
|
600
|
+
// Guard `slice(-max)` against `max === 0` (CLAUDE.md gotcha 27):
|
|
601
|
+
// `slice(-0)` equals `slice(0)` and would return ALL entries. We
|
|
602
|
+
// already early-return above when max <= 0.
|
|
603
|
+
const tail = turns.slice(-max);
|
|
604
|
+
// Copy explicit fields only — never spread an external object into a
|
|
605
|
+
// plain object because spread preserves any own `__proto__` /
|
|
606
|
+
// `constructor` keys that may have arrived via JSON deserialization
|
|
607
|
+
// of untrusted input (CodeQL js/prototype-polluting-assignment).
|
|
608
|
+
entry.retainedTurns = tail.map<BufferTurn>((t) => {
|
|
609
|
+
const copy: BufferTurn = {
|
|
610
|
+
role: t.role,
|
|
611
|
+
content: typeof t.content === "string" ? t.content : "",
|
|
612
|
+
timestamp:
|
|
613
|
+
typeof t.timestamp === "string"
|
|
614
|
+
? t.timestamp
|
|
615
|
+
: new Date().toISOString(),
|
|
616
|
+
};
|
|
617
|
+
if (typeof t.sessionKey === "string") copy.sessionKey = t.sessionKey;
|
|
618
|
+
if (typeof t.logicalSessionKey === "string") {
|
|
619
|
+
copy.logicalSessionKey = t.logicalSessionKey;
|
|
620
|
+
}
|
|
621
|
+
if (
|
|
622
|
+
t.providerThreadId === null ||
|
|
623
|
+
typeof t.providerThreadId === "string"
|
|
624
|
+
) {
|
|
625
|
+
copy.providerThreadId = t.providerThreadId;
|
|
626
|
+
}
|
|
627
|
+
if (typeof t.turnFingerprint === "string") {
|
|
628
|
+
copy.turnFingerprint = t.turnFingerprint;
|
|
629
|
+
}
|
|
630
|
+
if (typeof t.persistProcessedFingerprint === "boolean") {
|
|
631
|
+
copy.persistProcessedFingerprint = t.persistProcessedFingerprint;
|
|
632
|
+
}
|
|
633
|
+
return copy;
|
|
634
|
+
});
|
|
635
|
+
}
|
|
636
|
+
await this.saveUnlocked();
|
|
637
|
+
});
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
/**
|
|
641
|
+
* Return the current retention window (issue #562, PR 2). Primarily for
|
|
642
|
+
* tests and diagnostics.
|
|
643
|
+
*/
|
|
644
|
+
getRetainedDeferredTurns(bufferKey = "default"): BufferTurn[] {
|
|
645
|
+
const entry = this.peekEntry(bufferKey);
|
|
646
|
+
return entry?.retainedTurns ? [...entry.retainedTurns] : [];
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
async findBufferKeyForSession(sessionKey: string): Promise<string | null> {
|
|
650
|
+
const bufferKeys = await this.findBufferKeysForSession(sessionKey);
|
|
651
|
+
return bufferKeys[0] ?? null;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
async findBufferKeysForSession(sessionKey: string): Promise<string[]> {
|
|
655
|
+
if (typeof sessionKey !== "string" || sessionKey.length === 0) return [];
|
|
656
|
+
await this.mutationChain.catch(() => {});
|
|
657
|
+
await this.load();
|
|
658
|
+
|
|
659
|
+
const matches: string[] = [];
|
|
660
|
+
const directEntry = this.peekEntry(sessionKey);
|
|
661
|
+
if ((directEntry?.turns.length ?? 0) > 0) {
|
|
662
|
+
matches.push(sessionKey);
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
const entries = this.state.entries ?? {};
|
|
666
|
+
for (const [bufferKey, entry] of Object.entries(entries)) {
|
|
667
|
+
if (
|
|
668
|
+
!matches.includes(bufferKey) &&
|
|
669
|
+
entry.turns.some(
|
|
670
|
+
(turn) =>
|
|
671
|
+
typeof turn.sessionKey === "string" && turn.sessionKey === sessionKey,
|
|
672
|
+
)
|
|
673
|
+
) {
|
|
674
|
+
matches.push(bufferKey);
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
return matches;
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
async clearAfterExtraction(
|
|
682
|
+
bufferKey = "default",
|
|
683
|
+
extractedTurns?: readonly BufferTurn[],
|
|
684
|
+
): Promise<void> {
|
|
685
|
+
await this.enqueueMutation(async () => {
|
|
686
|
+
await this.loadUnlocked();
|
|
687
|
+
const entry = this.entryFor(bufferKey);
|
|
688
|
+
if (Array.isArray(extractedTurns)) {
|
|
689
|
+
const liveExtractedTurns = liveTurnsFromExtractionSnapshot(
|
|
690
|
+
entry,
|
|
691
|
+
extractedTurns,
|
|
692
|
+
);
|
|
693
|
+
let clearedLiveTurns = false;
|
|
694
|
+
if (liveExtractedTurns.length > 0) {
|
|
695
|
+
const matchedCount = matchingQueuedExtractionPrefixLength(
|
|
696
|
+
entry.turns,
|
|
697
|
+
liveExtractedTurns,
|
|
698
|
+
);
|
|
699
|
+
if (matchedCount > 0) {
|
|
700
|
+
entry.turns = entry.turns.slice(matchedCount);
|
|
701
|
+
clearedLiveTurns = true;
|
|
702
|
+
} else {
|
|
703
|
+
log.debug(
|
|
704
|
+
`buffer[${bufferKey}]: extraction clear skipped because live turns changed before clear`,
|
|
705
|
+
);
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
if (!clearedLiveTurns) {
|
|
709
|
+
await this.saveUnlocked();
|
|
710
|
+
return;
|
|
711
|
+
}
|
|
712
|
+
} else {
|
|
713
|
+
entry.turns = [];
|
|
714
|
+
}
|
|
715
|
+
entry.lastExtractionAt = new Date().toISOString();
|
|
716
|
+
entry.extractionCount += 1;
|
|
717
|
+
if (bufferKey === "default") {
|
|
718
|
+
this.state.turns = entry.turns;
|
|
719
|
+
this.state.lastExtractionAt = entry.lastExtractionAt;
|
|
720
|
+
this.state.extractionCount = entry.extractionCount;
|
|
721
|
+
}
|
|
722
|
+
this.pruneEntries([bufferKey]);
|
|
723
|
+
await this.saveUnlocked();
|
|
724
|
+
});
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
getExtractionCount(bufferKey = "default"): number {
|
|
728
|
+
return this.peekEntry(bufferKey)?.extractionCount ?? 0;
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
/**
|
|
732
|
+
* Await any pending `BUFFER_SURPRISE` telemetry writes.
|
|
733
|
+
*
|
|
734
|
+
* The telemetry path is fire-and-forget from the hot path's point of
|
|
735
|
+
* view, but tests and before-exit hooks sometimes need to make sure
|
|
736
|
+
* the ledger has been flushed before they assert on its contents or
|
|
737
|
+
* close the process. This method resolves once the current chain
|
|
738
|
+
* head has settled; new writes scheduled after this call return a
|
|
739
|
+
* separate, later settlement.
|
|
740
|
+
*
|
|
741
|
+
* Never throws — the chain already catches its own rejections.
|
|
742
|
+
*/
|
|
743
|
+
async flushSurpriseTelemetry(): Promise<void> {
|
|
744
|
+
await this.surpriseTelemetryWriteChain;
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
/**
|
|
749
|
+
* Render an arbitrary thrown value as a short string for debug logging.
|
|
750
|
+
*
|
|
751
|
+
* JavaScript permits throwing *any* value (`throw null`,
|
|
752
|
+
* `Promise.reject("x")`, `throw { reason: "timeout" }`) — not just
|
|
753
|
+
* `Error` instances. The defensive catch blocks in `SmartBuffer` must
|
|
754
|
+
* never themselves throw while trying to log the failure, or they
|
|
755
|
+
* would defeat the whole point of isolating the surprise path from the
|
|
756
|
+
* core extraction decision.
|
|
757
|
+
*/
|
|
758
|
+
function describeError(err: unknown): string {
|
|
759
|
+
if (err instanceof Error) return err.message;
|
|
760
|
+
if (err === null) return "null";
|
|
761
|
+
if (err === undefined) return "undefined";
|
|
762
|
+
if (typeof err === "string") return err;
|
|
763
|
+
try {
|
|
764
|
+
return JSON.stringify(err);
|
|
765
|
+
} catch {
|
|
766
|
+
return String(err);
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
|
|
770
|
+
function copyBufferTurn(turn: BufferTurn): BufferTurn {
|
|
771
|
+
const copy: BufferTurn = {
|
|
772
|
+
role: turn.role,
|
|
773
|
+
content: turn.content,
|
|
774
|
+
timestamp: turn.timestamp,
|
|
775
|
+
};
|
|
776
|
+
if (typeof turn.sessionKey === "string") copy.sessionKey = turn.sessionKey;
|
|
777
|
+
if (typeof turn.logicalSessionKey === "string") {
|
|
778
|
+
copy.logicalSessionKey = turn.logicalSessionKey;
|
|
779
|
+
}
|
|
780
|
+
if (
|
|
781
|
+
turn.providerThreadId === null ||
|
|
782
|
+
typeof turn.providerThreadId === "string"
|
|
783
|
+
) {
|
|
784
|
+
copy.providerThreadId = turn.providerThreadId;
|
|
785
|
+
}
|
|
786
|
+
if (typeof turn.turnFingerprint === "string") {
|
|
787
|
+
copy.turnFingerprint = turn.turnFingerprint;
|
|
788
|
+
}
|
|
789
|
+
if (typeof turn.persistProcessedFingerprint === "boolean") {
|
|
790
|
+
copy.persistProcessedFingerprint = turn.persistProcessedFingerprint;
|
|
791
|
+
}
|
|
792
|
+
return copy;
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
function bufferTurnsEqual(left: BufferTurn | undefined, right: BufferTurn): boolean {
|
|
796
|
+
if (!left) return false;
|
|
797
|
+
return (
|
|
798
|
+
left.role === right.role &&
|
|
799
|
+
left.content === right.content &&
|
|
800
|
+
left.timestamp === right.timestamp &&
|
|
801
|
+
left.sessionKey === right.sessionKey &&
|
|
802
|
+
left.logicalSessionKey === right.logicalSessionKey &&
|
|
803
|
+
left.providerThreadId === right.providerThreadId &&
|
|
804
|
+
left.turnFingerprint === right.turnFingerprint &&
|
|
805
|
+
left.persistProcessedFingerprint === right.persistProcessedFingerprint
|
|
806
|
+
);
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
function liveTurnsFromExtractionSnapshot(
|
|
810
|
+
entry: BufferEntryState,
|
|
811
|
+
extractedTurns: readonly BufferTurn[],
|
|
812
|
+
): readonly BufferTurn[] {
|
|
813
|
+
const retainedTurns = entry.retainedTurns ?? [];
|
|
814
|
+
if (
|
|
815
|
+
retainedTurns.length > 0 &&
|
|
816
|
+
extractedTurns.length >= retainedTurns.length &&
|
|
817
|
+
retainedTurns.every((turn, index) =>
|
|
818
|
+
bufferTurnsEqual(extractedTurns[index], turn),
|
|
819
|
+
)
|
|
820
|
+
) {
|
|
821
|
+
const withoutRetainedPrefix = extractedTurns.slice(retainedTurns.length);
|
|
822
|
+
if (
|
|
823
|
+
withoutRetainedPrefix.length > 0 &&
|
|
824
|
+
matchingPrefixLength(entry.turns, withoutRetainedPrefix) > 0
|
|
825
|
+
) {
|
|
826
|
+
return withoutRetainedPrefix;
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
return extractedTurns;
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
function matchingPrefixLength(
|
|
833
|
+
liveTurns: readonly BufferTurn[],
|
|
834
|
+
extractedTurns: readonly BufferTurn[],
|
|
835
|
+
): number {
|
|
836
|
+
let index = 0;
|
|
837
|
+
while (
|
|
838
|
+
index < liveTurns.length &&
|
|
839
|
+
index < extractedTurns.length &&
|
|
840
|
+
bufferTurnsEqual(liveTurns[index], extractedTurns[index])
|
|
841
|
+
) {
|
|
842
|
+
index += 1;
|
|
843
|
+
}
|
|
844
|
+
return index;
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
function matchingQueuedExtractionPrefixLength(
|
|
848
|
+
liveTurns: readonly BufferTurn[],
|
|
849
|
+
extractedTurns: readonly BufferTurn[],
|
|
850
|
+
): number {
|
|
851
|
+
let bestMatchedCount = 0;
|
|
852
|
+
for (let start = 0; start < extractedTurns.length; start += 1) {
|
|
853
|
+
const matchedCount = matchingPrefixLength(
|
|
854
|
+
liveTurns,
|
|
855
|
+
extractedTurns.slice(start),
|
|
856
|
+
);
|
|
857
|
+
if (matchedCount > bestMatchedCount) {
|
|
858
|
+
bestMatchedCount = matchedCount;
|
|
859
|
+
if (bestMatchedCount === liveTurns.length) break;
|
|
860
|
+
}
|
|
861
|
+
}
|
|
862
|
+
return bestMatchedCount;
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
/**
|
|
866
|
+
* Sentinel error class for the probe timeout path. Catching it via
|
|
867
|
+
* `instanceof` lets the buffer's surprise helper distinguish a timeout
|
|
868
|
+
* from a probe rejection (which could carry operational context the
|
|
869
|
+
* operator wants to see).
|
|
870
|
+
*/
|
|
871
|
+
class ProbeTimeoutError extends Error {
|
|
872
|
+
constructor(timeoutMs: number) {
|
|
873
|
+
super(`probe exceeded ${timeoutMs}ms`);
|
|
874
|
+
this.name = "ProbeTimeoutError";
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
|
|
878
|
+
/**
|
|
879
|
+
* Race `inflight` against a timeout clock. Resolves with `inflight`'s
|
|
880
|
+
* value if it settles first, otherwise rejects with `ProbeTimeoutError`.
|
|
881
|
+
* The timer is cleared in both branches so a fast-resolving probe does
|
|
882
|
+
* not leak a handle that would keep the Node event loop alive.
|
|
883
|
+
*/
|
|
884
|
+
function probeWithTimeout<T>(
|
|
885
|
+
inflight: Promise<T>,
|
|
886
|
+
timeoutMs: number,
|
|
887
|
+
): Promise<T> {
|
|
888
|
+
let timer: NodeJS.Timeout | null = null;
|
|
889
|
+
const timeout = new Promise<T>((_, reject) => {
|
|
890
|
+
timer = setTimeout(() => reject(new ProbeTimeoutError(timeoutMs)), timeoutMs);
|
|
891
|
+
// `.unref()` so the timer does not hold the event loop open if the
|
|
892
|
+
// caller decides the probe result is no longer interesting.
|
|
893
|
+
if (typeof (timer as NodeJS.Timeout).unref === "function") {
|
|
894
|
+
(timer as NodeJS.Timeout).unref();
|
|
895
|
+
}
|
|
896
|
+
});
|
|
897
|
+
return Promise.race([inflight, timeout]).finally(() => {
|
|
898
|
+
if (timer) clearTimeout(timer);
|
|
899
|
+
});
|
|
900
|
+
}
|