@lelemondev/sdk 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/transport.ts","../src/parser.ts","../src/tracer.ts"],"names":[],"mappings":";;;;;;;;AAkDA,IAAM,kBAAA,GAAqB,EAAA;AAC3B,IAAM,yBAAA,GAA4B,GAAA;AAClC,IAAM,0BAAA,GAA6B,GAAA;AAE5B,IAAM,YAAN,MAAgB;AAAA,EAQrB,YAAY,MAAA,EAAyB;AAPrC,IAAA,aAAA,CAAA,IAAA,EAAiB,QAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAQ,SAAqB,EAAC,CAAA;AAC9B,IAAA,aAAA,CAAA,IAAA,EAAQ,cAAA,EAAqC,IAAA,CAAA;AAC7C,IAAA,aAAA,CAAA,IAAA,EAAQ,YAAA,EAAmD,IAAA,CAAA;AAC3D,IAAA,aAAA,CAAA,IAAA,EAAQ,kBAAA,sBAAmD,GAAA,EAAI,CAAA;AAC/D,IAAA,aAAA,CAAA,IAAA,EAAQ,WAAA,EAAY,CAAA,CAAA;AAGlB,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,SAAA,EAAW,OAAO,SAAA,IAAa,kBAAA;AAAA,MAC/B,eAAA,EAAiB,OAAO,eAAA,IAAmB,yBAAA;AAAA,MAC3C,gBAAA,EAAkB,OAAO,gBAAA,IAAoB;AAAA,KAC/C;AAAA,EACF;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,cAAc,IAAA,EAAkD;AAC9D,IAAA,IAAI,IAAA,CAAK,OAAO,QAAA,EAAU;AACxB,MAAA,OAAO,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAAA,IAC7B;AAEA,IAAA,MAAM,MAAA,GAAS,KAAK,cAAA,EAAe;AAEnC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,MAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAA;AACzC,MAAA,IAAA,CAAK,QAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,MAAM,CAAA;AAAA,IAC/C,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,CAAgB,SAAiB,IAAA,EAAkC;AACjE,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,QAAA,IAAY,CAAC,OAAA,EAAS;AACpC,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAQ,EAAE,IAAA,EAAM,UAAA,EAAY,OAAA,EAAS,MAAM,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAA,GAAuB;AAE3B,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,OAAO,IAAA,CAAK,YAAA;AAAA,IACd;AAGA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAC3B,MAAA;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAG1B,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,IAAA,IAAA,CAAK,QAAQ,EAAC;AAGd,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAE,QAAQ,MAAM;AACtD,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACtB,CAAC,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAA0B;AACxB,IAAA,OAAO,KAAK,KAAA,CAAM,MAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAA,GAAyB;AAC/B,IAAA,OAAO,QAAQ,EAAE,IAAA,CAAK,SAAS,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,EAC/C;AAAA,EAEQ,QAAQ,IAAA,EAAuB;AACrC,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,IAAI,CAAA;AAEpB,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,IAAA,CAAK,OAAO,SAAA,EAAW;AAE9C,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,aAAA,EAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM;AAC5B,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAA,GAAa,WAAW,MAAM;AACjC,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,eAAe,CAAA;AAAA,EAChC;AAAA,EAEQ,oBAAA,GAA6B;AACnC,IAAA,IAAI,IAAA,CAAK,eAAe,IAAA,EAAM;AAC5B,MAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5B,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAc,UAAU,KAAA,EAAmC;AAEzD,IAAA,MAAM,OAAA,GAAwB;AAAA,MAC5B,SAAS,EAAC;AAAA,MACV,WAAW;AAAC,KACd;AAEA,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,QAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,EAAE,MAAA,EAAQ,KAAK,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,MAC/D,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,SAAA,CAAU,KAAK,EAAE,OAAA,EAAS,KAAK,OAAA,EAAS,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,MACnE;AAAA,IACF;AAGA,IAAA,IAAI,QAAQ,OAAA,CAAQ,MAAA,KAAW,KAAK,OAAA,CAAQ,SAAA,CAAU,WAAW,CAAA,EAAG;AAClE,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAI,eAAA,EAAiB;AAAA,MACxB,OAAA,EAAS,QAAQ,OAAA,CAAQ,MAAA;AAAA,MACzB,SAAA,EAAW,QAAQ,SAAA,CAAU;AAAA,KAC9B,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA;AAAA,QAC1B,MAAA;AAAA,QACA,sBAAA;AAAA,QACA;AAAA,OACF;AAGA,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,KAAA,MAAW,CAAC,QAAQ,MAAM,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AAC/D,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,MAAM,CAAA;AACjD,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,QAAA,CAAS,MAAM,CAAA;AACf,YAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,MAAM,CAAA;AAAA,UACrC;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,QAAA,CAAS,MAAA,EAAQ,MAAA,IAAU,IAAA,CAAK,OAAO,KAAA,EAAO;AAChD,QAAA,OAAA,CAAQ,IAAA,CAAK,yBAAA,EAA2B,QAAA,CAAS,MAAM,CAAA;AAAA,MACzD;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,KAAK,MAAM,CAAA;AACtD,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,QAAA,CAAS,IAAI,CAAA;AACb,YAAA,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,UAC1C;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,GAAA,CAAI,gBAAgB,KAAK,CAAA;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,MAAc,OAAA,CAAW,MAAA,EAAgB,IAAA,EAAc,IAAA,EAA4B;AACjF,IAAA,MAAM,MAAM,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,QAAQ,GAAG,IAAI,CAAA,CAAA;AAC1C,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AAGvC,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM;AACjC,MAAA,UAAA,CAAW,KAAA,EAAM;AAAA,IACnB,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,gBAAgB,CAAA;AAE/B,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,eAAA,EAAiB,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAAA,SAC/C;AAAA,QACA,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,QACpC,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,YAAY,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,eAAe,CAAA;AACnE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,EAAA,EAAK,SAAS,CAAA,CAAE,CAAA;AAAA,MACzD;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,OAAO,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,IAAK,EAAC;AAAA,IACrC,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACzD,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,IAAA,CAAK,MAAA,CAAO,gBAAgB,CAAA,EAAA,CAAI,CAAA;AAAA,MAC3E;AAEA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,GAAA,CAAI,SAAiB,IAAA,EAAsB;AACjD,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,IAAI,SAAS,MAAA,EAAW;AACtB,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA;AAAA,MAC1C,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,OAAO,CAAA,CAAE,CAAA;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AACF,CAAA;;;AC/PA,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;;;ACrbA,IAAM,gBAAA,GAAmB,yBAAA;AAMzB,IAAI,eAA8B,EAAC;AACnC,IAAI,eAAA,GAAoC,IAAA;AAcjC,SAAS,IAAA,CAAK,MAAA,GAAwB,EAAC,EAAS;AACrD,EAAA,YAAA,GAAe,MAAA;AACf,EAAA,eAAA,GAAkB,gBAAgB,MAAM,CAAA;AAE1C;AAeO,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,OAAO,IAAI,KAAA,CAAM,OAAA,EAAS,SAAA,EAAW,OAAO,QAAQ,CAAA;AACtD;AAkBA,eAAsB,KAAA,GAAuB;AAC3C,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAM,gBAAgB,KAAA,EAAM;AAAA,EAC9B;AACF;AAKO,SAAS,SAAA,GAAqB;AACnC,EAAA,OAAO,YAAA,GAAe,SAAA,EAAU;AAClC;AAMO,IAAM,QAAN,MAAY;AAAA,EAUjB,WAAA,CACE,OAAA,EACA,SAAA,EACA,KAAA,EACA,QAAA,EACA;AAdF,IAAA,aAAA,CAAA,IAAA,EAAQ,IAAA,EAAoB,IAAA,CAAA;AAC5B,IAAA,aAAA,CAAA,IAAA,EAAQ,WAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAiB,WAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAiB,WAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAiB,OAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAiB,UAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAQ,WAAA,EAAY,KAAA,CAAA;AACpB,IAAA,aAAA,CAAA,IAAA,EAAQ,YAA4B,EAAC,CAAA;AAQnC,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;AAGhB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,SAAA,GAAY,UAAU,aAAA,CAAc;AAAA,QACvC,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,MAAM,OAAA,CAAQ;AAAA,OACf,CAAA;AAGD,MAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,CAAC,EAAA,KAAO;AAC1B,QAAA,IAAA,CAAK,EAAA,GAAK,EAAA;AAAA,MACZ,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,QAAA,EAAyB;AAC3B,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,SAAA,EAAW,OAAO,IAAA;AAE5C,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;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,QAAA,EAAyB;AAC/B,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,QAAA,EAAU;AACrC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAEjB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,SAAA;AACrC,IAAA,MAAM,MAAA,GAAS,cAAc,QAAQ,CAAA;AACrC,IAAA,MAAM,cAAc,CAAC,GAAG,KAAK,QAAA,EAAU,GAAG,OAAO,QAAQ,CAAA;AACzD,IAAA,MAAM,EAAE,gBAAA,EAAkB,iBAAA,EAAmB,QAAO,GAAI,IAAA,CAAK,eAAe,WAAW,CAAA;AAGvF,IAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,CAAC,EAAA,KAAO;AAC1B,MAAA,IAAI,CAAC,EAAA,EAAI;AAET,MAAA,IAAA,CAAK,SAAA,CAAU,gBAAgB,EAAA,EAAI;AAAA,QACjC,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;AAAA,QACA,gBAAA;AAAA,QACA,iBAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAA,CAAM,OAAwB,QAAA,EAA0B;AACtD,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,QAAA,EAAU;AACrC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAEjB,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;AACpD,IAAA,MAAM,QAAA,GAAW,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AACzE,IAAA,MAAM,WAAA,GAAc,MAAA,GAChB,CAAC,GAAG,IAAA,CAAK,UAAU,GAAG,MAAA,CAAO,QAAQ,CAAA,GACrC,IAAA,CAAK,QAAA;AACT,IAAA,MAAM,EAAE,gBAAA,EAAkB,iBAAA,EAAmB,QAAO,GAAI,IAAA,CAAK,eAAe,WAAW,CAAA;AAGvF,IAAA,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,CAAC,EAAA,KAAO;AAC1B,MAAA,IAAI,CAAC,EAAA,EAAI;AAET,MAAA,IAAA,CAAK,SAAA,CAAU,gBAAgB,EAAA,EAAI;AAAA,QACjC,MAAA,EAAQ,OAAA;AAAA,QACR,cAAc,QAAA,CAAS,OAAA;AAAA,QACvB,YAAY,QAAA,CAAS,KAAA;AAAA,QACrB,QAAQ,MAAA,EAAQ,MAAA;AAAA,QAChB,cAAc,MAAA,EAAQ,YAAA;AAAA,QACtB,QAAA,EAAU,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,WAAA,GAAc,MAAA;AAAA,QACjD,WAAW,MAAA,EAAQ,SAAA;AAAA,QACnB,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,MAAA;AAAA,QACrC,gBAAA;AAAA,QACA,iBAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,EAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,GAAoC;AACxC,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAe,KAAA,EAIrB;AACA,IAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,IAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AAEjC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,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,QAAA,CAAS,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,IACzC;AAEA,IAAA,OAAO;AAAA,MACL,gBAAA;AAAA,MACA,iBAAA;AAAA,MACA,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,QAAQ;AAAA,KAC7B;AAAA,EACF;AACF;AAMA,SAAS,YAAA,GAA0B;AACjC,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,eAAA,GAAkB,gBAAgB,YAAY,CAAA;AAAA,EAChD;AACA,EAAA,OAAO,eAAA;AACT;AAEA,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,MAAA;AAAA,IAC9B,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,iBAAiB,MAAA,CAAO,eAAA;AAAA,IACxB,kBAAkB,MAAA,CAAO;AAAA,GAC1B,CAAA;AACH;AAEA,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","file":"index.js","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"]}
1
+ {"version":3,"sources":["../src/core/transport.ts","../src/core/config.ts","../src/providers/base.ts","../src/core/capture.ts","../src/providers/openai.ts","../src/providers/anthropic.ts","../src/observe.ts"],"names":["PROVIDER_NAME","canHandle","isAsyncIterable","wrapStream","extractTokens"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Transport Layer\n *\n * Handles batched HTTP requests to the Lelemon API.\n * Features:\n * - Queue-based batching\n * - Auto-flush on batch size or interval\n * - Request timeout protection\n * - Graceful error handling\n */\n\nimport type { CreateTraceRequest } from './types';\n\n// ─────────────────────────────────────────────────────────────\n// Configuration\n// ─────────────────────────────────────────────────────────────\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\nconst DEFAULT_BATCH_SIZE = 10;\nconst DEFAULT_FLUSH_INTERVAL_MS = 1000;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 10000;\n\n// ─────────────────────────────────────────────────────────────\n// Transport Class\n// ─────────────────────────────────────────────────────────────\n\nexport class Transport {\n private readonly config: Required<TransportConfig>;\n private queue: CreateTraceRequest[] = [];\n private flushPromise: Promise<void> | null = null;\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\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 a trace for sending\n * Fire-and-forget - never blocks\n */\n enqueue(trace: CreateTraceRequest): void {\n if (this.config.disabled) return;\n\n this.queue.push(trace);\n\n if (this.queue.length >= this.config.batchSize) {\n this.flush();\n } else {\n this.scheduleFlush();\n }\n }\n\n /**\n * Flush all pending traces\n * Safe to call multiple times\n */\n async flush(): Promise<void> {\n if (this.flushPromise) {\n return this.flushPromise;\n }\n\n if (this.queue.length === 0) {\n return;\n }\n\n this.cancelScheduledFlush();\n\n const items = this.queue;\n this.queue = [];\n\n this.flushPromise = this.sendBatch(items).finally(() => {\n this.flushPromise = null;\n });\n\n return this.flushPromise;\n }\n\n /**\n * Get pending count (for debugging)\n */\n getPendingCount(): number {\n return this.queue.length;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Private Methods\n // ─────────────────────────────────────────────────────────────\n\n private scheduleFlush(): void {\n if (this.flushTimer !== null) return;\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: CreateTraceRequest[]): Promise<void> {\n if (items.length === 0) return;\n\n this.log(`Sending batch of ${items.length} traces`);\n\n try {\n await this.request('POST', '/api/v1/traces/batch', { traces: items });\n } catch (error) {\n this.log('Batch send failed', error);\n // Don't rethrow - observability should never crash the app\n }\n }\n\n private async request(method: string, path: string, body?: unknown): Promise<unknown> {\n const url = `${this.config.endpoint}${path}`;\n const controller = new AbortController();\n\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) : {};\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 * Global Configuration\n *\n * Manages SDK configuration and transport instance.\n */\n\nimport type { LelemonConfig } from './types';\nimport { Transport } from './transport';\n\n// ─────────────────────────────────────────────────────────────\n// Global State\n// ─────────────────────────────────────────────────────────────\n\nlet globalConfig: LelemonConfig = {};\nlet globalTransport: Transport | null = null;\nlet initialized = false;\n\n// ─────────────────────────────────────────────────────────────\n// Configuration\n// ─────────────────────────────────────────────────────────────\n\nconst DEFAULT_ENDPOINT = 'https://api.lelemon.dev';\n\n/**\n * Initialize the SDK\n * Call once at app startup\n */\nexport function init(config: LelemonConfig = {}): void {\n globalConfig = config;\n globalTransport = createTransport(config);\n initialized = true;\n}\n\n/**\n * Get current config\n */\nexport function getConfig(): LelemonConfig {\n return globalConfig;\n}\n\n/**\n * Check if SDK is initialized\n */\nexport function isInitialized(): boolean {\n return initialized;\n}\n\n/**\n * Check if SDK is enabled\n */\nexport function isEnabled(): boolean {\n return getTransport().isEnabled();\n}\n\n// ─────────────────────────────────────────────────────────────\n// Transport\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Get or create transport instance\n */\nexport function getTransport(): Transport {\n if (!globalTransport) {\n globalTransport = createTransport(globalConfig);\n }\n return globalTransport;\n}\n\n/**\n * Flush all pending traces\n */\nexport async function flush(): Promise<void> {\n if (globalTransport) {\n await globalTransport.flush();\n }\n}\n\n/**\n * Create transport instance\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 init() 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\n/**\n * Get environment variable (works in Node and edge)\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","/**\n * Base Provider Interface\n *\n * All provider wrappers must implement this interface.\n * Uses Strategy pattern for different LLM providers.\n */\n\nimport type { ProviderName, TokenUsage } from '../core/types';\n\n// ─────────────────────────────────────────────────────────────\n// Provider Interface\n// ─────────────────────────────────────────────────────────────\n\nexport interface BaseProvider<TClient = unknown> {\n /** Provider name */\n readonly name: ProviderName;\n\n /**\n * Check if this provider can handle the given client\n */\n canHandle(client: unknown): boolean;\n\n /**\n * Wrap the client with tracing\n */\n wrap(client: TClient): TClient;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Extraction Interfaces\n// ─────────────────────────────────────────────────────────────\n\nexport interface ExtractedData {\n model: string;\n input: unknown;\n output: unknown;\n tokens: TokenUsage | null;\n streaming: boolean;\n}\n\nexport interface RequestInfo {\n model: string;\n input: unknown;\n streaming: boolean;\n}\n\nexport interface ResponseInfo {\n output: unknown;\n tokens: TokenUsage | null;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Method Wrapper Types\n// ─────────────────────────────────────────────────────────────\n\nexport type AsyncMethod = (...args: unknown[]) => Promise<unknown>;\n\nexport interface WrapContext {\n provider: ProviderName;\n method: string;\n startTime: number;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Helper: Safe extraction with fallback\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Safely extract a value with fallback\n * Never throws, always returns fallback on error\n */\nexport function safeExtract<T>(\n fn: () => T,\n fallback: T\n): T {\n try {\n return fn() ?? fallback;\n } catch {\n return fallback;\n }\n}\n\n/**\n * Safely extract nested property\n */\nexport function getNestedValue(obj: unknown, path: string): unknown {\n try {\n const parts = path.split('.');\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current == null || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n return current;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Check if value is a valid number\n */\nexport function isValidNumber(value: unknown): value is number {\n return typeof value === 'number' && !isNaN(value) && isFinite(value);\n}\n","/**\n * Capture Module\n *\n * Handles trace capture and batching.\n * Called by providers to record LLM calls.\n */\n\nimport type { ProviderName, CreateTraceRequest, ObserveOptions } from './types';\nimport { getTransport } from './config';\n\n// ─────────────────────────────────────────────────────────────\n// Global context (set via observe options)\n// ─────────────────────────────────────────────────────────────\n\nlet globalContext: ObserveOptions = {};\n\nexport function setGlobalContext(options: ObserveOptions): void {\n globalContext = options;\n}\n\nexport function getGlobalContext(): ObserveOptions {\n return globalContext;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Capture Functions\n// ─────────────────────────────────────────────────────────────\n\nexport interface CaptureTraceParams {\n provider: ProviderName;\n model: string;\n input: unknown;\n output: unknown;\n inputTokens: number;\n outputTokens: number;\n durationMs: number;\n status: 'success' | 'error';\n streaming: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CaptureErrorParams {\n provider: ProviderName;\n model: string;\n input: unknown;\n error: Error;\n durationMs: number;\n streaming: boolean;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Capture a successful trace\n * Fire-and-forget - never throws\n */\nexport function captureTrace(params: CaptureTraceParams): void {\n try {\n const transport = getTransport();\n if (!transport.isEnabled()) return;\n\n const context = getGlobalContext();\n\n const request: CreateTraceRequest = {\n provider: params.provider,\n model: params.model,\n input: sanitizeInput(params.input),\n output: sanitizeOutput(params.output),\n inputTokens: params.inputTokens,\n outputTokens: params.outputTokens,\n durationMs: params.durationMs,\n status: params.status,\n streaming: params.streaming,\n sessionId: context.sessionId,\n userId: context.userId,\n metadata: { ...context.metadata, ...params.metadata },\n tags: context.tags,\n };\n\n transport.enqueue(request);\n } catch {\n // Silently ignore - observability should never crash the app\n }\n}\n\n/**\n * Capture an error trace\n * Fire-and-forget - never throws\n */\nexport function captureError(params: CaptureErrorParams): void {\n try {\n const transport = getTransport();\n if (!transport.isEnabled()) return;\n\n const context = getGlobalContext();\n\n const request: CreateTraceRequest = {\n provider: params.provider,\n model: params.model,\n input: sanitizeInput(params.input),\n output: null,\n inputTokens: 0,\n outputTokens: 0,\n durationMs: params.durationMs,\n status: 'error',\n errorMessage: params.error.message,\n errorStack: params.error.stack,\n streaming: params.streaming,\n sessionId: context.sessionId,\n userId: context.userId,\n metadata: { ...context.metadata, ...params.metadata },\n tags: context.tags,\n };\n\n transport.enqueue(request);\n } catch {\n // Silently ignore\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Sanitization (security)\n// ─────────────────────────────────────────────────────────────\n\nconst MAX_STRING_LENGTH = 100_000; // 100KB per field\nconst SENSITIVE_KEYS = ['api_key', 'apikey', 'password', 'secret', 'token', 'authorization'];\n\n/**\n * Sanitize input before sending\n * - Truncates large strings\n * - Removes sensitive data\n */\nfunction sanitizeInput(input: unknown): unknown {\n return sanitize(input, 0);\n}\n\n/**\n * Sanitize output before sending\n */\nfunction sanitizeOutput(output: unknown): unknown {\n return sanitize(output, 0);\n}\n\nfunction sanitize(value: unknown, depth: number): unknown {\n // Prevent infinite recursion\n if (depth > 10) return '[max depth exceeded]';\n\n if (value === null || value === undefined) return value;\n\n if (typeof value === 'string') {\n return value.length > MAX_STRING_LENGTH\n ? value.slice(0, MAX_STRING_LENGTH) + '...[truncated]'\n : value;\n }\n\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => sanitize(item, depth + 1));\n }\n\n if (typeof value === 'object') {\n const sanitized: Record<string, unknown> = {};\n\n for (const [key, val] of Object.entries(value)) {\n // Redact sensitive keys\n if (SENSITIVE_KEYS.some((k) => key.toLowerCase().includes(k))) {\n sanitized[key] = '[REDACTED]';\n } else {\n sanitized[key] = sanitize(val, depth + 1);\n }\n }\n\n return sanitized;\n }\n\n // Functions, symbols, etc.\n return String(value);\n}\n","/**\n * OpenAI Provider Wrapper\n *\n * Wraps the OpenAI SDK to automatically capture:\n * - chat.completions.create()\n * - completions.create() (legacy)\n * - embeddings.create()\n *\n * Supports both streaming and non-streaming responses.\n */\n\nimport type { ProviderName, TokenUsage } from '../core/types';\nimport { safeExtract, getNestedValue, isValidNumber } from './base';\nimport { captureTrace, captureError } from '../core/capture';\n\n// ─────────────────────────────────────────────────────────────\n// Types (minimal, to avoid SDK dependency)\n// ─────────────────────────────────────────────────────────────\n\ninterface OpenAIClient {\n chat?: {\n completions: {\n create: (...args: unknown[]) => Promise<unknown>;\n };\n };\n completions?: {\n create: (...args: unknown[]) => Promise<unknown>;\n };\n embeddings?: {\n create: (...args: unknown[]) => Promise<unknown>;\n };\n}\n\ninterface ChatCompletionRequest {\n model?: string;\n messages?: unknown[];\n stream?: boolean;\n [key: string]: unknown;\n}\n\ninterface StreamChunk {\n choices?: Array<{\n delta?: {\n content?: string;\n role?: string;\n };\n finish_reason?: string;\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Provider Implementation\n// ─────────────────────────────────────────────────────────────\n\nexport const PROVIDER_NAME: ProviderName = 'openai';\n\n/**\n * Check if client is OpenAI SDK\n */\nexport function canHandle(client: unknown): boolean {\n if (!client || typeof client !== 'object') return false;\n\n // Check constructor name\n const constructorName = client.constructor?.name;\n if (constructorName === 'OpenAI') return true;\n\n // Check for characteristic properties\n const c = client as Record<string, unknown>;\n return !!(c.chat && c.completions);\n}\n\n/**\n * Wrap OpenAI client with tracing\n */\nexport function wrap(client: unknown): unknown {\n const openaiClient = client as OpenAIClient;\n return new Proxy(openaiClient, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n // Wrap nested objects (chat, completions, etc.)\n if (prop === 'chat' && value && typeof value === 'object') {\n return wrapChatNamespace(value as OpenAIClient['chat']);\n }\n\n if (prop === 'completions' && value && typeof value === 'object') {\n return wrapCompletionsNamespace(value as OpenAIClient['completions']);\n }\n\n if (prop === 'embeddings' && value && typeof value === 'object') {\n return wrapEmbeddingsNamespace(value as OpenAIClient['embeddings']);\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Namespace Wrappers\n// ─────────────────────────────────────────────────────────────\n\nfunction wrapChatNamespace(chat: OpenAIClient['chat']) {\n if (!chat) return chat;\n\n return new Proxy(chat, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'completions' && value && typeof value === 'object') {\n return wrapChatCompletions(value as { create: (...args: unknown[]) => Promise<unknown> });\n }\n\n return value;\n },\n });\n}\n\nfunction wrapChatCompletions(completions: { create: (...args: unknown[]) => Promise<unknown> }) {\n return new Proxy(completions, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return wrapChatCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\nfunction wrapCompletionsNamespace(completions: OpenAIClient['completions']) {\n if (!completions) return completions;\n\n return new Proxy(completions, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return wrapLegacyCompletionCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\nfunction wrapEmbeddingsNamespace(embeddings: OpenAIClient['embeddings']) {\n if (!embeddings) return embeddings;\n\n return new Proxy(embeddings, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return wrapEmbeddingsCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Method Wrappers\n// ─────────────────────────────────────────────────────────────\n\nexport function wrapChatCreate(originalFn: (...args: unknown[]) => Promise<unknown>) {\n return async function wrappedChatCreate(...args: unknown[]): Promise<unknown> {\n const startTime = Date.now();\n const request = (args[0] || {}) as ChatCompletionRequest;\n const isStreaming = request.stream === true;\n\n try {\n const response = await originalFn(...args);\n\n if (isStreaming && isAsyncIterable(response)) {\n // Return wrapped stream\n return wrapStream(response, request, startTime);\n }\n\n // Non-streaming response\n const durationMs = Date.now() - startTime;\n const extracted = extractChatCompletion(response);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: request.model || extracted.model || 'unknown',\n input: request.messages,\n output: extracted.output,\n inputTokens: extracted.tokens?.inputTokens || 0,\n outputTokens: extracted.tokens?.outputTokens || 0,\n durationMs,\n status: 'success',\n streaming: false,\n });\n\n return response;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: request.messages,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: isStreaming,\n });\n\n throw error;\n }\n };\n}\n\nexport function wrapCompletionCreate(originalFn: (...args: unknown[]) => Promise<unknown>) {\n return async function wrappedCompletionCreate(...args: unknown[]): Promise<unknown> {\n const startTime = Date.now();\n const request = (args[0] || {}) as Record<string, unknown>;\n\n try {\n const response = await originalFn(...args);\n const durationMs = Date.now() - startTime;\n const extracted = extractLegacyCompletion(response);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: (request.model as string) || extracted.model || 'unknown',\n input: request.prompt,\n output: extracted.output,\n inputTokens: extracted.tokens?.inputTokens || 0,\n outputTokens: extracted.tokens?.outputTokens || 0,\n durationMs,\n status: 'success',\n streaming: false,\n });\n\n return response;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model: (request.model as string) || 'unknown',\n input: request.prompt,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: false,\n });\n\n throw error;\n }\n };\n}\n\nexport function wrapEmbeddingsCreate(originalFn: (...args: unknown[]) => Promise<unknown>) {\n return async function wrappedEmbeddingsCreate(...args: unknown[]): Promise<unknown> {\n const startTime = Date.now();\n const request = (args[0] || {}) as Record<string, unknown>;\n\n try {\n const response = await originalFn(...args);\n const durationMs = Date.now() - startTime;\n const tokens = extractEmbeddingTokens(response);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: (request.model as string) || 'unknown',\n input: request.input,\n output: '[embedding vectors]',\n inputTokens: tokens?.inputTokens || 0,\n outputTokens: 0,\n durationMs,\n status: 'success',\n streaming: false,\n });\n\n return response;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model: (request.model as string) || 'unknown',\n input: request.input,\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: false,\n });\n\n throw error;\n }\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Streaming Support\n// ─────────────────────────────────────────────────────────────\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return value != null && typeof (value as AsyncIterable<unknown>)[Symbol.asyncIterator] === 'function';\n}\n\nasync function* wrapStream(\n stream: AsyncIterable<unknown>,\n request: ChatCompletionRequest,\n startTime: number\n): AsyncIterable<unknown> {\n const chunks: string[] = [];\n let tokens: TokenUsage | null = null;\n let error: Error | null = null;\n\n try {\n for await (const chunk of stream) {\n // Extract content from chunk\n const content = extractStreamChunkContent(chunk as StreamChunk);\n if (content) {\n chunks.push(content);\n }\n\n // Extract tokens if available (usually in last chunk)\n const chunkTokens = extractStreamChunkTokens(chunk as StreamChunk);\n if (chunkTokens) {\n tokens = chunkTokens;\n }\n\n yield chunk;\n }\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n const durationMs = Date.now() - startTime;\n const output = chunks.join('');\n\n if (error) {\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: request.messages,\n error,\n durationMs,\n streaming: true,\n });\n } else {\n captureTrace({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: request.messages,\n output,\n inputTokens: tokens?.inputTokens || 0,\n outputTokens: tokens?.outputTokens || 0,\n durationMs,\n status: 'success',\n streaming: true,\n });\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Extraction Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction extractChatCompletion(response: unknown): {\n model: string | null;\n output: unknown;\n tokens: TokenUsage | null;\n} {\n const model = safeExtract(() => getNestedValue(response, 'model') as string, null);\n const output = safeExtract(\n () => getNestedValue(response, 'choices.0.message.content') as string,\n null\n );\n const tokens = extractTokens(response);\n\n return { model, output, tokens };\n}\n\nfunction extractLegacyCompletion(response: unknown): {\n model: string | null;\n output: unknown;\n tokens: TokenUsage | null;\n} {\n const model = safeExtract(() => getNestedValue(response, 'model') as string, null);\n const output = safeExtract(\n () => getNestedValue(response, 'choices.0.text') as string,\n null\n );\n const tokens = extractTokens(response);\n\n return { model, output, tokens };\n}\n\nfunction extractTokens(response: unknown): TokenUsage | null {\n try {\n const usage = getNestedValue(response, 'usage');\n if (!usage || typeof usage !== 'object') return null;\n\n const u = usage as Record<string, unknown>;\n const promptTokens = u.prompt_tokens;\n const completionTokens = u.completion_tokens;\n const totalTokens = u.total_tokens;\n\n if (!isValidNumber(promptTokens) && !isValidNumber(completionTokens)) {\n return null;\n }\n\n return {\n inputTokens: isValidNumber(promptTokens) ? promptTokens : 0,\n outputTokens: isValidNumber(completionTokens) ? completionTokens : 0,\n totalTokens: isValidNumber(totalTokens) ? totalTokens : 0,\n };\n } catch {\n return null;\n }\n}\n\nfunction extractEmbeddingTokens(response: unknown): TokenUsage | null {\n try {\n const usage = getNestedValue(response, 'usage');\n if (!usage || typeof usage !== 'object') return null;\n\n const u = usage as Record<string, unknown>;\n const promptTokens = u.prompt_tokens;\n const totalTokens = u.total_tokens;\n\n return {\n inputTokens: isValidNumber(promptTokens) ? promptTokens : 0,\n outputTokens: 0,\n totalTokens: isValidNumber(totalTokens) ? totalTokens : 0,\n };\n } catch {\n return null;\n }\n}\n\nfunction extractStreamChunkContent(chunk: StreamChunk): string | null {\n try {\n return chunk?.choices?.[0]?.delta?.content ?? null;\n } catch {\n return null;\n }\n}\n\nfunction extractStreamChunkTokens(chunk: StreamChunk): TokenUsage | null {\n try {\n const usage = chunk?.usage;\n if (!usage) return null;\n\n return {\n inputTokens: isValidNumber(usage.prompt_tokens) ? usage.prompt_tokens : 0,\n outputTokens: isValidNumber(usage.completion_tokens) ? usage.completion_tokens : 0,\n totalTokens: 0,\n };\n } catch {\n return null;\n }\n}\n","/**\n * Anthropic Provider Wrapper\n *\n * Wraps the Anthropic SDK to automatically capture:\n * - messages.create()\n * - messages.stream()\n *\n * Supports both streaming and non-streaming responses.\n */\n\nimport type { ProviderName, TokenUsage } from '../core/types';\nimport { safeExtract, getNestedValue, isValidNumber } from './base';\nimport { captureTrace, captureError } from '../core/capture';\n\n// ─────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────\n\ninterface AnthropicClient {\n messages?: {\n create: (...args: unknown[]) => Promise<unknown>;\n stream?: (...args: unknown[]) => unknown;\n };\n completions?: {\n create: (...args: unknown[]) => Promise<unknown>;\n };\n}\n\ninterface MessageRequest {\n model?: string;\n messages?: unknown[];\n system?: string;\n stream?: boolean;\n max_tokens?: number;\n [key: string]: unknown;\n}\n\ninterface MessageResponse {\n id?: string;\n type?: string;\n role?: string;\n content?: Array<{ type: string; text?: string }>;\n model?: string;\n stop_reason?: string;\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n };\n}\n\ninterface StreamEvent {\n type: string;\n message?: MessageResponse;\n index?: number;\n content_block?: { type: string; text?: string };\n delta?: { type: string; text?: string };\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Provider Implementation\n// ─────────────────────────────────────────────────────────────\n\nexport const PROVIDER_NAME: ProviderName = 'anthropic';\n\n/**\n * Check if client is Anthropic SDK\n */\nexport function canHandle(client: unknown): boolean {\n if (!client || typeof client !== 'object') return false;\n\n const constructorName = client.constructor?.name;\n if (constructorName === 'Anthropic') return true;\n\n // Check for characteristic properties\n const c = client as Record<string, unknown>;\n return !!(c.messages && typeof c.messages === 'object');\n}\n\n/**\n * Wrap Anthropic client with tracing\n */\nexport function wrap(client: unknown): unknown {\n const anthropicClient = client as AnthropicClient;\n return new Proxy(anthropicClient, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'messages' && value && typeof value === 'object') {\n return wrapMessagesNamespace(value as AnthropicClient['messages']);\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Namespace Wrappers\n// ─────────────────────────────────────────────────────────────\n\nfunction wrapMessagesNamespace(messages: AnthropicClient['messages']) {\n if (!messages) return messages;\n\n return new Proxy(messages, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return wrapMessagesCreate(value.bind(target));\n }\n\n if (prop === 'stream' && typeof value === 'function') {\n return wrapMessagesStream(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Method Wrappers\n// ─────────────────────────────────────────────────────────────\n\nexport function wrapMessagesCreate(originalFn: (...args: unknown[]) => Promise<unknown>) {\n return async function wrappedMessagesCreate(...args: unknown[]): Promise<unknown> {\n const startTime = Date.now();\n const request = (args[0] || {}) as MessageRequest;\n const isStreaming = request.stream === true;\n\n try {\n const response = await originalFn(...args);\n\n if (isStreaming && isAsyncIterable(response)) {\n return wrapStream(response, request, startTime);\n }\n\n // Non-streaming response\n const durationMs = Date.now() - startTime;\n const extracted = extractMessageResponse(response as MessageResponse);\n\n captureTrace({\n provider: PROVIDER_NAME,\n model: request.model || extracted.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n output: extracted.output,\n inputTokens: extracted.tokens?.inputTokens || 0,\n outputTokens: extracted.tokens?.outputTokens || 0,\n durationMs,\n status: 'success',\n streaming: false,\n });\n\n return response;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: isStreaming,\n });\n\n throw error;\n }\n };\n}\n\nexport function wrapMessagesStream(originalFn: (...args: unknown[]) => unknown) {\n return function wrappedMessagesStream(...args: unknown[]): unknown {\n const startTime = Date.now();\n const request = (args[0] || {}) as MessageRequest;\n\n try {\n const stream = originalFn(...args);\n\n // Anthropic's stream() returns a Stream object with async iterator\n if (stream && typeof stream === 'object') {\n return wrapAnthropicStream(stream, request, startTime);\n }\n\n return stream;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model: request.model || 'unknown',\n input: { system: request.system, messages: request.messages },\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: true,\n });\n\n throw error;\n }\n };\n}\n\n// ─────────────────────────────────────────────────────────────\n// Streaming Support\n// ─────────────────────────────────────────────────────────────\n\nfunction isAsyncIterable(value: unknown): value is AsyncIterable<unknown> {\n return value != null && typeof (value as AsyncIterable<unknown>)[Symbol.asyncIterator] === 'function';\n}\n\nfunction wrapAnthropicStream(\n stream: unknown,\n request: MessageRequest,\n startTime: number\n): unknown {\n // Anthropic SDK returns a Stream object with methods like finalMessage()\n // We need to wrap the async iterator and track events\n\n const originalStream = stream as {\n [Symbol.asyncIterator]?: () => AsyncIterator<StreamEvent>;\n finalMessage?: () => Promise<MessageResponse>;\n };\n\n if (!originalStream[Symbol.asyncIterator]) {\n return stream;\n }\n\n const chunks: string[] = [];\n let inputTokens = 0;\n let outputTokens = 0;\n let model = request.model || 'unknown';\n let captured = false;\n\n const wrappedIterator = async function* () {\n try {\n for await (const event of originalStream as AsyncIterable<StreamEvent>) {\n // Extract data from events\n if (event.type === 'message_start' && event.message) {\n model = event.message.model || model;\n if (event.message.usage) {\n inputTokens = event.message.usage.input_tokens || 0;\n }\n }\n\n if (event.type === 'content_block_delta' && event.delta?.text) {\n chunks.push(event.delta.text);\n }\n\n if (event.type === 'message_delta' && event.usage) {\n outputTokens = event.usage.output_tokens || 0;\n }\n\n yield event;\n }\n } catch (error) {\n if (!captured) {\n captured = true;\n const durationMs = Date.now() - startTime;\n\n captureError({\n provider: PROVIDER_NAME,\n model,\n input: { system: request.system, messages: request.messages },\n error: error instanceof Error ? error : new Error(String(error)),\n durationMs,\n streaming: true,\n });\n }\n\n throw error;\n } finally {\n if (!captured) {\n captured = true;\n const durationMs = Date.now() - startTime;\n\n captureTrace({\n provider: PROVIDER_NAME,\n model,\n input: { system: request.system, messages: request.messages },\n output: chunks.join(''),\n inputTokens,\n outputTokens,\n durationMs,\n status: 'success',\n streaming: true,\n });\n }\n }\n };\n\n // Return a proxy that preserves other methods (like finalMessage)\n return new Proxy(stream as object, {\n get(target, prop, receiver) {\n if (prop === Symbol.asyncIterator) {\n return () => wrappedIterator()[Symbol.asyncIterator]();\n }\n\n return Reflect.get(target, prop, receiver);\n },\n });\n}\n\nasync function* wrapStream(\n stream: AsyncIterable<unknown>,\n request: MessageRequest,\n startTime: number\n): AsyncIterable<unknown> {\n const chunks: string[] = [];\n let inputTokens = 0;\n let outputTokens = 0;\n let model = request.model || 'unknown';\n let error: Error | null = null;\n\n try {\n for await (const event of stream as AsyncIterable<StreamEvent>) {\n if (event.type === 'message_start' && event.message) {\n model = event.message.model || model;\n if (event.message.usage) {\n inputTokens = event.message.usage.input_tokens || 0;\n }\n }\n\n if (event.type === 'content_block_delta' && event.delta?.text) {\n chunks.push(event.delta.text);\n }\n\n if (event.type === 'message_delta' && event.usage) {\n outputTokens = event.usage.output_tokens || 0;\n }\n\n yield event;\n }\n } catch (err) {\n error = err instanceof Error ? err : new Error(String(err));\n throw err;\n } finally {\n const durationMs = Date.now() - startTime;\n\n if (error) {\n captureError({\n provider: PROVIDER_NAME,\n model,\n input: { system: request.system, messages: request.messages },\n error,\n durationMs,\n streaming: true,\n });\n } else {\n captureTrace({\n provider: PROVIDER_NAME,\n model,\n input: { system: request.system, messages: request.messages },\n output: chunks.join(''),\n inputTokens,\n outputTokens,\n durationMs,\n status: 'success',\n streaming: true,\n });\n }\n }\n}\n\n// ─────────────────────────────────────────────────────────────\n// Extraction Helpers\n// ─────────────────────────────────────────────────────────────\n\nfunction extractMessageResponse(response: MessageResponse): {\n model: string | null;\n output: string | null;\n tokens: TokenUsage | null;\n} {\n const model = safeExtract(() => response.model ?? null, null);\n\n // Extract text from content blocks\n const output = safeExtract(() => {\n if (!response.content || !Array.isArray(response.content)) return null;\n\n const textBlocks = response.content\n .filter((block) => block.type === 'text' && block.text)\n .map((block) => block.text);\n\n return textBlocks.join('') || null;\n }, null);\n\n const tokens = extractTokens(response);\n\n return { model, output, tokens };\n}\n\nfunction extractTokens(response: MessageResponse): TokenUsage | null {\n try {\n const usage = response.usage;\n if (!usage) return null;\n\n const inputTokens = usage.input_tokens;\n const outputTokens = usage.output_tokens;\n\n if (!isValidNumber(inputTokens) && !isValidNumber(outputTokens)) {\n return null;\n }\n\n return {\n inputTokens: isValidNumber(inputTokens) ? inputTokens : 0,\n outputTokens: isValidNumber(outputTokens) ? outputTokens : 0,\n totalTokens: (isValidNumber(inputTokens) ? inputTokens : 0) + (isValidNumber(outputTokens) ? outputTokens : 0),\n };\n } catch {\n return null;\n }\n}\n","/**\n * Observe Function\n *\n * Main entry point for wrapping LLM clients with automatic tracing.\n */\n\nimport * as openai from './providers/openai';\nimport * as anthropic from './providers/anthropic';\nimport { setGlobalContext } from './core/capture';\nimport { getConfig } from './core/config';\nimport type { ObserveOptions } from './core/types';\n\n// ─────────────────────────────────────────────────────────────\n// Observe Function\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Wrap an LLM client with automatic tracing\n *\n * @param client - OpenAI or Anthropic client instance\n * @param options - Optional context (sessionId, userId, etc.)\n * @returns The wrapped client with the same type\n *\n * @example\n * import { observe } from '@lelemondev/sdk';\n * import OpenAI from 'openai';\n *\n * const openai = observe(new OpenAI());\n *\n * // All calls are now automatically traced\n * const response = await openai.chat.completions.create({...});\n */\nexport function observe<T>(client: T, options?: ObserveOptions): T {\n // Set global context if provided\n if (options) {\n setGlobalContext(options);\n }\n\n // Check if disabled\n const config = getConfig();\n if (config.disabled) {\n return client;\n }\n\n // Detect and wrap based on client shape\n if (openai.canHandle(client)) {\n if (config.debug) {\n console.log('[Lelemon] Wrapping OpenAI client');\n }\n return wrapOpenAI(client) as T;\n }\n\n if (anthropic.canHandle(client)) {\n if (config.debug) {\n console.log('[Lelemon] Wrapping Anthropic client');\n }\n return wrapAnthropic(client) as T;\n }\n\n // Unknown client type\n console.warn(\n '[Lelemon] Unknown client type. Tracing not enabled. ' +\n 'Supported: OpenAI, Anthropic'\n );\n\n return client;\n}\n\n// ─────────────────────────────────────────────────────────────\n// OpenAI Wrapper\n// ─────────────────────────────────────────────────────────────\n\ninterface OpenAIShape {\n chat?: { completions: { create: CallableFunction } };\n completions?: { create: CallableFunction };\n embeddings?: { create: CallableFunction };\n}\n\nfunction wrapOpenAI(client: unknown): unknown {\n const typed = client as OpenAIShape;\n\n return new Proxy(typed, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'chat' && value && typeof value === 'object') {\n return wrapOpenAIChat(value as OpenAIShape['chat']);\n }\n\n if (prop === 'completions' && value && typeof value === 'object') {\n return wrapOpenAICompletions(value as OpenAIShape['completions']);\n }\n\n if (prop === 'embeddings' && value && typeof value === 'object') {\n return wrapOpenAIEmbeddings(value as OpenAIShape['embeddings']);\n }\n\n return value;\n },\n });\n}\n\nfunction wrapOpenAIChat(chat: OpenAIShape['chat']) {\n return new Proxy(chat!, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'completions' && value && typeof value === 'object') {\n return wrapOpenAIChatCompletions(value as { create: CallableFunction });\n }\n\n return value;\n },\n });\n}\n\nfunction wrapOpenAIChatCompletions(completions: { create: CallableFunction }) {\n return new Proxy(completions, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return openai.wrapChatCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\nfunction wrapOpenAICompletions(completions: OpenAIShape['completions']) {\n return new Proxy(completions!, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return openai.wrapCompletionCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\nfunction wrapOpenAIEmbeddings(embeddings: OpenAIShape['embeddings']) {\n return new Proxy(embeddings!, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return openai.wrapEmbeddingsCreate(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Anthropic Wrapper\n// ─────────────────────────────────────────────────────────────\n\ninterface AnthropicShape {\n messages?: {\n create: CallableFunction;\n stream?: CallableFunction;\n };\n}\n\nfunction wrapAnthropic(client: unknown): unknown {\n const typed = client as AnthropicShape;\n\n return new Proxy(typed, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'messages' && value && typeof value === 'object') {\n return wrapAnthropicMessages(value as AnthropicShape['messages']);\n }\n\n return value;\n },\n });\n}\n\nfunction wrapAnthropicMessages(messages: AnthropicShape['messages']) {\n return new Proxy(messages!, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver);\n\n if (prop === 'create' && typeof value === 'function') {\n return anthropic.wrapMessagesCreate(value.bind(target));\n }\n\n if (prop === 'stream' && typeof value === 'function') {\n return anthropic.wrapMessagesStream(value.bind(target));\n }\n\n return value;\n },\n });\n}\n\n// ─────────────────────────────────────────────────────────────\n// Factory Function\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Create a scoped observe function with preset context\n *\n * @example\n * const observeWithSession = createObserve({\n * sessionId: 'session-123',\n * userId: 'user-456',\n * });\n *\n * const openai = observeWithSession(new OpenAI());\n */\nexport function createObserve(defaultOptions: ObserveOptions) {\n return function scopedObserve<T>(client: T, options?: ObserveOptions): T {\n return observe(client, { ...defaultOptions, ...options });\n };\n}\n"]}