@m8tes/sdk 0.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +100 -0
- package/LICENSE +21 -0
- package/README.md +160 -0
- package/dist/chunk-UFQQNUFE.js +1083 -0
- package/dist/chunk-UFQQNUFE.js.map +1 -0
- package/dist/fixtures.cjs +297 -0
- package/dist/fixtures.cjs.map +1 -0
- package/dist/fixtures.d.cts +81 -0
- package/dist/fixtures.d.ts +81 -0
- package/dist/fixtures.js +295 -0
- package/dist/fixtures.js.map +1 -0
- package/dist/index.cjs +1783 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +937 -0
- package/dist/index.d.ts +937 -0
- package/dist/index.js +672 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol/index.cjs +1109 -0
- package/dist/protocol/index.cjs.map +1 -0
- package/dist/protocol/index.d.cts +576 -0
- package/dist/protocol/index.d.ts +576 -0
- package/dist/protocol/index.js +3 -0
- package/dist/protocol/index.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/http.ts","../src/pagination.ts","../src/params.ts","../src/resources/agents.ts","../src/resources/apps.ts","../src/streaming.ts","../src/resources/runs.ts","../src/resources/settings.ts","../src/resources/tasks.ts","../src/resources/users.ts","../src/resources/webhooks.ts","../src/index.ts"],"names":[],"mappings":";;;;;AAgCO,IAAM,gBAAA,GAAmB;AAEhC,IAAM,YAAA,GAAe,CAAA;AACrB,IAAM,kBAAA,GAAqB,GAAA;AAC3B,IAAM,gBAAA,uBAAuB,GAAA,CAAI,CAAC,KAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAC1D,IAAM,kBAAA,uBAAyB,GAAA,CAAI,CAAC,OAAO,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,SAAS,CAAC,CAAA;AAoC9E,SAAS,OAAA,CAAQ,IAAY,MAAA,EAAqC;AAChE,EAAA,IAAI,MAAA,EAAQ,OAAA,EAAS,OAAO,OAAA,CAAQ,OAAA,EAAQ;AAC5C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,EAAM,EAAE,CAAA;AACjC,IAAA,SAAS,IAAA,GAAa;AACpB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,MAAA,EAAQ,mBAAA,CAAoB,SAAS,IAAI,CAAA;AACzC,MAAA,OAAA,EAAQ;AAAA,IACV;AACA,IAAA,MAAA,EAAQ,iBAAiB,OAAA,EAAS,IAAA,EAAM,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EACxD,CAAC,CAAA;AACH;AAEA,SAAS,aAAA,CAAc,KAAe,IAAA,EAAuB;AAC3D,EAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,GAAA,CAAI,cAAc,KAAK,EAAA,EAAI,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,IAAA;AAC1E,EAAA,MAAM,IAAA,GAAO,KAAK,SAAA,EAAU,CAAE,MAAM,CAAA,EAAG,CAAC,EAAE,WAAA,EAAY;AACtD,EAAA,OAAO,KAAK,UAAA,CAAW,WAAW,CAAA,IAAK,IAAA,CAAK,WAAW,OAAO,CAAA;AAChE;AAOA,SAAS,QAAA,CAAS,GAAA,EAAe,IAAA,EAAc,IAAA,EAAe,GAAA,EAAiC;AAC7F,EAAA,IAAI,aAAA,CAAc,GAAA,EAAK,IAAI,CAAA,EAAG;AAC5B,IAAA,OACE,0DAA0D,GAAA,CAAI,MAAM,CAAA,OAAA,EAAU,GAAG,qGAE3D,gBAAgB,CAAA,EAAA,CAAA;AAAA,EAE1C;AACA,EAAA,MAAM,cAAA,GACJ,GAAA,CAAI,MAAA,KAAW,GAAA,IACf,IAAA,KAAS,IAAA,IACT,OAAO,IAAA,KAAS,QAAA,IAChB,EAAE,OAAA,IAAW,IAAA,CAAA,IACZ,KAA8B,MAAA,KAAW,WAAA;AAC5C,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,OACE,CAAA,cAAA,EAAiB,GAAG,CAAA,gIAAA,EACiD,gBAAgB,CAAA,EAAA,CAAA;AAAA,EAEzF;AACA,EAAA,OAAO,MAAA;AACT;AAeO,SAAS,UAAA,CAAW,OAAA,GAAyB,EAAC,EAAS;AAK5D,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,aAAa,WAAA,EAAa;AACpE,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAIF;AAAA,EACF;AACA,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,IAAU,UAAA,CAAW,OAAA,EAAS,MAAM,eAAe,CAAA;AAC1E,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AACA,EAAA,MAAM,WAAW,OAAA,CAAQ,OAAA,IAAW,gBAAA,EAAkB,OAAA,CAAQ,QAAQ,EAAE,CAAA;AACxE,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,GAAA;AACnC,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,IAAU,UAAA,CAAW,KAAA;AAChD,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,MAAM,SAAA,GAAuB,UAAA;AAE7B,EAAA,eAAe,OAAA,CACb,GAAA,EACA,GAAA,EACA,OAAA,EACwB;AACxB,IAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,GAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,SAAS,kBAAA,CAAmB,GAAA,CAAI,MAAA,EAAQ,IAAA,EAAM,IAAI,OAAO,CAAA;AAC/D,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,GAAG,CAAA,KAAM,IAAA,GAAO,MAAA,CAAO,OAAA,GAAU,IAAA,IAAQ,MAAA,CAAO,OAAA,CAAA;AAC1F,IAAA,OAAO,KAAK,oBAAoB,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAA,EAAG,OAAA,EAAS,OAAO,MAAM,CAAA;AAAA,EAC9E;AAGA,EAAA,eAAe,OAAA,CAAQ,MAAA,EAAgB,GAAA,EAAa,IAAA,EAAyC;AAC3F,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,aAAA,EAAe,UAAU,MAAM,CAAA,CAAA;AAAA,MAC/B,GAAG,OAAA,CAAQ,OAAA;AAAA,MACX,GAAG,IAAA,CAAK;AAAA,KACV;AACA,IAAA,MAAM,IAAA,GAAoB,EAAE,MAAA,EAAQ,OAAA,EAAQ;AAC5C,IAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAW;AAC3B,MAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,kBAAA;AAC1B,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAAA,IACtC;AACA,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,OAAA,CAAQ,OAAO,CAAA;AACzC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,WAAA,CAAY,GAAA,CAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAC,CAAA,GAAI,KAAA;AACpE,IAAA,OAAO,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,EAC5B;AAMA,EAAA,eAAe,KACb,MAAA,EACA,IAAA,EACA,IAAA,EACA,OAAA,GAAoC,EAAC,EAClB;AACnB,IAAA,MAAM,GAAA,GAAM,GAAG,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,IAAA,CAAK,SAAS,EAAE,CAAA,CAAA;AAChD,IAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,GAAA,CAAI,MAAA,CAAO,aAAa,CAAA;AAC9D,IAAA,IAAI,gBAAA;AAEJ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,EAAc,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,MAAA,GAAS,MAAM,YAAA,GAAe,CAAA;AACpC,MAAA,IAAI,GAAA;AACJ,MAAA,IAAI;AACF,QAAA,GAAA,GAAM,MAAM,OAAA,CAAQ,MAAA,EAAQ,GAAA,EAAK,IAAI,CAAA;AAAA,MACvC,SAAS,CAAA,EAAG;AAEV,QAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA;AAChC,QAAA,gBAAA,GAAmB,CAAA;AACnB,QAAA,IAAI,CAAC,cAAc,MAAA,EAAQ;AACzB,UAAA,MAAM,IAAI,SAAS,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAA,EAAG;AAAA,YAC7D,IAAA,EAAM,WAAA;AAAA,YACN,IAAA,EAAM,CAAA;AAAA,YACN,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,QACH;AACA,QAAA,MAAM,OAAA,CAAQ,kBAAA,GAAqB,CAAA,IAAK,CAAA,EAAG,KAAK,MAAM,CAAA;AACtD,QAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA;AAChC,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,GAAA,CAAI,IAAI,OAAO,GAAA;AACnB,MAAA,IAAI,CAAC,iBAAiB,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA,IAAK,CAAC,cAAc,MAAA,EAAQ;AAC9D,QAAA,MAAM,MAAM,OAAA,CAAQ,GAAA,EAAK,GAAA,EAAK,OAAO,CAAA;AAAA,MACvC;AACA,MAAA,MAAM,UAAA,GAAa,GAAA,CAAI,MAAA,KAAW,GAAA,GAAM,eAAA,CAAgB,IAAI,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAC,CAAA,GAAI,MAAA;AAE1F,MAAA,MAAM,GAAA,CAAI,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC/B,MAAA,MAAM,OAAA,CAAQ,eAAe,MAAA,GAAY,UAAA,GAAa,MAAO,kBAAA,GAAqB,CAAA,IAAK,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA;AAGrG,MAAA,IAAI,IAAA,CAAK,QAAQ,OAAA,EAAS,MAAM,MAAM,OAAA,CAAQ,GAAA,EAAK,KAAK,OAAO,CAAA;AAAA,IACjE;AAEA,IAAA,MAAM,IAAI,QAAA;AAAA,MACR,gBAAA,YAA4B,KAAA,GAAQ,gBAAA,CAAiB,OAAA,GAAU,sBAAA;AAAA,MAC/D,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA;AAAE,KAC1C;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,MAAM,OAAA,CAAW,MAAA,EAAgB,IAAA,EAAc,IAAA,GAAuB,EAAC,EAAe;AACpF,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,EAAQ,MAAM,IAAI,CAAA;AACzC,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK,OAAO,MAAA;AAC/B,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,OAAQ,IAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAW,MAAA;AAAA,IAC5C,CAAA;AAAA,IAEA,GAAA,CAAI,MAAA,EAAgB,IAAA,EAAc,IAAA,GAAuB,EAAC,EAAsB;AAC9E,MAAA,OAAO,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,IAAI,CAAA;AAAA,IAChC,CAAA;AAAA,IAEA,OAAO,MAAA,CAAO,MAAA,EAAgB,IAAA,EAAc,IAAA,GAA6B,EAAC,EAAG;AAI3E,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,EAAQ,MAAM,IAAA,EAAM,EAAE,sBAAA,EAAwB,IAAA,EAAM,CAAA;AAC3E,MAAA,IAAI,CAAC,IAAI,IAAA,EAAM;AACf,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,IAAc,gBAAA,EAAiB;AACvD,MAAA,MAAM,UAAU,gBAAA,CAAiB,EAAE,WAAA,EAAa,OAAA,CAAQ,aAAa,CAAA;AACrE,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,IAAA,CAAK,SAAA,EAAU;AAClC,MAAA,MAAM,EAAA,GAAK,IAAI,WAAA,EAAY;AAC3B,MAAA,IAAI;AACF,QAAA,WAAS;AACP,UAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,UAAA,IAAI,IAAA,EAAM;AACV,UAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG;AACpE,YAAA,OAAO,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,UAC9B;AAAA,QACF;AACA,QAAA,KAAA,MAAW,SAAS,OAAA,CAAQ,KAAA,IAAS,OAAO,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,MACnE,CAAA,SAAE;AAGA,QAAA,IAAI;AACF,UAAA,MAAM,OAAO,MAAA,EAAO;AAAA,QACtB,CAAA,CAAA,MAAQ;AACN,UAAA,IAAI;AACF,YAAA,MAAA,CAAO,WAAA,EAAY;AAAA,UACrB,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,GACF;AACF;;;AC1RO,IAAM,OAAN,MAA2D;AAAA,EACvD,IAAA;AAAA,EACA,OAAA;AAAA;AAAA,EAEQ,SAAA;AAAA,EAEjB,WAAA,CACE,IAAA,EACA,OAAA,EACA,SAAA,EACA;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,QAAQ,MAAA,CAAO,aAAa,CAAA,GAAsB;AAEhD,IAAA,IAAI,IAAA,GAAgB,IAAA;AACpB,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAqB;AACtC,IAAA,WAAS;AACP,MAAA,OAAO,IAAA,CAAK,IAAA;AACZ,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,EAAA,CAAG,EAAE,CAAA;AAC5B,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,CAAC,IAAA,IAAQ,CAAC,KAAK,SAAA,EAAW;AAC/C,MAAA,MAAM,SACJ,OAAO,IAAA,CAAK,EAAA,KAAO,QAAA,IAAY,OAAO,IAAA,CAAK,EAAA,KAAO,QAAA,GAC9C,IAAA,CAAK,KACL,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GACnB,KAAK,IAAA,GACL,MAAA;AACR,MAAA,IAAI,MAAA,KAAW,MAAA,IAAa,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,EAAG;AAC9C,MAAA,IAAA,CAAK,IAAI,MAAM,CAAA;AACf,MAAA,IAAA,GAAO,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA,IACpC;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,GAAA,GAAoB;AACxB,IAAA,MAAM,MAAW,EAAC;AAClB,IAAA,WAAA,MAAiB,IAAA,IAAQ,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AAC5C,IAAA,OAAO,GAAA;AAAA,EACT;AACF;;;ACjCO,SAAS,OAAO,MAAA,EAA0D;AAC/E,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC3C,IAAA,IAAI,CAAA,KAAM,MAAA,EAAW,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,QAAQ,MAAA,EAAyC;AAC/D,EAAA,MAAM,CAAA,GAAI,IAAI,eAAA,EAAgB;AAC9B,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC3C,IAAA,IAAI,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,IAAA,EAAM;AACnC,IAAA,CAAA,CAAE,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,EACpB;AACA,EAAA,MAAM,CAAA,GAAI,EAAE,QAAA,EAAS;AACrB,EAAA,OAAO,CAAA,GAAI,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,GAAK,EAAA;AACvB;AAOO,SAAS,cAAA,CACd,YACA,OAAA,EACoB;AACpB,EAAA,IAAI,OAAA,KAAY,MAAA,IAAa,UAAA,KAAe,MAAA,IAAa,YAAY,UAAA,EAAY;AAC/E,IAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,EAC1D;AACA,EAAA,OAAO,UAAA,IAAc,OAAA;AACvB;;;ACsBO,SAAS,qBAAqB,IAAA,EAA4B;AAC/D,EAAA,OAAO;AAAA,IACL,MAAA,CAAO,MAAA,GAAS,EAAC,EAAG;AAClB,MAAA,OAAO,IAAA,CAAK,OAAA,CAAe,MAAA,EAAQ,UAAA,EAAY,EAAE,IAAA,EAAM,MAAA,CAAO,EAAE,GAAG,MAAA,EAAQ,CAAA,EAAG,CAAA;AAAA,IAChF,CAAA;AAAA,IAEA,MAAM,IAAA,CAAK,MAAA,GAAS,EAAC,EAAG;AACtB,MAAA,MAAM,SAAA,GAAY,OAAO,CAAA,KAAqD;AAC5E,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAA+C,OAAO,UAAA,EAAY;AAAA,UACvF,KAAA,EAAO,QAAQ,CAAC;AAAA,SACjB,CAAA;AACD,QAAA,OAAO,IAAI,IAAA;AAAA,UAAY,GAAA,EAAK,QAAQ,EAAC;AAAA,UAAG,KAAK,QAAA,IAAY,KAAA;AAAA,UAAO,CAAC,cAAA,KAC/D,SAAA,CAAU,EAAE,GAAG,CAAA,EAAG,gBAAgB;AAAA,SACpC;AAAA,MACF,CAAA;AACA,MAAA,OAAO,SAAA,CAAU,EAAE,GAAG,MAAA,EAAQ,CAAA;AAAA,IAChC,CAAA;AAAA,IAEA,GAAA,CAAI,OAAA,EAAS,MAAA,GAAS,EAAC,EAAG;AACxB,MAAA,OAAO,IAAA,CAAK,OAAA,CAAe,KAAA,EAAO,CAAA,QAAA,EAAW,OAAO,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,OAAA,CAAQ,MAAM,CAAA,EAAG,CAAA;AAAA,IACpF,CAAA;AAAA,IAEA,MAAA,CAAO,SAAS,MAAA,EAAQ;AAEtB,MAAA,MAAM,EAAE,OAAA,EAAS,GAAG,KAAA,EAAM,GAAI,MAAA;AAC9B,MAAA,OAAO,IAAA,CAAK,OAAA,CAAe,OAAA,EAAS,CAAA,QAAA,EAAW,OAAO,CAAA,CAAA,EAAI;AAAA,QACxD,IAAA,EAAM,OAAO,KAAK,CAAA;AAAA,QAClB,KAAA,EAAO,OAAA,CAAQ,EAAE,OAAA,EAAS;AAAA,OAC3B,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,OAAA,EAAS,MAAA,GAAS,EAAC,EAAG;AACjC,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,CAAA,QAAA,EAAW,OAAO,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,OAAA,CAAQ,MAAM,CAAA,EAAG,CAAA;AAAA,IAC/E,CAAA;AAAA,IAEA,cAAc,OAAA,EAAS;AACrB,MAAA,OAAO,IAAA,CAAK,OAAA,CAAuB,MAAA,EAAQ,CAAA,QAAA,EAAW,OAAO,YAAY,EAAE,IAAA,EAAM,EAAC,EAAG,CAAA;AAAA,IACvF,CAAA;AAAA,IAEA,MAAM,eAAe,OAAA,EAAS;AAC5B,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,CAAA,QAAA,EAAW,OAAO,CAAA,QAAA,CAAU,CAAA;AAAA,IAC3D,CAAA;AAAA,IAEA,iBAAiB,OAAA,EAAS;AACxB,MAAA,OAAO,IAAA,CAAK,OAAA,CAAoB,MAAA,EAAQ,CAAA,QAAA,EAAW,OAAO,gBAAgB,EAAE,IAAA,EAAM,EAAC,EAAG,CAAA;AAAA,IACxF,CAAA;AAAA,IAEA,MAAM,kBAAkB,OAAA,EAAS;AAC/B,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,CAAA,QAAA,EAAW,OAAO,CAAA,YAAA,CAAc,CAAA;AAAA,IAC/D;AAAA,GACF;AACF;;;ACrFO,SAAS,mBAAmB,IAAA,EAA0B;AAC3D,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAyB,kBAAA,CAAmB,IAAI,CAAA;AAE9D,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,MAAA,GAAS,EAAC,EAAG;AAGtB,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAA6C,OAAO,QAAA,EAAU;AAAA,QACnF,OAAO,OAAA,CAAQ,EAAE,OAAA,EAAS,MAAA,CAAO,SAAS;AAAA,OAC3C,CAAA;AACD,MAAA,OAAO,IAAI,KAAU,GAAA,EAAK,IAAA,IAAQ,EAAC,EAAG,GAAA,EAAK,YAAY,KAAK,CAAA;AAAA,IAC9D,CAAA;AAAA,IAEA,MAAM,WAAA,CAAY,OAAA,EAAS,MAAA,GAAS,EAAC,EAAG;AAGtC,MAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,KAAK,MAAM,CAAA;AACvC,MAAA,OAAO,IAAA,CAAK,KAAK,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,OAAO,GAAG,SAAA,IAAa,KAAA;AAAA,IAC5D,CAAA;AAAA,IAEA,YAAA,CAAa,SAAS,MAAA,EAAQ;AAC5B,MAAA,OAAO,KAAK,OAAA,CAAiC,MAAA,EAAQ,SAAS,IAAA,CAAK,OAAO,CAAC,CAAA,QAAA,CAAA,EAAY;AAAA,QACrF,IAAA,EAAM,MAAA,CAAO,EAAE,GAAG,QAAQ;AAAA,OAC3B,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,aAAA,CAAc,SAAS,MAAA,EAAQ;AAC7B,MAAA,OAAO,KAAK,OAAA,CAA6B,MAAA,EAAQ,SAAS,IAAA,CAAK,OAAO,CAAC,CAAA,gBAAA,CAAA,EAAoB;AAAA,QACzF,IAAA,EAAM,MAAA,CAAO,EAAE,GAAG,QAAQ;AAAA,OAC3B,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,eAAA,CAAgB,SAAS,MAAA,EAAQ;AAC/B,MAAA,OAAO,KAAK,OAAA,CAA6B,MAAA,EAAQ,SAAS,IAAA,CAAK,OAAO,CAAC,CAAA,iBAAA,CAAA,EAAqB;AAAA,QAC1F,IAAA,EAAM,MAAA,CAAO,EAAE,GAAG,QAAQ;AAAA,OAC3B,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,UAAA,CAAW,OAAA,EAAS,MAAA,GAAS,EAAC,EAAG;AACrC,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,CAAA,MAAA,EAAS,IAAA,CAAK,OAAO,CAAC,CAAA,YAAA,CAAA,EAAgB,EAAE,KAAA,EAAO,OAAA,CAAQ,MAAM,GAAG,CAAA;AAAA,IAC/F;AAAA,GACF;AACF;;;AC/DO,IAAM,YAAN,MAA2D;AAAA,EAC/C,MAAA;AAAA,EACA,YAAA;AAAA,EACT,KAAA,GAA2B,wBAAA;AAAA,EAC3B,aAAuB,EAAC;AAAA,EACxB,gBAA0B,EAAC;AAAA,EAC3B,UAAA,GAA4B,IAAA;AAAA,EAC5B,QAAA,GAAW,KAAA;AAAA,EAEnB,WAAA,CACE,MAAA,EACA,OAAA,GAA4B,EAAC,EAC7B;AACA,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,YAAA,GAAe,QAAQ,YAAA,IAAgB,KAAA;AAAA,EAC9C;AAAA,EAEA,QAAQ,MAAA,CAAO,aAAa,CAAA,GAAqC;AAC/D,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAI;AACF,MAAA,WAAA,MAAiB,KAAA,IAAS,KAAK,MAAA,EAAQ;AACrC,QAAA,IAAA,CAAK,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AACzC,QAAA,IAAI,MAAM,IAAA,KAAS,YAAA,OAAmB,UAAA,CAAW,IAAA,CAAK,MAAM,KAAK,CAAA;AACjE,QAAA,IAAI,KAAA,CAAM,SAAS,WAAA,IAAe,KAAA,CAAM,UAAU,IAAA,EAAM,IAAA,CAAK,aAAa,KAAA,CAAM,KAAA;AAChF,QAAA,IAAI,KAAA,CAAM,SAAS,WAAA,EAAa,IAAA,CAAK,cAAc,IAAA,CAAK,KAAA,CAAM,OAAA,IAAW,KAAA,CAAM,KAAK,CAAA;AACpF,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA,SAAE;AAGA,MAAA,MAAM,KAAK,MAAA,CAAO,MAAA,CAAO,MAAS,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,IAC3D;AACA,IAAA,IAAI,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA,EAAG;AACtD,MAAA,MAAM,IAAI,eAAe,CAAA,YAAA,EAAe,IAAA,CAAK,cAAc,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,QACvE,IAAA,EAAM,YAAA;AAAA,QACN,IAAA,EAAM,CAAA;AAAA,QACN,MAAA,EAAQ,CAAA;AAAA,QACR,OAAA,EAAS,EAAE,MAAA,EAAQ,IAAA,CAAK,aAAA;AAAc,OACvC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA,EAGA,OAAO,QAAA,GAAkD;AACvD,IAAA,WAAA,MAAiB,SAAS,IAAA,EAAM;AAC9B,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc,MAAM,KAAA,CAAM,KAAA;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,IAAA,GAAwB;AAC5B,IAAA,WAAA,MAAiB,KAAK,IAAA,EAAM;AAAA,IAE5B;AACA,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA;AAAA,EAChC;AAAA;AAAA,EAGA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,EAAE,CAAA;AAAA,EAChC;AAAA;AAAA,EAGA,IAAI,KAAA,GAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,MAAA,GAAmB;AACrB,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,aAAa,CAAA;AAAA,EAC/B;AAAA,EAEA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,cAAc,MAAA,GAAS,CAAA;AAAA,EACrC;AAAA;AAAA,EAGA,IAAI,YAAA,GAAkC;AACpC,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA,EAGA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,KAAK,MAAA,CAAO,MAAA,CAAO,MAAS,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AAAA,EAC3D;AACF;;;ACXA,SAAS,MAAM,OAAA,EAAkE;AAC/E,EAAA,OAAO,MAAM,OAAA,CAAQ,OAAO,IAAI,OAAA,GAAW,OAAA,EAAS,QAAQ,EAAC;AAC/D;AAEO,SAAS,mBAAmB,IAAA,EAA0B;AAC3D,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,EAAoB,MAAA,KAA6C;AACnF,IAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAa,GAAG,MAAK,GAAI,CAAA;AAC3C,IAAA,OAAO,MAAA,CAAO,EAAE,GAAG,IAAA,EAAM,WAAA,EAAa,eAAe,WAAA,EAAa,QAAQ,CAAA,EAAG,MAAA,EAAQ,CAAA;AAAA,EACvF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,CAAO,QAAQ,OAAA,EAAS;AACtB,MAAA,OAAO,IAAI,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,QAAQ,OAAA,EAAS,EAAE,IAAA,EAAM,UAAA,CAAW,MAAA,EAAQ,IAAI,CAAA,EAAG,GAAG,OAAO,CAAA;AAAA,IAChG,CAAA;AAAA,IAEA,YAAY,MAAA,EAAQ;AAClB,MAAA,OAAO,IAAA,CAAK,OAAA,CAAa,MAAA,EAAQ,OAAA,EAAS,EAAE,MAAM,UAAA,CAAW,MAAA,EAAQ,KAAK,CAAA,EAAG,CAAA;AAAA,IAC/E,CAAA;AAAA,IAEA,MAAA,CAAO,OAAO,OAAA,EAAS;AACrB,MAAA,OAAO,IAAI,UAAU,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,MAAA,EAAS,KAAK,CAAA,OAAA,CAAS,CAAA,EAAG,OAAO,CAAA;AAAA,IAC3E,CAAA;AAAA,IAEA,KAAA,CAAM,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS;AAC7B,MAAA,OAAO,IAAI,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,MAAA,EAAS,KAAK,CAAA,MAAA,CAAA,EAAU,EAAE,MAAM,EAAE,OAAA,EAAQ,EAAG,GAAG,OAAO,CAAA;AAAA,IAClG,CAAA;AAAA,IAEA,IAAI,KAAA,EAAO;AACT,MAAA,OAAO,IAAA,CAAK,OAAA,CAAa,KAAA,EAAO,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE,CAAA;AAAA,IAClD,CAAA;AAAA,IAEA,MAAM,IAAA,CAAK,MAAA,GAAS,EAAC,EAAG;AACtB,MAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAa,GAAG,MAAK,GAAI,MAAA;AAC3C,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,EAAE,GAAG,IAAA,EAAM,aAAa,cAAA,CAAe,WAAA,EAAa,QAAQ,CAAA,EAAG,CAAA;AAChF,MAAA,MAAM,SAAA,GAAY,OAAO,CAAA,KAAmD;AAC1E,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAA6C,OAAO,OAAA,EAAS;AAAA,UAClF,KAAA,EAAO,QAAQ,CAAC;AAAA,SACjB,CAAA;AACD,QAAA,OAAO,IAAI,IAAA;AAAA,UAAU,GAAA,EAAK,QAAQ,EAAC;AAAA,UAAG,KAAK,QAAA,IAAY,KAAA;AAAA,UAAO,CAAC,cAAA,KAC7D,SAAA,CAAU,EAAE,GAAG,CAAA,EAAG,gBAAgB;AAAA,SACpC;AAAA,MACF,CAAA;AACA,MAAA,OAAO,UAAU,CAAC,CAAA;AAAA,IACpB,CAAA;AAAA,IAEA,OAAO,KAAA,EAAO;AACZ,MAAA,OAAO,IAAA,CAAK,OAAA,CAAa,MAAA,EAAQ,CAAA,MAAA,EAAS,KAAK,WAAW,EAAE,IAAA,EAAM,EAAC,EAAG,CAAA;AAAA,IACxE,CAAA;AAAA,IAEA,OAAA,CAAQ,OAAO,MAAA,EAAQ;AACrB,MAAA,OAAO,IAAA,CAAK,OAAA,CAA2B,MAAA,EAAQ,CAAA,MAAA,EAAS,KAAK,CAAA,QAAA,CAAA,EAAY;AAAA,QACvE,IAAA,EAAM,EAAE,QAAA,EAAU,KAAA,EAAO,GAAG,MAAA;AAAO,OACpC,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAA,CAAO,OAAO,MAAA,EAAQ;AAEpB,MAAA,OAAO,IAAA,CAAK,OAAA,CAA8C,MAAA,EAAQ,CAAA,MAAA,EAAS,KAAK,CAAA,OAAA,CAAA,EAAW;AAAA,QACzF,IAAA,EAAM,EAAE,OAAA,EAAS,MAAA,CAAO,OAAA;AAAQ,OACjC,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,YAAY,KAAA,EAAO;AACvB,MAAA,OAAO,KAAA,CAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,MAAA,EAAS,KAAK,cAAc,CAAC,CAAA;AAAA,IACtE,CAAA;AAAA,IAEA,QAAQ,KAAA,EAAO;AACb,MAAA,OAAO,IAAA,CAAK,OAAA,CAAoB,KAAA,EAAO,CAAA,MAAA,EAAS,KAAK,CAAA,QAAA,CAAU,CAAA;AAAA,IACjE,CAAA;AAAA,IAEA,MAAM,MAAM,KAAA,EAAO;AACjB,MAAA,OAAO,KAAA,CAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,MAAA,EAAS,KAAK,QAAQ,CAAC,CAAA;AAAA,IAChE,CAAA;AAAA,IAEA,MAAM,YAAA,CAAa,KAAA,EAAO,QAAA,EAAU;AAClC,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,CAAA,MAAA,EAAS,KAAK,CAAA,OAAA,EAAU,kBAAA,CAAmB,QAAQ,CAAC,CAAA,SAAA,CAAA,EAAa;AAAA,QACjG,OAAA,EAAS,EAAE,MAAA,EAAQ,0BAAA;AAA2B,OAC/C,CAAA;AACD,MAAA,OAAO,IAAI,WAAA,EAAY;AAAA,IACzB;AAAA,GACF;AACF;;;AChJO,SAAS,uBAAuB,IAAA,EAA8B;AACnE,EAAA,OAAO;AAAA,IACL,GAAA,GAAM;AACJ,MAAA,OAAO,IAAA,CAAK,OAAA,CAAyB,KAAA,EAAO,YAAY,CAAA;AAAA,IAC1D,CAAA;AAAA;AAAA,IAEA,OAAO,MAAA,EAAQ;AACb,MAAA,OAAO,IAAA,CAAK,OAAA,CAAyB,OAAA,EAAS,YAAA,EAAc,EAAE,IAAA,EAAM,MAAA,CAAO,EAAE,GAAG,MAAA,EAAQ,CAAA,EAAG,CAAA;AAAA,IAC7F;AAAA,GACF;AACF;;;ACgEO,SAAS,oBAAoB,IAAA,EAA2B;AAC7D,EAAA,MAAM,QAAA,GAA6B;AAAA,IACjC,MAAA,CAAO,QAAQ,MAAA,EAAQ;AACrB,MAAA,OAAO,IAAA,CAAK,OAAA,CAAiB,MAAA,EAAQ,CAAA,OAAA,EAAU,MAAM,CAAA,UAAA,CAAA,EAAc;AAAA,QACjE,MAAM,MAAA,CAAO,EAAE,UAAU,KAAA,EAAO,GAAG,QAAQ;AAAA,OAC5C,CAAA;AAAA,IACH,CAAA;AAAA,IACA,MAAM,KAAK,MAAA,EAAQ;AACjB,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA;AAAA,QACrB,KAAA;AAAA,QACA,UAAU,MAAM,CAAA,UAAA;AAAA,OAClB;AACA,MAAA,OAAO,MAAM,OAAA,CAAQ,GAAG,IAAI,GAAA,GAAO,GAAA,EAAK,QAAQ,EAAC;AAAA,IACnD,CAAA;AAAA,IACA,MAAA,CAAO,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ;AAChC,MAAA,OAAO,KAAK,OAAA,CAAiB,OAAA,EAAS,UAAU,MAAM,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA,EAAI;AAAA,QAC9E,IAAA,EAAM,MAAA,CAAO,EAAE,GAAG,QAAQ;AAAA,OAC3B,CAAA;AAAA,IACH,CAAA;AAAA,IACA,MAAM,MAAA,CAAO,MAAA,EAAQ,SAAA,EAAW;AAC9B,MAAA,MAAM,KAAK,OAAA,CAAQ,QAAA,EAAU,UAAU,MAAM,CAAA,UAAA,EAAa,SAAS,CAAA,CAAE,CAAA;AAAA,IACvE;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IAEA,OAAO,MAAA,EAAQ;AACb,MAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAa,GAAG,MAAK,GAAI,MAAA;AAC3C,MAAA,OAAO,IAAA,CAAK,OAAA,CAAc,MAAA,EAAQ,SAAA,EAAW;AAAA,QAC3C,IAAA,EAAM,MAAA,CAAO,EAAE,GAAG,IAAA,EAAM,aAAa,cAAA,CAAe,WAAA,EAAa,QAAQ,CAAA,EAAG;AAAA,OAC7E,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,IAAA,CAAK,MAAA,GAAS,EAAC,EAAG;AACtB,MAAA,MAAM,EAAE,QAAA,EAAU,WAAA,EAAa,GAAG,MAAK,GAAI,MAAA;AAC3C,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,EAAE,GAAG,IAAA,EAAM,aAAa,cAAA,CAAe,WAAA,EAAa,QAAQ,CAAA,EAAG,CAAA;AAChF,MAAA,MAAM,SAAA,GAAY,OAAO,CAAA,KAAoD;AAC3E,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAA8C,OAAO,SAAA,EAAW;AAAA,UACrF,KAAA,EAAO,QAAQ,CAAC;AAAA,SACjB,CAAA;AACD,QAAA,OAAO,IAAI,IAAA;AAAA,UAAW,GAAA,EAAK,QAAQ,EAAC;AAAA,UAAG,KAAK,QAAA,IAAY,KAAA;AAAA,UAAO,CAAC,cAAA,KAC9D,SAAA,CAAU,EAAE,GAAG,CAAA,EAAG,gBAAgB;AAAA,SACpC;AAAA,MACF,CAAA;AACA,MAAA,OAAO,UAAU,CAAC,CAAA;AAAA,IACpB,CAAA;AAAA,IAEA,GAAA,CAAI,MAAA,EAAQ,MAAA,GAAS,EAAC,EAAG;AACvB,MAAA,OAAO,IAAA,CAAK,OAAA,CAAc,KAAA,EAAO,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,OAAA,CAAQ,MAAM,CAAA,EAAG,CAAA;AAAA,IACjF,CAAA;AAAA,IAEA,MAAA,CAAO,QAAQ,MAAA,EAAQ;AACrB,MAAA,MAAM,EAAE,OAAA,EAAS,GAAG,KAAA,EAAM,GAAI,MAAA;AAC9B,MAAA,OAAO,IAAA,CAAK,OAAA,CAAc,OAAA,EAAS,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,EAAI;AAAA,QACrD,IAAA,EAAM,OAAO,KAAK,CAAA;AAAA,QAClB,KAAA,EAAO,OAAA,CAAQ,EAAE,OAAA,EAAS;AAAA,OAC3B,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,MAAA,EAAQ,MAAA,GAAS,EAAC,EAAG;AAChC,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,OAAA,CAAQ,MAAM,CAAA,EAAG,CAAA;AAAA,IAC7E,CAAA;AAAA,IAEA,GAAA,CAAI,MAAA,EAAQ,MAAA,GAAS,IAAI,OAAA,EAAS;AAChC,MAAA,OAAO,IAAI,SAAA;AAAA,QACT,KAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,OAAA,EAAU,MAAM,SAAS,EAAE,IAAA,EAAM,MAAA,CAAO,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,GAAG,CAAA;AAAA,QAC1F;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IAEA,QAAA,CAAS,MAAA,EAAQ,MAAA,GAAS,EAAC,EAAG;AAC5B,MAAA,OAAO,IAAA,CAAK,OAAA,CAAa,MAAA,EAAQ,CAAA,OAAA,EAAU,MAAM,CAAA,KAAA,CAAA,EAAS;AAAA,QACxD,MAAM,MAAA,CAAO,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,OAAO;AAAA,OAC1C,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,cAAc,MAAA,EAAQ;AACpB,MAAA,OAAO,IAAA,CAAK,OAAA,CAAuB,MAAA,EAAQ,CAAA,OAAA,EAAU,MAAM,YAAY,EAAE,IAAA,EAAM,EAAC,EAAG,CAAA;AAAA,IACrF,CAAA;AAAA,IAEA,MAAM,eAAe,MAAA,EAAQ;AAC3B,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,CAAA,OAAA,EAAU,MAAM,CAAA,QAAA,CAAU,CAAA;AAAA,IACzD;AAAA,GACF;AACF;;;ACtJO,SAAS,KAAA,CAAS,MAAY,IAAA,EAAgE;AACnG,EAAA,MAAM,SAAA,GAAY,OAAO,CAAA,KAAiD;AACxE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAA2C,OAAO,IAAA,EAAM;AAAA,MAC7E,KAAA,EAAO,QAAQ,CAAC;AAAA,KACjB,CAAA;AACD,IAAA,OAAO,IAAI,IAAA;AAAA,MAAQ,GAAA,EAAK,QAAQ,EAAC;AAAA,MAAG,KAAK,QAAA,IAAY,KAAA;AAAA,MAAO,CAAC,cAAA,KAC3D,SAAA,CAAU,EAAE,GAAG,CAAA,EAAG,gBAAgB;AAAA,KACpC;AAAA,EACF,CAAA;AACA,EAAA,OAAO,SAAA;AACT;AAEO,SAAS,oBAAoB,IAAA,EAA2B;AAC7D,EAAA,OAAO;AAAA,IACL,OAAO,MAAA,EAAQ;AACb,MAAA,OAAO,IAAA,CAAK,OAAA,CAAiB,MAAA,EAAQ,SAAA,EAAW,EAAE,IAAA,EAAM,MAAA,CAAO,EAAE,GAAG,MAAA,EAAQ,CAAA,EAAG,CAAA;AAAA,IACjF,CAAA;AAAA,IAEA,IAAA,CAAK,MAAA,GAAS,EAAC,EAAG;AAChB,MAAA,OAAO,MAAe,IAAA,EAAM,SAAS,EAAE,EAAE,GAAG,QAAQ,CAAA;AAAA,IACtD,CAAA;AAAA,IAEA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,KAAK,OAAA,CAAiB,KAAA,EAAO,UAAU,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA,IAC5E,CAAA;AAAA,IAEA,MAAA,CAAO,QAAQ,MAAA,EAAQ;AACrB,MAAA,OAAO,KAAK,OAAA,CAAiB,OAAA,EAAS,UAAU,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA,EAAI;AAAA,QAC5E,IAAA,EAAM,MAAA,CAAO,EAAE,GAAG,QAAQ;AAAA,OAC3B,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,OAAO,MAAA,EAAQ;AACnB,MAAA,MAAM,KAAK,OAAA,CAAQ,QAAA,EAAU,UAAU,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA,IACrE,CAAA;AAAA,IAEA,KAAA,CAAM,MAAA,GAAS,EAAC,EAAG;AACjB,MAAA,OAAO,MAAoB,IAAA,EAAM,kBAAkB,EAAE,EAAE,GAAG,QAAQ,CAAA;AAAA,IACpE;AAAA,GACF;AACF;ACvDO,SAAS,gBACd,IAAA,EACA,OAAA,EACA,MAAA,EACA,OAAA,GAAkC,EAAC,EAC1B;AACT,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,KAAqC;AAChD,IAAA,IAAI,OAAQ,OAAA,CAAoB,GAAA,KAAQ,UAAA,EAAY;AAClD,MAAA,OAAQ,OAAA,CAAoB,GAAA,CAAI,IAAI,CAAA,IAAK,MAAA;AAAA,IAC3C;AAEA,IAAA,MAAM,QAAQ,MAAA,CAAO,WAAA;AAAA,MACnB,MAAA,CAAO,QAAQ,OAAwD,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM;AAAA,QACvF,EAAE,WAAA,EAAY;AAAA,QACd,MAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI;AAAA,OAC3B;AAAA,KACH;AACA,IAAA,OAAO,MAAM,IAAI,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,IAAI,YAAY,CAAA;AAClC,EAAA,MAAM,SAAA,GAAY,IAAI,mBAAmB,CAAA;AACzC,EAAA,MAAM,SAAA,GAAY,IAAI,mBAAmB,CAAA;AACzC,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,SAAA,IAAa,CAAC,WAAW,OAAO,KAAA;AAEnD,EAAA,IAAI,OAAA,CAAQ,qBAAqB,MAAA,EAAW;AAC1C,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,QAAA,CAAS,SAAA,EAAW,EAAE,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,EAAE,GAAG,OAAO,KAAA;AACjC,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,GAAM,OAAA,CAAQ,GAAA,EAAI,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAI,GAAI,GAAI,CAAA;AACtE,IAAA,IAAI,KAAK,GAAA,CAAI,GAAA,GAAM,EAAE,CAAA,GAAI,OAAA,CAAQ,kBAAkB,OAAO,KAAA;AAAA,EAC5D;AAEA,EAAA,MAAM,GAAA,GAAM,OAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAI,WAAA,EAAY,CAAE,MAAA,CAAO,IAAI,CAAA;AAC3E,EAAA,MAAM,WAAW,CAAA,GAAA,EAAM,UAAA,CAAW,QAAA,EAAU,MAAM,EAAE,MAAA,CAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,GAAG,EAAE,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAC5G,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AAC9B,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AAG/B,EAAA,OAAO,EAAE,MAAA,KAAW,CAAA,CAAE,MAAA,IAAU,eAAA,CAAgB,GAAG,CAAC,CAAA;AACtD;AAoBO,SAAS,uBAAuB,IAAA,EAA8B;AACnE,EAAA,OAAO;AAAA,IACL,eAAA;AAAA,IAEA,OAAO,MAAA,EAAQ;AACb,MAAA,OAAO,IAAA,CAAK,OAAA,CAAiB,MAAA,EAAQ,YAAA,EAAc,EAAE,IAAA,EAAM,MAAA,CAAO,EAAE,GAAG,MAAA,EAAQ,CAAA,EAAG,CAAA;AAAA,IACpF,CAAA;AAAA,IAEA,IAAA,CAAK,MAAA,GAAS,EAAC,EAAG;AAChB,MAAA,OAAO,MAAe,IAAA,EAAM,YAAY,EAAE,EAAE,GAAG,QAAQ,CAAA;AAAA,IACzD,CAAA;AAAA,IAEA,IAAI,SAAA,EAAW;AACb,MAAA,OAAO,IAAA,CAAK,OAAA,CAAiB,KAAA,EAAO,CAAA,UAAA,EAAa,SAAS,CAAA,CAAE,CAAA;AAAA,IAC9D,CAAA;AAAA,IAEA,MAAA,CAAO,WAAW,MAAA,EAAQ;AACxB,MAAA,OAAO,IAAA,CAAK,OAAA,CAAiB,OAAA,EAAS,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA,EAAI,EAAE,IAAA,EAAM,MAAA,CAAO,EAAE,GAAG,MAAA,EAAQ,GAAG,CAAA;AAAA,IACjG,CAAA;AAAA,IAEA,MAAM,OAAO,SAAA,EAAW;AACtB,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,CAAA,UAAA,EAAa,SAAS,CAAA,CAAE,CAAA;AAAA,IACvD,CAAA;AAAA,IAEA,cAAA,CAAe,SAAA,EAAW,MAAA,GAAS,EAAC,EAAG;AACrC,MAAA,OAAO,KAAA,CAAuB,MAAM,CAAA,UAAA,EAAa,SAAS,aAAa,CAAA,CAAE,EAAE,GAAG,MAAA,EAAQ,CAAA;AAAA,IACxF;AAAA,GACF;AACF;;;AClGO,IAAM,iBAAA,GAAoB;AAE1B,IAAM,QAAN,MAAY;AAAA,EACR,IAAA;AAAA,EACA,MAAA;AAAA;AAAA,EAEA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA;AAAA,EAEA,IAAA;AAAA,EAET,WAAA,CAAY,OAAA,GAAyB,EAAC,EAAG;AACvC,IAAA,IAAA,CAAK,IAAA,GAAO,WAAW,OAAO,CAAA;AAC9B,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA;AACxC,IAAA,IAAA,CAAK,MAAA,GAAS,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAA;AAC5C,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,MAAA;AACtB,IAAA,IAAA,CAAK,KAAA,GAAQ,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA;AAC1C,IAAA,IAAA,CAAK,KAAA,GAAQ,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA;AAC1C,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA;AACxC,IAAA,IAAA,CAAK,QAAA,GAAW,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAA;AAChD,IAAA,IAAA,CAAK,QAAA,GAAW,sBAAA,CAAuB,IAAA,CAAK,IAAI,CAAA;AAAA,EAClD;AACF","file":"index.js","sourcesContent":["/**\n * Server-side transport for the m8tes V2 API.\n *\n * SECURITY: this module holds the secret `m8_` API key and must NEVER reach a\n * browser bundle. Client-side rendering of an agent goes through\n * `@m8tes/react` + its server proxy, which keeps the key on the server. The\n * bundle-boundary test asserts `dist/protocol/index.js` contains none of this.\n *\n * Retry semantics mirror the Python SDK (`sdk/py/m8tes/_http.py`) exactly so the\n * two languages behave the same under load:\n * - 3 attempts total, 0.5s initial backoff, doubling\n * - retry only 429/500/502/503/504\n * - retry only idempotent methods (GET/HEAD/PUT/DELETE/OPTIONS). A POST that\n * timed out may already have started a billable run, so re-sending it could\n * double-charge; those fail immediately and let the caller decide.\n * - honour `Retry-After` on 429\n */\n\nimport {\n APIError,\n errorClassForStatus,\n parseErrorEnvelope,\n parseRetryAfter,\n type ErrorFromResponseOptions,\n type M8tesApiError,\n type M8tesStreamEvent,\n type Normalizer,\n createNormalizer,\n createSseDecoder,\n} from \"./protocol/index\";\n\n/** Canonical hosted API. Includes the `/api/v2` prefix, like the Python SDK's DEFAULT_BASE_URL. */\nexport const DEFAULT_BASE_URL = \"https://api.m8tes.ai/api/v2\";\n\nconst MAX_ATTEMPTS = 3;\nconst INITIAL_BACKOFF_MS = 500;\nconst RETRYABLE_STATUS = new Set([429, 500, 502, 503, 504]);\nconst IDEMPOTENT_METHODS = new Set([\"GET\", \"HEAD\", \"PUT\", \"DELETE\", \"OPTIONS\"]);\n\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\nexport interface ClientOptions {\n /** Your `m8_` key. Defaults to `process.env.M8TES_API_KEY`. */\n apiKey?: string;\n /** Override the API host. Must include the `/api/v2` prefix. */\n baseUrl?: string;\n /** Per-request timeout in ms. Default 300_000 (5 min), matching the Python SDK. */\n timeout?: number;\n /** Extra headers on every request. */\n headers?: Record<string, string>;\n /** Pluggable fetch, for tests or a custom agent/proxy. Default `globalThis.fetch`. */\n fetch?: FetchLike;\n /** Reported (not thrown) when a stream frame is unparseable. */\n onMalformed?: (rawPayload: string, error: unknown) => void;\n}\n\nexport interface RequestOptions {\n body?: unknown;\n query?: string;\n signal?: AbortSignal;\n headers?: Record<string, string>;\n}\n\nexport interface StreamRequestOptions extends RequestOptions {\n /** Reuse a normalizer across reconnects so its dedupe ledger persists. */\n normalizer?: Normalizer;\n}\n\n/**\n * Backoff that an abort cuts short. A plain `setTimeout` would keep a caller\n * waiting out the full delay after they cancelled — with `Retry-After: 3600` on\n * a 429, that is an hour of a request that nobody is waiting for any more.\n */\nfunction backoff(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) return Promise.resolve();\n return new Promise((resolve) => {\n const timer = setTimeout(done, ms);\n function done(): void {\n clearTimeout(timer);\n signal?.removeEventListener(\"abort\", done);\n resolve();\n }\n signal?.addEventListener(\"abort\", done, { once: true });\n });\n}\n\nfunction looksLikeHtml(res: Response, text: string): boolean {\n if ((res.headers.get(\"content-type\") ?? \"\").includes(\"text/html\")) return true;\n const head = text.trimStart().slice(0, 9).toLowerCase();\n return head.startsWith(\"<!doctype\") || head.startsWith(\"<html\");\n}\n\n/**\n * Replace the raw body with an actionable message when the response says\n * \"you are not talking to the m8tes API\" — the two mistakes that otherwise\n * surface as a baffling 404 or a wall of HTML. Ported from the Python SDK.\n */\nfunction diagnose(res: Response, text: string, body: unknown, url: string): string | undefined {\n if (looksLikeHtml(res, text)) {\n return (\n `Received an HTML page instead of an API response (HTTP ${res.status}) from ${url}. ` +\n `This usually means the host does not serve the m8tes API; check your baseUrl ` +\n `(the hosted API is ${DEFAULT_BASE_URL}).`\n );\n }\n const isBareNotFound =\n res.status === 404 &&\n body !== null &&\n typeof body === \"object\" &&\n !(\"error\" in body) &&\n (body as { detail?: unknown }).detail === \"Not Found\";\n if (isBareNotFound) {\n return (\n `HTTP 404 from ${url} with no API error envelope — the path matched no route. ` +\n `Check your baseUrl includes the /api/v2 prefix (the hosted API is ${DEFAULT_BASE_URL}).`\n );\n }\n return undefined;\n}\n\nexport interface Http {\n baseUrl: string;\n request<T>(method: string, path: string, opts?: RequestOptions): Promise<T>;\n /** The OK `Response` itself — for binary bodies (file downloads). Retries and\n * typed errors still apply; the caller owns reading the body. */\n raw(method: string, path: string, opts?: RequestOptions): Promise<Response>;\n stream(\n method: string,\n path: string,\n opts?: StreamRequestOptions,\n ): AsyncGenerator<M8tesStreamEvent, void, unknown>;\n}\n\nexport function createHttp(options: ClientOptions = {}): Http {\n // A secret `m8_` key in a browser is readable by every visitor. Bundlers do not\n // stop you importing this entry into client code, so fail loudly the moment it\n // runs there rather than shipping a leaked key quietly. (Edge/worker runtimes\n // have no `document`, so they are unaffected.)\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n throw new Error(\n \"@m8tes/sdk is server-only: it holds your secret m8_ API key, which anyone \" +\n \"could read out of a browser bundle. To render an agent in the browser use \" +\n \"@m8tes/react, which talks to a server proxy that keeps the key on your server. \" +\n \"See https://www.m8tes.ai/docs/embed-a-ui\",\n );\n }\n const apiKey = options.apiKey ?? globalThis.process?.env?.[\"M8TES_API_KEY\"];\n if (!apiKey) {\n throw new Error(\n \"@m8tes/sdk: no API key. Pass `new M8tes({ apiKey })` or set M8TES_API_KEY. \" +\n \"Create a key at https://m8tes.ai/developer.\",\n );\n }\n const baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const timeout = options.timeout ?? 300_000;\n const maybeFetch = options.fetch ?? (globalThis.fetch as FetchLike | undefined);\n if (!maybeFetch) {\n throw new Error(\n \"@m8tes/sdk: no global fetch. Use Node 18+ or pass `fetch` in the client options.\",\n );\n }\n const fetchImpl: FetchLike = maybeFetch; // narrowed; safe to capture in closures\n\n async function toError(\n res: Response,\n url: string,\n errOpts: ErrorFromResponseOptions,\n ): Promise<M8tesApiError> {\n const text = await res.text().catch(() => \"\");\n let body: unknown;\n try {\n body = JSON.parse(text);\n } catch {\n body = undefined;\n }\n const parsed = parseErrorEnvelope(res.status, body, res.headers);\n const message = diagnose(res, text, body, url) ?? (body ? parsed.message : text || parsed.message);\n return new (errorClassForStatus(res.status, errOpts))(message, parsed.fields);\n }\n\n /** One attempt. Layers the client timeout onto any caller-supplied signal. */\n async function attempt(method: string, url: string, opts: RequestOptions): Promise<Response> {\n const headers: Record<string, string> = {\n authorization: `Bearer ${apiKey}`,\n ...options.headers,\n ...opts.headers,\n };\n const init: RequestInit = { method, headers };\n if (opts.body !== undefined) {\n headers[\"content-type\"] = \"application/json\";\n init.body = JSON.stringify(opts.body);\n }\n const timer = AbortSignal.timeout(timeout);\n init.signal = opts.signal ? AbortSignal.any([opts.signal, timer]) : timer;\n return fetchImpl(url, init);\n }\n\n /**\n * Retry loop shared by `request` and `stream`. Returns the OK response; throws\n * a typed error once the attempts are spent or the status is not retryable.\n */\n async function send(\n method: string,\n path: string,\n opts: RequestOptions,\n errOpts: ErrorFromResponseOptions = {},\n ): Promise<Response> {\n const url = `${baseUrl}${path}${opts.query ?? \"\"}`;\n const idempotent = IDEMPOTENT_METHODS.has(method.toUpperCase());\n let lastNetworkError: unknown;\n\n for (let i = 0; i < MAX_ATTEMPTS; i++) {\n const isLast = i === MAX_ATTEMPTS - 1;\n let res: Response;\n try {\n res = await attempt(method, url, opts);\n } catch (e) {\n // A caller-initiated abort is intent, not a fault — never retry or wrap it.\n if (opts.signal?.aborted) throw e;\n lastNetworkError = e;\n if (!idempotent || isLast) {\n throw new APIError(e instanceof Error ? e.message : String(e), {\n type: \"api_error\",\n code: 0,\n status: 0,\n });\n }\n await backoff(INITIAL_BACKOFF_MS * 2 ** i, opts.signal);\n if (opts.signal?.aborted) throw e;\n continue;\n }\n\n if (res.ok) return res;\n if (!RETRYABLE_STATUS.has(res.status) || !idempotent || isLast) {\n throw await toError(res, url, errOpts);\n }\n const retryAfter = res.status === 429 ? parseRetryAfter(res.headers.get(\"retry-after\")) : undefined;\n // Drain the body so the connection can be reused on the next attempt.\n await res.text().catch(() => \"\");\n await backoff(retryAfter !== undefined ? retryAfter * 1000 : INITIAL_BACKOFF_MS * 2 ** i, opts.signal);\n // The caller gave up while we were waiting — surface their abort rather\n // than burning the remaining attempts on a request nobody wants.\n if (opts.signal?.aborted) throw await toError(res, url, errOpts);\n }\n\n throw new APIError(\n lastNetworkError instanceof Error ? lastNetworkError.message : \"Max retries exceeded\",\n { type: \"api_error\", code: 0, status: 0 },\n );\n }\n\n return {\n baseUrl,\n async request<T>(method: string, path: string, opts: RequestOptions = {}): Promise<T> {\n const res = await send(method, path, opts);\n if (res.status === 204) return undefined as T;\n const text = await res.text();\n return (text ? (JSON.parse(text) as T) : (undefined as T));\n },\n\n raw(method: string, path: string, opts: RequestOptions = {}): Promise<Response> {\n return send(method, path, opts);\n },\n\n async *stream(method: string, path: string, opts: StreamRequestOptions = {}) {\n // A 409 on a stream route means \"the run already finished\" — surfaced as\n // RunNotStreamingError so callers fall back to runs.get() instead of\n // treating a completed run as an error.\n const res = await send(method, path, opts, { conflictIsNotStreaming: true });\n if (!res.body) return;\n const normalizer = opts.normalizer ?? createNormalizer();\n const decoder = createSseDecoder({ onMalformed: options.onMalformed });\n const reader = res.body.getReader();\n const td = new TextDecoder();\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n for (const frame of decoder.push(td.decode(value, { stream: true }))) {\n yield* normalizer.push(frame);\n }\n }\n for (const frame of decoder.flush()) yield* normalizer.push(frame);\n } finally {\n // cancel() tears down the connection on an early break (caller stopped\n // iterating); releaseLock() alone would leak a live SSE connection.\n try {\n await reader.cancel();\n } catch {\n try {\n reader.releaseLock();\n } catch {\n /* already released */\n }\n }\n }\n },\n };\n}\n","/**\n * Cursor pagination over the V2 `ListResponse` envelope (`{data, has_more}`).\n *\n * Mirrors the Python SDK's `SyncPage` (`sdk/py/m8tes/_types.py`): a page is the\n * raw response plus an async iterator that walks every remaining page for you.\n *\n * The cursor is the last item's `id`, or its `name` for `/apps` (the one resource\n * keyed by name). Same rule as Python, so both SDKs paginate identically.\n */\n\nexport interface ListResponse<T> {\n data: T[];\n hasMore: boolean;\n}\n\n/** A page of results. `for await (const item of page)` walks ALL pages. */\nexport class Page<T> implements ListResponse<T>, AsyncIterable<T> {\n readonly data: T[];\n readonly hasMore: boolean;\n /** Fetches the next page given a cursor. Absent on a terminal page. */\n private readonly fetchNext?: (startingAfter: string | number) => Promise<Page<T>>;\n\n constructor(\n data: T[],\n hasMore: boolean,\n fetchNext?: (startingAfter: string | number) => Promise<Page<T>>,\n ) {\n this.data = data;\n this.hasMore = hasMore;\n this.fetchNext = fetchNext;\n }\n\n /**\n * Auto-paging: yields every item across every page.\n *\n * Stops if the cursor ever fails to advance. A server that returns the same\n * page again with `has_more: true` — a caching layer, a replica lagging, a bug\n * — would otherwise spin forever, re-yielding the same rows and never\n * returning. Terminating is the only safe response: the caller gets the items\n * it did see rather than a hung process.\n */\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let page: Page<T> = this;\n const seen = new Set<string | number>();\n for (;;) {\n yield* page.data;\n const last = page.data.at(-1) as { id?: unknown; name?: unknown } | undefined;\n if (!page.hasMore || !last || !page.fetchNext) return;\n const cursor =\n typeof last.id === \"number\" || typeof last.id === \"string\"\n ? last.id\n : typeof last.name === \"string\"\n ? last.name\n : undefined;\n if (cursor === undefined || seen.has(cursor)) return;\n seen.add(cursor);\n page = await page.fetchNext(cursor);\n }\n }\n\n /** Every item across every page, collected. Prefer iteration for large sets. */\n async all(): Promise<T[]> {\n const out: T[] = [];\n for await (const item of this) out.push(item);\n return out;\n }\n}\n","/**\n * Request-parameter plumbing. Deliberately tiny.\n *\n * This package speaks the API's own **snake_case** on the wire, in params AND in\n * response types — the same names as `/docs/api-reference` and the Python SDK, and\n * the convention `openai`, `stripe`, and `@anthropic-ai/sdk` all use. So there is\n * no case-mapping layer: request bodies are passed through, and responses are\n * returned exactly as the API sent them.\n *\n * That is not just a style choice. The mapping layer this replaced corrupted\n * caller-defined keys twice: `answers` is keyed by AskUserQuestion TEXT, and\n * `output_schema` carries the caller's own JSON-Schema property names — a key\n * rewriter silently changed both. With no rewriter, that class of bug cannot exist.\n *\n * THE BOUNDARY, precisely — snake_case is for API DATA, camelCase for SDK surfaces:\n *\n * snake_case request params + response bodies `user_id`, `created_at`,\n * (anything that crosses the wire) `output_data`, `enable_memory`\n *\n * camelCase things the SDK owns and the API `new M8tes({ apiKey })`,\n * never sees: client options, method `client.runs.createAsync()`,\n * names, `RunStream`, and the `stream.runId`,\n * normalized events in `event.requestId`\n * `@m8tes/sdk/protocol` (our own\n * format, shared with @m8tes/react's\n * UI — not the REST wire)\n *\n * So: if you read the name in `/docs/api-reference`, it is snake_case here too.\n * If it is a TypeScript construct we invented, it is camelCase.\n */\n\n/** Drop `undefined` so an omitted option is absent rather than an explicit\n * `null` — which the API reads as \"clear this field\". An explicit `null`\n * survives, because that IS how you clear one. */\nexport function toBody(params: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined) out[k] = v;\n }\n return out;\n}\n\n/** Query string from params, skipping `undefined`/`null`. Returns \"\" when empty. */\nexport function toQuery(params: Record<string, unknown>): string {\n const q = new URLSearchParams();\n for (const [k, v] of Object.entries(params)) {\n if (v === undefined || v === null) continue;\n q.set(k, String(v));\n }\n const s = q.toString();\n return s ? `?${s}` : \"\";\n}\n\n/**\n * `agent_id` is the canonical name; `teammate_id` is the permanent legacy alias\n * and the actual wire field. Passing conflicting values is an error rather than a\n * silent pick — mirrors `_resolve_agent_id` in the Python SDK.\n */\nexport function resolveAgentId(\n teammateId: number | undefined,\n agentId: number | undefined,\n): number | undefined {\n if (agentId !== undefined && teammateId !== undefined && agentId !== teammateId) {\n throw new Error(\"Pass agent_id or teammate_id, not both\");\n }\n return teammateId ?? agentId;\n}\n","/**\n * `client.agents` — the reusable agent personas runs execute as.\n *\n * The V2 resource is `agents`; `client.teammates` is a permanent alias because\n * the DB model and older API docs use that name. Mirrors\n * `sdk/py/m8tes/_resources/teammates.py`.\n */\n\nimport type { Http } from \"../http\";\nimport { Page } from \"../pagination\";\nimport { toBody, toQuery } from \"../params\";\nimport type { Agent, EmailInbox, JsonObject, PermissionMode, WebhookToggle } from \"../types\";\n\nexport interface AgentCreateParams {\n name?: string;\n /** The agent's standing instructions: who it is and how it works. */\n instructions?: string;\n /** Tool slugs it may use, e.g. `[\"gmail\", \"slack\"]`. */\n tools?: string[];\n role?: string;\n goals?: string;\n /** Your id for the end-user who owns this agent. */\n user_id?: string;\n metadata?: JsonObject;\n model?: string;\n effort?: string;\n default_permission_mode?: PermissionMode;\n /** Built-in tool toggles. Omit to inherit the platform default. */\n enable_memory?: boolean;\n enable_history?: boolean;\n enable_task_setup_tools?: boolean;\n enable_feedback?: boolean;\n enable_self_improvement?: boolean;\n /** Give the agent its own email inbox on create. */\n email_inbox?: boolean;\n /** Give the agent a webhook trigger URL on create. */\n webhook?: boolean;\n /** Start from a prebuilt persona, e.g. `\"ppc-manager\"`. Template improvements\n * keep flowing in on later reads unless you override the field. */\n from_template?: string;\n}\n\n/**\n * PATCH /agents/{id} accepts exactly these fields (backend `TeammateUpdate`).\n * Create-only fields are NOT here on purpose: sending `webhook` or `email_inbox`\n * to PATCH returns 200 and silently does nothing, which reads as a working call.\n * Use `enableWebhook()` / `enableEmailInbox()` instead.\n *\n * `null` is meaningful: it CLEARS the field back to the platform default.\n */\nexport interface AgentUpdateParams {\n name?: string | null;\n instructions?: string | null;\n tools?: string[] | null;\n role?: string | null;\n goals?: string | null;\n metadata?: JsonObject | null;\n model?: string | null;\n effort?: string | null;\n default_permission_mode?: PermissionMode | null;\n allowed_senders?: string[] | null;\n enable_memory?: boolean | null;\n enable_history?: boolean | null;\n enable_task_setup_tools?: boolean | null;\n enable_feedback?: boolean | null;\n enable_self_improvement?: boolean | null;\n}\n\nexport interface AgentListParams {\n user_id?: string;\n limit?: number;\n starting_after?: number;\n}\n\nexport interface AgentsResource {\n create(params?: AgentCreateParams): Promise<Agent>;\n list(params?: AgentListParams): Promise<Page<Agent>>;\n get(agentId: number, params?: { user_id?: string }): Promise<Agent>;\n update(agentId: number, params: AgentUpdateParams & { user_id?: string }): Promise<Agent>;\n delete(agentId: number, params?: { user_id?: string }): Promise<void>;\n /** Turn on the webhook trigger; returns the URL to POST to. */\n enableWebhook(agentId: number): Promise<WebhookToggle>;\n disableWebhook(agentId: number): Promise<void>;\n /** Turn on the agent's email inbox; returns the address that starts runs. */\n enableEmailInbox(agentId: number): Promise<EmailInbox>;\n disableEmailInbox(agentId: number): Promise<void>;\n}\n\nexport function createAgentsResource(http: Http): AgentsResource {\n return {\n create(params = {}) {\n return http.request<Agent>(\"POST\", \"/agents/\", { body: toBody({ ...params }) });\n },\n\n async list(params = {}) {\n const fetchPage = async (p: Record<string, unknown>): Promise<Page<Agent>> => {\n const res = await http.request<{ data: Agent[]; has_more?: boolean }>(\"GET\", \"/agents/\", {\n query: toQuery(p),\n });\n return new Page<Agent>(res?.data ?? [], res?.has_more ?? false, (starting_after) =>\n fetchPage({ ...p, starting_after }),\n );\n };\n return fetchPage({ ...params });\n },\n\n get(agentId, params = {}) {\n return http.request<Agent>(\"GET\", `/agents/${agentId}`, { query: toQuery(params) });\n },\n\n update(agentId, params) {\n // user_id scopes the request (query param); everything else is the patch.\n const { user_id, ...patch } = params;\n return http.request<Agent>(\"PATCH\", `/agents/${agentId}`, {\n body: toBody(patch),\n query: toQuery({ user_id }),\n });\n },\n\n async delete(agentId, params = {}) {\n await http.request(\"DELETE\", `/agents/${agentId}`, { query: toQuery(params) });\n },\n\n enableWebhook(agentId) {\n return http.request<WebhookToggle>(\"POST\", `/agents/${agentId}/webhook`, { body: {} });\n },\n\n async disableWebhook(agentId) {\n await http.request(\"DELETE\", `/agents/${agentId}/webhook`);\n },\n\n enableEmailInbox(agentId) {\n return http.request<EmailInbox>(\"POST\", `/agents/${agentId}/email-inbox`, { body: {} });\n },\n\n async disableEmailInbox(agentId) {\n await http.request(\"DELETE\", `/agents/${agentId}/email-inbox`);\n },\n };\n}\n","/**\n * `client.apps` — the tools agents act in, and each end-user's connections to them.\n *\n * Connections are scoped: pass `user_id` and the connection belongs to that\n * end-user, so the agent acts with THEIR Gmail/Stripe/Slack rather than yours.\n * In an embed that matters a lot — an account-level connection means a\n * prompt-injected agent could act on your behalf.\n *\n * Mirrors `sdk/py/m8tes/_resources/apps.py`.\n */\n\nimport type { Http } from \"../http\";\nimport { Page } from \"../pagination\";\nimport { toBody, toQuery } from \"../params\";\nimport type { App, AppConnectionInitiation, AppConnectionResult } from \"../types\";\n\nexport interface AppsResource {\n /**\n * Every available tool, with connection status for the given scope.\n *\n * NOT paginated and NOT cursor-able: `GET /apps/` accepts only `user_id` and\n * returns the whole catalog. Sending `limit` or `starting_after` gets a 422\n * (`unknown_query_parameter`) — verified against a live backend, which is also\n * how the same bug was found in the published Python SDK. A `Page` is still\n * returned so `for await` works uniformly across resources.\n */\n list(params?: { user_id?: string }): Promise<Page<App>>;\n /** True when this app is connected for the given scope. */\n isConnected(appName: string, params?: { user_id?: string }): Promise<boolean>;\n /**\n * Start an OAuth connection. Send the user to the returned `authorization_url`,\n * then pass the returned `connection_id` to `connectComplete()`.\n *\n * `redirect_uri` is REQUIRED and is spelled `_uri`, not `_url` — the API 422s\n * on anything else.\n */\n connectOauth(\n appName: string,\n params: { redirect_uri: string; user_id?: string },\n ): Promise<AppConnectionInitiation>;\n /** Connect an app that authenticates with a key instead of OAuth. */\n connectApiKey(\n appName: string,\n params: { api_key: string; user_id?: string },\n ): Promise<AppConnectionResult>;\n /** Finish an OAuth connection after the user returns. `connection_id` comes\n * from `connectOauth()` and is required. */\n connectComplete(\n appName: string,\n params: { connection_id: string; user_id?: string },\n ): Promise<AppConnectionResult>;\n disconnect(appName: string, params?: { user_id?: string }): Promise<void>;\n}\n\nexport function createAppsResource(http: Http): AppsResource {\n const slug = (name: string): string => encodeURIComponent(name);\n\n return {\n async list(params = {}) {\n // Only `user_id` — see the interface comment. No fetchNext: there is no\n // cursor to follow, and inventing one would 422.\n const res = await http.request<{ data: App[]; has_more?: boolean }>(\"GET\", \"/apps/\", {\n query: toQuery({ user_id: params.user_id }),\n });\n return new Page<App>(res?.data ?? [], res?.has_more ?? false);\n },\n\n async isConnected(appName, params = {}) {\n // The list endpoint reports connection state per scope; a single-app filter\n // would be a second contract to keep in sync for no gain.\n const { data } = await this.list(params);\n return data.find((a) => a.name === appName)?.connected ?? false;\n },\n\n connectOauth(appName, params) {\n return http.request<AppConnectionInitiation>(\"POST\", `/apps/${slug(appName)}/connect`, {\n body: toBody({ ...params }),\n });\n },\n\n connectApiKey(appName, params) {\n return http.request<AppConnectionResult>(\"POST\", `/apps/${slug(appName)}/connect/api-key`, {\n body: toBody({ ...params }),\n });\n },\n\n connectComplete(appName, params) {\n return http.request<AppConnectionResult>(\"POST\", `/apps/${slug(appName)}/connect/complete`, {\n body: toBody({ ...params }),\n });\n },\n\n async disconnect(appName, params = {}) {\n await http.request(\"DELETE\", `/apps/${slug(appName)}/connections`, { query: toQuery(params) });\n },\n };\n}\n","/**\n * `RunStream` — the developer-facing view of a streaming run.\n *\n * Mirrors the Python SDK's `RunStream` (`sdk/py/m8tes/_streaming.py`): iterate\n * events, or just await the text. It accumulates as you consume, so after\n * iterating you have `.text`, `.runId`, and `.errors` without a second request.\n *\n * Beyond Python it also exposes `.state` — the full normalized conversation\n * (messages, tool calls, notices) from the shared protocol accumulator. Useful\n * server-side for logging what the agent actually did, not just what it said.\n *\n * Nothing is consumed until you iterate: constructing a RunStream is free, and\n * an un-iterated stream is closed by `close()` without reading the body.\n */\n\nimport {\n RunFailedError,\n accumulate,\n initialConversationState,\n isTerminalEvent,\n type ConversationState,\n type M8tesStreamEvent,\n} from \"./protocol/index\";\n\nexport interface RunStreamOptions {\n /**\n * Throw `RunFailedError` once iteration finishes if the run emitted any error\n * event, so a mid-run failure is never mistaken for a successful empty run.\n * Defaults to false, matching the Python SDK.\n */\n raiseOnError?: boolean;\n}\n\nexport class RunStream implements AsyncIterable<M8tesStreamEvent> {\n private readonly source: AsyncGenerator<M8tesStreamEvent, void, unknown>;\n private readonly raiseOnError: boolean;\n private state: ConversationState = initialConversationState;\n private textChunks: string[] = [];\n private errorMessages: string[] = [];\n private runIdValue: number | null = null;\n private consumed = false;\n\n constructor(\n source: AsyncGenerator<M8tesStreamEvent, void, unknown>,\n options: RunStreamOptions = {},\n ) {\n this.source = source;\n this.raiseOnError = options.raiseOnError ?? false;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<M8tesStreamEvent> {\n if (this.consumed) {\n throw new Error(\n \"RunStream has already been consumed. A stream is single-pass — iterate once, \" +\n \"then read .text / .state / .errors, or call runs.get(runId) to re-read the result.\",\n );\n }\n this.consumed = true;\n try {\n for await (const event of this.source) {\n this.state = accumulate(this.state, event);\n if (event.type === \"text-delta\") this.textChunks.push(event.delta);\n if (event.type === \"run-start\" && event.runId !== null) this.runIdValue = event.runId;\n if (event.type === \"run-error\") this.errorMessages.push(event.message || event.error);\n yield event;\n }\n } finally {\n // Closing the source generator cancels the underlying HTTP response even\n // when the caller breaks out of the loop early.\n await this.source.return(undefined).catch(() => undefined);\n }\n if (this.raiseOnError && this.errorMessages.length > 0) {\n throw new RunFailedError(`Run failed: ${this.errorMessages.join(\"; \")}`, {\n type: \"run_failed\",\n code: 0,\n status: 0,\n details: { errors: this.errorMessages },\n });\n }\n }\n\n /** Yield only the assistant's text, in order. The 90% case for a server. */\n async *iterText(): AsyncGenerator<string, void, unknown> {\n for await (const event of this) {\n if (event.type === \"text-delta\") yield event.delta;\n }\n }\n\n /** Drain the stream and return the full assistant text. */\n async text(): Promise<string> {\n for await (const _ of this) {\n /* accumulate */\n }\n return this.textChunks.join(\"\");\n }\n\n /** Accumulated text so far (complete once iteration finishes). */\n get output(): string {\n return this.textChunks.join(\"\");\n }\n\n /** Run id, available as soon as the first `run-start` event arrives. */\n get runId(): number | null {\n return this.runIdValue;\n }\n\n /** Error messages the run emitted. Check this, or pass `raiseOnError`. */\n get errors(): string[] {\n return [...this.errorMessages];\n }\n\n get hasErrors(): boolean {\n return this.errorMessages.length > 0;\n }\n\n /** Full normalized conversation: messages, tool calls, notices, status. */\n get conversation(): ConversationState {\n return this.state;\n }\n\n /** Close the underlying response without draining it. */\n async close(): Promise<void> {\n await this.source.return(undefined).catch(() => undefined);\n }\n}\n\nexport { isTerminalEvent };\n","/**\n * `client.runs` — start agents, stream what they do, and answer them mid-run.\n *\n * `create()` is the one call most integrations need: it provisions a default\n * agent if the account has none, so a brand-new key can run an agent in one\n * request. Mirrors `sdk/py/m8tes/_resources/runs.py`, field for field.\n */\n\nimport type { Http } from \"../http\";\nimport { Page } from \"../pagination\";\nimport { resolveAgentId, toBody, toQuery } from \"../params\";\nimport { RunStream, type RunStreamOptions } from \"../streaming\";\nimport type {\n JsonObject,\n PermissionMode,\n PermissionRequest,\n Run,\n RunFile,\n RunOutcome,\n} from \"../types\";\n\nexport interface RunCreateParams {\n /** What the agent should do. */\n message: string;\n /** Which agent runs it. Omit to use (or auto-provision) the account default. */\n agent_id?: number;\n /** Permanent legacy alias for `agent_id` — the same wire field. */\n teammate_id?: number;\n /** Your id for the end-user this run belongs to. Isolates their memory, history, and tool connections. */\n user_id?: string;\n /** Tool slugs available for this run. */\n tools?: string[];\n /** One-off system instructions for this run. */\n instructions?: string;\n /** Name a newly auto-created agent. */\n name?: string;\n /** Your own key/value data, echoed back on the Run. */\n metadata?: JsonObject;\n model?: string;\n effort?: string;\n permission_mode?: PermissionMode;\n /** Enable clarifying questions, tool approval, and plan mode. */\n human_in_the_loop?: boolean;\n /** Run-level overrides for the built-in tools. Omit to inherit the agent default. */\n memory?: boolean;\n history?: boolean;\n task_setup_tools?: boolean;\n feedback?: boolean;\n /** Ask for structured output matching this JSON Schema; lands on `run.output_data`. */\n output_schema?: JsonObject;\n /** Give this run's agent an email inbox. */\n email_inbox?: boolean;\n}\n\nexport interface RunListParams {\n user_id?: string;\n agent_id?: number;\n teammate_id?: number;\n task_id?: number;\n status?: string;\n limit?: number;\n starting_after?: number;\n}\n\nexport interface ApproveParams {\n /** From the `approval-request` event, or `runs.permissions()`. */\n request_id: string;\n decision: \"allow\" | \"deny\";\n /**\n * Apply the same decision to matching tool requests for the rest of THIS run.\n * For a policy that outlives the run, use the permissions API instead.\n */\n remember?: boolean;\n}\n\nexport interface AnswerParams {\n /**\n * Question text → the option label you picked. The keys must be the exact\n * `question` strings from the `question` event.\n */\n answers: Record<string, string>;\n}\n\nexport interface RunsResource {\n /** Start a run and stream it. */\n create(params: RunCreateParams, options?: RunStreamOptions): RunStream;\n /** Start a run and return immediately; poll `get()` or use a webhook for the result. */\n createAsync(params: RunCreateParams): Promise<Run>;\n /** Join a run already in flight. Throws `RunNotStreamingError` if it has finished. */\n stream(runId: number, options?: RunStreamOptions): RunStream;\n /** Continue the conversation on an existing run, streaming the reply. */\n reply(runId: number, message: string, options?: RunStreamOptions): RunStream;\n /** GET /runs/{id} takes NO query params — it is already account-scoped, and\n * sending `user_id` returns 422 `unknown_query_parameter`. */\n get(runId: number): Promise<Run>;\n list(params?: RunListParams): Promise<Page<Run>>;\n /** Cancel a running run. Returns the updated Run, like the Python SDK. */\n cancel(runId: number): Promise<Run>;\n /** Approve or deny a pending tool-permission gate. */\n approve(runId: number, params: ApproveParams): Promise<PermissionRequest>;\n /** Answer a pending AskUserQuestion gate, resuming the run. */\n answer(runId: number, params: AnswerParams): Promise<{ status: string; resumed: boolean }>;\n /** Gates currently waiting on a human. */\n permissions(runId: number): Promise<PermissionRequest[]>;\n /** Condensed result: headline, summary, tokens, cost. */\n outcome(runId: number): Promise<RunOutcome>;\n /** Files the agent produced. */\n files(runId: number): Promise<RunFile[]>;\n /** Download one produced file. */\n downloadFile(runId: number, filename: string): Promise<ArrayBuffer>;\n}\n\n/** Unwrap `{data: [...]}` or a bare array — both shapes exist across v2 routes. */\nfunction items(payload: { data?: unknown[] } | unknown[] | undefined): unknown[] {\n return Array.isArray(payload) ? payload : (payload?.data ?? []);\n}\n\nexport function createRunsResource(http: Http): RunsResource {\n const createBody = (p: RunCreateParams, stream: boolean): Record<string, unknown> => {\n const { agent_id, teammate_id, ...rest } = p;\n return toBody({ ...rest, teammate_id: resolveAgentId(teammate_id, agent_id), stream });\n };\n\n return {\n create(params, options) {\n return new RunStream(http.stream(\"POST\", \"/runs\", { body: createBody(params, true) }), options);\n },\n\n createAsync(params) {\n return http.request<Run>(\"POST\", \"/runs\", { body: createBody(params, false) });\n },\n\n stream(runId, options) {\n return new RunStream(http.stream(\"GET\", `/runs/${runId}/stream`), options);\n },\n\n reply(runId, message, options) {\n return new RunStream(http.stream(\"POST\", `/runs/${runId}/reply`, { body: { message } }), options);\n },\n\n get(runId) {\n return http.request<Run>(\"GET\", `/runs/${runId}`);\n },\n\n async list(params = {}) {\n const { agent_id, teammate_id, ...rest } = params;\n const q = toBody({ ...rest, teammate_id: resolveAgentId(teammate_id, agent_id) });\n const fetchPage = async (p: Record<string, unknown>): Promise<Page<Run>> => {\n const res = await http.request<{ data: Run[]; has_more?: boolean }>(\"GET\", \"/runs\", {\n query: toQuery(p),\n });\n return new Page<Run>(res?.data ?? [], res?.has_more ?? false, (starting_after) =>\n fetchPage({ ...p, starting_after }),\n );\n };\n return fetchPage(q);\n },\n\n cancel(runId) {\n return http.request<Run>(\"POST\", `/runs/${runId}/cancel`, { body: {} });\n },\n\n approve(runId, params) {\n return http.request<PermissionRequest>(\"POST\", `/runs/${runId}/approve`, {\n body: { remember: false, ...params },\n });\n },\n\n answer(runId, params) {\n // `answers` is keyed by question text and goes over the wire verbatim.\n return http.request<{ status: string; resumed: boolean }>(\"POST\", `/runs/${runId}/answer`, {\n body: { answers: params.answers },\n });\n },\n\n async permissions(runId) {\n return items(await http.request(\"GET\", `/runs/${runId}/permissions`)) as PermissionRequest[];\n },\n\n outcome(runId) {\n return http.request<RunOutcome>(\"GET\", `/runs/${runId}/outcome`);\n },\n\n async files(runId) {\n return items(await http.request(\"GET\", `/runs/${runId}/files`)) as RunFile[];\n },\n\n async downloadFile(runId, filename) {\n const res = await http.raw(\"GET\", `/runs/${runId}/files/${encodeURIComponent(filename)}/download`, {\n headers: { accept: \"application/octet-stream\" },\n });\n return res.arrayBuffer();\n },\n };\n}\n","/**\n * `client.settings` — account-level configuration.\n *\n * In v0.1 scope for one concrete reason: strict multi-tenant mode\n * (`require_end_user_id`) is ON by default for API accounts, and when it rejects a\n * request the backend's own 422 message says \"turn it off once with\n * client.settings.update(require_end_user_id=False)\". Without this resource a\n * TypeScript developer would follow that instruction into a method that does not\n * exist. Found by running the SDK against a real backend.\n *\n * Mirrors `sdk/py/m8tes/_resources/settings.py`.\n */\n\nimport type { Http } from \"../http\";\nimport { toBody } from \"../params\";\n\nexport interface AccountSettings {\n /** Per-end-user monthly run cap. null = uncapped. */\n per_end_user_run_limit: number | null;\n /** Per-end-user monthly metered spend cap, in cents. null = uncapped. */\n per_end_user_cost_limit_cents: number | null;\n /** Per-end-user run-starts per minute. null = unthrottled. */\n per_end_user_rate_per_minute: number | null;\n /** \"standard\", or \"metadata_only\" for zero data retention. */\n retention_mode: string;\n /** When true, any request that would fall back to the account scope is rejected. */\n require_end_user_id: boolean;\n}\n\nexport interface AccountSettingsUpdateParams {\n /** Pass a number to set, `null` to clear, omit to leave unchanged. */\n per_end_user_run_limit?: number | null;\n per_end_user_cost_limit_cents?: number | null;\n per_end_user_rate_per_minute?: number | null;\n retention_mode?: \"standard\" | \"metadata_only\";\n /**\n * Strict multi-tenant mode. ON by default for API accounts: a request that\n * omits `user_id` and would therefore land in the account-level scope is\n * rejected with a 422 rather than silently assuming the global scope.\n *\n * Set false only if you are building for yourself (single-tenant).\n */\n require_end_user_id?: boolean;\n}\n\nexport interface SettingsResource {\n get(): Promise<AccountSettings>;\n update(params: AccountSettingsUpdateParams): Promise<AccountSettings>;\n}\n\nexport function createSettingsResource(http: Http): SettingsResource {\n return {\n get() {\n return http.request<AccountSettings>(\"GET\", \"/settings/\");\n },\n // `null` must survive (it CLEARS a cap); only `undefined` is dropped.\n update(params) {\n return http.request<AccountSettings>(\"PATCH\", \"/settings/\", { body: toBody({ ...params }) });\n },\n };\n}\n","/**\n * `client.tasks` — reusable work definitions, plus the triggers that fire them.\n *\n * A task is \"what to do\"; a trigger is \"when\". `client.tasks.triggers` covers all\n * four kinds (schedule, webhook, email, app event). Mirrors\n * `sdk/py/m8tes/_resources/tasks.py`.\n */\n\nimport type { Http } from \"../http\";\nimport { Page } from \"../pagination\";\nimport { resolveAgentId, toBody, toQuery } from \"../params\";\nimport { RunStream, type RunStreamOptions } from \"../streaming\";\nimport type { JsonObject, Run, Task, Trigger, TriggerType, WebhookToggle } from \"../types\";\n\n/** A task must belong to an agent: `POST /tasks/` requires `teammate_id`, so the\n * type requires one of the two spellings rather than letting you discover it as\n * a 422. */\ntype TaskOwner = { agent_id: number; teammate_id?: never } | { teammate_id: number; agent_id?: never };\n\nexport type TaskCreateParams = TaskOwner & TaskCreateFields;\n\nexport interface TaskCreateFields {\n /** What the agent should do each time this task runs. */\n instructions: string;\n name?: string;\n tools?: string[];\n /** What a good result looks like. */\n expected_output?: string;\n goals?: string;\n user_id?: string;\n /** Email the account owner when a run finishes. Default true. */\n email_notifications?: boolean;\n /** Create a webhook trigger alongside the task. */\n webhook?: boolean;\n /** Cron expression, e.g. `\"0 9 * * 1-5\"`. Creates a schedule trigger. */\n schedule?: string;\n /** IANA timezone for `schedule`. Default \"UTC\". */\n schedule_timezone?: string;\n enable_memory?: boolean;\n enable_history?: boolean;\n enable_task_setup_tools?: boolean;\n enable_feedback?: boolean;\n /** Accumulate self-improvement lessons across this task's runs. Default true. */\n enable_lessons?: boolean;\n}\n\n/**\n * PATCH /tasks/{id} accepts exactly these fields (backend `DevTaskUpdate`).\n * `schedule`, `schedule_timezone`, `webhook`, and the agent id are create-only:\n * sending them to PATCH returns 200 and changes nothing. Change a schedule via\n * `tasks.triggers.update()`, and a webhook via `enableWebhook()`.\n *\n * `null` is meaningful: it CLEARS the field.\n */\nexport interface TaskUpdateParams {\n name?: string | null;\n instructions?: string | null;\n tools?: string[] | null;\n expected_output?: string | null;\n goals?: string | null;\n email_notifications?: boolean | null;\n enable_memory?: boolean | null;\n enable_history?: boolean | null;\n enable_task_setup_tools?: boolean | null;\n enable_feedback?: boolean | null;\n enable_lessons?: boolean | null;\n}\n\nexport interface TaskListParams {\n user_id?: string;\n agent_id?: number;\n teammate_id?: number;\n status?: string;\n limit?: number;\n starting_after?: number;\n}\n\nexport interface TriggerCreateParams {\n type: TriggerType | string;\n /** Schedule triggers: a cron expression. */\n cron?: string;\n /** Schedule triggers: a plain interval instead of cron. */\n interval_seconds?: number;\n /** IANA timezone. Default \"UTC\". */\n timezone?: string;\n /** App-event triggers: the app slug, e.g. `\"github\"`. */\n app?: string;\n /** App-event triggers: the event name, e.g. `\"pull_request_opened\"`. */\n trigger_name?: string;\n trigger_config?: JsonObject;\n user_id?: string;\n /** Email triggers: only these senders may start a run. */\n allowed_senders?: string[];\n}\n\nexport interface TriggersResource {\n create(taskId: number, params: TriggerCreateParams): Promise<Trigger>;\n list(taskId: number): Promise<Trigger[]>;\n /** Only the schedule shape and the enabled flag are mutable — a trigger's\n * `type`/`app`/`trigger_name` are fixed at creation and are silently ignored\n * on PATCH. Delete and recreate to change those. */\n update(\n taskId: number,\n triggerId: number,\n params: { cron?: string; interval_seconds?: number; timezone?: string; enabled?: boolean },\n ): Promise<Trigger>;\n delete(taskId: number, triggerId: number): Promise<void>;\n}\n\nexport interface TasksResource {\n triggers: TriggersResource;\n create(params: TaskCreateParams): Promise<Task>;\n list(params?: TaskListParams): Promise<Page<Task>>;\n get(taskId: number, params?: { user_id?: string }): Promise<Task>;\n update(taskId: number, params: TaskUpdateParams & { user_id?: string }): Promise<Task>;\n delete(taskId: number, params?: { user_id?: string }): Promise<void>;\n /** Run the task now, streaming it. */\n run(taskId: number, params?: { user_id?: string }, options?: RunStreamOptions): RunStream;\n /** Run the task now without streaming; poll `runs.get()` for the result. */\n runAsync(taskId: number, params?: { user_id?: string }): Promise<Run>;\n enableWebhook(taskId: number): Promise<WebhookToggle>;\n disableWebhook(taskId: number): Promise<void>;\n}\n\nexport function createTasksResource(http: Http): TasksResource {\n const triggers: TriggersResource = {\n create(taskId, params) {\n return http.request<Trigger>(\"POST\", `/tasks/${taskId}/triggers/`, {\n body: toBody({ timezone: \"UTC\", ...params }),\n });\n },\n async list(taskId) {\n const res = await http.request<{ data?: Trigger[] } | Trigger[]>(\n \"GET\",\n `/tasks/${taskId}/triggers/`,\n );\n return Array.isArray(res) ? res : (res?.data ?? []);\n },\n update(taskId, triggerId, params) {\n return http.request<Trigger>(\"PATCH\", `/tasks/${taskId}/triggers/${triggerId}`, {\n body: toBody({ ...params }),\n });\n },\n async delete(taskId, triggerId) {\n await http.request(\"DELETE\", `/tasks/${taskId}/triggers/${triggerId}`);\n },\n };\n\n return {\n triggers,\n\n create(params) {\n const { agent_id, teammate_id, ...rest } = params;\n return http.request<Task>(\"POST\", \"/tasks/\", {\n body: toBody({ ...rest, teammate_id: resolveAgentId(teammate_id, agent_id) }),\n });\n },\n\n async list(params = {}) {\n const { agent_id, teammate_id, ...rest } = params;\n const q = toBody({ ...rest, teammate_id: resolveAgentId(teammate_id, agent_id) });\n const fetchPage = async (p: Record<string, unknown>): Promise<Page<Task>> => {\n const res = await http.request<{ data: Task[]; has_more?: boolean }>(\"GET\", \"/tasks/\", {\n query: toQuery(p),\n });\n return new Page<Task>(res?.data ?? [], res?.has_more ?? false, (starting_after) =>\n fetchPage({ ...p, starting_after }),\n );\n };\n return fetchPage(q);\n },\n\n get(taskId, params = {}) {\n return http.request<Task>(\"GET\", `/tasks/${taskId}`, { query: toQuery(params) });\n },\n\n update(taskId, params) {\n const { user_id, ...patch } = params;\n return http.request<Task>(\"PATCH\", `/tasks/${taskId}`, {\n body: toBody(patch),\n query: toQuery({ user_id }),\n });\n },\n\n async delete(taskId, params = {}) {\n await http.request(\"DELETE\", `/tasks/${taskId}`, { query: toQuery(params) });\n },\n\n run(taskId, params = {}, options) {\n return new RunStream(\n http.stream(\"POST\", `/tasks/${taskId}/runs`, { body: toBody({ ...params, stream: true }) }),\n options,\n );\n },\n\n runAsync(taskId, params = {}) {\n return http.request<Run>(\"POST\", `/tasks/${taskId}/runs`, {\n body: toBody({ ...params, stream: false }),\n });\n },\n\n enableWebhook(taskId) {\n return http.request<WebhookToggle>(\"POST\", `/tasks/${taskId}/webhook`, { body: {} });\n },\n\n async disableWebhook(taskId) {\n await http.request(\"DELETE\", `/tasks/${taskId}/webhook`);\n },\n };\n}\n","/**\n * `client.users` — your end-users, the multi-tenancy boundary.\n *\n * `user_id` is YOUR identifier for a customer; the platform stores it as\n * `end_user_id` and isolates that person's memory, run history, and tool\n * connections strictly. There is no fallback to account-level data.\n *\n * Registering an end-user here is optional — passing `user_id` on a run creates\n * them implicitly. Do it explicitly when you want per-user budgets and rate\n * limits. Mirrors `sdk/py/m8tes/_resources/users.py`.\n */\n\nimport type { Http } from \"../http\";\nimport { Page } from \"../pagination\";\nimport { toBody, toQuery } from \"../params\";\nimport type { EndUser, EndUserUsage, JsonObject } from \"../types\";\n\nexport interface EndUserCreateParams {\n /** Your id for this person. Any stable string. */\n user_id: string;\n name?: string;\n email?: string;\n company?: string;\n metadata?: JsonObject;\n /** Cap this end-user's runs per billing period. */\n run_limit?: number;\n /** Cap this end-user's spend per billing period, in cents. */\n cost_limit_cents?: number;\n /** Cap this end-user's runs per minute. Exceeding it returns 429. */\n rate_per_minute?: number;\n}\n\n/** `null` CLEARS a cap (inherit the account default); omitting leaves it alone. */\nexport interface EndUserUpdateParams {\n name?: string | null;\n email?: string | null;\n company?: string | null;\n metadata?: JsonObject | null;\n run_limit?: number | null;\n cost_limit_cents?: number | null;\n rate_per_minute?: number | null;\n}\n\nexport interface PageParams {\n limit?: number;\n starting_after?: number;\n}\n\nexport interface UsersResource {\n create(params: EndUserCreateParams): Promise<EndUser>;\n list(params?: PageParams): Promise<Page<EndUser>>;\n get(userId: string): Promise<EndUser>;\n update(userId: string, params: EndUserUpdateParams): Promise<EndUser>;\n delete(userId: string): Promise<void>;\n /** Per-end-user token, run, and cost usage against their limits. */\n usage(params?: PageParams & { user_id?: string }): Promise<Page<EndUserUsage>>;\n}\n\n/** Shared cursor-paging helper: the envelope is identical across list routes. */\nexport function pager<T>(http: Http, path: string): (p: Record<string, unknown>) => Promise<Page<T>> {\n const fetchPage = async (p: Record<string, unknown>): Promise<Page<T>> => {\n const res = await http.request<{ data: T[]; has_more?: boolean }>(\"GET\", path, {\n query: toQuery(p),\n });\n return new Page<T>(res?.data ?? [], res?.has_more ?? false, (starting_after) =>\n fetchPage({ ...p, starting_after }),\n );\n };\n return fetchPage;\n}\n\nexport function createUsersResource(http: Http): UsersResource {\n return {\n create(params) {\n return http.request<EndUser>(\"POST\", \"/users/\", { body: toBody({ ...params }) });\n },\n\n list(params = {}) {\n return pager<EndUser>(http, \"/users/\")({ ...params });\n },\n\n get(userId) {\n return http.request<EndUser>(\"GET\", `/users/${encodeURIComponent(userId)}`);\n },\n\n update(userId, params) {\n return http.request<EndUser>(\"PATCH\", `/users/${encodeURIComponent(userId)}`, {\n body: toBody({ ...params }),\n });\n },\n\n async delete(userId) {\n await http.request(\"DELETE\", `/users/${encodeURIComponent(userId)}`);\n },\n\n usage(params = {}) {\n return pager<EndUserUsage>(http, \"/usage/end-users\")({ ...params });\n },\n };\n}\n","/**\n * `client.webhooks` — outbound event delivery, plus signature verification.\n *\n * `verifySignature` is the one function every webhook receiver needs, so it is\n * also exported standalone from the package root: verifying does not require a\n * client or an API key. Mirrors `sdk/py/m8tes/_resources/webhooks.py` byte for\n * byte on the signing scheme, so a payload verified by one SDK verifies in the\n * other.\n *\n * Scheme: HMAC-SHA256 over `\"{webhook-id}.{webhook-timestamp}.{raw body}\"`, hex,\n * prefixed `v1=`, compared in constant time.\n */\n\nimport { createHmac, timingSafeEqual } from \"node:crypto\";\nimport type { Http } from \"../http\";\nimport type { Page } from \"../pagination\";\nimport { toBody } from \"../params\";\nimport { pager } from \"./users\";\nimport type { Webhook, WebhookDelivery } from \"../types\";\n\nexport interface VerifySignatureOptions {\n /**\n * Reject signatures whose timestamp is older (or newer) than this many\n * seconds — replay protection. Omit to skip the check. 300 is a good default\n * for a public endpoint.\n */\n toleranceSeconds?: number;\n /** Injectable clock, for tests. Seconds since epoch. */\n now?: () => number;\n}\n\n/**\n * Verify a m8tes webhook signature.\n *\n * Pass the RAW request body — a parsed-and-restringified object will not match,\n * because JSON.stringify does not preserve key order or spacing.\n *\n * ```ts\n * const raw = await req.text();\n * if (!verifySignature(raw, Object.fromEntries(req.headers), secret, { toleranceSeconds: 300 })) {\n * return new Response(\"bad signature\", { status: 401 });\n * }\n * ```\n */\nexport function verifySignature(\n body: string | Uint8Array,\n headers: Record<string, string | string[] | undefined> | Headers,\n secret: string,\n options: VerifySignatureOptions = {},\n): boolean {\n const get = (name: string): string | undefined => {\n if (typeof (headers as Headers).get === \"function\") {\n return (headers as Headers).get(name) ?? undefined;\n }\n // Header names are case-insensitive on the wire; normalize before lookup.\n const lower = Object.fromEntries(\n Object.entries(headers as Record<string, string | string[] | undefined>).map(([k, v]) => [\n k.toLowerCase(),\n Array.isArray(v) ? v[0] : v,\n ]),\n );\n return lower[name];\n };\n\n const webhookId = get(\"webhook-id\");\n const timestamp = get(\"webhook-timestamp\");\n const signature = get(\"webhook-signature\");\n if (!webhookId || !timestamp || !signature) return false;\n\n if (options.toleranceSeconds !== undefined) {\n const ts = Number.parseInt(timestamp, 10);\n if (!Number.isFinite(ts)) return false;\n const now = options.now ? options.now() : Math.floor(Date.now() / 1000);\n if (Math.abs(now - ts) > options.toleranceSeconds) return false;\n }\n\n const raw = typeof body === \"string\" ? body : new TextDecoder().decode(body);\n const expected = `v1=${createHmac(\"sha256\", secret).update(`${webhookId}.${timestamp}.${raw}`).digest(\"hex\")}`;\n const a = Buffer.from(expected);\n const b = Buffer.from(signature);\n // timingSafeEqual throws on length mismatch; a length difference is already a\n // mismatch, so short-circuit rather than leak it as an exception.\n return a.length === b.length && timingSafeEqual(a, b);\n}\n\nexport interface WebhooksResource {\n verifySignature: typeof verifySignature;\n /** Register an endpoint. The signing secret is returned ONLY here — store it. */\n create(params: { url: string; events?: string[] }): Promise<Webhook>;\n list(params?: { limit?: number; starting_after?: number }): Promise<Page<Webhook>>;\n get(webhookId: number): Promise<Webhook>;\n update(\n webhookId: number,\n params: { url?: string; events?: string[]; active?: boolean },\n ): Promise<Webhook>;\n delete(webhookId: number): Promise<void>;\n /** Delivery attempts, for debugging a receiver that is not getting events. */\n listDeliveries(\n webhookId: number,\n params?: { limit?: number; starting_after?: number },\n ): Promise<Page<WebhookDelivery>>;\n}\n\nexport function createWebhooksResource(http: Http): WebhooksResource {\n return {\n verifySignature,\n\n create(params) {\n return http.request<Webhook>(\"POST\", \"/webhooks/\", { body: toBody({ ...params }) });\n },\n\n list(params = {}) {\n return pager<Webhook>(http, \"/webhooks/\")({ ...params });\n },\n\n get(webhookId) {\n return http.request<Webhook>(\"GET\", `/webhooks/${webhookId}`);\n },\n\n update(webhookId, params) {\n return http.request<Webhook>(\"PATCH\", `/webhooks/${webhookId}`, { body: toBody({ ...params }) });\n },\n\n async delete(webhookId) {\n await http.request(\"DELETE\", `/webhooks/${webhookId}`);\n },\n\n listDeliveries(webhookId, params = {}) {\n return pager<WebhookDelivery>(http, `/webhooks/${webhookId}/deliveries`)({ ...params });\n },\n };\n}\n","/**\n * `@m8tes/sdk` — TypeScript client for the m8tes API.\n *\n * ```ts\n * import { M8tes } from \"@m8tes/sdk\";\n *\n * const client = new M8tes(); // reads M8TES_API_KEY\n *\n * const run = client.runs.create({\n * message: \"A customer asked to cancel. Draft a warm reply offering to pause instead.\",\n * userId: \"customer_42\", // isolates this end-user's memory, history, and connections\n * });\n * for await (const chunk of run.iterText()) process.stdout.write(chunk);\n * ```\n *\n * SECURITY: this entry point holds your secret `m8_` key and is server-only.\n * Never import it from client-side code. To render an agent in a browser, use\n * `@m8tes/react` plus its server proxy, which keeps the key on your server.\n *\n * The streaming wire protocol lives in `@m8tes/sdk/protocol` (browser-safe, no\n * auth) so this package and `@m8tes/react` share one implementation.\n */\n\nimport { createHttp, DEFAULT_BASE_URL, type ClientOptions, type Http } from \"./http\";\nimport { createAgentsResource, type AgentsResource } from \"./resources/agents\";\nimport { createAppsResource, type AppsResource } from \"./resources/apps\";\nimport { createRunsResource, type RunsResource } from \"./resources/runs\";\nimport { createSettingsResource, type SettingsResource } from \"./resources/settings\";\nimport { createTasksResource, type TasksResource } from \"./resources/tasks\";\nimport { createUsersResource, type UsersResource } from \"./resources/users\";\nimport { createWebhooksResource, verifySignature, type WebhooksResource } from \"./resources/webhooks\";\n\n/** Kept in lockstep with package.json \"version\" — guarded by test/version.test.ts. */\nexport const M8TES_SDK_VERSION = \"0.1.0-alpha.1\";\n\nexport class M8tes {\n readonly runs: RunsResource;\n readonly agents: AgentsResource;\n /** Permanent alias for `agents` — the DB model and older docs say \"teammate\". */\n readonly teammates: AgentsResource;\n readonly tasks: TasksResource;\n readonly users: UsersResource;\n readonly apps: AppsResource;\n readonly webhooks: WebhooksResource;\n readonly settings: SettingsResource;\n /** The underlying transport. Use it to call an endpoint this version does not wrap yet. */\n readonly http: Http;\n\n constructor(options: ClientOptions = {}) {\n this.http = createHttp(options);\n this.runs = createRunsResource(this.http);\n this.agents = createAgentsResource(this.http);\n this.teammates = this.agents;\n this.tasks = createTasksResource(this.http);\n this.users = createUsersResource(this.http);\n this.apps = createAppsResource(this.http);\n this.webhooks = createWebhooksResource(this.http);\n this.settings = createSettingsResource(this.http);\n }\n}\n\n// No default export on purpose: mixing default + named exports makes the CJS\n// build ambiguous (`require(...)` consumers would need `.default`). The one\n// documented form is `import { M8tes } from \"@m8tes/sdk\"`.\n\n// Webhook verification needs no client and no key — import it directly in a\n// route handler that only receives events.\nexport { verifySignature, type VerifySignatureOptions } from \"./resources/webhooks\";\n\n// Transport + client options.\nexport { createHttp, DEFAULT_BASE_URL, type ClientOptions, type FetchLike, type Http } from \"./http\";\n\n// Streaming + pagination.\nexport { RunStream, type RunStreamOptions } from \"./streaming\";\nexport { Page, type ListResponse } from \"./pagination\";\n\n// Resource params + shapes.\nexport type {\n AgentsResource,\n AgentCreateParams,\n AgentUpdateParams,\n AgentListParams,\n} from \"./resources/agents\";\nexport type { AppsResource } from \"./resources/apps\";\nexport type { RunsResource, RunCreateParams, RunListParams } from \"./resources/runs\";\nexport type {\n TasksResource,\n TriggersResource,\n TaskCreateParams,\n TaskUpdateParams,\n TaskListParams,\n TriggerCreateParams,\n} from \"./resources/tasks\";\nexport type {\n UsersResource,\n EndUserCreateParams,\n EndUserUpdateParams,\n PageParams,\n} from \"./resources/users\";\nexport type { WebhooksResource } from \"./resources/webhooks\";\nexport type {\n SettingsResource,\n AccountSettings,\n AccountSettingsUpdateParams,\n} from \"./resources/settings\";\nexport * from \"./types\";\n\n// The full wire protocol + typed errors, re-exported so a single import of\n// `@m8tes/sdk` is enough for the common case.\nexport * from \"./protocol/index\";\n"]}
|