{"version":3,"sources":["../src/types.ts","../src/utils/duration.ts","../src/trace-filesystem.ts","../src/utils.ts","../src/read-trace.ts"],"names":["formatDuration","isRecord","format"],"mappings":";;;;;;;AAiSA,IAAM,UAAA,GAAkC;AAAA,EACtC,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,aAAA,GAAuC;AAAA,EAC3C,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAGO,SAAS,WAAW,KAAA,EAAmC;AAC5D,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IAChB,UAAA,CAAiC,SAAS,KAAK,CAAA;AAEpD;AAGO,SAAS,aAAa,KAAA,EAAqC;AAChE,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IAChB,aAAA,CAAoC,SAAS,KAAK,CAAA;AAEvD;AAMO,SAAS,aAAa,KAAA,EAAqC;AAChE,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAC7B,EAAA,IAAI,KAAA,CAAM,aAAA,KAAkB,KAAA,EAAO,OAAO,KAAA;AAC1C,EAAA,IAAI,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,EAAU,OAAO,KAAA;AAChD,EAAA,IAAI,OAAO,KAAA,CAAM,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AAE5C,EAAA,QAAQ,MAAM,KAAA;AAAO,IACnB,KAAK,aAAA,EAAe;AAClB,MAAA,OACE,OAAO,KAAA,CAAM,KAAA,KAAU,QAAA,IACvB,OAAO,MAAM,IAAA,KAAS,QAAA,IACtB,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA;AAAA,IAE/B;AAAA,IACA,KAAK,eAAA,EAAiB;AACpB,MAAA,OACE,OAAO,KAAA,CAAM,KAAA,KAAU,QAAA,KACtB,KAAA,CAAM,WAAW,SAAA,IAAa,KAAA,CAAM,MAAA,KAAW,OAAA,CAAA,IAChD,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,IACzB,OAAO,MAAM,UAAA,KAAe,QAAA;AAAA,IAEhC;AAAA,IACA,KAAK,cAAA,EAAgB;AACnB,MAAA,OACE,OAAO,KAAA,CAAM,KAAA,KAAU,YACvB,OAAO,KAAA,CAAM,WAAW,QAAA,IACxB,OAAO,KAAA,CAAM,IAAA,KAAS,YACtB,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA,IACrB,OAAO,MAAM,SAAA,KAAc,QAAA;AAAA,IAE/B;AAAA,IACA,KAAK,gBAAA,EAAkB;AACrB,MAAA,OACE,OAAO,MAAM,KAAA,KAAU,QAAA,IACvB,OAAO,KAAA,CAAM,MAAA,KAAW,aACvB,KAAA,CAAM,MAAA,KAAW,aAAa,KAAA,CAAM,MAAA,KAAW,YAChD,OAAO,KAAA,CAAM,YAAY,QAAA,IACzB,OAAO,MAAM,UAAA,KAAe,QAAA;AAAA,IAEhC;AAAA,IACA,KAAK,kBAAA,EAAoB;AACvB,MAAA,OACE,OAAO,KAAA,CAAM,KAAA,KAAU,QAAA,IACvB,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,IAC3B,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,IACtB,OAAO,KAAA,CAAM,WAAA,KAAgB,QAAA,KAC5B,KAAA,CAAM,MAAA,KAAW,QAAA,IAChB,KAAA,CAAM,MAAA,KAAW,QAAA,IACjB,KAAA,CAAM,MAAA,KAAW,SAAA,IACjB,KAAA,CAAM,MAAA,KAAW,SAAA,CAAA,IACnB,OAAO,MAAM,UAAA,KAAe,QAAA;AAAA,IAEhC;AAAA,IACA;AACE,MAAA,OAAO,KAAA;AAAA;AAEb;;;AC1XO,SAAS,cAAc,QAAA,EAA0B;AACtD,EAAA,MAAM,MAAM,OAAO,QAAA,KAAa,QAAA,GAAW,QAAA,CAAS,MAAK,GAAI,EAAA;AAC7D,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,oBAAoB,CAAA;AAC5C,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,4BAA4B,QAAQ,CAAA,qFAAA;AAAA,KACtC;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AAC3C,EAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AAEpB,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,IAAK,UAAU,CAAA,EAAG;AAC3C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,4BAA4B,QAAQ,CAAA,oCAAA;AAAA,KACtC;AAAA,EACF;AAEA,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,IAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,GAAA;AACH,MAAA,OAAO,MAAA,GAAS,GAAA;AAAA,IAClB,KAAK,GAAA;AACH,MAAA,OAAO,SAAS,EAAA,GAAK,GAAA;AAAA,IACvB,KAAK,GAAA;AACH,MAAA,OAAO,MAAA,GAAS,KAAK,EAAA,GAAK,GAAA;AAAA,IAC5B,KAAK,GAAA;AACH,MAAA,OAAO,MAAA,GAAS,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAAA,IACjC,SAAS;AAEP,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,IAAI,CAAA,CAAE,CAAA;AAAA,IAClD;AAAA;AAEJ;AAEO,SAAS,eAAe,EAAA,EAAoB;AACjD,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAK,CAAA,EAAG;AACV,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6CAAA,EAAgD,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,EACvE;AACA,EAAA,IAAI,KAAK,GAAA,EAAM;AACb,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,EAAE,CAAC,CAAA,EAAA,CAAA;AAAA,EAC1B;AACA,EAAA,IAAI,KAAK,GAAA,EAAQ;AACf,IAAA,OAAO,CAAA,EAAA,CAAI,EAAA,GAAK,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,EAClC;AACA,EAAA,IAAI,KAAK,IAAA,EAAW;AAClB,IAAA,OAAO,CAAA,EAAA,CAAI,EAAA,GAAK,GAAA,EAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,EACpC;AACA,EAAA,OAAO,CAAA,EAAA,CAAI,EAAA,GAAK,IAAA,EAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AACvC;ACzDO,IAAM,cAAA,GAAiB,GAAA;AAGvB,IAAM,eAAA,GAAkB,GAAA;AAM/B,eAAsB,cAAc,OAAA,EAAgC;AAClE,EAAA,MAAM,MAAM,OAAA,EAAS,EAAE,WAAW,IAAA,EAAM,IAAA,EAAM,gBAAgB,CAAA;AAChE;AAMA,eAAsB,qBAAqB,QAAA,EAAiC;AAC1E,EAAA,MAAM,SAAA,CAAU,UAAU,EAAA,EAAI,EAAE,UAAU,OAAA,EAAS,IAAA,EAAM,iBAAiB,CAAA;AAC5E;AAMA,eAAsB,eAAA,CAAgB,UAAkB,IAAA,EAA6B;AACnF,EAAA,MAAM,UAAA,CAAW,UAAU,IAAA,EAAM,EAAE,UAAU,OAAA,EAAS,IAAA,EAAM,iBAAiB,CAAA;AAC/E;;;ACpBO,IAAM,sBAAA,GAAyB;AAG/B,IAAM,aAAA,GAAgB;AAGtB,IAAM,qBAAqB,IAAA,CAAK,IAAA;AAAA,EACrC,GAAG,MAAA,EAAO;AAAA,EACV,eAAA;AAAA,EACA;AACF;AAGO,IAAM,eAAA,GAAkB;AAGxB,SAAS,WAAA,GAAsB;AACpC,EAAA,OAAO,CAAA,IAAA,EAAO,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA;AAC1B;AAGO,SAAS,YAAA,GAAuB;AACrC,EAAA,OAAO,CAAA,KAAA,EAAQ,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA;AAC3B;AAGO,SAASA,gBAAe,EAAA,EAAoB;AACjD,EAAA,OAAO,eAAiB,EAAE,CAAA;AAC5B;AAMO,SAAS,gBAAgB,SAAA,EAA2B;AACzD,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,EAAG;AAC/B,IAAA,OAAO,cAAA;AAAA,EACT;AACA,EAAA,MAAM,CAAA,GAAI,IAAI,IAAA,CAAK,SAAS,CAAA;AAC5B,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG;AAC7B,IAAA,OAAO,cAAA;AAAA,EACT;AACA,EAAA,MAAM,CAAA,GAAI,EAAE,WAAA,EAAY;AACxB,EAAA,MAAM,EAAA,GAAK,OAAO,CAAA,CAAE,QAAA,KAAa,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AACnD,EAAA,MAAM,GAAA,GAAM,OAAO,CAAA,CAAE,OAAA,EAAS,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAC/C,EAAA,MAAM,CAAA,GAAI,OAAO,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAC9C,EAAA,MAAM,GAAA,GAAM,OAAO,CAAA,CAAE,UAAA,EAAY,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAClD,EAAA,MAAM,CAAA,GAAI,OAAO,CAAA,CAAE,UAAA,EAAY,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAChD,EAAA,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AAC3C;AAMO,SAAS,kBAAA,GAA6B;AAC3C,EAAA,MAAM,MAAA,GAAS,QAAQ,GAAA,CAAI,uBAAA;AAC3B,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,CAAO,IAAA,OAAW,EAAA,EAAI;AACtD,IAAA,OAAO,OAAO,IAAA,EAAK;AAAA,EACrB;AACA,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,GAAG,OAAA,EAAQ;AACxB,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,IAAA,OAAW,EAAA,EAAI;AAClD,MAAA,OAAO,kBAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,sBAAA,EAAwB,aAAa,CAAA;AAAA,EAC9D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,kBAAA;AAAA,EACT;AACF;AAMO,SAAS,gBAAA,CAAiB,OAAe,QAAA,EAA2B;AACzE,EAAA,MAAM,OAAA,GAAU,YAAY,kBAAA,EAAmB;AAC/C,EAAA,IAAI,MAAA,GACF,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,MAAK,KAAM,EAAA,GAAK,KAAA,CAAM,IAAA,EAAK,GAAI,aAAA;AACpE,EAAA,MAAA,GAAS,IAAA,CAAK,SAAS,MAAM,CAAA;AAC7B,EAAA,IAAI,MAAA,KAAW,EAAA,IAAM,MAAA,KAAW,GAAA,IAAO,WAAW,IAAA,EAAM;AACtD,IAAA,MAAA,GAAS,aAAA;AAAA,EACX;AACA,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG,MAAM,CAAA,MAAA,CAAQ,CAAA;AAC7C;AAOA,eAAsB,eAAe,QAAA,EAAmC;AACtE,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACrC,EAAA,IAAI;AACF,IAAA,MAAM,cAAc,OAAO,CAAA;AAC3B,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,IAAA,CAAK,CAAA,kCAAA,EAAqC,OAAO,CAAA,CAAE,CAAA;AACnD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,kBAAkB,CAAA;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,cAAc,QAAQ,CAAA;AAC5B,MAAA,OAAO,QAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,CAAA,2CAAA,EAA8C,QAAQ,CAAA,CAAE,CAAA;AAC7D,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,EACF;AACF;AAMO,SAAS,YAAY,KAAA,EAA2B;AACrD,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,MAAM,GAAA,GAAiB,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAQ;AAChD,IAAA,IAAI,OAAO,KAAA,CAAM,KAAA,KAAU,YAAY,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA,EAAG;AAC7D,MAAA,GAAA,CAAI,QAAQ,KAAA,CAAM,KAAA;AAAA,IACpB;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,EAAE,SAAS,KAAA,EAAM;AAAA,EAC1B;AACA,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,OAAO,EAAE,SAAS,qBAAA,EAAsB;AAAA,EAC1C;AACA,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,EAAE,SAAS,0BAAA,EAA2B;AAAA,EAC/C;AACA,EAAA,IACE,OAAO,UAAU,QAAA,IACjB,OAAO,UAAU,SAAA,IACjB,OAAO,UAAU,QAAA,EACjB;AACA,IAAA,OAAO,EAAE,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,EAClC;AACA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI;AACF,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAE;AAAA,IAC1C,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAE,SAAS,eAAA,EAAgB;AAAA,IACpC;AAAA,EACF;AACA,EAAA,OAAO,EAAE,SAAS,eAAA,EAAgB;AACpC;AAMO,SAAS,YAAA,CAAa,IAAA,EAAc,SAAA,GAAY,eAAA,EAAyB;AAC9E,EAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,IAAA,OAAW,EAAA,EAAI;AAClD,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,IAAI,OAAA,CAAQ,UAAU,SAAA,EAAW;AAC/B,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,MAAM,QAAA,GAAW,KAAA;AACjB,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAA,GAAY,SAAS,MAAM,CAAA;AACpD,EAAA,OAAO,GAAG,OAAA,CAAQ,KAAA,CAAM,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAA,CAAA;AAC7C;AAMO,SAAS,IAAA,CAAK,SAAiB,KAAA,EAAuB;AAC3D,EAAA,MAAM,IAAA,GAAO,kBAAkB,OAAO,CAAA,CAAA;AACtC,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AACjB,IAAA;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,IAAI,CAAA,EAAA,EAAK,YAAY,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AACvD;;;ACjKA,SAASC,UAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,iBAAiB,MAAA,EAAoD;AAC5E,EAAA,IAAI,CAACA,SAAAA,CAAS,MAAM,CAAA,EAAG,OAAO,SAAA;AAC9B,EAAA,IAAI,MAAA,CAAO,aAAA,KAAkB,KAAA,EAAO,OAAO,KAAA;AAC3C,EAAA,IAAI,MAAA,CAAO,aAAA,KAAkB,KAAA,EAAO,OAAO,KAAA;AAC3C,EAAA,IAAI,MAAA,CAAO,aAAA,KAAkB,KAAA,EAAO,OAAO,KAAA;AAC3C,EAAA,OAAO,SAAA;AACT;AAYO,SAAS,eAAA,CACd,GAAA,EACA,OAAA,GAAkC,EAAC,EACZ;AACvB,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,YAAA;AACrC,EAAA,MAAM,WAAA,GAAc,CAAC,OAAA,KAA0B;AAC7C,IAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,KAAA,EAAO,IAAA,CAAK,OAAO,CAAA;AAAA,EAC9C,CAAA;AACA,EAAA,MAAM,YAAqC,EAAC;AAC5C,EAAA,MAAM,cAA4B,EAAC;AACnC,EAAA,MAAM,OAA8B,EAAC;AACrC,EAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,EAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,KAAA,MAAW,IAAA,IAAQ,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,EAAG;AACrC,IAAA,UAAA,IAAc,CAAA;AACd,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,YAAY,EAAA,EAAI;AAEpB,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA,WAAA,CAAY,yCAAyC,CAAA;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,MAAMC,OAAAA,GAAS,iBAAiB,MAAM,CAAA;AACtC,IAAA,IAAIA,YAAW,KAAA,EAAO;AACpB,MAAA,KAAA,GAAQ,IAAA;AACR,MAAA,IAAI,QAAA,CAAS,MAAM,CAAA,EAAG;AACpB,QAAA,gBAAA,IAAoB,CAAA;AACpB,QAAA,WAAA,CAAY,KAAK,MAAM,CAAA;AACvB,QAAA,IAAA,CAAK,IAAA,CAAK,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAO,MAAA,EAAQ,UAAA,EAAY,YAAY,CAAA;AAAA,MACpE,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,gDAAgD,CAAA;AAAA,MAC9D;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAIA,OAAAA,KAAW,KAAA,IAASA,OAAAA,KAAW,KAAA,EAAO;AACxC,MAAA,IAAIA,OAAAA,KAAW,OAAO,KAAA,GAAQ,IAAA;AAAA,WACzB,KAAA,GAAQ,IAAA;AACb,MAAA,IAAI,uBAAA,CAAwB,MAAM,CAAA,EAAG;AACnC,QAAA,gBAAA,IAAoB,CAAA;AACpB,QAAA,SAAA,CAAU,KAAK,MAAM,CAAA;AACrB,QAAA,IAAA,CAAK,IAAA,CAAK,EAAE,MAAA,EAAAA,OAAAA,EAAQ,OAAO,MAAA,EAAQ,UAAA,EAAY,YAAY,CAAA;AAC3D,QAAA,WAAA,CAAY,IAAA,CAAK,GAAG,kCAAA,CAAmC,MAAM,CAAC,CAAA;AAAA,MAChE,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,4DAA4D,CAAA;AAAA,MAC1E;AACA,MAAA;AAAA,IACF;AAEA,IAAA,WAAA,CAAY,+CAA+C,CAAA;AAAA,EAC7D;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,MAAA;AAC1D,EAAA,IAAI,cAAc,CAAA,EAAG;AACnB,IAAA,WAAA;AAAA,MACE;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,GAA2B,OAAA;AAC/B,EAAA,IAAI,WAAA,GAAc,GAAG,MAAA,GAAS,OAAA;AAAA,OAAA,IACrB,OAAO,MAAA,GAAS,KAAA;AAAA,OAAA,IAChB,OAAO,MAAA,GAAS,KAAA;AAAA,OAAA,IAChB,OAAO,MAAA,GAAS,KAAA;AAEzB,EAAA,OAAO,EAAE,MAAA,EAAQ,gBAAA,EAAkB,MAAA,EAAQ,WAAA,EAAa,WAAW,IAAA,EAAK;AAC1E;AAKO,SAAS,yBAAA,GAAoC;AAClD,EAAA,OACE,iIAAA;AAEJ","file":"chunk-7DHSWDKB.mjs","sourcesContent":["import type { RedactionRule } from \"./types/log-config.js\";\n\n/**\n * Discriminator for what kind of work a {@link Step} represents.\n * `\"decision\"` captures agent branching/choices; other values cover runs, LLM calls, tools, and user-defined steps.\n */\nexport type StepType =\n  | \"run\"\n  | \"llm\"\n  | \"tool\"\n  | \"decision\"\n  | \"logic\"\n  | \"state\"\n  | \"custom\";\n\n/** Lifecycle state of a single {@link Step}. */\nexport type StepStatus = \"running\" | \"success\" | \"error\";\n\n/** Lifecycle state of an entire {@link Run}. */\nexport type RunStatus = \"running\" | \"success\" | \"error\";\n\n/** Structured error attached to a run or step when status is `\"error\"`. */\nexport interface ErrorInfo {\n  message: string;\n  stack?: string;\n}\n\n/**\n * Optional token counts for a step (e.g. LLM usage).\n * Reserved for future roadmap; MVP does not compute or persist token usage.\n */\nexport interface TokenMetadata {\n  input?: number;\n  output?: number;\n  total?: number;\n  /** Cache-read tokens (informational; never added to total). */\n  cached?: number;\n  /** Cache-write / cache-creation tokens (informational). */\n  cacheWrite?: number;\n  /** Reasoning / thinking tokens when reported separately. */\n  reasoning?: number;\n}\n\n/** Arbitrary structured fields for a step; safe extensions use string keys. */\nexport interface StepMetadata {\n  model?: string;\n  toolName?: string;\n  tokens?: TokenMetadata;\n  retryCount?: number;\n  [key: string]: unknown;\n}\n\n/**\n * One traced agent run (root of an execution tree).\n * MVP intentionally omits `input` / `output` on the run to limit PII, secrets, and serialization risk.\n */\nexport interface Run {\n  id: string;\n  name: string;\n  status: RunStatus;\n  startTime: number;\n  endTime?: number;\n  durationMs?: number;\n  error?: ErrorInfo;\n  metadata?: Record<string, unknown>;\n}\n\n/**\n * One node in the execution tree under a {@link Run}.\n * MVP intentionally omits `input` / `output`; capture/redaction may come in a later version.\n */\nexport interface Step {\n  id: string;\n  runId: string;\n  parentId?: string;\n  name: string;\n  type: StepType;\n  status: StepStatus;\n  startTime: number;\n  endTime?: number;\n  durationMs?: number;\n  error?: ErrorInfo;\n  metadata?: StepMetadata;\n}\n\n/** Version of the JSONL trace line schema consumed by AgentInspect tooling. */\nexport type TraceSchemaVersion = \"0.1\";\n\n/**\n * Status for lightweight trace metadata extraction.\n * `\"unknown\"` means the file contained valid events but a run status could not be determined safely.\n */\nexport type TraceMetadataStatus = \"success\" | \"error\" | \"running\" | \"unknown\";\n\nexport interface TraceMetadata {\n  runId: string;\n  name?: string;\n  status: TraceMetadataStatus;\n  startedAt?: number;\n  endedAt?: number;\n  durationMs?: number;\n  eventCount: number;\n  filePath: string;\n  fileSize: number;\n  createdAt: Date;\n}\n\nexport interface RunSummary {\n  runId: string;\n  name?: string;\n  status: TraceMetadataStatus;\n  durationMs?: number;\n  totalSteps: number;\n  llmSteps: number;\n  toolSteps: number;\n  logicSteps: number;\n  errorSteps: number;\n  maxDepth: number;\n  longestStep?: {\n    name: string;\n    durationMs: number;\n    type: string;\n  };\n  totalTokens?: {\n    input: number;\n    output: number;\n    /** Present only when every token-bearing step has a supplied or derivable total. */\n    total?: number;\n    /** Sum of supplied cached counts; cached is not added to total. */\n    cached?: number;\n    /** Sum of cache-write / cache-creation counts; not added to total. */\n    cacheWrite?: number;\n    /** Sum of reasoning token counts; not added to total. */\n    reasoning?: number;\n  };\n}\n\n/** Fields shared by every persisted trace event line. */\nexport interface TraceEventBase {\n  schemaVersion: TraceSchemaVersion;\n  event: string;\n  timestamp: number;\n}\n\n/** Emitted when a run begins. */\nexport interface RunStartedEvent extends TraceEventBase {\n  event: \"run_started\";\n  runId: string;\n  name: string;\n  startTime: number;\n  metadata?: Record<string, unknown>;\n}\n\n/** Emitted when a run finishes successfully or with an error. */\nexport interface RunCompletedEvent extends TraceEventBase {\n  event: \"run_completed\";\n  runId: string;\n  status: \"success\" | \"error\";\n  endTime: number;\n  durationMs: number;\n  error?: ErrorInfo;\n}\n\n/** Emitted when a step begins (including nested steps under `parentId`). */\nexport interface StepStartedEvent extends TraceEventBase {\n  event: \"step_started\";\n  runId: string;\n  stepId: string;\n  parentId?: string;\n  name: string;\n  type: StepType;\n  startTime: number;\n  metadata?: StepMetadata;\n}\n\n/**\n * Emitted when a step finishes (success or failure).\n * Failures use `status: \"error\"` and optional {@link ErrorInfo}; there is no separate `step_failed` event in MVP.\n */\nexport interface StepCompletedEvent extends TraceEventBase {\n  event: \"step_completed\";\n  runId: string;\n  stepId: string;\n  status: \"success\" | \"error\";\n  endTime: number;\n  durationMs: number;\n  error?: ErrorInfo;\n}\n\n/** Emitted when an external-world outcome is observed (v4.4+). */\nexport interface OutcomeObservedEvent extends TraceEventBase {\n  event: \"outcome_observed\";\n  runId: string;\n  outcomeId: string;\n  parentId?: string;\n  name: string;\n  expectation: string;\n  status: \"passed\" | \"failed\" | \"unknown\" | \"skipped\";\n  method?:\n    | \"dom\"\n    | \"accessibility\"\n    | \"snapshot\"\n    | \"network\"\n    | \"storage\"\n    | \"filesystem\"\n    | \"database\"\n    | \"queue\"\n    | \"custom\";\n  actual?: unknown;\n  evidence?: unknown;\n  observedAt: number;\n}\n\n/** Discriminated union of all MVP trace events written as JSONL lines. */\nexport type TraceEvent =\n  | RunStartedEvent\n  | RunCompletedEvent\n  | StepStartedEvent\n  | StepCompletedEvent\n  | OutcomeObservedEvent;\n\n/** Named redaction presets for trace writing and share-safe exports (v1.3.0+). */\nexport type RedactionProfile = \"local\" | \"share\" | \"strict\";\n\n/** Optional correlation fields for grouping and cross-run tracing (v1.3.0+). */\nexport interface TraceCorrelationMetadata {\n  correlationId?: string;\n  requestId?: string;\n  decisionId?: string;\n  groupId?: string;\n}\n\n/** Options for `inspectRun()` and `maybeInspectRun()`. */\nexport interface InspectRunOptions extends TraceCorrelationMetadata {\n  traceDir?: string;\n  silent?: boolean;\n  metadata?: Record<string, unknown>;\n  /**\n   * When `false`, runs `fn` with no trace file, no execution context, and no terminal output.\n   * Omitted or `true` preserves default tracing behavior.\n   */\n  enabled?: boolean;\n  /**\n   * Redact sensitive metadata keys before writing JSONL. Default `true` (conservative keys).\n   * Pass `false` to persist metadata as-is (explicit opt-out).\n   */\n  redact?: boolean | { rules?: RedactionRule[] };\n  /**\n   * Redaction preset for trace metadata. Default `local` (same keys as default redaction).\n   * `share` and `strict` add extra key-based redaction and tighter string bounds.\n   * Ignored when `redact: false`.\n   */\n  redactionProfile?: RedactionProfile;\n  /** Max UTF-8 bytes for a serialized trace event line. Default 65536. */\n  maxEventBytes?: number;\n  /** Max length for string metadata values (non-preview keys). Default 2000. */\n  maxMetadataValueLength?: number;\n  /** Max length for preview-like metadata keys (contains `preview`). Default 500. */\n  maxPreviewLength?: number;\n}\n\n/** Options passed when opening a logical step (implemented in a later step). */\nexport interface StepOptions {\n  type?: StepType;\n  metadata?: StepMetadata;\n}\n\n/** Options for `observe()` — same surface as {@link InspectRunOptions} in MVP. */\nexport type ObserveOptions = InspectRunOptions;\n\n/**\n * Resolved settings for the active run while tracing is enabled.\n * Populated by runtime code in a later step; defined here for `context.ts`.\n */\nexport interface ExecutionContext {\n  runId: string;\n  runName: string;\n  traceDir: string;\n  silent: boolean;\n  metadata?: Record<string, unknown>;\n}\n\n/** Stack position of the step currently executing (used by future context tracking). */\nexport interface ActiveStepContext {\n  stepId: string;\n  parentId?: string;\n  depth: number;\n}\n\nconst STEP_TYPES: readonly StepType[] = [\n  \"run\",\n  \"llm\",\n  \"tool\",\n  \"decision\",\n  \"logic\",\n  \"state\",\n  \"custom\",\n] as const;\n\nconst STEP_STATUSES: readonly StepStatus[] = [\n  \"running\",\n  \"success\",\n  \"error\",\n] as const;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** Returns true if `value` is one of the MVP {@link StepType} literals. */\nexport function isStepType(value: unknown): value is StepType {\n  return (\n    typeof value === \"string\" &&\n    (STEP_TYPES as readonly string[]).includes(value)\n  );\n}\n\n/** Returns true if `value` is one of the MVP {@link StepStatus} literals. */\nexport function isStepStatus(value: unknown): value is StepStatus {\n  return (\n    typeof value === \"string\" &&\n    (STEP_STATUSES as readonly string[]).includes(value)\n  );\n}\n\n/**\n * Narrowing guard for a {@link TraceEvent} object with required MVP fields.\n * Does not deeply validate optional `metadata` shapes.\n */\nexport function isTraceEvent(value: unknown): value is TraceEvent {\n  if (!isRecord(value)) return false;\n  if (value.schemaVersion !== \"0.1\") return false;\n  if (typeof value.timestamp !== \"number\") return false;\n  if (typeof value.event !== \"string\") return false;\n\n  switch (value.event) {\n    case \"run_started\": {\n      return (\n        typeof value.runId === \"string\" &&\n        typeof value.name === \"string\" &&\n        typeof value.startTime === \"number\"\n      );\n    }\n    case \"run_completed\": {\n      return (\n        typeof value.runId === \"string\" &&\n        (value.status === \"success\" || value.status === \"error\") &&\n        typeof value.endTime === \"number\" &&\n        typeof value.durationMs === \"number\"\n      );\n    }\n    case \"step_started\": {\n      return (\n        typeof value.runId === \"string\" &&\n        typeof value.stepId === \"string\" &&\n        typeof value.name === \"string\" &&\n        isStepType(value.type) &&\n        typeof value.startTime === \"number\"\n      );\n    }\n    case \"step_completed\": {\n      return (\n        typeof value.runId === \"string\" &&\n        typeof value.stepId === \"string\" &&\n        (value.status === \"success\" || value.status === \"error\") &&\n        typeof value.endTime === \"number\" &&\n        typeof value.durationMs === \"number\"\n      );\n    }\n    case \"outcome_observed\": {\n      return (\n        typeof value.runId === \"string\" &&\n        typeof value.outcomeId === \"string\" &&\n        typeof value.name === \"string\" &&\n        typeof value.expectation === \"string\" &&\n        (value.status === \"passed\" ||\n          value.status === \"failed\" ||\n          value.status === \"unknown\" ||\n          value.status === \"skipped\") &&\n        typeof value.observedAt === \"number\"\n      );\n    }\n    default:\n      return false;\n  }\n}\n","/**\n * v0.2 shared duration utilities.\n *\n * `parseDuration` is used for filters such as \"since\" / \"older-than\".\n * `formatDuration` is used for compact display in CLI and summaries.\n */\n\nexport function parseDuration(duration: string): number {\n  const raw = typeof duration === \"string\" ? duration.trim() : \"\";\n  const match = raw.match(/^(\\d+)(ms|[smhd])$/);\n  if (!match) {\n    throw new Error(\n      `Invalid duration format: ${duration}. Use a positive integer followed by ms, s, m, h, or d (e.g. 500ms, 30s, 5m, 2h, 7d).`,\n    );\n  }\n\n  const amount = Number.parseInt(match[1], 10);\n  const unit = match[2];\n\n  if (!Number.isFinite(amount) || amount <= 0) {\n    throw new Error(\n      `Invalid duration amount: ${duration}. Amount must be a positive integer.`,\n    );\n  }\n\n  switch (unit) {\n    case \"ms\":\n      return amount;\n    case \"s\":\n      return amount * 1000;\n    case \"m\":\n      return amount * 60 * 1000;\n    case \"h\":\n      return amount * 60 * 60 * 1000;\n    case \"d\":\n      return amount * 24 * 60 * 60 * 1000;\n    default: {\n      // Should be unreachable due to regex.\n      throw new Error(`Unknown duration unit: ${unit}`);\n    }\n  }\n}\n\nexport function formatDuration(ms: number): string {\n  if (!Number.isFinite(ms)) {\n    return \"0ms\";\n  }\n  if (ms < 0) {\n    throw new Error(`formatDuration: ms must be non-negative (got ${ms})`);\n  }\n  if (ms < 1000) {\n    return `${Math.floor(ms)}ms`;\n  }\n  if (ms < 60_000) {\n    return `${(ms / 1000).toFixed(2)}s`;\n  }\n  if (ms < 3_600_000) {\n    return `${(ms / 60_000).toFixed(1)}m`;\n  }\n  return `${(ms / 3_600_000).toFixed(1)}h`;\n}\n\n","import { appendFile, mkdir, writeFile } from \"node:fs/promises\";\n\n/** POSIX mode requested for newly created built-in raw trace directories. */\nexport const TRACE_DIR_MODE = 0o700;\n\n/** POSIX mode requested for newly created built-in raw trace JSONL files. */\nexport const TRACE_FILE_MODE = 0o600;\n\n/**\n * Creates a trace directory recursively with {@link TRACE_DIR_MODE}.\n * Mode applies only to newly created path components; existing directories are not chmodded.\n */\nexport async function mkdirTraceDir(dirPath: string): Promise<void> {\n  await mkdir(dirPath, { recursive: true, mode: TRACE_DIR_MODE });\n}\n\n/**\n * Creates or truncates an empty UTF-8 trace file with {@link TRACE_FILE_MODE}.\n * Mode applies only when the file is created; existing files are not chmodded.\n */\nexport async function createEmptyTraceFile(filePath: string): Promise<void> {\n  await writeFile(filePath, \"\", { encoding: \"utf-8\", mode: TRACE_FILE_MODE });\n}\n\n/**\n * Appends UTF-8 data to a trace file, creating it with {@link TRACE_FILE_MODE} when missing.\n * Mode applies only on create; existing files are not chmodded.\n */\nexport async function appendTraceFile(filePath: string, data: string): Promise<void> {\n  await appendFile(filePath, data, { encoding: \"utf-8\", mode: TRACE_FILE_MODE });\n}\n","import os from \"node:os\";\nimport path from \"node:path\";\n\nimport { nanoid } from \"nanoid\";\n\nimport { mkdirTraceDir } from \"./trace-filesystem.js\";\nimport type { ErrorInfo } from \"./types.js\";\nimport { formatDuration as formatDurationV2 } from \"./utils/duration.js\";\n\n/** Default folder under the user home for AgentInspect data. */\nexport const DEFAULT_TRACE_DIR_NAME = \".agent-inspect\";\n\n/** Subfolder where JSONL run traces are stored. */\nexport const RUNS_DIR_NAME = \"runs\";\n\n/** Writable trace root when the default home path cannot be used. */\nexport const FALLBACK_TRACE_DIR = path.join(\n  os.tmpdir(),\n  \"agent-inspect\",\n  RUNS_DIR_NAME,\n);\n\n/** Maximum display length for run/step names before truncation. */\nexport const MAX_NAME_LENGTH = 100;\n\n/** Returns `run_` + a 10-character nanoid segment. */\nexport function createRunId(): string {\n  return `run_${nanoid(10)}`;\n}\n\n/** Returns `step_` + a 10-character nanoid segment. */\nexport function createStepId(): string {\n  return `step_${nanoid(10)}`;\n}\n\n/** Formats a duration for CLI display (v0.2 rules). */\nexport function formatDuration(ms: number): string {\n  return formatDurationV2(ms);\n}\n\n/**\n * Formats a Unix timestamp (ms) as local `YYYY-MM-DD HH:mm:ss`.\n * Invalid values yield `\"Invalid date\"` (no throw).\n */\nexport function formatTimestamp(timestamp: number): string {\n  if (!Number.isFinite(timestamp)) {\n    return \"Invalid date\";\n  }\n  const d = new Date(timestamp);\n  if (Number.isNaN(d.getTime())) {\n    return \"Invalid date\";\n  }\n  const y = d.getFullYear();\n  const mo = String(d.getMonth() + 1).padStart(2, \"0\");\n  const day = String(d.getDate()).padStart(2, \"0\");\n  const h = String(d.getHours()).padStart(2, \"0\");\n  const min = String(d.getMinutes()).padStart(2, \"0\");\n  const s = String(d.getSeconds()).padStart(2, \"0\");\n  return `${y}-${mo}-${day} ${h}:${min}:${s}`;\n}\n\n/**\n * Default directory for trace files: `~/DEFAULT_TRACE_DIR_NAME/RUNS_DIR_NAME`.\n * Falls back to {@link FALLBACK_TRACE_DIR} when home cannot be resolved.\n */\nexport function getDefaultTraceDir(): string {\n  const envDir = process.env.AGENT_INSPECT_TRACE_DIR;\n  if (typeof envDir === \"string\" && envDir.trim() !== \"\") {\n    return envDir.trim();\n  }\n  try {\n    const home = os.homedir();\n    if (typeof home !== \"string\" || home.trim() === \"\") {\n      return FALLBACK_TRACE_DIR;\n    }\n    return path.join(home, DEFAULT_TRACE_DIR_NAME, RUNS_DIR_NAME);\n  } catch {\n    return FALLBACK_TRACE_DIR;\n  }\n}\n\n/**\n * Full path to the JSONL trace file for a run.\n * `runId` is passed through `path.basename` to avoid traversal; empty ids become `run_unknown`.\n */\nexport function getTraceFilePath(runId: string, traceDir?: string): string {\n  const baseDir = traceDir ?? getDefaultTraceDir();\n  let safeId =\n    typeof runId === \"string\" && runId.trim() !== \"\" ? runId.trim() : \"run_unknown\";\n  safeId = path.basename(safeId);\n  if (safeId === \"\" || safeId === \".\" || safeId === \"..\") {\n    safeId = \"run_unknown\";\n  }\n  return path.join(baseDir, `${safeId}.jsonl`);\n}\n\n/**\n * Ensures a trace directory exists (recursive). Tries {@link FALLBACK_TRACE_DIR} on failure.\n * Returns the directory path that callers should prefer: primary, fallback, or original if both mkdir attempts fail.\n * Emits concise `[AgentInspect]` warnings on failure; never throws.\n */\nexport async function ensureTraceDir(traceDir: string): Promise<string> {\n  const primary = path.resolve(traceDir);\n  try {\n    await mkdirTraceDir(primary);\n    return primary;\n  } catch {\n    warn(`Failed to create trace directory: ${primary}`);\n    const fallback = path.resolve(FALLBACK_TRACE_DIR);\n    try {\n      await mkdirTraceDir(fallback);\n      return fallback;\n    } catch {\n      warn(`Failed to create fallback trace directory: ${fallback}`);\n      return primary;\n    }\n  }\n}\n\n/**\n * Normalizes any thrown/caught value into {@link ErrorInfo}.\n * Never throws (circular structures and non-JSON values fall back to a generic message).\n */\nexport function formatError(error: unknown): ErrorInfo {\n  if (error instanceof Error) {\n    const out: ErrorInfo = { message: error.message };\n    if (typeof error.stack === \"string\" && error.stack.length > 0) {\n      out.stack = error.stack;\n    }\n    return out;\n  }\n  if (typeof error === \"string\") {\n    return { message: error };\n  }\n  if (error === null) {\n    return { message: \"Unknown error: null\" };\n  }\n  if (error === undefined) {\n    return { message: \"Unknown error: undefined\" };\n  }\n  if (\n    typeof error === \"number\" ||\n    typeof error === \"boolean\" ||\n    typeof error === \"bigint\"\n  ) {\n    return { message: String(error) };\n  }\n  if (typeof error === \"object\") {\n    try {\n      return { message: JSON.stringify(error) };\n    } catch {\n      return { message: \"Unknown error\" };\n    }\n  }\n  return { message: \"Unknown error\" };\n}\n\n/**\n * Truncates a display name to `maxLength`, appending `\"...\"` when shortened.\n * Empty or non-string input becomes `\"unnamed\"`.\n */\nexport function truncateName(name: string, maxLength = MAX_NAME_LENGTH): string {\n  if (typeof name !== \"string\" || name.trim() === \"\") {\n    return \"unnamed\";\n  }\n  const trimmed = name.trim();\n  if (trimmed.length <= maxLength) {\n    return trimmed;\n  }\n  const ellipsis = \"...\";\n  const head = Math.max(0, maxLength - ellipsis.length);\n  return `${trimmed.slice(0, head)}${ellipsis}`;\n}\n\n/**\n * Instrumentation-only warning to stderr. Not a general-purpose logger.\n * Optional `error` is summarized via {@link formatError} (message only).\n */\nexport function warn(message: string, error?: unknown): void {\n  const base = `[AgentInspect] ${message}`;\n  if (error === undefined) {\n    console.warn(base);\n    return;\n  }\n  console.warn(`${base}: ${formatError(error).message}`);\n}\n","import { persistedInspectEventToTraceEvents } from \"./persisted/to-trace-event.js\";\nimport { isPersistedInspectEvent } from \"./types/persisted-inspect-event.js\";\nimport type { PersistedInspectEvent } from \"./types/persisted-inspect-event.js\";\nimport { isTraceEvent } from \"./types.js\";\nimport type { TraceEvent } from \"./types.js\";\nimport { warn } from \"./utils.js\";\n\nexport type TraceJsonlFormat = \"0.1\" | \"0.2\" | \"1.0\" | \"mixed\" | \"empty\";\n\nexport type ParsedTraceJsonlRow =\n  | { format: \"0.1\"; event: TraceEvent; sourceLine: number }\n  | { format: \"0.2\"; event: PersistedInspectEvent; sourceLine: number }\n  | { format: \"1.0\"; event: PersistedInspectEvent; sourceLine: number };\n\nexport interface ParseTraceJsonlResult {\n  format: TraceJsonlFormat;\n  /** Count of valid source JSONL rows before any one-to-many normalization. */\n  sourceEventCount: number;\n  events: TraceEvent[];\n  persisted: PersistedInspectEvent[];\n  /** Valid source rows in JSONL order, before cross-version normalization. */\n  rows: ParsedTraceJsonlRow[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction detectLineFormat(parsed: unknown): \"0.1\" | \"0.2\" | \"1.0\" | \"unknown\" {\n  if (!isRecord(parsed)) return \"unknown\";\n  if (parsed.schemaVersion === \"0.1\") return \"0.1\";\n  if (parsed.schemaVersion === \"0.2\") return \"0.2\";\n  if (parsed.schemaVersion === \"1.0\") return \"1.0\";\n  return \"unknown\";\n}\n\nexport interface ParseTraceJsonlOptions {\n  validate?: (value: unknown) => value is TraceEvent;\n  /** Emit parse warnings through the standard AgentInspect warning channel (default true). */\n  warnings?: boolean;\n}\n\n/**\n * Parses JSONL content into normalized v0.1 {@link TraceEvent} rows.\n * Accepts homogenous v0.1, v0.2, or v1.0 files; mixed files are converted with a warning.\n */\nexport function parseTraceJsonl(\n  raw: string,\n  options: ParseTraceJsonlOptions = {},\n): ParseTraceJsonlResult {\n  const validate = options.validate ?? isTraceEvent;\n  const emitWarning = (message: string): void => {\n    if (options.warnings !== false) warn(message);\n  };\n  const persisted: PersistedInspectEvent[] = [];\n  const traceEvents: TraceEvent[] = [];\n  const rows: ParsedTraceJsonlRow[] = [];\n  let sourceEventCount = 0;\n  let saw01 = false;\n  let saw02 = false;\n  let saw10 = false;\n  let lineNumber = 0;\n\n  for (const line of raw.split(/\\r?\\n/)) {\n    lineNumber += 1;\n    const trimmed = line.trim();\n    if (trimmed === \"\") continue;\n\n    let parsed: unknown;\n    try {\n      parsed = JSON.parse(trimmed) as unknown;\n    } catch {\n      emitWarning(\"Skipped invalid JSON line in trace file\");\n      continue;\n    }\n\n    const format = detectLineFormat(parsed);\n    if (format === \"0.1\") {\n      saw01 = true;\n      if (validate(parsed)) {\n        sourceEventCount += 1;\n        traceEvents.push(parsed);\n        rows.push({ format: \"0.1\", event: parsed, sourceLine: lineNumber });\n      } else {\n        emitWarning(\"Skipped invalid trace event line in trace file\");\n      }\n      continue;\n    }\n\n    if (format === \"0.2\" || format === \"1.0\") {\n      if (format === \"0.2\") saw02 = true;\n      else saw10 = true;\n      if (isPersistedInspectEvent(parsed)) {\n        sourceEventCount += 1;\n        persisted.push(parsed);\n        rows.push({ format, event: parsed, sourceLine: lineNumber });\n        traceEvents.push(...persistedInspectEventToTraceEvents(parsed));\n      } else {\n        emitWarning(\"Skipped invalid persisted inspect event line in trace file\");\n      }\n      continue;\n    }\n\n    emitWarning(\"Skipped trace line with unknown schemaVersion\");\n  }\n\n  const seenFormats = [saw01, saw02, saw10].filter(Boolean).length;\n  if (seenFormats > 1) {\n    emitWarning(\n      \"Trace file mixes AgentInspect schemaVersion rows; normalizing all rows\",\n    );\n  }\n\n  let format: TraceJsonlFormat = \"empty\";\n  if (seenFormats > 1) format = \"mixed\";\n  else if (saw01) format = \"0.1\";\n  else if (saw02) format = \"0.2\";\n  else if (saw10) format = \"1.0\";\n\n  return { format, sourceEventCount, events: traceEvents, persisted, rows };\n}\n\n/**\n * Returns a user-facing message when a trace file uses an unsupported schema version.\n */\nexport function unknownTraceFormatMessage(): string {\n  return (\n    \"Unsupported trace format. Expected schemaVersion 0.1 (TraceEvent), 0.2 (PersistedInspectEvent), or 1.0 (PersistedInspectEvent).\"\n  );\n}\n"]}