@m4trix/evals 0.14.0 → 0.15.0
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/cli-simple.cjs +164 -84
- package/dist/cli-simple.cjs.map +1 -1
- package/dist/cli-simple.js +164 -84
- package/dist/cli-simple.js.map +1 -1
- package/dist/cli.cjs +52 -18
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +52 -18
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli-simple.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runner/api.ts","../src/runner/config.ts","../src/runner/config-loader.ts","../src/runner/discovery.ts","../src/runner/execution.ts","../src/evals/diff.ts","../src/evals/metric.ts","../src/evals/score.ts","../src/evals/aggregators.ts","../src/evals/metrics/standard.ts","../src/evals/scores/standard.ts","../src/runner/score-utils.ts","../src/runner/artifact-loader.ts","../src/runner/persistence.ts","../src/runner/search.ts","../src/cli-simple/args.ts","../src/cli-simple/banner.ts","../src/cli-simple/generate.ts","../src/cli-simple/views/GenerateView.tsx","../src/cli-simple/views/Banner.tsx","../src/cli-simple/run.ts","../src/cli-simple/views/RunView.tsx","../src/cli/components/TextBar.tsx","../src/cli-simple/views/Spinner.tsx","../src/cli-simple/index.ts"],"names":["Effect","Queue","createJiti","resolve","jitiModule","loaded","registry","passed","readdir","join","React","Box","Text","jsx","jsxs","writeFile","parse","readOutput","render","useEffect","useState","Fragment","scoreToColor","sampleStdDev","ansi","createBar"],"mappings":";;;AAAA,SAAS,kBAAkB;AAE3B,SAAS,UAAAA,SAAQ,OAAO,QAAQ,SAAAC,cAAa;;;AC6CtC,IAAM,sBAAoC;AAAA,EAC/C,WAAW;AAAA,IACT,SAAS,QAAQ,IAAI;AAAA,IACrB,iBAAiB,CAAC,eAAe,gBAAgB,eAAe,cAAc;AAAA,IAC9E,mBAAmB;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,kBAAkB;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,oBAAoB,CAAC,gBAAgB,QAAQ,SAAS,QAAQ,aAAa;AAAA,EAC7E;AAAA,EACA,mBAAmB;AAAA,EACnB,gBAAgB;AAClB;AAEO,SAAS,wBACd,QACmC;AACnC,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,OAAO;AAC5B,QAAM,YAA4C,CAAC;AACnD,MAAI,cAAc,YAAY,QAAW;AACvC,cAAU,UAAU,aAAa;AAAA,EACnC;AACA,MAAI,cAAc,wBAAwB,QAAW;AACnD,cAAU,kBAAkB,aAAa;AAAA,EAC3C,WAAW,cAAc,oBAAoB,QAAW;AACtD,cAAU,kBAAkB,aAAa;AAAA,EAC3C;AACA,MAAI,cAAc,0BAA0B,QAAW;AACrD,cAAU,oBAAoB,aAAa;AAAA,EAC7C,WAAW,cAAc,sBAAsB,QAAW;AACxD,cAAU,oBAAoB,aAAa;AAAA,EAC7C;AACA,MAAI,cAAc,yBAAyB,QAAW;AACpD,cAAU,mBAAmB,aAAa;AAAA,EAC5C,WAAW,cAAc,qBAAqB,QAAW;AACvD,cAAU,mBAAmB,aAAa;AAAA,EAC5C;AACA,MAAI,cAAc,uBAAuB,QAAW;AAClD,cAAU,qBAAqB,aAAa;AAAA,EAC9C;AAEA,QAAM,YAAmC,CAAC;AAC1C,MAAI,OAAO,sBAAsB,QAAW;AAC1C,cAAU,oBAAoB,OAAO;AAAA,EACvC;AACA,MAAI,OAAO,mBAAmB,QAAW;AACvC,cAAU,iBAAiB,OAAO;AAAA,EACpC;AACA,MAAI,OAAO,KAAK,SAAS,EAAE,SAAS,GAAG;AACrC,cAAU,YAAY;AAAA,EACxB;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,WAAiD;AAChF,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AACA,QAAM,YAAY,UAAU,YACxB;AAAA,IACE,GAAG,oBAAoB;AAAA,IACvB,GAAG,UAAU;AAAA,EACf,IACA,oBAAoB;AAExB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH;AAAA,EACF;AACF;;;ACjIA,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AAExB,YAAY,gBAAgB;AAS5B,IAAM,mBAAmB;AAOzB,IAAI;AAEJ,SAAS,gBAA4B;AACnC,MAAI,cAAc;AAChB,WAAO;AAAA,EACT;AACA,QAAMC,cACwD,yBACtB;AACxC,MAAI,OAAOA,gBAAe,YAAY;AACpC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,iBACEA,YACA,YAAY,KAAK;AAAA,IACjB,gBAAgB;AAAA,IAChB,aAAa;AAAA,EACf,CAAC;AACD,SAAO;AACT;AAEA,SAAS,0BAA0B,cAAgC;AACjE,MACE,gBACA,OAAO,iBAAiB,YACxB,aAAa,cACb;AACA,WAAQ,aAAsC;AAAA,EAChD;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,OAAwC;AAClE,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,YAAY;AAC/B,WAAQ,MAA8C;AAAA,EACxD;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,qBACd,MAAM,QAAQ,IAAI,GACiB;AACnC,QAAM,aAAa,QAAQ,KAAK,gBAAgB;AAChD,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,QAAM,SAAS,cAAc;AAC7B,QAAM,SAAS,OAAO,UAAU;AAChC,QAAM,gBAAgB,0BAA0B,MAAM;AACtD,QAAM,SAAS,mBAAmB,aAAa;AAC/C,SAAO,wBAAwB,MAAM;AACvC;;;AC/EA,SAAS,eAAe;AACxB,SAAS,WAAAC,UAAS,gBAAgB;AAClC,SAAS,qBAAqB;AAiB9B,IAAI;AAEJ,SAAS,KAAK,QAAgB,UAAkB,MAAuB;AACrE,QAAM,SAAS,QAAQ,KAAK,KAAK,EAAE,SAAS,IAAI,OAAO;AACvD,SAAO,GAAG,MAAM,IAAI,MAAM,GACvB,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAC3B;AAEA,SAAS,UAAU,OAAgB,YAA6B;AAC9D,SACE,OAAO,UAAU,YACjB,UAAU,QACV,cAAc,SACd,OAAQ,MAAkC,UAAU,MAAM;AAE9D;AAEA,SAAS,cAAc,OAAkC;AACvD,SAAO,UAAU,OAAO,SAAS,KAAK,UAAU,OAAO,iBAAiB;AAC1E;AAEA,SAAS,gBACP,OACwD;AACxD,SACE,UAAU,OAAO,SAAS,KAC1B,UAAU,OAAO,gBAAgB,KACjC,UAAU,OAAO,eAAe;AAEpC;AAEA,SAAS,eAAe,OAA4C;AAClE,SACE,UAAU,OAAO,SAAS,KAC1B,UAAU,OAAO,SAAS,KAC1B,UAAU,OAAO,UAAU;AAE/B;AAEA,eAAe,cACb,SACA,oBACmB;AACnB,QAAM,MAAgB,CAAC;AAEvB,iBAAe,KAAK,YAAmC;AACrD,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM,QAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AAAA,IAC7D,QAAQ;AACN;AAAA,IACF;AAEA,UAAM,QAAQ;AAAA,MACZ,QAAQ,IAAI,OAAO,UAAU;AAC3B,cAAM,WAAWA,SAAQ,YAAY,MAAM,IAAI;AAC/C,YAAI,MAAM,YAAY,GAAG;AACvB,cAAI,mBAAmB,SAAS,MAAM,IAAI,GAAG;AAC3C;AAAA,UACF;AACA,gBAAM,KAAK,QAAQ;AACnB;AAAA,QACF;AAEA,YAAI,MAAM,OAAO,GAAG;AAClB,cAAI,KAAK,QAAQ;AAAA,QACnB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,KAAK,OAAO;AAClB,SAAO;AACT;AAEA,SAAS,aACP,UACA,UACS;AACT,SAAO,SAAS,KAAK,CAAC,WAAW,SAAS,SAAS,MAAM,CAAC;AAC5D;AAEA,eAAe,kBAAkB,UAAsC;AACrE,MAAI,SAAS,SAAS,KAAK,KAAK,SAAS,SAAS,MAAM,GAAG;AACzD,QAAI,CAAC,YAAY;AACf,YAAMC,cAAc,MAAM,OAAO,MAAM;AAIvC,YAAMF,cAAaE,YAAW,cAAcA,YAAW;AACvD,UAAI,CAACF,aAAY;AACf,cAAM,IAAI,MAAM,6CAA6C;AAAA,MAC/D;AACA,mBAAaA,YAAW,YAAY,KAAK;AAAA,QACvC,gBAAgB;AAAA,QAChB,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AACA,UAAMG,UAAS,WAAW,SACtB,MAAM,WAAW,OAAO,QAAQ,IAChC,MAAM,QAAQ,QAAQ,WAAW,QAAQ,CAAC;AAC9C,WAAO,OAAO,OAAOA,OAAiC;AAAA,EACxD;AAEA,QAAM,YAAY,cAAc,QAAQ,EAAE;AAC1C,QAAM,SAAU,MAAM,OAAO;AAC7B,SAAO,OAAO,OAAO,MAAM;AAC7B;AAEA,eAAsB,yBACpB,QAC0C;AAC1C,QAAM,QAAQ,MAAM,cAAc,OAAO,SAAS,OAAO,kBAAkB;AAC3E,QAAM,UAAU,MAAM;AAAA,IAAO,CAAC,aAC5B,aAAa,UAAU,OAAO,eAAe;AAAA,EAC/C;AAEA,QAAM,QAAQ,MAAM,QAAQ;AAAA,IAC1B,QAAQ,IAAI,OAAO,iBAAiB;AAClC,YAAM,UAAU,MAAM,kBAAkB,YAAY;AACpD,YAAM,WAAW,QAAQ,OAAO,aAAa;AAC7C,YAAM,UAAU,SAAS,OAAO,SAAS,YAAY;AACrD,aAAO,SAAS,IAAI,CAAC,aAAa;AAAA,QAChC,IAAI,KAAK,WAAW,SAAS,QAAQ,QAAQ,CAAC;AAAA,QAC9C,UAAU;AAAA,QACV;AAAA,MACF,EAAE;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,SAAO,MAAM,KAAK;AACpB;AAEA,eAAsB,2BACpB,QAC4C;AAC5C,QAAM,QAAQ,MAAM,cAAc,OAAO,SAAS,OAAO,kBAAkB;AAC3E,QAAM,UAAU,MAAM;AAAA,IAAO,CAAC,aAC5B,aAAa,UAAU,OAAO,iBAAiB;AAAA,EACjD;AAEA,QAAM,QAAQ,MAAM,QAAQ;AAAA,IAC1B,QAAQ,IAAI,OAAO,iBAAiB;AAClC,YAAM,UAAU,MAAM,kBAAkB,YAAY;AACpD,YAAM,aAAa,QAAQ,OAAO,eAAe;AACjD,YAAM,UAAU,SAAS,OAAO,SAAS,YAAY;AACrD,aAAO,WAAW,IAAI,CAAC,eAAe;AAAA,QACpC,IAAI,KAAK,aAAa,SAAS,UAAU,QAAQ,CAAC;AAAA,QAClD,UAAU;AAAA,QACV;AAAA,MACF,EAAE;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,SAAO,MAAM,KAAK;AACpB;AAEA,eAAsB,0BACpB,QAC2C;AAC3C,QAAM,QAAQ,MAAM,cAAc,OAAO,SAAS,OAAO,kBAAkB;AAC3E,QAAM,UAAU,MAAM;AAAA,IAAO,CAAC,aAC5B,aAAa,UAAU,OAAO,gBAAgB;AAAA,EAChD;AAEA,QAAM,QAAQ,MAAM,QAAQ;AAAA,IAC1B,QAAQ,IAAI,OAAO,iBAAiB;AAClC,YAAM,UAAU,MAAM,kBAAkB,YAAY;AACpD,YAAM,YAAY,QAAQ,OAAO,cAAc;AAC/C,YAAM,UAAU,SAAS,OAAO,SAAS,YAAY;AACrD,aAAO,UAAU,IAAI,CAAC,cAAc;AAAA,QAClC,IAAI,KAAK,aAAa,SAAS,SAAS,QAAQ,CAAC;AAAA,QACjD,UAAU;AAAA,QACV;AAAA,MACF,EAAE;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,SAAO,MAAM,KAAK;AACpB;;;ACzMA,SAAS,YAAY;AAErB,SAAS,QAAQ,OAAO,WAAW;;;ACFnC,SAAS,iBAAiB;AAE1B,SAAS,YAAY,OAAwB;AAC3C,MAAI;AACF,WAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AAAA,EACtC,QAAQ;AACN,WAAO,OAAO,KAAK;AAAA,EACrB;AACF;AAEA,SAAS,iBACP,SACQ;AACR,QAAM,QAAkB,CAAC;AACzB,aAAW,QAAQ,SAAS;AAC1B,UAAM,SAAS,KAAK,QAAQ,MAAM,KAAK,UAAU,MAAM;AACvD,UAAM,YAAY,KAAK,MAAM,MAAM,IAAI;AACvC,QAAI,UAAU,UAAU,SAAS,CAAC,MAAM,IAAI;AAC1C,gBAAU,IAAI;AAAA,IAChB;AACA,eAAW,QAAQ,WAAW;AAC5B,YAAM,KAAK,GAAG,MAAM,IAAI,IAAI,EAAE;AAAA,IAChC;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,iBAAiB,UAAmB,QAAyB;AACpE,QAAM,cAAc,YAAY,QAAQ;AACxC,QAAM,YAAY,YAAY,MAAM;AACpC,QAAM,UAAU,UAAU,aAAa,SAAS;AAChD,SAAO,iBAAiB,OAAO;AACjC;AAkBO,SAAS,mBACd,UACA,QACA,SACc;AACd,QAAM,OAAO,iBAAiB,UAAU,MAAM;AAC9C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO,SAAS;AAAA,IAChB;AAAA,IACA;AAAA,IACA,MAAM,QAAQ;AAAA,EAChB;AACF;AAYO,SAAS,aAAa,OAAkF;AAC7G,QAAM,MAAM,iBAAiB,MAAM,UAAU,MAAM,MAAM,KAAK;AAC9D,SAAO,IAAI,MAAM,IAAI,EAAE,IAAI,CAAC,SAAS;AACnC,UAAM,UAAU,KAAK,UAAU;AAC/B,QAAI,QAAQ,WAAW,GAAG,KAAK,CAAC,QAAQ,WAAW,KAAK,GAAG;AACzD,aAAO,EAAE,MAAM,UAAmB,KAAK;AAAA,IACzC;AACA,QAAI,QAAQ,WAAW,GAAG,KAAK,CAAC,QAAQ,WAAW,KAAK,GAAG;AACzD,aAAO,EAAE,MAAM,OAAgB,KAAK;AAAA,IACtC;AACA,WAAO,EAAE,MAAM,WAAoB,KAAK;AAAA,EAC1C,CAAC;AACH;;;ACvFA,IAAM,WAAW,oBAAI,IAAgC;AAmB9C,IAAM,SAAS;AAAA,EACpB,GAAU,QAKW;AACnB,UAAM,MAAwB;AAAA,MAC5B,IAAI,OAAO;AAAA,MACX,MAAM,OAAO;AAAA,MACb,WAAW,OAAO;AAAA,MAClB,QAAQ,OAAO;AAAA,MACf,MAAM,CAAC,UAAiB,EAAE,IAAI,OAAO,IAAI,KAAK;AAAA,IAChD;AACA,aAAS,IAAI,OAAO,IAAI,GAAyB;AACjD,WAAO;AAAA,EACT;AACF;AAEO,SAAS,cAAc,IAA4C;AACxE,SAAO,SAAS,IAAI,EAAE;AACxB;;;ACxCA,IAAMC,YAAW,oBAAI,IAA+B;AA0B7C,IAAM,QAAQ;AAAA,EACnB,GAAU,QAMU;AAClB,UAAM,MAAuB;AAAA,MAC3B,IAAI,OAAO;AAAA,MACX,MAAM,OAAO;AAAA,MACb,iBAAiB,OAAO;AAAA,MACxB,WAAW,OAAO;AAAA,MAClB,QAAQ,OAAO;AAAA,MACf,MAAM,CAAC,MAAa,YAA0D;AAC5E,cAAM,SACJ,SAAS,iBAAiB,SACtB,QAAQ,aAAa,IAAI,IACzB;AACN,eAAO;AAAA,UACL,IAAI,OAAO;AAAA,UACX;AAAA,UACA,GAAI,WAAW,UAAa,EAAE,OAAO;AAAA,QACvC;AAAA,MACF;AAAA,IACF;AACA,IAAAA,UAAS,IAAI,OAAO,IAAI,GAAwB;AAChD,WAAO;AAAA,EACT;AACF;AAEO,SAAS,aAAa,IAA2C;AACtE,SAAOA,UAAS,IAAI,EAAE;AACxB;;;AC/CO,SAAS,6BACd,QACmD;AACnD,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,EAAE,OAAO,GAAG,OAAO,EAAE;AAAA,EAC9B;AACA,QAAM,MAAM,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,OAAO,CAAC;AAClD,QAAM,QAAQ,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC;AAC9D,QAAM,OAAO,MAAM,OAAO;AAC1B,MAAI;AACJ,MAAI,OAAO,UAAU,GAAG;AACtB,UAAM,YAAY,QAAQ,OAAO,SAAS,OAAO,SAAS,OAAO,SAAS;AAC1E,aAAS,WAAW,IAAI,KAAK,KAAK,QAAQ,IAAI;AAAA,EAChD;AACA,SAAO,EAAE,OAAO,MAAM,QAAQ,OAAO,OAAO,OAAO;AACrD;AAGO,SAAS,aAAa,QAI3B;AACA,QAAM,QAAQ,OAAO;AACrB,QAAM,cAAc,OAAO,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;AACnD,SAAO;AAAA,IACL,QAAQ,QAAQ,KAAK,OAAO,MAAM,CAAC,MAAM,EAAE,MAAM;AAAA,IACjD;AAAA,IACA,YAAY;AAAA,EACd;AACF;AAUO,SAAS,uBACd,QAMe;AACf,QAAM,UAAyB;AAAA,IAC7B,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,cAAc;AAAA,EAChB;AACA,SAAO,OAAO;AAAA,IACZ,CAAC,KAAK,OAAO;AAAA,MACX,OAAO,IAAI,SAAS,EAAE,SAAS;AAAA,MAC/B,QAAQ,IAAI,UAAU,EAAE,UAAU;AAAA,MAClC,aAAa,IAAI,eAAe,EAAE,eAAe;AAAA,MACjD,cAAc,IAAI,gBAAgB,EAAE,gBAAgB;AAAA,IACtD;AAAA,IACA;AAAA,EACF;AACF;AAGO,SAAS,wBACd,QACgB;AAChB,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,EAAE,IAAI,EAAE;AAAA,EACjB;AACA,QAAM,MAAM,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,IAAI,CAAC;AAC/C,SAAO,EAAE,IAAI,MAAM,OAAO,OAAO;AACnC;;;AC5EO,IAAM,mBAAmB,OAAO,GAAmB;AAAA,EACxD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,WAAW;AAAA,EACX,QAAQ,CAAC,MAAM,YAAY;AACzB,UAAM,QAAQ,KAAK,SAAS;AAC5B,UAAM,SAAS,KAAK,UAAU;AAC9B,UAAM,cAAc,KAAK,eAAe;AACxC,UAAM,eAAe,KAAK,gBAAgB;AAC1C,UAAM,SAAS,cAAc;AAC7B,UAAM,OAAO,MAAM,KAAK,QAAQ,MAAM,WAAW,MAAM;AACvD,WAAO,SAAS,eAAe,UAAU,IAAI,KAAK;AAAA,EACpD;AACF,CAAC;AAMM,IAAM,gBAAgB,OAAO,GAAgB;AAAA,EAClD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,WAAW;AAAA,EACX,QAAQ,CAAC,MAAM,YACb,SAAS,eAAe,QAAQ,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE;AAC5D,CAAC;;;AC1BM,IAAM,eAAe,MAAM,GAAqB;AAAA,EACrD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,QAAQ,CAAC,MAAM,YAAY;AACzB,QAAI,SAAS,cAAc;AACzB,aAAO,KAAK,UAAU,OAClB,QAAQ,KAAK,MAAM,QAAQ,CAAC,CAAC,SAAM,KAAK,OAAO,QAAQ,CAAC,CAAC,KACzD,QAAQ,KAAK,MAAM,QAAQ,CAAC,CAAC;AAAA,IACnC;AACA,WAAO,KAAK,MAAM,QAAQ,CAAC;AAAA,EAC7B;AAAA,EACA,WAAW;AACb,CAAC;AAQM,IAAM,cAAc,MAAM,GAAoB;AAAA,EACnD,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,iBAAiB;AAAA,EACjB,QAAQ,CAAC,MAAM,YAAY;AACzB,QAAI,SAAS,cAAc;AACzB,YAAM,OAAO,KAAK,SAAS,gBAAgB;AAC3C,UACE,KAAK,eAAe,QACpB,KAAK,cAAc,QACnB,KAAK,aAAa,GAClB;AACA,eAAO,GAAG,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,UAAU;AAAA,MACxD;AACA,aAAO;AAAA,IACT;AACA,WAAO,KAAK,SAAS,WAAW;AAAA,EAClC;AAAA,EACA,WAAW;AACb,CAAC;;;AC7CM,SAAS,oBACd,OACuB;AACvB,MAAI,MAAM,WAAW;AAAG,WAAO;AAC/B,QAAM,MAAM,aAAa,MAAM,CAAC,EAAE,EAAE;AACpC,MAAI,CAAC,KAAK;AAAW,WAAO,MAAM,MAAM,SAAS,CAAC;AAClD,QAAM,aAAa,IAAI,UAAU,MAAM,IAAI,CAAC,MAAM,EAAE,IAAa,CAAC;AAClE,SAAO,EAAE,GAAG,MAAM,CAAC,GAAG,MAAM,WAAW;AACzC;AAEO,SAAS,qBACd,OACwB;AACxB,MAAI,MAAM,WAAW;AAAG,WAAO;AAC/B,QAAM,MAAM,cAAc,MAAM,CAAC,EAAE,EAAE;AACrC,MAAI,CAAC,KAAK;AAAW,WAAO,MAAM,MAAM,SAAS,CAAC;AAClD,QAAM,aAAa,IAAI,UAAU,MAAM,IAAI,CAAC,MAAM,EAAE,IAAa,CAAC;AAClE,SAAO,EAAE,GAAG,MAAM,CAAC,GAAG,MAAM,WAAW;AACzC;AAEO,SAAS,yBACd,QACoB;AACpB,aAAW,QAAQ,QAAQ;AACzB,UAAM,MAAM,aAAa,KAAK,EAAE;AAChC,QAAI,OAAO,IAAI,oBAAoB,SAAS,OAAO,KAAK,SAAS,YAAY,KAAK,SAAS,QAAQ,WAAW,KAAK,MAAM;AACvH,YAAM,QAAS,KAAK,KAA4B;AAChD,UAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,eAAO;AAAA,MACT;AAAA,IACF;AACA,UAAM,UAAU,eAAe,KAAK,IAAI;AACxC,QAAI,YAAY,QAAW;AACzB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,eAAe,OAAoC;AACjE,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,MAAM;AACZ,MACE,WAAW,OACX,OAAO,IAAI,UAAU,YACrB,OAAO,SAAS,IAAI,KAAK,GACzB;AACA,WAAO,IAAI;AAAA,EACb;AACA,QAAM,eAAe,OAAO,OAAO,KAAK,EAAE;AAAA,IACxC,CAAC,UACC,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK;AAAA,EACtD;AACA,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,SACE,aAAa,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC,IAAI,aAAa;AAEvE;;;APtDA,SAAS,uBACP,WACA,QACA,QACS;AACT,QAAM,mBAAmB,OAAO,OAAO,CAAC,MAAM,YAAY,KAAK,EAAE,WAAW,MAAS;AACrF,MAAI,iBAAiB,SAAS,GAAG;AAC/B,WAAO,iBAAiB,MAAM,CAAC,MAAM,EAAE,WAAW,IAAI;AAAA,EACxD;AACA,QAAM,gBAAgB,UAAU,iBAAiB;AACjD,MAAI,eAAe;AACjB,WAAO,cAAc,MAAM;AAAA,EAC7B;AACA,QAAM,gBAAgB,UAAU,iBAAiB;AACjD,MAAI,kBAAkB,QAAW;AAC/B,UAAM,UAAU,yBAAyB,MAAM;AAC/C,WAAO,YAAY,UAAa,WAAW;AAAA,EAC7C;AACA,SAAO;AACT;AAEA,SAAS,gBACP,QAIA;AACA,MAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AACjD,WAAO,EAAE,QAAQ,CAAC,EAAE;AAAA,EACtB;AACA,QAAM,MAAM;AACZ,QAAM,SAAS,MAAM,QAAQ,IAAI,MAAM,IAClC,IAAI,SACL,CAAC;AACL,QAAM,UAAU,MAAM,QAAQ,IAAI,OAAO,IACpC,IAAI,UACL;AACJ,SAAO,EAAE,QAAQ,QAAQ;AAC3B;AAEA,SAAS,WAAW,UAAkD;AACpE,QAAM,YAAY;AAClB,MAAI,OAAO,UAAU,cAAc,YAAY;AAC7C,WAAO;AAAA,EACT;AACA,SAAO,UAAU,UAAU;AAC7B;AAeA,SAAS,gBAAwB;AAC/B,UAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AACtD;AAEO,SAAS,mBACd,mBACA,WACA,OACQ;AACR,SAAO;AAAA,IACL;AAAA,IACA,GAAG,SAAS,IAAI,KAAK,IAAI,cAAc,CAAC;AAAA,EAC1C;AACF;AAEA,SAAS,mBACP,MACA,cACA,kBACA,cACA,kBACA,gBAIA,cACA,WACA,WACmC;AACnC,SAAO,OAAO,IAAI,aAAa;AAC7B,UAAM,SACJ,OAAO,aAAa,SAAS,cAAc,aACvC,aAAa,SAAS,UAAU,IAChC;AACN,UAAM,cAAyB,CAAC;AAEhC,aAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,YAAM,UAAU,KAAK,IAAI;AACzB,YAAM,kBAMD,CAAC;AACN,UAAI;AACJ,YAAM,SAAS,WAAW,aAAa,QAAQ;AAE/C,iBAAW,EAAE,IAAI,aAAa,UAAU,KAAK,KAAK,YAAY;AAC5D,cAAM,aAAa,UAAU,cAAc;AAC3C,YAAI,CAAC,YAAY;AACf;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,OAAuB,CAAC;AAC9B,gBAAM,UAIM,CAAC,UAAU,QAAQ,YAAY;AACzC,iBAAK,KAAK,mBAAmB,UAAU,QAAQ,OAAO,CAAC;AAAA,UACzD;AAEA,gBAAM,MAAM,OAAO,OAAO;AAAA,YAAQ,MAChC,QAAQ,QAAQ,UAAU,eAAe,CAAC;AAAA,UAC5C;AACA,gBAAM,SAAS,OAAO,OAAO;AAAA,YAAQ,MACnC,QAAQ;AAAA,cACN,WAAW;AAAA,gBACT,OAAO,aAAa,SAAS,SAAS;AAAA,gBACtC;AAAA,gBACA;AAAA,gBACA;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UACF;AACA,gBAAM,EAAE,QAAQ,QAAQ,IAAI,gBAAgB,MAAM;AAClD,gBAAMC,UAAS,uBAAuB,WAAW,QAAQ,MAAM;AAC/D,0BAAgB,KAAK;AAAA,YACnB;AAAA,YACA;AAAA,YACA,QAAAA;AAAA,YACA;AAAA,YACA,MAAM,KAAK,SAAS,IAAI,OAAO;AAAA,UACjC,CAAC;AAAA,QACH,SAAS,OAAO;AACd,0BACE,iBAAiB,QACb,MAAM,UACN;AACN,0BAAgB,KAAK;AAAA,YACnB;AAAA,YACA,QAAQ,CAAC;AAAA,YACT,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,kBAAkB,gBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM;AAC7D,kBAAY,KAAK,eAAe;AAChC,YAAM,uBAAuB,OAAO,IAAI,OAAO,cAAc,CAAC,MAAM;AAAA,QAClE,IAAI;AAAA,QACJ,IAAI;AAAA,MACN,CAAC;AAED,YAAM,gBAA6B;AAAA,QACjC,MAAM;AAAA,QACN,OAAO,KAAK;AAAA,QACZ,YAAY,aAAa;AAAA,QACzB,cAAc,aAAa,SAAS,QAAQ;AAAA,QAC5C,oBAAoB;AAAA,QACpB,gBAAgB;AAAA,QAChB,YAAY,IAAI;AAAA,QAChB,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB;AAAA,QACA;AAAA,QACA,cAAc;AAAA,MAChB;AAEA,qBAAe,KAAK,OAAO,CAAC,cAAc;AAAA,QACxC,GAAG;AAAA,QACH,oBAAoB;AAAA,MACtB,EAAE;AAEF,aAAO,aAAa,aAAa;AACjC,aAAO,MAAM,MAAM,kBAAkB;AAAA,QACnC,OAAO,KAAK;AAAA,QACZ,cAAc,KAAK,SAAS;AAAA,QAC5B,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,UAAM,iBAAiB,YAAY,MAAM,OAAO;AAChD,QAAI,gBAAgB;AAClB,aAAO,IAAI,OAAO,WAAW,CAAC,MAAM,IAAI,CAAC;AAAA,IAC3C,OAAO;AACL,aAAO,IAAI,OAAO,WAAW,CAAC,MAAM,IAAI,CAAC;AAAA,IAC3C;AAEA,UAAM,CAAC,QAAQ,MAAM,IAAI,OAAO,OAAO,IAAI;AAAA,MACzC,IAAI,IAAI,SAAS;AAAA,MACjB,IAAI,IAAI,SAAS;AAAA,IACnB,CAAC;AACD,mBAAe,KAAK,OAAO,CAAC,cAAc;AAAA,MACxC,GAAG;AAAA,MACH,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,IACnB,EAAE;AAAA,EACJ,CAAC;AACH;AAEO,IAAM,iBAAiB,CAC5B,MACA,cACA,kBACA,mBAKA,OAAO,IAAI,aAAa;AACtB,QAAM,YAAY,KAAK,IAAI;AAC3B,iBAAe,KAAK,OAAO,CAAC,cAAc;AAAA,IACxC,GAAG;AAAA,IACH,QAAQ;AAAA,IACR;AAAA,EACF,EAAE;AACF,SAAO,aAAa;AAAA,IAClB,MAAM;AAAA,IACN,OAAO,KAAK;AAAA,IACZ;AAAA,EACF,CAAC;AAED,QAAM,mBAAmB,KAAK,UAAU;AAAA,IACtC,CAAC,KAAK,OACJ,OACC,OAAO,GAAG,SAAS,cAAc,aAC9B,GAAG,SAAS,UAAU,IACtB;AAAA,IACN;AAAA,EACF;AACA,QAAM,iBAAiB,KAAK,IAAI,GAAG,KAAK,kBAAkB,CAAC;AAE3D,QAAM,eAAe,OAAO,IAAI,KAAK,CAAC;AACtC,QAAM,YAAY,OAAO,IAAI,KAAK,CAAC;AACnC,QAAM,YAAY,OAAO,IAAI,KAAK,CAAC;AAEnC,QAAM,kBAAkB,CAAC,iBACvB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEF,SAAO,OAAO;AAAA,IACZ,KAAK;AAAA,IACL;AAAA,IACA,iBAAiB,IAAI,EAAE,aAAa,eAAe,IAAI;AAAA,EACzD;AAEA,QAAM,CAAC,sBAAsB,uBAAuB,qBAAqB,IACvE,OAAO,OAAO,IAAI;AAAA,IAChB,IAAI,IAAI,YAAY;AAAA,IACpB,IAAI,IAAI,SAAS;AAAA,IACjB,IAAI,IAAI,SAAS;AAAA,EACnB,CAAC;AAEH,QAAM,aAAa,KAAK,IAAI;AAC5B,QAAM,iBAA8B;AAAA,IAClC,MAAM;AAAA,IACN,OAAO,KAAK;AAAA,IACZ;AAAA,IACA,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,gBAAgB,KAAK,UAAU;AAAA,IAC/B,cAAc,KAAK,SAAS;AAAA,EAC9B;AAEA,iBAAe,KAAK,OAAO,CAAC,cAAc;AAAA,IACxC,GAAG;AAAA,IACH,QAAQ;AAAA,IACR,oBAAoB;AAAA,IACpB,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB;AAAA,EACF,EAAE;AAEF,SAAO,aAAa,cAAc;AAClC,SAAO,MAAM,MAAM,kBAAkB;AAAA,IACnC,OAAO,KAAK;AAAA,IACZ,cAAc,KAAK,SAAS;AAAA,IAC5B,SAAS;AAAA,EACX,CAAC;AACD,SAAO,aAAa;AAAA,IAClB,MAAM;AAAA,IACN,OAAO,KAAK;AAAA,IACZ,cAAc,KAAK,SAAS;AAAA,EAC9B,CAAC;AACH,CAAC;;;AQlUH,SAAS,WAAAC,UAAS,gBAAgB;AAClC,SAAS,QAAAC,OAAM,WAAAN,gBAAe;AA6B9B,eAAsB,8BACpB,QACwB;AACxB,QAAM,UAAUA,SAAQ,OAAO,iBAAiB;AAChD,MAAI;AACJ,MAAI;AACF,cAAU,MAAMK,SAAQ,OAAO;AAAA,EACjC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,aAAa,QAAQ,OAAO,CAAC,SAAS,KAAK,SAAS,QAAQ,CAAC;AACnE,QAAM,YAA2B,CAAC;AAElC,aAAW,YAAY,YAAY;AACjC,UAAM,WAAWC,MAAK,SAAS,QAAQ;AACvC,QAAI;AACF,YAAM,WAAW,MAAM,wBAAwB,UAAU,MAAM;AAC/D,UAAI,UAAU;AACZ,kBAAU,KAAK,QAAQ;AAAA,MACzB;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO,UAAU,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AACzD;AAEA,eAAe,wBACb,UACA,SAC6B;AAC7B,QAAM,UAAU,MAAM,SAAS,UAAU,MAAM;AAC/C,QAAM,QAAQ,QAAQ,MAAM,IAAI,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE,SAAS,CAAC;AACzE,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,YAQO;AAEX,MAAI,eAKO;AAEX,MAAI,YAAiE;AACrE,MAAI,aAA2C;AAE/C,aAAW,QAAQ,OAAO;AACxB,QAAI;AACF,YAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,YAAM,OAAO,MAAM;AAEnB,UAAI,SAAS,aAAa;AACxB,oBAAY;AAAA,UACV,OAAO,MAAM;AAAA,UACb,WAAW,MAAM;AAAA,UACjB,aAAa,MAAM;AAAA,UACnB,cAAc,MAAM;AAAA,UACpB,gBAAiB,MAAM,kBAA6B;AAAA,UACpD,cAAe,MAAM,gBAA2B;AAAA,UAChD,IAAI,MAAM;AAAA,QACZ;AAAA,MACF;AACA,UAAI,SAAS,cAAc;AACzB,qBAAa,EAAE,WAAW,MAAM,UAAoB;AAAA,MACtD;AACA,UAAI,SAAS,gBAAgB;AAC3B,uBAAe;AAAA,UACb,iBAAiB,MAAM;AAAA,UACvB,iBAAiB,MAAM;AAAA,UACvB,gBAAgB,MAAM;AAAA,UACtB,YAAY,MAAM;AAAA,QACpB;AAAA,MACF;AACA,UAAI,SAAS,aAAa;AACxB,oBAAY;AAAA,UACV,YAAY,MAAM;AAAA,UAClB,cAAc,MAAM;AAAA,QACtB;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,QAAM,eAAe;AAErB,QAAM,SAAS,YACX,WACA,eACE,cACA,aACE,YACA;AAER,QAAM,WAAW,0BAA0B,KAAK;AAChD,QAAM,qBAAqB,eACvB,UAAU,iBACV,SAAS;AACb,QAAM,kBACJ,cAAc,mBAAmB,SAAS;AAC5C,QAAM,kBACJ,cAAc,mBAAmB,SAAS;AAE5C,SAAO;AAAA,IACL,OAAO,UAAU;AAAA,IACjB,WAAW,UAAU;AAAA,IACrB,aAAa,UAAU;AAAA,IACvB,cAAc,UAAU;AAAA,IACxB,UAAU,UAAU,MAAM;AAAA,IAC1B,WAAW,YAAY;AAAA,IACvB,YAAY,cAAc,cAAc,WAAW;AAAA,IACnD,gBAAgB,UAAU;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,WAAW;AAAA,EAC3B;AACF;AAEA,SAAS,0BAA0B,OAIjC;AACA,MAAI,qBAAqB;AACzB,QAAM,mBAAmB,oBAAI,IAAqB;AAClD,aAAW,QAAQ,OAAO;AACxB,QAAI;AACF,YAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,UAAI,MAAM,SAAS,oBAAoB;AACrC,cAAM,KAAK;AAKX,6BAAqB,GAAG,sBAAsB;AAC9C,cAAM,KAAK,GAAG;AACd,cAAM,UAAU,iBAAiB,IAAI,EAAE;AACvC,yBAAiB,IAAI,IAAI,YAAY,SAAY,GAAG,SAAS,WAAW,GAAG,MAAM;AAAA,MACnF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI,kBAAkB;AACtB,MAAI,kBAAkB;AACtB,aAAW,UAAU,iBAAiB,OAAO,GAAG;AAC9C,QAAI,QAAQ;AACV,yBAAmB;AAAA,IACrB,OAAO;AACL,yBAAmB;AAAA,IACrB;AAAA,EACF;AACA,SAAO,EAAE,oBAAoB,iBAAiB,gBAAgB;AAChE;;;AC3MA,SAAS,YAAY,aAAa;AAClC,SAAS,eAAe;AAExB,SAAS,UAAAT,SAAQ,SAAAC,cAAa;AAQ9B,eAAe,eACb,cACA,SACe;AACf,QAAM,MAAM,QAAQ,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AACtD,QAAM,WAAW,cAAc,GAAG,KAAK,UAAU,OAAO,CAAC;AAAA,GAAM,MAAM;AACvE;AAEO,IAAM,0BAA0B,CACrC,UAEAD,QAAO;AAAA,EACLA,QAAO,IAAI,aAAa;AACtB,UAAM,UAAU,OAAOC,OAAM,KAAK,KAAK;AACvC,WAAOD,QAAO;AAAA,MAAQ,MACpB,eAAe,QAAQ,cAAc;AAAA,QACnC,OAAO,QAAQ;AAAA,QACf,IAAI,KAAK,IAAI;AAAA,QACb,GAAG,QAAQ;AAAA,MACb,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;;;AC/BF,SAAS,WACP,OACA,UACS;AACT,MAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,WAAO;AAAA,EACT;AACA,SAAO,SAAS;AAAA,IAAK,CAAC,YACpB,OAAO,YAAY,WAAW,YAAY,QAAQ,QAAQ,KAAK,KAAK;AAAA,EACtE;AACF;AAEA,SAAS,YACP,OACA,UACS;AACT,MAAI,CAAC,YAAY,SAAS,WAAW,GAAG;AACtC,WAAO;AAAA,EACT;AACA,SAAO,SAAS,KAAK,CAAC,YAAY;AAChC,QAAI,OAAO,YAAY,UAAU;AAC/B,aAAO,MAAM,SAAS,OAAO;AAAA,IAC/B;AACA,WAAO,QAAQ,KAAK,KAAK;AAAA,EAC3B,CAAC;AACH;AAEO,SAAS,yBACd,KACA,OACkC;AAClC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,OAAO,CAAC,SAAS;AAC1B,UAAM,OAAO,KAAK,SAAS,QAAQ;AAEnC,QACE,MAAM,gBACN,KAAK,KAAK,CAAC,QAAQ,WAAW,KAAK,MAAM,YAAY,CAAC,GACtD;AACA,aAAO;AAAA,IACT;AACA,QACE,MAAM,iBACN,YAAY,KAAK,UAAU,MAAM,aAAa,GAC9C;AACA,aAAO;AAAA,IACT;AAEA,UAAM,oBACJ,CAAC,MAAM,gBACP,MAAM,aAAa,WAAW,KAC9B,KAAK,KAAK,CAAC,QAAQ,WAAW,KAAK,MAAM,YAAY,CAAC;AAExD,UAAM,qBACJ,CAAC,MAAM,iBACP,MAAM,cAAc,WAAW,KAC/B,YAAY,KAAK,UAAU,MAAM,aAAa;AAEhD,WAAO,qBAAqB;AAAA,EAC9B,CAAC;AACH;;;AdnCA,SAAS,kBACP,SAC+C;AAC/C,MAAI,CAAC,QAAQ,WAAW,GAAG,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,QAAM,YAAY,QAAQ,YAAY,GAAG;AACzC,MAAI,aAAa,GAAG;AAClB,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,QAAQ,QAAQ,MAAM,GAAG,SAAS;AAAA,IAClC,OAAO,QAAQ,MAAM,YAAY,CAAC;AAAA,EACpC;AACF;AAEA,SAAS,kBAAkB,SAA6C;AACtE,QAAM,oBAAoB,QAAQ,KAAK;AACvC,QAAM,eAAe,kBAAkB,iBAAiB;AACxD,MAAI,cAAc;AAChB,UAAM,QAAQ,IAAI,OAAO,aAAa,QAAQ,aAAa,KAAK;AAChE,WAAO,CAAC,UAAkB,MAAM,KAAK,KAAK;AAAA,EAC5C;AAEA,MAAI,kBAAkB,SAAS,GAAG,GAAG;AACnC,UAAM,UAAU,kBACb,QAAQ,qBAAqB,MAAM,EACnC,QAAQ,OAAO,IAAI;AACtB,UAAM,QAAQ,IAAI,OAAO,IAAI,OAAO,KAAK,GAAG;AAC5C,WAAO,CAAC,UAAkB,MAAM,KAAK,KAAK;AAAA,EAC5C;AAEA,SAAO,CAAC,UAAkB,MAAM,YAAY,MAAM,kBAAkB,YAAY;AAClF;AAwBA,SAAS,qBACP,MACA,MACmC;AACnC,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,QAAM,YAAY,KAAK,aAAa,KAAK,YACrC;AAAA,IACE,GAAI,KAAK,aAAa,CAAC;AAAA,IACvB,GAAI,KAAK,aAAa,CAAC;AAAA,EACzB,IACA;AACJ,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH;AAAA,EACF;AACF;AAEO,SAAS,aAAa,WAA8C;AACzE,QAAM,gBAAgB,qBAAqB;AAC3C,QAAM,SAAS,qBAAqB,eAAe,SAAS;AAC5D,SAAO,IAAI,aAAa,iBAAiB,MAAM,CAAC;AAClD;AAEA,IAAM,eAAN,MAAwC;AAAA,EAiCtC,YAAY,QAAsB;AA9BlC,SAAiB,WAAWA,QAAO,QAAQ,OAAO,UAAuB,CAAC;AAE1E,SAAiB,WAAWA,QAAO,QAAQC,OAAM,UAAmB,CAAC;AAErE,SAAiB,mBAAmBD,QAAO;AAAA,MACzCC,OAAM,UAIH;AAAA,IACL;AAEA,SAAiB,YAAY,oBAAI,IAAyB;AAC1D,SAAiB,YAAY,oBAAI,IAG9B;AAEH,SAAiB,eAAe,oBAAI,IAA8B;AAElE,SAAiB,iBAAiB,oBAAI,IAAgC;AAEtE,SAAiB,iBAAiBD,QAAO;AAAA,MACvC,KAAK,sBAAsB;AAAA,IAC7B;AAEA,SAAiB,mBAAmBA,QAAO;AAAA,MACzC,wBAAwB,KAAK,gBAAgB;AAAA,IAC/C;AAGE,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,kBAA4D;AAChE,UAAM,WAAW,MAAM,yBAAyB,KAAK,OAAO,SAAS;AACrE,SAAK,aAAa,MAAM;AACxB,eAAW,WAAW,UAAU;AAC9B,WAAK,aAAa,IAAI,QAAQ,IAAI,OAAO;AAAA,IAC3C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,oBAAgE;AACpE,UAAM,aAAa,MAAM,2BAA2B,KAAK,OAAO,SAAS;AACzE,SAAK,eAAe,MAAM;AAC1B,eAAW,aAAa,YAAY;AAClC,WAAK,eAAe,IAAI,UAAU,IAAI,SAAS;AAAA,IACjD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,qBAAqB,MAAqD;AAC9E,QAAI,KAAK,aAAa,SAAS,GAAG;AAChC,YAAM,KAAK,gBAAgB;AAAA,IAC7B;AACA,UAAM,aAAa,KAAK,KAAK,EAAE,YAAY;AAC3C,WAAO,MAAM,KAAK,KAAK,aAAa,OAAO,CAAC,EAAE;AAAA,MAC5C,CAAC,SAAS,KAAK,QAAQ,QAAQ,EAAE,YAAY,MAAM;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAM,+BACJ,SAC4C;AAC5C,QAAI,KAAK,eAAe,SAAS,GAAG;AAClC,YAAM,KAAK,kBAAkB;AAAA,IAC/B;AACA,UAAM,UAAU,kBAAkB,OAAO;AACzC,WAAO,MAAM,KAAK,KAAK,eAAe,OAAO,CAAC,EAAE;AAAA,MAAO,CAAC,SACtD,QAAQ,KAAK,UAAU,QAAQ,KAAK,EAAE;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,MAAM,gBACJ,OAC2C;AAC3C,UAAM,YAAY,MAAM,0BAA0B,KAAK,OAAO,SAAS;AACvE,WAAO,yBAAyB,WAAW,KAAK;AAAA,EAClD;AAAA,EAEA,MAAM,wBACJ,WAC2C;AAC3C,QAAI,KAAK,aAAa,SAAS,GAAG;AAChC,YAAM,KAAK,gBAAgB;AAAA,IAC7B;AACA,UAAM,UAAU,KAAK,aAAa,IAAI,SAAS;AAC/C,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,oBAAoB,SAAS,EAAE;AAAA,IACjD;AACA,UAAM,eAAe,MAAM,0BAA0B,KAAK,OAAO,SAAS;AAC1E,WAAO,aAAa;AAAA,MAAO,CAAC,aAC1B,QAAQ,QAAQ,gBAAgB,SAAS,UAAU,SAAS,QAAQ;AAAA,IACtE;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,SAAkD;AACrE,QAAI,KAAK,aAAa,SAAS,GAAG;AAChC,YAAM,KAAK,gBAAgB;AAAA,IAC7B;AACA,QAAI,KAAK,eAAe,SAAS,GAAG;AAClC,YAAM,KAAK,kBAAkB;AAAA,IAC/B;AAEA,UAAM,UAAU,KAAK,aAAa,IAAI,QAAQ,SAAS;AACvD,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,oBAAoB,QAAQ,SAAS,EAAE;AAAA,IACzD;AAEA,UAAM,qBAAqB,QAAQ,aAChC,IAAI,CAAC,OAAO,KAAK,eAAe,IAAI,EAAE,CAAC,EACvC,OAAO,CAAC,UAAuC,QAAQ,KAAK,CAAC,EAC7D,IAAI,CAAC,WAAW,EAAE,IAAI,MAAM,IAAI,WAAW,MAAM,UAAU,EAAE;AAEhE,QAAI,mBAAmB,WAAW,GAAG;AACnC,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,UAAM,oBAAoB,MAAM,KAAK,wBAAwB,QAAQ,SAAS;AAE9E,UAAM,mBAAmB,kBAAkB;AAAA,MACzC,CAAC,KAAK,OACJ,OACC,OAAO,GAAG,SAAS,cAAc,aAC9B,GAAG,SAAS,UAAU,IACtB;AAAA,MACN;AAAA,IACF;AAEA,UAAM,QAAQ,OAAO,WAAW,CAAC;AACjC,UAAM,eAAe;AAAA,MACnB,KAAK,OAAO;AAAA,MACZ,QAAQ;AAAA,MACR;AAAA,IACF;AACA,UAAM,WAAwB;AAAA,MAC5B;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,aAAa,QAAQ,QAAQ,QAAQ;AAAA,MACrC,cAAc,mBAAmB,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,MACtD,UAAU,KAAK,IAAI;AAAA,MACnB,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,MACpB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,QAAQ;AAAA,MACR;AAAA,IACF;AAEA,SAAK,UAAU,IAAI,OAAO,QAAQ;AAClC,UAAM,cAA2B;AAAA,MAC/B,MAAM;AAAA,MACN;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,aAAa,QAAQ,QAAQ,QAAQ;AAAA,MACrC,cAAc,mBAAmB,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,MACtD,gBAAgB;AAAA,MAChB;AAAA,IACF;AACA,UAAMA,QAAO,WAAW,KAAK,aAAa,WAAW,CAAC;AACtD,UAAMA,QAAO;AAAA,MACXC,OAAM,MAAM,KAAK,kBAAkB;AAAA,QACjC;AAAA,QACA;AAAA,QACA,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,UAAM,iBACJ,QAAQ,eAAe,KAAK,OAAO,kBAAkB;AAEvD,UAAMD,QAAO;AAAA,MACXC,OAAM,MAAM,KAAK,UAAU;AAAA,QACzB;AAAA,QACA,WAAW,QAAQ;AAAA,QACnB,SAAS,QAAQ;AAAA,QACjB,YAAY;AAAA,QACZ,WAAW;AAAA,QACX;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,mBACE,UACA,SACY;AACZ,UAAM,QAAQ,EAAE,OAAO,SAAS,OAAO,SAAS;AAChD,SAAK,UAAU,IAAI,KAAK;AACxB,WAAO,MAAM;AACX,WAAK,UAAU,OAAO,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,eAAe,OAAwC;AACrD,WAAO,KAAK,UAAU,IAAI,KAAK;AAAA,EACjC;AAAA,EAEA,qBAAiD;AAC/C,WAAO,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC,EAAE;AAAA,MACzC,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,MAAM,gCAAqE;AACzE,WAAO,8BAA2B,KAAK,MAAM;AAAA,EAC/C;AAAA,EAEA,MAAM,WAA0B;AAC9B,UAAMD,QAAO,WAAW,MAAM,UAAU,KAAK,cAAc,CAAC;AAC5D,UAAMA,QAAO,WAAW,MAAM,UAAU,KAAK,gBAAgB,CAAC;AAC9D,UAAMA,QAAO,WAAWC,OAAM,SAAS,KAAK,QAAQ,CAAC;AACrD,UAAMD,QAAO,WAAWC,OAAM,SAAS,KAAK,gBAAgB,CAAC;AAC7D,UAAMD,QAAO,WAAW,OAAO,SAAS,KAAK,QAAQ,CAAC;AAAA,EACxD;AAAA,EAEQ,wBAAwB;AAC9B,UAAM,OAAO;AACb,WAAOA,QAAO;AAAA,MACZA,QAAO,IAAI,aAAa;AACtB,cAAM,OAAO,OAAOC,OAAM,KAAK,KAAK,QAAQ;AAC5C,eAAOD,QAAO;AAAA,UACZ;AAAA,YACE;AAAA,YACA,KAAK,aAAa,KAAK,IAAI;AAAA,YAC3B,KAAK;AAAA,YACL,KAAK,eAAe,KAAK,IAAI;AAAA,UAC/B;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,eACN,OACA,SACM;AACN,UAAM,WAAW,KAAK,UAAU,IAAI,KAAK;AACzC,QAAI,CAAC,UAAU;AACb;AAAA,IACF;AACA,SAAK,UAAU,IAAI,OAAO,QAAQ,QAAQ,CAAC;AAAA,EAC7C;AAAA,EAEQ,aAAa,OAAuD;AAC1E,WAAOA,QAAO,KAAK,MAAM;AACvB,iBAAW,SAAS,KAAK,WAAW;AAClC,YAAI,MAAM,SAAS,MAAM,UAAU,MAAM,OAAO;AAC9C;AAAA,QACF;AACA,cAAM,SAAS,KAAK;AAAA,MACtB;AAAA,IACF,CAAC,EAAE;AAAA,MACDA,QAAO,QAAQ,MAAM,OAAO,QAAQ,KAAK,UAAU,KAAK,CAAC;AAAA,MACzDA,QAAO;AAAA,IACT;AAAA,EACF;AACF;;;AelXO,SAAS,mBAAmB,MAA+B;AAChE,QAAM,OAAsB;AAAA,IAC1B,MAAM;AAAA,IACN,aAAa,CAAC;AAAA,EAChB;AACA,MAAI,QAAQ;AACZ,MAAI,KAAK,CAAC,MAAM,SAAS,KAAK,CAAC,MAAM,YAAY;AAC/C,SAAK,UAAU,KAAK,CAAC;AACrB,YAAQ;AAAA,EACV;AAEA,SAAO,QAAQ,KAAK,QAAQ,SAAS,GAAG;AACtC,UAAM,QAAQ,KAAK,KAAK;AACxB,QAAI,UAAU,YAAY,UAAU,MAAM;AACxC,WAAK,OAAO;AACZ;AAAA,IACF;AACA,SAAK,UAAU,eAAe,UAAU,oBAAoB,KAAK,QAAQ,CAAC,GAAG;AAC3E,WAAK,cAAc,KAAK,QAAQ,CAAC;AACjC,eAAS;AACT;AAAA,IACF;AACA,SAAK,UAAU,iBAAiB,UAAU,aAAa,KAAK,QAAQ,CAAC,GAAG;AACtE,WAAK,mBAAmB,KAAK,QAAQ,CAAC;AACtC,eAAS;AACT;AAAA,IACF;AACA,SAAK,YAAY,KAAK,KAAK;AAAA,EAC7B;AAEA,SAAO;AACT;AAEO,SAAS,oBAA4B;AAC1C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;;;ACtDA,IAAM,OAAO;AAAA,EACX,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AACR;AAEO,SAAS,cAAoB;AAClC,QAAM,IAAI,CAAC,MAAc,GAAG,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,KAAK;AACtD,QAAM,IAAI,CAAC,MAAc,GAAG,KAAK,GAAG,GAAG,CAAC,GAAG,KAAK,KAAK;AAErD,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,KAAK,EAAE,4RAAiD,CAAC;AAAA,IACzD,KAAK,EAAE,QAAG,CAAC,KAAK,EAAE,eAAe,CAAC,KAAK,EAAE,MAAG,CAAC,KAAK,EAAE,oBAAoB,CAAC,KAAK,EAAE,QAAG,CAAC;AAAA,IACpF,KAAK,EAAE,4RAAiD,CAAC;AAAA,IACzD;AAAA,EACF;AAEA,UAAQ,IAAI,MAAM,KAAK,IAAI,CAAC;AAC9B;;;ACnBA,OAAOU,YAAW;AAClB,SAAS,cAAc;AACvB,SAAS,iBAAiB;AAC1B,SAAS,QAAAD,OAAM,OAAO,WAAAN,gBAAe;;;ACFrC,SAAgB,WAAW,gBAAgB;AAC3C,SAAS,OAAAQ,MAAK,QAAAC,aAAY;;;ACA1B,SAAS,KAAK,YAAY;AAItB,SACE,KADF;AAFG,SAAS,SAA0B;AACxC,SACE,qBAAC,OAAI,aAAY,SAAQ,aAAY,QAAO,UAAU,GAAG,UAAU,GACjE;AAAA,wBAAC,QAAK,OAAM,QAAO,2BAAa;AAAA,IAChC,oBAAC,QAAK,OAAM,QAAO,oBAAG;AAAA,IACtB,oBAAC,QAAK,OAAM,QAAO,gCAAkB;AAAA,KACvC;AAEJ;;;ADiEM,SACE,OAAAC,MADF,QAAAC,aAAA;AAhEC,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF,GAAuC;AACrC,QAAM,CAAC,QAAQ,SAAS,IAAI,SAIlB,IAAI;AACd,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAuB,IAAI;AAErD,YAAU,MAAM;AACd,QAAI,YAAY;AAEhB,mBAAe,MAAM;AACnB,YAAM,UAAU,MAAM,OAAO,qBAAqB,WAAW;AAC7D,UAAI,CAAC,SAAS;AACZ,iBAAS,IAAI,MAAM,YAAY,WAAW,cAAc,CAAC;AACzD,mBAAW,IAAI,MAAM,YAAY,WAAW,cAAc,CAAC;AAC3D;AAAA,MACF;AAEA,YAAM,EAAE,WAAAC,WAAU,IAAI,MAAM,OAAO,aAAkB;AACrD,YAAM,EAAE,MAAAN,OAAM,OAAAO,QAAO,SAAAb,SAAQ,IAAI,MAAM,OAAO,MAAW;AAEzD,YAAM,YAAY,MAAM,OAAO,wBAAwB,QAAQ,EAAE;AACjE,YAAM,UAAU,UAAU,IAAI,CAAC,SAAS;AACtC,cAAM,KAAK,KAAK;AAChB,eAAO;AAAA,UACL,MAAM,KAAK,SAAS,QAAQ;AAAA,UAC5B,OAAO,KAAK,SAAS,SAAS;AAAA,UAC9B,QAAQ,OAAO,GAAG,cAAc,aAAa,GAAG,UAAU,IAAI;AAAA,QAChE;AAAA,MACF,CAAC;AAED,YAAM,sBAAsBA,SAAQ,QAAQ,IAAI,GAAG,QAAQ,QAAQ;AACnE,YAAM,SAASa,OAAM,mBAAmB;AACxC,YAAM,aAAaP,MAAK,OAAO,KAAK,GAAG,OAAO,IAAI,aAAa;AAE/D,YAAMM;AAAA,QACJ;AAAA,QACA,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA;AAAA,QACnC;AAAA,MACF;AAEA,UAAI,CAAC,WAAW;AACd,kBAAU;AAAA,UACR,OAAO,QAAQ;AAAA,UACf,aAAa,QAAQ,QAAQ,QAAQ;AAAA,UACrC;AAAA,QACF,CAAC;AACD,mBAAW,MAAM,WAAW,GAAG,GAAG;AAAA,MACpC;AAAA,IACF;AAEA,SAAK,IAAI;AACT,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,QAAQ,aAAa,UAAU,CAAC;AAEpC,MAAI,OAAO;AACT,WACE,gBAAAD,MAACH,MAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,sBAAAE,KAAC,UAAO;AAAA,MACR,gBAAAA,KAACD,OAAA,EAAK,OAAM,OAAO,gBAAM,SAAQ;AAAA,OACnC;AAAA,EAEJ;AAEA,SACE,gBAAAE,MAACH,MAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,oBAAAE,KAACF,MAAA,EAAI,cAAc,GACjB,0BAAAE,KAAC,UAAO,GACV;AAAA,IACC,UACC,gBAAAC,MAACH,MAAA,EAAI,eAAc,UACjB;AAAA,sBAAAG,MAACF,OAAA,EAAK,OAAM,SAAQ;AAAA;AAAA,QACP,OAAO;AAAA,QAAM;AAAA,QAA0B,OAAO;AAAA,QAAY;AAAA,SACvE;AAAA,MACA,gBAAAE,MAACF,OAAA,EAAK,OAAM,QAAO;AAAA;AAAA,QAAO,OAAO;AAAA,SAAW;AAAA,OAC9C;AAAA,KAEJ;AAEJ;;;ADrFA,SAASK,YAAW,UAAkD;AACpE,MAAI,OAAO,SAAS,cAAc,YAAY;AAC5C,WAAO;AAAA,EACT;AACA,SAAO,SAAS,UAAU;AAC5B;AAEA,SAAS,iBAAiB,iBAAiC;AACzD,QAAM,SAAS,MAAM,eAAe;AACpC,SAAOR,MAAK,OAAO,KAAK,GAAG,OAAO,IAAI,aAAa;AACrD;AAEA,eAAsB,gCACpB,QACA,aACe;AACf,QAAM,UAAU,MAAM,OAAO,qBAAqB,WAAW;AAC7D,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,YAAY,WAAW,cAAc;AAAA,EACvD;AAEA,QAAM,YAAY,MAAM,OAAO,wBAAwB,QAAQ,EAAE;AACjE,QAAM,UAAkC,UAAU,IAAI,CAAC,UAAU;AAAA,IAC/D,MAAM,KAAK,SAAS,QAAQ;AAAA,IAC5B,OAAO,KAAK,SAAS,SAAS;AAAA,IAC9B,QAAQQ,YAAW,KAAK,QAAQ;AAAA,EAClC,EAAE;AAEF,QAAM,sBAAsBd,SAAQ,QAAQ,IAAI,GAAG,QAAQ,QAAQ;AACnE,QAAM,aAAa,iBAAiB,mBAAmB;AAEvD,QAAM,UAAU,YAAY,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAE3E,UAAQ,IAAI,aAAa,QAAQ,MAAM,4BAA4B,QAAQ,QAAQ,QAAQ,CAAC,IAAI;AAChG,UAAQ,IAAI,SAAS,UAAU,EAAE;AACnC;AAEA,eAAsB,8BACpB,QACA,aACe;AACf,SAAO,IAAI,QAAc,CAACA,UAAS,WAAW;AAC5C,UAAM,MAAM;AAAA,MACVO,OAAM,cAAc,cAAc;AAAA,QAChC;AAAA,QACA;AAAA,QACA,YAAY,CAAC,QAAQ;AACnB,cAAI,QAAQ;AACZ,cAAI,KAAK;AACP,mBAAO,GAAG;AAAA,UACZ,OAAO;AACL,YAAAP,SAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;;;AGvEA,OAAOO,YAAW;AAClB,SAAS,UAAAQ,eAAc;;;ACAvB,SAAgB,aAAa,aAAAC,YAAW,YAAAC,iBAAgB;AACxD,SAAS,OAAAT,MAAK,QAAAC,aAAY;;;ACA1B,SAAS,QAAAA,aAAY;AAwCf,SAGE,UAHF,OAAAC,MAGE,QAAAC,aAHF;AAxBN,SAAS,SAAS,KAAqD;AACrE,MAAI,OAAO;AAAI,WAAO;AACtB,MAAI,OAAO;AAAI,WAAO;AACtB,SAAO;AACT;AAEO,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA,MAAM;AAAA,EACN,aAAa;AAAA,EACb,WAAW;AAAA,EACX,SAAS,CAAC,MAAM,OAAO,CAAC;AAAA,EACxB,eAAe;AACjB,GAAkC;AAChC,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC;AAChD,QAAM,MAAM,MAAM,IAAK,UAAU,MAAO,MAAM;AAC9C,QAAM,SAAS,KAAK,MAAO,UAAU,MAAO,QAAQ;AACpD,QAAM,YAAY,SAAI,OAAO,MAAM;AACnC,QAAM,WAAW,SAAI,OAAO,KAAK,IAAI,GAAG,WAAW,MAAM,CAAC;AAC1D,QAAM,QAAQ,eAAe,SAAS,GAAG,IAAI;AAE7C,SACE,gBAAAA,MAACF,OAAA,EACC;AAAA,oBAAAC,KAACD,OAAA,EAAK,OAAM,QAAQ,gBAAM,OAAO,UAAU,GAAE;AAAA,IAC5C;AAAA,IACA,QACC,gBAAAE,MAAA,YACE;AAAA,sBAAAD,KAACD,OAAA,EAAK,OAAe,qBAAU;AAAA,MAC/B,gBAAAC,KAACD,OAAA,EAAK,OAAM,QAAQ,oBAAS;AAAA,OAC/B,IAEA,YAAY;AAAA,IAEb;AAAA,IACD,gBAAAC,KAACD,OAAA,EAAK,OAAO,SAAS,SAAS,MAAI,MAAE,iBAAO,KAAK,GAAE;AAAA,KACrD;AAEJ;;;ACvDA,SAAgB,aAAAO,YAAW,YAAAC,iBAAgB;AAC3C,SAAS,QAAAR,aAAY;AAmBjB,iBAAAE,aAAA;AAjBJ,IAAM,SAAS,CAAC,UAAK,UAAK,UAAK,UAAK,UAAK,QAAG;AAMrC,SAAS,QAAQ,EAAE,QAAQ,UAAU,GAAkC;AAC5E,QAAM,CAAC,OAAO,QAAQ,IAAIM,UAAS,CAAC;AAEpC,EAAAD,WAAU,MAAM;AACd,UAAM,QAAQ,YAAY,MAAM;AAC9B,eAAS,CAAC,OAAO,IAAI,KAAK,OAAO,MAAM;AAAA,IACzC,GAAG,GAAG;AACN,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC,GAAG,CAAC,CAAC;AAEL,SACE,gBAAAL,MAACF,OAAA,EAAK,OAAM,QACT;AAAA,WAAO,KAAK;AAAA,IAAE;AAAA,IAAE;AAAA,KACnB;AAEJ;;;AF8VQ,SAiOY,YAAAS,WAjOZ,OAAAR,MAMI,QAAAC,aANJ;AApTR,SAAS,aAAa,KAAa,OAAe,GAA+B;AAC/E,MAAI,IAAI;AAAG,WAAO;AAClB,QAAM,OAAO,MAAM;AACnB,QAAM,YAAY,QAAQ,IAAI,OAAO,SAAS,IAAI;AAClD,SAAO,WAAW,IAAI,KAAK,KAAK,QAAQ,IAAI;AAC9C;AAEA,SAAS,WAAW,OAA2C;AAC7D,MAAI,SAAS;AAAI,WAAO;AACxB,MAAI,SAAS;AAAI,WAAO;AACxB,SAAO;AACT;AAEA,SAAS,UAAU,OAAe,MAAM,KAAK,QAAQ,IAAY;AAC/D,QAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC;AAC7C,QAAM,SAAS,KAAK,MAAO,OAAO,MAAO,KAAK;AAC9C,SAAO,SAAI,OAAO,MAAM,IAAI,SAAI,OAAO,QAAQ,MAAM;AACvD;AAEA,SAAS,yBACP,QACA,UACqB;AACrB,MAAI,OAAO,WAAW;AAAG,WAAO,CAAC;AACjC,QAAM,eAAe,IAAI;AAAA,IACvB,OAAO,QAAQ,CAAC,MAAM,EAAE,gBAAgB,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;AAAA,EACnE;AACA,QAAM,SAA8B,CAAC;AACrC,aAAW,eAAe,cAAc;AACtC,UAAM,iBAAiB,oBAAI,IAAyB;AACpD,UAAM,kBAAkB,oBAAI,IAG1B;AACF,eAAW,MAAM,QAAQ;AACvB,YAAM,KAAK,GAAG,gBAAgB,KAAK,CAAC,MAAM,EAAE,gBAAgB,WAAW;AACvE,iBAAW,KAAK,IAAI,UAAU,CAAC,GAAG;AAChC,cAAM,OAAO,eAAe,IAAI,EAAE,EAAE,KAAK,CAAC;AAC1C,aAAK,KAAK,CAAC;AACX,uBAAe,IAAI,EAAE,IAAI,IAAI;AAAA,MAC/B;AACA,iBAAW,KAAK,IAAI,WAAW,CAAC,GAAG;AACjC,cAAM,OAAO,gBAAgB,IAAI,EAAE,EAAE,KAAK,CAAC;AAC3C,aAAK,KAAK,CAAC;AACX,wBAAgB,IAAI,EAAE,IAAI,IAAI;AAAA,MAChC;AAAA,IACF;AACA,UAAM,mBAAgC,CAAC;AACvC,eAAW,SAAS,eAAe,OAAO,GAAG;AAC3C,YAAM,MAAM,oBAAoB,KAAK;AACrC,UAAI;AAAK,yBAAiB,KAAK,GAAG;AAAA,IACpC;AACA,UAAM,oBAAoB,MAAM,KAAK,gBAAgB,QAAQ,CAAC,EAC3D,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,qBAAqB,KAAK,CAAC,EAChD,OAAO,CAAC,MAA0C,MAAM,MAAS;AACpE,UAAM,SAAS,OAAO,MAAM,CAAC,OAAO;AAClC,YAAM,KAAK,GAAG,gBAAgB,KAAK,CAAC,MAAM,EAAE,gBAAgB,WAAW;AACvE,aAAO,IAAI,UAAU;AAAA,IACvB,CAAC;AACD,UAAM,YAAY,OAAO,OAAO,SAAS,CAAC;AAC1C,UAAM,SAAS,WAAW,gBAAgB;AAAA,MACxC,CAAC,MAAM,EAAE,gBAAgB;AAAA,IAC3B;AACA,WAAO,KAAK;AAAA,MACV;AAAA,MACA,eAAe,SAAS,IAAI,WAAW,KAAK;AAAA,MAC5C,QAAQ;AAAA,MACR;AAAA,MACA,SAAS,kBAAkB,SAAS,IAAI,oBAAoB;AAAA,MAC5D,MAAM,QAAQ;AAAA,IAChB,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,gBACP,MACAQ,eACA,SACQ;AACR,QAAM,MAAM,aAAa,KAAK,EAAE;AAChC,MAAI,CAAC,KAAK;AACR,UAAM,UAAU,eAAe,KAAK,IAAI;AACxC,WAAO,YAAY,SAAY,GAAG,QAAQ,QAAQ,CAAC,CAAC,KAAK;AAAA,EAC3D;AACA,QAAM,YAAY,IAAI,OAAO,KAAK,MAAM,OAAO;AAC/C,MAAI,IAAI,oBAAoB,OAAO;AACjC,UAAM,UACJ,OAAO,KAAK,SAAS,YACrB,KAAK,SAAS,QACd,WAAW,KAAK,OACX,KAAK,KAA4B,QAClC,eAAe,KAAK,IAAI;AAC9B,QAAI,OAAO,YAAY,YAAY,OAAO,SAAS,OAAO,GAAG;AAC3D,aAAO,GAAG,SAAS,IAAI,UAAU,OAAO,CAAC;AAAA,IAC3C;AAAA,EACF;AACA,SAAO;AACT;AASO,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkC;AAChC,QAAM,CAAC,OAAO,QAAQ,IAAIF;AAAA,IACxB;AAAA,EACF;AACA,QAAM,CAAC,SAAS,UAAU,IAAIA,UAKpB,IAAI;AACd,QAAM,CAAC,WAAW,YAAY,IAAIA,UAA4B,CAAC,CAAC;AAChE,QAAM,CAAC,sBAAsB,uBAAuB,IAAIA,UAAS,CAAC;AAClE,QAAM,CAAC,SAAS,UAAU,IAAIA,UASpB,IAAI;AACd,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAEhD,oBAAI,IAAI,CAAC;AAEX,QAAM,UAAU,YAAY,YAAY;AACtC,UAAM,UAAU,MAAM,OAAO,qBAAqB,WAAW;AAC7D,QAAI,CAAC,SAAS;AACZ,YAAM,QAAQ,MAAM,OAAO,gBAAgB;AAC3C,YAAM,YAAY,MAAM,IAAI,CAAC,SAAS,KAAK,QAAQ,QAAQ,CAAC,EAAE,KAAK;AACnE;AAAA,QACE,IAAI;AAAA,UACF,UAAU,SAAS,IACf,YAAY,WAAW,2BAA2B,UAAU,KAAK,IAAI,CAAC,KACtE,YAAY,WAAW;AAAA,QAC7B;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,aACJ,MAAM,OAAO,+BAA+B,gBAAgB;AAC9D,QAAI,WAAW,WAAW,GAAG;AAC3B,YAAM,QAAQ,MAAM,OAAO,kBAAkB;AAC7C,YAAM,YAAY,MACf,IAAI,CAAC,SAAS,KAAK,UAAU,QAAQ,CAAC,EACtC,OAAO,CAAC,SAAyB,OAAO,SAAS,QAAQ,EACzD,KAAK;AACR;AAAA,QACE,IAAI;AAAA,UACF,UAAU,SAAS,IACf,yBAAyB,gBAAgB,iBAAiB,UAAU,KAAK,IAAI,CAAC,KAC9E,yBAAyB,gBAAgB;AAAA,QAC/C;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,WAAW,IAAI;AAAA,MACnB,WAAW,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,KAAK,UAAU,QAAQ,KAAK,KAAK,EAAE,CAAC;AAAA,IACzE;AACA,yBAAqB,QAAQ;AAE7B,UAAM,aAAa,oBAAI,IAAgC;AACvD,QAAI,oBAAoB;AACxB,QAAI,oBAAoB;AACxB,QAAI,oBAAoB;AAExB,UAAM,OAAO,IAAI,QAAqB,CAACjB,aAAY;AACjD,YAAM,cAAc,OAAO,mBAAmB,CAAC,UAAU;AACvD,YAAI,MAAM,SAAS,oBAAoB;AACrC,gBAAM,gBAAgB,MAAM,gBACzB,IAAI,CAAC,SAAS,yBAAyB,KAAK,MAAM,CAAC,EACnD,OAAO,CAAC,SAAyB,SAAS,MAAS;AACtD,gBAAM,eACJ,cAAc,SAAS,IACnB,cAAc,OAAO,CAAC,KAAK,MAAM,MAAM,GAAG,CAAC,IAC3C,cAAc,SACd;AAEN,qBAAW,QAAQ,MAAM,iBAAiB;AACxC,kBAAM,UAAU,yBAAyB,KAAK,MAAM;AACpD,gBAAI,YAAY,QAAW;AACzB,oBAAM,UAAU,WAAW,IAAI,KAAK,WAAW,KAAK;AAAA,gBAClD,OAAO;AAAA,gBACP,OAAO;AAAA,gBACP,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,QAAQ;AAAA,cACV;AACA,yBAAW,IAAI,KAAK,aAAa;AAAA,gBAC/B,OAAO,QAAQ,QAAQ;AAAA,gBACvB,OAAO,QAAQ,QAAQ,UAAU;AAAA,gBACjC,OAAO,QAAQ,QAAQ;AAAA,gBACvB,QAAQ,QAAQ,UAAU,KAAK,SAAS,IAAI;AAAA,gBAC5C,QAAQ,QAAQ,UAAU,KAAK,SAAS,IAAI;AAAA,cAC9C,CAAC;AACD,mCAAqB;AACrB,mCAAqB,UAAU;AAC/B,mCAAqB;AAAA,YACvB;AAAA,UACF;AAEA,uBAAa,CAAC,SAAS;AACrB,kBAAM,OAAO,IAAI,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,YAAY,EAAE,CAAC,CAAC;AAC1D,kBAAM,WAAW,KAAK,IAAI,MAAM,UAAU;AAC1C,kBAAM,WAAW;AAAA,cACf,iBAAiB,MAAM,gBAAgB,IAAI,CAAC,UAAU;AAAA,gBACpD,aAAa,KAAK;AAAA,gBAClB,eACE,SAAS,IAAI,KAAK,WAAW,KAAK,KAAK;AAAA,gBACzC,QAAQ,KAAK;AAAA,gBACb,QAAQ,KAAK;AAAA,gBACb,SAAS,KAAK;AAAA,gBACd,MAAM,KAAK;AAAA,cACb,EAAE;AAAA,cACF,QAAQ,MAAM;AAAA,cACd,YAAY,MAAM;AAAA,YACpB;AACA,kBAAM,SAAS,WACX,CAAC,GAAG,SAAS,QAAQ,QAAQ,IAC7B,CAAC,QAAQ;AACb,kBAAM,eAAe,OAAO,SAAS;AAErC,kBAAM,4BAA4B;AAAA,cAChC;AAAA,cACA;AAAA,YACF;AAEA,kBAAM,SAA0B;AAAA,cAC9B,MAAM,MAAM;AAAA,cACZ,YAAY,MAAM;AAAA,cAClB,oBAAoB,MAAM;AAAA,cAC1B,gBAAgB,MAAM;AAAA,cACtB,YAAY,MAAM;AAAA,cAClB,YAAY,MAAM;AAAA,cAClB,YAAY,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,YAAY,CAAC;AAAA,cACvD,QAAQ,OAAO,MAAM,CAAC,MAAM,EAAE,MAAM;AAAA,cACpC;AAAA,cACA;AAAA,cACA;AAAA,YACF;AACA,iBAAK,IAAI,MAAM,YAAY,MAAM;AACjC,oCAAwB,MAAM,kBAAkB;AAChD,mBAAO,MAAM,KAAK,KAAK,OAAO,CAAC;AAAA,UACjC,CAAC;AAAA,QACH;AACA,YAAI,MAAM,SAAS,kBAAkB,MAAM,SAAS,aAAa;AAC/D,sBAAY;AACZ,UAAAA,SAAQ,KAAK;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,UAAM,WAAW,MAAM,OAAO,eAAe;AAAA,MAC3C,WAAW,QAAQ;AAAA,MACnB,cAAc,WAAW,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,IAChD,CAAC;AAED,eAAW;AAAA,MACT,OAAO,SAAS;AAAA,MAChB,aAAa,SAAS;AAAA,MACtB,gBAAgB,WAAW,IAAI,CAAC,MAAM,EAAE,UAAU,QAAQ,KAAK,EAAE,EAAE;AAAA,MACnE,gBAAgB,SAAS;AAAA,IAC3B,CAAC;AACD,aAAS,SAAS;AAElB,UAAM,aAAa,MAAM;AAEzB,QAAI,WAAW,SAAS,aAAa;AACnC,iBAAW,IAAI,MAAM,eAAe,WAAW,YAAY,EAAE,CAAC;AAC9D;AAAA,IACF;AAEA,eAAW;AAAA,MACT,iBAAiB,WAAW;AAAA,MAC5B,iBAAiB,WAAW;AAAA,MAC5B,gBAAgB,WAAW;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,IAAI,IAAI,UAAU;AAAA,MAC9B,cAAc,WAAW;AAAA,IAC3B,CAAC;AACD,aAAS,WAAW;AACpB,eAAW,MAAM,WAAW,GAAG,GAAG;AAAA,EACpC,GAAG,CAAC,QAAQ,aAAa,kBAAkB,UAAU,CAAC;AAEtD,EAAAgB,WAAU,MAAM;AACd,SAAK,QAAQ;AAAA,EACf,GAAG,CAAC,OAAO,CAAC;AAEZ,SACE,gBAAAL,MAACH,MAAA,EAAI,eAAc,UAAS,SAAS,GACnC;AAAA,oBAAAE,KAACF,MAAA,EAAI,cAAc,GACjB,0BAAAE,KAAC,UAAO,GACV;AAAA,IAEC,WACC,gBAAAC,MAACH,MAAA,EAAI,eAAc,UAAS,cAAc,GACxC;AAAA,sBAAAG,MAACF,OAAA,EACC;AAAA,wBAAAE,MAACF,OAAA,EAAK,OAAM,QAAO,MAAI,MAAC;AAAA;AAAA,UAClB;AAAA,WACN;AAAA,QACA,gBAAAC,KAACD,OAAA,EAAK,OAAM,QAAQ,kBAAQ,OAAM;AAAA,SACpC;AAAA,MACA,gBAAAE,MAACF,OAAA,EACC;AAAA,wBAAAE,MAACF,OAAA,EAAK,OAAM,QAAO,MAAI,MAAC;AAAA;AAAA,UACd;AAAA,WACV;AAAA,QACC,QAAQ;AAAA,SACX;AAAA,MACA,gBAAAE,MAACF,OAAA,EACC;AAAA,wBAAAE,MAACF,OAAA,EAAK,OAAM,QAAO,MAAI,MAAC;AAAA;AAAA,UACX;AAAA,WACb;AAAA,QACC,QAAQ,eAAe,KAAK,IAAI;AAAA,SACnC;AAAA,MACA,gBAAAE,MAACF,OAAA,EACC;AAAA,wBAAAE,MAACF,OAAA,EAAK,OAAM,QAAO,MAAI,MAAC;AAAA;AAAA,UACX;AAAA,WACb;AAAA,QACC,QAAQ;AAAA,SACX;AAAA,OACF;AAAA,IAGD,UAAU,aACT,gBAAAC,KAACF,MAAA,EAAI,cAAc,GACjB,0BAAAE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,eAAe,oBAAoB,IAAI,SAAS,kBAAkB,CAAC;AAAA;AAAA,IAC5E,GACF;AAAA,IAGD,UAAU,SAAS,KAClB,gBAAAA,KAACF,MAAA,EAAI,eAAc,UAAS,cAAc,GACvC,oBAAU,IAAI,CAAC,OACd,gBAAAG,MAACH,MAAA,EAAwB,eAAc,UAAS,cAAc,GAC5D;AAAA,sBAAAG,MAACF,OAAA,EACC;AAAA,wBAAAE,MAACF,OAAA,EAAK,OAAM,QAAO;AAAA;AAAA,UACf,GAAG;AAAA,UAAmB;AAAA,UAAE,GAAG;AAAA,UAAe;AAAA,WAC9C;AAAA,QAAQ;AAAA,QACP,GAAG;AAAA,QAAM;AAAA,QACV,gBAAAE,MAACF,OAAA,EAAK,OAAM,QAAO;AAAA;AAAA,UACf,GAAG;AAAA,UAAW;AAAA,UAAE,GAAG;AAAA,UAAW;AAAA,WAClC;AAAA,QACA,gBAAAE,MAACF,OAAA,EAAK,OAAM,QAAO;AAAA;AAAA,UAAG,GAAG;AAAA,UAAW;AAAA,WAAG;AAAA,SACzC;AAAA,MACC,GAAG,0BAA0B,IAAI,CAAC,SACjC,gBAAAE;AAAA,QAACH;AAAA,QAAA;AAAA,UAEC,eAAc;AAAA,UACd,YAAY;AAAA,UAEZ;AAAA,4BAAAG,MAACF,OAAA,EACE;AAAA,mBAAK;AAAA,cAAc;AAAA,cAAE;AAAA,cACtB,gBAAAC,KAACD,OAAA,EAAK,OAAO,KAAK,SAAS,UAAU,OAAO,MAAI,MAC7C,eAAK,SAAS,SAAS,QAC1B;AAAA,cAAQ;AAAA,cACP,KAAK,OAAO,IAAI,CAAC,MAChB,gBAAAE;AAAA,gBAACF;AAAA,gBAAA;AAAA,kBAEC,OAAO,WAAW,eAAe,EAAE,IAAI,KAAK,CAAC;AAAA,kBAE5C;AAAA,oCAAgB,GAAG,YAAY;AAAA,sBAC9B,cAAc,GAAG;AAAA,oBACnB,CAAC;AAAA,oBAAG;AAAA;AAAA;AAAA,gBALC,EAAE;AAAA,cAMT,CACD;AAAA,cACA,KAAK,SAAS,IAAI,CAAC,MAAM;AACxB,sBAAM,MAAM,cAAc,EAAE,EAAE;AAC9B,oBAAI,CAAC;AAAK,yBAAO;AACjB,sBAAM,YAAY,IAAI,OAAO,EAAE,MAAM;AAAA,kBACnC,cAAc,GAAG;AAAA,gBACnB,CAAC;AACD,uBACE,gBAAAE,MAACF,OAAA,EAAgB,OAAM,QAAO;AAAA;AAAA,kBAC1B,IAAI,OAAO,GAAG,IAAI,IAAI,OAAO;AAAA,kBAC9B;AAAA,kBAAU;AAAA,kBAAE;AAAA,qBAFJ,EAAE,EAGb;AAAA,cAEJ,CAAC;AAAA,eACH;AAAA,YACC,CAAC,KAAK,UAAU,KAAK,QAAQ,KAAK,KAAK,SAAS,KAC/C,gBAAAC,KAACF,MAAA,EAAI,YAAY,GAAG,eAAc,UAC/B,eAAK,KAAK;AAAA,cAAI,CAAC,KAAK,WACnB,IAAI,SAAS,SACX,gBAAAE,KAACF,MAAA,EAAiB,eAAc,UAC7B,uBAAa,GAAG,EAAE;AAAA,gBACjB,CAAC,EAAE,MAAM,KAAK,GAAG,YACf,gBAAAE;AAAA,kBAACD;AAAA,kBAAA;AAAA,oBAEC,OACE,SAAS,WACL,QACA,SAAS,QACP,UACA;AAAA,oBAGP;AAAA;AAAA,kBATI;AAAA,gBAUP;AAAA,cAEJ,KAhBQ,MAiBV,IACE;AAAA,YACN,GACF;AAAA;AAAA;AAAA,QAzDG,KAAK;AAAA,MA2DZ,CACD;AAAA,SAzEO,GAAG,UA0Eb,CACD,GACH;AAAA,IAGD,UAAU,eAAe,WACxB,gBAAAE,MAACH,MAAA,EAAI,eAAc,UACjB;AAAA,sBAAAE,KAACD,OAAA,EAAK,OAAM,QAAO,MAAI,MAAC,yBAExB;AAAA,MACA,gBAAAE,MAACH,MAAA,EAAI,WAAW,GACd;AAAA,wBAAAE,KAACD,OAAA,EAAK,OAAM,SAAQ,oBAAM;AAAA,QAC1B,gBAAAE,MAACF,OAAA,EACE;AAAA;AAAA,UACA,QAAQ;AAAA,UAAgB;AAAA,UAAE,QAAQ;AAAA,WACrC;AAAA,SACF;AAAA,MACA,gBAAAE,MAACH,MAAA,EACC;AAAA,wBAAAE,KAACD,OAAA,EAAK,OAAO,QAAQ,kBAAkB,IAAI,QAAQ,QAAQ,oBAE3D;AAAA,QACA,gBAAAE,MAACF,OAAA,EACE;AAAA;AAAA,UACA,QAAQ;AAAA,UAAgB;AAAA,UAAE,QAAQ;AAAA,WACrC;AAAA,SACF;AAAA,MACC,QAAQ,oBAAoB,KAC3B,gBAAAC,KAACF,MAAA,EAAI,WAAW,GACd,0BAAAE;AAAA,QAAC;AAAA;AAAA,UACC,OAAM;AAAA,UACN,OAAO,QAAQ,oBAAoB,QAAQ;AAAA,UAC3C,UAAU;AAAA,UACV,QAAQ,CAAC,MAAM;AACb,kBAAM,KAAK;AAAA,cACT,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,QAAQ;AAAA,YACV;AACA,mBAAO,OAAO,SACV,GAAG,EAAE,QAAQ,CAAC,CAAC,SAAM,GAAG,QAAQ,CAAC,CAAC,KAClC,EAAE,QAAQ,CAAC;AAAA,UACjB;AAAA;AAAA,MACF,GACF;AAAA,MAEF,gBAAAC,MAACH,MAAA,EAAI,WAAW,GAAG,eAAc,UAC/B;AAAA,wBAAAE,KAACD,OAAA,EAAK,OAAM,WAAU,gCAAkB;AAAA,QACvC,MAAM,KAAK,kBAAkB,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM;AAC3D,gBAAM,MAAM,QAAQ,WAAW,IAAI,EAAE;AACrC,cAAI,CAAC,OAAO,IAAI,UAAU,GAAG;AAC3B,mBACE,gBAAAE,MAACF,OAAA,EAAc,OAAM,QAAO;AAAA;AAAA,cACvB,KAAK,OAAO,EAAE;AAAA,cAAE;AAAA,iBADV,EAEX;AAAA,UAEJ;AACA,gBAAM,OAAO,IAAI,QAAQ,IAAI;AAC7B,gBAAM,KAAK,aAAa,IAAI,OAAO,IAAI,OAAO,IAAI,KAAK;AACvD,gBAAM,UACJ,OAAO,SACH,GAAG,KAAK,QAAQ,CAAC,CAAC,SAAM,GAAG,QAAQ,CAAC,CAAC,KACrC,KAAK,QAAQ,CAAC;AACpB,iBACE,gBAAAE,MAACF,OAAA,EAAc;AAAA;AAAA,YACV,KAAK,OAAO,EAAE;AAAA,YAAE;AAAA,YACnB,gBAAAC,KAACD,OAAA,EAAK,OAAO,WAAW,IAAI,GAAI,mBAAQ;AAAA,YAAQ;AAAA,YAAI;AAAA,YAEnD,IAAI;AAAA,YAAO;AAAA,YAAS,IAAI;AAAA,eAJhB,EAKX;AAAA,QAEJ,CAAC;AAAA,SACH;AAAA,MACA,gBAAAE,MAACH,MAAA,EAAI,WAAW,GAAG,eAAc,UAC/B;AAAA,wBAAAE,KAACD,OAAA,EAAK,OAAM,WAAU,8BAAgB;AAAA,QACrC,UAAU,IAAI,CAAC,OAAO;AACrB,gBAAM,YAAY,GAAG,OAAO;AAAA,YAAQ,CAAC,OACnC,GAAG,gBACA,IAAI,CAAC,OAAO,yBAAyB,GAAG,MAAM,CAAC,EAC/C,OAAO,CAAC,MAAmB,MAAM,MAAS;AAAA,UAC/C;AACA,gBAAM,eACJ,UAAU,SAAS,IACf,UAAU,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,UAAU,SACjD;AACN,gBAAM,QACJ,UAAU,SAAS,IACf,UAAU,OAAO,CAAC,GAAG,MAAM,IAAI,IAAI,GAAG,CAAC,IACvC;AACN,gBAAM,QAAQ,UAAU,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AACjD,gBAAM,WAAW,aAAa,OAAO,OAAO,UAAU,MAAM;AAC5D,gBAAM,aAAa,GAAG,0BAA0B,CAAC,GAAG,OAAO,CAAC;AAC5D,gBAAM,aACJ,cAAc,GAAG,eACb,gBAAgB,YAAY,YAAY;AAAA,YACtC,cAAc;AAAA,UAChB,CAAC,IACD,iBAAiB,SACf,aAAa,UAAa,GAAG,eAC3B,GAAG,aAAa,QAAQ,CAAC,CAAC,SAAM,SAAS,QAAQ,CAAC,CAAC,KACnD,aAAa,QAAQ,CAAC,IACxB;AACR,iBACE,gBAAAE,MAACH,MAAA,EACC;AAAA,4BAAAE,KAACD,OAAA,EAAK,OAAO,GAAG,SAAS,UAAU,OAChC,aAAG,SAAS,SAAS,QACxB;AAAA,YACA,gBAAAE,MAACF,OAAA,EAAK;AAAA;AAAA,cAAE,GAAG,KAAK,OAAO,EAAE;AAAA,eAAE;AAAA,YAC1B,iBAAiB,SAChB,gBAAAE,MAAAO,WAAA,EACE;AAAA,8BAAAP,MAACF,OAAA,EAAK,OAAO,WAAW,YAAY,GAAG;AAAA;AAAA,gBAC9B;AAAA,iBACT;AAAA,cACA,gBAAAE,MAACF,OAAA,EAAK,OAAM,QACT;AAAA;AAAA,gBACA,UAAU,cAAc,KAAK,EAAE;AAAA,iBAClC;AAAA,eACF,IAEA,gBAAAC,KAACD,OAAA,EAAK,OAAM,QAAO,uBAAS;AAAA,YAE9B,gBAAAE,MAACF,OAAA,EAAK,OAAM,QAAO;AAAA;AAAA,cAAG,GAAG;AAAA,cAAW;AAAA,eAAG;AAAA,eAlB/B,GAAG,UAmBb;AAAA,QAEJ,CAAC;AAAA,SACH;AAAA,MACA,gBAAAC,KAACF,MAAA,EAAI,WAAW,GACd,0BAAAG,MAACF,OAAA,EAAK,OAAM,QAAO;AAAA;AAAA,QAAW,QAAQ;AAAA,SAAa,GACrD;AAAA,OACF;AAAA,KAEJ;AAEJ;;;AD3lBA,SAASW,cAAa,KAAa,OAAe,GAA+B;AAC/E,MAAI,IAAI;AAAG,WAAO;AAClB,QAAM,OAAO,MAAM;AACnB,QAAM,YAAY,QAAQ,IAAI,OAAO,SAAS,IAAI;AAClD,SAAO,WAAW,IAAI,KAAK,KAAK,QAAQ,IAAI;AAC9C;AA2BA,SAAS,uBACP,MACwB;AACxB,QAAM,YAAoC,CAAC;AAC3C,aAAW,EAAE,MAAM,OAAO,KAAK,KAAK,OAAO,GAAG;AAC5C,UAAM,SAAS,OAAO,MAAM,CAAC,MAAM,EAAE,MAAM;AAC3C,UAAM,aAAa,OAAO,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,YAAY,CAAC;AAClE,UAAM,eAAe,OAAO,SAAS;AACrC,UAAM,YAAY,OAAO;AAAA,MAAQ,CAAC,OAChC,GAAG,gBACA,IAAI,CAAC,OAAO,yBAAyB,GAAG,MAAM,CAAC,EAC/C,OAAO,CAAC,MAAmB,MAAM,MAAS;AAAA,IAC/C;AACA,UAAM,eACJ,UAAU,SAAS,IACf,UAAU,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,UAAU,SACjD;AACN,UAAM,QACJ,UAAU,SAAS,IAAI,UAAU,OAAO,CAAC,GAAG,MAAM,IAAI,IAAI,GAAG,CAAC,IAAI;AACpE,UAAM,QAAQ,UAAU,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AACjD,UAAM,SAASA,cAAa,OAAO,OAAO,UAAU,MAAM;AAC1D,QAAI;AACJ,eAAW,mBAAmB,OAAO,CAAC,GAAG,mBAAmB,CAAC,GAAG;AAC9D,YAAM,iBAAiB,oBAAI,IAAyB;AACpD,iBAAW,MAAM,QAAQ;AACvB,cAAM,KAAK,GAAG,gBAAgB;AAAA,UAC5B,CAAC,MAAM,EAAE,gBAAgB,gBAAgB;AAAA,QAC3C;AACA,mBAAW,KAAK,IAAI,UAAU,CAAC,GAAG;AAChC,gBAAM,OAAO,eAAe,IAAI,EAAE,EAAE,KAAK,CAAC;AAC1C,eAAK,KAAK,CAAC;AACX,yBAAe,IAAI,EAAE,IAAI,IAAI;AAAA,QAC/B;AAAA,MACF;AACA,iBAAW,SAAS,eAAe,OAAO,GAAG;AAC3C,cAAM,MAAM,oBAAoB,KAAK;AACrC,YAAI,OAAO,yBAAyB,QAAW;AAC7C,iCAAuB;AACvB;AAAA,QACF;AAAA,MACF;AACA,UAAI,yBAAyB;AAAW;AAAA,IAC1C;AACA,cAAU,KAAK;AAAA,MACb;AAAA,MACA;AAAA,MACA,QAAQ,UAAU;AAAA,MAClB,qBAAqB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,IAAMC,QAAO;AAAA,EACX,OAAO;AAAA,EACP,MAAM;AAAA,EACN,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,SAAS;AACX;AAEA,SAAS,SAAS,MAAc,OAAuB;AACrD,SAAO,GAAG,KAAK,GAAG,IAAI,GAAGA,MAAK,KAAK;AACrC;AAEA,SAAS,aAAa,OAAuB;AAC3C,MAAI,SAAS,IAAI;AACf,WAAOA,MAAK;AAAA,EACd;AACA,MAAI,SAAS,IAAI;AACf,WAAOA,MAAK;AAAA,EACd;AACA,SAAOA,MAAK;AACd;AAEA,SAAS,wBACP,eACA,WACQ;AACR,MAAI,CAAC,aAAa,UAAU,UAAU,GAAG;AACvC,WAAO,KAAK,cAAc,OAAO,EAAE,CAAC;AAAA,EACtC;AACA,QAAM,OAAO,UAAU,QAAQ,UAAU;AACzC,QAAM,KAAKD,cAAa,UAAU,OAAO,UAAU,OAAO,UAAU,KAAK;AACzE,QAAM,UACJ,OAAO,SACH,GAAG,KAAK,QAAQ,CAAC,CAAC,SAAM,GAAG,QAAQ,CAAC,CAAC,KACrC,KAAK,QAAQ,CAAC;AACpB,SAAO,KAAK,cAAc,OAAO,EAAE,CAAC,QAAQ,SAAS,SAAS,aAAa,IAAI,CAAC,CAAC,WAAW,UAAU,MAAM,WAAW,UAAU,MAAM;AACzI;AAEA,SAASE,WAAU,OAAe,MAAM,KAAK,QAAQ,IAAY;AAC/D,QAAM,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC;AAC7C,QAAM,SAAS,KAAK,MAAO,OAAO,MAAO,KAAK;AAC9C,SAAO,GAAG,SAAI,OAAO,MAAM,CAAC,GAAG,SAAI,OAAO,QAAQ,MAAM,CAAC;AAC3D;AAEA,SAAS,mCACP,QACA,mBAMC;AACD,MAAI,OAAO,WAAW;AAAG,WAAO,CAAC;AACjC,QAAM,eAAe,IAAI;AAAA,IACvB,OAAO,QAAQ,CAAC,MAAM,EAAE,gBAAgB,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC;AAAA,EACnE;AACA,QAAM,SAKD,CAAC;AACN,aAAW,eAAe,cAAc;AACtC,UAAM,iBAAiB,oBAAI,IAAyB;AACpD,UAAM,kBAAkB,oBAAI,IAAkD;AAC9E,eAAW,MAAM,QAAQ;AACvB,YAAM,KAAK,GAAG,gBAAgB,KAAK,CAAC,MAAM,EAAE,gBAAgB,WAAW;AACvE,iBAAW,KAAK,IAAI,UAAU,CAAC,GAAG;AAChC,cAAM,OAAO,eAAe,IAAI,EAAE,EAAE,KAAK,CAAC;AAC1C,aAAK,KAAK,CAAC;AACX,uBAAe,IAAI,EAAE,IAAI,IAAI;AAAA,MAC/B;AACA,iBAAW,KAAK,IAAI,WAAW,CAAC,GAAG;AACjC,cAAM,OAAO,gBAAgB,IAAI,EAAE,EAAE,KAAK,CAAC;AAC3C,aAAK,KAAK,CAAC;AACX,wBAAgB,IAAI,EAAE,IAAI,IAAI;AAAA,MAChC;AAAA,IACF;AACA,UAAM,mBAAgC,CAAC;AACvC,eAAW,SAAS,eAAe,OAAO,GAAG;AAC3C,YAAM,MAAM,oBAAoB,KAAK;AACrC,UAAI;AAAK,yBAAiB,KAAK,GAAG;AAAA,IACpC;AACA,UAAM,oBAAoB,MAAM,KAAK,gBAAgB,QAAQ,CAAC,EAC3D,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,qBAAqB,KAAc,CAAC,EACvD,OAAO,CAAC,MAA0C,MAAM,MAAS;AACpE,UAAM,SAAS,OAAO,MAAM,CAAC,OAAO;AAClC,YAAM,KAAK,GAAG,gBAAgB,KAAK,CAAC,MAAM,EAAE,gBAAgB,WAAW;AACvE,aAAO,IAAI,UAAU;AAAA,IACvB,CAAC;AACD,WAAO,KAAK;AAAA,MACV;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,SACE,kBAAkB,SAAS,IAAI,oBAAoB;AAAA,IACvD,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,yBACP,MACA,QACA,QACA,SACA,SACQ;AACR,QAAM,YAAY,SACd,SAAS,QAAQ,GAAGD,MAAK,IAAI,GAAGA,MAAK,KAAK,EAAE,IAC5C,SAAS,QAAQ,GAAGA,MAAK,IAAI,GAAGA,MAAK,GAAG,EAAE;AAC9C,QAAM,aAAuB,CAAC;AAC9B,aAAW,QAAQ,QAAQ;AACzB,UAAM,MAAM,aAAa,KAAK,EAAE;AAChC,QAAI,CAAC,KAAK;AACR,YAAM,UAAU,eAAe,KAAK,IAAI;AACxC,iBAAW;AAAA,QACT,YAAY,SACR,SAAS,QAAQ,QAAQ,CAAC,GAAG,aAAa,OAAO,CAAC,IAClD;AAAA,MACN;AACA;AAAA,IACF;AACA,UAAM,YAAY,IAAI,OAAO,KAAK,MAAM,OAAO;AAC/C,YAAQ,IAAI,iBAAiB;AAAA,MAC3B,KAAK,OAAO;AACV,cAAM,UACJ,OAAO,KAAK,SAAS,YACrB,KAAK,SAAS,QACd,WAAW,KAAK,OACX,KAAK,KAA4B,QAClC,eAAe,KAAK,IAAI;AAC9B,YAAI,OAAO,YAAY,YAAY,OAAO,SAAS,OAAO,GAAG;AAC3D,qBAAW;AAAA,YACT,GAAG,SAAS,WAAW,aAAa,OAAO,CAAC,CAAC,IAAI,SAASC,WAAU,OAAO,GAAGD,MAAK,GAAG,CAAC;AAAA,UACzF;AAAA,QACF,OAAO;AACL,qBAAW,KAAK,SAAS;AAAA,QAC3B;AACA;AAAA,MACF;AAAA,MACA,KAAK;AACH,mBAAW,KAAK,SAAS;AACzB;AAAA,MACF,KAAK;AACH,mBAAW;AAAA,UACT;AAAA,YACE;AAAA,YACA,KAAK,WAAW,OACZ,GAAGA,MAAK,IAAI,GAAGA,MAAK,KAAK,KACzB,KAAK,WAAW,QACd,GAAGA,MAAK,IAAI,GAAGA,MAAK,GAAG,KACvBA,MAAK;AAAA,UACb;AAAA,QACF;AACA;AAAA,IACJ;AAAA,EACF;AACA,QAAM,WAAW,WAAW,SAAS,IAAI,WAAW,KAAK,GAAG,IAAI;AAChE,MAAI,OAAO,MAAM,IAAI,KAAK,SAAS,IAAI,QAAQ;AAC/C,MAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,UAAM,cAAwB,CAAC;AAC/B,eAAW,EAAE,IAAI,KAAK,KAAK,SAAS;AAClC,YAAM,MAAM,cAAc,EAAE;AAC5B,UAAI,KAAK;AACP,cAAM,YAAY,IAAI,OAAO,MAAM,OAAO;AAC1C,oBAAY;AAAA,UACV,IAAI,OAAO,IAAI,IAAI,IAAI,KAAK,SAAS,MAAM,IAAI,SAAS;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AACA,QAAI,YAAY,SAAS,GAAG;AAC1B,cAAQ,IAAI,YAAY,KAAK,GAAG,CAAC;AAAA,IACnC;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,0BACpB,QACA,aACA,kBACe;AACf,QAAM,UAAU,MAAM,OAAO,qBAAqB,WAAW;AAC7D,MAAI,CAAC,SAAS;AACZ,UAAM,QAAQ,MAAM,OAAO,gBAAgB;AAC3C,UAAM,YAAY,MAAM,IAAI,CAAC,SAAS,KAAK,QAAQ,QAAQ,CAAC,EAAE,KAAK;AACnE,UAAM,IAAI;AAAA,MACR,UAAU,SAAS,IACf,YAAY,WAAW,oCAAoC,UAAU,KAAK,IAAI,CAAC,KAC/E,YAAY,WAAW;AAAA,IAC7B;AAAA,EACF;AAEA,QAAM,aACJ,MAAM,OAAO,+BAA+B,gBAAgB;AAC9D,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,QAAQ,MAAM,OAAO,kBAAkB;AAC7C,UAAM,YAAY,MACf,IAAI,CAAC,SAAS,KAAK,UAAU,QAAQ,CAAC,EACtC,OAAO,CAAC,SAAyB,OAAO,SAAS,QAAQ,EACzD,KAAK;AACR,UAAM,IAAI;AAAA,MACR,UAAU,SAAS,IACf,yBAAyB,gBAAgB,4BAA4B,UAAU,KAAK,IAAI,CAAC,KACzF,yBAAyB,gBAAgB;AAAA,IAC/C;AAAA,EACF;AAEA,QAAM,oBAAoB,IAAI;AAAA,IAC5B,WAAW,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,KAAK,UAAU,QAAQ,KAAK,KAAK,EAAE,CAAC;AAAA,EACzE;AACA,QAAM,aAAa,oBAAI,IAAgC;AACvD,QAAM,mBAAmB,oBAAI,IAA8B;AAC3D,MAAI,oBAAoB;AACxB,MAAI,oBAAoB;AACxB,MAAI,oBAAoB;AACxB,MAAI,iBAAiB;AACrB,MAAI,aAAa;AACjB,MAAI,cAAc;AAClB,QAAM,gBAAgB,CAAC,UAAK,UAAK,UAAK,UAAK,UAAK,QAAG;AACnD,MAAI,eAAe;AAEnB,WAAS,YAAkB;AACzB,QAAI,CAAC,QAAQ,OAAO,OAAO;AACzB;AAAA,IACF;AACA,YAAQ,OAAO,MAAM,WAAW;AAAA,EAClC;AAEA,WAAS,SAAS,GAAiB;AACjC,QAAI,CAAC,QAAQ,OAAO,SAAS,KAAK;AAAG;AACrC,YAAQ,OAAO,MAAM,QAAQ,CAAC,GAAG;AAAA,EACnC;AAEA,WAAS,cAAoB;AAC3B,QAAI,CAAC,QAAQ,OAAO,SAAS,aAAa;AACxC;AAAA,IACF;AACA,UAAM,QAAQ,cAAc,eAAe,cAAc,MAAM;AAC/D,oBAAgB;AAChB,YAAQ,OAAO;AAAA,MACb,KAAK,SAAS,OAAOA,MAAK,IAAI,CAAC,wBAAwB;AAAA,QACrD,GAAG,cAAc,IAAI,UAAU;AAAA,QAC/BA,MAAK;AAAA,MACP,CAAC,IAAI,SAAS,UAAUA,MAAK,GAAG,CAAC;AAAA,IACnC;AAAA,EACF;AAEA,MAAI,wBAAuC;AAC3C,MAAI,uBAAuB;AAE3B,MAAI;AACJ,QAAM,OAAO,IAAI,QAAqB,CAACrB,aAAY;AACjD,UAAM,cAAc,OAAO,mBAAmB,CAAC,UAAU;AACvD,UAAI,MAAM,SAAS,oBAAoB;AACrC,yBAAiB,MAAM;AACvB,cAAM,gBAAgB,MAAM,gBACzB,IAAI,CAAC,SAAS,yBAAyB,KAAK,MAAM,CAAC,EACnD,OAAO,CAAC,SAAyB,SAAS,MAAS;AACtD,cAAM,eACJ,cAAc,SAAS,IACnB,cAAc,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC,IACnD,cAAc,SACd;AAEN,cAAM,aAAa,MAAM;AACzB,cAAM,WAAW,iBAAiB,IAAI,UAAU,KAAK;AAAA,UACnD,MAAM,MAAM;AAAA,UACZ,QAAQ,CAAC;AAAA,QACX;AACA,iBAAS,OAAO,KAAK;AAAA,UACnB;AAAA,UACA,QAAQ,MAAM;AAAA,UACd,YAAY,MAAM;AAAA,UAClB,iBAAiB,MAAM;AAAA,QACzB,CAAC;AACD,yBAAiB,IAAI,YAAY,QAAQ;AAEzC,mBAAW,QAAQ,MAAM,iBAAiB;AACxC,gBAAM,UAAU,yBAAyB,KAAK,MAAM;AACpD,cAAI,YAAY,QAAW;AACzB,kBAAM,UAAU,WAAW,IAAI,KAAK,WAAW,KAAK;AAAA,cAClD,OAAO;AAAA,cACP,OAAO;AAAA,cACP,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,QAAQ;AAAA,YACV;AACA,uBAAW,IAAI,KAAK,aAAa;AAAA,cAC/B,OAAO,QAAQ,QAAQ;AAAA,cACvB,OAAO,QAAQ,QAAQ,UAAU;AAAA,cACjC,OAAO,QAAQ,QAAQ;AAAA,cACvB,QAAQ,QAAQ,UAAU,KAAK,SAAS,IAAI;AAAA,cAC5C,QAAQ,QAAQ,UAAU,KAAK,SAAS,IAAI;AAAA,YAC9C,CAAC;AACD,iCAAqB;AACrB,iCAAqB,UAAU;AAC/B,iCAAqB;AAAA,UACvB;AAAA,QACF;AAEA,cAAM,iBAAiB,0BAA0B;AACjD,cAAM,cAAc,MAAM,cAAc,MAAM;AAC9C,cAAM,WAAW,CAAC,QAAQ,OAAO;AAEjC,cAAM,kBACJ,YAAY,MAAM,aAAa,KAAK,CAAC;AAEvC,YAAI,kBAAkB,uBAAuB,KAAK,CAAC,iBAAiB;AAClE,mBAAS,oBAAoB;AAAA,QAC/B;AAEA,cAAM,mBAAmB;AAAA,UACvB,SAAS;AAAA,UACT;AAAA,QACF;AACA,cAAM,eAAe,SAAS,OAAO,SAAS;AAC9C,cAAM,aAAa,SAAS,OAAO;AAAA,UACjC,CAAC,GAAG,MAAM,IAAI,EAAE;AAAA,UAChB;AAAA,QACF;AACA,cAAM,SAAS,SAAS,OAAO,MAAM,CAAC,MAAM,EAAE,MAAM;AAEpD,cAAM,QAAkB,CAAC;AACzB,cAAM;AAAA,UACJ,GAAG,SAAS,IAAI,MAAM,kBAAkB,IAAI,MAAM,cAAc,KAAKqB,MAAK,IAAI,CAAC,IAAI,MAAM,YAAY,IAAI,SAAS,IAAI,MAAM,UAAU,IAAI,MAAM,UAAU,KAAKA,MAAK,IAAI,CAAC,IAAI,SAAS,IAAI,UAAU,OAAOA,MAAK,GAAG,CAAC;AAAA,QACtN;AACA,mBAAW,QAAQ,kBAAkB;AACnC,gBAAM,OACJ,kBAAkB,IAAI,KAAK,WAAW,KAAK,KAAK;AAClD,gBAAM;AAAA,YACJ;AAAA,cACE;AAAA,cACA,KAAK;AAAA,cACL,KAAK;AAAA,cACL,KAAK;AAAA,cACL,EAAE,aAAa;AAAA,YACjB;AAAA,UACF;AACA,gBAAM,YAAY,SAAS,OAAO,SAAS,OAAO,SAAS,CAAC;AAC5D,gBAAM,SAAS,WAAW,gBAAgB;AAAA,YACxC,CAAC,MAAM,EAAE,gBAAgB,KAAK;AAAA,UAChC;AACA,cAAI,CAAC,KAAK,UAAU,QAAQ,QAAQ,OAAO,KAAK,SAAS,GAAG;AAC1D,uBAAW,OAAO,OAAO,MAAM;AAC7B,kBAAI,IAAI,SAAS,QAAQ;AACvB,sBAAM,WAAW,QAAQ,OAAO;AAChC,2BAAW,EAAE,MAAM,KAAK,KAAK,aAAa,GAAG,GAAG;AAC9C,wBAAM,UACJ,YAAY,SAAS,WACjB,SAAS,SAAS,IAAI,IAAIA,MAAK,GAAG,IAClC,YAAY,SAAS,QACnB,SAAS,SAAS,IAAI,IAAIA,MAAK,KAAK,IACpC,SAAS,IAAI;AACrB,wBAAM,KAAK,OAAO;AAAA,gBACpB;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,YAAI,CAAC,iBAAiB;AACpB,mBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,oBAAQ,OAAO,MAAM,YAAY,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,UAC/C;AACA,kCAAwB;AACxB,iCAAuB,MAAM;AAAA,QAC/B;AAEA,oBAAY;AAAA,MACd;AACA,UAAI,MAAM,SAAS,kBAAkB,MAAM,SAAS,aAAa;AAC/D,sBAAc;AACd,kBAAU;AACV,oBAAY;AACZ,QAAArB,SAAQ,KAAK;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,QAAM,WAAW,MAAM,OAAO,eAAe;AAAA,IAC3C,WAAW,QAAQ;AAAA,IACnB,cAAc,WAAW,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,EAChD,CAAC;AACD,eAAa,SAAS;AAEtB,UAAQ,IAAI,SAAS,4BAA4B,GAAGqB,MAAK,IAAI,GAAGA,MAAK,IAAI,EAAE,CAAC;AAC5E,UAAQ,IAAI,QAAQ,SAAS,SAAS,OAAOA,MAAK,IAAI,CAAC,EAAE;AACzD,UAAQ,IAAI,YAAY,SAAS,SAAS,aAAaA,MAAK,IAAI,CAAC,EAAE;AACnE,UAAQ;AAAA,IACN,eAAe,WACZ,IAAI,CAAC,SAAS,KAAK,UAAU,QAAQ,KAAK,KAAK,EAAE,EACjD,KAAK,IAAI,CAAC;AAAA,EACf;AACA,UAAQ;AAAA,IACN,qBAAqB,SAAS,OAAO,SAAS,cAAc,GAAGA,MAAK,IAAI,CAAC;AAAA,EAC3E;AACA,UAAQ,IAAI,EAAE;AACd,cAAY;AACZ,iBAAe,YAAY,aAAa,GAAG;AAE3C,QAAM,aAAa,MAAM;AACzB,MAAI,cAAc;AAChB,kBAAc,YAAY;AAAA,EAC5B;AAEA,MAAI,WAAW,SAAS,aAAa;AACnC,UAAM,IAAI,MAAM,eAAe,WAAW,YAAY,EAAE;AAAA,EAC1D;AAEA,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,SAAS,uBAAuB,GAAGA,MAAK,IAAI,GAAGA,MAAK,IAAI,EAAE,CAAC;AACvE,UAAQ;AAAA,IACN,aAAa;AAAA,MACX,GAAG,WAAW,eAAe,IAAI,WAAW,cAAc;AAAA,MAC1DA,MAAK;AAAA,IACP,CAAC;AAAA,EACH;AACA,UAAQ;AAAA,IACN,aAAa;AAAA,MACX,GAAG,WAAW,eAAe,IAAI,WAAW,cAAc;AAAA,MAC1D,WAAW,kBAAkB,IAAIA,MAAK,MAAMA,MAAK;AAAA,IACnD,CAAC;AAAA,EACH;AACA,MAAI,oBAAoB,GAAG;AACzB,UAAM,iBAAiB,oBAAoB;AAC3C,UAAM,YAAYD;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,SACJ,cAAc,SACV,GAAG,eAAe,QAAQ,CAAC,CAAC,SAAM,UAAU,QAAQ,CAAC,CAAC,KACtD,eAAe,QAAQ,CAAC;AAC9B,YAAQ;AAAA,MACN,wBAAwB;AAAA,QACtB;AAAA,QACA,aAAa,cAAc;AAAA,MAC7B,CAAC,IAAI,SAASE,WAAU,cAAc,GAAGD,MAAK,GAAG,CAAC;AAAA,IACpD;AAAA,EACF;AACA,UAAQ,IAAI,SAAS,yBAAyBA,MAAK,OAAO,CAAC;AAC3D,aAAW,CAAC,aAAa,aAAa,KAAK,kBAAkB,QAAQ,GAAG;AACtE,YAAQ;AAAA,MACN,wBAAwB,eAAe,WAAW,IAAI,WAAW,CAAC;AAAA,IACpE;AAAA,EACF;AACA,QAAM,oBAAoB,uBAAuB,gBAAgB;AACjE,MAAI,kBAAkB,SAAS,GAAG;AAChC,YAAQ,IAAI,SAAS,uBAAuBA,MAAK,OAAO,CAAC;AACzD,eAAW,WAAW,mBAAmB;AACvC,YAAM,SAAS,QAAQ,SACnB,SAAS,QAAQA,MAAK,KAAK,IAC3B,SAAS,QAAQA,MAAK,GAAG;AAC7B,UAAI,QAAQ,iBAAiB,QAAW;AACtC,gBAAQ;AAAA,UACN,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC,cAAc,SAAS,IAAI,QAAQ,UAAU,OAAOA,MAAK,GAAG,CAAC;AAAA,QACrG;AACA;AAAA,MACF;AACA,YAAM,aACJ,QAAQ,gBAAgB,QAAQ,sBAC5B,aAAa,QAAQ,oBAAoB,EAAE,GAAG;AAAA,QAC5C,QAAQ,oBAAoB;AAAA,QAC5B,EAAE,cAAc,KAAK;AAAA,MACvB,KAAK,QAAQ,aAAa,QAAQ,CAAC,IACnC,QAAQ,WAAW,UAAa,QAAQ,eACtC,GAAG,QAAQ,aAAa,QAAQ,CAAC,CAAC,SAAM,QAAQ,OAAO,QAAQ,CAAC,CAAC,KACjE,QAAQ,aAAa,QAAQ,CAAC;AACtC,cAAQ;AAAA,QACN,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC,UAAU;AAAA,UAC9C;AAAA,UACA,aAAa,QAAQ,YAAY;AAAA,QACnC,CAAC,IAAI,SAASC,WAAU,QAAQ,cAAc,KAAK,EAAE,GAAGD,MAAK,GAAG,CAAC,IAAI,SAAS,IAAI,QAAQ,UAAU,OAAOA,MAAK,GAAG,CAAC;AAAA,MACtH;AAAA,IACF;AAAA,EACF;AACA,UAAQ,IAAI,eAAe,SAAS,WAAW,cAAcA,MAAK,GAAG,CAAC,EAAE;AAC1E;AAEA,eAAsB,wBACpB,QACA,aACA,kBACe;AACf,SAAO,IAAI,QAAc,CAACrB,UAAS,WAAW;AAC5C,UAAM,MAAMe;AAAA,MACVR,OAAM,cAAc,SAAS;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY,CAAC,QAAQ;AACnB,cAAI,QAAQ;AACZ,cAAI,KAAK;AACP,mBAAO,GAAG;AAAA,UACZ,OAAO;AACL,YAAAP,SAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;;;AI3lBA,SAAS,kBAAkB,UAAyB;AAClD,QAAM,UAAU,aAAa,IAAI,QAAQ,MAAM,QAAQ;AACvD,UAAQ,kBAAkB,CAAC;AAC3B,UAAQ,KAAK,QAAQ;AACvB;AAEA,eAAe,OAAsB;AACnC,QAAM,OAAO,mBAAmB,QAAQ,KAAK,MAAM,CAAC,CAAC;AAErD,MAAI,KAAK,MAAM;AACb,sBAAkB,CAAC;AAAA,EACrB;AACA,MAAI,KAAK,YAAY,SAAS,GAAG;AAC/B,YAAQ,MAAM,sBAAsB,KAAK,YAAY,KAAK,IAAI,CAAC,EAAE;AACjE,sBAAkB,CAAC;AAAA,EACrB;AACA,MAAI,CAAC,KAAK,SAAS;AACjB,sBAAkB,CAAC;AAAA,EACrB;AACA,MAAI,CAAC,KAAK,aAAa;AACrB,YAAQ,MAAM,oDAAoD;AAClE,sBAAkB,CAAC;AAAA,EACrB;AAEA,MAAI,KAAK,YAAY,SAAS,CAAC,KAAK,kBAAkB;AACpD,YAAQ,MAAM,0DAA0D;AACxE,sBAAkB,CAAC;AAAA,EACrB;AAEA,QAAM,SAAS,QAAQ,OAAO,UAAU;AACxC,MAAI,CAAC,QAAQ;AACX,gBAAY;AAAA,EACd;AAEA,QAAM,SAAS,aAAa;AAC5B,MAAI;AACF,QAAI,KAAK,YAAY,OAAO;AAC1B,aAAO,SAAS,0BAA0B;AAAA,QACxC;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AACA;AAAA,IACF;AAEA,WAAO,SAAS,gCAAgC;AAAA,MAC9C;AAAA,MACA,KAAK;AAAA,IACP;AAAA,EACF,UAAE;AACA,UAAM,OAAO,SAAS;AAAA,EACxB;AACF;AAEA,KAAK,KAAK,EAAE,MAAM,CAAC,UAAmB;AACpC,UAAQ,MAAM,iBAAiB,QAAQ,MAAM,UAAU,gBAAgB;AACvE,UAAQ,KAAK,CAAC;AAChB,CAAC","sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport { Effect, Fiber, PubSub, Queue } from 'effect';\n\nimport type { RunnerConfig, RunnerConfigOverrides } from './config';\nimport { withRunnerConfig } from './config';\nimport { loadRunnerConfigFile } from './config-loader';\nimport {\n collectDatasetsFromFiles,\n collectEvaluatorsFromFiles,\n collectTestCasesFromFiles,\n} from './discovery';\nimport { createArtifactPath, executeRunTask, type RunTask } from './execution';\nimport type {\n CollectedDataset,\n CollectedEvaluator,\n CollectedTestCase,\n RunDatasetRequest,\n RunSnapshot,\n RunnerEvent,\n SearchTestCasesQuery,\n} from './events';\nimport { loadRunSnapshotsFromArtifacts as loadSnapshotsFromArtifacts } from './artifact-loader';\nimport { createPersistenceWorker } from './persistence';\nimport { searchCollectedTestCases } from './search';\n\ninterface SubscribeOptions {\n runId?: string;\n}\n\nfunction parseRegexLiteral(\n pattern: string,\n): { source: string; flags: string } | undefined {\n if (!pattern.startsWith('/')) {\n return undefined;\n }\n const lastSlash = pattern.lastIndexOf('/');\n if (lastSlash <= 0) {\n return undefined;\n }\n return {\n source: pattern.slice(1, lastSlash),\n flags: pattern.slice(lastSlash + 1),\n };\n}\n\nfunction createNameMatcher(pattern: string): (value: string) => boolean {\n const normalizedPattern = pattern.trim();\n const regexLiteral = parseRegexLiteral(normalizedPattern);\n if (regexLiteral) {\n const regex = new RegExp(regexLiteral.source, regexLiteral.flags);\n return (value: string) => regex.test(value);\n }\n\n if (normalizedPattern.includes('*')) {\n const escaped = normalizedPattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*');\n const regex = new RegExp(`^${escaped}$`, 'i');\n return (value: string) => regex.test(value);\n }\n\n return (value: string) => value.toLowerCase() === normalizedPattern.toLowerCase();\n}\n\nexport interface RunnerApi {\n collectDatasets(): Promise<ReadonlyArray<CollectedDataset>>;\n collectEvaluators(): Promise<ReadonlyArray<CollectedEvaluator>>;\n resolveDatasetByName(name: string): Promise<CollectedDataset | undefined>;\n resolveEvaluatorsByNamePattern(\n pattern: string,\n ): Promise<ReadonlyArray<CollectedEvaluator>>;\n searchTestCases(\n query?: SearchTestCasesQuery,\n ): Promise<ReadonlyArray<CollectedTestCase>>;\n collectDatasetTestCases(datasetId: string): Promise<ReadonlyArray<CollectedTestCase>>;\n runDatasetWith(request: RunDatasetRequest): Promise<RunSnapshot>;\n subscribeRunEvents(\n listener: (event: RunnerEvent) => void,\n options?: SubscribeOptions,\n ): () => void;\n getRunSnapshot(runId: string): RunSnapshot | undefined;\n getAllRunSnapshots(): ReadonlyArray<RunSnapshot>;\n loadRunSnapshotsFromArtifacts(): Promise<ReadonlyArray<RunSnapshot>>;\n shutdown(): Promise<void>;\n}\n\nfunction mergeRunnerOverrides(\n base?: RunnerConfigOverrides,\n next?: RunnerConfigOverrides,\n): RunnerConfigOverrides | undefined {\n if (!base) {\n return next;\n }\n if (!next) {\n return base;\n }\n const discovery = base.discovery || next.discovery\n ? {\n ...(base.discovery ?? {}),\n ...(next.discovery ?? {}),\n }\n : undefined;\n return {\n ...base,\n ...next,\n discovery,\n };\n}\n\nexport function createRunner(overrides?: RunnerConfigOverrides): RunnerApi {\n const fileOverrides = loadRunnerConfigFile();\n const merged = mergeRunnerOverrides(fileOverrides, overrides);\n return new EffectRunner(withRunnerConfig(merged));\n}\n\nclass EffectRunner implements RunnerApi {\n private readonly config: RunnerConfig;\n\n private readonly eventBus = Effect.runSync(PubSub.unbounded<RunnerEvent>());\n\n private readonly runQueue = Effect.runSync(Queue.unbounded<RunTask>());\n\n private readonly persistenceQueue = Effect.runSync(\n Queue.unbounded<{\n runId: string;\n artifactPath: string;\n payload: unknown;\n }>(),\n );\n\n private readonly snapshots = new Map<string, RunSnapshot>();\n private readonly listeners = new Set<{\n runId?: string;\n listener: (event: RunnerEvent) => void;\n }>();\n\n private readonly datasetsById = new Map<string, CollectedDataset>();\n\n private readonly evaluatorsById = new Map<string, CollectedEvaluator>();\n\n private readonly schedulerFiber = Effect.runFork(\n this.createSchedulerEffect(),\n );\n\n private readonly persistenceFiber = Effect.runFork(\n createPersistenceWorker(this.persistenceQueue),\n );\n\n constructor(config: RunnerConfig) {\n this.config = config;\n }\n\n async collectDatasets(): Promise<ReadonlyArray<CollectedDataset>> {\n const datasets = await collectDatasetsFromFiles(this.config.discovery);\n this.datasetsById.clear();\n for (const dataset of datasets) {\n this.datasetsById.set(dataset.id, dataset);\n }\n return datasets;\n }\n\n async collectEvaluators(): Promise<ReadonlyArray<CollectedEvaluator>> {\n const evaluators = await collectEvaluatorsFromFiles(this.config.discovery);\n this.evaluatorsById.clear();\n for (const evaluator of evaluators) {\n this.evaluatorsById.set(evaluator.id, evaluator);\n }\n return evaluators;\n }\n\n async resolveDatasetByName(name: string): Promise<CollectedDataset | undefined> {\n if (this.datasetsById.size === 0) {\n await this.collectDatasets();\n }\n const normalized = name.trim().toLowerCase();\n return Array.from(this.datasetsById.values()).find(\n (item) => item.dataset.getName().toLowerCase() === normalized,\n );\n }\n\n async resolveEvaluatorsByNamePattern(\n pattern: string,\n ): Promise<ReadonlyArray<CollectedEvaluator>> {\n if (this.evaluatorsById.size === 0) {\n await this.collectEvaluators();\n }\n const matcher = createNameMatcher(pattern);\n return Array.from(this.evaluatorsById.values()).filter((item) =>\n matcher(item.evaluator.getName() ?? ''),\n );\n }\n\n async searchTestCases(\n query?: SearchTestCasesQuery,\n ): Promise<ReadonlyArray<CollectedTestCase>> {\n const testCases = await collectTestCasesFromFiles(this.config.discovery);\n return searchCollectedTestCases(testCases, query);\n }\n\n async collectDatasetTestCases(\n datasetId: string,\n ): Promise<ReadonlyArray<CollectedTestCase>> {\n if (this.datasetsById.size === 0) {\n await this.collectDatasets();\n }\n const dataset = this.datasetsById.get(datasetId);\n if (!dataset) {\n throw new Error(`Unknown dataset: ${datasetId}`);\n }\n const allTestCases = await collectTestCasesFromFiles(this.config.discovery);\n return allTestCases.filter((testCase) =>\n dataset.dataset.matchesTestCase(testCase.testCase, testCase.filePath),\n );\n }\n\n async runDatasetWith(request: RunDatasetRequest): Promise<RunSnapshot> {\n if (this.datasetsById.size === 0) {\n await this.collectDatasets();\n }\n if (this.evaluatorsById.size === 0) {\n await this.collectEvaluators();\n }\n\n const dataset = this.datasetsById.get(request.datasetId);\n if (!dataset) {\n throw new Error(`Unknown dataset: ${request.datasetId}`);\n }\n\n const selectedEvaluators = request.evaluatorIds\n .map((id) => this.evaluatorsById.get(id))\n .filter((value): value is CollectedEvaluator => Boolean(value))\n .map((value) => ({ id: value.id, evaluator: value.evaluator }));\n\n if (selectedEvaluators.length === 0) {\n throw new Error('No evaluators selected for run');\n }\n\n const selectedTestCases = await this.collectDatasetTestCases(request.datasetId);\n\n const totalEvaluations = selectedTestCases.reduce(\n (sum, tc) =>\n sum +\n (typeof tc.testCase.getReruns === 'function'\n ? tc.testCase.getReruns()\n : 1),\n 0,\n );\n\n const runId = `run-${randomUUID()}`;\n const artifactPath = createArtifactPath(\n this.config.artifactDirectory,\n request.datasetId,\n runId,\n );\n const snapshot: RunSnapshot = {\n runId,\n datasetId: request.datasetId,\n datasetName: dataset.dataset.getName(),\n evaluatorIds: selectedEvaluators.map((item) => item.id),\n queuedAt: Date.now(),\n totalTestCases: totalEvaluations,\n completedTestCases: 0,\n passedTestCases: 0,\n failedTestCases: 0,\n status: 'queued',\n artifactPath,\n };\n\n this.snapshots.set(runId, snapshot);\n const queuedEvent: RunnerEvent = {\n type: 'RunQueued',\n runId,\n datasetId: request.datasetId,\n datasetName: dataset.dataset.getName(),\n evaluatorIds: selectedEvaluators.map((item) => item.id),\n totalTestCases: totalEvaluations,\n artifactPath,\n };\n await Effect.runPromise(this.publishEvent(queuedEvent));\n await Effect.runPromise(\n Queue.offer(this.persistenceQueue, {\n runId,\n artifactPath,\n payload: queuedEvent,\n }),\n );\n\n const maxConcurrency =\n request.concurrency ?? this.config.maxConcurrency ?? 1;\n\n await Effect.runPromise(\n Queue.offer(this.runQueue, {\n runId,\n datasetId: request.datasetId,\n dataset: dataset.dataset,\n evaluators: selectedEvaluators,\n testCases: selectedTestCases,\n snapshot,\n maxConcurrency,\n }),\n );\n\n return snapshot;\n }\n\n subscribeRunEvents(\n listener: (event: RunnerEvent) => void,\n options?: SubscribeOptions,\n ): () => void {\n const entry = { runId: options?.runId, listener };\n this.listeners.add(entry);\n return () => {\n this.listeners.delete(entry);\n };\n }\n\n getRunSnapshot(runId: string): RunSnapshot | undefined {\n return this.snapshots.get(runId);\n }\n\n getAllRunSnapshots(): ReadonlyArray<RunSnapshot> {\n return Array.from(this.snapshots.values()).sort(\n (a, b) => b.queuedAt - a.queuedAt,\n );\n }\n\n async loadRunSnapshotsFromArtifacts(): Promise<ReadonlyArray<RunSnapshot>> {\n return loadSnapshotsFromArtifacts(this.config);\n }\n\n async shutdown(): Promise<void> {\n await Effect.runPromise(Fiber.interrupt(this.schedulerFiber));\n await Effect.runPromise(Fiber.interrupt(this.persistenceFiber));\n await Effect.runPromise(Queue.shutdown(this.runQueue));\n await Effect.runPromise(Queue.shutdown(this.persistenceQueue));\n await Effect.runPromise(PubSub.shutdown(this.eventBus));\n }\n\n private createSchedulerEffect() {\n const self = this;\n return Effect.forever(\n Effect.gen(function* () {\n const task = yield* Queue.take(self.runQueue);\n yield* Effect.fork(\n executeRunTask(\n task,\n self.publishEvent.bind(self),\n self.persistenceQueue,\n self.updateSnapshot.bind(self),\n ),\n );\n }),\n );\n }\n\n private updateSnapshot(\n runId: string,\n updater: (snapshot: RunSnapshot) => RunSnapshot,\n ): void {\n const existing = this.snapshots.get(runId);\n if (!existing) {\n return;\n }\n this.snapshots.set(runId, updater(existing));\n }\n\n private publishEvent(event: RunnerEvent): Effect.Effect<void, never, never> {\n return Effect.sync(() => {\n for (const entry of this.listeners) {\n if (entry.runId && entry.runId !== event.runId) {\n continue;\n }\n entry.listener(event);\n }\n }).pipe(\n Effect.flatMap(() => PubSub.publish(this.eventBus, event)),\n Effect.asVoid,\n );\n }\n}\n","export interface RunnerDiscoveryConfig {\n rootDir: string;\n datasetSuffixes: ReadonlyArray<string>;\n evaluatorSuffixes: ReadonlyArray<string>;\n testCaseSuffixes: ReadonlyArray<string>;\n excludeDirectories: ReadonlyArray<string>;\n}\n\nexport interface RunnerConfig {\n discovery: RunnerDiscoveryConfig;\n artifactDirectory: string;\n /** Max concurrent test cases per run. Default: 1 (sequential). */\n maxConcurrency: number;\n}\n\nexport type RunnerConfigOverrides = Omit<Partial<RunnerConfig>, 'discovery'> & {\n discovery?: Partial<RunnerDiscoveryConfig>;\n};\n\nexport interface M4trixEvalConfigDiscovery {\n rootDir?: string;\n datasetFilePatterns?: ReadonlyArray<string>;\n evaluatorFilePatterns?: ReadonlyArray<string>;\n testCaseFilePatterns?: ReadonlyArray<string>;\n datasetSuffixes?: ReadonlyArray<string>;\n evaluatorSuffixes?: ReadonlyArray<string>;\n testCaseSuffixes?: ReadonlyArray<string>;\n excludeDirectories?: ReadonlyArray<string>;\n}\n\nexport interface M4trixEvalConfig {\n discovery?: M4trixEvalConfigDiscovery;\n artifactDirectory?: string;\n /** Max concurrent test cases per run. Default: 1 (sequential). */\n maxConcurrency?: number;\n}\n\nexport type ConfigType = M4trixEvalConfig;\n\nexport type M4trixEvalConfigFactory<TConfig extends ConfigType = ConfigType> = () => TConfig;\n\nexport function defineConfig<TConfig extends ConfigType>(\n factory: M4trixEvalConfigFactory<TConfig>,\n): M4trixEvalConfigFactory<TConfig> {\n return factory;\n}\n\nexport const defaultRunnerConfig: RunnerConfig = {\n discovery: {\n rootDir: process.cwd(),\n datasetSuffixes: ['.dataset.ts', '.dataset.tsx', '.dataset.js', '.dataset.mjs'],\n evaluatorSuffixes: [\n '.evaluator.ts',\n '.evaluator.tsx',\n '.evaluator.js',\n '.evaluator.mjs',\n ],\n testCaseSuffixes: [\n '.test-case.ts',\n '.test-case.tsx',\n '.test-case.js',\n '.test-case.mjs',\n ],\n excludeDirectories: ['node_modules', 'dist', '.next', '.git', '.pnpm-store'],\n },\n artifactDirectory: '.eval-results',\n maxConcurrency: 1,\n};\n\nexport function toRunnerConfigOverrides(\n config?: ConfigType,\n): RunnerConfigOverrides | undefined {\n if (!config) {\n return undefined;\n }\n\n const rawDiscovery = config.discovery;\n const discovery: Partial<RunnerDiscoveryConfig> = {};\n if (rawDiscovery?.rootDir !== undefined) {\n discovery.rootDir = rawDiscovery.rootDir;\n }\n if (rawDiscovery?.datasetFilePatterns !== undefined) {\n discovery.datasetSuffixes = rawDiscovery.datasetFilePatterns;\n } else if (rawDiscovery?.datasetSuffixes !== undefined) {\n discovery.datasetSuffixes = rawDiscovery.datasetSuffixes;\n }\n if (rawDiscovery?.evaluatorFilePatterns !== undefined) {\n discovery.evaluatorSuffixes = rawDiscovery.evaluatorFilePatterns;\n } else if (rawDiscovery?.evaluatorSuffixes !== undefined) {\n discovery.evaluatorSuffixes = rawDiscovery.evaluatorSuffixes;\n }\n if (rawDiscovery?.testCaseFilePatterns !== undefined) {\n discovery.testCaseSuffixes = rawDiscovery.testCaseFilePatterns;\n } else if (rawDiscovery?.testCaseSuffixes !== undefined) {\n discovery.testCaseSuffixes = rawDiscovery.testCaseSuffixes;\n }\n if (rawDiscovery?.excludeDirectories !== undefined) {\n discovery.excludeDirectories = rawDiscovery.excludeDirectories;\n }\n\n const overrides: RunnerConfigOverrides = {};\n if (config.artifactDirectory !== undefined) {\n overrides.artifactDirectory = config.artifactDirectory;\n }\n if (config.maxConcurrency !== undefined) {\n overrides.maxConcurrency = config.maxConcurrency;\n }\n if (Object.keys(discovery).length > 0) {\n overrides.discovery = discovery;\n }\n return overrides;\n}\n\nexport function withRunnerConfig(overrides?: RunnerConfigOverrides): RunnerConfig {\n if (!overrides) {\n return defaultRunnerConfig;\n }\n const discovery = overrides.discovery\n ? {\n ...defaultRunnerConfig.discovery,\n ...overrides.discovery,\n }\n : defaultRunnerConfig.discovery;\n\n return {\n ...defaultRunnerConfig,\n ...overrides,\n discovery,\n };\n}\n","import { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nimport * as jitiModule from 'jiti';\n\nimport type { RunnerConfigOverrides } from './config';\nimport {\n toRunnerConfigOverrides,\n type ConfigType,\n type M4trixEvalConfigFactory,\n} from './config';\n\nconst CONFIG_FILE_NAME = 'm4trix-eval.config.ts';\n\ntype JitiLoader = {\n (id: string): unknown;\n import?: (id: string) => Promise<unknown> | unknown;\n};\n\nlet cachedLoader: JitiLoader | undefined;\n\nfunction getJitiLoader(): JitiLoader {\n if (cachedLoader) {\n return cachedLoader;\n }\n const createJiti =\n (jitiModule as { createJiti?: unknown; default?: unknown }).createJiti ??\n (jitiModule as { default?: unknown }).default;\n if (typeof createJiti !== 'function') {\n throw new Error(\n 'Failed to initialize jiti for m4trix eval config loading.',\n );\n }\n cachedLoader = (\n createJiti as (id: string, options?: Record<string, unknown>) => JitiLoader\n )(import.meta.url, {\n interopDefault: true,\n moduleCache: true,\n });\n return cachedLoader;\n}\n\nfunction resolveConfigModuleExport(loadedModule: unknown): unknown {\n if (\n loadedModule &&\n typeof loadedModule === 'object' &&\n 'default' in loadedModule\n ) {\n return (loadedModule as { default: unknown }).default;\n }\n return loadedModule;\n}\n\nfunction resolveConfigValue(value: unknown): ConfigType | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value === 'function') {\n return (value as M4trixEvalConfigFactory<ConfigType>)();\n }\n if (typeof value !== 'object') {\n throw new Error(\n 'Invalid m4trix eval config export. Expected an object or defineConfig(() => config).',\n );\n }\n return value as ConfigType;\n}\n\nexport function loadRunnerConfigFile(\n cwd = process.cwd(),\n): RunnerConfigOverrides | undefined {\n const configPath = resolve(cwd, CONFIG_FILE_NAME);\n if (!existsSync(configPath)) {\n return undefined;\n }\n const loader = getJitiLoader();\n const loaded = loader(configPath);\n const exportedValue = resolveConfigModuleExport(loaded);\n const config = resolveConfigValue(exportedValue);\n return toRunnerConfigOverrides(config);\n}\n","import { Dirent } from 'node:fs';\nimport { readdir } from 'node:fs/promises';\nimport { resolve, relative } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport type { Dataset } from '../evals/dataset';\nimport type { Evaluator } from '../evals/evaluator';\nimport type { TestCase } from '../evals/test-case';\nimport type {\n CollectedDataset,\n CollectedEvaluator,\n CollectedTestCase,\n} from './events';\nimport type { RunnerDiscoveryConfig } from './config';\n\ntype JitiModuleLoader = {\n (id: string): unknown;\n import?: (id: string) => Promise<unknown> | unknown;\n};\n\nlet jitiLoader: JitiModuleLoader | undefined;\n\nfunction toId(prefix: string, filePath: string, name?: string): string {\n const stable = name && name.trim().length > 0 ? name : filePath;\n return `${prefix}:${stable}`\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\nfunction hasMethod(value: unknown, methodName: string): boolean {\n return (\n typeof value === 'object' &&\n value !== null &&\n methodName in value &&\n typeof (value as Record<string, unknown>)[methodName] === 'function'\n );\n}\n\nfunction isDatasetLike(value: unknown): value is Dataset {\n return hasMethod(value, 'getName') && hasMethod(value, 'matchesTestCase');\n}\n\nfunction isEvaluatorLike(\n value: unknown,\n): value is Evaluator<unknown, unknown, unknown, unknown> {\n return (\n hasMethod(value, 'getName') &&\n hasMethod(value, 'resolveContext') &&\n hasMethod(value, 'getEvaluateFn')\n );\n}\n\nfunction isTestCaseLike(value: unknown): value is TestCase<unknown> {\n return (\n hasMethod(value, 'getName') &&\n hasMethod(value, 'getTags') &&\n hasMethod(value, 'getInput')\n );\n}\n\nasync function walkDirectory(\n rootDir: string,\n excludeDirectories: ReadonlyArray<string>,\n): Promise<string[]> {\n const out: string[] = [];\n\n async function walk(currentDir: string): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await readdir(currentDir, { withFileTypes: true });\n } catch {\n return;\n }\n\n await Promise.all(\n entries.map(async (entry) => {\n const absolute = resolve(currentDir, entry.name);\n if (entry.isDirectory()) {\n if (excludeDirectories.includes(entry.name)) {\n return;\n }\n await walk(absolute);\n return;\n }\n\n if (entry.isFile()) {\n out.push(absolute);\n }\n }),\n );\n }\n\n await walk(rootDir);\n return out;\n}\n\nfunction hasOneSuffix(\n filePath: string,\n suffixes: ReadonlyArray<string>,\n): boolean {\n return suffixes.some((suffix) => filePath.endsWith(suffix));\n}\n\nasync function loadModuleExports(filePath: string): Promise<unknown[]> {\n if (filePath.endsWith('.ts') || filePath.endsWith('.tsx')) {\n if (!jitiLoader) {\n const jitiModule = (await import('jiti')) as {\n createJiti?: (filename: string, opts?: Record<string, unknown>) => JitiModuleLoader;\n default?: (filename: string, opts?: Record<string, unknown>) => JitiModuleLoader;\n };\n const createJiti = jitiModule.createJiti ?? jitiModule.default;\n if (!createJiti) {\n throw new Error('Failed to initialize jiti TypeScript loader');\n }\n jitiLoader = createJiti(import.meta.url, {\n interopDefault: true,\n moduleCache: true,\n }) as JitiModuleLoader;\n }\n const loaded = jitiLoader.import\n ? await jitiLoader.import(filePath)\n : await Promise.resolve(jitiLoader(filePath));\n return Object.values(loaded as Record<string, unknown>);\n }\n\n const moduleUrl = pathToFileURL(filePath).href;\n const loaded = (await import(moduleUrl)) as Record<string, unknown>;\n return Object.values(loaded);\n}\n\nexport async function collectDatasetsFromFiles(\n config: RunnerDiscoveryConfig,\n): Promise<ReadonlyArray<CollectedDataset>> {\n const files = await walkDirectory(config.rootDir, config.excludeDirectories);\n const matched = files.filter((filePath) =>\n hasOneSuffix(filePath, config.datasetSuffixes),\n );\n\n const found = await Promise.all(\n matched.map(async (absolutePath) => {\n const exports = await loadModuleExports(absolutePath);\n const datasets = exports.filter(isDatasetLike);\n const relPath = relative(config.rootDir, absolutePath);\n return datasets.map((dataset) => ({\n id: toId('dataset', relPath, dataset.getName()),\n filePath: relPath,\n dataset,\n }));\n }),\n );\n\n return found.flat();\n}\n\nexport async function collectEvaluatorsFromFiles(\n config: RunnerDiscoveryConfig,\n): Promise<ReadonlyArray<CollectedEvaluator>> {\n const files = await walkDirectory(config.rootDir, config.excludeDirectories);\n const matched = files.filter((filePath) =>\n hasOneSuffix(filePath, config.evaluatorSuffixes),\n );\n\n const found = await Promise.all(\n matched.map(async (absolutePath) => {\n const exports = await loadModuleExports(absolutePath);\n const evaluators = exports.filter(isEvaluatorLike);\n const relPath = relative(config.rootDir, absolutePath);\n return evaluators.map((evaluator) => ({\n id: toId('evaluator', relPath, evaluator.getName()),\n filePath: relPath,\n evaluator,\n }));\n }),\n );\n\n return found.flat();\n}\n\nexport async function collectTestCasesFromFiles(\n config: RunnerDiscoveryConfig,\n): Promise<ReadonlyArray<CollectedTestCase>> {\n const files = await walkDirectory(config.rootDir, config.excludeDirectories);\n const matched = files.filter((filePath) =>\n hasOneSuffix(filePath, config.testCaseSuffixes),\n );\n\n const found = await Promise.all(\n matched.map(async (absolutePath) => {\n const exports = await loadModuleExports(absolutePath);\n const testCases = exports.filter(isTestCaseLike);\n const relPath = relative(config.rootDir, absolutePath);\n return testCases.map((testCase) => ({\n id: toId('test-case', relPath, testCase.getName()),\n filePath: relPath,\n testCase,\n }));\n }),\n );\n\n return found.flat();\n}\n","import { join } from 'node:path';\n\nimport { Effect, Queue, Ref } from 'effect';\n\nimport type { DiffLogEntry } from '../evals/diff';\nimport { createDiffLogEntry } from '../evals/diff';\nimport type { Dataset } from '../evals/dataset';\nimport type { Evaluator } from '../evals/evaluator';\nimport type { MetricItem } from '../evals/metric';\nimport type { ScoreItem } from '../evals/score';\nimport type { CollectedTestCase, RunSnapshot, RunnerEvent } from './events';\nimport type { PersistenceMessage } from './persistence';\nimport { toNumericScoreFromScores } from './score-utils';\n\nfunction computeEvaluatorPassed(\n evaluator: Evaluator<unknown, unknown, unknown, unknown>,\n result: unknown,\n scores: ReadonlyArray<ScoreItem>,\n): boolean {\n const scoresWithPassed = scores.filter((s) => 'passed' in s && s.passed !== undefined);\n if (scoresWithPassed.length > 0) {\n return scoresWithPassed.every((s) => s.passed === true);\n }\n const passCriterion = evaluator.getPassCriterion();\n if (passCriterion) {\n return passCriterion(result);\n }\n const passThreshold = evaluator.getPassThreshold();\n if (passThreshold !== undefined) {\n const numeric = toNumericScoreFromScores(scores);\n return numeric !== undefined && numeric >= passThreshold;\n }\n return true;\n}\n\nfunction normalizeResult(\n result: unknown,\n): {\n scores: ReadonlyArray<ScoreItem>;\n metrics?: ReadonlyArray<MetricItem>;\n} {\n if (typeof result !== 'object' || result === null) {\n return { scores: [] };\n }\n const obj = result as Record<string, unknown>;\n const scores = Array.isArray(obj.scores)\n ? (obj.scores as ReadonlyArray<ScoreItem>)\n : [];\n const metrics = Array.isArray(obj.metrics)\n ? (obj.metrics as ReadonlyArray<MetricItem>)\n : undefined;\n return { scores, metrics };\n}\n\nfunction readOutput(testCase: CollectedTestCase['testCase']): unknown {\n const candidate = testCase as unknown as { getOutput?: () => unknown };\n if (typeof candidate.getOutput !== 'function') {\n return undefined;\n }\n return candidate.getOutput();\n}\n\nexport interface RunTask {\n runId: string;\n datasetId: string;\n dataset: Dataset;\n evaluators: ReadonlyArray<{\n id: string;\n evaluator: Evaluator<unknown, unknown, unknown, unknown>;\n }>;\n testCases: ReadonlyArray<CollectedTestCase>;\n snapshot: RunSnapshot;\n maxConcurrency: number;\n}\n\nfunction nowIsoForFile(): string {\n return new Date().toISOString().replace(/[:.]/g, '-');\n}\n\nexport function createArtifactPath(\n artifactDirectory: string,\n datasetId: string,\n runId: string,\n): string {\n return join(\n artifactDirectory,\n `${datasetId}_${runId}_${nowIsoForFile()}.jsonl`,\n );\n}\n\nfunction processOneTestCase(\n task: RunTask,\n testCaseItem: CollectedTestCase,\n totalEvaluations: number,\n publishEvent: (event: RunnerEvent) => Effect.Effect<void, never, never>,\n persistenceQueue: Queue.Queue<PersistenceMessage>,\n updateSnapshot: (\n runId: string,\n updater: (snapshot: RunSnapshot) => RunSnapshot,\n ) => void,\n completedRef: Ref.Ref<number>,\n passedRef: Ref.Ref<number>,\n failedRef: Ref.Ref<number>,\n): Effect.Effect<void, never, never> {\n return Effect.gen(function* () {\n const reruns =\n typeof testCaseItem.testCase.getReruns === 'function'\n ? testCaseItem.testCase.getReruns()\n : 1;\n const rerunPassed: boolean[] = [];\n\n for (let r = 0; r < reruns; r++) {\n const started = Date.now();\n const evaluatorScores: Array<{\n evaluatorId: string;\n scores: ReadonlyArray<ScoreItem>;\n passed: boolean;\n metrics?: ReadonlyArray<MetricItem>;\n logs?: ReadonlyArray<DiffLogEntry>;\n }> = [];\n let testCaseError: string | undefined;\n const output = readOutput(testCaseItem.testCase);\n\n for (const { id: evaluatorId, evaluator } of task.evaluators) {\n const evaluateFn = evaluator.getEvaluateFn();\n if (!evaluateFn) {\n continue;\n }\n\n try {\n const logs: DiffLogEntry[] = [];\n const logDiff: (\n expected: unknown,\n actual: unknown,\n options?: { label?: string },\n ) => void = (expected, actual, options) => {\n logs.push(createDiffLogEntry(expected, actual, options));\n };\n\n const ctx = yield* Effect.promise(() =>\n Promise.resolve(evaluator.resolveContext()),\n );\n const result = yield* Effect.promise(() =>\n Promise.resolve(\n evaluateFn({\n input: testCaseItem.testCase.getInput(),\n ctx,\n output,\n logDiff,\n }),\n ),\n );\n const { scores, metrics } = normalizeResult(result);\n const passed = computeEvaluatorPassed(evaluator, result, scores);\n evaluatorScores.push({\n evaluatorId,\n scores,\n passed,\n metrics,\n logs: logs.length > 0 ? logs : undefined,\n });\n } catch (error) {\n testCaseError =\n error instanceof Error\n ? error.message\n : 'Evaluator execution failed';\n evaluatorScores.push({\n evaluatorId,\n scores: [],\n passed: false,\n });\n }\n }\n\n const rerunPassedThis = evaluatorScores.every((s) => s.passed);\n rerunPassed.push(rerunPassedThis);\n const completedEvaluations = yield* Ref.modify(completedRef, (n) => [\n n + 1,\n n + 1,\n ]);\n\n const progressEvent: RunnerEvent = {\n type: 'TestCaseProgress',\n runId: task.runId,\n testCaseId: testCaseItem.id,\n testCaseName: testCaseItem.testCase.getName(),\n completedTestCases: completedEvaluations,\n totalTestCases: totalEvaluations,\n rerunIndex: r + 1,\n rerunTotal: reruns,\n passed: rerunPassedThis,\n durationMs: Date.now() - started,\n evaluatorScores,\n output,\n errorMessage: testCaseError,\n };\n\n updateSnapshot(task.runId, (snapshot) => ({\n ...snapshot,\n completedTestCases: completedEvaluations,\n }));\n\n yield* publishEvent(progressEvent);\n yield* Queue.offer(persistenceQueue, {\n runId: task.runId,\n artifactPath: task.snapshot.artifactPath,\n payload: progressEvent,\n });\n }\n\n const testCasePassed = rerunPassed.every(Boolean);\n if (testCasePassed) {\n yield* Ref.update(passedRef, (n) => n + 1);\n } else {\n yield* Ref.update(failedRef, (n) => n + 1);\n }\n\n const [passed, failed] = yield* Effect.all([\n Ref.get(passedRef),\n Ref.get(failedRef),\n ]);\n updateSnapshot(task.runId, (snapshot) => ({\n ...snapshot,\n passedTestCases: passed,\n failedTestCases: failed,\n }));\n });\n}\n\nexport const executeRunTask = (\n task: RunTask,\n publishEvent: (event: RunnerEvent) => Effect.Effect<void, never, never>,\n persistenceQueue: Queue.Queue<PersistenceMessage>,\n updateSnapshot: (\n runId: string,\n updater: (snapshot: RunSnapshot) => RunSnapshot,\n ) => void,\n): Effect.Effect<void, never, never> =>\n Effect.gen(function* () {\n const startedAt = Date.now();\n updateSnapshot(task.runId, (snapshot) => ({\n ...snapshot,\n status: 'running',\n startedAt,\n }));\n yield* publishEvent({\n type: 'RunStarted',\n runId: task.runId,\n startedAt,\n });\n\n const totalEvaluations = task.testCases.reduce(\n (sum, tc) =>\n sum +\n (typeof tc.testCase.getReruns === 'function'\n ? tc.testCase.getReruns()\n : 1),\n 0,\n );\n const maxConcurrency = Math.max(1, task.maxConcurrency ?? 1);\n\n const completedRef = yield* Ref.make(0);\n const passedRef = yield* Ref.make(0);\n const failedRef = yield* Ref.make(0);\n\n const processTestCase = (testCaseItem: CollectedTestCase) =>\n processOneTestCase(\n task,\n testCaseItem,\n totalEvaluations,\n publishEvent,\n persistenceQueue,\n updateSnapshot,\n completedRef,\n passedRef,\n failedRef,\n );\n\n yield* Effect.forEach(\n task.testCases,\n processTestCase,\n maxConcurrency > 1 ? { concurrency: maxConcurrency } : undefined,\n );\n\n const [completedEvaluations, passedUniqueTestCases, failedUniqueTestCases] =\n yield* Effect.all([\n Ref.get(completedRef),\n Ref.get(passedRef),\n Ref.get(failedRef),\n ]);\n\n const finishedAt = Date.now();\n const completedEvent: RunnerEvent = {\n type: 'RunCompleted',\n runId: task.runId,\n finishedAt,\n passedTestCases: passedUniqueTestCases,\n failedTestCases: failedUniqueTestCases,\n totalTestCases: task.testCases.length,\n artifactPath: task.snapshot.artifactPath,\n };\n\n updateSnapshot(task.runId, (snapshot) => ({\n ...snapshot,\n status: 'completed',\n completedTestCases: completedEvaluations,\n passedTestCases: passedUniqueTestCases,\n failedTestCases: failedUniqueTestCases,\n finishedAt,\n }));\n\n yield* publishEvent(completedEvent);\n yield* Queue.offer(persistenceQueue, {\n runId: task.runId,\n artifactPath: task.snapshot.artifactPath,\n payload: completedEvent,\n });\n yield* publishEvent({\n type: 'ArtifactFlushed',\n runId: task.runId,\n artifactPath: task.snapshot.artifactPath,\n });\n });\n","import { diffLines } from 'diff';\n\nfunction toJsonLines(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction formatDiffString(\n changes: Array<{ value: string; added?: boolean; removed?: boolean }>,\n): string {\n const lines: string[] = [];\n for (const part of changes) {\n const prefix = part.added ? '+' : part.removed ? '-' : ' ';\n const partLines = part.value.split('\\n');\n if (partLines[partLines.length - 1] === '') {\n partLines.pop();\n }\n for (const line of partLines) {\n lines.push(`${prefix} ${line}`);\n }\n }\n return lines.join('\\n');\n}\n\nfunction createDiffString(expected: unknown, actual: unknown): string {\n const expectedStr = toJsonLines(expected);\n const actualStr = toJsonLines(actual);\n const changes = diffLines(expectedStr, actualStr);\n return formatDiffString(changes);\n}\n\nexport interface DiffLogEntry {\n type: 'diff';\n label?: string;\n expected: unknown;\n actual: unknown;\n diff: string;\n}\n\nexport interface PrintJsonDiffOptions {\n /** Enable ANSI colors (default: true) */\n color?: boolean;\n}\n\n/**\n * Creates a DiffLogEntry for storage in run artifacts (plain text, no ANSI).\n */\nexport function createDiffLogEntry(\n expected: unknown,\n actual: unknown,\n options?: { label?: string },\n): DiffLogEntry {\n const diff = createDiffString(expected, actual);\n return {\n type: 'diff',\n label: options?.label,\n expected,\n actual,\n diff: diff || '(no differences)',\n };\n}\n\n/**\n * Returns the plain diff string. Use for storage or when applying colors separately.\n */\nexport function getDiffString(entry: DiffLogEntry): string {\n return createDiffString(entry.expected, entry.actual) || '(no differences)';\n}\n\n/**\n * Returns lines from the diff, each with a type for color application.\n */\nexport function getDiffLines(entry: DiffLogEntry): Array<{ type: 'add' | 'remove' | 'context'; line: string }> {\n const raw = createDiffString(entry.expected, entry.actual) || '(no differences)';\n return raw.split('\\n').map((line) => {\n const trimmed = line.trimStart();\n if (trimmed.startsWith('-') && !trimmed.startsWith('---')) {\n return { type: 'remove' as const, line };\n }\n if (trimmed.startsWith('+') && !trimmed.startsWith('+++')) {\n return { type: 'add' as const, line };\n }\n return { type: 'context' as const, line };\n });\n}\n\n/**\n * Prints a colorized JSON diff between two values to stdout.\n * Useful in evaluators to show expected vs actual output differences.\n * @param expected - The expected/reference value (shown as removed with -)\n * @param actual - The actual value (shown as added with +)\n * @returns The diff string (also printed to console)\n */\nexport function printJsonDiff(\n expected: unknown,\n actual: unknown,\n options: PrintJsonDiffOptions = {},\n): string {\n const diff = createDiffString(expected, actual);\n if (options.color) {\n const lines = diff.split('\\n').map((line) => {\n const trimmed = line.trimStart();\n if (trimmed.startsWith('-') && !trimmed.startsWith('---')) {\n return `\\x1b[31m${line}\\x1b[0m`;\n }\n if (trimmed.startsWith('+') && !trimmed.startsWith('+++')) {\n return `\\x1b[32m${line}\\x1b[0m`;\n }\n return line;\n });\n const colored = lines.join('\\n');\n console.log(colored || '(no differences)');\n return colored;\n }\n console.log(diff || '(no differences)');\n return diff;\n}\n","const registry = new Map<string, MetricDef<unknown>>();\n\nexport interface MetricItem<TData = unknown> {\n readonly id: string;\n readonly data: TData;\n}\n\nexport interface FormatMetricOptions {\n isAggregated?: boolean;\n}\n\nexport interface MetricDef<TData = unknown> {\n readonly id: string;\n readonly name?: string;\n readonly aggregate?: (values: ReadonlyArray<TData>) => TData;\n format(data: TData, options?: FormatMetricOptions): string;\n make(data: TData): MetricItem<TData>;\n}\n\nexport const Metric = {\n of<TData>(config: {\n id: string;\n name?: string;\n format: (data: TData, options?: FormatMetricOptions) => string;\n aggregate?: (values: ReadonlyArray<TData>) => TData;\n }): MetricDef<TData> {\n const def: MetricDef<TData> = {\n id: config.id,\n name: config.name,\n aggregate: config.aggregate,\n format: config.format,\n make: (data: TData) => ({ id: config.id, data }),\n };\n registry.set(config.id, def as MetricDef<unknown>);\n return def;\n },\n};\n\nexport function getMetricById(id: string): MetricDef<unknown> | undefined {\n return registry.get(id);\n}\n","const registry = new Map<string, ScoreDef<unknown>>();\n\nexport type ScoreDisplayStrategy = 'bar' | 'number' | 'passFail';\n\nexport interface ScoreItem<TData = unknown> {\n readonly id: string;\n readonly data: TData;\n readonly passed?: boolean;\n}\n\nexport interface FormatScoreOptions {\n isAggregated?: boolean;\n}\n\nexport interface ScoreDef<TData = unknown> {\n readonly id: string;\n readonly name?: string;\n readonly displayStrategy: ScoreDisplayStrategy;\n readonly aggregate?: (values: ReadonlyArray<TData>) => TData;\n format(data: TData, options?: FormatScoreOptions): string;\n make(\n data: TData,\n options?: { definePassed?: (data: TData) => boolean },\n ): ScoreItem<TData>;\n}\n\nexport const Score = {\n of<TData>(config: {\n id: string;\n name?: string;\n displayStrategy: ScoreDisplayStrategy;\n format: (data: TData, options?: FormatScoreOptions) => string;\n aggregate?: (values: ReadonlyArray<TData>) => TData;\n }): ScoreDef<TData> {\n const def: ScoreDef<TData> = {\n id: config.id,\n name: config.name,\n displayStrategy: config.displayStrategy,\n aggregate: config.aggregate,\n format: config.format,\n make: (data: TData, options?: { definePassed?: (data: TData) => boolean }) => {\n const passed =\n options?.definePassed !== undefined\n ? options.definePassed(data)\n : undefined;\n return {\n id: config.id,\n data,\n ...(passed !== undefined && { passed }),\n };\n },\n };\n registry.set(config.id, def as ScoreDef<unknown>);\n return def;\n },\n};\n\nexport function getScoreById(id: string): ScoreDef<unknown> | undefined {\n return registry.get(id);\n}\n","/** Average of numeric `value` fields (e.g. for percentScore) */\nexport function aggregateAverage(values: ReadonlyArray<{ value: number }>): {\n value: number;\n} {\n if (values.length === 0) {\n return { value: 0 };\n }\n const sum = values.reduce((s, v) => s + v.value, 0);\n return { value: sum / values.length };\n}\n\n/** Average with sample std dev (for percentScore when aggregated) */\nexport function aggregateAverageWithVariance(\n values: ReadonlyArray<{ value: number }>,\n): { value: number; stdDev?: number; count: number } {\n if (values.length === 0) {\n return { value: 0, count: 0 };\n }\n const sum = values.reduce((s, v) => s + v.value, 0);\n const sumSq = values.reduce((s, v) => s + v.value * v.value, 0);\n const mean = sum / values.length;\n let stdDev: number | undefined;\n if (values.length >= 2) {\n const variance = (sumSq - values.length * mean * mean) / (values.length - 1);\n stdDev = variance > 0 ? Math.sqrt(variance) : 0;\n }\n return { value: mean, stdDev, count: values.length };\n}\n\n/** All runs must pass (for binaryScore). Returns passed and count for spread display. */\nexport function aggregateAll(values: ReadonlyArray<{ passed: boolean }>): {\n passed: boolean;\n passedCount?: number;\n totalCount?: number;\n} {\n const total = values.length;\n const passedCount = values.filter((v) => v.passed).length;\n return {\n passed: total > 0 && values.every((v) => v.passed),\n passedCount,\n totalCount: total,\n };\n}\n\ntype TokenCountSum = {\n input: number;\n output: number;\n inputCached: number;\n outputCached: number;\n};\n\n/** Sum token counts across reruns */\nexport function aggregateTokenCountSum(\n values: ReadonlyArray<{\n input?: number;\n output?: number;\n inputCached?: number;\n outputCached?: number;\n }>,\n): TokenCountSum {\n const initial: TokenCountSum = {\n input: 0,\n output: 0,\n inputCached: 0,\n outputCached: 0,\n };\n return values.reduce<TokenCountSum>(\n (acc, v) => ({\n input: acc.input + (v.input ?? 0),\n output: acc.output + (v.output ?? 0),\n inputCached: acc.inputCached + (v.inputCached ?? 0),\n outputCached: acc.outputCached + (v.outputCached ?? 0),\n }),\n initial,\n );\n}\n\n/** Average latency across reruns */\nexport function aggregateLatencyAverage(\n values: ReadonlyArray<{ ms: number }>,\n): { ms: number } {\n if (values.length === 0) {\n return { ms: 0 };\n }\n const sum = values.reduce((s, v) => s + v.ms, 0);\n return { ms: sum / values.length };\n}\n","import { aggregateLatencyAverage, aggregateTokenCountSum } from '../aggregators';\nimport { Metric } from '../metric';\n\nexport interface TokenCountData {\n input?: number;\n output?: number;\n inputCached?: number;\n outputCached?: number;\n}\n\nexport const tokenCountMetric = Metric.of<TokenCountData>({\n id: 'token-count',\n name: 'Tokens',\n aggregate: aggregateTokenCountSum,\n format: (data, options) => {\n const input = data.input ?? 0;\n const output = data.output ?? 0;\n const inputCached = data.inputCached ?? 0;\n const outputCached = data.outputCached ?? 0;\n const cached = inputCached + outputCached;\n const base = `in:${input} out:${output} cached:${cached}`;\n return options?.isAggregated ? `Total: ${base}` : base;\n },\n});\n\nexport interface LatencyData {\n ms: number;\n}\n\nexport const latencyMetric = Metric.of<LatencyData>({\n id: 'latency',\n name: 'Latency',\n aggregate: aggregateLatencyAverage,\n format: (data, options) =>\n options?.isAggregated ? `Avg: ${data.ms}ms` : `${data.ms}ms`,\n});\n","import { aggregateAll, aggregateAverageWithVariance } from '../aggregators';\nimport { Score } from '../score';\n\nexport interface PercentScoreData {\n value: number;\n stdDev?: number;\n count?: number;\n}\n\nexport const percentScore = Score.of<PercentScoreData>({\n id: 'percent',\n name: 'Score',\n displayStrategy: 'bar',\n format: (data, options) => {\n if (options?.isAggregated) {\n return data.stdDev != null\n ? `Avg: ${data.value.toFixed(2)} ± ${data.stdDev.toFixed(2)}`\n : `Avg: ${data.value.toFixed(2)}`;\n }\n return data.value.toFixed(2);\n },\n aggregate: aggregateAverageWithVariance,\n});\n\nexport interface BinaryScoreData {\n passed: boolean;\n passedCount?: number;\n totalCount?: number;\n}\n\nexport const binaryScore = Score.of<BinaryScoreData>({\n id: 'binary',\n name: 'Result',\n displayStrategy: 'passFail',\n format: (data, options) => {\n if (options?.isAggregated) {\n const base = data.passed ? 'All: PASSED' : 'Some: FAILED';\n if (\n data.passedCount != null &&\n data.totalCount != null &&\n data.totalCount > 1\n ) {\n return `${base} (${data.passedCount}/${data.totalCount})`;\n }\n return base;\n }\n return data.passed ? 'PASSED' : 'NOT PASSED';\n },\n aggregate: aggregateAll,\n});\n","import type { MetricItem } from '../evals/metric';\nimport type { ScoreItem } from '../evals/score';\nimport { getMetricById, getScoreById } from '../evals';\n\nexport function aggregateScoreItems(\n items: ReadonlyArray<ScoreItem>,\n): ScoreItem | undefined {\n if (items.length === 0) return undefined;\n const def = getScoreById(items[0].id);\n if (!def?.aggregate) return items[items.length - 1];\n const aggregated = def.aggregate(items.map((i) => i.data as never));\n return { ...items[0], data: aggregated };\n}\n\nexport function aggregateMetricItems(\n items: ReadonlyArray<MetricItem>,\n): MetricItem | undefined {\n if (items.length === 0) return undefined;\n const def = getMetricById(items[0].id);\n if (!def?.aggregate) return items[items.length - 1];\n const aggregated = def.aggregate(items.map((i) => i.data as never));\n return { ...items[0], data: aggregated };\n}\n\nexport function toNumericScoreFromScores(\n scores: ReadonlyArray<ScoreItem>,\n): number | undefined {\n for (const item of scores) {\n const def = getScoreById(item.id);\n if (def && def.displayStrategy === 'bar' && typeof item.data === 'object' && item.data !== null && 'value' in item.data) {\n const value = (item.data as { value: unknown }).value;\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n }\n const numeric = toNumericScore(item.data);\n if (numeric !== undefined) {\n return numeric;\n }\n }\n return undefined;\n}\n\nexport function toNumericScore(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value !== 'object' || value === null) {\n return undefined;\n }\n const obj = value as Record<string, unknown>;\n if (\n 'score' in obj &&\n typeof obj.score === 'number' &&\n Number.isFinite(obj.score)\n ) {\n return obj.score;\n }\n const numberValues = Object.values(value).filter(\n (entry): entry is number =>\n typeof entry === 'number' && Number.isFinite(entry),\n );\n if (numberValues.length === 0) {\n return undefined;\n }\n return (\n numberValues.reduce((sum, entry) => sum + entry, 0) / numberValues.length\n );\n}\n","import { readdir, readFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\n\nimport type { RunnerConfig } from './config';\nimport type { RunSnapshot } from './events';\n\nexport interface ParsedTestCaseProgress {\n testCaseId: string;\n testCaseName: string;\n completedTestCases: number;\n totalTestCases: number;\n rerunIndex?: number;\n rerunTotal?: number;\n passed: boolean;\n durationMs: number;\n evaluatorScores: ReadonlyArray<{\n evaluatorId: string;\n scores: ReadonlyArray<{ id: string; data: unknown; passed?: boolean }>;\n passed: boolean;\n metrics?: ReadonlyArray<{ id: string; data: unknown }>;\n logs?: ReadonlyArray<{\n type: 'diff';\n label?: string;\n expected: unknown;\n actual: unknown;\n diff: string;\n }>;\n }>;\n}\n\nexport async function loadRunSnapshotsFromArtifacts(\n config: RunnerConfig,\n): Promise<RunSnapshot[]> {\n const baseDir = resolve(config.artifactDirectory);\n let entries: string[];\n try {\n entries = await readdir(baseDir);\n } catch {\n return [];\n }\n\n const jsonlFiles = entries.filter((name) => name.endsWith('.jsonl'));\n const snapshots: RunSnapshot[] = [];\n\n for (const fileName of jsonlFiles) {\n const filePath = join(baseDir, fileName);\n try {\n const snapshot = await parseArtifactToSnapshot(filePath, config);\n if (snapshot) {\n snapshots.push(snapshot);\n }\n } catch {\n // Skip malformed or unreadable files\n }\n }\n\n return snapshots.sort((a, b) => b.queuedAt - a.queuedAt);\n}\n\nasync function parseArtifactToSnapshot(\n filePath: string,\n _config: RunnerConfig,\n): Promise<RunSnapshot | null> {\n const content = await readFile(filePath, 'utf8');\n const lines = content.split('\\n').filter((line) => line.trim().length > 0);\n if (lines.length === 0) {\n return null;\n }\n\n let runQueued: {\n runId: string;\n datasetId: string;\n datasetName: string;\n evaluatorIds: ReadonlyArray<string>;\n totalTestCases: number;\n artifactPath: string;\n ts?: number;\n } | null = null;\n\n let runCompleted: {\n passedTestCases: number;\n failedTestCases: number;\n totalTestCases: number;\n finishedAt: number;\n } | null = null;\n\n let runFailed: { finishedAt: number; errorMessage: string } | null = null;\n let runStarted: { startedAt: number } | null = null;\n\n for (const line of lines) {\n try {\n const event = JSON.parse(line) as Record<string, unknown>;\n const type = event.type as string;\n\n if (type === 'RunQueued') {\n runQueued = {\n runId: event.runId as string,\n datasetId: event.datasetId as string,\n datasetName: event.datasetName as string,\n evaluatorIds: event.evaluatorIds as ReadonlyArray<string>,\n totalTestCases: (event.totalTestCases as number) ?? 0,\n artifactPath: (event.artifactPath as string) ?? filePath,\n ts: event.ts as number | undefined,\n };\n }\n if (type === 'RunStarted') {\n runStarted = { startedAt: event.startedAt as number };\n }\n if (type === 'RunCompleted') {\n runCompleted = {\n passedTestCases: event.passedTestCases as number,\n failedTestCases: event.failedTestCases as number,\n totalTestCases: event.totalTestCases as number,\n finishedAt: event.finishedAt as number,\n };\n }\n if (type === 'RunFailed') {\n runFailed = {\n finishedAt: event.finishedAt as number,\n errorMessage: event.errorMessage as string,\n };\n }\n } catch {\n // Skip malformed lines\n }\n }\n\n if (!runQueued) {\n return null;\n }\n\n const artifactPath = filePath;\n\n const status = runFailed\n ? 'failed'\n : runCompleted\n ? 'completed'\n : runStarted\n ? 'running'\n : 'queued';\n\n const progress = aggregateTestCaseProgress(lines);\n const completedTestCases = runCompleted\n ? runQueued.totalTestCases\n : progress.completedTestCases;\n const passedTestCases =\n runCompleted?.passedTestCases ?? progress.passedTestCases;\n const failedTestCases =\n runCompleted?.failedTestCases ?? progress.failedTestCases;\n\n return {\n runId: runQueued.runId,\n datasetId: runQueued.datasetId,\n datasetName: runQueued.datasetName,\n evaluatorIds: runQueued.evaluatorIds,\n queuedAt: runQueued.ts ?? 0,\n startedAt: runStarted?.startedAt,\n finishedAt: runCompleted?.finishedAt ?? runFailed?.finishedAt,\n totalTestCases: runQueued.totalTestCases,\n completedTestCases,\n passedTestCases,\n failedTestCases,\n status,\n artifactPath,\n errorMessage: runFailed?.errorMessage,\n };\n}\n\nfunction aggregateTestCaseProgress(lines: string[]): {\n completedTestCases: number;\n passedTestCases: number;\n failedTestCases: number;\n} {\n let completedTestCases = 0;\n const testCasePassedBy = new Map<string, boolean>();\n for (const line of lines) {\n try {\n const event = JSON.parse(line) as Record<string, unknown>;\n if (event.type === 'TestCaseProgress') {\n const ev = event as {\n testCaseId: string;\n completedTestCases: number;\n passed: boolean;\n };\n completedTestCases = ev.completedTestCases ?? completedTestCases;\n const id = ev.testCaseId;\n const current = testCasePassedBy.get(id);\n testCasePassedBy.set(id, current === undefined ? ev.passed : current && ev.passed);\n }\n } catch {\n // skip\n }\n }\n let passedTestCases = 0;\n let failedTestCases = 0;\n for (const passed of testCasePassedBy.values()) {\n if (passed) {\n passedTestCases += 1;\n } else {\n failedTestCases += 1;\n }\n }\n return { completedTestCases, passedTestCases, failedTestCases };\n}\n\nexport async function parseArtifactFile(\n artifactPath: string,\n): Promise<ParsedTestCaseProgress[]> {\n try {\n const content = await readFile(artifactPath, 'utf8');\n const lines = content.split('\\n').filter((line) => line.trim().length > 0);\n const results: ParsedTestCaseProgress[] = [];\n for (const line of lines) {\n try {\n const event = JSON.parse(line) as Record<string, unknown>;\n if (event.type === 'TestCaseProgress') {\n const ev = event as {\n testCaseId: string;\n testCaseName: string;\n completedTestCases: number;\n totalTestCases: number;\n rerunIndex?: number;\n rerunTotal?: number;\n passed: boolean;\n durationMs: number;\n evaluatorScores: ReadonlyArray<{\n evaluatorId: string;\n scores: ReadonlyArray<{ id: string; data: unknown; passed?: boolean }>;\n passed: boolean;\n metrics?: ReadonlyArray<{ id: string; data: unknown }>;\n logs?: ReadonlyArray<{\n type: 'diff';\n label?: string;\n expected: unknown;\n actual: unknown;\n diff: string;\n }>;\n }>;\n };\n results.push({\n testCaseId: ev.testCaseId,\n testCaseName: ev.testCaseName,\n completedTestCases: ev.completedTestCases,\n totalTestCases: ev.totalTestCases,\n rerunIndex: ev.rerunIndex,\n rerunTotal: ev.rerunTotal,\n passed: ev.passed,\n durationMs: ev.durationMs,\n evaluatorScores: ev.evaluatorScores ?? [],\n });\n }\n } catch {\n // skip malformed lines\n }\n }\n return results;\n } catch {\n return [];\n }\n}\n","import { appendFile, mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\n\nimport { Effect, Queue } from 'effect';\n\nexport interface PersistenceMessage {\n runId: string;\n artifactPath: string;\n payload: unknown;\n}\n\nasync function appendJsonLine(\n artifactPath: string,\n payload: unknown,\n): Promise<void> {\n await mkdir(dirname(artifactPath), { recursive: true });\n await appendFile(artifactPath, `${JSON.stringify(payload)}\\n`, 'utf8');\n}\n\nexport const createPersistenceWorker = (\n queue: Queue.Queue<PersistenceMessage>,\n): Effect.Effect<never, never, never> =>\n Effect.forever(\n Effect.gen(function* () {\n const message = yield* Queue.take(queue);\n yield* Effect.promise(() =>\n appendJsonLine(message.artifactPath, {\n runId: message.runId,\n ts: Date.now(),\n ...message.payload,\n }),\n );\n }),\n );\n","import type { CollectedTestCase, SearchTestCasesQuery } from './events';\n\nfunction matchesAny(\n value: string,\n matchers: ReadonlyArray<string | RegExp> | undefined,\n): boolean {\n if (!matchers || matchers.length === 0) {\n return true;\n }\n return matchers.some((matcher) =>\n typeof matcher === 'string' ? matcher === value : matcher.test(value),\n );\n}\n\nfunction matchesPath(\n value: string,\n matchers: ReadonlyArray<string | RegExp> | undefined,\n): boolean {\n if (!matchers || matchers.length === 0) {\n return true;\n }\n return matchers.some((matcher) => {\n if (typeof matcher === 'string') {\n return value.includes(matcher);\n }\n return matcher.test(value);\n });\n}\n\nexport function searchCollectedTestCases(\n all: ReadonlyArray<CollectedTestCase>,\n query?: SearchTestCasesQuery,\n): ReadonlyArray<CollectedTestCase> {\n if (!query) {\n return all;\n }\n\n return all.filter((item) => {\n const tags = item.testCase.getTags();\n\n if (\n query.excludedTags &&\n tags.some((tag) => matchesAny(tag, query.excludedTags))\n ) {\n return false;\n }\n if (\n query.excludedPaths &&\n matchesPath(item.filePath, query.excludedPaths)\n ) {\n return false;\n }\n\n const includedTagsMatch =\n !query.includedTags ||\n query.includedTags.length === 0 ||\n tags.some((tag) => matchesAny(tag, query.includedTags));\n\n const includedPathsMatch =\n !query.includedPaths ||\n query.includedPaths.length === 0 ||\n matchesPath(item.filePath, query.includedPaths);\n\n return includedTagsMatch && includedPathsMatch;\n });\n}\n","export type SimpleCliCommand = 'run' | 'generate';\n\nexport interface SimpleCliArgs {\n command?: SimpleCliCommand;\n datasetName?: string;\n evaluatorPattern?: string;\n help: boolean;\n unknownArgs: string[];\n}\n\nexport function parseSimpleCliArgs(argv: string[]): SimpleCliArgs {\n const args: SimpleCliArgs = {\n help: false,\n unknownArgs: [],\n };\n let index = 0;\n if (argv[0] === 'run' || argv[0] === 'generate') {\n args.command = argv[0];\n index = 1;\n }\n\n for (; index < argv.length; index += 1) {\n const token = argv[index];\n if (token === '--help' || token === '-h') {\n args.help = true;\n continue;\n }\n if ((token === '--dataset' || token === '--datasetName') && argv[index + 1]) {\n args.datasetName = argv[index + 1];\n index += 1;\n continue;\n }\n if ((token === '--evaluator' || token === '--name') && argv[index + 1]) {\n args.evaluatorPattern = argv[index + 1];\n index += 1;\n continue;\n }\n args.unknownArgs.push(token);\n }\n\n return args;\n}\n\nexport function getSimpleCliUsage(): string {\n return [\n 'Usage:',\n ' eval-agents-simple run --dataset <datasetName> --evaluator <name-or-pattern>',\n ' eval-agents-simple generate --dataset <datasetName>',\n '',\n 'Pattern examples for --evaluator:',\n ' score-evaluator exact name (case-insensitive)',\n ' \"*score*\" wildcard pattern',\n ' \"/score/i\" regex literal',\n ].join('\\n');\n}\n","const ansi = {\n reset: '\\x1b[0m',\n dim: '\\x1b[2m',\n cyan: '\\x1b[36m',\n} as const;\n\nexport function printBanner(): void {\n const c = (s: string) => `${ansi.cyan}${s}${ansi.reset}`;\n const d = (s: string) => `${ansi.dim}${s}${ansi.reset}`;\n\n const lines = [\n '',\n ` ${c('╭─────────────────────────────────────────────╮')}`,\n ` ${c('│')} ${d('@m4trix/evals')} ${c('·')} ${d('eval-agents-simple')} ${c('│')}`,\n ` ${c('╰─────────────────────────────────────────────╯')}`,\n '',\n ];\n\n console.log(lines.join('\\n'));\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport { writeFile } from 'node:fs/promises';\nimport { join, parse, resolve } from 'node:path';\n\nimport type { RunnerApi } from '../runner';\nimport { GenerateView } from './views/GenerateView';\n\ninterface GeneratedDatasetCase {\n name: string;\n input: unknown;\n output?: unknown;\n}\n\nfunction readOutput(testCase: { getOutput?: () => unknown }): unknown {\n if (typeof testCase.getOutput !== 'function') {\n return undefined;\n }\n return testCase.getOutput();\n}\n\nfunction createOutputPath(datasetFilePath: string): string {\n const parsed = parse(datasetFilePath);\n return join(parsed.dir, `${parsed.name}.cases.json`);\n}\n\nexport async function generateDatasetJsonCommandPlain(\n runner: RunnerApi,\n datasetName: string,\n): Promise<void> {\n const dataset = await runner.resolveDatasetByName(datasetName);\n if (!dataset) {\n throw new Error(`Dataset \"${datasetName}\" not found.`);\n }\n\n const testCases = await runner.collectDatasetTestCases(dataset.id);\n const payload: GeneratedDatasetCase[] = testCases.map((item) => ({\n name: item.testCase.getName(),\n input: item.testCase.getInput(),\n output: readOutput(item.testCase),\n }));\n\n const absoluteDatasetPath = resolve(process.cwd(), dataset.filePath);\n const outputPath = createOutputPath(absoluteDatasetPath);\n\n await writeFile(outputPath, `${JSON.stringify(payload, null, 2)}\\n`, 'utf8');\n\n console.log(`Generated ${payload.length} test cases for dataset \"${dataset.dataset.getName()}\".`);\n console.log(`Wrote ${outputPath}`);\n}\n\nexport async function generateDatasetJsonCommandInk(\n runner: RunnerApi,\n datasetName: string,\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const app = render(\n React.createElement(GenerateView, {\n runner,\n datasetName,\n onComplete: (err) => {\n app.unmount();\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n },\n }),\n );\n });\n}\n","/** @jsxImportSource react */\nimport React, { useEffect, useState } from 'react';\nimport { Box, Text } from 'ink';\n\nimport type { RunnerApi } from '../../runner';\nimport { Banner } from './Banner';\n\ninterface GenerateViewProps {\n runner: RunnerApi;\n datasetName: string;\n onComplete: (error?: Error) => void;\n}\n\nexport function GenerateView({\n runner,\n datasetName,\n onComplete,\n}: GenerateViewProps): React.ReactNode {\n const [result, setResult] = useState<{\n count: number;\n datasetName: string;\n outputPath: string;\n } | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n async function run() {\n const dataset = await runner.resolveDatasetByName(datasetName);\n if (!dataset) {\n setError(new Error(`Dataset \"${datasetName}\" not found.`));\n onComplete(new Error(`Dataset \"${datasetName}\" not found.`));\n return;\n }\n\n const { writeFile } = await import('node:fs/promises');\n const { join, parse, resolve } = await import('node:path');\n\n const testCases = await runner.collectDatasetTestCases(dataset.id);\n const payload = testCases.map((item) => {\n const tc = item.testCase as { getOutput?: () => unknown };\n return {\n name: item.testCase.getName(),\n input: item.testCase.getInput(),\n output: typeof tc.getOutput === 'function' ? tc.getOutput() : undefined,\n };\n });\n\n const absoluteDatasetPath = resolve(process.cwd(), dataset.filePath);\n const parsed = parse(absoluteDatasetPath);\n const outputPath = join(parsed.dir, `${parsed.name}.cases.json`);\n\n await writeFile(\n outputPath,\n `${JSON.stringify(payload, null, 2)}\\n`,\n 'utf8',\n );\n\n if (!cancelled) {\n setResult({\n count: payload.length,\n datasetName: dataset.dataset.getName(),\n outputPath,\n });\n setTimeout(() => onComplete(), 200);\n }\n }\n\n void run();\n return () => {\n cancelled = true;\n };\n }, [runner, datasetName, onComplete]);\n\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Banner />\n <Text color=\"red\">{error.message}</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Banner />\n </Box>\n {result && (\n <Box flexDirection=\"column\">\n <Text color=\"green\">\n Generated {result.count} test cases for dataset \"{result.datasetName}\".\n </Text>\n <Text color=\"gray\">Wrote {result.outputPath}</Text>\n </Box>\n )}\n </Box>\n );\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Box, Text } from 'ink';\n\nexport function Banner(): React.ReactNode {\n return (\n <Box borderStyle=\"round\" borderColor=\"cyan\" paddingX={1} paddingY={0}>\n <Text color=\"gray\">@m4trix/evals</Text>\n <Text color=\"cyan\"> · </Text>\n <Text color=\"gray\">eval-agents-simple</Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport { getDiffLines, getMetricById, getScoreById } from '../evals';\nimport type { ScoreItem } from '../evals/score';\nimport type { RunnerApi, RunnerEvent } from '../runner';\nimport {\n aggregateMetricItems,\n aggregateScoreItems,\n toNumericScore,\n toNumericScoreFromScores,\n} from '../runner/score-utils';\nimport { RunView } from './views/RunView';\n\ninterface EvaluatorAggregate {\n total: number;\n sumSq: number;\n count: number;\n passed: number;\n failed: number;\n}\n\nfunction sampleStdDev(sum: number, sumSq: number, n: number): number | undefined {\n if (n < 2) return undefined;\n const mean = sum / n;\n const variance = (sumSq - n * mean * mean) / (n - 1);\n return variance > 0 ? Math.sqrt(variance) : 0;\n}\n\ninterface TestCaseScoreSummary {\n name: string;\n averageScore?: number;\n stdDev?: number;\n aggregatedScoreItem?: ScoreItem;\n isAggregated: boolean;\n durationMs: number;\n passed: boolean;\n}\n\ninterface TestCaseEventAcc {\n name: string;\n events: Array<{\n averageScore?: number;\n passed: boolean;\n durationMs: number;\n evaluatorScores: ReadonlyArray<{\n evaluatorId: string;\n scores: ReadonlyArray<ScoreItem>;\n passed: boolean;\n metrics?: ReadonlyArray<{ id: string; data: unknown }>;\n }>;\n }>;\n}\n\nfunction buildTestCaseSummaries(\n byId: Map<string, TestCaseEventAcc>,\n): TestCaseScoreSummary[] {\n const summaries: TestCaseScoreSummary[] = [];\n for (const { name, events } of byId.values()) {\n const passed = events.every((e) => e.passed);\n const durationMs = events.reduce((sum, e) => sum + e.durationMs, 0);\n const isAggregated = events.length > 1;\n const allScores = events.flatMap((ev) =>\n ev.evaluatorScores\n .map((es) => toNumericScoreFromScores(es.scores))\n .filter((n): n is number => n !== undefined),\n );\n const averageScore =\n allScores.length > 0\n ? allScores.reduce((a, b) => a + b, 0) / allScores.length\n : undefined;\n const sumSq =\n allScores.length > 0 ? allScores.reduce((s, v) => s + v * v, 0) : 0;\n const total = allScores.reduce((a, b) => a + b, 0);\n const stdDev = sampleStdDev(total, sumSq, allScores.length);\n let firstAggregatedScore: ScoreItem | undefined;\n for (const evaluatorScores of events[0]?.evaluatorScores ?? []) {\n const scoreIdToItems = new Map<string, ScoreItem[]>();\n for (const ev of events) {\n const es = ev.evaluatorScores.find(\n (x) => x.evaluatorId === evaluatorScores.evaluatorId,\n );\n for (const s of es?.scores ?? []) {\n const list = scoreIdToItems.get(s.id) ?? [];\n list.push(s);\n scoreIdToItems.set(s.id, list);\n }\n }\n for (const items of scoreIdToItems.values()) {\n const agg = aggregateScoreItems(items);\n if (agg && firstAggregatedScore === undefined) {\n firstAggregatedScore = agg;\n break;\n }\n }\n if (firstAggregatedScore !== undefined) break;\n }\n summaries.push({\n name,\n averageScore,\n stdDev: stdDev ?? undefined,\n aggregatedScoreItem: firstAggregatedScore,\n isAggregated,\n durationMs,\n passed,\n });\n }\n return summaries;\n}\n\nconst ansi = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n red: '\\x1b[31m',\n cyan: '\\x1b[36m',\n magenta: '\\x1b[35m',\n} as const;\n\nfunction colorize(text: string, color: string): string {\n return `${color}${text}${ansi.reset}`;\n}\n\nfunction scoreToColor(score: number): string {\n if (score >= 80) {\n return ansi.green;\n }\n if (score >= 50) {\n return ansi.yellow;\n }\n return ansi.red;\n}\n\nfunction getEvaluatorSummaryLine(\n evaluatorName: string,\n aggregate: EvaluatorAggregate | undefined,\n): string {\n if (!aggregate || aggregate.count === 0) {\n return `- ${evaluatorName.padEnd(28)} no numeric scores`;\n }\n const mean = aggregate.total / aggregate.count;\n const sd = sampleStdDev(aggregate.total, aggregate.sumSq, aggregate.count);\n const meanStr =\n sd !== undefined\n ? `${mean.toFixed(2)} ± ${sd.toFixed(2)}`\n : mean.toFixed(2);\n return `- ${evaluatorName.padEnd(28)} avg=${colorize(meanStr, scoreToColor(mean))} passed=${aggregate.passed} failed=${aggregate.failed}`;\n}\n\nfunction createBar(value: number, max = 100, width = 20): string {\n const safe = Math.max(0, Math.min(max, value));\n const filled = Math.round((safe / max) * width);\n return `${'█'.repeat(filled)}${'░'.repeat(width - filled)}`;\n}\n\nfunction aggregateEvaluatorScoresFromEvents(\n events: TestCaseEventAcc['events'],\n evaluatorNameById: Map<string, string>,\n): Array<{\n evaluatorId: string;\n scores: ReadonlyArray<ScoreItem>;\n passed: boolean;\n metrics?: ReadonlyArray<{ id: string; data: unknown }>;\n}> {\n if (events.length === 0) return [];\n const evaluatorIds = new Set(\n events.flatMap((e) => e.evaluatorScores.map((x) => x.evaluatorId)),\n );\n const result: Array<{\n evaluatorId: string;\n scores: ReadonlyArray<ScoreItem>;\n passed: boolean;\n metrics?: ReadonlyArray<{ id: string; data: unknown }>;\n }> = [];\n for (const evaluatorId of evaluatorIds) {\n const scoreIdToItems = new Map<string, ScoreItem[]>();\n const metricIdToItems = new Map<string, Array<{ id: string; data: unknown }>>();\n for (const ev of events) {\n const es = ev.evaluatorScores.find((x) => x.evaluatorId === evaluatorId);\n for (const s of es?.scores ?? []) {\n const list = scoreIdToItems.get(s.id) ?? [];\n list.push(s);\n scoreIdToItems.set(s.id, list);\n }\n for (const m of es?.metrics ?? []) {\n const list = metricIdToItems.get(m.id) ?? [];\n list.push(m);\n metricIdToItems.set(m.id, list);\n }\n }\n const aggregatedScores: ScoreItem[] = [];\n for (const items of scoreIdToItems.values()) {\n const agg = aggregateScoreItems(items);\n if (agg) aggregatedScores.push(agg);\n }\n const aggregatedMetrics = Array.from(metricIdToItems.entries())\n .map(([, items]) => aggregateMetricItems(items as never))\n .filter((m): m is { id: string; data: unknown } => m !== undefined);\n const passed = events.every((ev) => {\n const es = ev.evaluatorScores.find((x) => x.evaluatorId === evaluatorId);\n return es?.passed ?? false;\n });\n result.push({\n evaluatorId,\n scores: aggregatedScores,\n passed,\n metrics:\n aggregatedMetrics.length > 0 ? aggregatedMetrics : undefined,\n });\n }\n return result;\n}\n\nfunction formatEvaluatorScoreLine(\n name: string,\n scores: ReadonlyArray<ScoreItem>,\n passed: boolean,\n metrics?: ReadonlyArray<{ id: string; data: unknown }>,\n options?: { isAggregated?: boolean },\n): string {\n const passLabel = passed\n ? colorize('PASS', `${ansi.bold}${ansi.green}`)\n : colorize('FAIL', `${ansi.bold}${ansi.red}`);\n const scoreParts: string[] = [];\n for (const item of scores) {\n const def = getScoreById(item.id);\n if (!def) {\n const numeric = toNumericScore(item.data);\n scoreParts.push(\n numeric !== undefined\n ? colorize(numeric.toFixed(2), scoreToColor(numeric))\n : 'n/a',\n );\n continue;\n }\n const formatted = def.format(item.data, options);\n switch (def.displayStrategy) {\n case 'bar': {\n const numeric =\n typeof item.data === 'object' &&\n item.data !== null &&\n 'value' in item.data\n ? (item.data as { value: unknown }).value\n : toNumericScore(item.data);\n if (typeof numeric === 'number' && Number.isFinite(numeric)) {\n scoreParts.push(\n `${colorize(formatted, scoreToColor(numeric))} ${colorize(createBar(numeric), ansi.dim)}`,\n );\n } else {\n scoreParts.push(formatted);\n }\n break;\n }\n case 'number':\n scoreParts.push(formatted);\n break;\n case 'passFail':\n scoreParts.push(\n colorize(\n formatted,\n item.passed === true\n ? `${ansi.bold}${ansi.green}`\n : item.passed === false\n ? `${ansi.bold}${ansi.red}`\n : ansi.dim,\n ),\n );\n break;\n }\n }\n const scoreStr = scoreParts.length > 0 ? scoreParts.join(' ') : 'n/a';\n let line = ` ${name}: ${passLabel} ${scoreStr}`;\n if (metrics && metrics.length > 0) {\n const metricParts: string[] = [];\n for (const { id, data } of metrics) {\n const def = getMetricById(id);\n if (def) {\n const formatted = def.format(data, options);\n metricParts.push(\n def.name ? `[${def.name}: ${formatted}]` : `[${formatted}]`,\n );\n }\n }\n if (metricParts.length > 0) {\n line += ` ${metricParts.join(' ')}`;\n }\n }\n return line;\n}\n\nexport async function runSimpleEvalCommandPlain(\n runner: RunnerApi,\n datasetName: string,\n evaluatorPattern: string,\n): Promise<void> {\n const dataset = await runner.resolveDatasetByName(datasetName);\n if (!dataset) {\n const known = await runner.collectDatasets();\n const available = known.map((item) => item.dataset.getName()).sort();\n throw new Error(\n available.length > 0\n ? `Dataset \"${datasetName}\" not found. Available datasets: ${available.join(', ')}`\n : `Dataset \"${datasetName}\" not found and no datasets were discovered.`,\n );\n }\n\n const evaluators =\n await runner.resolveEvaluatorsByNamePattern(evaluatorPattern);\n if (evaluators.length === 0) {\n const known = await runner.collectEvaluators();\n const available = known\n .map((item) => item.evaluator.getName())\n .filter((name): name is string => typeof name === 'string')\n .sort();\n throw new Error(\n available.length > 0\n ? `No evaluator matched \"${evaluatorPattern}\". Available evaluators: ${available.join(', ')}`\n : `No evaluator matched \"${evaluatorPattern}\" and no evaluators were discovered.`,\n );\n }\n\n const evaluatorNameById = new Map(\n evaluators.map((item) => [item.id, item.evaluator.getName() ?? item.id]),\n );\n const aggregates = new Map<string, EvaluatorAggregate>();\n const testCaseByTestId = new Map<string, TestCaseEventAcc>();\n let overallScoreTotal = 0;\n let overallScoreSumSq = 0;\n let overallScoreCount = 0;\n let completedCount = 0;\n let totalCount = 0;\n let runFinished = false;\n const spinnerFrames = ['⠋', '⠙', '⠸', '⠴', '⠦', '⠇'];\n let spinnerIndex = 0;\n\n function clearLine(): void {\n if (!process.stdout.isTTY) {\n return;\n }\n process.stdout.write('\\r\\x1b[2K');\n }\n\n function cursorUp(n: number): void {\n if (!process.stdout.isTTY || n <= 0) return;\n process.stdout.write(`\\x1b[${n}A`);\n }\n\n function drawSpinner(): void {\n if (!process.stdout.isTTY || runFinished) {\n return;\n }\n const frame = spinnerFrames[spinnerIndex % spinnerFrames.length];\n spinnerIndex += 1;\n process.stdout.write(\n `\\r${colorize(frame, ansi.cyan)} Running evaluations ${colorize(\n `${completedCount}/${totalCount}`,\n ansi.bold,\n )} ${colorize('(live)', ansi.dim)}`,\n );\n }\n\n let lastPrintedTestCaseId: string | null = null;\n let lastPrintedLineCount = 0;\n\n let spinnerTimer: NodeJS.Timeout | undefined;\n const done = new Promise<RunnerEvent>((resolve) => {\n const unsubscribe = runner.subscribeRunEvents((event) => {\n if (event.type === 'TestCaseProgress') {\n completedCount = event.completedTestCases;\n const numericScores = event.evaluatorScores\n .map((item) => toNumericScoreFromScores(item.scores))\n .filter((item): item is number => item !== undefined);\n const averageScore =\n numericScores.length > 0\n ? numericScores.reduce((sum, value) => sum + value, 0) /\n numericScores.length\n : undefined;\n\n const testCaseId = event.testCaseId;\n const existing = testCaseByTestId.get(testCaseId) ?? {\n name: event.testCaseName,\n events: [],\n };\n existing.events.push({\n averageScore,\n passed: event.passed,\n durationMs: event.durationMs,\n evaluatorScores: event.evaluatorScores,\n });\n testCaseByTestId.set(testCaseId, existing);\n\n for (const item of event.evaluatorScores) {\n const numeric = toNumericScoreFromScores(item.scores);\n if (numeric !== undefined) {\n const current = aggregates.get(item.evaluatorId) ?? {\n total: 0,\n sumSq: 0,\n count: 0,\n passed: 0,\n failed: 0,\n };\n aggregates.set(item.evaluatorId, {\n total: current.total + numeric,\n sumSq: current.sumSq + numeric * numeric,\n count: current.count + 1,\n passed: current.passed + (item.passed ? 1 : 0),\n failed: current.failed + (item.passed ? 0 : 1),\n });\n overallScoreTotal += numeric;\n overallScoreSumSq += numeric * numeric;\n overallScoreCount += 1;\n }\n }\n\n const isSameTestCase = lastPrintedTestCaseId === testCaseId;\n const isLastRerun = event.rerunIndex >= event.rerunTotal;\n const isNonTty = !process.stdout.isTTY;\n // When not TTY and we have reruns, only print the final aggregated block\n const skipPrintNonTty =\n isNonTty && event.rerunTotal > 1 && !isLastRerun;\n\n if (isSameTestCase && lastPrintedLineCount > 0 && !skipPrintNonTty) {\n cursorUp(lastPrintedLineCount);\n }\n\n const aggregatedScores = aggregateEvaluatorScoresFromEvents(\n existing.events,\n evaluatorNameById,\n );\n const isAggregated = existing.events.length > 1;\n const durationMs = existing.events.reduce(\n (s, e) => s + e.durationMs,\n 0,\n );\n const passed = existing.events.every((e) => e.passed);\n\n const lines: string[] = [];\n lines.push(\n `${colorize(`[${event.completedTestCases}/${event.totalTestCases}]`, ansi.cyan)} ${event.testCaseName} ${colorize(`(${event.rerunIndex}/${event.rerunTotal})`, ansi.cyan)} ${colorize(`(${durationMs}ms)`, ansi.dim)}`,\n );\n for (const item of aggregatedScores) {\n const name =\n evaluatorNameById.get(item.evaluatorId) ?? item.evaluatorId;\n lines.push(\n formatEvaluatorScoreLine(\n name,\n item.scores,\n item.passed,\n item.metrics,\n { isAggregated },\n ),\n );\n const lastEvent = existing.events[existing.events.length - 1];\n const lastEs = lastEvent?.evaluatorScores.find(\n (x) => x.evaluatorId === item.evaluatorId,\n );\n if (!item.passed && lastEs?.logs && lastEs.logs.length > 0) {\n for (const log of lastEs.logs) {\n if (log.type === 'diff') {\n const useColor = process.stdout.isTTY;\n for (const { type, line } of getDiffLines(log)) {\n const colored =\n useColor && type === 'remove'\n ? colorize(` ${line}`, ansi.red)\n : useColor && type === 'add'\n ? colorize(` ${line}`, ansi.green)\n : ` ${line}`;\n lines.push(colored);\n }\n }\n }\n }\n }\n\n if (!skipPrintNonTty) {\n for (let i = 0; i < lines.length; i++) {\n process.stdout.write(`\\r\\x1b[2K${lines[i]}\\n`);\n }\n lastPrintedTestCaseId = testCaseId;\n lastPrintedLineCount = lines.length;\n }\n\n drawSpinner();\n }\n if (event.type === 'RunCompleted' || event.type === 'RunFailed') {\n runFinished = true;\n clearLine();\n unsubscribe();\n resolve(event);\n }\n });\n });\n\n const snapshot = await runner.runDatasetWith({\n datasetId: dataset.id,\n evaluatorIds: evaluators.map((item) => item.id),\n });\n totalCount = snapshot.totalTestCases;\n\n console.log(colorize('=== Eval Run Started ===', `${ansi.bold}${ansi.cyan}`));\n console.log(`Run: ${colorize(snapshot.runId, ansi.cyan)}`);\n console.log(`Dataset: ${colorize(snapshot.datasetName, ansi.bold)}`);\n console.log(\n `Evaluators: ${evaluators\n .map((item) => item.evaluator.getName() ?? item.id)\n .join(', ')}`,\n );\n console.log(\n `Total test cases: ${colorize(String(snapshot.totalTestCases), ansi.bold)}`,\n );\n console.log('');\n drawSpinner();\n spinnerTimer = setInterval(drawSpinner, 100);\n\n const finalEvent = await done;\n if (spinnerTimer) {\n clearInterval(spinnerTimer);\n }\n\n if (finalEvent.type === 'RunFailed') {\n throw new Error(`Run failed: ${finalEvent.errorMessage}`);\n }\n\n console.log('');\n console.log(colorize('=== Run Summary ===', `${ansi.bold}${ansi.cyan}`));\n console.log(\n `- passed: ${colorize(\n `${finalEvent.passedTestCases}/${finalEvent.totalTestCases}`,\n ansi.green,\n )}`,\n );\n console.log(\n `- failed: ${colorize(\n `${finalEvent.failedTestCases}/${finalEvent.totalTestCases}`,\n finalEvent.failedTestCases > 0 ? ansi.red : ansi.dim,\n )}`,\n );\n if (overallScoreCount > 0) {\n const overallAverage = overallScoreTotal / overallScoreCount;\n const overallSd = sampleStdDev(\n overallScoreTotal,\n overallScoreSumSq,\n overallScoreCount,\n );\n const avgStr =\n overallSd !== undefined\n ? `${overallAverage.toFixed(2)} ± ${overallSd.toFixed(2)}`\n : overallAverage.toFixed(2);\n console.log(\n `- overall avg score: ${colorize(\n avgStr,\n scoreToColor(overallAverage),\n )} ${colorize(createBar(overallAverage), ansi.dim)}`,\n );\n }\n console.log(colorize('- evaluator averages:', ansi.magenta));\n for (const [evaluatorId, evaluatorName] of evaluatorNameById.entries()) {\n console.log(\n getEvaluatorSummaryLine(evaluatorName, aggregates.get(evaluatorId)),\n );\n }\n const testCaseSummaries = buildTestCaseSummaries(testCaseByTestId);\n if (testCaseSummaries.length > 0) {\n console.log(colorize('- test case scores:', ansi.magenta));\n for (const summary of testCaseSummaries) {\n const status = summary.passed\n ? colorize('PASS', ansi.green)\n : colorize('FAIL', ansi.red);\n if (summary.averageScore === undefined) {\n console.log(\n ` ${status} ${summary.name.padEnd(24)} score=n/a ${colorize(`(${summary.durationMs}ms)`, ansi.dim)}`,\n );\n continue;\n }\n const scoreLabel =\n summary.isAggregated && summary.aggregatedScoreItem\n ? getScoreById(summary.aggregatedScoreItem.id)?.format(\n summary.aggregatedScoreItem.data,\n { isAggregated: true },\n ) ?? summary.averageScore.toFixed(2)\n : summary.stdDev !== undefined && summary.isAggregated\n ? `${summary.averageScore.toFixed(2)} ± ${summary.stdDev.toFixed(2)}`\n : summary.averageScore.toFixed(2);\n console.log(\n ` ${status} ${summary.name.padEnd(24)} score=${colorize(\n scoreLabel,\n scoreToColor(summary.averageScore),\n )} ${colorize(createBar(summary.averageScore, 100, 14), ansi.dim)} ${colorize(`(${summary.durationMs}ms)`, ansi.dim)}`,\n );\n }\n }\n console.log(`- artifact: ${colorize(finalEvent.artifactPath, ansi.dim)}`);\n}\n\nexport async function runSimpleEvalCommandInk(\n runner: RunnerApi,\n datasetName: string,\n evaluatorPattern: string,\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const app = render(\n React.createElement(RunView, {\n runner,\n datasetName,\n evaluatorPattern,\n onComplete: (err) => {\n app.unmount();\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n },\n }),\n );\n });\n}\n","/** @jsxImportSource react */\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { Box, Text } from 'ink';\n\nimport { getDiffLines, getMetricById, getScoreById } from '../../evals';\nimport type { DiffLogEntry } from '../../evals/diff';\nimport type { ScoreItem } from '../../evals/score';\nimport type { RunnerApi, RunnerEvent } from '../../runner';\nimport {\n aggregateMetricItems,\n aggregateScoreItems,\n toNumericScore,\n toNumericScoreFromScores,\n} from '../../runner/score-utils';\nimport { TextBar } from '../../cli/components/TextBar';\nimport { Banner } from './Banner';\nimport { Spinner } from './Spinner';\n\ninterface EvaluatorScoreRow {\n evaluatorId: string;\n evaluatorName: string;\n scores: ReadonlyArray<ScoreItem>;\n passed: boolean;\n metrics?: ReadonlyArray<{ id: string; data: unknown }>;\n logs?: ReadonlyArray<DiffLogEntry>;\n}\n\ninterface TestCaseProgress {\n name: string;\n testCaseId: string;\n completedTestCases: number;\n totalTestCases: number;\n rerunIndex: number;\n rerunTotal: number;\n durationMs: number;\n passed: boolean;\n averageScore?: number;\n evaluatorScores: EvaluatorScoreRow[];\n}\n\n/** One displayed block per unique test case, updated in place as reruns complete */\ninterface TestCaseDisplay {\n name: string;\n testCaseId: string;\n completedTestCases: number;\n totalTestCases: number;\n rerunIndex: number;\n rerunTotal: number;\n durationMs: number;\n passed: boolean;\n events: Array<{\n evaluatorScores: EvaluatorScoreRow[];\n passed: boolean;\n durationMs: number;\n }>;\n aggregatedEvaluatorScores: EvaluatorScoreRow[];\n isAggregated: boolean;\n}\n\ninterface EvaluatorAggregate {\n total: number;\n sumSq: number;\n count: number;\n passed: number;\n failed: number;\n}\n\nfunction sampleStdDev(sum: number, sumSq: number, n: number): number | undefined {\n if (n < 2) return undefined;\n const mean = sum / n;\n const variance = (sumSq - n * mean * mean) / (n - 1);\n return variance > 0 ? Math.sqrt(variance) : 0;\n}\n\nfunction scoreColor(score: number): 'green' | 'yellow' | 'red' {\n if (score >= 80) return 'green';\n if (score >= 50) return 'yellow';\n return 'red';\n}\n\nfunction createBar(value: number, max = 100, width = 20): string {\n const safe = Math.max(0, Math.min(max, value));\n const filled = Math.round((safe / max) * width);\n return '█'.repeat(filled) + '░'.repeat(width - filled);\n}\n\nfunction aggregateEvaluatorScores(\n events: Array<{ evaluatorScores: EvaluatorScoreRow[] }>,\n nameById: Map<string, string>,\n): EvaluatorScoreRow[] {\n if (events.length === 0) return [];\n const evaluatorIds = new Set(\n events.flatMap((e) => e.evaluatorScores.map((x) => x.evaluatorId)),\n );\n const result: EvaluatorScoreRow[] = [];\n for (const evaluatorId of evaluatorIds) {\n const scoreIdToItems = new Map<string, ScoreItem[]>();\n const metricIdToItems = new Map<\n string,\n Array<{ id: string; data: unknown }>\n >();\n for (const ev of events) {\n const es = ev.evaluatorScores.find((x) => x.evaluatorId === evaluatorId);\n for (const s of es?.scores ?? []) {\n const list = scoreIdToItems.get(s.id) ?? [];\n list.push(s);\n scoreIdToItems.set(s.id, list);\n }\n for (const m of es?.metrics ?? []) {\n const list = metricIdToItems.get(m.id) ?? [];\n list.push(m);\n metricIdToItems.set(m.id, list);\n }\n }\n const aggregatedScores: ScoreItem[] = [];\n for (const items of scoreIdToItems.values()) {\n const agg = aggregateScoreItems(items);\n if (agg) aggregatedScores.push(agg);\n }\n const aggregatedMetrics = Array.from(metricIdToItems.entries())\n .map(([id, items]) => aggregateMetricItems(items))\n .filter((m): m is { id: string; data: unknown } => m !== undefined);\n const passed = events.every((ev) => {\n const es = ev.evaluatorScores.find((x) => x.evaluatorId === evaluatorId);\n return es?.passed ?? false;\n });\n const lastEvent = events[events.length - 1];\n const lastEs = lastEvent?.evaluatorScores.find(\n (x) => x.evaluatorId === evaluatorId,\n );\n result.push({\n evaluatorId,\n evaluatorName: nameById.get(evaluatorId) ?? evaluatorId,\n scores: aggregatedScores,\n passed,\n metrics: aggregatedMetrics.length > 0 ? aggregatedMetrics : undefined,\n logs: lastEs?.logs,\n });\n }\n return result;\n}\n\nfunction formatScorePart(\n item: ScoreItem,\n scoreToColor: (n: number) => 'green' | 'yellow' | 'red',\n options?: { isAggregated?: boolean },\n): string {\n const def = getScoreById(item.id);\n if (!def) {\n const numeric = toNumericScore(item.data);\n return numeric !== undefined ? `${numeric.toFixed(2)}` : 'n/a';\n }\n const formatted = def.format(item.data, options);\n if (def.displayStrategy === 'bar') {\n const numeric =\n typeof item.data === 'object' &&\n item.data !== null &&\n 'value' in item.data\n ? (item.data as { value: unknown }).value\n : toNumericScore(item.data);\n if (typeof numeric === 'number' && Number.isFinite(numeric)) {\n return `${formatted} ${createBar(numeric)}`;\n }\n }\n return formatted;\n}\n\ninterface RunViewProps {\n runner: RunnerApi;\n datasetName: string;\n evaluatorPattern: string;\n onComplete: (error?: Error) => void;\n}\n\nexport function RunView({\n runner,\n datasetName,\n evaluatorPattern,\n onComplete,\n}: RunViewProps): React.ReactNode {\n const [phase, setPhase] = useState<'loading' | 'running' | 'completed'>(\n 'loading',\n );\n const [runInfo, setRunInfo] = useState<{\n runId: string;\n datasetName: string;\n evaluatorNames: string[];\n totalTestCases: number;\n } | null>(null);\n const [testCases, setTestCases] = useState<TestCaseDisplay[]>([]);\n const [completedEvaluations, setCompletedEvaluations] = useState(0);\n const [summary, setSummary] = useState<{\n passedTestCases: number;\n failedTestCases: number;\n totalTestCases: number;\n overallScoreTotal: number;\n overallScoreSumSq: number;\n overallScoreCount: number;\n aggregates: Map<string, EvaluatorAggregate>;\n artifactPath: string;\n } | null>(null);\n const [evaluatorNameById, setEvaluatorNameById] = useState<\n Map<string, string>\n >(new Map());\n\n const runEval = useCallback(async () => {\n const dataset = await runner.resolveDatasetByName(datasetName);\n if (!dataset) {\n const known = await runner.collectDatasets();\n const available = known.map((item) => item.dataset.getName()).sort();\n onComplete(\n new Error(\n available.length > 0\n ? `Dataset \"${datasetName}\" not found. Available: ${available.join(', ')}`\n : `Dataset \"${datasetName}\" not found.`,\n ),\n );\n return;\n }\n\n const evaluators =\n await runner.resolveEvaluatorsByNamePattern(evaluatorPattern);\n if (evaluators.length === 0) {\n const known = await runner.collectEvaluators();\n const available = known\n .map((item) => item.evaluator.getName())\n .filter((name): name is string => typeof name === 'string')\n .sort();\n onComplete(\n new Error(\n available.length > 0\n ? `No evaluator matched \"${evaluatorPattern}\". Available: ${available.join(', ')}`\n : `No evaluator matched \"${evaluatorPattern}\".`,\n ),\n );\n return;\n }\n\n const nameById = new Map(\n evaluators.map((item) => [item.id, item.evaluator.getName() ?? item.id]),\n );\n setEvaluatorNameById(nameById);\n\n const aggregates = new Map<string, EvaluatorAggregate>();\n let overallScoreTotal = 0;\n let overallScoreSumSq = 0;\n let overallScoreCount = 0;\n\n const done = new Promise<RunnerEvent>((resolve) => {\n const unsubscribe = runner.subscribeRunEvents((event) => {\n if (event.type === 'TestCaseProgress') {\n const numericScores = event.evaluatorScores\n .map((item) => toNumericScoreFromScores(item.scores))\n .filter((item): item is number => item !== undefined);\n const averageScore =\n numericScores.length > 0\n ? numericScores.reduce((sum, v) => sum + v, 0) /\n numericScores.length\n : undefined;\n\n for (const item of event.evaluatorScores) {\n const numeric = toNumericScoreFromScores(item.scores);\n if (numeric !== undefined) {\n const current = aggregates.get(item.evaluatorId) ?? {\n total: 0,\n sumSq: 0,\n count: 0,\n passed: 0,\n failed: 0,\n };\n aggregates.set(item.evaluatorId, {\n total: current.total + numeric,\n sumSq: current.sumSq + numeric * numeric,\n count: current.count + 1,\n passed: current.passed + (item.passed ? 1 : 0),\n failed: current.failed + (item.passed ? 0 : 1),\n });\n overallScoreTotal += numeric;\n overallScoreSumSq += numeric * numeric;\n overallScoreCount += 1;\n }\n }\n\n setTestCases((prev) => {\n const byId = new Map(prev.map((tc) => [tc.testCaseId, tc]));\n const existing = byId.get(event.testCaseId);\n const newEvent = {\n evaluatorScores: event.evaluatorScores.map((item) => ({\n evaluatorId: item.evaluatorId,\n evaluatorName:\n nameById.get(item.evaluatorId) ?? item.evaluatorId,\n scores: item.scores,\n passed: item.passed,\n metrics: item.metrics,\n logs: item.logs,\n })),\n passed: event.passed,\n durationMs: event.durationMs,\n };\n const events = existing\n ? [...existing.events, newEvent]\n : [newEvent];\n const isAggregated = events.length > 1;\n\n const aggregatedEvaluatorScores = aggregateEvaluatorScores(\n events,\n nameById,\n );\n\n const merged: TestCaseDisplay = {\n name: event.testCaseName,\n testCaseId: event.testCaseId,\n completedTestCases: event.completedTestCases,\n totalTestCases: event.totalTestCases,\n rerunIndex: event.rerunIndex,\n rerunTotal: event.rerunTotal,\n durationMs: events.reduce((s, e) => s + e.durationMs, 0),\n passed: events.every((e) => e.passed),\n events,\n aggregatedEvaluatorScores,\n isAggregated,\n };\n byId.set(event.testCaseId, merged);\n setCompletedEvaluations(event.completedTestCases);\n return Array.from(byId.values());\n });\n }\n if (event.type === 'RunCompleted' || event.type === 'RunFailed') {\n unsubscribe();\n resolve(event);\n }\n });\n });\n\n const snapshot = await runner.runDatasetWith({\n datasetId: dataset.id,\n evaluatorIds: evaluators.map((item) => item.id),\n });\n\n setRunInfo({\n runId: snapshot.runId,\n datasetName: snapshot.datasetName,\n evaluatorNames: evaluators.map((e) => e.evaluator.getName() ?? e.id),\n totalTestCases: snapshot.totalTestCases,\n });\n setPhase('running');\n\n const finalEvent = await done;\n\n if (finalEvent.type === 'RunFailed') {\n onComplete(new Error(`Run failed: ${finalEvent.errorMessage}`));\n return;\n }\n\n setSummary({\n passedTestCases: finalEvent.passedTestCases,\n failedTestCases: finalEvent.failedTestCases,\n totalTestCases: finalEvent.totalTestCases,\n overallScoreTotal,\n overallScoreSumSq,\n overallScoreCount,\n aggregates: new Map(aggregates),\n artifactPath: finalEvent.artifactPath,\n });\n setPhase('completed');\n setTimeout(() => onComplete(), 200);\n }, [runner, datasetName, evaluatorPattern, onComplete]);\n\n useEffect(() => {\n void runEval();\n }, [runEval]);\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Banner />\n </Box>\n\n {runInfo && (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text>\n <Text color=\"cyan\" bold>\n Run{' '}\n </Text>\n <Text color=\"gray\">{runInfo.runId}</Text>\n </Text>\n <Text>\n <Text color=\"cyan\" bold>\n Dataset{' '}\n </Text>\n {runInfo.datasetName}\n </Text>\n <Text>\n <Text color=\"cyan\" bold>\n Evaluators{' '}\n </Text>\n {runInfo.evaluatorNames.join(', ')}\n </Text>\n <Text>\n <Text color=\"cyan\" bold>\n Test cases{' '}\n </Text>\n {runInfo.totalTestCases}\n </Text>\n </Box>\n )}\n\n {phase === 'running' && (\n <Box marginBottom={1}>\n <Spinner\n label={`Evaluations ${completedEvaluations}/${runInfo?.totalTestCases ?? 0}`}\n />\n </Box>\n )}\n\n {testCases.length > 0 && (\n <Box flexDirection=\"column\" marginBottom={1}>\n {testCases.map((tc) => (\n <Box key={tc.testCaseId} flexDirection=\"column\" marginBottom={0}>\n <Text>\n <Text color=\"cyan\">\n [{tc.completedTestCases}/{tc.totalTestCases}]\n </Text>{' '}\n {tc.name}{' '}\n <Text color=\"cyan\">\n ({tc.rerunIndex}/{tc.rerunTotal})\n </Text>\n <Text color=\"gray\"> ({tc.durationMs}ms)</Text>\n </Text>\n {tc.aggregatedEvaluatorScores.map((item) => (\n <Box\n key={item.evaluatorId}\n flexDirection=\"column\"\n marginLeft={2}\n >\n <Text>\n {item.evaluatorName}:{' '}\n <Text color={item.passed ? 'green' : 'red'} bold>\n {item.passed ? 'PASS' : 'FAIL'}\n </Text>{' '}\n {item.scores.map((s) => (\n <Text\n key={s.id}\n color={scoreColor(toNumericScore(s.data) ?? 0)}\n >\n {formatScorePart(s, scoreColor, {\n isAggregated: tc.isAggregated,\n })}{' '}\n </Text>\n ))}\n {item.metrics?.map((m) => {\n const def = getMetricById(m.id);\n if (!def) return null;\n const formatted = def.format(m.data, {\n isAggregated: tc.isAggregated,\n });\n return (\n <Text key={m.id} color=\"gray\">\n [{def.name ? `${def.name}: ` : ''}\n {formatted}]{' '}\n </Text>\n );\n })}\n </Text>\n {!item.passed && item.logs && item.logs.length > 0 && (\n <Box marginLeft={2} flexDirection=\"column\">\n {item.logs.map((log, logIdx) =>\n log.type === 'diff' ? (\n <Box key={logIdx} flexDirection=\"column\">\n {getDiffLines(log).map(\n ({ type, line }, lineIdx) => (\n <Text\n key={lineIdx}\n color={\n type === 'remove'\n ? 'red'\n : type === 'add'\n ? 'green'\n : 'gray'\n }\n >\n {line}\n </Text>\n ),\n )}\n </Box>\n ) : null,\n )}\n </Box>\n )}\n </Box>\n ))}\n </Box>\n ))}\n </Box>\n )}\n\n {phase === 'completed' && summary && (\n <Box flexDirection=\"column\">\n <Text color=\"cyan\" bold>\n Run Summary\n </Text>\n <Box marginTop={1}>\n <Text color=\"green\">passed</Text>\n <Text>\n {' '}\n {summary.passedTestCases}/{summary.totalTestCases}\n </Text>\n </Box>\n <Box>\n <Text color={summary.failedTestCases > 0 ? 'red' : 'gray'}>\n failed\n </Text>\n <Text>\n {' '}\n {summary.failedTestCases}/{summary.totalTestCases}\n </Text>\n </Box>\n {summary.overallScoreCount > 0 && (\n <Box marginTop={1}>\n <TextBar\n label=\"overall avg\"\n value={summary.overallScoreTotal / summary.overallScoreCount}\n barWidth={20}\n format={(v) => {\n const sd = sampleStdDev(\n summary.overallScoreTotal,\n summary.overallScoreSumSq,\n summary.overallScoreCount,\n );\n return sd !== undefined\n ? `${v.toFixed(2)} ± ${sd.toFixed(2)}`\n : v.toFixed(2);\n }}\n />\n </Box>\n )}\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"magenta\">evaluator averages</Text>\n {Array.from(evaluatorNameById.entries()).map(([id, name]) => {\n const agg = summary.aggregates.get(id);\n if (!agg || agg.count === 0) {\n return (\n <Text key={id} color=\"gray\">\n - {name.padEnd(28)} no numeric scores\n </Text>\n );\n }\n const mean = agg.total / agg.count;\n const sd = sampleStdDev(agg.total, agg.sumSq, agg.count);\n const meanStr =\n sd !== undefined\n ? `${mean.toFixed(2)} ± ${sd.toFixed(2)}`\n : mean.toFixed(2);\n return (\n <Text key={id}>\n - {name.padEnd(28)} avg=\n <Text color={scoreColor(mean)}>{meanStr}</Text>{' '}\n passed=\n {agg.passed} failed={agg.failed}\n </Text>\n );\n })}\n </Box>\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"magenta\">test case scores</Text>\n {testCases.map((tc) => {\n const allScores = tc.events.flatMap((ev) =>\n ev.evaluatorScores\n .map((es) => toNumericScoreFromScores(es.scores))\n .filter((n): n is number => n !== undefined),\n );\n const averageScore =\n allScores.length > 0\n ? allScores.reduce((a, b) => a + b, 0) / allScores.length\n : undefined;\n const sumSq =\n allScores.length > 0\n ? allScores.reduce((s, v) => s + v * v, 0)\n : 0;\n const total = allScores.reduce((a, b) => a + b, 0);\n const tcStdDev = sampleStdDev(total, sumSq, allScores.length);\n const firstScore = tc.aggregatedEvaluatorScores[0]?.scores[0];\n const scoreLabel =\n firstScore && tc.isAggregated\n ? formatScorePart(firstScore, scoreColor, {\n isAggregated: true,\n })\n : averageScore !== undefined\n ? tcStdDev !== undefined && tc.isAggregated\n ? `${averageScore.toFixed(2)} ± ${tcStdDev.toFixed(2)}`\n : averageScore.toFixed(2)\n : 'n/a';\n return (\n <Box key={tc.testCaseId}>\n <Text color={tc.passed ? 'green' : 'red'}>\n {tc.passed ? 'PASS' : 'FAIL'}\n </Text>\n <Text> {tc.name.padEnd(24)}</Text>\n {averageScore !== undefined ? (\n <>\n <Text color={scoreColor(averageScore)}>\n score={scoreLabel}\n </Text>\n <Text color=\"gray\">\n {' '}\n {createBar(averageScore, 100, 14)}\n </Text>\n </>\n ) : (\n <Text color=\"gray\">score=n/a</Text>\n )}\n <Text color=\"gray\"> ({tc.durationMs}ms)</Text>\n </Box>\n );\n })}\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\">artifact: {summary.artifactPath}</Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Text } from 'ink';\n\ninterface TextBarProps {\n label: string;\n value: number;\n max?: number;\n /** Label width (default 14 to match inspiration) */\n labelWidth?: number;\n /** Bar width in chars (default 20) */\n barWidth?: number;\n /** Format value for display (e.g. v => `${v}%`) */\n format?: (v: number) => string;\n /** Color bar by value: green > 70, yellow 40-70, red < 40 */\n colorByValue?: boolean;\n}\n\nfunction barColor(pct: number): 'green' | 'yellow' | 'red' | undefined {\n if (pct >= 70) return 'green';\n if (pct >= 40) return 'yellow';\n return 'red';\n}\n\nexport function TextBar({\n label,\n value,\n max = 100,\n labelWidth = 14,\n barWidth = 20,\n format = (v) => String(v),\n colorByValue = true,\n}: TextBarProps): React.ReactNode {\n const clamped = Math.max(0, Math.min(max, value));\n const pct = max > 0 ? (clamped / max) * 100 : 0;\n const filled = Math.round((clamped / max) * barWidth);\n const filledBar = '█'.repeat(filled);\n const emptyBar = '░'.repeat(Math.max(0, barWidth - filled));\n const color = colorByValue ? barColor(pct) : undefined;\n\n return (\n <Text>\n <Text color=\"gray\">{label.padEnd(labelWidth)}</Text>\n {' ['}\n {color ? (\n <>\n <Text color={color}>{filledBar}</Text>\n <Text color=\"gray\">{emptyBar}</Text>\n </>\n ) : (\n filledBar + emptyBar\n )}\n {'] '}\n <Text color={color ?? 'white'} bold>{format(value)}</Text>\n </Text>\n );\n}\n","/** @jsxImportSource react */\nimport React, { useEffect, useState } from 'react';\nimport { Text } from 'ink';\n\nconst FRAMES = ['⠋', '⠙', '⠸', '⠴', '⠦', '⠇'];\n\ninterface SpinnerProps {\n label?: string;\n}\n\nexport function Spinner({ label = 'Running' }: SpinnerProps): React.ReactNode {\n const [frame, setFrame] = useState(0);\n\n useEffect(() => {\n const timer = setInterval(() => {\n setFrame((f) => (f + 1) % FRAMES.length);\n }, 100);\n return () => clearInterval(timer);\n }, []);\n\n return (\n <Text color=\"cyan\">\n {FRAMES[frame]} {label}\n </Text>\n );\n}\n","#!/usr/bin/env node\n\nimport { createRunner } from '../runner';\nimport { getSimpleCliUsage, parseSimpleCliArgs } from './args';\nimport { printBanner } from './banner';\nimport {\n generateDatasetJsonCommandInk,\n generateDatasetJsonCommandPlain,\n} from './generate';\nimport {\n runSimpleEvalCommandInk,\n runSimpleEvalCommandPlain,\n} from './run';\n\nfunction printUsageAndExit(exitCode: number): never {\n const printer = exitCode === 0 ? console.log : console.error;\n printer(getSimpleCliUsage());\n process.exit(exitCode);\n}\n\nasync function main(): Promise<void> {\n const args = parseSimpleCliArgs(process.argv.slice(2));\n\n if (args.help) {\n printUsageAndExit(0);\n }\n if (args.unknownArgs.length > 0) {\n console.error(`Unknown arguments: ${args.unknownArgs.join(', ')}`);\n printUsageAndExit(1);\n }\n if (!args.command) {\n printUsageAndExit(1);\n }\n if (!args.datasetName) {\n console.error('Missing required --dataset <datasetName> argument.');\n printUsageAndExit(1);\n }\n\n if (args.command === 'run' && !args.evaluatorPattern) {\n console.error('Missing required --evaluator <name-or-pattern> argument.');\n printUsageAndExit(1);\n }\n\n const useInk = process.stdout.isTTY === true;\n if (!useInk) {\n printBanner();\n }\n\n const runner = createRunner();\n try {\n if (args.command === 'run') {\n await (useInk ? runSimpleEvalCommandInk : runSimpleEvalCommandPlain)(\n runner,\n args.datasetName,\n args.evaluatorPattern!,\n );\n return;\n }\n\n await (useInk ? generateDatasetJsonCommandInk : generateDatasetJsonCommandPlain)(\n runner,\n args.datasetName,\n );\n } finally {\n await runner.shutdown();\n }\n}\n\nvoid main().catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : 'Command failed');\n process.exit(1);\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/runner/api.ts","../src/runner/config.ts","../src/runner/config-loader.ts","../src/runner/discovery.ts","../src/runner/execution.ts","../src/evals/diff.ts","../src/evals/metric.ts","../src/evals/score.ts","../src/evals/aggregators.ts","../src/evals/metrics/standard.ts","../src/evals/scores/standard.ts","../src/runner/score-utils.ts","../src/runner/artifact-loader.ts","../src/runner/persistence.ts","../src/runner/search.ts","../src/cli-simple/args.ts","../src/cli-simple/banner.ts","../src/cli-simple/generate.ts","../src/cli-simple/views/GenerateView.tsx","../src/cli-simple/views/Banner.tsx","../src/cli-simple/run.ts","../src/cli-simple/views/RunView.tsx","../src/cli/components/TextBar.tsx","../src/cli-simple/views/Spinner.tsx","../src/cli-simple/index.ts"],"names":["Effect","Queue","createJiti","resolve","jitiModule","loaded","registry","passed","readdir","join","React","Box","Text","jsx","jsxs","writeFile","parse","readOutput","render","useEffect","useState","Fragment","scoreToColor","sampleStdDev","ansi","createBar"],"mappings":"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","sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport { Effect, Fiber, PubSub, Queue } from 'effect';\n\nimport type { RunnerConfig, RunnerConfigOverrides } from './config';\nimport { withRunnerConfig } from './config';\nimport { loadRunnerConfigFile } from './config-loader';\nimport {\n collectDatasetsFromFiles,\n collectEvaluatorsFromFiles,\n collectTestCasesFromFiles,\n} from './discovery';\nimport { createArtifactPath, executeRunTask, type RunTask } from './execution';\nimport type {\n CollectedDataset,\n CollectedEvaluator,\n CollectedTestCase,\n RunDatasetRequest,\n RunSnapshot,\n RunnerEvent,\n SearchTestCasesQuery,\n} from './events';\nimport { loadRunSnapshotsFromArtifacts as loadSnapshotsFromArtifacts } from './artifact-loader';\nimport { createPersistenceWorker } from './persistence';\nimport { searchCollectedTestCases } from './search';\n\ninterface SubscribeOptions {\n runId?: string;\n}\n\nfunction parseRegexLiteral(\n pattern: string,\n): { source: string; flags: string } | undefined {\n if (!pattern.startsWith('/')) {\n return undefined;\n }\n const lastSlash = pattern.lastIndexOf('/');\n if (lastSlash <= 0) {\n return undefined;\n }\n return {\n source: pattern.slice(1, lastSlash),\n flags: pattern.slice(lastSlash + 1),\n };\n}\n\nfunction createNameMatcher(pattern: string): (value: string) => boolean {\n const normalizedPattern = pattern.trim();\n const regexLiteral = parseRegexLiteral(normalizedPattern);\n if (regexLiteral) {\n const regex = new RegExp(regexLiteral.source, regexLiteral.flags);\n return (value: string) => regex.test(value);\n }\n\n if (normalizedPattern.includes('*')) {\n const escaped = normalizedPattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\*/g, '.*');\n const regex = new RegExp(`^${escaped}$`, 'i');\n return (value: string) => regex.test(value);\n }\n\n return (value: string) => value.toLowerCase() === normalizedPattern.toLowerCase();\n}\n\nexport interface RunnerApi {\n collectDatasets(): Promise<ReadonlyArray<CollectedDataset>>;\n collectEvaluators(): Promise<ReadonlyArray<CollectedEvaluator>>;\n resolveDatasetByName(name: string): Promise<CollectedDataset | undefined>;\n resolveEvaluatorsByNamePattern(\n pattern: string,\n ): Promise<ReadonlyArray<CollectedEvaluator>>;\n searchTestCases(\n query?: SearchTestCasesQuery,\n ): Promise<ReadonlyArray<CollectedTestCase>>;\n collectDatasetTestCases(datasetId: string): Promise<ReadonlyArray<CollectedTestCase>>;\n runDatasetWith(request: RunDatasetRequest): Promise<RunSnapshot>;\n subscribeRunEvents(\n listener: (event: RunnerEvent) => void,\n options?: SubscribeOptions,\n ): () => void;\n getRunSnapshot(runId: string): RunSnapshot | undefined;\n getAllRunSnapshots(): ReadonlyArray<RunSnapshot>;\n loadRunSnapshotsFromArtifacts(): Promise<ReadonlyArray<RunSnapshot>>;\n shutdown(): Promise<void>;\n}\n\nfunction mergeRunnerOverrides(\n base?: RunnerConfigOverrides,\n next?: RunnerConfigOverrides,\n): RunnerConfigOverrides | undefined {\n if (!base) {\n return next;\n }\n if (!next) {\n return base;\n }\n const discovery = base.discovery || next.discovery\n ? {\n ...(base.discovery ?? {}),\n ...(next.discovery ?? {}),\n }\n : undefined;\n return {\n ...base,\n ...next,\n discovery,\n };\n}\n\nexport function createRunner(overrides?: RunnerConfigOverrides): RunnerApi {\n const fileOverrides = loadRunnerConfigFile();\n const merged = mergeRunnerOverrides(fileOverrides, overrides);\n return new EffectRunner(withRunnerConfig(merged));\n}\n\nclass EffectRunner implements RunnerApi {\n private readonly config: RunnerConfig;\n\n private readonly eventBus = Effect.runSync(PubSub.unbounded<RunnerEvent>());\n\n private readonly runQueue = Effect.runSync(Queue.unbounded<RunTask>());\n\n private readonly persistenceQueue = Effect.runSync(\n Queue.unbounded<{\n runId: string;\n artifactPath: string;\n payload: unknown;\n }>(),\n );\n\n private readonly snapshots = new Map<string, RunSnapshot>();\n private readonly listeners = new Set<{\n runId?: string;\n listener: (event: RunnerEvent) => void;\n }>();\n\n private readonly datasetsById = new Map<string, CollectedDataset>();\n\n private readonly evaluatorsById = new Map<string, CollectedEvaluator>();\n\n private readonly schedulerFiber = Effect.runFork(\n this.createSchedulerEffect(),\n );\n\n private readonly persistenceFiber = Effect.runFork(\n createPersistenceWorker(this.persistenceQueue),\n );\n\n constructor(config: RunnerConfig) {\n this.config = config;\n }\n\n async collectDatasets(): Promise<ReadonlyArray<CollectedDataset>> {\n const datasets = await collectDatasetsFromFiles(this.config.discovery);\n this.datasetsById.clear();\n for (const dataset of datasets) {\n this.datasetsById.set(dataset.id, dataset);\n }\n return datasets;\n }\n\n async collectEvaluators(): Promise<ReadonlyArray<CollectedEvaluator>> {\n const evaluators = await collectEvaluatorsFromFiles(this.config.discovery);\n this.evaluatorsById.clear();\n for (const evaluator of evaluators) {\n this.evaluatorsById.set(evaluator.id, evaluator);\n }\n return evaluators;\n }\n\n async resolveDatasetByName(name: string): Promise<CollectedDataset | undefined> {\n if (this.datasetsById.size === 0) {\n await this.collectDatasets();\n }\n const normalized = name.trim().toLowerCase();\n return Array.from(this.datasetsById.values()).find(\n (item) => item.dataset.getName().toLowerCase() === normalized,\n );\n }\n\n async resolveEvaluatorsByNamePattern(\n pattern: string,\n ): Promise<ReadonlyArray<CollectedEvaluator>> {\n if (this.evaluatorsById.size === 0) {\n await this.collectEvaluators();\n }\n const matcher = createNameMatcher(pattern);\n return Array.from(this.evaluatorsById.values()).filter((item) =>\n matcher(item.evaluator.getName() ?? ''),\n );\n }\n\n async searchTestCases(\n query?: SearchTestCasesQuery,\n ): Promise<ReadonlyArray<CollectedTestCase>> {\n const testCases = await collectTestCasesFromFiles(this.config.discovery);\n return searchCollectedTestCases(testCases, query);\n }\n\n async collectDatasetTestCases(\n datasetId: string,\n ): Promise<ReadonlyArray<CollectedTestCase>> {\n if (this.datasetsById.size === 0) {\n await this.collectDatasets();\n }\n const dataset = this.datasetsById.get(datasetId);\n if (!dataset) {\n throw new Error(`Unknown dataset: ${datasetId}`);\n }\n const allTestCases = await collectTestCasesFromFiles(this.config.discovery);\n return allTestCases.filter((testCase) =>\n dataset.dataset.matchesTestCase(testCase.testCase, testCase.filePath),\n );\n }\n\n async runDatasetWith(request: RunDatasetRequest): Promise<RunSnapshot> {\n if (this.datasetsById.size === 0) {\n await this.collectDatasets();\n }\n if (this.evaluatorsById.size === 0) {\n await this.collectEvaluators();\n }\n\n const dataset = this.datasetsById.get(request.datasetId);\n if (!dataset) {\n throw new Error(`Unknown dataset: ${request.datasetId}`);\n }\n\n const selectedEvaluators = request.evaluatorIds\n .map((id) => this.evaluatorsById.get(id))\n .filter((value): value is CollectedEvaluator => Boolean(value))\n .map((value) => ({ id: value.id, evaluator: value.evaluator }));\n\n if (selectedEvaluators.length === 0) {\n throw new Error('No evaluators selected for run');\n }\n\n const selectedTestCases = await this.collectDatasetTestCases(request.datasetId);\n\n const totalEvaluations = selectedTestCases.reduce(\n (sum, tc) =>\n sum +\n (typeof tc.testCase.getReruns === 'function'\n ? tc.testCase.getReruns()\n : 1),\n 0,\n );\n\n const runId = `run-${randomUUID()}`;\n const artifactPath = createArtifactPath(\n this.config.artifactDirectory,\n request.datasetId,\n runId,\n );\n const snapshot: RunSnapshot = {\n runId,\n datasetId: request.datasetId,\n datasetName: dataset.dataset.getName(),\n evaluatorIds: selectedEvaluators.map((item) => item.id),\n queuedAt: Date.now(),\n totalTestCases: totalEvaluations,\n completedTestCases: 0,\n passedTestCases: 0,\n failedTestCases: 0,\n status: 'queued',\n artifactPath,\n };\n\n this.snapshots.set(runId, snapshot);\n const queuedEvent: RunnerEvent = {\n type: 'RunQueued',\n runId,\n datasetId: request.datasetId,\n datasetName: dataset.dataset.getName(),\n evaluatorIds: selectedEvaluators.map((item) => item.id),\n totalTestCases: totalEvaluations,\n artifactPath,\n };\n await Effect.runPromise(this.publishEvent(queuedEvent));\n await Effect.runPromise(\n Queue.offer(this.persistenceQueue, {\n runId,\n artifactPath,\n payload: queuedEvent,\n }),\n );\n\n const maxConcurrency =\n request.concurrency ?? this.config.maxConcurrency ?? 1;\n\n await Effect.runPromise(\n Queue.offer(this.runQueue, {\n runId,\n datasetId: request.datasetId,\n dataset: dataset.dataset,\n evaluators: selectedEvaluators,\n testCases: selectedTestCases,\n snapshot,\n maxConcurrency,\n }),\n );\n\n return snapshot;\n }\n\n subscribeRunEvents(\n listener: (event: RunnerEvent) => void,\n options?: SubscribeOptions,\n ): () => void {\n const entry = { runId: options?.runId, listener };\n this.listeners.add(entry);\n return () => {\n this.listeners.delete(entry);\n };\n }\n\n getRunSnapshot(runId: string): RunSnapshot | undefined {\n return this.snapshots.get(runId);\n }\n\n getAllRunSnapshots(): ReadonlyArray<RunSnapshot> {\n return Array.from(this.snapshots.values()).sort(\n (a, b) => b.queuedAt - a.queuedAt,\n );\n }\n\n async loadRunSnapshotsFromArtifacts(): Promise<ReadonlyArray<RunSnapshot>> {\n return loadSnapshotsFromArtifacts(this.config);\n }\n\n async shutdown(): Promise<void> {\n await Effect.runPromise(Fiber.interrupt(this.schedulerFiber));\n await Effect.runPromise(Fiber.interrupt(this.persistenceFiber));\n await Effect.runPromise(Queue.shutdown(this.runQueue));\n await Effect.runPromise(Queue.shutdown(this.persistenceQueue));\n await Effect.runPromise(PubSub.shutdown(this.eventBus));\n }\n\n private createSchedulerEffect() {\n const self = this;\n return Effect.forever(\n Effect.gen(function* () {\n const task = yield* Queue.take(self.runQueue);\n yield* Effect.fork(\n executeRunTask(\n task,\n self.publishEvent.bind(self),\n self.persistenceQueue,\n self.updateSnapshot.bind(self),\n ),\n );\n }),\n );\n }\n\n private updateSnapshot(\n runId: string,\n updater: (snapshot: RunSnapshot) => RunSnapshot,\n ): void {\n const existing = this.snapshots.get(runId);\n if (!existing) {\n return;\n }\n this.snapshots.set(runId, updater(existing));\n }\n\n private publishEvent(event: RunnerEvent): Effect.Effect<void, never, never> {\n return Effect.sync(() => {\n for (const entry of this.listeners) {\n if (entry.runId && entry.runId !== event.runId) {\n continue;\n }\n entry.listener(event);\n }\n }).pipe(\n Effect.flatMap(() => PubSub.publish(this.eventBus, event)),\n Effect.asVoid,\n );\n }\n}\n","export interface RunnerDiscoveryConfig {\n rootDir: string;\n datasetSuffixes: ReadonlyArray<string>;\n evaluatorSuffixes: ReadonlyArray<string>;\n testCaseSuffixes: ReadonlyArray<string>;\n excludeDirectories: ReadonlyArray<string>;\n}\n\nexport interface RunnerConfig {\n discovery: RunnerDiscoveryConfig;\n artifactDirectory: string;\n /** Max concurrent test cases per run. Default: 1 (sequential). */\n maxConcurrency: number;\n}\n\nexport type RunnerConfigOverrides = Omit<Partial<RunnerConfig>, 'discovery'> & {\n discovery?: Partial<RunnerDiscoveryConfig>;\n};\n\nexport interface M4trixEvalConfigDiscovery {\n rootDir?: string;\n datasetFilePatterns?: ReadonlyArray<string>;\n evaluatorFilePatterns?: ReadonlyArray<string>;\n testCaseFilePatterns?: ReadonlyArray<string>;\n datasetSuffixes?: ReadonlyArray<string>;\n evaluatorSuffixes?: ReadonlyArray<string>;\n testCaseSuffixes?: ReadonlyArray<string>;\n excludeDirectories?: ReadonlyArray<string>;\n}\n\nexport interface M4trixEvalConfig {\n discovery?: M4trixEvalConfigDiscovery;\n artifactDirectory?: string;\n /** Max concurrent test cases per run. Default: 1 (sequential). */\n maxConcurrency?: number;\n}\n\nexport type ConfigType = M4trixEvalConfig;\n\nexport type M4trixEvalConfigFactory<TConfig extends ConfigType = ConfigType> = () => TConfig;\n\nexport function defineConfig<TConfig extends ConfigType>(\n factory: M4trixEvalConfigFactory<TConfig>,\n): M4trixEvalConfigFactory<TConfig> {\n return factory;\n}\n\nexport const defaultRunnerConfig: RunnerConfig = {\n discovery: {\n rootDir: process.cwd(),\n datasetSuffixes: ['.dataset.ts', '.dataset.tsx', '.dataset.js', '.dataset.mjs'],\n evaluatorSuffixes: [\n '.evaluator.ts',\n '.evaluator.tsx',\n '.evaluator.js',\n '.evaluator.mjs',\n ],\n testCaseSuffixes: [\n '.test-case.ts',\n '.test-case.tsx',\n '.test-case.js',\n '.test-case.mjs',\n ],\n excludeDirectories: ['node_modules', 'dist', '.next', '.git', '.pnpm-store'],\n },\n artifactDirectory: '.eval-results',\n maxConcurrency: 1,\n};\n\nexport function toRunnerConfigOverrides(\n config?: ConfigType,\n): RunnerConfigOverrides | undefined {\n if (!config) {\n return undefined;\n }\n\n const rawDiscovery = config.discovery;\n const discovery: Partial<RunnerDiscoveryConfig> = {};\n if (rawDiscovery?.rootDir !== undefined) {\n discovery.rootDir = rawDiscovery.rootDir;\n }\n if (rawDiscovery?.datasetFilePatterns !== undefined) {\n discovery.datasetSuffixes = rawDiscovery.datasetFilePatterns;\n } else if (rawDiscovery?.datasetSuffixes !== undefined) {\n discovery.datasetSuffixes = rawDiscovery.datasetSuffixes;\n }\n if (rawDiscovery?.evaluatorFilePatterns !== undefined) {\n discovery.evaluatorSuffixes = rawDiscovery.evaluatorFilePatterns;\n } else if (rawDiscovery?.evaluatorSuffixes !== undefined) {\n discovery.evaluatorSuffixes = rawDiscovery.evaluatorSuffixes;\n }\n if (rawDiscovery?.testCaseFilePatterns !== undefined) {\n discovery.testCaseSuffixes = rawDiscovery.testCaseFilePatterns;\n } else if (rawDiscovery?.testCaseSuffixes !== undefined) {\n discovery.testCaseSuffixes = rawDiscovery.testCaseSuffixes;\n }\n if (rawDiscovery?.excludeDirectories !== undefined) {\n discovery.excludeDirectories = rawDiscovery.excludeDirectories;\n }\n\n const overrides: RunnerConfigOverrides = {};\n if (config.artifactDirectory !== undefined) {\n overrides.artifactDirectory = config.artifactDirectory;\n }\n if (config.maxConcurrency !== undefined) {\n overrides.maxConcurrency = config.maxConcurrency;\n }\n if (Object.keys(discovery).length > 0) {\n overrides.discovery = discovery;\n }\n return overrides;\n}\n\nexport function withRunnerConfig(overrides?: RunnerConfigOverrides): RunnerConfig {\n if (!overrides) {\n return defaultRunnerConfig;\n }\n const discovery = overrides.discovery\n ? {\n ...defaultRunnerConfig.discovery,\n ...overrides.discovery,\n }\n : defaultRunnerConfig.discovery;\n\n return {\n ...defaultRunnerConfig,\n ...overrides,\n discovery,\n };\n}\n","import { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nimport * as jitiModule from 'jiti';\n\nimport type { RunnerConfigOverrides } from './config';\nimport {\n toRunnerConfigOverrides,\n type ConfigType,\n type M4trixEvalConfigFactory,\n} from './config';\n\nconst CONFIG_FILE_NAME = 'm4trix-eval.config.ts';\n\ntype JitiLoader = {\n (id: string): unknown;\n import?: (id: string) => Promise<unknown> | unknown;\n};\n\nlet cachedLoader: JitiLoader | undefined;\n\nfunction getJitiLoader(): JitiLoader {\n if (cachedLoader) {\n return cachedLoader;\n }\n const createJiti =\n (jitiModule as { createJiti?: unknown; default?: unknown }).createJiti ??\n (jitiModule as { default?: unknown }).default;\n if (typeof createJiti !== 'function') {\n throw new Error(\n 'Failed to initialize jiti for m4trix eval config loading.',\n );\n }\n cachedLoader = (\n createJiti as (id: string, options?: Record<string, unknown>) => JitiLoader\n )(import.meta.url, {\n interopDefault: true,\n moduleCache: true,\n });\n return cachedLoader;\n}\n\nfunction resolveConfigModuleExport(loadedModule: unknown): unknown {\n if (\n loadedModule &&\n typeof loadedModule === 'object' &&\n 'default' in loadedModule\n ) {\n return (loadedModule as { default: unknown }).default;\n }\n return loadedModule;\n}\n\nfunction resolveConfigValue(value: unknown): ConfigType | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n if (typeof value === 'function') {\n return (value as M4trixEvalConfigFactory<ConfigType>)();\n }\n if (typeof value !== 'object') {\n throw new Error(\n 'Invalid m4trix eval config export. Expected an object or defineConfig(() => config).',\n );\n }\n return value as ConfigType;\n}\n\nexport function loadRunnerConfigFile(\n cwd = process.cwd(),\n): RunnerConfigOverrides | undefined {\n const configPath = resolve(cwd, CONFIG_FILE_NAME);\n if (!existsSync(configPath)) {\n return undefined;\n }\n const loader = getJitiLoader();\n const loaded = loader(configPath);\n const exportedValue = resolveConfigModuleExport(loaded);\n const config = resolveConfigValue(exportedValue);\n return toRunnerConfigOverrides(config);\n}\n","import { Dirent } from 'node:fs';\nimport { readdir } from 'node:fs/promises';\nimport { resolve, relative } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport type { Dataset } from '../evals/dataset';\nimport type { Evaluator } from '../evals/evaluator';\nimport type { TestCase } from '../evals/test-case';\nimport type {\n CollectedDataset,\n CollectedEvaluator,\n CollectedTestCase,\n} from './events';\nimport type { RunnerDiscoveryConfig } from './config';\n\ntype JitiModuleLoader = {\n (id: string): unknown;\n import?: (id: string) => Promise<unknown> | unknown;\n};\n\nlet jitiLoader: JitiModuleLoader | undefined;\n\nfunction toId(prefix: string, filePath: string, name?: string): string {\n const stable = name && name.trim().length > 0 ? name : filePath;\n return `${prefix}:${stable}`\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n}\n\nfunction hasMethod(value: unknown, methodName: string): boolean {\n return (\n typeof value === 'object' &&\n value !== null &&\n methodName in value &&\n typeof (value as Record<string, unknown>)[methodName] === 'function'\n );\n}\n\nfunction isDatasetLike(value: unknown): value is Dataset {\n return hasMethod(value, 'getName') && hasMethod(value, 'matchesTestCase');\n}\n\nfunction isEvaluatorLike(\n value: unknown,\n): value is Evaluator<unknown, unknown, unknown, unknown> {\n return (\n hasMethod(value, 'getName') &&\n hasMethod(value, 'resolveContext') &&\n hasMethod(value, 'getEvaluateFn')\n );\n}\n\nfunction isTestCaseLike(value: unknown): value is TestCase<unknown> {\n return (\n hasMethod(value, 'getName') &&\n hasMethod(value, 'getTags') &&\n hasMethod(value, 'getInput')\n );\n}\n\nasync function walkDirectory(\n rootDir: string,\n excludeDirectories: ReadonlyArray<string>,\n): Promise<string[]> {\n const out: string[] = [];\n\n async function walk(currentDir: string): Promise<void> {\n let entries: Dirent[];\n try {\n entries = await readdir(currentDir, { withFileTypes: true });\n } catch {\n return;\n }\n\n await Promise.all(\n entries.map(async (entry) => {\n const absolute = resolve(currentDir, entry.name);\n if (entry.isDirectory()) {\n if (excludeDirectories.includes(entry.name)) {\n return;\n }\n await walk(absolute);\n return;\n }\n\n if (entry.isFile()) {\n out.push(absolute);\n }\n }),\n );\n }\n\n await walk(rootDir);\n return out;\n}\n\nfunction hasOneSuffix(\n filePath: string,\n suffixes: ReadonlyArray<string>,\n): boolean {\n return suffixes.some((suffix) => filePath.endsWith(suffix));\n}\n\nasync function loadModuleExports(filePath: string): Promise<unknown[]> {\n if (filePath.endsWith('.ts') || filePath.endsWith('.tsx')) {\n if (!jitiLoader) {\n const jitiModule = (await import('jiti')) as {\n createJiti?: (filename: string, opts?: Record<string, unknown>) => JitiModuleLoader;\n default?: (filename: string, opts?: Record<string, unknown>) => JitiModuleLoader;\n };\n const createJiti = jitiModule.createJiti ?? jitiModule.default;\n if (!createJiti) {\n throw new Error('Failed to initialize jiti TypeScript loader');\n }\n jitiLoader = createJiti(import.meta.url, {\n interopDefault: true,\n moduleCache: true,\n }) as JitiModuleLoader;\n }\n const loaded = jitiLoader.import\n ? await jitiLoader.import(filePath)\n : await Promise.resolve(jitiLoader(filePath));\n return Object.values(loaded as Record<string, unknown>);\n }\n\n const moduleUrl = pathToFileURL(filePath).href;\n const loaded = (await import(moduleUrl)) as Record<string, unknown>;\n return Object.values(loaded);\n}\n\nexport async function collectDatasetsFromFiles(\n config: RunnerDiscoveryConfig,\n): Promise<ReadonlyArray<CollectedDataset>> {\n const files = await walkDirectory(config.rootDir, config.excludeDirectories);\n const matched = files.filter((filePath) =>\n hasOneSuffix(filePath, config.datasetSuffixes),\n );\n\n const found = await Promise.all(\n matched.map(async (absolutePath) => {\n const exports = await loadModuleExports(absolutePath);\n const datasets = exports.filter(isDatasetLike);\n const relPath = relative(config.rootDir, absolutePath);\n return datasets.map((dataset) => ({\n id: toId('dataset', relPath, dataset.getName()),\n filePath: relPath,\n dataset,\n }));\n }),\n );\n\n return found.flat();\n}\n\nexport async function collectEvaluatorsFromFiles(\n config: RunnerDiscoveryConfig,\n): Promise<ReadonlyArray<CollectedEvaluator>> {\n const files = await walkDirectory(config.rootDir, config.excludeDirectories);\n const matched = files.filter((filePath) =>\n hasOneSuffix(filePath, config.evaluatorSuffixes),\n );\n\n const found = await Promise.all(\n matched.map(async (absolutePath) => {\n const exports = await loadModuleExports(absolutePath);\n const evaluators = exports.filter(isEvaluatorLike);\n const relPath = relative(config.rootDir, absolutePath);\n return evaluators.map((evaluator) => ({\n id: toId('evaluator', relPath, evaluator.getName()),\n filePath: relPath,\n evaluator,\n }));\n }),\n );\n\n return found.flat();\n}\n\nexport async function collectTestCasesFromFiles(\n config: RunnerDiscoveryConfig,\n): Promise<ReadonlyArray<CollectedTestCase>> {\n const files = await walkDirectory(config.rootDir, config.excludeDirectories);\n const matched = files.filter((filePath) =>\n hasOneSuffix(filePath, config.testCaseSuffixes),\n );\n\n const found = await Promise.all(\n matched.map(async (absolutePath) => {\n const exports = await loadModuleExports(absolutePath);\n const testCases = exports.filter(isTestCaseLike);\n const relPath = relative(config.rootDir, absolutePath);\n return testCases.map((testCase) => ({\n id: toId('test-case', relPath, testCase.getName()),\n filePath: relPath,\n testCase,\n }));\n }),\n );\n\n return found.flat();\n}\n","import { join } from 'node:path';\n\nimport { Effect, Queue, Ref } from 'effect';\n\nimport type { DiffLogEntry } from '../evals/diff';\nimport { createDiffLogEntry } from '../evals/diff';\nimport type { Dataset } from '../evals/dataset';\nimport type { Evaluator } from '../evals/evaluator';\nimport type { MetricItem } from '../evals/metric';\nimport type { ScoreItem } from '../evals/score';\nimport type { CollectedTestCase, RunSnapshot, RunnerEvent } from './events';\nimport type { PersistenceMessage } from './persistence';\nimport { toNumericScoreFromScores } from './score-utils';\n\nfunction computeEvaluatorPassed(\n evaluator: Evaluator<unknown, unknown, unknown, unknown>,\n result: unknown,\n scores: ReadonlyArray<ScoreItem>,\n): boolean {\n const scoresWithPassed = scores.filter((s) => 'passed' in s && s.passed !== undefined);\n if (scoresWithPassed.length > 0) {\n return scoresWithPassed.every((s) => s.passed === true);\n }\n const passCriterion = evaluator.getPassCriterion();\n if (passCriterion) {\n return passCriterion(result);\n }\n const passThreshold = evaluator.getPassThreshold();\n if (passThreshold !== undefined) {\n const numeric = toNumericScoreFromScores(scores);\n return numeric !== undefined && numeric >= passThreshold;\n }\n return true;\n}\n\nfunction normalizeResult(\n result: unknown,\n): {\n scores: ReadonlyArray<ScoreItem>;\n metrics?: ReadonlyArray<MetricItem>;\n} {\n if (typeof result !== 'object' || result === null) {\n return { scores: [] };\n }\n const obj = result as Record<string, unknown>;\n const scores = Array.isArray(obj.scores)\n ? (obj.scores as ReadonlyArray<ScoreItem>)\n : [];\n const metrics = Array.isArray(obj.metrics)\n ? (obj.metrics as ReadonlyArray<MetricItem>)\n : undefined;\n return { scores, metrics };\n}\n\nfunction readOutput(testCase: CollectedTestCase['testCase']): unknown {\n const candidate = testCase as unknown as { getOutput?: () => unknown };\n if (typeof candidate.getOutput !== 'function') {\n return undefined;\n }\n return candidate.getOutput();\n}\n\nexport interface RunTask {\n runId: string;\n datasetId: string;\n dataset: Dataset;\n evaluators: ReadonlyArray<{\n id: string;\n evaluator: Evaluator<unknown, unknown, unknown, unknown>;\n }>;\n testCases: ReadonlyArray<CollectedTestCase>;\n snapshot: RunSnapshot;\n maxConcurrency: number;\n}\n\nfunction nowIsoForFile(): string {\n return new Date().toISOString().replace(/[:.]/g, '-');\n}\n\nexport function createArtifactPath(\n artifactDirectory: string,\n datasetId: string,\n runId: string,\n): string {\n return join(\n artifactDirectory,\n `${datasetId}_${runId}_${nowIsoForFile()}.jsonl`,\n );\n}\n\nfunction processOneTestCase(\n task: RunTask,\n testCaseItem: CollectedTestCase,\n totalEvaluations: number,\n publishEvent: (event: RunnerEvent) => Effect.Effect<void, never, never>,\n persistenceQueue: Queue.Queue<PersistenceMessage>,\n updateSnapshot: (\n runId: string,\n updater: (snapshot: RunSnapshot) => RunSnapshot,\n ) => void,\n completedRef: Ref.Ref<number>,\n passedRef: Ref.Ref<number>,\n failedRef: Ref.Ref<number>,\n): Effect.Effect<void, never, never> {\n return Effect.gen(function* () {\n const reruns =\n typeof testCaseItem.testCase.getReruns === 'function'\n ? testCaseItem.testCase.getReruns()\n : 1;\n const rerunPassed: boolean[] = [];\n\n for (let r = 0; r < reruns; r++) {\n const started = Date.now();\n const evaluatorScores: Array<{\n evaluatorId: string;\n scores: ReadonlyArray<ScoreItem>;\n passed: boolean;\n metrics?: ReadonlyArray<MetricItem>;\n logs?: ReadonlyArray<DiffLogEntry>;\n }> = [];\n let testCaseError: string | undefined;\n const output = readOutput(testCaseItem.testCase);\n\n for (const { id: evaluatorId, evaluator } of task.evaluators) {\n const evaluateFn = evaluator.getEvaluateFn();\n if (!evaluateFn) {\n continue;\n }\n\n try {\n const logs: DiffLogEntry[] = [];\n const logDiff: (\n expected: unknown,\n actual: unknown,\n options?: { label?: string },\n ) => void = (expected, actual, options) => {\n logs.push(createDiffLogEntry(expected, actual, options));\n };\n\n const ctx = yield* Effect.promise(() =>\n Promise.resolve(evaluator.resolveContext()),\n );\n const result = yield* Effect.promise(() =>\n Promise.resolve(\n evaluateFn({\n input: testCaseItem.testCase.getInput(),\n ctx,\n output,\n logDiff,\n }),\n ),\n );\n const { scores, metrics } = normalizeResult(result);\n const passed = computeEvaluatorPassed(evaluator, result, scores);\n evaluatorScores.push({\n evaluatorId,\n scores,\n passed,\n metrics,\n logs: logs.length > 0 ? logs : undefined,\n });\n } catch (error) {\n testCaseError =\n error instanceof Error\n ? error.message\n : 'Evaluator execution failed';\n evaluatorScores.push({\n evaluatorId,\n scores: [],\n passed: false,\n });\n }\n }\n\n const rerunPassedThis = evaluatorScores.every((s) => s.passed);\n rerunPassed.push(rerunPassedThis);\n const completedEvaluations = yield* Ref.modify(completedRef, (n) => [\n n + 1,\n n + 1,\n ]);\n\n const progressEvent: RunnerEvent = {\n type: 'TestCaseProgress',\n runId: task.runId,\n testCaseId: testCaseItem.id,\n testCaseName: testCaseItem.testCase.getName(),\n completedTestCases: completedEvaluations,\n totalTestCases: totalEvaluations,\n rerunIndex: r + 1,\n rerunTotal: reruns,\n passed: rerunPassedThis,\n durationMs: Date.now() - started,\n evaluatorScores,\n output,\n errorMessage: testCaseError,\n };\n\n updateSnapshot(task.runId, (snapshot) => ({\n ...snapshot,\n completedTestCases: completedEvaluations,\n }));\n\n yield* publishEvent(progressEvent);\n yield* Queue.offer(persistenceQueue, {\n runId: task.runId,\n artifactPath: task.snapshot.artifactPath,\n payload: progressEvent,\n });\n }\n\n const testCasePassed = rerunPassed.every(Boolean);\n if (testCasePassed) {\n yield* Ref.update(passedRef, (n) => n + 1);\n } else {\n yield* Ref.update(failedRef, (n) => n + 1);\n }\n\n const [passed, failed] = yield* Effect.all([\n Ref.get(passedRef),\n Ref.get(failedRef),\n ]);\n updateSnapshot(task.runId, (snapshot) => ({\n ...snapshot,\n passedTestCases: passed,\n failedTestCases: failed,\n }));\n });\n}\n\nexport const executeRunTask = (\n task: RunTask,\n publishEvent: (event: RunnerEvent) => Effect.Effect<void, never, never>,\n persistenceQueue: Queue.Queue<PersistenceMessage>,\n updateSnapshot: (\n runId: string,\n updater: (snapshot: RunSnapshot) => RunSnapshot,\n ) => void,\n): Effect.Effect<void, never, never> =>\n Effect.gen(function* () {\n const startedAt = Date.now();\n updateSnapshot(task.runId, (snapshot) => ({\n ...snapshot,\n status: 'running',\n startedAt,\n }));\n yield* publishEvent({\n type: 'RunStarted',\n runId: task.runId,\n startedAt,\n });\n\n const totalEvaluations = task.testCases.reduce(\n (sum, tc) =>\n sum +\n (typeof tc.testCase.getReruns === 'function'\n ? tc.testCase.getReruns()\n : 1),\n 0,\n );\n const maxConcurrency = Math.max(1, task.maxConcurrency ?? 1);\n\n const completedRef = yield* Ref.make(0);\n const passedRef = yield* Ref.make(0);\n const failedRef = yield* Ref.make(0);\n\n const processTestCase = (testCaseItem: CollectedTestCase) =>\n processOneTestCase(\n task,\n testCaseItem,\n totalEvaluations,\n publishEvent,\n persistenceQueue,\n updateSnapshot,\n completedRef,\n passedRef,\n failedRef,\n );\n\n yield* Effect.forEach(\n task.testCases,\n processTestCase,\n maxConcurrency > 1 ? { concurrency: maxConcurrency } : undefined,\n );\n\n const [completedEvaluations, passedUniqueTestCases, failedUniqueTestCases] =\n yield* Effect.all([\n Ref.get(completedRef),\n Ref.get(passedRef),\n Ref.get(failedRef),\n ]);\n\n const finishedAt = Date.now();\n const completedEvent: RunnerEvent = {\n type: 'RunCompleted',\n runId: task.runId,\n finishedAt,\n passedTestCases: passedUniqueTestCases,\n failedTestCases: failedUniqueTestCases,\n totalTestCases: task.testCases.length,\n artifactPath: task.snapshot.artifactPath,\n };\n\n updateSnapshot(task.runId, (snapshot) => ({\n ...snapshot,\n status: 'completed',\n completedTestCases: completedEvaluations,\n passedTestCases: passedUniqueTestCases,\n failedTestCases: failedUniqueTestCases,\n finishedAt,\n }));\n\n yield* publishEvent(completedEvent);\n yield* Queue.offer(persistenceQueue, {\n runId: task.runId,\n artifactPath: task.snapshot.artifactPath,\n payload: completedEvent,\n });\n yield* publishEvent({\n type: 'ArtifactFlushed',\n runId: task.runId,\n artifactPath: task.snapshot.artifactPath,\n });\n });\n","import { diffLines } from 'diff';\n\nfunction toJsonLines(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction formatDiffString(\n changes: Array<{ value: string; added?: boolean; removed?: boolean }>,\n): string {\n const lines: string[] = [];\n for (const part of changes) {\n const prefix = part.added ? '+' : part.removed ? '-' : ' ';\n const partLines = part.value.split('\\n');\n if (partLines[partLines.length - 1] === '') {\n partLines.pop();\n }\n for (const line of partLines) {\n lines.push(`${prefix} ${line}`);\n }\n }\n return lines.join('\\n');\n}\n\nfunction createDiffString(expected: unknown, actual: unknown): string {\n const expectedStr = toJsonLines(expected);\n const actualStr = toJsonLines(actual);\n const changes = diffLines(expectedStr, actualStr);\n return formatDiffString(changes);\n}\n\nexport interface DiffLogEntry {\n type: 'diff';\n label?: string;\n expected: unknown;\n actual: unknown;\n diff: string;\n}\n\nexport interface PrintJsonDiffOptions {\n /** Enable ANSI colors (default: true) */\n color?: boolean;\n}\n\n/**\n * Creates a DiffLogEntry for storage in run artifacts (plain text, no ANSI).\n */\nexport function createDiffLogEntry(\n expected: unknown,\n actual: unknown,\n options?: { label?: string },\n): DiffLogEntry {\n const diff = createDiffString(expected, actual);\n return {\n type: 'diff',\n label: options?.label,\n expected,\n actual,\n diff: diff || '(no differences)',\n };\n}\n\n/**\n * Returns the plain diff string. Use for storage or when applying colors separately.\n */\nexport function getDiffString(entry: DiffLogEntry): string {\n return createDiffString(entry.expected, entry.actual) || '(no differences)';\n}\n\n/**\n * Returns lines from the diff, each with a type for color application.\n */\nexport function getDiffLines(entry: DiffLogEntry): Array<{ type: 'add' | 'remove' | 'context'; line: string }> {\n const raw = createDiffString(entry.expected, entry.actual) || '(no differences)';\n return raw.split('\\n').map((line) => {\n const trimmed = line.trimStart();\n if (trimmed.startsWith('-') && !trimmed.startsWith('---')) {\n return { type: 'remove' as const, line };\n }\n if (trimmed.startsWith('+') && !trimmed.startsWith('+++')) {\n return { type: 'add' as const, line };\n }\n return { type: 'context' as const, line };\n });\n}\n\n/**\n * Prints a colorized JSON diff between two values to stdout.\n * Useful in evaluators to show expected vs actual output differences.\n * @param expected - The expected/reference value (shown as removed with -)\n * @param actual - The actual value (shown as added with +)\n * @returns The diff string (also printed to console)\n */\nexport function printJsonDiff(\n expected: unknown,\n actual: unknown,\n options: PrintJsonDiffOptions = {},\n): string {\n const diff = createDiffString(expected, actual);\n if (options.color) {\n const lines = diff.split('\\n').map((line) => {\n const trimmed = line.trimStart();\n if (trimmed.startsWith('-') && !trimmed.startsWith('---')) {\n return `\\x1b[31m${line}\\x1b[0m`;\n }\n if (trimmed.startsWith('+') && !trimmed.startsWith('+++')) {\n return `\\x1b[32m${line}\\x1b[0m`;\n }\n return line;\n });\n const colored = lines.join('\\n');\n console.log(colored || '(no differences)');\n return colored;\n }\n console.log(diff || '(no differences)');\n return diff;\n}\n","const registry = new Map<string, MetricDef<unknown>>();\n\nexport interface MetricItem<TData = unknown> {\n readonly id: string;\n readonly data: TData;\n}\n\nexport interface FormatMetricOptions {\n isAggregated?: boolean;\n}\n\nexport interface MetricDef<TData = unknown> {\n readonly id: string;\n readonly name?: string;\n readonly aggregate?: (values: ReadonlyArray<TData>) => TData;\n format(data: TData, options?: FormatMetricOptions): string;\n make(data: TData): MetricItem<TData>;\n}\n\nexport const Metric = {\n of<TData>(config: {\n id: string;\n name?: string;\n format: (data: TData, options?: FormatMetricOptions) => string;\n aggregate?: (values: ReadonlyArray<TData>) => TData;\n }): MetricDef<TData> {\n const def: MetricDef<TData> = {\n id: config.id,\n name: config.name,\n aggregate: config.aggregate,\n format: config.format,\n make: (data: TData) => ({ id: config.id, data }),\n };\n registry.set(config.id, def as MetricDef<unknown>);\n return def;\n },\n};\n\nexport function getMetricById(id: string): MetricDef<unknown> | undefined {\n return registry.get(id);\n}\n","const registry = new Map<string, ScoreDef<unknown>>();\n\nexport type ScoreDisplayStrategy = 'bar' | 'number' | 'passFail';\n\nexport interface ScoreItem<TData = unknown> {\n readonly id: string;\n readonly data: TData;\n readonly passed?: boolean;\n}\n\nexport interface FormatScoreOptions {\n isAggregated?: boolean;\n}\n\nexport interface ScoreDef<TData = unknown> {\n readonly id: string;\n readonly name?: string;\n readonly displayStrategy: ScoreDisplayStrategy;\n readonly aggregate?: (values: ReadonlyArray<TData>) => TData;\n format(data: TData, options?: FormatScoreOptions): string;\n make(\n data: TData,\n options?: { definePassed?: (data: TData) => boolean },\n ): ScoreItem<TData>;\n}\n\nexport const Score = {\n of<TData>(config: {\n id: string;\n name?: string;\n displayStrategy: ScoreDisplayStrategy;\n format: (data: TData, options?: FormatScoreOptions) => string;\n aggregate?: (values: ReadonlyArray<TData>) => TData;\n }): ScoreDef<TData> {\n const def: ScoreDef<TData> = {\n id: config.id,\n name: config.name,\n displayStrategy: config.displayStrategy,\n aggregate: config.aggregate,\n format: config.format,\n make: (data: TData, options?: { definePassed?: (data: TData) => boolean }) => {\n const passed =\n options?.definePassed !== undefined\n ? options.definePassed(data)\n : undefined;\n return {\n id: config.id,\n data,\n ...(passed !== undefined && { passed }),\n };\n },\n };\n registry.set(config.id, def as ScoreDef<unknown>);\n return def;\n },\n};\n\nexport function getScoreById(id: string): ScoreDef<unknown> | undefined {\n return registry.get(id);\n}\n","/** Average of numeric `value` fields (e.g. for percentScore) */\nexport function aggregateAverage(values: ReadonlyArray<{ value: number }>): {\n value: number;\n} {\n if (values.length === 0) {\n return { value: 0 };\n }\n const sum = values.reduce((s, v) => s + v.value, 0);\n return { value: sum / values.length };\n}\n\n/** Average with sample std dev (for percentScore when aggregated) */\nexport function aggregateAverageWithVariance(\n values: ReadonlyArray<{ value: number }>,\n): { value: number; stdDev?: number; count: number } {\n if (values.length === 0) {\n return { value: 0, count: 0 };\n }\n const sum = values.reduce((s, v) => s + v.value, 0);\n const sumSq = values.reduce((s, v) => s + v.value * v.value, 0);\n const mean = sum / values.length;\n let stdDev: number | undefined;\n if (values.length >= 2) {\n const variance = (sumSq - values.length * mean * mean) / (values.length - 1);\n stdDev = variance > 0 ? Math.sqrt(variance) : 0;\n }\n return { value: mean, stdDev, count: values.length };\n}\n\n/** All runs must pass (for binaryScore). Returns passed and count for spread display. */\nexport function aggregateAll(values: ReadonlyArray<{ passed: boolean }>): {\n passed: boolean;\n passedCount?: number;\n totalCount?: number;\n} {\n const total = values.length;\n const passedCount = values.filter((v) => v.passed).length;\n return {\n passed: total > 0 && values.every((v) => v.passed),\n passedCount,\n totalCount: total,\n };\n}\n\ntype TokenCountSum = {\n input: number;\n output: number;\n inputCached: number;\n outputCached: number;\n};\n\n/** Sum token counts across reruns */\nexport function aggregateTokenCountSum(\n values: ReadonlyArray<{\n input?: number;\n output?: number;\n inputCached?: number;\n outputCached?: number;\n }>,\n): TokenCountSum {\n const initial: TokenCountSum = {\n input: 0,\n output: 0,\n inputCached: 0,\n outputCached: 0,\n };\n return values.reduce<TokenCountSum>(\n (acc, v) => ({\n input: acc.input + (v.input ?? 0),\n output: acc.output + (v.output ?? 0),\n inputCached: acc.inputCached + (v.inputCached ?? 0),\n outputCached: acc.outputCached + (v.outputCached ?? 0),\n }),\n initial,\n );\n}\n\n/** Average latency across reruns */\nexport function aggregateLatencyAverage(\n values: ReadonlyArray<{ ms: number }>,\n): { ms: number } {\n if (values.length === 0) {\n return { ms: 0 };\n }\n const sum = values.reduce((s, v) => s + v.ms, 0);\n return { ms: sum / values.length };\n}\n","import { aggregateLatencyAverage, aggregateTokenCountSum } from '../aggregators';\nimport { Metric } from '../metric';\n\nexport interface TokenCountData {\n input?: number;\n output?: number;\n inputCached?: number;\n outputCached?: number;\n}\n\nexport const tokenCountMetric = Metric.of<TokenCountData>({\n id: 'token-count',\n name: 'Tokens',\n aggregate: aggregateTokenCountSum,\n format: (data, options) => {\n const input = data.input ?? 0;\n const output = data.output ?? 0;\n const inputCached = data.inputCached ?? 0;\n const outputCached = data.outputCached ?? 0;\n const cached = inputCached + outputCached;\n const base = `in:${input} out:${output} cached:${cached}`;\n return options?.isAggregated ? `Total: ${base}` : base;\n },\n});\n\nexport interface LatencyData {\n ms: number;\n}\n\nexport const latencyMetric = Metric.of<LatencyData>({\n id: 'latency',\n name: 'Latency',\n aggregate: aggregateLatencyAverage,\n format: (data, options) =>\n options?.isAggregated ? `Avg: ${data.ms}ms` : `${data.ms}ms`,\n});\n","import { aggregateAll, aggregateAverageWithVariance } from '../aggregators';\nimport { Score } from '../score';\n\nexport interface PercentScoreData {\n value: number;\n stdDev?: number;\n count?: number;\n}\n\nexport const percentScore = Score.of<PercentScoreData>({\n id: 'percent',\n name: 'Score',\n displayStrategy: 'bar',\n format: (data, options) => {\n if (options?.isAggregated) {\n return data.stdDev != null\n ? `Avg: ${data.value.toFixed(2)} ± ${data.stdDev.toFixed(2)}`\n : `Avg: ${data.value.toFixed(2)}`;\n }\n return data.value.toFixed(2);\n },\n aggregate: aggregateAverageWithVariance,\n});\n\nexport interface BinaryScoreData {\n passed: boolean;\n passedCount?: number;\n totalCount?: number;\n}\n\nexport const binaryScore = Score.of<BinaryScoreData>({\n id: 'binary',\n name: 'Result',\n displayStrategy: 'passFail',\n format: (data, options) => {\n if (options?.isAggregated) {\n const base = data.passed ? 'All: PASSED' : 'Some: FAILED';\n if (\n data.passedCount != null &&\n data.totalCount != null &&\n data.totalCount > 1\n ) {\n return `${base} (${data.passedCount}/${data.totalCount})`;\n }\n return base;\n }\n return data.passed ? 'PASSED' : 'NOT PASSED';\n },\n aggregate: aggregateAll,\n});\n","import type { MetricItem } from '../evals/metric';\nimport type { ScoreItem } from '../evals/score';\nimport { getMetricById, getScoreById } from '../evals';\n\nexport function aggregateScoreItems(\n items: ReadonlyArray<ScoreItem>,\n): ScoreItem | undefined {\n if (items.length === 0) return undefined;\n const def = getScoreById(items[0].id);\n if (!def?.aggregate) return items[items.length - 1];\n const aggregated = def.aggregate(items.map((i) => i.data as never));\n return { ...items[0], data: aggregated };\n}\n\nexport function aggregateMetricItems(\n items: ReadonlyArray<MetricItem>,\n): MetricItem | undefined {\n if (items.length === 0) return undefined;\n const def = getMetricById(items[0].id);\n if (!def?.aggregate) return items[items.length - 1];\n const aggregated = def.aggregate(items.map((i) => i.data as never));\n return { ...items[0], data: aggregated };\n}\n\nexport function toNumericScoreFromScores(\n scores: ReadonlyArray<ScoreItem>,\n): number | undefined {\n for (const item of scores) {\n const def = getScoreById(item.id);\n if (def && def.displayStrategy === 'bar' && typeof item.data === 'object' && item.data !== null && 'value' in item.data) {\n const value = (item.data as { value: unknown }).value;\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n }\n const numeric = toNumericScore(item.data);\n if (numeric !== undefined) {\n return numeric;\n }\n }\n return undefined;\n}\n\nexport function toNumericScore(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value;\n }\n if (typeof value !== 'object' || value === null) {\n return undefined;\n }\n const obj = value as Record<string, unknown>;\n if (\n 'score' in obj &&\n typeof obj.score === 'number' &&\n Number.isFinite(obj.score)\n ) {\n return obj.score;\n }\n const numberValues = Object.values(value).filter(\n (entry): entry is number =>\n typeof entry === 'number' && Number.isFinite(entry),\n );\n if (numberValues.length === 0) {\n return undefined;\n }\n return (\n numberValues.reduce((sum, entry) => sum + entry, 0) / numberValues.length\n );\n}\n","import { readdir, readFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\n\nimport type { RunnerConfig } from './config';\nimport type { RunSnapshot } from './events';\n\nexport interface ParsedTestCaseProgress {\n testCaseId: string;\n testCaseName: string;\n completedTestCases: number;\n totalTestCases: number;\n rerunIndex?: number;\n rerunTotal?: number;\n passed: boolean;\n durationMs: number;\n evaluatorScores: ReadonlyArray<{\n evaluatorId: string;\n scores: ReadonlyArray<{ id: string; data: unknown; passed?: boolean }>;\n passed: boolean;\n metrics?: ReadonlyArray<{ id: string; data: unknown }>;\n logs?: ReadonlyArray<{\n type: 'diff';\n label?: string;\n expected: unknown;\n actual: unknown;\n diff: string;\n }>;\n }>;\n}\n\nexport async function loadRunSnapshotsFromArtifacts(\n config: RunnerConfig,\n): Promise<RunSnapshot[]> {\n const baseDir = resolve(config.artifactDirectory);\n let entries: string[];\n try {\n entries = await readdir(baseDir);\n } catch {\n return [];\n }\n\n const jsonlFiles = entries.filter((name) => name.endsWith('.jsonl'));\n const snapshots: RunSnapshot[] = [];\n\n for (const fileName of jsonlFiles) {\n const filePath = join(baseDir, fileName);\n try {\n const snapshot = await parseArtifactToSnapshot(filePath, config);\n if (snapshot) {\n snapshots.push(snapshot);\n }\n } catch {\n // Skip malformed or unreadable files\n }\n }\n\n return snapshots.sort((a, b) => b.queuedAt - a.queuedAt);\n}\n\nasync function parseArtifactToSnapshot(\n filePath: string,\n _config: RunnerConfig,\n): Promise<RunSnapshot | null> {\n const content = await readFile(filePath, 'utf8');\n const lines = content.split('\\n').filter((line) => line.trim().length > 0);\n if (lines.length === 0) {\n return null;\n }\n\n let runQueued: {\n runId: string;\n datasetId: string;\n datasetName: string;\n evaluatorIds: ReadonlyArray<string>;\n totalTestCases: number;\n artifactPath: string;\n ts?: number;\n } | null = null;\n\n let runCompleted: {\n passedTestCases: number;\n failedTestCases: number;\n totalTestCases: number;\n finishedAt: number;\n } | null = null;\n\n let runFailed: { finishedAt: number; errorMessage: string } | null = null;\n let runStarted: { startedAt: number } | null = null;\n\n for (const line of lines) {\n try {\n const event = JSON.parse(line) as Record<string, unknown>;\n const type = event.type as string;\n\n if (type === 'RunQueued') {\n runQueued = {\n runId: event.runId as string,\n datasetId: event.datasetId as string,\n datasetName: event.datasetName as string,\n evaluatorIds: event.evaluatorIds as ReadonlyArray<string>,\n totalTestCases: (event.totalTestCases as number) ?? 0,\n artifactPath: (event.artifactPath as string) ?? filePath,\n ts: event.ts as number | undefined,\n };\n }\n if (type === 'RunStarted') {\n runStarted = { startedAt: event.startedAt as number };\n }\n if (type === 'RunCompleted') {\n runCompleted = {\n passedTestCases: event.passedTestCases as number,\n failedTestCases: event.failedTestCases as number,\n totalTestCases: event.totalTestCases as number,\n finishedAt: event.finishedAt as number,\n };\n }\n if (type === 'RunFailed') {\n runFailed = {\n finishedAt: event.finishedAt as number,\n errorMessage: event.errorMessage as string,\n };\n }\n } catch {\n // Skip malformed lines\n }\n }\n\n if (!runQueued) {\n return null;\n }\n\n const artifactPath = filePath;\n\n const status = runFailed\n ? 'failed'\n : runCompleted\n ? 'completed'\n : runStarted\n ? 'running'\n : 'queued';\n\n const progress = aggregateTestCaseProgress(lines);\n const completedTestCases = runCompleted\n ? runQueued.totalTestCases\n : progress.completedTestCases;\n const passedTestCases =\n runCompleted?.passedTestCases ?? progress.passedTestCases;\n const failedTestCases =\n runCompleted?.failedTestCases ?? progress.failedTestCases;\n\n return {\n runId: runQueued.runId,\n datasetId: runQueued.datasetId,\n datasetName: runQueued.datasetName,\n evaluatorIds: runQueued.evaluatorIds,\n queuedAt: runQueued.ts ?? 0,\n startedAt: runStarted?.startedAt,\n finishedAt: runCompleted?.finishedAt ?? runFailed?.finishedAt,\n totalTestCases: runQueued.totalTestCases,\n completedTestCases,\n passedTestCases,\n failedTestCases,\n status,\n artifactPath,\n errorMessage: runFailed?.errorMessage,\n };\n}\n\nfunction aggregateTestCaseProgress(lines: string[]): {\n completedTestCases: number;\n passedTestCases: number;\n failedTestCases: number;\n} {\n let completedTestCases = 0;\n const testCasePassedBy = new Map<string, boolean>();\n for (const line of lines) {\n try {\n const event = JSON.parse(line) as Record<string, unknown>;\n if (event.type === 'TestCaseProgress') {\n const ev = event as {\n testCaseId: string;\n completedTestCases: number;\n passed: boolean;\n };\n completedTestCases = ev.completedTestCases ?? completedTestCases;\n const id = ev.testCaseId;\n const current = testCasePassedBy.get(id);\n testCasePassedBy.set(id, current === undefined ? ev.passed : current && ev.passed);\n }\n } catch {\n // skip\n }\n }\n let passedTestCases = 0;\n let failedTestCases = 0;\n for (const passed of testCasePassedBy.values()) {\n if (passed) {\n passedTestCases += 1;\n } else {\n failedTestCases += 1;\n }\n }\n return { completedTestCases, passedTestCases, failedTestCases };\n}\n\nexport async function parseArtifactFile(\n artifactPath: string,\n): Promise<ParsedTestCaseProgress[]> {\n try {\n const content = await readFile(artifactPath, 'utf8');\n const lines = content.split('\\n').filter((line) => line.trim().length > 0);\n const results: ParsedTestCaseProgress[] = [];\n for (const line of lines) {\n try {\n const event = JSON.parse(line) as Record<string, unknown>;\n if (event.type === 'TestCaseProgress') {\n const ev = event as {\n testCaseId: string;\n testCaseName: string;\n completedTestCases: number;\n totalTestCases: number;\n rerunIndex?: number;\n rerunTotal?: number;\n passed: boolean;\n durationMs: number;\n evaluatorScores: ReadonlyArray<{\n evaluatorId: string;\n scores: ReadonlyArray<{ id: string; data: unknown; passed?: boolean }>;\n passed: boolean;\n metrics?: ReadonlyArray<{ id: string; data: unknown }>;\n logs?: ReadonlyArray<{\n type: 'diff';\n label?: string;\n expected: unknown;\n actual: unknown;\n diff: string;\n }>;\n }>;\n };\n results.push({\n testCaseId: ev.testCaseId,\n testCaseName: ev.testCaseName,\n completedTestCases: ev.completedTestCases,\n totalTestCases: ev.totalTestCases,\n rerunIndex: ev.rerunIndex,\n rerunTotal: ev.rerunTotal,\n passed: ev.passed,\n durationMs: ev.durationMs,\n evaluatorScores: ev.evaluatorScores ?? [],\n });\n }\n } catch {\n // skip malformed lines\n }\n }\n return results;\n } catch {\n return [];\n }\n}\n","import { appendFile, mkdir } from 'node:fs/promises';\nimport { dirname } from 'node:path';\n\nimport { Effect, Queue } from 'effect';\n\nexport interface PersistenceMessage {\n runId: string;\n artifactPath: string;\n payload: unknown;\n}\n\nasync function appendJsonLine(\n artifactPath: string,\n payload: unknown,\n): Promise<void> {\n await mkdir(dirname(artifactPath), { recursive: true });\n await appendFile(artifactPath, `${JSON.stringify(payload)}\\n`, 'utf8');\n}\n\nexport const createPersistenceWorker = (\n queue: Queue.Queue<PersistenceMessage>,\n): Effect.Effect<never, never, never> =>\n Effect.forever(\n Effect.gen(function* () {\n const message = yield* Queue.take(queue);\n yield* Effect.promise(() =>\n appendJsonLine(message.artifactPath, {\n runId: message.runId,\n ts: Date.now(),\n ...message.payload,\n }),\n );\n }),\n );\n","import type { CollectedTestCase, SearchTestCasesQuery } from './events';\n\nfunction matchesAny(\n value: string,\n matchers: ReadonlyArray<string | RegExp> | undefined,\n): boolean {\n if (!matchers || matchers.length === 0) {\n return true;\n }\n return matchers.some((matcher) =>\n typeof matcher === 'string' ? matcher === value : matcher.test(value),\n );\n}\n\nfunction matchesPath(\n value: string,\n matchers: ReadonlyArray<string | RegExp> | undefined,\n): boolean {\n if (!matchers || matchers.length === 0) {\n return true;\n }\n return matchers.some((matcher) => {\n if (typeof matcher === 'string') {\n return value.includes(matcher);\n }\n return matcher.test(value);\n });\n}\n\nexport function searchCollectedTestCases(\n all: ReadonlyArray<CollectedTestCase>,\n query?: SearchTestCasesQuery,\n): ReadonlyArray<CollectedTestCase> {\n if (!query) {\n return all;\n }\n\n return all.filter((item) => {\n const tags = item.testCase.getTags();\n\n if (\n query.excludedTags &&\n tags.some((tag) => matchesAny(tag, query.excludedTags))\n ) {\n return false;\n }\n if (\n query.excludedPaths &&\n matchesPath(item.filePath, query.excludedPaths)\n ) {\n return false;\n }\n\n const includedTagsMatch =\n !query.includedTags ||\n query.includedTags.length === 0 ||\n tags.some((tag) => matchesAny(tag, query.includedTags));\n\n const includedPathsMatch =\n !query.includedPaths ||\n query.includedPaths.length === 0 ||\n matchesPath(item.filePath, query.includedPaths);\n\n return includedTagsMatch && includedPathsMatch;\n });\n}\n","export type SimpleCliCommand = 'run' | 'generate';\n\nexport interface SimpleCliArgs {\n command?: SimpleCliCommand;\n datasetName?: string;\n evaluatorPattern?: string;\n help: boolean;\n unknownArgs: string[];\n}\n\nexport function parseSimpleCliArgs(argv: string[]): SimpleCliArgs {\n const args: SimpleCliArgs = {\n help: false,\n unknownArgs: [],\n };\n let index = 0;\n if (argv[0] === 'run' || argv[0] === 'generate') {\n args.command = argv[0];\n index = 1;\n }\n\n for (; index < argv.length; index += 1) {\n const token = argv[index];\n if (token === '--help' || token === '-h') {\n args.help = true;\n continue;\n }\n if ((token === '--dataset' || token === '--datasetName') && argv[index + 1]) {\n args.datasetName = argv[index + 1];\n index += 1;\n continue;\n }\n if ((token === '--evaluator' || token === '--name') && argv[index + 1]) {\n args.evaluatorPattern = argv[index + 1];\n index += 1;\n continue;\n }\n args.unknownArgs.push(token);\n }\n\n return args;\n}\n\nexport function getSimpleCliUsage(): string {\n return [\n 'Usage:',\n ' eval-agents-simple run --dataset <datasetName> --evaluator <name-or-pattern>',\n ' eval-agents-simple generate --dataset <datasetName>',\n '',\n 'Pattern examples for --evaluator:',\n ' score-evaluator exact name (case-insensitive)',\n ' \"*score*\" wildcard pattern',\n ' \"/score/i\" regex literal',\n ].join('\\n');\n}\n","const ansi = {\n reset: '\\x1b[0m',\n dim: '\\x1b[2m',\n cyan: '\\x1b[36m',\n} as const;\n\nexport function printBanner(): void {\n const c = (s: string) => `${ansi.cyan}${s}${ansi.reset}`;\n const d = (s: string) => `${ansi.dim}${s}${ansi.reset}`;\n\n const lines = [\n '',\n ` ${c('╭─────────────────────────────────────────────╮')}`,\n ` ${c('│')} ${d('@m4trix/evals')} ${c('·')} ${d('eval-agents-simple')} ${c('│')}`,\n ` ${c('╰─────────────────────────────────────────────╯')}`,\n '',\n ];\n\n console.log(lines.join('\\n'));\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport { writeFile } from 'node:fs/promises';\nimport { join, parse, resolve } from 'node:path';\n\nimport type { RunnerApi } from '../runner';\nimport { GenerateView } from './views/GenerateView';\n\ninterface GeneratedDatasetCase {\n name: string;\n input: unknown;\n output?: unknown;\n}\n\nfunction readOutput(testCase: { getOutput?: () => unknown }): unknown {\n if (typeof testCase.getOutput !== 'function') {\n return undefined;\n }\n return testCase.getOutput();\n}\n\nfunction createOutputPath(datasetFilePath: string): string {\n const parsed = parse(datasetFilePath);\n return join(parsed.dir, `${parsed.name}.cases.json`);\n}\n\nexport async function generateDatasetJsonCommandPlain(\n runner: RunnerApi,\n datasetName: string,\n): Promise<void> {\n const dataset = await runner.resolveDatasetByName(datasetName);\n if (!dataset) {\n throw new Error(`Dataset \"${datasetName}\" not found.`);\n }\n\n const testCases = await runner.collectDatasetTestCases(dataset.id);\n const payload: GeneratedDatasetCase[] = testCases.map((item) => ({\n name: item.testCase.getName(),\n input: item.testCase.getInput(),\n output: readOutput(item.testCase),\n }));\n\n const absoluteDatasetPath = resolve(process.cwd(), dataset.filePath);\n const outputPath = createOutputPath(absoluteDatasetPath);\n\n await writeFile(outputPath, `${JSON.stringify(payload, null, 2)}\\n`, 'utf8');\n\n console.log(`Generated ${payload.length} test cases for dataset \"${dataset.dataset.getName()}\".`);\n console.log(`Wrote ${outputPath}`);\n}\n\nexport async function generateDatasetJsonCommandInk(\n runner: RunnerApi,\n datasetName: string,\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const app = render(\n React.createElement(GenerateView, {\n runner,\n datasetName,\n onComplete: (err) => {\n app.unmount();\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n },\n }),\n );\n });\n}\n","/** @jsxImportSource react */\nimport React, { useEffect, useState } from 'react';\nimport { Box, Text } from 'ink';\n\nimport type { RunnerApi } from '../../runner';\nimport { Banner } from './Banner';\n\ninterface GenerateViewProps {\n runner: RunnerApi;\n datasetName: string;\n onComplete: (error?: Error) => void;\n}\n\nexport function GenerateView({\n runner,\n datasetName,\n onComplete,\n}: GenerateViewProps): React.ReactNode {\n const [result, setResult] = useState<{\n count: number;\n datasetName: string;\n outputPath: string;\n } | null>(null);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n\n async function run() {\n const dataset = await runner.resolveDatasetByName(datasetName);\n if (!dataset) {\n setError(new Error(`Dataset \"${datasetName}\" not found.`));\n onComplete(new Error(`Dataset \"${datasetName}\" not found.`));\n return;\n }\n\n const { writeFile } = await import('node:fs/promises');\n const { join, parse, resolve } = await import('node:path');\n\n const testCases = await runner.collectDatasetTestCases(dataset.id);\n const payload = testCases.map((item) => {\n const tc = item.testCase as { getOutput?: () => unknown };\n return {\n name: item.testCase.getName(),\n input: item.testCase.getInput(),\n output: typeof tc.getOutput === 'function' ? tc.getOutput() : undefined,\n };\n });\n\n const absoluteDatasetPath = resolve(process.cwd(), dataset.filePath);\n const parsed = parse(absoluteDatasetPath);\n const outputPath = join(parsed.dir, `${parsed.name}.cases.json`);\n\n await writeFile(\n outputPath,\n `${JSON.stringify(payload, null, 2)}\\n`,\n 'utf8',\n );\n\n if (!cancelled) {\n setResult({\n count: payload.length,\n datasetName: dataset.dataset.getName(),\n outputPath,\n });\n setTimeout(() => onComplete(), 200);\n }\n }\n\n void run();\n return () => {\n cancelled = true;\n };\n }, [runner, datasetName, onComplete]);\n\n if (error) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Banner />\n <Text color=\"red\">{error.message}</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Banner />\n </Box>\n {result && (\n <Box flexDirection=\"column\">\n <Text color=\"green\">\n Generated {result.count} test cases for dataset \"{result.datasetName}\".\n </Text>\n <Text color=\"gray\">Wrote {result.outputPath}</Text>\n </Box>\n )}\n </Box>\n );\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Box, Text } from 'ink';\n\nexport function Banner(): React.ReactNode {\n return (\n <Box borderStyle=\"round\" borderColor=\"cyan\" paddingX={1} paddingY={0}>\n <Text color=\"gray\">@m4trix/evals</Text>\n <Text color=\"cyan\"> · </Text>\n <Text color=\"gray\">eval-agents-simple</Text>\n </Box>\n );\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport { getDiffLines, getMetricById, getScoreById } from '../evals';\nimport type { DiffLogEntry } from '../evals/diff';\nimport type { ScoreItem } from '../evals/score';\nimport type { RunnerApi, RunnerEvent } from '../runner';\nimport {\n aggregateMetricItems,\n aggregateScoreItems,\n toNumericScore,\n toNumericScoreFromScores,\n} from '../runner/score-utils';\nimport { RunView } from './views/RunView';\n\ninterface EvaluatorAggregate {\n total: number;\n sumSq: number;\n count: number;\n passed: number;\n failed: number;\n}\n\nfunction sampleStdDev(sum: number, sumSq: number, n: number): number | undefined {\n if (n < 2) return undefined;\n const mean = sum / n;\n const variance = (sumSq - n * mean * mean) / (n - 1);\n return variance > 0 ? Math.sqrt(variance) : 0;\n}\n\ninterface TestCaseScoreSummary {\n name: string;\n averageScore?: number;\n stdDev?: number;\n aggregatedScoreItem?: ScoreItem;\n isAggregated: boolean;\n durationMs: number;\n passed: boolean;\n}\n\ninterface TestCaseEventAcc {\n name: string;\n events: Array<{\n averageScore?: number;\n passed: boolean;\n durationMs: number;\n evaluatorScores: ReadonlyArray<{\n evaluatorId: string;\n scores: ReadonlyArray<ScoreItem>;\n passed: boolean;\n metrics?: ReadonlyArray<{ id: string; data: unknown }>;\n logs?: ReadonlyArray<DiffLogEntry>;\n }>;\n }>;\n}\n\nfunction buildTestCaseSummaries(\n byId: Map<string, TestCaseEventAcc>,\n): TestCaseScoreSummary[] {\n const summaries: TestCaseScoreSummary[] = [];\n for (const { name, events } of byId.values()) {\n const passed = events.every((e) => e.passed);\n const durationMs = events.reduce((sum, e) => sum + e.durationMs, 0);\n const isAggregated = events.length > 1;\n const allScores = events.flatMap((ev) =>\n ev.evaluatorScores\n .map((es) => toNumericScoreFromScores(es.scores))\n .filter((n): n is number => n !== undefined),\n );\n const averageScore =\n allScores.length > 0\n ? allScores.reduce((a, b) => a + b, 0) / allScores.length\n : undefined;\n const sumSq =\n allScores.length > 0 ? allScores.reduce((s, v) => s + v * v, 0) : 0;\n const total = allScores.reduce((a, b) => a + b, 0);\n const stdDev = sampleStdDev(total, sumSq, allScores.length);\n let firstAggregatedScore: ScoreItem | undefined;\n for (const evaluatorScores of events[0]?.evaluatorScores ?? []) {\n const scoreIdToItems = new Map<string, ScoreItem[]>();\n for (const ev of events) {\n const es = ev.evaluatorScores.find(\n (x) => x.evaluatorId === evaluatorScores.evaluatorId,\n );\n for (const s of es?.scores ?? []) {\n const list = scoreIdToItems.get(s.id) ?? [];\n list.push(s);\n scoreIdToItems.set(s.id, list);\n }\n }\n for (const items of scoreIdToItems.values()) {\n const agg = aggregateScoreItems(items);\n if (agg && firstAggregatedScore === undefined) {\n firstAggregatedScore = agg;\n break;\n }\n }\n if (firstAggregatedScore !== undefined) break;\n }\n summaries.push({\n name,\n averageScore,\n stdDev: stdDev ?? undefined,\n aggregatedScoreItem: firstAggregatedScore,\n isAggregated,\n durationMs,\n passed,\n });\n }\n return summaries;\n}\n\nconst ansi = {\n reset: '\\x1b[0m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n green: '\\x1b[32m',\n yellow: '\\x1b[33m',\n red: '\\x1b[31m',\n cyan: '\\x1b[36m',\n magenta: '\\x1b[35m',\n} as const;\n\nfunction colorize(text: string, color: string): string {\n return `${color}${text}${ansi.reset}`;\n}\n\nfunction scoreToColor(score: number): string {\n if (score >= 80) {\n return ansi.green;\n }\n if (score >= 50) {\n return ansi.yellow;\n }\n return ansi.red;\n}\n\nfunction getEvaluatorSummaryLines(\n evaluatorId: string,\n evaluatorName: string,\n aggregate: EvaluatorAggregate | undefined,\n scoreItemsByKey: Map<string, ScoreItem[]>,\n): string[] {\n const lines: string[] = [];\n const scoreKeys = [...scoreItemsByKey.keys()].filter((k) =>\n k.startsWith(`${evaluatorId}:`),\n );\n if (scoreKeys.length === 0) {\n lines.push(`- ${evaluatorName.padEnd(28)} no scores`);\n return lines;\n }\n const passedFailed =\n aggregate != null\n ? ` passed=${aggregate.passed} failed=${aggregate.failed}`\n : '';\n const scoreLines: string[] = [];\n for (const key of scoreKeys) {\n const items = scoreItemsByKey.get(key) ?? [];\n const agg = aggregateScoreItems(items);\n if (!agg) continue;\n const def = getScoreById(agg.id);\n const label = def ? def.name ?? def.id : agg.id;\n const formatted = def?.format(agg.data, { isAggregated: true }) ?? 'n/a';\n const numeric = toNumericScore(agg.data);\n const colored =\n numeric !== undefined\n ? colorize(formatted, scoreToColor(numeric))\n : formatted;\n scoreLines.push(` ${label}: ${colored}`);\n }\n if (scoreLines.length > 0) {\n lines.push(`- ${evaluatorName.padEnd(28)}${passedFailed}`);\n lines.push(...scoreLines);\n } else {\n lines.push(`- ${evaluatorName.padEnd(28)} no numeric scores${passedFailed}`);\n }\n return lines;\n}\n\nfunction createBar(value: number, max = 100, width = 20): string {\n const safe = Math.max(0, Math.min(max, value));\n const filled = Math.round((safe / max) * width);\n return `${'█'.repeat(filled)}${'░'.repeat(width - filled)}`;\n}\n\nfunction aggregateEvaluatorScoresFromEvents(\n events: TestCaseEventAcc['events'],\n evaluatorNameById: Map<string, string>,\n): Array<{\n evaluatorId: string;\n scores: ReadonlyArray<ScoreItem>;\n passed: boolean;\n metrics?: ReadonlyArray<{ id: string; data: unknown }>;\n}> {\n if (events.length === 0) return [];\n const evaluatorIds = new Set(\n events.flatMap((e) => e.evaluatorScores.map((x) => x.evaluatorId)),\n );\n const result: Array<{\n evaluatorId: string;\n scores: ReadonlyArray<ScoreItem>;\n passed: boolean;\n metrics?: ReadonlyArray<{ id: string; data: unknown }>;\n }> = [];\n for (const evaluatorId of evaluatorIds) {\n const scoreIdToItems = new Map<string, ScoreItem[]>();\n const metricIdToItems = new Map<string, Array<{ id: string; data: unknown }>>();\n for (const ev of events) {\n const es = ev.evaluatorScores.find((x) => x.evaluatorId === evaluatorId);\n for (const s of es?.scores ?? []) {\n const list = scoreIdToItems.get(s.id) ?? [];\n list.push(s);\n scoreIdToItems.set(s.id, list);\n }\n for (const m of es?.metrics ?? []) {\n const list = metricIdToItems.get(m.id) ?? [];\n list.push(m);\n metricIdToItems.set(m.id, list);\n }\n }\n const aggregatedScores: ScoreItem[] = [];\n for (const items of scoreIdToItems.values()) {\n const agg = aggregateScoreItems(items);\n if (agg) aggregatedScores.push(agg);\n }\n const aggregatedMetrics = Array.from(metricIdToItems.entries())\n .map(([, items]) => aggregateMetricItems(items as never))\n .filter((m): m is { id: string; data: unknown } => m !== undefined);\n const passed = events.every((ev) => {\n const es = ev.evaluatorScores.find((x) => x.evaluatorId === evaluatorId);\n return es?.passed ?? false;\n });\n result.push({\n evaluatorId,\n scores: aggregatedScores,\n passed,\n metrics:\n aggregatedMetrics.length > 0 ? aggregatedMetrics : undefined,\n });\n }\n return result;\n}\n\nfunction formatEvaluatorScoreLine(\n name: string,\n scores: ReadonlyArray<ScoreItem>,\n passed: boolean,\n metrics?: ReadonlyArray<{ id: string; data: unknown }>,\n options?: { isAggregated?: boolean },\n): string[] {\n const passLabel = passed\n ? colorize('PASS', `${ansi.bold}${ansi.green}`)\n : colorize('FAIL', `${ansi.bold}${ansi.red}`);\n const metricParts: string[] = [];\n if (metrics && metrics.length > 0) {\n for (const { id, data } of metrics) {\n const def = getMetricById(id);\n if (def) {\n const formatted = def.format(data, options);\n metricParts.push(\n def.name ? `[${def.name}: ${formatted}]` : `[${formatted}]`,\n );\n }\n }\n }\n const scoreLines: string[] = [];\n for (const item of scores) {\n const def = getScoreById(item.id);\n const scoreLabel = def ? def.name ?? def.id : item.id;\n let formatted: string;\n if (!def) {\n const numeric = toNumericScore(item.data);\n formatted =\n numeric !== undefined\n ? colorize(numeric.toFixed(2), scoreToColor(numeric))\n : 'n/a';\n } else {\n const raw = def.format(item.data, options);\n switch (def.displayStrategy) {\n case 'bar': {\n const numeric =\n typeof item.data === 'object' &&\n item.data !== null &&\n 'value' in item.data\n ? (item.data as { value: unknown }).value\n : toNumericScore(item.data);\n if (typeof numeric === 'number' && Number.isFinite(numeric)) {\n formatted = `${colorize(raw, scoreToColor(numeric))} ${colorize(createBar(numeric), ansi.dim)}`;\n } else {\n formatted = raw;\n }\n break;\n }\n case 'number':\n formatted = raw;\n break;\n case 'passFail':\n formatted = colorize(\n raw,\n item.passed === true\n ? `${ansi.bold}${ansi.green}`\n : item.passed === false\n ? `${ansi.bold}${ansi.red}`\n : ansi.dim,\n );\n break;\n }\n }\n scoreLines.push(` ${scoreLabel}: ${formatted}`);\n }\n const lines: string[] = [];\n const metricStr = metricParts.length > 0 ? ` ${metricParts.join(' ')}` : '';\n lines.push(` ${name}: ${passLabel}${metricStr}`);\n if (scoreLines.length > 0) {\n lines.push(...scoreLines);\n } else {\n lines.push(` n/a`);\n }\n return lines;\n}\n\nexport async function runSimpleEvalCommandPlain(\n runner: RunnerApi,\n datasetName: string,\n evaluatorPattern: string,\n): Promise<void> {\n const dataset = await runner.resolveDatasetByName(datasetName);\n if (!dataset) {\n const known = await runner.collectDatasets();\n const available = known.map((item) => item.dataset.getName()).sort();\n throw new Error(\n available.length > 0\n ? `Dataset \"${datasetName}\" not found. Available datasets: ${available.join(', ')}`\n : `Dataset \"${datasetName}\" not found and no datasets were discovered.`,\n );\n }\n\n const evaluators =\n await runner.resolveEvaluatorsByNamePattern(evaluatorPattern);\n if (evaluators.length === 0) {\n const known = await runner.collectEvaluators();\n const available = known\n .map((item) => item.evaluator.getName())\n .filter((name): name is string => typeof name === 'string')\n .sort();\n throw new Error(\n available.length > 0\n ? `No evaluator matched \"${evaluatorPattern}\". Available evaluators: ${available.join(', ')}`\n : `No evaluator matched \"${evaluatorPattern}\" and no evaluators were discovered.`,\n );\n }\n\n const evaluatorNameById = new Map(\n evaluators.map((item) => [item.id, item.evaluator.getName() ?? item.id]),\n );\n const aggregates = new Map<string, EvaluatorAggregate>();\n const scoreItemsByEvaluatorScore = new Map<string, ScoreItem[]>();\n const testCaseByTestId = new Map<string, TestCaseEventAcc>();\n let overallScoreTotal = 0;\n let overallScoreSumSq = 0;\n let overallScoreCount = 0;\n let completedCount = 0;\n let totalCount = 0;\n let runFinished = false;\n const spinnerFrames = ['⠋', '⠙', '⠸', '⠴', '⠦', '⠇'];\n let spinnerIndex = 0;\n\n function clearLine(): void {\n if (!process.stdout.isTTY) {\n return;\n }\n process.stdout.write('\\r\\x1b[2K');\n }\n\n function cursorUp(n: number): void {\n if (!process.stdout.isTTY || n <= 0) return;\n process.stdout.write(`\\x1b[${n}A`);\n }\n\n function drawSpinner(): void {\n if (!process.stdout.isTTY || runFinished) {\n return;\n }\n const frame = spinnerFrames[spinnerIndex % spinnerFrames.length];\n spinnerIndex += 1;\n process.stdout.write(\n `\\r${colorize(frame, ansi.cyan)} Running evaluations ${colorize(\n `${completedCount}/${totalCount}`,\n ansi.bold,\n )} ${colorize('(live)', ansi.dim)}`,\n );\n }\n\n let lastPrintedTestCaseId: string | null = null;\n let lastPrintedLineCount = 0;\n\n let spinnerTimer: NodeJS.Timeout | undefined;\n const done = new Promise<RunnerEvent>((resolve) => {\n const unsubscribe = runner.subscribeRunEvents((event) => {\n if (event.type === 'TestCaseProgress') {\n completedCount = event.completedTestCases;\n const numericScores = event.evaluatorScores\n .map((item) => toNumericScoreFromScores(item.scores))\n .filter((item): item is number => item !== undefined);\n const averageScore =\n numericScores.length > 0\n ? numericScores.reduce((sum, value) => sum + value, 0) /\n numericScores.length\n : undefined;\n\n const testCaseId = event.testCaseId;\n const existing = testCaseByTestId.get(testCaseId) ?? {\n name: event.testCaseName,\n events: [],\n };\n existing.events.push({\n averageScore,\n passed: event.passed,\n durationMs: event.durationMs,\n evaluatorScores: event.evaluatorScores,\n });\n testCaseByTestId.set(testCaseId, existing);\n\n for (const item of event.evaluatorScores) {\n const numeric = toNumericScoreFromScores(item.scores);\n if (numeric !== undefined) {\n const current = aggregates.get(item.evaluatorId) ?? {\n total: 0,\n sumSq: 0,\n count: 0,\n passed: 0,\n failed: 0,\n };\n aggregates.set(item.evaluatorId, {\n total: current.total + numeric,\n sumSq: current.sumSq + numeric * numeric,\n count: current.count + 1,\n passed: current.passed + (item.passed ? 1 : 0),\n failed: current.failed + (item.passed ? 0 : 1),\n });\n overallScoreTotal += numeric;\n overallScoreSumSq += numeric * numeric;\n overallScoreCount += 1;\n }\n for (const s of item.scores) {\n const key = `${item.evaluatorId}:${s.id}`;\n const list = scoreItemsByEvaluatorScore.get(key) ?? [];\n list.push(s);\n scoreItemsByEvaluatorScore.set(key, list);\n }\n }\n\n const isSameTestCase = lastPrintedTestCaseId === testCaseId;\n const isLastRerun = event.rerunIndex >= event.rerunTotal;\n const isNonTty = !process.stdout.isTTY;\n // When not TTY and we have reruns, only print the final aggregated block\n const skipPrintNonTty =\n isNonTty && event.rerunTotal > 1 && !isLastRerun;\n\n if (isSameTestCase && lastPrintedLineCount > 0 && !skipPrintNonTty) {\n cursorUp(lastPrintedLineCount);\n }\n\n const aggregatedScores = aggregateEvaluatorScoresFromEvents(\n existing.events,\n evaluatorNameById,\n );\n const isAggregated = existing.events.length > 1;\n const durationMs = existing.events.reduce(\n (s, e) => s + e.durationMs,\n 0,\n );\n const passed = existing.events.every((e) => e.passed);\n\n const lines: string[] = [];\n lines.push(\n `${colorize(`[${event.completedTestCases}/${event.totalTestCases}]`, ansi.cyan)} ${event.testCaseName} ${colorize(`(${event.rerunIndex}/${event.rerunTotal})`, ansi.cyan)} ${colorize(`(${durationMs}ms)`, ansi.dim)}`,\n );\n for (const item of aggregatedScores) {\n const name =\n evaluatorNameById.get(item.evaluatorId) ?? item.evaluatorId;\n lines.push(\n ...formatEvaluatorScoreLine(\n name,\n item.scores,\n item.passed,\n item.metrics,\n { isAggregated },\n ),\n );\n const lastEvent = existing.events[existing.events.length - 1];\n const lastEs = lastEvent?.evaluatorScores.find(\n (x) => x.evaluatorId === item.evaluatorId,\n );\n if (!item.passed && lastEs?.logs && lastEs.logs.length > 0) {\n for (const log of lastEs.logs) {\n if (log.type === 'diff') {\n const useColor = process.stdout.isTTY;\n for (const { type, line } of getDiffLines(log)) {\n const colored =\n useColor && type === 'remove'\n ? colorize(` ${line}`, ansi.red)\n : useColor && type === 'add'\n ? colorize(` ${line}`, ansi.green)\n : ` ${line}`;\n lines.push(colored);\n }\n }\n }\n }\n }\n\n if (!skipPrintNonTty) {\n for (let i = 0; i < lines.length; i++) {\n process.stdout.write(`\\r\\x1b[2K${lines[i]}\\n`);\n }\n lastPrintedTestCaseId = testCaseId;\n lastPrintedLineCount = lines.length;\n }\n\n drawSpinner();\n }\n if (event.type === 'RunCompleted' || event.type === 'RunFailed') {\n runFinished = true;\n clearLine();\n unsubscribe();\n resolve(event);\n }\n });\n });\n\n const snapshot = await runner.runDatasetWith({\n datasetId: dataset.id,\n evaluatorIds: evaluators.map((item) => item.id),\n });\n totalCount = snapshot.totalTestCases;\n\n console.log(colorize('=== Eval Run Started ===', `${ansi.bold}${ansi.cyan}`));\n console.log(`Run: ${colorize(snapshot.runId, ansi.cyan)}`);\n console.log(`Dataset: ${colorize(snapshot.datasetName, ansi.bold)}`);\n console.log(\n `Evaluators: ${evaluators\n .map((item) => item.evaluator.getName() ?? item.id)\n .join(', ')}`,\n );\n console.log(\n `Total test cases: ${colorize(String(snapshot.totalTestCases), ansi.bold)}`,\n );\n console.log('');\n drawSpinner();\n spinnerTimer = setInterval(drawSpinner, 100);\n\n const finalEvent = await done;\n if (spinnerTimer) {\n clearInterval(spinnerTimer);\n }\n\n if (finalEvent.type === 'RunFailed') {\n throw new Error(`Run failed: ${finalEvent.errorMessage}`);\n }\n\n console.log('');\n console.log(colorize('=== Run Summary ===', `${ansi.bold}${ansi.cyan}`));\n console.log(\n `- passed: ${colorize(\n `${finalEvent.passedTestCases}/${finalEvent.totalTestCases}`,\n ansi.green,\n )}`,\n );\n console.log(\n `- failed: ${colorize(\n `${finalEvent.failedTestCases}/${finalEvent.totalTestCases}`,\n finalEvent.failedTestCases > 0 ? ansi.red : ansi.dim,\n )}`,\n );\n if (overallScoreCount > 0) {\n const overallAverage = overallScoreTotal / overallScoreCount;\n const overallSd = sampleStdDev(\n overallScoreTotal,\n overallScoreSumSq,\n overallScoreCount,\n );\n const avgStr =\n overallSd !== undefined\n ? `${overallAverage.toFixed(2)} ± ${overallSd.toFixed(2)}`\n : overallAverage.toFixed(2);\n console.log(\n `- overall avg score: ${colorize(\n avgStr,\n scoreToColor(overallAverage),\n )} ${colorize(createBar(overallAverage), ansi.dim)}`,\n );\n }\n console.log(colorize('- evaluator averages:', ansi.magenta));\n for (const [evaluatorId, evaluatorName] of evaluatorNameById.entries()) {\n const evaluatorLines = getEvaluatorSummaryLines(\n evaluatorId,\n evaluatorName,\n aggregates.get(evaluatorId),\n scoreItemsByEvaluatorScore,\n );\n for (const line of evaluatorLines) {\n console.log(line);\n }\n }\n const testCaseSummaries = buildTestCaseSummaries(testCaseByTestId);\n if (testCaseSummaries.length > 0) {\n console.log(colorize('- test case scores:', ansi.magenta));\n for (const summary of testCaseSummaries) {\n const status = summary.passed\n ? colorize('PASS', ansi.green)\n : colorize('FAIL', ansi.red);\n if (summary.averageScore === undefined) {\n console.log(\n ` ${status} ${summary.name.padEnd(24)} score=n/a ${colorize(`(${summary.durationMs}ms)`, ansi.dim)}`,\n );\n continue;\n }\n const scoreLabel =\n summary.isAggregated && summary.aggregatedScoreItem\n ? getScoreById(summary.aggregatedScoreItem.id)?.format(\n summary.aggregatedScoreItem.data,\n { isAggregated: true },\n ) ?? summary.averageScore.toFixed(2)\n : summary.stdDev !== undefined && summary.isAggregated\n ? `${summary.averageScore.toFixed(2)} ± ${summary.stdDev.toFixed(2)}`\n : summary.averageScore.toFixed(2);\n console.log(\n ` ${status} ${summary.name.padEnd(24)} score=${colorize(\n scoreLabel,\n scoreToColor(summary.averageScore),\n )} ${colorize(createBar(summary.averageScore, 100, 14), ansi.dim)} ${colorize(`(${summary.durationMs}ms)`, ansi.dim)}`,\n );\n }\n }\n console.log(`- artifact: ${colorize(finalEvent.artifactPath, ansi.dim)}`);\n}\n\nexport async function runSimpleEvalCommandInk(\n runner: RunnerApi,\n datasetName: string,\n evaluatorPattern: string,\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const app = render(\n React.createElement(RunView, {\n runner,\n datasetName,\n evaluatorPattern,\n onComplete: (err) => {\n app.unmount();\n if (err) {\n reject(err);\n } else {\n resolve();\n }\n },\n }),\n );\n });\n}\n","/** @jsxImportSource react */\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { Box, Text } from 'ink';\n\nimport { getDiffLines, getMetricById, getScoreById } from '../../evals';\nimport type { DiffLogEntry } from '../../evals/diff';\nimport type { ScoreItem } from '../../evals/score';\nimport type { RunnerApi, RunnerEvent } from '../../runner';\nimport {\n aggregateMetricItems,\n aggregateScoreItems,\n toNumericScore,\n toNumericScoreFromScores,\n} from '../../runner/score-utils';\nimport { TextBar } from '../../cli/components/TextBar';\nimport { Banner } from './Banner';\nimport { Spinner } from './Spinner';\n\ninterface EvaluatorScoreRow {\n evaluatorId: string;\n evaluatorName: string;\n scores: ReadonlyArray<ScoreItem>;\n passed: boolean;\n metrics?: ReadonlyArray<{ id: string; data: unknown }>;\n logs?: ReadonlyArray<DiffLogEntry>;\n}\n\ninterface TestCaseProgress {\n name: string;\n testCaseId: string;\n completedTestCases: number;\n totalTestCases: number;\n rerunIndex: number;\n rerunTotal: number;\n durationMs: number;\n passed: boolean;\n averageScore?: number;\n evaluatorScores: EvaluatorScoreRow[];\n}\n\n/** One displayed block per unique test case, updated in place as reruns complete */\ninterface TestCaseDisplay {\n name: string;\n testCaseId: string;\n completedTestCases: number;\n totalTestCases: number;\n rerunIndex: number;\n rerunTotal: number;\n durationMs: number;\n passed: boolean;\n events: Array<{\n evaluatorScores: EvaluatorScoreRow[];\n passed: boolean;\n durationMs: number;\n }>;\n aggregatedEvaluatorScores: EvaluatorScoreRow[];\n isAggregated: boolean;\n}\n\ninterface EvaluatorAggregate {\n total: number;\n sumSq: number;\n count: number;\n passed: number;\n failed: number;\n}\n\nfunction sampleStdDev(sum: number, sumSq: number, n: number): number | undefined {\n if (n < 2) return undefined;\n const mean = sum / n;\n const variance = (sumSq - n * mean * mean) / (n - 1);\n return variance > 0 ? Math.sqrt(variance) : 0;\n}\n\nfunction scoreColor(score: number): 'green' | 'yellow' | 'red' {\n if (score >= 80) return 'green';\n if (score >= 50) return 'yellow';\n return 'red';\n}\n\nfunction createBar(value: number, max = 100, width = 20): string {\n const safe = Math.max(0, Math.min(max, value));\n const filled = Math.round((safe / max) * width);\n return '█'.repeat(filled) + '░'.repeat(width - filled);\n}\n\nfunction aggregateEvaluatorScores(\n events: Array<{ evaluatorScores: EvaluatorScoreRow[] }>,\n nameById: Map<string, string>,\n): EvaluatorScoreRow[] {\n if (events.length === 0) return [];\n const evaluatorIds = new Set(\n events.flatMap((e) => e.evaluatorScores.map((x) => x.evaluatorId)),\n );\n const result: EvaluatorScoreRow[] = [];\n for (const evaluatorId of evaluatorIds) {\n const scoreIdToItems = new Map<string, ScoreItem[]>();\n const metricIdToItems = new Map<\n string,\n Array<{ id: string; data: unknown }>\n >();\n for (const ev of events) {\n const es = ev.evaluatorScores.find((x) => x.evaluatorId === evaluatorId);\n for (const s of es?.scores ?? []) {\n const list = scoreIdToItems.get(s.id) ?? [];\n list.push(s);\n scoreIdToItems.set(s.id, list);\n }\n for (const m of es?.metrics ?? []) {\n const list = metricIdToItems.get(m.id) ?? [];\n list.push(m);\n metricIdToItems.set(m.id, list);\n }\n }\n const aggregatedScores: ScoreItem[] = [];\n for (const items of scoreIdToItems.values()) {\n const agg = aggregateScoreItems(items);\n if (agg) aggregatedScores.push(agg);\n }\n const aggregatedMetrics = Array.from(metricIdToItems.entries())\n .map(([id, items]) => aggregateMetricItems(items))\n .filter((m): m is { id: string; data: unknown } => m !== undefined);\n const passed = events.every((ev) => {\n const es = ev.evaluatorScores.find((x) => x.evaluatorId === evaluatorId);\n return es?.passed ?? false;\n });\n const lastEvent = events[events.length - 1];\n const lastEs = lastEvent?.evaluatorScores.find(\n (x) => x.evaluatorId === evaluatorId,\n );\n result.push({\n evaluatorId,\n evaluatorName: nameById.get(evaluatorId) ?? evaluatorId,\n scores: aggregatedScores,\n passed,\n metrics: aggregatedMetrics.length > 0 ? aggregatedMetrics : undefined,\n logs: lastEs?.logs,\n });\n }\n return result;\n}\n\nfunction formatScorePart(\n item: ScoreItem,\n scoreToColor: (n: number) => 'green' | 'yellow' | 'red',\n options?: { isAggregated?: boolean },\n): string {\n const def = getScoreById(item.id);\n if (!def) {\n const numeric = toNumericScore(item.data);\n return numeric !== undefined ? `${numeric.toFixed(2)}` : 'n/a';\n }\n const formatted = def.format(item.data, options);\n if (def.displayStrategy === 'bar') {\n const numeric =\n typeof item.data === 'object' &&\n item.data !== null &&\n 'value' in item.data\n ? (item.data as { value: unknown }).value\n : toNumericScore(item.data);\n if (typeof numeric === 'number' && Number.isFinite(numeric)) {\n return `${formatted} ${createBar(numeric)}`;\n }\n }\n return formatted;\n}\n\ninterface RunViewProps {\n runner: RunnerApi;\n datasetName: string;\n evaluatorPattern: string;\n onComplete: (error?: Error) => void;\n}\n\nexport function RunView({\n runner,\n datasetName,\n evaluatorPattern,\n onComplete,\n}: RunViewProps): React.ReactNode {\n const [phase, setPhase] = useState<'loading' | 'running' | 'completed'>(\n 'loading',\n );\n const [runInfo, setRunInfo] = useState<{\n runId: string;\n datasetName: string;\n evaluatorNames: string[];\n totalTestCases: number;\n } | null>(null);\n const [testCases, setTestCases] = useState<TestCaseDisplay[]>([]);\n const [completedEvaluations, setCompletedEvaluations] = useState(0);\n const [summary, setSummary] = useState<{\n passedTestCases: number;\n failedTestCases: number;\n totalTestCases: number;\n overallScoreTotal: number;\n overallScoreSumSq: number;\n overallScoreCount: number;\n aggregates: Map<string, EvaluatorAggregate>;\n scoreItemsByEvaluatorScore: Map<string, ScoreItem[]>;\n artifactPath: string;\n } | null>(null);\n const [evaluatorNameById, setEvaluatorNameById] = useState<\n Map<string, string>\n >(new Map());\n\n const runEval = useCallback(async () => {\n const dataset = await runner.resolveDatasetByName(datasetName);\n if (!dataset) {\n const known = await runner.collectDatasets();\n const available = known.map((item) => item.dataset.getName()).sort();\n onComplete(\n new Error(\n available.length > 0\n ? `Dataset \"${datasetName}\" not found. Available: ${available.join(', ')}`\n : `Dataset \"${datasetName}\" not found.`,\n ),\n );\n return;\n }\n\n const evaluators =\n await runner.resolveEvaluatorsByNamePattern(evaluatorPattern);\n if (evaluators.length === 0) {\n const known = await runner.collectEvaluators();\n const available = known\n .map((item) => item.evaluator.getName())\n .filter((name): name is string => typeof name === 'string')\n .sort();\n onComplete(\n new Error(\n available.length > 0\n ? `No evaluator matched \"${evaluatorPattern}\". Available: ${available.join(', ')}`\n : `No evaluator matched \"${evaluatorPattern}\".`,\n ),\n );\n return;\n }\n\n const nameById = new Map(\n evaluators.map((item) => [item.id, item.evaluator.getName() ?? item.id]),\n );\n setEvaluatorNameById(nameById);\n\n const aggregates = new Map<string, EvaluatorAggregate>();\n const scoreItemsByEvaluatorScore = new Map<string, ScoreItem[]>();\n let overallScoreTotal = 0;\n let overallScoreSumSq = 0;\n let overallScoreCount = 0;\n\n const done = new Promise<RunnerEvent>((resolve) => {\n const unsubscribe = runner.subscribeRunEvents((event) => {\n if (event.type === 'TestCaseProgress') {\n const numericScores = event.evaluatorScores\n .map((item) => toNumericScoreFromScores(item.scores))\n .filter((item): item is number => item !== undefined);\n const averageScore =\n numericScores.length > 0\n ? numericScores.reduce((sum, v) => sum + v, 0) /\n numericScores.length\n : undefined;\n\n for (const item of event.evaluatorScores) {\n const numeric = toNumericScoreFromScores(item.scores);\n if (numeric !== undefined) {\n const current = aggregates.get(item.evaluatorId) ?? {\n total: 0,\n sumSq: 0,\n count: 0,\n passed: 0,\n failed: 0,\n };\n aggregates.set(item.evaluatorId, {\n total: current.total + numeric,\n sumSq: current.sumSq + numeric * numeric,\n count: current.count + 1,\n passed: current.passed + (item.passed ? 1 : 0),\n failed: current.failed + (item.passed ? 0 : 1),\n });\n overallScoreTotal += numeric;\n overallScoreSumSq += numeric * numeric;\n overallScoreCount += 1;\n }\n for (const s of item.scores) {\n const key = `${item.evaluatorId}:${s.id}`;\n const list = scoreItemsByEvaluatorScore.get(key) ?? [];\n list.push(s);\n scoreItemsByEvaluatorScore.set(key, list);\n }\n }\n\n setTestCases((prev) => {\n const byId = new Map(prev.map((tc) => [tc.testCaseId, tc]));\n const existing = byId.get(event.testCaseId);\n const newEvent = {\n evaluatorScores: event.evaluatorScores.map((item) => ({\n evaluatorId: item.evaluatorId,\n evaluatorName:\n nameById.get(item.evaluatorId) ?? item.evaluatorId,\n scores: item.scores,\n passed: item.passed,\n metrics: item.metrics,\n logs: item.logs,\n })),\n passed: event.passed,\n durationMs: event.durationMs,\n };\n const events = existing\n ? [...existing.events, newEvent]\n : [newEvent];\n const isAggregated = events.length > 1;\n\n const aggregatedEvaluatorScores = aggregateEvaluatorScores(\n events,\n nameById,\n );\n\n const merged: TestCaseDisplay = {\n name: event.testCaseName,\n testCaseId: event.testCaseId,\n completedTestCases: event.completedTestCases,\n totalTestCases: event.totalTestCases,\n rerunIndex: event.rerunIndex,\n rerunTotal: event.rerunTotal,\n durationMs: events.reduce((s, e) => s + e.durationMs, 0),\n passed: events.every((e) => e.passed),\n events,\n aggregatedEvaluatorScores,\n isAggregated,\n };\n byId.set(event.testCaseId, merged);\n setCompletedEvaluations(event.completedTestCases);\n return Array.from(byId.values());\n });\n }\n if (event.type === 'RunCompleted' || event.type === 'RunFailed') {\n unsubscribe();\n resolve(event);\n }\n });\n });\n\n const snapshot = await runner.runDatasetWith({\n datasetId: dataset.id,\n evaluatorIds: evaluators.map((item) => item.id),\n });\n\n setRunInfo({\n runId: snapshot.runId,\n datasetName: snapshot.datasetName,\n evaluatorNames: evaluators.map((e) => e.evaluator.getName() ?? e.id),\n totalTestCases: snapshot.totalTestCases,\n });\n setPhase('running');\n\n const finalEvent = await done;\n\n if (finalEvent.type === 'RunFailed') {\n onComplete(new Error(`Run failed: ${finalEvent.errorMessage}`));\n return;\n }\n\n setSummary({\n passedTestCases: finalEvent.passedTestCases,\n failedTestCases: finalEvent.failedTestCases,\n totalTestCases: finalEvent.totalTestCases,\n overallScoreTotal,\n overallScoreSumSq,\n overallScoreCount,\n aggregates: new Map(aggregates),\n scoreItemsByEvaluatorScore: new Map(scoreItemsByEvaluatorScore),\n artifactPath: finalEvent.artifactPath,\n });\n setPhase('completed');\n setTimeout(() => onComplete(), 200);\n }, [runner, datasetName, evaluatorPattern, onComplete]);\n\n useEffect(() => {\n void runEval();\n }, [runEval]);\n\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Box marginBottom={1}>\n <Banner />\n </Box>\n\n {runInfo && (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text>\n <Text color=\"cyan\" bold>\n Run{' '}\n </Text>\n <Text color=\"gray\">{runInfo.runId}</Text>\n </Text>\n <Text>\n <Text color=\"cyan\" bold>\n Dataset{' '}\n </Text>\n {runInfo.datasetName}\n </Text>\n <Text>\n <Text color=\"cyan\" bold>\n Evaluators{' '}\n </Text>\n {runInfo.evaluatorNames.join(', ')}\n </Text>\n <Text>\n <Text color=\"cyan\" bold>\n Test cases{' '}\n </Text>\n {runInfo.totalTestCases}\n </Text>\n </Box>\n )}\n\n {phase === 'running' && (\n <Box marginBottom={1}>\n <Spinner\n label={`Evaluations ${completedEvaluations}/${runInfo?.totalTestCases ?? 0}`}\n />\n </Box>\n )}\n\n {testCases.length > 0 && (\n <Box flexDirection=\"column\" marginBottom={1}>\n {testCases.map((tc) => (\n <Box key={tc.testCaseId} flexDirection=\"column\" marginBottom={0}>\n <Text>\n <Text color=\"cyan\">\n [{tc.completedTestCases}/{tc.totalTestCases}]\n </Text>{' '}\n {tc.name}{' '}\n <Text color=\"cyan\">\n ({tc.rerunIndex}/{tc.rerunTotal})\n </Text>\n <Text color=\"gray\"> ({tc.durationMs}ms)</Text>\n </Text>\n {tc.aggregatedEvaluatorScores.map((item) => (\n <Box\n key={item.evaluatorId}\n flexDirection=\"column\"\n marginLeft={2}\n >\n <Text>\n {item.evaluatorName}:{' '}\n <Text color={item.passed ? 'green' : 'red'} bold>\n {item.passed ? 'PASS' : 'FAIL'}\n </Text>\n {item.metrics && item.metrics.length > 0 ? (\n <>\n {' '}\n {item.metrics.map((m) => {\n const def = getMetricById(m.id);\n if (!def) return null;\n const formatted = def.format(m.data, {\n isAggregated: tc.isAggregated,\n });\n return (\n <Text key={m.id} color=\"gray\">\n [{def.name ? `${def.name}: ` : ''}\n {formatted}]{' '}\n </Text>\n );\n })}\n </>\n ) : null}\n </Text>\n {item.scores.length > 0 ? (\n item.scores.map((s, idx) => {\n const def = getScoreById(s.id);\n const scoreLabel = def ? def.name ?? def.id : s.id;\n return (\n <Text\n key={`${item.evaluatorId}-${s.id}-${idx}`}\n color={scoreColor(toNumericScore(s.data) ?? 0)}\n >\n {' '}\n {scoreLabel}:{' '}\n {formatScorePart(s, scoreColor, {\n isAggregated: tc.isAggregated,\n })}\n </Text>\n );\n })\n ) : (\n <Text color=\"gray\"> n/a</Text>\n )}\n {!item.passed && item.logs && item.logs.length > 0 && (\n <Box marginLeft={2} flexDirection=\"column\">\n {item.logs.map((log, logIdx) =>\n log.type === 'diff' ? (\n <Box key={logIdx} flexDirection=\"column\">\n {getDiffLines(log).map(\n ({ type, line }, lineIdx) => (\n <Text\n key={lineIdx}\n color={\n type === 'remove'\n ? 'red'\n : type === 'add'\n ? 'green'\n : 'gray'\n }\n >\n {line}\n </Text>\n ),\n )}\n </Box>\n ) : null,\n )}\n </Box>\n )}\n </Box>\n ))}\n </Box>\n ))}\n </Box>\n )}\n\n {phase === 'completed' && summary && (\n <Box flexDirection=\"column\">\n <Text color=\"cyan\" bold>\n Run Summary\n </Text>\n <Box marginTop={1}>\n <Text color=\"green\">passed</Text>\n <Text>\n {' '}\n {summary.passedTestCases}/{summary.totalTestCases}\n </Text>\n </Box>\n <Box>\n <Text color={summary.failedTestCases > 0 ? 'red' : 'gray'}>\n failed\n </Text>\n <Text>\n {' '}\n {summary.failedTestCases}/{summary.totalTestCases}\n </Text>\n </Box>\n {summary.overallScoreCount > 0 && (\n <Box marginTop={1}>\n <TextBar\n label=\"overall avg\"\n value={summary.overallScoreTotal / summary.overallScoreCount}\n barWidth={20}\n format={(v) => {\n const sd = sampleStdDev(\n summary.overallScoreTotal,\n summary.overallScoreSumSq,\n summary.overallScoreCount,\n );\n return sd !== undefined\n ? `${v.toFixed(2)} ± ${sd.toFixed(2)}`\n : v.toFixed(2);\n }}\n />\n </Box>\n )}\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"magenta\">evaluator averages</Text>\n {Array.from(evaluatorNameById.entries()).map(([id, name]) => {\n const agg = summary.aggregates.get(id);\n const scoreKeys = [...(summary.scoreItemsByEvaluatorScore?.keys() ?? [])].filter(\n (k) => k.startsWith(`${id}:`),\n );\n if (scoreKeys.length === 0) {\n return (\n <Text key={id} color=\"gray\">\n - {name.padEnd(28)} no scores\n </Text>\n );\n }\n const passedFailed =\n agg != null ? (\n <Text>\n {' '}\n passed={agg.passed} failed={agg.failed}\n </Text>\n ) : null;\n return (\n <Box key={id} flexDirection=\"column\">\n <Text>\n - {name.padEnd(28)}\n {passedFailed}\n </Text>\n {scoreKeys.map((key) => {\n const items =\n summary.scoreItemsByEvaluatorScore?.get(key) ?? [];\n const aggregated = aggregateScoreItems(items);\n if (!aggregated) return null;\n const def = getScoreById(aggregated.id);\n const label = def ? def.name ?? def.id : aggregated.id;\n const formatted = def?.format(aggregated.data, {\n isAggregated: true,\n }) ?? 'n/a';\n const numeric = toNumericScore(aggregated.data);\n return (\n <Text\n key={key}\n color={\n numeric !== undefined\n ? scoreColor(numeric)\n : 'gray'\n }\n >\n {' '}\n {label}: {formatted}\n </Text>\n );\n })}\n </Box>\n );\n })}\n </Box>\n <Box marginTop={1} flexDirection=\"column\">\n <Text color=\"magenta\">test case scores</Text>\n {testCases.map((tc) => {\n const allScores = tc.events.flatMap((ev) =>\n ev.evaluatorScores\n .map((es) => toNumericScoreFromScores(es.scores))\n .filter((n): n is number => n !== undefined),\n );\n const averageScore =\n allScores.length > 0\n ? allScores.reduce((a, b) => a + b, 0) / allScores.length\n : undefined;\n const sumSq =\n allScores.length > 0\n ? allScores.reduce((s, v) => s + v * v, 0)\n : 0;\n const total = allScores.reduce((a, b) => a + b, 0);\n const tcStdDev = sampleStdDev(total, sumSq, allScores.length);\n const firstScore = tc.aggregatedEvaluatorScores[0]?.scores[0];\n const scoreLabel =\n firstScore && tc.isAggregated\n ? formatScorePart(firstScore, scoreColor, {\n isAggregated: true,\n })\n : averageScore !== undefined\n ? tcStdDev !== undefined && tc.isAggregated\n ? `${averageScore.toFixed(2)} ± ${tcStdDev.toFixed(2)}`\n : averageScore.toFixed(2)\n : 'n/a';\n return (\n <Box key={tc.testCaseId}>\n <Text color={tc.passed ? 'green' : 'red'}>\n {tc.passed ? 'PASS' : 'FAIL'}\n </Text>\n <Text> {tc.name.padEnd(24)}</Text>\n {averageScore !== undefined ? (\n <>\n <Text color={scoreColor(averageScore)}>\n score={scoreLabel}\n </Text>\n <Text color=\"gray\">\n {' '}\n {createBar(averageScore, 100, 14)}\n </Text>\n </>\n ) : (\n <Text color=\"gray\">score=n/a</Text>\n )}\n <Text color=\"gray\"> ({tc.durationMs}ms)</Text>\n </Box>\n );\n })}\n </Box>\n <Box marginTop={1}>\n <Text color=\"gray\">artifact: {summary.artifactPath}</Text>\n </Box>\n </Box>\n )}\n </Box>\n );\n}\n","/** @jsxImportSource react */\nimport React from 'react';\nimport { Text } from 'ink';\n\ninterface TextBarProps {\n label: string;\n value: number;\n max?: number;\n /** Label width (default 14 to match inspiration) */\n labelWidth?: number;\n /** Bar width in chars (default 20) */\n barWidth?: number;\n /** Format value for display (e.g. v => `${v}%`) */\n format?: (v: number) => string;\n /** Color bar by value: green > 70, yellow 40-70, red < 40 */\n colorByValue?: boolean;\n}\n\nfunction barColor(pct: number): 'green' | 'yellow' | 'red' | undefined {\n if (pct >= 70) return 'green';\n if (pct >= 40) return 'yellow';\n return 'red';\n}\n\nexport function TextBar({\n label,\n value,\n max = 100,\n labelWidth = 14,\n barWidth = 20,\n format = (v) => String(v),\n colorByValue = true,\n}: TextBarProps): React.ReactNode {\n const clamped = Math.max(0, Math.min(max, value));\n const pct = max > 0 ? (clamped / max) * 100 : 0;\n const filled = Math.round((clamped / max) * barWidth);\n const filledBar = '█'.repeat(filled);\n const emptyBar = '░'.repeat(Math.max(0, barWidth - filled));\n const color = colorByValue ? barColor(pct) : undefined;\n\n return (\n <Text>\n <Text color=\"gray\">{label.padEnd(labelWidth)}</Text>\n {' ['}\n {color ? (\n <>\n <Text color={color}>{filledBar}</Text>\n <Text color=\"gray\">{emptyBar}</Text>\n </>\n ) : (\n filledBar + emptyBar\n )}\n {'] '}\n <Text color={color ?? 'white'} bold>{format(value)}</Text>\n </Text>\n );\n}\n","/** @jsxImportSource react */\nimport React, { useEffect, useState } from 'react';\nimport { Text } from 'ink';\n\nconst FRAMES = ['⠋', '⠙', '⠸', '⠴', '⠦', '⠇'];\n\ninterface SpinnerProps {\n label?: string;\n}\n\nexport function Spinner({ label = 'Running' }: SpinnerProps): React.ReactNode {\n const [frame, setFrame] = useState(0);\n\n useEffect(() => {\n const timer = setInterval(() => {\n setFrame((f) => (f + 1) % FRAMES.length);\n }, 100);\n return () => clearInterval(timer);\n }, []);\n\n return (\n <Text color=\"cyan\">\n {FRAMES[frame]} {label}\n </Text>\n );\n}\n","#!/usr/bin/env node\n\nimport { createRunner } from '../runner';\nimport { getSimpleCliUsage, parseSimpleCliArgs } from './args';\nimport { printBanner } from './banner';\nimport {\n generateDatasetJsonCommandInk,\n generateDatasetJsonCommandPlain,\n} from './generate';\nimport {\n runSimpleEvalCommandInk,\n runSimpleEvalCommandPlain,\n} from './run';\n\nfunction printUsageAndExit(exitCode: number): never {\n const printer = exitCode === 0 ? console.log : console.error;\n printer(getSimpleCliUsage());\n process.exit(exitCode);\n}\n\nasync function main(): Promise<void> {\n const args = parseSimpleCliArgs(process.argv.slice(2));\n\n if (args.help) {\n printUsageAndExit(0);\n }\n if (args.unknownArgs.length > 0) {\n console.error(`Unknown arguments: ${args.unknownArgs.join(', ')}`);\n printUsageAndExit(1);\n }\n if (!args.command) {\n printUsageAndExit(1);\n }\n if (!args.datasetName) {\n console.error('Missing required --dataset <datasetName> argument.');\n printUsageAndExit(1);\n }\n\n if (args.command === 'run' && !args.evaluatorPattern) {\n console.error('Missing required --evaluator <name-or-pattern> argument.');\n printUsageAndExit(1);\n }\n\n const useInk = process.stdout.isTTY === true;\n if (!useInk) {\n printBanner();\n }\n\n const runner = createRunner();\n try {\n if (args.command === 'run') {\n await (useInk ? runSimpleEvalCommandInk : runSimpleEvalCommandPlain)(\n runner,\n args.datasetName,\n args.evaluatorPattern!,\n );\n return;\n }\n\n await (useInk ? generateDatasetJsonCommandInk : generateDatasetJsonCommandPlain)(\n runner,\n args.datasetName,\n );\n } finally {\n await runner.shutdown();\n }\n}\n\nvoid main().catch((error: unknown) => {\n console.error(error instanceof Error ? error.message : 'Command failed');\n process.exit(1);\n});\n"]}
|