@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
|
@@ -58,6 +58,13 @@ function assertIsoTimestamp(value, field) {
|
|
|
58
58
|
}
|
|
59
59
|
return normalized;
|
|
60
60
|
}
|
|
61
|
+
function assertNonNegativeInteger(value, field) {
|
|
62
|
+
const parsed = Number(value);
|
|
63
|
+
if (!Number.isSafeInteger(parsed) || parsed < 0) {
|
|
64
|
+
throw new Error(`${field} must be a non-negative integer`);
|
|
65
|
+
}
|
|
66
|
+
return parsed;
|
|
67
|
+
}
|
|
61
68
|
function assertPathWithin(rootDir, targetPath, field) {
|
|
62
69
|
const resolvedRoot = path.resolve(rootDir);
|
|
63
70
|
const resolvedTarget = path.resolve(targetPath);
|
|
@@ -116,20 +123,21 @@ function validateEvalRunSummary(raw) {
|
|
|
116
123
|
if (!["running", "completed", "failed", "partial"].includes(status)) {
|
|
117
124
|
throw new Error("status must be one of running|completed|failed|partial");
|
|
118
125
|
}
|
|
119
|
-
const totalCases =
|
|
120
|
-
const passedCases =
|
|
121
|
-
const failedCases =
|
|
122
|
-
if (
|
|
123
|
-
|
|
124
|
-
|
|
126
|
+
const totalCases = assertNonNegativeInteger(raw.totalCases, "totalCases");
|
|
127
|
+
const passedCases = assertNonNegativeInteger(raw.passedCases, "passedCases");
|
|
128
|
+
const failedCases = assertNonNegativeInteger(raw.failedCases, "failedCases");
|
|
129
|
+
if (passedCases + failedCases > totalCases) {
|
|
130
|
+
throw new Error("passedCases + failedCases must be less than or equal to totalCases");
|
|
131
|
+
}
|
|
125
132
|
const metrics = parseOptionalEvalRunMetrics(raw.metrics);
|
|
133
|
+
const completedAt = typeof raw.completedAt === "string" && raw.completedAt.trim().length > 0 ? assertIsoTimestamp(raw.completedAt, "completedAt") : void 0;
|
|
126
134
|
return {
|
|
127
135
|
schemaVersion: 1,
|
|
128
136
|
runId: assertString(raw.runId, "runId"),
|
|
129
137
|
benchmarkId: assertString(raw.benchmarkId, "benchmarkId"),
|
|
130
138
|
status,
|
|
131
|
-
startedAt:
|
|
132
|
-
completedAt
|
|
139
|
+
startedAt: assertIsoTimestamp(raw.startedAt, "startedAt"),
|
|
140
|
+
completedAt,
|
|
133
141
|
totalCases,
|
|
134
142
|
passedCases,
|
|
135
143
|
failedCases,
|
|
@@ -152,7 +160,7 @@ function validateEvalBaselineSnapshot(raw) {
|
|
|
152
160
|
return {
|
|
153
161
|
benchmarkId: assertString(item.benchmarkId, `benchmarks[${index}].benchmarkId`),
|
|
154
162
|
runId: assertString(item.runId, `benchmarks[${index}].runId`),
|
|
155
|
-
completedAt: typeof item.completedAt === "string" && item.completedAt.trim().length > 0 ? item.completedAt.
|
|
163
|
+
completedAt: typeof item.completedAt === "string" && item.completedAt.trim().length > 0 ? assertIsoTimestamp(item.completedAt, `benchmarks[${index}].completedAt`) : void 0,
|
|
156
164
|
gitRef: typeof item.gitRef === "string" && item.gitRef.trim().length > 0 ? item.gitRef.trim() : void 0,
|
|
157
165
|
passRate,
|
|
158
166
|
metrics
|
|
@@ -168,7 +176,7 @@ function validateEvalBaselineSnapshot(raw) {
|
|
|
168
176
|
return {
|
|
169
177
|
schemaVersion: 1,
|
|
170
178
|
snapshotId: assertString(raw.snapshotId, "snapshotId"),
|
|
171
|
-
createdAt:
|
|
179
|
+
createdAt: assertIsoTimestamp(raw.createdAt, "createdAt"),
|
|
172
180
|
sourceRootDir: assertString(raw.sourceRootDir, "sourceRootDir"),
|
|
173
181
|
benchmarkCount,
|
|
174
182
|
benchmarks,
|
|
@@ -889,4 +897,4 @@ export {
|
|
|
889
897
|
runEvalStoredBaselineCiGate,
|
|
890
898
|
runEvalBenchmarkCiGate
|
|
891
899
|
};
|
|
892
|
-
//# sourceMappingURL=chunk-
|
|
900
|
+
//# sourceMappingURL=chunk-G3Z3QEF5.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/evals.ts"],"sourcesContent":["import path from \"node:path\";\nimport { cp, mkdir, readFile, readdir, rm, stat, writeFile } from \"node:fs/promises\";\nimport { listJsonFiles, listNamedFiles, readJsonFile } from \"./json-store.js\";\n\nexport type EvalRunStatus = \"running\" | \"completed\" | \"failed\" | \"partial\";\n\nexport interface EvalBenchmarkCase {\n id: string;\n prompt: string;\n expectedSignals?: string[];\n notes?: string;\n}\n\nexport type EvalBenchmarkType = \"standard\" | \"memory-red-team\";\n\nexport interface EvalBenchmarkManifest {\n schemaVersion: 1;\n benchmarkId: string;\n benchmarkType?: EvalBenchmarkType;\n title: string;\n description?: string;\n tags?: string[];\n sourceLinks?: string[];\n attackClass?: string;\n targetSurface?: string;\n cases: EvalBenchmarkCase[];\n}\n\nexport interface EvalRunMetrics {\n recallPrecisionAtK?: number;\n actionOutcomeScore?: number;\n objectiveStateCoverage?: number;\n causalPathRecall?: number;\n trustViolationRate?: number;\n creationRecoveryScore?: number;\n}\n\nexport interface EvalRunSummary {\n schemaVersion: 1;\n runId: string;\n benchmarkId: string;\n status: EvalRunStatus;\n startedAt: string;\n completedAt?: string;\n totalCases: number;\n passedCases: number;\n failedCases: number;\n metrics?: EvalRunMetrics;\n notes?: string;\n gitRef?: string;\n}\n\nexport interface EvalShadowRecallRecord {\n schemaVersion: 1;\n traceId: string;\n recordedAt: string;\n sessionKey: string;\n promptHash: string;\n promptLength: number;\n retrievalQueryHash: string;\n retrievalQueryLength: number;\n recallMode: \"no_recall\" | \"minimal\" | \"full\" | \"graph_mode\";\n recallResultLimit: number;\n source: \"none\" | \"hot_qmd\" | \"hot_embedding\" | \"cold_fallback\" | \"recent_scan\";\n recalledMemoryCount: number;\n injected: boolean;\n contextChars: number;\n memoryIds: string[];\n policyVersion?: string;\n identityInjectionMode?: \"recovery_only\" | \"minimal\" | \"full\" | \"none\";\n identityInjectedChars?: number;\n identityInjectionTruncated?: boolean;\n durationMs: number;\n timings?: Record<string, string>;\n}\n\nexport interface EvalHarnessStatus {\n enabled: boolean;\n shadowModeEnabled: boolean;\n rootDir: string;\n benchmarkDir: string;\n runsDir: string;\n benchmarks: {\n total: number;\n valid: number;\n invalid: number;\n redTeam: number;\n totalCases: number;\n attackClasses: string[];\n tags: string[];\n targetSurfaces: string[];\n sourceLinks: string[];\n };\n runs: {\n total: number;\n invalid: number;\n completed: number;\n failed: number;\n partial: number;\n running: number;\n latestRunId?: string;\n latestBenchmarkId?: string;\n latestCompletedAt?: string;\n };\n shadows: {\n total: number;\n invalid: number;\n latestTraceId?: string;\n latestRecordedAt?: string;\n latestSessionKey?: string;\n };\n baselines: {\n enabled: boolean;\n total: number;\n invalid: number;\n latestSnapshotId?: string;\n latestCreatedAt?: string;\n latestBenchmarkCount?: number;\n };\n latestRun?: EvalRunSummary;\n latestShadow?: EvalShadowRecallRecord;\n latestBaseline?: EvalBaselineSnapshot;\n invalidBenchmarks: Array<{\n path: string;\n error: string;\n }>;\n invalidRuns: Array<{\n path: string;\n error: string;\n }>;\n invalidShadows: Array<{\n path: string;\n error: string;\n }>;\n invalidBaselines: Array<{\n path: string;\n error: string;\n }>;\n}\n\nexport interface EvalBenchmarkDelta {\n benchmarkId: string;\n baseRunId: string;\n candidateRunId: string;\n basePassRate: number;\n candidatePassRate: number;\n passRateDelta: number;\n metricDeltas: Partial<Record<keyof EvalRunMetrics, number>>;\n regressions: string[];\n improvements: string[];\n}\n\nexport interface EvalCiGateReport {\n passed: boolean;\n baseRootDir: string;\n candidateRootDir: string;\n comparedBenchmarks: number;\n missingCandidateBenchmarks: string[];\n invalidArtifacts: {\n base: {\n benchmarks: number;\n runs: number;\n shadows: number;\n };\n candidate: {\n benchmarks: number;\n runs: number;\n shadows: number;\n };\n };\n regressions: string[];\n improvements: string[];\n deltas: EvalBenchmarkDelta[];\n}\n\nexport interface EvalBaselineDeltaReport {\n passed: boolean;\n baselineSnapshotId: string;\n baselineCreatedAt: string;\n baselineSourceRootDir: string;\n candidateRootDir: string;\n comparedBenchmarks: number;\n missingCandidateBenchmarks: string[];\n invalidArtifacts: {\n candidate: {\n benchmarks: number;\n runs: number;\n shadows: number;\n baselines: number;\n };\n };\n regressions: string[];\n improvements: string[];\n deltas: EvalBenchmarkDelta[];\n markdownReport: string;\n}\n\nexport interface EvalStoredBaselineCiGateReport extends EvalBaselineDeltaReport {\n baseRootDir: string;\n baselineResolvedFrom: \"base\" | \"candidate\";\n}\n\nexport interface EvalBaselineSnapshotBenchmark {\n benchmarkId: string;\n runId: string;\n completedAt?: string;\n gitRef?: string;\n passRate: number;\n metrics?: EvalRunMetrics;\n}\n\nexport interface EvalBaselineSnapshot {\n schemaVersion: 1;\n snapshotId: string;\n createdAt: string;\n sourceRootDir: string;\n benchmarkCount: number;\n benchmarks: EvalBaselineSnapshotBenchmark[];\n notes?: string;\n gitRef?: string;\n}\n\nexport interface EvalBenchmarkPackSummary {\n sourcePath: string;\n manifestPath: string;\n benchmarkId: string;\n benchmarkType: EvalBenchmarkType;\n title: string;\n attackClass?: string;\n targetSurface?: string;\n totalCases: number;\n tags: string[];\n sourceLinks: string[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction assertString(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${field} must be a non-empty string`);\n }\n return value.trim();\n}\n\nfunction optionalStringArray(value: unknown, field: string): string[] | undefined {\n if (value === undefined) return undefined;\n if (!Array.isArray(value)) {\n throw new Error(`${field} must be an array of strings`);\n }\n const out = value\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n if (out.length !== value.length) {\n throw new Error(`${field} must be an array of non-empty strings`);\n }\n return out;\n}\n\nexport function resolveEvalStoreDir(memoryDir: string, overrideDir?: string): string {\n if (typeof overrideDir === \"string\" && overrideDir.trim().length > 0) {\n return overrideDir.trim();\n }\n return path.join(memoryDir, \"state\", \"evals\");\n}\n\nfunction assertSafePathSegment(value: string, field: string): string {\n if (value === \".\" || value === \"..\" || value.includes(\"/\") || value.includes(\"\\\\\")) {\n throw new Error(`${field} must be a safe path segment`);\n }\n return value;\n}\n\nfunction assertSafeBenchmarkId(benchmarkId: string): string {\n return assertSafePathSegment(benchmarkId, \"benchmarkId\");\n}\n\nconst ISO_UTC_TIMESTAMP_RE = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/;\n\nfunction assertIsoTimestamp(value: unknown, field: string): string {\n const timestamp = assertString(value, field);\n if (!ISO_UTC_TIMESTAMP_RE.test(timestamp)) {\n throw new Error(`${field} must be a valid ISO timestamp`);\n }\n const parsed = Date.parse(timestamp);\n if (!Number.isFinite(parsed)) {\n throw new Error(`${field} must be a valid ISO timestamp`);\n }\n const normalized = new Date(parsed).toISOString();\n if (normalized !== timestamp) {\n throw new Error(`${field} must be a valid ISO timestamp`);\n }\n return normalized;\n}\n\nfunction assertPathWithin(rootDir: string, targetPath: string, field: string): void {\n const resolvedRoot = path.resolve(rootDir);\n const resolvedTarget = path.resolve(targetPath);\n const relative = path.relative(resolvedRoot, resolvedTarget);\n if (relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative))) {\n return;\n }\n throw new Error(`${field} must stay within ${rootDir}`);\n}\n\nexport function validateEvalBenchmarkManifest(\n raw: unknown,\n options?: { memoryRedTeamBenchEnabled?: boolean },\n): EvalBenchmarkManifest {\n if (!isRecord(raw)) throw new Error(\"benchmark manifest must be an object\");\n if (raw.schemaVersion !== 1) throw new Error(\"schemaVersion must be 1\");\n if (!Array.isArray(raw.cases)) throw new Error(\"cases must be an array\");\n const benchmarkTypeRaw =\n typeof raw.benchmarkType === \"string\" && raw.benchmarkType.trim().length > 0\n ? raw.benchmarkType.trim()\n : \"standard\";\n if (![\"standard\", \"memory-red-team\"].includes(benchmarkTypeRaw)) {\n throw new Error(\"benchmarkType must be one of standard|memory-red-team\");\n }\n\n const cases = raw.cases.map((item, index) => {\n if (!isRecord(item)) throw new Error(`cases[${index}] must be an object`);\n return {\n id: assertString(item.id, `cases[${index}].id`),\n prompt: assertString(item.prompt, `cases[${index}].prompt`),\n expectedSignals: optionalStringArray(item.expectedSignals, `cases[${index}].expectedSignals`),\n notes: typeof item.notes === \"string\" && item.notes.trim().length > 0 ? item.notes.trim() : undefined,\n } satisfies EvalBenchmarkCase;\n });\n\n const benchmarkType = benchmarkTypeRaw as EvalBenchmarkType;\n if (benchmarkType === \"memory-red-team\" && options?.memoryRedTeamBenchEnabled !== true) {\n throw new Error(\"memory-red-team benchmark packs require memoryRedTeamBenchEnabled\");\n }\n const attackClass =\n typeof raw.attackClass === \"string\" && raw.attackClass.trim().length > 0\n ? raw.attackClass.trim()\n : undefined;\n const targetSurface =\n typeof raw.targetSurface === \"string\" && raw.targetSurface.trim().length > 0\n ? raw.targetSurface.trim()\n : undefined;\n if (benchmarkType === \"memory-red-team\" && attackClass === undefined) {\n throw new Error(\"attackClass must be a non-empty string\");\n }\n if (benchmarkType === \"memory-red-team\" && targetSurface === undefined) {\n throw new Error(\"targetSurface must be a non-empty string\");\n }\n\n return {\n schemaVersion: 1,\n benchmarkId: assertString(raw.benchmarkId, \"benchmarkId\"),\n benchmarkType,\n title: assertString(raw.title, \"title\"),\n description:\n typeof raw.description === \"string\" && raw.description.trim().length > 0\n ? raw.description.trim()\n : undefined,\n tags: optionalStringArray(raw.tags, \"tags\"),\n sourceLinks: optionalStringArray(raw.sourceLinks, \"sourceLinks\"),\n attackClass,\n targetSurface,\n cases,\n };\n}\n\nexport function validateEvalRunSummary(raw: unknown): EvalRunSummary {\n if (!isRecord(raw)) throw new Error(\"eval run summary must be an object\");\n if (raw.schemaVersion !== 1) throw new Error(\"schemaVersion must be 1\");\n const status = assertString(raw.status, \"status\");\n if (![\"running\", \"completed\", \"failed\", \"partial\"].includes(status)) {\n throw new Error(\"status must be one of running|completed|failed|partial\");\n }\n\n const totalCases = Number(raw.totalCases);\n const passedCases = Number(raw.passedCases);\n const failedCases = Number(raw.failedCases);\n if (!Number.isFinite(totalCases) || totalCases < 0) throw new Error(\"totalCases must be a non-negative number\");\n if (!Number.isFinite(passedCases) || passedCases < 0) throw new Error(\"passedCases must be a non-negative number\");\n if (!Number.isFinite(failedCases) || failedCases < 0) throw new Error(\"failedCases must be a non-negative number\");\n\n const metrics = parseOptionalEvalRunMetrics(raw.metrics);\n\n return {\n schemaVersion: 1,\n runId: assertString(raw.runId, \"runId\"),\n benchmarkId: assertString(raw.benchmarkId, \"benchmarkId\"),\n status: status as EvalRunStatus,\n startedAt: assertString(raw.startedAt, \"startedAt\"),\n completedAt:\n typeof raw.completedAt === \"string\" && raw.completedAt.trim().length > 0\n ? raw.completedAt.trim()\n : undefined,\n totalCases,\n passedCases,\n failedCases,\n metrics,\n notes: typeof raw.notes === \"string\" && raw.notes.trim().length > 0 ? raw.notes.trim() : undefined,\n gitRef: typeof raw.gitRef === \"string\" && raw.gitRef.trim().length > 0 ? raw.gitRef.trim() : undefined,\n };\n}\n\nexport function validateEvalBaselineSnapshot(raw: unknown): EvalBaselineSnapshot {\n if (!isRecord(raw)) throw new Error(\"eval baseline snapshot must be an object\");\n if (raw.schemaVersion !== 1) throw new Error(\"schemaVersion must be 1\");\n if (!Array.isArray(raw.benchmarks)) throw new Error(\"benchmarks must be an array\");\n\n const benchmarks = raw.benchmarks.map((item, index) => {\n if (!isRecord(item)) throw new Error(`benchmarks[${index}] must be an object`);\n const passRate = Number(item.passRate);\n if (!Number.isFinite(passRate) || passRate < 0 || passRate > 1) {\n throw new Error(`benchmarks[${index}].passRate must be a number between 0 and 1`);\n }\n\n const metrics = parseOptionalEvalRunMetrics(item.metrics);\n\n return {\n benchmarkId: assertString(item.benchmarkId, `benchmarks[${index}].benchmarkId`),\n runId: assertString(item.runId, `benchmarks[${index}].runId`),\n completedAt:\n typeof item.completedAt === \"string\" && item.completedAt.trim().length > 0\n ? item.completedAt.trim()\n : undefined,\n gitRef:\n typeof item.gitRef === \"string\" && item.gitRef.trim().length > 0\n ? item.gitRef.trim()\n : undefined,\n passRate,\n metrics,\n } satisfies EvalBaselineSnapshotBenchmark;\n });\n\n const benchmarkCount = Number(raw.benchmarkCount);\n if (!Number.isFinite(benchmarkCount) || benchmarkCount < 0) {\n throw new Error(\"benchmarkCount must be a non-negative number\");\n }\n if (benchmarkCount !== benchmarks.length) {\n throw new Error(\"benchmarkCount must match benchmarks.length\");\n }\n\n return {\n schemaVersion: 1,\n snapshotId: assertString(raw.snapshotId, \"snapshotId\"),\n createdAt: assertString(raw.createdAt, \"createdAt\"),\n sourceRootDir: assertString(raw.sourceRootDir, \"sourceRootDir\"),\n benchmarkCount,\n benchmarks,\n notes: typeof raw.notes === \"string\" && raw.notes.trim().length > 0 ? raw.notes.trim() : undefined,\n gitRef: typeof raw.gitRef === \"string\" && raw.gitRef.trim().length > 0 ? raw.gitRef.trim() : undefined,\n };\n}\n\nfunction parseOptionalEvalRunMetrics(raw: unknown): EvalRunMetrics | undefined {\n if (!isRecord(raw)) return undefined;\n return {\n recallPrecisionAtK: typeof raw.recallPrecisionAtK === \"number\" ? raw.recallPrecisionAtK : undefined,\n actionOutcomeScore: typeof raw.actionOutcomeScore === \"number\" ? raw.actionOutcomeScore : undefined,\n objectiveStateCoverage: typeof raw.objectiveStateCoverage === \"number\" ? raw.objectiveStateCoverage : undefined,\n causalPathRecall: typeof raw.causalPathRecall === \"number\" ? raw.causalPathRecall : undefined,\n trustViolationRate: typeof raw.trustViolationRate === \"number\" ? raw.trustViolationRate : undefined,\n creationRecoveryScore: typeof raw.creationRecoveryScore === \"number\" ? raw.creationRecoveryScore : undefined,\n } satisfies EvalRunMetrics;\n}\n\nexport function validateEvalShadowRecallRecord(raw: unknown): EvalShadowRecallRecord {\n if (!isRecord(raw)) throw new Error(\"eval shadow recall record must be an object\");\n if (raw.schemaVersion !== 1) throw new Error(\"schemaVersion must be 1\");\n\n const recallMode = assertString(raw.recallMode, \"recallMode\");\n if (![\"no_recall\", \"minimal\", \"full\", \"graph_mode\"].includes(recallMode)) {\n throw new Error(\"recallMode must be one of no_recall|minimal|full|graph_mode\");\n }\n\n const source = assertString(raw.source, \"source\");\n if (![\"none\", \"hot_qmd\", \"hot_embedding\", \"cold_fallback\", \"recent_scan\"].includes(source)) {\n throw new Error(\"source must be one of none|hot_qmd|hot_embedding|cold_fallback|recent_scan\");\n }\n\n const promptLength = Number(raw.promptLength);\n const retrievalQueryLength = Number(raw.retrievalQueryLength);\n const recallResultLimit = Number(raw.recallResultLimit);\n const recalledMemoryCount = Number(raw.recalledMemoryCount);\n const contextChars = Number(raw.contextChars);\n const durationMs = Number(raw.durationMs);\n\n for (const [field, value] of [\n [\"promptLength\", promptLength],\n [\"retrievalQueryLength\", retrievalQueryLength],\n [\"recallResultLimit\", recallResultLimit],\n [\"recalledMemoryCount\", recalledMemoryCount],\n [\"contextChars\", contextChars],\n [\"durationMs\", durationMs],\n ] as const) {\n if (!Number.isFinite(value) || value < 0) {\n throw new Error(`${field} must be a non-negative number`);\n }\n }\n\n const memoryIds = optionalStringArray(raw.memoryIds, \"memoryIds\") ?? [];\n if (typeof raw.injected !== \"boolean\") throw new Error(\"injected must be a boolean\");\n\n let timings: Record<string, string> | undefined;\n if (raw.timings !== undefined) {\n if (!isRecord(raw.timings)) throw new Error(\"timings must be an object of strings\");\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(raw.timings)) {\n if (typeof value !== \"string\") throw new Error(\"timings must be an object of strings\");\n out[key] = value;\n }\n timings = out;\n }\n\n const identityInjectionModeRaw =\n typeof raw.identityInjectionMode === \"string\" && raw.identityInjectionMode.trim().length > 0\n ? raw.identityInjectionMode.trim()\n : undefined;\n if (\n identityInjectionModeRaw !== undefined &&\n ![\"recovery_only\", \"minimal\", \"full\", \"none\"].includes(identityInjectionModeRaw)\n ) {\n throw new Error(\"identityInjectionMode must be one of recovery_only|minimal|full|none\");\n }\n\n return {\n schemaVersion: 1,\n traceId: assertSafePathSegment(assertString(raw.traceId, \"traceId\"), \"traceId\"),\n recordedAt: assertIsoTimestamp(raw.recordedAt, \"recordedAt\"),\n sessionKey: assertString(raw.sessionKey, \"sessionKey\"),\n promptHash: assertString(raw.promptHash, \"promptHash\"),\n promptLength,\n retrievalQueryHash: assertString(raw.retrievalQueryHash, \"retrievalQueryHash\"),\n retrievalQueryLength,\n recallMode: recallMode as EvalShadowRecallRecord[\"recallMode\"],\n recallResultLimit,\n source: source as EvalShadowRecallRecord[\"source\"],\n recalledMemoryCount,\n injected: raw.injected,\n contextChars,\n memoryIds,\n policyVersion:\n typeof raw.policyVersion === \"string\" && raw.policyVersion.trim().length > 0\n ? raw.policyVersion.trim()\n : undefined,\n identityInjectionMode: identityInjectionModeRaw as EvalShadowRecallRecord[\"identityInjectionMode\"],\n identityInjectedChars:\n typeof raw.identityInjectedChars === \"number\" && Number.isFinite(raw.identityInjectedChars)\n ? raw.identityInjectedChars\n : undefined,\n identityInjectionTruncated:\n typeof raw.identityInjectionTruncated === \"boolean\" ? raw.identityInjectionTruncated : undefined,\n durationMs,\n timings,\n };\n}\n\ninterface EvalStoreSnapshot {\n status: EvalHarnessStatus;\n manifests: EvalBenchmarkManifest[];\n runs: EvalRunSummary[];\n shadows: EvalShadowRecallRecord[];\n baselines: EvalBaselineSnapshot[];\n}\n\ninterface EvalStoreSnapshotOptions {\n rootDir: string;\n enabled: boolean;\n shadowModeEnabled: boolean;\n baselineSnapshotsEnabled?: boolean;\n memoryRedTeamBenchEnabled?: boolean;\n}\n\nconst LOWER_IS_BETTER_METRICS = new Set<keyof EvalRunMetrics>([\"trustViolationRate\"]);\n\nfunction computePassRate(run: EvalRunSummary): number {\n return run.totalCases > 0 ? run.passedCases / run.totalCases : 0;\n}\n\nfunction latestCompletedRunsByBenchmark(runs: EvalRunSummary[]): Map<string, EvalRunSummary> {\n const sorted = [...runs]\n .filter((run) => run.status === \"completed\")\n .sort((a, b) => {\n const aTime = Date.parse(a.completedAt ?? a.startedAt);\n const bTime = Date.parse(b.completedAt ?? b.startedAt);\n return (Number.isNaN(bTime) ? 0 : bTime) - (Number.isNaN(aTime) ? 0 : aTime);\n });\n const out = new Map<string, EvalRunSummary>();\n for (const run of sorted) {\n if (!out.has(run.benchmarkId)) {\n out.set(run.benchmarkId, run);\n }\n }\n return out;\n}\n\nfunction compareMetricDeltas(\n baseMetrics: EvalRunMetrics | undefined,\n candidateMetrics: EvalRunMetrics | undefined,\n): {\n deltas: Partial<Record<keyof EvalRunMetrics, number>>;\n regressions: string[];\n improvements: string[];\n} {\n const deltas: Partial<Record<keyof EvalRunMetrics, number>> = {};\n const regressions: string[] = [];\n const improvements: string[] = [];\n if (!baseMetrics || !candidateMetrics) {\n return { deltas, regressions, improvements };\n }\n\n for (const metric of Object.keys(baseMetrics) as Array<keyof EvalRunMetrics>) {\n const baseValue = baseMetrics[metric];\n const candidateValue = candidateMetrics[metric];\n if (typeof baseValue !== \"number\" || typeof candidateValue !== \"number\") continue;\n const delta = candidateValue - baseValue;\n deltas[metric] = delta;\n if (delta === 0) continue;\n const lowerIsBetter = LOWER_IS_BETTER_METRICS.has(metric);\n const improved = lowerIsBetter ? delta < 0 : delta > 0;\n const summary = `${metric} ${baseValue} -> ${candidateValue}`;\n if (improved) {\n improvements.push(summary);\n } else {\n regressions.push(summary);\n }\n }\n\n return { deltas, regressions, improvements };\n}\n\nfunction formatEvalBaselineDeltaMarkdown(report: EvalBaselineDeltaReport): string {\n const lines = [\n \"# Eval Baseline Delta Report\",\n \"\",\n `- Passed: ${report.passed ? \"yes\" : \"no\"}`,\n `- Baseline snapshot: ${report.baselineSnapshotId}`,\n `- Baseline created: ${report.baselineCreatedAt}`,\n `- Baseline source root: ${report.baselineSourceRootDir}`,\n `- Candidate root: ${report.candidateRootDir}`,\n `- Benchmarks compared: ${report.comparedBenchmarks}`,\n ];\n\n if (report.missingCandidateBenchmarks.length > 0) {\n lines.push(`- Missing candidate benchmarks: ${report.missingCandidateBenchmarks.join(\", \")}`);\n }\n\n lines.push(\n `- Invalid candidate artifacts: benchmarks=${report.invalidArtifacts.candidate.benchmarks}, runs=${report.invalidArtifacts.candidate.runs}, shadows=${report.invalidArtifacts.candidate.shadows}, baselines=${report.invalidArtifacts.candidate.baselines}`,\n \"\",\n \"## Regressions\",\n );\n if (report.regressions.length === 0) {\n lines.push(\"- none\");\n } else {\n for (const regression of report.regressions) lines.push(`- ${regression}`);\n }\n\n lines.push(\"\", \"## Improvements\");\n if (report.improvements.length === 0) {\n lines.push(\"- none\");\n } else {\n for (const improvement of report.improvements) lines.push(`- ${improvement}`);\n }\n\n lines.push(\"\", \"## Benchmark Deltas\");\n if (report.deltas.length === 0) {\n lines.push(\"- none\");\n } else {\n for (const delta of report.deltas) {\n lines.push(\n `- ${delta.benchmarkId}: passRate ${delta.basePassRate} -> ${delta.candidatePassRate} (delta ${delta.passRateDelta})`,\n );\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nasync function collectEvalStoreSnapshot(options: EvalStoreSnapshotOptions): Promise<EvalStoreSnapshot> {\n const rootDir = options.rootDir;\n const benchmarkDir = path.join(rootDir, \"benchmarks\");\n const runsDir = path.join(rootDir, \"runs\");\n const shadowDir = path.join(rootDir, \"shadow\");\n const baselineDir = path.join(rootDir, \"baselines\");\n const benchmarkFiles = await listNamedFiles(benchmarkDir, \"manifest.json\");\n const runFiles = await listJsonFiles(runsDir);\n const shadowFiles = await listJsonFiles(shadowDir);\n const baselineFiles = await listJsonFiles(baselineDir);\n\n const invalidBenchmarks: Array<{ path: string; error: string }> = [];\n const invalidRuns: Array<{ path: string; error: string }> = [];\n const invalidShadows: Array<{ path: string; error: string }> = [];\n const invalidBaselines: Array<{ path: string; error: string }> = [];\n const manifests: EvalBenchmarkManifest[] = [];\n\n for (const filePath of benchmarkFiles) {\n try {\n manifests.push(\n validateEvalBenchmarkManifest(await readJsonFile(filePath), {\n memoryRedTeamBenchEnabled: options.memoryRedTeamBenchEnabled,\n }),\n );\n } catch (error) {\n invalidBenchmarks.push({\n path: filePath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n const runs: EvalRunSummary[] = [];\n for (const filePath of runFiles) {\n try {\n runs.push(validateEvalRunSummary(await readJsonFile(filePath)));\n } catch (error) {\n invalidRuns.push({\n path: filePath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n const shadows: EvalShadowRecallRecord[] = [];\n for (const filePath of shadowFiles) {\n try {\n shadows.push(validateEvalShadowRecallRecord(await readJsonFile(filePath)));\n } catch (error) {\n invalidShadows.push({\n path: filePath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n const baselines: EvalBaselineSnapshot[] = [];\n for (const filePath of baselineFiles) {\n try {\n baselines.push(validateEvalBaselineSnapshot(await readJsonFile(filePath)));\n } catch (error) {\n invalidBaselines.push({\n path: filePath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n runs.sort((a, b) => {\n const aTime = Date.parse(a.completedAt ?? a.startedAt);\n const bTime = Date.parse(b.completedAt ?? b.startedAt);\n return (Number.isNaN(bTime) ? 0 : bTime) - (Number.isNaN(aTime) ? 0 : aTime);\n });\n shadows.sort((a, b) => b.recordedAt.localeCompare(a.recordedAt));\n baselines.sort((a, b) => b.createdAt.localeCompare(a.createdAt));\n\n const tags = new Set<string>();\n const attackClasses = new Set<string>();\n const sourceLinks = new Set<string>();\n const targetSurfaces = new Set<string>();\n let totalCases = 0;\n let redTeam = 0;\n for (const manifest of manifests) {\n totalCases += manifest.cases.length;\n if (manifest.benchmarkType === \"memory-red-team\") {\n redTeam += 1;\n if (manifest.attackClass) attackClasses.add(manifest.attackClass);\n if (manifest.targetSurface) targetSurfaces.add(manifest.targetSurface);\n }\n for (const tag of manifest.tags ?? []) tags.add(tag);\n for (const link of manifest.sourceLinks ?? []) sourceLinks.add(link);\n }\n\n return {\n status: {\n enabled: options.enabled,\n shadowModeEnabled: options.shadowModeEnabled,\n rootDir,\n benchmarkDir,\n runsDir,\n benchmarks: {\n total: benchmarkFiles.length,\n valid: manifests.length,\n invalid: invalidBenchmarks.length,\n redTeam,\n totalCases,\n attackClasses: [...attackClasses].sort(),\n tags: [...tags].sort(),\n targetSurfaces: [...targetSurfaces].sort(),\n sourceLinks: [...sourceLinks].sort(),\n },\n runs: {\n total: runFiles.length,\n invalid: invalidRuns.length,\n completed: runs.filter((run) => run.status === \"completed\").length,\n failed: runs.filter((run) => run.status === \"failed\").length,\n partial: runs.filter((run) => run.status === \"partial\").length,\n running: runs.filter((run) => run.status === \"running\").length,\n latestRunId: runs[0]?.runId,\n latestBenchmarkId: runs[0]?.benchmarkId,\n latestCompletedAt: runs[0]?.completedAt,\n },\n shadows: {\n total: shadowFiles.length,\n invalid: invalidShadows.length,\n latestTraceId: shadows[0]?.traceId,\n latestRecordedAt: shadows[0]?.recordedAt,\n latestSessionKey: shadows[0]?.sessionKey,\n },\n baselines: {\n enabled: options.baselineSnapshotsEnabled === true,\n total: baselineFiles.length,\n invalid: invalidBaselines.length,\n latestSnapshotId: baselines[0]?.snapshotId,\n latestCreatedAt: baselines[0]?.createdAt,\n latestBenchmarkCount: baselines[0]?.benchmarkCount,\n },\n latestRun: runs[0],\n latestShadow: shadows[0],\n latestBaseline: baselines[0],\n invalidBenchmarks,\n invalidRuns,\n invalidShadows,\n invalidBaselines,\n },\n manifests,\n runs,\n shadows,\n baselines,\n };\n}\n\nasync function resolveBenchmarkManifestPath(sourcePath: string): Promise<{ sourceKind: \"file\" | \"directory\"; manifestPath: string }> {\n const info = await stat(sourcePath);\n if (info.isDirectory()) {\n return {\n sourceKind: \"directory\",\n manifestPath: path.join(sourcePath, \"manifest.json\"),\n };\n }\n if (info.isFile()) {\n return {\n sourceKind: \"file\",\n manifestPath: sourcePath,\n };\n }\n throw new Error(\"benchmark pack source must be a file or directory\");\n}\n\nexport async function validateEvalBenchmarkPack(\n sourcePath: string,\n options?: { memoryRedTeamBenchEnabled?: boolean },\n): Promise<EvalBenchmarkPackSummary> {\n const trimmedSourcePath = sourcePath.trim();\n if (trimmedSourcePath.length === 0) {\n throw new Error(\"benchmark pack path must be a non-empty string\");\n }\n const { manifestPath } = await resolveBenchmarkManifestPath(trimmedSourcePath);\n const manifest = validateEvalBenchmarkManifest(await readJsonFile(manifestPath), {\n memoryRedTeamBenchEnabled: options?.memoryRedTeamBenchEnabled,\n });\n return {\n sourcePath: trimmedSourcePath,\n manifestPath,\n benchmarkId: assertSafeBenchmarkId(manifest.benchmarkId),\n benchmarkType: manifest.benchmarkType ?? \"standard\",\n title: manifest.title,\n attackClass: manifest.attackClass,\n targetSurface: manifest.targetSurface,\n totalCases: manifest.cases.length,\n tags: [...(manifest.tags ?? [])],\n sourceLinks: [...(manifest.sourceLinks ?? [])],\n };\n}\n\nexport async function importEvalBenchmarkPack(options: {\n sourcePath: string;\n memoryDir: string;\n evalStoreDir?: string;\n force?: boolean;\n memoryRedTeamBenchEnabled?: boolean;\n}): Promise<EvalBenchmarkPackSummary & { targetDir: string; overwritten: boolean }> {\n const summary = await validateEvalBenchmarkPack(options.sourcePath, {\n memoryRedTeamBenchEnabled: options.memoryRedTeamBenchEnabled,\n });\n const rootDir = resolveEvalStoreDir(options.memoryDir, options.evalStoreDir);\n const benchmarkDir = path.join(rootDir, \"benchmarks\");\n const targetDir = path.join(benchmarkDir, summary.benchmarkId);\n const { sourceKind, manifestPath } = await resolveBenchmarkManifestPath(summary.sourcePath);\n\n let overwritten = false;\n try {\n await stat(targetDir);\n if (options.force !== true) {\n throw new Error(`benchmark pack already exists at ${targetDir}; rerun with force to replace it`);\n }\n overwritten = true;\n await rm(targetDir, { recursive: true, force: true });\n } catch (error) {\n if (!(error instanceof Error) || !(\"code\" in error) || (error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n\n await mkdir(benchmarkDir, { recursive: true });\n if (sourceKind === \"directory\") {\n await cp(summary.sourcePath, targetDir, { recursive: true });\n } else {\n await mkdir(targetDir, { recursive: true });\n await cp(manifestPath, path.join(targetDir, \"manifest.json\"));\n }\n\n return {\n ...summary,\n targetDir,\n overwritten,\n };\n}\n\nexport async function recordEvalShadowRecall(options: {\n memoryDir: string;\n evalStoreDir?: string;\n record: EvalShadowRecallRecord;\n}): Promise<string> {\n const rootDir = resolveEvalStoreDir(options.memoryDir, options.evalStoreDir);\n const validated = validateEvalShadowRecallRecord(options.record);\n const day = validated.recordedAt.slice(0, 10);\n const shadowRoot = path.join(rootDir, \"shadow\");\n const shadowDir = path.join(shadowRoot, day);\n const targetPath = path.join(shadowDir, `${validated.traceId}.json`);\n assertPathWithin(shadowRoot, targetPath, \"shadow recall record path\");\n await mkdir(shadowDir, { recursive: true });\n await writeFile(targetPath, JSON.stringify(validated, null, 2), \"utf-8\");\n return targetPath;\n}\n\nexport async function getEvalHarnessStatus(options: {\n memoryDir: string;\n evalStoreDir?: string;\n enabled: boolean;\n shadowModeEnabled: boolean;\n baselineSnapshotsEnabled?: boolean;\n memoryRedTeamBenchEnabled?: boolean;\n}): Promise<EvalHarnessStatus> {\n return (\n await collectEvalStoreSnapshot({\n rootDir: resolveEvalStoreDir(options.memoryDir, options.evalStoreDir),\n enabled: options.enabled,\n shadowModeEnabled: options.shadowModeEnabled,\n baselineSnapshotsEnabled: options.baselineSnapshotsEnabled,\n memoryRedTeamBenchEnabled: options.memoryRedTeamBenchEnabled,\n })\n ).status;\n}\n\nexport async function createEvalBaselineSnapshot(options: {\n memoryDir: string;\n evalStoreDir?: string;\n baselineSnapshotsEnabled: boolean;\n snapshotId: string;\n createdAt?: string;\n notes?: string;\n gitRef?: string;\n}): Promise<{ targetPath: string; snapshot: EvalBaselineSnapshot }> {\n if (options.baselineSnapshotsEnabled !== true) {\n throw new Error(\"benchmark baseline snapshots are disabled\");\n }\n\n const snapshotId = assertSafePathSegment(assertString(options.snapshotId, \"snapshotId\"), \"snapshotId\");\n const rootDir = resolveEvalStoreDir(options.memoryDir, options.evalStoreDir);\n const store = await collectEvalStoreSnapshot({\n rootDir,\n enabled: true,\n shadowModeEnabled: true,\n baselineSnapshotsEnabled: true,\n memoryRedTeamBenchEnabled: true,\n });\n const latestRuns = latestCompletedRunsByBenchmark(store.runs);\n const benchmarks = [...latestRuns.values()]\n .sort((a, b) => a.benchmarkId.localeCompare(b.benchmarkId))\n .map((run) => ({\n benchmarkId: run.benchmarkId,\n runId: run.runId,\n completedAt: run.completedAt,\n gitRef: run.gitRef,\n passRate: computePassRate(run),\n metrics: run.metrics,\n } satisfies EvalBaselineSnapshotBenchmark));\n\n const snapshot = validateEvalBaselineSnapshot({\n schemaVersion: 1,\n snapshotId,\n createdAt: options.createdAt ?? new Date().toISOString(),\n sourceRootDir: rootDir,\n benchmarkCount: benchmarks.length,\n benchmarks,\n notes: options.notes,\n gitRef: options.gitRef,\n });\n\n const targetPath = path.join(rootDir, \"baselines\", `${snapshot.snapshotId}.json`);\n await mkdir(path.dirname(targetPath), { recursive: true });\n await writeFile(targetPath, JSON.stringify(snapshot, null, 2), \"utf-8\");\n return { targetPath, snapshot };\n}\n\nexport async function runEvalBaselineDeltaReport(options: {\n memoryDir: string;\n evalStoreDir?: string;\n benchmarkDeltaReporterEnabled: boolean;\n snapshotId: string;\n}): Promise<EvalBaselineDeltaReport> {\n if (options.benchmarkDeltaReporterEnabled !== true) {\n throw new Error(\"benchmark delta reporter is disabled\");\n }\n\n const snapshotId = assertSafePathSegment(assertString(options.snapshotId, \"snapshotId\"), \"snapshotId\");\n const candidateRootDir = resolveEvalStoreDir(options.memoryDir, options.evalStoreDir);\n const candidateSnapshot = await collectEvalStoreSnapshot({\n rootDir: candidateRootDir,\n enabled: true,\n shadowModeEnabled: true,\n baselineSnapshotsEnabled: true,\n memoryRedTeamBenchEnabled: true,\n });\n const baselineSnapshot = candidateSnapshot.baselines.find((snapshot) => snapshot.snapshotId === snapshotId);\n if (!baselineSnapshot) {\n throw new Error(`benchmark baseline snapshot not found: ${snapshotId}`);\n }\n\n return buildEvalBaselineDeltaReport({\n baselineSnapshot,\n candidateSnapshot,\n });\n}\n\nexport async function runEvalStoredBaselineCiGate(options: {\n baseMemoryDir?: string;\n baseEvalStoreDir: string;\n candidateMemoryDir?: string;\n candidateEvalStoreDir: string;\n snapshotId: string;\n}): Promise<EvalStoredBaselineCiGateReport> {\n const snapshotId = assertSafePathSegment(assertString(options.snapshotId, \"snapshotId\"), \"snapshotId\");\n const baseRootDir = resolveEvalStoreDir(options.baseMemoryDir ?? options.baseEvalStoreDir, options.baseEvalStoreDir);\n const candidateRootDir = resolveEvalStoreDir(\n options.candidateMemoryDir ?? options.candidateEvalStoreDir,\n options.candidateEvalStoreDir,\n );\n const [baseSnapshot, candidateSnapshot] = await Promise.all([\n collectEvalStoreSnapshot({\n rootDir: baseRootDir,\n enabled: true,\n shadowModeEnabled: true,\n baselineSnapshotsEnabled: true,\n memoryRedTeamBenchEnabled: true,\n }),\n collectEvalStoreSnapshot({\n rootDir: candidateRootDir,\n enabled: true,\n shadowModeEnabled: true,\n baselineSnapshotsEnabled: true,\n memoryRedTeamBenchEnabled: true,\n }),\n ]);\n const baselineSnapshot =\n baseSnapshot.baselines.find((snapshot) => snapshot.snapshotId === snapshotId) ??\n candidateSnapshot.baselines.find((snapshot) => snapshot.snapshotId === snapshotId);\n if (!baselineSnapshot) {\n throw new Error(`benchmark baseline snapshot not found: ${snapshotId}`);\n }\n\n return {\n baseRootDir,\n baselineResolvedFrom: baseSnapshot.baselines.some((snapshot) => snapshot.snapshotId === snapshotId) ? \"base\" : \"candidate\",\n ...buildEvalBaselineDeltaReport({\n baselineSnapshot,\n candidateSnapshot,\n }),\n };\n}\n\nfunction buildEvalBaselineDeltaReport(options: {\n baselineSnapshot: EvalBaselineSnapshot;\n candidateSnapshot: EvalStoreSnapshot;\n}): EvalBaselineDeltaReport {\n const { baselineSnapshot, candidateSnapshot } = options;\n\n const regressions: string[] = [];\n const improvements: string[] = [];\n\n if (candidateSnapshot.status.invalidBenchmarks.length > 0) {\n regressions.push(`candidate store has ${candidateSnapshot.status.invalidBenchmarks.length} invalid benchmark manifest(s)`);\n }\n if (candidateSnapshot.status.invalidRuns.length > 0) {\n regressions.push(`candidate store has ${candidateSnapshot.status.invalidRuns.length} invalid run summary file(s)`);\n }\n if (candidateSnapshot.status.invalidShadows.length > 0) {\n regressions.push(`candidate store has ${candidateSnapshot.status.invalidShadows.length} invalid shadow record(s)`);\n }\n if (candidateSnapshot.status.invalidBaselines.length > 0) {\n regressions.push(`candidate store has ${candidateSnapshot.status.invalidBaselines.length} invalid baseline snapshot file(s)`);\n }\n\n const candidateRuns = latestCompletedRunsByBenchmark(candidateSnapshot.runs);\n const baselineBenchmarks = new Map(\n baselineSnapshot.benchmarks.map((benchmark) => [benchmark.benchmarkId, benchmark] as const),\n );\n const missingCandidateBenchmarks = [...baselineBenchmarks.keys()]\n .filter((benchmarkId) => !candidateRuns.has(benchmarkId))\n .sort();\n for (const benchmarkId of missingCandidateBenchmarks) {\n regressions.push(`candidate is missing latest completed benchmark run for ${benchmarkId}`);\n }\n\n const deltas: EvalBenchmarkDelta[] = [];\n for (const benchmarkId of [...baselineBenchmarks.keys()].sort()) {\n const baseBenchmark = baselineBenchmarks.get(benchmarkId);\n const candidateRun = candidateRuns.get(benchmarkId);\n if (!baseBenchmark || !candidateRun) continue;\n\n const passRateDelta = computePassRate(candidateRun) - baseBenchmark.passRate;\n const delta: EvalBenchmarkDelta = {\n benchmarkId,\n baseRunId: baseBenchmark.runId,\n candidateRunId: candidateRun.runId,\n basePassRate: baseBenchmark.passRate,\n candidatePassRate: computePassRate(candidateRun),\n passRateDelta,\n metricDeltas: {},\n regressions: [],\n improvements: [],\n };\n\n if (passRateDelta < 0) {\n delta.regressions.push(`passRate ${baseBenchmark.passRate} -> ${delta.candidatePassRate}`);\n regressions.push(`${benchmarkId} pass rate regressed (${baseBenchmark.passRate} -> ${delta.candidatePassRate})`);\n } else if (passRateDelta > 0) {\n delta.improvements.push(`passRate ${baseBenchmark.passRate} -> ${delta.candidatePassRate}`);\n improvements.push(`${benchmarkId} pass rate improved (${baseBenchmark.passRate} -> ${delta.candidatePassRate})`);\n }\n\n const metricDelta = compareMetricDeltas(baseBenchmark.metrics, candidateRun.metrics);\n delta.metricDeltas = metricDelta.deltas;\n for (const regression of metricDelta.regressions) {\n delta.regressions.push(regression);\n regressions.push(`${benchmarkId} ${regression}`);\n }\n for (const improvement of metricDelta.improvements) {\n delta.improvements.push(improvement);\n improvements.push(`${benchmarkId} ${improvement}`);\n }\n deltas.push(delta);\n }\n\n const report: EvalBaselineDeltaReport = {\n passed: regressions.length === 0,\n baselineSnapshotId: baselineSnapshot.snapshotId,\n baselineCreatedAt: baselineSnapshot.createdAt,\n baselineSourceRootDir: baselineSnapshot.sourceRootDir,\n candidateRootDir: candidateSnapshot.status.rootDir,\n comparedBenchmarks: deltas.length,\n missingCandidateBenchmarks,\n invalidArtifacts: {\n candidate: {\n benchmarks: candidateSnapshot.status.invalidBenchmarks.length,\n runs: candidateSnapshot.status.invalidRuns.length,\n shadows: candidateSnapshot.status.invalidShadows.length,\n baselines: candidateSnapshot.status.invalidBaselines.length,\n },\n },\n regressions,\n improvements,\n deltas,\n markdownReport: \"\",\n };\n report.markdownReport = formatEvalBaselineDeltaMarkdown(report);\n return report;\n}\n\nfunction resolveRequiredEvalStoreRoot(options: { memoryDir?: string; evalStoreDir?: string }, label: string): string {\n if (typeof options.evalStoreDir === \"string\" && options.evalStoreDir.trim().length > 0) {\n return options.evalStoreDir.trim();\n }\n if (typeof options.memoryDir === \"string\" && options.memoryDir.trim().length > 0) {\n return resolveEvalStoreDir(options.memoryDir.trim());\n }\n throw new Error(`${label} requires memoryDir or evalStoreDir`);\n}\n\nexport async function runEvalBenchmarkCiGate(options: {\n baseMemoryDir?: string;\n candidateMemoryDir?: string;\n baseEvalStoreDir?: string;\n candidateEvalStoreDir?: string;\n}): Promise<EvalCiGateReport> {\n const baseRootDir = resolveRequiredEvalStoreRoot(\n { memoryDir: options.baseMemoryDir, evalStoreDir: options.baseEvalStoreDir },\n \"base\",\n );\n const candidateRootDir = resolveRequiredEvalStoreRoot(\n { memoryDir: options.candidateMemoryDir, evalStoreDir: options.candidateEvalStoreDir },\n \"candidate\",\n );\n const baseSnapshot = await collectEvalStoreSnapshot({\n rootDir: baseRootDir,\n enabled: true,\n shadowModeEnabled: true,\n memoryRedTeamBenchEnabled: true,\n });\n const candidateSnapshot = await collectEvalStoreSnapshot({\n rootDir: candidateRootDir,\n enabled: true,\n shadowModeEnabled: true,\n memoryRedTeamBenchEnabled: true,\n });\n\n const regressions: string[] = [];\n const improvements: string[] = [];\n\n if (baseSnapshot.status.invalidBenchmarks.length > 0) {\n regressions.push(`base store has ${baseSnapshot.status.invalidBenchmarks.length} invalid benchmark manifest(s)`);\n }\n if (baseSnapshot.status.invalidRuns.length > 0) {\n regressions.push(`base store has ${baseSnapshot.status.invalidRuns.length} invalid run summary file(s)`);\n }\n if (baseSnapshot.status.invalidShadows.length > 0) {\n regressions.push(`base store has ${baseSnapshot.status.invalidShadows.length} invalid shadow record(s)`);\n }\n if (candidateSnapshot.status.invalidBenchmarks.length > 0) {\n regressions.push(`candidate store has ${candidateSnapshot.status.invalidBenchmarks.length} invalid benchmark manifest(s)`);\n }\n if (candidateSnapshot.status.invalidRuns.length > 0) {\n regressions.push(`candidate store has ${candidateSnapshot.status.invalidRuns.length} invalid run summary file(s)`);\n }\n if (candidateSnapshot.status.invalidShadows.length > 0) {\n regressions.push(`candidate store has ${candidateSnapshot.status.invalidShadows.length} invalid shadow record(s)`);\n }\n\n const baseRuns = latestCompletedRunsByBenchmark(baseSnapshot.runs);\n const candidateRuns = latestCompletedRunsByBenchmark(candidateSnapshot.runs);\n const missingCandidateBenchmarks = [...baseRuns.keys()]\n .filter((benchmarkId) => !candidateRuns.has(benchmarkId))\n .sort();\n for (const benchmarkId of missingCandidateBenchmarks) {\n regressions.push(`candidate is missing latest completed benchmark run for ${benchmarkId}`);\n }\n\n const deltas: EvalBenchmarkDelta[] = [];\n for (const benchmarkId of [...baseRuns.keys()].sort()) {\n const baseRun = baseRuns.get(benchmarkId);\n const candidateRun = candidateRuns.get(benchmarkId);\n if (!baseRun || !candidateRun) continue;\n\n const basePassRate = computePassRate(baseRun);\n const candidatePassRate = computePassRate(candidateRun);\n const passRateDelta = candidatePassRate - basePassRate;\n const delta: EvalBenchmarkDelta = {\n benchmarkId,\n baseRunId: baseRun.runId,\n candidateRunId: candidateRun.runId,\n basePassRate,\n candidatePassRate,\n passRateDelta,\n metricDeltas: {},\n regressions: [],\n improvements: [],\n };\n\n if (passRateDelta < 0) {\n delta.regressions.push(`passRate ${basePassRate} -> ${candidatePassRate}`);\n regressions.push(`${benchmarkId} pass rate regressed (${basePassRate} -> ${candidatePassRate})`);\n } else if (passRateDelta > 0) {\n delta.improvements.push(`passRate ${basePassRate} -> ${candidatePassRate}`);\n improvements.push(`${benchmarkId} pass rate improved (${basePassRate} -> ${candidatePassRate})`);\n }\n\n const metricDelta = compareMetricDeltas(baseRun.metrics, candidateRun.metrics);\n delta.metricDeltas = metricDelta.deltas;\n for (const regression of metricDelta.regressions) {\n delta.regressions.push(regression);\n regressions.push(`${benchmarkId} ${regression}`);\n }\n for (const improvement of metricDelta.improvements) {\n delta.improvements.push(improvement);\n improvements.push(`${benchmarkId} ${improvement}`);\n }\n deltas.push(delta);\n }\n\n return {\n passed: regressions.length === 0,\n baseRootDir: baseSnapshot.status.rootDir,\n candidateRootDir: candidateSnapshot.status.rootDir,\n comparedBenchmarks: deltas.length,\n missingCandidateBenchmarks,\n invalidArtifacts: {\n base: {\n benchmarks: baseSnapshot.status.invalidBenchmarks.length,\n runs: baseSnapshot.status.invalidRuns.length,\n shadows: baseSnapshot.status.invalidShadows.length,\n },\n candidate: {\n benchmarks: candidateSnapshot.status.invalidBenchmarks.length,\n runs: candidateSnapshot.status.invalidRuns.length,\n shadows: candidateSnapshot.status.invalidShadows.length,\n },\n },\n regressions,\n improvements,\n deltas,\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/evals.ts"],"sourcesContent":["import path from \"node:path\";\nimport { cp, mkdir, readFile, readdir, rm, stat, writeFile } from \"node:fs/promises\";\nimport { listJsonFiles, listNamedFiles, readJsonFile } from \"./json-store.js\";\n\nexport type EvalRunStatus = \"running\" | \"completed\" | \"failed\" | \"partial\";\n\nexport interface EvalBenchmarkCase {\n id: string;\n prompt: string;\n expectedSignals?: string[];\n notes?: string;\n}\n\nexport type EvalBenchmarkType = \"standard\" | \"memory-red-team\";\n\nexport interface EvalBenchmarkManifest {\n schemaVersion: 1;\n benchmarkId: string;\n benchmarkType?: EvalBenchmarkType;\n title: string;\n description?: string;\n tags?: string[];\n sourceLinks?: string[];\n attackClass?: string;\n targetSurface?: string;\n cases: EvalBenchmarkCase[];\n}\n\nexport interface EvalRunMetrics {\n recallPrecisionAtK?: number;\n actionOutcomeScore?: number;\n objectiveStateCoverage?: number;\n causalPathRecall?: number;\n trustViolationRate?: number;\n creationRecoveryScore?: number;\n}\n\nexport interface EvalRunSummary {\n schemaVersion: 1;\n runId: string;\n benchmarkId: string;\n status: EvalRunStatus;\n startedAt: string;\n completedAt?: string;\n totalCases: number;\n passedCases: number;\n failedCases: number;\n metrics?: EvalRunMetrics;\n notes?: string;\n gitRef?: string;\n}\n\nexport interface EvalShadowRecallRecord {\n schemaVersion: 1;\n traceId: string;\n recordedAt: string;\n sessionKey: string;\n promptHash: string;\n promptLength: number;\n retrievalQueryHash: string;\n retrievalQueryLength: number;\n recallMode: \"no_recall\" | \"minimal\" | \"full\" | \"graph_mode\";\n recallResultLimit: number;\n source: \"none\" | \"hot_qmd\" | \"hot_embedding\" | \"cold_fallback\" | \"recent_scan\";\n recalledMemoryCount: number;\n injected: boolean;\n contextChars: number;\n memoryIds: string[];\n policyVersion?: string;\n identityInjectionMode?: \"recovery_only\" | \"minimal\" | \"full\" | \"none\";\n identityInjectedChars?: number;\n identityInjectionTruncated?: boolean;\n durationMs: number;\n timings?: Record<string, string>;\n}\n\nexport interface EvalHarnessStatus {\n enabled: boolean;\n shadowModeEnabled: boolean;\n rootDir: string;\n benchmarkDir: string;\n runsDir: string;\n benchmarks: {\n total: number;\n valid: number;\n invalid: number;\n redTeam: number;\n totalCases: number;\n attackClasses: string[];\n tags: string[];\n targetSurfaces: string[];\n sourceLinks: string[];\n };\n runs: {\n total: number;\n invalid: number;\n completed: number;\n failed: number;\n partial: number;\n running: number;\n latestRunId?: string;\n latestBenchmarkId?: string;\n latestCompletedAt?: string;\n };\n shadows: {\n total: number;\n invalid: number;\n latestTraceId?: string;\n latestRecordedAt?: string;\n latestSessionKey?: string;\n };\n baselines: {\n enabled: boolean;\n total: number;\n invalid: number;\n latestSnapshotId?: string;\n latestCreatedAt?: string;\n latestBenchmarkCount?: number;\n };\n latestRun?: EvalRunSummary;\n latestShadow?: EvalShadowRecallRecord;\n latestBaseline?: EvalBaselineSnapshot;\n invalidBenchmarks: Array<{\n path: string;\n error: string;\n }>;\n invalidRuns: Array<{\n path: string;\n error: string;\n }>;\n invalidShadows: Array<{\n path: string;\n error: string;\n }>;\n invalidBaselines: Array<{\n path: string;\n error: string;\n }>;\n}\n\nexport interface EvalBenchmarkDelta {\n benchmarkId: string;\n baseRunId: string;\n candidateRunId: string;\n basePassRate: number;\n candidatePassRate: number;\n passRateDelta: number;\n metricDeltas: Partial<Record<keyof EvalRunMetrics, number>>;\n regressions: string[];\n improvements: string[];\n}\n\nexport interface EvalCiGateReport {\n passed: boolean;\n baseRootDir: string;\n candidateRootDir: string;\n comparedBenchmarks: number;\n missingCandidateBenchmarks: string[];\n invalidArtifacts: {\n base: {\n benchmarks: number;\n runs: number;\n shadows: number;\n };\n candidate: {\n benchmarks: number;\n runs: number;\n shadows: number;\n };\n };\n regressions: string[];\n improvements: string[];\n deltas: EvalBenchmarkDelta[];\n}\n\nexport interface EvalBaselineDeltaReport {\n passed: boolean;\n baselineSnapshotId: string;\n baselineCreatedAt: string;\n baselineSourceRootDir: string;\n candidateRootDir: string;\n comparedBenchmarks: number;\n missingCandidateBenchmarks: string[];\n invalidArtifacts: {\n candidate: {\n benchmarks: number;\n runs: number;\n shadows: number;\n baselines: number;\n };\n };\n regressions: string[];\n improvements: string[];\n deltas: EvalBenchmarkDelta[];\n markdownReport: string;\n}\n\nexport interface EvalStoredBaselineCiGateReport extends EvalBaselineDeltaReport {\n baseRootDir: string;\n baselineResolvedFrom: \"base\" | \"candidate\";\n}\n\nexport interface EvalBaselineSnapshotBenchmark {\n benchmarkId: string;\n runId: string;\n completedAt?: string;\n gitRef?: string;\n passRate: number;\n metrics?: EvalRunMetrics;\n}\n\nexport interface EvalBaselineSnapshot {\n schemaVersion: 1;\n snapshotId: string;\n createdAt: string;\n sourceRootDir: string;\n benchmarkCount: number;\n benchmarks: EvalBaselineSnapshotBenchmark[];\n notes?: string;\n gitRef?: string;\n}\n\nexport interface EvalBenchmarkPackSummary {\n sourcePath: string;\n manifestPath: string;\n benchmarkId: string;\n benchmarkType: EvalBenchmarkType;\n title: string;\n attackClass?: string;\n targetSurface?: string;\n totalCases: number;\n tags: string[];\n sourceLinks: string[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction assertString(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.trim().length === 0) {\n throw new Error(`${field} must be a non-empty string`);\n }\n return value.trim();\n}\n\nfunction optionalStringArray(value: unknown, field: string): string[] | undefined {\n if (value === undefined) return undefined;\n if (!Array.isArray(value)) {\n throw new Error(`${field} must be an array of strings`);\n }\n const out = value\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n if (out.length !== value.length) {\n throw new Error(`${field} must be an array of non-empty strings`);\n }\n return out;\n}\n\nexport function resolveEvalStoreDir(memoryDir: string, overrideDir?: string): string {\n if (typeof overrideDir === \"string\" && overrideDir.trim().length > 0) {\n return overrideDir.trim();\n }\n return path.join(memoryDir, \"state\", \"evals\");\n}\n\nfunction assertSafePathSegment(value: string, field: string): string {\n if (value === \".\" || value === \"..\" || value.includes(\"/\") || value.includes(\"\\\\\")) {\n throw new Error(`${field} must be a safe path segment`);\n }\n return value;\n}\n\nfunction assertSafeBenchmarkId(benchmarkId: string): string {\n return assertSafePathSegment(benchmarkId, \"benchmarkId\");\n}\n\nconst ISO_UTC_TIMESTAMP_RE = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/;\n\nfunction assertIsoTimestamp(value: unknown, field: string): string {\n const timestamp = assertString(value, field);\n if (!ISO_UTC_TIMESTAMP_RE.test(timestamp)) {\n throw new Error(`${field} must be a valid ISO timestamp`);\n }\n const parsed = Date.parse(timestamp);\n if (!Number.isFinite(parsed)) {\n throw new Error(`${field} must be a valid ISO timestamp`);\n }\n const normalized = new Date(parsed).toISOString();\n if (normalized !== timestamp) {\n throw new Error(`${field} must be a valid ISO timestamp`);\n }\n return normalized;\n}\n\nfunction assertNonNegativeInteger(value: unknown, field: string): number {\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed) || parsed < 0) {\n throw new Error(`${field} must be a non-negative integer`);\n }\n return parsed;\n}\n\nfunction assertPathWithin(rootDir: string, targetPath: string, field: string): void {\n const resolvedRoot = path.resolve(rootDir);\n const resolvedTarget = path.resolve(targetPath);\n const relative = path.relative(resolvedRoot, resolvedTarget);\n if (relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative))) {\n return;\n }\n throw new Error(`${field} must stay within ${rootDir}`);\n}\n\nexport function validateEvalBenchmarkManifest(\n raw: unknown,\n options?: { memoryRedTeamBenchEnabled?: boolean },\n): EvalBenchmarkManifest {\n if (!isRecord(raw)) throw new Error(\"benchmark manifest must be an object\");\n if (raw.schemaVersion !== 1) throw new Error(\"schemaVersion must be 1\");\n if (!Array.isArray(raw.cases)) throw new Error(\"cases must be an array\");\n const benchmarkTypeRaw =\n typeof raw.benchmarkType === \"string\" && raw.benchmarkType.trim().length > 0\n ? raw.benchmarkType.trim()\n : \"standard\";\n if (![\"standard\", \"memory-red-team\"].includes(benchmarkTypeRaw)) {\n throw new Error(\"benchmarkType must be one of standard|memory-red-team\");\n }\n\n const cases = raw.cases.map((item, index) => {\n if (!isRecord(item)) throw new Error(`cases[${index}] must be an object`);\n return {\n id: assertString(item.id, `cases[${index}].id`),\n prompt: assertString(item.prompt, `cases[${index}].prompt`),\n expectedSignals: optionalStringArray(item.expectedSignals, `cases[${index}].expectedSignals`),\n notes: typeof item.notes === \"string\" && item.notes.trim().length > 0 ? item.notes.trim() : undefined,\n } satisfies EvalBenchmarkCase;\n });\n\n const benchmarkType = benchmarkTypeRaw as EvalBenchmarkType;\n if (benchmarkType === \"memory-red-team\" && options?.memoryRedTeamBenchEnabled !== true) {\n throw new Error(\"memory-red-team benchmark packs require memoryRedTeamBenchEnabled\");\n }\n const attackClass =\n typeof raw.attackClass === \"string\" && raw.attackClass.trim().length > 0\n ? raw.attackClass.trim()\n : undefined;\n const targetSurface =\n typeof raw.targetSurface === \"string\" && raw.targetSurface.trim().length > 0\n ? raw.targetSurface.trim()\n : undefined;\n if (benchmarkType === \"memory-red-team\" && attackClass === undefined) {\n throw new Error(\"attackClass must be a non-empty string\");\n }\n if (benchmarkType === \"memory-red-team\" && targetSurface === undefined) {\n throw new Error(\"targetSurface must be a non-empty string\");\n }\n\n return {\n schemaVersion: 1,\n benchmarkId: assertString(raw.benchmarkId, \"benchmarkId\"),\n benchmarkType,\n title: assertString(raw.title, \"title\"),\n description:\n typeof raw.description === \"string\" && raw.description.trim().length > 0\n ? raw.description.trim()\n : undefined,\n tags: optionalStringArray(raw.tags, \"tags\"),\n sourceLinks: optionalStringArray(raw.sourceLinks, \"sourceLinks\"),\n attackClass,\n targetSurface,\n cases,\n };\n}\n\nexport function validateEvalRunSummary(raw: unknown): EvalRunSummary {\n if (!isRecord(raw)) throw new Error(\"eval run summary must be an object\");\n if (raw.schemaVersion !== 1) throw new Error(\"schemaVersion must be 1\");\n const status = assertString(raw.status, \"status\");\n if (![\"running\", \"completed\", \"failed\", \"partial\"].includes(status)) {\n throw new Error(\"status must be one of running|completed|failed|partial\");\n }\n\n const totalCases = assertNonNegativeInteger(raw.totalCases, \"totalCases\");\n const passedCases = assertNonNegativeInteger(raw.passedCases, \"passedCases\");\n const failedCases = assertNonNegativeInteger(raw.failedCases, \"failedCases\");\n if (passedCases + failedCases > totalCases) {\n throw new Error(\"passedCases + failedCases must be less than or equal to totalCases\");\n }\n\n const metrics = parseOptionalEvalRunMetrics(raw.metrics);\n const completedAt =\n typeof raw.completedAt === \"string\" && raw.completedAt.trim().length > 0\n ? assertIsoTimestamp(raw.completedAt, \"completedAt\")\n : undefined;\n\n return {\n schemaVersion: 1,\n runId: assertString(raw.runId, \"runId\"),\n benchmarkId: assertString(raw.benchmarkId, \"benchmarkId\"),\n status: status as EvalRunStatus,\n startedAt: assertIsoTimestamp(raw.startedAt, \"startedAt\"),\n completedAt,\n totalCases,\n passedCases,\n failedCases,\n metrics,\n notes: typeof raw.notes === \"string\" && raw.notes.trim().length > 0 ? raw.notes.trim() : undefined,\n gitRef: typeof raw.gitRef === \"string\" && raw.gitRef.trim().length > 0 ? raw.gitRef.trim() : undefined,\n };\n}\n\nexport function validateEvalBaselineSnapshot(raw: unknown): EvalBaselineSnapshot {\n if (!isRecord(raw)) throw new Error(\"eval baseline snapshot must be an object\");\n if (raw.schemaVersion !== 1) throw new Error(\"schemaVersion must be 1\");\n if (!Array.isArray(raw.benchmarks)) throw new Error(\"benchmarks must be an array\");\n\n const benchmarks = raw.benchmarks.map((item, index) => {\n if (!isRecord(item)) throw new Error(`benchmarks[${index}] must be an object`);\n const passRate = Number(item.passRate);\n if (!Number.isFinite(passRate) || passRate < 0 || passRate > 1) {\n throw new Error(`benchmarks[${index}].passRate must be a number between 0 and 1`);\n }\n\n const metrics = parseOptionalEvalRunMetrics(item.metrics);\n\n return {\n benchmarkId: assertString(item.benchmarkId, `benchmarks[${index}].benchmarkId`),\n runId: assertString(item.runId, `benchmarks[${index}].runId`),\n completedAt:\n typeof item.completedAt === \"string\" && item.completedAt.trim().length > 0\n ? assertIsoTimestamp(item.completedAt, `benchmarks[${index}].completedAt`)\n : undefined,\n gitRef:\n typeof item.gitRef === \"string\" && item.gitRef.trim().length > 0\n ? item.gitRef.trim()\n : undefined,\n passRate,\n metrics,\n } satisfies EvalBaselineSnapshotBenchmark;\n });\n\n const benchmarkCount = Number(raw.benchmarkCount);\n if (!Number.isFinite(benchmarkCount) || benchmarkCount < 0) {\n throw new Error(\"benchmarkCount must be a non-negative number\");\n }\n if (benchmarkCount !== benchmarks.length) {\n throw new Error(\"benchmarkCount must match benchmarks.length\");\n }\n\n return {\n schemaVersion: 1,\n snapshotId: assertString(raw.snapshotId, \"snapshotId\"),\n createdAt: assertIsoTimestamp(raw.createdAt, \"createdAt\"),\n sourceRootDir: assertString(raw.sourceRootDir, \"sourceRootDir\"),\n benchmarkCount,\n benchmarks,\n notes: typeof raw.notes === \"string\" && raw.notes.trim().length > 0 ? raw.notes.trim() : undefined,\n gitRef: typeof raw.gitRef === \"string\" && raw.gitRef.trim().length > 0 ? raw.gitRef.trim() : undefined,\n };\n}\n\nfunction parseOptionalEvalRunMetrics(raw: unknown): EvalRunMetrics | undefined {\n if (!isRecord(raw)) return undefined;\n return {\n recallPrecisionAtK: typeof raw.recallPrecisionAtK === \"number\" ? raw.recallPrecisionAtK : undefined,\n actionOutcomeScore: typeof raw.actionOutcomeScore === \"number\" ? raw.actionOutcomeScore : undefined,\n objectiveStateCoverage: typeof raw.objectiveStateCoverage === \"number\" ? raw.objectiveStateCoverage : undefined,\n causalPathRecall: typeof raw.causalPathRecall === \"number\" ? raw.causalPathRecall : undefined,\n trustViolationRate: typeof raw.trustViolationRate === \"number\" ? raw.trustViolationRate : undefined,\n creationRecoveryScore: typeof raw.creationRecoveryScore === \"number\" ? raw.creationRecoveryScore : undefined,\n } satisfies EvalRunMetrics;\n}\n\nexport function validateEvalShadowRecallRecord(raw: unknown): EvalShadowRecallRecord {\n if (!isRecord(raw)) throw new Error(\"eval shadow recall record must be an object\");\n if (raw.schemaVersion !== 1) throw new Error(\"schemaVersion must be 1\");\n\n const recallMode = assertString(raw.recallMode, \"recallMode\");\n if (![\"no_recall\", \"minimal\", \"full\", \"graph_mode\"].includes(recallMode)) {\n throw new Error(\"recallMode must be one of no_recall|minimal|full|graph_mode\");\n }\n\n const source = assertString(raw.source, \"source\");\n if (![\"none\", \"hot_qmd\", \"hot_embedding\", \"cold_fallback\", \"recent_scan\"].includes(source)) {\n throw new Error(\"source must be one of none|hot_qmd|hot_embedding|cold_fallback|recent_scan\");\n }\n\n const promptLength = Number(raw.promptLength);\n const retrievalQueryLength = Number(raw.retrievalQueryLength);\n const recallResultLimit = Number(raw.recallResultLimit);\n const recalledMemoryCount = Number(raw.recalledMemoryCount);\n const contextChars = Number(raw.contextChars);\n const durationMs = Number(raw.durationMs);\n\n for (const [field, value] of [\n [\"promptLength\", promptLength],\n [\"retrievalQueryLength\", retrievalQueryLength],\n [\"recallResultLimit\", recallResultLimit],\n [\"recalledMemoryCount\", recalledMemoryCount],\n [\"contextChars\", contextChars],\n [\"durationMs\", durationMs],\n ] as const) {\n if (!Number.isFinite(value) || value < 0) {\n throw new Error(`${field} must be a non-negative number`);\n }\n }\n\n const memoryIds = optionalStringArray(raw.memoryIds, \"memoryIds\") ?? [];\n if (typeof raw.injected !== \"boolean\") throw new Error(\"injected must be a boolean\");\n\n let timings: Record<string, string> | undefined;\n if (raw.timings !== undefined) {\n if (!isRecord(raw.timings)) throw new Error(\"timings must be an object of strings\");\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(raw.timings)) {\n if (typeof value !== \"string\") throw new Error(\"timings must be an object of strings\");\n out[key] = value;\n }\n timings = out;\n }\n\n const identityInjectionModeRaw =\n typeof raw.identityInjectionMode === \"string\" && raw.identityInjectionMode.trim().length > 0\n ? raw.identityInjectionMode.trim()\n : undefined;\n if (\n identityInjectionModeRaw !== undefined &&\n ![\"recovery_only\", \"minimal\", \"full\", \"none\"].includes(identityInjectionModeRaw)\n ) {\n throw new Error(\"identityInjectionMode must be one of recovery_only|minimal|full|none\");\n }\n\n return {\n schemaVersion: 1,\n traceId: assertSafePathSegment(assertString(raw.traceId, \"traceId\"), \"traceId\"),\n recordedAt: assertIsoTimestamp(raw.recordedAt, \"recordedAt\"),\n sessionKey: assertString(raw.sessionKey, \"sessionKey\"),\n promptHash: assertString(raw.promptHash, \"promptHash\"),\n promptLength,\n retrievalQueryHash: assertString(raw.retrievalQueryHash, \"retrievalQueryHash\"),\n retrievalQueryLength,\n recallMode: recallMode as EvalShadowRecallRecord[\"recallMode\"],\n recallResultLimit,\n source: source as EvalShadowRecallRecord[\"source\"],\n recalledMemoryCount,\n injected: raw.injected,\n contextChars,\n memoryIds,\n policyVersion:\n typeof raw.policyVersion === \"string\" && raw.policyVersion.trim().length > 0\n ? raw.policyVersion.trim()\n : undefined,\n identityInjectionMode: identityInjectionModeRaw as EvalShadowRecallRecord[\"identityInjectionMode\"],\n identityInjectedChars:\n typeof raw.identityInjectedChars === \"number\" && Number.isFinite(raw.identityInjectedChars)\n ? raw.identityInjectedChars\n : undefined,\n identityInjectionTruncated:\n typeof raw.identityInjectionTruncated === \"boolean\" ? raw.identityInjectionTruncated : undefined,\n durationMs,\n timings,\n };\n}\n\ninterface EvalStoreSnapshot {\n status: EvalHarnessStatus;\n manifests: EvalBenchmarkManifest[];\n runs: EvalRunSummary[];\n shadows: EvalShadowRecallRecord[];\n baselines: EvalBaselineSnapshot[];\n}\n\ninterface EvalStoreSnapshotOptions {\n rootDir: string;\n enabled: boolean;\n shadowModeEnabled: boolean;\n baselineSnapshotsEnabled?: boolean;\n memoryRedTeamBenchEnabled?: boolean;\n}\n\nconst LOWER_IS_BETTER_METRICS = new Set<keyof EvalRunMetrics>([\"trustViolationRate\"]);\n\nfunction computePassRate(run: EvalRunSummary): number {\n return run.totalCases > 0 ? run.passedCases / run.totalCases : 0;\n}\n\nfunction latestCompletedRunsByBenchmark(runs: EvalRunSummary[]): Map<string, EvalRunSummary> {\n const sorted = [...runs]\n .filter((run) => run.status === \"completed\")\n .sort((a, b) => {\n const aTime = Date.parse(a.completedAt ?? a.startedAt);\n const bTime = Date.parse(b.completedAt ?? b.startedAt);\n return (Number.isNaN(bTime) ? 0 : bTime) - (Number.isNaN(aTime) ? 0 : aTime);\n });\n const out = new Map<string, EvalRunSummary>();\n for (const run of sorted) {\n if (!out.has(run.benchmarkId)) {\n out.set(run.benchmarkId, run);\n }\n }\n return out;\n}\n\nfunction compareMetricDeltas(\n baseMetrics: EvalRunMetrics | undefined,\n candidateMetrics: EvalRunMetrics | undefined,\n): {\n deltas: Partial<Record<keyof EvalRunMetrics, number>>;\n regressions: string[];\n improvements: string[];\n} {\n const deltas: Partial<Record<keyof EvalRunMetrics, number>> = {};\n const regressions: string[] = [];\n const improvements: string[] = [];\n if (!baseMetrics || !candidateMetrics) {\n return { deltas, regressions, improvements };\n }\n\n for (const metric of Object.keys(baseMetrics) as Array<keyof EvalRunMetrics>) {\n const baseValue = baseMetrics[metric];\n const candidateValue = candidateMetrics[metric];\n if (typeof baseValue !== \"number\" || typeof candidateValue !== \"number\") continue;\n const delta = candidateValue - baseValue;\n deltas[metric] = delta;\n if (delta === 0) continue;\n const lowerIsBetter = LOWER_IS_BETTER_METRICS.has(metric);\n const improved = lowerIsBetter ? delta < 0 : delta > 0;\n const summary = `${metric} ${baseValue} -> ${candidateValue}`;\n if (improved) {\n improvements.push(summary);\n } else {\n regressions.push(summary);\n }\n }\n\n return { deltas, regressions, improvements };\n}\n\nfunction formatEvalBaselineDeltaMarkdown(report: EvalBaselineDeltaReport): string {\n const lines = [\n \"# Eval Baseline Delta Report\",\n \"\",\n `- Passed: ${report.passed ? \"yes\" : \"no\"}`,\n `- Baseline snapshot: ${report.baselineSnapshotId}`,\n `- Baseline created: ${report.baselineCreatedAt}`,\n `- Baseline source root: ${report.baselineSourceRootDir}`,\n `- Candidate root: ${report.candidateRootDir}`,\n `- Benchmarks compared: ${report.comparedBenchmarks}`,\n ];\n\n if (report.missingCandidateBenchmarks.length > 0) {\n lines.push(`- Missing candidate benchmarks: ${report.missingCandidateBenchmarks.join(\", \")}`);\n }\n\n lines.push(\n `- Invalid candidate artifacts: benchmarks=${report.invalidArtifacts.candidate.benchmarks}, runs=${report.invalidArtifacts.candidate.runs}, shadows=${report.invalidArtifacts.candidate.shadows}, baselines=${report.invalidArtifacts.candidate.baselines}`,\n \"\",\n \"## Regressions\",\n );\n if (report.regressions.length === 0) {\n lines.push(\"- none\");\n } else {\n for (const regression of report.regressions) lines.push(`- ${regression}`);\n }\n\n lines.push(\"\", \"## Improvements\");\n if (report.improvements.length === 0) {\n lines.push(\"- none\");\n } else {\n for (const improvement of report.improvements) lines.push(`- ${improvement}`);\n }\n\n lines.push(\"\", \"## Benchmark Deltas\");\n if (report.deltas.length === 0) {\n lines.push(\"- none\");\n } else {\n for (const delta of report.deltas) {\n lines.push(\n `- ${delta.benchmarkId}: passRate ${delta.basePassRate} -> ${delta.candidatePassRate} (delta ${delta.passRateDelta})`,\n );\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nasync function collectEvalStoreSnapshot(options: EvalStoreSnapshotOptions): Promise<EvalStoreSnapshot> {\n const rootDir = options.rootDir;\n const benchmarkDir = path.join(rootDir, \"benchmarks\");\n const runsDir = path.join(rootDir, \"runs\");\n const shadowDir = path.join(rootDir, \"shadow\");\n const baselineDir = path.join(rootDir, \"baselines\");\n const benchmarkFiles = await listNamedFiles(benchmarkDir, \"manifest.json\");\n const runFiles = await listJsonFiles(runsDir);\n const shadowFiles = await listJsonFiles(shadowDir);\n const baselineFiles = await listJsonFiles(baselineDir);\n\n const invalidBenchmarks: Array<{ path: string; error: string }> = [];\n const invalidRuns: Array<{ path: string; error: string }> = [];\n const invalidShadows: Array<{ path: string; error: string }> = [];\n const invalidBaselines: Array<{ path: string; error: string }> = [];\n const manifests: EvalBenchmarkManifest[] = [];\n\n for (const filePath of benchmarkFiles) {\n try {\n manifests.push(\n validateEvalBenchmarkManifest(await readJsonFile(filePath), {\n memoryRedTeamBenchEnabled: options.memoryRedTeamBenchEnabled,\n }),\n );\n } catch (error) {\n invalidBenchmarks.push({\n path: filePath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n const runs: EvalRunSummary[] = [];\n for (const filePath of runFiles) {\n try {\n runs.push(validateEvalRunSummary(await readJsonFile(filePath)));\n } catch (error) {\n invalidRuns.push({\n path: filePath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n const shadows: EvalShadowRecallRecord[] = [];\n for (const filePath of shadowFiles) {\n try {\n shadows.push(validateEvalShadowRecallRecord(await readJsonFile(filePath)));\n } catch (error) {\n invalidShadows.push({\n path: filePath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n const baselines: EvalBaselineSnapshot[] = [];\n for (const filePath of baselineFiles) {\n try {\n baselines.push(validateEvalBaselineSnapshot(await readJsonFile(filePath)));\n } catch (error) {\n invalidBaselines.push({\n path: filePath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n runs.sort((a, b) => {\n const aTime = Date.parse(a.completedAt ?? a.startedAt);\n const bTime = Date.parse(b.completedAt ?? b.startedAt);\n return (Number.isNaN(bTime) ? 0 : bTime) - (Number.isNaN(aTime) ? 0 : aTime);\n });\n shadows.sort((a, b) => b.recordedAt.localeCompare(a.recordedAt));\n baselines.sort((a, b) => b.createdAt.localeCompare(a.createdAt));\n\n const tags = new Set<string>();\n const attackClasses = new Set<string>();\n const sourceLinks = new Set<string>();\n const targetSurfaces = new Set<string>();\n let totalCases = 0;\n let redTeam = 0;\n for (const manifest of manifests) {\n totalCases += manifest.cases.length;\n if (manifest.benchmarkType === \"memory-red-team\") {\n redTeam += 1;\n if (manifest.attackClass) attackClasses.add(manifest.attackClass);\n if (manifest.targetSurface) targetSurfaces.add(manifest.targetSurface);\n }\n for (const tag of manifest.tags ?? []) tags.add(tag);\n for (const link of manifest.sourceLinks ?? []) sourceLinks.add(link);\n }\n\n return {\n status: {\n enabled: options.enabled,\n shadowModeEnabled: options.shadowModeEnabled,\n rootDir,\n benchmarkDir,\n runsDir,\n benchmarks: {\n total: benchmarkFiles.length,\n valid: manifests.length,\n invalid: invalidBenchmarks.length,\n redTeam,\n totalCases,\n attackClasses: [...attackClasses].sort(),\n tags: [...tags].sort(),\n targetSurfaces: [...targetSurfaces].sort(),\n sourceLinks: [...sourceLinks].sort(),\n },\n runs: {\n total: runFiles.length,\n invalid: invalidRuns.length,\n completed: runs.filter((run) => run.status === \"completed\").length,\n failed: runs.filter((run) => run.status === \"failed\").length,\n partial: runs.filter((run) => run.status === \"partial\").length,\n running: runs.filter((run) => run.status === \"running\").length,\n latestRunId: runs[0]?.runId,\n latestBenchmarkId: runs[0]?.benchmarkId,\n latestCompletedAt: runs[0]?.completedAt,\n },\n shadows: {\n total: shadowFiles.length,\n invalid: invalidShadows.length,\n latestTraceId: shadows[0]?.traceId,\n latestRecordedAt: shadows[0]?.recordedAt,\n latestSessionKey: shadows[0]?.sessionKey,\n },\n baselines: {\n enabled: options.baselineSnapshotsEnabled === true,\n total: baselineFiles.length,\n invalid: invalidBaselines.length,\n latestSnapshotId: baselines[0]?.snapshotId,\n latestCreatedAt: baselines[0]?.createdAt,\n latestBenchmarkCount: baselines[0]?.benchmarkCount,\n },\n latestRun: runs[0],\n latestShadow: shadows[0],\n latestBaseline: baselines[0],\n invalidBenchmarks,\n invalidRuns,\n invalidShadows,\n invalidBaselines,\n },\n manifests,\n runs,\n shadows,\n baselines,\n };\n}\n\nasync function resolveBenchmarkManifestPath(sourcePath: string): Promise<{ sourceKind: \"file\" | \"directory\"; manifestPath: string }> {\n const info = await stat(sourcePath);\n if (info.isDirectory()) {\n return {\n sourceKind: \"directory\",\n manifestPath: path.join(sourcePath, \"manifest.json\"),\n };\n }\n if (info.isFile()) {\n return {\n sourceKind: \"file\",\n manifestPath: sourcePath,\n };\n }\n throw new Error(\"benchmark pack source must be a file or directory\");\n}\n\nexport async function validateEvalBenchmarkPack(\n sourcePath: string,\n options?: { memoryRedTeamBenchEnabled?: boolean },\n): Promise<EvalBenchmarkPackSummary> {\n const trimmedSourcePath = sourcePath.trim();\n if (trimmedSourcePath.length === 0) {\n throw new Error(\"benchmark pack path must be a non-empty string\");\n }\n const { manifestPath } = await resolveBenchmarkManifestPath(trimmedSourcePath);\n const manifest = validateEvalBenchmarkManifest(await readJsonFile(manifestPath), {\n memoryRedTeamBenchEnabled: options?.memoryRedTeamBenchEnabled,\n });\n return {\n sourcePath: trimmedSourcePath,\n manifestPath,\n benchmarkId: assertSafeBenchmarkId(manifest.benchmarkId),\n benchmarkType: manifest.benchmarkType ?? \"standard\",\n title: manifest.title,\n attackClass: manifest.attackClass,\n targetSurface: manifest.targetSurface,\n totalCases: manifest.cases.length,\n tags: [...(manifest.tags ?? [])],\n sourceLinks: [...(manifest.sourceLinks ?? [])],\n };\n}\n\nexport async function importEvalBenchmarkPack(options: {\n sourcePath: string;\n memoryDir: string;\n evalStoreDir?: string;\n force?: boolean;\n memoryRedTeamBenchEnabled?: boolean;\n}): Promise<EvalBenchmarkPackSummary & { targetDir: string; overwritten: boolean }> {\n const summary = await validateEvalBenchmarkPack(options.sourcePath, {\n memoryRedTeamBenchEnabled: options.memoryRedTeamBenchEnabled,\n });\n const rootDir = resolveEvalStoreDir(options.memoryDir, options.evalStoreDir);\n const benchmarkDir = path.join(rootDir, \"benchmarks\");\n const targetDir = path.join(benchmarkDir, summary.benchmarkId);\n const { sourceKind, manifestPath } = await resolveBenchmarkManifestPath(summary.sourcePath);\n\n let overwritten = false;\n try {\n await stat(targetDir);\n if (options.force !== true) {\n throw new Error(`benchmark pack already exists at ${targetDir}; rerun with force to replace it`);\n }\n overwritten = true;\n await rm(targetDir, { recursive: true, force: true });\n } catch (error) {\n if (!(error instanceof Error) || !(\"code\" in error) || (error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n\n await mkdir(benchmarkDir, { recursive: true });\n if (sourceKind === \"directory\") {\n await cp(summary.sourcePath, targetDir, { recursive: true });\n } else {\n await mkdir(targetDir, { recursive: true });\n await cp(manifestPath, path.join(targetDir, \"manifest.json\"));\n }\n\n return {\n ...summary,\n targetDir,\n overwritten,\n };\n}\n\nexport async function recordEvalShadowRecall(options: {\n memoryDir: string;\n evalStoreDir?: string;\n record: EvalShadowRecallRecord;\n}): Promise<string> {\n const rootDir = resolveEvalStoreDir(options.memoryDir, options.evalStoreDir);\n const validated = validateEvalShadowRecallRecord(options.record);\n const day = validated.recordedAt.slice(0, 10);\n const shadowRoot = path.join(rootDir, \"shadow\");\n const shadowDir = path.join(shadowRoot, day);\n const targetPath = path.join(shadowDir, `${validated.traceId}.json`);\n assertPathWithin(shadowRoot, targetPath, \"shadow recall record path\");\n await mkdir(shadowDir, { recursive: true });\n await writeFile(targetPath, JSON.stringify(validated, null, 2), \"utf-8\");\n return targetPath;\n}\n\nexport async function getEvalHarnessStatus(options: {\n memoryDir: string;\n evalStoreDir?: string;\n enabled: boolean;\n shadowModeEnabled: boolean;\n baselineSnapshotsEnabled?: boolean;\n memoryRedTeamBenchEnabled?: boolean;\n}): Promise<EvalHarnessStatus> {\n return (\n await collectEvalStoreSnapshot({\n rootDir: resolveEvalStoreDir(options.memoryDir, options.evalStoreDir),\n enabled: options.enabled,\n shadowModeEnabled: options.shadowModeEnabled,\n baselineSnapshotsEnabled: options.baselineSnapshotsEnabled,\n memoryRedTeamBenchEnabled: options.memoryRedTeamBenchEnabled,\n })\n ).status;\n}\n\nexport async function createEvalBaselineSnapshot(options: {\n memoryDir: string;\n evalStoreDir?: string;\n baselineSnapshotsEnabled: boolean;\n snapshotId: string;\n createdAt?: string;\n notes?: string;\n gitRef?: string;\n}): Promise<{ targetPath: string; snapshot: EvalBaselineSnapshot }> {\n if (options.baselineSnapshotsEnabled !== true) {\n throw new Error(\"benchmark baseline snapshots are disabled\");\n }\n\n const snapshotId = assertSafePathSegment(assertString(options.snapshotId, \"snapshotId\"), \"snapshotId\");\n const rootDir = resolveEvalStoreDir(options.memoryDir, options.evalStoreDir);\n const store = await collectEvalStoreSnapshot({\n rootDir,\n enabled: true,\n shadowModeEnabled: true,\n baselineSnapshotsEnabled: true,\n memoryRedTeamBenchEnabled: true,\n });\n const latestRuns = latestCompletedRunsByBenchmark(store.runs);\n const benchmarks = [...latestRuns.values()]\n .sort((a, b) => a.benchmarkId.localeCompare(b.benchmarkId))\n .map((run) => ({\n benchmarkId: run.benchmarkId,\n runId: run.runId,\n completedAt: run.completedAt,\n gitRef: run.gitRef,\n passRate: computePassRate(run),\n metrics: run.metrics,\n } satisfies EvalBaselineSnapshotBenchmark));\n\n const snapshot = validateEvalBaselineSnapshot({\n schemaVersion: 1,\n snapshotId,\n createdAt: options.createdAt ?? new Date().toISOString(),\n sourceRootDir: rootDir,\n benchmarkCount: benchmarks.length,\n benchmarks,\n notes: options.notes,\n gitRef: options.gitRef,\n });\n\n const targetPath = path.join(rootDir, \"baselines\", `${snapshot.snapshotId}.json`);\n await mkdir(path.dirname(targetPath), { recursive: true });\n await writeFile(targetPath, JSON.stringify(snapshot, null, 2), \"utf-8\");\n return { targetPath, snapshot };\n}\n\nexport async function runEvalBaselineDeltaReport(options: {\n memoryDir: string;\n evalStoreDir?: string;\n benchmarkDeltaReporterEnabled: boolean;\n snapshotId: string;\n}): Promise<EvalBaselineDeltaReport> {\n if (options.benchmarkDeltaReporterEnabled !== true) {\n throw new Error(\"benchmark delta reporter is disabled\");\n }\n\n const snapshotId = assertSafePathSegment(assertString(options.snapshotId, \"snapshotId\"), \"snapshotId\");\n const candidateRootDir = resolveEvalStoreDir(options.memoryDir, options.evalStoreDir);\n const candidateSnapshot = await collectEvalStoreSnapshot({\n rootDir: candidateRootDir,\n enabled: true,\n shadowModeEnabled: true,\n baselineSnapshotsEnabled: true,\n memoryRedTeamBenchEnabled: true,\n });\n const baselineSnapshot = candidateSnapshot.baselines.find((snapshot) => snapshot.snapshotId === snapshotId);\n if (!baselineSnapshot) {\n throw new Error(`benchmark baseline snapshot not found: ${snapshotId}`);\n }\n\n return buildEvalBaselineDeltaReport({\n baselineSnapshot,\n candidateSnapshot,\n });\n}\n\nexport async function runEvalStoredBaselineCiGate(options: {\n baseMemoryDir?: string;\n baseEvalStoreDir: string;\n candidateMemoryDir?: string;\n candidateEvalStoreDir: string;\n snapshotId: string;\n}): Promise<EvalStoredBaselineCiGateReport> {\n const snapshotId = assertSafePathSegment(assertString(options.snapshotId, \"snapshotId\"), \"snapshotId\");\n const baseRootDir = resolveEvalStoreDir(options.baseMemoryDir ?? options.baseEvalStoreDir, options.baseEvalStoreDir);\n const candidateRootDir = resolveEvalStoreDir(\n options.candidateMemoryDir ?? options.candidateEvalStoreDir,\n options.candidateEvalStoreDir,\n );\n const [baseSnapshot, candidateSnapshot] = await Promise.all([\n collectEvalStoreSnapshot({\n rootDir: baseRootDir,\n enabled: true,\n shadowModeEnabled: true,\n baselineSnapshotsEnabled: true,\n memoryRedTeamBenchEnabled: true,\n }),\n collectEvalStoreSnapshot({\n rootDir: candidateRootDir,\n enabled: true,\n shadowModeEnabled: true,\n baselineSnapshotsEnabled: true,\n memoryRedTeamBenchEnabled: true,\n }),\n ]);\n const baselineSnapshot =\n baseSnapshot.baselines.find((snapshot) => snapshot.snapshotId === snapshotId) ??\n candidateSnapshot.baselines.find((snapshot) => snapshot.snapshotId === snapshotId);\n if (!baselineSnapshot) {\n throw new Error(`benchmark baseline snapshot not found: ${snapshotId}`);\n }\n\n return {\n baseRootDir,\n baselineResolvedFrom: baseSnapshot.baselines.some((snapshot) => snapshot.snapshotId === snapshotId) ? \"base\" : \"candidate\",\n ...buildEvalBaselineDeltaReport({\n baselineSnapshot,\n candidateSnapshot,\n }),\n };\n}\n\nfunction buildEvalBaselineDeltaReport(options: {\n baselineSnapshot: EvalBaselineSnapshot;\n candidateSnapshot: EvalStoreSnapshot;\n}): EvalBaselineDeltaReport {\n const { baselineSnapshot, candidateSnapshot } = options;\n\n const regressions: string[] = [];\n const improvements: string[] = [];\n\n if (candidateSnapshot.status.invalidBenchmarks.length > 0) {\n regressions.push(`candidate store has ${candidateSnapshot.status.invalidBenchmarks.length} invalid benchmark manifest(s)`);\n }\n if (candidateSnapshot.status.invalidRuns.length > 0) {\n regressions.push(`candidate store has ${candidateSnapshot.status.invalidRuns.length} invalid run summary file(s)`);\n }\n if (candidateSnapshot.status.invalidShadows.length > 0) {\n regressions.push(`candidate store has ${candidateSnapshot.status.invalidShadows.length} invalid shadow record(s)`);\n }\n if (candidateSnapshot.status.invalidBaselines.length > 0) {\n regressions.push(`candidate store has ${candidateSnapshot.status.invalidBaselines.length} invalid baseline snapshot file(s)`);\n }\n\n const candidateRuns = latestCompletedRunsByBenchmark(candidateSnapshot.runs);\n const baselineBenchmarks = new Map(\n baselineSnapshot.benchmarks.map((benchmark) => [benchmark.benchmarkId, benchmark] as const),\n );\n const missingCandidateBenchmarks = [...baselineBenchmarks.keys()]\n .filter((benchmarkId) => !candidateRuns.has(benchmarkId))\n .sort();\n for (const benchmarkId of missingCandidateBenchmarks) {\n regressions.push(`candidate is missing latest completed benchmark run for ${benchmarkId}`);\n }\n\n const deltas: EvalBenchmarkDelta[] = [];\n for (const benchmarkId of [...baselineBenchmarks.keys()].sort()) {\n const baseBenchmark = baselineBenchmarks.get(benchmarkId);\n const candidateRun = candidateRuns.get(benchmarkId);\n if (!baseBenchmark || !candidateRun) continue;\n\n const passRateDelta = computePassRate(candidateRun) - baseBenchmark.passRate;\n const delta: EvalBenchmarkDelta = {\n benchmarkId,\n baseRunId: baseBenchmark.runId,\n candidateRunId: candidateRun.runId,\n basePassRate: baseBenchmark.passRate,\n candidatePassRate: computePassRate(candidateRun),\n passRateDelta,\n metricDeltas: {},\n regressions: [],\n improvements: [],\n };\n\n if (passRateDelta < 0) {\n delta.regressions.push(`passRate ${baseBenchmark.passRate} -> ${delta.candidatePassRate}`);\n regressions.push(`${benchmarkId} pass rate regressed (${baseBenchmark.passRate} -> ${delta.candidatePassRate})`);\n } else if (passRateDelta > 0) {\n delta.improvements.push(`passRate ${baseBenchmark.passRate} -> ${delta.candidatePassRate}`);\n improvements.push(`${benchmarkId} pass rate improved (${baseBenchmark.passRate} -> ${delta.candidatePassRate})`);\n }\n\n const metricDelta = compareMetricDeltas(baseBenchmark.metrics, candidateRun.metrics);\n delta.metricDeltas = metricDelta.deltas;\n for (const regression of metricDelta.regressions) {\n delta.regressions.push(regression);\n regressions.push(`${benchmarkId} ${regression}`);\n }\n for (const improvement of metricDelta.improvements) {\n delta.improvements.push(improvement);\n improvements.push(`${benchmarkId} ${improvement}`);\n }\n deltas.push(delta);\n }\n\n const report: EvalBaselineDeltaReport = {\n passed: regressions.length === 0,\n baselineSnapshotId: baselineSnapshot.snapshotId,\n baselineCreatedAt: baselineSnapshot.createdAt,\n baselineSourceRootDir: baselineSnapshot.sourceRootDir,\n candidateRootDir: candidateSnapshot.status.rootDir,\n comparedBenchmarks: deltas.length,\n missingCandidateBenchmarks,\n invalidArtifacts: {\n candidate: {\n benchmarks: candidateSnapshot.status.invalidBenchmarks.length,\n runs: candidateSnapshot.status.invalidRuns.length,\n shadows: candidateSnapshot.status.invalidShadows.length,\n baselines: candidateSnapshot.status.invalidBaselines.length,\n },\n },\n regressions,\n improvements,\n deltas,\n markdownReport: \"\",\n };\n report.markdownReport = formatEvalBaselineDeltaMarkdown(report);\n return report;\n}\n\nfunction resolveRequiredEvalStoreRoot(options: { memoryDir?: string; evalStoreDir?: string }, label: string): string {\n if (typeof options.evalStoreDir === \"string\" && options.evalStoreDir.trim().length > 0) {\n return options.evalStoreDir.trim();\n }\n if (typeof options.memoryDir === \"string\" && options.memoryDir.trim().length > 0) {\n return resolveEvalStoreDir(options.memoryDir.trim());\n }\n throw new Error(`${label} requires memoryDir or evalStoreDir`);\n}\n\nexport async function runEvalBenchmarkCiGate(options: {\n baseMemoryDir?: string;\n candidateMemoryDir?: string;\n baseEvalStoreDir?: string;\n candidateEvalStoreDir?: string;\n}): Promise<EvalCiGateReport> {\n const baseRootDir = resolveRequiredEvalStoreRoot(\n { memoryDir: options.baseMemoryDir, evalStoreDir: options.baseEvalStoreDir },\n \"base\",\n );\n const candidateRootDir = resolveRequiredEvalStoreRoot(\n { memoryDir: options.candidateMemoryDir, evalStoreDir: options.candidateEvalStoreDir },\n \"candidate\",\n );\n const baseSnapshot = await collectEvalStoreSnapshot({\n rootDir: baseRootDir,\n enabled: true,\n shadowModeEnabled: true,\n memoryRedTeamBenchEnabled: true,\n });\n const candidateSnapshot = await collectEvalStoreSnapshot({\n rootDir: candidateRootDir,\n enabled: true,\n shadowModeEnabled: true,\n memoryRedTeamBenchEnabled: true,\n });\n\n const regressions: string[] = [];\n const improvements: string[] = [];\n\n if (baseSnapshot.status.invalidBenchmarks.length > 0) {\n regressions.push(`base store has ${baseSnapshot.status.invalidBenchmarks.length} invalid benchmark manifest(s)`);\n }\n if (baseSnapshot.status.invalidRuns.length > 0) {\n regressions.push(`base store has ${baseSnapshot.status.invalidRuns.length} invalid run summary file(s)`);\n }\n if (baseSnapshot.status.invalidShadows.length > 0) {\n regressions.push(`base store has ${baseSnapshot.status.invalidShadows.length} invalid shadow record(s)`);\n }\n if (candidateSnapshot.status.invalidBenchmarks.length > 0) {\n regressions.push(`candidate store has ${candidateSnapshot.status.invalidBenchmarks.length} invalid benchmark manifest(s)`);\n }\n if (candidateSnapshot.status.invalidRuns.length > 0) {\n regressions.push(`candidate store has ${candidateSnapshot.status.invalidRuns.length} invalid run summary file(s)`);\n }\n if (candidateSnapshot.status.invalidShadows.length > 0) {\n regressions.push(`candidate store has ${candidateSnapshot.status.invalidShadows.length} invalid shadow record(s)`);\n }\n\n const baseRuns = latestCompletedRunsByBenchmark(baseSnapshot.runs);\n const candidateRuns = latestCompletedRunsByBenchmark(candidateSnapshot.runs);\n const missingCandidateBenchmarks = [...baseRuns.keys()]\n .filter((benchmarkId) => !candidateRuns.has(benchmarkId))\n .sort();\n for (const benchmarkId of missingCandidateBenchmarks) {\n regressions.push(`candidate is missing latest completed benchmark run for ${benchmarkId}`);\n }\n\n const deltas: EvalBenchmarkDelta[] = [];\n for (const benchmarkId of [...baseRuns.keys()].sort()) {\n const baseRun = baseRuns.get(benchmarkId);\n const candidateRun = candidateRuns.get(benchmarkId);\n if (!baseRun || !candidateRun) continue;\n\n const basePassRate = computePassRate(baseRun);\n const candidatePassRate = computePassRate(candidateRun);\n const passRateDelta = candidatePassRate - basePassRate;\n const delta: EvalBenchmarkDelta = {\n benchmarkId,\n baseRunId: baseRun.runId,\n candidateRunId: candidateRun.runId,\n basePassRate,\n candidatePassRate,\n passRateDelta,\n metricDeltas: {},\n regressions: [],\n improvements: [],\n };\n\n if (passRateDelta < 0) {\n delta.regressions.push(`passRate ${basePassRate} -> ${candidatePassRate}`);\n regressions.push(`${benchmarkId} pass rate regressed (${basePassRate} -> ${candidatePassRate})`);\n } else if (passRateDelta > 0) {\n delta.improvements.push(`passRate ${basePassRate} -> ${candidatePassRate}`);\n improvements.push(`${benchmarkId} pass rate improved (${basePassRate} -> ${candidatePassRate})`);\n }\n\n const metricDelta = compareMetricDeltas(baseRun.metrics, candidateRun.metrics);\n delta.metricDeltas = metricDelta.deltas;\n for (const regression of metricDelta.regressions) {\n delta.regressions.push(regression);\n regressions.push(`${benchmarkId} ${regression}`);\n }\n for (const improvement of metricDelta.improvements) {\n delta.improvements.push(improvement);\n improvements.push(`${benchmarkId} ${improvement}`);\n }\n deltas.push(delta);\n }\n\n return {\n passed: regressions.length === 0,\n baseRootDir: baseSnapshot.status.rootDir,\n candidateRootDir: candidateSnapshot.status.rootDir,\n comparedBenchmarks: deltas.length,\n missingCandidateBenchmarks,\n invalidArtifacts: {\n base: {\n benchmarks: baseSnapshot.status.invalidBenchmarks.length,\n runs: baseSnapshot.status.invalidRuns.length,\n shadows: baseSnapshot.status.invalidShadows.length,\n },\n candidate: {\n benchmarks: candidateSnapshot.status.invalidBenchmarks.length,\n runs: candidateSnapshot.status.invalidRuns.length,\n shadows: candidateSnapshot.status.invalidShadows.length,\n },\n },\n regressions,\n improvements,\n deltas,\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
sha256Bytes,
|
|
3
3
|
sha256String
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-GCGJW34D.js";
|
|
5
5
|
|
|
6
6
|
// src/transfer/conflict-policy.ts
|
|
7
7
|
var CONFLICT_POLICIES = ["skip", "overwrite", "dedupe"];
|
|
@@ -66,4 +66,4 @@ export {
|
|
|
66
66
|
validateManifestRecords,
|
|
67
67
|
validateExportBundleRecords
|
|
68
68
|
};
|
|
69
|
-
//# sourceMappingURL=chunk-
|
|
69
|
+
//# sourceMappingURL=chunk-G4IAEX6D.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
resolveHomeDir
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-JUC24CTX.js";
|
|
4
4
|
|
|
5
5
|
// src/tokens.ts
|
|
6
6
|
import fs from "fs";
|
|
@@ -153,6 +153,7 @@ function saveTokenStore(store, tokensPath) {
|
|
|
153
153
|
} catch {
|
|
154
154
|
}
|
|
155
155
|
fsyncDirectoryBestEffort(dir);
|
|
156
|
+
invalidateTokenCache();
|
|
156
157
|
} catch (error) {
|
|
157
158
|
if (fd !== null) {
|
|
158
159
|
try {
|
|
@@ -210,6 +211,11 @@ var TOKEN_CACHE_TTL_MS = 5e3;
|
|
|
210
211
|
var _cachedTokens = [];
|
|
211
212
|
var _cachedAt = 0;
|
|
212
213
|
var _cachedPath;
|
|
214
|
+
function invalidateTokenCache() {
|
|
215
|
+
_cachedTokens = [];
|
|
216
|
+
_cachedAt = 0;
|
|
217
|
+
_cachedPath = void 0;
|
|
218
|
+
}
|
|
213
219
|
function getAllValidTokensCached(tokensPath) {
|
|
214
220
|
const now = Date.now();
|
|
215
221
|
if (now - _cachedAt < TOKEN_CACHE_TTL_MS && tokensPath === _cachedPath) return _cachedTokens;
|
|
@@ -234,4 +240,4 @@ export {
|
|
|
234
240
|
getAllValidTokensCached,
|
|
235
241
|
resolveConnectorFromToken
|
|
236
242
|
};
|
|
237
|
-
//# sourceMappingURL=chunk-
|
|
243
|
+
//# sourceMappingURL=chunk-G56P5RLD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tokens.ts"],"sourcesContent":["/**\n * Token management for Remnic multi-connector auth.\n *\n * Manages per-connector tokens in ~/.remnic/tokens.json.\n * Each connector gets a unique token with a recognizable prefix.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { randomBytes, randomUUID } from \"node:crypto\";\nimport { resolveHomeDir } from \"./runtime/env.js\";\n\nexport interface TokenEntry {\n token: string;\n connector: string;\n createdAt: string;\n}\n\nexport interface TokenStore {\n tokens: TokenEntry[];\n}\n\nconst TOKEN_PREFIXES: Record<string, string> = {\n \"openclaw\": \"remnic_oc_\",\n \"claude-code\": \"remnic_cc_\",\n \"codex-cli\": \"remnic_cx_\",\n \"codex\": \"remnic_cx_\",\n \"hermes\": \"remnic_hm_\",\n \"pi\": \"remnic_pi_\",\n \"replit\": \"remnic_rl_\",\n \"cursor\": \"remnic_cu_\",\n \"cline\": \"remnic_cl_\",\n \"github-copilot\": \"remnic_gh_\",\n \"roo-code\": \"remnic_rc_\",\n \"windsurf\": \"remnic_ws_\",\n \"amp\": \"remnic_am_\",\n \"generic-mcp\": \"remnic_gm_\",\n};\n\nfunction defaultTokensPath(): string {\n return path.join(resolveHomeDir(), \".remnic\", \"tokens.json\");\n}\n\nfunction legacyTokensPath(): string {\n return path.join(resolveHomeDir(), \".engram\", \"tokens.json\");\n}\n\nfunction resolveReadPath(tokensPath?: string): string {\n const primary = tokensPath ?? defaultTokensPath();\n if (tokensPath) return primary;\n if (fs.existsSync(primary)) return primary;\n const legacy = legacyTokensPath();\n return fs.existsSync(legacy) ? legacy : primary;\n}\n\nfunction ensureDir(filePath: string): void {\n const dir = path.dirname(filePath);\n fs.mkdirSync(dir, { recursive: true });\n}\n\nfunction isEnoent(error: unknown): boolean {\n return error instanceof Error && \"code\" in error && (error as NodeJS.ErrnoException).code === \"ENOENT\";\n}\n\nfunction validateTokenEntry(raw: unknown, index: number): TokenEntry {\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n throw new Error(`invalid token entry at index ${index}: expected object`);\n }\n const entry = raw as Record<string, unknown>;\n if (typeof entry.token !== \"string\" || entry.token.length === 0) {\n throw new Error(`invalid token entry at index ${index}: token must be a non-empty string`);\n }\n if (typeof entry.connector !== \"string\" || entry.connector.length === 0) {\n throw new Error(`invalid token entry at index ${index}: connector must be a non-empty string`);\n }\n return {\n token: entry.token,\n connector: entry.connector,\n createdAt:\n typeof entry.createdAt === \"string\" && entry.createdAt.length > 0\n ? entry.createdAt\n : new Date(0).toISOString(),\n };\n}\n\nfunction parseTokenStore(rawText: string, filePath: string): { store: TokenStore; migratedLegacy: boolean } {\n let raw: unknown;\n try {\n raw = JSON.parse(rawText);\n } catch (error) {\n throw new Error(\n `failed to parse token store at ${filePath}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n if (typeof raw === \"object\" && raw !== null && !Array.isArray(raw)) {\n const record = raw as Record<string, unknown>;\n if (record.tokens !== undefined) {\n if (!Array.isArray(record.tokens)) {\n throw new Error(`invalid token store at ${filePath}: tokens must be an array`);\n }\n return {\n store: {\n tokens: record.tokens.map((entry, index) => validateTokenEntry(entry, index)),\n },\n migratedLegacy: false,\n };\n }\n\n // Migrate legacy flat-map format: { \"connector\": \"token_value\", ... }\n const migrated: TokenEntry[] = [];\n for (const [key, value] of Object.entries(record)) {\n if (typeof value === \"string\" && value.length > 0) {\n migrated.push(\n validateTokenEntry(\n { token: value, connector: key, createdAt: new Date().toISOString() },\n migrated.length,\n ),\n );\n }\n }\n if (migrated.length > 0) {\n return { store: { tokens: migrated }, migratedLegacy: true };\n }\n }\n\n throw new Error(`invalid token store at ${filePath}: expected token array or legacy connector map`);\n}\n\nexport function loadTokenStore(tokensPath?: string): TokenStore {\n const p = resolveReadPath(tokensPath);\n try {\n const rawText = fs.readFileSync(p, \"utf8\");\n const { store, migratedLegacy } = parseTokenStore(rawText, p);\n if (migratedLegacy) {\n // Auto-migrate legacy flat-map stores in new format. This is best-effort:\n // a migration write failure must not hide the successfully parsed tokens.\n try {\n saveTokenStore(store, tokensPath);\n } catch {\n // Migration write failed (e.g., read-only fs) — still return parsed tokens.\n }\n }\n return store;\n } catch (error) {\n if (isEnoent(error)) {\n return { tokens: [] };\n }\n throw error;\n }\n}\n\nfunction fsyncDirectoryBestEffort(dirPath: string): void {\n let dirFd: number | null = null;\n try {\n dirFd = fs.openSync(dirPath, \"r\");\n fs.fsyncSync(dirFd);\n } catch {\n // Directory fsync is not supported on every platform/filesystem.\n } finally {\n if (dirFd !== null) {\n try { fs.closeSync(dirFd); } catch { /* ignore */ }\n }\n }\n}\n\nexport function saveTokenStore(store: TokenStore, tokensPath?: string): void {\n const p = tokensPath ?? defaultTokensPath();\n ensureDir(p);\n const validated: TokenStore = {\n tokens: store.tokens.map((entry, index) => validateTokenEntry(entry, index)),\n };\n const dir = path.dirname(p);\n const tmpPath = path.join(dir, `.${path.basename(p)}.${process.pid}.${randomUUID()}.tmp`);\n let fd: number | null = null;\n try {\n fd = fs.openSync(tmpPath, \"w\", 0o600);\n fs.writeFileSync(fd, JSON.stringify(validated, null, 2) + \"\\n\", \"utf8\");\n fs.fsyncSync(fd);\n fs.closeSync(fd);\n fd = null;\n fs.renameSync(tmpPath, p);\n // Tighten permissions on pre-existing files after atomic replacement.\n try { fs.chmodSync(p, 0o600); } catch { /* ignore on platforms without chmod */ }\n fsyncDirectoryBestEffort(dir);\n invalidateTokenCache();\n } catch (error) {\n if (fd !== null) {\n try { fs.closeSync(fd); } catch { /* ignore */ }\n }\n try { fs.rmSync(tmpPath, { force: true }); } catch { /* ignore cleanup failure */ }\n throw error;\n }\n}\n\n/**\n * Build a TokenEntry candidate WITHOUT saving it to the store.\n * Callers use this when they need to defer the save until after a\n * dependent write (e.g. Hermes config.yaml) succeeds — see\n * commitTokenEntry() to persist the candidate.\n */\nexport function buildTokenEntry(connector: string): TokenEntry {\n const prefix = TOKEN_PREFIXES[connector] ?? \"remnic_xx_\";\n const token = prefix + randomBytes(24).toString(\"hex\");\n return {\n token,\n connector,\n createdAt: new Date().toISOString(),\n };\n}\n\n/**\n * Persist a pre-built TokenEntry into the store, replacing any existing\n * entry for the same connector. Used together with buildTokenEntry() when\n * the caller wants to defer the save until after a dependent write succeeds.\n *\n * For transactional rollback, callers should snapshot the full store via\n * loadTokenStore() BEFORE calling commitTokenEntry() and restore it with\n * saveTokenStore() on failure. A full-store snapshot handles partial writes\n * of tokens.json atomically — single-entry restore via the return value is\n * insufficient because if this function throws during saveTokenStore, the\n * return statement never executes (UXJI/UXJT fix).\n */\nexport function commitTokenEntry(entry: TokenEntry, tokensPath?: string): void {\n const store = loadTokenStore(tokensPath);\n store.tokens = store.tokens.filter((t) => t.connector !== entry.connector);\n store.tokens.push(entry);\n saveTokenStore(store, tokensPath);\n}\n\nexport function generateToken(connector: string, tokensPath?: string): TokenEntry {\n const store = loadTokenStore(tokensPath);\n\n // Remove existing token for this connector\n store.tokens = store.tokens.filter((t) => t.connector !== connector);\n\n const entry = buildTokenEntry(connector);\n store.tokens.push(entry);\n saveTokenStore(store, tokensPath);\n return entry;\n}\n\nexport function listTokens(tokensPath?: string): TokenEntry[] {\n return loadTokenStore(tokensPath).tokens;\n}\n\nexport function revokeToken(connector: string, tokensPath?: string): boolean {\n const store = loadTokenStore(tokensPath);\n const before = store.tokens.length;\n store.tokens = store.tokens.filter((t) => t.connector !== connector);\n if (store.tokens.length < before) {\n saveTokenStore(store, tokensPath);\n return true;\n }\n return false;\n}\n\nexport function getAllValidTokens(tokensPath?: string): string[] {\n return loadTokenStore(tokensPath).tokens.map((t) => t.token);\n}\n\n// Cached token loader to avoid synchronous disk I/O on every HTTP request.\n// Re-reads tokens.json at most once per TTL interval (default 5s).\nconst TOKEN_CACHE_TTL_MS = 5_000;\nlet _cachedTokens: string[] = [];\nlet _cachedAt = 0;\nlet _cachedPath: string | undefined;\n\nfunction invalidateTokenCache(): void {\n _cachedTokens = [];\n _cachedAt = 0;\n _cachedPath = undefined;\n}\n\nexport function getAllValidTokensCached(tokensPath?: string): string[] {\n const now = Date.now();\n if (now - _cachedAt < TOKEN_CACHE_TTL_MS && tokensPath === _cachedPath) return _cachedTokens;\n _cachedTokens = getAllValidTokens(tokensPath);\n _cachedAt = now;\n _cachedPath = tokensPath;\n return _cachedTokens;\n}\n\nexport function resolveConnectorFromToken(token: string, tokensPath?: string): string | undefined {\n return loadTokenStore(tokensPath).tokens.find((t) => t.token === token)?.connector;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
// src/transfer/fs-utils.ts
|
|
2
|
-
import { createHash } from "crypto";
|
|
2
|
+
import { createHash, randomUUID } from "crypto";
|
|
3
3
|
import {
|
|
4
4
|
lstat,
|
|
5
5
|
mkdir,
|
|
6
|
+
open,
|
|
6
7
|
readdir,
|
|
7
8
|
readFile,
|
|
8
9
|
realpath,
|
|
10
|
+
rename,
|
|
11
|
+
rm,
|
|
9
12
|
stat,
|
|
10
13
|
writeFile
|
|
11
14
|
} from "fs/promises";
|
|
@@ -139,6 +142,48 @@ async function resolveSafeArchiveTarget(root, relPath) {
|
|
|
139
142
|
);
|
|
140
143
|
return targetAbs;
|
|
141
144
|
}
|
|
145
|
+
async function writeSafeArchiveTarget(root, relPath, content) {
|
|
146
|
+
const targetAbs = await resolveSafeArchiveTarget(root, relPath);
|
|
147
|
+
const parentAbs = path.dirname(targetAbs);
|
|
148
|
+
await mkdir(parentAbs, { recursive: true });
|
|
149
|
+
await assertRealpathInsideRoot(
|
|
150
|
+
root.real,
|
|
151
|
+
parentAbs,
|
|
152
|
+
relPath,
|
|
153
|
+
root.errorPrefix
|
|
154
|
+
);
|
|
155
|
+
const parentStat = await lstat(parentAbs);
|
|
156
|
+
if (!parentStat.isDirectory() || parentStat.isSymbolicLink()) {
|
|
157
|
+
throw new Error(
|
|
158
|
+
`${root.errorPrefix}: record path parent is not a safe directory: ${relPath}`
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
const targetStat = await lstat(targetAbs).catch((error) => {
|
|
162
|
+
if (error.code === "ENOENT") return null;
|
|
163
|
+
throw error;
|
|
164
|
+
});
|
|
165
|
+
if (targetStat?.isSymbolicLink()) {
|
|
166
|
+
throw new Error(
|
|
167
|
+
`${root.errorPrefix}: record path targets a symlink: ${relPath}`
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
const tempAbs = path.join(parentAbs, `.remnic-import-${process.pid}-${randomUUID()}.tmp`);
|
|
171
|
+
let renamed = false;
|
|
172
|
+
try {
|
|
173
|
+
const handle = await open(tempAbs, "wx", 384);
|
|
174
|
+
try {
|
|
175
|
+
await handle.writeFile(content);
|
|
176
|
+
} finally {
|
|
177
|
+
await handle.close();
|
|
178
|
+
}
|
|
179
|
+
await rename(tempAbs, targetAbs);
|
|
180
|
+
renamed = true;
|
|
181
|
+
} finally {
|
|
182
|
+
if (!renamed) {
|
|
183
|
+
await rm(tempAbs, { force: true }).catch(() => void 0);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
142
187
|
function isPathInsideRoot(rootReal, absPath) {
|
|
143
188
|
const rel = path.relative(rootReal, absPath);
|
|
144
189
|
if (rel === "") return true;
|
|
@@ -194,8 +239,9 @@ export {
|
|
|
194
239
|
prepareSafeArchiveRoot,
|
|
195
240
|
validateArchiveRelativePath,
|
|
196
241
|
resolveSafeArchiveTarget,
|
|
242
|
+
writeSafeArchiveTarget,
|
|
197
243
|
isPathInsideRoot,
|
|
198
244
|
assertIsDirectoryNotSymlink,
|
|
199
245
|
assertRealpathInsideRoot
|
|
200
246
|
};
|
|
201
|
-
//# sourceMappingURL=chunk-
|
|
247
|
+
//# sourceMappingURL=chunk-GCGJW34D.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/transfer/fs-utils.ts"],"sourcesContent":["import { createHash, randomUUID } from \"node:crypto\";\nimport {\n lstat,\n mkdir,\n open,\n readdir,\n readFile,\n realpath,\n rename,\n rm,\n stat,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\n\nconst fatalUtf8Decoder = new TextDecoder(\"utf-8\", { fatal: true, ignoreBOM: true });\n\nexport async function sha256File(filePath: string): Promise<{ sha256: string; bytes: number }> {\n const buf = await readFile(filePath);\n const sha256 = createHash(\"sha256\").update(buf).digest(\"hex\");\n return { sha256, bytes: buf.byteLength };\n}\n\nexport function sha256Bytes(content: Uint8Array): { sha256: string; bytes: number } {\n const buf = Buffer.from(content);\n const sha256 = createHash(\"sha256\").update(buf).digest(\"hex\");\n return { sha256, bytes: buf.byteLength };\n}\n\nexport function sha256String(content: string): { sha256: string; bytes: number } {\n return sha256Bytes(Buffer.from(content, \"utf-8\"));\n}\n\nexport async function readUtf8FileStrict(filePath: string): Promise<{ content: string; sha256: string; bytes: number }> {\n const buf = await readFile(filePath);\n let content: string;\n try {\n content = fatalUtf8Decoder.decode(buf);\n } catch {\n throw new Error(`transfer export requires UTF-8 text files: ${filePath}`);\n }\n return { content, ...sha256Bytes(buf) };\n}\n\nexport async function writeJsonFile(filePath: string, value: unknown): Promise<void> {\n await mkdir(path.dirname(filePath), { recursive: true });\n await writeFile(filePath, JSON.stringify(value, null, 2) + \"\\n\", \"utf-8\");\n}\n\nexport async function readJsonFile<T>(filePath: string): Promise<T> {\n const raw = await readFile(filePath, \"utf-8\");\n return JSON.parse(raw) as T;\n}\n\nexport async function listFilesRecursive(rootDir: string): Promise<string[]> {\n const out: string[] = [];\n async function walk(dir: string): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const ent of entries) {\n const fp = path.join(dir, ent.name);\n if (ent.isDirectory()) {\n await walk(fp);\n } else if (ent.isFile()) {\n out.push(fp);\n }\n }\n }\n await walk(rootDir);\n return out.sort();\n}\n\nexport async function ensureDirExists(dirPath: string): Promise<void> {\n await mkdir(dirPath, { recursive: true });\n}\n\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await stat(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function toPosixRelPath(absPath: string, rootDir: string): string {\n const rel = path.relative(rootDir, absPath);\n // normalize to posix for portability across platforms\n return rel.split(path.sep).join(\"/\");\n}\n\nexport function fromPosixRelPath(relPath: string): string {\n return relPath.split(\"/\").join(path.sep);\n}\n\nexport interface SafeArchiveRoot {\n abs: string;\n real: string;\n errorPrefix: string;\n argName: string;\n}\n\nexport async function prepareSafeArchiveRoot(\n absPath: string,\n errorPrefix: string,\n argName: string,\n): Promise<SafeArchiveRoot> {\n const rootAbs = path.resolve(absPath);\n await assertIsDirectoryNotSymlink(rootAbs, errorPrefix, argName);\n return {\n abs: rootAbs,\n real: await realpath(rootAbs),\n errorPrefix,\n argName,\n };\n}\n\nexport function validateArchiveRelativePath(\n relPath: string,\n errorPrefix: string,\n): string {\n if (relPath.length === 0) {\n throw new Error(`${errorPrefix}: record path must not be empty`);\n }\n if (relPath.includes(\"\\\\\")) {\n throw new Error(\n `${errorPrefix}: record path must use POSIX separators: ${relPath}`,\n );\n }\n if (path.posix.isAbsolute(relPath)) {\n throw new Error(\n `${errorPrefix}: record path must be relative: ${relPath}`,\n );\n }\n\n const segments = relPath.split(\"/\");\n if (segments.some((segment) => segment === \"\" || segment === \".\" || segment === \"..\")) {\n throw new Error(\n `${errorPrefix}: record path contains unsafe segments: ${relPath}`,\n );\n }\n\n const normalized = path.posix.normalize(relPath);\n if (\n normalized === \".\" ||\n normalized === \"..\" ||\n normalized.startsWith(\"../\") ||\n path.posix.isAbsolute(normalized)\n ) {\n throw new Error(\n `${errorPrefix}: record path escapes target root: ${relPath}`,\n );\n }\n\n return normalized;\n}\n\nexport async function resolveSafeArchiveTarget(\n root: SafeArchiveRoot,\n relPath: string,\n): Promise<string> {\n const safeRelPath = validateArchiveRelativePath(relPath, root.errorPrefix);\n const targetAbs = path.resolve(root.abs, fromPosixRelPath(safeRelPath));\n if (!isPathInsideRoot(root.abs, targetAbs)) {\n throw new Error(\n `${root.errorPrefix}: record path escapes target root: ${relPath}`,\n );\n }\n\n const targetStat = await lstat(targetAbs).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n });\n if (targetStat?.isSymbolicLink()) {\n throw new Error(\n `${root.errorPrefix}: record path targets a symlink: ${relPath}`,\n );\n }\n\n await assertRealpathInsideRoot(\n root.real,\n targetAbs,\n relPath,\n root.errorPrefix,\n );\n return targetAbs;\n}\n\nexport async function writeSafeArchiveTarget(\n root: SafeArchiveRoot,\n relPath: string,\n content: string | Uint8Array,\n): Promise<void> {\n const targetAbs = await resolveSafeArchiveTarget(root, relPath);\n const parentAbs = path.dirname(targetAbs);\n await mkdir(parentAbs, { recursive: true });\n await assertRealpathInsideRoot(\n root.real,\n parentAbs,\n relPath,\n root.errorPrefix,\n );\n const parentStat = await lstat(parentAbs);\n if (!parentStat.isDirectory() || parentStat.isSymbolicLink()) {\n throw new Error(\n `${root.errorPrefix}: record path parent is not a safe directory: ${relPath}`,\n );\n }\n const targetStat = await lstat(targetAbs).catch((error: unknown) => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n throw error;\n });\n if (targetStat?.isSymbolicLink()) {\n throw new Error(\n `${root.errorPrefix}: record path targets a symlink: ${relPath}`,\n );\n }\n\n const tempAbs = path.join(parentAbs, `.remnic-import-${process.pid}-${randomUUID()}.tmp`);\n let renamed = false;\n try {\n const handle = await open(tempAbs, \"wx\", 0o600);\n try {\n await handle.writeFile(content);\n } finally {\n await handle.close();\n }\n await rename(tempAbs, targetAbs);\n renamed = true;\n } finally {\n if (!renamed) {\n await rm(tempAbs, { force: true }).catch(() => undefined);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shared path-safety helpers (used by capsule-import, capsule-merge, and\n// capsule-fork).\n//\n// These helpers are security-critical (path-traversal and symlink-bypass\n// guards), so any future fix must apply uniformly. The `errorPrefix` and\n// `argName` arguments let each caller surface module-specific error messages\n// (\"importCapsule:\" vs \"mergeCapsule:\" vs \"forkCapsule:\") without forking the\n// implementation.\n// ---------------------------------------------------------------------------\n\n/**\n * Return true when {@link absPath} is the same as {@link rootReal} or a\n * descendant. {@link rootReal} should be the value returned by\n * `realpath(rootAbs)` so that symlinked subdirectories are detected.\n */\nexport function isPathInsideRoot(rootReal: string, absPath: string): boolean {\n const rel = path.relative(rootReal, absPath);\n if (rel === \"\") return true;\n if (rel === \"..\") return false;\n if (rel.startsWith(`..${path.sep}`)) return false;\n if (path.isAbsolute(rel)) return false;\n return true;\n}\n\n/**\n * Assert that {@link absPath} is an existing directory and is not itself a\n * symlink. `existsSync` returns true for files (gotcha #24); a stat-based\n * check is required. Symlinked roots are rejected up-front so an attacker\n * cannot hand the importer a `~/import-target` link → `/etc` and have writes\n * silently follow the link (Codex P1 round 5 thread on PR #741).\n */\nexport async function assertIsDirectoryNotSymlink(\n absPath: string,\n errorPrefix: string,\n argName: string,\n): Promise<void> {\n const st = await stat(absPath).catch(() => null);\n if (!st || !st.isDirectory()) {\n throw new Error(\n `${errorPrefix}: '${argName}' must be an existing directory: ${absPath}`,\n );\n }\n const lst = await lstat(absPath).catch(() => null);\n if (lst && lst.isSymbolicLink()) {\n throw new Error(\n `${errorPrefix}: '${argName}' must not be a symlink — resolve it to its real path first: ${absPath}`,\n );\n }\n}\n\n/**\n * Walk upward from {@link targetAbs} to find the nearest existing ancestor,\n * resolve it via `fs.realpath` (which follows symlinks), then re-append the\n * remaining suffix and verify the result is inside {@link rootReal}.\n *\n * This catches the case where an existing subdirectory at any point in the\n * path is a symlink that points outside the intended root. Because the file\n * does not exist yet we cannot realpath it directly; we resolve the deepest\n * existing prefix and re-apply the non-existent suffix. Callers must ensure\n * {@link rootReal} was already resolved via `realpath`.\n */\nexport async function assertRealpathInsideRoot(\n rootReal: string,\n targetAbs: string,\n sourcePath: string,\n errorPrefix: string,\n): Promise<void> {\n let existing = targetAbs;\n const suffix: string[] = [];\n while (existing !== path.dirname(existing)) {\n const st = await lstat(existing).catch(() => null);\n if (st !== null) break;\n suffix.unshift(path.basename(existing));\n existing = path.dirname(existing);\n }\n const existingReal = await realpath(existing).catch(() => existing);\n const targetReal =\n suffix.length > 0 ? path.join(existingReal, ...suffix) : existingReal;\n if (!isPathInsideRoot(rootReal, targetReal)) {\n throw new Error(\n `${errorPrefix}: record path escapes target root via symlink: ${sourcePath}`,\n );\n }\n}\n"],"mappings":"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","names":[]}
|