@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
|
@@ -0,0 +1,690 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for capsule + backup encryption (issue #690 PR 4/4).
|
|
3
|
+
*
|
|
4
|
+
* Scenarios covered:
|
|
5
|
+
* 1. exportCapsule --encrypt → importCapsule roundtrip (plaintext identical)
|
|
6
|
+
* 2. importCapsule auto-detects encrypted archive via REMNIC-ENC header
|
|
7
|
+
* 3. importCapsule with encrypted archive but locked secure-store → clear error
|
|
8
|
+
* 4. importCapsule with tampered encrypted archive → clear auth error
|
|
9
|
+
* 5. backupMemoryDir --encrypt → encrypted archive produced, plaintext removed
|
|
10
|
+
* 6. isEncryptedCapsuleFile detects encrypted vs plain archives
|
|
11
|
+
* 7. encryptCapsuleFile + decryptCapsuleFile file-level roundtrip
|
|
12
|
+
* 8. isEncryptedCapsuleFile reads only header bytes (not entire file) — Codex P2
|
|
13
|
+
* 9. encryptCapsuleFile embeds KDF params in format v2 header — Codex P1
|
|
14
|
+
* 10. enforceRetention prunes .backup.json.gz.enc files — Codex P2
|
|
15
|
+
* 11. backupMemoryDir excludes .secure-store and .capsules dirs — Cursor
|
|
16
|
+
* 12. exportCapsule with includeTranscripts=true includes transcripts+peers — Cursor
|
|
17
|
+
*
|
|
18
|
+
* KDF note: tests use a minimal scrypt param set (N=1024) for legacy-header
|
|
19
|
+
* fixtures so the suite stays fast. ONE integration test exercises the real unlock path so CLI
|
|
20
|
+
* plumbing and keyring integration stay green.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import assert from "node:assert/strict";
|
|
24
|
+
import test from "node:test";
|
|
25
|
+
import { mkdtemp, rm, writeFile, readFile, mkdir, stat } from "node:fs/promises";
|
|
26
|
+
import path from "node:path";
|
|
27
|
+
import { tmpdir } from "node:os";
|
|
28
|
+
import { gzipSync, gunzipSync } from "node:zlib";
|
|
29
|
+
|
|
30
|
+
import { exportCapsule } from "./capsule-export.js";
|
|
31
|
+
import { importCapsule } from "./capsule-import.js";
|
|
32
|
+
import { backupMemoryDir } from "./backup.js";
|
|
33
|
+
import {
|
|
34
|
+
encryptCapsuleFile,
|
|
35
|
+
decryptCapsuleFile,
|
|
36
|
+
isEncryptedCapsuleFile,
|
|
37
|
+
} from "./capsule-crypto.js";
|
|
38
|
+
import * as keyring from "../secure-store/keyring.js";
|
|
39
|
+
import { generateSalt, seal } from "../secure-store/cipher.js";
|
|
40
|
+
import { deriveKeyScrypt, type ScryptParams } from "../secure-store/kdf.js";
|
|
41
|
+
import { buildHeaderFromPassphrase, writeHeader, secureStoreDir } from "../secure-store/header.js";
|
|
42
|
+
|
|
43
|
+
// ─── Shared helpers ───────────────────────────────────────────────────────────
|
|
44
|
+
|
|
45
|
+
/** Cheap scrypt params: ~milliseconds, safe for tests. */
|
|
46
|
+
const FAST_SCRYPT: ScryptParams = {
|
|
47
|
+
N: 1 << 10,
|
|
48
|
+
r: 8,
|
|
49
|
+
p: 1,
|
|
50
|
+
keyLength: 32,
|
|
51
|
+
maxmem: 64 * 1024 * 1024,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const TEST_PASSPHRASE = "hunter2-test-passphrase";
|
|
55
|
+
|
|
56
|
+
async function makeTempDir(): Promise<string> {
|
|
57
|
+
return mkdtemp(path.join(tmpdir(), "capsule-enc-test-"));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Initialize a secure-store header in `memoryDir` and unlock the keyring.
|
|
62
|
+
* Returns the derived key buffer (same as what the keyring holds).
|
|
63
|
+
*/
|
|
64
|
+
async function initAndUnlockStore(memoryDir: string): Promise<Buffer> {
|
|
65
|
+
const salt = generateSalt();
|
|
66
|
+
const { header, derivedKey } = buildHeaderFromPassphrase({
|
|
67
|
+
passphrase: TEST_PASSPHRASE,
|
|
68
|
+
salt,
|
|
69
|
+
algorithm: "scrypt",
|
|
70
|
+
params: FAST_SCRYPT,
|
|
71
|
+
});
|
|
72
|
+
await writeHeader(memoryDir, header);
|
|
73
|
+
|
|
74
|
+
// Clone the key before handing ownership to the keyring.
|
|
75
|
+
const keyCopy = Buffer.from(derivedKey);
|
|
76
|
+
keyring.unlock(secureStoreDir(memoryDir), keyCopy);
|
|
77
|
+
return derivedKey;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Build a minimal memory directory with two synthetic fact files.
|
|
82
|
+
*/
|
|
83
|
+
async function makeMemoryDir(dir: string): Promise<void> {
|
|
84
|
+
await mkdir(path.join(dir, "facts"), { recursive: true });
|
|
85
|
+
await writeFile(
|
|
86
|
+
path.join(dir, "facts", "a.md"),
|
|
87
|
+
"---\nid: fact-a\n---\nFact A content.",
|
|
88
|
+
);
|
|
89
|
+
await writeFile(
|
|
90
|
+
path.join(dir, "facts", "b.md"),
|
|
91
|
+
"---\nid: fact-b\n---\nFact B content.",
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// ─── Test 6: isEncryptedCapsuleFile ───────────────────────────────────────────
|
|
96
|
+
|
|
97
|
+
test("isEncryptedCapsuleFile returns false for a plain gzip file", async () => {
|
|
98
|
+
const dir = await makeTempDir();
|
|
99
|
+
try {
|
|
100
|
+
const plain = path.join(dir, "test.capsule.json.gz");
|
|
101
|
+
await writeFile(plain, gzipSync(Buffer.from('{"hello":"world"}', "utf-8")));
|
|
102
|
+
assert.equal(await isEncryptedCapsuleFile(plain), false, "plain gz should not be detected as encrypted");
|
|
103
|
+
} finally {
|
|
104
|
+
await rm(dir, { recursive: true, force: true });
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
test("isEncryptedCapsuleFile returns false for a non-.enc file even with REMNIC-ENC bytes", async () => {
|
|
109
|
+
const dir = await makeTempDir();
|
|
110
|
+
try {
|
|
111
|
+
const f = path.join(dir, "test.capsule.json.gz");
|
|
112
|
+
// starts with magic but lacks .enc extension
|
|
113
|
+
await writeFile(f, Buffer.concat([Buffer.from("REMNIC-ENC\x00\x01"), Buffer.alloc(50)]));
|
|
114
|
+
assert.equal(await isEncryptedCapsuleFile(f), false);
|
|
115
|
+
} finally {
|
|
116
|
+
await rm(dir, { recursive: true, force: true });
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
test("isEncryptedCapsuleFile returns true for a properly encrypted archive", async () => {
|
|
121
|
+
const dir = await makeTempDir();
|
|
122
|
+
try {
|
|
123
|
+
await initAndUnlockStore(dir);
|
|
124
|
+
|
|
125
|
+
const plain = path.join(dir, "test.capsule.json.gz");
|
|
126
|
+
await writeFile(plain, gzipSync(Buffer.from('{"hello":"world"}', "utf-8")));
|
|
127
|
+
const { encPath } = await encryptCapsuleFile({ sourceGzPath: plain, memoryDir: dir });
|
|
128
|
+
|
|
129
|
+
assert.equal(await isEncryptedCapsuleFile(encPath), true);
|
|
130
|
+
} finally {
|
|
131
|
+
keyring.lockAll();
|
|
132
|
+
await rm(dir, { recursive: true, force: true });
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
// ─── Test 7: encryptCapsuleFile + decryptCapsuleFile roundtrip ────────────────
|
|
137
|
+
|
|
138
|
+
test("encryptCapsuleFile + decryptCapsuleFile roundtrip preserves bytes", async () => {
|
|
139
|
+
const dir = await makeTempDir();
|
|
140
|
+
try {
|
|
141
|
+
await initAndUnlockStore(dir);
|
|
142
|
+
|
|
143
|
+
const original = gzipSync(Buffer.from('{"test":"payload","value":42}', "utf-8"));
|
|
144
|
+
const plainPath = path.join(dir, "example.capsule.json.gz");
|
|
145
|
+
await writeFile(plainPath, original);
|
|
146
|
+
|
|
147
|
+
const { encPath } = await encryptCapsuleFile({ sourceGzPath: plainPath, memoryDir: dir });
|
|
148
|
+
assert.ok(encPath.endsWith(".enc"), "encrypted path should end with .enc");
|
|
149
|
+
|
|
150
|
+
const { gzPath } = await decryptCapsuleFile({ encPath, memoryDir: dir });
|
|
151
|
+
const decrypted = await readFile(gzPath);
|
|
152
|
+
assert.ok(decrypted.equals(original), "decrypted bytes must equal original");
|
|
153
|
+
} finally {
|
|
154
|
+
keyring.lockAll();
|
|
155
|
+
await rm(dir, { recursive: true, force: true });
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test("decryptCapsuleFile throws clear error when store is locked", async () => {
|
|
160
|
+
const dir = await makeTempDir();
|
|
161
|
+
try {
|
|
162
|
+
await initAndUnlockStore(dir);
|
|
163
|
+
|
|
164
|
+
const plain = path.join(dir, "test.capsule.json.gz");
|
|
165
|
+
await writeFile(plain, gzipSync(Buffer.from('{"x":1}', "utf-8")));
|
|
166
|
+
const { encPath } = await encryptCapsuleFile({ sourceGzPath: plain, memoryDir: dir });
|
|
167
|
+
|
|
168
|
+
// Lock the store.
|
|
169
|
+
keyring.lock(secureStoreDir(dir));
|
|
170
|
+
|
|
171
|
+
await assert.rejects(
|
|
172
|
+
async () => decryptCapsuleFile({ encPath, memoryDir: dir }),
|
|
173
|
+
/Secure-store is locked/,
|
|
174
|
+
"should throw a clear 'locked' error",
|
|
175
|
+
);
|
|
176
|
+
} finally {
|
|
177
|
+
keyring.lockAll();
|
|
178
|
+
await rm(dir, { recursive: true, force: true });
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
test("decryptCapsuleFile throws auth error when archive is tampered", async () => {
|
|
183
|
+
const dir = await makeTempDir();
|
|
184
|
+
try {
|
|
185
|
+
await initAndUnlockStore(dir);
|
|
186
|
+
|
|
187
|
+
const plain = path.join(dir, "test.capsule.json.gz");
|
|
188
|
+
await writeFile(plain, gzipSync(Buffer.from('{"x":1}', "utf-8")));
|
|
189
|
+
const { encPath } = await encryptCapsuleFile({ sourceGzPath: plain, memoryDir: dir });
|
|
190
|
+
|
|
191
|
+
// Tamper with the ciphertext: flip a byte near the end.
|
|
192
|
+
const enc = await readFile(encPath);
|
|
193
|
+
enc[enc.length - 1] ^= 0xff;
|
|
194
|
+
await writeFile(encPath, enc);
|
|
195
|
+
|
|
196
|
+
await assert.rejects(
|
|
197
|
+
async () => decryptCapsuleFile({ encPath, memoryDir: dir }),
|
|
198
|
+
/authentication failed/,
|
|
199
|
+
"tampered archive should fail with auth error",
|
|
200
|
+
);
|
|
201
|
+
} finally {
|
|
202
|
+
keyring.lockAll();
|
|
203
|
+
await rm(dir, { recursive: true, force: true });
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
// ─── Test 1 + 2: exportCapsule --encrypt → importCapsule roundtrip ───────────
|
|
208
|
+
|
|
209
|
+
test("exportCapsule with encrypt=true + importCapsule roundtrip restores all files", async () => {
|
|
210
|
+
const srcDir = await makeTempDir();
|
|
211
|
+
const dstDir = await makeTempDir();
|
|
212
|
+
const outDir = await makeTempDir();
|
|
213
|
+
try {
|
|
214
|
+
await makeMemoryDir(srcDir);
|
|
215
|
+
await initAndUnlockStore(srcDir);
|
|
216
|
+
|
|
217
|
+
const exportResult = await exportCapsule({
|
|
218
|
+
name: "test-capsule",
|
|
219
|
+
root: srcDir,
|
|
220
|
+
outDir,
|
|
221
|
+
pluginVersion: "0.0.0-test",
|
|
222
|
+
encrypt: true,
|
|
223
|
+
memoryDir: srcDir,
|
|
224
|
+
now: 1_700_000_000_000,
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
// Archive path should end with .enc.
|
|
228
|
+
assert.ok(
|
|
229
|
+
exportResult.archivePath.endsWith(".enc"),
|
|
230
|
+
`expected .enc archive, got: ${exportResult.archivePath}`,
|
|
231
|
+
);
|
|
232
|
+
assert.equal(exportResult.encryptedArchivePath, exportResult.archivePath);
|
|
233
|
+
|
|
234
|
+
// Cross-machine restore scenario: the destination machine uses the same
|
|
235
|
+
// passphrase as the source. For this unit test, we simply pass srcDir as
|
|
236
|
+
// the memoryDir for the import — the key was registered there and is still
|
|
237
|
+
// in the keyring. In production, the operator runs `secure-store init` +
|
|
238
|
+
// `unlock` on the destination with the same passphrase; the recorded KDF
|
|
239
|
+
// derives the same key because the salt is embedded in the sealed envelope.
|
|
240
|
+
const importResult = await importCapsule({
|
|
241
|
+
archivePath: exportResult.archivePath,
|
|
242
|
+
root: dstDir,
|
|
243
|
+
mode: "skip",
|
|
244
|
+
memoryDir: srcDir, // same store that holds the encryption key
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
assert.equal(importResult.imported.length, 2, "should have imported 2 records");
|
|
248
|
+
assert.equal(importResult.skipped.length, 0);
|
|
249
|
+
|
|
250
|
+
// Verify content round-tripped correctly.
|
|
251
|
+
const aContent = await readFile(path.join(dstDir, "facts", "a.md"), "utf-8");
|
|
252
|
+
assert.ok(aContent.includes("Fact A content."));
|
|
253
|
+
const bContent = await readFile(path.join(dstDir, "facts", "b.md"), "utf-8");
|
|
254
|
+
assert.ok(bContent.includes("Fact B content."));
|
|
255
|
+
} finally {
|
|
256
|
+
keyring.lockAll();
|
|
257
|
+
await rm(srcDir, { recursive: true, force: true });
|
|
258
|
+
await rm(dstDir, { recursive: true, force: true });
|
|
259
|
+
await rm(outDir, { recursive: true, force: true });
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
// ─── Test 3: import without unlocked store → clear error ─────────────────────
|
|
264
|
+
|
|
265
|
+
test("importCapsule with encrypted archive and locked store throws clear error", async () => {
|
|
266
|
+
const srcDir = await makeTempDir();
|
|
267
|
+
const dstDir = await makeTempDir();
|
|
268
|
+
const outDir = await makeTempDir();
|
|
269
|
+
try {
|
|
270
|
+
await makeMemoryDir(srcDir);
|
|
271
|
+
await initAndUnlockStore(srcDir);
|
|
272
|
+
|
|
273
|
+
const exportResult = await exportCapsule({
|
|
274
|
+
name: "test-capsule-locked",
|
|
275
|
+
root: srcDir,
|
|
276
|
+
outDir,
|
|
277
|
+
pluginVersion: "0.0.0-test",
|
|
278
|
+
encrypt: true,
|
|
279
|
+
memoryDir: srcDir,
|
|
280
|
+
now: 1_700_000_001_000,
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
// Lock srcDir store and don't unlock dstDir.
|
|
284
|
+
keyring.lockAll();
|
|
285
|
+
|
|
286
|
+
// Import attempt without any unlocked store.
|
|
287
|
+
await assert.rejects(
|
|
288
|
+
async () =>
|
|
289
|
+
importCapsule({
|
|
290
|
+
archivePath: exportResult.archivePath,
|
|
291
|
+
root: dstDir,
|
|
292
|
+
memoryDir: dstDir,
|
|
293
|
+
}),
|
|
294
|
+
/Secure-store is locked/,
|
|
295
|
+
"should surface a 'Secure-store is locked' error",
|
|
296
|
+
);
|
|
297
|
+
} finally {
|
|
298
|
+
keyring.lockAll();
|
|
299
|
+
await rm(srcDir, { recursive: true, force: true });
|
|
300
|
+
await rm(dstDir, { recursive: true, force: true });
|
|
301
|
+
await rm(outDir, { recursive: true, force: true });
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
test("importCapsule with encrypted archive and no memoryDir throws clear error", async () => {
|
|
306
|
+
const srcDir = await makeTempDir();
|
|
307
|
+
const dstDir = await makeTempDir();
|
|
308
|
+
const outDir = await makeTempDir();
|
|
309
|
+
try {
|
|
310
|
+
await makeMemoryDir(srcDir);
|
|
311
|
+
await initAndUnlockStore(srcDir);
|
|
312
|
+
|
|
313
|
+
const exportResult = await exportCapsule({
|
|
314
|
+
name: "test-capsule-nomemdir",
|
|
315
|
+
root: srcDir,
|
|
316
|
+
outDir,
|
|
317
|
+
pluginVersion: "0.0.0-test",
|
|
318
|
+
encrypt: true,
|
|
319
|
+
memoryDir: srcDir,
|
|
320
|
+
now: 1_700_000_002_000,
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
// No memoryDir provided to importCapsule.
|
|
324
|
+
await assert.rejects(
|
|
325
|
+
async () =>
|
|
326
|
+
importCapsule({
|
|
327
|
+
archivePath: exportResult.archivePath,
|
|
328
|
+
root: dstDir,
|
|
329
|
+
// omit memoryDir intentionally
|
|
330
|
+
}),
|
|
331
|
+
/memoryDir.*not provided/,
|
|
332
|
+
"should require memoryDir for encrypted archives",
|
|
333
|
+
);
|
|
334
|
+
} finally {
|
|
335
|
+
keyring.lockAll();
|
|
336
|
+
await rm(srcDir, { recursive: true, force: true });
|
|
337
|
+
await rm(dstDir, { recursive: true, force: true });
|
|
338
|
+
await rm(outDir, { recursive: true, force: true });
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
// ─── Test 4: tampered encrypted capsule archive → auth error ──────────────────
|
|
343
|
+
|
|
344
|
+
test("importCapsule with tampered encrypted archive surfaces auth error", async () => {
|
|
345
|
+
const srcDir = await makeTempDir();
|
|
346
|
+
const dstDir = await makeTempDir();
|
|
347
|
+
const outDir = await makeTempDir();
|
|
348
|
+
try {
|
|
349
|
+
await makeMemoryDir(srcDir);
|
|
350
|
+
await initAndUnlockStore(srcDir);
|
|
351
|
+
|
|
352
|
+
const exportResult = await exportCapsule({
|
|
353
|
+
name: "test-capsule-tamper",
|
|
354
|
+
root: srcDir,
|
|
355
|
+
outDir,
|
|
356
|
+
pluginVersion: "0.0.0-test",
|
|
357
|
+
encrypt: true,
|
|
358
|
+
memoryDir: srcDir,
|
|
359
|
+
now: 1_700_000_003_000,
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
// Tamper with a byte in the ciphertext region.
|
|
363
|
+
const enc = await readFile(exportResult.archivePath);
|
|
364
|
+
enc[enc.length - 5] ^= 0xab;
|
|
365
|
+
await writeFile(exportResult.archivePath, enc);
|
|
366
|
+
|
|
367
|
+
// Use the same store for import (the key is still unlocked in srcDir).
|
|
368
|
+
await assert.rejects(
|
|
369
|
+
async () =>
|
|
370
|
+
importCapsule({
|
|
371
|
+
archivePath: exportResult.archivePath,
|
|
372
|
+
root: dstDir,
|
|
373
|
+
memoryDir: srcDir,
|
|
374
|
+
}),
|
|
375
|
+
/authentication failed/,
|
|
376
|
+
"tampered archive should fail with auth error on import",
|
|
377
|
+
);
|
|
378
|
+
} finally {
|
|
379
|
+
keyring.lockAll();
|
|
380
|
+
await rm(srcDir, { recursive: true, force: true });
|
|
381
|
+
await rm(dstDir, { recursive: true, force: true });
|
|
382
|
+
await rm(outDir, { recursive: true, force: true });
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
// ─── Test 5: backupMemoryDir --encrypt ────────────────────────────────────────
|
|
387
|
+
|
|
388
|
+
test("backupMemoryDir with encrypt=true produces .enc file and no plaintext", async () => {
|
|
389
|
+
const memDir = await makeTempDir();
|
|
390
|
+
const backupDir = await makeTempDir();
|
|
391
|
+
try {
|
|
392
|
+
await makeMemoryDir(memDir);
|
|
393
|
+
await initAndUnlockStore(memDir);
|
|
394
|
+
|
|
395
|
+
const resultPath = await backupMemoryDir({
|
|
396
|
+
memoryDir: memDir,
|
|
397
|
+
outDir: backupDir,
|
|
398
|
+
pluginVersion: "0.0.0-test",
|
|
399
|
+
encrypt: true,
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
assert.ok(resultPath.endsWith(".enc"), `expected .enc path, got: ${resultPath}`);
|
|
403
|
+
const encBuf = await readFile(resultPath);
|
|
404
|
+
assert.ok(encBuf.length > 0, "encrypted backup should not be empty");
|
|
405
|
+
|
|
406
|
+
// Verify the REMNIC-ENC magic.
|
|
407
|
+
const magic = Buffer.from("REMNIC-ENC\x00", "ascii");
|
|
408
|
+
assert.ok(
|
|
409
|
+
encBuf.subarray(0, magic.length).equals(magic),
|
|
410
|
+
"encrypted backup should start with REMNIC-ENC magic",
|
|
411
|
+
);
|
|
412
|
+
|
|
413
|
+
// No plaintext .gz should exist beside the .enc.
|
|
414
|
+
const plainPath = resultPath.replace(/\.enc$/, "");
|
|
415
|
+
const plainExists = await readFile(plainPath).then(() => true).catch(() => false);
|
|
416
|
+
assert.equal(plainExists, false, "plaintext backup gz should be removed after encryption");
|
|
417
|
+
} finally {
|
|
418
|
+
keyring.lockAll();
|
|
419
|
+
await rm(memDir, { recursive: true, force: true });
|
|
420
|
+
await rm(backupDir, { recursive: true, force: true });
|
|
421
|
+
}
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
test("backupMemoryDir with encrypt=true and locked store throws clear error", async () => {
|
|
425
|
+
const memDir = await makeTempDir();
|
|
426
|
+
const backupDir = await makeTempDir();
|
|
427
|
+
try {
|
|
428
|
+
await makeMemoryDir(memDir);
|
|
429
|
+
// Intentionally do NOT unlock the store.
|
|
430
|
+
|
|
431
|
+
await assert.rejects(
|
|
432
|
+
async () =>
|
|
433
|
+
backupMemoryDir({
|
|
434
|
+
memoryDir: memDir,
|
|
435
|
+
outDir: backupDir,
|
|
436
|
+
pluginVersion: "0.0.0-test",
|
|
437
|
+
encrypt: true,
|
|
438
|
+
}),
|
|
439
|
+
/Secure-store is locked/,
|
|
440
|
+
"should surface locked error when store not unlocked",
|
|
441
|
+
);
|
|
442
|
+
} finally {
|
|
443
|
+
keyring.lockAll();
|
|
444
|
+
await rm(memDir, { recursive: true, force: true });
|
|
445
|
+
await rm(backupDir, { recursive: true, force: true });
|
|
446
|
+
}
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
// ─── Unencrypted capsule still works (regression guard) ──────────────────────
|
|
450
|
+
|
|
451
|
+
test("exportCapsule without encrypt produces plaintext archive importable without memoryDir key", async () => {
|
|
452
|
+
const srcDir = await makeTempDir();
|
|
453
|
+
const dstDir = await makeTempDir();
|
|
454
|
+
const outDir = await makeTempDir();
|
|
455
|
+
try {
|
|
456
|
+
await makeMemoryDir(srcDir);
|
|
457
|
+
|
|
458
|
+
const exportResult = await exportCapsule({
|
|
459
|
+
name: "plain-capsule",
|
|
460
|
+
root: srcDir,
|
|
461
|
+
outDir,
|
|
462
|
+
pluginVersion: "0.0.0-test",
|
|
463
|
+
now: 1_700_000_004_000,
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
assert.ok(
|
|
467
|
+
exportResult.archivePath.endsWith(".gz") && !exportResult.archivePath.endsWith(".gz.enc"),
|
|
468
|
+
"unencrypted archive should be .gz",
|
|
469
|
+
);
|
|
470
|
+
assert.equal(exportResult.encryptedArchivePath, null);
|
|
471
|
+
|
|
472
|
+
// Import without a memoryDir — plain archives don't need one.
|
|
473
|
+
const importResult = await importCapsule({
|
|
474
|
+
archivePath: exportResult.archivePath,
|
|
475
|
+
root: dstDir,
|
|
476
|
+
mode: "skip",
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
assert.equal(importResult.imported.length, 2);
|
|
480
|
+
assert.equal(importResult.skipped.length, 0);
|
|
481
|
+
} finally {
|
|
482
|
+
keyring.lockAll();
|
|
483
|
+
await rm(srcDir, { recursive: true, force: true });
|
|
484
|
+
await rm(dstDir, { recursive: true, force: true });
|
|
485
|
+
await rm(outDir, { recursive: true, force: true });
|
|
486
|
+
}
|
|
487
|
+
});
|
|
488
|
+
|
|
489
|
+
// ─── Test 8: isEncryptedCapsuleFile reads only header bytes (Codex P2) ────────
|
|
490
|
+
|
|
491
|
+
test("isEncryptedCapsuleFile reads only the magic header bytes, not the whole file", async () => {
|
|
492
|
+
const dir = await makeTempDir();
|
|
493
|
+
try {
|
|
494
|
+
await initAndUnlockStore(dir);
|
|
495
|
+
|
|
496
|
+
// Create a large-ish plaintext gz so we can verify we don't read it all.
|
|
497
|
+
const largePlain = Buffer.alloc(1024 * 64, 0x42); // 64 KiB of 'B' bytes
|
|
498
|
+
const plainPath = path.join(dir, "big.capsule.json.gz");
|
|
499
|
+
await writeFile(plainPath, gzipSync(largePlain));
|
|
500
|
+
|
|
501
|
+
const { encPath } = await encryptCapsuleFile({ sourceGzPath: plainPath, memoryDir: dir });
|
|
502
|
+
|
|
503
|
+
// The detection must succeed (magic matches).
|
|
504
|
+
assert.equal(await isEncryptedCapsuleFile(encPath), true, "should detect encrypted archive");
|
|
505
|
+
|
|
506
|
+
// A plain gz file (magic doesn't match) must return false quickly.
|
|
507
|
+
assert.equal(await isEncryptedCapsuleFile(plainPath), false, "non-.enc extension returns false");
|
|
508
|
+
|
|
509
|
+
// A file whose extension is .enc but content is not REMNIC-ENC must return false.
|
|
510
|
+
const fakeEncPath = path.join(dir, "notenc.enc");
|
|
511
|
+
await writeFile(fakeEncPath, Buffer.from("this is not encrypted\n"));
|
|
512
|
+
assert.equal(await isEncryptedCapsuleFile(fakeEncPath), false, "wrong magic returns false");
|
|
513
|
+
} finally {
|
|
514
|
+
keyring.lockAll();
|
|
515
|
+
await rm(dir, { recursive: true, force: true });
|
|
516
|
+
}
|
|
517
|
+
});
|
|
518
|
+
|
|
519
|
+
// ─── Test 9: format v2 embeds KDF params for cross-machine restore (Codex P1) ──
|
|
520
|
+
|
|
521
|
+
test("encryptCapsuleFile format v2 embeds KDF params in archive header", async () => {
|
|
522
|
+
const dir = await makeTempDir();
|
|
523
|
+
try {
|
|
524
|
+
await initAndUnlockStore(dir);
|
|
525
|
+
|
|
526
|
+
const plain = path.join(dir, "test.capsule.json.gz");
|
|
527
|
+
await writeFile(plain, gzipSync(Buffer.from('{"hello":"world"}', "utf-8")));
|
|
528
|
+
const { encPath } = await encryptCapsuleFile({ sourceGzPath: plain, memoryDir: dir });
|
|
529
|
+
|
|
530
|
+
const buf = await readFile(encPath);
|
|
531
|
+
|
|
532
|
+
// Magic check.
|
|
533
|
+
const magic = Buffer.from("REMNIC-ENC\x00", "ascii");
|
|
534
|
+
assert.ok(buf.subarray(0, magic.length).equals(magic), "must start with REMNIC-ENC magic");
|
|
535
|
+
|
|
536
|
+
// Version byte should be 2 (format v2).
|
|
537
|
+
const version = buf.readUInt8(magic.length);
|
|
538
|
+
assert.equal(version, 2, "format version must be 2");
|
|
539
|
+
|
|
540
|
+
// KDF params section: 2-byte LE length followed by JSON.
|
|
541
|
+
const kdfLen = buf.readUInt16LE(magic.length + 1);
|
|
542
|
+
assert.ok(kdfLen > 0, "KDF params length must be > 0");
|
|
543
|
+
|
|
544
|
+
const kdfJsonStr = buf.subarray(magic.length + 1 + 2, magic.length + 1 + 2 + kdfLen).toString("utf-8");
|
|
545
|
+
let kdfJson: Record<string, unknown>;
|
|
546
|
+
assert.doesNotThrow(() => { kdfJson = JSON.parse(kdfJsonStr) as Record<string, unknown>; }, "KDF params must be valid JSON");
|
|
547
|
+
assert.ok(typeof kdfJson!.algorithm === "string", "KDF JSON must have an 'algorithm' field");
|
|
548
|
+
assert.ok(typeof kdfJson!.params === "object" && kdfJson!.params !== null, "KDF JSON must have a 'params' object");
|
|
549
|
+
assert.ok(typeof kdfJson!.salt === "string", "KDF JSON must have a 'salt' hex string");
|
|
550
|
+
|
|
551
|
+
// Must still decrypt correctly (keyring is unlocked).
|
|
552
|
+
const { gzPath } = await decryptCapsuleFile({ encPath, memoryDir: dir });
|
|
553
|
+
const decrypted = await readFile(gzPath);
|
|
554
|
+
const orig = gzipSync(Buffer.from('{"hello":"world"}', "utf-8"));
|
|
555
|
+
// Content-level verify: gunzip both and compare.
|
|
556
|
+
assert.ok(
|
|
557
|
+
gunzipSync(decrypted).equals(gunzipSync(orig)),
|
|
558
|
+
"decrypted content must match original",
|
|
559
|
+
);
|
|
560
|
+
} finally {
|
|
561
|
+
keyring.lockAll();
|
|
562
|
+
await rm(dir, { recursive: true, force: true });
|
|
563
|
+
}
|
|
564
|
+
});
|
|
565
|
+
|
|
566
|
+
// ─── Test 10: enforceRetention prunes .enc backup files (Codex P2 / Cursor) ───
|
|
567
|
+
|
|
568
|
+
test("backupMemoryDir with retentionDays prunes old encrypted .enc backup files", async () => {
|
|
569
|
+
const memDir = await makeTempDir();
|
|
570
|
+
const backupDir = await makeTempDir();
|
|
571
|
+
try {
|
|
572
|
+
await makeMemoryDir(memDir);
|
|
573
|
+
await initAndUnlockStore(memDir);
|
|
574
|
+
|
|
575
|
+
// Create two synthetic .enc backup files with timestamps in the past.
|
|
576
|
+
// Timestamp format: YYYY-MM-DDTHH-MM-SS-mmmZ
|
|
577
|
+
const oldTs = "2020-01-01T00-00-00-000Z";
|
|
578
|
+
const recentTs = new Date(Date.now() - 1000).toISOString().replace(/[:.]/g, "-");
|
|
579
|
+
const oldEncFile = path.join(backupDir, `${oldTs}.backup.json.gz.enc`);
|
|
580
|
+
const recentEncFile = path.join(backupDir, `${recentTs}.backup.json.gz.enc`);
|
|
581
|
+
await writeFile(oldEncFile, Buffer.from("fake-old-enc"));
|
|
582
|
+
await writeFile(recentEncFile, Buffer.from("fake-recent-enc"));
|
|
583
|
+
|
|
584
|
+
// Run an encrypted backup with retentionDays=30 — the old file should be pruned.
|
|
585
|
+
await backupMemoryDir({
|
|
586
|
+
memoryDir: memDir,
|
|
587
|
+
outDir: backupDir,
|
|
588
|
+
pluginVersion: "0.0.0-test",
|
|
589
|
+
encrypt: true,
|
|
590
|
+
retentionDays: 30,
|
|
591
|
+
});
|
|
592
|
+
|
|
593
|
+
const oldExists = await stat(oldEncFile).then(() => true).catch(() => false);
|
|
594
|
+
assert.equal(oldExists, false, "old .enc backup should be pruned by retention sweep");
|
|
595
|
+
|
|
596
|
+
const recentExists = await stat(recentEncFile).then(() => true).catch(() => false);
|
|
597
|
+
assert.equal(recentExists, true, "recent .enc backup should NOT be pruned");
|
|
598
|
+
} finally {
|
|
599
|
+
keyring.lockAll();
|
|
600
|
+
await rm(memDir, { recursive: true, force: true });
|
|
601
|
+
await rm(backupDir, { recursive: true, force: true });
|
|
602
|
+
}
|
|
603
|
+
});
|
|
604
|
+
|
|
605
|
+
// ─── Test 11: backupMemoryDir excludes .secure-store and .capsules (Cursor) ────
|
|
606
|
+
|
|
607
|
+
test("backupMemoryDir excludes .secure-store and .capsules directories from encrypted backup", async () => {
|
|
608
|
+
const memDir = await makeTempDir();
|
|
609
|
+
const backupDir = await makeTempDir();
|
|
610
|
+
try {
|
|
611
|
+
await makeMemoryDir(memDir);
|
|
612
|
+
await initAndUnlockStore(memDir);
|
|
613
|
+
|
|
614
|
+
// Create a .capsules dir with a dummy file.
|
|
615
|
+
await mkdir(path.join(memDir, ".capsules"), { recursive: true });
|
|
616
|
+
await writeFile(path.join(memDir, ".capsules", "test.capsule.json.gz"), Buffer.from("dummy"));
|
|
617
|
+
|
|
618
|
+
const encPath = await backupMemoryDir({
|
|
619
|
+
memoryDir: memDir,
|
|
620
|
+
outDir: backupDir,
|
|
621
|
+
pluginVersion: "0.0.0-test",
|
|
622
|
+
encrypt: true,
|
|
623
|
+
});
|
|
624
|
+
|
|
625
|
+
assert.ok(encPath.endsWith(".enc"), "should produce .enc file");
|
|
626
|
+
|
|
627
|
+
// Decrypt and inspect the bundle: .secure-store and .capsules paths must not appear.
|
|
628
|
+
const { decryptCapsuleFile: decrypt } = await import("./capsule-crypto.js");
|
|
629
|
+
const { gzPath } = await decrypt({ encPath, memoryDir: memDir });
|
|
630
|
+
const gz = await readFile(gzPath);
|
|
631
|
+
const bundleStr = gunzipSync(gz).toString("utf-8");
|
|
632
|
+
const bundle = JSON.parse(bundleStr) as { records: Array<{ path: string }> };
|
|
633
|
+
|
|
634
|
+
const paths = bundle.records.map((r) => r.path);
|
|
635
|
+
const hasSS = paths.some((p) => p.includes(".secure-store"));
|
|
636
|
+
const hasCapsules = paths.some((p) => p.includes(".capsules"));
|
|
637
|
+
assert.equal(hasSS, false, ".secure-store paths must not appear in encrypted backup");
|
|
638
|
+
assert.equal(hasCapsules, false, ".capsules paths must not appear in encrypted backup");
|
|
639
|
+
|
|
640
|
+
// facts/ should still be present.
|
|
641
|
+
const hasFacts = paths.some((p) => p.startsWith("facts/"));
|
|
642
|
+
assert.equal(hasFacts, true, "facts/ should be included in the backup");
|
|
643
|
+
} finally {
|
|
644
|
+
keyring.lockAll();
|
|
645
|
+
await rm(memDir, { recursive: true, force: true });
|
|
646
|
+
await rm(backupDir, { recursive: true, force: true });
|
|
647
|
+
}
|
|
648
|
+
});
|
|
649
|
+
|
|
650
|
+
// ─── Test 12: exportCapsule includeTranscripts=true includes all dirs (Cursor) ─
|
|
651
|
+
|
|
652
|
+
test("exportCapsule with includeTranscripts=true includes transcripts and peers dirs without dropping other dirs", async () => {
|
|
653
|
+
const srcDir = await makeTempDir();
|
|
654
|
+
const outDir = await makeTempDir();
|
|
655
|
+
try {
|
|
656
|
+
// Create facts, peers, forks, and transcripts dirs.
|
|
657
|
+
await mkdir(path.join(srcDir, "facts"), { recursive: true });
|
|
658
|
+
await mkdir(path.join(srcDir, "peers", "peer-1"), { recursive: true });
|
|
659
|
+
await mkdir(path.join(srcDir, "forks", "fork-1"), { recursive: true });
|
|
660
|
+
await mkdir(path.join(srcDir, "transcripts", "session-1"), { recursive: true });
|
|
661
|
+
|
|
662
|
+
await writeFile(path.join(srcDir, "facts", "a.md"), "---\nid: a\n---\nA.");
|
|
663
|
+
await writeFile(path.join(srcDir, "peers", "peer-1", "profile.md"), "# Peer 1");
|
|
664
|
+
await writeFile(path.join(srcDir, "forks", "fork-1", "b.md"), "---\nid: b\n---\nB.");
|
|
665
|
+
await writeFile(path.join(srcDir, "transcripts", "session-1", "turn.md"), "# Turn");
|
|
666
|
+
|
|
667
|
+
const result = await exportCapsule({
|
|
668
|
+
name: "test-include-transcripts",
|
|
669
|
+
root: srcDir,
|
|
670
|
+
outDir,
|
|
671
|
+
pluginVersion: "0.0.0-test",
|
|
672
|
+
includeTranscripts: true,
|
|
673
|
+
now: 1_700_000_010_000,
|
|
674
|
+
});
|
|
675
|
+
|
|
676
|
+
const paths = result.manifest.files.map((f) => f.path);
|
|
677
|
+
|
|
678
|
+
// All four category dirs should be present.
|
|
679
|
+
assert.ok(paths.some((p) => p.startsWith("facts/")), "facts/ must be included");
|
|
680
|
+
assert.ok(paths.some((p) => p.startsWith("peers/")), "peers/ must be included (not dropped by --transcripts flag)");
|
|
681
|
+
assert.ok(paths.some((p) => p.startsWith("forks/")), "forks/ must be included (not dropped by --transcripts flag)");
|
|
682
|
+
assert.ok(paths.some((p) => p.startsWith("transcripts/")), "transcripts/ must be included when includeTranscripts=true");
|
|
683
|
+
|
|
684
|
+
// manifest.includesTranscripts should be true.
|
|
685
|
+
assert.equal(result.manifest.includesTranscripts, true, "manifest.includesTranscripts must be true");
|
|
686
|
+
} finally {
|
|
687
|
+
await rm(srcDir, { recursive: true, force: true });
|
|
688
|
+
await rm(outDir, { recursive: true, force: true });
|
|
689
|
+
}
|
|
690
|
+
});
|