@lelemondev/sdk 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/transport.ts","../src/parser.ts","../src/tracer.ts"],"names":[],"mappings":";;;;;;AAaO,IAAM,YAAN,MAAgB;AAAA,EAGrB,YAAY,MAAA,EAAyB;AAFrC,IAAA,aAAA,CAAA,IAAA,EAAQ,QAAA,CAAA;AAGN,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAqB;AACnB,IAAA,OAAO,CAAC,IAAA,CAAK,MAAA,CAAO,YAAY,CAAC,CAAC,KAAK,MAAA,CAAO,MAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,IAAA,EAAmD;AACnE,IAAA,OAAO,IAAA,CAAK,OAAA,CAAwB,MAAA,EAAQ,gBAAA,EAAkB,IAAI,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,OAAA,EAAiB,IAAA,EAA2C;AAC9E,IAAA,MAAM,KAAK,OAAA,CAAQ,OAAA,EAAS,CAAA,eAAA,EAAkB,OAAO,IAAI,IAAI,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,OAAA,CAAW,MAAA,EAAgB,IAAA,EAAc,IAAA,EAA4B;AACjF,IAAA,IAAI,IAAA,CAAK,OAAO,QAAA,EAAU;AACxB,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,MAAM,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,QAAQ,GAAG,IAAI,CAAA,CAAA;AAE1C,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,OAAA,CAAQ,IAAI,CAAA,UAAA,EAAa,MAAM,CAAA,CAAA,EAAI,GAAG,IAAI,IAAI,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAChC,MAAA;AAAA,QACA,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAAA,SAC7C;AAAA,QACA,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA;AAAA,OACrC,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAClC,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,SAAS,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AAAA,MAClE;AAGA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACxB,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAAA,MAClD;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF,CAAA;;;AC5CA,SAAS,eAAe,QAAA,EAAkD;AACxE,EAAA,IAAI,CAAC,QAAA,CAAS,MAAA,EAAQ,OAAO,KAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA;AAExB,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,KAAA,KAAU,QACV,MAAA,IAAU,KAAA,IACV,CAAC,QAAA,EAAU,QAAQ,WAAA,EAAa,MAAM,CAAA,CAAE,QAAA,CAAS,MAAM,IAAc,CAAA;AAEzE;AAKA,SAAS,kBAAkB,QAAA,EAAqD;AAC9E,EAAA,IAAI,CAAC,QAAA,CAAS,MAAA,EAAQ,OAAO,KAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA;AAExB,EAAA,OACE,OAAO,UAAU,QAAA,IACjB,KAAA,KAAU,QACV,MAAA,IAAU,KAAA,IACV,CAAC,MAAA,EAAQ,WAAW,CAAA,CAAE,SAAS,KAAA,CAAM,IAAc,MAClD,OAAO,KAAA,CAAM,YAAY,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,CAAA;AAErE;AAKA,SAAS,eAAe,QAAA,EAAkD;AACxE,EAAA,IAAI,CAAC,QAAA,CAAS,MAAA,EAAQ,OAAO,KAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,SAAS,CAAC,CAAA;AAExB,EAAA,OACE,OAAO,UAAU,QAAA,IACjB,KAAA,KAAU,QACV,MAAA,IAAU,KAAA,IACV,CAAC,MAAA,EAAQ,OAAO,EAAE,QAAA,CAAS,KAAA,CAAM,IAAc,CAAA,IAC/C,OAAA,IAAW,SACX,KAAA,CAAM,OAAA,CAAQ,MAAM,KAAK,CAAA;AAE7B;AAKA,SAAS,YAAY,QAAA,EAAwC;AAC3D,EAAA,MAAM,MAAA,GAAsB;AAAA,IAC1B,UAAU,EAAC;AAAA,IACX,WAAW,EAAC;AAAA,IACZ,gBAAA,EAAkB,CAAA;AAAA,IAClB,iBAAA,EAAmB,CAAA;AAAA,IACnB,QAAQ,EAAC;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACzB,MAAA,MAAA,CAAO,YAAA,GAAe,IAAI,OAAA,IAAW,MAAA;AAAA,IACvC,WAAW,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,CAAC,OAAO,SAAA,EAAW;AACnD,MAAA,MAAA,CAAO,SAAA,GAAY,IAAI,OAAA,IAAW,MAAA;AAAA,IACpC,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,WAAA,EAAa;AAEnC,MAAA,MAAM,OAAA,GAAyB;AAAA,QAC7B,QAAA,EAAU,QAAA;AAAA,QACV,QAAQ,GAAA,CAAI;AAAA,OACd;AAGA,MAAA,IAAI,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AAC/C,QAAA,OAAA,CAAQ,SAAA,GAAY,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAC,EAAA,MAAwB;AAAA,UAC9D,IAAA,EAAM,GAAG,QAAA,CAAS,IAAA;AAAA,UAClB,KAAA,EAAO,aAAA,CAAc,EAAA,CAAG,QAAA,CAAS,SAAS;AAAA,SAC5C,CAAE,CAAA;AAGF,QAAA,KAAA,MAAW,EAAA,IAAM,IAAI,UAAA,EAAY;AAC/B,UAAA,MAAA,CAAO,UAAU,IAAA,CAAK;AAAA,YACpB,IAAA,EAAM,GAAG,QAAA,CAAS,IAAA;AAAA,YAClB,KAAA,EAAO,aAAA,CAAc,EAAA,CAAG,QAAA,CAAS,SAAS;AAAA,WAC3C,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,QAAA,CAAS,KAAK,OAAO,CAAA;AAG5B,MAAA,IAAI,IAAI,OAAA,EAAS;AACf,QAAA,MAAA,CAAO,SAAS,GAAA,CAAI,OAAA;AAAA,MACtB;AAAA,IACF,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,MAAA,EAAQ;AAE9B,MAAA,MAAM,eAAe,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,SAAA,CAAU,SAAS,CAAC,CAAA;AACjE,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,YAAA,CAAa,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,OAAA,IAAW,EAAE,CAAA;AAAA,MACvD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,eAAe,QAAA,EAA2C;AACjE,EAAA,MAAM,MAAA,GAAsB;AAAA,IAC1B,UAAU,EAAC;AAAA,IACX,WAAW,EAAC;AAAA,IACZ,gBAAA,EAAkB,CAAA;AAAA,IAClB,iBAAA,EAAmB,CAAA;AAAA,IACnB,QAAQ,EAAC;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AAEvB,MAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,QAAA,IAAI,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,EAAU;AACnC,UAAA,MAAA,CAAO,YAAY,GAAA,CAAI,OAAA;AAAA,QACzB,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACrC,UAAA,MAAM,WAAA,GAAc,IAAI,OAAA,CAAQ,IAAA;AAAA,YAC9B,CAAC,CAAA,KAAwB,CAAA,CAAE,IAAA,KAAS;AAAA,WACtC;AACA,UAAA,IAAI,WAAA,IAAe,UAAU,WAAA,EAAa;AACxC,YAAA,MAAA,CAAO,YAAY,WAAA,CAAY,IAAA;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AAC9B,QAAA,KAAA,MAAW,KAAA,IAAS,IAAI,OAAA,EAA+B;AACrD,UAAA,IAAI,KAAA,CAAM,IAAA,KAAS,aAAA,IAAiB,KAAA,CAAM,WAAA,EAAa;AAErD,YAAA,MAAM,QAAA,GAAW,OAAO,SAAA,CAAU,IAAA;AAAA,cAChC,CAAC,EAAA,KAAQ,EAAA,CAAkC,EAAA,KAAO,KAAA,CAAM;AAAA,aAC1D;AACA,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,QAAA,CAAS,SAAS,KAAA,CAAM,OAAA;AAAA,YAC1B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,WAAA,EAAa;AACnC,MAAA,MAAM,OAAA,GAAyB;AAAA,QAC7B,QAAA,EAAU;AAAA,OACZ;AAEA,MAAA,IAAI,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,EAAU;AACnC,QAAA,OAAA,CAAQ,SAAS,GAAA,CAAI,OAAA;AACrB,QAAA,MAAA,CAAO,SAAS,GAAA,CAAI,OAAA;AAAA,MACtB,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AACrC,QAAA,MAAM,UAAoB,EAAC;AAC3B,QAAA,MAAM,YAA8B,EAAC;AAErC,QAAA,KAAA,MAAW,KAAA,IAAS,IAAI,OAAA,EAA+B;AACrD,UAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,IAAA,EAAM;AACvC,YAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,UACzB,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,UAAA,IAAc,MAAM,IAAA,EAAM;AAClD,YAAA,MAAM,EAAA,GAAuC;AAAA,cAC3C,MAAM,KAAA,CAAM,IAAA;AAAA,cACZ,OAAO,KAAA,CAAM;AAAA,aACf;AACA,YAAA,IAAI,MAAM,EAAA,EAAI;AACZ,cAAA,EAAA,CAAG,KAAK,KAAA,CAAM,EAAA;AAAA,YAChB;AACA,YAAA,SAAA,CAAU,KAAK,EAAE,CAAA;AACjB,YAAA,MAAA,CAAO,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,UAC1B;AAAA,QACF;AAEA,QAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,UAAA,OAAA,CAAQ,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAClC,UAAA,MAAA,CAAO,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAAA,QACnC;AACA,QAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,UAAA,OAAA,CAAQ,SAAA,GAAY,SAAA;AAAA,QACtB;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IAC9B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,YAAY,QAAA,EAAwC;AAC3D,EAAA,MAAM,MAAA,GAAsB;AAAA,IAC1B,UAAU,EAAC;AAAA,IACX,WAAW,EAAC;AAAA,IACZ,gBAAA,EAAkB,CAAA;AAAA,IAClB,iBAAA,EAAmB,CAAA;AAAA,IACnB,QAAQ,EAAC;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,IAAI,GAAA,CAAI,SAAS,MAAA,EAAQ;AAEvB,MAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,QAAA,MAAM,WAAW,GAAA,CAAI,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAC7C,QAAA,IAAI,UAAU,IAAA,EAAM;AAClB,UAAA,MAAA,CAAO,YAAY,QAAA,CAAS,IAAA;AAAA,QAC9B;AAAA,MACF;AAGA,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,KAAA,EAAO;AAC5B,QAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,UAAA,MAAM,QAAA,GAAW,OAAO,SAAA,CAAU,IAAA;AAAA,YAChC,CAAC,EAAA,KAAO,EAAA,CAAG,IAAA,KAAS,KAAK,gBAAA,CAAkB;AAAA,WAC7C;AACA,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,QAAA,CAAS,MAAA,GAAS,KAAK,gBAAA,CAAiB,QAAA;AAAA,UAC1C;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,OAAA,EAAS;AAC/B,MAAA,MAAM,OAAA,GAAyB;AAAA,QAC7B,QAAA,EAAU;AAAA,OACZ;AAEA,MAAA,MAAM,UAAoB,EAAC;AAC3B,MAAA,MAAM,YAA8B,EAAC;AAErC,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,KAAA,EAAO;AAC5B,QAAA,IAAI,KAAK,IAAA,EAAM;AACb,UAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,QACxB,CAAA,MAAA,IAAW,KAAK,YAAA,EAAc;AAC5B,UAAA,MAAM,EAAA,GAAqB;AAAA,YACzB,IAAA,EAAM,KAAK,YAAA,CAAa,IAAA;AAAA,YACxB,KAAA,EAAO,KAAK,YAAA,CAAa;AAAA,WAC3B;AACA,UAAA,SAAA,CAAU,KAAK,EAAE,CAAA;AACjB,UAAA,MAAA,CAAO,SAAA,CAAU,KAAK,EAAE,CAAA;AAAA,QAC1B;AAAA,MACF;AAEA,MAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,QAAA,OAAA,CAAQ,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAClC,QAAA,MAAA,CAAO,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAAA,MACnC;AACA,MAAA,IAAI,UAAU,MAAA,EAAQ;AACpB,QAAA,OAAA,CAAQ,SAAA,GAAY,SAAA;AAAA,MACtB;AAEA,MAAA,MAAA,CAAO,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IAC9B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,cAAc,GAAA,EAAsB;AAC3C,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,GAAA;AAAA,EACT;AACF;AAKO,SAAS,cAAc,QAAA,EAAgC;AAE5D,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO;AAAA,MACL,UAAU,EAAC;AAAA,MACX,WAAW,EAAC;AAAA,MACZ,gBAAA,EAAkB,CAAA;AAAA,MAClB,iBAAA,EAAmB,CAAA;AAAA,MACnB,QAAQ,EAAC;AAAA,MACT,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC5B,IAAA,OAAO;AAAA,MACL,UAAU,EAAC;AAAA,MACX,WAAW,EAAC;AAAA,MACZ,gBAAA,EAAkB,CAAA;AAAA,MAClB,iBAAA,EAAmB,CAAA;AAAA,MACnB,QAAQ,EAAC;AAAA,MACT,QAAA,EAAU,SAAA;AAAA,MACV,QAAQ,OAAO,QAAA,KAAa,WAAW,QAAA,GAAW,IAAA,CAAK,UAAU,QAAQ;AAAA,KAC3E;AAAA,EACF;AAGA,EAAA,IAAI,cAAA,CAAe,QAAQ,CAAA,EAAG;AAC5B,IAAA,OAAO,YAAY,QAAQ,CAAA;AAAA,EAC7B,CAAA,MAAA,IAAW,cAAA,CAAe,QAAQ,CAAA,EAAG;AACnC,IAAA,OAAO,YAAY,QAAQ,CAAA;AAAA,EAC7B,CAAA,MAAA,IAAW,iBAAA,CAAkB,QAAQ,CAAA,EAAG;AACtC,IAAA,OAAO,eAAe,QAAQ,CAAA;AAAA,EAChC;AAGA,EAAA,OAAO;AAAA,IACL,UAAU,EAAC;AAAA,IACX,WAAW,EAAC;AAAA,IACZ,gBAAA,EAAkB,CAAA;AAAA,IAClB,iBAAA,EAAmB,CAAA;AAAA,IACnB,QAAQ,EAAC;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AACF;AAMO,SAAS,cAAc,QAAA,EAA2C;AACvE,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC7C,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,GAAA,GAAM,QAAA;AACZ,EAAA,MAAM,SAAiC,EAAC;AAGxC,EAAA,IAAI,WAAW,GAAA,EAAK;AAClB,IAAA,MAAA,CAAO,QAAQ,GAAA,CAAI,KAAA;AAAA,EACrB;AAEA,EAAA,IAAI,aAAa,GAAA,EAAK;AACpB,IAAA,MAAA,CAAO,QAAQ,GAAA,CAAI,OAAA;AAAA,EACrB;AAGA,EAAA,IAAI,OAAA,IAAW,OAAO,OAAO,GAAA,CAAI,UAAU,QAAA,IAAY,GAAA,CAAI,UAAU,IAAA,EAAM;AACzE,IAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAGlB,IAAA,MAAA,CAAO,WAAA,GAAc,KAAA,CAAM,aAAA,IAAiB,KAAA,CAAM,YAAA;AAClD,IAAA,MAAA,CAAO,YAAA,GAAe,KAAA,CAAM,iBAAA,IAAqB,KAAA,CAAM,aAAA;AAAA,EACzD;AAGA,EAAA,IAAI,WAAA,IAAe,GAAA,IAAO,OAAA,IAAW,GAAA,EAAK;AACxC,IAAA,MAAA,CAAO,QAAA,GAAW,SAAA;AAAA,EACpB;AAGA,EAAA,IAAI,mBAAA,IAAuB,GAAA,IAAO,kCAAA,IAAsC,GAAA,EAAK;AAC3E,IAAA,MAAA,CAAO,QAAA,GAAW,SAAA;AAAA,EACpB;AAGA,EAAA,IAAI,YAAA,IAAgB,GAAA,IAAO,gBAAA,IAAoB,GAAA,EAAK;AAClD,IAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAElB,IAAA,IAAI,eAAA,IAAmB,OAAO,OAAO,GAAA,CAAI,kBAAkB,QAAA,IAAY,GAAA,CAAI,kBAAkB,IAAA,EAAM;AACjG,MAAA,MAAM,QAAQ,GAAA,CAAI,aAAA;AAClB,MAAA,MAAA,CAAO,cAAc,KAAA,CAAM,gBAAA;AAC3B,MAAA,MAAA,CAAO,eAAe,KAAA,CAAM,oBAAA;AAAA,IAC9B;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,KAAA,IAAS,CAAC,MAAA,CAAO,QAAA,EAAU;AACpC,IAAA,IAAI,MAAA,CAAO,MAAM,UAAA,CAAW,KAAK,KAAK,MAAA,CAAO,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA,EAAG;AACnE,MAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAAA,IACpB,CAAA,MAAA,IAAW,MAAA,CAAO,KAAA,CAAM,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5C,MAAA,MAAA,CAAO,QAAA,GAAW,WAAA;AAAA,IACpB,CAAA,MAAA,IAAW,MAAA,CAAO,KAAA,CAAM,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5C,MAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAAA,IACpB,CAAA,MAAA,IACE,MAAA,CAAO,KAAA,CAAM,UAAA,CAAW,YAAY,CAAA,IACpC,MAAA,CAAO,KAAA,CAAM,UAAA,CAAW,SAAS,CAAA,IACjC,MAAA,CAAO,MAAM,UAAA,CAAW,OAAO,CAAA,IAC/B,MAAA,CAAO,KAAA,CAAM,UAAA,CAAW,SAAS,CAAA,IACjC,MAAA,CAAO,KAAA,CAAM,UAAA,CAAW,UAAU,CAAA,IAClC,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EACzB;AACA,MAAA,MAAA,CAAO,QAAA,GAAW,SAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,qBAAqB,IAAA,EAAuC;AAC1E,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,GAAA,GAAM,IAAA;AACZ,EAAA,MAAM,MAAA,GAAiC,EAAE,QAAA,EAAU,SAAA,EAAU;AAG7D,EAAA,IAAI,OAAA,IAAW,OAAO,OAAO,GAAA,CAAI,UAAU,QAAA,IAAY,GAAA,CAAI,UAAU,IAAA,EAAM;AACzE,IAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,IAAA,MAAA,CAAO,cAAc,KAAA,CAAM,YAAA;AAC3B,IAAA,MAAA,CAAO,eAAe,KAAA,CAAM,aAAA;AAAA,EAC9B;AAGA,EAAA,IAAI,sCAAsC,GAAA,EAAK;AAC7C,IAAA,MAAM,OAAA,GAAU,IAAI,kCAAkC,CAAA;AACtD,IAAA,IAAI,OAAA,CAAQ,eAAA,EAAiB,MAAA,CAAO,WAAA,GAAc,OAAA,CAAQ,eAAA;AAC1D,IAAA,IAAI,OAAA,CAAQ,gBAAA,EAAkB,MAAA,CAAO,YAAA,GAAe,OAAA,CAAQ,gBAAA;AAAA,EAC9D;AAEA,EAAA,OAAO,MAAA;AACT;;;ACxbA,IAAM,gBAAA,GAAmB,yBAAA;AAGzB,IAAI,eAA8B,EAAC;AACnC,IAAI,eAAA,GAAoC,IAAA;AAMjC,SAAS,IAAA,CAAK,MAAA,GAAwB,EAAC,EAAS;AACrD,EAAA,YAAA,GAAe,MAAA;AACf,EAAA,eAAA,GAAkB,gBAAgB,MAAM,CAAA;AAC1C;AAKA,SAAS,gBAAgB,MAAA,EAAkC;AACzD,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,IAAU,SAAA,CAAU,iBAAiB,CAAA;AAE3D,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,QAAA,EAAU;AAC/B,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAI,SAAA,CAAU;AAAA,IACnB,QAAQ,MAAA,IAAU,EAAA;AAAA,IAClB,QAAA,EAAU,OAAO,QAAA,IAAY,gBAAA;AAAA,IAC7B,KAAA,EAAO,OAAO,KAAA,IAAS,KAAA;AAAA,IACvB,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,CAAC;AAAA,GAC/B,CAAA;AACH;AAKA,SAAS,YAAA,GAA0B;AACjC,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,eAAA,GAAkB,gBAAgB,YAAY,CAAA;AAAA,EAChD;AACA,EAAA,OAAO,eAAA;AACT;AAKA,SAAS,UAAU,IAAA,EAAkC;AACnD,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAK;AACjD,IAAA,OAAO,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,EACzB;AACA,EAAA,OAAO,MAAA;AACT;AAKO,IAAM,QAAN,MAAY;AAAA,EAUjB,WAAA,CAAY,OAAA,EAAuB,SAAA,EAAsB,KAAA,EAAgB,QAAA,EAAmB;AAT5F,IAAA,aAAA,CAAA,IAAA,EAAQ,IAAA,EAAoB,IAAA,CAAA;AAC5B,IAAA,aAAA,CAAA,IAAA,EAAQ,WAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,SAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,WAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,WAAA,EAAY,KAAA,CAAA;AACpB,IAAA,aAAA,CAAA,IAAA,EAAQ,OAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,UAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,YAA4B,EAAC,CAAA;AAGnC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,GAAA,EAAI;AAC1B,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,KAAK,QAAA,EAAU;AAEnB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,CAAU,WAAA,CAAY;AAAA,QAC9C,IAAA,EAAM,KAAK,OAAA,CAAQ,IAAA;AAAA,QACnB,SAAA,EAAW,KAAK,OAAA,CAAQ,SAAA;AAAA,QACxB,MAAA,EAAQ,KAAK,OAAA,CAAQ,MAAA;AAAA,QACrB,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,QACpB,QAAA,EAAU,KAAK,OAAA,CAAQ,QAAA;AAAA,QACvB,IAAA,EAAM,KAAK,OAAA,CAAQ;AAAA,OACpB,CAAA;AACD,MAAA,IAAA,CAAK,KAAK,MAAA,CAAO,EAAA;AAAA,IACnB,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,KAAK,CAAA;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,QAAA,EAAyB;AAC3B,IAAA,MAAM,MAAA,GAAS,cAAc,QAAQ,CAAA;AACrC,IAAA,IAAI,MAAA,CAAO,KAAA,IAAS,MAAA,CAAO,WAAA,IAAe,OAAO,YAAA,EAAc;AAC7D,MAAA,IAAA,CAAK,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,QAAA,EAAkC;AAC9C,IAAA,IAAI,KAAK,SAAA,EAAW;AACpB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAEjB,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,CAAC,IAAA,CAAK,EAAA,EAAI;AAE/B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,SAAA;AACrC,IAAA,MAAM,MAAA,GAAS,cAAc,QAAQ,CAAA;AAGrC,IAAA,MAAM,cAAc,CAAC,GAAG,KAAK,QAAA,EAAU,GAAG,OAAO,QAAQ,CAAA;AAGzD,IAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,IAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAE/B,IAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,MAAA,IAAI,IAAA,CAAK,WAAA,EAAa,gBAAA,IAAoB,IAAA,CAAK,WAAA;AAC/C,MAAA,IAAI,IAAA,CAAK,YAAA,EAAc,iBAAA,IAAqB,IAAA,CAAK,YAAA;AACjD,MAAA,IAAI,IAAA,CAAK,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,IACvC;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,IAAA,CAAK,EAAA,EAAI;AAAA,QAC1C,MAAA,EAAQ,WAAA;AAAA,QACR,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,QAAA,EAAU,WAAA;AAAA,QACV,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AAAA,QACzB,gBAAA;AAAA,QACA,iBAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,uCAAuC,GAAG,CAAA;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAA,CAAM,KAAA,EAAwB,QAAA,EAAmC;AACrE,IAAA,IAAI,KAAK,SAAA,EAAW;AACpB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAEjB,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,CAAC,IAAA,CAAK,EAAA,EAAI;AAE/B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,SAAA;AACrC,IAAA,MAAM,MAAA,GAAS,QAAA,GAAW,aAAA,CAAc,QAAQ,CAAA,GAAI,IAAA;AAEpD,IAAA,MAAM,QAAA,GAAW,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAGzE,IAAA,MAAM,WAAA,GAAc,MAAA,GAChB,CAAC,GAAG,IAAA,CAAK,UAAU,GAAG,MAAA,CAAO,QAAQ,CAAA,GACrC,IAAA,CAAK,QAAA;AAGT,IAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,IAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAE/B,IAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,MAAA,IAAI,IAAA,CAAK,WAAA,EAAa,gBAAA,IAAoB,IAAA,CAAK,WAAA;AAC/C,MAAA,IAAI,IAAA,CAAK,YAAA,EAAc,iBAAA,IAAqB,IAAA,CAAK,YAAA;AACjD,MAAA,IAAI,IAAA,CAAK,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,IACvC;AAEA,IAAA,MAAM,OAAA,GAAgC;AAAA,MACpC,MAAA,EAAQ,OAAA;AAAA,MACR,cAAc,QAAA,CAAS,OAAA;AAAA,MACvB,YAAY,QAAA,CAAS,KAAA;AAAA,MACrB,UAAA;AAAA,MACA,gBAAA;AAAA,MACA,iBAAA;AAAA,MACA,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,MAAM;AAAA,KAC3B;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAA,CAAQ,SAAS,MAAA,CAAO,MAAA;AACxB,MAAA,OAAA,CAAQ,eAAe,MAAA,CAAO,YAAA;AAC9B,MAAA,OAAA,CAAQ,QAAA,GAAW,WAAA;AACnB,MAAA,OAAA,CAAQ,YAAY,MAAA,CAAO,SAAA;AAAA,IAC7B;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,IAAA,CAAK,IAAI,OAAO,CAAA;AAAA,IACrD,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,uCAAuC,GAAG,CAAA;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AACF;AAgBO,SAAS,MAAM,OAAA,EAA8B;AAClD,EAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,EAAA,MAAM,KAAA,GAAQ,aAAa,KAAA,IAAS,KAAA;AACpC,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,IAAY,CAAC,UAAU,SAAA,EAAU;AAE/D,EAAA,MAAM,IAAI,IAAI,KAAA,CAAM,OAAA,EAAS,SAAA,EAAW,OAAO,QAAQ,CAAA;AAGvD,EAAA,CAAA,CAAE,IAAA,EAAK,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AACtB,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,GAAG,CAAA;AAAA,IACnD;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,CAAA;AACT","file":"index.mjs","sourcesContent":["/**\r\n * Transport layer for sending data to Lelemon API\r\n */\r\n\r\nimport type { CreateTraceRequest, CompleteTraceRequest } from './types';\r\n\r\ninterface TransportConfig {\r\n apiKey: string;\r\n endpoint: string;\r\n debug: boolean;\r\n disabled: boolean;\r\n}\r\n\r\nexport class Transport {\r\n private config: TransportConfig;\r\n\r\n constructor(config: TransportConfig) {\r\n this.config = config;\r\n }\r\n\r\n /**\r\n * Check if transport is enabled\r\n */\r\n isEnabled(): boolean {\r\n return !this.config.disabled && !!this.config.apiKey;\r\n }\r\n\r\n /**\r\n * Create a new trace\r\n */\r\n async createTrace(data: CreateTraceRequest): Promise<{ id: string }> {\r\n return this.request<{ id: string }>('POST', '/api/v1/traces', data);\r\n }\r\n\r\n /**\r\n * Complete a trace (success or error)\r\n */\r\n async completeTrace(traceId: string, data: CompleteTraceRequest): Promise<void> {\r\n await this.request('PATCH', `/api/v1/traces/${traceId}`, data);\r\n }\r\n\r\n /**\r\n * Make HTTP request to API\r\n */\r\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\r\n if (this.config.disabled) {\r\n return {} as T;\r\n }\r\n\r\n const url = `${this.config.endpoint}${path}`;\r\n\r\n if (this.config.debug) {\r\n console.log(`[Lelemon] ${method} ${url}`, body);\r\n }\r\n\r\n try {\r\n const response = await fetch(url, {\r\n method,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${this.config.apiKey}`,\r\n },\r\n body: body ? JSON.stringify(body) : undefined,\r\n });\r\n\r\n if (!response.ok) {\r\n const error = await response.text();\r\n throw new Error(`Lelemon API error: ${response.status} ${error}`);\r\n }\r\n\r\n // Handle empty responses\r\n const text = await response.text();\r\n if (!text) {\r\n return {} as T;\r\n }\r\n\r\n return JSON.parse(text);\r\n } catch (error) {\r\n if (this.config.debug) {\r\n console.error('[Lelemon] Request failed:', error);\r\n }\r\n throw error;\r\n }\r\n }\r\n}\r\n","/**\r\n * Message Parser\r\n * Auto-detects OpenAI/Anthropic/Gemini message formats and extracts relevant data\r\n */\r\n\r\nimport type {\r\n Message,\r\n OpenAIMessage,\r\n OpenAIToolCall,\r\n AnthropicMessage,\r\n AnthropicContent,\r\n ParsedTrace,\r\n ParsedLLMCall,\r\n ParsedToolCall,\r\n} from './types';\r\n\r\n// ============================================\r\n// GEMINI FORMAT\r\n// ============================================\r\n\r\ninterface GeminiMessage {\r\n role: 'user' | 'model';\r\n parts: GeminiPart[];\r\n}\r\n\r\ninterface GeminiPart {\r\n text?: string;\r\n functionCall?: {\r\n name: string;\r\n args: Record<string, unknown>;\r\n };\r\n functionResponse?: {\r\n name: string;\r\n response: unknown;\r\n };\r\n}\r\n\r\n/**\r\n * Detect if messages are in OpenAI format\r\n */\r\nfunction isOpenAIFormat(messages: unknown[]): messages is OpenAIMessage[] {\r\n if (!messages.length) return false;\r\n const first = messages[0] as Record<string, unknown>;\r\n // OpenAI has role: system/user/assistant/tool\r\n return (\r\n typeof first === 'object' &&\r\n first !== null &&\r\n 'role' in first &&\r\n ['system', 'user', 'assistant', 'tool'].includes(first.role as string)\r\n );\r\n}\r\n\r\n/**\r\n * Detect if messages are in Anthropic format\r\n */\r\nfunction isAnthropicFormat(messages: unknown[]): messages is AnthropicMessage[] {\r\n if (!messages.length) return false;\r\n const first = messages[0] as Record<string, unknown>;\r\n // Anthropic only has user/assistant, and content can be array\r\n return (\r\n typeof first === 'object' &&\r\n first !== null &&\r\n 'role' in first &&\r\n ['user', 'assistant'].includes(first.role as string) &&\r\n (typeof first.content === 'string' || Array.isArray(first.content))\r\n );\r\n}\r\n\r\n/**\r\n * Detect if messages are in Gemini format\r\n */\r\nfunction isGeminiFormat(messages: unknown[]): messages is GeminiMessage[] {\r\n if (!messages.length) return false;\r\n const first = messages[0] as Record<string, unknown>;\r\n // Gemini uses 'user' | 'model' and has 'parts' array\r\n return (\r\n typeof first === 'object' &&\r\n first !== null &&\r\n 'role' in first &&\r\n ['user', 'model'].includes(first.role as string) &&\r\n 'parts' in first &&\r\n Array.isArray(first.parts)\r\n );\r\n}\r\n\r\n/**\r\n * Parse OpenAI messages\r\n */\r\nfunction parseOpenAI(messages: OpenAIMessage[]): ParsedTrace {\r\n const result: ParsedTrace = {\r\n llmCalls: [],\r\n toolCalls: [],\r\n totalInputTokens: 0,\r\n totalOutputTokens: 0,\r\n models: [],\r\n provider: 'openai',\r\n };\r\n\r\n for (const msg of messages) {\r\n if (msg.role === 'system') {\r\n result.systemPrompt = msg.content ?? undefined;\r\n } else if (msg.role === 'user' && !result.userInput) {\r\n result.userInput = msg.content ?? undefined;\r\n } else if (msg.role === 'assistant') {\r\n // Track as LLM call\r\n const llmCall: ParsedLLMCall = {\r\n provider: 'openai',\r\n output: msg.content,\r\n };\r\n\r\n // Extract tool calls if present\r\n if (msg.tool_calls && msg.tool_calls.length > 0) {\r\n llmCall.toolCalls = msg.tool_calls.map((tc: OpenAIToolCall) => ({\r\n name: tc.function.name,\r\n input: safeParseJSON(tc.function.arguments),\r\n }));\r\n\r\n // Also add to global tool calls\r\n for (const tc of msg.tool_calls) {\r\n result.toolCalls.push({\r\n name: tc.function.name,\r\n input: safeParseJSON(tc.function.arguments),\r\n });\r\n }\r\n }\r\n\r\n result.llmCalls.push(llmCall);\r\n\r\n // Last assistant message is the output\r\n if (msg.content) {\r\n result.output = msg.content;\r\n }\r\n } else if (msg.role === 'tool') {\r\n // Find the matching tool call and add output\r\n const lastToolCall = result.toolCalls[result.toolCalls.length - 1];\r\n if (lastToolCall) {\r\n lastToolCall.output = safeParseJSON(msg.content ?? '');\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Parse Anthropic messages\r\n */\r\nfunction parseAnthropic(messages: AnthropicMessage[]): ParsedTrace {\r\n const result: ParsedTrace = {\r\n llmCalls: [],\r\n toolCalls: [],\r\n totalInputTokens: 0,\r\n totalOutputTokens: 0,\r\n models: [],\r\n provider: 'anthropic',\r\n };\r\n\r\n for (const msg of messages) {\r\n if (msg.role === 'user') {\r\n // First user message is input\r\n if (!result.userInput) {\r\n if (typeof msg.content === 'string') {\r\n result.userInput = msg.content;\r\n } else if (Array.isArray(msg.content)) {\r\n const textContent = msg.content.find(\r\n (c: AnthropicContent) => c.type === 'text'\r\n );\r\n if (textContent && 'text' in textContent) {\r\n result.userInput = textContent.text;\r\n }\r\n }\r\n }\r\n\r\n // Check for tool_result in content\r\n if (Array.isArray(msg.content)) {\r\n for (const block of msg.content as AnthropicContent[]) {\r\n if (block.type === 'tool_result' && block.tool_use_id) {\r\n // Find matching tool call and add result\r\n const toolCall = result.toolCalls.find(\r\n (tc) => (tc as unknown as { id?: string }).id === block.tool_use_id\r\n );\r\n if (toolCall) {\r\n toolCall.output = block.content;\r\n }\r\n }\r\n }\r\n }\r\n } else if (msg.role === 'assistant') {\r\n const llmCall: ParsedLLMCall = {\r\n provider: 'anthropic',\r\n };\r\n\r\n if (typeof msg.content === 'string') {\r\n llmCall.output = msg.content;\r\n result.output = msg.content;\r\n } else if (Array.isArray(msg.content)) {\r\n const outputs: string[] = [];\r\n const toolCalls: ParsedToolCall[] = [];\r\n\r\n for (const block of msg.content as AnthropicContent[]) {\r\n if (block.type === 'text' && block.text) {\r\n outputs.push(block.text);\r\n } else if (block.type === 'tool_use' && block.name) {\r\n const tc: ParsedToolCall & { id?: string } = {\r\n name: block.name,\r\n input: block.input,\r\n };\r\n if (block.id) {\r\n tc.id = block.id;\r\n }\r\n toolCalls.push(tc);\r\n result.toolCalls.push(tc);\r\n }\r\n }\r\n\r\n if (outputs.length) {\r\n llmCall.output = outputs.join('\\n');\r\n result.output = outputs.join('\\n');\r\n }\r\n if (toolCalls.length) {\r\n llmCall.toolCalls = toolCalls;\r\n }\r\n }\r\n\r\n result.llmCalls.push(llmCall);\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Parse Gemini messages\r\n */\r\nfunction parseGemini(messages: GeminiMessage[]): ParsedTrace {\r\n const result: ParsedTrace = {\r\n llmCalls: [],\r\n toolCalls: [],\r\n totalInputTokens: 0,\r\n totalOutputTokens: 0,\r\n models: [],\r\n provider: 'gemini',\r\n };\r\n\r\n for (const msg of messages) {\r\n if (msg.role === 'user') {\r\n // First user message is input\r\n if (!result.userInput) {\r\n const textPart = msg.parts.find((p) => p.text);\r\n if (textPart?.text) {\r\n result.userInput = textPart.text;\r\n }\r\n }\r\n\r\n // Check for function responses (tool results)\r\n for (const part of msg.parts) {\r\n if (part.functionResponse) {\r\n const toolCall = result.toolCalls.find(\r\n (tc) => tc.name === part.functionResponse!.name\r\n );\r\n if (toolCall) {\r\n toolCall.output = part.functionResponse.response;\r\n }\r\n }\r\n }\r\n } else if (msg.role === 'model') {\r\n const llmCall: ParsedLLMCall = {\r\n provider: 'gemini',\r\n };\r\n\r\n const outputs: string[] = [];\r\n const toolCalls: ParsedToolCall[] = [];\r\n\r\n for (const part of msg.parts) {\r\n if (part.text) {\r\n outputs.push(part.text);\r\n } else if (part.functionCall) {\r\n const tc: ParsedToolCall = {\r\n name: part.functionCall.name,\r\n input: part.functionCall.args,\r\n };\r\n toolCalls.push(tc);\r\n result.toolCalls.push(tc);\r\n }\r\n }\r\n\r\n if (outputs.length) {\r\n llmCall.output = outputs.join('\\n');\r\n result.output = outputs.join('\\n');\r\n }\r\n if (toolCalls.length) {\r\n llmCall.toolCalls = toolCalls;\r\n }\r\n\r\n result.llmCalls.push(llmCall);\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Safely parse JSON, returning original string if parsing fails\r\n */\r\nfunction safeParseJSON(str: string): unknown {\r\n try {\r\n return JSON.parse(str);\r\n } catch {\r\n return str;\r\n }\r\n}\r\n\r\n/**\r\n * Parse messages array and extract structured data\r\n */\r\nexport function parseMessages(messages: unknown): ParsedTrace {\r\n // Handle null/undefined\r\n if (!messages) {\r\n return {\r\n llmCalls: [],\r\n toolCalls: [],\r\n totalInputTokens: 0,\r\n totalOutputTokens: 0,\r\n models: [],\r\n provider: 'unknown',\r\n };\r\n }\r\n\r\n // Ensure it's an array\r\n if (!Array.isArray(messages)) {\r\n return {\r\n llmCalls: [],\r\n toolCalls: [],\r\n totalInputTokens: 0,\r\n totalOutputTokens: 0,\r\n models: [],\r\n provider: 'unknown',\r\n output: typeof messages === 'string' ? messages : JSON.stringify(messages),\r\n };\r\n }\r\n\r\n // Detect format and parse (order matters - Gemini first since it's most specific)\r\n if (isGeminiFormat(messages)) {\r\n return parseGemini(messages);\r\n } else if (isOpenAIFormat(messages)) {\r\n return parseOpenAI(messages);\r\n } else if (isAnthropicFormat(messages)) {\r\n return parseAnthropic(messages);\r\n }\r\n\r\n // Unknown format - just store as-is\r\n return {\r\n llmCalls: [],\r\n toolCalls: [],\r\n totalInputTokens: 0,\r\n totalOutputTokens: 0,\r\n models: [],\r\n provider: 'unknown',\r\n };\r\n}\r\n\r\n/**\r\n * Extract data from an OpenAI/Anthropic/Bedrock response object\r\n * This handles the raw API response (not the messages array)\r\n */\r\nexport function parseResponse(response: unknown): Partial<ParsedLLMCall> {\r\n if (!response || typeof response !== 'object') {\r\n return {};\r\n }\r\n\r\n const res = response as Record<string, unknown>;\r\n const result: Partial<ParsedLLMCall> = {};\r\n\r\n // Extract model\r\n if ('model' in res) {\r\n result.model = res.model as string;\r\n }\r\n // Bedrock model ID in response\r\n if ('modelId' in res) {\r\n result.model = res.modelId as string;\r\n }\r\n\r\n // Extract usage - handle all formats\r\n if ('usage' in res && typeof res.usage === 'object' && res.usage !== null) {\r\n const usage = res.usage as Record<string, number>;\r\n // OpenAI: prompt_tokens, completion_tokens\r\n // Anthropic/Bedrock: input_tokens, output_tokens\r\n result.inputTokens = usage.prompt_tokens ?? usage.input_tokens;\r\n result.outputTokens = usage.completion_tokens ?? usage.output_tokens;\r\n }\r\n\r\n // Bedrock Converse API format\r\n if ('$metadata' in res && 'usage' in res) {\r\n result.provider = 'bedrock';\r\n }\r\n\r\n // Bedrock InvokeModel response (parsed body)\r\n if ('anthropic_version' in res || 'amazon-bedrock-invocationMetrics' in res) {\r\n result.provider = 'bedrock';\r\n }\r\n\r\n // Gemini response format\r\n if ('candidates' in res || 'promptFeedback' in res) {\r\n result.provider = 'gemini';\r\n // Gemini usageMetadata\r\n if ('usageMetadata' in res && typeof res.usageMetadata === 'object' && res.usageMetadata !== null) {\r\n const usage = res.usageMetadata as Record<string, number>;\r\n result.inputTokens = usage.promptTokenCount;\r\n result.outputTokens = usage.candidatesTokenCount;\r\n }\r\n }\r\n\r\n // Detect provider from model name\r\n if (result.model && !result.provider) {\r\n if (result.model.startsWith('gpt') || result.model.startsWith('o1')) {\r\n result.provider = 'openai';\r\n } else if (result.model.startsWith('claude')) {\r\n result.provider = 'anthropic';\r\n } else if (result.model.startsWith('gemini')) {\r\n result.provider = 'gemini';\r\n } else if (\r\n result.model.startsWith('anthropic.') ||\r\n result.model.startsWith('amazon.') ||\r\n result.model.startsWith('meta.') ||\r\n result.model.startsWith('cohere.') ||\r\n result.model.startsWith('mistral.') ||\r\n result.model.includes(':') // Bedrock ARN format\r\n ) {\r\n result.provider = 'bedrock';\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Parse Bedrock InvokeModel response body\r\n * Call this with the parsed JSON body from Bedrock\r\n */\r\nexport function parseBedrockResponse(body: unknown): Partial<ParsedLLMCall> {\r\n if (!body || typeof body !== 'object') {\r\n return {};\r\n }\r\n\r\n const res = body as Record<string, unknown>;\r\n const result: Partial<ParsedLLMCall> = { provider: 'bedrock' };\r\n\r\n // Claude on Bedrock\r\n if ('usage' in res && typeof res.usage === 'object' && res.usage !== null) {\r\n const usage = res.usage as Record<string, number>;\r\n result.inputTokens = usage.input_tokens;\r\n result.outputTokens = usage.output_tokens;\r\n }\r\n\r\n // Model from invocation metrics\r\n if ('amazon-bedrock-invocationMetrics' in res) {\r\n const metrics = res['amazon-bedrock-invocationMetrics'] as Record<string, unknown>;\r\n if (metrics.inputTokenCount) result.inputTokens = metrics.inputTokenCount as number;\r\n if (metrics.outputTokenCount) result.outputTokens = metrics.outputTokenCount as number;\r\n }\r\n\r\n return result;\r\n}\r\n","/**\r\n * Lelemon Tracer - Simple, low-friction API\r\n *\r\n * Usage:\r\n * const t = trace({ input: userMessage });\r\n * try {\r\n * // your agent code\r\n * t.success(messages);\r\n * } catch (error) {\r\n * t.error(error, messages);\r\n * }\r\n */\r\n\r\nimport { Transport } from './transport';\r\nimport { parseMessages, parseResponse } from './parser';\r\nimport type {\r\n LelemonConfig,\r\n TraceOptions,\r\n ParsedLLMCall,\r\n CompleteTraceRequest,\r\n} from './types';\r\n\r\nconst DEFAULT_ENDPOINT = 'https://api.lelemon.dev';\r\n\r\n// Global config (set via init())\r\nlet globalConfig: LelemonConfig = {};\r\nlet globalTransport: Transport | null = null;\r\n\r\n/**\r\n * Initialize the SDK globally (optional)\r\n * If not called, trace() will auto-initialize with env vars\r\n */\r\nexport function init(config: LelemonConfig = {}): void {\r\n globalConfig = config;\r\n globalTransport = createTransport(config);\r\n}\r\n\r\n/**\r\n * Create a transport instance\r\n */\r\nfunction createTransport(config: LelemonConfig): Transport {\r\n const apiKey = config.apiKey ?? getEnvVar('LELEMON_API_KEY');\r\n\r\n if (!apiKey && !config.disabled) {\r\n console.warn(\r\n '[Lelemon] No API key provided. Set apiKey in config or LELEMON_API_KEY env var. Tracing disabled.'\r\n );\r\n }\r\n\r\n return new Transport({\r\n apiKey: apiKey ?? '',\r\n endpoint: config.endpoint ?? DEFAULT_ENDPOINT,\r\n debug: config.debug ?? false,\r\n disabled: config.disabled ?? !apiKey,\r\n });\r\n}\r\n\r\n/**\r\n * Get transport (create if needed)\r\n */\r\nfunction getTransport(): Transport {\r\n if (!globalTransport) {\r\n globalTransport = createTransport(globalConfig);\r\n }\r\n return globalTransport;\r\n}\r\n\r\n/**\r\n * Get environment variable (works in Node and edge)\r\n */\r\nfunction getEnvVar(name: string): string | undefined {\r\n if (typeof process !== 'undefined' && process.env) {\r\n return process.env[name];\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Active trace handle returned by trace()\r\n */\r\nexport class Trace {\r\n private id: string | null = null;\r\n private transport: Transport;\r\n private options: TraceOptions;\r\n private startTime: number;\r\n private completed = false;\r\n private debug: boolean;\r\n private disabled: boolean;\r\n private llmCalls: ParsedLLMCall[] = [];\r\n\r\n constructor(options: TraceOptions, transport: Transport, debug: boolean, disabled: boolean) {\r\n this.options = options;\r\n this.transport = transport;\r\n this.startTime = Date.now();\r\n this.debug = debug;\r\n this.disabled = disabled;\r\n }\r\n\r\n /**\r\n * Initialize trace on server (called internally)\r\n */\r\n async init(): Promise<void> {\r\n if (this.disabled) return;\r\n\r\n try {\r\n const result = await this.transport.createTrace({\r\n name: this.options.name,\r\n sessionId: this.options.sessionId,\r\n userId: this.options.userId,\r\n input: this.options.input,\r\n metadata: this.options.metadata,\r\n tags: this.options.tags,\r\n });\r\n this.id = result.id;\r\n } catch (error) {\r\n if (this.debug) {\r\n console.error('[Lelemon] Failed to create trace:', error);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Log an LLM response (optional - for tracking individual calls)\r\n * Use this if you want to track tokens per call, not just at the end\r\n */\r\n log(response: unknown): void {\r\n const parsed = parseResponse(response);\r\n if (parsed.model || parsed.inputTokens || parsed.outputTokens) {\r\n this.llmCalls.push(parsed);\r\n }\r\n }\r\n\r\n /**\r\n * Complete trace successfully\r\n * @param messages - The full message history (OpenAI/Anthropic format)\r\n */\r\n async success(messages: unknown): Promise<void> {\r\n if (this.completed) return;\r\n this.completed = true;\r\n\r\n if (this.disabled || !this.id) return;\r\n\r\n const durationMs = Date.now() - this.startTime;\r\n const parsed = parseMessages(messages);\r\n\r\n // Merge logged LLM calls with parsed ones\r\n const allLLMCalls = [...this.llmCalls, ...parsed.llmCalls];\r\n\r\n // Calculate totals\r\n let totalInputTokens = 0;\r\n let totalOutputTokens = 0;\r\n const models = new Set<string>();\r\n\r\n for (const call of allLLMCalls) {\r\n if (call.inputTokens) totalInputTokens += call.inputTokens;\r\n if (call.outputTokens) totalOutputTokens += call.outputTokens;\r\n if (call.model) models.add(call.model);\r\n }\r\n\r\n try {\r\n await this.transport.completeTrace(this.id, {\r\n status: 'completed',\r\n output: parsed.output,\r\n systemPrompt: parsed.systemPrompt,\r\n llmCalls: allLLMCalls,\r\n toolCalls: parsed.toolCalls,\r\n models: Array.from(models),\r\n totalInputTokens,\r\n totalOutputTokens,\r\n durationMs,\r\n });\r\n } catch (err) {\r\n if (this.debug) {\r\n console.error('[Lelemon] Failed to complete trace:', err);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Complete trace with error\r\n * @param error - The error that occurred\r\n * @param messages - The message history up to the failure (optional)\r\n */\r\n async error(error: Error | unknown, messages?: unknown): Promise<void> {\r\n if (this.completed) return;\r\n this.completed = true;\r\n\r\n if (this.disabled || !this.id) return;\r\n\r\n const durationMs = Date.now() - this.startTime;\r\n const parsed = messages ? parseMessages(messages) : null;\r\n\r\n const errorObj = error instanceof Error ? error : new Error(String(error));\r\n\r\n // Merge logged LLM calls\r\n const allLLMCalls = parsed\r\n ? [...this.llmCalls, ...parsed.llmCalls]\r\n : this.llmCalls;\r\n\r\n // Calculate totals\r\n let totalInputTokens = 0;\r\n let totalOutputTokens = 0;\r\n const models = new Set<string>();\r\n\r\n for (const call of allLLMCalls) {\r\n if (call.inputTokens) totalInputTokens += call.inputTokens;\r\n if (call.outputTokens) totalOutputTokens += call.outputTokens;\r\n if (call.model) models.add(call.model);\r\n }\r\n\r\n const request: CompleteTraceRequest = {\r\n status: 'error',\r\n errorMessage: errorObj.message,\r\n errorStack: errorObj.stack,\r\n durationMs,\r\n totalInputTokens,\r\n totalOutputTokens,\r\n models: Array.from(models),\r\n };\r\n\r\n if (parsed) {\r\n request.output = parsed.output;\r\n request.systemPrompt = parsed.systemPrompt;\r\n request.llmCalls = allLLMCalls;\r\n request.toolCalls = parsed.toolCalls;\r\n }\r\n\r\n try {\r\n await this.transport.completeTrace(this.id, request);\r\n } catch (err) {\r\n if (this.debug) {\r\n console.error('[Lelemon] Failed to complete trace:', err);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Start a new trace\r\n *\r\n * @example\r\n * const t = trace({ input: userMessage });\r\n * try {\r\n * const messages = [...];\r\n * // ... your agent code ...\r\n * await t.success(messages);\r\n * } catch (error) {\r\n * await t.error(error, messages);\r\n * throw error;\r\n * }\r\n */\r\nexport function trace(options: TraceOptions): Trace {\r\n const transport = getTransport();\r\n const debug = globalConfig.debug ?? false;\r\n const disabled = globalConfig.disabled ?? !transport.isEnabled();\r\n\r\n const t = new Trace(options, transport, debug, disabled);\r\n\r\n // Initialize async (fire and forget)\r\n t.init().catch((err) => {\r\n if (debug) {\r\n console.error('[Lelemon] Trace init failed:', err);\r\n }\r\n });\r\n\r\n return t;\r\n}\r\n\r\n// Re-export for backwards compatibility\r\nexport { Trace as LLMTracer };\r\n"]}
1
+ {"version":3,"sources":["../src/transport.ts","../src/parser.ts","../src/tracer.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Transport layer with queue-based batching\n *\n * Features:\n * - Fire-and-forget API (sync enqueue)\n * - Automatic batching (by size or interval)\n * - Single flush promise (no duplicate requests)\n * - Graceful error handling (never crashes caller)\n * - Request timeout protection\n */\n\nimport type { CreateTraceRequest, CompleteTraceRequest } from './types';\n\ninterface TransportConfig {\n apiKey: string;\n endpoint: string;\n debug: boolean;\n disabled: boolean;\n batchSize?: number;\n flushIntervalMs?: number;\n requestTimeoutMs?: number;\n}\n\ninterface QueuedTrace {\n type: 'create';\n tempId: string;\n data: CreateTraceRequest;\n}\n\ninterface QueuedComplete {\n type: 'complete';\n traceId: string;\n data: CompleteTraceRequest;\n}\n\ntype QueueItem = QueuedTrace | QueuedComplete;\n\ninterface BatchPayload {\n creates: Array<{ tempId: string; data: CreateTraceRequest }>;\n completes: Array<{ traceId: string; data: CompleteTraceRequest }>;\n}\n\ninterface BatchResponse {\n created: Record<string, string>; // tempId -> realId\n errors?: string[];\n}\n\n// Pending trace resolution\ntype TraceResolver = (id: string | null) => void;\n\nconst DEFAULT_BATCH_SIZE = 10;\nconst DEFAULT_FLUSH_INTERVAL_MS = 1000;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 10000;\n\nexport class Transport {\n private readonly config: Required<TransportConfig>;\n private queue: QueueItem[] = [];\n private flushPromise: Promise<void> | null = null;\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private pendingResolvers: Map<string, TraceResolver> = new Map();\n private idCounter = 0;\n\n constructor(config: TransportConfig) {\n this.config = {\n apiKey: config.apiKey,\n endpoint: config.endpoint,\n debug: config.debug,\n disabled: config.disabled,\n batchSize: config.batchSize ?? DEFAULT_BATCH_SIZE,\n flushIntervalMs: config.flushIntervalMs ?? DEFAULT_FLUSH_INTERVAL_MS,\n requestTimeoutMs: config.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS,\n };\n }\n\n /**\n * Check if transport is enabled\n */\n isEnabled(): boolean {\n return !this.config.disabled && !!this.config.apiKey;\n }\n\n /**\n * Enqueue trace creation (returns promise that resolves to trace ID)\n */\n enqueueCreate(data: CreateTraceRequest): Promise<string | null> {\n if (this.config.disabled) {\n return Promise.resolve(null);\n }\n\n const tempId = this.generateTempId();\n\n return new Promise((resolve) => {\n this.pendingResolvers.set(tempId, resolve);\n this.enqueue({ type: 'create', tempId, data });\n });\n }\n\n /**\n * Enqueue trace completion (fire-and-forget)\n */\n enqueueComplete(traceId: string, data: CompleteTraceRequest): void {\n if (this.config.disabled || !traceId) {\n return;\n }\n\n this.enqueue({ type: 'complete', traceId, data });\n }\n\n /**\n * Flush all pending items\n * Safe to call multiple times (deduplicates)\n */\n async flush(): Promise<void> {\n // If already flushing, wait for that\n if (this.flushPromise) {\n return this.flushPromise;\n }\n\n // Nothing to flush\n if (this.queue.length === 0) {\n return;\n }\n\n // Cancel scheduled flush\n this.cancelScheduledFlush();\n\n // Take current queue\n const items = this.queue;\n this.queue = [];\n\n // Execute flush\n this.flushPromise = this.sendBatch(items).finally(() => {\n this.flushPromise = null;\n });\n\n return this.flushPromise;\n }\n\n /**\n * Get pending item count (for testing/debugging)\n */\n getPendingCount(): number {\n return this.queue.length;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Private methods\n // ─────────────────────────────────────────────────────────────\n\n private generateTempId(): string {\n return `temp_${++this.idCounter}_${Date.now()}`;\n }\n\n private enqueue(item: QueueItem): void {\n this.queue.push(item);\n\n if (this.queue.length >= this.config.batchSize) {\n // Batch size reached - flush immediately\n this.flush();\n } else {\n // Schedule flush\n this.scheduleFlush();\n }\n }\n\n private scheduleFlush(): void {\n if (this.flushTimer !== null) {\n return; // Already scheduled\n }\n\n this.flushTimer = setTimeout(() => {\n this.flushTimer = null;\n this.flush();\n }, this.config.flushIntervalMs);\n }\n\n private cancelScheduledFlush(): void {\n if (this.flushTimer !== null) {\n clearTimeout(this.flushTimer);\n this.flushTimer = null;\n }\n }\n\n private async sendBatch(items: QueueItem[]): Promise<void> {\n // Separate creates and completes\n const payload: BatchPayload = {\n creates: [],\n completes: [],\n };\n\n for (const item of items) {\n if (item.type === 'create') {\n payload.creates.push({ tempId: item.tempId, data: item.data });\n } else {\n payload.completes.push({ traceId: item.traceId, data: item.data });\n }\n }\n\n // Skip if nothing to send\n if (payload.creates.length === 0 && payload.completes.length === 0) {\n return;\n }\n\n this.log('Sending batch', {\n creates: payload.creates.length,\n completes: payload.completes.length\n });\n\n try {\n const response = await this.request<BatchResponse>(\n 'POST',\n '/api/v1/traces/batch',\n payload\n );\n\n // Resolve pending trace IDs\n if (response.created) {\n for (const [tempId, realId] of Object.entries(response.created)) {\n const resolver = this.pendingResolvers.get(tempId);\n if (resolver) {\n resolver(realId);\n this.pendingResolvers.delete(tempId);\n }\n }\n }\n\n // Log any errors from server\n if (response.errors?.length && this.config.debug) {\n console.warn('[Lelemon] Batch errors:', response.errors);\n }\n } catch (error) {\n // Resolve all pending creates with null (failed)\n for (const item of items) {\n if (item.type === 'create') {\n const resolver = this.pendingResolvers.get(item.tempId);\n if (resolver) {\n resolver(null);\n this.pendingResolvers.delete(item.tempId);\n }\n }\n }\n\n this.log('Batch failed', error);\n }\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.config.endpoint}${path}`;\n const controller = new AbortController();\n\n // Timeout protection\n const timeoutId = setTimeout(() => {\n controller.abort();\n }, this.config.requestTimeoutMs);\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${this.config.apiKey}`,\n },\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'Unknown error');\n throw new Error(`HTTP ${response.status}: ${errorText}`);\n }\n\n const text = await response.text();\n return text ? JSON.parse(text) : ({} as T);\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.config.requestTimeoutMs}ms`);\n }\n\n throw error;\n }\n }\n\n private log(message: string, data?: unknown): void {\n if (this.config.debug) {\n if (data !== undefined) {\n console.log(`[Lelemon] ${message}`, data);\n } else {\n console.log(`[Lelemon] ${message}`);\n }\n }\n }\n}\n","/**\n * Message Parser\n * Auto-detects OpenAI/Anthropic/Gemini message formats and extracts relevant data\n */\n\nimport type {\n Message,\n OpenAIMessage,\n OpenAIToolCall,\n AnthropicMessage,\n AnthropicContent,\n ParsedTrace,\n ParsedLLMCall,\n ParsedToolCall,\n} from './types';\n\n// ============================================\n// GEMINI FORMAT\n// ============================================\n\ninterface GeminiMessage {\n role: 'user' | 'model';\n parts: GeminiPart[];\n}\n\ninterface GeminiPart {\n text?: string;\n functionCall?: {\n name: string;\n args: Record<string, unknown>;\n };\n functionResponse?: {\n name: string;\n response: unknown;\n };\n}\n\n/**\n * Detect if messages are in OpenAI format\n */\nfunction isOpenAIFormat(messages: unknown[]): messages is OpenAIMessage[] {\n if (!messages.length) return false;\n const first = messages[0] as Record<string, unknown>;\n // OpenAI has role: system/user/assistant/tool\n return (\n typeof first === 'object' &&\n first !== null &&\n 'role' in first &&\n ['system', 'user', 'assistant', 'tool'].includes(first.role as string)\n );\n}\n\n/**\n * Detect if messages are in Anthropic format\n */\nfunction isAnthropicFormat(messages: unknown[]): messages is AnthropicMessage[] {\n if (!messages.length) return false;\n const first = messages[0] as Record<string, unknown>;\n // Anthropic only has user/assistant, and content can be array\n return (\n typeof first === 'object' &&\n first !== null &&\n 'role' in first &&\n ['user', 'assistant'].includes(first.role as string) &&\n (typeof first.content === 'string' || Array.isArray(first.content))\n );\n}\n\n/**\n * Detect if messages are in Gemini format\n */\nfunction isGeminiFormat(messages: unknown[]): messages is GeminiMessage[] {\n if (!messages.length) return false;\n const first = messages[0] as Record<string, unknown>;\n // Gemini uses 'user' | 'model' and has 'parts' array\n return (\n typeof first === 'object' &&\n first !== null &&\n 'role' in first &&\n ['user', 'model'].includes(first.role as string) &&\n 'parts' in first &&\n Array.isArray(first.parts)\n );\n}\n\n/**\n * Parse OpenAI messages\n */\nfunction parseOpenAI(messages: OpenAIMessage[]): ParsedTrace {\n const result: ParsedTrace = {\n llmCalls: [],\n toolCalls: [],\n totalInputTokens: 0,\n totalOutputTokens: 0,\n models: [],\n provider: 'openai',\n };\n\n for (const msg of messages) {\n if (msg.role === 'system') {\n result.systemPrompt = msg.content ?? undefined;\n } else if (msg.role === 'user' && !result.userInput) {\n result.userInput = msg.content ?? undefined;\n } else if (msg.role === 'assistant') {\n // Track as LLM call\n const llmCall: ParsedLLMCall = {\n provider: 'openai',\n output: msg.content,\n };\n\n // Extract tool calls if present\n if (msg.tool_calls && msg.tool_calls.length > 0) {\n llmCall.toolCalls = msg.tool_calls.map((tc: OpenAIToolCall) => ({\n name: tc.function.name,\n input: safeParseJSON(tc.function.arguments),\n }));\n\n // Also add to global tool calls\n for (const tc of msg.tool_calls) {\n result.toolCalls.push({\n name: tc.function.name,\n input: safeParseJSON(tc.function.arguments),\n });\n }\n }\n\n result.llmCalls.push(llmCall);\n\n // Last assistant message is the output\n if (msg.content) {\n result.output = msg.content;\n }\n } else if (msg.role === 'tool') {\n // Find the matching tool call and add output\n const lastToolCall = result.toolCalls[result.toolCalls.length - 1];\n if (lastToolCall) {\n lastToolCall.output = safeParseJSON(msg.content ?? '');\n }\n }\n }\n\n return result;\n}\n\n/**\n * Parse Anthropic messages\n */\nfunction parseAnthropic(messages: AnthropicMessage[]): ParsedTrace {\n const result: ParsedTrace = {\n llmCalls: [],\n toolCalls: [],\n totalInputTokens: 0,\n totalOutputTokens: 0,\n models: [],\n provider: 'anthropic',\n };\n\n for (const msg of messages) {\n if (msg.role === 'user') {\n // First user message is input\n if (!result.userInput) {\n if (typeof msg.content === 'string') {\n result.userInput = msg.content;\n } else if (Array.isArray(msg.content)) {\n const textContent = msg.content.find(\n (c: AnthropicContent) => c.type === 'text'\n );\n if (textContent && 'text' in textContent) {\n result.userInput = textContent.text;\n }\n }\n }\n\n // Check for tool_result in content\n if (Array.isArray(msg.content)) {\n for (const block of msg.content as AnthropicContent[]) {\n if (block.type === 'tool_result' && block.tool_use_id) {\n // Find matching tool call and add result\n const toolCall = result.toolCalls.find(\n (tc) => (tc as unknown as { id?: string }).id === block.tool_use_id\n );\n if (toolCall) {\n toolCall.output = block.content;\n }\n }\n }\n }\n } else if (msg.role === 'assistant') {\n const llmCall: ParsedLLMCall = {\n provider: 'anthropic',\n };\n\n if (typeof msg.content === 'string') {\n llmCall.output = msg.content;\n result.output = msg.content;\n } else if (Array.isArray(msg.content)) {\n const outputs: string[] = [];\n const toolCalls: ParsedToolCall[] = [];\n\n for (const block of msg.content as AnthropicContent[]) {\n if (block.type === 'text' && block.text) {\n outputs.push(block.text);\n } else if (block.type === 'tool_use' && block.name) {\n const tc: ParsedToolCall & { id?: string } = {\n name: block.name,\n input: block.input,\n };\n if (block.id) {\n tc.id = block.id;\n }\n toolCalls.push(tc);\n result.toolCalls.push(tc);\n }\n }\n\n if (outputs.length) {\n llmCall.output = outputs.join('\\n');\n result.output = outputs.join('\\n');\n }\n if (toolCalls.length) {\n llmCall.toolCalls = toolCalls;\n }\n }\n\n result.llmCalls.push(llmCall);\n }\n }\n\n return result;\n}\n\n/**\n * Parse Gemini messages\n */\nfunction parseGemini(messages: GeminiMessage[]): ParsedTrace {\n const result: ParsedTrace = {\n llmCalls: [],\n toolCalls: [],\n totalInputTokens: 0,\n totalOutputTokens: 0,\n models: [],\n provider: 'gemini',\n };\n\n for (const msg of messages) {\n if (msg.role === 'user') {\n // First user message is input\n if (!result.userInput) {\n const textPart = msg.parts.find((p) => p.text);\n if (textPart?.text) {\n result.userInput = textPart.text;\n }\n }\n\n // Check for function responses (tool results)\n for (const part of msg.parts) {\n if (part.functionResponse) {\n const toolCall = result.toolCalls.find(\n (tc) => tc.name === part.functionResponse!.name\n );\n if (toolCall) {\n toolCall.output = part.functionResponse.response;\n }\n }\n }\n } else if (msg.role === 'model') {\n const llmCall: ParsedLLMCall = {\n provider: 'gemini',\n };\n\n const outputs: string[] = [];\n const toolCalls: ParsedToolCall[] = [];\n\n for (const part of msg.parts) {\n if (part.text) {\n outputs.push(part.text);\n } else if (part.functionCall) {\n const tc: ParsedToolCall = {\n name: part.functionCall.name,\n input: part.functionCall.args,\n };\n toolCalls.push(tc);\n result.toolCalls.push(tc);\n }\n }\n\n if (outputs.length) {\n llmCall.output = outputs.join('\\n');\n result.output = outputs.join('\\n');\n }\n if (toolCalls.length) {\n llmCall.toolCalls = toolCalls;\n }\n\n result.llmCalls.push(llmCall);\n }\n }\n\n return result;\n}\n\n/**\n * Safely parse JSON, returning original string if parsing fails\n */\nfunction safeParseJSON(str: string): unknown {\n try {\n return JSON.parse(str);\n } catch {\n return str;\n }\n}\n\n/**\n * Parse messages array and extract structured data\n */\nexport function parseMessages(messages: unknown): ParsedTrace {\n // Handle null/undefined\n if (!messages) {\n return {\n llmCalls: [],\n toolCalls: [],\n totalInputTokens: 0,\n totalOutputTokens: 0,\n models: [],\n provider: 'unknown',\n };\n }\n\n // Ensure it's an array\n if (!Array.isArray(messages)) {\n return {\n llmCalls: [],\n toolCalls: [],\n totalInputTokens: 0,\n totalOutputTokens: 0,\n models: [],\n provider: 'unknown',\n output: typeof messages === 'string' ? messages : JSON.stringify(messages),\n };\n }\n\n // Detect format and parse (order matters - Gemini first since it's most specific)\n if (isGeminiFormat(messages)) {\n return parseGemini(messages);\n } else if (isOpenAIFormat(messages)) {\n return parseOpenAI(messages);\n } else if (isAnthropicFormat(messages)) {\n return parseAnthropic(messages);\n }\n\n // Unknown format - just store as-is\n return {\n llmCalls: [],\n toolCalls: [],\n totalInputTokens: 0,\n totalOutputTokens: 0,\n models: [],\n provider: 'unknown',\n };\n}\n\n/**\n * Extract data from an OpenAI/Anthropic/Bedrock response object\n * This handles the raw API response (not the messages array)\n */\nexport function parseResponse(response: unknown): Partial<ParsedLLMCall> {\n if (!response || typeof response !== 'object') {\n return {};\n }\n\n const res = response as Record<string, unknown>;\n const result: Partial<ParsedLLMCall> = {};\n\n // Extract model\n if ('model' in res) {\n result.model = res.model as string;\n }\n // Bedrock model ID in response\n if ('modelId' in res) {\n result.model = res.modelId as string;\n }\n\n // Extract usage - handle all formats\n if ('usage' in res && typeof res.usage === 'object' && res.usage !== null) {\n const usage = res.usage as Record<string, number>;\n // OpenAI: prompt_tokens, completion_tokens\n // Anthropic/Bedrock: input_tokens, output_tokens\n result.inputTokens = usage.prompt_tokens ?? usage.input_tokens;\n result.outputTokens = usage.completion_tokens ?? usage.output_tokens;\n }\n\n // Bedrock Converse API format\n if ('$metadata' in res && 'usage' in res) {\n result.provider = 'bedrock';\n }\n\n // Bedrock InvokeModel response (parsed body)\n if ('anthropic_version' in res || 'amazon-bedrock-invocationMetrics' in res) {\n result.provider = 'bedrock';\n }\n\n // Gemini response format\n if ('candidates' in res || 'promptFeedback' in res) {\n result.provider = 'gemini';\n // Gemini usageMetadata\n if ('usageMetadata' in res && typeof res.usageMetadata === 'object' && res.usageMetadata !== null) {\n const usage = res.usageMetadata as Record<string, number>;\n result.inputTokens = usage.promptTokenCount;\n result.outputTokens = usage.candidatesTokenCount;\n }\n }\n\n // Detect provider from model name\n if (result.model && !result.provider) {\n if (result.model.startsWith('gpt') || result.model.startsWith('o1')) {\n result.provider = 'openai';\n } else if (result.model.startsWith('claude')) {\n result.provider = 'anthropic';\n } else if (result.model.startsWith('gemini')) {\n result.provider = 'gemini';\n } else if (\n result.model.startsWith('anthropic.') ||\n result.model.startsWith('amazon.') ||\n result.model.startsWith('meta.') ||\n result.model.startsWith('cohere.') ||\n result.model.startsWith('mistral.') ||\n result.model.includes(':') // Bedrock ARN format\n ) {\n result.provider = 'bedrock';\n }\n }\n\n return result;\n}\n\n/**\n * Parse Bedrock InvokeModel response body\n * Call this with the parsed JSON body from Bedrock\n */\nexport function parseBedrockResponse(body: unknown): Partial<ParsedLLMCall> {\n if (!body || typeof body !== 'object') {\n return {};\n }\n\n const res = body as Record<string, unknown>;\n const result: Partial<ParsedLLMCall> = { provider: 'bedrock' };\n\n // Claude on Bedrock\n if ('usage' in res && typeof res.usage === 'object' && res.usage !== null) {\n const usage = res.usage as Record<string, number>;\n result.inputTokens = usage.input_tokens;\n result.outputTokens = usage.output_tokens;\n }\n\n // Model from invocation metrics\n if ('amazon-bedrock-invocationMetrics' in res) {\n const metrics = res['amazon-bedrock-invocationMetrics'] as Record<string, unknown>;\n if (metrics.inputTokenCount) result.inputTokens = metrics.inputTokenCount as number;\n if (metrics.outputTokenCount) result.outputTokens = metrics.outputTokenCount as number;\n }\n\n return result;\n}\n","/**\n * Lelemon Tracer - Fire-and-forget LLM observability\n *\n * Usage:\n * const t = trace({ input: userMessage });\n * try {\n * const result = await myAgent(userMessage);\n * t.success(result.messages);\n * } catch (error) {\n * t.error(error);\n * throw error;\n * }\n *\n * For serverless:\n * await flush(); // Before response\n */\n\nimport { Transport } from './transport';\nimport { parseMessages, parseResponse } from './parser';\nimport type {\n LelemonConfig,\n TraceOptions,\n ParsedLLMCall,\n} from './types';\n\nconst DEFAULT_ENDPOINT = 'https://api.lelemon.dev';\n\n// ─────────────────────────────────────────────────────────────\n// Global state\n// ─────────────────────────────────────────────────────────────\n\nlet globalConfig: LelemonConfig = {};\nlet globalTransport: Transport | null = null;\nlet initialized = false;\n\n// ─────────────────────────────────────────────────────────────\n// Public API\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Initialize the SDK (optional, will auto-init with env vars)\n *\n * @example\n * init({ apiKey: 'le_xxx' });\n * init({ apiKey: 'le_xxx', debug: true });\n */\nexport function init(config: LelemonConfig = {}): void {\n globalConfig = config;\n globalTransport = createTransport(config);\n initialized = true;\n}\n\n/**\n * Start a new trace\n *\n * @example\n * const t = trace({ input: userMessage });\n * try {\n * const result = await myAgent(userMessage);\n * t.success(result.messages);\n * } catch (error) {\n * t.error(error);\n * throw error;\n * }\n */\nexport function trace(options: TraceOptions): Trace {\n const transport = getTransport();\n const debug = globalConfig.debug ?? false;\n const disabled = globalConfig.disabled ?? !transport.isEnabled();\n\n return new Trace(options, transport, debug, disabled);\n}\n\n/**\n * Flush all pending traces to the server\n * Call this before process exit in serverless environments\n *\n * @example\n * // In Next.js API route\n * export async function POST(req: Request) {\n * // ... your code with traces ...\n * await flush();\n * return Response.json(result);\n * }\n *\n * // With Vercel waitUntil\n * import { waitUntil } from '@vercel/functions';\n * waitUntil(flush());\n */\nexport async function flush(): Promise<void> {\n if (globalTransport) {\n await globalTransport.flush();\n }\n}\n\n/**\n * Check if SDK is enabled\n */\nexport function isEnabled(): boolean {\n return getTransport().isEnabled();\n}\n\n// ─────────────────────────────────────────────────────────────\n// Trace class\n// ─────────────────────────────────────────────────────────────\n\nexport class Trace {\n private id: string | null = null;\n private idPromise: Promise<string | null>;\n private readonly transport: Transport;\n private readonly startTime: number;\n private readonly debug: boolean;\n private readonly disabled: boolean;\n private completed = false;\n private llmCalls: ParsedLLMCall[] = [];\n\n constructor(\n options: TraceOptions,\n transport: Transport,\n debug: boolean,\n disabled: boolean\n ) {\n this.transport = transport;\n this.startTime = Date.now();\n this.debug = debug;\n this.disabled = disabled;\n\n // Enqueue trace creation immediately\n if (disabled) {\n this.idPromise = Promise.resolve(null);\n } else {\n this.idPromise = transport.enqueueCreate({\n name: options.name,\n sessionId: options.sessionId,\n userId: options.userId,\n input: options.input,\n metadata: options.metadata,\n tags: options.tags,\n });\n\n // Resolve ID when available (for internal use)\n this.idPromise.then((id) => {\n this.id = id;\n });\n }\n }\n\n /**\n * Log an LLM response for token tracking\n * Optional - use if you want per-call token counts\n */\n log(response: unknown): this {\n if (this.disabled || this.completed) return this;\n\n const parsed = parseResponse(response);\n if (parsed.model || parsed.inputTokens || parsed.outputTokens) {\n this.llmCalls.push(parsed);\n }\n\n return this;\n }\n\n /**\n * Complete trace successfully (fire-and-forget)\n *\n * @param messages - Full message history (OpenAI/Anthropic format)\n */\n success(messages: unknown): void {\n if (this.completed || this.disabled) return;\n this.completed = true;\n\n const durationMs = Date.now() - this.startTime;\n const parsed = parseMessages(messages);\n const allLLMCalls = [...this.llmCalls, ...parsed.llmCalls];\n const { totalInputTokens, totalOutputTokens, models } = this.aggregateCalls(allLLMCalls);\n\n // Wait for ID, then enqueue completion\n this.idPromise.then((id) => {\n if (!id) return;\n\n this.transport.enqueueComplete(id, {\n status: 'completed',\n output: parsed.output,\n systemPrompt: parsed.systemPrompt,\n llmCalls: allLLMCalls,\n toolCalls: parsed.toolCalls,\n models,\n totalInputTokens,\n totalOutputTokens,\n durationMs,\n });\n });\n }\n\n /**\n * Complete trace with error (fire-and-forget)\n *\n * @param error - The error that occurred\n * @param messages - Optional message history up to failure\n */\n error(error: Error | unknown, messages?: unknown): void {\n if (this.completed || this.disabled) return;\n this.completed = true;\n\n const durationMs = Date.now() - this.startTime;\n const parsed = messages ? parseMessages(messages) : null;\n const errorObj = error instanceof Error ? error : new Error(String(error));\n const allLLMCalls = parsed\n ? [...this.llmCalls, ...parsed.llmCalls]\n : this.llmCalls;\n const { totalInputTokens, totalOutputTokens, models } = this.aggregateCalls(allLLMCalls);\n\n // Wait for ID, then enqueue completion\n this.idPromise.then((id) => {\n if (!id) return;\n\n this.transport.enqueueComplete(id, {\n status: 'error',\n errorMessage: errorObj.message,\n errorStack: errorObj.stack,\n output: parsed?.output,\n systemPrompt: parsed?.systemPrompt,\n llmCalls: allLLMCalls.length > 0 ? allLLMCalls : undefined,\n toolCalls: parsed?.toolCalls,\n models: models.length > 0 ? models : undefined,\n totalInputTokens,\n totalOutputTokens,\n durationMs,\n });\n });\n }\n\n /**\n * Get the trace ID (may be null if not yet created or failed)\n */\n getId(): string | null {\n return this.id;\n }\n\n /**\n * Wait for trace ID to be available\n */\n async waitForId(): Promise<string | null> {\n return this.idPromise;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Private methods\n // ─────────────────────────────────────────────────────────────\n\n private aggregateCalls(calls: ParsedLLMCall[]): {\n totalInputTokens: number;\n totalOutputTokens: number;\n models: string[];\n } {\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n const modelSet = new Set<string>();\n\n for (const call of calls) {\n if (call.inputTokens) totalInputTokens += call.inputTokens;\n if (call.outputTokens) totalOutputTokens += call.outputTokens;\n if (call.model) modelSet.add(call.model);\n }\n\n return {\n totalInputTokens,\n totalOutputTokens,\n models: Array.from(modelSet),\n };\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Internal helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction getTransport(): Transport {\n if (!globalTransport) {\n globalTransport = createTransport(globalConfig);\n }\n return globalTransport;\n}\n\nfunction createTransport(config: LelemonConfig): Transport {\n const apiKey = config.apiKey ?? getEnvVar('LELEMON_API_KEY');\n\n if (!apiKey && !config.disabled) {\n console.warn(\n '[Lelemon] No API key provided. Set apiKey in config or LELEMON_API_KEY env var. Tracing disabled.'\n );\n }\n\n return new Transport({\n apiKey: apiKey ?? '',\n endpoint: config.endpoint ?? DEFAULT_ENDPOINT,\n debug: config.debug ?? false,\n disabled: config.disabled ?? !apiKey,\n batchSize: config.batchSize,\n flushIntervalMs: config.flushIntervalMs,\n requestTimeoutMs: config.requestTimeoutMs,\n });\n}\n\nfunction getEnvVar(name: string): string | undefined {\n if (typeof process !== 'undefined' && process.env) {\n return process.env[name];\n }\n return undefined;\n}\n"]}
package/package.json CHANGED
@@ -1,72 +1,73 @@
1
- {
2
- "name": "@lelemondev/sdk",
3
- "version": "0.1.0",
4
- "description": "Low-friction LLM observability. 3 lines of code.",
5
- "author": "Lelemon <info@lelemon.dev>",
6
- "license": "MIT",
7
- "repository": {
8
- "type": "git",
9
- "url": "git+https://github.com/lelemondev/lelemon.git",
10
- "directory": "packages/sdk"
11
- },
12
- "homepage": "https://lelemon.dev",
13
- "bugs": {
14
- "url": "https://github.com/lelemondev/lelemon/issues"
15
- },
16
- "keywords": [
17
- "llm",
18
- "observability",
19
- "tracing",
20
- "openai",
21
- "anthropic",
22
- "gemini",
23
- "bedrock",
24
- "claude",
25
- "gpt",
26
- "ai",
27
- "monitoring",
28
- "analytics",
29
- "langchain",
30
- "agent"
31
- ],
32
- "main": "./dist/index.js",
33
- "module": "./dist/index.mjs",
34
- "types": "./dist/index.d.ts",
35
- "exports": {
36
- ".": {
37
- "types": "./dist/index.d.ts",
38
- "bun": "./dist/index.mjs",
39
- "deno": "./dist/index.mjs",
40
- "import": "./dist/index.mjs",
41
- "require": "./dist/index.js",
42
- "default": "./dist/index.mjs"
43
- },
44
- "./package.json": "./package.json"
45
- },
46
- "typesVersions": {
47
- "*": {
48
- "*": ["./dist/index.d.ts"]
49
- }
50
- },
51
- "files": [
52
- "dist",
53
- "README.md"
54
- ],
55
- "sideEffects": false,
56
- "engines": {
57
- "node": ">=18.0.0"
58
- },
59
- "scripts": {
60
- "build": "tsup",
61
- "dev": "tsup --watch",
62
- "prepublishOnly": "npm run build",
63
- "lint": "eslint src/",
64
- "test": "vitest",
65
- "typecheck": "tsc --noEmit"
66
- },
67
- "devDependencies": {
68
- "@types/node": "^20.0.0",
69
- "tsup": "^8.5.1",
70
- "typescript": "^5.9.3"
71
- }
72
- }
1
+ {
2
+ "name": "@lelemondev/sdk",
3
+ "version": "0.2.0",
4
+ "description": "Fire-and-forget LLM observability. 3 lines of code.",
5
+ "author": "Lelemon <info@lelemon.dev>",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/lelemondev/lelemondev-sdk.git"
10
+ },
11
+ "homepage": "https://lelemon.dev",
12
+ "bugs": {
13
+ "url": "https://github.com/lelemondev/lelemondev-sdk/issues"
14
+ },
15
+ "keywords": [
16
+ "llm",
17
+ "observability",
18
+ "tracing",
19
+ "openai",
20
+ "anthropic",
21
+ "gemini",
22
+ "bedrock",
23
+ "claude",
24
+ "gpt",
25
+ "ai",
26
+ "monitoring",
27
+ "analytics",
28
+ "langchain",
29
+ "agent"
30
+ ],
31
+ "main": "./dist/index.js",
32
+ "module": "./dist/index.mjs",
33
+ "types": "./dist/index.d.ts",
34
+ "exports": {
35
+ ".": {
36
+ "types": "./dist/index.d.ts",
37
+ "bun": "./dist/index.mjs",
38
+ "deno": "./dist/index.mjs",
39
+ "import": "./dist/index.mjs",
40
+ "require": "./dist/index.js",
41
+ "default": "./dist/index.mjs"
42
+ },
43
+ "./package.json": "./package.json"
44
+ },
45
+ "typesVersions": {
46
+ "*": {
47
+ "*": [
48
+ "./dist/index.d.ts"
49
+ ]
50
+ }
51
+ },
52
+ "files": [
53
+ "dist",
54
+ "README.md"
55
+ ],
56
+ "sideEffects": false,
57
+ "engines": {
58
+ "node": ">=18.0.0"
59
+ },
60
+ "scripts": {
61
+ "build": "tsup",
62
+ "dev": "tsup --watch",
63
+ "prepublishOnly": "npm run build",
64
+ "lint": "eslint src/",
65
+ "test": "vitest",
66
+ "typecheck": "tsc --noEmit"
67
+ },
68
+ "devDependencies": {
69
+ "@types/node": "^20.0.0",
70
+ "tsup": "^8.5.1",
71
+ "typescript": "^5.9.3"
72
+ }
73
+ }