@remnic/core 1.1.12 → 1.1.13
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 +257 -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,850 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for the WeClone connector install/remove flow.
|
|
3
|
+
*
|
|
4
|
+
* Covers gap-fill from Issue #458:
|
|
5
|
+
* - `weclone` is registered in BUILTIN_CONNECTORS
|
|
6
|
+
* - `remnic connectors install weclone` writes both the registry config
|
|
7
|
+
* AND the proxy config at ~/.remnic/connectors/weclone.json
|
|
8
|
+
* - Defaults are applied for unspecified fields
|
|
9
|
+
* - User-supplied overrides take precedence over defaults
|
|
10
|
+
* - Prior saved proxy config is honoured on force-reinstall
|
|
11
|
+
* - `remnic connectors remove weclone` removes both files
|
|
12
|
+
* - Proxy config precedence: user → prior → default
|
|
13
|
+
* - buildWeCloneProxyConfig rejects invalid ports and falls through
|
|
14
|
+
* - Synthetic data only — no personal information used
|
|
15
|
+
*/
|
|
16
|
+
import assert from "node:assert/strict";
|
|
17
|
+
import fs from "node:fs";
|
|
18
|
+
import os from "node:os";
|
|
19
|
+
import path from "node:path";
|
|
20
|
+
import test from "node:test";
|
|
21
|
+
|
|
22
|
+
import {
|
|
23
|
+
buildWeCloneProxyConfig,
|
|
24
|
+
installConnector,
|
|
25
|
+
loadRegistry,
|
|
26
|
+
removeConnector,
|
|
27
|
+
resolveWeCloneProxyConfigPath,
|
|
28
|
+
} from "./index.js";
|
|
29
|
+
|
|
30
|
+
interface Sandbox {
|
|
31
|
+
root: string;
|
|
32
|
+
home: string;
|
|
33
|
+
xdgConfigHome: string;
|
|
34
|
+
remnicHome: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function makeSandbox(t: { after: (fn: () => void | Promise<void>) => void }): Sandbox {
|
|
38
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), "remnic-weclone-test-"));
|
|
39
|
+
const home = path.join(root, "home");
|
|
40
|
+
const xdgConfigHome = path.join(home, ".config");
|
|
41
|
+
const remnicHome = path.join(home, ".remnic");
|
|
42
|
+
fs.mkdirSync(home, { recursive: true });
|
|
43
|
+
fs.mkdirSync(xdgConfigHome, { recursive: true });
|
|
44
|
+
fs.mkdirSync(remnicHome, { recursive: true });
|
|
45
|
+
t.after(() => {
|
|
46
|
+
try {
|
|
47
|
+
fs.rmSync(root, { recursive: true, force: true });
|
|
48
|
+
} catch {
|
|
49
|
+
// best effort
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
return { root, home, xdgConfigHome, remnicHome };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function withEnv(
|
|
56
|
+
overrides: Record<string, string | undefined>,
|
|
57
|
+
fn: () => void | Promise<void>,
|
|
58
|
+
): Promise<void> {
|
|
59
|
+
const originals: Record<string, string | undefined> = {};
|
|
60
|
+
for (const key of Object.keys(overrides)) {
|
|
61
|
+
originals[key] = process.env[key];
|
|
62
|
+
const value = overrides[key];
|
|
63
|
+
if (value === undefined) {
|
|
64
|
+
delete process.env[key];
|
|
65
|
+
} else {
|
|
66
|
+
process.env[key] = value;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
await fn();
|
|
71
|
+
} finally {
|
|
72
|
+
for (const key of Object.keys(originals)) {
|
|
73
|
+
const value = originals[key];
|
|
74
|
+
if (value === undefined) {
|
|
75
|
+
delete process.env[key];
|
|
76
|
+
} else {
|
|
77
|
+
process.env[key] = value;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
test("weclone manifest is registered in BUILTIN_CONNECTORS", async (t) => {
|
|
84
|
+
const sandbox = makeSandbox(t);
|
|
85
|
+
await withEnv(
|
|
86
|
+
{
|
|
87
|
+
HOME: sandbox.home,
|
|
88
|
+
USERPROFILE: sandbox.home,
|
|
89
|
+
XDG_CONFIG_HOME: sandbox.xdgConfigHome,
|
|
90
|
+
REMNIC_HOME: sandbox.remnicHome,
|
|
91
|
+
},
|
|
92
|
+
() => {
|
|
93
|
+
const registry = loadRegistry();
|
|
94
|
+
const manifest = registry.connectors.find((c) => c.id === "weclone");
|
|
95
|
+
assert.ok(manifest, "weclone must be present in the connector registry");
|
|
96
|
+
assert.equal(manifest!.capabilities.connectionType, "http");
|
|
97
|
+
assert.equal(manifest!.capabilities.observe, true);
|
|
98
|
+
assert.equal(manifest!.capabilities.recall, true);
|
|
99
|
+
assert.equal(manifest!.requiresToken, true, "weclone must require a token");
|
|
100
|
+
},
|
|
101
|
+
);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test("installConnector weclone writes registry config AND proxy config with defaults", async (t) => {
|
|
105
|
+
const sandbox = makeSandbox(t);
|
|
106
|
+
await withEnv(
|
|
107
|
+
{
|
|
108
|
+
HOME: sandbox.home,
|
|
109
|
+
USERPROFILE: sandbox.home,
|
|
110
|
+
XDG_CONFIG_HOME: sandbox.xdgConfigHome,
|
|
111
|
+
REMNIC_HOME: sandbox.remnicHome,
|
|
112
|
+
},
|
|
113
|
+
() => {
|
|
114
|
+
const result = installConnector({ connectorId: "weclone" });
|
|
115
|
+
assert.equal(result.status, "installed", `expected installed, got: ${result.status} — ${result.message}`);
|
|
116
|
+
assert.ok(result.configPath, "registry configPath must be set");
|
|
117
|
+
assert.ok(fs.existsSync(result.configPath as string), "registry config must exist on disk");
|
|
118
|
+
|
|
119
|
+
const proxyConfigPath = resolveWeCloneProxyConfigPath();
|
|
120
|
+
assert.equal(
|
|
121
|
+
proxyConfigPath,
|
|
122
|
+
path.join(sandbox.remnicHome, "connectors", "weclone.json"),
|
|
123
|
+
"proxy config must live under ~/.remnic/connectors/weclone.json (honouring REMNIC_HOME)",
|
|
124
|
+
);
|
|
125
|
+
assert.ok(fs.existsSync(proxyConfigPath), "proxy config must exist on disk");
|
|
126
|
+
|
|
127
|
+
const proxy = JSON.parse(fs.readFileSync(proxyConfigPath, "utf8")) as Record<string, unknown>;
|
|
128
|
+
// Defaults
|
|
129
|
+
assert.equal(proxy.wecloneApiUrl, "http://localhost:8000/v1");
|
|
130
|
+
assert.equal(proxy.proxyPort, 8100);
|
|
131
|
+
assert.equal(proxy.remnicDaemonUrl, "http://localhost:4318");
|
|
132
|
+
assert.equal(proxy.sessionStrategy, "single");
|
|
133
|
+
assert.ok(proxy.memoryInjection && typeof proxy.memoryInjection === "object");
|
|
134
|
+
|
|
135
|
+
// A bearer token should have been minted (requiresToken: true).
|
|
136
|
+
assert.equal(typeof proxy.remnicAuthToken, "string");
|
|
137
|
+
assert.ok((proxy.remnicAuthToken as string).length > 0);
|
|
138
|
+
|
|
139
|
+
// The registry config must also record the proxy-side config path for doctor.
|
|
140
|
+
const registryConfig = JSON.parse(
|
|
141
|
+
fs.readFileSync(result.configPath as string, "utf8"),
|
|
142
|
+
) as Record<string, unknown>;
|
|
143
|
+
assert.equal(registryConfig.proxyConfigPath, proxyConfigPath);
|
|
144
|
+
assert.equal(registryConfig.proxyPort, 8100);
|
|
145
|
+
},
|
|
146
|
+
);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
test("installConnector weclone falls back to ENGRAM_HOME when REMNIC_HOME is empty", async (t) => {
|
|
150
|
+
const sandbox = makeSandbox(t);
|
|
151
|
+
const legacyHome = path.join(sandbox.root, "legacy-remnic-home");
|
|
152
|
+
await withEnv(
|
|
153
|
+
{
|
|
154
|
+
HOME: sandbox.home,
|
|
155
|
+
USERPROFILE: sandbox.home,
|
|
156
|
+
XDG_CONFIG_HOME: sandbox.xdgConfigHome,
|
|
157
|
+
REMNIC_HOME: "",
|
|
158
|
+
ENGRAM_HOME: legacyHome,
|
|
159
|
+
},
|
|
160
|
+
() => {
|
|
161
|
+
const result = installConnector({ connectorId: "weclone" });
|
|
162
|
+
assert.equal(result.status, "installed", `expected installed, got: ${result.status} — ${result.message}`);
|
|
163
|
+
|
|
164
|
+
const proxyConfigPath = resolveWeCloneProxyConfigPath();
|
|
165
|
+
assert.equal(proxyConfigPath, path.join(legacyHome, "connectors", "weclone.json"));
|
|
166
|
+
assert.ok(fs.existsSync(proxyConfigPath), "proxy config must be written under legacy ENGRAM_HOME");
|
|
167
|
+
|
|
168
|
+
const registryConfig = JSON.parse(
|
|
169
|
+
fs.readFileSync(result.configPath as string, "utf8"),
|
|
170
|
+
) as Record<string, unknown>;
|
|
171
|
+
assert.equal(registryConfig.proxyConfigPath, proxyConfigPath);
|
|
172
|
+
},
|
|
173
|
+
);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
test("installConnector weclone expands tilde in REMNIC_HOME", async (t) => {
|
|
177
|
+
const sandbox = makeSandbox(t);
|
|
178
|
+
await withEnv(
|
|
179
|
+
{
|
|
180
|
+
HOME: sandbox.home,
|
|
181
|
+
USERPROFILE: sandbox.home,
|
|
182
|
+
XDG_CONFIG_HOME: sandbox.xdgConfigHome,
|
|
183
|
+
REMNIC_HOME: "~/remnic-home",
|
|
184
|
+
ENGRAM_HOME: undefined,
|
|
185
|
+
},
|
|
186
|
+
() => {
|
|
187
|
+
const result = installConnector({ connectorId: "weclone" });
|
|
188
|
+
assert.equal(result.status, "installed", `expected installed, got: ${result.status} — ${result.message}`);
|
|
189
|
+
|
|
190
|
+
const proxyConfigPath = resolveWeCloneProxyConfigPath();
|
|
191
|
+
assert.equal(proxyConfigPath, path.join(sandbox.home, "remnic-home", "connectors", "weclone.json"));
|
|
192
|
+
assert.ok(fs.existsSync(proxyConfigPath), "proxy config must be written under expanded REMNIC_HOME");
|
|
193
|
+
|
|
194
|
+
const registryConfig = JSON.parse(
|
|
195
|
+
fs.readFileSync(result.configPath as string, "utf8"),
|
|
196
|
+
) as Record<string, unknown>;
|
|
197
|
+
assert.equal(registryConfig.proxyConfigPath, proxyConfigPath);
|
|
198
|
+
},
|
|
199
|
+
);
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
test("installConnector weclone honours user-supplied overrides", async (t) => {
|
|
203
|
+
const sandbox = makeSandbox(t);
|
|
204
|
+
await withEnv(
|
|
205
|
+
{
|
|
206
|
+
HOME: sandbox.home,
|
|
207
|
+
USERPROFILE: sandbox.home,
|
|
208
|
+
XDG_CONFIG_HOME: sandbox.xdgConfigHome,
|
|
209
|
+
REMNIC_HOME: sandbox.remnicHome,
|
|
210
|
+
},
|
|
211
|
+
() => {
|
|
212
|
+
const result = installConnector({
|
|
213
|
+
connectorId: "weclone",
|
|
214
|
+
config: {
|
|
215
|
+
wecloneApiUrl: "http://upstream.example:9000/v1",
|
|
216
|
+
proxyPort: 8200,
|
|
217
|
+
remnicDaemonUrl: "http://daemon.example:4318",
|
|
218
|
+
sessionStrategy: "caller-id",
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
assert.equal(result.status, "installed");
|
|
222
|
+
|
|
223
|
+
const proxyConfigPath = resolveWeCloneProxyConfigPath();
|
|
224
|
+
const proxy = JSON.parse(fs.readFileSync(proxyConfigPath, "utf8")) as Record<string, unknown>;
|
|
225
|
+
assert.equal(proxy.wecloneApiUrl, "http://upstream.example:9000/v1");
|
|
226
|
+
assert.equal(proxy.proxyPort, 8200);
|
|
227
|
+
assert.equal(proxy.remnicDaemonUrl, "http://daemon.example:4318");
|
|
228
|
+
assert.equal(proxy.sessionStrategy, "caller-id");
|
|
229
|
+
},
|
|
230
|
+
);
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
test("installConnector weclone coerces string port from --config CLI parsing", async (t) => {
|
|
234
|
+
const sandbox = makeSandbox(t);
|
|
235
|
+
await withEnv(
|
|
236
|
+
{
|
|
237
|
+
HOME: sandbox.home,
|
|
238
|
+
USERPROFILE: sandbox.home,
|
|
239
|
+
XDG_CONFIG_HOME: sandbox.xdgConfigHome,
|
|
240
|
+
REMNIC_HOME: sandbox.remnicHome,
|
|
241
|
+
},
|
|
242
|
+
() => {
|
|
243
|
+
// CLI `--config proxyPort=8300` passes the value as a string.
|
|
244
|
+
const result = installConnector({
|
|
245
|
+
connectorId: "weclone",
|
|
246
|
+
config: { proxyPort: "8300" as unknown as number },
|
|
247
|
+
});
|
|
248
|
+
assert.equal(result.status, "installed");
|
|
249
|
+
|
|
250
|
+
const proxyConfigPath = resolveWeCloneProxyConfigPath();
|
|
251
|
+
const proxy = JSON.parse(fs.readFileSync(proxyConfigPath, "utf8")) as Record<string, unknown>;
|
|
252
|
+
assert.equal(proxy.proxyPort, 8300, "string port must be coerced to a number");
|
|
253
|
+
assert.equal(typeof proxy.proxyPort, "number");
|
|
254
|
+
},
|
|
255
|
+
);
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
test("installConnector weclone force-reinstall reuses persisted proxyConfigPath even if REMNIC_HOME changed", async (t) => {
|
|
259
|
+
// Reviewer feedback (codex P2): force-reinstall must target the SAME
|
|
260
|
+
// on-disk file the previous install wrote, not recompute from the current
|
|
261
|
+
// REMNIC_HOME. Otherwise the old file is left behind with stale settings
|
|
262
|
+
// and a revoked token when the env changes between installs.
|
|
263
|
+
const sandbox = makeSandbox(t);
|
|
264
|
+
const firstRemnicHome = sandbox.remnicHome;
|
|
265
|
+
const secondRemnicHome = path.join(sandbox.root, "second-remnic-home");
|
|
266
|
+
fs.mkdirSync(secondRemnicHome, { recursive: true });
|
|
267
|
+
|
|
268
|
+
let firstProxyPath = "";
|
|
269
|
+
|
|
270
|
+
await withEnv(
|
|
271
|
+
{
|
|
272
|
+
HOME: sandbox.home,
|
|
273
|
+
USERPROFILE: sandbox.home,
|
|
274
|
+
XDG_CONFIG_HOME: sandbox.xdgConfigHome,
|
|
275
|
+
REMNIC_HOME: firstRemnicHome,
|
|
276
|
+
},
|
|
277
|
+
() => {
|
|
278
|
+
const first = installConnector({
|
|
279
|
+
connectorId: "weclone",
|
|
280
|
+
config: { proxyPort: 8700 },
|
|
281
|
+
});
|
|
282
|
+
assert.equal(first.status, "installed");
|
|
283
|
+
firstProxyPath = resolveWeCloneProxyConfigPath();
|
|
284
|
+
assert.ok(fs.existsSync(firstProxyPath));
|
|
285
|
+
},
|
|
286
|
+
);
|
|
287
|
+
|
|
288
|
+
// Now force-reinstall with a DIFFERENT REMNIC_HOME. The proxy config
|
|
289
|
+
// write must target the ORIGINAL firstProxyPath (persisted via
|
|
290
|
+
// proxyConfigPath in the registry config), not the env-derived path under
|
|
291
|
+
// secondRemnicHome.
|
|
292
|
+
await withEnv(
|
|
293
|
+
{
|
|
294
|
+
HOME: sandbox.home,
|
|
295
|
+
USERPROFILE: sandbox.home,
|
|
296
|
+
XDG_CONFIG_HOME: sandbox.xdgConfigHome,
|
|
297
|
+
REMNIC_HOME: secondRemnicHome,
|
|
298
|
+
},
|
|
299
|
+
() => {
|
|
300
|
+
const envDerived = resolveWeCloneProxyConfigPath();
|
|
301
|
+
assert.notEqual(envDerived, firstProxyPath, "env derivation must differ after REMNIC_HOME change");
|
|
302
|
+
|
|
303
|
+
const second = installConnector({
|
|
304
|
+
connectorId: "weclone",
|
|
305
|
+
force: true,
|
|
306
|
+
});
|
|
307
|
+
assert.equal(second.status, "installed");
|
|
308
|
+
|
|
309
|
+
// The ORIGINAL path must still hold the updated config.
|
|
310
|
+
assert.ok(fs.existsSync(firstProxyPath), "original proxy file must still exist after force-reinstall");
|
|
311
|
+
// The env-derived path under the new REMNIC_HOME must NOT have been
|
|
312
|
+
// created — otherwise we'd have two proxy configs with divergent state.
|
|
313
|
+
assert.equal(
|
|
314
|
+
fs.existsSync(envDerived),
|
|
315
|
+
false,
|
|
316
|
+
"force-reinstall must NOT create a second proxy config at the new env-derived path",
|
|
317
|
+
);
|
|
318
|
+
|
|
319
|
+
// The first proxy file must retain the original custom port (8700) and
|
|
320
|
+
// have been rewritten with the fresh token.
|
|
321
|
+
const proxy = JSON.parse(fs.readFileSync(firstProxyPath, "utf8")) as Record<string, unknown>;
|
|
322
|
+
assert.equal(proxy.proxyPort, 8700, "force-reinstall must preserve prior port");
|
|
323
|
+
},
|
|
324
|
+
);
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
test("resolveWeCloneProxyConfigPath returns an absolute path even for a relative REMNIC_HOME override", async (t) => {
|
|
328
|
+
// Reviewer feedback (codex P2): install (path.join) and run (path.resolve)
|
|
329
|
+
// must agree on normalization. With a relative override like
|
|
330
|
+
// `REMNIC_HOME=tmp/remnic`, `path.join` keeps it relative while
|
|
331
|
+
// `path.resolve` makes it absolute — if they disagree, run-time fails
|
|
332
|
+
// to locate the file install-time wrote. Verified by asserting
|
|
333
|
+
// absoluteness here.
|
|
334
|
+
const sandbox = makeSandbox(t);
|
|
335
|
+
const relativeOverride = path.relative(process.cwd(), sandbox.remnicHome);
|
|
336
|
+
// Guard: the sandbox path might not be relative-expressible (e.g. on a
|
|
337
|
+
// different drive on Windows). Skip in that case.
|
|
338
|
+
if (!relativeOverride || path.isAbsolute(relativeOverride)) {
|
|
339
|
+
t.skip("Cannot construct a relative REMNIC_HOME for this test environment");
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
await withEnv(
|
|
343
|
+
{
|
|
344
|
+
HOME: sandbox.home,
|
|
345
|
+
USERPROFILE: sandbox.home,
|
|
346
|
+
XDG_CONFIG_HOME: sandbox.xdgConfigHome,
|
|
347
|
+
REMNIC_HOME: relativeOverride,
|
|
348
|
+
},
|
|
349
|
+
() => {
|
|
350
|
+
const resolved = resolveWeCloneProxyConfigPath();
|
|
351
|
+
assert.equal(path.isAbsolute(resolved), true, "resolveWeCloneProxyConfigPath must return an absolute path");
|
|
352
|
+
// Must normalize to the same absolute path the sandbox represents.
|
|
353
|
+
assert.equal(
|
|
354
|
+
resolved,
|
|
355
|
+
path.resolve(sandbox.remnicHome, "connectors", "weclone.json"),
|
|
356
|
+
);
|
|
357
|
+
},
|
|
358
|
+
);
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
test("installConnector weclone force-reinstall preserves prior custom fields", async (t) => {
|
|
362
|
+
const sandbox = makeSandbox(t);
|
|
363
|
+
await withEnv(
|
|
364
|
+
{
|
|
365
|
+
HOME: sandbox.home,
|
|
366
|
+
USERPROFILE: sandbox.home,
|
|
367
|
+
XDG_CONFIG_HOME: sandbox.xdgConfigHome,
|
|
368
|
+
REMNIC_HOME: sandbox.remnicHome,
|
|
369
|
+
},
|
|
370
|
+
() => {
|
|
371
|
+
// First install with a custom port.
|
|
372
|
+
const first = installConnector({
|
|
373
|
+
connectorId: "weclone",
|
|
374
|
+
config: { proxyPort: 8500, sessionStrategy: "caller-id" },
|
|
375
|
+
});
|
|
376
|
+
assert.equal(first.status, "installed");
|
|
377
|
+
|
|
378
|
+
// Force-reinstall without supplying any config overrides — the proxy
|
|
379
|
+
// file must retain the prior custom port and strategy rather than
|
|
380
|
+
// resetting to the manifest default.
|
|
381
|
+
const second = installConnector({
|
|
382
|
+
connectorId: "weclone",
|
|
383
|
+
force: true,
|
|
384
|
+
});
|
|
385
|
+
assert.equal(second.status, "installed");
|
|
386
|
+
|
|
387
|
+
const proxyConfigPath = resolveWeCloneProxyConfigPath();
|
|
388
|
+
const proxy = JSON.parse(fs.readFileSync(proxyConfigPath, "utf8")) as Record<string, unknown>;
|
|
389
|
+
assert.equal(proxy.proxyPort, 8500, "force-reinstall must preserve prior custom port");
|
|
390
|
+
assert.equal(proxy.sessionStrategy, "caller-id", "force-reinstall must preserve prior strategy");
|
|
391
|
+
},
|
|
392
|
+
);
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
test("removeConnector weclone uses persisted proxyConfigPath even if REMNIC_HOME changed", async (t) => {
|
|
396
|
+
// Install into one REMNIC_HOME, then call remove with a DIFFERENT REMNIC_HOME.
|
|
397
|
+
// The persisted absolute path must win so the original file is deleted even
|
|
398
|
+
// if the env changed between install and remove (e.g. user rotates their
|
|
399
|
+
// home dir, or REMNIC_HOME was scoped to a shell that later unset it).
|
|
400
|
+
const sandbox = makeSandbox(t);
|
|
401
|
+
const altRemnicHome = path.join(sandbox.root, "alt-remnic-home");
|
|
402
|
+
fs.mkdirSync(altRemnicHome, { recursive: true });
|
|
403
|
+
|
|
404
|
+
let installedProxyPath = "";
|
|
405
|
+
let installedConfigPath = "";
|
|
406
|
+
|
|
407
|
+
await withEnv(
|
|
408
|
+
{
|
|
409
|
+
HOME: sandbox.home,
|
|
410
|
+
USERPROFILE: sandbox.home,
|
|
411
|
+
XDG_CONFIG_HOME: sandbox.xdgConfigHome,
|
|
412
|
+
REMNIC_HOME: sandbox.remnicHome,
|
|
413
|
+
},
|
|
414
|
+
() => {
|
|
415
|
+
const installResult = installConnector({ connectorId: "weclone" });
|
|
416
|
+
assert.equal(installResult.status, "installed");
|
|
417
|
+
installedProxyPath = resolveWeCloneProxyConfigPath();
|
|
418
|
+
installedConfigPath = installResult.configPath as string;
|
|
419
|
+
assert.ok(fs.existsSync(installedProxyPath), "precondition: proxy config exists at install-time path");
|
|
420
|
+
},
|
|
421
|
+
);
|
|
422
|
+
|
|
423
|
+
// Simulate env change: point REMNIC_HOME at a different directory during
|
|
424
|
+
// remove. The original proxy file is at installedProxyPath — if removal
|
|
425
|
+
// were to naively re-resolve from env, it would try to delete a non-existent
|
|
426
|
+
// path under altRemnicHome and leave the real file behind.
|
|
427
|
+
await withEnv(
|
|
428
|
+
{
|
|
429
|
+
HOME: sandbox.home,
|
|
430
|
+
USERPROFILE: sandbox.home,
|
|
431
|
+
XDG_CONFIG_HOME: sandbox.xdgConfigHome,
|
|
432
|
+
REMNIC_HOME: altRemnicHome,
|
|
433
|
+
},
|
|
434
|
+
() => {
|
|
435
|
+
// Sanity: the env-derived path now resolves somewhere else.
|
|
436
|
+
const envDerived = resolveWeCloneProxyConfigPath();
|
|
437
|
+
assert.notEqual(envDerived, installedProxyPath);
|
|
438
|
+
|
|
439
|
+
const removeResult = removeConnector("weclone");
|
|
440
|
+
assert.equal(removeResult.status, "removed");
|
|
441
|
+
|
|
442
|
+
// The ORIGINAL proxy config file must have been deleted via the persisted
|
|
443
|
+
// proxyConfigPath — not left behind because env has moved on.
|
|
444
|
+
assert.equal(
|
|
445
|
+
fs.existsSync(installedProxyPath),
|
|
446
|
+
false,
|
|
447
|
+
"original proxy config must be deleted via persisted proxyConfigPath even after REMNIC_HOME changed",
|
|
448
|
+
);
|
|
449
|
+
assert.equal(fs.existsSync(installedConfigPath), false, "registry config must also be deleted");
|
|
450
|
+
},
|
|
451
|
+
);
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
test("installConnector weclone install error reports token rollback status truthfully", async (t) => {
|
|
455
|
+
// Reviewer (cursor MEDIUM): the WeClone outer catch previously swallowed
|
|
456
|
+
// token-rollback failures. The message must now either say "Token has
|
|
457
|
+
// been rolled back." (on success) or "Token rollback FAILED (...)" — it
|
|
458
|
+
// must NEVER silently omit either outcome.
|
|
459
|
+
const sandbox = makeSandbox(t);
|
|
460
|
+
await withEnv(
|
|
461
|
+
{
|
|
462
|
+
HOME: sandbox.home,
|
|
463
|
+
USERPROFILE: sandbox.home,
|
|
464
|
+
XDG_CONFIG_HOME: sandbox.xdgConfigHome,
|
|
465
|
+
REMNIC_HOME: sandbox.remnicHome,
|
|
466
|
+
},
|
|
467
|
+
() => {
|
|
468
|
+
// Force proxy write to fail so we hit the WeClone catch branch.
|
|
469
|
+
const proxyConfigPath = resolveWeCloneProxyConfigPath();
|
|
470
|
+
const originalWrite = fs.writeFileSync.bind(fs);
|
|
471
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
472
|
+
const mock = t.mock.method(fs, "writeFileSync", (...args: [any, any, any?]) => {
|
|
473
|
+
if (String(args[0] ?? "") === proxyConfigPath) {
|
|
474
|
+
throw new Error("ENOSPC: simulated proxy write failure");
|
|
475
|
+
}
|
|
476
|
+
return originalWrite(...args);
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
const result = installConnector({ connectorId: "weclone" });
|
|
480
|
+
mock.mock.restore();
|
|
481
|
+
|
|
482
|
+
assert.equal(result.status, "error");
|
|
483
|
+
// Happy rollback path: token store was restorable, so message must say
|
|
484
|
+
// so. If the test environment cannot rollback (unlikely), the message
|
|
485
|
+
// must explicitly say FAILED.
|
|
486
|
+
assert.ok(
|
|
487
|
+
/Token has been rolled back\.|Token rollback FAILED/.test(result.message),
|
|
488
|
+
`install error must report token rollback status; got: ${result.message}`,
|
|
489
|
+
);
|
|
490
|
+
},
|
|
491
|
+
);
|
|
492
|
+
});
|
|
493
|
+
|
|
494
|
+
test("installConnector weclone restores prior proxy config when write throws mid-truncate", async (t) => {
|
|
495
|
+
// Reviewer (codex P2): writeSecretFileSync opens the file in truncate
|
|
496
|
+
// mode, so a mid-write failure (ENOSPC) can leave weclone.json empty.
|
|
497
|
+
// The rollback closure must be installed BEFORE the write so prior
|
|
498
|
+
// contents are restored on failure.
|
|
499
|
+
const sandbox = makeSandbox(t);
|
|
500
|
+
await withEnv(
|
|
501
|
+
{
|
|
502
|
+
HOME: sandbox.home,
|
|
503
|
+
USERPROFILE: sandbox.home,
|
|
504
|
+
XDG_CONFIG_HOME: sandbox.xdgConfigHome,
|
|
505
|
+
REMNIC_HOME: sandbox.remnicHome,
|
|
506
|
+
},
|
|
507
|
+
() => {
|
|
508
|
+
// First install succeeds and writes known prior content.
|
|
509
|
+
const first = installConnector({
|
|
510
|
+
connectorId: "weclone",
|
|
511
|
+
config: { proxyPort: 8800 },
|
|
512
|
+
});
|
|
513
|
+
assert.equal(first.status, "installed");
|
|
514
|
+
const proxyConfigPath = resolveWeCloneProxyConfigPath();
|
|
515
|
+
const priorBytes = fs.readFileSync(proxyConfigPath, "utf8");
|
|
516
|
+
assert.ok(priorBytes.length > 0);
|
|
517
|
+
|
|
518
|
+
// Now mock the internal writeFileSync so that the NEXT call targeting
|
|
519
|
+
// proxyConfigPath fails. We target writeFileSync because
|
|
520
|
+
// writeSecretFileSync calls through to it via a wrapper; catching that
|
|
521
|
+
// exception drives our new rollback path.
|
|
522
|
+
const originalWrite = fs.writeFileSync.bind(fs);
|
|
523
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
524
|
+
const mock = t.mock.method(fs, "writeFileSync", (...args: [any, any, any?]) => {
|
|
525
|
+
const target = String(args[0] ?? "");
|
|
526
|
+
if (target === proxyConfigPath) {
|
|
527
|
+
throw new Error("ENOSPC: no space left on device (simulated)");
|
|
528
|
+
}
|
|
529
|
+
return originalWrite(...args);
|
|
530
|
+
});
|
|
531
|
+
|
|
532
|
+
const second = installConnector({
|
|
533
|
+
connectorId: "weclone",
|
|
534
|
+
force: true,
|
|
535
|
+
config: { proxyPort: 8900 },
|
|
536
|
+
});
|
|
537
|
+
mock.mock.restore();
|
|
538
|
+
|
|
539
|
+
// Install must have failed cleanly.
|
|
540
|
+
assert.equal(second.status, "error", `expected error, got: ${second.status}`);
|
|
541
|
+
|
|
542
|
+
// The proxy config file MUST contain the exact prior bytes — not
|
|
543
|
+
// empty, not corrupted, and not the new (never-committed) config.
|
|
544
|
+
const afterBytes = fs.readFileSync(proxyConfigPath, "utf8");
|
|
545
|
+
assert.equal(afterBytes, priorBytes, "prior proxy config content must be restored after failed write");
|
|
546
|
+
},
|
|
547
|
+
);
|
|
548
|
+
});
|
|
549
|
+
|
|
550
|
+
test("removeConnector weclone returns status:error when proxy config delete fails", async (t) => {
|
|
551
|
+
// Reviewer (codex P2): if proxy config unlink fails, silently swallowing
|
|
552
|
+
// the error and returning status:"removed" leaves an orphan file that may
|
|
553
|
+
// still contain a live bearer token. A retry would go down the
|
|
554
|
+
// `not_found` path (registry config already gone) and never attempt the
|
|
555
|
+
// cleanup. Must surface status:"error" so automation flags it.
|
|
556
|
+
const sandbox = makeSandbox(t);
|
|
557
|
+
await withEnv(
|
|
558
|
+
{
|
|
559
|
+
HOME: sandbox.home,
|
|
560
|
+
USERPROFILE: sandbox.home,
|
|
561
|
+
XDG_CONFIG_HOME: sandbox.xdgConfigHome,
|
|
562
|
+
REMNIC_HOME: sandbox.remnicHome,
|
|
563
|
+
},
|
|
564
|
+
() => {
|
|
565
|
+
const installResult = installConnector({ connectorId: "weclone" });
|
|
566
|
+
assert.equal(installResult.status, "installed");
|
|
567
|
+
const proxyConfigPath = resolveWeCloneProxyConfigPath();
|
|
568
|
+
assert.ok(fs.existsSync(proxyConfigPath));
|
|
569
|
+
|
|
570
|
+
// Mock unlinkSync to fail only when targeting the proxy config file.
|
|
571
|
+
const originalUnlink = fs.unlinkSync.bind(fs);
|
|
572
|
+
const mock = t.mock.method(fs, "unlinkSync", (target: fs.PathLike) => {
|
|
573
|
+
if (String(target) === proxyConfigPath) {
|
|
574
|
+
throw new Error("EPERM: operation not permitted (simulated)");
|
|
575
|
+
}
|
|
576
|
+
return originalUnlink(target);
|
|
577
|
+
});
|
|
578
|
+
|
|
579
|
+
const removeResult = removeConnector("weclone");
|
|
580
|
+
mock.mock.restore();
|
|
581
|
+
|
|
582
|
+
assert.equal(
|
|
583
|
+
removeResult.status,
|
|
584
|
+
"error",
|
|
585
|
+
`proxy-delete failure must surface status:"error", got: ${removeResult.status} — ${removeResult.message}`,
|
|
586
|
+
);
|
|
587
|
+
// The message must mention the orphan file path so operators can act.
|
|
588
|
+
assert.ok(
|
|
589
|
+
removeResult.message.includes(proxyConfigPath),
|
|
590
|
+
`error message must reference the orphan path, got: ${removeResult.message}`,
|
|
591
|
+
);
|
|
592
|
+
},
|
|
593
|
+
);
|
|
594
|
+
});
|
|
595
|
+
|
|
596
|
+
test("removeConnector weclone aborts with status:skipped when weclone.json is malformed", async (t) => {
|
|
597
|
+
// Reviewer (codex P2): silently falling back to env-derived path when
|
|
598
|
+
// parsing weclone.json fails can miss the real proxy config if env
|
|
599
|
+
// changed between install and remove. Must abort the whole removal,
|
|
600
|
+
// leave the registry config intact for inspection, and NOT delete the
|
|
601
|
+
// proxy config file (which may still hold a live token).
|
|
602
|
+
const sandbox = makeSandbox(t);
|
|
603
|
+
await withEnv(
|
|
604
|
+
{
|
|
605
|
+
HOME: sandbox.home,
|
|
606
|
+
USERPROFILE: sandbox.home,
|
|
607
|
+
XDG_CONFIG_HOME: sandbox.xdgConfigHome,
|
|
608
|
+
REMNIC_HOME: sandbox.remnicHome,
|
|
609
|
+
},
|
|
610
|
+
() => {
|
|
611
|
+
// Real install first so proxy config exists.
|
|
612
|
+
const installResult = installConnector({ connectorId: "weclone" });
|
|
613
|
+
assert.equal(installResult.status, "installed");
|
|
614
|
+
const proxyConfigPath = resolveWeCloneProxyConfigPath();
|
|
615
|
+
const registryConfigPath = installResult.configPath as string;
|
|
616
|
+
assert.ok(fs.existsSync(proxyConfigPath));
|
|
617
|
+
|
|
618
|
+
// Corrupt the registry config.
|
|
619
|
+
fs.writeFileSync(registryConfigPath, "{ not valid json }}");
|
|
620
|
+
|
|
621
|
+
const removeResult = removeConnector("weclone");
|
|
622
|
+
assert.equal(removeResult.status, "skipped", `expected skipped, got: ${removeResult.status}`);
|
|
623
|
+
assert.equal(removeResult.reason, "config-parse-failed");
|
|
624
|
+
|
|
625
|
+
// Both files must remain untouched so the operator can fix and retry.
|
|
626
|
+
assert.ok(fs.existsSync(registryConfigPath), "malformed registry config must be preserved");
|
|
627
|
+
assert.ok(fs.existsSync(proxyConfigPath), "proxy config must not be deleted when we lost provenance");
|
|
628
|
+
},
|
|
629
|
+
);
|
|
630
|
+
});
|
|
631
|
+
|
|
632
|
+
test("removeConnector weclone error message reflects token-revocation status truthfully", async (t) => {
|
|
633
|
+
// Reviewer (codex P2): when BOTH token revocation AND proxy-config delete
|
|
634
|
+
// fail, the message must tell the operator the token is still live —
|
|
635
|
+
// hardcoding "token was cleaned up" would mislead them into thinking they
|
|
636
|
+
// only need to remove the orphan file.
|
|
637
|
+
const sandbox = makeSandbox(t);
|
|
638
|
+
await withEnv(
|
|
639
|
+
{
|
|
640
|
+
HOME: sandbox.home,
|
|
641
|
+
USERPROFILE: sandbox.home,
|
|
642
|
+
XDG_CONFIG_HOME: sandbox.xdgConfigHome,
|
|
643
|
+
REMNIC_HOME: sandbox.remnicHome,
|
|
644
|
+
},
|
|
645
|
+
() => {
|
|
646
|
+
const installResult = installConnector({ connectorId: "weclone" });
|
|
647
|
+
assert.equal(installResult.status, "installed");
|
|
648
|
+
const proxyConfigPath = resolveWeCloneProxyConfigPath();
|
|
649
|
+
|
|
650
|
+
// Fail both: proxy-config unlink AND the revokeToken path (via
|
|
651
|
+
// saveTokenStore throwing when it tries to persist the revocation).
|
|
652
|
+
const originalUnlink = fs.unlinkSync.bind(fs);
|
|
653
|
+
const originalRename = fs.renameSync.bind(fs);
|
|
654
|
+
const unlinkMock = t.mock.method(fs, "unlinkSync", (target: fs.PathLike) => {
|
|
655
|
+
if (String(target) === proxyConfigPath) {
|
|
656
|
+
throw new Error("EPERM: proxy unlink failed (simulated)");
|
|
657
|
+
}
|
|
658
|
+
return originalUnlink(target);
|
|
659
|
+
});
|
|
660
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
661
|
+
const renameMock = t.mock.method(fs, "renameSync", (...args: [any, any]) => {
|
|
662
|
+
if (String(args[1] ?? "").endsWith("tokens.json")) {
|
|
663
|
+
throw new Error("EPERM: tokens.json rename failed (simulated)");
|
|
664
|
+
}
|
|
665
|
+
return originalRename(...args);
|
|
666
|
+
});
|
|
667
|
+
|
|
668
|
+
const removeResult = removeConnector("weclone");
|
|
669
|
+
unlinkMock.mock.restore();
|
|
670
|
+
renameMock.mock.restore();
|
|
671
|
+
|
|
672
|
+
assert.equal(removeResult.status, "error");
|
|
673
|
+
// Must mention token revocation failure, not claim success.
|
|
674
|
+
assert.ok(
|
|
675
|
+
/TOKEN REVOCATION (ALSO )?FAILED/i.test(removeResult.message),
|
|
676
|
+
`message must report token revocation failure; got: ${removeResult.message}`,
|
|
677
|
+
);
|
|
678
|
+
// Must still mention the orphan proxy path.
|
|
679
|
+
assert.ok(removeResult.message.includes(proxyConfigPath));
|
|
680
|
+
},
|
|
681
|
+
);
|
|
682
|
+
});
|
|
683
|
+
|
|
684
|
+
test("removeConnector weclone cleans up both registry and proxy config files", async (t) => {
|
|
685
|
+
const sandbox = makeSandbox(t);
|
|
686
|
+
await withEnv(
|
|
687
|
+
{
|
|
688
|
+
HOME: sandbox.home,
|
|
689
|
+
USERPROFILE: sandbox.home,
|
|
690
|
+
XDG_CONFIG_HOME: sandbox.xdgConfigHome,
|
|
691
|
+
REMNIC_HOME: sandbox.remnicHome,
|
|
692
|
+
},
|
|
693
|
+
() => {
|
|
694
|
+
const installResult = installConnector({ connectorId: "weclone" });
|
|
695
|
+
assert.equal(installResult.status, "installed");
|
|
696
|
+
|
|
697
|
+
const proxyConfigPath = resolveWeCloneProxyConfigPath();
|
|
698
|
+
assert.ok(fs.existsSync(proxyConfigPath), "precondition: proxy config exists");
|
|
699
|
+
assert.ok(fs.existsSync(installResult.configPath as string), "precondition: registry config exists");
|
|
700
|
+
|
|
701
|
+
const removeResult = removeConnector("weclone");
|
|
702
|
+
assert.equal(removeResult.status, "removed", `expected removed, got: ${removeResult.status}`);
|
|
703
|
+
assert.equal(fs.existsSync(proxyConfigPath), false, "proxy config must be deleted on remove");
|
|
704
|
+
assert.equal(
|
|
705
|
+
fs.existsSync(installResult.configPath as string),
|
|
706
|
+
false,
|
|
707
|
+
"registry config must be deleted on remove",
|
|
708
|
+
);
|
|
709
|
+
},
|
|
710
|
+
);
|
|
711
|
+
});
|
|
712
|
+
|
|
713
|
+
// ── buildWeCloneProxyConfig unit tests (no filesystem) ────────────────────
|
|
714
|
+
|
|
715
|
+
test("buildWeCloneProxyConfig applies defaults when nothing provided", () => {
|
|
716
|
+
const config = buildWeCloneProxyConfig({ userConfig: {}, priorConfig: null });
|
|
717
|
+
assert.equal(config.wecloneApiUrl, "http://localhost:8000/v1");
|
|
718
|
+
assert.equal(config.proxyPort, 8100);
|
|
719
|
+
assert.equal(config.remnicDaemonUrl, "http://localhost:4318");
|
|
720
|
+
assert.equal(config.sessionStrategy, "single");
|
|
721
|
+
assert.equal(config.memoryInjection.maxTokens, 1500);
|
|
722
|
+
assert.equal(config.memoryInjection.position, "system-append");
|
|
723
|
+
});
|
|
724
|
+
|
|
725
|
+
test("buildWeCloneProxyConfig precedence: user > prior > default", () => {
|
|
726
|
+
const config = buildWeCloneProxyConfig({
|
|
727
|
+
userConfig: { proxyPort: 9100 },
|
|
728
|
+
priorConfig: {
|
|
729
|
+
proxyPort: 9000,
|
|
730
|
+
wecloneApiUrl: "http://prior.example:8000/v1",
|
|
731
|
+
sessionStrategy: "caller-id",
|
|
732
|
+
},
|
|
733
|
+
});
|
|
734
|
+
assert.equal(config.proxyPort, 9100, "user wins over prior");
|
|
735
|
+
assert.equal(config.wecloneApiUrl, "http://prior.example:8000/v1", "prior wins over default");
|
|
736
|
+
assert.equal(config.sessionStrategy, "caller-id");
|
|
737
|
+
});
|
|
738
|
+
|
|
739
|
+
test("buildWeCloneProxyConfig falls through invalid port to prior, then default", () => {
|
|
740
|
+
const config = buildWeCloneProxyConfig({
|
|
741
|
+
userConfig: { proxyPort: 70000 }, // invalid (>65535)
|
|
742
|
+
priorConfig: { proxyPort: 9000 },
|
|
743
|
+
});
|
|
744
|
+
assert.equal(config.proxyPort, 9000, "invalid user port falls through to prior");
|
|
745
|
+
|
|
746
|
+
const config2 = buildWeCloneProxyConfig({
|
|
747
|
+
userConfig: { proxyPort: -1 }, // invalid
|
|
748
|
+
priorConfig: { proxyPort: "not-a-number" as unknown as number }, // invalid
|
|
749
|
+
});
|
|
750
|
+
assert.equal(config2.proxyPort, 8100, "all invalid falls through to default");
|
|
751
|
+
});
|
|
752
|
+
|
|
753
|
+
test("buildWeCloneProxyConfig rejects invalid sessionStrategy", () => {
|
|
754
|
+
const config = buildWeCloneProxyConfig({
|
|
755
|
+
userConfig: { sessionStrategy: "round-robin" }, // invalid
|
|
756
|
+
priorConfig: null,
|
|
757
|
+
});
|
|
758
|
+
assert.equal(config.sessionStrategy, "single", "invalid strategy falls back to default");
|
|
759
|
+
});
|
|
760
|
+
|
|
761
|
+
test("buildWeCloneProxyConfig only persists auth token when available", () => {
|
|
762
|
+
const withToken = buildWeCloneProxyConfig({
|
|
763
|
+
userConfig: {},
|
|
764
|
+
priorConfig: null,
|
|
765
|
+
authToken: "synthetic-test-token",
|
|
766
|
+
});
|
|
767
|
+
assert.equal(withToken.remnicAuthToken, "synthetic-test-token");
|
|
768
|
+
|
|
769
|
+
const withoutToken = buildWeCloneProxyConfig({
|
|
770
|
+
userConfig: {},
|
|
771
|
+
priorConfig: null,
|
|
772
|
+
});
|
|
773
|
+
assert.equal(withoutToken.remnicAuthToken, undefined);
|
|
774
|
+
});
|
|
775
|
+
|
|
776
|
+
test("buildWeCloneProxyConfig fresh token overrides prior", () => {
|
|
777
|
+
const config = buildWeCloneProxyConfig({
|
|
778
|
+
userConfig: {},
|
|
779
|
+
priorConfig: { remnicAuthToken: "stale-token" },
|
|
780
|
+
authToken: "fresh-token",
|
|
781
|
+
});
|
|
782
|
+
assert.equal(config.remnicAuthToken, "fresh-token", "freshly minted token must replace prior");
|
|
783
|
+
});
|
|
784
|
+
|
|
785
|
+
test("buildWeCloneProxyConfig rejects array memoryInjection (typeof [] === 'object' footgun)", () => {
|
|
786
|
+
// Reviewer (cursor LOW): typeof [] === "object", so a bare object+null
|
|
787
|
+
// guard would let an array spread numeric-indexed properties into the
|
|
788
|
+
// merged memoryInjection. The helper must reject arrays explicitly.
|
|
789
|
+
const config = buildWeCloneProxyConfig({
|
|
790
|
+
userConfig: { memoryInjection: ["a", "b", "c"] as unknown as Record<string, unknown> },
|
|
791
|
+
priorConfig: { memoryInjection: [1, 2, 3] as unknown as Record<string, unknown> },
|
|
792
|
+
});
|
|
793
|
+
// Defaults survive; array was NOT spread in.
|
|
794
|
+
assert.equal(config.memoryInjection.maxTokens, 1500);
|
|
795
|
+
assert.equal(config.memoryInjection.position, "system-append");
|
|
796
|
+
assert.equal(config.memoryInjection.template, "[Memory Context]\n{memories}\n[End Memory Context]");
|
|
797
|
+
// Numeric-indexed properties must NOT leak onto the result.
|
|
798
|
+
assert.equal((config.memoryInjection as unknown as Record<string, unknown>)[0], undefined);
|
|
799
|
+
assert.equal((config.memoryInjection as unknown as Record<string, unknown>)[1], undefined);
|
|
800
|
+
});
|
|
801
|
+
|
|
802
|
+
test("resolveWeCloneProxyConfigPath treats empty HOME as absent (aligns with os.homedir())", async (t) => {
|
|
803
|
+
// Reviewer (cursor MEDIUM): process.env.HOME ?? os.homedir() keeps "" as
|
|
804
|
+
// the home (empty string is NOT nullish). Without the parity fix, install
|
|
805
|
+
// and run would disagree whenever HOME is empty. Both must fall back to
|
|
806
|
+
// os.homedir() so they pick the same directory.
|
|
807
|
+
//
|
|
808
|
+
// Strategy: assert the result matches the os.homedir()-based path exactly,
|
|
809
|
+
// which is what the CLI computes. If HOME="" were used verbatim, the
|
|
810
|
+
// result would be resolve("", ...) ≡ resolve(".remnic/connectors/...") —
|
|
811
|
+
// i.e. CWD-relative — which must NOT be the returned path.
|
|
812
|
+
const sandbox = makeSandbox(t);
|
|
813
|
+
await withEnv(
|
|
814
|
+
{
|
|
815
|
+
HOME: "", // empty, not nullish
|
|
816
|
+
USERPROFILE: sandbox.home,
|
|
817
|
+
XDG_CONFIG_HOME: sandbox.xdgConfigHome,
|
|
818
|
+
REMNIC_HOME: undefined,
|
|
819
|
+
ENGRAM_HOME: undefined,
|
|
820
|
+
},
|
|
821
|
+
() => {
|
|
822
|
+
const resolved = resolveWeCloneProxyConfigPath();
|
|
823
|
+
assert.equal(path.isAbsolute(resolved), true, "must be absolute");
|
|
824
|
+
const expected = path.resolve(os.homedir(), ".remnic", "connectors", "weclone.json");
|
|
825
|
+
assert.equal(
|
|
826
|
+
resolved,
|
|
827
|
+
expected,
|
|
828
|
+
"empty HOME must fall back to os.homedir() (not collapse to CWD)",
|
|
829
|
+
);
|
|
830
|
+
},
|
|
831
|
+
);
|
|
832
|
+
});
|
|
833
|
+
|
|
834
|
+
test("buildWeCloneProxyConfig merges memoryInjection partials", () => {
|
|
835
|
+
const config = buildWeCloneProxyConfig({
|
|
836
|
+
userConfig: { memoryInjection: { maxTokens: 2500 } },
|
|
837
|
+
priorConfig: { memoryInjection: { template: "prior template {memories}" } },
|
|
838
|
+
});
|
|
839
|
+
assert.equal(config.memoryInjection.maxTokens, 2500, "user override wins");
|
|
840
|
+
assert.equal(
|
|
841
|
+
config.memoryInjection.template,
|
|
842
|
+
"prior template {memories}",
|
|
843
|
+
"prior value persists when user did not override",
|
|
844
|
+
);
|
|
845
|
+
assert.equal(
|
|
846
|
+
config.memoryInjection.position,
|
|
847
|
+
"system-append",
|
|
848
|
+
"default fills the remaining field",
|
|
849
|
+
);
|
|
850
|
+
});
|