{"version":3,"sources":["../src/logs/config.ts","../src/logs/json-parser.ts","../src/logs/log4js-parser.ts","../src/logs/mapping.ts","../src/logs/normalizer.ts","../src/logs/tree-renderer.ts","../src/logs/line-parser.ts","../src/logs/live-tree.ts","../src/logs/index.ts"],"names":["isRecord","readFile"],"mappings":";;;;;;;AAIA,SAAS,SAAS,CAAA,EAA0C;AAC1D,EAAA,OAAO,OAAO,MAAM,QAAA,IAAY,CAAA,KAAM,QAAQ,CAAC,KAAA,CAAM,QAAQ,CAAC,CAAA;AAChE;AAEA,SAAS,sBAAsB,CAAA,EAA2B;AACxD,EAAA,OACE,MAAM,OAAA,CAAQ,CAAC,CAAA,IACf,CAAA,CAAE,SAAS,CAAA,IACX,CAAA,CAAE,KAAA,CAAM,CAAC,MAAM,OAAO,CAAA,KAAM,YAAY,CAAA,CAAE,IAAA,OAAW,EAAE,CAAA;AAE3D;AAEA,SAAS,eAAe,MAAA,EAAoD;AAC1E,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,EAC3D;AACA,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AAC3B,IAAA,IAAI,CAAC,QAAA,CAAS,CAAC,CAAA,EAAG;AAChB,MAAA,MAAM,IAAI,MAAM,2DAA2D,CAAA;AAAA,IAC7E;AACA,IAAA,IAAI,OAAO,EAAE,GAAA,KAAQ,QAAA,IAAY,EAAE,GAAA,CAAI,IAAA,OAAW,EAAA,EAAI;AACpD,MAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,IACzE;AACA,IAAA,IAAI,CAAA,CAAE,aAAa,MAAA,IAAU,CAAA,CAAE,aAAa,QAAA,IAAY,CAAA,CAAE,aAAa,MAAA,EAAQ;AAC7E,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,uEAAA,EAA0E,MAAA;AAAA,UACxE,CAAA,CAAE;AAAA,SACH,CAAA,CAAA;AAAA,OACH;AAAA,IACF;AACA,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,KAAc,OAAO,EAAE,IAAA,KAAS,QAAA,IAAY,CAAC,MAAA,CAAO,SAAS,CAAA,CAAE,IAAI,CAAA,IAAK,CAAA,CAAE,OAAO,CAAA,CAAA,EAAI;AAClG,MAAA,MAAM,IAAI,MAAM,yEAAyE,CAAA;AAAA,IAC3F;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,QAAA,EAAwE;AAChG,EAAA,IAAI,CAAC,QAAA,CAAS,QAAQ,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,EAC9D;AACF;AAEO,IAAM,yBAAA,GAA6C;AAAA,EACxD,WAAW,CAAC,OAAA,EAAS,SAAA,EAAW,WAAA,EAAa,cAAc,OAAO,CAAA;AAAA,EAClE,QAAA,EAAU,OAAA;AAAA,EACV,YAAA,EAAc,WAAA;AAAA,EACd,UAAA,EAAY,SAAA;AAAA,EACZ,QAAA,EAAU,OAAA;AAAA,EACV,iBAAA,EAAmB,GAAA;AAAA,EACnB,QAAA,EAAU;AAAA,IACR,SAAA,EAAW,EAAE,IAAA,EAAM,OAAA,EAAS,QAAQ,OAAA,EAAQ;AAAA,IAC5C,UAAA,EAAY,EAAE,IAAA,EAAM,OAAA,EAAS,QAAQ,OAAA,EAAQ;AAAA,IAC7C,SAAA,EAAW,EAAE,IAAA,EAAM,KAAA,EAAM;AAAA,IACzB,UAAA,EAAY,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,IAC3B,WAAA,EAAa,EAAE,IAAA,EAAM,OAAA,EAAQ;AAAA,IAC7B,eAAA,EAAiB,EAAE,IAAA,EAAM,WAAA,EAAY;AAAA,IACrC,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA;AAAS;AAEnC;AAEO,SAAS,oBAAA,CACd,MACA,QAAA,EACiB;AACjB,EAAA,MAAM,MAAA,GAA0B;AAAA,IAC9B,GAAG,IAAA;AAAA,IACH,GAAG,QAAA;AAAA,IACH,QAAA,EAAU;AAAA,MACR,GAAI,IAAA,CAAK,QAAA,IAAY,EAAC;AAAA,MACtB,GAAI,QAAA,CAAS,QAAA,IAAY;AAAC;AAC5B,GACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,eAAsB,oBAAoB,UAAA,EAA+C;AACvF,EAAA,IAAI,UAAA,KAAe,MAAA,IAAa,UAAA,CAAW,IAAA,OAAW,EAAA,EAAI;AACxD,IAAA,OAAO,yBAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAM,QAAA,CAAS,UAAA,EAAY,OAAO,CAAA;AAAA,EAC9C,SAAS,CAAA,EAAG;AACV,IAAA,MAAM,MAAM,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,OAAO,CAAC,CAAA;AACrD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,UAAU,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,EACtE;AAEA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC7B,SAAS,CAAA,EAAG;AACV,IAAA,MAAM,MAAM,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,OAAO,CAAC,CAAA;AACrD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,UAAU,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,CAAC,QAAA,CAAS,MAAM,CAAA,EAAG;AACrB,IAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,EACvE;AAEA,EAAA,MAAM,IAAA,GAAO,MAAA;AAEb,EAAA,IAAI,KAAK,SAAA,KAAc,MAAA,IAAa,CAAC,qBAAA,CAAsB,IAAA,CAAK,SAAS,CAAA,EAAG;AAC1E,IAAA,MAAM,IAAI,MAAM,gEAAgE,CAAA;AAAA,EAClF;AACA,EAAA,IAAI,IAAA,CAAK,QAAA,KAAa,MAAA,KAAc,OAAO,IAAA,CAAK,QAAA,KAAa,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK,KAAM,EAAA,CAAA,EAAK;AACrG,IAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,EACvE;AAEA,EAAA,KAAA,MAAW,CAAA,IAAK;AAAA,IACd,cAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF,EAAY;AACV,IAAA,MAAM,CAAA,GAAK,KAAa,CAAC,CAAA;AACzB,IAAA,IAAI,CAAA,KAAM,WAAc,OAAO,CAAA,KAAM,YAAY,CAAA,CAAE,IAAA,OAAW,EAAA,CAAA,EAAK;AACjE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,CAAC,CAAA,yCAAA,CAA2C,CAAA;AAAA,IACjF;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAW;AAC/B,IAAA,gBAAA,CAAiB,KAAK,QAAQ,CAAA;AAAA,EAChC;AACA,EAAA,IAAI,IAAA,CAAK,WAAW,MAAA,EAAW;AAC7B,IAAA,cAAA,CAAe,KAAK,MAAM,CAAA;AAAA,EAC5B;AACA,EAAA,IACE,IAAA,CAAK,iBAAA,KAAsB,MAAA,KAC1B,OAAO,KAAK,iBAAA,KAAsB,QAAA,IACjC,CAAC,MAAA,CAAO,SAAS,IAAA,CAAK,iBAAiB,CAAA,IACvC,IAAA,CAAK,oBAAoB,CAAA,CAAA,EAC3B;AACA,IAAA,MAAM,IAAI,MAAM,+EAA+E,CAAA;AAAA,EACjG;AAGA,EAAA,IAAK,IAAA,CAAa,UAAU,IAAA,CAAK,SAAA,CAAW,KAAa,MAAM,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG;AAC/E,IAAA,MAAM,IAAI,MAAM,oEAAoE,CAAA;AAAA,EACtF;AAEA,EAAA,OAAO,oBAAA,CAAqB,2BAA2B,IAAI,CAAA;AAC7D;AChJA,SAASA,UAAS,CAAA,EAA0C;AAC1D,EAAA,OAAO,OAAO,MAAM,QAAA,IAAY,CAAA,KAAM,QAAQ,CAAC,KAAA,CAAM,QAAQ,CAAC,CAAA;AAChE;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACzB,UAAA,CAAW,OAAiB,QAAA,EAA8C;AACxE,IAAA,MAAM,UAA0B,EAAC;AACjC,IAAA,MAAM,WAA4B,EAAC;AAEnC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,aAAa,CAAA,GAAI,CAAA;AACvB,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AACxB,MAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,MAAA,IAAI,YAAY,EAAA,EAAI;AACpB,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,MAC7B,CAAA,CAAA,MAAQ;AACN,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,IAAA,EAAM,gBAAA;AAAA,UACN,OAAA,EAAS,yBAAA;AAAA,UACT,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM,UAAA;AAAA,UACN,GAAA,EAAK,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG;AAAA,SAC1B,CAAA;AACD,QAAA;AAAA,MACF;AACA,MAAA,IAAI,CAACA,SAAAA,CAAS,MAAM,CAAA,EAAG;AACrB,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,IAAA,EAAM,gBAAA;AAAA,UACN,OAAA,EAAS,iCAAA;AAAA,UACT,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM,UAAA;AAAA,UACN,GAAA,EAAK,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG;AAAA,SAC1B,CAAA;AACD,QAAA;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,GAAA,EAAK,MAAA;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,EAAE,SAAS,QAAA,EAAS;AAAA,EAC7B;AAAA,EAEA,MAAM,UAAU,QAAA,EAAsD;AACpE,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,MAAMC,QAAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAAA,IACzC,SAAS,CAAA,EAAG;AACV,MAAA,MAAM,MAAM,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,OAAO,CAAC,CAAA;AACrD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,QAAQ,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IACjE;AACA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAChC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,QAAQ,CAAA;AAAA,EACxC;AACF;AC3DA,SAASD,UAAS,CAAA,EAA0C;AAC1D,EAAA,OAAO,OAAO,MAAM,QAAA,IAAY,CAAA,KAAM,QAAQ,CAAC,KAAA,CAAM,QAAQ,CAAC,CAAA;AAChE;AAEA,SAAS,4BAA4B,IAAA,EAAkC;AAGrE,EAAA,IAAI,IAAA;AACJ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,EAAK;AACrB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,IAAI,MAAA,GAAS,KAAA;AACb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AACjB,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAA,GAAS,KAAA;AACT,UAAA;AAAA,QACF;AACA,QAAA,IAAI,OAAO,IAAA,EAAM;AACf,UAAA,MAAA,GAAS,IAAA;AACT,UAAA;AAAA,QACF;AACA,QAAA,IAAI,OAAO,GAAA,EAAK;AACd,UAAA,QAAA,GAAW,KAAA;AAAA,QACb;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,OAAO,GAAA,EAAK;AACd,QAAA,QAAA,GAAW,IAAA;AACX,QAAA;AAAA,MACF;AACA,MAAA,IAAI,EAAA,KAAO,KAAK,KAAA,IAAS,CAAA;AACzB,MAAA,IAAI,EAAA,KAAO,KAAK,KAAA,IAAS,CAAA;AACzB,MAAA,IAAI,UAAU,CAAA,EAAG;AACf,QAAA,IAAA,GAAO,EAAE,KAAA,EAAO,CAAA,EAAG,GAAA,EAAK,IAAI,CAAA,EAAE;AAC9B,QAAA,CAAA,GAAI,CAAA;AACJ,QAAA;AAAA,MACF;AACA,MAAA,IAAI,QAAQ,CAAA,EAAG;AAAA,IACjB;AAAA,EACF;AACA,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,EAAO,KAAK,GAAG,CAAA;AACxC;AAEO,IAAM,eAAN,MAAmB;AAAA,EACxB,UAAA,CAAW,OAAiB,QAAA,EAA8C;AACxE,IAAA,MAAM,UAA0B,EAAC;AACjC,IAAA,MAAM,WAA4B,EAAC;AAEnC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,aAAa,CAAA,GAAI,CAAA;AACvB,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAC5B,MAAA,MAAM,OAAA,GAAU,QAAQ,IAAA,EAAK;AAC7B,MAAA,IAAI,YAAY,EAAA,EAAI;AAEpB,MAAA,MAAM,QAAA,GAAW,4BAA4B,OAAO,CAAA;AACpD,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,IAAA,EAAM,4BAAA;AAAA,UACN,OAAA,EAAS,8CAAA;AAAA,UACT,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM,UAAA;AAAA,UACN,GAAA,EAAK,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG;AAAA,SAC1B,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,IAAA,CAAK,MAAM,QAAQ,CAAA;AAAA,MAC9B,CAAA,CAAA,MAAQ;AACN,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,IAAA,EAAM,gBAAA;AAAA,UACN,OAAA,EAAS,+CAAA;AAAA,UACT,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM,UAAA;AAAA,UACN,GAAA,EAAK,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,GAAG;AAAA,SAC3B,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,CAACA,SAAAA,CAAS,MAAM,CAAA,EAAG;AACrB,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,IAAA,EAAM,4BAAA;AAAA,UACN,OAAA,EAAS,yCAAA;AAAA,UACT,IAAA,EAAM,QAAA;AAAA,UACN,IAAA,EAAM,UAAA;AAAA,UACN,GAAA,EAAK,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,GAAG;AAAA,SAC3B,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,GAAA,EAAK,MAAA;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,EAAE,SAAS,QAAA,EAAS;AAAA,EAC7B;AAAA,EAEA,MAAM,UAAU,QAAA,EAAsD;AACpE,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,MAAMC,QAAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAAA,IACzC,SAAS,CAAA,EAAG;AACV,MAAA,MAAM,MAAM,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,OAAO,CAAC,CAAA;AACrD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,QAAQ,CAAA,EAAA,EAAK,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,IACjE;AACA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAChC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,QAAQ,CAAA;AAAA,EACxC;AACF;;;ACzHO,SAAS,aAAA,CAAc,SAAiB,KAAA,EAAwB;AACrE,EAAA,IAAI,OAAA,KAAY,OAAO,OAAO,IAAA;AAC9B,EAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,GAAG,OAAO,KAAA;AAEnC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA;AAC/B,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAI,SAAS,EAAA,EAAI;AACjB,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AACrC,IAAA,IAAI,KAAA,KAAU,IAAI,OAAO,KAAA;AACzB,IAAA,IAAI,CAAA,KAAM,KAAK,CAAC,OAAA,CAAQ,WAAW,GAAG,CAAA,IAAK,KAAA,KAAU,CAAA,EAAG,OAAO,KAAA;AAC/D,IAAA,GAAA,GAAM,QAAQ,IAAA,CAAK,MAAA;AAAA,EACrB;AACA,EAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACnC,IAAA,IAAI,SAAS,EAAA,IAAM,CAAC,MAAM,QAAA,CAAS,IAAI,GAAG,OAAO,KAAA;AACjD,IAAA,IAAI,IAAA,KAAS,EAAA,IAAM,CAAC,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG,OAAO,KAAA;AAAA,EAC5E;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,YAAA,CACd,WACA,QAAA,EAC6B;AAC7B,EAAA,IAAI,CAAC,UAAU,OAAO,MAAA;AACtB,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG,OAAO,SAAS,SAAS,CAAA;AAElD,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,EAAG;AACvC,IAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AACxB,IAAA,IAAI,CAAC,aAAA,CAAc,GAAA,EAAK,SAAS,CAAA,EAAG;AACpC,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,UAAA,CAAW,GAAA,EAAK,EAAE,CAAA,CAAE,MAAA;AACtC,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,SAAA,GAAY,KAAA;AACZ,MAAA,OAAA,GAAU,GAAA;AAAA,IACZ;AAAA,EACF;AAEA,EAAA,OAAO,OAAA,GAAU,QAAA,CAAS,OAAO,CAAA,GAAI,MAAA;AACvC;;;ACrCA,SAAS,eAAe,CAAA,EAAyB;AAC/C,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,IAAY,MAAA,CAAO,SAAS,CAAC,CAAA;AACnD;AAEA,SAAS,WAAW,CAAA,EAAgC;AAClD,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,MAAA;AAClC,EAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAK;AACjB,EAAA,OAAO,CAAA,KAAM,KAAK,MAAA,GAAY,CAAA;AAChC;AAEA,SAAS,eAAe,CAAA,EAAgC;AACtD,EAAA,IAAI,cAAA,CAAe,CAAC,CAAA,EAAG,OAAO,CAAA;AAC9B,EAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AACzB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACtB,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,QAAA,CAAS,KAAa,KAAA,EAAwB;AACrD,EAAA,OAAO,GAAA,CAAI,SAAS,KAAK,CAAA;AAC3B;AAKA,IAAM,cAAA,GAAiB,wBAAA;AAEvB,SAAS,UAAU,SAAA,EAAgC;AACjD,EAAA,IAAI,QAAA,CAAS,SAAA,EAAW,OAAO,CAAA,EAAG,OAAO,KAAA;AACzC,EAAA,IAAI,QAAA,CAAS,SAAA,EAAW,QAAQ,CAAA,EAAG,OAAO,MAAA;AAC1C,EAAA,IAAI,QAAA,CAAS,SAAA,EAAW,SAAS,CAAA,EAAG,OAAO,OAAA;AAC3C,EAAA,IAAI,QAAA,CAAS,SAAA,EAAW,aAAa,CAAA,EAAG,OAAO,WAAA;AAC/C,EAAA,IAAI,QAAA,CAAS,SAAA,EAAW,UAAU,CAAA,EAAG,OAAO,QAAA;AAC5C,EAAA,IAAI,cAAA,CAAe,IAAA,CAAK,SAAS,CAAA,EAAG;AAClC,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,UAAA,CAAW,WAAmB,IAAA,EAA2B;AAChE,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,IAAK,SAAA;AACxC,EAAA,IAAI,IAAA,KAAS,KAAA,EAAO,OAAO,CAAA,IAAA,EAAO,IAAI,CAAA,CAAA;AACtC,EAAA,IAAI,IAAA,KAAS,MAAA,EAAQ,OAAO,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA;AACxC,EAAA,IAAI,IAAA,KAAS,OAAA,EAAS,OAAO,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA;AAC1C,EAAA,IAAI,IAAA,KAAS,QAAA,EAAU,OAAO,CAAA,OAAA,EAAU,IAAI,CAAA,CAAA;AAC5C,EAAA,IAAI,IAAA,KAAS,KAAA,EAAO,OAAO,CAAA,IAAA,EAAO,IAAI,CAAA,CAAA;AACtC,EAAA,IAAI,IAAA,KAAS,WAAA,EAAa,OAAO,CAAA,UAAA,EAAa,IAAI,CAAA,CAAA;AAClD,EAAA,IAAI,IAAA,KAAS,OAAA,EAAS,OAAO,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA;AAC1C,EAAA,OAAO,SAAA;AACT;AAOO,IAAM,kBAAN,MAAsB;AAAA,EAClB,OAAA;AAAA,EAET,YAAY,OAAA,EAA2B;AACrC,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,MAAA;AAAA,EACzB;AAAA,EAEA,mBACE,MAAA,EACmD;AACnD,IAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AACnB,IAAA,MAAM,MAAM,IAAA,CAAK,OAAA;AAGjB,IAAA,IAAI,KAAA;AACJ,IAAA,KAAA,MAAW,CAAA,IAAK,IAAI,SAAA,EAAW;AAC7B,MAAA,MAAM,CAAA,GAAI,IAAI,CAAC,CAAA;AACf,MAAA,MAAM,CAAA,GAAI,WAAW,CAAC,CAAA;AACtB,MAAA,IAAI,CAAA,EAAG;AACL,QAAA,KAAA,GAAQ,CAAA;AACR,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACT,IAAA,EAAM,gBAAA;AAAA,UACN,OAAA,EAAS,4CAAA;AAAA,UACT,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,MAAM,MAAA,CAAO;AAAA;AACb,OACF;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,QAAQ,CAAC,CAAA;AAC9C,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACT,IAAA,EAAM,eAAA;AAAA,UACN,OAAA,EAAS,CAAA,yBAAA,EAA4B,GAAA,CAAI,QAAQ,CAAA,CAAA,CAAA;AAAA,UACjD,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,MAAM,MAAA,CAAO;AAAA;AACb,OACF;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,SAAA,EAAW,GAAA,CAAI,QAAQ,CAAA;AAGpD,IAAA,MAAM,KAAA,GAAQ,IAAI,YAAA,IAAgB,WAAA;AAClC,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAK,CAAA;AACvB,IAAA,MAAM,QAAA,GAAW,eAAe,KAAK,CAAA;AACrC,IAAA,MAAM,SAAA,GAAY,QAAA,IAAY,IAAA,CAAK,GAAA,EAAI;AACvC,IAAA,MAAM,mBAAmB,QAAA,KAAa,MAAA;AAGtC,IAAA,MAAM,cAAc,GAAA,CAAI,WAAA;AACxB,IAAA,MAAM,WAAW,WAAA,GAAc,UAAA,CAAW,GAAA,CAAI,WAAW,CAAC,CAAA,GAAI,MAAA;AAG9D,IAAA,IAAI,UAAA;AACJ,IAAA,MAAM,cAAc,GAAA,CAAI,WAAA;AACxB,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,CAAA,GAAI,IAAI,WAAW,CAAA;AACzB,MAAA,IAAI,cAAA,CAAe,CAAC,CAAA,EAAG,UAAA,GAAa,CAAA;AAAA,IACtC,CAAA,MAAA,IAAW,cAAA,CAAgB,GAAA,CAAY,UAAU,CAAA,EAAG;AAClD,MAAA,UAAA,GAAc,GAAA,CAAY,UAAA;AAAA,IAC5B;AAGA,IAAA,IAAI,MAAA;AACJ,IAAA,MAAM,YAAY,GAAA,CAAI,SAAA;AACtB,IAAA,MAAM,YAAY,SAAA,GAAY,UAAA,CAAW,GAAA,CAAI,SAAS,CAAC,CAAA,GAAI,MAAA;AAC3D,IAAA,IAAI,SAAA,KAAc,SAAA,IAAa,SAAA,KAAc,IAAA,IAAQ,cAAc,OAAA,EAAS;AAC1E,MAAA,MAAA,GAAS,SAAA;AAAA,IACX,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAA,GAAS,OAAA,CAAQ,MAAA;AAAA,IACnB,CAAA,MAAA,IAAW,OAAA,EAAS,IAAA,KAAS,OAAA,EAAS;AACpC,MAAA,MAAA,GAAS,OAAA;AAAA,IACX,CAAA,MAAA,IAAW,cAAA,CAAe,IAAA,CAAK,SAAS,CAAA,EAAG;AACzC,MAAA,MAAA,GAAS,OAAA;AAAA,IACX,CAAA,MAAA,IAAW,OAAA,EAAS,SAAA,IAAa,OAAA,EAAS,UAAA,EAAY;AACpD,MAAA,MAAA,GAAS,SAAA;AAAA,IACX,CAAA,MAAA,IAAW,OAAA,EAAS,OAAA,IAAW,OAAA,EAAS,QAAA,EAAU;AAChD,MAAA,MAAA,GAAS,IAAA;AAAA,IACX;AAGA,IAAA,MAAM,IAAA,GAAoB,OAAA,EAAS,IAAA,IAAQ,SAAA,CAAU,SAAS,CAAA;AAG9D,IAAA,MAAM,IAAA,GAAO,OAAA,EAAS,IAAA,IAAQ,UAAA,CAAW,WAAW,IAAI,CAAA;AAGxD,IAAA,IAAI,UAAA,GAAyC,YAAA;AAC7C,IAAA,IAAI,QAAA,IAAY,OAAA,EAAS,SAAA,EAAW,UAAA,GAAa,UAAA;AACjD,IAAA,IAAI,kBAAkB,UAAA,GAAa,SAAA;AAGnC,IAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAY;AAAA,MAC3B,GAAG,GAAA,CAAI,SAAA;AAAA,MACP,GAAA,CAAI,QAAA;AAAA,MACJ,KAAA;AAAA,MACA,IAAI,UAAA,IAAc,SAAA;AAAA,MAClB,IAAI,QAAA,IAAY,OAAA;AAAA,MAChB,IAAI,WAAA,IAAe,EAAA;AAAA,MACnB,IAAI,WAAA,IAAe,EAAA;AAAA,MACnB,IAAI,SAAA,IAAa,EAAA;AAAA,MACjB;AAAA,MACA,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,EAAE,CAAC,CAAA;AAEzB,IAAA,MAAM,aAAsC,EAAC;AAC7C,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACxC,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG;AACjB,MAAA,UAAA,CAAW,CAAC,CAAA,GAAI,CAAA;AAAA,IAClB;AAEA,IAAA,MAAM,KAAA,GAAsB;AAAA,MAC1B,OAAA,EAAS,OAAO,EAAE,CAAA;AAAA,MAClB,KAAA;AAAA,MACA,GAAI,QAAA,GAAW,EAAE,QAAA,KAAa,EAAC;AAAA,MAC/B,IAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA;AAAA,MACA,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW,EAAC;AAAA,MAC3B,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,UAAA,KAAe,EAAC;AAAA,MACjD,GAAI,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,SAAS,CAAA,GAAI,EAAE,UAAA,EAAW,GAAI,EAAC;AAAA,MAC3D,UAAA;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,MAAM,MAAA,CAAO,UAAA;AAAA,QACb,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,MAAM,MAAA,CAAO;AAAA;AACf,KACF;AAEA,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,OAAO;AAAA,QACL,KAAA;AAAA,QACA,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,mBAAA;AAAA,UACN,OAAA,EAAS,sCAAsC,KAAK,CAAA,CAAA,CAAA;AAAA,UACpD,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,KAAK,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA,CAAE,KAAA,CAAM,GAAG,GAAG;AAAA;AACvC,OACF;AAAA,IACF;AAEA,IAAA,OAAO,EAAE,KAAA,EAAM;AAAA,EACjB;AAAA,EAEA,UAAU,MAAA,EAAoD;AAC5D,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,kBAAA,CAAmB,MAAM,CAAA;AACxC,IAAA,OAAO,CAAA,CAAE,SAAU,CAAA,CAAE,OAAA;AAAA,EACvB;AAAA,EAEA,aAAa,OAAA,EAAoD;AAC/D,IAAA,MAAM,MAAsB,EAAC;AAC7B,IAAA,MAAM,WAA4B,EAAC;AACnC,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,kBAAA,CAAmB,CAAC,CAAA;AAC5C,MAAA,IAAI,UAAA,CAAW,KAAA,EAAO,GAAA,CAAI,IAAA,CAAK,WAAW,KAAK,CAAA;AAC/C,MAAA,IAAI,UAAA,CAAW,OAAA,EAAS,QAAA,CAAS,IAAA,CAAK,WAAW,OAAO,CAAA;AAAA,IAC1D;AACA,IAAA,OAAO,EAAE,OAAA,EAAS,GAAA,EAAK,QAAA,EAAS;AAAA,EAClC;AACF;;;AC9NA,SAAS,QAAA,CAAS,GAAW,GAAA,EAAqB;AAChD,EAAA,IAAI,CAAA,CAAE,MAAA,IAAU,GAAA,EAAK,OAAO,CAAA;AAC5B,EAAA,OAAO,CAAA,CAAE,MAAM,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,GAAA,GAAM,CAAC,CAAC,CAAA,GAAI,QAAA;AAC5C;AAEA,SAAS,YAAA,CAAa,OAAgB,MAAA,EAAoC;AACxE,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,MAAA;AAClD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,QAAA,CAAS,OAAO,MAAM,CAAA;AAC5D,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,SAAA,IAAa,OAAO,UAAU,QAAA,EAAU;AACxF,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI;AACF,MAAA,OAAO,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,KAAK,GAAG,MAAM,CAAA;AAAA,IAC/C,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,UAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAEA,SAAS,YAAA,CAAa,OAA4C,MAAA,EAAwB;AACxF,EAAA,IAAI,CAAC,OAAO,OAAO,EAAA;AACnB,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AACpC,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAEjC,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,EAAW,CAAA,KAAe;AACrC,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,CAAA,EAAG,MAAM,CAAA;AAChC,IAAA,IAAI,CAAA,KAAM,MAAA,EAAW,KAAA,CAAM,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,EACrC,CAAA;AAGA,EAAA,GAAA,CAAI,OAAO,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,GAAA,IAAO,MAAM,OAAO,CAAA;AACpD,EAAA,GAAA,CAAI,QAAQ,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,MAAA,IAAU,MAAM,IAAI,CAAA;AACxD,EAAA,GAAA,CAAI,QAAQ,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,MAAA,IAAU,MAAM,IAAI,CAAA;AACxD,EAAA,GAAA,CAAI,MAAA,EAAQ,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,IAAI,CAAA;AAC5C,EAAA,GAAA,CAAI,OAAA,EAAS,MAAM,KAAK,CAAA;AACxB,EAAA,GAAA,CAAI,OAAA,EAAS,MAAM,KAAK,CAAA;AAGxB,EAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,EAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,WAAW,IAAA,EAAM;AAC3D,IAAA,MAAM,QAAS,MAAA,CAAe,KAAA;AAC9B,IAAA,MAAM,SAAU,MAAA,CAAe,MAAA;AAC/B,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,WAAW,QAAA,EAAU;AAC3D,MAAA,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA,EAAG,KAAA,IAAS,GAAG,CAAA,CAAA,EAAI,MAAA,IAAU,GAAG,CAAA,CAAE,CAAA;AAAA,IACxD;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,CAAA,IAAK,CAAC,cAAA,EAAgB,SAAS,CAAA,EAAY;AACpD,IAAA,IAAI,KAAK,KAAA,EAAO,GAAA,CAAI,CAAA,EAAI,KAAA,CAAc,CAAC,CAAC,CAAA;AAAA,EAC1C;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,GAAG,KAAA,CAAM,OAAA,EAAS,CAAA,CACjC,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,MAAM,EAAE,CAAA,CAC1B,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA;AAE9B,EAAA,OAAO,SAAS,MAAA,GAAS,CAAA,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,GAAI,EAAA;AAC1D;AAEA,SAAS,WAAW,IAAA,EAA2B;AAC7C,EAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,OAAA,EAAS,OAAO,SAAA;AAC1C,EAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,IAAA,EAAM,OAAO,SAAA;AACvC,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,YAAY,EAAA,EAAoB;AACvC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,IAAK,EAAA,GAAK,GAAG,OAAO,EAAA;AAC3C,EAAA,IAAI,KAAK,GAAA,EAAM,OAAO,GAAG,IAAA,CAAK,KAAA,CAAM,EAAE,CAAC,CAAA,EAAA,CAAA;AACvC,EAAA,OAAO,CAAA,EAAA,CAAI,EAAA,GAAK,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAClC;AAEA,SAAS,eAAA,CAAgB,IAAA,EAAmB,MAAA,EAAgB,MAAA,EAAiB,OAAA,EAAgD;AAC3H,EAAA,MAAM,MAAA,GAAS,MAAA,IAAU,MAAA,GAAS,eAAA,GAAQ,eAAA,CAAA;AAC1C,EAAA,MAAM,UAAA,GAAa,MAAA,IAAU,MAAA,GAAS,KAAA,GAAQ,UAAA,CAAA;AAC9C,EAAA,MAAM,QAAQ,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,UAAA,EAAY,QAAQ,kBAAkB,CAAA;AAC5E,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,UAAA,KAAe,MAAA,GAAY,CAAA,CAAA,EAAI,WAAA,CAAY,IAAA,CAAK,KAAA,CAAM,UAAU,CAAC,CAAA,CAAA,GAAK,EAAA;AAC7F,EAAA,MAAM,IAAA,GAAO,CAAA,EAAG,MAAM,CAAA,EAAG,KAAK,KAAA,CAAM,IAAI,CAAA,EAAG,KAAK,CAAA,EAAG,UAAA,CAAW,IAAI,CAAC,GAAG,GAAG,CAAA,CAAA;AAEzE,EAAA,MAAM,KAAA,GAAQ,CAAC,IAAI,CAAA;AAEnB,EAAA,MAAM,QAAA,GACJ,QAAQ,cAAA,KAAmB,QAAA,IAC1B,QAAQ,cAAA,KAAmB,cAAA,IAAkB,IAAA,CAAK,KAAA,CAAM,UAAA,KAAe,UAAA;AAC1E,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,KAAA,CAAM,KAAK,CAAA,EAAG,UAAU,eAAe,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAE,CAAA;AAAA,EAChE;AAEA,EAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,eAAA,CAAgB,QAAA,CAAS,CAAC,CAAA,EAAI,UAAA,EAAY,CAAA,KAAM,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,EAC7F;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,aAAA,CAAc,MAAsB,OAAA,EAAqC;AACvF,EAAA,MAAM,IAAA,GAAoC;AAAA,IACxC,OAAA,EAAS,SAAS,OAAA,IAAW,KAAA;AAAA,IAC7B,cAAA,EAAgB,SAAS,cAAA,IAAkB,QAAA;AAAA,IAC3C,YAAA,EAAc,SAAS,YAAA,IAAgB,KAAA;AAAA,IACvC,KAAA,EAAO,SAAS,KAAA,IAAS,KAAA;AAAA,IACzB,kBAAA,EAAoB,SAAS,kBAAA,IAAsB,EAAA;AAAA,IACnD,OAAA,EAAS,SAAS,OAAA,IAAW;AAAA,GAC/B;AAEA,EAAA,MAAM,MAAA,GAAS,CAAA,IAAA,EAAO,IAAA,CAAK,KAAK,CAAA,CAAA;AAChC,EAAA,MAAM,KAAA,GAAkB,CAAC,MAAM,CAAA;AAE/B,EAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,KAAA,CAAM,IAAA,CAAK,GAAG,eAAA,CAAgB,QAAA,CAAS,CAAC,CAAA,EAAI,EAAA,EAAI,CAAA,KAAM,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,EAClF;AAEA,EAAA,IAAI,KAAK,OAAA,EAAS;AAChB,IAAA,MAAM,EAAA,GAAK,KAAK,QAAA,CAAS,mBAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,IAAA,IAAQ,CAAA;AAC1C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,GAAA,IAAO,CAAA;AACxC,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AACrB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,CAAE,CAAA;AACnD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY,KAAK,CAAA,CAAE,CAAA;AAC9B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,IAAI,CAAA,CAAE,CAAA;AAC5B,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,cAAA,EAAiB,EAAA,CAAG,QAAQ,CAAA,WAAA,EAAc,EAAA,CAAG,UAAU,CAAA,aAAA,EAAgB,EAAA,CAAG,SAAS,CAAA,YAAA,EAAe,EAAA,CAAG,OAAO,CAAA,QAAA;AAAA,KAC9G;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,IAAA,KAAA,CAAM,KAAK,kEAAkE,CAAA;AAAA,EAC/E;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEO,SAAS,cAAA,CAAe,OAAyB,OAAA,EAAqC;AAC3F,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,aAAA,CAAc,GAAG,OAAO,CAAC,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AAChE;;;ACvIA,SAAS,gBAAA,CACP,KACA,OAAA,EAC2B;AAC3B,EAAA,MAAM,aACJ,OAAO,OAAA,CAAQ,IAAA,KAAS,QAAA,IAAY,OAAO,QAAA,CAAS,OAAA,CAAQ,IAAI,CAAA,IAAK,QAAQ,IAAA,GAAO,CAAA,GAChF,KAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GACvB,MAAA;AACN,EAAA,MAAM,IAAA,GAAO,OAAO,OAAA,CAAQ,IAAA,KAAS,QAAA,IAAY,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAK,KAAM,EAAA,GAAK,OAAA,CAAQ,IAAA,GAAO,MAAA;AAE7F,EAAA,IAAI,UAAA,KAAe,MAAA,IAAa,IAAA,KAAS,MAAA,EAAW,OAAO,GAAA;AAE3D,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,MAAmC;AAAA,IACpD,GAAG,CAAA;AAAA,IACH,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,IAAA,EAAM,UAAA,KAAe,EAAC;AAAA,IACvD,GAAI,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,KAAS;AAAC,GACvC,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,MAAqC;AAAA,IACvD,GAAG,CAAA;AAAA,IACH,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,IAAA,EAAM,UAAA,KAAe,EAAC;AAAA,IACvD,GAAI,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,KAAS;AAAC,GACvC,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA;AAAA,IAClC,QAAA,EAAU,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,UAAU;AAAA,GACvC;AACF;AAEA,SAAS,eAAA,CAAgB,MAAc,MAAA,EAAsD;AAC3F,EAAA,IAAI,MAAA,IAAU,MAAA,KAAW,MAAA,EAAQ,OAAO,MAAA;AACxC,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,MAAA;AACpC,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,YAAA,CACd,IAAA,EACA,OAAA,GAA+B,EAAC,EACL;AAC3B,EAAA,MAAM,GAAA,GAAM,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,EAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,EAAA,IAAI,OAAA,KAAY,IAAI,OAAO,EAAE,SAAS,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAEvD,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,GAAA,EAAK,OAAA,CAAQ,MAAM,CAAA;AAClD,EAAA,MAAM,IAAA,GACJ,WAAW,MAAA,GACP,IAAI,eAAc,CAAE,UAAA,CAAW,CAAC,GAAG,CAAA,EAAG,QAAQ,IAAI,CAAA,GAClD,IAAI,YAAA,EAAa,CAAE,WAAW,CAAC,GAAG,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAA;AAIvD,EAAA,OAAO,gBAAA,CAAiB,MAAM,OAAO,CAAA;AACvC;;;AC7CO,IAAM,qBAAN,MAAyB;AAAA,EACrB,OAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EAEA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EAET,UAA0B,EAAC;AAAA,EAC3B,YAA6B,EAAC;AAAA,EAC9B,SAA2B,EAAC;AAAA,EAE5B,YAAY,OAAA,EAAoC;AAE9C,IAAA,IAAA,CAAK,OAAA,GAAU,oBAAA,CAAqB,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACtD,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,MAAA,IAAU,MAAA;AACjC,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,IAAA;AAErB,IAAA,IAAA,CAAK,cAAc,IAAI,eAAA,CAAgB,EAAE,MAAA,EAAQ,IAAA,CAAK,SAAS,CAAA;AAC/D,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,QAAA,CAAS,EAAE,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAC5D,IAAA,IAAA,CAAK,eAAe,IAAI,WAAA,CAAY,EAAE,MAAA,EAAQ,IAAA,CAAK,SAAS,CAAA;AAAA,EAC9D;AAAA,EAEA,QAAA,CAAS,MAAc,UAAA,EAAoC;AACzD,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,aAAa,IAAA,EAAM;AAAA,QAChC,QAAQ,IAAA,CAAK,OAAA;AAAA,QACb,MAAM,IAAA,CAAK,KAAA;AAAA,QACX,IAAA,EAAM;AAAA,OACP,CAAA;AAED,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,YAAA,CAAa,OAAO,OAAO,CAAA;AAG/D,MAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACpD,GAAG,CAAA;AAAA,QACH,UAAA,EAAY,EAAE,UAAA,GAAa,IAAA,CAAK,UAAU,YAAA,CAAa,CAAA,CAAE,UAAU,CAAA,GAAI,KAAA;AAAA,OACzE,CAAE,CAAA;AAEF,MAAA,IAAA,CAAK,UAAU,CAAC,GAAG,IAAA,CAAK,OAAA,EAAS,GAAG,cAAc,CAAA;AAClD,MAAA,IAAA,CAAK,SAAA,GAAY,CAAC,GAAG,IAAA,CAAK,SAAA,EAAW,GAAG,MAAA,CAAO,QAAA,EAAU,GAAG,UAAA,CAAW,QAAQ,CAAA;AAC/E,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,KAAK,OAAO,CAAA;AAElD,MAAA,OAAO;AAAA,QACL,QAAQ,IAAA,CAAK,OAAA;AAAA,QACb,OAAO,IAAA,CAAK,MAAA;AAAA,QACZ,UAAU,IAAA,CAAK;AAAA,OACjB;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,MAAM,MAAM,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,OAAO,CAAC,CAAA;AACrD,MAAA,MAAM,OAAA,GAAyB;AAAA,QAC7B,IAAA,EAAM,SAAA;AAAA,QACN,OAAA,EAAS,8CAA8C,GAAG,CAAA,CAAA,CAAA;AAAA,QAC1D,MAAM,IAAA,CAAK,KAAA;AAAA,QACX,IAAA,EAAM,UAAA;AAAA,QACN,GAAA,EAAK,OAAO,IAAA,KAAS,QAAA,GAAW,KAAK,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAAI;AAAA,OACvD;AACA,MAAA,IAAA,CAAK,SAAA,GAAY,CAAC,GAAG,IAAA,CAAK,WAAW,OAAO,CAAA;AAC5C,MAAA,OAAO,EAAE,QAAQ,IAAA,CAAK,OAAA,EAAS,OAAO,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,IAAA,CAAK,SAAA,EAAU;AAAA,IAC9E;AAAA,EACF;AAAA,EAEA,SAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,QAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,WAAA,GAA+B;AAC7B,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,UAAU,EAAC;AAChB,IAAA,IAAA,CAAK,SAAS,EAAC;AACf,IAAA,IAAA,CAAK,YAAY,EAAC;AAAA,EACpB;AACF;;;AChEA,SAAS,kBAAkB,IAAA,EAAkC;AAC3D,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG;AACtC,IAAA,MAAM,CAAA,GAAI,KAAK,IAAA,EAAK;AACpB,IAAA,IAAI,CAAA,KAAM,IAAI,OAAO,CAAA;AAAA,EACvB;AACA,EAAA,OAAO,MAAA;AACT;AAEA,eAAe,aACb,QAAA,EAC4B;AAC5B,EAAA,MAAM,IAAA,GAAO,MAAMA,QAAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ,kBAAkB,IAAI,CAAA;AACpC,EAAA,IAAI,CAAC,OAAO,OAAO,QAAA;AACnB,EAAA,IAAI,CAAC,KAAA,CAAM,UAAA,CAAW,GAAG,GAAG,OAAO,QAAA;AACnC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC/B,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG,OAAO,MAAA;AAAA,EAC7E,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,cAAA,CACP,KACA,OAAA,EACiB;AACjB,EAAA,MAAM,WAAqC,EAAC;AAC5C,EAAA,KAAA,MAAW,CAAA,IAAK;AAAA,IACd,WAAA;AAAA,IACA,UAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF,EAAY;AACV,IAAA,MAAM,CAAA,GAAK,QAAgB,CAAC,CAAA;AAC5B,IAAA,IAAI,CAAA,KAAM,MAAA,EAAY,QAAA,CAAiB,CAAC,CAAA,GAAI,CAAA;AAAA,EAC9C;AACA,EAAA,OAAO,oBAAA,CAAqB,KAAK,QAAQ,CAAA;AAC3C;AAMA,eAAsB,gBAAA,CACpB,QAAA,EACA,OAAA,GAA4B,EAAC,EACH;AAC1B,EAAA,MAAM,OACJ,OAAA,CAAQ,MAAA,IACP,MAAM,mBAAA,CAAoB,QAAQ,UAAU,CAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,IAAA,EAAM,OAAO,CAAA;AAE3C,EAAA,MAAM,MAAA,GACJ,OAAA,CAAQ,MAAA,KAAW,MAAA,IAAU,OAAA,CAAQ,MAAA,KAAW,MAAA,GAC5C,MAAM,YAAA,CAAa,QAAQ,CAAA,GAC3B,OAAA,CAAQ,MAAA;AAEd,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAA,MAAA,GAAS,MAAM,IAAI,aAAA,EAAc,CAAE,UAAU,QAAQ,CAAA;AAAA,EACvD,CAAA,MAAO;AACL,IAAA,MAAA,GAAS,MAAM,IAAI,YAAA,EAAa,CAAE,UAAU,QAAQ,CAAA;AAAA,EACtD;AAEA,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,CAAgB,EAAE,QAAQ,CAAA;AACjD,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,YAAA,CAAa,MAAA,CAAO,OAAO,CAAA;AAGzD,EAAA,MAAM,WAAW,IAAI,QAAA,CAAS,EAAE,KAAA,EAAO,MAAA,CAAO,QAAQ,CAAA;AACtD,EAAA,MAAM,MAAA,GAAyB,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC5D,GAAG,CAAA;AAAA,IACH,YAAY,CAAA,CAAE,UAAA,GAAa,SAAS,YAAA,CAAa,CAAA,CAAE,UAAU,CAAA,GAAI;AAAA,GACnE,CAAE,CAAA;AAEF,EAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,CAAY,EAAE,QAAQ,CAAA,CAAE,MAAM,MAAM,CAAA;AAEtD,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAU,CAAC,GAAG,OAAO,QAAA,EAAU,GAAG,WAAW,QAAQ;AAAA,GACvD;AACF","file":"logs.mjs","sourcesContent":["import { readFile } from \"node:fs/promises\";\n\nimport type { LogEventMapping, LogIngestConfig, RedactionRule } from \"../types/log-config.js\";\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n  return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction isNonEmptyStringArray(v: unknown): v is string[] {\n  return (\n    Array.isArray(v) &&\n    v.length > 0 &&\n    v.every((x) => typeof x === \"string\" && x.trim() !== \"\")\n  );\n}\n\nfunction validateRedact(redact: unknown): asserts redact is RedactionRule[] {\n  if (!Array.isArray(redact)) {\n    throw new Error(\"Invalid config: redact must be an array\");\n  }\n  for (const r of redact) {\n    if (typeof r === \"string\") continue;\n    if (!isRecord(r)) {\n      throw new Error(\"Invalid config: redact entries must be strings or objects\");\n    }\n    if (typeof r.key !== \"string\" || r.key.trim() === \"\") {\n      throw new Error(\"Invalid config: redact.key must be a non-empty string\");\n    }\n    if (r.strategy !== \"full\" && r.strategy !== \"prefix\" && r.strategy !== \"hash\") {\n      throw new Error(\n        `Invalid config: redact.strategy must be one of full, prefix, hash (got ${String(\n          r.strategy,\n        )})`,\n      );\n    }\n    if (r.keep !== undefined && (typeof r.keep !== \"number\" || !Number.isFinite(r.keep) || r.keep < 0)) {\n      throw new Error(\"Invalid config: redact.keep must be a non-negative number when provided\");\n    }\n  }\n}\n\nfunction validateMappings(mappings: unknown): asserts mappings is Record<string, LogEventMapping> {\n  if (!isRecord(mappings)) {\n    throw new Error(\"Invalid config: mappings must be an object\");\n  }\n}\n\nexport const DEFAULT_LOG_INGEST_CONFIG: LogIngestConfig = {\n  runIdKeys: [\"runId\", \"traceId\", \"requestId\", \"decisionId\", \"jobId\"],\n  eventKey: \"event\",\n  timestampKey: \"timestamp\",\n  messageKey: \"message\",\n  levelKey: \"level\",\n  heuristicWindowMs: 2000,\n  mappings: {\n    \"*.error\": { kind: \"ERROR\", status: \"error\" },\n    \"*.failed\": { kind: \"ERROR\", status: \"error\" },\n    \"*.llm.*\": { kind: \"LLM\" },\n    \"*.tool.*\": { kind: \"TOOL\" },\n    \"*.agent.*\": { kind: \"AGENT\" },\n    \"*.retriever.*\": { kind: \"RETRIEVER\" },\n    \"*.result.*\": { kind: \"RESULT\" },\n  },\n};\n\nexport function mergeLogIngestConfig(\n  base: LogIngestConfig,\n  override: Partial<LogIngestConfig>,\n): LogIngestConfig {\n  const merged: LogIngestConfig = {\n    ...base,\n    ...override,\n    mappings: {\n      ...(base.mappings ?? {}),\n      ...(override.mappings ?? {}),\n    },\n  };\n  return merged;\n}\n\nexport async function loadLogIngestConfig(configPath?: string): Promise<LogIngestConfig> {\n  if (configPath === undefined || configPath.trim() === \"\") {\n    return DEFAULT_LOG_INGEST_CONFIG;\n  }\n\n  let rawText: string;\n  try {\n    rawText = await readFile(configPath, \"utf-8\");\n  } catch (e) {\n    const msg = e instanceof Error ? e.message : String(e);\n    throw new Error(`Failed to read config file: ${configPath} (${msg})`);\n  }\n\n  let parsed: unknown;\n  try {\n    parsed = JSON.parse(rawText) as unknown;\n  } catch (e) {\n    const msg = e instanceof Error ? e.message : String(e);\n    throw new Error(`Invalid JSON in config file: ${configPath} (${msg})`);\n  }\n\n  if (!isRecord(parsed)) {\n    throw new Error(\"Invalid config: expected a JSON object at top-level\");\n  }\n\n  const user = parsed as Partial<LogIngestConfig>;\n\n  if (user.runIdKeys !== undefined && !isNonEmptyStringArray(user.runIdKeys)) {\n    throw new Error(\"Invalid config: runIdKeys must be a non-empty array of strings\");\n  }\n  if (user.eventKey !== undefined && (typeof user.eventKey !== \"string\" || user.eventKey.trim() === \"\")) {\n    throw new Error(\"Invalid config: eventKey must be a non-empty string\");\n  }\n\n  for (const k of [\n    \"timestampKey\",\n    \"messageKey\",\n    \"levelKey\",\n    \"parentIdKey\",\n    \"durationKey\",\n    \"statusKey\",\n  ] as const) {\n    const v = (user as any)[k];\n    if (v !== undefined && (typeof v !== \"string\" || v.trim() === \"\")) {\n      throw new Error(`Invalid config: ${k} must be a non-empty string when provided`);\n    }\n  }\n\n  if (user.mappings !== undefined) {\n    validateMappings(user.mappings);\n  }\n  if (user.redact !== undefined) {\n    validateRedact(user.redact);\n  }\n  if (\n    user.heuristicWindowMs !== undefined &&\n    (typeof user.heuristicWindowMs !== \"number\" ||\n      !Number.isFinite(user.heuristicWindowMs) ||\n      user.heuristicWindowMs < 0)\n  ) {\n    throw new Error(\"Invalid config: heuristicWindowMs must be a non-negative number when provided\");\n  }\n\n  // Explicitly reject obviously unsafe config patterns.\n  if ((user as any).redact && JSON.stringify((user as any).redact).includes(\"=>\")) {\n    throw new Error(\"Invalid config: function strings are not supported in redact rules\");\n  }\n\n  return mergeLogIngestConfig(DEFAULT_LOG_INGEST_CONFIG, user);\n}\n\n","import { readFile } from \"node:fs/promises\";\n\nimport type { RawLogRecord } from \"./raw-record.js\";\nimport type { ParseResult, ParserWarning } from \"./warnings.js\";\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n  return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nexport class JsonLogParser {\n  parseLines(lines: string[], filePath?: string): ParseResult<RawLogRecord> {\n    const records: RawLogRecord[] = [];\n    const warnings: ParserWarning[] = [];\n\n    for (let i = 0; i < lines.length; i++) {\n      const lineNumber = i + 1;\n      const raw = lines[i] ?? \"\";\n      const trimmed = raw.trim();\n      if (trimmed === \"\") continue;\n      let parsed: unknown;\n      try {\n        parsed = JSON.parse(trimmed) as unknown;\n      } catch {\n        warnings.push({\n          code: \"MALFORMED_JSON\",\n          message: \"Malformed JSON log line\",\n          file: filePath,\n          line: lineNumber,\n          raw: trimmed.slice(0, 500),\n        });\n        continue;\n      }\n      if (!isRecord(parsed)) {\n        warnings.push({\n          code: \"MALFORMED_JSON\",\n          message: \"JSON log line must be an object\",\n          file: filePath,\n          line: lineNumber,\n          raw: trimmed.slice(0, 500),\n        });\n        continue;\n      }\n      records.push({\n        raw: parsed,\n        file: filePath,\n        line: lineNumber,\n        sourceType: \"json-log\",\n      });\n    }\n\n    return { records, warnings };\n  }\n\n  async parseFile(filePath: string): Promise<ParseResult<RawLogRecord>> {\n    let text: string;\n    try {\n      text = await readFile(filePath, \"utf-8\");\n    } catch (e) {\n      const msg = e instanceof Error ? e.message : String(e);\n      throw new Error(`Failed to read log file: ${filePath} (${msg})`);\n    }\n    const lines = text.split(/\\r?\\n/);\n    return this.parseLines(lines, filePath);\n  }\n}\n\n","import { readFile } from \"node:fs/promises\";\n\nimport type { RawLogRecord } from \"./raw-record.js\";\nimport type { ParseResult, ParserWarning } from \"./warnings.js\";\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n  return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction findLastJsonObjectSubstring(line: string): string | undefined {\n  // Scan for balanced {...} regions and keep the last one.\n  // This is deliberately conservative: it does not attempt to parse JS object literal syntax.\n  let last: { start: number; end: number } | undefined;\n  for (let i = 0; i < line.length; i++) {\n    if (line[i] !== \"{\") continue;\n    let depth = 0;\n    let inString = false;\n    let escape = false;\n    for (let j = i; j < line.length; j++) {\n      const ch = line[j]!;\n      if (inString) {\n        if (escape) {\n          escape = false;\n          continue;\n        }\n        if (ch === \"\\\\\") {\n          escape = true;\n          continue;\n        }\n        if (ch === '\"') {\n          inString = false;\n        }\n        continue;\n      }\n\n      if (ch === '\"') {\n        inString = true;\n        continue;\n      }\n      if (ch === \"{\") depth += 1;\n      if (ch === \"}\") depth -= 1;\n      if (depth === 0) {\n        last = { start: i, end: j + 1 };\n        i = j;\n        break;\n      }\n      if (depth < 0) break;\n    }\n  }\n  if (!last) return undefined;\n  return line.slice(last.start, last.end);\n}\n\nexport class Log4jsParser {\n  parseLines(lines: string[], filePath?: string): ParseResult<RawLogRecord> {\n    const records: RawLogRecord[] = [];\n    const warnings: ParserWarning[] = [];\n\n    for (let i = 0; i < lines.length; i++) {\n      const lineNumber = i + 1;\n      const rawLine = lines[i] ?? \"\";\n      const trimmed = rawLine.trim();\n      if (trimmed === \"\") continue;\n\n      const jsonText = findLastJsonObjectSubstring(trimmed);\n      if (!jsonText) {\n        warnings.push({\n          code: \"UNSUPPORTED_LOG4JS_PAYLOAD\",\n          message: \"No embedded JSON object found in log4js line\",\n          file: filePath,\n          line: lineNumber,\n          raw: trimmed.slice(0, 500),\n        });\n        continue;\n      }\n\n      let parsed: unknown;\n      try {\n        parsed = JSON.parse(jsonText) as unknown;\n      } catch {\n        warnings.push({\n          code: \"MALFORMED_JSON\",\n          message: \"Malformed embedded JSON object in log4js line\",\n          file: filePath,\n          line: lineNumber,\n          raw: jsonText.slice(0, 500),\n        });\n        continue;\n      }\n\n      if (!isRecord(parsed)) {\n        warnings.push({\n          code: \"UNSUPPORTED_LOG4JS_PAYLOAD\",\n          message: \"Embedded JSON payload must be an object\",\n          file: filePath,\n          line: lineNumber,\n          raw: jsonText.slice(0, 500),\n        });\n        continue;\n      }\n\n      records.push({\n        raw: parsed,\n        file: filePath,\n        line: lineNumber,\n        sourceType: \"log4js\",\n      });\n    }\n\n    return { records, warnings };\n  }\n\n  async parseFile(filePath: string): Promise<ParseResult<RawLogRecord>> {\n    let text: string;\n    try {\n      text = await readFile(filePath, \"utf-8\");\n    } catch (e) {\n      const msg = e instanceof Error ? e.message : String(e);\n      throw new Error(`Failed to read log file: ${filePath} (${msg})`);\n    }\n    const lines = text.split(/\\r?\\n/);\n    return this.parseLines(lines, filePath);\n  }\n}\n\n","import type { LogEventMapping } from \"../types/log-config.js\";\n\nexport function wildcardMatch(pattern: string, value: string): boolean {\n  if (pattern === value) return true;\n  if (!pattern.includes(\"*\")) return false;\n\n  const parts = pattern.split(\"*\");\n  let idx = 0;\n  for (let i = 0; i < parts.length; i++) {\n    const part = parts[i]!;\n    if (part === \"\") continue;\n    const found = value.indexOf(part, idx);\n    if (found === -1) return false;\n    if (i === 0 && !pattern.startsWith(\"*\") && found !== 0) return false;\n    idx = found + part.length;\n  }\n  if (!pattern.endsWith(\"*\")) {\n    const last = parts[parts.length - 1]!;\n    if (last !== \"\" && !value.endsWith(last)) return false;\n    if (last === \"\" && !value.endsWith(parts[parts.length - 2] ?? \"\")) return false;\n  }\n  return true;\n}\n\nexport function matchMapping(\n  eventName: string,\n  mappings?: Record<string, LogEventMapping>,\n): LogEventMapping | undefined {\n  if (!mappings) return undefined;\n  if (mappings[eventName]) return mappings[eventName];\n\n  let bestKey: string | undefined;\n  let bestScore = -1;\n\n  for (const key of Object.keys(mappings)) {\n    if (!key.includes(\"*\")) continue;\n    if (!wildcardMatch(key, eventName)) continue;\n    const score = key.replaceAll(\"*\", \"\").length;\n    if (score > bestScore) {\n      bestScore = score;\n      bestKey = key;\n    }\n  }\n\n  return bestKey ? mappings[bestKey] : undefined;\n}\n\n","import { nanoid } from \"nanoid\";\n\nimport type { InspectEvent, InspectKind } from \"../types/inspect-event.js\";\nimport type { LogIngestConfig } from \"../types/log-config.js\";\nimport type { RawLogRecord } from \"./raw-record.js\";\nimport type { ParseResult, ParserWarning } from \"./warnings.js\";\nimport { matchMapping } from \"./mapping.js\";\n\nfunction isFiniteNumber(v: unknown): v is number {\n  return typeof v === \"number\" && Number.isFinite(v);\n}\n\nfunction safeString(v: unknown): string | undefined {\n  if (typeof v !== \"string\") return undefined;\n  const t = v.trim();\n  return t === \"\" ? undefined : t;\n}\n\nfunction parseTimestamp(v: unknown): number | undefined {\n  if (isFiniteNumber(v)) return v;\n  if (typeof v === \"string\") {\n    const t = Date.parse(v);\n    if (Number.isFinite(t)) return t;\n  }\n  return undefined;\n}\n\nfunction hasToken(hay: string, token: string): boolean {\n  return hay.includes(token);\n}\n\n// \"error\"/\"failed\" must be a complete dot-delimited token (\"x.error\",\n// \"x.failed.y\"); substrings like \"error_budget\" or \"error_retry\" are not\n// error signals.\nconst ERROR_TOKEN_RE = /\\.(error|failed)(\\.|$)/;\n\nfunction inferKind(eventName: string): InspectKind {\n  if (hasToken(eventName, \".llm.\")) return \"LLM\";\n  if (hasToken(eventName, \".tool.\")) return \"TOOL\";\n  if (hasToken(eventName, \".agent.\")) return \"AGENT\";\n  if (hasToken(eventName, \".retriever.\")) return \"RETRIEVER\";\n  if (hasToken(eventName, \".result.\")) return \"RESULT\";\n  if (ERROR_TOKEN_RE.test(eventName)) {\n    return \"ERROR\";\n  }\n  return \"LOG\";\n}\n\nfunction deriveName(eventName: string, kind: InspectKind): string {\n  const parts = eventName.split(\".\");\n  const last = parts[parts.length - 1] ?? eventName;\n  if (kind === \"LLM\") return `llm:${last}`;\n  if (kind === \"TOOL\") return `tool:${last}`;\n  if (kind === \"AGENT\") return `agent:${last}`;\n  if (kind === \"RESULT\") return `result:${last}`;\n  if (kind === \"RUN\") return `run:${last}`;\n  if (kind === \"RETRIEVER\") return `retriever:${last}`;\n  if (kind === \"ERROR\") return `error:${last}`;\n  return eventName;\n}\n\nexport interface NormalizeOptions {\n  config: LogIngestConfig;\n  sourceFile?: string;\n}\n\nexport class EventNormalizer {\n  readonly #config: LogIngestConfig;\n\n  constructor(options: NormalizeOptions) {\n    this.#config = options.config;\n  }\n\n  #normalizeInternal(\n    record: RawLogRecord,\n  ): { event?: InspectEvent; warning?: ParserWarning } {\n    const raw = record.raw;\n    const cfg = this.#config;\n\n    // runId\n    let runId: string | undefined;\n    for (const k of cfg.runIdKeys) {\n      const v = raw[k];\n      const s = safeString(v);\n      if (s) {\n        runId = s;\n        break;\n      }\n    }\n    if (!runId) {\n      return {\n        warning: {\n        code: \"MISSING_RUN_ID\",\n        message: \"Missing run id (none of runIdKeys present)\",\n        file: record.file,\n        line: record.line,\n        },\n      };\n    }\n\n    // event name\n    const eventName = safeString(raw[cfg.eventKey]);\n    if (!eventName) {\n      return {\n        warning: {\n        code: \"MISSING_EVENT\",\n        message: `Missing event name (key: ${cfg.eventKey})`,\n        file: record.file,\n        line: record.line,\n        },\n      };\n    }\n\n    const mapping = matchMapping(eventName, cfg.mappings);\n\n    // timestamp\n    const tsKey = cfg.timestampKey ?? \"timestamp\";\n    const tsRaw = raw[tsKey];\n    const parsedTs = parseTimestamp(tsRaw);\n    const timestamp = parsedTs ?? Date.now();\n    const timestampMissing = parsedTs === undefined;\n\n    // parentId\n    const parentIdKey = cfg.parentIdKey;\n    const parentId = parentIdKey ? safeString(raw[parentIdKey]) : undefined;\n\n    // duration\n    let durationMs: number | undefined;\n    const durationKey = cfg.durationKey;\n    if (durationKey) {\n      const v = raw[durationKey];\n      if (isFiniteNumber(v)) durationMs = v;\n    } else if (isFiniteNumber((raw as any).durationMs)) {\n      durationMs = (raw as any).durationMs as number;\n    }\n\n    // status\n    let status: InspectEvent[\"status\"] | undefined;\n    const statusKey = cfg.statusKey;\n    const statusRaw = statusKey ? safeString(raw[statusKey]) : undefined;\n    if (statusRaw === \"running\" || statusRaw === \"ok\" || statusRaw === \"error\") {\n      status = statusRaw;\n    } else if (mapping?.status) {\n      status = mapping.status;\n    } else if (mapping?.kind === \"ERROR\") {\n      status = \"error\";\n    } else if (ERROR_TOKEN_RE.test(eventName)) {\n      status = \"error\";\n    } else if (mapping?.startsRun || mapping?.startsStep) {\n      status = \"running\";\n    } else if (mapping?.endsRun || mapping?.endsStep) {\n      status = \"ok\";\n    }\n\n    // kind\n    const kind: InspectKind = mapping?.kind ?? inferKind(eventName);\n\n    // name\n    const name = mapping?.name ?? deriveName(eventName, kind);\n\n    // confidence\n    let confidence: InspectEvent[\"confidence\"] = \"correlated\";\n    if (parentId || mapping?.startsRun) confidence = \"explicit\";\n    if (timestampMissing) confidence = \"unknown\";\n\n    // attributes: exclude used keys\n    const omit = new Set<string>([\n      ...cfg.runIdKeys,\n      cfg.eventKey,\n      tsKey,\n      cfg.messageKey ?? \"message\",\n      cfg.levelKey ?? \"level\",\n      cfg.parentIdKey ?? \"\",\n      cfg.durationKey ?? \"\",\n      cfg.statusKey ?? \"\",\n      \"durationMs\",\n    ].filter((k) => k !== \"\"));\n\n    const attributes: Record<string, unknown> = {};\n    for (const [k, v] of Object.entries(raw)) {\n      if (omit.has(k)) continue;\n      attributes[k] = v;\n    }\n\n    const event: InspectEvent = {\n      eventId: nanoid(10),\n      runId,\n      ...(parentId ? { parentId } : {}),\n      name,\n      kind,\n      timestamp,\n      ...(status ? { status } : {}),\n      ...(durationMs !== undefined ? { durationMs } : {}),\n      ...(Object.keys(attributes).length > 0 ? { attributes } : {}),\n      confidence,\n      source: {\n        type: record.sourceType,\n        file: record.file,\n        line: record.line,\n      },\n    };\n\n    if (timestampMissing) {\n      return {\n        event,\n        warning: {\n          code: \"MISSING_TIMESTAMP\",\n          message: `Missing or invalid timestamp (key: ${tsKey})`,\n          file: record.file,\n          line: record.line,\n          raw: JSON.stringify(raw).slice(0, 500),\n        },\n      };\n    }\n\n    return { event };\n  }\n\n  normalize(record: RawLogRecord): InspectEvent | ParserWarning {\n    const r = this.#normalizeInternal(record);\n    return r.event ?? (r.warning as ParserWarning);\n  }\n\n  normalizeAll(records: RawLogRecord[]): ParseResult<InspectEvent> {\n    const out: InspectEvent[] = [];\n    const warnings: ParserWarning[] = [];\n    for (const r of records) {\n      const normalized = this.#normalizeInternal(r);\n      if (normalized.event) out.push(normalized.event);\n      if (normalized.warning) warnings.push(normalized.warning);\n    }\n    return { records: out, warnings };\n  }\n}\n\n","import type { InspectNode, InspectRunTree } from \"../types/inspect-event.js\";\n\nexport interface RenderTreeOptions {\n  verbose?: boolean;\n  showConfidence?: \"always\" | \"non-explicit\" | \"never\";\n  showMetadata?: boolean;\n  color?: boolean;\n  maxAttributeLength?: number;\n  summary?: boolean;\n}\n\nfunction truncate(v: string, max: number): string {\n  if (v.length <= max) return v;\n  return v.slice(0, Math.max(0, max - 1)) + \"…\";\n}\n\nfunction fmtAttrValue(value: unknown, maxLen: number): string | undefined {\n  if (value === null || value === undefined) return undefined;\n  if (typeof value === \"string\") return truncate(value, maxLen);\n  if (typeof value === \"number\" || typeof value === \"boolean\" || typeof value === \"bigint\") {\n    return String(value);\n  }\n  if (typeof value === \"object\") {\n    try {\n      return truncate(JSON.stringify(value), maxLen);\n    } catch {\n      return \"[object]\";\n    }\n  }\n  return String(value);\n}\n\nfunction compactAttrs(attrs: Record<string, unknown> | undefined, maxLen: number): string {\n  if (!attrs) return \"\";\n  const entries = Object.entries(attrs);\n  if (entries.length === 0) return \"\";\n\n  const picks = new Map<string, string>();\n  const set = (k: string, v: unknown) => {\n    const s = fmtAttrValue(v, maxLen);\n    if (s !== undefined) picks.set(k, s);\n  };\n\n  // Prefer common keys in expected output\n  set(\"job\", attrs.jobId ?? attrs.job ?? attrs.jobUuid);\n  set(\"user\", attrs.userUuid ?? attrs.userId ?? attrs.user);\n  set(\"trip\", attrs.tripUuid ?? attrs.tripId ?? attrs.trip);\n  set(\"msgs\", attrs.messageCount ?? attrs.msgs);\n  set(\"trips\", attrs.trips);\n  set(\"model\", attrs.model);\n\n  // tokens: input/output\n  const tokens = attrs.tokens;\n  if (tokens && typeof tokens === \"object\" && tokens !== null) {\n    const input = (tokens as any).input;\n    const output = (tokens as any).output;\n    if (typeof input === \"number\" || typeof output === \"number\") {\n      picks.set(\"tokens\", `${input ?? \"?\"}/${output ?? \"?\"}`);\n    }\n  }\n\n  // Allow a few booleans/strings\n  for (const k of [\"shouldNotify\", \"variant\"] as const) {\n    if (k in attrs) set(k, (attrs as any)[k]);\n  }\n\n  const rendered = [...picks.entries()]\n    .filter(([, v]) => v !== \"\")\n    .map(([k, v]) => `${k}=${v}`);\n\n  return rendered.length > 0 ? \" \" + rendered.join(\" \") : \"\";\n}\n\nfunction statusMark(node: InspectNode): string {\n  if (node.event.status === \"error\") return \" ✖\";\n  if (node.event.status === \"ok\") return \" ✔\";\n  return \"\";\n}\n\nfunction fmtDuration(ms: number): string {\n  if (!Number.isFinite(ms) || ms < 0) return \"\";\n  if (ms < 1000) return `${Math.round(ms)}ms`;\n  return `${(ms / 1000).toFixed(2)}s`;\n}\n\nfunction renderNodeLines(node: InspectNode, prefix: string, isLast: boolean, options: Required<RenderTreeOptions>): string[] {\n  const branch = prefix + (isLast ? \"└─ \" : \"├─ \");\n  const nextPrefix = prefix + (isLast ? \"   \" : \"│  \");\n  const attrs = compactAttrs(node.event.attributes, options.maxAttributeLength);\n  const dur = node.event.durationMs !== undefined ? ` ${fmtDuration(node.event.durationMs)}` : \"\";\n  const line = `${branch}${node.event.name}${attrs}${statusMark(node)}${dur}`;\n\n  const lines = [line];\n\n  const showConf =\n    options.showConfidence === \"always\" ||\n    (options.showConfidence === \"non-explicit\" && node.event.confidence !== \"explicit\");\n  if (showConf) {\n    lines.push(`${nextPrefix}confidence: ${node.event.confidence}`);\n  }\n\n  const children = node.children;\n  for (let i = 0; i < children.length; i++) {\n    lines.push(...renderNodeLines(children[i]!, nextPrefix, i === children.length - 1, options));\n  }\n  return lines;\n}\n\nexport function renderRunTree(tree: InspectRunTree, options?: RenderTreeOptions): string {\n  const opts: Required<RenderTreeOptions> = {\n    verbose: options?.verbose ?? false,\n    showConfidence: options?.showConfidence ?? \"always\",\n    showMetadata: options?.showMetadata ?? false,\n    color: options?.color ?? false,\n    maxAttributeLength: options?.maxAttributeLength ?? 40,\n    summary: options?.summary ?? true,\n  };\n\n  const header = `Run ${tree.runId}`;\n  const lines: string[] = [header];\n\n  const children = tree.children;\n  for (let i = 0; i < children.length; i++) {\n    lines.push(...renderNodeLines(children[i]!, \"\", i === children.length - 1, opts));\n  }\n\n  if (opts.summary) {\n    const cb = tree.metadata.confidenceBreakdown;\n    const tools = tree.metadata.kinds.TOOL ?? 0;\n    const llms = tree.metadata.kinds.LLM ?? 0;\n    lines.push(\"\");\n    lines.push(\"Summary:\");\n    lines.push(`  Events: ${tree.metadata.totalEvents}`);\n    lines.push(`  Tools: ${tools}`);\n    lines.push(`  LLMs: ${llms}`);\n    lines.push(\n      `  Confidence: ${cb.explicit} explicit, ${cb.correlated} correlated, ${cb.heuristic} heuristic, ${cb.unknown} unknown`,\n    );\n    lines.push(\"\");\n    lines.push(\"Note:\");\n    lines.push(\"  Flat timeline by default. Nesting only with explicit parentId.\");\n  }\n\n  return lines.join(\"\\n\");\n}\n\nexport function renderRunTrees(trees: InspectRunTree[], options?: RenderTreeOptions): string {\n  return trees.map((t) => renderRunTree(t, options)).join(\"\\n\\n\");\n}\n\n","import type { RawLogRecord } from \"./raw-record.js\";\nimport { JsonLogParser } from \"./json-parser.js\";\nimport { Log4jsParser } from \"./log4js-parser.js\";\nimport type { ParseResult, ParserWarning } from \"./warnings.js\";\n\nexport type LogSourceFormat = \"json\" | \"log4js\" | \"auto\";\n\nexport interface ParseLogLineOptions {\n  format?: LogSourceFormat;\n  file?: string;\n  line?: number;\n}\n\nfunction shiftLineNumbers(\n  res: ParseResult<RawLogRecord>,\n  options: ParseLogLineOptions,\n): ParseResult<RawLogRecord> {\n  const targetLine =\n    typeof options.line === \"number\" && Number.isFinite(options.line) && options.line > 0\n      ? Math.floor(options.line)\n      : undefined;\n  const file = typeof options.file === \"string\" && options.file.trim() !== \"\" ? options.file : undefined;\n\n  if (targetLine === undefined && file === undefined) return res;\n\n  const mapRecord = (x: RawLogRecord): RawLogRecord => ({\n    ...x,\n    ...(targetLine !== undefined ? { line: targetLine } : {}),\n    ...(file !== undefined ? { file } : {}),\n  });\n\n  const mapWarning = (x: ParserWarning): ParserWarning => ({\n    ...x,\n    ...(targetLine !== undefined ? { line: targetLine } : {}),\n    ...(file !== undefined ? { file } : {}),\n  });\n\n  return {\n    records: res.records.map(mapRecord),\n    warnings: res.warnings.map(mapWarning),\n  };\n}\n\nfunction normalizeFormat(line: string, format: LogSourceFormat | undefined): LogSourceFormat {\n  if (format && format !== \"auto\") return format;\n  const trimmed = line.trim();\n  if (trimmed.startsWith(\"{\")) return \"json\";\n  return \"log4js\";\n}\n\nexport function parseLogLine(\n  line: string,\n  options: ParseLogLineOptions = {},\n): ParseResult<RawLogRecord> {\n  const raw = typeof line === \"string\" ? line : \"\";\n  const trimmed = raw.trim();\n  if (trimmed === \"\") return { records: [], warnings: [] };\n\n  const format = normalizeFormat(raw, options.format);\n  const base =\n    format === \"json\"\n      ? new JsonLogParser().parseLines([raw], options.file)\n      : new Log4jsParser().parseLines([raw], options.file);\n\n  // JsonLogParser/Log4jsParser always number lines starting at 1; for streaming tail we\n  // need to preserve the real stream/file line number when provided.\n  return shiftLineNumbers(base, options);\n}\n\n","import type { InspectEvent, InspectRunTree } from \"../types/inspect-event.js\";\nimport type { LogIngestConfig } from \"../types/log-config.js\";\nimport { mergeLogIngestConfig } from \"./config.js\";\nimport type { LogSourceFormat } from \"./line-parser.js\";\nimport { parseLogLine } from \"./line-parser.js\";\nimport { EventNormalizer } from \"./normalizer.js\";\nimport { Redactor } from \"./redactor.js\";\nimport { TreeBuilder } from \"./tree-builder.js\";\nimport type { ParserWarning } from \"./warnings.js\";\n\nexport interface LiveLogUpdate {\n  events: InspectEvent[];\n  trees: InspectRunTree[];\n  warnings: ParserWarning[];\n}\n\nexport interface LiveLogAccumulatorOptions {\n  config: LogIngestConfig;\n  format?: LogSourceFormat;\n  file?: string;\n}\n\nexport class LiveLogAccumulator {\n  readonly #config: LogIngestConfig;\n  readonly #format: LogSourceFormat;\n  readonly #file?: string;\n\n  readonly #normalizer: EventNormalizer;\n  readonly #redactor: Redactor;\n  readonly #treeBuilder: TreeBuilder;\n\n  #events: InspectEvent[] = [];\n  #warnings: ParserWarning[] = [];\n  #trees: InspectRunTree[] = [];\n\n  constructor(options: LiveLogAccumulatorOptions) {\n    // Ensure defaults are applied consistently.\n    this.#config = mergeLogIngestConfig(options.config, {});\n    this.#format = options.format ?? \"auto\";\n    this.#file = options.file;\n\n    this.#normalizer = new EventNormalizer({ config: this.#config });\n    this.#redactor = new Redactor({ rules: this.#config.redact });\n    this.#treeBuilder = new TreeBuilder({ config: this.#config });\n  }\n\n  pushLine(line: string, lineNumber?: number): LiveLogUpdate {\n    try {\n      const parsed = parseLogLine(line, {\n        format: this.#format,\n        file: this.#file,\n        line: lineNumber,\n      });\n\n      const normalized = this.#normalizer.normalizeAll(parsed.records);\n\n      // Redact attributes after normalization, before storing.\n      const redactedEvents = normalized.records.map((e) => ({\n        ...e,\n        attributes: e.attributes ? this.#redactor.redactRecord(e.attributes) : undefined,\n      }));\n\n      this.#events = [...this.#events, ...redactedEvents];\n      this.#warnings = [...this.#warnings, ...parsed.warnings, ...normalized.warnings];\n      this.#trees = this.#treeBuilder.build(this.#events);\n\n      return {\n        events: this.#events,\n        trees: this.#trees,\n        warnings: this.#warnings,\n      };\n    } catch (e) {\n      const msg = e instanceof Error ? e.message : String(e);\n      const warning: ParserWarning = {\n        code: \"UNKNOWN\",\n        message: `LiveLogAccumulator failed to process line (${msg})`,\n        file: this.#file,\n        line: lineNumber,\n        raw: typeof line === \"string\" ? line.slice(0, 500) : undefined,\n      };\n      this.#warnings = [...this.#warnings, warning];\n      return { events: this.#events, trees: this.#trees, warnings: this.#warnings };\n    }\n  }\n\n  getEvents(): InspectEvent[] {\n    return this.#events;\n  }\n\n  getTrees(): InspectRunTree[] {\n    return this.#trees;\n  }\n\n  getWarnings(): ParserWarning[] {\n    return this.#warnings;\n  }\n\n  reset(): void {\n    this.#events = [];\n    this.#trees = [];\n    this.#warnings = [];\n  }\n}\n\n","import { readFile } from \"node:fs/promises\";\n\nimport type { InspectEvent, InspectRunTree } from \"../types/inspect-event.js\";\nimport type { LogIngestConfig } from \"../types/log-config.js\";\nimport { loadLogIngestConfig, mergeLogIngestConfig } from \"./config.js\";\nimport { JsonLogParser } from \"./json-parser.js\";\nimport { Log4jsParser } from \"./log4js-parser.js\";\nimport type { RawLogRecord } from \"./raw-record.js\";\nimport { Redactor } from \"./redactor.js\";\nimport { EventNormalizer } from \"./normalizer.js\";\nimport { TreeBuilder } from \"./tree-builder.js\";\nimport type { ParserWarning } from \"./warnings.js\";\nexport type { LogSourceFormat, ParseLogLineOptions } from \"./line-parser.js\";\nexport { parseLogLine } from \"./line-parser.js\";\nexport type { LiveLogUpdate, LiveLogAccumulatorOptions } from \"./live-tree.js\";\nexport { LiveLogAccumulator } from \"./live-tree.js\";\n\nexport interface ParseLogsOptions {\n  format?: \"json\" | \"log4js\" | \"auto\";\n  config?: LogIngestConfig;\n  configPath?: string;\n  runIdKeys?: string[];\n  eventKey?: string;\n  timestampKey?: string;\n  messageKey?: string;\n  levelKey?: string;\n  parentIdKey?: string;\n  durationKey?: string;\n  statusKey?: string;\n  warnings?: \"none\" | \"summary\" | \"all\";\n}\n\nexport interface LogToTreeResult {\n  events: InspectEvent[];\n  trees: InspectRunTree[];\n  warnings: ParserWarning[];\n}\n\nfunction firstNonEmptyLine(text: string): string | undefined {\n  for (const line of text.split(/\\r?\\n/)) {\n    const t = line.trim();\n    if (t !== \"\") return t;\n  }\n  return undefined;\n}\n\nasync function detectFormat(\n  filePath: string,\n): Promise<\"json\" | \"log4js\"> {\n  const text = await readFile(filePath, \"utf-8\");\n  const first = firstNonEmptyLine(text);\n  if (!first) return \"log4js\";\n  if (!first.startsWith(\"{\")) return \"log4js\";\n  try {\n    const parsed = JSON.parse(first) as unknown;\n    if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) return \"json\";\n  } catch {\n    /* ignore */\n  }\n  return \"log4js\";\n}\n\nfunction applyOverrides(\n  cfg: LogIngestConfig,\n  options: ParseLogsOptions,\n): LogIngestConfig {\n  const override: Partial<LogIngestConfig> = {};\n  for (const k of [\n    \"runIdKeys\",\n    \"eventKey\",\n    \"timestampKey\",\n    \"messageKey\",\n    \"levelKey\",\n    \"parentIdKey\",\n    \"durationKey\",\n    \"statusKey\",\n  ] as const) {\n    const v = (options as any)[k];\n    if (v !== undefined) (override as any)[k] = v;\n  }\n  return mergeLogIngestConfig(cfg, override);\n}\n\n/**\n * @experimental Compatibility-oriented API for parsing structured logs into normalized run trees.\n * Subject to refinement before a future stability declaration.\n */\nexport async function parseLogsToTrees(\n  filePath: string,\n  options: ParseLogsOptions = {},\n): Promise<LogToTreeResult> {\n  const base =\n    options.config ??\n    (await loadLogIngestConfig(options.configPath));\n  const config = applyOverrides(base, options);\n\n  const format =\n    options.format === \"auto\" || options.format === undefined\n      ? await detectFormat(filePath)\n      : options.format;\n\n  let parsed: { records: RawLogRecord[]; warnings: ParserWarning[] };\n  if (format === \"json\") {\n    parsed = await new JsonLogParser().parseFile(filePath);\n  } else {\n    parsed = await new Log4jsParser().parseFile(filePath);\n  }\n\n  const normalizer = new EventNormalizer({ config });\n  const normalized = normalizer.normalizeAll(parsed.records);\n\n  // Redact attributes after normalization.\n  const redactor = new Redactor({ rules: config.redact });\n  const events: InspectEvent[] = normalized.records.map((e) => ({\n    ...e,\n    attributes: e.attributes ? redactor.redactRecord(e.attributes) : undefined,\n  }));\n\n  const trees = new TreeBuilder({ config }).build(events);\n\n  return {\n    events,\n    trees,\n    warnings: [...parsed.warnings, ...normalized.warnings],\n  };\n}\n\n"]}