@raindrop-ai/eve 0.0.10 → 0.0.11

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/eve-session.ts","../src/internal/eve-turn-registry.ts","../../core/dist/chunk-SK6EJEO7.js","../../core/dist/index.node.js","../src/internal/limits.ts","../src/internal/exporter.ts","../package.json","../src/internal/version.ts","../src/index.ts"],"names":["DEFAULT_MAX_TEXT_FIELD_CHARS","TRUNCATION_MARKER"],"mappings":";;;;;;AA0EO,SAAS,sBAAsB,KAAA,EAA8C;AAClF,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,MAAA;AACxD,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,IAAI,OAAO,CAAA,CAAE,SAAA,KAAc,QAAA,EAAU,OAAO,MAAA;AAC5C,EAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,YAAY,CAAA,CAAE,IAAA,KAAS,MAAM,OAAO,MAAA;AAC1D,EAAA,MAAM,IAAI,CAAA,CAAE,IAAA;AACZ,EAAA,IAAI,OAAO,EAAE,EAAA,KAAO,QAAA,IAAY,OAAO,CAAA,CAAE,QAAA,KAAa,UAAU,OAAO,MAAA;AACvE,EAAA,MAAM,MAAA,GAA2B;AAAA,IAC/B,WAAW,CAAA,CAAE,SAAA;AAAA,IACb,MAAM,EAAE,EAAA,EAAI,EAAE,EAAA,EAAI,QAAA,EAAU,EAAE,QAAA,EAAS;AAAA,IACvC,GAAI,OAAO,CAAA,CAAE,aAAA,KAAkB,QAAA,GAAW,EAAE,aAAA,EAAe,CAAA,CAAE,aAAA,EAAc,GAAI;AAAC,GAClF;AACA,EAAA,OAAO,MAAA;AACT;AAKA,IAAI,MAAA,GAA0C,MAAA;AAE9C,SAAS,cAAA,GAAsC;AAC7C,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AACjC,EAAA,IAAI;AACF,IAAA,MAAM,eAAA,GAAkB,aAAA;AAAA;AAAA,MAEtB,OAAO,UAAA,KAAe,WAAA,GAAc,UAAA,GAAc,MAAA,CAAA,IAAA,CAAgC;AAAA,KACpF;AACA,IAAA,MAAM,GAAA,GAAM,gBAAgB,aAAa,CAAA;AAGzC,IAAA,MAAA,GAAS,OAAO,GAAA,CAAI,UAAA,KAAe,UAAA,GAAa,IAAI,UAAA,GAAa,IAAA;AAAA,EACnE,CAAA,CAAA,MAAQ;AACN,IAAA,MAAA,GAAS,IAAA;AAAA,EACX;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,kBAAkB,KAAA,EAAyC;AAClE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAM,OAAO,KAAA;AACxD,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,IAAI,OAAO,CAAA,CAAE,SAAA,KAAc,QAAA,EAAU,OAAO,KAAA;AAG5C,EAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAW;AACxB,IAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,YAAY,CAAA,CAAE,IAAA,KAAS,MAAM,OAAO,KAAA;AAC1D,IAAA,MAAM,IAAI,CAAA,CAAE,IAAA;AACZ,IAAA,IAAI,OAAO,EAAE,EAAA,KAAO,QAAA,IAAY,OAAO,CAAA,CAAE,QAAA,KAAa,UAAU,OAAO,KAAA;AAAA,EACzE;AACA,EAAA,IAAI,CAAA,CAAE,MAAA,KAAW,MAAA,EAAW,OAAO,IAAA;AACnC,EAAA,OAAO,qBAAA,CAAsB,CAAA,CAAE,MAAM,CAAA,KAAM,MAAA;AAC7C;AAsBO,SAAS,oBAAA,GAAmD;AACjE,EAAA,MAAM,aAAa,cAAA,EAAe;AAClC,EAAA,IAAI,CAAC,YAAY,OAAO,MAAA;AACxB,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,UAAA,EAAW;AAAA,EACnB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,iBAAA,CAAkB,GAAG,CAAA,GAAI,GAAA,GAAM,MAAA;AACxC;;;ACxEA,IAAM,kBAAA,GAAqB,aAAA;AAM3B,IAAM,2BAAA,GAA8B,wBAAA;AACpC,IAAM,mBAAA,GAAsB,gBAAA;AAE5B,IAAM,kBAAN,MAAsB;AAAA,EAAtB,WAAA,GAAA;AAsBE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,IAAA,CAAiB,MAAA,uBAAa,GAAA,EAAiC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO/D,MAAA,CAAO,OAAA,EAAiB,MAAA,EAAgB,KAAA,EAA2B;AACjE,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,MAAA,EAAQ;AACzB,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACnC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,KAAA,GAAQ,EAAC;AACT,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,KAAK,CAAA;AAAA,IAChC;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,GAAG,KAAA,EAAO,QAAQ,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,OAAA,EAAuD;AAC5D,IAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,GAAG,OAAO,MAAA;AACzC,IAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,gBAAA,CAAiB,SAA6B,MAAA,EAAkC;AAC9E,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,MAAA,EAAQ;AACzB,IAAA,OAAA,CAAQ,OAAA,EAAQ,CAAE,IAAA,CAAK,MAAM;AAC3B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,MAAM,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,MAAM,CAAA;AACtD,MAAA,IAAI,QAAQ,EAAA,EAAI;AACd,QAAA,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,MACrB;AACA,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,QAAA,IAAA,CAAK,MAAA,CAAO,OAAO,OAAO,CAAA;AAAA,MAC5B;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,IAAA,GAAe;AACjB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,SAAS,IAAA,CAAK,MAAA,CAAO,MAAA,EAAO,WAAY,KAAA,CAAM,MAAA;AACzD,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA;AAQA,IAAM,QAAA,GAAW,IAAI,eAAA,EAAgB;AAO9B,SAAS,0BAAA,GAAmD;AACjE,EAAA,OAAO;AAAA,IACL,QAAQ,IAAA,EAA6B;AACnC,MAAA,IAAI,IAAA,CAAK,SAAS,kBAAA,EAAoB;AACtC,MAAA,MAAM,QAAQ,IAAA,CAAK,UAAA;AACnB,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,GAAA,GAAM,KAAK,WAAA,EAAY;AAC7B,MAAA,MAAM,iBAAA,GACJ,OAAO,KAAA,CAAM,2BAA2B,MAAM,QAAA,GACzC,KAAA,CAAM,2BAA2B,CAAA,GAClC,MAAA;AACN,MAAA,MAAM,SAAA,GACJ,OAAO,KAAA,CAAM,mBAAmB,MAAM,QAAA,GACjC,KAAA,CAAM,mBAAmB,CAAA,GAC1B,MAAA;AACN,MAAA,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,GAAA,CAAI,MAAA,EAAQ;AAAA,QACvC,iBAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,MAAM,IAAA,EAA6B;AACjC,MAAA,IAAI,IAAA,CAAK,SAAS,kBAAA,EAAoB;AACtC,MAAA,MAAM,GAAA,GAAM,KAAK,WAAA,EAAY;AAC7B,MAAA,QAAA,CAAS,gBAAA,CAAiB,GAAA,CAAI,OAAA,EAAS,GAAA,CAAI,MAAM,CAAA;AAAA,IACnD,CAAA;AAAA,IACA,UAAA,GAA4B;AAC1B,MAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,IACzB,CAAA;AAAA,IACA,QAAA,GAA0B;AACxB,MAAA,QAAA,CAAS,KAAA,EAAM;AACf,MAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,IACzB;AAAA,GACF;AACF;AAOO,SAAS,cAAc,OAAA,EAAuD;AACnF,EAAA,OAAO,QAAA,CAAS,OAAO,OAAO,CAAA;AAChC;AA0BO,SAAS,4BAA4B,QAAA,EAAqD;AAC/F,EAAA,IAAI,YAAA,CAAa,WAAW,OAAO,IAAA;AACnC,EAAA,IAAI;AACF,IAAA,IAAI,QAAA,GAAoB,SAAS,iBAAA,EAAkB;AAKnD,IAAA,MAAM,aAAA,GAAgB,QAAA;AACtB,IAAA,IAAI,OAAO,aAAA,CAAc,WAAA,KAAgB,UAAA,EAAY;AACnD,MAAA,MAAM,QAAA,GAAW,cAAc,WAAA,EAAY;AAC3C,MAAA,IAAI,UAAU,QAAA,GAAW,QAAA;AAAA,IAC3B;AACA,IAAA,MAAM,EAAA,GAAK,QAAA;AACX,IAAA,IAAI,OAAO,EAAA,CAAG,gBAAA,KAAqB,UAAA,EAAY;AAC7C,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,EAAA,CAAG,gBAAA,CAAiB,4BAA4B,CAAA;AAChD,IAAA,YAAA,CAAa,SAAA,GAAY,IAAA;AACzB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAOA,IAAM,YAAA,GAAe,EAAE,SAAA,EAAW,KAAA,EAAM;;;ACpPxC,IAAI,0BAAA,GAA6B,GAAA;AACjC,IAAI,kBAAA,GAAqB,GAAA;AACzB,SAAS,KAAK,EAAA,EAAI;AAChB,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AACA,SAAS,eAAe,QAAA,EAAU;AAChC,EAAA,IAAI,CAAC,UAAU,OAAO,MAAA;AACtB,EAAA,OAAO,SAAS,QAAA,CAAS,GAAG,CAAA,GAAI,QAAA,GAAW,GAAG,QAAQ,CAAA,CAAA,CAAA;AACxD;AACA,SAAS,gBAAgB,GAAA,EAAK;AAC5B,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,MAAA,CAAO,QAAA,GAAW,EAAA;AAClB,IAAA,MAAA,CAAO,QAAA,GAAW,EAAA;AAClB,IAAA,MAAA,CAAO,MAAA,GAAS,EAAA;AAChB,IAAA,MAAA,CAAO,IAAA,GAAO,EAAA;AACd,IAAA,OAAO,OAAO,QAAA,EAAS;AAAA,EACzB,SAAS,CAAA,EAAG;AACV,IAAA,OAAO,mBAAA;AAAA,EACT;AACF;AAgCA,SAAS,gBAAgB,OAAA,EAAS;AAChC,EAAA,IAAI,EAAA;AACJ,EAAA,MAAM,KAAA,GAAA,CAAS,EAAA,GAAK,OAAA,CAAQ,GAAA,CAAI,aAAa,MAAM,IAAA,GAAO,EAAA,GAAK,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AACxF,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA;AAC7B,EAAA,IAAI,KAAA,CAAM,IAAA,EAAK,KAAM,EAAA,IAAM,CAAC,OAAO,KAAA,CAAM,QAAQ,CAAA,EAAG,OAAO,QAAA,GAAW,GAAA;AACtE,EAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,KAAK,EAAE,OAAA,EAAQ;AACvC,EAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,EAAG;AACzB,IAAA,MAAM,KAAA,GAAQ,MAAA,GAAS,IAAA,CAAK,GAAA,EAAI;AAChC,IAAA,OAAO,KAAA,GAAQ,IAAI,KAAA,GAAQ,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,MAAA;AACT;AACA,SAAS,eAAA,CAAgB,eAAe,aAAA,EAAe;AACrD,EAAA,IAAI,iBAAiB,OAAO,aAAA,KAAkB,YAAY,aAAA,KAAkB,IAAA,IAAQ,kBAAkB,aAAA,EAAe;AACnH,IAAA,MAAM,IAAI,aAAA,CAAc,YAAA;AACxB,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA,EAAG,kBAAkB,CAAA;AAAA,EAC/E;AACA,EAAA,IAAI,aAAA,IAAiB,GAAG,OAAO,CAAA;AAC/B,EAAA,MAAM,IAAA,GAAO,GAAA;AACb,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,gBAAgB,CAAC,CAAA;AAC5C,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,MAAA,EAAQ,kBAAkB,CAAA;AACnD;AACA,eAAe,SAAA,CAAU,SAAA,EAAW,MAAA,EAAQ,IAAA,EAAM;AAChD,EAAA,MAAM,SAAS,IAAA,CAAK,OAAA,GAAU,CAAA,aAAA,EAAgB,IAAA,CAAK,OAAO,CAAA,CAAA,CAAA,GAAM,oBAAA;AAChE,EAAA,IAAI,SAAA,GAAY,MAAA;AAChB,EAAA,KAAA,IAAS,aAAA,GAAgB,CAAA,EAAG,aAAA,IAAiB,IAAA,CAAK,aAAa,aAAA,EAAA,EAAiB;AAC9E,IAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,MAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,aAAA,EAAe,SAAS,CAAA;AACtD,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,OAAA,EAAU,aAAa,CAAA,CAAA,EAAI,IAAA,CAAK,WAAW,CAAA,IAAA,EAAO,KAAK,CAAA,EAAA;AAAA,SAC5E;AAAA,MACF;AACA,MAAA,IAAI,KAAA,GAAQ,CAAA,EAAG,MAAM,IAAA,CAAK,KAAK,CAAA;AAAA,IACjC,CAAA,MAAA,IAAW,KAAK,KAAA,EAAO;AACrB,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,YAAY,aAAa,CAAA,CAAA,EAAI,IAAA,CAAK,WAAW,CAAA,CAAE,CAAA;AAAA,IAChF;AACA,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,SAAA,EAAU;AAAA,IACzB,SAAS,GAAA,EAAK;AACZ,MAAA,SAAA,GAAY,GAAA;AACZ,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,CAAA,SAAA,EAAY,aAAa,CAAA,SAAA,EAAY,GAAG,CAAA,EAAG,aAAA,KAAkB,IAAA,CAAK,WAAA,GAAc,uBAAuB,EAAE,CAAA;AAAA,SAC9H;AAAA,MACF;AACA,MAAA,IAAI,aAAa,OAAO,SAAA,KAAc,YAAY,WAAA,IAAe,SAAA,IAAa,CAAC,SAAA,CAAU,SAAA;AACvF,QAAA;AACF,MAAA,IAAI,aAAA,KAAkB,KAAK,WAAA,EAAa;AAAA,IAC1C;AAAA,EACF;AACA,EAAA,MAAM,qBAAqB,KAAA,GAAQ,SAAA,GAAY,IAAI,KAAA,CAAM,MAAA,CAAO,SAAS,CAAC,CAAA;AAC5E;AACA,eAAe,QAAA,CAAS,GAAA,EAAK,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM;AAChD,EAAA,IAAI,EAAA;AACJ,EAAA,MAAM,MAAA,GAAS,CAAA,KAAA,EAAQ,eAAA,CAAgB,GAAG,CAAC,CAAA,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAA,CAAa,EAAA,GAAK,IAAA,CAAK,SAAA,KAAc,OAAO,EAAA,GAAK,0BAAA;AACvD,EAAA,MAAM,SAAA;AAAA,IACJ,YAAY;AACV,MAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,QAC5B,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,GAAG;AAAA,SACL;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,QACzB,MAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,SAAS;AAAA,OACtC,CAAA;AACD,MAAA,IAAI,CAAC,KAAK,EAAA,EAAI;AACZ,QAAA,MAAM,OAAO,MAAM,IAAA,CAAK,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC7C,QAAA,MAAM,MAAM,IAAI,KAAA;AAAA,UACd,CAAA,KAAA,EAAQ,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,UAAU,CAAA,EAAG,IAAA,GAAO,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,GAAK,EAAE,CAAA;AAAA,SAClE;AACA,QAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,IAAA,CAAK,OAAO,CAAA;AACjD,QAAA,IAAI,OAAO,YAAA,KAAiB,QAAA,EAAU,GAAA,CAAI,YAAA,GAAe,YAAA;AACzD,QAAA,GAAA,CAAI,SAAA,GAAY,IAAA,CAAK,MAAA,KAAW,GAAA,IAAO,KAAK,MAAA,IAAU,GAAA;AACtD,QAAA,MAAM,GAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACF;AAiHA,IAAI,cAAA,GAAiB;AAAA,EACnB,KAAA,EAAO,CAAA;AAAA,EACP,EAAA,EAAI,CAAA;AAAA,EACJ,KAAA,EAAO;AACT,CAAA;AA2DA,SAAS,8BAAA,CAA+B,KAAA,EAAO,WAAA,GAAc,eAAA,EAAiB,iBAAiB,OAAA,EAAS;AACtG,EAAA,OAAO;AAAA,IACL,aAAA,EAAe;AAAA,MACb;AAAA,QACE,QAAA,EAAU;AAAA,UACR,UAAA,EAAY,CAAC,EAAE,GAAA,EAAK,cAAA,EAAgB,OAAO,EAAE,WAAA,EAAa,WAAA,EAAY,EAAG;AAAA,SAC3E;AAAA,QACA,UAAA,EAAY;AAAA,UACV;AAAA,YACE,KAAA,EAAO,EAAE,IAAA,EAAM,WAAA,EAAa,SAAS,cAAA,EAAe;AAAA,YACpD;AAAA;AACF;AACF;AACF;AACF,GACF;AACF;AAGA,IAAI,sBAAA,GAAyB,yBAAA;AAC7B,IAAI,gBAAA,GAAmB,mBAAA;AACvB,IAAI,0BAAA,GAA6B,2BAAA;AACjC,SAAS,WAAW,IAAA,EAAM;AACxB,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAA,CAAO,KAAK,UAAA,IAAc,IAAA,GAAO,SAAS,UAAA,CAAW,OAAA,KAAY,IAAA,GAAO,KAAA,CAAA,GAAS,EAAA,CAAG,GAAA;AAC1F,IAAA,IAAI,GAAA,IAAO,OAAO,GAAA,CAAI,IAAI,CAAA,KAAM,YAAY,GAAA,CAAI,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG;AAChE,MAAA,OAAO,IAAI,IAAI,CAAA;AAAA,IACjB;AAAA,EACF,SAAS,CAAA,EAAG;AAAA,EACZ;AACA,EAAA,OAAO,MAAA;AACT;AACA,SAAS,eAAA,GAAkB;AACzB,EAAA,MAAM,GAAA,GAAM,WAAW,gBAAgB,CAAA;AACvC,EAAA,IAAI,GAAA,KAAQ,QAAQ,OAAO,MAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AACjC,EAAA,IAAI,gBAAgB,IAAA,CAAK,OAAO,GAAG,OAAO,EAAE,KAAK,OAAA,EAAQ;AACzD,EAAA,IAAI,oBAAA,CAAqB,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,QAAA;AAC/C,EAAA,IAAI,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,SAAA;AAChD,EAAA,OAAO,MAAA;AACT;AACA,SAAS,eAAe,QAAA,EAAU;AAChC,EAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AACtB,EAAA,IAAI,aAAa,WAAA,IAAe,QAAA,KAAa,eAAe,QAAA,KAAa,SAAA,IAAa,aAAa,KAAA,EAAO;AACxG,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,YAAY,CAAA,EAAG,OAAO,IAAA;AAC5C,EAAA,OAAO,KAAA;AACT;AACA,SAAS,mBAAA,GAAsB;AAC7B,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,UAAA,IAAc,IAAA,GAAO,KAAA,CAAA,GAAS,UAAA,CAAW,QAAA;AACrD,IAAA,IAAI,GAAA,IAAO,OAAO,GAAA,CAAI,QAAA,KAAa,YAAY,GAAA,CAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACtE,MAAA,OAAO,GAAA,CAAI,QAAA;AAAA,IACb;AAAA,EACF,SAAS,CAAA,EAAG;AAAA,EACZ;AACA,EAAA,OAAO,MAAA;AACT;AACA,SAAS,6BAAA,GAAgC;AACvC,EAAA,IAAI,cAAA,CAAe,mBAAA,EAAqB,CAAA,EAAG,OAAO,IAAA;AAClD,EAAA,IAAI,UAAA,CAAW,UAAU,CAAA,KAAM,aAAA,EAAe,OAAO,IAAA;AACrD,EAAA,OAAO,KAAA;AACT;AACA,SAAS,4BAA4B,OAAA,EAAS;AAC5C,EAAA,IAAI,IAAI,EAAA,EAAI,EAAA;AACZ,EAAA,IAAI,OAAA,KAAY,MAAM,OAAO,IAAA;AAC7B,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,CAAQ,SAAS,CAAA,EAAG;AACrD,IAAA,OAAA,CAAQ,EAAA,GAAK,cAAA,CAAe,OAAO,CAAA,KAAM,OAAO,EAAA,GAAK,IAAA;AAAA,EACvD;AACA,EAAA,MAAM,cAAA,GAAiB,WAAW,sBAAsB,CAAA;AACxD,EAAA,IAAI,gBAAgB,OAAA,CAAQ,EAAA,GAAK,eAAe,cAAc,CAAA,KAAM,OAAO,EAAA,GAAK,IAAA;AAChF,EAAA,MAAM,cAAc,eAAA,EAAgB;AACpC,EAAA,IAAI,WAAA,KAAgB,WAAW,OAAO,IAAA;AACtC,EAAA,IAAI,WAAA,KAAgB,UAAU,OAAO,0BAAA;AACrC,EAAA,IAAI,WAAA,IAAe,KAAA,IAAS,WAAA,EAAa,OAAA,CAAQ,EAAA,GAAK,eAAe,WAAA,CAAY,GAAG,CAAA,KAAM,IAAA,GAAO,EAAA,GAAK,IAAA;AACtG,EAAA,IAAI,6BAAA,IAAiC,OAAO,0BAAA;AAC5C,EAAA,OAAO,IAAA;AACT;AAIA,SAAS,gCAAA,CAAiC,IAAA,EAAM,OAAA,GAAU,EAAC,EAAG;AAC5D,EAAA,IAAI,EAAA;AACJ,EAAA,MAAM,OAAA,GAAU,2BAAA,CAA4B,OAAA,CAAQ,OAAO,CAAA;AAC3D,EAAA,IAAI,CAAC,OAAA,EAAS;AACd,EAAA,KAAK,SAAS,CAAA,EAAG,OAAO,CAAA,MAAA,CAAA,EAAU,IAAA,EAAM,EAAC,EAAG;AAAA,IAC1C,WAAA,EAAa,CAAA;AAAA,IACb,KAAA,EAAA,CAAQ,EAAA,GAAK,OAAA,CAAQ,KAAA,KAAU,OAAO,EAAA,GAAK,KAAA;AAAA,IAC3C,SAAS,OAAA,CAAQ;AAAA,GAClB,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,EACf,CAAC,CAAA;AACH;AA+CA,IAAI,iBAAA,GAAoB,uBAAA;AACxB,IAAI,uBAAA,GAA0B,wCAAA;AAC9B,SAAS,qBAAqB,KAAA,EAAO;AACnC,EAAA,OAAO,uBAAA,CAAwB,KAAK,KAAK,CAAA;AAC3C;AACA,SAAS,kBAAA,CAAmB,KAAK,IAAA,EAAM;AACrC,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,MAAA;AACpC,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AACzB,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,EAAA,IAAI,CAAC,oBAAA,CAAqB,OAAO,CAAA,IAAK,KAAK,KAAA,EAAO;AAChD,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,GAAG,IAAA,CAAK,MAAM,eAAe,OAAO,CAAA,sBAAA,EAAyB,wBAAwB,MAAM,CAAA,wDAAA;AAAA,KAC7F;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AACA,SAAS,iBAAiB,SAAA,EAAW;AACnC,EAAA,OAAO,YAAY,EAAE,CAAC,iBAAiB,GAAG,SAAA,KAAc,EAAC;AAC3D;AAoZA,IAAI,6BAAA,GAAgC;AAAA,EAClC,4BAAA;AAAA,EACA;AACF,CAAA;AAeiC,IAAI,GAAA,CAAI,6BAA6B;ACt7BtE,UAAA,CAAW,4BAAA,GAA+B,iBAAA;;;ACUnC,IAAMA,6BAAAA,GAA+B,GAAA;AAGrC,IAAMC,kBAAAA,GAAoB,4BAAA;AAO1B,SAAS,wBAAwB,UAAA,EAAwC;AAC9E,EAAA,IAAI,KAAA,GACF,OAAO,UAAA,KAAe,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,IAAK,UAAA,GAAa,CAAA,GAC1E,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,GACrBD,6BAAAA;AACN,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAO,UAAA,EAA2E,OAAA,EACpF,GAAA,EAAK,sCAAA;AACT,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,GAAA,EAAK,EAAE,CAAA;AACxC,MAAA,IAAI,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,IAAK,WAAW,CAAA,EAAG;AAC7C,QAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,QAAQ,CAAA;AAAA,MAClC;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,KAAA;AACT;AAMO,SAAS,YAAA,CAAa,OAAe,KAAA,EAAuB;AACjE,EAAA,IAAI,KAAA,CAAM,MAAA,IAAU,KAAA,EAAO,OAAO,KAAA;AAClC,EAAA,IAAI,KAAA,GAAQC,mBAAkB,MAAA,EAAQ;AACpC,IAAA,OAAO,MAAM,KAAA,CAAM,CAAA,EAAG,KAAA,GAAQA,kBAAAA,CAAkB,MAAM,CAAA,GAAIA,kBAAAA;AAAA,EAC5D;AACA,EAAA,OAAO,MAAM,KAAA,CAAM,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAC1C;;;AC0EA,SAAS,YAAY,GAAA,EAA6C;AAChE,EAAA,IAAI,CAAC,KAAK,OAAO,MAAA;AACjB,EAAA,IAAI,IAAI,MAAA,KAAW,CAAA,IAAK,OAAO,IAAA,CAAK,GAAG,GAAG,OAAO,MAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,GAAA,CAAI,SAAS,CAAC,CAAA;AAC3C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,KAAA,CAAM,CAAC,IAAI,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,EAC9C;AACA,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa,OAAO,OAAO,IAAA,CAAK,KAAK,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA;AAC9E,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,CAAA,EAAA,EAAK,GAAA,IAAO,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAC1E,EAAA,OAAO,UAAA,CAAW,KAAK,GAAG,CAAA;AAC5B;AAEA,SAAS,mBAAmB,EAAA,EAAoB;AAC9C,EAAA,MAAM,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,EAAA;AAEhB,EAAA,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,WAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,EAAE,CAAC,GAAG,QAAA,EAAS;AACpF;AAEA,SAAS,mBAAA,CACP,GAAA,EACA,KAAA,EACA,QAAA,EAC0B;AAC1B,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM,OAAO,MAAA;AAIlD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,EAAE,GAAA,EAAK,KAAA,EAAO,EAAE,WAAA,EAAa,YAAA,CAAa,KAAA,EAAO,QAAQ,GAAE,EAAE;AACnG,EAAA,IAAI,OAAO,KAAA,KAAU,SAAA,EAAW,OAAO,EAAE,KAAK,KAAA,EAAO,EAAE,SAAA,EAAW,KAAA,EAAM,EAAE;AAC1E,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,MAAA,CAAO,UAAU,KAAK,CAAA,GACzB,EAAE,GAAA,EAAK,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,CAAO,KAAK,CAAA,EAAE,KACxC,EAAE,GAAA,EAAK,OAAO,EAAE,WAAA,EAAa,OAAM,EAAE;AAAA,EAC3C;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO;AAAA,MACL,GAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,UAAA,EAAY;AAAA,UACV,MAAA,EAAQ,KAAA,CACL,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,YAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,CAAA,KAAM,MAAA,EAAW,OAAO,MAAA;AAC1C,YAAA,IAAI,OAAO,MAAM,QAAA,EAAU,OAAO,EAAE,WAAA,EAAa,YAAA,CAAa,CAAA,EAAG,QAAQ,CAAA,EAAE;AAC3E,YAAA,IAAI,OAAO,CAAA,KAAM,SAAA,EAAW,OAAO,EAAE,WAAW,CAAA,EAAE;AAClD,YAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AACzB,cAAA,OAAO,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,GACrB,EAAE,QAAA,EAAU,MAAA,CAAO,CAAC,CAAA,EAAE,GACtB,EAAE,WAAA,EAAa,CAAA,EAAE;AAAA,YACvB;AACA,YAAA,OAAO,MAAA;AAAA,UACT,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,CAAA,KAAkC,MAAM,MAAS;AAAA;AAC9D;AACF,KACF;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,qBAAA,CAAsB,OAA+B,QAAA,EAAkC;AAC9F,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,EAAA,MAAM,MAAsB,EAAC;AAC7B,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1C,IAAA,MAAM,EAAA,GAAK,mBAAA,CAAoB,CAAA,EAAG,CAAA,EAAG,QAAQ,CAAA;AAC7C,IAAA,IAAI,EAAA,EAAI,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,mBAAmB,IAAA,EAAgD;AAC1E,EAAA,MAAM,IAAA,GAAO,KAAK,MAAA,EAAQ,IAAA;AAC1B,EAAA,IAAI,IAAA,KAAS,QAAW,OAAO,MAAA;AAC/B,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,OAAO,EAAE,IAAA,EAAM,cAAA,CAAuB,OAAO,OAAA,EAAS,IAAA,CAAK,OAAO,OAAA,EAAQ;AAAA,EAC5E;AACA,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,OAAO,EAAE,IAAA,EAAM,cAAA,CAAuB,EAAA,EAAG;AAAA,EAC3C;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,cAAA,CAAuB,KAAA,EAAM;AAC9C;AAEA,SAAS,kBAAA,CAAmB,MAAoB,QAAA,EAA4B;AAC1E,EAAA,MAAM,GAAA,GAAM,KAAK,WAAA,EAAY;AAC7B,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,iBAAA,EAAmB,MAAA,IAAU,IAAA,CAAK,YAAA;AAC/D,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AACvC,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,CAAI,MAAM,CAAA;AAKrC,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,MAAA,EAAQ;AACvB,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,kCAAA,EAAqC,GAAA,CAAI,OAAO,CAAA,QAAA,EAAW,IAAI,MAAM,CAAA;AAAA,KACvE;AAAA,EACF;AACA,EAAA,MAAM,YAAA,GAAe,YAAY,eAAe,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,qBAAA,CAAsB,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA;AAC7D,EAAA,MAAM,IAAA,GAAiB;AAAA,IACrB,OAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,iBAAA,EAAmB,kBAAA,CAAmB,IAAA,CAAK,SAAS,CAAA;AAAA,IACpD,eAAA,EAAiB,kBAAA,CAAmB,IAAA,CAAK,OAAO;AAAA,GAClD;AACA,EAAA,IAAI,YAAA,OAAmB,YAAA,GAAe,YAAA;AACtC,EAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,IAAA,CAAK,UAAA,GAAa,KAAA;AACpC,EAAA,MAAM,MAAA,GAAS,mBAAmB,IAAI,CAAA;AACtC,EAAA,IAAI,MAAA,OAAa,MAAA,GAAS,MAAA;AAC1B,EAAA,OAAO,IAAA;AACT;AAMO,IAAM,0BAAN,MAA8B;AAAA,EAmBnC,WAAA,CAAY,IAAA,GAAmC,EAAC,EAAG;AAJnD,IAAA,IAAA,CAAQ,QAAA,uBAAe,GAAA,EAAmB;AAC1C,IAAA,IAAA,CAAQ,YAAA,GAAe,KAAA;AACvB,IAAA,IAAA,CAAQ,eAA2C,EAAC;AAGlD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,EAAU,IAAA,EAAK;AACpC,IAAA,IAAA,CAAK,OAAA,GAAU,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA,IAAK,6BAAA;AAChD,IAAA,IAAA,CAAK,OAAA,GAAU,KAAK,OAAA,IAAW,KAAA;AAC/B,IAAA,IAAA,CAAK,oBAAoB,IAAA,CAAK,iBAAA;AAC9B,IAAA,IAAA,CAAK,WAAA,GAAc,KAAK,WAAA,IAAe,cAAA;AACvC,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAK,cAAA,IAAkB,OAAA;AAC7C,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAK,KAAA,KAAU,IAAA;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA,aAAA,EAAgB,IAAA,CAAK,OAAO,CAAA,CAAA,CAAA;AAC1C,IAAA,IAAA,CAAK,SAAA,GAAY,kBAAA,CAAmB,IAAA,CAAK,SAAA,EAAW;AAAA,MAClD,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,KAAqB,KAAA,GAAQ,OAAO,IAAA,CAAK,gBAAA;AAC/D,IAAA,IAAA,CAAK,gBAAA,GAAmB,2BAAA,CAA4B,QAAQ,CAAA,IAAK,MAAA;AACjE,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,EAAG,KAAK,MAAM,CAAA,YAAA,CAAA;AAAA,QACd;AAAA,UACE,QAAA,EAAU,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,OAAA,GAAU,wBAAA;AAAA,UACzC,QAAA,EAAU,KAAK,gBAAA,IAAoB;AAAA;AACrC,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,eAAA,GAA2B;AACzB,IAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,gBAAgB,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,WAAA,EAA2B;AACxC,IAAA,IAAI,CAAC,WAAA,IAAe,WAAA,KAAgB,IAAA,CAAK,WAAA,EAAa;AACtD,IAAA,IAAA,CAAK,WAAA,GAAc,WAAA;AACnB,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,4BAAA,EAA0B,WAAW,CAAA,CAAE,CAAA;AAAA,IACnE;AAAA,EACF;AAAA,EAEA,MAAA,CAAO,OAAuB,cAAA,EAAsD;AAClF,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,cAAA,CAAe,EAAE,MAAM,CAAA,EAAG,KAAA,EAAO,IAAI,KAAA,CAAM,oBAAoB,GAAG,CAAA;AAClE,MAAA;AAAA,IACF;AACA,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,cAAA,CAAe,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA;AAC1B,MAAA;AAAA,IACF;AAIA,IAAA,MAAM,QAAA,GAAW,uBAAA,CAAwB,IAAA,CAAK,iBAAiB,CAAA;AAC/D,IAAA,MAAM,YAAwB,EAAC;AAC/B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI;AACF,QAAA,SAAA,CAAU,IAAA,CAAK,kBAAA,CAAmB,IAAA,EAAM,QAAQ,CAAC,CAAA;AAAA,MACnD,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,KAAK,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,MAAM,2BAA2B,GAAG,CAAA;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,cAAA,CAAe,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAO,8BAAA,CAA+B,SAAA,EAAW,IAAA,CAAK,WAAA,EAAa,KAAK,cAAc,CAAA;AAE5F,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,gCAAA,CAAiC,IAAA,EAAM;AAAA,QACrC,SAAS,IAAA,CAAK,gBAAA;AAAA,QACd,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,SAAS,IAAA,CAAK;AAAA,OACf,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,IAAI,KAAK,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAI,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,UAAA,EAAa,SAAA,CAAU,MAAM,CAAA,sBAAA,CAAwB,CAAA;AAAA,MACjF;AACA,MAAA,cAAA,CAAe,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA;AAC1B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,MAAA,CAAA;AAC3B,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,IAAA,CAAK,MAAM,YAAY,SAAA,CAAU,MAAM,CAAA,UAAA,EAAa,GAAG,CAAA,CAAE,CAAA;AAAA,IAC1E;AACA,IAAA,MAAM,CAAA,GAAI,QAAA;AAAA,MACR,GAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,QACE,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,QAAQ,CAAA,CAAA;AAAA,QACtC,GAAG,gBAAA,CAAiB,IAAA,CAAK,SAAS;AAAA,OACpC;AAAA,MACA,EAAE,aAAa,CAAA,EAAG,KAAA,EAAO,KAAK,KAAA,EAAO,OAAA,EAAS,KAAK,OAAA;AAAQ,KAC7D,CACG,KAAK,MAAM;AACV,MAAA,IAAI,IAAA,CAAK,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,KAAK,MAAM,CAAA,MAAA,EAAS,SAAA,CAAU,MAAM,CAAA,MAAA,CAAQ,CAAA;AAC3E,MAAA,cAAA,CAAe,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA;AAAA,IAC5B,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAiB;AACvB,MAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,MAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,IAAA,CAAK,MAAM,mBAAmB,SAAA,CAAU,MAAM,CAAA,QAAA,EAAW,GAAG,CAAA,CAAE,CAAA;AAC9E,MAAA,cAAA,CAAe,EAAE,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,IAAI,KAAA,CAAM,GAAG,CAAA,EAAG,CAAA;AAAA,IAChF,CAAC,CAAA,CACA,OAAA,CAAQ,MAAM;AACb,MAAA,IAAA,CAAK,QAAA,CAAS,OAAO,CAAC,CAAA;AAAA,IACxB,CAAC,CAAA;AACH,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,EACrB;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAG,IAAA,CAAK,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAC,CAAC,CAAA;AAAA,EACpE;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,IAAA,CAAK,aAAa,GAAA,CAAI,CAAC,OAAO,EAAA,EAAG,CAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAC;AAAA,KACpD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,kBAAkB,EAAA,EAA+B;AAC/C,IAAA,IAAA,CAAK,YAAA,CAAa,KAAK,EAAE,CAAA;AAAA,EAC3B;AACF;;;ACnZA,IAAA,eAAA,GAAA;AAAA,EACE,IAAA,EAAQ,kBAAA;AAAA,EACR,OAAA,EAAW,QAgEb,CAAA;;;AChEO,IAAM,cAAc,eAAA,CAAI,IAAA;AACxB,IAAM,iBAAiB,eAAA,CAAI,OAAA;;;ACiD3B,IAAM,qBAAA,GAAwB;AAC9B,IAAM,wBAAA,GAA2B;AAYxC,IAAM,wBAAA,uBAA+B,GAAA,EAAoB;AAQzD,IAAM,2BAAA,GAA8B,IAAA;AAM7B,SAAS,sBAAA,GAA+B;AAC7C,EAAA,wBAAA,CAAyB,KAAA,EAAM;AACjC;AA2TA,IAAM,wBAAA,mBAA2B,MAAA,CAAO,GAAA,CAAI,0BAA0B,CAAA;AACtE,IAAM,4BAAA,mBAA+B,MAAA,CAAO,GAAA,CAAI,8BAA8B,CAAA;AAiB9E,SAAS,iBAAA,CAAoC,aAAgB,MAAA,EAAmB;AAC9E,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,SAAA;AAAA,IACA,aAAA;AAAA,IACA,0BAAA;AAAA,IACA,wBAAA;AAAA,IACA,sBAAA;AAAA,IACA,oBAAA;AAAA,IACA,iBAAA;AAAA,IACA,kBAAA;AAAA,IACA,cAAA;AAAA,IACA,mBAAA;AAAA,IACA,oBAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA;AAAA;AAAA,IAGA;AAAA,GACF;AACA,EAAA,MAAM,OAAA,GAAU,WAAA;AAChB,EAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,IAAA,MAAM,QAAA,GAAW,QAAQ,IAAI,CAAA;AAC7B,IAAA,IAAI,OAAO,aAAa,UAAA,EAAY;AACpC,IAAA,MAAM,EAAA,GAAK,QAAA;AACX,IAAA,OAAA,CAAQ,IAAI,CAAA,GAAI,SAAU,KAAA,EAAgB;AACxC,MAAA,IAAI;AACF,QAAA,MAAM,EAAA,GAAK,KAAA;AACX,QAAA,MAAM,EAAA,GAAK,EAAA,KAAO,EAAA,CAAG,WAAA,IAAe,GAAG,cAAc,CAAA,CAAA;AACrD,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,YAAA,EAAe,IAAI,OAAO,MAAA,CAAO,EAAA,IAAM,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,MACpE,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,OAAO,EAAA,CAAG,IAAA,CAAK,WAAA,EAAa,KAAK,CAAA;AAAA,IACnC,CAAA;AAAA,EACF;AACA,EAAA,OAAO,WAAA;AACT;AA+CA,SAAS,oBAAA,CAAuC,aAAgB,IAAA,EAAgC;AAC9F,EAAA,MAAM,MAAA,GAAS,WAAA;AAQf,EAAA,IAAI,OAAO,MAAA,CAAO,QAAA,KAAa,cAAc,OAAO,MAAA,CAAO,UAAU,UAAA,EAAY;AAC/E,IAAA,MAAA,CAAO,QAAQ,MAAA,CAAO,QAAA;AAAA,EACxB;AAEA,EAAA,MAAM,WAAW,MAAA,CAAO,OAAA;AACxB,EAAA,IAAI,OAAO,QAAA,KAAa,UAAA,EAAY,OAAO,WAAA;AAC3C,EAAA,MAAM,EAAA,GAAK,QAAA;AACX,EAAA,MAAA,CAAO,OAAA,GAAU,SAAU,KAAA,EAAgB;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,KAAA;AACX,MAAA,IAAI,UAAS,EAAG;AACd,QAAA,IAAI;AACF,UAAA,MAAM,SAAS,EAAA,CAAG,cAAA;AAClB,UAAA,MAAM,QAAA,GAAY,EAAA,CAAG,QAAA,IAAyD,EAAC;AAC/E,UAAA,MAAM,eAAA,GAAkB,QAAA,CAAS,CAAC,CAAA,EAAG,OAAA;AACrC,UAAA,MAAM,eAAA,GACJ,OAAO,eAAA,KAAoB,QAAA,GACvB,gBAAgB,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAC5B,KAAA,CAAM,QAAQ,eAAe,CAAA,GAC3B,KAAK,SAAA,CAAU,eAAe,EAAE,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,GAC5C,KAAA,CAAA;AACR,UAAA,MAAM,kBAAA,GAAqB,MAAM,aAAA,EAAc;AAO/C,UAAA,MAAM,eAAA,GAAkB,kBAAA,EAAoB,WAAA,IAAc,EAAG,OAAA;AAC7D,UAAA,MAAM,iBAAA,GAAoB,cAAc,eAAe,CAAA;AACvD,UAAA,MAAM,kBAAkB,oBAAA,EAAqB;AAC7C,UAAA,OAAA,CAAQ,GAAA;AAAA,YACN,CAAA,mCAAA,EAAsC,IAAA,CAAK,SAAS,CAAA,IAAA,EAAO,GAAG,UAAU,CAAA,SAAA,EAAY,eAAe,CAAA,YAAA,EAAe,oBAAoB,IAAI,CAAA,oBAAA,EAAuB,MAAA,GAAS,MAAA,CAAO,KAAK,MAAM,CAAA,CAAE,IAAA,CAAK,GAAG,IAAI,QAAQ,CAAA,WAAA,EAAc,IAAA,CAAK,SAAA,CAAU,iBAAiB,CAAC,CAAA,YAAA,EAAe,IAAA,CAAK,SAAA,CAAU,eAAe,CAAC,CAAA,UAAA,EAAa,IAAA,CAAK,SAAA,CAAU,eAAe,CAAC,CAAA;AAAA,WAC7V;AAAA,QACF,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gCAAA,EAAoC,CAAA,CAAY,OAAO,CAAA,CAAE,CAAA;AAAA,QACvE;AAAA,MACF;AAmBA,MAAA,MAAM,MAAM,EAAA,CAAG,cAAA;AACf,MAAA,MAAM,UAAA,GAAa,MAAM,aAAA,EAAc;AAOvC,MAAA,MAAM,YAAY,UAAA,EAAY,UAAA;AAC9B,MAAA,MAAM,OAAA,GAAU,UAAA,EAAY,WAAA,IAAc,EAAG,OAAA;AAC7C,MAAA,MAAM,SAAA,GAAY,cAAc,OAAO,CAAA;AAIvC,MAAA,MAAM,aAAa,oBAAA,EAAqB;AACxC,MAAA,MAAM,kBAAA,GACJ,YAAY,SAAA,KACX,OAAO,MAAM,gBAAgB,CAAA,KAAM,WAC/B,GAAA,CAAI,gBAAgB,IACrB,KAAA,CAAA,CAAA,IACJ,SAAA,EAAW,cACV,OAAO,SAAA,GAAY,gBAAgB,CAAA,KAAM,QAAA,GACrC,SAAA,CAAU,gBAAgB,CAAA,GAC3B,KAAA,CAAA,CAAA;AACN,MAAA,MAAM,oBACH,OAAO,GAAA,GAAM,wBAAwB,CAAA,KAAM,QAAA,GACvC,IAAI,wBAAwB,CAAA,GAC7B,WACJ,SAAA,EAAW,iBAAA,KACV,OAAO,SAAA,GAAY,wBAAwB,MAAM,QAAA,GAC7C,SAAA,CAAU,wBAAwB,CAAA,GACnC,KAAA,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQJ,kBAAA;AAWF,MAAA,MAAM,SAAA,GACJ,OAAO,GAAA,GAAM,aAAa,MAAM,QAAA,GAAY,GAAA,CAAI,aAAa,CAAA,GAAe,KAAA,CAAA;AAC9E,MAAA,IAAI,sBAAsB,SAAA,EAAW;AAGnC,QAAA,IACE,yBAAyB,IAAA,IAAQ,2BAAA,IACjC,CAAC,wBAAA,CAAyB,GAAA,CAAI,kBAAkB,CAAA,EAChD;AACA,UAAA,MAAM,MAAA,GAAS,wBAAA,CAAyB,IAAA,EAAK,CAAE,MAAK,CAAE,KAAA;AACtD,UAAA,IAAI,MAAA,KAAW,KAAA,CAAA,EAAW,wBAAA,CAAyB,MAAA,CAAO,MAAM,CAAA;AAAA,QAClE;AACA,QAAA,wBAAA,CAAyB,GAAA,CAAI,oBAAoB,SAAS,CAAA;AAAA,MAC5D;AACA,MAAA,MAAM,iBAAA,GACJ,SAAA,KACC,kBAAA,GAAqB,wBAAA,CAAyB,GAAA,CAAI,kBAAkB,CAAA,GAAI,KAAA,CAAA,CAAA,KACxE,OAAO,UAAA,EAAY,IAAA,EAAM,EAAA,KAAO,WAAW,UAAA,CAAW,IAAA,CAAK,EAAA,GAAK,KAAA,CAAA,CAAA,KAChE,OAAO,SAAA,GAAY,aAAa,CAAA,KAAM,QAAA,GAClC,SAAA,CAAU,aAAa,CAAA,GACxB,KAAA,CAAA,CAAA;AAmBN,MAAA,MAAM,IAAA,GAAQ,EAAA,CAAG,QAAA,IAAoD,EAAC;AAQtE,MAAA,IAAI,SAAA;AACJ,MAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AACjC,QAAA,IAAI,MAAM,qBAAA,EAAuB;AACjC,QAAA,IAAI,EAAE,UAAA,CAAW,WAAW,KAAK,CAAA,CAAE,UAAA,CAAW,MAAM,CAAA,EAAG;AACvD,QAAA,CAAC,0BAAc,EAAC,CAAA,EAAG,CAAC,CAAA,GAAI,KAAK,CAAC,CAAA;AAAA,MAChC;AA2BA,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACxC,UAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AAC3B,UAAA,IAAI,CAAA,CAAE,UAAA,CAAW,MAAM,CAAA,EAAG;AAC1B,UAAA,IAAI,CAAA,CAAE,UAAA,CAAW,WAAW,CAAA,EAAG;AAC7B,YAAA,IAAI,KAAK,CAAC,CAAA,KAAM,KAAA,CAAA,EAAW,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AAAA,UACvC,WAAW,CAAC,SAAA,IAAa,SAAA,CAAU,CAAC,MAAM,KAAA,CAAA,EAAW;AACnD,YAAA,CAAC,SAAA,KAAA,SAAA,GAAc,EAAC,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,QAAA,KAAA,MAAW,CAAC,GAAG,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,gBAAgB,CAAA,EAAG;AAC1D,UAAA,IAAI,EAAE,UAAA,CAAW,WAAW,KAAK,CAAA,CAAE,UAAA,CAAW,MAAM,CAAA,EAAG;AACrD,YAAA,IAAI,KAAK,CAAC,CAAA,KAAM,KAAA,CAAA,EAAW,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA;AAAA,UACvC,WAAW,CAAC,SAAA,IAAa,SAAA,CAAU,CAAC,MAAM,KAAA,CAAA,EAAW;AAGnD,YAAA,CAAC,SAAA,KAAA,SAAA,GAAc,EAAC,CAAA,EAAG,CAAC,CAAA,GAAI,CAAA;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,QAAA,GAAW,KAAK,qBAAqB,CAAA;AAC3C,QAAA,MAAM,aAAA,GACJ,QAAA,IAAY,OAAO,QAAA,KAAa,WAC3B,QAAA,GACD,KAAA,CAAA;AAGN,QAAA,IAAA,CAAK,qBAAqB,CAAA,GAAI,EAAE,GAAG,SAAA,EAAW,GAAG,aAAA,EAAc;AAAA,MACjE;AAeA,MAAA,MAAM,oBAAoB,2BAAA,EAA4B;AACtD,MAAA,MAAM,kBAAA,GACJ,iBAAA,KAAsB,KAAA,CAAA,GAAY,UAAA,EAAY,MAAA,GAAS,KAAA,CAAA;AASzD,MAAA,MAAM,sBAAA,GACJ,iBAAA,KAAsB,KAAA,CAAA,IACtB,kBAAA,KAAuB,KAAA,CAAA,IACvB,OAAO,IAAA,CAAK,2BAA2B,CAAA,KAAM,QAAA,GACxC,IAAA,CAAK,2BAA2B,CAAA,GACjC,KAAA,CAAA;AAON,MAAA,MAAM,qBAAA,GACJ,OAAO,EAAA,CAAG,UAAA,KAAe,YAAY,EAAA,CAAG,UAAA,GAAa,EAAA,CAAG,UAAA,GAAa,IAAA,CAAK,SAAA;AAC5E,MAAA,MAAM,WACJ,iBAAA,EAAmB,QAAA,KAClB,uBAAuB,KAAA,CAAA,IAAa,sBAAA,KAA2B,SAC5D,qBAAA,GACA,KAAA,CAAA,CAAA;AAcN,MAAA,MAAM,gBAAgB,iBAAA,GAClB,KAAA,CAAA,GACA,MAAM,aAAA,EAAc,EAAG,aAAY,EAAG,OAAA;AAe1C,MAAA,MAAM,UAAA,GACJ,iBAAA,KAAsB,KAAA,CAAA,IACtB,kBAAA,KAAuB,UACvB,sBAAA,KAA2B,KAAA,CAAA;AAC7B,MAAA,MAAM,eAAA,GACJ,CAAC,UAAA,IAAc,kBAAA,IAAsB,oBACjC,cAAA,CAAe,kBAAA,EAAoB,iBAAiB,CAAA,GACpD,KAAA,CAAA;AACN,MAAA,MAAM,UAAU,eAAA,IAAmB,aAAA;AAUnC,MAAA,IAAI,kBAAA,IAAsB,IAAA,CAAK,iBAAiB,CAAA,KAAM,KAAA,CAAA,EAAW;AAC/D,QAAA,IAAA,CAAK,iBAAiB,CAAA,GAAI,kBAAA;AAAA,MAC5B;AAMA,MAAA,IAAI,IAAA,CAAK,kBAAkB,CAAA,KAAM,KAAA,CAAA,EAAW;AAC1C,QAAA,MAAM,cACJ,UAAA,IAAc,OAAO,KAAK,+BAA+B,CAAA,KAAM,WAC1D,IAAA,CAAK,+BAA+B,CAAA,GACrC,UAAA,IAAc,OAAO,IAAA,CAAK,2BAA2B,MAAM,QAAA,GACxD,IAAA,CAAK,2BAA2B,CAAA,GACjC,KAAA,CAAA;AACR,QAAA,MAAM,QAAQ,WAAA,IAAe,gBAAA;AAC7B,QAAA,IAAI,KAAA,EAAO,IAAA,CAAK,kBAAkB,CAAA,GAAI,KAAA;AAAA,MACxC;AAIA,MAAA,IAAI,OAAA,IAAW,IAAA,CAAK,kBAAkB,CAAA,KAAM,KAAA,CAAA,EAAW;AACrD,QAAA,IAAA,CAAK,kBAAkB,CAAA,GAAI,OAAA;AAAA,MAC7B;AAEA,MAAA,IAAI,QAAA,IAAY,IAAA,CAAK,mBAAmB,CAAA,KAAM,KAAA,CAAA,EAAW;AACvD,QAAA,IAAA,CAAK,mBAAmB,CAAA,GAAI,QAAA;AAAA,MAC9B;AACA,MAAA,IAAI,IAAA,CAAK,gBAAgB,CAAA,KAAM,KAAA,CAAA,EAAW;AACxC,QAAA,IAAA,CAAK,gBAAgB,CAAA,GAAI,QAAA,GAAW,UAAA,GAAa,MAAA;AAAA,MACnD;AACA,MAAA,IAAI,iBAAA,EAAmB;AACrB,QAAA,IAAI,IAAA,CAAK,wBAAwB,CAAA,KAAM,KAAA,CAAA,EAAW;AAChD,UAAA,IAAA,CAAK,wBAAwB,IAAI,iBAAA,CAAkB,YAAA;AAAA,QACrD;AACA,QAAA,IAAI,IAAA,CAAK,4BAA4B,CAAA,KAAM,KAAA,CAAA,EAAW;AACpD,UAAA,IAAA,CAAK,4BAA4B,IAAI,iBAAA,CAAkB,UAAA;AAAA,QACzD;AACA,QAAA,IAAI,IAAA,CAAK,0BAA0B,CAAA,KAAM,KAAA,CAAA,EAAW;AAClD,UAAA,IAAA,CAAK,0BAA0B,IAAI,iBAAA,CAAkB,QAAA;AAAA,QACvD;AAAA,MACF,WAAW,kBAAA,EAAoB;AAY7B,QAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,qBAAA,CAAsB,kBAAkB,CAAC,CAAA,EAAG;AACpF,UAAA,IAAI,KAAK,GAAG,CAAA,KAAM,KAAA,CAAA,EAAW,IAAA,CAAK,GAAG,CAAA,GAAI,KAAA;AAAA,QAC3C;AAAA,MACF;AAEA,MAAA,IAAI,OAAO,IAAA,CAAK,IAAI,EAAE,MAAA,GAAS,CAAA,KAAM,QAAA,GAAW,IAAA;AAAA,IAClD,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,EAAA,CAAG,IAAA,CAAK,WAAA,EAAa,KAAK,CAAA;AAAA,EACnC,CAAA;AASA,EAAA,OAAO,WAAA;AACT;AAEA,SAAS,uBAAuB,WAAA,EAA2B;AACzD,EAAA,MAAM,CAAA,GAAI,UAAA;AACV,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,6BAA6B,CAAA,EAAG;AACnD,IAAA,CAAA,CAAE,gCAAgC,EAAC;AAAA,EACrC;AAMA,EAAA,MAAM,MAAA,GAAS,WAAA;AACf,EAAA,MAAA,CAAO,wBAAwB,CAAA,GAAI,IAAA;AACnC,EAAA,CAAA,CAAE,6BAAA,GAAgC,EAAE,6BAAA,CAA8B,MAAA;AAAA,IAChE,CAAC,CAAA,KAAM,CAAE,CAAA,CAAwB,wBAAwB;AAAA,GAC3D;AACA,EAAA,CAAA,CAAE,6BAAA,CAA8B,KAAK,MAAM,CAAA;AAC7C;AAEA,SAAS,WAAA,GAAkC;AACzC,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,EAAa,OAAO,MAAA;AAC3C,EAAA,MAAM,CAAA,GAAI,QAAQ,GAAA,EAAK,kBAAA;AACvB,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,MAAA,GAAS,IAAI,CAAA,GAAI,MAAA;AACrD;AAEA,SAAS,YAAA,GAAmC;AAC1C,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,EAAa,OAAO,MAAA;AAC3C,EAAA,MAAM,CAAA,GAAI,QAAQ,GAAA,EAAK,mBAAA;AACvB,EAAA,OAAO,CAAA,IAAK,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,MAAA;AACjC;AAEA,SAAS,WAAA,GAAkC;AACzC,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,EAAa,OAAO,MAAA;AAC3C,EAAA,MAAM,CAAA,GAAI,QAAQ,GAAA,EAAK,iBAAA;AACvB,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,MAAA,GAAS,IAAI,CAAA,GAAI,MAAA;AACrD;AAEA,SAAS,QAAA,GAAoB;AAC3B,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,EAAa,OAAO,KAAA;AAC3C,EAAA,MAAM,CAAA,GAAI,QAAQ,GAAA,EAAK,iBAAA;AACvB,EAAA,OAAO,CAAA,KAAM,OAAO,CAAA,KAAM,MAAA;AAC5B;AASA,SAAS,oBACP,CAAA,EAC+C;AAC/C,EAAA,OACE,OAAO,MAAM,QAAA,IACb,CAAA,KAAM,QACN,OAAQ,CAAA,CAA+C,cAAc,CAAA,KAAM,UAAA;AAE/E;AASA,SAAS,cAAA,CAAe,WAAmB,MAAA,EAAwB;AACjE,EAAA,OAAO,CAAA,IAAA,EAAO,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACnC;AAaA,SAAS,sBAAsB,MAAA,EAAkD;AAC/E,EAAA,MAAM,GAAA,GAA8B;AAAA,IAClC,6BAA6B,MAAA,CAAO,SAAA;AAAA,IACpC,2BAA2B,cAAA,CAAe,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,KAAK,EAAE,CAAA;AAAA,IAC1E,wBAAA,EAA0B,OAAO,IAAA,CAAK,EAAA;AAAA,IACtC,8BAAA,EAAgC,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAQ;AAAA,GAC7D;AACA,EAAA,IAAI,MAAA,CAAO,kBAAkB,MAAA,EAAW;AACtC,IAAA,GAAA,CAAI,+BAA+B,IAAI,MAAA,CAAO,aAAA;AAAA,EAChD;AACA,EAAA,OAAO,GAAA;AACT;AAeA,SAAS,kCACP,KAAA,EACwB;AACxB,EAAA,MAAM,MAAA,GAAS,qBAAA,CAAsB,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AACzD,EAAA,IAAI,MAAA,KAAW,MAAA,EAAW,OAAO,EAAC;AAClC,EAAA,OAAO,sBAAsB,MAAM,CAAA;AACrC;AAGA,IAAM,sBAAA,GAAyB,kBAAA;AAiB/B,SAAS,4BACP,IAAA,EACwB;AACxB,EAAA,IAAI,IAAA,IAAQ,IAAA,EAAM,OAAO,EAAC;AAC1B,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,IAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,sBAAsB,CAAA,EAAG,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,EAC1D;AACA,EAAA,OAAO,GAAA;AACT;AAeA,SAAS,sBACP,IAAA,EACoC;AACpC,EAAA,MAAM,aAAa,mBAAA,CAAoB,IAAA,CAAK,QAAQ,CAAA,GAAI,SAAY,IAAA,CAAK,QAAA;AACzE,EAAA,IAAI,IAAA,CAAK,cAAA,KAAmB,MAAA,IAAa,UAAA,KAAe,QAAW,OAAO,MAAA;AAC1E,EAAA,OAAO,4BAA4B,EAAE,GAAG,YAAY,GAAG,IAAA,CAAK,gBAAgB,CAAA;AAC9E;AAiBA,SAAS,2BAAA,CACP,MACA,cAAA,EACwE;AACxE,EAAA,MAAM,iBAAiB,mBAAA,CAAoB,IAAA,CAAK,QAAQ,CAAA,GAAI,KAAK,QAAA,GAAW,MAAA;AAC5E,EAAA,MAAM,eAAe,IAAA,CAAK,MAAA;AAG1B,EAAA,MAAM,iBAAA,GAAoB,eAAe,cAAc,CAAA;AACvD,EAAA,MAAM,mBAAA,GAAsB,iBAAiB,cAAc,CAAA;AAE3D,EAAA,OAAO,CAAC,KAAA,KAAU;AAChB,IAAA,MAAM,YAAA,GAAe,iBAAA;AAAA;AAAA;AAAA;AAAA,MAIhB,kBAAkB,IAAA,CAAK,YAAA,EAAc,KAAK,CAAA,EAAG,kBAAkB;AAAC,QACjE,sBACE,mBAAA,CAAoB,IAAA,CAAK,cAAA,EAAgB,KAAK,IAC9C,EAAC;AAKP,IAAA,OAAO;AAAA,MACL,GAAG,cAAA;AAAA,MACH,GAAG,4BAA4B,YAAY,CAAA;AAAA,MAC3C,GAAG,kCAAkC,KAAK;AAAA,KAC5C;AAAA,EACF,CAAA;AACF;AAMA,SAAS,sBAAA,CACP,MACA,cAAA,EAC0C;AAC1C,EAAA,MAAM,OAAA,GAAU,2BAAA,CAA4B,IAAA,EAAM,cAAc,CAAA;AAChE,EAAA,OAAO,EAAE,cAAA,EAAgB,CAAC,KAAA,KAAU,OAAA,CAAQ,KAAK,CAAA,EAAE;AACrD;AAMA,SAAS,oBAAA,CACP,MACA,cAAA,EACwC;AACxC,EAAA,MAAM,OAAA,GAAU,2BAAA,CAA4B,IAAA,EAAM,cAAc,CAAA;AAChE,EAAA,OAAO,EAAE,gBAAgB,CAAC,KAAA,MAAW,EAAE,cAAA,EAAgB,OAAA,CAAQ,KAAK,CAAA,EAAE,CAAA,EAAG;AAC3E;AAyBO,SAAS,6BAAA,CACd,IAAA,GAA0C,EAAC,EACR;AACnC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,KAAU,IAAA,IAAQ,QAAA,EAAS;AAC9C,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,WAAA,EAAY;AAC9C,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,WAAA,EAAY;AAC9C,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,IAAa,YAAA,EAAa;AAEjD,EAAA,MAAM,QAAA,GAAW,IAAI,uBAAA,CAAwB;AAAA,IAC3C,QAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,kBAAkB,IAAA,CAAK,gBAAA;AAAA,IACvB,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,cAAA,EAAgB,KAAK,cAAA,IAAkB,cAAA;AAAA,IACvC,OAAA,EAAS,KAAA;AAAA,IACT,KAAA;AAAA,IACA,mBAAmB,IAAA,CAAK;AAAA,GACzB,CAAA;AAOD,EAAA,MAAM,gBAAA,GACJ,IAAA,CAAK,gBAAA,KAAqB,KAAA,GAAQ,QAAQ,IAAA,CAAK,gBAAA;AACjD,EAAA,MAAM,WAAW,mBAAA,CAAoB;AAAA,IACnC,QAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,gBAAA;AAAA,IACA,MAAA,EAAQ,EAAE,KAAA,EAAM;AAAA,IAChB,MAAA,EAAQ,EAAE,KAAA;AAAM,GACjB,CAAA;AAKD,EAAA,QAAA,CAAS,iBAAA,CAAkB,MAAM,QAAA,CAAS,QAAA,EAAU,CAAA;AAEpD,EAAA,MAAM,MAAA,GAAS,mBAAA;AAUf,EAAA,MAAM,cAAA,GAAiB,sBAAsB,IAAI,CAAA;AACjD,EAAA,MAAM,WAAA,GAAc,sBAAA,CAAuB,IAAA,EAAM,cAAc,CAAA;AAC/D,EAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,IAAA,EAAM,cAAc,CAAA;AAE3D,EAAA,OAAO;AAAA,IACL,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,QAAA,EAAU,WAAA;AAAA,IACV,MAAA,EAAQ,SAAA;AAAA,IACR,cAAc,IAAA,CAAK,YAAA;AAAA,IACnB,eAAe,IAAA,CAAK,aAAA;AAAA,IACpB,QAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA,CAAM,EAAE,SAAA,EAAU,EAAG;AACnB,MAAA,IAAI,CAAC,QAAA,CAAS,eAAA,EAAgB,EAAG;AAC/B,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,GAAG,MAAM,CAAA,gIAAA;AAAA,SACX;AAAA,MACF;AACA,MAAA,MAAM,WAAA,GAAc,KAAK,WAAA,IAAe,SAAA;AAMxC,MAAA,QAAA,CAAS,eAAe,WAAW,CAAA;AAEnC,MAAA,IAAI,KAAK,YAAA,EAAc;AAYrB,QAAA,MAAM,CAAA,GAAI,UAAA;AAGV,QAAA,MAAM,OAAA,GAAU,EAAE,4BAA4B,CAAA;AAC9C,QAAA,IAAI,YAAY,MAAA,EAAW;AACzB,UAAA,IAAA,CAAK,YAAA,CAAa;AAAA,YAChB,WAAA;AAAA,YACA,aAAA,EAAe;AAAA,WAChB,CAAA;AACD,UAAA,CAAA,CAAE,4BAA4B,CAAA,GAAI,EAAE,QAAA,EAAS;AAC7C,UAAA,IAAI,KAAA,EAAO;AACT,YAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,iCAAA,EAAoC,WAAW,CAAA,CAAE,CAAA;AAAA,UACxE;AAAA,QACF,WAAW,KAAA,EAAO;AAChB,UAAA,OAAA,CAAQ,GAAA;AAAA,YACN,GAAG,MAAM,CAAA,4GAAA;AAAA,WACX;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,GAAG,MAAM,CAAA,gJAAA;AAAA,SACX;AAAA,MACF;AAWA,MAAA,MAAM,SAAA,GAAY,4BAA4B,KAAK,CAAA;AACnD,MAAA,IAAI,CAAC,aAAa,KAAA,EAAO;AACvB,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,GAAG,MAAM,CAAA,0SAAA;AAAA,SACX;AAAA,MACF;AAWA,MAAA,MAAM,WAAA,GAAc,SAAS,0BAAA,CAA2B;AAAA,QACtD,MAAA,EAAQ,KAAK,MAAA,IAAU,SAAA;AAAA,QACvB,WAAW,IAAA,CAAK;AAAA,OACjB,CAAA;AACD,MAAA,oBAAA,CAAqB,WAAA,EAAa;AAAA,QAChC,SAAA;AAAA,QACA,cAAA,EAAgB,KAAK,UAAA,IAAc,SAAA;AAAA,QACnC,gBAAA,EAAkB;AAAA,OACnB,CAAA;AACD,MAAA,MAAM,OAAA,GAAU,KAAA,GAAQ,iBAAA,CAAkB,WAAA,EAAa,MAAM,CAAA,GAAI,WAAA;AACjE,MAAA,sBAAA,CAAuB,OAAO,CAAA;AAC9B,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,2DAAA,CAA6D,CAAA;AAElF,QAAA,MAAM,CAAA,GAAI,UAAA;AACV,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,GAAG,MAAM,CAAA,iDAAA,EAAoD,CAAA,CAAE,6BAAA,EAA+B,UAAU,CAAC,CAAA;AAAA,SAC3G;AAAA,MACF;AAAA,IACF;AAAA,GACF;AACF;AAEA,IAAO,aAAA,GAAQ","file":"index.mjs","sourcesContent":["/**\n * Bridge into Eve's public `getSession()` API.\n *\n * Why we go through `createRequire` instead of a static `import`:\n *\n * - `eve` is an *optional* peer dependency of this package.\n * Some advanced consumers wire only `RaindropEveSpanExporter` and never\n * install Eve. A static `import` would crash at module-load time when\n * Eve isn't installed.\n * - `getSession()` only became public in `eve` 0.23.0 (it's\n * exported from the `eve/context` entry point, backed by\n * the `ParentSessionKey` runtime context). Older Eve versions ship the\n * same `eve` package but without the `/context` subpath,\n * so we tolerate the import failing.\n *\n * On the first invocation we attempt to `require(\"eve/context\")`\n * and cache the result (or `null` when unavailable). All later calls hit the\n * cached value with no I/O.\n *\n * `getSession()` itself throws when called outside a \"managed step\n * execution\" (i.e. outside Eve's AsyncLocalStorage scope). That happens when\n * `@raindrop-ai/eve` is wired up as a generic AI-SDK TelemetryIntegration\n * (Mastra, hand-rolled tool loops, etc.). We catch the throw and return\n * `undefined` — callers treat that as \"no Eve sub-agent lineage available\"\n * and fall back to the in-process ALS parent-tool context.\n */\nimport { createRequire } from \"node:module\";\n\n/**\n * Lineage info we read off `eve`'s `Session` object.\n *\n * Only the fields we actually use are typed. We keep this independent from\n * the upstream `Session` type so we don't take a hard `eve`\n * type dep — and so the structural check stays narrow if Eve widens its\n * `Session` interface in the future.\n *\n * Parent lineage of a sub-agent session. `sessionId` is the parent's Eve\n * session id; `turn.id` / `.sequence` identify the parent's turn that\n * dispatched us. `rootSessionId` is the top of the dispatch chain (present on\n * Eve 0.45+'s `SessionParent`); absent on the 0.23–0.35 `getSession().parent`\n * shape. Cross-sandbox stable — both sides see the same parent identity.\n */\nexport interface EveSessionParent {\n readonly sessionId: string;\n readonly turn: { readonly id: string; readonly sequence: number };\n readonly rootSessionId?: string;\n}\n\nexport interface EveSessionInfo {\n /** Sub-agent's own Eve session id. */\n readonly sessionId: string;\n /**\n * The session's current turn (`getSession().turn`, public since\n * eve 0.23.0). `turn.id` is session-scoped, so callers\n * namespace it with `sessionId` for a globally-unique per-turn id. Optional\n * so older session shapes still validate.\n */\n readonly turn?: {\n readonly id: string;\n readonly sequence: number;\n };\n /**\n * Present only when the current sandbox was dispatched as a sub-agent.\n */\n readonly parent?: EveSessionParent;\n}\n\n/**\n * Structurally narrow an unknown value to {@link EveSessionParent}. Shared by\n * the legacy `getSession().parent` path (Eve 0.23–0.44) and the\n * `events[\"step.started\"]` / `metadata[\"step.started\"]` `input.session.parent`\n * path (Eve 0.45+). Returns `undefined` for anything that isn't a well-formed\n * parent so a malformed shape is ignored rather than mislabeling a root turn.\n */\nexport function parseEveSessionParent(value: unknown): EveSessionParent | undefined {\n if (typeof value !== \"object\" || value === null) return undefined;\n const p = value as Record<string, unknown>;\n if (typeof p.sessionId !== \"string\") return undefined;\n if (typeof p.turn !== \"object\" || p.turn === null) return undefined;\n const t = p.turn as Record<string, unknown>;\n if (typeof t.id !== \"string\" || typeof t.sequence !== \"number\") return undefined;\n const parent: EveSessionParent = {\n sessionId: p.sessionId,\n turn: { id: t.id, sequence: t.sequence },\n ...(typeof p.rootSessionId === \"string\" ? { rootSessionId: p.rootSessionId } : {}),\n };\n return parent;\n}\n\ntype GetSessionFn = () => unknown;\n\n// `undefined` = not yet probed, `null` = probed and unavailable.\nlet cached: GetSessionFn | null | undefined = undefined;\n\nfunction loadGetSession(): GetSessionFn | null {\n if (cached !== undefined) return cached;\n try {\n const requireFromHere = createRequire(\n // `import.meta.url` is the ESM spelling; tsup polyfills it for CJS builds.\n typeof __filename !== \"undefined\" ? __filename : (import.meta as { url: string }).url\n );\n const mod = requireFromHere(\"eve/context\") as {\n getSession?: GetSessionFn;\n };\n cached = typeof mod.getSession === \"function\" ? mod.getSession : null;\n } catch {\n cached = null;\n }\n return cached;\n}\n\nfunction isEveSessionShape(value: unknown): value is EveSessionInfo {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n if (typeof v.sessionId !== \"string\") return false;\n // `turn` is optional (older session shapes omit it); when present it must be\n // well-formed so the per-turn event id derivation can trust `turn.id`.\n if (v.turn !== undefined) {\n if (typeof v.turn !== \"object\" || v.turn === null) return false;\n const t = v.turn as Record<string, unknown>;\n if (typeof t.id !== \"string\" || typeof t.sequence !== \"number\") return false;\n }\n if (v.parent === undefined) return true;\n return parseEveSessionParent(v.parent) !== undefined;\n}\n\n/**\n * Returns the active Eve session's lineage, or `undefined` when:\n * - `eve` is not installed,\n * - the installed Eve runtime predates the `eve/context` export (no\n * `getSession`),\n * - the installed Eve runtime no longer exposes `getSession()` from\n * `eve/context` — it existed for a window of upstream releases and was later\n * removed, so this returns `undefined` and the session id, turn id, and\n * parent lineage flow through the AI SDK telemetry `runtimeContext` instead\n * (Eve forwards `eve.session.id` / `eve.turn.id`, and our\n * `events[\"step.started\"]` / `metadata[\"step.started\"]` hook pushes\n * `raindrop.parent.*`),\n * - we're called outside a managed Eve step execution (e.g. from a\n * non-Eve AI SDK consumer), or\n * - the returned session has an unexpected shape.\n *\n * Detection is capability-based (`loadGetSession` + try/catch + shape guard),\n * never version-pinned. Safe to call from any AI SDK TelemetryIntegration\n * callback. Never throws.\n */\nexport function getEveSessionLineage(): EveSessionInfo | undefined {\n const getSession = loadGetSession();\n if (!getSession) return undefined;\n let raw: unknown;\n try {\n raw = getSession();\n } catch {\n return undefined;\n }\n return isEveSessionShape(raw) ? raw : undefined;\n}\n\n/**\n * Reset the cached `getSession` reference. Test-only.\n */\nexport function __resetEveSessionLoaderForTests(): void {\n cached = undefined;\n}\n\n/**\n * Inject a `getSession` implementation for tests. Pass `null` to simulate\n * `eve` being uninstalled.\n */\nexport function __setEveSessionLoaderForTests(fn: GetSessionFn | null): void {\n cached = fn;\n}\n","/**\n * Cross-sandbox sub-agent detection by trace-id.\n *\n * Eve dispatches each sub-agent into its own V8 sandbox. ALS cannot cross\n * that boundary, and the AI SDK's `onStart` callback fires under Eve's\n * per-step `step.execute` span — whose `.attributes` are empty. The\n * `eve.continuation_token` we want to read (Eve mints `subagent:<sid>:<cid>`\n * as the child's continuation token when dispatching a sub-agent) lives\n * on the ancestor `ai.eve.turn` span. The public OTel API exposes no way\n * to walk parents from `step.execute` to `ai.eve.turn`.\n *\n * The trick: register a {@link SpanProcessor} on the user's\n * NodeTracerProvider. The processor's `onStart` fires for every span the\n * SDK creates — including `ai.eve.turn`. When we see one, we record its\n * `traceId → { continuationToken, sessionId }` in a module-local map.\n * Inside `injectEveCallContext`'s `onStart` we look up the current span's\n * `traceId` and get back the turn's attributes — without ever having to\n * walk OTel context or parse user-visible message content.\n *\n * This is the path Pavel signed off on (Option A in the design doc); the\n * regex-on-envelope fallback was rejected as \"still feels jank\".\n */\n\n/**\n * Minimal `Span` shape we need from the SpanProcessor's `onStart` callback.\n * Matches `@opentelemetry/sdk-trace-base`'s `Span` class which implements\n * the public `ReadableSpan` interface plus a writable `attributes` field.\n * Typed inline so we don't take a runtime dependency on `sdk-trace-base`.\n */\ninterface EveTurnLikeSpan {\n readonly name: string;\n readonly attributes?: Record<string, unknown>;\n spanContext(): { traceId: string; spanId: string };\n}\n\n/**\n * Minimal `SpanProcessor` shape — we implement only `onStart`/`onEnd`/\n * `forceFlush`/`shutdown`. The full OTel `SpanProcessor` interface has\n * more, but `addSpanProcessor` accepts anything structurally compatible\n * (the SDK only calls these four).\n */\nexport interface EveTurnSpanProcessor {\n onStart(span: EveTurnLikeSpan, parentContext?: unknown): void;\n onEnd(span: EveTurnLikeSpan): void;\n forceFlush(): Promise<void>;\n shutdown(): Promise<void>;\n}\n\n/**\n * Recorded snapshot of an `ai.eve.turn` span's attributes at start time.\n * We only capture the two keys we need so the map stays small.\n */\nexport interface EveTurnEntry {\n /**\n * The full Eve continuation token. For sub-agent dispatches this is\n * `subagent:<parentSessionId>:<callId>`; for root turns it's an opaque\n * non-prefixed string. Callers parse the prefix themselves.\n */\n readonly continuationToken?: string;\n /**\n * Eve's session id. We keep this around so injectEveCallContext can\n * promote it to `raindrop.userId` for sub-agent calls in sandboxes\n * where `event.runtimeContext` is empty.\n */\n readonly sessionId?: string;\n}\n\n/**\n * Internal stack entry — pairs the public {@link EveTurnEntry} with the\n * span id that produced it so {@link EveTurnRegistry.release} can target\n * the exact entry when a turn ends. Without spanId-based identity, two\n * parallel turns on the same `traceId` (e.g. Workshop's in-process mode\n * dispatching two sub-agents under one trace) would let either `onEnd`\n * pop the other's entry.\n */\ninterface EveTurnStackEntry extends EveTurnEntry {\n readonly spanId: string;\n}\n\n/**\n * The `ai.eve.turn` span name that Eve's tool-loop opens at the top of\n * every turn. See `eve/dist/src/harness/tool-loop.js` line\n * ~172: `tracer.startSpan(\"ai.eve.turn\", { attributes: { ... } })`.\n */\nconst EVE_TURN_SPAN_NAME = \"ai.eve.turn\";\n\n/**\n * Attribute keys Eve sets on the `ai.eve.turn` span. These are documented\n * in Eve's source — we read them as-is.\n */\nconst EVE_CONTINUATION_TOKEN_ATTR = \"eve.continuation_token\";\nconst EVE_SESSION_ID_ATTR = \"eve.session.id\";\n\nclass EveTurnRegistry {\n /**\n * Per-trace stack of in-flight `ai.eve.turn` entries.\n *\n * The stack lets us handle multiple concurrent turns on the same\n * `traceId` correctly — both the nested case (turn-within-turn,\n * theoretically possible if Eve ever supports tool-calls-as-turns)\n * and the parallel case (two `ai.eve.turn` spans opened on a shared\n * trace via `Promise.all`, which Workshop's in-process executor can\n * do when running sibling sub-agents under one sandbox).\n *\n * Lookup returns the top of the stack, which is the most-recently\n * opened still-active turn. That's the right answer for both cases:\n * - Nested: the inner turn is the descendant of the active span\n * that fires `ai.streamText.onStart`.\n * - Parallel: tie-broken in favour of the most-recently-started\n * entry. Public OTel APIs don't expose which `ai.eve.turn` is\n * the ancestor of the active `step.execute`, so this is the\n * best we can do without walking parent spans.\n *\n * Empty stacks are deleted from the map so the registry stays small.\n */\n private readonly stacks = new Map<string, EveTurnStackEntry[]>();\n\n /**\n * Record a turn's attributes. Called from the SpanProcessor's\n * `onStart` callback whenever an `ai.eve.turn` span is created.\n * Push onto the per-trace stack — see {@link stacks}.\n */\n record(traceId: string, spanId: string, entry: EveTurnEntry): void {\n if (!traceId || !spanId) return;\n let stack = this.stacks.get(traceId);\n if (!stack) {\n stack = [];\n this.stacks.set(traceId, stack);\n }\n stack.push({ ...entry, spanId });\n }\n\n /**\n * Look up the currently-active turn for a trace. Returns `undefined`\n * if no `ai.eve.turn` span has been seen for this trace — for example\n * when running outside Eve, or before the turn span has fired\n * `onStart` (shouldn't happen because Eve opens the turn span before\n * entering its context, but treated defensively).\n */\n lookup(traceId: string | undefined): EveTurnEntry | undefined {\n if (!traceId) return undefined;\n const stack = this.stacks.get(traceId);\n if (!stack || stack.length === 0) return undefined;\n return stack[stack.length - 1];\n }\n\n /**\n * Release the entry for a specific `(traceId, spanId)`. Called from\n * the SpanProcessor's `onEnd` callback. We schedule the removal on a\n * microtask so any in-flight `ai.streamText` `onStart` (which can\n * fire *after* `ai.eve.turn` ends if Eve's tool-loop is\n * mid-finalization) still finds the entry. The grace window is short\n * — we just need to outlive the synchronous AI SDK fan-out, not\n * minutes of idle time.\n *\n * Targets the exact `spanId` rather than popping the top of the\n * stack so that interleaved parallel turns release their own entries\n * regardless of end order.\n */\n releaseAfterTick(traceId: string | undefined, spanId: string | undefined): void {\n if (!traceId || !spanId) return;\n Promise.resolve().then(() => {\n const stack = this.stacks.get(traceId);\n if (!stack) return;\n const idx = stack.findIndex((e) => e.spanId === spanId);\n if (idx !== -1) {\n stack.splice(idx, 1);\n }\n if (stack.length === 0) {\n this.stacks.delete(traceId);\n }\n });\n }\n\n /**\n * Drop all entries. Called from the SpanProcessor's `shutdown` hook\n * during exporter teardown.\n */\n clear(): void {\n this.stacks.clear();\n }\n\n /**\n * Total number of in-flight entries across all traces. For tests +\n * diagnostic logging.\n */\n get size(): number {\n let total = 0;\n for (const stack of this.stacks.values()) total += stack.length;\n return total;\n }\n}\n\n/**\n * Module-singleton registry. One per process is the right granularity:\n * all sandboxes within a process share the global OTel TracerProvider\n * (per OTel's design), so they all observe each other's `ai.eve.turn`\n * spans via the same SpanProcessor.\n */\nconst registry = new EveTurnRegistry();\n\n/**\n * Build a SpanProcessor that records every `ai.eve.turn` span into the\n * module registry. Exported as a factory rather than a singleton so\n * tests can install fresh instances without leaking between cases.\n */\nexport function createEveTurnSpanProcessor(): EveTurnSpanProcessor {\n return {\n onStart(span: EveTurnLikeSpan): void {\n if (span.name !== EVE_TURN_SPAN_NAME) return;\n const attrs = span.attributes;\n if (!attrs) return;\n const ctx = span.spanContext();\n const continuationToken =\n typeof attrs[EVE_CONTINUATION_TOKEN_ATTR] === \"string\"\n ? (attrs[EVE_CONTINUATION_TOKEN_ATTR] as string)\n : undefined;\n const sessionId =\n typeof attrs[EVE_SESSION_ID_ATTR] === \"string\"\n ? (attrs[EVE_SESSION_ID_ATTR] as string)\n : undefined;\n registry.record(ctx.traceId, ctx.spanId, {\n continuationToken,\n sessionId,\n });\n },\n onEnd(span: EveTurnLikeSpan): void {\n if (span.name !== EVE_TURN_SPAN_NAME) return;\n const ctx = span.spanContext();\n registry.releaseAfterTick(ctx.traceId, ctx.spanId);\n },\n forceFlush(): Promise<void> {\n return Promise.resolve();\n },\n shutdown(): Promise<void> {\n registry.clear();\n return Promise.resolve();\n },\n };\n}\n\n/**\n * Look up a previously-recorded `ai.eve.turn` entry by the current\n * active span's `traceId`. Called from `injectEveCallContext`'s `onStart`\n * wrapper.\n */\nexport function lookupEveTurn(traceId: string | undefined): EveTurnEntry | undefined {\n return registry.lookup(traceId);\n}\n\n/**\n * Test-only escape hatch — reset the module registry between cases so\n * one test's recorded turn doesn't bleed into the next. Not exported\n * from the package barrel.\n */\nexport function _resetEveTurnRegistry(): void {\n registry.clear();\n}\n\n/**\n * Install the SpanProcessor on the user's NodeTracerProvider. Returns\n * `true` if installation succeeded, `false` if the global tracer\n * provider doesn't expose `addSpanProcessor` (e.g. a custom OTel SDK\n * that doesn't extend BasicTracerProvider, or no tracer provider\n * registered yet).\n *\n * Safe to call multiple times — the install flag prevents stacking\n * duplicate processors on the same provider.\n *\n * Pass `traceApi` so the caller controls which `@opentelemetry/api`\n * import we use (it must be the SAME one Eve uses internally, or\n * `trace.getTracerProvider()` will return a different ProxyTracerProvider\n * than the one that actually emits Eve's spans).\n */\nexport function installEveTurnSpanProcessor(traceApi: { getTracerProvider(): unknown }): boolean {\n if (installState.installed) return true;\n try {\n let provider: unknown = traceApi.getTracerProvider();\n // `trace.getTracerProvider()` returns a `ProxyTracerProvider` until\n // the SDK is registered, then a `ProxyTracerProvider` that delegates\n // to the real one. Unwrap via `getDelegate()` to reach the underlying\n // `NodeTracerProvider` / `BasicTracerProvider`.\n const proxyProvider = provider as { getDelegate?: () => unknown };\n if (typeof proxyProvider.getDelegate === \"function\") {\n const delegate = proxyProvider.getDelegate();\n if (delegate) provider = delegate;\n }\n const tp = provider as { addSpanProcessor?: (sp: EveTurnSpanProcessor) => void };\n if (typeof tp.addSpanProcessor !== \"function\") {\n return false;\n }\n tp.addSpanProcessor(createEveTurnSpanProcessor());\n installState.installed = true;\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Module-local install flag. Promoted to its own object so tests can\n * reset it via {@link _resetEveTurnInstallState} without re-exporting\n * a writable binding.\n */\nconst installState = { installed: false };\n\n/**\n * Test-only escape hatch — reset the install flag so a test can call\n * `installEveTurnSpanProcessor` again against a fresh fake provider.\n */\nexport function _resetEveTurnInstallState(): void {\n installState.installed = false;\n}\n","// src/ids.ts\nfunction getCrypto() {\n const c = globalThis.crypto;\n return c;\n}\nfunction randomBytes(length) {\n const cryptoObj = getCrypto();\n const out = new Uint8Array(length);\n if (cryptoObj && typeof cryptoObj.getRandomValues === \"function\") {\n cryptoObj.getRandomValues(out);\n return out;\n }\n for (let i = 0; i < out.length; i++) out[i] = Math.floor(Math.random() * 256);\n return out;\n}\nfunction randomUUID() {\n const cryptoObj = getCrypto();\n if (cryptoObj && typeof cryptoObj.randomUUID === \"function\") {\n return cryptoObj.randomUUID();\n }\n const b = randomBytes(16);\n b[6] = b[6] & 15 | 64;\n b[8] = b[8] & 63 | 128;\n const hex = [...b].map((x) => x.toString(16).padStart(2, \"0\")).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\nfunction base64Encode(bytes) {\n const maybeBuffer = globalThis.Buffer;\n if (maybeBuffer) {\n return maybeBuffer.from(bytes).toString(\"base64\");\n }\n let binary = \"\";\n for (let i2 = 0; i2 < bytes.length; i2++) {\n binary += String.fromCharCode(bytes[i2]);\n }\n const btoaFn = globalThis.btoa;\n if (typeof btoaFn === \"function\") return btoaFn(binary);\n const alphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n let out = \"\";\n let i = 0;\n while (i < binary.length) {\n const c1 = binary.charCodeAt(i++) & 255;\n const c2 = i < binary.length ? binary.charCodeAt(i++) & 255 : NaN;\n const c3 = i < binary.length ? binary.charCodeAt(i++) & 255 : NaN;\n const e1 = c1 >> 2;\n const e2 = (c1 & 3) << 4 | (Number.isNaN(c2) ? 0 : c2 >> 4);\n const e3 = Number.isNaN(c2) ? 64 : (c2 & 15) << 2 | (Number.isNaN(c3) ? 0 : c3 >> 6);\n const e4 = Number.isNaN(c3) ? 64 : c3 & 63;\n out += alphabet.charAt(e1);\n out += alphabet.charAt(e2);\n out += e3 === 64 ? \"=\" : alphabet.charAt(e3);\n out += e4 === 64 ? \"=\" : alphabet.charAt(e4);\n }\n return out;\n}\nfunction generateId() {\n return base64Encode(randomBytes(12)).replace(/[+/=]/g, \"\").slice(0, 16);\n}\n\n// src/http.ts\nvar DEFAULT_REQUEST_TIMEOUT_MS = 3e4;\nvar MAX_RETRY_DELAY_MS = 3e4;\nfunction wait(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\nfunction formatEndpoint(endpoint) {\n if (!endpoint) return void 0;\n return endpoint.endsWith(\"/\") ? endpoint : `${endpoint}/`;\n}\nfunction redactUrlForLog(url) {\n try {\n const parsed = new URL(url);\n parsed.username = \"\";\n parsed.password = \"\";\n parsed.search = \"\";\n parsed.hash = \"\";\n return parsed.toString();\n } catch (e) {\n return \"<unparseable-url>\";\n }\n}\nvar RATE_LIMITED_LOG_INTERVAL_MS = 3e4;\nvar rateLimitedLogLast = /* @__PURE__ */ new Map();\nfunction rateLimitedLog(key, log) {\n const now = Date.now();\n const last = rateLimitedLogLast.get(key);\n if (last !== void 0 && now - last < RATE_LIMITED_LOG_INTERVAL_MS) {\n return false;\n }\n rateLimitedLogLast.set(key, now);\n log();\n return true;\n}\nfunction resetRateLimitedLogState() {\n rateLimitedLogLast.clear();\n}\nasync function raceWithTimeout(promise, timeoutMs) {\n let timer;\n const settledInTime = await Promise.race([\n promise.then(\n () => true,\n () => true\n ),\n new Promise((resolve) => {\n var _a;\n timer = setTimeout(() => resolve(false), Math.max(0, timeoutMs));\n (_a = timer.unref) == null ? void 0 : _a.call(timer);\n })\n ]);\n if (timer) clearTimeout(timer);\n return settledInTime;\n}\nfunction parseRetryAfter(headers) {\n var _a;\n const value = (_a = headers.get(\"Retry-After\")) != null ? _a : headers.get(\"retry-after\");\n if (!value) return void 0;\n const asNumber = Number(value);\n if (value.trim() !== \"\" && !Number.isNaN(asNumber)) return asNumber * 1e3;\n const asDate = new Date(value).getTime();\n if (!Number.isNaN(asDate)) {\n const delta = asDate - Date.now();\n return delta > 0 ? delta : 0;\n }\n return void 0;\n}\nfunction getRetryDelayMs(attemptNumber, previousError) {\n if (previousError && typeof previousError === \"object\" && previousError !== null && \"retryAfterMs\" in previousError) {\n const v = previousError.retryAfterMs;\n if (typeof v === \"number\") return Math.min(Math.max(0, v), MAX_RETRY_DELAY_MS);\n }\n if (attemptNumber <= 1) return 0;\n const base = 500;\n const factor = Math.pow(2, attemptNumber - 2);\n return Math.min(base * factor, MAX_RETRY_DELAY_MS);\n}\nasync function withRetry(operation, opName, opts) {\n const prefix = opts.sdkName ? `[raindrop-ai/${opts.sdkName}]` : \"[raindrop-ai/core]\";\n let lastError = void 0;\n for (let attemptNumber = 1; attemptNumber <= opts.maxAttempts; attemptNumber++) {\n if (attemptNumber > 1) {\n const delay = getRetryDelayMs(attemptNumber, lastError);\n if (opts.debug) {\n console.warn(\n `${prefix} ${opName} retry ${attemptNumber}/${opts.maxAttempts} in ${delay}ms`\n );\n }\n if (delay > 0) await wait(delay);\n } else if (opts.debug) {\n console.log(`${prefix} ${opName} attempt ${attemptNumber}/${opts.maxAttempts}`);\n }\n try {\n return await operation();\n } catch (err) {\n lastError = err;\n if (opts.debug) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(\n `${prefix} ${opName} attempt ${attemptNumber} failed: ${msg}${attemptNumber === opts.maxAttempts ? \" (no more retries)\" : \"\"}`\n );\n }\n if (lastError && typeof lastError === \"object\" && \"retryable\" in lastError && !lastError.retryable)\n break;\n if (attemptNumber === opts.maxAttempts) break;\n }\n }\n throw lastError instanceof Error ? lastError : new Error(String(lastError));\n}\nasync function postJson(url, body, headers, opts) {\n var _a;\n const opName = `POST ${redactUrlForLog(url)}`;\n const timeoutMs = (_a = opts.timeoutMs) != null ? _a : DEFAULT_REQUEST_TIMEOUT_MS;\n await withRetry(\n async () => {\n const resp = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers\n },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(timeoutMs)\n });\n if (!resp.ok) {\n const text = await resp.text().catch(() => \"\");\n const err = new Error(\n `HTTP ${resp.status} ${resp.statusText}${text ? `: ${text}` : \"\"}`\n );\n const retryAfterMs = parseRetryAfter(resp.headers);\n if (typeof retryAfterMs === \"number\") err.retryAfterMs = retryAfterMs;\n err.retryable = resp.status === 429 || resp.status >= 500;\n throw err;\n }\n },\n opName,\n opts\n );\n}\n\n// src/payload-bounds.ts\nvar DEFAULT_MAX_TEXT_FIELD_CHARS = 1e6;\nvar TRUNCATION_MARKER = \"...[truncated by raindrop]\";\nvar BOUNDED_CLONE_MAX_DEPTH = 12;\nvar BOUNDED_CLONE_SLACK = 256;\nvar currentDefaultMaxTextFieldChars = DEFAULT_MAX_TEXT_FIELD_CHARS;\nfunction setDefaultMaxTextFieldChars(value) {\n if (typeof value === \"number\" && Number.isFinite(value) && value > 0) {\n currentDefaultMaxTextFieldChars = Math.floor(value);\n }\n}\nfunction getDefaultMaxTextFieldChars() {\n return currentDefaultMaxTextFieldChars;\n}\nfunction resetDefaultMaxTextFieldChars() {\n currentDefaultMaxTextFieldChars = DEFAULT_MAX_TEXT_FIELD_CHARS;\n}\nfunction resolveMaxTextFieldChars(value) {\n if (typeof value === \"number\" && Number.isFinite(value) && value > 0) {\n return Math.floor(value);\n }\n return currentDefaultMaxTextFieldChars;\n}\nfunction truncateToLimit(text, limit) {\n if (limit > TRUNCATION_MARKER.length) {\n return text.slice(0, limit - TRUNCATION_MARKER.length) + TRUNCATION_MARKER;\n }\n return text.slice(0, Math.max(0, limit));\n}\nfunction capText(value, limit) {\n if (typeof value !== \"string\") return value;\n const max = limit != null ? limit : currentDefaultMaxTextFieldChars;\n if (value.length <= max) return value;\n return truncateToLimit(value, max);\n}\nfunction boundedClone(obj, charBudget) {\n let budget = charBudget;\n const seen = /* @__PURE__ */ new WeakSet();\n const walk = (node, depth) => {\n if (budget <= 0) return TRUNCATION_MARKER;\n if (typeof node === \"string\") {\n if (node.length > budget) {\n const taken = node.slice(0, Math.max(0, budget)) + TRUNCATION_MARKER;\n budget = 0;\n return taken;\n }\n budget -= Math.max(node.length, 1);\n return node;\n }\n if (node === null || typeof node === \"number\" || typeof node === \"boolean\") {\n budget -= 8;\n return node;\n }\n if (typeof node !== \"object\") {\n budget -= 8;\n return node;\n }\n if (seen.has(node)) return \"[CIRCULAR]\";\n if (depth >= BOUNDED_CLONE_MAX_DEPTH) {\n budget -= 16;\n return `<max depth>`;\n }\n seen.add(node);\n if (Array.isArray(node)) {\n const out2 = [];\n for (const v of node) {\n if (budget <= 0) {\n out2.push(TRUNCATION_MARKER);\n break;\n }\n out2.push(walk(v, depth + 1));\n }\n return out2;\n }\n if (typeof node.toJSON === \"function\") {\n budget -= 16;\n return node;\n }\n const out = {};\n for (const k in node) {\n if (!Object.prototype.hasOwnProperty.call(node, k)) continue;\n if (budget <= 0) {\n out[\"...\"] = TRUNCATION_MARKER;\n break;\n }\n const key = walk(k, depth + 1);\n out[key] = walk(node[k], depth + 1);\n }\n return out;\n };\n return walk(obj, 0);\n}\nfunction stringifyBounded(value, limit) {\n const max = limit != null ? limit : currentDefaultMaxTextFieldChars;\n if (typeof value === \"string\") {\n return capText(value, max);\n }\n const pruned = boundedClone(value, max + TRUNCATION_MARKER.length + BOUNDED_CLONE_SLACK);\n let json;\n try {\n json = JSON.stringify(pruned);\n } catch (e) {\n json = void 0;\n }\n if (json === void 0) {\n return capText(String(value), max);\n }\n return json.length <= max ? json : truncateToLimit(json, max);\n}\n\n// src/otlp.ts\nvar SpanStatusCode = {\n UNSET: 0,\n OK: 1,\n ERROR: 2\n};\nfunction createSpanIds(parent) {\n const traceId = parent ? parent.traceIdB64 : base64Encode(randomBytes(16));\n const spanId = base64Encode(randomBytes(8));\n return {\n traceIdB64: traceId,\n spanIdB64: spanId,\n parentSpanIdB64: parent ? parent.spanIdB64 : void 0\n };\n}\nfunction nowUnixNanoString() {\n return Date.now().toString() + \"000000\";\n}\nfunction unixMsToNanoString(ms) {\n return String(Math.floor(ms)) + \"000000\";\n}\nfunction attrString(key, value) {\n if (value === void 0) return void 0;\n return { key, value: { stringValue: value } };\n}\nfunction attrInt(key, value) {\n if (value === void 0) return void 0;\n if (!Number.isFinite(value)) return void 0;\n return { key, value: { intValue: String(Math.trunc(value)) } };\n}\nfunction attrDouble(key, value) {\n if (value === void 0) return void 0;\n if (!Number.isFinite(value)) return void 0;\n return { key, value: { doubleValue: value } };\n}\nfunction attrBool(key, value) {\n if (value === void 0) return void 0;\n return { key, value: { boolValue: value } };\n}\nfunction attrStringArray(key, values) {\n if (!values || values.length === 0) return void 0;\n return {\n key,\n value: {\n arrayValue: {\n values: values.filter((v) => typeof v === \"string\").map((v) => ({ stringValue: v }))\n }\n }\n };\n}\nfunction buildOtlpSpan(args) {\n const attrs = args.attributes.filter((x) => x !== void 0);\n const span = {\n traceId: args.ids.traceIdB64,\n spanId: args.ids.spanIdB64,\n name: args.name,\n startTimeUnixNano: args.startTimeUnixNano,\n endTimeUnixNano: args.endTimeUnixNano\n };\n if (args.ids.parentSpanIdB64) span.parentSpanId = args.ids.parentSpanIdB64;\n if (attrs.length) span.attributes = attrs;\n if (args.status) span.status = args.status;\n return span;\n}\nfunction buildExportTraceServiceRequest(spans, serviceName = \"raindrop.core\", serviceVersion = \"0.0.0\") {\n return {\n resourceSpans: [\n {\n resource: {\n attributes: [{ key: \"service.name\", value: { stringValue: serviceName } }]\n },\n scopeSpans: [\n {\n scope: { name: serviceName, version: serviceVersion },\n spans\n }\n ]\n }\n ]\n };\n}\n\n// src/local-debugger.ts\nvar LOCAL_DEBUGGER_ENV_VAR = \"RAINDROP_LOCAL_DEBUGGER\";\nvar WORKSHOP_ENV_VAR = \"RAINDROP_WORKSHOP\";\nvar DEFAULT_LOCAL_WORKSHOP_URL = \"http://localhost:5899/v1/\";\nfunction readEnvVar(name) {\n var _a;\n try {\n const env = (_a = globalThis == null ? void 0 : globalThis.process) == null ? void 0 : _a.env;\n if (env && typeof env[name] === \"string\" && env[name].length > 0) {\n return env[name];\n }\n } catch (e) {\n }\n return void 0;\n}\nfunction readWorkshopEnv() {\n const raw = readEnvVar(WORKSHOP_ENV_VAR);\n if (raw === void 0) return void 0;\n const trimmed = raw.trim();\n if (trimmed.length === 0) return void 0;\n if (/^https?:\\/\\//i.test(trimmed)) return { url: trimmed };\n if (/^(1|true|yes|on)$/i.test(trimmed)) return \"enable\";\n if (/^(0|false|no|off)$/i.test(trimmed)) return \"disable\";\n return void 0;\n}\nfunction isLocalDevHost(hostname) {\n if (!hostname) return false;\n if (hostname === \"localhost\" || hostname === \"127.0.0.1\" || hostname === \"0.0.0.0\" || hostname === \"::1\") {\n return true;\n }\n if (hostname.endsWith(\".localhost\")) return true;\n return false;\n}\nfunction readRuntimeHostname() {\n try {\n const loc = globalThis == null ? void 0 : globalThis.location;\n if (loc && typeof loc.hostname === \"string\" && loc.hostname.length > 0) {\n return loc.hostname;\n }\n } catch (e) {\n }\n return void 0;\n}\nfunction shouldAutoEnableLocalWorkshop() {\n if (isLocalDevHost(readRuntimeHostname())) return true;\n if (readEnvVar(\"NODE_ENV\") === \"development\") return true;\n return false;\n}\nfunction resolveLocalDebuggerBaseUrl(baseUrl) {\n var _a, _b, _c;\n if (baseUrl === null) return null;\n if (typeof baseUrl === \"string\" && baseUrl.length > 0) {\n return (_a = formatEndpoint(baseUrl)) != null ? _a : null;\n }\n const explicitUrlEnv = readEnvVar(LOCAL_DEBUGGER_ENV_VAR);\n if (explicitUrlEnv) return (_b = formatEndpoint(explicitUrlEnv)) != null ? _b : null;\n const workshopEnv = readWorkshopEnv();\n if (workshopEnv === \"disable\") return null;\n if (workshopEnv === \"enable\") return DEFAULT_LOCAL_WORKSHOP_URL;\n if (workshopEnv && \"url\" in workshopEnv) return (_c = formatEndpoint(workshopEnv.url)) != null ? _c : null;\n if (shouldAutoEnableLocalWorkshop()) return DEFAULT_LOCAL_WORKSHOP_URL;\n return null;\n}\nfunction localDebuggerEnabled(baseUrl) {\n return resolveLocalDebuggerBaseUrl(baseUrl) !== null;\n}\nfunction mirrorTraceExportToLocalDebugger(body, options = {}) {\n var _a;\n const baseUrl = resolveLocalDebuggerBaseUrl(options.baseUrl);\n if (!baseUrl) return;\n void postJson(`${baseUrl}traces`, body, {}, {\n maxAttempts: 1,\n debug: (_a = options.debug) != null ? _a : false,\n sdkName: options.sdkName\n }).catch(() => {\n });\n}\nfunction mirrorPartialEventToLocalDebugger(event, options = {}) {\n var _a;\n const baseUrl = resolveLocalDebuggerBaseUrl(options.baseUrl);\n if (!baseUrl) return;\n const headers = options.writeKey ? { Authorization: `Bearer ${options.writeKey}` } : {};\n void postJson(`${baseUrl}events/track_partial`, event, headers, {\n maxAttempts: 1,\n debug: (_a = options.debug) != null ? _a : false,\n sdkName: options.sdkName\n }).catch(() => {\n });\n}\nfunction sendLocalDebuggerLiveEvent(event, options = {}) {\n var _a, _b;\n const baseUrl = resolveLocalDebuggerBaseUrl(options.baseUrl);\n if (!baseUrl) return;\n void postJson(\n `${baseUrl}live`,\n {\n ...event,\n type: event.type,\n timestamp: (_a = event.timestamp) != null ? _a : Date.now()\n },\n {},\n {\n maxAttempts: 1,\n debug: (_b = options.debug) != null ? _b : false,\n sdkName: options.sdkName\n }\n ).catch(() => {\n });\n}\nfunction sendLocalDebuggerTextDelta(traceId, content, metadata) {\n sendLocalDebuggerLiveEvent({ traceId, type: \"text_delta\", content, metadata });\n}\nfunction sendLocalDebuggerReasoningDelta(traceId, content, metadata) {\n sendLocalDebuggerLiveEvent({ traceId, type: \"reasoning_delta\", content, metadata });\n}\nfunction sendLocalDebuggerToolStart(traceId, toolName, metadata) {\n sendLocalDebuggerLiveEvent({ traceId, type: \"tool_start\", content: toolName, metadata });\n}\nfunction sendLocalDebuggerToolResult(traceId, toolName, metadata) {\n sendLocalDebuggerLiveEvent({ traceId, type: \"tool_result\", content: toolName, metadata });\n}\n\n// src/project-id.ts\nvar PROJECT_ID_HEADER = \"X-Raindrop-Project-Id\";\nvar PROJECT_ID_SLUG_PATTERN = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/;\nfunction isValidProjectIdSlug(value) {\n return PROJECT_ID_SLUG_PATTERN.test(value);\n}\nfunction normalizeProjectId(raw, opts) {\n if (typeof raw !== \"string\") return void 0;\n const trimmed = raw.trim();\n if (!trimmed) return void 0;\n if (!isValidProjectIdSlug(trimmed) && opts.debug) {\n console.warn(\n `${opts.prefix} projectId \"${trimmed}\" does not match slug ${PROJECT_ID_SLUG_PATTERN.source}; sending anyway \\u2014 backend may reject with HTTP 400`\n );\n }\n return trimmed;\n}\nfunction projectIdHeaders(projectId) {\n return projectId ? { [PROJECT_ID_HEADER]: projectId } : {};\n}\n\n// src/event-shipper.ts\nvar SHUTDOWN_DEADLINE_MS = 1e4;\nvar POST_SHUTDOWN_TIMEOUT_MS = 5e3;\nfunction mergePatches(target, source) {\n var _a, _b, _c, _d;\n const out = { ...target, ...source };\n if (target.properties || source.properties) {\n out.properties = { ...(_a = target.properties) != null ? _a : {}, ...(_b = source.properties) != null ? _b : {} };\n }\n if (target.attachments || source.attachments) {\n out.attachments = [...(_c = target.attachments) != null ? _c : [], ...(_d = source.attachments) != null ? _d : []];\n }\n return out;\n}\nvar EventShipper = class {\n constructor(opts) {\n this.buffers = /* @__PURE__ */ new Map();\n this.sticky = /* @__PURE__ */ new Map();\n this.timers = /* @__PURE__ */ new Map();\n this.inFlight = /* @__PURE__ */ new Set();\n /**\n * Set once `shutdown()` begins and never cleared. Sends issued after the\n * drain window (stragglers, or flush work the deadline abandoned\n * mid-drain) run as a single short attempt instead of regaining the full\n * retry schedule.\n */\n this.hasShutdown = false;\n var _a, _b, _c, _d, _e, _f, _g, _h;\n this.writeKey = (_a = opts.writeKey) == null ? void 0 : _a.trim();\n this.baseUrl = (_b = formatEndpoint(opts.endpoint)) != null ? _b : \"https://api.raindrop.ai/v1/\";\n this.enabled = opts.enabled !== false;\n this.debug = opts.debug;\n this.partialFlushMs = (_c = opts.partialFlushMs) != null ? _c : 1e3;\n this.sdkName = (_d = opts.sdkName) != null ? _d : \"core\";\n this.prefix = `[raindrop-ai/${this.sdkName}]`;\n this.defaultEventName = (_e = opts.defaultEventName) != null ? _e : \"ai_generation\";\n this.maxTextFieldCharsOpt = opts.maxTextFieldChars;\n this.localDebuggerUrl = (_f = resolveLocalDebuggerBaseUrl(opts.localDebuggerUrl)) != null ? _f : void 0;\n if (this.debug && this.localDebuggerUrl) {\n console.log(`${this.prefix} Local debugger mirroring: ${this.localDebuggerUrl}`);\n }\n this.projectId = normalizeProjectId(opts.projectId, {\n debug: this.debug,\n prefix: this.prefix\n });\n const isNode = typeof process !== \"undefined\" && typeof process.version === \"string\";\n this.context = {\n library: {\n name: (_g = opts.libraryName) != null ? _g : \"@raindrop-ai/core\",\n version: (_h = opts.libraryVersion) != null ? _h : \"0.0.0\"\n },\n metadata: {\n jsRuntime: isNode ? \"node\" : \"web\",\n ...isNode ? { nodeVersion: process.version } : {}\n }\n };\n }\n isDebugEnabled() {\n return this.debug;\n }\n authHeaders() {\n return this.writeKey ? { Authorization: `Bearer ${this.writeKey}` } : {};\n }\n requestHeaders() {\n return { ...this.authHeaders(), ...projectIdHeaders(this.projectId) };\n }\n /**\n * Build the retry/timeout options for one POST, honoring the shutdown\n * deadline. Returns `null` when the shutdown drain window is exhausted —\n * the caller must drop the payload (with a rate-limited warning) instead\n * of issuing a request that could outlive process exit.\n *\n * Checked fresh on EVERY send, so a shutdown that begins while the flush\n * path is mid-drain takes effect immediately: no further retries, and the\n * per-attempt timeout is clamped to the remaining window. After\n * `shutdown()` returns (deadline cleared, `hasShutdown` still set),\n * sends — late callers, or flush work the deadline abandoned mid-drain —\n * run as a single short attempt rather than regaining the full retry\n * schedule.\n */\n requestOpts() {\n if (this.shutdownDeadlineAt !== void 0) {\n const remainingMs = this.shutdownDeadlineAt - Date.now();\n if (remainingMs <= 0) return null;\n return {\n maxAttempts: 1,\n debug: this.debug,\n sdkName: this.sdkName,\n timeoutMs: Math.min(DEFAULT_REQUEST_TIMEOUT_MS, remainingMs)\n };\n }\n if (this.hasShutdown) {\n return {\n maxAttempts: 1,\n debug: this.debug,\n sdkName: this.sdkName,\n timeoutMs: POST_SHUTDOWN_TIMEOUT_MS\n };\n }\n return { maxAttempts: 3, debug: this.debug, sdkName: this.sdkName };\n }\n async patch(eventId, patch) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;\n if (!this.enabled) return;\n if (!eventId || !eventId.trim()) return;\n const maxChars = resolveMaxTextFieldChars(this.maxTextFieldCharsOpt);\n if (typeof patch.input === \"string\" && patch.input.length > maxChars) {\n patch = { ...patch, input: capText(patch.input, maxChars) };\n }\n if (typeof patch.output === \"string\" && patch.output.length > maxChars) {\n patch = { ...patch, output: capText(patch.output, maxChars) };\n }\n if (this.debug) {\n console.log(`${this.prefix} queue patch`, {\n eventId,\n userId: patch.userId,\n convoId: patch.convoId,\n eventName: patch.eventName,\n hasInput: typeof patch.input === \"string\" && patch.input.length > 0,\n hasOutput: typeof patch.output === \"string\" && patch.output.length > 0,\n attachments: (_b = (_a = patch.attachments) == null ? void 0 : _a.length) != null ? _b : 0,\n isPending: patch.isPending\n });\n }\n const sticky = (_c = this.sticky.get(eventId)) != null ? _c : {};\n const existing = (_d = this.buffers.get(eventId)) != null ? _d : {};\n const merged = mergePatches(existing, patch);\n merged.isPending = (_g = (_f = (_e = patch.isPending) != null ? _e : existing.isPending) != null ? _f : sticky.isPending) != null ? _g : true;\n this.buffers.set(eventId, merged);\n this.sticky.set(eventId, {\n userId: (_h = merged.userId) != null ? _h : sticky.userId,\n convoId: (_i = merged.convoId) != null ? _i : sticky.convoId,\n eventName: (_j = merged.eventName) != null ? _j : sticky.eventName,\n isPending: (_k = merged.isPending) != null ? _k : sticky.isPending\n });\n const t = this.timers.get(eventId);\n if (t) clearTimeout(t);\n if (merged.isPending === false) {\n await this.flushOne(eventId);\n return;\n }\n const timeout = setTimeout(() => {\n void this.flushOne(eventId).catch(() => {\n });\n }, this.partialFlushMs);\n this.timers.set(eventId, timeout);\n }\n async finish(eventId, patch) {\n await this.patch(eventId, { ...patch, isPending: false });\n }\n async flush() {\n if (!this.enabled) return;\n const ids = [...this.buffers.keys()];\n await Promise.all(ids.map((id) => this.flushOne(id)));\n await Promise.all([...this.inFlight].map((p) => p.catch(() => {\n })));\n }\n async shutdown() {\n this.hasShutdown = true;\n this.shutdownDeadlineAt = Date.now() + SHUTDOWN_DEADLINE_MS;\n try {\n for (const t of this.timers.values()) clearTimeout(t);\n this.timers.clear();\n const settled = await raceWithTimeout(this.flush(), SHUTDOWN_DEADLINE_MS);\n if (!settled) this.warnShutdownDrop(\"in-flight request(s) at shutdown\");\n } finally {\n this.shutdownDeadlineAt = void 0;\n }\n }\n async trackSignal(signal) {\n var _a, _b;\n if (!this.enabled) return;\n const body = [\n {\n event_id: signal.eventId,\n signal_name: signal.name,\n signal_type: (_a = signal.type) != null ? _a : \"default\",\n timestamp: signal.timestamp,\n sentiment: signal.sentiment,\n attachment_id: signal.attachmentId,\n properties: {\n ...(_b = signal.properties) != null ? _b : {},\n ...signal.comment ? { comment: signal.comment } : {},\n ...signal.after ? { after: signal.after } : {}\n }\n }\n ];\n if (!this.writeKey) return;\n const url = `${this.baseUrl}signals/track`;\n const opts = this.requestOpts();\n if (!opts) {\n this.warnShutdownDrop(\"signal\");\n return;\n }\n try {\n await postJson(url, body, this.requestHeaders(), opts);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n rateLimitedLog(\n `${this.prefix}.send_signal_failed`,\n () => console.warn(`${this.prefix} failed to send signal (dropping): ${msg}`)\n );\n }\n }\n async identify(users) {\n if (!this.enabled) return;\n const list = Array.isArray(users) ? users : [users];\n const body = list.filter((user) => {\n if (!(user == null ? void 0 : user.userId) || !user.userId.trim()) {\n if (this.debug) {\n console.warn(`${this.prefix} skipping identify: missing userId`);\n }\n return false;\n }\n return true;\n }).map((user) => {\n var _a;\n return {\n user_id: user.userId,\n traits: (_a = user.traits) != null ? _a : {}\n };\n });\n if (!this.writeKey) return;\n if (body.length === 0) return;\n const url = `${this.baseUrl}users/identify`;\n const opts = this.requestOpts();\n if (!opts) {\n this.warnShutdownDrop(\"identify\");\n return;\n }\n try {\n await postJson(url, body, this.requestHeaders(), opts);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n rateLimitedLog(\n `${this.prefix}.send_identify_failed`,\n () => console.warn(`${this.prefix} failed to send identify (dropping): ${msg}`)\n );\n }\n }\n warnShutdownDrop(what) {\n rateLimitedLog(\n `${this.prefix}.shutdown_deadline`,\n () => console.warn(`${this.prefix} shutdown flush deadline exceeded; dropping ${what}`)\n );\n }\n async flushOne(eventId) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m;\n if (!this.enabled) return;\n const timer = this.timers.get(eventId);\n if (timer) {\n clearTimeout(timer);\n this.timers.delete(eventId);\n }\n const accumulated = this.buffers.get(eventId);\n this.buffers.delete(eventId);\n if (!accumulated) return;\n const sticky = (_a = this.sticky.get(eventId)) != null ? _a : {};\n const eventName = (_c = (_b = accumulated.eventName) != null ? _b : sticky.eventName) != null ? _c : this.defaultEventName;\n const userId = (_d = accumulated.userId) != null ? _d : sticky.userId;\n if (!userId) {\n if (this.debug) {\n console.warn(`${this.prefix} skipping track_partial for ${eventId}: missing userId`);\n }\n this.sticky.delete(eventId);\n return;\n }\n const { wizardSession, ...restProperties } = (_e = accumulated.properties) != null ? _e : {};\n const convoId = (_f = accumulated.convoId) != null ? _f : sticky.convoId;\n const isPending = (_h = (_g = accumulated.isPending) != null ? _g : sticky.isPending) != null ? _h : true;\n const payload = {\n event_id: eventId,\n user_id: userId,\n event: eventName,\n timestamp: (_i = accumulated.timestamp) != null ? _i : (/* @__PURE__ */ new Date()).toISOString(),\n ai_data: {\n input: accumulated.input,\n output: accumulated.output,\n model: accumulated.model,\n convo_id: convoId\n },\n properties: {\n ...restProperties,\n ...wizardSession ? { \"raindrop.wizardSession\": wizardSession } : {},\n $context: this.context\n },\n attachments: accumulated.attachments,\n is_pending: isPending\n };\n const url = `${this.baseUrl}events/track_partial`;\n if (this.debug) {\n console.log(`${this.prefix} sending track_partial`, {\n eventId,\n eventName,\n userId,\n convoId,\n isPending,\n inputPreview: typeof accumulated.input === \"string\" ? accumulated.input.slice(0, 120) : void 0,\n outputPreview: typeof accumulated.output === \"string\" ? accumulated.output.slice(0, 120) : void 0,\n attachments: (_k = (_j = accumulated.attachments) == null ? void 0 : _j.length) != null ? _k : 0,\n attachmentKinds: (_m = (_l = accumulated.attachments) == null ? void 0 : _l.map((a) => ({\n type: a.type,\n role: a.role,\n name: a.name,\n valuePreview: a.value.slice(0, 60)\n }))) != null ? _m : [],\n endpoint: url\n });\n }\n if (this.localDebuggerUrl) {\n mirrorPartialEventToLocalDebugger(payload, {\n baseUrl: this.localDebuggerUrl,\n writeKey: this.writeKey,\n debug: this.debug,\n sdkName: this.sdkName\n });\n }\n if (!this.writeKey) {\n if (!isPending) this.sticky.delete(eventId);\n return;\n }\n const opts = this.requestOpts();\n if (!opts) {\n this.warnShutdownDrop(`track_partial ${eventId}`);\n if (!isPending) this.sticky.delete(eventId);\n return;\n }\n const p = postJson(url, payload, this.requestHeaders(), opts);\n this.inFlight.add(p);\n try {\n try {\n await p;\n if (this.debug) {\n console.log(`${this.prefix} sent track_partial ${eventId} (${eventName})`);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n rateLimitedLog(\n `${this.prefix}.send_track_partial_failed`,\n () => console.warn(`${this.prefix} failed to send track_partial (dropping): ${msg}`)\n );\n }\n } finally {\n this.inFlight.delete(p);\n }\n if (!isPending) {\n this.sticky.delete(eventId);\n }\n }\n};\n\n// src/redact.ts\nvar DEFAULT_SECRET_KEY_NAMES = [\n \"apikey\",\n \"apisecret\",\n \"apitoken\",\n \"secretaccesskey\",\n \"sessiontoken\",\n \"privatekey\",\n \"privatekeyid\",\n \"clientsecret\",\n \"accesstoken\",\n \"refreshtoken\",\n \"oauthtoken\",\n \"bearertoken\",\n \"authorization\",\n \"password\",\n \"passphrase\"\n];\nvar REDACTED_PLACEHOLDER = \"[REDACTED]\";\nfunction normalizeKeyName(name) {\n return name.toLowerCase().replace(/[-_.]/g, \"\");\n}\nfunction redactSecretsInObject(value, options) {\n var _a, _b;\n const normalizedSecretSet = buildSecretSet((_a = options == null ? void 0 : options.secretKeyNames) != null ? _a : DEFAULT_SECRET_KEY_NAMES);\n const placeholder = (_b = options == null ? void 0 : options.placeholder) != null ? _b : REDACTED_PLACEHOLDER;\n const seen = /* @__PURE__ */ new WeakSet();\n const walk = (node) => {\n if (node === null || typeof node !== \"object\") return node;\n if (seen.has(node)) return \"[CIRCULAR]\";\n seen.add(node);\n if (Array.isArray(node)) {\n return node.map((item) => walk(item));\n }\n const out = {};\n for (const [k, v] of Object.entries(node)) {\n if (normalizedSecretSet.has(normalizeKeyName(k))) {\n out[k] = placeholder;\n } else {\n out[k] = walk(v);\n }\n }\n return out;\n };\n return walk(value);\n}\nfunction buildSecretSet(names) {\n const set = /* @__PURE__ */ new Set();\n for (const name of names) set.add(normalizeKeyName(name));\n return set;\n}\nvar DEFAULT_REDACT_ATTRIBUTE_KEYS = [\n \"ai.request.providerOptions\",\n \"ai.response.providerMetadata\"\n];\nfunction defaultTransformSpan(span) {\n const attrs = span.attributes;\n if (!attrs || attrs.length === 0) return span;\n let nextAttrs;\n for (let i = 0; i < attrs.length; i++) {\n const attr = attrs[i];\n const redacted = redactJsonAttributeValue(attr.key, attr.value);\n if (redacted === void 0) continue;\n if (!nextAttrs) nextAttrs = attrs.slice();\n nextAttrs[i] = { key: attr.key, value: redacted };\n }\n if (!nextAttrs) return span;\n return { ...span, attributes: nextAttrs };\n}\nvar REDACT_JSON_ATTRIBUTE_KEYS = new Set(DEFAULT_REDACT_ATTRIBUTE_KEYS);\nfunction redactJsonAttributeValue(key, value) {\n if (!REDACT_JSON_ATTRIBUTE_KEYS.has(key)) return void 0;\n const json = value.stringValue;\n if (typeof json !== \"string\" || json.length === 0) return void 0;\n let parsed;\n try {\n parsed = JSON.parse(json);\n } catch (e) {\n return void 0;\n }\n const scrubbed = redactSecretsInObject(parsed);\n let scrubbedJson;\n try {\n scrubbedJson = JSON.stringify(scrubbed);\n } catch (e) {\n return void 0;\n }\n if (scrubbedJson === json) return void 0;\n return { stringValue: scrubbedJson };\n}\n\n// src/trace-shipper.ts\nfunction applyOtelSpanAttributeLimit(limit) {\n var _a, _b;\n try {\n const raw = (_b = (_a = globalThis == null ? void 0 : globalThis.process) == null ? void 0 : _a.env) == null ? void 0 : _b.OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT;\n if (!raw) return limit;\n const parsed = Number.parseInt(raw, 10);\n if (Number.isFinite(parsed) && parsed > 0) {\n return Math.min(limit, parsed);\n }\n } catch (e) {\n }\n return limit;\n}\nvar TraceShipper = class {\n constructor(opts) {\n this.queue = [];\n this.inFlight = /* @__PURE__ */ new Set();\n /**\n * Set once `shutdown()` begins and never cleared. Sends issued after the\n * drain window (stragglers, or flush work the deadline abandoned\n * mid-drain) run as a single short attempt instead of regaining the full\n * retry schedule.\n */\n this.hasShutdown = false;\n var _a, _b, _c, _d, _e, _f, _g, _h, _i;\n this.writeKey = (_a = opts.writeKey) == null ? void 0 : _a.trim();\n this.baseUrl = (_b = formatEndpoint(opts.endpoint)) != null ? _b : \"https://api.raindrop.ai/v1/\";\n this.enabled = opts.enabled !== false;\n this.debug = opts.debug;\n this.debugSpans = opts.debugSpans === true;\n this.flushIntervalMs = (_c = opts.flushIntervalMs) != null ? _c : 1e3;\n this.maxBatchSize = (_d = opts.maxBatchSize) != null ? _d : 50;\n this.maxQueueSize = (_e = opts.maxQueueSize) != null ? _e : 5e3;\n this.sdkName = (_f = opts.sdkName) != null ? _f : \"core\";\n this.prefix = `[raindrop-ai/${this.sdkName}]`;\n this.serviceName = (_g = opts.serviceName) != null ? _g : \"raindrop.core\";\n this.serviceVersion = (_h = opts.serviceVersion) != null ? _h : \"0.0.0\";\n this.localDebuggerUrl = (_i = resolveLocalDebuggerBaseUrl(opts.localDebuggerUrl)) != null ? _i : void 0;\n if (this.debug && this.localDebuggerUrl) {\n console.log(`${this.prefix} Local debugger mirroring: ${this.localDebuggerUrl}`);\n }\n this.projectId = normalizeProjectId(opts.projectId, {\n debug: this.debug,\n prefix: this.prefix\n });\n this.transformSpanHook = opts.transformSpan;\n this.disableDefaultRedaction = opts.disableDefaultRedaction === true;\n this.maxTextFieldCharsOpt = opts.maxTextFieldChars;\n }\n /**\n * Cap every string attribute value on the span. O(#attributes) length\n * checks; only oversized values pay a slice. Runs AFTER the redaction\n * pipeline so the default secret-scrub still sees parseable JSON in\n * `ai.request.providerOptions` / `ai.response.providerMetadata` (capping\n * first could cut a JSON blob mid-way, fail the parse, and ship secrets\n * in the surviving prefix).\n *\n * A stricter `OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT` env var is honored\n * for span content, matching the Python SDK and the OTel SDK convention.\n */\n capSpanAttributes(span) {\n var _a;\n const maxChars = applyOtelSpanAttributeLimit(\n resolveMaxTextFieldChars(this.maxTextFieldCharsOpt)\n );\n const attrs = span.attributes;\n if (!attrs || attrs.length === 0) return span;\n let nextAttrs;\n for (let i = 0; i < attrs.length; i++) {\n const attr = attrs[i];\n const value = (_a = attr.value) == null ? void 0 : _a.stringValue;\n if (typeof value !== \"string\" || value.length <= maxChars) continue;\n if (!nextAttrs) nextAttrs = attrs.slice();\n nextAttrs[i] = {\n key: attr.key,\n value: { ...attr.value, stringValue: capText(value, maxChars) }\n };\n }\n if (!nextAttrs) return span;\n return { ...span, attributes: nextAttrs };\n }\n /**\n * Apply the user `transformSpan` hook (if any) followed by the default\n * redactor (unless disabled). Returns either the (possibly new) span to\n * ship, or `null` to drop the span entirely.\n *\n * Ordering: user hook runs first so callers can rewrite the span freely\n * (rename attrs, add new ones, scrub things the default doesn't know\n * about). The default redactor then runs on whatever the user produced,\n * acting as the always-on floor for documented BYOK secrets. If the user\n * sets `disableDefaultRedaction: true`, the floor is skipped.\n *\n * Fail-closed: if the user hook throws, the span is dropped — a buggy\n * hook can never accidentally ship raw, un-redacted spans.\n */\n redactSpan(span) {\n let current = span;\n if (this.transformSpanHook) {\n try {\n const result = this.transformSpanHook(current);\n if (result === null) return null;\n if (result !== void 0) current = result;\n } catch (err) {\n if (this.debug) {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`${this.prefix} transformSpan hook threw: ${msg}`);\n }\n return null;\n }\n }\n if (!this.disableDefaultRedaction) {\n current = defaultTransformSpan(current);\n }\n return this.capSpanAttributes(current);\n }\n isDebugEnabled() {\n return this.debug;\n }\n authHeaders() {\n return this.writeKey ? { Authorization: `Bearer ${this.writeKey}` } : {};\n }\n requestHeaders() {\n return { ...this.authHeaders(), ...projectIdHeaders(this.projectId) };\n }\n startSpan(args) {\n var _a, _b;\n const ids = createSpanIds(args.parent);\n const started = (_a = args.startTimeUnixNano) != null ? _a : nowUnixNanoString();\n const attrs = [\n attrString(\"ai.telemetry.metadata.raindrop.eventId\", args.eventId),\n attrString(\"ai.operationId\", args.operationId)\n ];\n if ((_b = args.attributes) == null ? void 0 : _b.length) attrs.push(...args.attributes);\n const span = { ids, name: args.name, startTimeUnixNano: started, attributes: attrs };\n this.mirrorToLocalDebugger(\n buildOtlpSpan({\n ids: span.ids,\n name: span.name,\n startTimeUnixNano: span.startTimeUnixNano,\n endTimeUnixNano: span.startTimeUnixNano,\n // placeholder — will be updated on endSpan\n attributes: span.attributes,\n status: { code: SpanStatusCode.UNSET }\n })\n );\n return span;\n }\n mirrorToLocalDebugger(span) {\n if (!this.localDebuggerUrl) return;\n const redacted = this.redactSpan(span);\n if (redacted === null) return;\n const body = buildExportTraceServiceRequest([redacted], this.serviceName, this.serviceVersion);\n mirrorTraceExportToLocalDebugger(body, {\n baseUrl: this.localDebuggerUrl,\n debug: false,\n sdkName: this.sdkName\n });\n }\n endSpan(span, extra) {\n var _a, _b;\n if (span.endTimeUnixNano) return;\n span.endTimeUnixNano = (_a = extra == null ? void 0 : extra.endTimeUnixNano) != null ? _a : nowUnixNanoString();\n if ((_b = extra == null ? void 0 : extra.attributes) == null ? void 0 : _b.length) {\n span.attributes.push(...extra.attributes);\n }\n let status = extra == null ? void 0 : extra.status;\n if (!status && (extra == null ? void 0 : extra.error) !== void 0) {\n const message = extra.error instanceof Error ? extra.error.message : String(extra.error);\n status = { code: SpanStatusCode.ERROR, message };\n }\n const otlp = buildOtlpSpan({\n ids: span.ids,\n name: span.name,\n startTimeUnixNano: span.startTimeUnixNano,\n endTimeUnixNano: span.endTimeUnixNano,\n attributes: span.attributes,\n status\n });\n this.enqueue(otlp);\n this.mirrorToLocalDebugger(otlp);\n }\n createSpan(args) {\n var _a;\n const ids = createSpanIds(args.parent);\n const attrs = [\n attrString(\"ai.telemetry.metadata.raindrop.eventId\", args.eventId)\n ];\n if ((_a = args.attributes) == null ? void 0 : _a.length) attrs.push(...args.attributes);\n const otlp = buildOtlpSpan({\n ids,\n name: args.name,\n startTimeUnixNano: args.startTimeUnixNano,\n endTimeUnixNano: args.endTimeUnixNano,\n attributes: attrs,\n status: args.status\n });\n this.enqueue(otlp);\n this.mirrorToLocalDebugger(otlp);\n }\n enqueue(span) {\n if (!this.enabled) return;\n if (this.debugSpans) {\n const short = (s) => s ? s.slice(-8) : \"none\";\n console.log(\n `${this.prefix}[span] name=${span.name} trace=${short(span.traceId)} span=${short(span.spanId)} parent=${short(\n span.parentSpanId\n )}`\n );\n }\n const redacted = this.redactSpan(span);\n if (redacted === null) return;\n if (this.queue.length >= this.maxQueueSize) {\n this.queue.shift();\n }\n this.queue.push(redacted);\n if (this.queue.length >= this.maxBatchSize) {\n void this.flush().catch(() => {\n });\n return;\n }\n if (!this.timer) {\n this.timer = setTimeout(() => {\n this.timer = void 0;\n void this.flush().catch(() => {\n });\n }, this.flushIntervalMs);\n }\n }\n async flush() {\n if (!this.enabled) return;\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = void 0;\n }\n while (this.queue.length > 0) {\n const batch = this.queue.splice(0, this.maxBatchSize);\n if (!this.writeKey) continue;\n const opts = this.requestOpts();\n if (!opts) {\n rateLimitedLog(\n `${this.prefix}.shutdown_deadline`,\n () => console.warn(\n `${this.prefix} shutdown flush deadline exceeded; dropping ${batch.length} spans`\n )\n );\n continue;\n }\n const body = buildExportTraceServiceRequest(batch, this.serviceName, this.serviceVersion);\n const url = `${this.baseUrl}traces`;\n if (this.debug) {\n console.log(`${this.prefix} sending traces batch`, {\n spans: batch.length,\n endpoint: url\n });\n }\n const p = postJson(url, body, this.requestHeaders(), opts);\n this.inFlight.add(p);\n try {\n try {\n await p;\n if (this.debug) console.log(`${this.prefix} sent ${batch.length} spans`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n rateLimitedLog(\n `${this.prefix}.send_spans_failed`,\n () => console.warn(`${this.prefix} failed to send ${batch.length} spans: ${msg}`)\n );\n }\n } finally {\n this.inFlight.delete(p);\n }\n }\n }\n /** See EventShipper.requestOpts — same shutdown-budget semantics. */\n requestOpts() {\n if (this.shutdownDeadlineAt !== void 0) {\n const remainingMs = this.shutdownDeadlineAt - Date.now();\n if (remainingMs <= 0) return null;\n return {\n maxAttempts: 1,\n debug: this.debug,\n sdkName: this.sdkName,\n timeoutMs: Math.min(DEFAULT_REQUEST_TIMEOUT_MS, remainingMs)\n };\n }\n if (this.hasShutdown) {\n return {\n maxAttempts: 1,\n debug: this.debug,\n sdkName: this.sdkName,\n timeoutMs: POST_SHUTDOWN_TIMEOUT_MS\n };\n }\n return { maxAttempts: 3, debug: this.debug, sdkName: this.sdkName };\n }\n async shutdown() {\n this.hasShutdown = true;\n this.shutdownDeadlineAt = Date.now() + SHUTDOWN_DEADLINE_MS;\n try {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = void 0;\n }\n const drain = async () => {\n await this.flush();\n await Promise.all([...this.inFlight].map((p) => p.catch(() => {\n })));\n };\n const settled = await raceWithTimeout(drain(), SHUTDOWN_DEADLINE_MS);\n if (!settled) {\n rateLimitedLog(\n `${this.prefix}.shutdown_deadline`,\n () => console.warn(`${this.prefix} shutdown flush deadline exceeded; abandoning in-flight spans`)\n );\n }\n } finally {\n this.shutdownDeadlineAt = void 0;\n }\n }\n};\n\n// src/span-context.ts\nvar NOOP_SPAN = {\n traceIdB64: \"\",\n spanIdB64: \"\",\n eventId: \"\",\n log() {\n }\n};\nfunction getAsyncLocalStorageCtor() {\n return globalThis.RAINDROP_ASYNC_LOCAL_STORAGE;\n}\nvar SynchronousContextStorage = class {\n constructor() {\n this._stack = [];\n }\n isEmpty() {\n return this._stack.length === 0;\n }\n getStore() {\n return this._stack[this._stack.length - 1];\n }\n run(store, callback) {\n this._stack.push(store);\n try {\n return callback();\n } finally {\n this._stack.pop();\n }\n }\n};\nvar ContextManager = class {\n};\nvar RaindropContextManager = class extends ContextManager {\n constructor() {\n super();\n this._fallback = null;\n const Ctor = getAsyncLocalStorageCtor();\n if (Ctor) {\n this._storage = new Ctor();\n return;\n }\n this._fallback = new SynchronousContextStorage();\n this._storage = this._fallback;\n }\n maybeAdoptAsyncLocalStorage() {\n if (!this._fallback || !this._fallback.isEmpty()) return;\n const Ctor = getAsyncLocalStorageCtor();\n if (!Ctor) return;\n this._storage = new Ctor();\n this._fallback = null;\n }\n isReady() {\n return true;\n }\n getParentSpanIds() {\n this.maybeAdoptAsyncLocalStorage();\n const span = this._storage.getStore();\n if (!span || span === NOOP_SPAN) return void 0;\n return {\n traceIdB64: span.traceIdB64,\n spanIdB64: span.spanIdB64,\n eventId: span.eventId\n };\n }\n runInContext(span, callback) {\n this.maybeAdoptAsyncLocalStorage();\n return this._storage.run(span, callback);\n }\n getCurrentSpan() {\n this.maybeAdoptAsyncLocalStorage();\n return this._storage.getStore();\n }\n};\nvar _contextManager = null;\nfunction getContextManager() {\n if (!_contextManager) {\n _contextManager = globalThis.RAINDROP_CONTEXT_MANAGER ? new globalThis.RAINDROP_CONTEXT_MANAGER() : new RaindropContextManager();\n }\n return _contextManager;\n}\nfunction resetContextManager() {\n _contextManager = null;\n}\nfunction currentSpan() {\n var _a;\n return (_a = getContextManager().getCurrentSpan()) != null ? _a : NOOP_SPAN;\n}\nfunction withCurrent(span, callback) {\n return getContextManager().runInContext(span, callback);\n}\nasync function getCurrentParentSpanContext() {\n return getContextManager().getParentSpanIds();\n}\nasync function runWithParentSpanContext(ctx, fn) {\n const cm = getContextManager();\n const span = {\n traceIdB64: ctx.traceIdB64,\n spanIdB64: ctx.spanIdB64,\n eventId: ctx.eventId\n };\n return cm.runInContext(span, fn);\n}\nfunction* generatorWithCurrent(span, gen) {\n let nextValue;\n while (true) {\n const result = withCurrent(span, () => {\n try {\n return gen.next(nextValue);\n } catch (e) {\n return { value: void 0, done: true, error: e };\n }\n });\n if (\"error\" in result && result.error !== void 0) {\n throw result.error;\n }\n if (result.done) {\n return result.value;\n }\n nextValue = yield result.value;\n }\n}\nasync function* asyncGeneratorWithCurrent(span, gen) {\n let nextValue;\n while (true) {\n const result = await withCurrent(span, async () => {\n try {\n return await gen.next(nextValue);\n } catch (e) {\n return { value: void 0, done: true, error: e };\n }\n });\n if (\"error\" in result && result.error !== void 0) {\n throw result.error;\n }\n if (result.done) {\n return result.value;\n }\n nextValue = yield result.value;\n }\n}\nfunction isAsyncGenerator(value) {\n return value !== null && typeof value === \"object\" && Symbol.asyncIterator in value && typeof value.next === \"function\";\n}\nfunction isAsyncGeneratorFunction(fn) {\n return Object.prototype.toString.call(fn) === \"[object AsyncGeneratorFunction]\";\n}\nfunction isGenerator(value) {\n return value !== null && typeof value === \"object\" && Symbol.iterator in value && typeof value.next === \"function\" && typeof value.throw === \"function\";\n}\nfunction isGeneratorFunction(fn) {\n return Object.prototype.toString.call(fn) === \"[object GeneratorFunction]\";\n}\n\nexport { ContextManager, DEFAULT_LOCAL_WORKSHOP_URL, DEFAULT_MAX_TEXT_FIELD_CHARS, DEFAULT_REDACT_ATTRIBUTE_KEYS, DEFAULT_REQUEST_TIMEOUT_MS, DEFAULT_SECRET_KEY_NAMES, EventShipper, LOCAL_DEBUGGER_ENV_VAR, MAX_RETRY_DELAY_MS, NOOP_SPAN, POST_SHUTDOWN_TIMEOUT_MS, PROJECT_ID_HEADER, RATE_LIMITED_LOG_INTERVAL_MS, REDACTED_PLACEHOLDER, SHUTDOWN_DEADLINE_MS, SpanStatusCode, TRUNCATION_MARKER, TraceShipper, WORKSHOP_ENV_VAR, asyncGeneratorWithCurrent, attrBool, attrDouble, attrInt, attrString, attrStringArray, base64Encode, boundedClone, buildExportTraceServiceRequest, buildOtlpSpan, capText, createSpanIds, currentSpan, defaultTransformSpan, formatEndpoint, generateId, generatorWithCurrent, getContextManager, getCurrentParentSpanContext, getDefaultMaxTextFieldChars, isAsyncGenerator, isAsyncGeneratorFunction, isGenerator, isGeneratorFunction, isValidProjectIdSlug, localDebuggerEnabled, mirrorPartialEventToLocalDebugger, mirrorTraceExportToLocalDebugger, normalizeProjectId, nowUnixNanoString, parseRetryAfter, postJson, projectIdHeaders, raceWithTimeout, randomBytes, randomUUID, rateLimitedLog, redactJsonAttributeValue, redactSecretsInObject, redactUrlForLog, resetContextManager, resetDefaultMaxTextFieldChars, resetRateLimitedLogState, resolveLocalDebuggerBaseUrl, resolveMaxTextFieldChars, runWithParentSpanContext, sendLocalDebuggerLiveEvent, sendLocalDebuggerReasoningDelta, sendLocalDebuggerTextDelta, sendLocalDebuggerToolResult, sendLocalDebuggerToolStart, setDefaultMaxTextFieldChars, stringifyBounded, truncateToLimit, unixMsToNanoString, withCurrent, withRetry };\n","export { ContextManager, DEFAULT_LOCAL_WORKSHOP_URL, DEFAULT_MAX_TEXT_FIELD_CHARS, DEFAULT_REDACT_ATTRIBUTE_KEYS, DEFAULT_REQUEST_TIMEOUT_MS, DEFAULT_SECRET_KEY_NAMES, EventShipper, LOCAL_DEBUGGER_ENV_VAR, MAX_RETRY_DELAY_MS, NOOP_SPAN, POST_SHUTDOWN_TIMEOUT_MS, PROJECT_ID_HEADER, RATE_LIMITED_LOG_INTERVAL_MS, REDACTED_PLACEHOLDER, SHUTDOWN_DEADLINE_MS, SpanStatusCode, TRUNCATION_MARKER, TraceShipper, WORKSHOP_ENV_VAR, asyncGeneratorWithCurrent, attrBool, attrDouble, attrInt, attrString, attrStringArray, base64Encode, boundedClone, buildExportTraceServiceRequest, buildOtlpSpan, capText, createSpanIds, currentSpan, defaultTransformSpan, formatEndpoint, generateId, generatorWithCurrent, getContextManager, getCurrentParentSpanContext, getDefaultMaxTextFieldChars, isAsyncGenerator, isAsyncGeneratorFunction, isGenerator, isGeneratorFunction, isValidProjectIdSlug, localDebuggerEnabled, mirrorPartialEventToLocalDebugger, mirrorTraceExportToLocalDebugger, normalizeProjectId, nowUnixNanoString, parseRetryAfter, postJson, projectIdHeaders, raceWithTimeout, randomBytes, randomUUID, rateLimitedLog, redactJsonAttributeValue, redactSecretsInObject, redactUrlForLog, resetContextManager, resetDefaultMaxTextFieldChars, resetRateLimitedLogState, resolveLocalDebuggerBaseUrl, resolveMaxTextFieldChars, runWithParentSpanContext, sendLocalDebuggerLiveEvent, sendLocalDebuggerReasoningDelta, sendLocalDebuggerTextDelta, sendLocalDebuggerToolResult, sendLocalDebuggerToolStart, setDefaultMaxTextFieldChars, stringifyBounded, truncateToLimit, unixMsToNanoString, withCurrent, withRetry } from './chunk-SK6EJEO7.js';\nimport { AsyncLocalStorage } from 'async_hooks';\n\nglobalThis.RAINDROP_ASYNC_LOCAL_STORAGE = AsyncLocalStorage;\n","/**\n * Payload size bounds for exported span attributes.\n *\n * The AI SDK records full prompts/completions (`ai.prompt.messages`,\n * `ai.response.text`, ...) as span attributes when `recordInputs` /\n * `recordOutputs` are on (Eve's default), so a single attribute can be\n * multi-MB. Capping string values BEFORE the OTLP batch is serialized keeps\n * the `JSON.stringify` cost in the exporter proportional to the cap and\n * ships oversized spans truncated instead of having them dropped at the\n * ingest size limit.\n */\n\n/** Default per-attribute character cap. Override via `maxTextFieldChars`. */\nexport const DEFAULT_MAX_TEXT_FIELD_CHARS = 1_000_000;\n\n/** Marker appended to truncated values. The result, marker included, never exceeds the limit. */\nexport const TRUNCATION_MARKER = \"...[truncated by raindrop]\";\n\n/**\n * Effective per-attribute character budget: the configured cap, further\n * reduced by `OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT` when that standard\n * OTel knob is set AND stricter (mirrors the Python SDK's behavior).\n */\nexport function effectiveAttributeLimit(configured: number | undefined): number {\n let limit =\n typeof configured === \"number\" && Number.isFinite(configured) && configured > 0\n ? Math.floor(configured)\n : DEFAULT_MAX_TEXT_FIELD_CHARS;\n try {\n const raw = (globalThis as { process?: { env?: Record<string, string | undefined> } })?.process\n ?.env?.OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT;\n if (raw) {\n const envLimit = Number.parseInt(raw, 10);\n if (Number.isFinite(envLimit) && envLimit > 0) {\n limit = Math.min(limit, envLimit);\n }\n }\n } catch {\n // No env bag (browser/edge) — keep the configured limit.\n }\n return limit;\n}\n\n/**\n * Truncate `value` so the RESULT (marker included) never exceeds `limit`.\n * O(1) length check; the slice keeps at most `limit` characters.\n */\nexport function truncateText(value: string, limit: number): string {\n if (value.length <= limit) return value;\n if (limit > TRUNCATION_MARKER.length) {\n return value.slice(0, limit - TRUNCATION_MARKER.length) + TRUNCATION_MARKER;\n }\n return value.slice(0, Math.max(0, limit));\n}\n","/**\n * RaindropEveSpanExporter — a tiny OTel SpanExporter that:\n *\n * 1. Ships OTLP/HTTP JSON traces to Raindrop (`<endpoint>/traces`) using a\n * Bearer write key, and\n * 2. Mirrors the same export to a local Workshop daemon when one is\n * reachable (explicit URL, env vars, or auto-detect during development).\n *\n * It deliberately does NOT depend on the OpenTelemetry SDK at runtime beyond\n * the structural `ReadableSpan` / `SpanExporter` shapes — those are typed via\n * peer dependencies so consumers don't pay a second copy of `@opentelemetry/*`.\n */\nimport {\n type OtlpKeyValue,\n type OtlpSpan,\n type OtlpSpanStatus,\n SpanStatusCode as RaindropSpanStatusCode,\n buildExportTraceServiceRequest,\n formatEndpoint,\n mirrorTraceExportToLocalDebugger,\n normalizeProjectId,\n postJson,\n projectIdHeaders,\n resolveLocalDebuggerBaseUrl,\n} from \"@raindrop-ai/core\";\n\nimport { effectiveAttributeLimit, truncateText } from \"./limits\";\n\n// Structural types — the real ones come from `@opentelemetry/sdk-trace-base`,\n// but importing them at type level only keeps this exporter dependency-light.\ntype HrTime = [number, number];\n\ntype AttributeValue =\n | string\n | number\n | boolean\n | Array<string | number | boolean | null | undefined>\n | null\n | undefined;\n\ninterface Attributes {\n [key: string]: AttributeValue;\n}\n\ninterface SpanContext {\n traceId: string;\n spanId: string;\n traceFlags?: number;\n}\n\ninterface InstrumentationScope {\n name: string;\n version?: string;\n schemaUrl?: string;\n}\n\ninterface Resource {\n attributes: Attributes;\n}\n\ninterface ReadableSpan {\n readonly name: string;\n readonly kind: number;\n readonly startTime: HrTime;\n readonly endTime: HrTime;\n readonly status: { code: number; message?: string };\n readonly attributes: Attributes;\n readonly resource: Resource;\n readonly instrumentationLibrary?: InstrumentationScope;\n readonly instrumentationScope?: InstrumentationScope;\n spanContext(): SpanContext;\n // In OTel SDK 1.x, parent span id lives on `parentSpanId`; in 2.x it moved\n // onto `parentSpanContext.spanId`. Support both.\n readonly parentSpanId?: string;\n readonly parentSpanContext?: SpanContext;\n}\n\nexport interface ExportResult {\n code: number; // 0 = SUCCESS, 1 = FAILED\n error?: Error;\n}\n\nexport interface RaindropEveExporterOptions {\n /**\n * Raindrop write key. Required to ship to Raindrop's hosted endpoint; when\n * omitted, the exporter still mirrors to Workshop (when one is reachable).\n */\n writeKey?: string;\n /**\n * Raindrop API endpoint. Defaults to `https://api.raindrop.ai/v1/`.\n * Trailing slash optional; `/traces` is always appended.\n */\n endpoint?: string;\n /**\n * Workshop / local debugger URL. Pass `false` to opt out entirely. Pass a\n * URL string to force-enable. Leave undefined to use env vars +\n * auto-detect (`RAINDROP_WORKSHOP`, `RAINDROP_LOCAL_DEBUGGER`, localhost in\n * development).\n */\n localWorkshopUrl?: string | false;\n /** Logical service name used as the OTel `service.name` resource attribute. */\n serviceName?: string;\n /** Service version (defaults to the eve SDK version). */\n serviceVersion?: string;\n /** SDK identifier used in log prefixes and User-Agent. */\n sdkName?: string;\n /**\n * Optional Raindrop project slug. When set, every cloud trace export carries\n * an `X-Raindrop-Project-Id` header. Empty / whitespace-only values are\n * ignored. Unset → no header (byte-identical to prior behavior).\n */\n projectId?: string;\n /** Print extra logs while exporting / mirroring. */\n debug?: boolean;\n /**\n * Per-attribute character cap for exported string attribute values\n * (truncated values end with `...[truncated by raindrop]`). Enforced\n * before the OTLP batch is serialized so multi-MB prompt/completion\n * attributes cost the cap — not the payload — and land truncated instead\n * of being dropped at the ingest size limit. A stricter\n * `OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT` env var is honored.\n * Defaults to 1,000,000.\n */\n maxTextFieldChars?: number;\n}\n\n/** Convert an OTel hex id (32 or 16 chars) into base64. */\nfunction hexToBase64(hex: string | undefined): string | undefined {\n if (!hex) return undefined;\n if (hex.length === 0 || /^0+$/.test(hex)) return undefined;\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(hex.substr(i * 2, 2), 16);\n }\n if (typeof Buffer !== \"undefined\") return Buffer.from(bytes).toString(\"base64\");\n let bin = \"\";\n for (let i = 0; i < bytes.length; i++) bin += String.fromCharCode(bytes[i]);\n return globalThis.btoa(bin);\n}\n\nfunction hrTimeToNanoString(hr: HrTime): string {\n const [s, ns] = hr;\n // BigInt avoids precision loss past 2^53 nanoseconds (~104 days since epoch).\n return (BigInt(Math.trunc(s)) * 1_000_000_000n + BigInt(Math.trunc(ns))).toString();\n}\n\nfunction attributeToKeyValue(\n key: string,\n value: AttributeValue,\n maxChars: number,\n): OtlpKeyValue | undefined {\n if (value === undefined || value === null) return undefined;\n // String values carry prompts/completions and can be multi-MB; cap them\n // (per string, matching OTel's attribute value length limit semantics)\n // before the batch hits JSON.stringify.\n if (typeof value === \"string\") return { key, value: { stringValue: truncateText(value, maxChars) } };\n if (typeof value === \"boolean\") return { key, value: { boolValue: value } };\n if (typeof value === \"number\") {\n return Number.isInteger(value)\n ? { key, value: { intValue: String(value) } }\n : { key, value: { doubleValue: value } };\n }\n if (Array.isArray(value)) {\n return {\n key,\n value: {\n arrayValue: {\n values: value\n .map((v) => {\n if (v === null || v === undefined) return undefined;\n if (typeof v === \"string\") return { stringValue: truncateText(v, maxChars) };\n if (typeof v === \"boolean\") return { boolValue: v };\n if (typeof v === \"number\") {\n return Number.isInteger(v)\n ? { intValue: String(v) }\n : { doubleValue: v };\n }\n return undefined;\n })\n .filter((v): v is NonNullable<typeof v> => v !== undefined),\n },\n },\n };\n }\n return undefined;\n}\n\nfunction attributesToKeyValues(attrs: Attributes | undefined, maxChars: number): OtlpKeyValue[] {\n if (!attrs) return [];\n const out: OtlpKeyValue[] = [];\n for (const [k, v] of Object.entries(attrs)) {\n const kv = attributeToKeyValue(k, v, maxChars);\n if (kv) out.push(kv);\n }\n return out;\n}\n\n/** Translate OTel SDK status codes (UNSET=0, OK=1, ERROR=2) to OTLP wire codes. */\nfunction statusFromReadable(span: ReadableSpan): OtlpSpanStatus | undefined {\n const code = span.status?.code;\n if (code === undefined) return undefined;\n if (code === 2) {\n return { code: RaindropSpanStatusCode.ERROR, message: span.status.message };\n }\n if (code === 1) {\n return { code: RaindropSpanStatusCode.OK };\n }\n return { code: RaindropSpanStatusCode.UNSET };\n}\n\nfunction readableSpanToOtlp(span: ReadableSpan, maxChars: number): OtlpSpan {\n const ctx = span.spanContext();\n const parentSpanIdHex = span.parentSpanContext?.spanId ?? span.parentSpanId;\n const traceId = hexToBase64(ctx.traceId);\n const spanId = hexToBase64(ctx.spanId);\n // A recording OTel span always has a valid context. If we see an all-zero\n // or empty trace/span id here it means upstream gave us a non-recording\n // (invalid) span; ship that as malformed OTLP would silently fail\n // ingestion, so refuse — the caller skips the span and continues.\n if (!traceId || !spanId) {\n throw new Error(\n `span has invalid context: traceId=${ctx.traceId} spanId=${ctx.spanId}`,\n );\n }\n const parentSpanId = hexToBase64(parentSpanIdHex);\n const attrs = attributesToKeyValues(span.attributes, maxChars);\n const otlp: OtlpSpan = {\n traceId,\n spanId,\n name: span.name,\n startTimeUnixNano: hrTimeToNanoString(span.startTime),\n endTimeUnixNano: hrTimeToNanoString(span.endTime),\n };\n if (parentSpanId) otlp.parentSpanId = parentSpanId;\n if (attrs.length) otlp.attributes = attrs;\n const status = statusFromReadable(span);\n if (status) otlp.status = status;\n return otlp;\n}\n\n/**\n * SpanExporter implementation that posts spans to Raindrop's OTLP/HTTP JSON\n * endpoint and (optionally) mirrors to a local Workshop daemon.\n */\nexport class RaindropEveSpanExporter {\n private readonly writeKey: string | undefined;\n private readonly baseUrl: string;\n private readonly localDebuggerUrl: string | undefined;\n // `serviceName` becomes the OTLP `service.name` resource attribute on every\n // batch we ship. Eve's `setup({ agentName })` calls `setServiceName` once\n // the agent name is resolved, so callers who didn't pass `opts.serviceName`\n // get the agent name on the wire instead of the `\"raindrop.eve\"` default.\n private serviceName: string;\n private readonly serviceVersion: string;\n private readonly sdkName: string;\n private readonly projectId: string | undefined;\n private readonly debug: boolean;\n private readonly prefix: string;\n private readonly maxTextFieldChars: number | undefined;\n private inFlight = new Set<Promise<void>>();\n private shuttingDown = false;\n private auxShutdowns: Array<() => Promise<void>> = [];\n\n constructor(opts: RaindropEveExporterOptions = {}) {\n this.writeKey = opts.writeKey?.trim();\n this.baseUrl = formatEndpoint(opts.endpoint) ?? \"https://api.raindrop.ai/v1/\";\n this.sdkName = opts.sdkName ?? \"eve\";\n this.maxTextFieldChars = opts.maxTextFieldChars;\n this.serviceName = opts.serviceName ?? \"raindrop.eve\";\n this.serviceVersion = opts.serviceVersion ?? \"0.0.0\";\n this.debug = opts.debug === true;\n this.prefix = `[raindrop-ai/${this.sdkName}]`;\n this.projectId = normalizeProjectId(opts.projectId, {\n debug: this.debug,\n prefix: this.prefix,\n });\n const explicit = opts.localWorkshopUrl === false ? null : opts.localWorkshopUrl;\n this.localDebuggerUrl = resolveLocalDebuggerBaseUrl(explicit) ?? undefined;\n if (this.debug) {\n console.log(\n `${this.prefix} Initialized`,\n {\n raindrop: this.writeKey ? this.baseUrl : \"disabled (no writeKey)\",\n workshop: this.localDebuggerUrl ?? \"disabled\",\n },\n );\n }\n }\n\n /** True when we have at least one destination (Raindrop or Workshop). */\n hasDestinations(): boolean {\n return Boolean(this.writeKey || this.localDebuggerUrl);\n }\n\n /**\n * Update the OTLP `service.name` attribute. Called by Eve's\n * `setup({ agentName })` so the resource attribute reflects the actual\n * agent name when the caller didn't pin one via `opts.serviceName`.\n */\n setServiceName(serviceName: string): void {\n if (!serviceName || serviceName === this.serviceName) return;\n this.serviceName = serviceName;\n if (this.debug) {\n console.log(`${this.prefix} serviceName updated → ${serviceName}`);\n }\n }\n\n export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void {\n if (this.shuttingDown) {\n resultCallback({ code: 1, error: new Error(\"exporter shut down\") });\n return;\n }\n if (spans.length === 0) {\n resultCallback({ code: 0 });\n return;\n }\n\n // Resolved per batch so a stricter OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT\n // set after construction is still honored.\n const maxChars = effectiveAttributeLimit(this.maxTextFieldChars);\n const otlpSpans: OtlpSpan[] = [];\n for (const span of spans) {\n try {\n otlpSpans.push(readableSpanToOtlp(span, maxChars));\n } catch (err) {\n if (this.debug) {\n console.warn(`${this.prefix} failed to convert span`, err);\n }\n }\n }\n if (otlpSpans.length === 0) {\n resultCallback({ code: 0 });\n return;\n }\n\n const body = buildExportTraceServiceRequest(otlpSpans, this.serviceName, this.serviceVersion);\n\n if (this.localDebuggerUrl) {\n mirrorTraceExportToLocalDebugger(body, {\n baseUrl: this.localDebuggerUrl,\n debug: this.debug,\n sdkName: this.sdkName,\n });\n }\n\n if (!this.writeKey) {\n if (this.debug) {\n console.log(`${this.prefix} exported ${otlpSpans.length} spans (workshop-only)`);\n }\n resultCallback({ code: 0 });\n return;\n }\n\n const url = `${this.baseUrl}traces`;\n if (this.debug) {\n console.log(`${this.prefix} sending ${otlpSpans.length} spans -> ${url}`);\n }\n const p = postJson(\n url,\n body,\n {\n Authorization: `Bearer ${this.writeKey}`,\n ...projectIdHeaders(this.projectId),\n },\n { maxAttempts: 3, debug: this.debug, sdkName: this.sdkName },\n )\n .then(() => {\n if (this.debug) console.log(`${this.prefix} sent ${otlpSpans.length} spans`);\n resultCallback({ code: 0 });\n })\n .catch((err: unknown) => {\n const msg = err instanceof Error ? err.message : String(err);\n console.warn(`${this.prefix} failed to send ${otlpSpans.length} spans: ${msg}`);\n resultCallback({ code: 1, error: err instanceof Error ? err : new Error(msg) });\n })\n .finally(() => {\n this.inFlight.delete(p);\n });\n this.inFlight.add(p);\n }\n\n async forceFlush(): Promise<void> {\n await Promise.all([...this.inFlight].map((p) => p.catch(() => {})));\n }\n\n async shutdown(): Promise<void> {\n this.shuttingDown = true;\n await this.forceFlush();\n await Promise.all(\n this.auxShutdowns.map((fn) => fn().catch(() => {})),\n );\n }\n\n /**\n * Register an extra teardown hook to run during {@link shutdown}. Used to\n * drain the AI SDK trace + event shippers that the `@raindrop-ai/eve`\n * integration builds alongside this exporter — without this, pending\n * `track_partial` events and AI SDK trace spans would be dropped on\n * SIGINT / SIGTERM.\n */\n attachAuxShutdown(fn: () => Promise<void>): void {\n this.auxShutdowns.push(fn);\n }\n}\n","{\n \"name\": \"@raindrop-ai/eve\",\n \"version\": \"0.0.10\",\n \"description\": \"Raindrop integration for Vercel's Eve agent framework (OTel traces to Raindrop + Workshop)\",\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/raindrop-ai/raindrop-js.git\",\n \"directory\": \"packages/eve\"\n },\n \"homepage\": \"https://github.com/raindrop-ai/raindrop-js/tree/main/packages/eve#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/raindrop-ai/raindrop-js/issues\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\"\n }\n },\n \"sideEffects\": false,\n \"files\": [\n \"dist/**\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"clean\": \"rm -rf .turbo && rm -rf dist\",\n \"test\": \"vitest run\"\n },\n \"dependencies\": {\n \"@raindrop-ai/ai-sdk\": \"workspace:*\"\n },\n \"peerDependencies\": {\n \"@opentelemetry/api\": \">=1.9.0\",\n \"@opentelemetry/sdk-trace-base\": \">=1.30.0 || >=2.0.0\",\n \"@vercel/otel\": \">=1.10.0\",\n \"ai\": \">=7.0.0-canary.0 <8\",\n \"eve\": \">=0.11.0\"\n },\n \"peerDependenciesMeta\": {\n \"ai\": {\n \"optional\": true\n },\n \"eve\": {\n \"optional\": true\n }\n },\n \"devDependencies\": {\n \"@opentelemetry/api\": \"^1.9.0\",\n \"@opentelemetry/sdk-trace-base\": \"^2.0.0\",\n \"@raindrop-ai/core\": \"workspace:*\",\n \"@types/node\": \"^20.11.17\",\n \"@vercel/otel\": \"^2.1.2\",\n \"tsup\": \"^8.4.0\",\n \"typescript\": \"^5.3.3\",\n \"vitest\": \"^2.1.9\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"provenance\": false\n }\n}\n","import pkg from \"../../package.json\";\n\nexport const libraryName = pkg.name;\nexport const libraryVersion = pkg.version;\n","/**\n * `@raindrop-ai/eve` — Raindrop integration for Vercel's Eve agent framework.\n *\n * Drop this into `agent/instrumentation.ts`:\n *\n * ```ts\n * import { registerOTel } from \"@vercel/otel\";\n * import { defineRaindropInstrumentation } from \"@raindrop-ai/eve\";\n *\n * export default defineRaindropInstrumentation({\n * registerOTel,\n * writeKey: process.env.RAINDROP_WRITE_KEY,\n * });\n * ```\n *\n * The integration:\n * - Configures `@vercel/otel`'s `registerOTel` with a Raindrop-flavored\n * OTLP/HTTP JSON exporter that posts Eve's workflow / step / fetch spans\n * to `https://api.raindrop.ai/v1/traces` (overridable via `endpoint`).\n * - Registers a Raindrop `TelemetryIntegration` with the AI SDK v7+ runtime\n * so every model call and tool call is shipped as a fully-typed Raindrop\n * LLM / tool span (with prompts, completions, tokens, etc.) AND as a\n * `events/track_partial` event — which is what populates the Overview\n * panel in Workshop and the run summary in production Raindrop.\n * - Mirrors both feeds to a local Workshop daemon when one is reachable\n * (`http://localhost:5899` by default), so the same agent run shows up in\n * `raindrop workshop` AND production Raindrop without changing code.\n * - Forwards Eve's AI-SDK telemetry knobs (`recordInputs`, `recordOutputs`,\n * `events`, `functionId`) onto the resulting instrumentation definition.\n *\n * Advanced: if you'd rather wire @vercel/otel yourself, import\n * {@link RaindropEveSpanExporter} and pass it to your own\n * `registerOTel({ traceExporter })` call.\n */\nimport { trace } from \"@opentelemetry/api\";\nimport {\n type RaindropAISDKClient,\n createRaindropAISDK,\n getCurrentParentToolContext,\n} from \"@raindrop-ai/ai-sdk\";\n\nimport {\n type EveSessionParent,\n getEveSessionLineage,\n parseEveSessionParent,\n} from \"./internal/eve-session\";\nimport { installEveTurnSpanProcessor, lookupEveTurn } from \"./internal/eve-turn-registry\";\nimport { type RaindropEveExporterOptions, RaindropEveSpanExporter } from \"./internal/exporter\";\nimport { libraryName, libraryVersion } from \"./internal/version\";\n\nexport { RaindropEveSpanExporter, type RaindropEveExporterOptions } from \"./internal/exporter\";\n\nexport const RAINDROP_EVE_SDK_NAME = libraryName;\nexport const RAINDROP_EVE_SDK_VERSION = libraryVersion;\n\n/**\n * Per-session cache of Eve's runtime-context `eve.turn.id` (`turn_<sequence>`).\n *\n * Eve runs MULTIPLE model passes per user turn (tool/dispatch → synthesis) and\n * can drop the runtime context on the resumed synthesis pass. We cache the\n * per-turn `eve.turn.id` from the passes that DO carry it and reuse it on any\n * pass that doesn't, so the whole turn keeps one `raindrop.eventId` (no\n * duplicate-message events). Last write wins: each new turn (`turn_N`)\n * overwrites the previous.\n */\nconst canonicalTurnIdBySession = new Map<string, string>();\n\n/**\n * Ceiling on {@link canonicalTurnIdBySession}. The cache only needs the CURRENT\n * turn per active session, so a generous cap with oldest-first eviction keeps a\n * long-lived process (one entry per distinct session id) from growing without\n * bound. An evicted session simply falls back to the other turn-id sources.\n */\nconst MAX_CANONICAL_TURN_SESSIONS = 1024;\n\n/**\n * Test-only: clear the per-session canonical turn-id cache between cases so a\n * session id reused across tests doesn't inherit a previous test's turn id.\n */\nexport function _resetCanonicalTurnIds(): void {\n canonicalTurnIdBySession.clear();\n}\n\n/**\n * Signature of `registerOTel` from `@vercel/otel`. Re-exported via the\n * package's own type so consumers don't have to import the type themselves\n * and we don't take a runtime dependency on the package.\n */\nexport type RegisterOTelFn = typeof import(\"@vercel/otel\").registerOTel;\n\n/**\n * A single bag of author-supplied metadata, mirroring Eve 0.45's\n * `InstrumentationMetadata` (`Readonly<Record<string, string>>`). Keys\n * beginning with `eve.` are reserved by Eve and dropped if returned.\n */\nexport type RaindropEveInstrumentationMetadata = Readonly<Record<string, string>>;\n\n/**\n * The channel projection Eve exposes to instrumentation callbacks. `kind` is\n * the channel identity Eve has for the current turn (`\"http\"`, `\"schedule\"`,\n * `\"subagent\"`, `\"unknown\"`, or `channel:<name>` for authored channels);\n * `metadata` is the channel's metadata snapshot (e.g. Slack `channelId` /\n * `teamId` / `threadTs` / `triggeringUserId`).\n *\n * Typed structurally so `@raindrop-ai/eve` doesn't take a hard dependency on\n * `eve`'s types (it's an optional peer). Cast `metadata` values\n * to the concrete channel shape inside your callback when you need narrowing.\n */\nexport interface RaindropEveInstrumentationChannel {\n readonly kind: string;\n readonly metadata: Readonly<Record<string, unknown>>;\n}\n\nexport interface RaindropEveInstrumentationSession {\n readonly auth: {\n readonly current: unknown;\n readonly initiator: unknown;\n };\n readonly id: string;\n readonly parent?: unknown;\n}\n\nexport interface RaindropEveInstrumentationTurn {\n readonly id: string;\n readonly sequence: number;\n}\n\nexport interface RaindropEveInstrumentationStep {\n readonly index: number;\n}\n\nexport interface RaindropEveInstrumentationModelInput {\n readonly instructions: string | readonly unknown[] | undefined;\n readonly messages: readonly unknown[];\n}\n\n/**\n * Input passed to the `step.started` hook. Identical across Eve 0.45's\n * `metadata[\"step.started\"]` and Eve 0.53's `events[\"step.started\"]`:\n * `session.id` is the current session id and `turn` is top-level. The callback\n * runs after Eve has built the final model input for a model-call attempt and\n * before the AI SDK model call is constructed, so the returned values are\n * inherited by every child span the AI SDK creates for that step.\n */\nexport interface RaindropEveStepStartedMetadataInput {\n readonly channel: RaindropEveInstrumentationChannel;\n readonly modelInput: RaindropEveInstrumentationModelInput;\n readonly session: RaindropEveInstrumentationSession;\n readonly step: RaindropEveInstrumentationStep;\n readonly turn: RaindropEveInstrumentationTurn;\n}\n\n/**\n * Alias for the `events[\"step.started\"]` input on Eve 0.53+. The shape is the\n * same as {@link RaindropEveStepStartedMetadataInput}; only the config key\n * (`events` vs `metadata`) and the result wrapper (`{ runtimeContext }` vs a\n * flat record) changed between 0.45 and 0.53.\n */\nexport type RaindropEveStepStartedEventInput = RaindropEveStepStartedMetadataInput;\n\n/**\n * Eve 0.45–0.52's `InstrumentationMetadataConfig` — the callback-driven\n * metadata hooks accepted by `defineInstrumentation`'s `metadata` field.\n * Forwarded to Eve so the returned values land on AI SDK telemetry spans for\n * the matching step. Superseded on Eve 0.53+ by\n * {@link RaindropEveInstrumentationEventsConfig}; we emit both so a single\n * definition works across the supported range.\n */\nexport interface RaindropEveInstrumentationMetadataConfig {\n /**\n * Per-attempt metadata resolved before the model call so child spans\n * created by the AI SDK inherit the returned values.\n */\n readonly \"step.started\"?: (\n input: RaindropEveStepStartedMetadataInput\n ) => RaindropEveInstrumentationMetadata;\n}\n\n/**\n * Result returned by the Eve 0.53+ `events[\"step.started\"]` hook. The authored\n * runtime context is merged into the AI SDK telemetry spans for the step. Keys\n * beginning with `eve.` are reserved by Eve and dropped, so author `raindrop.*`\n * keys only.\n */\nexport interface RaindropEveStepStartedEventResult {\n readonly runtimeContext: RaindropEveInstrumentationMetadata;\n}\n\n/**\n * Eve 0.53+'s `InstrumentationEvents` — the callback-driven event hooks\n * accepted by `defineInstrumentation`'s `events` field. The forward-looking\n * shape consumers should prefer on Eve 0.53+. The callback returns\n * `{ runtimeContext }` rather than the flat record the 0.45 `metadata` hook\n * used.\n */\nexport interface RaindropEveInstrumentationEventsConfig {\n /**\n * Per-attempt runtime context resolved before the model call so child spans\n * created by the AI SDK inherit the returned values.\n */\n readonly \"step.started\"?: (\n input: RaindropEveStepStartedEventInput\n ) => RaindropEveStepStartedEventResult | undefined;\n}\n\n/**\n * Options for {@link defineRaindropInstrumentation}.\n */\nexport interface RaindropEveInstrumentationOptions {\n /**\n * `registerOTel` from `@vercel/otel`. Pass the function directly so the\n * SDK doesn't have to dynamically import a peer dep at runtime.\n *\n * Optional only because tests and advanced wiring may pre-register OTel\n * elsewhere; in a normal Eve project you should always pass this.\n */\n registerOTel?: RegisterOTelFn;\n /**\n * Raindrop write key. Required to ship traces to Raindrop's hosted endpoint.\n * When omitted, the integration still mirrors to Workshop if one is\n * reachable — useful for local development without a hosted account.\n *\n * Falls back to `process.env.RAINDROP_WRITE_KEY` when undefined.\n */\n writeKey?: string;\n /**\n * Raindrop API endpoint. Defaults to `https://api.raindrop.ai/v1/`.\n * Falls back to `process.env.RAINDROP_ENDPOINT` when undefined.\n */\n endpoint?: string;\n /**\n * Optional Raindrop project slug. When set, every outbound cloud request\n * (trace exports and the AI SDK event/trace shippers) carries an\n * `X-Raindrop-Project-Id` header. Unset → no header (the project resolves to\n * `default` server-side; byte-identical to prior behavior). Falls back to\n * `process.env.RAINDROP_PROJECT_ID` when undefined.\n */\n projectId?: string;\n /**\n * Workshop / local debugger URL.\n *\n * - `string` — force-enable mirroring to that URL.\n * - `false` — opt out of mirroring entirely (no env vars, no auto-detect).\n * - `undefined` — use the standard precedence: `RAINDROP_WORKSHOP` /\n * `RAINDROP_LOCAL_DEBUGGER` env vars, then auto-detect during local\n * development (localhost hostname or `NODE_ENV=development`).\n */\n localWorkshopUrl?: string | false;\n /**\n * OTel `service.name`. Defaults to the agent name resolved by Eve at compile\n * time, so you rarely need to set this.\n */\n serviceName?: string;\n /**\n * Override the OTel `service.version` resource attribute.\n */\n serviceVersion?: string;\n /**\n * Forwarded to Eve: override the function identifier attached to AI SDK\n * spans. Defaults to the agent name.\n */\n functionId?: string;\n /**\n * Eve 0.45 `InstrumentationMetadataConfig` — callback-driven metadata\n * forwarded *verbatim* to Eve so the values it returns land on the AI SDK\n * telemetry spans for the matching step. Use this for per-turn/per-step\n * dynamic metadata sourced from the live request (e.g. Slack\n * `channelId` / `teamId` / `threadTs` / `triggeringUserId` off\n * `input.channel.metadata`):\n *\n * ```ts\n * defineRaindropInstrumentation({\n * staticMetadata: { app: \"demo-data-agent\", team: \"data\" },\n * metadata: {\n * \"step.started\"(input) {\n * return {\n * \"slack.channel_id\": String(input.channel.metadata.channelId ?? \"\"),\n * \"raindrop.userId\": String(input.channel.metadata.triggeringUserId ?? \"\"),\n * };\n * },\n * },\n * });\n * ```\n *\n * The `step.started` callback is handed to Eve as instrumentation metadata\n * and is **never** iterated as static authored metadata by this helper.\n *\n * For backwards compatibility a flat `Record<string, string>` is still\n * accepted and treated exactly like {@link staticMetadata}; prefer\n * `staticMetadata` for static values and reserve `metadata` for the Eve\n * callback config.\n */\n metadata?: RaindropEveInstrumentationMetadataConfig | Record<string, string>;\n /**\n * Eve 0.53+ `events` config. The forward-looking equivalent of\n * {@link metadata}'s `step.started` callback: the hook returns\n * `{ runtimeContext }` instead of a flat record. Prefer this on Eve 0.53+.\n *\n * When both {@link events} and {@link metadata} supply a `step.started`\n * hook, `events` wins. Whichever is provided is forwarded on BOTH the\n * definition's `events` (read by Eve 0.53+) and `metadata` (read by Eve\n * 0.45–0.52) fields, so a single config works across the supported range.\n */\n events?: RaindropEveInstrumentationEventsConfig;\n /**\n * Static Raindrop metadata merged onto every shipped Raindrop event /\n * telemetry span. Unlike {@link metadata}'s `step.started` callback, these\n * values are authored once and applied by the Raindrop helper itself\n * (routed through `raindrop.properties` / `raindrop.*` control keys the\n * same way the legacy flat `metadata` option was). Use this for stable\n * attributes like `app` / `team` / `environment`.\n */\n staticMetadata?: Record<string, string>;\n /**\n * Default `userId` attached to every Raindrop event shipped from this\n * agent. The integration won't emit a `track_partial` event unless it has\n * a `userId`, so leave this populated if you want the run to show up in\n * Workshop's Overview tab and in the Raindrop dashboard's event feed.\n *\n * When omitted, the SDK uses Eve's session id (`eve.session.id`) when it\n * can resolve one per call, and falls back to the agent name otherwise.\n */\n userId?: string;\n /**\n * Default `eventName` for shipped events. Defaults to the AI SDK\n * `operationId` (e.g. `\"ai.streamText\"`); usually you'd set this to\n * something user-meaningful like `\"agent.turn\"`.\n */\n eventName?: string;\n /**\n * Forwarded to Eve: whether to record full model inputs in spans. Defaults\n * to Eve's own default (`true` when instrumentation is configured).\n */\n recordInputs?: boolean;\n /**\n * Forwarded to Eve: whether to record full model outputs in spans. Defaults\n * to Eve's own default (`true` when instrumentation is configured).\n */\n recordOutputs?: boolean;\n /**\n * Print extra logs while exporting / mirroring spans. Also enabled by\n * `RAINDROP_AI_DEBUG=1` in the environment.\n */\n debug?: boolean;\n /**\n * Per-attribute character cap for exported string span attributes\n * (truncated values end with `...[truncated by raindrop]`). Multi-MB\n * prompt/completion attributes are capped before OTLP serialization so\n * they cost the cap — not the payload — and land truncated instead of\n * being dropped at the ingest size limit. A stricter\n * `OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT` env var is honored.\n * Defaults to 1,000,000.\n */\n maxTextFieldChars?: number;\n}\n\n/**\n * The shape returned by {@link defineRaindropInstrumentation}. It matches Eve's\n * `InstrumentationDefinition` so it can be the default export of\n * `agent/instrumentation.ts`.\n */\nexport interface RaindropInstrumentationDefinition {\n readonly functionId?: string;\n /**\n * Eve 0.45–0.52 reads the `step.started` hook from here. Always populated\n * (the default hook pushes cross-sandbox sub-agent lineage) when running on\n * those versions.\n */\n readonly metadata?: RaindropEveInstrumentationMetadataConfig;\n /**\n * Eve 0.53+ reads the `step.started` hook from here instead of `metadata`.\n * Always populated; carries the same lineage + static + author metadata as\n * `metadata`, just wrapped in `{ runtimeContext }`.\n */\n readonly events?: RaindropEveInstrumentationEventsConfig;\n readonly recordInputs?: boolean;\n readonly recordOutputs?: boolean;\n readonly setup: (context: { agentName: string }) => void;\n /** The underlying exporter — exported for tests and advanced wiring. */\n readonly exporter: RaindropEveSpanExporter;\n /**\n * The Raindrop AI SDK client backing this instrumentation. Use it from\n * application / tool code to:\n * - `raindrop.users.identify(...)` to attach traits to the active user\n * - `raindrop.signals.track(...)` to record feedback / programmatic signals\n * - `raindrop.events.patch(...)` / `.finish(...)` / `.addAttachments(...)`\n * for fine-grained event updates\n * - `raindrop.traces.startSpan(...)` / `.createSpan(...)` for custom spans\n * - `raindrop.flush()` / `raindrop.shutdown()` for explicit lifecycle control\n *\n * `raindrop.shutdown()` is already wired into the OTel exporter's shutdown\n * lifecycle, so most callers don't need to invoke it themselves.\n */\n readonly raindrop: RaindropAISDKClient;\n}\n\nconst RAINDROP_EVE_INTEGRATION = Symbol.for(\"raindrop.eve.integration\");\nconst RAINDROP_EVE_OTEL_REGISTERED = Symbol.for(\"raindrop.eve.otel.registered\");\n\ntype TaggedIntegration = object & { [RAINDROP_EVE_INTEGRATION]?: true };\n\n/**\n * Push a Telemetry integration onto AI SDK v7+'s global registry.\n *\n * We bypass `import { registerTelemetry } from \"ai\"` to keep `ai` as a soft,\n * version-agnostic dependency: the registry lives on `globalThis` so any\n * `ai` module instance loaded later (including the one bundled inside\n * `eve`) will see what we register here.\n */\n/**\n * Wrap a TelemetryIntegration with debug-logging proxies on every callback\n * method, so we can verify the AI SDK is actually invoking the integration\n * (and inspect the event shapes). Used only when `debug` is on.\n */\nfunction wrapWithDebugLogs<T extends object>(integration: T, prefix: string): T {\n const methodNames = [\n \"onStart\",\n \"onStepStart\",\n \"onLanguageModelCallStart\",\n \"onLanguageModelCallEnd\",\n \"onToolExecutionStart\",\n \"onToolExecutionEnd\",\n \"onToolCallStart\",\n \"onToolCallFinish\",\n \"onStepFinish\",\n \"onObjectStepStart\",\n \"onObjectStepFinish\",\n \"onEmbedStart\",\n \"onEmbedEnd\",\n \"onRerankStart\",\n \"onRerankEnd\",\n // `onFinish` is the v7-canary-and-earlier name; `onEnd` is the\n // post-canary.144 name (see `injectEveCallContext` for the alias).\n // Both are listed so the wrapper logs whichever the underlying\n // integration / dispatcher actually invokes.\n \"onFinish\",\n \"onEnd\",\n \"onError\",\n // `onAbort` (v7 canary post-beta.116) fires when a streamText call is\n // cancelled via its AbortSignal — neither `onEnd` nor `onError` runs then.\n \"onAbort\",\n ] as const;\n const wrapped = integration as unknown as Record<string, unknown>;\n for (const name of methodNames) {\n const original = wrapped[name];\n if (typeof original !== \"function\") continue;\n const fn = original as (event: unknown) => unknown;\n wrapped[name] = function (event: unknown) {\n try {\n const ev = event as Record<string, unknown> | undefined;\n const op = ev && (ev.operationId ?? ev[\"operation_id\"]);\n console.log(`${prefix} ai-sdk-tel ${name} op=${String(op ?? \"?\")}`);\n } catch {\n // ignore\n }\n return fn.call(integration, event);\n };\n }\n return integration;\n}\n\n/**\n * Per-call closure for `injectEveCallContext` — captures the resolved Eve\n * agent name and any author-supplied metadata so they can be merged onto every\n * AI SDK event our integration sees.\n */\ninterface EveCallContextOptions {\n /**\n * The Eve agent name this sandbox runs. Resolved at `setup({ agentName })`\n * time. Used as the sub-agent label on the synthetic `agent.subagent`\n * wrapper when the current sandbox is dispatched as a sub-agent (see\n * `eve.continuation_token` parsing below).\n */\n agentName: string;\n /**\n * The functionId Eve sets on AI SDK telemetry for root model calls. This is\n * `opts.functionId ?? agentName` resolved at `setup({ agentName })` time.\n * Kept on the event for downstream attribution but no longer used as a\n * sub-agent discriminator — Eve dispatches each sub-agent into its own\n * sandbox where `event.functionId === agentName === rootFunctionId`, so a\n * functionId mismatch never fires. The reliable cross-sandbox signal is\n * `eve`'s public `getSession()` API (added in 0.23.0):\n * `getSession().parent !== undefined` iff the current sandbox is a\n * sub-agent (`SessionParent` carries the parent's session id + turn).\n */\n rootFunctionId: string;\n /**\n * The `metadata` block passed to `defineRaindropInstrumentation({ metadata })`.\n * Eve 0.22 forwards this to `runtimeContext` (not `experimental_telemetry.metadata`)\n * and AI SDK then filters runtimeContext out of integration events unless\n * `includeRuntimeContext: true` is set — which Eve doesn't enable. So\n * `event.metadata` arrives empty even when callers supplied metadata. We\n * merge `opts.metadata` directly onto `event.metadata` here so\n * `raindrop.userId` / `raindrop.convoId` / `properties.*` actually reach the\n * Raindrop event payload.\n */\n authoredMetadata?: Record<string, string>;\n}\n\n/**\n * Promote Eve's runtime-context fields (set by Eve on every AI SDK call —\n * `eve.session.id`, `eve.continuation_token`, etc.) into the per-event\n * `metadata` record the Raindrop integration reads. This is what turns each\n * Eve session into its own Raindrop thread (userId) and groups multi-turn\n * conversations under a single eventId.\n */\nfunction injectEveCallContext<T extends object>(integration: T, opts: EveCallContextOptions): T {\n const target = integration as unknown as Record<string, unknown>;\n\n // AI SDK v7 >= canary.144 dispatches `onEnd`; older versions and the\n // `@raindrop-ai/ai-sdk` integration we delegate to still use `onFinish`.\n // Alias the two so the EventShipper.patch() that lives inside `finishGenerate`\n // fires on the current AI SDK runtime (this is what populates Workshop's\n // Overview tab and Raindrop's event feed). Harmless on older AI SDK builds —\n // they just call `onFinish` and ignore `onEnd`.\n if (typeof target.onFinish === \"function\" && typeof target.onEnd !== \"function\") {\n target.onEnd = target.onFinish;\n }\n\n const original = target.onStart;\n if (typeof original !== \"function\") return integration;\n const fn = original as (event: unknown) => unknown;\n target.onStart = function (event: unknown) {\n try {\n const ev = event as Record<string, unknown>;\n if (envDebug()) {\n try {\n const ctxAny = ev.runtimeContext as Record<string, unknown> | undefined;\n const messages = (ev.messages as Array<{ content?: unknown }> | undefined) ?? [];\n const firstMsgContent = messages[0]?.content;\n const firstMsgPreview =\n typeof firstMsgContent === \"string\"\n ? firstMsgContent.slice(0, 220)\n : Array.isArray(firstMsgContent)\n ? JSON.stringify(firstMsgContent).slice(0, 220)\n : undefined;\n const activeSpanForDebug = trace.getActiveSpan() as\n | {\n attributes?: Record<string, unknown>;\n name?: string;\n spanContext?: () => { traceId: string };\n }\n | undefined;\n const traceIdForDebug = activeSpanForDebug?.spanContext?.()?.traceId;\n const turnEntryForDebug = lookupEveTurn(traceIdForDebug);\n const lineageForDebug = getEveSessionLineage();\n console.log(\n `[raindrop-ai/eve][probe] agentName=${opts.agentName} fn=${ev.functionId} traceId=${traceIdForDebug} activeSpan=${activeSpanForDebug?.name} runtimeContextKeys=${ctxAny ? Object.keys(ctxAny).join(\",\") : \"<none>\"} turnEntry=${JSON.stringify(turnEntryForDebug)} eveSession=${JSON.stringify(lineageForDebug)} firstMsg=${JSON.stringify(firstMsgPreview)}`\n );\n } catch (e) {\n console.log(`[raindrop-ai/eve][probe] error: ${(e as Error).message}`);\n }\n }\n\n // Eve session id resolution. Priority order:\n // (a) `eve`'s public `getSession()` API (≥ 0.23.0).\n // `session.sessionId` is the authoritative Eve session id for\n // the sandbox we're running in. Survives across sub-agent\n // dispatch — each sandbox sees its own session.\n // (b) `event.runtimeContext[\"eve.session.id\"]` — only populated\n // when Eve opts into `includeRuntimeContext` for that key.\n // Future-proof read, currently no-op against Eve 0.22-0.27.\n // (c) The {@link EveTurnRegistry} — a SpanProcessor we install on\n // the user's NodeTracerProvider records every `ai.eve.turn`\n // span's attributes by `traceId`. Lets us recover `eve.session.id`\n // even when `getSession()` is unavailable (Eve < 0.23.0 or\n // a non-Eve AI SDK consumer that happens to mint `ai.eve.turn`).\n // (d) `trace.getActiveSpan()?.attributes[\"eve.session.id\"]` — last\n // resort for the in-process case where AI SDK fires `onStart`\n // directly under `ai.eve.turn` (rare; Eve typically opens\n // `step.execute` between them).\n const ctx = ev.runtimeContext as Record<string, unknown> | undefined;\n const activeSpan = trace.getActiveSpan() as\n | {\n attributes?: Record<string, unknown>;\n name?: string;\n spanContext?: () => { traceId: string };\n }\n | undefined;\n const spanAttrs = activeSpan?.attributes;\n const traceId = activeSpan?.spanContext?.()?.traceId;\n const turnEntry = lookupEveTurn(traceId);\n // Single read; reused for both session-id and parent-lineage paths\n // below so we don't pay the `eve/context` require + ALS\n // lookup twice per event.\n const eveSession = getEveSessionLineage();\n const sessionFromContext =\n eveSession?.sessionId ??\n (typeof ctx?.[\"eve.session.id\"] === \"string\"\n ? (ctx[\"eve.session.id\"] as string)\n : undefined) ??\n turnEntry?.sessionId ??\n (typeof spanAttrs?.[\"eve.session.id\"] === \"string\"\n ? (spanAttrs[\"eve.session.id\"] as string)\n : undefined);\n const convoFromContext =\n (typeof ctx?.[\"eve.continuation_token\"] === \"string\"\n ? (ctx[\"eve.continuation_token\"] as string)\n : undefined) ??\n turnEntry?.continuationToken ??\n (typeof spanAttrs?.[\"eve.continuation_token\"] === \"string\"\n ? (spanAttrs[\"eve.continuation_token\"] as string)\n : undefined) ??\n // eve >= 0.45 stopped forwarding `eve.continuation_token`,\n // the legacy convo key — leaving `raindrop.convoId` null so every\n // multi-turn run un-grouped on the Conversations view. The session id is\n // stable across a run's turns and distinct per run, so falling back to\n // it restores turn-to-conversation grouping. An author-supplied\n // `raindrop.convoId` (e.g. a durable Slack thread id mapped in the step\n // hook) still wins: it is already on `meta` before this is applied.\n sessionFromContext;\n // Per-turn key for `raindrop.eventId`. Use the runtime-context\n // `eve.turn.id` (`turn_<sequence>`), not `getSession().turn.id`: the\n // runtime-context id increments per user turn, is stable across a turn's\n // model passes, and equals what a sub-agent receives as\n // `session.parent.turn.id` — one key that fixes overwrite, duplicates, and\n // cross-sandbox nesting at once. `getSession().turn.id` is a per-PASS UUID\n // (splits a turn into many events; never matched a sub-agent's link key),\n // kept only as a fallback for eve 0.23–0.44 which doesn't\n // forward it. The cache carries the id onto a resumed synthesis pass that\n // arrives without a runtime context.\n const ctxTurnId =\n typeof ctx?.[\"eve.turn.id\"] === \"string\" ? (ctx[\"eve.turn.id\"] as string) : undefined;\n if (sessionFromContext && ctxTurnId) {\n // Evict the oldest entry before inserting a new session so the cache\n // stays bounded (Map preserves insertion order → first key is oldest).\n if (\n canonicalTurnIdBySession.size >= MAX_CANONICAL_TURN_SESSIONS &&\n !canonicalTurnIdBySession.has(sessionFromContext)\n ) {\n const oldest = canonicalTurnIdBySession.keys().next().value;\n if (oldest !== undefined) canonicalTurnIdBySession.delete(oldest);\n }\n canonicalTurnIdBySession.set(sessionFromContext, ctxTurnId);\n }\n const turnIdFromContext =\n ctxTurnId ??\n (sessionFromContext ? canonicalTurnIdBySession.get(sessionFromContext) : undefined) ??\n (typeof eveSession?.turn?.id === \"string\" ? eveSession.turn.id : undefined) ??\n (typeof spanAttrs?.[\"eve.turn.id\"] === \"string\"\n ? (spanAttrs[\"eve.turn.id\"] as string)\n : undefined);\n\n // Start by promoting any author-supplied metadata onto the event so it\n // actually reaches the AI SDK integration. See the doc on\n // `EveCallContextOptions.authoredMetadata` for why this routing is\n // needed.\n //\n // The Raindrop TelemetryIntegration's `extractRaindropMetadata`\n // recognizes a fixed namespace of control keys (`raindrop.userId`,\n // `raindrop.eventId`, `raindrop.convoId`, `raindrop.eventName`) and a\n // single nested object (`raindrop.properties`) for arbitrary\n // user-defined event properties. Flat keys outside those slots are\n // dropped by the integration — they never reach `event.properties` on\n // the Raindrop dashboard. So we split `authoredMetadata` into:\n // - reserved-prefix keys (`raindrop.*`, `eve.*`): pass through onto\n // `event.metadata` as-is so the integration's known routing\n // applies.\n // - everything else: pile onto `raindrop.properties` so the\n // integration forwards them to `event.properties`.\n const meta = (ev.metadata as Record<string, unknown> | undefined) ?? {};\n // Lift any flat user-defined keys already on event.metadata into\n // raindrop.properties so per-call flat metadata reaches\n // event.properties on the dashboard (the AI-SDK integration only\n // forwards raindrop.properties — flat user keys would otherwise be\n // silently dropped by extractRaindropMetadata). Reserved\n // (`raindrop.*` / `eve.*`) keys stay flat — the integration handles\n // their routing directly.\n let userProps: Record<string, unknown> | undefined;\n for (const k of Object.keys(meta)) {\n if (k === \"raindrop.properties\") continue;\n if (k.startsWith(\"raindrop.\") || k.startsWith(\"eve.\")) continue;\n (userProps ??= {})[k] = meta[k];\n }\n // Metadata precedence on the shipped event (highest → lowest):\n // 1. per-call flat keys already on `event.metadata` (lifted above)\n // 2. per-step `metadata[\"step.started\"]` output (Eve >= 0.45)\n // 3. `staticMetadata` defaults (`opts.authoredMetadata`)\n // This mirrors the span side, where `buildEveMetadataConfig` spreads\n // `{ ...staticMetadata, ...callback(input) }` so per-step callback keys\n // win over static. Processing runtimeContext BEFORE authoredMetadata\n // keeps the two sides consistent — a `step.started` key that overrides a\n // `staticMetadata` key wins on the event too (not just the OTel span).\n\n // Eve >= 0.45 forwards `metadata[\"step.started\"]` output (already merged\n // with our `staticMetadata`, callback keys winning) as the AI SDK call's\n // runtime context, with `includeRuntimeContext` enabled for every key —\n // so the per-step metadata arrives here on `ev.runtimeContext`. Route it\n // like authored metadata so it reaches the shipped Raindrop event (not\n // just the raw OTel `ai.settings.context.*` span attributes):\n // - reserved `raindrop.*` control keys (`raindrop.userId` /\n // `raindrop.convoId` / `raindrop.eventName` / ...) land flat on the\n // event so a per-step `raindrop.userId` (e.g. the Slack user id the\n // callback derives from `input.channel.metadata`) sets the event's\n // user identity, taking precedence over the Eve session id below.\n // - everything else becomes an `event.properties` entry.\n // - Eve's own `eve.*` runtime keys (`eve.session.id`, `eve.turn.id`,\n // ...) are skipped — they're resolved by the dedicated session /\n // lineage logic below, not promoted as authored metadata.\n // No-op on Eve < 0.45, which does not forward runtime context here.\n if (ctx) {\n for (const [k, v] of Object.entries(ctx)) {\n if (typeof v !== \"string\") continue;\n if (k.startsWith(\"eve.\")) continue;\n if (k.startsWith(\"raindrop.\")) {\n if (meta[k] === undefined) meta[k] = v;\n } else if (!userProps || userProps[k] === undefined) {\n (userProps ??= {})[k] = v;\n }\n }\n }\n\n if (opts.authoredMetadata) {\n for (const [k, v] of Object.entries(opts.authoredMetadata)) {\n if (k.startsWith(\"raindrop.\") || k.startsWith(\"eve.\")) {\n if (meta[k] === undefined) meta[k] = v;\n } else if (!userProps || userProps[k] === undefined) {\n // Per-call flat + per-step runtime keys win; the static authored\n // default only fills a gap neither of those covered.\n (userProps ??= {})[k] = v;\n }\n }\n }\n\n if (userProps) {\n const existing = meta[\"raindrop.properties\"];\n const existingProps =\n existing && typeof existing === \"object\"\n ? (existing as Record<string, unknown>)\n : undefined;\n // Pre-existing raindrop.properties wins over both per-call flat\n // and authored defaults — the caller asked for it explicitly.\n meta[\"raindrop.properties\"] = { ...userProps, ...existingProps };\n }\n\n // Sub-agent detection. Two paths, in priority order:\n // 1. ALS parent-tool context — works for non-Eve AI SDK consumers\n // whose tools recursively call `streamText`/`generateText` in the\n // same async branch (Mastra, hand-rolled tool loops, etc).\n // 2. `eve`'s public `getSession()` API (≥ 0.23.0):\n // when `session.parent !== undefined`, the current sandbox is a\n // sub-agent and `session.parent.sessionId` / `.turn` identify\n // the parent's turn that dispatched us. This is the\n // first-class Eve signal — replaces the old\n // `subagent:<parent>:<call>` continuation-token parser, which\n // never matched in production because Eve's continuation\n // tokens are opaque (no `subagent:` prefix is ever minted in\n // 0.22.x or later).\n const parentToolContext = getCurrentParentToolContext();\n const crossSandboxParent: EveSessionParent | undefined =\n parentToolContext === undefined ? eveSession?.parent : undefined;\n // `getSession()` left `eve/context` in 0.36, so\n // `crossSandboxParent` (which reads `getSession().parent`) is populated\n // only on 0.23–0.35; from 0.45 the parent lineage arrives on the\n // `step.started` input instead. Our default hook (`resolveCrossSandboxParentMetadata`) turns\n // that into `raindrop.parent.*`, which Eve forwards as runtime context —\n // already promoted onto `meta` by the routing loop above. Treat its\n // presence as the cross-sandbox sub-agent signal when `getSession()` is\n // unavailable so the wrapper / role / per-turn guard below still fire.\n const runtimeParentSessionId =\n parentToolContext === undefined &&\n crossSandboxParent === undefined &&\n typeof meta[\"raindrop.parent.sessionId\"] === \"string\"\n ? (meta[\"raindrop.parent.sessionId\"] as string)\n : undefined;\n // For a cross-sandbox sub-agent, `opts.agentName` is the *app* name\n // (resolved once at `setup()`), not the dispatched sub-agent's name — so\n // every sub-agent was mislabeled with the parent app name (e.g. all\n // showed \"eve-subagents\" instead of \"weather-researcher\"). Eve stamps the\n // running sub-agent's name onto the AI SDK telemetry `functionId`, so\n // prefer it and fall back to the app name only when it's absent.\n const crossSandboxAgentName =\n typeof ev.functionId === \"string\" && ev.functionId ? ev.functionId : opts.agentName;\n const detected =\n parentToolContext?.toolName ??\n (crossSandboxParent !== undefined || runtimeParentSessionId !== undefined\n ? crossSandboxAgentName\n : undefined);\n\n // Per-turn fallback / sub-agent grouping key:\n // - ALS sub-agents (in-process): parent's eventId is already\n // inherited through AI SDK's `executeTool` context propagation,\n // so we MUST NOT stomp it by writing the local trace id onto\n // metadata. Leave eventId empty and let the integration's\n // `inherited?.eventId` path win.\n // - Cross-workflow Eve sub-agents: Eve's durable runtime propagates\n // the parent's OTel trace id across the workflow boundary (all\n // sub-agent spans land in the same trace), so the active trace id\n // IS the parent's eventId. Writing it onto metadata groups every\n // sub-agent's LLM/tool spans under the parent's Raindrop event.\n // - Root calls: trace id is the root's own; same as before.\n const activeTraceId = parentToolContext\n ? undefined\n : trace.getActiveSpan()?.spanContext()?.traceId;\n // Scope the event to the Eve *turn*, not the whole session: the session\n // id is constant across a multi-turn run, so keying off it alone would\n // collapse every turn into one Raindrop event.\n //\n // Mint a stable `eve:<sessionId>:<turnId>` composite for ROOT turns only,\n // where `turnIdFromContext` is the per-turn (not per-pass) `eve.turn.id`\n // so a turn's tool + synthesis passes share one event instead of\n // duplicating. Sub-agents are excluded so they keep the grouping described\n // above — giving them their own per-turn id would detach a cross-sandbox\n // sub-agent's spans from the parent event (and stomp the inherited eventId\n // for in-process ALS sub-agents). `turn.id` is session-scoped, so it is\n // only globally unique once namespaced with the session id; when either\n // half is missing we fall back to the (globally unique, still per-turn)\n // active trace id rather than a collision-prone bare turn id.\n const isSubAgent =\n parentToolContext !== undefined ||\n crossSandboxParent !== undefined ||\n runtimeParentSessionId !== undefined;\n const rootTurnEventId =\n !isSubAgent && sessionFromContext && turnIdFromContext\n ? eveTurnEventId(sessionFromContext, turnIdFromContext)\n : undefined;\n const eventId = rootTurnEventId ?? activeTraceId;\n\n // userId must reflect *user identity*, never a per-trace correlation\n // id. A per-step `raindrop.userId` from `metadata[\"step.started\"]`\n // (e.g. the Slack user id) already landed on `meta` above and wins.\n // Otherwise promote `eve.session.id` (a stable Eve thread / user\n // identifier) to `raindrop.userId`. When neither is available, leave\n // `raindrop.userId` undefined so the integration's\n // `defaultContext.userId` wins — that's `opts.userId ?? agentName`,\n // which is the documented fallback.\n if (sessionFromContext && meta[\"raindrop.userId\"] === undefined) {\n meta[\"raindrop.userId\"] = sessionFromContext;\n }\n // convoId groups events into a conversation. For a sub-agent the local\n // session id is its OWN sandbox run, so using it would split the sub-agent\n // into a separate conversation from the parent. Prefer the dispatching\n // parent's root session so the whole agent tree shares one conversation;\n // root turns keep the local session fallback.\n if (meta[\"raindrop.convoId\"] === undefined) {\n const parentConvo =\n isSubAgent && typeof meta[\"raindrop.parent.rootSessionId\"] === \"string\"\n ? (meta[\"raindrop.parent.rootSessionId\"] as string)\n : isSubAgent && typeof meta[\"raindrop.parent.sessionId\"] === \"string\"\n ? (meta[\"raindrop.parent.sessionId\"] as string)\n : undefined;\n const convo = parentConvo ?? convoFromContext;\n if (convo) meta[\"raindrop.convoId\"] = convo;\n }\n // `eventId` is a per-turn correlation key, not user identity — deriving\n // it from the turn id (or the active trace id when no turn id is\n // available) is correct even when no session is present.\n if (eventId && meta[\"raindrop.eventId\"] === undefined) {\n meta[\"raindrop.eventId\"] = eventId;\n }\n\n if (detected && meta[\"eve.subagent.name\"] === undefined) {\n meta[\"eve.subagent.name\"] = detected;\n }\n if (meta[\"eve.agent.role\"] === undefined) {\n meta[\"eve.agent.role\"] = detected ? \"subagent\" : \"root\";\n }\n if (parentToolContext) {\n if (meta[\"raindrop.parent.callId\"] === undefined) {\n meta[\"raindrop.parent.callId\"] = parentToolContext.parentCallId;\n }\n if (meta[\"raindrop.parent.toolCallId\"] === undefined) {\n meta[\"raindrop.parent.toolCallId\"] = parentToolContext.toolCallId;\n }\n if (meta[\"raindrop.parent.toolName\"] === undefined) {\n meta[\"raindrop.parent.toolName\"] = parentToolContext.toolName;\n }\n } else if (crossSandboxParent) {\n // Cross-sandbox parent linkage on Eve 0.23–0.44, where `getSession()`\n // exposes the parent natively. (On 0.45+ the same keys arrive via the\n // `step.started` hook's runtime context — see\n // `resolveCrossSandboxParentMetadata` — so this branch doesn't run.)\n // Parent + child run in separate V8 sandboxes and so land in DISTINCT\n // traces; the dashboard re-parents the child by matching its\n // `raindrop.parent.eventId` against the dispatching turn's\n // `raindrop.eventId` (see `linkCrossSandboxSubAgents` in dawn). Since a\n // root turn's eventId is the `eve:<sessionId>:<turnId>` composite, the\n // link key carries that same composite for the parent's turn, while\n // `raindrop.parent.sessionId` stays a bare parent session id.\n for (const [key, value] of Object.entries(parentLineageMetadata(crossSandboxParent))) {\n if (meta[key] === undefined) meta[key] = value;\n }\n }\n\n if (Object.keys(meta).length > 0) ev.metadata = meta;\n } catch {\n // never let metadata massaging break instrumentation\n }\n return fn.call(integration, event);\n };\n\n // Sub-agent wrapping is handled inside `@raindrop-ai/ai-sdk`'s\n // `RaindropTelemetryIntegration` (it wraps the sub-agent's own\n // `ai.streamText` call in a TOOL_CALL + `agent.subagent` LLM marker that\n // Workshop's `detectSubAgents` keys off of). Emitting a parallel\n // synthetic TOOL_CALL from Eve's `onStepFinish` would duplicate the AGENT\n // block, so we no longer do that here.\n\n return integration;\n}\n\nfunction registerAISdkTelemetry(integration: object): void {\n const g = globalThis as { AI_SDK_TELEMETRY_INTEGRATIONS?: object[] };\n if (!Array.isArray(g.AI_SDK_TELEMETRY_INTEGRATIONS)) {\n g.AI_SDK_TELEMETRY_INTEGRATIONS = [];\n }\n // Tag + dedupe so `eve dev` hot reload, repeated `defineRaindropInstrumentation`\n // calls, or any other dev-loop re-evaluation of the instrumentation file\n // replaces the prior Raindrop integration in place instead of stacking N\n // copies (which would produce N duplicate `track_partial` events and N\n // synthetic sub-agent wrapper spans per call).\n const tagged = integration as TaggedIntegration;\n tagged[RAINDROP_EVE_INTEGRATION] = true;\n g.AI_SDK_TELEMETRY_INTEGRATIONS = g.AI_SDK_TELEMETRY_INTEGRATIONS.filter(\n (e) => !(e as TaggedIntegration)[RAINDROP_EVE_INTEGRATION]\n );\n g.AI_SDK_TELEMETRY_INTEGRATIONS.push(tagged);\n}\n\nfunction envWriteKey(): string | undefined {\n if (typeof process === \"undefined\") return undefined;\n const v = process.env?.RAINDROP_WRITE_KEY;\n return typeof v === \"string\" && v.length > 0 ? v : undefined;\n}\n\nfunction envProjectId(): string | undefined {\n if (typeof process === \"undefined\") return undefined;\n const v = process.env?.RAINDROP_PROJECT_ID;\n return v && v.length > 0 ? v : undefined;\n}\n\nfunction envEndpoint(): string | undefined {\n if (typeof process === \"undefined\") return undefined;\n const v = process.env?.RAINDROP_ENDPOINT;\n return typeof v === \"string\" && v.length > 0 ? v : undefined;\n}\n\nfunction envDebug(): boolean {\n if (typeof process === \"undefined\") return false;\n const v = process.env?.RAINDROP_AI_DEBUG;\n return v === \"1\" || v === \"true\";\n}\n\n/**\n * Distinguish Eve 0.45's `InstrumentationMetadataConfig` (callback hooks,\n * e.g. `{ \"step.started\"(input) { ... } }`) from the legacy flat\n * `Record<string, string>` form of `metadata`. The discriminator is a\n * function-valued `step.started` hook — the only shape Eve forwards as\n * instrumentation metadata.\n */\nfunction isEveMetadataConfig(\n m: RaindropEveInstrumentationMetadataConfig | Record<string, string> | undefined\n): m is RaindropEveInstrumentationMetadataConfig {\n return (\n typeof m === \"object\" &&\n m !== null &&\n typeof (m as RaindropEveInstrumentationMetadataConfig)[\"step.started\"] === \"function\"\n );\n}\n\n/**\n * The dispatching parent turn's per-turn `raindrop.eventId`. A root turn's\n * eventId is the `eve:<sessionId>:<turnId>` composite (see\n * {@link injectEveCallContext}); the cross-sandbox link key a sub-agent emits\n * must equal that composite so the dashboard can re-parent it under the turn\n * that dispatched it.\n */\nfunction eveTurnEventId(sessionId: string, turnId: string): string {\n return `eve:${sessionId}:${turnId}`;\n}\n\n/**\n * Flatten an {@link EveSessionParent} into the `raindrop.parent.*` metadata the\n * dashboard reads to nest a cross-sandbox sub-agent under its dispatcher.\n *\n * The cross-sandbox link key is `raindrop.parent.eventId`: it carries the\n * dispatching turn's per-turn event id (the `eve:<sessionId>:<turnId>`\n * composite, equal to that turn's own `raindrop.eventId`), which is what dawn's\n * `linkCrossSandboxSubAgents` matches against. `raindrop.parent.sessionId`\n * stays a bare parent session id, with the turn breakdown preserved under the\n * other keys for context.\n */\nfunction parentLineageMetadata(parent: EveSessionParent): Record<string, string> {\n const out: Record<string, string> = {\n \"raindrop.parent.sessionId\": parent.sessionId,\n \"raindrop.parent.eventId\": eveTurnEventId(parent.sessionId, parent.turn.id),\n \"raindrop.parent.turnId\": parent.turn.id,\n \"raindrop.parent.turnSequence\": String(parent.turn.sequence),\n };\n if (parent.rootSessionId !== undefined) {\n out[\"raindrop.parent.rootSessionId\"] = parent.rootSessionId;\n }\n return out;\n}\n\n/**\n * Cross-sandbox parent lineage as flat `raindrop.parent.*` metadata, read from\n * the `step.started` callback's `input.session.parent`.\n *\n * Eve dispatches each sub-agent into its own V8 sandbox, so the parent's OTel\n * context cannot cross the boundary and the sub-agent runs in a DISTINCT trace.\n * Eve 0.23–0.35 exposed the parent identity via `getSession().parent`; 0.36\n * removed that export, and from 0.45 the same lineage is surfaced on the\n * `step.started` input instead (`metadata[\"step.started\"]` on 0.45–0.52,\n * `events[\"step.started\"]` on 0.53+). Emitting it here lets the shipped telemetry carry the parent linkage\n * so the dashboard can re-parent the sub-agent under the turn that dispatched\n * it. Returns `{}` for a root turn (no parent).\n */\nfunction resolveCrossSandboxParentMetadata(\n input: RaindropEveStepStartedMetadataInput\n): Record<string, string> {\n const parent = parseEveSessionParent(input.session.parent);\n if (parent === undefined) return {};\n return parentLineageMetadata(parent);\n}\n\n/** Reserved lineage namespace owned by the integration's cross-sandbox resolver. */\nconst RAINDROP_PARENT_PREFIX = \"raindrop.parent.\";\n\n/**\n * Drop the reserved `raindrop.parent.*` namespace from caller-supplied metadata.\n *\n * These keys describe cross-sandbox parentage and are derived *exclusively* from\n * `input.session.parent` by {@link resolveCrossSandboxParentMetadata}. If a\n * static `staticMetadata`/legacy-`metadata` record or a per-step `step.started`\n * hook were allowed to set them, a *root* turn would carry a stray\n * `raindrop.parent.sessionId` — applied as authored metadata in\n * {@link injectEveCallContext} and/or forwarded as runtime context — which the\n * sub-agent detection reads as the cross-sandbox signal, mislabelling the root\n * `eve.agent.role=subagent` and skipping its per-turn `raindrop.eventId`.\n * Stripping at both the static ({@link resolveStaticMetadata}) and per-step\n * (the shared resolver) lanes guarantees the namespace reflects only genuine\n * lineage.\n */\nfunction stripReservedParentMetadata(\n meta: Record<string, string> | null | undefined\n): Record<string, string> {\n if (meta == null) return {};\n const out: Record<string, string> = {};\n for (const [key, value] of Object.entries(meta)) {\n if (!key.startsWith(RAINDROP_PARENT_PREFIX)) out[key] = value;\n }\n return out;\n}\n\n/**\n * Resolve the static Raindrop metadata the helper applies itself (merged onto\n * shipped events via {@link injectEveCallContext}). This is `staticMetadata`\n * plus — for backwards compatibility — a flat `Record<string, string>` passed\n * through the legacy `metadata` option. Returns `undefined` when there is\n * nothing static to apply.\n *\n * The reserved `raindrop.parent.*` lineage namespace is stripped here (see\n * {@link stripReservedParentMetadata}): this value feeds both the per-step\n * resolver and `injectEveCallContext`'s `authoredMetadata`, so stripping at this\n * single chokepoint keeps a stray static parent id from mislabelling a root turn\n * as a cross-sandbox sub-agent.\n */\nfunction resolveStaticMetadata(\n opts: RaindropEveInstrumentationOptions\n): Record<string, string> | undefined {\n const legacyFlat = isEveMetadataConfig(opts.metadata) ? undefined : opts.metadata;\n if (opts.staticMetadata === undefined && legacyFlat === undefined) return undefined;\n return stripReservedParentMetadata({ ...legacyFlat, ...opts.staticMetadata });\n}\n\n/**\n * Build the single `step.started` resolver shared by the `metadata` (Eve\n * 0.45–0.52) and `events` (Eve 0.53+) configs. For each model-call attempt it\n * layers, lowest precedence first:\n * 1. static Raindrop metadata,\n * 2. the caller's own `step.started` hook (from `opts.events`, or\n * `opts.metadata` for back-compat — `events` wins when both are given),\n * 3. cross-sandbox sub-agent lineage ({@link resolveCrossSandboxParentMetadata}),\n * applied last so the reserved `raindrop.parent.*` namespace always reflects\n * genuine `session.parent` lineage and cannot be overridden by the caller.\n *\n * Always returns a resolver (never `undefined`): the lineage layer must run on\n * every step so cross-sandbox nesting works even when the caller configured no\n * metadata of their own.\n */\nfunction buildEveStepStartedResolver(\n opts: RaindropEveInstrumentationOptions,\n staticMetadata: Record<string, string> | undefined\n): (input: RaindropEveStepStartedMetadataInput) => Record<string, string> {\n const metadataConfig = isEveMetadataConfig(opts.metadata) ? opts.metadata : undefined;\n const eventsConfig = opts.events;\n // `events[\"step.started\"]` is the forward-looking (0.53) hook and wins over\n // the legacy `metadata[\"step.started\"]` when both are supplied.\n const eventsStepStarted = eventsConfig?.[\"step.started\"];\n const metadataStepStarted = metadataConfig?.[\"step.started\"];\n\n return (input) => {\n const userMetadata = eventsStepStarted\n ? // Invoke with the authored config as the receiver so callbacks defined\n // as object methods (`{ \"step.started\"() { return this... } }`) keep\n // their `this` binding. The 0.53 hook returns `{ runtimeContext }`.\n (eventsStepStarted.call(eventsConfig, input)?.runtimeContext ?? {})\n : metadataStepStarted\n ? metadataStepStarted.call(metadataConfig, input)\n : {};\n // `raindrop.parent.*` is reserved for genuine cross-sandbox lineage. The\n // static lane is already stripped by `resolveStaticMetadata`; strip the\n // per-step hook output too so a stray value there can't make a root turn\n // look like a sub-agent, then layer the real lineage last so it wins.\n return {\n ...staticMetadata,\n ...stripReservedParentMetadata(userMetadata),\n ...resolveCrossSandboxParentMetadata(input),\n };\n };\n}\n\n/**\n * Build the Eve 0.45–0.52 `InstrumentationMetadataConfig`. Always installs the\n * shared `step.started` resolver so cross-sandbox lineage reaches every step.\n */\nfunction buildEveMetadataConfig(\n opts: RaindropEveInstrumentationOptions,\n staticMetadata: Record<string, string> | undefined\n): RaindropEveInstrumentationMetadataConfig {\n const resolve = buildEveStepStartedResolver(opts, staticMetadata);\n return { \"step.started\": (input) => resolve(input) };\n}\n\n/**\n * Build the Eve 0.53+ `InstrumentationEventsConfig`. Wraps the same shared\n * resolver's flat output in the `{ runtimeContext }` shape Eve 0.53 expects.\n */\nfunction buildEveEventsConfig(\n opts: RaindropEveInstrumentationOptions,\n staticMetadata: Record<string, string> | undefined\n): RaindropEveInstrumentationEventsConfig {\n const resolve = buildEveStepStartedResolver(opts, staticMetadata);\n return { \"step.started\": (input) => ({ runtimeContext: resolve(input) }) };\n}\n\n/**\n * Build a Raindrop-flavored Eve instrumentation definition.\n *\n * `agent/instrumentation.ts`:\n *\n * ```ts\n * import { defineRaindropInstrumentation } from \"@raindrop-ai/eve\";\n *\n * export default defineRaindropInstrumentation({\n * writeKey: process.env.RAINDROP_WRITE_KEY,\n * staticMetadata: { team: \"support\" },\n * events: {\n * \"step.started\"(input) {\n * return {\n * runtimeContext: {\n * \"slack.channel_id\": String(input.channel.metadata.channelId ?? \"\"),\n * },\n * };\n * },\n * },\n * });\n * ```\n */\nexport function defineRaindropInstrumentation(\n opts: RaindropEveInstrumentationOptions = {}\n): RaindropInstrumentationDefinition {\n const debug = opts.debug === true || envDebug();\n const writeKey = opts.writeKey ?? envWriteKey();\n const endpoint = opts.endpoint ?? envEndpoint();\n const projectId = opts.projectId ?? envProjectId();\n\n const exporter = new RaindropEveSpanExporter({\n writeKey,\n endpoint,\n projectId,\n localWorkshopUrl: opts.localWorkshopUrl,\n serviceName: opts.serviceName,\n serviceVersion: opts.serviceVersion ?? libraryVersion,\n sdkName: \"eve\",\n debug,\n maxTextFieldChars: opts.maxTextFieldChars,\n });\n\n // Build a Raindrop AI SDK client that shares the same writeKey / endpoint /\n // workshop config as the exporter. We use it to mint a v7+ TelemetryIntegration\n // for every model / tool call inside Eve, which is what populates Workshop's\n // Overview tab (track_partial events) and produces rich LLM_GENERATION /\n // TOOL_CALL spans (with prompts + completions) in both Workshop and Raindrop.\n const localWorkshopUrl: string | false | undefined =\n opts.localWorkshopUrl === false ? false : opts.localWorkshopUrl;\n const raindrop = createRaindropAISDK({\n writeKey,\n endpoint,\n projectId,\n localWorkshopUrl,\n events: { debug },\n traces: { debug },\n });\n\n // Drain the AI SDK trace + event shippers when Eve shuts down its OTel\n // pipeline — otherwise pending sub-agent `track_partial` events and AI SDK\n // trace spans queued in `TraceShipper` would be dropped on SIGINT/SIGTERM.\n exporter.attachAuxShutdown(() => raindrop.shutdown());\n\n const prefix = \"[raindrop-ai/eve]\";\n\n // Split metadata into two lanes:\n // - `staticMetadata` (the static authored lane): applied by the helper\n // itself in `injectEveCallContext`, merged onto every shipped Raindrop\n // event. Also accepts a legacy flat `metadata` record for back-compat.\n // - the `step.started` callback (the dynamic lane): forwarded to Eve on\n // BOTH the returned definition's `events` (read by Eve 0.53+) and\n // `metadata` (read by Eve 0.45–0.52) fields so the same definition fires\n // across the supported range. Never iterated as static metadata here.\n const staticMetadata = resolveStaticMetadata(opts);\n const eveMetadata = buildEveMetadataConfig(opts, staticMetadata);\n const eveEvents = buildEveEventsConfig(opts, staticMetadata);\n\n return {\n functionId: opts.functionId,\n metadata: eveMetadata,\n events: eveEvents,\n recordInputs: opts.recordInputs,\n recordOutputs: opts.recordOutputs,\n exporter,\n raindrop,\n setup({ agentName }) {\n if (!exporter.hasDestinations()) {\n console.warn(\n `${prefix} no destinations configured — set RAINDROP_WRITE_KEY for hosted Raindrop, or run \\`raindrop workshop\\` for local mirroring.`\n );\n }\n const serviceName = opts.serviceName ?? agentName;\n // The exporter is constructed at `defineRaindropInstrumentation` time —\n // before Eve resolves the agent name — so its `service.name` defaulted\n // to `\"raindrop.eve\"`. Push the resolved name through now so OTLP\n // batches advertise the correct service identity. Skipped when the\n // caller explicitly pinned `opts.serviceName`.\n exporter.setServiceName(serviceName);\n\n if (opts.registerOTel) {\n // OTel side: ship Eve's workflow / step / fetch spans through our\n // OTLP exporter to Raindrop + Workshop.\n //\n // `eve dev`'s HMR re-evaluates `agent/instrumentation.ts` on every\n // edit, which calls `setup()` again with a fresh\n // `RaindropEveSpanExporter`. `@vercel/otel`'s `registerOTel` does\n // not de-dupe, so back-to-back calls install two SDK providers\n // and every Eve span is exported twice (and inflates run counts\n // on the dashboard). Gate behind a globalThis symbol so subsequent\n // hot-reloads short-circuit. The first registration wins; later\n // ones warn (in debug) so config drift is visible.\n const g = globalThis as {\n [k: symbol]: { exporter: unknown } | undefined;\n };\n const already = g[RAINDROP_EVE_OTEL_REGISTERED];\n if (already === undefined) {\n opts.registerOTel({\n serviceName,\n traceExporter: exporter,\n });\n g[RAINDROP_EVE_OTEL_REGISTERED] = { exporter };\n if (debug) {\n console.log(`${prefix} registered OTel for serviceName=${serviceName}`);\n }\n } else if (debug) {\n console.log(\n `${prefix} skipping duplicate registerOTel — already registered (hot reload). Restart the process to re-register.`\n );\n }\n } else {\n console.warn(\n `${prefix} no \\`registerOTel\\` passed — Eve's own OTel spans (workflow/step/fetch) will not be exported. Pass \\`registerOTel\\` from \\`@vercel/otel\\`.`\n );\n }\n\n // Cross-sandbox sub-agent detection. Eve runs each sub-agent in its own\n // V8 sandbox; the AI-SDK `onStart` callback fires under Eve's\n // `step.execute` span (empty attributes), and the ancestor\n // `ai.eve.turn` span — which carries `eve.continuation_token` and\n // `eve.session.id` — is unreachable from public OTel APIs. Install\n // a SpanProcessor on the user's NodeTracerProvider that records\n // every `ai.eve.turn` span by `traceId`; `injectEveCallContext`\n // reads it back via `lookupEveTurn(traceId)`. Idempotent — install\n // flag prevents stacking on hot reload.\n const installed = installEveTurnSpanProcessor(trace);\n if (!installed && debug) {\n console.log(\n `${prefix} could not install ai.eve.turn SpanProcessor — cross-sandbox sub-agent detection will fall back to active-span attributes only. (Global tracer provider missing addSpanProcessor — register \\`registerOTel\\` from \\`@vercel/otel\\` before \\`defineRaindropInstrumentation\\`'s \\`setup()\\` runs.)`\n );\n }\n\n // AI SDK v7+ side: register a Raindrop TelemetryIntegration with the\n // AI SDK's global registry so every model + tool call inside Eve is\n // shipped as a typed Raindrop span + a track_partial event.\n //\n // The integration only emits `track_partial` events when it has a\n // userId on the call, so we set a `defaultContext.userId` (agent name\n // unless overridden) and — in `injectEveCallContext` below — also\n // promote Eve's per-turn `eve.session.id` to `raindrop.userId` so each\n // user session shows up as its own thread in the Raindrop dashboard.\n const integration = raindrop.createTelemetryIntegration({\n userId: opts.userId ?? agentName,\n eventName: opts.eventName,\n });\n injectEveCallContext(integration, {\n agentName,\n rootFunctionId: opts.functionId ?? agentName,\n authoredMetadata: staticMetadata,\n });\n const wrapped = debug ? wrapWithDebugLogs(integration, prefix) : integration;\n registerAISdkTelemetry(wrapped);\n if (debug) {\n console.log(`${prefix} registered AI SDK telemetry integration (events + traces).`);\n // Confirm the global registry actually has our integration installed.\n const g = globalThis as { AI_SDK_TELEMETRY_INTEGRATIONS?: object[] };\n console.log(\n `${prefix} globalThis.AI_SDK_TELEMETRY_INTEGRATIONS length=${g.AI_SDK_TELEMETRY_INTEGRATIONS?.length ?? 0}`\n );\n }\n },\n };\n}\n\nexport default defineRaindropInstrumentation;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@raindrop-ai/eve",
3
- "version": "0.0.10",
3
+ "version": "0.0.11",
4
4
  "description": "Raindrop integration for Vercel's Eve agent framework (OTel traces to Raindrop + Workshop)",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",