@remnic/core 1.1.31 → 9.3.515
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/abstraction-nodes.js +2 -2
- package/dist/access-cli.d.ts +1 -1
- package/dist/access-cli.js +156 -119
- package/dist/access-cli.js.map +1 -1
- package/dist/access-http.d.ts +8 -5
- package/dist/access-http.js +51 -51
- package/dist/access-idempotency.d.ts +2 -0
- package/dist/access-idempotency.js +1 -1
- package/dist/access-mcp.d.ts +16 -9
- package/dist/access-mcp.js +44 -44
- package/dist/access-schema.d.ts +45 -13
- package/dist/access-schema.js +8 -8
- package/dist/{access-service-CkZyb35d.d.ts → access-service-qrrIrC-0.d.ts} +5 -128
- package/dist/access-service.d.ts +7 -4
- package/dist/access-service.js +40 -40
- package/dist/action-confidence.d.ts +1 -0
- package/dist/active-memory-bridge.d.ts +1 -0
- package/dist/active-memory-bridge.js +3 -2
- package/dist/active-recall.d.ts +1 -0
- package/dist/active-recall.js +14 -9
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/claude-code.d.ts +6 -2
- package/dist/adapters/claude-code.js +2 -2
- package/dist/adapters/codex.d.ts +5 -1
- package/dist/adapters/codex.js +2 -2
- package/dist/adapters/hermes.js +2 -2
- package/dist/adapters/index.js +6 -6
- package/dist/adapters/registry.js +6 -6
- package/dist/adapters/replit.d.ts +4 -2
- package/dist/adapters/replit.js +2 -2
- package/dist/adapters/types.d.ts +4 -0
- package/dist/adapters/types.js +1 -1
- package/dist/behavior-learner.d.ts +1 -0
- package/dist/behavior-signals.d.ts +1 -0
- package/dist/behavior-signals.js +1 -1
- package/dist/bootstrap.d.ts +5 -3
- package/dist/bootstrap.js +2 -2
- package/dist/boxes.d.ts +1 -0
- package/dist/boxes.js +1 -1
- package/dist/briefing.d.ts +1 -0
- package/dist/briefing.js +9 -9
- package/dist/buffer-surprise-report.d.ts +1 -0
- package/dist/buffer.d.ts +1 -0
- package/dist/buffer.js +2 -2
- package/dist/bulk-import/index.d.ts +28 -0
- package/dist/bulk-import/index.js +31 -0
- package/dist/calibration.d.ts +2 -0
- package/dist/calibration.js +50 -17
- package/dist/calibration.js.map +1 -1
- package/dist/{capsule-crypto-5CYAGVC5.js → capsule-crypto-7FJQINUR.js} +2 -2
- package/dist/{capsule-merge-4MGKE7C5.js → capsule-merge-T2JRE46P.js} +3 -3
- package/dist/causal-behavior.d.ts +1 -0
- package/dist/causal-behavior.js +4 -4
- package/dist/causal-chain.js +4 -4
- package/dist/causal-consolidation.d.ts +16 -1
- package/dist/causal-consolidation.js +115 -32
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/causal-retrieval.js +14 -6
- package/dist/causal-retrieval.js.map +1 -1
- package/dist/causal-trajectory-graph.js +2 -2
- package/dist/causal-trajectory.js +2 -2
- package/dist/{chunk-SAZS2QZB.js → chunk-23UORJ4S.js} +3 -3
- package/dist/{chunk-76FLAAUC.js → chunk-2AN2L4NL.js} +17 -6
- package/dist/chunk-2AN2L4NL.js.map +1 -0
- package/dist/{chunk-W4L6CZKA.js → chunk-2DL3OFLD.js} +15 -10
- package/dist/chunk-2DL3OFLD.js.map +1 -0
- package/dist/{chunk-7OZ53EXP.js → chunk-2NLLXCJG.js} +21 -10
- package/dist/chunk-2NLLXCJG.js.map +1 -0
- package/dist/{chunk-PK7H5L6Y.js → chunk-2NM43EWN.js} +2 -2
- package/dist/{chunk-PYXS46O7.js → chunk-3BP57I6J.js} +2 -2
- package/dist/{chunk-FBYESMQ2.js → chunk-3C5RPJAX.js} +2 -2
- package/dist/{chunk-ZAVUCJ4H.js → chunk-3Q4H3OBR.js} +150 -65
- package/dist/chunk-3Q4H3OBR.js.map +1 -0
- package/dist/{chunk-FKFMOY3N.js → chunk-42NQ7AVG.js} +3 -4
- package/dist/{chunk-FKFMOY3N.js.map → chunk-42NQ7AVG.js.map} +1 -1
- package/dist/chunk-4426WSWL.js +73 -0
- package/dist/chunk-4426WSWL.js.map +1 -0
- package/dist/{chunk-LIRZNNUP.js → chunk-44442YCH.js} +5 -2
- package/dist/chunk-44442YCH.js.map +1 -0
- package/dist/{chunk-H3ME6L6D.js → chunk-46GJIW5M.js} +23 -20
- package/dist/chunk-46GJIW5M.js.map +1 -0
- package/dist/{chunk-QDZ2RLEC.js → chunk-472U7RDF.js} +3 -3
- package/dist/chunk-472U7RDF.js.map +1 -0
- package/dist/{chunk-NN2DKE4T.js → chunk-4H5ZJHEN.js} +16 -3
- package/dist/{chunk-NN2DKE4T.js.map → chunk-4H5ZJHEN.js.map} +1 -1
- package/dist/{chunk-56K5QLHX.js → chunk-4HP7HIE3.js} +56 -13
- package/dist/chunk-4HP7HIE3.js.map +1 -0
- package/dist/{chunk-RK2Y4XOM.js → chunk-4JRRISLU.js} +9 -6
- package/dist/chunk-4JRRISLU.js.map +1 -0
- package/dist/{chunk-U7EJOMFC.js → chunk-4Q73JBSM.js} +4 -4
- package/dist/{chunk-XKLD5OK4.js → chunk-4RR6ROTB.js} +10 -11
- package/dist/chunk-4RR6ROTB.js.map +1 -0
- package/dist/{chunk-4KGVTPGD.js → chunk-6F6BXB7A.js} +9 -8
- package/dist/chunk-6F6BXB7A.js.map +1 -0
- package/dist/{chunk-NMZY542O.js → chunk-6URPAY2D.js} +41 -17
- package/dist/chunk-6URPAY2D.js.map +1 -0
- package/dist/{chunk-N53K2EXC.js → chunk-6VF75M3X.js} +2 -2
- package/dist/{chunk-XSZEP4SF.js → chunk-6XSPNR6L.js} +6 -5
- package/dist/chunk-6XSPNR6L.js.map +1 -0
- package/dist/{chunk-6H2TESSP.js → chunk-765K3SAT.js} +3 -3
- package/dist/{chunk-EDTHC6UD.js → chunk-77NAFXUD.js} +2 -2
- package/dist/{chunk-S7KDBTWT.js → chunk-7F7Z6MOS.js} +29 -14
- package/dist/chunk-7F7Z6MOS.js.map +1 -0
- package/dist/{chunk-MZH6EHNR.js → chunk-7H6CFEBJ.js} +41 -14
- package/dist/chunk-7H6CFEBJ.js.map +1 -0
- package/dist/{chunk-575RMLWN.js → chunk-7MV5CWTE.js} +26 -20
- package/dist/chunk-7MV5CWTE.js.map +1 -0
- package/dist/{chunk-MGKYQQYF.js → chunk-7Q3RCKAQ.js} +2 -2
- package/dist/chunk-7RXCMVFQ.js +27 -0
- package/dist/chunk-7RXCMVFQ.js.map +1 -0
- package/dist/{chunk-DGXUHMOV.js → chunk-A2IYSXDQ.js} +25 -6
- package/dist/chunk-A2IYSXDQ.js.map +1 -0
- package/dist/{chunk-EABGC2TL.js → chunk-A2Z6UCWT.js} +26 -4
- package/dist/chunk-A2Z6UCWT.js.map +1 -0
- package/dist/{chunk-3VAL7ZL2.js → chunk-A52AKD7C.js} +59 -24
- package/dist/chunk-A52AKD7C.js.map +1 -0
- package/dist/{chunk-5375UYTQ.js → chunk-A6D7A2FW.js} +4 -4
- package/dist/chunk-A6D7A2FW.js.map +1 -0
- package/dist/{chunk-FAAFWE4G.js → chunk-ALEPI75L.js} +24 -6
- package/dist/chunk-ALEPI75L.js.map +1 -0
- package/dist/{chunk-3SLRNYNG.js → chunk-AUDJPF4N.js} +15 -4
- package/dist/chunk-AUDJPF4N.js.map +1 -0
- package/dist/chunk-B5XMS73R.js +145 -0
- package/dist/chunk-B5XMS73R.js.map +1 -0
- package/dist/{chunk-HXXBL2KD.js → chunk-BECQDWBA.js} +44 -4
- package/dist/chunk-BECQDWBA.js.map +1 -0
- package/dist/{chunk-7SEAZFFB.js → chunk-BEUDU7Y4.js} +24 -4
- package/dist/chunk-BEUDU7Y4.js.map +1 -0
- package/dist/{chunk-XVVIG67A.js → chunk-BLZAVUD2.js} +61 -17
- package/dist/chunk-BLZAVUD2.js.map +1 -0
- package/dist/chunk-CHBI22MI.js +159 -0
- package/dist/chunk-CHBI22MI.js.map +1 -0
- package/dist/{chunk-GDFS42HT.js → chunk-CHCA44C3.js} +15 -8
- package/dist/chunk-CHCA44C3.js.map +1 -0
- package/dist/chunk-CINZGPSJ.js +22 -0
- package/dist/chunk-CINZGPSJ.js.map +1 -0
- package/dist/chunk-CMTINOFS.js +36 -0
- package/dist/chunk-CMTINOFS.js.map +1 -0
- package/dist/{chunk-34DQE4KF.js → chunk-CO7ZO4TU.js} +2 -2
- package/dist/{chunk-PFV5C235.js → chunk-CPPS65WS.js} +2 -1
- package/dist/{chunk-PFV5C235.js.map → chunk-CPPS65WS.js.map} +1 -1
- package/dist/{chunk-DINWEURR.js → chunk-CSKLPDN6.js} +20 -6
- package/dist/chunk-CSKLPDN6.js.map +1 -0
- package/dist/chunk-CWWMTTQE.js +566 -0
- package/dist/chunk-CWWMTTQE.js.map +1 -0
- package/dist/{chunk-IQT3XTKW.js → chunk-D24OXEPB.js} +13 -7
- package/dist/chunk-D24OXEPB.js.map +1 -0
- package/dist/{chunk-TPU5L5EY.js → chunk-D6WE5MTW.js} +272 -411
- package/dist/chunk-D6WE5MTW.js.map +1 -0
- package/dist/{chunk-WIICJPET.js → chunk-DEUNUKTD.js} +6 -4
- package/dist/{chunk-WIICJPET.js.map → chunk-DEUNUKTD.js.map} +1 -1
- package/dist/{chunk-ZYVPLJ4T.js → chunk-DHGSZ3UD.js} +9 -7
- package/dist/chunk-DHGSZ3UD.js.map +1 -0
- package/dist/{chunk-JR4ZC3G4.js → chunk-DLJ4IR6M.js} +91 -41
- package/dist/chunk-DLJ4IR6M.js.map +1 -0
- package/dist/{chunk-U4SCL7B7.js → chunk-DRD2Q7HQ.js} +82 -18
- package/dist/chunk-DRD2Q7HQ.js.map +1 -0
- package/dist/{chunk-2IWUMAES.js → chunk-E62SBGQ3.js} +28 -13
- package/dist/chunk-E62SBGQ3.js.map +1 -0
- package/dist/{chunk-C5BCH4ZS.js → chunk-EAZGEEG2.js} +21 -3
- package/dist/chunk-EAZGEEG2.js.map +1 -0
- package/dist/{chunk-TPB3I2AC.js → chunk-ECZU5BJH.js} +31 -10
- package/dist/chunk-ECZU5BJH.js.map +1 -0
- package/dist/{chunk-77H5NU3M.js → chunk-EDBEWFJO.js} +82 -18
- package/dist/chunk-EDBEWFJO.js.map +1 -0
- package/dist/chunk-EDQVAMQI.js +308 -0
- package/dist/chunk-EDQVAMQI.js.map +1 -0
- package/dist/{chunk-RRF5UOBJ.js → chunk-EI6V5UXY.js} +22 -15
- package/dist/chunk-EI6V5UXY.js.map +1 -0
- package/dist/{chunk-I5GLV3VE.js → chunk-EIPUHVKE.js} +31 -24
- package/dist/{chunk-I5GLV3VE.js.map → chunk-EIPUHVKE.js.map} +1 -1
- package/dist/{chunk-ZKSK55RC.js → chunk-ETUPBUHB.js} +2 -2
- package/dist/{chunk-25MQ7IHJ.js → chunk-EUML3N6B.js} +17 -6
- package/dist/chunk-EUML3N6B.js.map +1 -0
- package/dist/{chunk-5RGLBDQF.js → chunk-EVZFIAPG.js} +12 -12
- package/dist/chunk-EVZFIAPG.js.map +1 -0
- package/dist/{chunk-QRNI5JBH.js → chunk-EYIEWJNI.js} +2 -2
- package/dist/{chunk-YU5KIWYQ.js → chunk-FER4WARO.js} +79 -41
- package/dist/chunk-FER4WARO.js.map +1 -0
- package/dist/{chunk-43PJZYGL.js → chunk-FPGE5NVO.js} +45 -10
- package/dist/chunk-FPGE5NVO.js.map +1 -0
- package/dist/{chunk-C6QPK5GG.js → chunk-FZZ2QTJI.js} +2 -2
- package/dist/{chunk-D46YSIYX.js → chunk-G3Z3QEF5.js} +19 -11
- package/dist/{chunk-D46YSIYX.js.map → chunk-G3Z3QEF5.js.map} +1 -1
- package/dist/{chunk-3JXBXXM2.js → chunk-G4IAEX6D.js} +2 -2
- package/dist/{chunk-MSWG7JI6.js → chunk-G56P5RLD.js} +8 -2
- package/dist/chunk-G56P5RLD.js.map +1 -0
- package/dist/{chunk-AGZQD76C.js → chunk-GCGJW34D.js} +48 -2
- package/dist/chunk-GCGJW34D.js.map +1 -0
- package/dist/chunk-H2NCNXMS.js +159 -0
- package/dist/chunk-H2NCNXMS.js.map +1 -0
- package/dist/{chunk-XYIK4LF6.js → chunk-H3FZVNRN.js} +8 -2
- package/dist/chunk-H3FZVNRN.js.map +1 -0
- package/dist/{chunk-TK4UEOSK.js → chunk-HDDRVXX4.js} +8 -8
- package/dist/chunk-HDDRVXX4.js.map +1 -0
- package/dist/{chunk-LLQ2LLWF.js → chunk-HENLZHIT.js} +15 -5
- package/dist/chunk-HENLZHIT.js.map +1 -0
- package/dist/{chunk-N2D6GXBM.js → chunk-HINSGUA7.js} +28 -20
- package/dist/chunk-HINSGUA7.js.map +1 -0
- package/dist/{chunk-APO3DCMU.js → chunk-HLAVGJ62.js} +30 -8
- package/dist/chunk-HLAVGJ62.js.map +1 -0
- package/dist/{chunk-TPMQ3G6Z.js → chunk-HOJZMQ4J.js} +2 -2
- package/dist/chunk-HOJZMQ4J.js.map +1 -0
- package/dist/{chunk-LUDTDZLK.js → chunk-HPWVAEET.js} +33 -7
- package/dist/chunk-HPWVAEET.js.map +1 -0
- package/dist/{chunk-NZL6GGQE.js → chunk-HQ6NIBL6.js} +92 -30
- package/dist/chunk-HQ6NIBL6.js.map +1 -0
- package/dist/{chunk-UWVJF25J.js → chunk-HWVTS5NO.js} +20 -6
- package/dist/chunk-HWVTS5NO.js.map +1 -0
- package/dist/{chunk-2WWLHTZY.js → chunk-IC4GELZE.js} +2 -2
- package/dist/{chunk-QA2ZAPBU.js → chunk-IPLYGWQF.js} +28 -20
- package/dist/chunk-IPLYGWQF.js.map +1 -0
- package/dist/{chunk-A6KTB5R6.js → chunk-IQ3OI2RR.js} +3 -3
- package/dist/chunk-IQ3OI2RR.js.map +1 -0
- package/dist/{chunk-6LVVDPJ4.js → chunk-J64TK33U.js} +3 -4
- package/dist/chunk-J64TK33U.js.map +1 -0
- package/dist/{chunk-6FC5EGNV.js → chunk-JBPKEARU.js} +15 -5
- package/dist/{chunk-6FC5EGNV.js.map → chunk-JBPKEARU.js.map} +1 -1
- package/dist/{chunk-RHY3HH7P.js → chunk-JFEKNTX7.js} +125 -33
- package/dist/chunk-JFEKNTX7.js.map +1 -0
- package/dist/{chunk-TZOLIGIG.js → chunk-JJEJJ7RK.js} +4 -2
- package/dist/chunk-JJEJJ7RK.js.map +1 -0
- package/dist/{chunk-PCUKNJAZ.js → chunk-JKV57BTN.js} +2 -2
- package/dist/{chunk-EJI5XIBB.js → chunk-JLNBQWZ2.js} +55 -7
- package/dist/chunk-JLNBQWZ2.js.map +1 -0
- package/dist/{chunk-XIG5PDM7.js → chunk-JUC24CTX.js} +8 -12
- package/dist/chunk-JUC24CTX.js.map +1 -0
- package/dist/{chunk-3ZLVGM76.js → chunk-JYIKKAK3.js} +106 -44
- package/dist/chunk-JYIKKAK3.js.map +1 -0
- package/dist/{chunk-OIGNEXKZ.js → chunk-K5O2QY6T.js} +5 -1
- package/dist/{chunk-OIGNEXKZ.js.map → chunk-K5O2QY6T.js.map} +1 -1
- package/dist/{chunk-ZTFCYYEZ.js → chunk-KCYE2MZM.js} +3 -3
- package/dist/chunk-KCYE2MZM.js.map +1 -0
- package/dist/{chunk-JWPLJLDU.js → chunk-KD3QD3A5.js} +2 -2
- package/dist/{chunk-JWPLJLDU.js.map → chunk-KD3QD3A5.js.map} +1 -1
- package/dist/{chunk-YRMVARQP.js → chunk-KFY3SGN7.js} +49 -2
- package/dist/chunk-KFY3SGN7.js.map +1 -0
- package/dist/{chunk-CYFQJMUV.js → chunk-KIB7SDIJ.js} +15 -10
- package/dist/chunk-KIB7SDIJ.js.map +1 -0
- package/dist/{chunk-3KW65B36.js → chunk-KILOTVIF.js} +95 -48
- package/dist/chunk-KILOTVIF.js.map +1 -0
- package/dist/{chunk-MXFBBHJU.js → chunk-KJMYHC7K.js} +10 -5
- package/dist/chunk-KJMYHC7K.js.map +1 -0
- package/dist/{chunk-W3LR522O.js → chunk-KM2A35EO.js} +36 -34
- package/dist/chunk-KM2A35EO.js.map +1 -0
- package/dist/{chunk-WELDCG6C.js → chunk-L227SKTB.js} +109 -36
- package/dist/chunk-L227SKTB.js.map +1 -0
- package/dist/{chunk-W6AQJ2PY.js → chunk-L7S47WZT.js} +35 -16
- package/dist/chunk-L7S47WZT.js.map +1 -0
- package/dist/{chunk-BVF3AGJP.js → chunk-LJBOVCQG.js} +26 -11
- package/dist/chunk-LJBOVCQG.js.map +1 -0
- package/dist/{chunk-2KI4QFHU.js → chunk-LMDRGRJ2.js} +2 -2
- package/dist/{chunk-MY6TPVXW.js → chunk-LMPHTYJC.js} +2 -2
- package/dist/{chunk-EHRTFRWW.js → chunk-LQHDIS7L.js} +10 -5
- package/dist/chunk-LQHDIS7L.js.map +1 -0
- package/dist/chunk-LUDUFZTV.js +170 -0
- package/dist/chunk-LUDUFZTV.js.map +1 -0
- package/dist/{chunk-5HRY2WRF.js → chunk-LZ3VEOU5.js} +2 -2
- package/dist/{chunk-Q7P4WJDP.js → chunk-M5T4Q2ZU.js} +1 -1
- package/dist/chunk-M5T4Q2ZU.js.map +1 -0
- package/dist/{chunk-ICRIXAP2.js → chunk-MC4FJXPA.js} +16 -6
- package/dist/chunk-MC4FJXPA.js.map +1 -0
- package/dist/{chunk-WPGJYVUH.js → chunk-MGVIEM2O.js} +23 -6
- package/dist/chunk-MGVIEM2O.js.map +1 -0
- package/dist/{chunk-YROHKYBY.js → chunk-O27WNHTT.js} +22 -6
- package/dist/chunk-O27WNHTT.js.map +1 -0
- package/dist/{chunk-NGAVDO7E.js → chunk-OADWQ5CR.js} +2 -2
- package/dist/{chunk-2NMMFZ5T.js → chunk-OD4FM2U7.js} +6 -3
- package/dist/chunk-OD4FM2U7.js.map +1 -0
- package/dist/{chunk-OZHRDTDX.js → chunk-OKTXM5H4.js} +11 -1
- package/dist/chunk-OKTXM5H4.js.map +1 -0
- package/dist/{chunk-RXDLTSWT.js → chunk-ONPLNAPX.js} +16 -7
- package/dist/chunk-ONPLNAPX.js.map +1 -0
- package/dist/{chunk-FJ43PRLT.js → chunk-ORFGK3XI.js} +20 -14
- package/dist/chunk-ORFGK3XI.js.map +1 -0
- package/dist/{chunk-DOM4GKSW.js → chunk-OZKVVUJB.js} +3 -3
- package/dist/{chunk-MT4HVDUZ.js → chunk-PM3QHTFT.js} +3 -3
- package/dist/{chunk-4DWOBS2A.js → chunk-PRQJ5ESM.js} +27 -2
- package/dist/{chunk-4DWOBS2A.js.map → chunk-PRQJ5ESM.js.map} +1 -1
- package/dist/chunk-PU44GBL4.js +52 -0
- package/dist/chunk-PU44GBL4.js.map +1 -0
- package/dist/{chunk-MJFNCJXV.js → chunk-Q4CAQGKQ.js} +47 -9
- package/dist/chunk-Q4CAQGKQ.js.map +1 -0
- package/dist/{chunk-U3WSW6PZ.js → chunk-QMYXNM4P.js} +90 -35
- package/dist/chunk-QMYXNM4P.js.map +1 -0
- package/dist/{chunk-NBNN5GOB.js → chunk-QY7YA7OL.js} +11 -2
- package/dist/chunk-QY7YA7OL.js.map +1 -0
- package/dist/{chunk-QLLBRHAT.js → chunk-R26QUUQN.js} +181 -257
- package/dist/chunk-R26QUUQN.js.map +1 -0
- package/dist/{chunk-ZK7I7JYV.js → chunk-R3PS27B4.js} +7 -7
- package/dist/{chunk-TMQLARTH.js → chunk-RCTS5CKK.js} +33 -14
- package/dist/chunk-RCTS5CKK.js.map +1 -0
- package/dist/{chunk-2PRLKQAH.js → chunk-RLV3PQGH.js} +35 -19
- package/dist/chunk-RLV3PQGH.js.map +1 -0
- package/dist/{chunk-WW3QQF4H.js → chunk-ROZJACKP.js} +16 -1
- package/dist/chunk-ROZJACKP.js.map +1 -0
- package/dist/{chunk-7MNMYOFP.js → chunk-RSUYKGGZ.js} +3 -4
- package/dist/chunk-RSUYKGGZ.js.map +1 -0
- package/dist/{chunk-LT3NLYSI.js → chunk-RUZOJKNF.js} +10 -7
- package/dist/chunk-RUZOJKNF.js.map +1 -0
- package/dist/{chunk-326G7DJK.js → chunk-RW5DGAGO.js} +67 -13
- package/dist/chunk-RW5DGAGO.js.map +1 -0
- package/dist/{chunk-KOSORCJG.js → chunk-S53PKKWK.js} +63 -24
- package/dist/chunk-S53PKKWK.js.map +1 -0
- package/dist/{chunk-65PG43EQ.js → chunk-S7WU3Y3D.js} +21 -4
- package/dist/chunk-S7WU3Y3D.js.map +1 -0
- package/dist/{chunk-SKE7JYKA.js → chunk-SFXKHM7P.js} +2 -2
- package/dist/{chunk-HMDCOMYU.js → chunk-SKGV326D.js} +3 -3
- package/dist/chunk-T2PO5MUF.js +62 -0
- package/dist/chunk-T2PO5MUF.js.map +1 -0
- package/dist/{chunk-C7VW7C3F.js → chunk-TDKQGLJW.js} +3 -3
- package/dist/chunk-TDKQGLJW.js.map +1 -0
- package/dist/{chunk-3QKK7QOS.js → chunk-TERNBNJB.js} +3 -3
- package/dist/chunk-TERNBNJB.js.map +1 -0
- package/dist/{chunk-MXC3AP5I.js → chunk-TGQ2NTWH.js} +12 -7
- package/dist/chunk-TGQ2NTWH.js.map +1 -0
- package/dist/{chunk-3Y4P7RXM.js → chunk-TMSXWOBZ.js} +3 -4
- package/dist/chunk-TMSXWOBZ.js.map +1 -0
- package/dist/{chunk-3TNBOMQT.js → chunk-TVRN5QKH.js} +11 -11
- package/dist/{chunk-3TNBOMQT.js.map → chunk-TVRN5QKH.js.map} +1 -1
- package/dist/{chunk-5UM2VJ6D.js → chunk-UEY3VB6W.js} +2 -2
- package/dist/{chunk-I6K5FBRQ.js → chunk-UI3NYK34.js} +4 -1
- package/dist/{chunk-I6K5FBRQ.js.map → chunk-UI3NYK34.js.map} +1 -1
- package/dist/{chunk-VBJ7V5SK.js → chunk-UIPDNLXA.js} +21 -8
- package/dist/chunk-UIPDNLXA.js.map +1 -0
- package/dist/{chunk-GIF42EW3.js → chunk-UP6MOYCB.js} +3 -3
- package/dist/{chunk-K4FLSOR5.js → chunk-USYGGIJZ.js} +44 -15
- package/dist/chunk-USYGGIJZ.js.map +1 -0
- package/dist/{chunk-FIT6DMX6.js → chunk-UWY7GIVS.js} +152 -54
- package/dist/chunk-UWY7GIVS.js.map +1 -0
- package/dist/{chunk-MRILGULB.js → chunk-V2RCP53Q.js} +2 -2
- package/dist/{chunk-XKECPATV.js → chunk-VFUEZZBS.js} +113 -4
- package/dist/chunk-VFUEZZBS.js.map +1 -0
- package/dist/{chunk-FSFEQI74.js → chunk-W7L6HXUC.js} +2 -2
- package/dist/{chunk-3IQ2TR4N.js → chunk-WLEB7WCG.js} +2 -2
- package/dist/{chunk-GL6I6MEQ.js → chunk-WSGF57U2.js} +3 -3
- package/dist/{chunk-KNKUID7G.js → chunk-X7Y7WX73.js} +72 -6
- package/dist/chunk-X7Y7WX73.js.map +1 -0
- package/dist/{chunk-5NPGSAVB.js → chunk-XEKAG3FM.js} +23 -5
- package/dist/chunk-XEKAG3FM.js.map +1 -0
- package/dist/{chunk-3APJ5EVB.js → chunk-XKIQZXUB.js} +41 -26
- package/dist/chunk-XKIQZXUB.js.map +1 -0
- package/dist/chunk-XKXKSQU7.js +92 -0
- package/dist/chunk-XKXKSQU7.js.map +1 -0
- package/dist/{chunk-JA3AK3PT.js → chunk-XNLXAWHX.js} +4 -4
- package/dist/{chunk-CULXMQJH.js → chunk-XPXEJRUB.js} +3 -3
- package/dist/chunk-XPXEJRUB.js.map +1 -0
- package/dist/{chunk-PZIAX57I.js → chunk-XR6DNK4U.js} +7 -4
- package/dist/chunk-XR6DNK4U.js.map +1 -0
- package/dist/{chunk-47VWKCAF.js → chunk-XSQ4SGM5.js} +33 -4
- package/dist/chunk-XSQ4SGM5.js.map +1 -0
- package/dist/{chunk-66DHUKLO.js → chunk-XSWKORGM.js} +16 -14
- package/dist/chunk-XSWKORGM.js.map +1 -0
- package/dist/{chunk-QR3C7BKQ.js → chunk-XZ4WBBB5.js} +7 -8
- package/dist/chunk-XZ4WBBB5.js.map +1 -0
- package/dist/{chunk-WNARATI3.js → chunk-Y2SXZ5KZ.js} +59 -11
- package/dist/chunk-Y2SXZ5KZ.js.map +1 -0
- package/dist/{chunk-SIC6U3GZ.js → chunk-YHV3KRKS.js} +3 -3
- package/dist/{chunk-ZPKBYX2F.js → chunk-YNDLCWXS.js} +85 -9
- package/dist/chunk-YNDLCWXS.js.map +1 -0
- package/dist/{chunk-VLXA6PI2.js → chunk-YQMZ7IH2.js} +4 -4
- package/dist/{chunk-TMM4S4IJ.js → chunk-YR6GIWWY.js} +58 -8
- package/dist/chunk-YR6GIWWY.js.map +1 -0
- package/dist/{chunk-DK5LDEQM.js → chunk-YR7XMOWK.js} +39 -23
- package/dist/chunk-YR7XMOWK.js.map +1 -0
- package/dist/chunk-ZFXCQPNO.js +27 -0
- package/dist/chunk-ZFXCQPNO.js.map +1 -0
- package/dist/citations.js +1 -1
- package/dist/{cli-kuh9PwZ5.d.ts → cli-X4NJoqSe.d.ts} +8 -31
- package/dist/cli.d.ts +10 -6
- package/dist/cli.js +122 -117
- package/dist/commitment-ledger.js +2 -2
- package/dist/compat/checks.js +1 -2
- package/dist/compounding/engine.d.ts +3 -2
- package/dist/compounding/engine.js +11 -11
- package/dist/compounding/preference-consolidator.d.ts +1 -0
- package/dist/compounding/preference-consolidator.js +8 -8
- package/dist/compounding/preference-consolidator.js.map +1 -1
- package/dist/compression-optimizer.d.ts +1 -0
- package/dist/compression-optimizer.js +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.js +3 -2
- package/dist/connectors/codex-materialize-runner.d.ts +1 -0
- package/dist/connectors/codex-materialize-runner.js +12 -11
- package/dist/connectors/codex-materialize.d.ts +1 -0
- package/dist/connectors/codex-materialize.js +3 -2
- package/dist/connectors/index.d.ts +1 -0
- package/dist/connectors/index.js +14 -14
- package/dist/{connectors-cli-CwbyjGR7.d.ts → connectors-cli-DbTPNj2H.d.ts} +7 -1
- package/dist/connectors-cli.d.ts +1 -1
- package/dist/connectors-cli.js +3 -1
- package/dist/consolidation-provenance-check.d.ts +1 -0
- package/dist/consolidation-provenance-check.js +2 -2
- package/dist/consolidation-undo.d.ts +1 -0
- package/dist/consolidation-undo.js +1 -1
- package/dist/contradiction/index.d.ts +3 -1
- package/dist/contradiction/index.js +3 -3
- package/dist/{contradiction-review-ATP4S6IC.js → contradiction-review-6V2LXXK6.js} +2 -2
- package/dist/{contradiction-scan-5A4IDZV5.js → contradiction-scan-GIRVC4C7.js} +3 -3
- package/dist/conversation-index/backend.d.ts +3 -1
- package/dist/conversation-index/backend.js +3 -3
- package/dist/conversation-index/chunker.d.ts +1 -0
- package/dist/conversation-index/cleanup.js +1 -1
- package/dist/conversation-index/faiss-adapter.d.ts +2 -1
- package/dist/conversation-index/faiss-adapter.js +1 -1
- package/dist/conversation-index/indexer.d.ts +5 -2
- package/dist/conversation-index/indexer.js +1 -1
- package/dist/conversation-index/search.d.ts +2 -1
- package/dist/cross-namespace-budget.js +1 -1
- package/dist/cue-anchors.js +2 -2
- package/dist/dashboard-runtime.d.ts +6 -0
- package/dist/dashboard-runtime.js +3 -3
- package/dist/day-summary.d.ts +1 -0
- package/dist/day-summary.js +2 -2
- package/dist/delinearize.d.ts +1 -0
- package/dist/direct-answer-wiring.d.ts +1 -0
- package/dist/direct-answer.d.ts +1 -0
- package/dist/{dreams-ledger-LR2NBAZE.js → dreams-ledger-3WSCI5V4.js} +5 -4
- package/dist/{dreams-ledger-LR2NBAZE.js.map → dreams-ledger-3WSCI5V4.js.map} +1 -1
- package/dist/embedding-fallback.d.ts +3 -0
- package/dist/embedding-fallback.js +2 -2
- package/dist/enrichment/index.d.ts +1 -0
- package/dist/enrichment/index.js +1 -1
- package/dist/entity-retrieval.d.ts +2 -0
- package/dist/entity-retrieval.js +9 -9
- package/dist/entity-schema.d.ts +1 -0
- package/dist/evals.js +1 -1
- package/dist/explicit-capture.d.ts +5 -3
- package/dist/explicit-capture.js +2 -2
- package/dist/extraction-judge-telemetry.d.ts +2 -0
- package/dist/extraction-judge-training.d.ts +2 -0
- package/dist/extraction-judge.d.ts +2 -0
- package/dist/extraction.d.ts +2 -0
- package/dist/extraction.js +12 -12
- package/dist/{faiss-adapter-CzPghc4C.d.ts → faiss-adapter-BHecI1fF.d.ts} +4 -1
- package/dist/fallback-llm.d.ts +11 -1
- package/dist/fallback-llm.js +8 -6
- package/dist/{first-start-migration-4MHQEOSD.js → first-start-migration-CKTCTCQI.js} +5 -5
- package/dist/graph-dashboard-diff.d.ts +4 -0
- package/dist/graph-dashboard-diff.js +1 -1
- package/dist/graph-dashboard-parser.js +1 -1
- package/dist/{graph-edge-decay-5DI5GUNL.js → graph-edge-decay-MUP5J7CC.js} +6 -6
- package/dist/graph-events.js +1 -1
- package/dist/graph-snapshot.js +3 -3
- package/dist/graph.js +2 -2
- package/dist/harmonic-retrieval.js +4 -4
- package/dist/identity-continuity.d.ts +1 -0
- package/dist/importance.d.ts +1 -0
- package/dist/importers/index.d.ts +244 -0
- package/dist/importers/index.js +20 -0
- package/dist/index.d.ts +20 -350
- package/dist/index.js +884 -561
- package/dist/index.js.map +1 -1
- package/dist/intent.d.ts +1 -0
- package/dist/lcm/archive.d.ts +2 -2
- package/dist/lcm/archive.js +2 -2
- package/dist/lcm/engine.d.ts +3 -2
- package/dist/lcm/engine.js +6 -6
- package/dist/lcm/index.d.ts +1 -0
- package/dist/lcm/index.js +8 -8
- package/dist/lcm/recall.js +1 -1
- package/dist/lcm/summarizer.js +3 -3
- package/dist/lcm/tools.d.ts +1 -0
- package/dist/lifecycle.d.ts +1 -0
- package/dist/live-connectors-runner.d.ts +1 -0
- package/dist/live-connectors-runner.js +6 -6
- package/dist/local-llm.d.ts +1 -0
- package/dist/local-llm.js +2 -2
- package/dist/maintenance/archive-observations.js +1 -1
- package/dist/maintenance/memory-governance.d.ts +3 -1
- package/dist/maintenance/memory-governance.js +10 -8
- package/dist/maintenance/migrate-observations.js +3 -2
- package/dist/maintenance/observation-ledger-utils.d.ts +3 -0
- package/dist/maintenance/observation-ledger-utils.js +2 -1
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -1
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +11 -8
- package/dist/maintenance/rebuild-memory-projection.d.ts +2 -1
- package/dist/maintenance/rebuild-memory-projection.js +13 -10
- package/dist/maintenance/rebuild-observations.d.ts +1 -0
- package/dist/maintenance/rebuild-observations.js +3 -2
- package/dist/mcp-memory-inspector-app.d.ts +7 -4
- package/dist/mcp-memory-inspector-app.js +1 -1
- package/dist/memory-action-policy.d.ts +1 -0
- package/dist/memory-cache.d.ts +1 -0
- package/dist/memory-cache.js +1 -1
- package/dist/memory-lifecycle-ledger-utils.d.ts +1 -0
- package/dist/memory-projection-store.d.ts +1 -0
- package/dist/memory-projection-store.js +1 -1
- package/dist/memory-provenance.d.ts +1 -0
- package/dist/memory-worth-outcomes.d.ts +1 -0
- package/dist/migrate/from-engram.js +2 -2
- package/dist/{migrate-from-identity-anchor-G27MCD6A.js → migrate-from-identity-anchor-EB4XI4Q2.js} +2 -2
- package/dist/model-registry.js +1 -1
- package/dist/models-json.d.ts +1 -0
- package/dist/namespaces/migrate.d.ts +3 -0
- package/dist/namespaces/migrate.js +24 -22
- package/dist/namespaces/principal.d.ts +1 -0
- package/dist/namespaces/principal.js +2 -1
- package/dist/namespaces/search.d.ts +1 -0
- package/dist/namespaces/search.js +15 -13
- package/dist/namespaces/storage.d.ts +4 -2
- package/dist/namespaces/storage.js +10 -9
- package/dist/native-knowledge.d.ts +1 -0
- package/dist/native-knowledge.js +1 -1
- package/dist/negative.js +1 -1
- package/dist/network/webdav.d.ts +16 -1
- package/dist/network/webdav.js +5 -3
- package/dist/objective-state-writers.js +4 -4
- package/dist/objective-state.js +2 -2
- package/dist/offline-sync.js +4 -4
- package/dist/operator-toolkit.d.ts +1 -0
- package/dist/operator-toolkit.js +35 -32
- package/dist/opik-exporter.js +1 -1
- package/dist/{orchestrator-DuWl9Hwx.d.ts → orchestrator-Co9nxRLF.d.ts} +4 -74
- package/dist/orchestrator.d.ts +5 -3
- package/dist/orchestrator.js +99 -96
- package/dist/page-versioning.js +1 -1
- package/dist/path-X2K5XCHL.js +9 -0
- package/dist/patterns-cli.d.ts +1 -0
- package/dist/peers/index.d.ts +328 -0
- package/dist/{peers-HCVGHMAE.js → peers/index.js} +4 -4
- package/dist/pipeline-D18UAKlN.d.ts +32 -0
- package/dist/plugin-entry-resolver.d.ts +9 -0
- package/dist/plugin-entry-resolver.js +8 -0
- package/dist/plugin-entry-resolver.js.map +1 -0
- package/dist/plugin-id.d.ts +2 -21
- package/dist/plugin-id.js +33 -4
- package/dist/plugin-id.js.map +1 -1
- package/dist/policy-runtime.d.ts +4 -0
- package/dist/policy-runtime.js +1 -1
- package/dist/profiling.js +1 -1
- package/dist/qmd-recall-cache.d.ts +1 -0
- package/dist/qmd.d.ts +1 -0
- package/dist/qmd.js +3 -3
- package/dist/recall-disclosure-escalation.d.ts +1 -0
- package/dist/recall-explain-renderer.d.ts +1 -0
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-state.d.ts +8 -1
- package/dist/recall-state.js +2 -1
- package/dist/recall-tag-filter.d.ts +1 -0
- package/dist/recall-xray-cli.d.ts +1 -0
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.d.ts +1 -0
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.d.ts +1 -0
- package/dist/recall-xray.js +2 -2
- package/dist/relevance.d.ts +7 -1
- package/dist/relevance.js +2 -1
- package/dist/replay/normalizers/chatgpt.js +2 -2
- package/dist/replay/normalizers/claude.js +2 -2
- package/dist/replay/normalizers/openclaw.js +2 -2
- package/dist/replay/normalizers/shared.js +1 -1
- package/dist/replay/runner.js +1 -1
- package/dist/rerank.js +1 -1
- package/dist/{resolution-B7FNQSSP.js → resolution-ZY7VM6WS.js} +3 -3
- package/dist/resolution-ZY7VM6WS.js.map +1 -0
- package/dist/resolve-auth-token.d.ts +1 -0
- package/dist/resolve-auth-token.js +1 -1
- package/dist/resolve-provider-secret.d.ts +19 -29
- package/dist/resolve-provider-secret.js +2 -6
- package/dist/resume-bundles.js +10 -9
- package/dist/retrieval-agents.d.ts +2 -1
- package/dist/retrieval-agents.js +2 -1
- package/dist/retrieval-tiers.d.ts +1 -0
- package/dist/routing/engine.d.ts +1 -0
- package/dist/routing/store.d.ts +3 -0
- package/dist/routing/store.js +1 -1
- package/dist/runtime/env.js +1 -1
- package/dist/schemas.d.ts +191 -17
- package/dist/schemas.js +1 -1
- package/dist/sdk-compat.js +1 -1
- package/dist/search/document-scanner.js +1 -1
- package/dist/search/embed-helper.d.ts +7 -2
- package/dist/search/embed-helper.js +3 -1
- package/dist/search/factory.d.ts +2 -1
- package/dist/search/factory.js +13 -12
- package/dist/search/index.d.ts +2 -1
- package/dist/search/index.js +19 -18
- package/dist/search/lancedb-backend.d.ts +7 -6
- package/dist/search/lancedb-backend.js +4 -2
- package/dist/search/meilisearch-backend.d.ts +7 -6
- package/dist/search/meilisearch-backend.js +4 -2
- package/dist/search/noop-backend.d.ts +1 -0
- package/dist/search/orama-backend.d.ts +9 -7
- package/dist/search/orama-backend.js +8 -4
- package/dist/search/port.d.ts +1 -0
- package/dist/search/remote-backend.d.ts +1 -0
- package/dist/secure-store/index.d.ts +16 -3
- package/dist/secure-store/index.js +2 -2
- package/dist/{semantic-VwGI14Ok.d.ts → semantic-SLAa_prH.d.ts} +5 -3
- package/dist/semantic-consolidation.d.ts +1 -0
- package/dist/semantic-consolidation.js +14 -13
- package/dist/semantic-rule-promotion.js +8 -8
- package/dist/semantic-rule-verifier.d.ts +1 -0
- package/dist/semantic-rule-verifier.js +8 -8
- package/dist/session-integrity.d.ts +1 -0
- package/dist/session-integrity.js +1 -1
- package/dist/session-observer-bands.d.ts +1 -0
- package/dist/session-observer-state.d.ts +6 -1
- package/dist/session-observer-state.js +1 -1
- package/dist/shared-context/manager.d.ts +5 -0
- package/dist/shared-context/manager.js +3 -3
- package/dist/signal.d.ts +1 -0
- package/dist/signal.js +1 -1
- package/dist/source-attribution.js +1 -1
- package/dist/state-store-4QZISH3J.js +30 -0
- package/dist/state-store-4QZISH3J.js.map +1 -0
- package/dist/storage-C4DX8CuG.d.ts +157 -0
- package/dist/storage.d.ts +2 -0
- package/dist/storage.js +7 -7
- package/dist/store-contract.js +1 -1
- package/dist/summarizer.d.ts +1 -0
- package/dist/summarizer.js +7 -7
- package/dist/summary-snapshot.d.ts +1 -0
- package/dist/surfaces/dreams.js +48 -17
- package/dist/surfaces/dreams.js.map +1 -1
- package/dist/temporal-supersession.d.ts +1 -0
- package/dist/temporal-supersession.js +1 -1
- package/dist/temporal-validity.d.ts +1 -0
- package/dist/threading.d.ts +1 -0
- package/dist/tier-migration.d.ts +1 -0
- package/dist/tier-routing.d.ts +1 -0
- package/dist/{tier-stats-62ZVDFKS.js → tier-stats-SKML2OSF.js} +5 -5
- package/dist/tmt.js +1 -1
- package/dist/tokens.js +2 -2
- package/dist/topics.d.ts +1 -0
- package/dist/{trace-C5ETWBEF.js → trace-WM7V4CKI.js} +31 -1
- package/dist/trace-WM7V4CKI.js.map +1 -0
- package/dist/transcript.d.ts +1 -0
- package/dist/transcript.js +2 -2
- package/dist/transfer/autodetect.js +7 -7
- package/dist/transfer/backup.js +5 -5
- package/dist/transfer/capsule-export.js +5 -5
- package/dist/transfer/capsule-import.d.ts +6 -0
- package/dist/transfer/capsule-import.js +4 -4
- package/dist/transfer/export-json.js +3 -3
- package/dist/transfer/export-md.js +3 -3
- package/dist/transfer/export-sqlite.js +3 -3
- package/dist/transfer/fs-utils.d.ts +2 -1
- package/dist/transfer/fs-utils.js +5 -3
- package/dist/transfer/import-json.js +3 -3
- package/dist/transfer/import-md.js +3 -3
- package/dist/transfer/import-sqlite.js +3 -3
- package/dist/trust-zones.js +2 -2
- package/dist/types-B1VHaf2w.d.ts +126 -0
- package/dist/types-BliCnURB.d.ts +83 -0
- package/dist/types.d.ts +35 -0
- package/dist/types.js +1 -1
- package/dist/utility-learner.js +3 -3
- package/dist/utility-runtime.d.ts +1 -0
- package/dist/utility-runtime.js +4 -4
- package/dist/utility-telemetry.js +2 -2
- package/dist/verified-recall.js +9 -9
- package/dist/work/board.js +2 -2
- package/dist/work/boundary.js +1 -1
- package/dist/work/storage.d.ts +5 -0
- package/dist/work/storage.js +1 -1
- package/dist/work-product-ledger.js +2 -2
- package/package.json +74 -3
- package/scripts/ensure-better-sqlite3.mjs +8 -7
- package/scripts/faiss_index.py +141 -29
- package/src/access-cli.test.ts +87 -2
- package/src/access-cli.ts +59 -5
- package/src/access-http.test.ts +150 -0
- package/src/access-http.ts +89 -34
- package/src/access-idempotency.ts +136 -3
- package/src/access-mcp.test.ts +155 -0
- package/src/access-mcp.ts +116 -30
- package/src/access-schema.ts +22 -4
- package/src/access-service-project-tag.test.ts +37 -0
- package/src/access-service.ts +11 -10
- package/src/active-recall.test.ts +29 -1
- package/src/active-recall.ts +11 -7
- package/src/adapters/claude-code.ts +7 -8
- package/src/adapters/codex.ts +6 -7
- package/src/adapters/hermes.ts +1 -5
- package/src/adapters/registry.test.ts +63 -0
- package/src/adapters/registry.ts +10 -0
- package/src/adapters/replit.ts +5 -7
- package/src/adapters/types.ts +24 -1
- package/src/behavior-signals.ts +1 -1
- package/src/binary-lifecycle/backend.ts +16 -4
- package/src/binary-lifecycle/pipeline.test.ts +149 -0
- package/src/binary-lifecycle/pipeline.ts +49 -7
- package/src/binary-lifecycle/scanner.ts +19 -4
- package/src/boxes.ts +119 -32
- package/src/buffer-session.test.ts +28 -0
- package/src/buffer.ts +10 -14
- package/src/bulk-import/types.ts +10 -0
- package/src/calibration.test.ts +99 -0
- package/src/calibration.ts +57 -13
- package/src/causal-consolidation.test.ts +214 -0
- package/src/causal-consolidation.ts +131 -14
- package/src/causal-retrieval.ts +16 -3
- package/src/citations.test.ts +75 -0
- package/src/citations.ts +19 -6
- package/src/cli.ts +134 -109
- package/src/coding/coding-namespace.test.ts +7 -0
- package/src/coding/coding-namespace.ts +8 -0
- package/src/coding/review-context.test.ts +30 -0
- package/src/coding/review-context.ts +79 -9
- package/src/coding/wire-coding-context.test.ts +16 -0
- package/src/compat/checks.test.ts +33 -0
- package/src/compat/checks.ts +64 -4
- package/src/compounding/engine.ts +2 -2
- package/src/compounding/preference-consolidator.test.ts +47 -0
- package/src/compounding/preference-consolidator.ts +8 -8
- package/src/compression-optimizer.ts +5 -2
- package/src/config.test.ts +34 -2
- package/src/config.ts +62 -18
- package/src/connectors/codex-materialize-runner.ts +4 -3
- package/src/connectors/codex-materialize.ts +149 -34
- package/src/connectors/index.test.ts +144 -7
- package/src/connectors/index.ts +86 -15
- package/src/connectors/live/github.test.ts +47 -0
- package/src/connectors/live/github.ts +29 -1
- package/src/connectors/live/index.ts +2 -0
- package/src/connectors/live/live-connectors.test.ts +359 -73
- package/src/connectors/live/notion.test.ts +84 -0
- package/src/connectors/live/notion.ts +18 -1
- package/src/connectors/live/state-store.ts +419 -38
- package/src/connectors/weclone-installer.test.ts +16 -18
- package/src/connectors-cli.ts +19 -0
- package/src/console/trace.test.ts +28 -0
- package/src/console/trace.ts +42 -5
- package/src/contradiction/contradiction-judge.test.ts +49 -0
- package/src/contradiction/contradiction-judge.ts +15 -5
- package/src/contradiction/contradiction-review.ts +31 -7
- package/src/contradiction/contradiction-scan.ts +28 -18
- package/src/contradiction/contradiction.test.ts +237 -1
- package/src/contradiction/resolution.ts +43 -4
- package/src/conversation-index/backend.ts +13 -5
- package/src/conversation-index/cleanup.ts +25 -4
- package/src/conversation-index/faiss-adapter.ts +24 -15
- package/src/conversation-index/indexer.test.ts +71 -10
- package/src/conversation-index/indexer.ts +22 -3
- package/src/cross-namespace-budget.test.ts +59 -0
- package/src/cross-namespace-budget.ts +15 -7
- package/src/curation/index.ts +18 -17
- package/src/dashboard-runtime.test.ts +98 -0
- package/src/dashboard-runtime.ts +96 -6
- package/src/dedup/index.test.ts +133 -0
- package/src/dedup/index.ts +73 -10
- package/src/dedup/semantic.test.ts +77 -2
- package/src/dedup/semantic.ts +26 -6
- package/src/embedding-fallback.ts +47 -15
- package/src/enrichment/audit.ts +8 -1
- package/src/enrichment/pipeline.ts +21 -13
- package/src/enrichment/web-search-provider.ts +1 -6
- package/src/entity-retrieval.ts +57 -6
- package/src/evals.ts +22 -13
- package/src/explicit-capture.test.ts +40 -0
- package/src/explicit-capture.ts +14 -2
- package/src/extraction.ts +42 -30
- package/src/fallback-llm.ts +35 -2
- package/src/graph-dashboard-diff.test.ts +57 -0
- package/src/graph-dashboard-diff.ts +24 -2
- package/src/graph-dashboard-parser.test.ts +31 -0
- package/src/graph-dashboard-parser.ts +4 -1
- package/src/graph-events.ts +6 -4
- package/src/graph.test.ts +69 -0
- package/src/graph.ts +7 -4
- package/src/importers/base.test.ts +70 -0
- package/src/importers/base.ts +56 -7
- package/src/index.ts +5 -2
- package/src/lcm/archive.ts +65 -16
- package/src/lcm/engine.ts +27 -8
- package/src/lcm/recall.ts +5 -5
- package/src/lcm-engine.test.ts +87 -1
- package/src/lcm-recall.test.ts +71 -0
- package/src/live-connectors-runner.ts +100 -36
- package/src/maintenance/archive-observations.ts +24 -3
- package/src/maintenance/atomic-file.ts +85 -0
- package/src/maintenance/dreams-ledger.ts +15 -8
- package/src/maintenance/memory-governance.test.ts +53 -0
- package/src/maintenance/memory-governance.ts +15 -5
- package/src/maintenance/observation-ledger-utils.ts +6 -5
- package/src/maintenance/purge.test.ts +64 -0
- package/src/maintenance/rebuild-memory-lifecycle-ledger.ts +22 -9
- package/src/maintenance/rebuild-memory-projection.ts +22 -9
- package/src/maintenance/rebuild-observations.ts +7 -3
- package/src/mcp-memory-inspector-app.ts +26 -3
- package/src/memory-cache.test.ts +19 -0
- package/src/memory-cache.ts +1 -0
- package/src/memory-extension/codex-publisher.ts +25 -4
- package/src/memory-extension-host/host-discovery.test.ts +69 -0
- package/src/memory-extension-host/host-discovery.ts +63 -6
- package/src/memory-projection-store.ts +114 -62
- package/src/message-parts/index.ts +46 -31
- package/src/message-parts/message-parts.test.ts +77 -0
- package/src/migrate/from-engram.ts +68 -14
- package/src/model-registry.test.ts +38 -0
- package/src/model-registry.ts +12 -7
- package/src/namespaces/identity.test.ts +66 -0
- package/src/namespaces/identity.ts +23 -0
- package/src/namespaces/migrate.test.ts +62 -0
- package/src/namespaces/migrate.ts +82 -14
- package/src/namespaces/principal.test.ts +37 -1
- package/src/namespaces/principal.ts +18 -7
- package/src/namespaces/search.test.ts +76 -6
- package/src/namespaces/search.ts +22 -21
- package/src/namespaces/storage.ts +93 -11
- package/src/native-knowledge.ts +23 -3
- package/src/negative.ts +50 -5
- package/src/network/webdav.ts +177 -58
- package/src/onboarding/index.test.ts +105 -0
- package/src/onboarding/index.ts +17 -5
- package/src/operator-toolkit.ts +39 -4
- package/src/orchestrator.ts +52 -17
- package/src/page-versioning.ts +31 -5
- package/src/peers/peers.test.ts +70 -0
- package/src/peers/storage.ts +32 -3
- package/src/plugin-entry-resolver.test.ts +60 -0
- package/src/plugin-entry-resolver.ts +48 -0
- package/src/plugin-id.test.ts +38 -0
- package/src/plugin-id.ts +31 -64
- package/src/policy-runtime.test.ts +75 -0
- package/src/policy-runtime.ts +32 -3
- package/src/procedural/procedure-miner.test.ts +152 -0
- package/src/procedural/procedure-miner.ts +124 -19
- package/src/profiling.test.ts +23 -0
- package/src/profiling.ts +10 -1
- package/src/projection/index.test.ts +253 -0
- package/src/projection/index.ts +159 -18
- package/src/qmd-client.test.ts +45 -0
- package/src/qmd.ts +8 -8
- package/src/recall-disclosure.test.ts +15 -1
- package/src/recall-state.ts +24 -5
- package/src/relevance.ts +24 -5
- package/src/replay/normalizers/chatgpt.ts +14 -4
- package/src/replay/normalizers/claude.ts +8 -3
- package/src/replay/normalizers/openclaw.ts +35 -12
- package/src/replay/normalizers/replay-normalizers.test.ts +65 -0
- package/src/replay/normalizers/shared.ts +4 -1
- package/src/replay/runner.ts +1 -1
- package/src/rerank.test.ts +41 -1
- package/src/rerank.ts +2 -2
- package/src/resolve-auth-token.test.ts +29 -0
- package/src/resolve-auth-token.ts +12 -7
- package/src/resolve-provider-secret.test.ts +78 -22
- package/src/resolve-provider-secret.ts +55 -223
- package/src/retrieval-agents.ts +51 -14
- package/src/review/index.test.ts +75 -1
- package/src/review/index.ts +88 -30
- package/src/routing/store.ts +36 -6
- package/src/runtime/env.test.ts +73 -0
- package/src/runtime/env.ts +7 -11
- package/src/schemas.ts +16 -1
- package/src/search/abort.ts +18 -0
- package/src/search/document-scanner.test.ts +80 -0
- package/src/search/document-scanner.ts +51 -9
- package/src/search/embed-helper.ts +19 -6
- package/src/search/factory.ts +9 -5
- package/src/search/lancedb-backend.ts +62 -22
- package/src/search/meilisearch-backend.ts +35 -12
- package/src/search/orama-backend.test.ts +27 -0
- package/src/search/orama-backend.ts +65 -15
- package/src/secure-store/cli-handlers.ts +70 -6
- package/src/secure-store/cli-renderer.ts +13 -7
- package/src/secure-store/secure-fs.ts +11 -5
- package/src/secure-store/secure-store.test.ts +70 -0
- package/src/semantic-consolidation.test.ts +45 -0
- package/src/semantic-consolidation.ts +3 -3
- package/src/session-integrity.test.ts +98 -0
- package/src/session-integrity.ts +51 -1
- package/src/session-observer-state.ts +108 -41
- package/src/shared-context/manager.ts +93 -15
- package/src/signal.test.ts +14 -0
- package/src/signal.ts +8 -1
- package/src/source-attribution.test.ts +8 -0
- package/src/source-attribution.ts +24 -2
- package/src/spaces/index.test.ts +93 -0
- package/src/spaces/index.ts +75 -9
- package/src/storage.ts +14 -1
- package/src/store-contract.test.ts +35 -0
- package/src/store-contract.ts +39 -5
- package/src/summarizer.ts +24 -18
- package/src/summary-snapshot.test.ts +77 -0
- package/src/surfaces/dreams.test.ts +73 -0
- package/src/surfaces/dreams.ts +53 -19
- package/src/sync/index.ts +42 -17
- package/src/taxonomy/taxonomy-loader.ts +43 -4
- package/src/temporal-supersession.test.ts +67 -0
- package/src/temporal-supersession.ts +8 -0
- package/src/tmt.test.ts +50 -0
- package/src/tmt.ts +35 -11
- package/src/tokens.test.ts +18 -0
- package/src/tokens.ts +7 -0
- package/src/training-export/converter.test.ts +55 -2
- package/src/training-export/converter.ts +36 -10
- package/src/training-export/registry.test.ts +17 -0
- package/src/training-export/registry.ts +19 -1
- package/src/transcript.ts +2 -2
- package/src/transfer/backup.ts +18 -7
- package/src/transfer/capsule-crypto.ts +105 -21
- package/src/transfer/capsule-encrypt.test.ts +106 -7
- package/src/transfer/capsule-export.ts +23 -14
- package/src/transfer/capsule-import.ts +11 -2
- package/src/transfer/exclusions.ts +7 -0
- package/src/transfer/export-sqlite.ts +14 -13
- package/src/transfer/fs-utils.ts +52 -1
- package/src/transfer/import-json.ts +12 -7
- package/src/transfer/import-md.ts +5 -5
- package/src/transfer/import-sqlite.ts +4 -5
- package/src/trust-zones.ts +1 -1
- package/src/types.ts +25 -0
- package/src/utility-telemetry.ts +1 -1
- package/src/utils/category-dir.test.ts +15 -0
- package/src/utils/category-dir.ts +3 -1
- package/src/work/boundary.ts +30 -18
- package/src/work/storage.ts +116 -38
- package/src/work-product-ledger.ts +1 -1
- package/dist/chunk-25MQ7IHJ.js.map +0 -1
- package/dist/chunk-2IWUMAES.js.map +0 -1
- package/dist/chunk-2NMMFZ5T.js.map +0 -1
- package/dist/chunk-2PRLKQAH.js.map +0 -1
- package/dist/chunk-326G7DJK.js.map +0 -1
- package/dist/chunk-3APJ5EVB.js.map +0 -1
- package/dist/chunk-3KW65B36.js.map +0 -1
- package/dist/chunk-3QKK7QOS.js.map +0 -1
- package/dist/chunk-3SLRNYNG.js.map +0 -1
- package/dist/chunk-3VAL7ZL2.js.map +0 -1
- package/dist/chunk-3Y4P7RXM.js.map +0 -1
- package/dist/chunk-3ZLVGM76.js.map +0 -1
- package/dist/chunk-43PJZYGL.js.map +0 -1
- package/dist/chunk-47VWKCAF.js.map +0 -1
- package/dist/chunk-4KGVTPGD.js.map +0 -1
- package/dist/chunk-5375UYTQ.js.map +0 -1
- package/dist/chunk-56K5QLHX.js.map +0 -1
- package/dist/chunk-575RMLWN.js.map +0 -1
- package/dist/chunk-5NPGSAVB.js.map +0 -1
- package/dist/chunk-5RGLBDQF.js.map +0 -1
- package/dist/chunk-65PG43EQ.js.map +0 -1
- package/dist/chunk-66DHUKLO.js.map +0 -1
- package/dist/chunk-6LVVDPJ4.js.map +0 -1
- package/dist/chunk-76FLAAUC.js.map +0 -1
- package/dist/chunk-77H5NU3M.js.map +0 -1
- package/dist/chunk-7MNMYOFP.js.map +0 -1
- package/dist/chunk-7OZ53EXP.js.map +0 -1
- package/dist/chunk-7SEAZFFB.js.map +0 -1
- package/dist/chunk-A6KTB5R6.js.map +0 -1
- package/dist/chunk-AGZQD76C.js.map +0 -1
- package/dist/chunk-APO3DCMU.js.map +0 -1
- package/dist/chunk-BVF3AGJP.js.map +0 -1
- package/dist/chunk-C5BCH4ZS.js.map +0 -1
- package/dist/chunk-C7VW7C3F.js.map +0 -1
- package/dist/chunk-CULXMQJH.js.map +0 -1
- package/dist/chunk-CYFQJMUV.js.map +0 -1
- package/dist/chunk-D654IBA6.js +0 -61
- package/dist/chunk-D654IBA6.js.map +0 -1
- package/dist/chunk-DGXUHMOV.js.map +0 -1
- package/dist/chunk-DINWEURR.js.map +0 -1
- package/dist/chunk-DK5LDEQM.js.map +0 -1
- package/dist/chunk-EABGC2TL.js.map +0 -1
- package/dist/chunk-EHRTFRWW.js.map +0 -1
- package/dist/chunk-EJI5XIBB.js.map +0 -1
- package/dist/chunk-FAAFWE4G.js.map +0 -1
- package/dist/chunk-FAJ7FZYM.js +0 -11
- package/dist/chunk-FAJ7FZYM.js.map +0 -1
- package/dist/chunk-FDU6HUUL.js +0 -147
- package/dist/chunk-FDU6HUUL.js.map +0 -1
- package/dist/chunk-FIT6DMX6.js.map +0 -1
- package/dist/chunk-FJ43PRLT.js.map +0 -1
- package/dist/chunk-FLTNHQK6.js +0 -262
- package/dist/chunk-FLTNHQK6.js.map +0 -1
- package/dist/chunk-GDFS42HT.js.map +0 -1
- package/dist/chunk-H3ME6L6D.js.map +0 -1
- package/dist/chunk-HXXBL2KD.js.map +0 -1
- package/dist/chunk-ICRIXAP2.js.map +0 -1
- package/dist/chunk-IQT3XTKW.js.map +0 -1
- package/dist/chunk-JR4ZC3G4.js.map +0 -1
- package/dist/chunk-K4FLSOR5.js.map +0 -1
- package/dist/chunk-KNKUID7G.js.map +0 -1
- package/dist/chunk-KOSORCJG.js.map +0 -1
- package/dist/chunk-LIRZNNUP.js.map +0 -1
- package/dist/chunk-LLQ2LLWF.js.map +0 -1
- package/dist/chunk-LPMVBPA3.js +0 -236
- package/dist/chunk-LPMVBPA3.js.map +0 -1
- package/dist/chunk-LT3NLYSI.js.map +0 -1
- package/dist/chunk-LUDTDZLK.js.map +0 -1
- package/dist/chunk-MJFNCJXV.js.map +0 -1
- package/dist/chunk-MSWG7JI6.js.map +0 -1
- package/dist/chunk-MXC3AP5I.js.map +0 -1
- package/dist/chunk-MXFBBHJU.js.map +0 -1
- package/dist/chunk-MZH6EHNR.js.map +0 -1
- package/dist/chunk-N2D6GXBM.js.map +0 -1
- package/dist/chunk-NBNN5GOB.js.map +0 -1
- package/dist/chunk-NMZY542O.js.map +0 -1
- package/dist/chunk-NZL6GGQE.js.map +0 -1
- package/dist/chunk-OZHRDTDX.js.map +0 -1
- package/dist/chunk-PZIAX57I.js.map +0 -1
- package/dist/chunk-Q7P4WJDP.js.map +0 -1
- package/dist/chunk-QA2ZAPBU.js.map +0 -1
- package/dist/chunk-QDZ2RLEC.js.map +0 -1
- package/dist/chunk-QLLBRHAT.js.map +0 -1
- package/dist/chunk-QR3C7BKQ.js.map +0 -1
- package/dist/chunk-RHY3HH7P.js.map +0 -1
- package/dist/chunk-RK2Y4XOM.js.map +0 -1
- package/dist/chunk-RR2PKP3I.js +0 -63
- package/dist/chunk-RR2PKP3I.js.map +0 -1
- package/dist/chunk-RRF5UOBJ.js.map +0 -1
- package/dist/chunk-RXDLTSWT.js.map +0 -1
- package/dist/chunk-RYED3SPJ.js +0 -42
- package/dist/chunk-RYED3SPJ.js.map +0 -1
- package/dist/chunk-S7KDBTWT.js.map +0 -1
- package/dist/chunk-TK4UEOSK.js.map +0 -1
- package/dist/chunk-TMM4S4IJ.js.map +0 -1
- package/dist/chunk-TMQLARTH.js.map +0 -1
- package/dist/chunk-TPB3I2AC.js.map +0 -1
- package/dist/chunk-TPMQ3G6Z.js.map +0 -1
- package/dist/chunk-TPU5L5EY.js.map +0 -1
- package/dist/chunk-TZOLIGIG.js.map +0 -1
- package/dist/chunk-U3WSW6PZ.js.map +0 -1
- package/dist/chunk-U4SCL7B7.js.map +0 -1
- package/dist/chunk-U66YHYC7.js +0 -31
- package/dist/chunk-U66YHYC7.js.map +0 -1
- package/dist/chunk-UWVJF25J.js.map +0 -1
- package/dist/chunk-VBJ7V5SK.js.map +0 -1
- package/dist/chunk-W3LR522O.js.map +0 -1
- package/dist/chunk-W4L6CZKA.js.map +0 -1
- package/dist/chunk-W6AQJ2PY.js.map +0 -1
- package/dist/chunk-WELDCG6C.js.map +0 -1
- package/dist/chunk-WNARATI3.js.map +0 -1
- package/dist/chunk-WPGJYVUH.js.map +0 -1
- package/dist/chunk-WW3QQF4H.js.map +0 -1
- package/dist/chunk-XIG5PDM7.js.map +0 -1
- package/dist/chunk-XKECPATV.js.map +0 -1
- package/dist/chunk-XKLD5OK4.js.map +0 -1
- package/dist/chunk-XSZEP4SF.js.map +0 -1
- package/dist/chunk-XVVIG67A.js.map +0 -1
- package/dist/chunk-XYIK4LF6.js.map +0 -1
- package/dist/chunk-YRMVARQP.js.map +0 -1
- package/dist/chunk-YROHKYBY.js.map +0 -1
- package/dist/chunk-YU5KIWYQ.js.map +0 -1
- package/dist/chunk-ZAVUCJ4H.js.map +0 -1
- package/dist/chunk-ZPKBYX2F.js.map +0 -1
- package/dist/chunk-ZTFCYYEZ.js.map +0 -1
- package/dist/chunk-ZYVPLJ4T.js.map +0 -1
- package/dist/path-MR5JPYOP.js +0 -9
- package/dist/state-store-VZU2IA53.js +0 -16
- package/dist/trace-C5ETWBEF.js.map +0 -1
- /package/dist/{capsule-crypto-5CYAGVC5.js.map → bulk-import/index.js.map} +0 -0
- /package/dist/{contradiction-review-ATP4S6IC.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
- /package/dist/{capsule-merge-4MGKE7C5.js.map → capsule-merge-T2JRE46P.js.map} +0 -0
- /package/dist/{chunk-SAZS2QZB.js.map → chunk-23UORJ4S.js.map} +0 -0
- /package/dist/{chunk-PK7H5L6Y.js.map → chunk-2NM43EWN.js.map} +0 -0
- /package/dist/{chunk-PYXS46O7.js.map → chunk-3BP57I6J.js.map} +0 -0
- /package/dist/{chunk-FBYESMQ2.js.map → chunk-3C5RPJAX.js.map} +0 -0
- /package/dist/{chunk-U7EJOMFC.js.map → chunk-4Q73JBSM.js.map} +0 -0
- /package/dist/{chunk-N53K2EXC.js.map → chunk-6VF75M3X.js.map} +0 -0
- /package/dist/{chunk-6H2TESSP.js.map → chunk-765K3SAT.js.map} +0 -0
- /package/dist/{chunk-EDTHC6UD.js.map → chunk-77NAFXUD.js.map} +0 -0
- /package/dist/{chunk-MGKYQQYF.js.map → chunk-7Q3RCKAQ.js.map} +0 -0
- /package/dist/{chunk-34DQE4KF.js.map → chunk-CO7ZO4TU.js.map} +0 -0
- /package/dist/{chunk-ZKSK55RC.js.map → chunk-ETUPBUHB.js.map} +0 -0
- /package/dist/{chunk-QRNI5JBH.js.map → chunk-EYIEWJNI.js.map} +0 -0
- /package/dist/{chunk-C6QPK5GG.js.map → chunk-FZZ2QTJI.js.map} +0 -0
- /package/dist/{chunk-3JXBXXM2.js.map → chunk-G4IAEX6D.js.map} +0 -0
- /package/dist/{chunk-2WWLHTZY.js.map → chunk-IC4GELZE.js.map} +0 -0
- /package/dist/{chunk-PCUKNJAZ.js.map → chunk-JKV57BTN.js.map} +0 -0
- /package/dist/{chunk-2KI4QFHU.js.map → chunk-LMDRGRJ2.js.map} +0 -0
- /package/dist/{chunk-MY6TPVXW.js.map → chunk-LMPHTYJC.js.map} +0 -0
- /package/dist/{chunk-5HRY2WRF.js.map → chunk-LZ3VEOU5.js.map} +0 -0
- /package/dist/{chunk-NGAVDO7E.js.map → chunk-OADWQ5CR.js.map} +0 -0
- /package/dist/{chunk-DOM4GKSW.js.map → chunk-OZKVVUJB.js.map} +0 -0
- /package/dist/{chunk-MT4HVDUZ.js.map → chunk-PM3QHTFT.js.map} +0 -0
- /package/dist/{chunk-ZK7I7JYV.js.map → chunk-R3PS27B4.js.map} +0 -0
- /package/dist/{chunk-SKE7JYKA.js.map → chunk-SFXKHM7P.js.map} +0 -0
- /package/dist/{chunk-HMDCOMYU.js.map → chunk-SKGV326D.js.map} +0 -0
- /package/dist/{chunk-5UM2VJ6D.js.map → chunk-UEY3VB6W.js.map} +0 -0
- /package/dist/{chunk-GIF42EW3.js.map → chunk-UP6MOYCB.js.map} +0 -0
- /package/dist/{chunk-MRILGULB.js.map → chunk-V2RCP53Q.js.map} +0 -0
- /package/dist/{chunk-FSFEQI74.js.map → chunk-W7L6HXUC.js.map} +0 -0
- /package/dist/{chunk-3IQ2TR4N.js.map → chunk-WLEB7WCG.js.map} +0 -0
- /package/dist/{chunk-GL6I6MEQ.js.map → chunk-WSGF57U2.js.map} +0 -0
- /package/dist/{chunk-JA3AK3PT.js.map → chunk-XNLXAWHX.js.map} +0 -0
- /package/dist/{chunk-SIC6U3GZ.js.map → chunk-YHV3KRKS.js.map} +0 -0
- /package/dist/{chunk-VLXA6PI2.js.map → chunk-YQMZ7IH2.js.map} +0 -0
- /package/dist/{contradiction-scan-5A4IDZV5.js.map → contradiction-review-6V2LXXK6.js.map} +0 -0
- /package/dist/{migrate-from-identity-anchor-G27MCD6A.js.map → contradiction-scan-GIRVC4C7.js.map} +0 -0
- /package/dist/{first-start-migration-4MHQEOSD.js.map → first-start-migration-CKTCTCQI.js.map} +0 -0
- /package/dist/{graph-edge-decay-5DI5GUNL.js.map → graph-edge-decay-MUP5J7CC.js.map} +0 -0
- /package/dist/{path-MR5JPYOP.js.map → importers/index.js.map} +0 -0
- /package/dist/{peers-HCVGHMAE.js.map → migrate-from-identity-anchor-EB4XI4Q2.js.map} +0 -0
- /package/dist/{resolution-B7FNQSSP.js.map → path-X2K5XCHL.js.map} +0 -0
- /package/dist/{state-store-VZU2IA53.js.map → peers/index.js.map} +0 -0
- /package/dist/{tier-stats-62ZVDFKS.js.map → tier-stats-SKML2OSF.js.map} +0 -0
|
@@ -193,13 +193,21 @@ export function runSecureStoreLock(options: SecureStoreLockOptions): SecureStore
|
|
|
193
193
|
|
|
194
194
|
// ─── migrate ─────────────────────────────────────────────────────────
|
|
195
195
|
|
|
196
|
-
export interface SecureStoreMigrateOptions extends SecureStoreHandlerCommon {
|
|
196
|
+
export interface SecureStoreMigrateOptions extends SecureStoreHandlerCommon {
|
|
197
|
+
/**
|
|
198
|
+
* Optional passphrase reader for standalone CLI migration. A prior
|
|
199
|
+
* `secure-store unlock` command only unlocks that process-local keyring, so
|
|
200
|
+
* standalone migrate can prompt and install the key in this process instead
|
|
201
|
+
* of pretending another process still has it.
|
|
202
|
+
*/
|
|
203
|
+
readPassphrase?: PassphraseReader;
|
|
204
|
+
}
|
|
197
205
|
|
|
198
206
|
export type SecureStoreMigrateReport =
|
|
199
207
|
| ({ ok: true } & MigrateResult)
|
|
200
208
|
| ({
|
|
201
209
|
ok: false;
|
|
202
|
-
reason: "not-initialized" | "locked" | "file-errors";
|
|
210
|
+
reason: "not-initialized" | "locked" | "wrong-passphrase" | "file-errors";
|
|
203
211
|
} & MigrateResult);
|
|
204
212
|
|
|
205
213
|
export async function runSecureStoreMigrate(
|
|
@@ -218,7 +226,13 @@ export async function runSecureStoreMigrate(
|
|
|
218
226
|
}
|
|
219
227
|
|
|
220
228
|
const id = options.keyringId ?? secureStoreDir(memoryDir);
|
|
221
|
-
const key = keyring.getKey(id)
|
|
229
|
+
const key = keyring.getKey(id) ?? await unlockForThisProcess({
|
|
230
|
+
memoryDir,
|
|
231
|
+
header,
|
|
232
|
+
keyringId: id,
|
|
233
|
+
readPassphrase: options.readPassphrase,
|
|
234
|
+
now: options.now,
|
|
235
|
+
});
|
|
222
236
|
if (key === null) {
|
|
223
237
|
return {
|
|
224
238
|
ok: false,
|
|
@@ -228,6 +242,15 @@ export async function runSecureStoreMigrate(
|
|
|
228
242
|
errors: [],
|
|
229
243
|
};
|
|
230
244
|
}
|
|
245
|
+
if (key === "wrong-passphrase") {
|
|
246
|
+
return {
|
|
247
|
+
ok: false,
|
|
248
|
+
reason: "wrong-passphrase",
|
|
249
|
+
encrypted: 0,
|
|
250
|
+
skipped: 0,
|
|
251
|
+
errors: [],
|
|
252
|
+
};
|
|
253
|
+
}
|
|
231
254
|
|
|
232
255
|
const result = await migrateMemoryDirToEncrypted(memoryDir, key);
|
|
233
256
|
if (result.errors.length > 0) {
|
|
@@ -238,13 +261,20 @@ export async function runSecureStoreMigrate(
|
|
|
238
261
|
|
|
239
262
|
// ─── disable/decrypt ─────────────────────────────────────────────────
|
|
240
263
|
|
|
241
|
-
export interface SecureStoreDisableOptions extends SecureStoreHandlerCommon {
|
|
264
|
+
export interface SecureStoreDisableOptions extends SecureStoreHandlerCommon {
|
|
265
|
+
/**
|
|
266
|
+
* Optional passphrase reader for standalone CLI decrypt/disable. See
|
|
267
|
+
* SecureStoreMigrateOptions.readPassphrase for the process-local keyring
|
|
268
|
+
* contract.
|
|
269
|
+
*/
|
|
270
|
+
readPassphrase?: PassphraseReader;
|
|
271
|
+
}
|
|
242
272
|
|
|
243
273
|
export type SecureStoreDisableReport =
|
|
244
274
|
| ({ ok: true } & DecryptResult)
|
|
245
275
|
| ({
|
|
246
276
|
ok: false;
|
|
247
|
-
reason: "not-initialized" | "locked" | "file-errors";
|
|
277
|
+
reason: "not-initialized" | "locked" | "wrong-passphrase" | "file-errors";
|
|
248
278
|
} & DecryptResult);
|
|
249
279
|
|
|
250
280
|
export async function runSecureStoreDisable(
|
|
@@ -263,7 +293,13 @@ export async function runSecureStoreDisable(
|
|
|
263
293
|
}
|
|
264
294
|
|
|
265
295
|
const id = options.keyringId ?? secureStoreDir(memoryDir);
|
|
266
|
-
const key = keyring.getKey(id)
|
|
296
|
+
const key = keyring.getKey(id) ?? await unlockForThisProcess({
|
|
297
|
+
memoryDir,
|
|
298
|
+
header,
|
|
299
|
+
keyringId: id,
|
|
300
|
+
readPassphrase: options.readPassphrase,
|
|
301
|
+
now: options.now,
|
|
302
|
+
});
|
|
267
303
|
if (key === null) {
|
|
268
304
|
return {
|
|
269
305
|
ok: false,
|
|
@@ -273,6 +309,15 @@ export async function runSecureStoreDisable(
|
|
|
273
309
|
errors: [],
|
|
274
310
|
};
|
|
275
311
|
}
|
|
312
|
+
if (key === "wrong-passphrase") {
|
|
313
|
+
return {
|
|
314
|
+
ok: false,
|
|
315
|
+
reason: "wrong-passphrase",
|
|
316
|
+
decrypted: 0,
|
|
317
|
+
skipped: 0,
|
|
318
|
+
errors: [],
|
|
319
|
+
};
|
|
320
|
+
}
|
|
276
321
|
|
|
277
322
|
const result = await decryptMemoryDirToPlaintext(memoryDir, key);
|
|
278
323
|
if (result.errors.length > 0) {
|
|
@@ -353,3 +398,22 @@ function resolveParams(
|
|
|
353
398
|
if (algorithm === "scrypt") return { ...DEFAULT_SCRYPT_PARAMS };
|
|
354
399
|
return { ...DEFAULT_ARGON2ID_PARAMS };
|
|
355
400
|
}
|
|
401
|
+
|
|
402
|
+
async function unlockForThisProcess(options: {
|
|
403
|
+
memoryDir: string;
|
|
404
|
+
header: SecureStoreHeader;
|
|
405
|
+
keyringId: string;
|
|
406
|
+
readPassphrase?: PassphraseReader;
|
|
407
|
+
now?: () => Date;
|
|
408
|
+
}): Promise<Buffer | null | "wrong-passphrase"> {
|
|
409
|
+
if (!options.readPassphrase) return null;
|
|
410
|
+
const passphrase = await options.readPassphrase("Enter passphrase: ");
|
|
411
|
+
validatePassphrase(passphrase);
|
|
412
|
+
const candidateKey = deriveKeyFromHeader(options.header, passphrase);
|
|
413
|
+
if (!verifyKey(options.header, candidateKey)) {
|
|
414
|
+
candidateKey.fill(0);
|
|
415
|
+
return "wrong-passphrase";
|
|
416
|
+
}
|
|
417
|
+
keyring.unlock(options.keyringId, candidateKey, options.now ?? (() => new Date()));
|
|
418
|
+
return candidateKey;
|
|
419
|
+
}
|
|
@@ -27,13 +27,13 @@ export function renderInitReport(report: SecureStoreInitReport): string {
|
|
|
27
27
|
lines.push("");
|
|
28
28
|
lines.push("Note: init does NOT auto-unlock the store. Run");
|
|
29
29
|
lines.push(" remnic engram secure-store unlock");
|
|
30
|
-
lines.push("to register the master key
|
|
30
|
+
lines.push("to register the master key in the current Remnic process.");
|
|
31
31
|
return lines.join("\n");
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
export function renderUnlockReport(report: SecureStoreUnlockReport): string {
|
|
35
35
|
if (report.ok) {
|
|
36
|
-
return `OK — secure-store unlocked at ${report.unlockedAt} (algorithm=${report.algorithm}).`;
|
|
36
|
+
return `OK — secure-store unlocked in this process at ${report.unlockedAt} (algorithm=${report.algorithm}).`;
|
|
37
37
|
}
|
|
38
38
|
if (report.reason === "not-initialized") {
|
|
39
39
|
return "ERR — secure-store is not initialized. Run 'remnic engram secure-store init' first.";
|
|
@@ -43,9 +43,9 @@ export function renderUnlockReport(report: SecureStoreUnlockReport): string {
|
|
|
43
43
|
|
|
44
44
|
export function renderLockReport(report: SecureStoreLockReport): string {
|
|
45
45
|
if (report.cleared) {
|
|
46
|
-
return "OK — secure-store key cleared from in-memory keyring.";
|
|
46
|
+
return "OK — secure-store key cleared from this process's in-memory keyring.";
|
|
47
47
|
}
|
|
48
|
-
return "OK — secure-store was already locked (no in-memory key to clear).";
|
|
48
|
+
return "OK — secure-store was already locked in this process (no in-memory key to clear).";
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
export function renderMigrateReport(report: SecureStoreMigrateReport): string {
|
|
@@ -53,7 +53,10 @@ export function renderMigrateReport(report: SecureStoreMigrateReport): string {
|
|
|
53
53
|
return "ERR — secure-store is not initialized. Run 'remnic engram secure-store init' first.";
|
|
54
54
|
}
|
|
55
55
|
if (!report.ok && report.reason === "locked") {
|
|
56
|
-
return "ERR — secure-store is locked. Run
|
|
56
|
+
return "ERR — secure-store is locked in this process. Run migrate from an interactive CLI so it can prompt for the passphrase, or unlock inside the daemon process that will perform the migration.";
|
|
57
|
+
}
|
|
58
|
+
if (!report.ok && report.reason === "wrong-passphrase") {
|
|
59
|
+
return "ERR — wrong passphrase.";
|
|
57
60
|
}
|
|
58
61
|
|
|
59
62
|
const lines: string[] = [];
|
|
@@ -75,7 +78,10 @@ export function renderDisableReport(report: SecureStoreDisableReport): string {
|
|
|
75
78
|
return "ERR — secure-store is not initialized. Run 'remnic engram secure-store init' first.";
|
|
76
79
|
}
|
|
77
80
|
if (!report.ok && report.reason === "locked") {
|
|
78
|
-
return "ERR — secure-store is locked. Run
|
|
81
|
+
return "ERR — secure-store is locked in this process. Run disable from an interactive CLI so it can prompt for the passphrase, or unlock inside the daemon process that will decrypt files.";
|
|
82
|
+
}
|
|
83
|
+
if (!report.ok && report.reason === "wrong-passphrase") {
|
|
84
|
+
return "ERR — wrong passphrase.";
|
|
79
85
|
}
|
|
80
86
|
|
|
81
87
|
const lines: string[] = [];
|
|
@@ -105,7 +111,7 @@ export function renderStatusReport(report: SecureStoreStatusReport): string {
|
|
|
105
111
|
return lines.join("\n");
|
|
106
112
|
}
|
|
107
113
|
lines.push(`createdAt: ${report.createdAt ?? "n/a"}`);
|
|
108
|
-
lines.push(`
|
|
114
|
+
lines.push(`lockedInThisProcess: ${report.locked ? "yes" : "no"}`);
|
|
109
115
|
if (!report.locked) {
|
|
110
116
|
lines.push(`lastUnlockAt: ${report.unlockedAt ?? "n/a"}`);
|
|
111
117
|
}
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
* Naming: `secure-fs.ts` (not `vault-fs.ts`) — see `kdf.ts` naming note.
|
|
44
44
|
*/
|
|
45
45
|
|
|
46
|
-
import { createCipheriv, randomBytes } from "node:crypto";
|
|
46
|
+
import { createCipheriv, randomBytes, randomUUID } from "node:crypto";
|
|
47
47
|
import { lstat, mkdir, open as openFile, readFile, readdir, rename, unlink, writeFile } from "node:fs/promises";
|
|
48
48
|
import path from "node:path";
|
|
49
49
|
|
|
@@ -56,6 +56,7 @@ import {
|
|
|
56
56
|
IV_LENGTH,
|
|
57
57
|
generateSalt,
|
|
58
58
|
open as openEnvelope,
|
|
59
|
+
parseEnvelope,
|
|
59
60
|
seal,
|
|
60
61
|
} from "./cipher.js";
|
|
61
62
|
|
|
@@ -167,6 +168,7 @@ export function decryptFileBody(buf: Buffer, key: Buffer, aad?: Buffer): Buffer
|
|
|
167
168
|
throw new Error(`decryptFileBody: unknown flags byte 0x${flags.toString(16).padStart(2, "0")}`);
|
|
168
169
|
}
|
|
169
170
|
const envelope = buf.subarray(MAGIC_HEADER_SIZE);
|
|
171
|
+
parseEnvelope(envelope);
|
|
170
172
|
try {
|
|
171
173
|
return openEnvelope(key, envelope, aad ? { aad } : {});
|
|
172
174
|
} catch (err) {
|
|
@@ -270,7 +272,7 @@ export interface WriteMaybeEncryptedFileOptions {
|
|
|
270
272
|
* - If `key` is provided and non-null, encrypt the content first.
|
|
271
273
|
* - If `key` is null, write the content as plain UTF-8 (unencrypted store).
|
|
272
274
|
*
|
|
273
|
-
* Writes atomically: content is written to a
|
|
275
|
+
* Writes atomically: content is written to a unique temp file
|
|
274
276
|
* first, then renamed into place (CLAUDE.md gotcha #54 — never delete
|
|
275
277
|
* before write).
|
|
276
278
|
*/
|
|
@@ -293,7 +295,7 @@ export async function writeMaybeEncryptedFile(
|
|
|
293
295
|
}
|
|
294
296
|
|
|
295
297
|
if (atomic) {
|
|
296
|
-
const tempPath =
|
|
298
|
+
const tempPath = uniqueAtomicTempPath(filePath, "tmp");
|
|
297
299
|
try {
|
|
298
300
|
await writeFile(tempPath, data, { mode });
|
|
299
301
|
await rename(tempPath, filePath);
|
|
@@ -445,7 +447,7 @@ export async function migrateMemoryDirToEncrypted(
|
|
|
445
447
|
const encrypted = encryptFileBody(content, key, aad);
|
|
446
448
|
|
|
447
449
|
// Atomic write: temp → rename (gotcha #54).
|
|
448
|
-
const tempPath =
|
|
450
|
+
const tempPath = uniqueAtomicTempPath(filePath, "enc-tmp");
|
|
449
451
|
try {
|
|
450
452
|
await writeFile(tempPath, encrypted, { mode: 0o600 });
|
|
451
453
|
await rename(tempPath, filePath);
|
|
@@ -498,7 +500,7 @@ export async function decryptMemoryDirToPlaintext(
|
|
|
498
500
|
|
|
499
501
|
const aad = filePathAad(filePath, storageAadRootForFile(filePath, dir));
|
|
500
502
|
const plaintext = decryptFileBody(buf, key, aad);
|
|
501
|
-
const tempPath =
|
|
503
|
+
const tempPath = uniqueAtomicTempPath(filePath, "dec-tmp");
|
|
502
504
|
try {
|
|
503
505
|
await writeFile(tempPath, plaintext, { mode: 0o600 });
|
|
504
506
|
await rename(tempPath, filePath);
|
|
@@ -526,6 +528,10 @@ export async function decryptMemoryDirToPlaintext(
|
|
|
526
528
|
// Internal helpers
|
|
527
529
|
// ---------------------------------------------------------------------------
|
|
528
530
|
|
|
531
|
+
function uniqueAtomicTempPath(filePath: string, label: string): string {
|
|
532
|
+
return `${filePath}.${label}-${process.pid}-${Date.now()}-${randomUUID()}`;
|
|
533
|
+
}
|
|
534
|
+
|
|
529
535
|
/**
|
|
530
536
|
* Recursively collect files under `dir` that are read through the
|
|
531
537
|
* storage-layer secure-store helpers, excluding symlinked entries and
|
|
@@ -36,6 +36,13 @@ import {
|
|
|
36
36
|
parseHeader,
|
|
37
37
|
validateHeader,
|
|
38
38
|
} from "./header.js";
|
|
39
|
+
import {
|
|
40
|
+
FILE_FORMAT_FLAGS,
|
|
41
|
+
FILE_FORMAT_VERSION,
|
|
42
|
+
MAGIC_BYTES,
|
|
43
|
+
SecureStoreDecryptError,
|
|
44
|
+
decryptFileBody,
|
|
45
|
+
} from "./secure-fs.js";
|
|
39
46
|
import {
|
|
40
47
|
DEFAULT_ARGON2ID_PARAMS,
|
|
41
48
|
DEFAULT_SCRYPT_PARAMS,
|
|
@@ -60,6 +67,12 @@ import {
|
|
|
60
67
|
validateMetadata,
|
|
61
68
|
} from "./metadata.js";
|
|
62
69
|
import { createPassphraseReader } from "./passphrase-reader.js";
|
|
70
|
+
import {
|
|
71
|
+
renderInitReport,
|
|
72
|
+
renderLockReport,
|
|
73
|
+
renderStatusReport,
|
|
74
|
+
renderUnlockReport,
|
|
75
|
+
} from "./cli-renderer.js";
|
|
63
76
|
|
|
64
77
|
/** Cheap scrypt params for tests — still hex-correct but ~milliseconds. */
|
|
65
78
|
const FAST_SCRYPT: ScryptParams = {
|
|
@@ -112,6 +125,46 @@ test("deriveKeyScrypt with default OWASP-acceptable params produces a 32-byte ke
|
|
|
112
125
|
assert.equal(DEFAULT_SCRYPT_PARAMS.N, 1 << 17);
|
|
113
126
|
});
|
|
114
127
|
|
|
128
|
+
test("secure-store CLI renderers describe process-local unlock scope, not daemon state", () => {
|
|
129
|
+
const init = renderInitReport({
|
|
130
|
+
ok: true,
|
|
131
|
+
headerPath: "/tmp/memory/.secure-store/header.json",
|
|
132
|
+
createdAt: "2026-05-21T00:00:00.000Z",
|
|
133
|
+
kdf: {
|
|
134
|
+
algorithm: "scrypt",
|
|
135
|
+
params: FAST_SCRYPT,
|
|
136
|
+
salt: Buffer.alloc(KDF_SALT_LENGTH, 0x11).toString("hex"),
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
assert.match(init, /current Remnic process/);
|
|
140
|
+
assert.doesNotMatch(init, /running daemon/);
|
|
141
|
+
|
|
142
|
+
assert.match(
|
|
143
|
+
renderUnlockReport({
|
|
144
|
+
ok: true,
|
|
145
|
+
unlockedAt: "2026-05-21T00:00:01.000Z",
|
|
146
|
+
algorithm: "scrypt",
|
|
147
|
+
}),
|
|
148
|
+
/unlocked in this process/,
|
|
149
|
+
);
|
|
150
|
+
assert.match(renderLockReport({ ok: true, cleared: true }), /this process's in-memory keyring/);
|
|
151
|
+
assert.match(
|
|
152
|
+
renderStatusReport({
|
|
153
|
+
initialized: true,
|
|
154
|
+
headerPath: "/tmp/memory/.secure-store/header.json",
|
|
155
|
+
locked: false,
|
|
156
|
+
unlockedAt: "2026-05-21T00:00:01.000Z",
|
|
157
|
+
createdAt: "2026-05-21T00:00:00.000Z",
|
|
158
|
+
kdf: {
|
|
159
|
+
algorithm: "scrypt",
|
|
160
|
+
params: FAST_SCRYPT,
|
|
161
|
+
salt: Buffer.alloc(KDF_SALT_LENGTH, 0x22).toString("hex"),
|
|
162
|
+
},
|
|
163
|
+
}),
|
|
164
|
+
/lockedInThisProcess: no/,
|
|
165
|
+
);
|
|
166
|
+
});
|
|
167
|
+
|
|
115
168
|
test("deriveKeyScrypt rejects empty passphrase", () => {
|
|
116
169
|
const salt = Buffer.alloc(KDF_SALT_LENGTH, 0);
|
|
117
170
|
assert.throws(() => deriveKeyScrypt("", salt, FAST_SCRYPT), /passphrase/);
|
|
@@ -238,6 +291,23 @@ test("seal/open round-trip on an empty payload", () => {
|
|
|
238
291
|
assert.equal(opened.length, 0);
|
|
239
292
|
});
|
|
240
293
|
|
|
294
|
+
test("decryptFileBody reports truncated envelopes as structural errors", () => {
|
|
295
|
+
const truncated = Buffer.concat([
|
|
296
|
+
MAGIC_BYTES,
|
|
297
|
+
Buffer.from([FILE_FORMAT_VERSION, FILE_FORMAT_FLAGS]),
|
|
298
|
+
Buffer.alloc(ENVELOPE_HEADER_SIZE - 1),
|
|
299
|
+
]);
|
|
300
|
+
assert.throws(
|
|
301
|
+
() => decryptFileBody(truncated, Buffer.alloc(KDF_KEY_LENGTH, 0x11)),
|
|
302
|
+
(error) => {
|
|
303
|
+
assert.ok(error instanceof Error);
|
|
304
|
+
assert.equal(error instanceof SecureStoreDecryptError, false);
|
|
305
|
+
assert.match(error.message, /envelope too short/);
|
|
306
|
+
return true;
|
|
307
|
+
},
|
|
308
|
+
);
|
|
309
|
+
});
|
|
310
|
+
|
|
241
311
|
test("seal produces a different ciphertext for the same plaintext (random IV)", () => {
|
|
242
312
|
const salt = generateSalt();
|
|
243
313
|
const key = deriveKeyScrypt("pw", salt, FAST_SCRYPT);
|
|
@@ -8,12 +8,14 @@ import assert from "node:assert/strict";
|
|
|
8
8
|
|
|
9
9
|
import {
|
|
10
10
|
CONSOLIDATION_OPERATORS,
|
|
11
|
+
findSimilarClusters,
|
|
11
12
|
isConsolidationOperator,
|
|
12
13
|
isSemanticConsolidationLlmOperator,
|
|
13
14
|
isValidDerivedFromEntry,
|
|
14
15
|
type ConsolidationOperator,
|
|
15
16
|
type SemanticConsolidationLlmOperator,
|
|
16
17
|
} from "./semantic-consolidation.js";
|
|
18
|
+
import type { MemoryCategory, MemoryFile } from "./types.js";
|
|
17
19
|
// The standalone module is the source of truth; semantic-consolidation.ts
|
|
18
20
|
// re-exports it. This test import proves both surfaces work.
|
|
19
21
|
import {
|
|
@@ -180,3 +182,46 @@ test("SemanticConsolidationLlmOperator type literally excludes pattern-reinforce
|
|
|
180
182
|
const update: SemanticConsolidationLlmOperator = "update";
|
|
181
183
|
assert.equal([split, merge, update].length, 3);
|
|
182
184
|
});
|
|
185
|
+
|
|
186
|
+
test("findSimilarClusters never exceeds maxPerRun after prior clusters consume budget", () => {
|
|
187
|
+
const memories = [
|
|
188
|
+
consolidationMemory("a-1", "fact", "atlas cache latency shared alpha"),
|
|
189
|
+
consolidationMemory("a-2", "fact", "atlas cache latency shared beta"),
|
|
190
|
+
consolidationMemory("a-3", "fact", "atlas cache latency shared gamma"),
|
|
191
|
+
consolidationMemory("a-4", "fact", "atlas cache latency shared delta"),
|
|
192
|
+
consolidationMemory("b-1", "preference", "aurora rollout dependency shared alpha"),
|
|
193
|
+
consolidationMemory("b-2", "preference", "aurora rollout dependency shared beta"),
|
|
194
|
+
];
|
|
195
|
+
|
|
196
|
+
const clusters = findSimilarClusters(memories, {
|
|
197
|
+
threshold: 0.1,
|
|
198
|
+
minClusterSize: 2,
|
|
199
|
+
excludeCategories: [],
|
|
200
|
+
maxPerRun: 5,
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
const totalMemories = clusters.reduce((sum, cluster) => sum + cluster.memories.length, 0);
|
|
204
|
+
assert.equal(totalMemories, 4);
|
|
205
|
+
assert.deepEqual(
|
|
206
|
+
clusters.map((cluster) => cluster.memories.map((memory) => memory.frontmatter.id)),
|
|
207
|
+
[["a-1", "a-2", "a-3", "a-4"]],
|
|
208
|
+
);
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
function consolidationMemory(id: string, category: MemoryCategory, content: string): MemoryFile {
|
|
212
|
+
return {
|
|
213
|
+
path: `${category}/${id}.md`,
|
|
214
|
+
content,
|
|
215
|
+
frontmatter: {
|
|
216
|
+
id,
|
|
217
|
+
category,
|
|
218
|
+
created: "2026-05-21T00:00:00.000Z",
|
|
219
|
+
updated: "2026-05-21T00:00:00.000Z",
|
|
220
|
+
source: "test",
|
|
221
|
+
confidence: 1,
|
|
222
|
+
confidenceTier: "explicit",
|
|
223
|
+
tags: [],
|
|
224
|
+
status: "active",
|
|
225
|
+
},
|
|
226
|
+
};
|
|
227
|
+
}
|
|
@@ -95,13 +95,15 @@ export function findSimilarClusters(
|
|
|
95
95
|
const clustered = new Set<string>();
|
|
96
96
|
|
|
97
97
|
for (let i = 0; i < tokenized.length && totalCandidates < config.maxPerRun; i++) {
|
|
98
|
+
const remainingBudget = config.maxPerRun - totalCandidates;
|
|
99
|
+
if (remainingBudget < config.minClusterSize) break;
|
|
98
100
|
if (clustered.has(tokenized[i].memory.frontmatter.id)) continue;
|
|
99
101
|
|
|
100
102
|
const cluster: MemoryFile[] = [tokenized[i].memory];
|
|
101
103
|
let totalOverlap = 0;
|
|
102
104
|
let comparisons = 0;
|
|
103
105
|
|
|
104
|
-
for (let j = i + 1; j < tokenized.length; j++) {
|
|
106
|
+
for (let j = i + 1; j < tokenized.length && cluster.length < remainingBudget; j++) {
|
|
105
107
|
if (clustered.has(tokenized[j].memory.frontmatter.id)) continue;
|
|
106
108
|
|
|
107
109
|
const aTokens = tokenized[i].tokens;
|
|
@@ -117,8 +119,6 @@ export function findSimilarClusters(
|
|
|
117
119
|
cluster.push(tokenized[j].memory);
|
|
118
120
|
totalOverlap += score;
|
|
119
121
|
comparisons++;
|
|
120
|
-
// Enforce maxPerRun within a single cluster
|
|
121
|
-
if (totalCandidates + cluster.length >= config.maxPerRun) break;
|
|
122
122
|
}
|
|
123
123
|
}
|
|
124
124
|
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { mkdir, mkdtemp, readFile, rm, symlink, writeFile } from "node:fs/promises";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import test from "node:test";
|
|
6
|
+
|
|
7
|
+
import { applySessionRepair, planSessionRepair } from "./session-integrity.js";
|
|
8
|
+
import type { SessionIntegrityReport, SessionRepairPlan } from "./session-integrity.js";
|
|
9
|
+
|
|
10
|
+
test("session repair rejects forged transcript paths outside memoryDir", async () => {
|
|
11
|
+
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-session-repair-"));
|
|
12
|
+
const outside = await mkdtemp(path.join(os.tmpdir(), "remnic-session-outside-"));
|
|
13
|
+
try {
|
|
14
|
+
await mkdir(path.join(memoryDir, "transcripts"), { recursive: true });
|
|
15
|
+
const outsideFile = path.join(outside, "forged.jsonl");
|
|
16
|
+
await writeFile(outsideFile, "not json\n", "utf8");
|
|
17
|
+
const plan: SessionRepairPlan = {
|
|
18
|
+
generatedAt: new Date().toISOString(),
|
|
19
|
+
dryRun: false,
|
|
20
|
+
memoryDir,
|
|
21
|
+
allowSessionFileRepair: false,
|
|
22
|
+
actions: [
|
|
23
|
+
{
|
|
24
|
+
kind: "rewrite_transcript",
|
|
25
|
+
description: "forged",
|
|
26
|
+
targetPath: outsideFile,
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const result = await applySessionRepair({ plan });
|
|
32
|
+
assert.equal(result.actionsApplied, 0);
|
|
33
|
+
assert.match(result.errors.join("\n"), /escapes configured memoryDir/);
|
|
34
|
+
assert.equal(await readFile(outsideFile, "utf8"), "not json\n");
|
|
35
|
+
} finally {
|
|
36
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
37
|
+
await rm(outside, { recursive: true, force: true });
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test("session repair rejects symlinked transcript targets", async () => {
|
|
42
|
+
const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-session-repair-"));
|
|
43
|
+
const outside = await mkdtemp(path.join(os.tmpdir(), "remnic-session-outside-"));
|
|
44
|
+
try {
|
|
45
|
+
const transcripts = path.join(memoryDir, "transcripts");
|
|
46
|
+
await mkdir(transcripts, { recursive: true });
|
|
47
|
+
const outsideFile = path.join(outside, "real.jsonl");
|
|
48
|
+
const linkFile = path.join(transcripts, "link.jsonl");
|
|
49
|
+
await writeFile(outsideFile, "not json\n", "utf8");
|
|
50
|
+
await symlink(outsideFile, linkFile);
|
|
51
|
+
const plan: SessionRepairPlan = {
|
|
52
|
+
generatedAt: new Date().toISOString(),
|
|
53
|
+
dryRun: false,
|
|
54
|
+
memoryDir,
|
|
55
|
+
allowSessionFileRepair: false,
|
|
56
|
+
actions: [
|
|
57
|
+
{
|
|
58
|
+
kind: "rewrite_transcript",
|
|
59
|
+
description: "symlink",
|
|
60
|
+
targetPath: linkFile,
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const result = await applySessionRepair({ plan });
|
|
66
|
+
assert.equal(result.actionsApplied, 0);
|
|
67
|
+
assert.match(result.errors.join("\n"), /repair target crosses symlink/);
|
|
68
|
+
assert.equal(await readFile(outsideFile, "utf8"), "not json\n");
|
|
69
|
+
} finally {
|
|
70
|
+
await rm(memoryDir, { recursive: true, force: true });
|
|
71
|
+
await rm(outside, { recursive: true, force: true });
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test("planned session repair carries the report memoryDir into apply-time validation", () => {
|
|
76
|
+
const report: SessionIntegrityReport = {
|
|
77
|
+
generatedAt: "2026-05-22T00:00:00.000Z",
|
|
78
|
+
memoryDir: "/tmp/remnic-memory",
|
|
79
|
+
healthy: false,
|
|
80
|
+
sessions: [],
|
|
81
|
+
checkpoint: {
|
|
82
|
+
present: true,
|
|
83
|
+
healthy: false,
|
|
84
|
+
path: "/tmp/remnic-memory/state/checkpoint.json",
|
|
85
|
+
},
|
|
86
|
+
issues: [
|
|
87
|
+
{
|
|
88
|
+
code: "checkpoint_invalid_json",
|
|
89
|
+
severity: "error",
|
|
90
|
+
message: "bad checkpoint",
|
|
91
|
+
filePath: "/tmp/remnic-memory/state/checkpoint.json",
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
const plan = planSessionRepair({ report, dryRun: false });
|
|
97
|
+
assert.equal(plan.memoryDir, "/tmp/remnic-memory");
|
|
98
|
+
});
|
package/src/session-integrity.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import { readFile, readdir, unlink, writeFile } from "node:fs/promises";
|
|
2
|
+
import { lstat, readFile, readdir, realpath, unlink, writeFile } from "node:fs/promises";
|
|
3
3
|
import type { Checkpoint, TranscriptEntry } from "./types.js";
|
|
4
4
|
|
|
5
5
|
export type SessionIntegrityIssueCode =
|
|
@@ -70,6 +70,7 @@ export interface SessionRepairAction {
|
|
|
70
70
|
export interface SessionRepairPlan {
|
|
71
71
|
generatedAt: string;
|
|
72
72
|
dryRun: boolean;
|
|
73
|
+
memoryDir: string;
|
|
73
74
|
allowSessionFileRepair: boolean;
|
|
74
75
|
actions: SessionRepairAction[];
|
|
75
76
|
}
|
|
@@ -487,6 +488,7 @@ export function planSessionRepair(options: PlanSessionRepairOptions): SessionRep
|
|
|
487
488
|
return {
|
|
488
489
|
generatedAt: new Date().toISOString(),
|
|
489
490
|
dryRun: options.dryRun,
|
|
491
|
+
memoryDir: options.report.memoryDir,
|
|
490
492
|
allowSessionFileRepair: options.allowSessionFileRepair === true,
|
|
491
493
|
actions,
|
|
492
494
|
};
|
|
@@ -535,11 +537,13 @@ export async function applySessionRepair(
|
|
|
535
537
|
for (const action of plan.actions) {
|
|
536
538
|
try {
|
|
537
539
|
if (action.kind === "rewrite_transcript") {
|
|
540
|
+
await assertRepairTargetAllowed(plan.memoryDir, action);
|
|
538
541
|
await rewriteTranscriptFile(action.targetPath);
|
|
539
542
|
actionsApplied += 1;
|
|
540
543
|
continue;
|
|
541
544
|
}
|
|
542
545
|
if (action.kind === "remove_checkpoint") {
|
|
546
|
+
await assertRepairTargetAllowed(plan.memoryDir, action);
|
|
543
547
|
try {
|
|
544
548
|
await unlink(action.targetPath);
|
|
545
549
|
} catch (err) {
|
|
@@ -567,3 +571,49 @@ export async function applySessionRepair(
|
|
|
567
571
|
errors,
|
|
568
572
|
};
|
|
569
573
|
}
|
|
574
|
+
|
|
575
|
+
async function assertRepairTargetAllowed(memoryDir: string, action: SessionRepairAction): Promise<void> {
|
|
576
|
+
const root = path.resolve(memoryDir);
|
|
577
|
+
const target = path.resolve(action.targetPath);
|
|
578
|
+
if (action.kind === "rewrite_transcript") {
|
|
579
|
+
const transcriptsRoot = path.join(root, "transcripts");
|
|
580
|
+
if (!target.endsWith(".jsonl")) {
|
|
581
|
+
throw new Error("transcript repair target must end in .jsonl");
|
|
582
|
+
}
|
|
583
|
+
await assertNoSymlinkPath(transcriptsRoot, target);
|
|
584
|
+
return;
|
|
585
|
+
}
|
|
586
|
+
if (action.kind === "remove_checkpoint") {
|
|
587
|
+
const checkpointPath = path.join(root, "state", "checkpoint.json");
|
|
588
|
+
if (target !== checkpointPath) {
|
|
589
|
+
throw new Error("checkpoint repair target must be the configured checkpoint.json");
|
|
590
|
+
}
|
|
591
|
+
await assertNoSymlinkPath(root, target);
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
async function assertNoSymlinkPath(root: string, target: string): Promise<void> {
|
|
596
|
+
const rootReal = await realpath(root);
|
|
597
|
+
const targetDir = path.dirname(target);
|
|
598
|
+
const targetDirReal = await realpath(targetDir);
|
|
599
|
+
const relative = path.relative(rootReal, targetDirReal);
|
|
600
|
+
if (relative === "" || (!relative.startsWith("..") && !path.isAbsolute(relative))) {
|
|
601
|
+
const normalizedTarget = path.join(targetDirReal, path.basename(target));
|
|
602
|
+
let current = rootReal;
|
|
603
|
+
for (const segment of path.relative(rootReal, normalizedTarget).split(path.sep)) {
|
|
604
|
+
if (!segment) continue;
|
|
605
|
+
current = path.join(current, segment);
|
|
606
|
+
try {
|
|
607
|
+
const stat = await lstat(current);
|
|
608
|
+
if (stat.isSymbolicLink()) {
|
|
609
|
+
throw new Error(`repair target crosses symlink: ${current}`);
|
|
610
|
+
}
|
|
611
|
+
} catch (err) {
|
|
612
|
+
const code = typeof err === "object" && err && "code" in err ? String((err as { code?: unknown }).code ?? "") : "";
|
|
613
|
+
if (code !== "ENOENT") throw err;
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
return;
|
|
617
|
+
}
|
|
618
|
+
throw new Error("repair target escapes configured memoryDir");
|
|
619
|
+
}
|