codai-sdk 0.8.0 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/http.ts","../src/resources/account.ts","../src/resources/agents.ts","../src/resources/audio.ts","../src/resources/chat.ts","../src/resources/devices.ts","../src/resources/embeddings.ts","../src/resources/environments.ts","../src/resources/health.ts","../src/resources/hosts.ts","../src/resources/messages.ts","../src/resources/models.ts","../src/resources/orgs.ts","../src/resources/projects.ts","../src/resources/resolve.ts","../src/resources/responses.ts","../src/resources/sessions.ts","../src/resources/system-one.ts","../src/resources/tasks.ts","../src/resources/triggers.ts","../src/resources/tokens.ts","../src/resources/tools.ts","../src/operations.ts","../src/index.ts"],"names":["enc"],"mappings":";AAWO,IAAM,UAAA,GAAN,cAAyB,KAAA,CAAM;AAAA,EAQpC,YACE,OAAA,EACgB,MAAA,EACA,IAAA,EAChB,IAAA,GAA2F,EAAC,EAC5F;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAJG,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAIhB,IAAA,IAAA,CAAK,IAAA,GAAO,YAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,IAAA,IAAQ,WAAA,CAAY,IAAI,CAAA;AACzC,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,IAAA;AACnC,IAAA,IAAA,CAAK,UAAA,GAAa,KAAK,UAAA,IAAc,IAAA;AAAA,EACvC;AAAA,EATkB,MAAA;AAAA,EACA,IAAA;AAAA;AAAA,EATT,IAAA;AAAA;AAAA,EAEA,SAAA;AAAA;AAAA,EAEA,UAAA;AAcX;AAEA,SAAS,YAAY,IAAA,EAAiC;AACpD,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,IAAA,MAAM,MAAO,IAAA,CAAwC,KAAA;AACrD,IAAA,IAAI,OAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,OAAO,IAAI,IAAA,KAAS,QAAA;AACxD,MAAA,OAAO,GAAA,CAAI,IAAA;AAAA,EACf;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,eAAe,IAAA,EAA8B;AACpD,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,IAAA,MAAM,MAAO,IAAA,CAA2C,KAAA;AACxD,IAAA,IAAI,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,IAAY,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,EAAU,OAAO,GAAA,CAAI,OAAA;AAAA,EACpF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,IAAM,SAAA,uBAAgB,GAAA,CAAI,CAAC,KAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AA8FnD,IAAM,iBAAA,GAAsF;AAAA,EAC1F,SAAA,EAAW,oBAAA;AAAA,EACX,SAAA,EAAW,cAAA;AAAA,EACX,MAAA,EAAQ,gBAAA;AAAA,EACR,QAAA,EAAU,kBAAA;AAAA,EACV,cAAA,EAAgB,yBAAA;AAAA,EAChB,WAAA,EAAa,sBAAA;AAAA,EACb,KAAA,EAAO,eAAA;AAAA,EACP,MAAA,EAAQ,iBAAA;AAAA,EACR,MAAA,EAAQ,iBAAA;AAAA,EACR,WAAA,EAAa,sBAAA;AAAA,EACb,YAAA,EAAc,uBAAA;AAAA,EACd,MAAA,EAAQ,gBAAA;AAAA,EACR,SAAA,EAAW,mBAAA;AAAA,EACX,QAAA,EAAU,mBAAA;AAAA,EACV,UAAA,EAAY,qBAAA;AAAA,EACZ,UAAA,EAAY,qBAAA;AAAA,EACZ,IAAA,EAAM,cAAA;AAAA,EACN,OAAA,EAAS,kBAAA;AAAA,EACT,gBAAA,EAAkB,2BAAA;AAAA,EAClB,IAAA,EAAM,cAAA;AAAA,EACN,WAAA,EAAa,sBAAA;AAAA,EACb,WAAA,EAAa,qBAAA;AAAA,EACb,OAAA,EAAS,iBAAA;AAAA,EACT,MAAA,EAAQ,iBAAA;AAAA,EACR,WAAA,EAAa,uBAAA;AAAA,EACb,OAAA,EAAS,iBAAA;AAAA,EACT,UAAA,EAAY,qBAAA;AAAA,EACZ,IAAA,EAAM,cAAA;AAAA,EACN,SAAA,EAAW,mBAAA;AAAA,EACX,OAAA,EAAS,iBAAA;AAAA,EACT,SAAA,EAAW,mBAAA;AAAA,EACX,UAAA,EAAY,oBAAA;AAAA,EACZ,QAAA,EAAU,kBAAA;AAAA,EACV,QAAA,EAAU,kBAAA;AAAA,EACV,UAAA,EAAY,qBAAA;AAAA,EACZ,KAAA,EAAO,eAAA;AAAA,EACP,MAAA,EAAQ,gBAAA;AAAA,EACR,UAAA,EAAY,qBAAA;AAAA,EACZ,cAAA,EAAgB,yBAAA;AAAA,EAChB,SAAA,EAAW,oBAAA;AAAA,EACX,UAAA,EAAY;AACd,CAAA;AAGO,SAAS,iBAAiB,GAAA,EAAiE;AAChG,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,IAAI,CAAC,KAAK,OAAO,GAAA;AACjB,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,iBAAiB,CAAA,EAEzD;AACD,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAG,CAAA;AACrB,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AAC3C,IAAA,IAAI,OAAO,KAAA,KAAU,SAAA,MAAe,MAAM,CAAA,GAAI,QAAQ,GAAA,GAAM,GAAA;AAAA,SAAA,IACnD,QAAQ,SAAA,IAAa,KAAA,KAAU,MAAA,EAAQ,GAAA,CAAI,MAAM,CAAA,GAAI,GAAA;AAAA,SACzD,GAAA,CAAI,MAAM,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA;AAAA,EACjC;AACA,EAAA,IAAI,IAAI,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,IAAI,OAAO,CAAA;AAC/C,EAAA,OAAO,GAAA;AACT;AAgCO,IAAM,aAAN,MAAiB;AAAA,EACb,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACQ,SAAA;AAAA,EAEjB,YAAY,IAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC7C,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AACtB,IAAA,IAAA,CAAK,aAAa,IAAA,CAAK,UAAA;AACvB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,EAAC;AAClC,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,KAAA,KAAU,CAAC,OAAO,IAAA,KAAS,KAAA,CAAM,OAAO,IAAI,CAAA,CAAA;AAAA,EACpE;AAAA,EAEA,GAAA,CAAI,MAAc,KAAA,EAAuB;AACvC,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,CAAA,EAAG,KAAK,OAAO,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA;AAC5C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1C,QAAA,IAAI,CAAA,KAAM,MAAA,IAAa,CAAA,KAAM,IAAA,EAAM;AACnC,QAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,CAAA,EAAG,OAAO,CAAA,KAAM,SAAA,GAAa,CAAA,GAAI,GAAA,GAAM,GAAA,GAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MAC9E;AAAA,IACF;AACA,IAAA,OAAO,IAAI,QAAA,EAAS;AAAA,EACtB;AAAA,EAEA,OAAA,CAAQ,GAAA,EAA8B,IAAA,GAAO,IAAA,EAA8B;AACzE,IAAA,OAAO;AAAA,MACL,aAAA,EAAe,CAAA,OAAA,EAAU,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,MACpC,GAAI,IAAA,GAAO,EAAE,cAAA,EAAgB,kBAAA,KAAuB,EAAC;AAAA,MACrD,GAAG,gBAAA,CAAiB,IAAA,CAAK,QAAQ,CAAA;AAAA,MACjC,GAAG,iBAAiB,GAAG;AAAA,KACzB;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,OAAA,CAAQ,IAAA,EAAc,IAAA,GAAuB,EAAC,EAAsB;AACxE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,KAAK,KAAK,CAAA;AACrC,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,KAAS,MAAA;AAC9B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,KAAK,OAAO,CAAA;AAC9C,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA,KAAW,WAAW,IAAA,CAAK,OAAA,KAAY,SAAY,MAAA,GAAS,KAAA,CAAA;AAChF,IAAA,MAAM,UAAU,IAAA,CAAK,OAAA,IAAW,KAAK,OAAA,KAAY,MAAA,GAAY,IAAI,IAAA,CAAK,UAAA;AACtE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,SAAA;AACvC,IAAA,MAAM,SAAS,IAAI,GAAA,CAAI,IAAA,CAAK,YAAA,IAAgB,EAAE,CAAA;AAC9C,IAAA,IAAI,OAAA;AACJ,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,OAAA,EAAS,OAAA,EAAA,EAAW;AACnD,MAAA,MAAM,MAAA,GAAS,KAAK,MAAA,KAAW,OAAA,GAAU,IAAI,WAAA,CAAY,OAAA,CAAQ,OAAO,CAAA,GAAI,MAAA,CAAA;AAC5E,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,SAAA,CAAU,GAAA,EAAK;AAAA,UACpC,MAAA;AAAA,UACA,OAAA;AAAA,UACA,GAAI,OAAA,GAAU,EAAE,IAAA,EAAM,IAAA,CAAK,UAAU,IAAA,CAAK,IAAI,CAAA,EAAE,GAAI,EAAC;AAAA,UACrD,GAAI,KAAK,OAAA,KAAY,KAAA,CAAA,GAAY,EAAE,IAAA,EAAM,IAAA,CAAK,OAAA,EAAQ,GAAI,EAAC;AAAA,UAC3D,GAAI,MAAA,GAAS,EAAE,MAAA,KAAW;AAAC,SAC5B,CAAA;AACD,QAAA,IAAI,IAAI,EAAA,IAAM,MAAA,CAAO,IAAI,GAAA,CAAI,MAAM,GAAG,OAAO,GAAA;AAC7C,QAAA,IAAI,UAAU,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA,IAAK,UAAU,OAAA,EAAS;AAClD,UAAA,MAAM,MAAM,GAAA,GAAM,CAAA,IAAK,UAAU,IAAA,CAAK,MAAA,KAAW,GAAG,CAAA;AACpD,UAAA;AAAA,QACF;AACA,QAAA,MAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAAA,MACpC,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,GAAA,YAAe,YAAY,MAAM,GAAA;AACrC,QAAA,OAAA,GAAU,GAAA;AAEV,QAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,MAAM,GAAA;AAChC,QAAA,IAAI,UAAU,OAAA,EAAS;AACrB,UAAA,MAAM,KAAA,CAAM,GAAA,GAAM,CAAA,IAAK,OAAO,CAAA;AAC9B,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,IAAI,UAAA,CAAW,CAAA,MAAA,EAAS,IAAI,CAAA,uBAAA,EAA0B,OAAO,OAAO,CAAC,CAAA,CAAA,EAAI,CAAA,EAAG,IAAI,CAAA;AAAA,EACxF;AAAA,EAEA,MAAM,IAAA,CAAQ,IAAA,EAAc,IAAA,GAAuB,EAAC,EAAe;AACjE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,IAAI,CAAA;AACzC,IAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,GAAA,CACL,IAAA,EACA,IAAA,GAAuB,EAAC,EACuB;AAC/C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM;AAAA,MACnC,GAAG,IAAA;AAAA,MACH,SAAA,EAAW,KAAK,SAAA,IAAa,CAAA;AAAA,MAC7B,OAAA,EAAS;AAAA,KACV,CAAA;AACD,IAAA,OAAO,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,MAAM,CAAA;AAC/B,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAc,OAAA,CAAQ,IAAA,EAAc,GAAA,EAAoC;AACtE,IAAA,IAAI,IAAA,GAAgB,IAAA;AACpB,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,MAAM,IAAI,IAAA,EAAK;AAAA,IACxB,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AACnD,IAAA,MAAM,UAAA,GAAa,iBAAiB,OAAA,CAAQ,IAAA,CAAK,aAAa,CAAA,GAAI,MAAA,CAAO,aAAa,CAAA,GAAI,IAAA;AAC1F,IAAA,MAAM,OAAA,GAAU,eAAe,IAAI,CAAA;AACnC,IAAA,OAAO,IAAI,UAAA;AAAA,MACT,OAAA,GAAU,CAAA,MAAA,EAAS,IAAI,CAAA,QAAA,EAAM,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,GAAK,CAAA,MAAA,EAAS,IAAI,CAAA,QAAA,EAAM,IAAI,MAAM,CAAA,CAAA;AAAA,MACrF,GAAA,CAAI,MAAA;AAAA,MACJ,IAAA;AAAA,MACA;AAAA,QACE,SAAA,EAAW,IAAI,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA,IAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AAAA,QAChF;AAAA;AACF,KACF;AAAA,EACF;AACF;AAUA,gBAAuB,OAAA,CAAQ,KAAe,MAAA,EAAgD;AAC5F,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,IAAA,EAAM,SAAA,EAAU;AACnC,EAAA,IAAI,CAAC,QAAQ,MAAM,IAAI,WAAW,kBAAA,EAAoB,GAAA,CAAI,QAAQ,IAAI,CAAA;AACtE,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,MAAM,UAAU,MAAM,KAAK,OAAO,MAAA,EAAO,CAAE,MAAM,MAAM;AAAA,EAAC,CAAC,CAAA;AACzD,EAAA,MAAA,EAAQ,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AACzD,EAAA,IAAI;AACF,IAAA,WAAS;AACP,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,MAAA,IAAI,IAAA,EAAM;AACV,MAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAEhD,MAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA;AACrC,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA;AAClC,MAAA,MAAA,GAAS,MAAA,CAAO,KAAI,IAAK,EAAA;AACzB,MAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,MAAM,KAAA,GAAQ,cAAc,KAAK,CAAA;AACjC,QAAA,IAAI,OAAO,MAAM,KAAA;AAAA,MACnB;AAAA,IACF;AACA,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA,EAAK,GAAI,aAAA,CAAc,MAAM,CAAA,GAAI,IAAA;AACrD,IAAA,IAAI,MAAM,MAAM,IAAA;AAAA,EAClB,CAAA,SAAE;AACA,IAAA,MAAA,EAAQ,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC5C,IAAA,MAAA,CAAO,WAAA,IAAc;AAAA,EACvB;AACF;AAEA,SAAS,cAAc,KAAA,EAAgC;AACrD,EAAA,IAAI,KAAA,GAAQ,SAAA;AACZ,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA,EAAG;AACpC,IAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACnC,IAAA,IAAI,IAAA,CAAK,WAAW,QAAQ,CAAA,UAAW,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,SAAA,IACjD,IAAA,CAAK,UAAA,CAAW,OAAO,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAC,CAAA;AAAA,EAE9E;AACA,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC9B,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,EAAE;AACxC;AAGO,SAAS,UAAuB,KAAA,EAA2B;AAChE,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AACpC,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAAA,EAC9B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,MAAM,EAAA,EAA2B;AAC/C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,EAAE,CAAC,CAAA;AAC7C;;;ACxZO,IAAM,UAAN,MAAc;AAAA,EACnB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,GAAA,CAAI,IAAA,GAAiB,EAAC,EAAyB;AAC7C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAkB,aAAA,EAAe,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,EAC1F;AAAA;AAAA,EAGA,MAAA,CAAO,IAAA,EAA2B,IAAA,GAAiB,EAAC,EAAkC;AACpF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAA2B,aAAA,EAAe;AAAA,MACzD,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AACF;AAEO,IAAM,WAAN,MAAe;AAAA,EACpB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM7B,IACE,KAAA,GAAuD,EAAC,EACxD,IAAA,GAAiB,EAAC,EACA;AAClB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAc,aAAA,EAAe;AAAA,MAC5C,KAAA,EAAO;AAAA,QACL,YAAY,KAAA,CAAM,SAAA;AAAA,QAClB,KAAA,EAAO,MAAM,KAAA,YAAiB,IAAA,GAAO,MAAM,KAAA,CAAM,WAAA,KAAgB,KAAA,CAAM;AAAA,OACzE;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AACF;AAEO,IAAM,WAAN,MAAe;AAAA,EACpB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM7B,MAAA,CAAO,IAAA,EAAuB,IAAA,GAAiB,EAAC,EAA8B;AAC5E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAuB,cAAA,EAAgB;AAAA,MACtD,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AACF;AAEO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,MAAM,IAAA,CAAK,IAAA,GAAiB,EAAC,EAA0B;AACrD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,KAA+B,kBAAA,EAAoB;AAAA,MAC7E,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,OAAO,CAAC,GAAI,GAAA,CAAI,MAAA,IAAU,EAAG,CAAA;AAAA,EAC/B;AACF;;;ACpCO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,MAAA,CAAO,IAAA,EAA6B,IAAA,GAAiB,EAAC,EAA8B;AAClF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAuB,iBAAA,EAAmB;AAAA,MACzD,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CAAI,EAAA,EAAY,IAAA,GAAiB,EAAC,EAAsB;AACtD,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAe,mBAAmB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,MAC3E,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,KAAA,CAAM,EAAA,EAAY,IAAA,GAAiB,EAAC,EAA4B;AACpE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA;AAAA,MAC1B,CAAA,gBAAA,EAAmB,kBAAA,CAAmB,EAAE,CAAC,CAAA,MAAA,CAAA;AAAA,MACzC,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,MAAA,EAAQ,KAAK,MAAA;AAAO,KACvC;AACA,IAAA,OAAO,CAAC,GAAI,GAAA,CAAI,KAAA,IAAS,EAAG,CAAA;AAAA,EAC9B;AAAA;AAAA,EAGA,KAAA,CAAM,IAAA,EAAe,IAAA,GAAiB,EAAC,EAA2B;AAChE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAoB,uBAAA,EAAyB;AAAA,MAC5D,KAAA,EAAO,EAAE,IAAA,EAAK;AAAA,MACd,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAA,CAAO,EAAA,EAAY,IAAA,GAAiB,EAAC,EAAqC;AACxE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,gBAAA,EAAmB,kBAAA,CAAmB,EAAE,CAAC,CAAA,OAAA,CAAA;AAAA,MACzC,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,EAAC,EAAG,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,MAAA,EAAQ,IAAA,CAAK,MAAA;AAAO,KACjE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,MAAA,CACL,EAAA,EACA,IAAA,GAAiB,EAAC,EACoC;AACtD,IAAA,MAAM,MAAA,GAAS,KAAK,IAAA,CAAK,GAAA,CAAI,mBAAmB,kBAAA,CAAmB,EAAE,CAAC,CAAA,OAAA,CAAA,EAAW;AAAA,MAC/E,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,MAAA,MAAM,IAAA,GAAO,UAAmC,KAAK,CAAA;AACrD,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,EAAA,GAAK,EAAE,KAAA,EAAO,KAAA,CAAM,OAAO,IAAA,EAAK;AACtC,MAAA,MAAM,EAAA;AACN,MAAA,IAAI,EAAA,CAAG,KAAA,KAAU,MAAA,IAAU,EAAA,CAAG,UAAU,SAAA,EAAW;AAAA,IACrD;AAAA,EACF;AACF;AAEO,IAAM,SAAN,MAAa;AAAA,EAElB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAC3B,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,SAAA,CAAU,IAAI,CAAA;AAAA,EAChC;AAAA,EAF6B,IAAA;AAAA,EADpB,IAAA;AAAA;AAAA,EAMT,MAAM,GAAA,CAAI,IAAA,EAAuB,IAAA,GAAiB,EAAC,EAA4B;AAC7E,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,gBAAA,EAAkB;AAAA,MACpD,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,MAAM,GAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,MAAA,IAAU,EAAE,CAAA;AAAA,MAC/B,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,EAAE,CAAA;AAAA,MAC7B,SAAS,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AAAA,MAC3D,KAAA,EAAO,IAAI,KAAA,IAAS,IAAA;AAAA,MACpB,GAAA;AAAA,MACA,SAAS,GAAA,CAAI;AAAA,KACf;AAAA,EACF;AACF;;;AChGO,IAAM,QAAN,MAAY;AAAA,EACjB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,MAAM,WAAW,IAAA,EAA6C;AAC5D,IAAA,OAAA,CAAQ,MAAM,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAA,EAAG,IAAA;AAAA,EAC/C;AAAA;AAAA,EAGA,MAAM,mBAAmB,IAAA,EAA0D;AACjF,IAAA,MAAM,IAAA,GAAO,IAAI,QAAA,EAAS;AAC1B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,YAAgB,IAAA,GAAO,IAAA,CAAK,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,IAAA,CAAK,IAAgB,CAAC,CAAA;AACrF,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,YAAY,YAAY,CAAA;AACvD,IAAA,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,IAAA,CAAK,KAAA,IAAS,kBAAkB,CAAA;AACrD,IAAA,IAAI,KAAK,QAAA,EAAU,IAAA,CAAK,MAAA,CAAO,UAAA,EAAY,KAAK,QAAQ,CAAA;AACxD,IAAA,IAAI,KAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU,KAAK,MAAM,CAAA;AAClD,IAAA,IAAI,KAAK,cAAA,EAAgB,IAAA,CAAK,MAAA,CAAO,iBAAA,EAAmB,KAAK,cAAc,CAAA;AAC3E,IAAA,IAAI,IAAA,CAAK,gBAAgB,MAAA,EAAW,IAAA,CAAK,OAAO,aAAA,EAAe,MAAA,CAAO,IAAA,CAAK,WAAW,CAAC,CAAA;AACvF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,0BAAA,EAA4B;AAAA,MAC9D,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,IAAA;AAAA,MACT,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,MAAM,GAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,OAAO;AAAA,MACL,MAAM,OAAO,GAAA,CAAI,IAAA,KAAS,QAAA,GAAW,IAAI,IAAA,GAAO,EAAA;AAAA,MAChD,GAAA;AAAA,MACA,QAAA,EAAU,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA;AAAA,MAC7C,SAAS,GAAA,CAAI;AAAA,KACf;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,MAAA,CACJ,IAAA,EACA,IAAA,GAA+D,EAAC,EAC1C;AACtB,IAAA,OAAA,CAAQ,MAAM,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,IAAI,CAAA,EAAG,KAAA;AAAA,EACjD;AAAA;AAAA,EAGA,MAAM,cAAA,CACJ,IAAA,EACA,IAAA,GAA+D,EAAC,EACzC;AACvB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,kBAAA,EAAoB;AAAA,MACtD,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,WAAA,EAAa,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,OAAA,EAAQ;AAAA,MAChF,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,MAAM,GAAA,CAAI,WAAA,EAAY;AAAA,MAC7B,WAAA,EAAa,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,YAAA;AAAA,MAChD,QAAA,EAAU,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA;AAAA,MAC7C,SAAS,GAAA,CAAI;AAAA,KACf;AAAA,EACF;AACF;;;ACRA,SAAS,QAAQ,CAAA,EAAgE;AAC/E,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,MAAM,MAAA,GAAS,EAAE,qBAAA,EAAuB,aAAA;AACxC,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,EAAE,aAAA,IAAiB,CAAA;AAAA,IACjC,gBAAA,EAAkB,EAAE,iBAAA,IAAqB,CAAA;AAAA,IACzC,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,YAAA,EAAc,MAAA,KAAW;AAAC,GACzD;AACF;AAOO,SAAS,aAAA,CACd,GAAA,EACA,KAAA,EACA,QAAA,EACM;AACN,EAAA,MAAM,WAAW,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA,IAAK,EAAE,KAAA,EAAM;AAC3C,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACjD,IAAA,IAAI,QAAQ,OAAA,EAAS;AACrB,IAAA,IAAI,GAAA,KAAQ,UAAA,IAAc,GAAA,IAAO,OAAO,QAAQ,QAAA,EAAU;AACxD,MAAA,MAAM,EAAA,GAAM,QAAA,CAAS,QAAA,IAAwC,EAAC;AAC9D,MAAA,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,KAAK,MAAA,CAAO,OAAA,CAAQ,GAA8B,CAAA,EAAG;AACrE,QAAA,IAAI,EAAA,KAAO,WAAA,EAAa,EAAA,CAAG,SAAA,GAAY,MAAA,CAAO,EAAA,CAAG,SAAA,IAAa,EAAE,CAAA,GAAI,MAAA,CAAO,EAAA,IAAM,EAAE,CAAA;AAAA,aAC9E,EAAA,CAAG,EAAE,CAAA,GAAI,EAAA;AAAA,MAChB;AACA,MAAA,QAAA,CAAS,QAAA,GAAW,EAAA;AAAA,IACtB,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA;AAAA,IAClB;AAAA,EACF;AACA,EAAA,GAAA,CAAI,GAAA,CAAI,OAAO,QAAQ,CAAA;AACzB;AAEO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM7B,MAAM,MAAA,CAAO,IAAA,EAA2B,IAAA,GAAwB,EAAC,EAAwB;AACvF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,sBAAA,EAAwB;AAAA,MAC1D,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,OAAO,IAAA,CAAK,KAAA,IAAS,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAM;AAAA,MAC7D,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,MAAM,GAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,CAAC,CAAA;AAC7B,IAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAO,KAAA,EAAO,OAAA,EAAS,YAAY,QAAA,GAAW,KAAA,CAAM,QAAQ,OAAA,GAAU,EAAA;AAAA,MAC/E,WAAW,CAAC,GAAK,OAAO,OAAA,EAAS,UAAA,IAAc,EAAsB,CAAA;AAAA,MACrE,GAAA;AAAA,MACA,SAAA,EAAW,IAAI,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA,IAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AAAA,MAChF,OAAA,EAAS,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA;AAAA,MAC3C,QAAA,EAAU,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA;AAAA,MAC7C,UAAA,EAAY,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,qBAAqB,CAAA;AAAA,MACjD,KAAA,EAAO,QAAQ,KAAK,CAAA;AAAA,MACpB,SAAS,GAAA,CAAI;AAAA,KACf;AAAA,EACF;AAAA;AAAA,EAGA,MAAA,CAAO,IAAA,EAA2B,IAAA,GAAwB,EAAC,EAAe;AACxE,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,sBAAA,EAAwB;AAAA,MAC/D,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,OAAO,IAAA,CAAK,KAAA,IAAS,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAK;AAAA,MAC5D,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAA,EAAW,CAAA;AAAA,MACX,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,WAAA;AACJ,IAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,CAA0B,CAAC,SAAS,MAAA,KAAW;AAC/D,MAAA,YAAA,GAAe,OAAA;AACf,MAAA,WAAA,GAAc,MAAA;AAAA,IAChB,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAEpB,IAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAqC;AAClE,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,IAAI,KAAA,GAA2B,IAAA;AAC/B,IAAA,IAAI,YAAA,GAA8B,IAAA;AAClC,IAAA,IAAI,GAAA,GAAuB,IAAA;AAE3B,IAAA,MAAM,cAAc,OAAyB;AAAA,MAC3C,OAAA;AAAA,MACA,SAAA,EAAW,CAAC,GAAG,gBAAA,CAAiB,QAAQ,CAAA;AAAA,MACxC,SAAA,EAAW,GAAA,EAAK,OAAA,CAAQ,GAAA,CAAI,kBAAkB,KAAK,GAAA,EAAK,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,IAAA;AAAA,MACvF,QAAA,EAAU,GAAA,EAAK,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA,IAAK,IAAA;AAAA,MACnD,UAAA,EAAY,GAAA,EAAK,OAAA,CAAQ,GAAA,CAAI,qBAAqB,CAAA,IAAK,IAAA;AAAA,MACvD,KAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA,EAAS,KAAK,OAAA,IAAW;AAAA,KAC3B,CAAA;AAEA,IAAA,gBAAgB,MAAA,GAA+D;AAC7E,MAAA,IAAI;AACF,QAAA,GAAA,GAAM,MAAM,cAAA;AACZ,QAAA,WAAA,MAAiB,KAAA,IAAS,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,MAAM,CAAA,EAAG;AACnD,UAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC7B,UAAA,MAAM,KAAA,GAAQ,UAA+B,KAAK,CAAA;AAClD,UAAA,IAAI,CAAC,KAAA,EAAO;AACZ,UAAA,IAAI,KAAA,CAAM,KAAA,EAAO,KAAA,GAAQ,OAAA,CAAQ,MAAM,KAAK,CAAA;AAC5C,UAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,GAAU,CAAC,CAAA;AAChC,UAAA,IAAI,MAAA,EAAQ,aAAA,EAAe,YAAA,GAAe,MAAA,CAAO,aAAA;AACjD,UAAA,MAAM,QAAQ,MAAA,EAAQ,KAAA;AACtB,UAAA,IAAI,OAAO,UAAA,EAAY;AACrB,YAAA,KAAA,MAAW,EAAA,IAAM,MAAM,UAAA,EAAY;AACjC,cAAA,aAAA,CAAc,gBAAA,EAAkB,OAAO,EAAA,CAAG,KAAA,KAAU,WAAW,EAAA,CAAG,KAAA,GAAQ,GAAG,EAAE,CAAA;AAAA,YACjF;AAAA,UACF;AACA,UAAA,IAAI,KAAA,EAAO,OAAA,EAAS,OAAA,IAAW,KAAA,CAAM,OAAA;AACrC,UAAA,MAAM,KAAA;AAAA,QACR;AACA,QAAA,YAAA,CAAa,aAAa,CAAA;AAAA,MAC5B,SAAS,GAAA,EAAK;AACZ,QAAA,WAAA,CAAY,GAAG,CAAA;AACf,QAAA,MAAM,GAAA;AAAA,MACR;AAAA,IACF;AAEA,IAAA,gBAAgB,IAAA,GAAgD;AAC9D,MAAA,WAAA,MAAiB,KAAA,IAAS,QAAO,EAAG;AAClC,QAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,CAAC,GAAG,KAAA,EAAO,OAAA;AACzC,QAAA,IAAI,OAAO,MAAM,KAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,CAAC,MAAA,CAAO,aAAa,GAAG,MAAM,IAAA,EAAK;AAAA,MACnC,MAAA,EAAQ,OAAO,EAAE,CAAC,OAAO,aAAa,GAAG,MAAM,MAAA,EAAO,EAAE,CAAA;AAAA,MACxD;AAAA,KACF;AAAA,EACF;AACF;AAEO,IAAM,OAAN,MAAW;AAAA,EACP,WAAA;AAAA,EACT,YAAY,IAAA,EAAkB;AAC5B,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,eAAA,CAAgB,IAAI,CAAA;AAAA,EAC7C;AACF;;;ACpOO,IAAM,UAAN,MAAc;AAAA,EACnB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,MAAM,IAAA,CAAK,IAAA,GAAiB,EAAC,EAAsB;AACjD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,KAA2B,aAAA,EAAe;AAAA,MACpE,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,OAAO,CAAC,GAAI,GAAA,CAAI,OAAA,IAAW,EAAG,CAAA;AAAA,EAChC;AAAA;AAAA,EAGA,MAAA,CAAO,EAAA,EAAY,IAAA,EAAmB,IAAA,GAAiB,EAAC,EAA2B;AACjF,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAoB,eAAe,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,MAC5E,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAA,CAAO,EAAA,EAAY,IAAA,GAAiB,EAAC,EAAmC;AACtE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAA4B,eAAe,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,MACpF,MAAA,EAAQ,QAAA;AAAA,MACR,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,KAAA,GAA4B,EAAC,EAAG,IAAA,GAAiB,EAAC,EAA2B;AACzF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAoB,yBAAA,EAA2B;AAAA,MAC9D,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM;AAAA,MAC5B,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AACF;;;ACnCO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA,EAE7B,MAAM,MAAA,CACJ,IAAA,EACA,IAAA,GAA+D,EAAC,EACrC;AAC3B,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,gBAAA,EAAkB;AAAA,MACpD,MAAM,EAAE,GAAG,MAAM,KAAA,EAAO,IAAA,CAAK,SAAS,aAAA,EAAc;AAAA,MACpD,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,MAAM,GAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,OAAO;AAAA,MACL,UAAA,EAAA,CAAa,GAAA,CAAI,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,GAAI,CAAA,CAAE,SAA+B,CAAC,CAAA;AAAA,MAC/E,GAAA;AAAA,MACA,QAAA,EAAU,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA;AAAA,MAC7C,QAAA,EAAU,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,wBAAwB,CAAA;AAAA,MAClD,SAAS,GAAA,CAAI;AAAA,KACf;AAAA,EACF;AACF;;;ACNA,IAAM,OAAA,GAAU,CAAC,EAAA,EAAY,MAAA,GAAS,EAAA,KACpC,oBAAoB,kBAAA,CAAmB,EAAE,CAAC,CAAA,EAAG,MAAM,CAAA,CAAA;AAE9C,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,MAAM,IAAA,CAAK,KAAA,EAAe,IAAA,GAAiB,EAAC,EAAiC;AAC3E,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,KAAsC,OAAA,CAAQ,KAAA,EAAO,UAAU,CAAA,EAAG;AAAA,MAC5F,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,OAAO,CAAC,GAAI,GAAA,CAAI,OAAA,IAAW,EAAG,CAAA;AAAA,EAChC;AAAA;AAAA,EAGA,MAAM,GAAA,CACJ,KAAA,EACA,IAAA,EACA,IAAA,GAAiB,EAAC,EACiB;AACnC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA;AAAA,MAC1B,OAAA,CAAQ,OAAO,UAAU,CAAA;AAAA,MACzB,EAAE,IAAA,EAAM,GAAA,EAAK,KAAK,GAAA,EAAK,MAAA,EAAQ,KAAK,MAAA;AAAO,KAC7C;AACA,IAAA,OAAO,GAAA,CAAI,MAAA;AAAA,EACb;AAAA;AAAA,EAGA,SAAA,CACE,KAAA,EACA,SAAA,EACA,IAAA,GAAiB,EAAC,EACwB;AAC1C,IAAA,MAAM,IAAA,GAAgD,EAAE,UAAA,EAAY,SAAA,EAAU;AAC9E,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAsC,OAAA,CAAQ,KAAA,EAAO,qBAAqB,CAAA,EAAG;AAAA,MAC5F,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OAAA,CACJ,KAAA,EACA,QACA,IAAA,EACA,IAAA,GAAiB,EAAC,EACoC;AACtD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA;AAAA,MAC1B,QAAQ,KAAA,EAAO,CAAA,SAAA,EAAY,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA,MACvD,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,EAAE,IAAA,EAAK,EAAG,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,MAAA,EAAQ,IAAA,CAAK,MAAA;AAAO,KACxE;AACA,IAAA,OAAO,GAAA,CAAI,MAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAA,CACE,KAAA,EACA,MAAA,EACA,IAAA,GAAiB,EAAC,EACyB;AAC3C,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,QAAQ,KAAA,EAAO,CAAA,SAAA,EAAY,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA,MACvD,EAAE,QAAQ,QAAA,EAAU,GAAA,EAAK,KAAK,GAAA,EAAK,MAAA,EAAQ,KAAK,MAAA;AAAO,KACzD;AAAA,EACF;AAAA;AAAA,EAGA,OAAA,CAAQ,KAAA,EAAe,IAAA,EAA8B,IAAA,GAAiB,EAAC,EAAgC;AACrG,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAyB,OAAA,CAAQ,KAAA,EAAO,sBAAsB,CAAA,EAAG;AAAA,MAChF,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AACF;AAGO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,IAAA,CAAK,KAAA,EAAe,IAAA,GAAiB,EAAC,EAAiC;AACrE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAA0B,OAAA,CAAQ,OAAO,QAAQ,CAAA,EAAG,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC7G;AAAA;AAAA,EAGA,MAAA,CAAO,KAAA,EAAe,IAAA,EAAiC,IAAA,GAAiB,EAAC,EAAoC;AAC3G,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAA6B,OAAA,CAAQ,KAAA,EAAO,QAAQ,CAAA,EAAG;AAAA,MACtE,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CAAI,KAAA,EAAe,MAAA,EAAgB,IAAA,GAAiB,EAAC,EAAmC;AACtF,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAA4B,QAAQ,KAAA,EAAO,CAAA,OAAA,EAAU,mBAAmB,MAAM,CAAC,CAAA,CAAE,CAAA,EAAG,EAAE,GAAA,EAAK,IAAA,CAAK,KAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC7I;AACF;AAEO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,MAAM,IAAA,CAAK,KAAA,EAAe,IAAA,GAAiB,EAAC,EAA+B;AACzE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,KAAoC,OAAA,CAAQ,KAAA,EAAO,QAAQ,CAAA,EAAG;AAAA,MACxF,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,OAAO,CAAC,GAAI,GAAA,CAAI,KAAA,IAAS,EAAG,CAAA;AAAA,EAC9B;AAAA;AAAA,EAGA,MAAM,GAAA,CACJ,KAAA,EACA,MACA,IAAA,EACA,IAAA,GAAiB,EAAC,EACQ;AAC1B,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA;AAAA,MAC1B,OAAA,CAAQ,OAAO,CAAA,OAAA,EAAU,kBAAA,CAAmB,OAAO,IAAI,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,MAC3D,EAAE,QAAQ,KAAA,EAAO,IAAA,EAAM,KAAK,IAAA,CAAK,GAAA,EAAK,MAAA,EAAQ,IAAA,CAAK,MAAA;AAAO,KAC5D;AACA,IAAA,OAAO,GAAA,CAAI,IAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAA,CACE,KAAA,EACA,IAAA,EACA,IAAA,GAAiB,EAAC,EACuB;AACzC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,OAAA,CAAQ,OAAO,CAAA,OAAA,EAAU,kBAAA,CAAmB,OAAO,IAAI,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,MAC3D,EAAE,QAAQ,QAAA,EAAU,GAAA,EAAK,KAAK,GAAA,EAAK,MAAA,EAAQ,KAAK,MAAA;AAAO,KACzD;AAAA,EACF;AACF;AAEO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,MAAM,IAAA,CAAK,KAAA,EAAe,IAAA,GAAiB,EAAC,EAAiC;AAC3E,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,KAAsC,OAAA,CAAQ,KAAA,EAAO,UAAU,CAAA,EAAG;AAAA,MAC5F,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,OAAO,CAAC,GAAI,GAAA,CAAI,OAAA,IAAW,EAAG,CAAA;AAAA,EAChC;AAAA;AAAA,EAGA,IACE,KAAA,EACA,IAAA,EACA,KAAA,EACA,IAAA,GAAiB,EAAC,EACa;AAC/B,IAAA,MAAM,IAAA,GAA8C,EAAE,KAAA,EAAM;AAC5D,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,QAAQ,KAAA,EAAO,CAAA,SAAA,EAAY,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACrD,EAAE,QAAQ,KAAA,EAAO,IAAA,EAAM,KAAK,IAAA,CAAK,GAAA,EAAK,MAAA,EAAQ,IAAA,CAAK,MAAA;AAAO,KAC5D;AAAA,EACF;AAAA;AAAA,EAGA,MAAA,CACE,KAAA,EACA,IAAA,EACA,IAAA,GAAiB,EAAC,EACyB;AAC3C,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,QAAQ,KAAA,EAAO,CAAA,SAAA,EAAY,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACrD,EAAE,QAAQ,QAAA,EAAU,GAAA,EAAK,KAAK,GAAA,EAAK,MAAA,EAAQ,KAAK,MAAA;AAAO,KACzD;AAAA,EACF;AACF;AAEO,IAAM,eAAN,MAAmB;AAAA,EAMxB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAC3B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,kBAAA,CAAmB,IAAI,CAAA;AAC1C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,gBAAA,CAAiB,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,kBAAA,CAAmB,IAAI,CAAA;AAC1C,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,gBAAA,CAAiB,IAAI,CAAA;AAAA,EACxC;AAAA,EAL6B,IAAA;AAAA,EALpB,OAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA;AAAA,EAUT,KAAA,CAAM,KAAA,EAAe,IAAA,GAAiB,EAAC,EAA8B;AACnE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAuB,OAAA,CAAQ,OAAO,SAAS,CAAA,EAAG,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC3G;AAAA;AAAA,EAGA,MAAM,IAAA,CAAK,KAAA,GAA+B,EAAC,EAAG,IAAA,GAAiB,EAAC,EAA2B;AACzF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,KAAgC,kBAAA,EAAoB;AAAA,MAC9E,OAAO,EAAE,UAAA,EAAY,MAAM,UAAA,EAAY,WAAA,EAAa,MAAM,WAAA,EAAY;AAAA,MACtE,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,OAAO,CAAC,GAAI,GAAA,CAAI,YAAA,IAAgB,EAAG,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,MAAA,CAAO,IAAA,EAA6B,IAAA,GAAiB,EAAC,EAAyB;AACnF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,KAAsC,kBAAA,EAAoB;AAAA,MACpF,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACV,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,WAAA;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAA,CAAO,IAAA,EAA6B,IAAA,GAAiB,EAAC,EAAiC;AACrF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAA0B,yBAAA,EAA2B;AAAA,MACpE,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK,MAAA;AAAA;AAAA,MAEb,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CAAI,KAAA,EAAe,IAAA,GAAiB,EAAC,EAA+B;AAClE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAwB,OAAA,CAAQ,KAAK,CAAA,EAAG;AAAA,MACvD,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,MAAA,CACJ,KAAA,EACA,IAAA,EACA,IAAA,GAAiB,EAAC,EACI;AACtB,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,KAAK,IAAA,CAAiC,OAAA,CAAQ,KAAK,CAAA,EAAG;AAAA,MAC3E,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,WAAA;AAAA,EACb;AAAA;AAAA,EAGA,KAAA,CAAM,KAAA,EAAe,IAAA,GAAiB,EAAC,EAAmC;AACxE,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,OAAA,EAAS,IAAI,CAAA;AAAA,EAC7C;AAAA;AAAA,EAGA,IAAA,CAAK,KAAA,EAAe,IAAA,GAAiB,EAAC,EAAmC;AACvE,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,MAAA,EAAQ,IAAI,CAAA;AAAA,EAC5C;AAAA;AAAA,EAGA,OAAA,CAAQ,KAAA,EAAe,IAAA,GAAiB,EAAC,EAAmC;AAC1E,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,SAAA,EAAW,IAAI,CAAA;AAAA,EAC/C;AAAA;AAAA,EAGA,OAAA,CAAQ,KAAA,EAAe,IAAA,GAAiB,EAAC,EAAmC;AAC1E,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,SAAA,EAAW,IAAI,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAA,CAAY,KAAA,EAAe,IAAA,GAAiB,EAAC,EAAoC;AAC/E,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAA6B,OAAA,CAAQ,KAAA,EAAO,eAAe,CAAA,EAAG;AAAA,MAC7E,MAAA,EAAQ,MAAA;AAAA,MACR,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAAA,EAEQ,UAAA,CACN,KAAA,EACA,MAAA,EACA,IAAA,EACgC;AAChC,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAA4B,OAAA,CAAQ,OAAO,CAAA,CAAA,EAAI,MAAM,EAAE,CAAA,EAAG;AAAA,MACzE,MAAA,EAAQ,MAAA;AAAA,MACR,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AACF;;;AChVO,IAAM,SAAN,MAAa;AAAA,EAClB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,GAAA,CAAI,IAAA,GAAiC,EAAC,EAA4B;AAChE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAqB,SAAA,EAAW,EAAE,QAAQ,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EACzF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAA,CACJ,IAAA,GAAiC,EAAC,EACqB;AACvD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,eAAA,EAAiB;AAAA,MACnD,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAA,EAAS,IAAA;AAAA,MACT,YAAA,EAAc,CAAC,GAAG;AAAA,KACnB,CAAA;AACD,IAAA,MAAM,IAAA,GAAQ,MAAM,GAAA,CAAI,IAAA,EAAK;AAC7B,IAAA,OAAO,EAAE,GAAG,IAAA,EAAM,UAAA,EAAY,IAAI,MAAA,EAAO;AAAA,EAC3C;AAAA;AAAA,EAGA,MAAA,CAAO,IAAA,GAAiC,EAAC,EAA4B;AACnE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAqB,SAAA,EAAW,EAAE,QAAQ,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EACzF;AACF;;;AChBO,IAAM,QAAN,MAAY;AAAA,EACjB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,MAAM,IAAA,CAAK,IAAA,GAAiB,EAAC,EAA4B;AACvD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,KAAyB,WAAA,EAAa;AAAA,MAChE,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,OAAO,CAAC,GAAI,GAAA,CAAI,KAAA,IAAS,EAAG,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAA,CACE,UACA,EAAA,EACA,IAAA,GAAgC,EAAC,EACjC,KAAA,GAA2D,EAAC,EACjC;AAC3B,IAAA,MAAM,IAAA,GAAqB;AAAA,MACzB,EAAA;AAAA,MACA,IAAA;AAAA,MACA,GAAI,MAAM,SAAA,KAAc,MAAA,GAAY,EAAE,UAAA,EAAY,KAAA,CAAM,SAAA,EAAU,GAAI,EAAC;AAAA,MACvE,GAAI,MAAM,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,GAAI;AAAC,KAC5D;AACA,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAuB,aAAa,kBAAA,CAAmB,QAAQ,CAAC,CAAA,KAAA,CAAA,EAAS;AAAA,MACxF,IAAA;AAAA,MACA,KAAK,KAAA,CAAM,GAAA;AAAA,MACX,QAAQ,KAAA,CAAM,MAAA;AAAA;AAAA,MAEd,SAAA,EAAA,CAAY,KAAA,CAAM,SAAA,IAAa,GAAA,IAAU,GAAA;AAAA,MACzC,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,UAAA,CACE,KAAA,EACA,IAAA,EACA,IAAA,GAAiB,EAAC,EACoB;AACtC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,eAAA,EAAkB,kBAAA,CAAmB,KAAK,CAAC,CAAA,OAAA,CAAA;AAAA,MAC3C,EAAE,IAAA,EAAM,GAAA,EAAK,KAAK,GAAA,EAAK,MAAA,EAAQ,KAAK,MAAA;AAAO,KAC7C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,MAAA,CACL,KAAA,GAA8D,EAAC,EAC/D,IAAA,GAAiB,EAAC,EACgC;AAClD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,kBAAA,EAAoB;AAAA,MAC/C,KAAA,EAAO;AAAA,QACL,IAAI,KAAA,CAAM,EAAA;AAAA,QACV,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,KAAA,EAAO,MAAM,KAAA,EAAO,MAAA,GAAS,MAAM,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,GAAI;AAAA,OACvD;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,MAAA,MAAM,IAAA,GAAO,UAAmC,KAAK,CAAA;AACrD,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,IAAA,EAAK;AAAA,IACnC;AAAA,EACF;AACF;;;ACtCO,IAAM,WAAN,MAAe;AAAA,EACpB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA,EAE7B,MAAM,MAAA,CAAO,IAAA,EAAoB,IAAA,GAA2B,EAAC,EAA2B;AACtF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,cAAA,EAAgB;AAAA,MAClD,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,OAAO,IAAA,CAAK,KAAA,IAAS,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAM;AAAA,MAC7D,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,MAAM,GAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,MAAM,IAAA,GAAA,CAAQ,IAAI,OAAA,IAAW,IAC1B,GAAA,CAAI,CAAC,MAAO,CAAA,CAAE,IAAA,KAAS,UAAU,OAAO,CAAA,CAAE,SAAS,QAAA,GAAW,CAAA,CAAE,OAAO,EAAG,CAAA,CAC1E,KAAK,EAAE,CAAA;AACV,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,GAAA;AAAA,MACA,SAAA,EAAW,IAAI,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA,IAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AAAA,MAChF,QAAA,EAAU,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA;AAAA,MAC7C,SAAS,GAAA,CAAI;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAA,CAAO,IAAA,EAAoB,IAAA,GAA2B,EAAC,EAAkB;AACvE,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB;AAAA,MACvD,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,OAAO,IAAA,CAAK,KAAA,IAAS,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAK;AAAA,MAC5D,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAA,EAAW,CAAA;AAAA,MACX,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,WAAA;AACJ,IAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,CAA6B,CAAC,SAAS,MAAA,KAAW;AAClE,MAAA,YAAA,GAAe,OAAA;AACf,MAAA,WAAA,GAAc,MAAA;AAAA,IAChB,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAEpB,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI,UAAA,GAA4B,IAAA;AAChC,IAAA,IAAI,WAAA,GAA6B,IAAA;AACjC,IAAA,IAAI,YAAA,GAA8B,IAAA;AAClC,IAAA,IAAI,GAAA,GAAuB,IAAA;AAE3B,IAAA,gBAAgB,MAAA,GAA8D;AAC5E,MAAA,IAAI;AACF,QAAA,GAAA,GAAM,MAAM,cAAA;AACZ,QAAA,WAAA,MAAiB,KAAA,IAAS,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,MAAM,CAAA,EAAG;AACnD,UAAA,MAAM,EAAA,GAAK,UAA8B,KAAK,CAAA;AAC9C,UAAA,IAAI,CAAC,EAAA,EAAI;AACT,UAAA,IAAI,OAAO,EAAA,CAAG,IAAA,KAAS,QAAA,EAAU,EAAA,CAAG,OAAO,KAAA,CAAM,KAAA;AACjD,UAAA,IAAI,EAAA,CAAG,SAAS,eAAA,EAAiB;AAC/B,YAAA,MAAM,KAAA,GAAS,GAAG,OAAA,EAA+D,KAAA;AACjF,YAAA,IAAI,KAAA,EAAO,YAAA,KAAiB,KAAA,CAAA,EAAW,WAAA,GAAc,KAAA,CAAM,YAAA;AAAA,UAC7D,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,qBAAA,EAAuB;AAC5C,YAAA,MAAM,QAAQ,EAAA,CAAG,KAAA;AACjB,YAAA,IAAI,KAAA,EAAO,SAAS,YAAA,IAAgB,OAAO,MAAM,IAAA,KAAS,QAAA,UAAkB,KAAA,CAAM,IAAA;AAAA,UACpF,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,eAAA,EAAiB;AACtC,YAAA,MAAM,QAAQ,EAAA,CAAG,KAAA;AACjB,YAAA,IAAI,KAAA,EAAO,WAAA,EAAa,UAAA,GAAa,KAAA,CAAM,WAAA;AAC3C,YAAA,MAAM,QAAQ,EAAA,CAAG,KAAA;AACjB,YAAA,IAAI,KAAA,EAAO,aAAA,KAAkB,KAAA,CAAA,EAAW,YAAA,GAAe,KAAA,CAAM,aAAA;AAAA,UAC/D;AACA,UAAA,MAAM,EAAA;AACN,UAAA,IAAI,EAAA,CAAG,SAAS,cAAA,EAAgB;AAAA,QAClC;AACA,QAAA,YAAA,CAAa;AAAA,UACX,IAAA;AAAA,UACA,UAAA;AAAA,UACA,KAAA,EACE,WAAA,KAAgB,IAAA,IAAQ,YAAA,KAAiB,IAAA,GACrC,EAAE,WAAA,EAAa,WAAA,IAAe,CAAA,EAAG,YAAA,EAAc,YAAA,IAAgB,CAAA,EAAE,GACjE,IAAA;AAAA,UACN,SAAA,EAAW,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,kBAAkB,KAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,IAAA;AAAA,UACrF,QAAA,EAAU,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA;AAAA,UAC7C,SAAS,GAAA,CAAI;AAAA,SACd,CAAA;AAAA,MACH,SAAS,GAAA,EAAK;AACZ,QAAA,WAAA,CAAY,GAAG,CAAA;AACf,QAAA,MAAM,GAAA;AAAA,MACR;AAAA,IACF;AAEA,IAAA,gBAAgB,QAAA,GAAoD;AAClE,MAAA,WAAA,MAAiB,EAAA,IAAM,QAAO,EAAG;AAC/B,QAAA,IAAI,EAAA,CAAG,SAAS,qBAAA,EAAuB;AACvC,QAAA,MAAM,QAAQ,EAAA,CAAG,KAAA;AACjB,QAAA,IAAI,OAAO,IAAA,KAAS,YAAA,IAAgB,KAAA,CAAM,IAAA,QAAY,KAAA,CAAM,IAAA;AAAA,MAC9D;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,CAAC,MAAA,CAAO,aAAa,GAAG,MAAM,MAAA,EAAO;AAAA,MACrC,IAAA,EAAM,OAAO,EAAE,CAAC,OAAO,aAAa,GAAG,MAAM,QAAA,EAAS,EAAE,CAAA;AAAA,MACxD;AAAA,KACF;AAAA,EACF;AACF;;;ACnJO,IAAM,SAAN,MAAa;AAAA,EAClB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,MAAM,IAAA,CAAK,IAAA,GAA+D,EAAC,EAAqB;AAC9F,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,KAAgB,YAAA,EAAc;AAAA,MACxD,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,OAAO,CAAC,GAAI,GAAA,CAAI,IAAA,IAAQ,EAAG,CAAA;AAAA,EAC7B;AACF;;;ACPO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,MAAM,IAAA,CAAK,KAAA,EAAe,IAAA,GAAiB,EAAC,EAAyB;AACnE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA;AAAA,MAC1B,CAAA,SAAA,EAAY,kBAAA,CAAmB,KAAK,CAAC,CAAA,QAAA,CAAA;AAAA,MACrC,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,MAAA,EAAQ,KAAK,MAAA;AAAO,KACvC;AACA,IAAA,OAAO,CAAC,GAAI,GAAA,CAAI,OAAA,IAAW,EAAG,CAAA;AAAA,EAChC;AAAA;AAAA,EAGA,GAAA,CACE,KAAA,EACA,IAAA,EACA,IAAA,GAAiB,EAAC,EACmB;AACrC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,CAAA,SAAA,EAAY,kBAAA,CAAmB,KAAK,CAAC,CAAA,QAAA,CAAA;AAAA,MACrC,EAAE,IAAA,EAAM,GAAA,EAAK,KAAK,GAAA,EAAK,MAAA,EAAQ,KAAK,MAAA;AAAO,KAC7C;AAAA,EACF;AAAA;AAAA,EAGA,MAAA,CAAO,KAAA,EAAe,MAAA,EAAgB,IAAA,GAAiB,EAAC,EAAsC;AAC5F,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,YAAY,kBAAA,CAAmB,KAAK,CAAC,CAAA,SAAA,EAAY,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA;AAAA,MAC3E,EAAE,QAAQ,QAAA,EAAU,GAAA,EAAK,KAAK,GAAA,EAAK,MAAA,EAAQ,KAAK,MAAA;AAAO,KACzD;AAAA,EACF;AACF;AAEO,IAAM,OAAN,MAAW;AAAA,EAEhB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAC3B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,UAAA,CAAW,IAAI,CAAA;AAAA,EACpC;AAAA,EAF6B,IAAA;AAAA,EADpB,OAAA;AAAA;AAAA,EAMT,MAAA,CAAO,IAAA,EAAc,IAAA,GAAiB,EAAC,EAAiB;AACtD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAU,UAAA,EAAY,EAAE,IAAA,EAAM,EAAE,IAAA,EAAK,EAAG,KAAK,IAAA,CAAK,GAAA,EAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC/F;AAAA;AAAA,EAGA,MAAM,IAAA,CAAK,IAAA,GAAiB,EAAC,EAAmB;AAC9C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,KAAwB,UAAA,EAAY;AAAA,MAC9D,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,OAAO,CAAC,GAAI,GAAA,CAAI,IAAA,IAAQ,EAAG,CAAA;AAAA,EAC7B;AACF;;;ACnDO,IAAM,WAAN,MAAe;AAAA,EACpB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,MAAM,IAAA,CAAK,IAAA,GAAiB,EAAC,EAAuB;AAClD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,KAA4B,cAAA,EAAgB;AAAA,MACtE,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,OAAO,CAAC,GAAI,GAAA,CAAI,QAAA,IAAY,EAAG,CAAA;AAAA,EACjC;AAAA;AAAA,EAGA,MAAM,MAAA,CAAO,IAAA,EAAyB,IAAA,GAAiB,EAAC,EAAqB;AAC3E,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,KAAkC,cAAA,EAAgB;AAAA,MAC5E,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,OAAO,GAAA,CAAI,OAAA;AAAA,EACb;AAAA;AAAA,EAGA,GAAA,CAAI,SAAA,EAAmB,IAAA,GAAiB,EAAC,EAA2B;AAClE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAoB,gBAAgB,kBAAA,CAAmB,SAAS,CAAC,CAAA,CAAA,EAAI;AAAA,MACpF,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,MAAA,CAAO,SAAA,EAAmB,IAAA,EAAwB,IAAA,GAAiB,EAAC,EAAqB;AAC7F,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA;AAAA,MAC1B,CAAA,aAAA,EAAgB,kBAAA,CAAmB,SAAS,CAAC,CAAA,CAAA;AAAA,MAC7C,EAAE,QAAQ,OAAA,EAAS,IAAA,EAAM,KAAK,IAAA,CAAK,GAAA,EAAK,MAAA,EAAQ,IAAA,CAAK,MAAA;AAAO,KAC9D;AACA,IAAA,OAAO,GAAA,CAAI,OAAA;AAAA,EACb;AAAA;AAAA,EAGA,MAAA,CAAO,SAAA,EAAmB,IAAA,GAAiB,EAAC,EAAoC;AAC9E,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAA6B,gBAAgB,kBAAA,CAAmB,SAAS,CAAC,CAAA,CAAA,EAAI;AAAA,MAC7F,MAAA,EAAQ,QAAA;AAAA,MACR,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AACF;;;ACDO,SAAS,qBACd,MAAA,EACA,OAAA,EACA,eAAA,EACA,IAAA,GAAoC,EAAC,EAC5B;AACT,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,eAAA,EAAiB,OAAO,KAAA;AACxC,EAAA,IAAI,CAAA;AACJ,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,IAAA,IAAQ,eAAA,CAAgB,KAAA,CAAM,GAAG,CAAA,EAAG;AAC7C,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC3B,IAAA,IAAI,OAAO,EAAA,EAAI;AACf,IAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AACjC,IAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,CAAC,EAAE,IAAA,EAAK;AAClC,IAAA,IAAI,CAAA,KAAM,KAAK,CAAA,GAAI,CAAA;AAAA,SAAA,IACV,MAAM,IAAA,EAAM,GAAA,CAAI,IAAA,CAAK,CAAA,CAAE,aAAa,CAAA;AAAA,EAC/C;AACA,EAAA,IAAI,CAAC,CAAA,IAAK,CAAC,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,IAAK,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AACvD,EAAA,MAAM,SAAA,GAAY,KAAK,gBAAA,IAAoB,GAAA;AAC3C,EAAA,MAAM,GAAA,GAAM,KAAK,UAAA,IAAc,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AAC3D,EAAA,IAAI,IAAA,CAAK,IAAI,GAAA,GAAM,MAAA,CAAO,CAAC,CAAC,CAAA,GAAI,WAAW,OAAO,KAAA;AAClD,EAAA,MAAM,EAAE,UAAA,EAAY,eAAA,EAAgB,GAAI,UAAA,EAAW;AACnD,EAAA,MAAMA,IAAAA,GAAM,IAAI,WAAA,EAAY;AAC5B,EAAA,MAAM,OAAO,OAAO,OAAA,KAAY,WAAWA,IAAAA,CAAI,MAAA,CAAO,OAAO,CAAA,GAAI,OAAA;AACjE,EAAA,MAAM,WAAW,UAAA,CAAW,QAAA,EAAU,MAAM,CAAA,CACzC,OAAOA,IAAAA,CAAI,MAAA,CAAO,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA,CAC1B,MAAA,CAAO,IAAI,EACX,MAAA,EAAO;AACV,EAAA,OAAO,GAAA,CAAI,IAAA,CAAK,CAAC,EAAA,KAAO;AACtB,IAAA,IAAI,CAAC,gBAAA,CAAiB,IAAA,CAAK,EAAE,GAAG,OAAO,KAAA;AACvC,IAAA,OAAO,eAAA,CAAgB,UAAA,CAAW,EAAE,CAAA,EAAG,QAAQ,CAAA;AAAA,EACjD,CAAC,CAAA;AACH;AAUA,SAAS,UAAA,GAAyB;AAChC,EAAA,MAAM,OAAQ,UAAA,CAA4E,OAAA;AAC1F,EAAA,MAAM,GAAA,GAAM,IAAA,EAAM,gBAAA,GAAmB,aAAa,CAAA;AAClD,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,WAAW,GAAA,EAAyB;AAC3C,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,GAAA,CAAI,SAAS,CAAC,CAAA;AACzC,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAI,MAAA,EAAQ,CAAA,EAAA,MAAS,CAAC,CAAA,GAAI,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA,GAAI,CAAA,EAAG,IAAI,CAAA,GAAI,CAAC,GAAG,EAAE,CAAA;AACtF,EAAA,OAAO,GAAA;AACT;AAGO,IAAM,gCAAA,GACX;AAcF,SAAS,YAAA,GAA6B;AACpC,EAAA,MAAM,OAAQ,UAAA,CAA4E,OAAA;AAC1F,EAAA,MAAM,GAAA,GAAM,IAAA,EAAM,gBAAA,GAAmB,aAAa,CAAA;AAClD,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,cAAc,CAAA,EAAoB;AACzC,EAAA,IAAI,CAAA,KAAM,QAAQ,OAAO,CAAA,KAAM,UAAU,OAAO,IAAA,CAAK,UAAU,CAAC,CAAA;AAChE,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,GAAA,CAAI,aAAa,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAC/D,EAAA,MAAM,CAAA,GAAI,CAAA;AACV,EAAA,OAAO,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,CAAK,CAAC,EACrB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,KAAM,MAAS,CAAA,CAChC,MAAK,CACL,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAAA,EAAI,aAAA,CAAc,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA,CAAE,CAAA,CACxD,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AACd;AAEA,SAAS,cAAc,GAAA,EAAyB;AAC9C,EAAA,MAAM,GAAA,GAAM,KAAK,GAAG,CAAA;AACpB,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,GAAA,CAAI,MAAM,CAAA;AACrC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,CAAA,EAAA,EAAK,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA;AAC9D,EAAA,OAAO,GAAA;AACT;AAGA,SAAS,GAAA,CAAI,aAAqB,IAAA,EAA8B;AAC9D,EAAA,MAAMA,IAAAA,GAAM,IAAI,WAAA,EAAY;AAC5B,EAAA,MAAM,SAAA,GAAYA,IAAAA,CAAI,MAAA,CAAO,WAAW,CAAA;AACxC,EAAA,MAAM,IAAA,GAAOA,IAAAA,CAAI,MAAA,CAAO,CAAA,OAAA,EAAU,SAAA,CAAU,MAAM,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,CAAA,CAAA,CAAG,CAAA;AACnF,EAAA,MAAM,MAAM,IAAI,UAAA,CAAW,IAAA,CAAK,MAAA,GAAS,KAAK,MAAM,CAAA;AACpD,EAAA,GAAA,CAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AACf,EAAA,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AACzB,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,4BAA4B,GAAA,EAAkD;AAC5F,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,YAAA,EAAa;AACpC,EAAA,MAAMA,IAAAA,GAAM,IAAI,WAAA,EAAY;AAC5B,EAAA,MAAM,MAAM,CAAC,CAAA,KACX,CAAA,IAAK,IAAA,GAAO,OAAO,UAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAOA,KAAI,MAAA,CAAO,CAAC,CAAC,CAAA,CAAE,OAAO,KAAK,CAAA;AAC5E,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,8BAAA;AAAA,IACN,gBAAgB,GAAA,CAAI,EAAA;AAAA,IACpB,UAAU,GAAA,CAAI,QAAA;AAAA,IACd,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,YAAA,EAAc,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AAAA,IAC3B,UAAA,EAAY,GAAA,CAAI,UAAA,EAAY,IAAA,GACxB,EAAE,IAAA,EAAM,GAAA,CAAI,UAAA,CAAW,IAAA,EAAM,QAAQ,GAAA,CAAI,GAAA,CAAI,UAAA,CAAW,OAAO,GAAE,GACjE,IAAA;AAAA,IACJ,cAAc,GAAA,CAAI,YAAA;AAAA,IAClB,oBAAoB,GAAA,CAAI,kBAAA;AAAA,IACxB,yBAAA,EAA2B,GAAA,CAAI,GAAA,CAAI,kBAAkB,CAAA;AAAA,IACrD,wBAAA,EAA0B,GAAA,CAAI,GAAA,CAAI,iBAAiB,CAAA;AAAA,IACnD,wBAAA,EAA0B,GAAA,CAAI,GAAA,CAAI,iBAAiB,CAAA;AAAA,IACnD,qBAAqB,GAAA,CAAI,mBAAA;AAAA,IACzB,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB,aAAa,GAAA,CAAI;AAAA,GACnB;AACF;AASO,SAAS,yBAAA,CACd,KACA,IAAA,EACgC;AAChC,EAAA,MAAM,MAAM,GAAA,CAAI,SAAA;AAChB,EAAA,IAAI,CAAC,GAAA,IAAO,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,UAAU,CAAA,IAAK,GAAA,CAAI,UAAA,CAAW,MAAA,KAAW,CAAA;AACtE,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAW;AACzC,EAAA,IAAI,IAAI,WAAA,KAAgB,gCAAA;AACtB,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,kBAAA,EAAmB;AACjD,EAAA,MAAM,EAAE,YAAA,EAAa,GAAI,YAAA,EAAa;AACtC,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,aAAA,CAAc,IAAI,OAAO,CAAA;AAAA,EAClC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,eAAA,EAAgB;AAAA,EAC9C;AACA,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,GAAA,CAAI,WAAA,EAAa,IAAI,CAAA;AACrC,EAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,EAAA,KAAA,EAAO,KAAA,MAAW,CAAA,IAAK,GAAA,CAAI,UAAA,EAAY;AACrC,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,aAAA,CAAc,EAAE,GAAG,CAAA;AAAA,IAC3B,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,CAAA,IAAK,KAAK,IAAA,EAAM;AACzB,MAAA,IAAI,CAAA,CAAE,YAAA,IAAgB,CAAA,CAAE,YAAA,KAAiB,IAAI,WAAA,EAAa;AAC1D,MAAA,IAAI;AACF,QAAA,MAAM,CAAA,GAAI,aAAa,QAAQ,CAAA;AAC/B,QAAA,CAAA,CAAE,OAAO,GAAG,CAAA;AACZ,QAAA,IAAI,CAAA,CAAE,MAAA,CAAO,EAAE,GAAA,EAAK,CAAA,CAAE,gBAAgB,WAAA,EAAa,KAAA,EAAM,EAAG,GAAG,CAAA,EAAG;AAChE,UAAA,KAAA,GAAQ,CAAA,CAAE,KAAA;AACV,UAAA,MAAM,KAAA;AAAA,QACR;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,UAAU,IAAA,EAAM,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,QAAQ,eAAA,EAAgB;AAChE,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,WAAA,CAAY,OAAA,EAAS,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,EAC5E,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,oBAAA,EAAqB;AAAA,EACnD;AACA,EAAA,IAAI,cAAc,MAAM,CAAA,KAAM,aAAA,CAAc,2BAAA,CAA4B,GAAG,CAAC,CAAA;AAC1E,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,oBAAA,EAAqB;AACnD,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,KAAA,EAAM;AAC3B;AAGO,IAAM,yBAAA,uBAA+D,GAAA,CAAsB;AAAA,EAChG,UAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,YAAA,GAAN,cAA2B,UAAA,CAAW;AAAA;AAAA,EAElC,MAAA;AAAA,EAET,YACE,OAAA,EACA,MAAA,EACA,IAAA,EACA,IAAA,GAAkE,EAAC,EACnE;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAM,IAAI,CAAA;AACjC,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,cAAc,IAAI,CAAA;AAAA,EAClC;AACF;AAGO,IAAM,6BAAA,GAAN,cAA4C,YAAA,CAAa;AAAA;AAAA,EAErD,OAAA;AAAA;AAAA,EAEA,QAAA;AAAA,EACA,QAAA;AAAA;AAAA,EAEA,QAAA;AAAA;AAAA,EAEA,SAAA;AAAA,EAET,WAAA,CACE,OAAA,EACA,IAAA,EACA,IAAA,GAAsC,EAAC,EACvC;AACA,IAAA,KAAA,CAAM,OAAA,EAAS,GAAA,EAAK,IAAA,EAAM,IAAI,CAAA;AAC9B,IAAA,IAAA,CAAK,IAAA,GAAO,+BAAA;AACZ,IAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA;AACpB,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AACrB,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AACrB,IAAA,IAAA,CAAK,WAAW,IAAA,CAAK,SAAA;AACrB,IAAA,IAAI,OAAO,IAAA,CAAK,UAAA,KAAe,QAAA,EAAU,IAAA,CAAK,YAAY,IAAA,CAAK,UAAA;AAAA,EACjE;AACF;AAgBO,IAAM,UAAN,MAAc;AAAA,EACnB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ7B,MAAA,CAAO,IAAA,EAAqB,IAAA,GAAiB,EAAC,EAAiC;AAC7E,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,CAAC,IAAA,CAAK,UAAA;AAC3B,MAAA,MAAM,IAAI,UAAU,4DAA4D,CAAA;AAClF,IAAA,OAAO,IAAA,CAAK,KAA0B,kBAAA,EAAoB;AAAA,MACxD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA;AAAA,MACA,OAAA,EAAS,IAAA;AAAA,MACT,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CAAI,EAAA,EAAY,IAAA,GAAiB,EAAC,EAAwB;AACxD,IAAA,OAAO,KAAK,IAAA,CAAiB,CAAA,iBAAA,EAAoB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,MACzE,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAA,CAAO,EAAA,EAAY,IAAA,GAAiB,EAAC,EAA6B;AAChE,IAAA,OAAO,KAAK,IAAA,CAAsB,CAAA,iBAAA,EAAoB,kBAAA,CAAmB,EAAE,CAAC,CAAA,OAAA,CAAA,EAAW;AAAA,MACrF,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAA;AAAA;AAAA,MACT,OAAA,EAAS,IAAA;AAAA,MACT,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAA,CAAY,OAAA,EAAiB,IAAA,GAAiB,EAAC,EAAgC;AAC7E,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,OAAA,CAAQ,kCAAA,EAAoC,EAAE,CAAA;AACjE,IAAA,OAAO,KAAK,IAAA,CAAyB,CAAA,yBAAA,EAA4B,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,MACzF,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAA,CAAO,IAAA,GAAiB,EAAC,EAA2B;AAClD,IAAA,OAAO,KAAK,IAAA,CAAoB,SAAA,EAAW,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EACpE;AAAA;AAAA,EAGA,OAAA,CAAQ,IAAA,GAAiB,EAAC,EAA4B;AACpD,IAAA,OAAO,KAAK,IAAA,CAAqB,qBAAA,EAAuB,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EACjF;AAAA;AAAA,EAGA,IAAA,CAAK,IAAA,GAAiB,EAAC,EAAyB;AAC9C,IAAA,OAAO,KAAK,IAAA,CAAkB,kBAAA,EAAoB,EAAE,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,iBAAA,CACJ,GAAA,EACA,IAAA,GAAqD,EAAC,EACb;AACzC,IAAA,IAAI,CAAC,IAAI,SAAA,EAAW,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,QAAQ,UAAA,EAAW;AAC3D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,IAAS,MAAM,IAAA,CAAK,KAAK,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA;AAClE,IAAA,OAAO,yBAAA,CAA0B,KAAK,IAAI,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAA,CAAQ,EAAA,EAAY,IAAA,GAA2B,EAAC,EAAwB;AAC5E,IAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,GAAA;AACtC,IAAA,MAAM,SAAA,GAAY,KAAK,SAAA,IAAa,IAAA;AACpC,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,IAAA,CAAK,SAAS,yBAAyB,CAAA;AAC7D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,IAAA,WAAS;AACP,MAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,GAAA,CAAI,IAAI,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA;AACtD,MAAA,IAAA,CAAK,SAAS,GAAG,CAAA;AACjB,MAAA,IAAI,KAAA,CAAM,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,OAAO,GAAA;AAClC,MAAA,MAAM,IAAA,GAAO,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI;AACjC,MAAA,IAAI,IAAA,IAAQ,CAAA;AACV,QAAA,MAAM,IAAI,YAAA;AAAA,UACR,qBAAqB,EAAE,CAAA,OAAA,EAAU,GAAA,CAAI,MAAM,UAAU,SAAS,CAAA,GAAA,CAAA;AAAA,UAC9D,CAAA;AAAA,UACA;AAAA,SACF;AACF,MAAA,MAAM,eAAe,IAAA,CAAK,GAAA,CAAI,YAAY,IAAI,CAAA,EAAG,KAAK,MAAM,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,MAAc,IAAA,CAAQ,IAAA,EAAc,IAAA,EAAkC;AACpE,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAQ,MAAM,IAAI,CAAA;AAAA,IAC3C,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,cAAA,CAAe,MAAM,GAAG,CAAA;AAAA,IAChC;AAAA,EACF;AACF;AAEA,SAAS,cAAc,IAAA,EAAyD;AAC9E,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,IAAY,WAAW,IAAA,EAAM;AACvD,IAAA,MAAM,IAAK,IAAA,CAA4B,KAAA;AACvC,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA;AAClC,IAAA,IAAI,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA;AAAA,EACzC;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,oBAAoB,IAAA,EAAiD;AAC5E,EAAA,OACE,CAAC,CAAC,IAAA,IACF,OAAO,IAAA,KAAS,QAAA,IACf,IAAA,CAA6B,KAAA,KAAU,oBAAA,IACxC,OAAQ,IAAA,CAAiC,SAAA,KAAc,QAAA;AAE3D;AAGA,SAAS,cAAA,CAAe,MAAc,GAAA,EAAuB;AAC3D,EAAA,IAAI,EAAE,GAAA,YAAe,UAAA,CAAA,IAAe,GAAA,YAAe,cAAc,OAAO,GAAA;AACxE,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG,OAAO,GAAA;AAC7B,EAAA,MAAM,OAAO,EAAE,SAAA,EAAW,IAAI,SAAA,EAAW,UAAA,EAAY,IAAI,UAAA,EAAW;AACpE,EAAA,IAAI,IAAI,MAAA,KAAW,GAAA,IAAO,mBAAA,CAAoB,GAAA,CAAI,IAAI,CAAA,EAAG;AACvD,IAAA,MAAM,IAAI,GAAA,CAAI,IAAA;AACd,IAAA,OAAO,IAAI,6BAAA;AAAA,MACT,CAAA,cAAA,EAAiB,IAAI,CAAA,yCAAA,EAAuC,CAAA,CAAE,OAAO,CAAA,WAAA,EAAc,CAAA,CAAE,QAAQ,CAAA,CAAA,EAAI,CAAA,CAAE,QAAQ,CAAA,aAAA,EAAgB,CAAA,CAAE,SAAS,CAAA,EAAG,CAAA,CAAE,aAAa,CAAA,oCAAA,EAAkC,CAAA,CAAE,UAAU,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAAA,MAC7M,CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AACrC,EAAA,MAAM,IAAA,GACJ,MAAA,KAAW,IAAA,GAAO,EAAA,GAAK,CAAA,EAAA,EAAK,OAAO,MAAA,KAAW,QAAA,GAAW,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA,CAAA;AAC1F,EAAA,OAAO,IAAI,YAAA;AAAA,IACT,iBAAiB,IAAI,CAAA,QAAA,EAAM,GAAA,CAAI,MAAM,GAAG,IAAI,CAAA,CAAA;AAAA,IAC5C,GAAA,CAAI,MAAA;AAAA,IACJ,GAAA,CAAI,IAAA;AAAA,IACJ;AAAA,GACF;AACF;AAEA,SAAS,cAAA,CAAe,IAAY,MAAA,EAAqC;AACvE,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,IAAI,MAAA,EAAQ,OAAA,EAAS,OAAO,MAAA,CAAO,OAAO,MAAM,CAAA;AAChD,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,YAAA,CAAa,CAAC,CAAA;AACd,MAAA,MAAA,CAAO,QAAQ,MAAM,CAAA;AAAA,IACvB,CAAA;AACA,IAAA,MAAM,CAAA,GAAI,WAAW,MAAM;AACzB,MAAA,MAAA,EAAQ,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAC5C,MAAA,OAAA,EAAQ;AAAA,IACV,GAAG,EAAE,CAAA;AACL,IAAA,MAAA,EAAQ,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EAC3D,CAAC,CAAA;AACH;;;AC9bO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA,EAE7B,MAAM,MAAA,CAAO,IAAA,EAAsB,IAAA,GAA6B,EAAC,EAA6B;AAC5F,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,eAAA,EAAiB;AAAA,MACnD,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,OAAO,IAAA,CAAK,KAAA,IAAS,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAM;AAAA,MAC7D,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,MAAM,GAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,OAAO;AAAA,MACL,YAAY,OAAO,GAAA,CAAI,WAAA,KAAgB,QAAA,GAAW,IAAI,WAAA,GAAc,EAAA;AAAA,MACpE,GAAA;AAAA,MACA,SAAA,EAAW,IAAI,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA,IAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA;AAAA,MAChF,QAAA,EAAU,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA;AAAA,MAC7C,SAAS,GAAA,CAAI;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAA,CAAO,IAAA,EAAsB,IAAA,GAA6B,EAAC,EAAoB;AAC7E,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,eAAA,EAAiB;AAAA,MACxD,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,OAAO,IAAA,CAAK,KAAA,IAAS,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAK;AAAA,MAC5D,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAA,EAAW,CAAA;AAAA,MACX,OAAA,EAAS;AAAA,KACV,CAAA;AAED,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,WAAA;AACJ,IAAA,MAAM,KAAA,GAAQ,IAAI,OAAA,CAA+B,CAAC,SAAS,MAAA,KAAW;AACpE,MAAA,YAAA,GAAe,OAAA;AACf,MAAA,WAAA,GAAc,MAAA;AAAA,IAChB,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAEpB,IAAA,IAAI,UAAA,GAAa,EAAA;AACjB,IAAA,IAAI,QAAA,GAAqC,IAAA;AACzC,IAAA,IAAI,GAAA,GAAuB,IAAA;AAE3B,IAAA,gBAAgB,MAAA,GAAgE;AAC9E,MAAA,IAAI;AACF,QAAA,GAAA,GAAM,MAAM,cAAA;AACZ,QAAA,WAAA,MAAiB,KAAA,IAAS,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,MAAM,CAAA,EAAG;AACnD,UAAA,MAAM,EAAA,GAAK,UAAgC,KAAK,CAAA;AAChD,UAAA,IAAI,CAAC,EAAA,EAAI;AACT,UAAA,IAAI,OAAO,EAAA,CAAG,IAAA,KAAS,QAAA,EAAU,EAAA,CAAG,OAAO,KAAA,CAAM,KAAA;AACjD,UAAA,IAAI,GAAG,IAAA,KAAS,4BAAA,IAAgC,OAAO,EAAA,CAAG,UAAU,QAAA,EAAU;AAC5E,YAAA,UAAA,IAAc,EAAA,CAAG,KAAA;AAAA,UACnB,CAAA,MAAA,IAAW,EAAA,CAAG,IAAA,KAAS,oBAAA,IAAwB,GAAG,QAAA,EAAU;AAC1D,YAAA,QAAA,GAAW,EAAA,CAAG,QAAA;AAAA,UAChB;AACA,UAAA,MAAM,EAAA;AACN,UAAA,IAAI,EAAA,CAAG,SAAS,oBAAA,EAAsB;AAAA,QACxC;AACA,QAAA,YAAA,CAAa;AAAA,UACX,UAAA;AAAA,UACA,QAAA;AAAA,UACA,SAAA,EAAW,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,kBAAkB,KAAK,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,IAAK,IAAA;AAAA,UACrF,QAAA,EAAU,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,mBAAmB,CAAA;AAAA,UAC7C,SAAS,GAAA,CAAI;AAAA,SACd,CAAA;AAAA,MACH,SAAS,GAAA,EAAK;AACZ,QAAA,WAAA,CAAY,GAAG,CAAA;AACf,QAAA,MAAM,GAAA;AAAA,MACR;AAAA,IACF;AAEA,IAAA,gBAAgB,QAAA,GAAoD;AAClE,MAAA,WAAA,MAAiB,EAAA,IAAM,QAAO,EAAG;AAC/B,QAAA,IAAI,EAAA,CAAG,IAAA,KAAS,4BAAA,IAAgC,OAAO,GAAG,KAAA,KAAU,QAAA;AAClE,UAAA,MAAM,EAAA,CAAG,KAAA;AAAA,MACb;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,CAAC,MAAA,CAAO,aAAa,GAAG,MAAM,MAAA,EAAO;AAAA,MACrC,IAAA,EAAM,OAAO,EAAE,CAAC,OAAO,aAAa,GAAG,MAAM,QAAA,EAAS,EAAE,CAAA;AAAA,MACxD;AAAA,KACF;AAAA,EACF;AACF;;;ACxEA,IAAM,GAAA,GAAM,kBAAA;AAEL,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,QACE,SAAA,EACA,IAAA,GAAiC,EAAC,EAClC,IAAA,GAAiB,EAAC,EACa;AAC/B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAA2B,gBAAgB,GAAA,CAAI,SAAS,CAAC,CAAA,MAAA,CAAA,EAAU;AAAA,MAClF,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,KAAA,CAAM,SAAA,EAAmB,IAAA,GAAiB,EAAC,EAAkC;AAC3E,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAA2B,gBAAgB,GAAA,CAAI,SAAS,CAAC,CAAA,MAAA,CAAA,EAAU;AAAA,MAClF,MAAA,EAAQ,KAAA;AAAA,MACR,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAA,CAAQ,SAAA,EAAmB,IAAA,GAAiB,EAAC,EAA0C;AACrF,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAmC,gBAAgB,GAAA,CAAI,SAAS,CAAC,CAAA,MAAA,CAAA,EAAU;AAAA,MAC1F,MAAA,EAAQ,QAAA;AAAA,MACR,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AACF;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,KACE,SAAA,EACA,KAAA,GAA+C,EAAC,EAChD,IAAA,GAAiB,EAAC,EACU;AAC5B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAwB,gBAAgB,GAAA,CAAI,SAAS,CAAC,CAAA,OAAA,CAAA,EAAW;AAAA,MAChF,OAAO,EAAE,KAAA,EAAO,MAAM,KAAA,EAAO,KAAA,EAAO,MAAM,KAAA,EAAM;AAAA,MAChD,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAA,CACE,SAAA,EACA,IAAA,EACA,IAAA,GAAiB,EAAC,EACoB;AACtC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAkC,gBAAgB,GAAA,CAAI,SAAS,CAAC,CAAA,OAAA,CAAA,EAAW;AAAA,MAC1F,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AACF;AAEO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,MAAM,KACJ,SAAA,EACA,KAAA,GAAuD,EAAC,EACxD,IAAA,GAAiB,EAAC,EACS;AAC3B,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA;AAAA,MAC1B,CAAA,aAAA,EAAgB,GAAA,CAAI,SAAS,CAAC,CAAA,SAAA,CAAA;AAAA,MAC9B;AAAA,QACE,OAAO,EAAE,OAAA,EAAS,MAAM,OAAA,EAAS,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,QACtD,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,QAAQ,IAAA,CAAK;AAAA;AACf,KACF;AACA,IAAA,OAAO,CAAC,GAAI,GAAA,CAAI,QAAA,IAAY,EAAG,CAAA;AAAA,EACjC;AAAA;AAAA,EAGA,MAAA,CACE,SAAA,EACA,IAAA,EACA,IAAA,GAAiB,EAAC,EACe;AACjC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAA6B,gBAAgB,GAAA,CAAI,SAAS,CAAC,CAAA,QAAA,CAAA,EAAY;AAAA,MACtF,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,WAAA,CACE,SAAA,EACA,SAAA,EACA,IAAA,GAAiB,EAAC,EAC2B;AAC7C,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,gBAAgB,GAAA,CAAI,SAAS,CAAC,CAAA,SAAA,EAAY,GAAA,CAAI,SAAS,CAAC,CAAA,QAAA,CAAA;AAAA,MACxD,EAAE,QAAQ,MAAA,EAAQ,GAAA,EAAK,KAAK,GAAA,EAAK,MAAA,EAAQ,KAAK,MAAA;AAAO,KACvD;AAAA,EACF;AACF;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,MAAM,IAAA,CAAK,SAAA,EAAmB,IAAA,GAAiB,EAAC,EAA4B;AAC1E,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA;AAAA,MAC1B,CAAA,aAAA,EAAgB,GAAA,CAAI,SAAS,CAAC,CAAA,OAAA,CAAA;AAAA,MAC9B,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,MAAA,EAAQ,KAAK,MAAA;AAAO,KACvC;AACA,IAAA,OAAO,CAAC,GAAI,GAAA,CAAI,MAAA,IAAU,EAAG,CAAA;AAAA,EAC/B;AAAA;AAAA,EAGA,MAAA,CACE,SAAA,EACA,IAAA,EACA,IAAA,GAAiB,EAAC,EACY;AAC9B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAA0B,gBAAgB,GAAA,CAAI,SAAS,CAAC,CAAA,OAAA,CAAA,EAAW;AAAA,MAClF,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAA,CACE,SAAA,EACA,OAAA,EACA,IAAA,GAAiB,EAAC,EACoB;AACtC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,MACf,gBAAgB,GAAA,CAAI,SAAS,CAAC,CAAA,QAAA,EAAW,GAAA,CAAI,OAAO,CAAC,CAAA,CAAA;AAAA,MACrD,EAAE,QAAQ,QAAA,EAAU,GAAA,EAAK,KAAK,GAAA,EAAK,MAAA,EAAQ,KAAK,MAAA;AAAO,KACzD;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,YAAA,CACJ,KAAA,GAAgC,EAAC,EACjC,IAAA,GAAiB,EAAC,EACQ;AAC1B,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA;AAAA,MAC1B,6BAAA;AAAA,MACA;AAAA,QACE,OAAO,EAAE,QAAA,EAAU,KAAA,CAAM,QAAA,GAAW,MAAM,MAAA,EAAU;AAAA,QACpD,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,QAAQ,IAAA,CAAK;AAAA;AACf,KACF;AACA,IAAA,OAAO,CAAC,GAAI,GAAA,CAAI,QAAA,IAAY,EAAG,CAAA;AAAA,EACjC;AACF;AAEO,IAAM,WAAN,MAAe;AAAA,EAMpB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,aAAA,CAAc,IAAI,CAAA;AACpC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,eAAA,CAAgB,IAAI,CAAA;AACxC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,YAAA,CAAa,IAAI,CAAA;AAClC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,aAAA,CAAc,IAAI,CAAA;AAAA,EACtC;AAAA,EAL6B,IAAA;AAAA,EALpB,MAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA;AAAA,EAUT,MAAM,MAAA,CACJ,IAAA,GAA6B,EAAC,EAC9B,IAAA,GAAiB,EAAC,EACuB;AACzC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,cAAA,EAAgB;AAAA,MAClD,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,MAAM,OAAA,GAAW,MAAM,GAAA,CAAI,IAAA,EAAK;AAChC,IAAA,OAAO,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,GAAA,CAAI,WAAW,GAAA,EAAI;AAAA,EACnD;AAAA;AAAA,EAGA,MAAM,IAAA,CACJ,KAAA,GAAgD,EAAC,EACjD,IAAA,GAAiB,EAAC,EACU;AAC5B,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,KAA4B,cAAA,EAAgB;AAAA,MACtE,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,QAAA,EAAU,KAAA,CAAM,QAAA,GAAW,GAAA,GAAM,MAAA,EAAW,CAAA,EAAG,GAAA,EAAI;AAAA,MAChF,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,OAAO,CAAC,GAAI,GAAA,CAAI,QAAA,IAAY,EAAG,CAAA;AAAA,EACjC;AAAA;AAAA,EAGA,IACE,SAAA,EACA,KAAA,GAA4B,EAAC,EAC7B,IAAA,GAAiB,EAAC,EACM;AACxB,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAoB,gBAAgB,GAAA,CAAI,SAAS,CAAC,CAAA,CAAA,EAAI;AAAA,MACrE,OAAO,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,GAAG,GAAA,EAAI;AAAA,MACpC,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAA,CAAO,SAAA,EAAmB,IAAA,EAA2B,IAAA,GAAiB,EAAC,EAAqB;AAC1F,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAc,gBAAgB,GAAA,CAAI,SAAS,CAAC,CAAA,CAAA,EAAI;AAAA,MAC/D,MAAA,EAAQ,OAAA;AAAA,MACR,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAA,CAAO,SAAA,EAAmB,IAAA,GAAiB,EAAC,EAAoC;AAC9E,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAA6B,gBAAgB,GAAA,CAAI,SAAS,CAAC,CAAA,CAAA,EAAI;AAAA,MAC9E,MAAA,EAAQ,QAAA;AAAA,MACR,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,QAAA,CACE,SAAA,EACA,IAAA,EACA,IAAA,GAAiB,EAAC,EACgB;AAClC,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAA8B,gBAAgB,GAAA,CAAI,SAAS,CAAC,CAAA,SAAA,CAAA,EAAa;AAAA,MACxF,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,OACL,SAAA,EACA,KAAA,GAA4C,EAAC,EAC7C,IAAA,GAAiB,EAAC,EACmC;AACrD,IAAA,MAAM,MAAA,GAAS,KAAK,IAAA,CAAK,GAAA,CAAI,gBAAgB,GAAA,CAAI,SAAS,CAAC,CAAA,OAAA,CAAA,EAAW;AAAA,MACpE,OAAO,EAAE,KAAA,EAAO,MAAM,KAAA,EAAO,KAAA,EAAO,MAAM,KAAA,EAAM;AAAA,MAChD,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,WAAA,MAAiB,SAAS,MAAA,EAAQ;AAChC,MAAA,MAAM,IAAA,GAAO,UAAmC,KAAK,CAAA;AACrD,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,IAAA,EAAK;AAAA,IACnC;AAAA,EACF;AACF;;;ACvUO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM7B,MAAM,MAAA,CACJ,IAAA,EACA,IAAA,GAA+D,EAAC,EACpC;AAC5B,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,eAAA,EAAiB;AAAA,MACnD,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,OAAQ,MAAM,IAAI,IAAA,EAAK;AAAA,EACzB;AACF,CAAA;;;ACXO,IAAM,QAAN,MAAY;AAAA,EACjB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,KAAK,KAAA,GAAuB,EAAC,EAAG,IAAA,GAAiB,EAAC,EAA0B;AAC1E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAmB,WAAA,EAAa;AAAA,MAC/C,KAAA,EAAO,EAAE,OAAA,EAAS,KAAA,CAAM,OAAA,EAAS,OAAO,KAAA,CAAM,KAAA,EAAO,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAO;AAAA,MAC1E,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,OAAA,CAAQ,IAAA,GAAiB,EAAC,EAAoB;AAClD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,KAAgC,mBAAA,EAAqB;AAAA,MAC/E,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,OAAO,CAAC,GAAI,GAAA,CAAI,KAAA,IAAS,EAAG,CAAA;AAAA,EAC9B;AAAA;AAAA,EAGA,KAAA,CAAM,KAAA,EAAuB,IAAA,GAAiB,EAAC,EAAuB;AACpE,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAgB,iBAAA,EAAmB;AAAA,MAClD,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,YAAiB,OAAO,KAAA,CAAM,WAAA,KAAgB,KAAA,EAAM;AAAA,MACpE,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CAAI,EAAA,EAAY,IAAA,GAAiB,EAAC,EAAkB;AAClD,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAW,aAAa,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,MACjE,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAA,CAAQ,EAAA,EAAY,IAAA,EAA0B,IAAA,GAAiB,EAAC,EAAiC;AAC/F,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAA0B,aAAa,kBAAA,CAAmB,EAAE,CAAC,CAAA,QAAA,CAAA,EAAY;AAAA,MACxF,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AACF;;;ACzCO,IAAM,WAAN,MAAe;AAAA,EACpB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,IAAA,CAAK,IAAA,GAAiB,EAAC,EAAyB;AAC9C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAkB,cAAA,EAAgB,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,EAC3F;AAAA;AAAA,EAGA,MAAA,CAAO,IAAA,EAA4B,IAAA,GAAiB,EAAC,EAA4B;AAC/E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAqB,cAAA,EAAgB,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EACpH;AAAA;AAAA,EAGA,MAAA,CAAO,EAAA,EAAY,IAAA,EAAoB,IAAA,GAAiB,EAAC,EAA4B;AACnF,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAqB,gBAAgB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAM,GAAA,EAAK,IAAA,CAAK,KAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC/I;AAAA;AAAA,EAGA,MAAA,CAAO,EAAA,EAAY,IAAA,GAAiB,EAAC,EAAoC;AACvE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAA6B,CAAA,aAAA,EAAgB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,UAAU,GAAA,EAAK,IAAA,CAAK,KAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EAClJ;AAAA;AAAA,EAGA,YAAA,CAAa,EAAA,EAAY,IAAA,GAAiB,EAAC,EAA0C;AACnF,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAAmC,CAAA,aAAA,EAAgB,mBAAmB,EAAE,CAAC,kBAAkB,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,IAAI,GAAA,EAAK,IAAA,CAAK,KAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC9K;AAAA;AAAA;AAAA,EAIA,SAAA,CAAU,EAAA,EAAY,MAAA,EAAgB,IAAA,GAAiB,EAAC,EAAuC;AAC7F,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAAgC,CAAA,aAAA,EAAgB,mBAAmB,EAAE,CAAC,CAAA,OAAA,CAAA,EAAW,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAM,EAAE,MAAA,EAAO,EAAG,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,QAAQ,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EAC1L;AAAA;AAAA,EAGA,KAAK,EAAA,EAAY,IAAA,GAA2B,EAAC,EAAG,IAAA,GAAiB,EAAC,EAA+B;AAC/F,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAwB,gBAAgB,kBAAA,CAAmB,EAAE,CAAC,CAAA,KAAA,CAAA,EAAS,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,GAAA,EAAK,IAAA,CAAK,KAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EACtJ;AAAA;AAAA,EAGA,MAAA,CAAO,EAAA,EAAY,KAAA,EAAgB,IAAA,GAAiB,EAAC,EAA2B;AAC9E,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAoB,gBAAgB,kBAAA,CAAmB,EAAE,CAAC,CAAA,OAAA,CAAA,EAAW,EAAE,OAAO,EAAE,KAAA,IAAS,GAAA,EAAK,IAAA,CAAK,KAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EAChJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAA,CACJ,EAAA,EACA,QACA,KAAA,EACA,IAAA,GAA2C,EAAC,EACN;AACtC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAChC,IAAA,MAAM,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,KAAQ,GAAI,CAAA;AACtC,IAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,MAAA,CAAO,UAAU,KAAA,EAAO,IAAI,aAAY,CAAE,MAAA,CAAO,MAAM,CAAA,EAAG,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,WAAU,EAAG,KAAA,EAAO,CAAC,MAAM,CAAC,CAAA;AACrI,IAAA,MAAM,MAAM,IAAI,UAAA,CAAW,MAAM,MAAA,CAAO,MAAA,CAAO,KAAK,MAAA,EAAQ,GAAA,EAAK,IAAI,WAAA,EAAY,CAAE,OAAO,CAAA,EAAG,CAAC,IAAI,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AACzG,IAAA,MAAM,KAAK,KAAA,CAAM,IAAA,CAAK,GAAA,EAAK,CAAC,MAAM,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AAC1E,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAAkC,aAAa,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,MACxF,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,GAAA;AAAA,MACT,GAAA,EAAK;AAAA,QACH,GAAG,IAAA,CAAK,GAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,GAAG,KAAK,GAAA,EAAK,OAAA;AAAA,UACb,cAAA,EAAgB,kBAAA;AAAA,UAChB,mBAAA,EAAqB,CAAA,EAAA,EAAK,CAAC,CAAA,IAAA,EAAO,EAAE,CAAA,CAAA;AAAA,UACpC,GAAI,KAAK,UAAA,GAAa,EAAE,oBAAoB,IAAA,CAAK,UAAA,KAAe;AAAC;AACnE,OACF;AAAA,MACA,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AACF;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,KAAK,KAAA,GAA8C,EAAC,EAAG,IAAA,GAAiB,EAAC,EAA8B;AACrG,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAuB,mBAAA,EAAqB;AAAA,MAC3D,KAAA,EAAO,EAAE,MAAA,EAAQ,KAAA,CAAM,SAAS,GAAA,GAAM,MAAA,EAAW,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM;AAAA,MACpE,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,QAAA,CAAS,GAAA,EAAgB,IAAA,GAAiB,EAAC,EAA+B;AACxE,IAAA,OAAO,IAAA,CAAK,KAAK,IAAA,CAAwB,wBAAA,EAA0B,EAAE,MAAA,EAAQ,MAAA,EAAQ,MAAM,GAAA,GAAM,EAAE,KAAI,GAAI,IAAI,GAAA,EAAK,IAAA,CAAK,KAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EACrJ;AAAA;AAAA,EAGA,MAAA,CAAO,EAAA,EAAY,IAAA,GAAiB,EAAC,EAAkC;AACrE,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAA2B,qBAAqB,kBAAA,CAAmB,MAAA,CAAO,EAAE,CAAC,CAAC,IAAI,EAAE,MAAA,EAAQ,UAAU,GAAA,EAAK,IAAA,CAAK,KAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC7J;AAAA;AAAA,EAGA,UAAA,CAAW,GAAA,EAAe,IAAA,GAAiB,EAAC,EAAkC;AAC5E,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA,CAA2B,0BAAA,EAA4B,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,EAAE,GAAA,IAAO,GAAA,EAAK,IAAA,CAAK,KAAK,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC/I;AACF;;;AC5GO,IAAM,SAAN,MAAa;AAAA,EAClB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM7B,MAAM,MAAA,CACJ,KAAA,EACA,UAAA,EACA,IAAA,GAA+D,EAAC,EACvC;AACzB,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,KAA6B,YAAA,EAAc;AAAA,MACrE,IAAA,EAAM,EAAE,KAAA,EAAO,GAAI,UAAA,KAAe,MAAA,GAAY,EAAE,WAAA,EAAa,UAAA,EAAW,GAAI,EAAC,EAAG;AAAA,MAChF,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AACD,IAAA,OAAO,EAAE,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,SAAA,EAAW,IAAI,UAAA,EAAY,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,GAAA,EAAI;AAAA,EAC9E;AACF;;;ACtBO,IAAM,QAAN,MAAY;AAAA,EACjB,YAA6B,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAmB;AAAA,EAAnB,IAAA;AAAA;AAAA,EAG7B,MAAA,CAAO,IAAA,EAAyB,IAAA,GAAiB,EAAC,EAAgC;AAChF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAyB,kBAAA,EAAoB;AAAA,MAC5D,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,KAAA,CAAM,IAAA,EAAwB,IAAA,GAAiB,EAAC,EAA+B;AAC7E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAwB,iBAAA,EAAmB;AAAA,MAC1D,IAAA;AAAA,MACA,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AACF;;;ACxBO,IAAM,iBAAA,GAA4C;AAAA;AAAA,EAEvD,oBAAA,EAAsB,yBAAA;AAAA,EACtB,cAAA,EAAgB,kBAAA;AAAA,EAChB,aAAA,EAAe,iBAAA;AAAA;AAAA,EAEf,gBAAA,EAAkB,mBAAA;AAAA,EAClB,eAAA,EAAiB,kBAAA;AAAA,EACjB,mBAAA,EAAqB,kBAAA;AAAA,EACrB,YAAA,EAAc,cAAA;AAAA,EACd,oBAAA,EAAsB,eAAA;AAAA;AAAA,EAEtB,UAAA,EAAY,aAAA;AAAA;AAAA,EAEZ,SAAA,EAAW,YAAA;AAAA,EACX,cAAA,EAAgB,cAAA;AAAA,EAChB,SAAA,EAAW,eAAA;AAAA;AAAA,EAEX,YAAA,EAAc,YAAA;AAAA,EACd,cAAA,EAAgB,oBAAA;AAAA,EAChB,gBAAA,EAAkB,mBAAA;AAAA,EAClB,WAAA,EAAa,iBAAA;AAAA,EACb,iBAAA,EAAmB,mBAAA;AAAA,EACnB,cAAA,EAAgB,oBAAA;AAAA,EAChB,cAAA,EAAgB,oBAAA;AAAA;AAAA,EAEhB,WAAA,EAAa,cAAA;AAAA,EACb,UAAA,EAAY,aAAA;AAAA;AAAA,EAEZ,SAAA,EAAW,YAAA;AAAA,EACX,gBAAA,EAAkB,eAAA;AAAA,EAClB,YAAA,EAAc,aAAA;AAAA,EACd,OAAA,EAAS,WAAA;AAAA,EACT,WAAA,EAAa,eAAA;AAAA;AAAA,EAEb,YAAA,EAAc,eAAA;AAAA,EACd,aAAA,EAAe,iBAAA;AAAA,EACf,aAAA,EAAe,iBAAA;AAAA,EACf,aAAA,EAAe,iBAAA;AAAA,EACf,mBAAA,EAAqB,uBAAA;AAAA,EACrB,gBAAA,EAAkB,oBAAA;AAAA,EAClB,WAAA,EAAa,eAAA;AAAA,EACb,iBAAA,EAAmB,iBAAA;AAAA,EACnB,kBAAA,EAAoB,mBAAA;AAAA,EACpB,iBAAA,EAAmB,oBAAA;AAAA,EACnB,qBAAA,EAAuB,wBAAA;AAAA,EACvB,kBAAA,EAAoB,sBAAA;AAAA,EACpB,mBAAA,EAAqB,0BAAA;AAAA;AAAA,EAErB,aAAA,EAAe,iBAAA;AAAA,EACf,YAAA,EAAc,eAAA;AAAA,EACd,UAAA,EAAY,cAAA;AAAA,EACZ,aAAA,EAAe,iBAAA;AAAA,EACf,aAAA,EAAe,iBAAA;AAAA,EACf,iBAAA,EAAmB,sBAAA;AAAA,EACnB,mBAAA,EAAqB,wBAAA;AAAA,EACrB,mBAAA,EAAqB,wBAAA;AAAA,EACrB,oBAAA,EAAsB,0BAAA;AAAA,EACtB,yBAAA,EAA2B,+BAAA;AAAA,EAC3B,gBAAA,EAAkB,mBAAA;AAAA,EAClB,iBAAA,EAAmB,wBAAA;AAAA,EACnB,qBAAA,EAAuB,sBAAA;AAAA,EACvB,mBAAA,EAAqB,wBAAA;AAAA,EACrB,aAAA,EAAe,iBAAA;AAAA;AAAA,EAEf,kBAAA,EAAoB,uBAAA;AAAA,EACpB,WAAA,EAAa,cAAA;AAAA,EACb,YAAA,EAAc,gBAAA;AAAA,EACd,YAAA,EAAc,gBAAA;AAAA;AAAA,EAEd,SAAA,EAAW,YAAA;AAAA,EACX,UAAA,EAAY,cAAA;AAAA,EACZ,UAAA,EAAY,YAAA;AAAA,EACZ,kBAAA,EAAoB,kBAAA;AAAA;AAAA,EAEpB,wBAAA,EAA0B,8BAAA;AAAA,EAC1B,iBAAA,EAAmB,sBAAA;AAAA,EACnB,kBAAA,EAAoB,wBAAA;AAAA,EACpB,kBAAA,EAAoB,wBAAA;AAAA,EACpB,SAAA,EAAW,aAAA;AAAA,EACX,QAAA,EAAU,WAAA;AAAA,EACV,cAAA,EAAgB,mBAAA;AAAA,EAChB,YAAA,EAAc,kBAAA;AAAA,EACd,eAAA,EAAiB,qBAAA;AAAA;AAAA,EAEjB,YAAA,EAAc,eAAA;AAAA,EACd,aAAA,EAAe,iBAAA;AAAA,EACf,UAAA,EAAY,cAAA;AAAA,EACZ,aAAA,EAAe,iBAAA;AAAA,EACf,aAAA,EAAe,iBAAA;AAAA;AAAA,EAEf,gBAAA,EAAkB,mBAAA;AAAA,EAClB,iBAAA,EAAmB,qBAAA;AAAA,EACnB,iBAAA,EAAmB,qBAAA;AAAA,EACnB,cAAA,EAAgB,kBAAA;AAAA,EAChB,iBAAA,EAAmB,qBAAA;AAAA,EACnB,gBAAA,EAAkB,oBAAA;AAAA,EAClB,eAAA,EAAiB,mBAAA;AAAA,EACjB,kBAAA,EAAoB,sBAAA;AAAA,EACpB,kBAAA,EAAoB,sBAAA;AAAA,EACpB,4BAAA,EAA8B,0BAAA;AAAA,EAC9B,sBAAA,EAAwB,2BAAA;AAAA,EACxB,oBAAA,EAAsB,0BAAA;AAAA,EACtB,sBAAA,EAAwB,gCAAA;AAAA,EACxB,wBAAA,EAA0B,8BAAA;AAAA,EAC1B,uBAAA,EAAyB,6BAAA;AAAA,EACzB,yBAAA,EAA2B,8BAAA;AAAA,EAC3B,mBAAA,EAAqB,oBAAA;AAAA,EACrB,oBAAA,EAAsB,yBAAA;AAAA,EACtB,qBAAA,EAAuB,2BAAA;AAAA,EACvB,kBAAA,EAAoB,wBAAA;AAAA,EACpB,oBAAA,EAAsB,yBAAA;AAAA,EACtB,kBAAA,EAAoB,wBAAA;AAAA,EACpB,qBAAA,EAAuB,2BAAA;AAAA,EACvB,sBAAA,EAAwB,2BAAA;AAAA,EACxB,oBAAA,EAAsB,0BAAA;AAAA,EACtB,uBAAA,EAAyB,6BAAA;AAAA;AAAA,EAEzB,UAAA,EAAY,aAAA;AAAA,EACZ,YAAA,EAAc,gBAAA;AAAA,EACd,UAAA,EAAY,aAAA;AAAA,EACZ,cAAA,EAAgB,iBAAA;AAAA,EAChB,eAAA,EAAiB;AACnB;AAGO,IAAM,oBAAA,uBAAgD,GAAA,CAAI;AAAA,EAC/D,gBAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAC;AAOM,IAAM,yBAAA,GAAoD;AAAA,EAC/D,aAAA,EAAe,gBAAA;AAAA,EACf,gBAAA,EAAkB,gBAAA;AAAA,EAClB,aAAA,EAAe,aAAA;AAAA,EACf,gBAAA,EAAkB,gBAAA;AAAA,EAClB,qBAAA,EAAuB,qBAAA;AAAA,EACvB,cAAA,EAAgB,cAAA;AAAA,EAChB,iBAAA,EAAmB;AACrB;;;AC9CO,IAAM,QAAN,MAAY;AAAA,EACR,IAAA;AAAA;AAAA,EAGA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EAEA,KAAA;AAAA;AAAA,EAEA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA;AAAA,EAEA,QAAA;AAAA;AAAA,EAEA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EAEA,WAAA;AAAA;AAAA,EAEA,OAAA;AAAA,EAET,YAAY,IAAA,EAA0B;AACpC,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAC7D,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,UAAA,CAAW;AAAA,MACzB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAA,EAAS,KAAK,OAAA,IAAW,qBAAA;AAAA,MACzB,SAAA,EAAW,KAAK,SAAA,IAAa,IAAA;AAAA,MAC7B,UAAA,EAAY,KAAK,UAAA,IAAc,CAAA;AAAA,MAC/B,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAA,EAAU;AAAA,QACR,GAAG,IAAA,CAAK,QAAA;AAAA,QACR,GAAI,KAAK,SAAA,GAAY,EAAE,WAAW,IAAA,CAAK,SAAA,KAAc,EAAC;AAAA,QACtD,GAAI,KAAK,MAAA,GAAS,EAAE,QAAQ,IAAA,CAAK,MAAA,KAAW,EAAC;AAAA,QAC7C,GAAI,KAAK,UAAA,GAAa,EAAE,YAAY,IAAA,CAAK,UAAA,KAAe,EAAC;AAAA,QACzD,GAAI,KAAK,cAAA,GAAiB,EAAE,gBAAgB,IAAA,CAAK,cAAA,KAAmB,EAAC;AAAA,QACrE,GAAI,KAAK,MAAA,GAAS,EAAE,QAAQ,IAAA,CAAK,MAAA,KAAW;AAAC;AAC/C,KACD,CAAA;AACD,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAElB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS,IAAI,CAAA;AACjC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU,IAAI,CAAA;AACnC,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,SAAA,CAAU,IAAI,CAAA;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,CAAO,IAAI,CAAA;AAC7B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,CAAO,IAAI,CAAA;AAC7B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,CAAO,IAAI,CAAA;AAC7B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS,IAAI,CAAA;AACjC,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,aAAA,CAAc,IAAI,CAAA;AAC3C,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS,IAAI,CAAA;AACjC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,OAAA,CAAQ,IAAI,CAAA;AAC/B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,KAAA,CAAM,IAAI,CAAA;AAC3B,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,IAAA,CAAK,IAAI,CAAA;AACzB,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,CAAS,IAAI,CAAA;AACjC,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,YAAA,CAAa,IAAI,CAAA;AACzC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,OAAA,CAAQ,IAAI,CAAA;AAC/B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,QAAA,CAAS,IAAI,CAAA;AAChC,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,WAAA,CAAY,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,UAAU,IAAI,OAAA;AAAA,MACjB,IAAI,UAAA,CAAW;AAAA,QACb,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,OAAA,EAAS,KAAK,cAAA,IAAkB,0BAAA;AAAA,QAChC,SAAA,EAAW,KAAK,SAAA,IAAa,IAAA;AAAA,QAC7B,UAAA,EAAY,KAAK,UAAA,IAAc,CAAA;AAAA,QAC/B,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,QAAA,EAAU,KAAK,MAAA,GAAS,EAAE,QAAQ,IAAA,CAAK,MAAA,KAAW;AAAC,OACpD;AAAA,KACH;AAKA,IAAA,IAAA,CAAK,IAAA,GAAO,QAAA;AAAA,MAAS,IAAI,KAAK,IAAI,CAAA;AAAA,MAAG,CAAC,MACpC,IAAA,CAAK,IAAA,CAAK,YAAY,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA,EAAG;AAAA,QAC/C,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA;AAAA,QACrB,QAAQ,CAAA,CAAE;AAAA,OACX;AAAA,KACH;AACA,IAAA,IAAA,CAAK,aAAa,QAAA,CAAS,IAAI,WAAW,IAAI,CAAA,EAAG,OAAO,CAAA,KAAyB;AAC/E,MAAA,MAAM,CAAA,GAAI,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA;AAAA,QAC9B,EAAE,OAAO,CAAA,CAAE,KAAA,EAAO,OAAO,CAAA,CAAE,KAAA,EAAO,UAAA,EAAY,CAAA,CAAE,UAAA,EAAW;AAAA,QAC3D,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAO,OACrB;AACA,MAAA,OAAO,EAAE,UAAA,EAAY,CAAA,CAAE,UAAA,EAAY,GAAA,EAAK,EAAE,GAAA,EAAI;AAAA,IAChD,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AAAA,MAAS,IAAI,OAAO,IAAI,CAAA;AAAA,MAAG,YAAA,CACtC,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,EAAA,EAAI,CAAA,CAAE,IAAG,CAAE;AAAA,KACtD;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,MACd,IAAI,SAAS,IAAI,CAAA;AAAA,MACjB,OAAO,SAAA,EAAmB,MAAA,EAAgB,OAAA,KAAqB;AAC7D,QAAA,MAAM,IAAA,CAAK,SAAS,MAAA,CAAO;AAAA,UACzB,QAAA,EAAU,SAAA;AAAA,UACV,MAAA;AAAA,UACA,GAAI,OAAA,GAAU,EAAE,OAAA,KAAY;AAAC,SAC9B,CAAA;AAAA,MACH;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA,EAKA,WAAW,IAAA,EAA+B;AACxC,IAAA,OAAO,KAAK,IAAA,CAAK,WAAA,CAAY,OAAO,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,EAAG;AAAA,MACzD,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,MACxB,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,SAAA,CAAU,OAAuB,UAAA,EAA8C;AAC7E,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO,UAAU,CAAA;AAAA,EAC7C;AAAA,EAEQ,WAAW,IAAA,EAAwC;AACzD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAK,KAAA,IAAS,OAAA;AAAA,MACrB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,GAAI,KAAK,WAAA,KAAgB,MAAA,GAAY,EAAE,WAAA,EAAa,IAAA,CAAK,WAAA,EAAY,GAAI,EAAC;AAAA,MAC1E,GAAI,KAAK,SAAA,KAAc,MAAA,GAAY,EAAE,UAAA,EAAY,IAAA,CAAK,SAAA,EAAU,GAAI,EAAC;AAAA,MACrE,GAAI,KAAK,KAAA,GAAQ,EAAE,OAAO,IAAA,CAAK,KAAA,KAAU;AAAC,KAC5C;AAAA,EACF;AAAA,EAEQ,UAAU,IAAA,EAA2C;AAC3D,IAAA,OAAO;AAAA,MACL,GAAG,IAAA,CAAK,GAAA;AAAA,MACR,GAAI,KAAK,SAAA,GAAY,EAAE,WAAW,IAAA,CAAK,SAAA,KAAc,EAAC;AAAA,MACtD,GAAI,IAAA,CAAK,SAAA,GAAY,EAAE,IAAA,EAAM,OAAA,KAAqB,EAAC;AAAA,MACnD,GAAI,KAAK,OAAA,GAAU,EAAE,SAAS,IAAA,CAAK,OAAA,KAAY,EAAC;AAAA,MAChD,GAAI,KAAK,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO,GAAI,EAAC;AAAA,MAC3D,GAAI,KAAK,OAAA,GAAU,EAAE,SAAS,IAAA,CAAK,OAAA,KAAY;AAAC,KAClD;AAAA,EACF;AACF;AAMA,SAAS,QAAA,CACP,QACA,EAAA,EACO;AACP,EAAA,MAAM,CAAA,IAAK,CAAA,GAAI,IAAA,KAAwB,EAAA,CAAG,GAAG,IAAI,CAAA,CAAA;AACjD,EAAA,KAAA,MAAW,GAAA,IAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjC,IAAA,MAAM,KAAA,GAAS,OAAmC,GAAG,CAAA;AACrD,IAAA,MAAA,CAAO,cAAA,CAAe,GAAG,GAAA,EAAK;AAAA,MAC5B,OACE,OAAO,KAAA,KAAU,aAAc,KAAA,CAAuC,IAAA,CAAK,MAAM,CAAA,GAAI,KAAA;AAAA,MACvF,UAAA,EAAY,IAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AACA,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,QAAQ,GAAA,EAAuB;AACtC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,IAAI,GAAA,GAAqB,GAAA;AACzB,EAAA,OAAO,GAAA,IAAO,GAAA,KAAQ,MAAA,CAAO,SAAA,EAAW;AACtC,IAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,mBAAA,CAAoB,GAAG,CAAA,MAAO,CAAA,KAAM,aAAA,EAAe,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AACpF,IAAA,GAAA,GAAM,MAAA,CAAO,eAAe,GAAG,CAAA;AAAA,EACjC;AACA,EAAA,OAAO,CAAC,GAAG,IAAI,CAAA;AACjB;AAEA,IAAO,aAAA,GAAQ","file":"index.js","sourcesContent":["/**\n * Shared HTTP layer for every resource: base URL, bearer auth, `X-Codai-*`\n * extension headers, retries, timeouts, JSON + SSE helpers and the\n * `CodaiError` mapping of the gateway error envelope.\n */\n\nimport type { components } from './generated/gateway';\n\nexport type ErrorEnvelope = components['schemas']['Error'];\nexport type ErrorCode = ErrorEnvelope['error']['code'];\n\nexport class CodaiError extends Error {\n /** Stable gateway error code (`invalid_api_key`, `rate_limit_exceeded`, …) when the body was an error envelope. */\n readonly code: ErrorCode | null;\n /** `x-codai-trace-id` (or `x-request-id`) of the failed response, when present. */\n readonly requestId: string | null;\n /** Seconds to wait before retrying, from `Retry-After` on 429s. */\n readonly retryAfter: number | null;\n\n constructor(\n message: string,\n public readonly status: number,\n public readonly body: unknown,\n meta: { code?: ErrorCode | null; requestId?: string | null; retryAfter?: number | null } = {},\n ) {\n super(message);\n this.name = 'CodaiError';\n this.code = meta.code ?? extractCode(body);\n this.requestId = meta.requestId ?? null;\n this.retryAfter = meta.retryAfter ?? null;\n }\n}\n\nfunction extractCode(body: unknown): ErrorCode | null {\n if (body && typeof body === 'object') {\n const err = (body as { error?: { code?: unknown } }).error;\n if (err && typeof err === 'object' && typeof err.code === 'string')\n return err.code as ErrorCode;\n }\n return null;\n}\n\nfunction extractMessage(body: unknown): string | null {\n if (body && typeof body === 'object') {\n const err = (body as { error?: { message?: unknown } }).error;\n if (err && typeof err === 'object' && typeof err.message === 'string') return err.message;\n }\n return null;\n}\n\nconst RETRYABLE = new Set([429, 500, 502, 503, 504]);\n\n/**\n * Per-request `X-Codai-*` extension headers. Every field maps 1:1 to the\n * request header of the same name (`effort` → `x-codai-effort`). Values are\n * sent verbatim; booleans become `1` / `0`.\n */\nexport interface CodaiRequestExtensions {\n /** `x-codai-session-id` — groups requests of one conversation. */\n sessionId?: string;\n /** `x-request-id` — echoed as `x-codai-trace-id`. */\n requestId?: string;\n /** `x-codai-effort` */\n effort?: 'minimal' | 'low' | 'medium' | 'high' | 'max';\n /** `x-codai-thinking` */\n thinking?: boolean;\n /** `x-codai-thinking-budget` */\n thinkingBudget?: number;\n /** `x-codai-thinking-pin` */\n thinkingPin?: boolean;\n /** `x-codai-cache` (`false` disables caching on direct model ids). */\n cache?: boolean;\n /** `x-codai-no-task` */\n noTask?: boolean;\n /** `x-codai-task-id` */\n taskId?: string;\n /** `x-codai-task-outcome` */\n taskOutcome?: 'pass' | 'fail';\n /** `x-codai-task-evidence` */\n taskEvidence?: 'exec_verdict' | 'reexec';\n /** `x-codai-client` */\n client?: string;\n /** `x-codai-incognito` */\n incognito?: boolean;\n /** `x-codai-no-recall` */\n noRecall?: boolean;\n /** `x-codai-proven-only` */\n provenOnly?: boolean;\n /** `x-codai-new-session` */\n newSession?: boolean;\n /** `x-codai-repo` */\n repo?: string;\n /** `x-codai-agent-id` */\n agentId?: string;\n /** `x-codai-disable-subagents` */\n disableSubagents?: boolean;\n /** `x-codai-mode: agent` */\n mode?: 'agent';\n /** `x-codai-server-tools` */\n serverTools?: boolean;\n /** `x-codai-orchestrate` */\n orchestrate?: boolean;\n /** `x-codai-cascade` */\n cascade?: 'verify';\n /** `x-codai-best-of` (number or `off`). */\n bestOf?: number | 'off';\n /** `x-codai-best-of-depth` */\n bestOfDepth?: number;\n /** `x-codai-reflect` */\n reflect?: boolean;\n /** `x-codai-step-verify` */\n stepVerify?: boolean;\n /** `x-codai-plan` */\n plan?: boolean;\n /** `x-codai-consensus` */\n consensus?: boolean;\n /** `x-codai-compact` (`'auto'` and `true` both send `1`). */\n compact?: boolean | 'auto';\n /** `x-codai-retrieval` */\n retrieval?: boolean;\n /** `x-codai-heuristics` */\n heuristics?: boolean;\n /** `x-codai-identity` */\n identity?: 'on' | 'off' | 'shadow';\n /** `x-codai-playbook` */\n playbook?: string;\n /** `x-codai-no-playbook` */\n noPlaybook?: boolean;\n /** `x-codai-debug` */\n debug?: boolean;\n /** `x-codai-device` — shared-sessions / hosts device UUID. */\n device?: string;\n /** `x-codai-device-name` */\n deviceName?: string;\n /** `x-codai-device-platform` */\n devicePlatform?: 'android' | 'ios' | 'web' | 'desktop' | 'cli' | 'agent';\n /** `x-codai-push-token` */\n pushToken?: string;\n /** `x-codai-share-token` */\n shareToken?: string;\n /** Escape hatch: any additional raw headers. */\n headers?: Record<string, string>;\n}\n\nconst EXTENSION_HEADERS: Record<Exclude<keyof CodaiRequestExtensions, 'headers'>, string> = {\n sessionId: 'x-codai-session-id',\n requestId: 'x-request-id',\n effort: 'x-codai-effort',\n thinking: 'x-codai-thinking',\n thinkingBudget: 'x-codai-thinking-budget',\n thinkingPin: 'x-codai-thinking-pin',\n cache: 'x-codai-cache',\n noTask: 'x-codai-no-task',\n taskId: 'x-codai-task-id',\n taskOutcome: 'x-codai-task-outcome',\n taskEvidence: 'x-codai-task-evidence',\n client: 'x-codai-client',\n incognito: 'x-codai-incognito',\n noRecall: 'x-codai-no-recall',\n provenOnly: 'x-codai-proven-only',\n newSession: 'x-codai-new-session',\n repo: 'x-codai-repo',\n agentId: 'x-codai-agent-id',\n disableSubagents: 'x-codai-disable-subagents',\n mode: 'x-codai-mode',\n serverTools: 'x-codai-server-tools',\n orchestrate: 'x-codai-orchestrate',\n cascade: 'x-codai-cascade',\n bestOf: 'x-codai-best-of',\n bestOfDepth: 'x-codai-best-of-depth',\n reflect: 'x-codai-reflect',\n stepVerify: 'x-codai-step-verify',\n plan: 'x-codai-plan',\n consensus: 'x-codai-consensus',\n compact: 'x-codai-compact',\n retrieval: 'x-codai-retrieval',\n heuristics: 'x-codai-heuristics',\n identity: 'x-codai-identity',\n playbook: 'x-codai-playbook',\n noPlaybook: 'x-codai-no-playbook',\n debug: 'x-codai-debug',\n device: 'x-codai-device',\n deviceName: 'x-codai-device-name',\n devicePlatform: 'x-codai-device-platform',\n pushToken: 'x-codai-push-token',\n shareToken: 'x-codai-share-token',\n};\n\n/** Translate an extensions bag into raw `X-Codai-*` headers. Exported for tests. */\nexport function extensionHeaders(ext: CodaiRequestExtensions | undefined): Record<string, string> {\n const out: Record<string, string> = {};\n if (!ext) return out;\n for (const [key, header] of Object.entries(EXTENSION_HEADERS) as Array<\n [Exclude<keyof CodaiRequestExtensions, 'headers'>, string]\n >) {\n const value = ext[key];\n if (value === undefined || value === null) continue;\n if (typeof value === 'boolean') out[header] = value ? '1' : '0';\n else if (key === 'compact' && value === 'auto') out[header] = '1';\n else out[header] = String(value);\n }\n if (ext.headers) Object.assign(out, ext.headers);\n return out;\n}\n\nexport interface HttpClientOptions {\n apiKey: string;\n baseUrl: string;\n timeoutMs: number;\n maxRetries: number;\n /** Extensions applied to every request (per-call bags override per key). */\n defaults?: CodaiRequestExtensions;\n /** Injectable fetch (defaults to the global one). */\n fetch?: typeof fetch;\n}\n\nexport type Query = Record<string, string | number | boolean | undefined | null>;\n\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n /** JSON body (serialised) — pass `undefined` for no body. */\n body?: unknown;\n /** A pre-built body (FormData / Blob) sent as-is; disables retries. */\n rawBody?: BodyInit;\n query?: Query;\n ext?: CodaiRequestExtensions;\n signal?: AbortSignal;\n /** Override the client timeout for this call (ms). `0` disables it (streams). */\n timeoutMs?: number;\n /** Never retry this call (multipart uploads, streams). */\n noRetry?: boolean;\n /** Statuses treated as success besides 2xx (e.g. 503 on `/health/ready`). */\n acceptStatus?: number[];\n}\n\nexport class HttpClient {\n readonly apiKey: string;\n readonly baseUrl: string;\n readonly timeoutMs: number;\n readonly maxRetries: number;\n readonly defaults: CodaiRequestExtensions;\n private readonly fetchImpl: typeof fetch;\n\n constructor(opts: HttpClientOptions) {\n this.apiKey = opts.apiKey;\n this.baseUrl = opts.baseUrl.replace(/\\/$/, '');\n this.timeoutMs = opts.timeoutMs;\n this.maxRetries = opts.maxRetries;\n this.defaults = opts.defaults ?? {};\n this.fetchImpl = opts.fetch ?? ((input, init) => fetch(input, init));\n }\n\n url(path: string, query?: Query): string {\n const url = new URL(`${this.baseUrl}${path}`);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue;\n url.searchParams.set(k, typeof v === 'boolean' ? (v ? '1' : '0') : String(v));\n }\n }\n return url.toString();\n }\n\n headers(ext?: CodaiRequestExtensions, json = true): Record<string, string> {\n return {\n Authorization: `Bearer ${this.apiKey}`,\n ...(json ? { 'Content-Type': 'application/json' } : {}),\n ...extensionHeaders(this.defaults),\n ...extensionHeaders(ext),\n };\n }\n\n /** Perform a request; throws `CodaiError` on non-2xx (after retries on 429/5xx). */\n async request(path: string, init: RequestOptions = {}): Promise<Response> {\n const url = this.url(path, init.query);\n const hasJson = init.body !== undefined;\n const headers = this.headers(init.ext, hasJson);\n const method = init.method ?? (hasJson || init.rawBody !== undefined ? 'POST' : 'GET');\n const retries = init.noRetry || init.rawBody !== undefined ? 0 : this.maxRetries;\n const timeout = init.timeoutMs ?? this.timeoutMs;\n const accept = new Set(init.acceptStatus ?? []);\n let lastErr: unknown;\n for (let attempt = 0; attempt <= retries; attempt++) {\n const signal = init.signal ?? (timeout > 0 ? AbortSignal.timeout(timeout) : undefined);\n try {\n const res = await this.fetchImpl(url, {\n method,\n headers,\n ...(hasJson ? { body: JSON.stringify(init.body) } : {}),\n ...(init.rawBody !== undefined ? { body: init.rawBody } : {}),\n ...(signal ? { signal } : {}),\n });\n if (res.ok || accept.has(res.status)) return res;\n if (RETRYABLE.has(res.status) && attempt < retries) {\n await sleep(500 * 2 ** attempt + Math.random() * 250);\n continue;\n }\n throw await this.toError(path, res);\n } catch (err) {\n if (err instanceof CodaiError) throw err;\n lastErr = err;\n // Caller aborts are never retried.\n if (init.signal?.aborted) throw err;\n if (attempt < retries) {\n await sleep(500 * 2 ** attempt);\n continue;\n }\n }\n }\n throw new CodaiError(`codai ${path} failed after retries: ${String(lastErr)}`, 0, null);\n }\n\n async json<T>(path: string, init: RequestOptions = {}): Promise<T> {\n const res = await this.request(path, init);\n return (await res.json()) as T;\n }\n\n /**\n * Open a `text/event-stream` and iterate parsed frames. Frames are\n * `\\n\\n`-separated blocks; each yields `{ event, data }` where `event`\n * defaults to `message` and `data` is the joined `data:` payload (raw\n * string — the caller decides whether it is JSON or `[DONE]`). Comment\n * lines (`: ping`) are skipped. The stream is retried like any request\n * up to the first byte; after that errors propagate.\n */\n async *sse(\n path: string,\n init: RequestOptions = {},\n ): AsyncGenerator<SseFrame, Response, undefined> {\n const res = await this.request(path, {\n ...init,\n timeoutMs: init.timeoutMs ?? 0,\n noRetry: true,\n });\n yield* readSse(res, init.signal);\n return res;\n }\n\n private async toError(path: string, res: Response): Promise<CodaiError> {\n let body: unknown = null;\n try {\n body = await res.json();\n } catch {\n /* non-JSON error body */\n }\n const retryAfterRaw = res.headers.get('retry-after');\n const retryAfter = retryAfterRaw && /^\\d+$/.test(retryAfterRaw) ? Number(retryAfterRaw) : null;\n const message = extractMessage(body);\n return new CodaiError(\n message ? `codai ${path} → ${res.status}: ${message}` : `codai ${path} → ${res.status}`,\n res.status,\n body,\n {\n requestId: res.headers.get('x-codai-trace-id') ?? res.headers.get('x-request-id'),\n retryAfter,\n },\n );\n }\n}\n\nexport interface SseFrame {\n /** `event:` name; `message` when the frame has none (OpenAI-style streams). */\n event: string;\n /** Joined `data:` lines (a multi-line data block is joined with `\\n`). */\n data: string;\n}\n\n/** Parse an SSE body into frames. Exported for the resources and for tests. */\nexport async function* readSse(res: Response, signal?: AbortSignal): AsyncGenerator<SseFrame> {\n const reader = res.body?.getReader();\n if (!reader) throw new CodaiError('no response body', res.status, null);\n const decoder = new TextDecoder();\n let buffer = '';\n const onAbort = () => void reader.cancel().catch(() => {});\n signal?.addEventListener('abort', onAbort, { once: true });\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n // Normalise CRLF so both `\\n\\n` and `\\r\\n\\r\\n` delimit frames.\n buffer = buffer.replace(/\\r\\n/g, '\\n');\n const blocks = buffer.split('\\n\\n');\n buffer = blocks.pop() ?? '';\n for (const block of blocks) {\n const frame = parseSseBlock(block);\n if (frame) yield frame;\n }\n }\n const tail = buffer.trim() ? parseSseBlock(buffer) : null;\n if (tail) yield tail;\n } finally {\n signal?.removeEventListener('abort', onAbort);\n reader.releaseLock?.();\n }\n}\n\nfunction parseSseBlock(block: string): SseFrame | null {\n let event = 'message';\n const data: string[] = [];\n for (const line of block.split('\\n')) {\n if (!line || line.startsWith(':')) continue;\n if (line.startsWith('event:')) event = line.slice(6).trim();\n else if (line.startsWith('data:')) data.push(line.slice(5).replace(/^ /, ''));\n // `id:` / `retry:` are never emitted by the gateway; ignore anything else.\n }\n if (data.length === 0) return null;\n return { event, data: data.join('\\n') };\n}\n\n/** Parse a frame's data as JSON, returning `null` for `[DONE]` / non-JSON. */\nexport function frameJson<T = unknown>(frame: SseFrame): T | null {\n if (frame.data === '[DONE]') return null;\n try {\n return JSON.parse(frame.data) as T;\n } catch {\n return null;\n }\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n","/** `/v1/account`, `/v1/receipt`, `/v1/feedback`, `/v1/phone/models`. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply, type Schema } from './_shared';\n\nexport type AccountView = Reply<'getAccount'>;\nexport type AccountPatchRequest = Mutable<Body<'patchAccount'>>;\nexport type AccountPatchResponse = Reply<'patchAccount'>;\nexport type Receipt = Reply<'getReceipt'>;\nexport type FeedbackRequest = Mutable<Body<'submitFeedback'>>;\nexport type FeedbackResponse = Reply<'submitFeedback'>;\nexport type PhoneModel = Schema<'AccountPhoneModel'>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nexport class Account {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/account` — the full account card. */\n get(opts: CallOpts = {}): Promise<AccountView> {\n return this.http.json<AccountView>('/v1/account', { ext: opts.ext, signal: opts.signal });\n }\n\n /** `PATCH /v1/account` — consents, username, referral (at least one field). */\n update(body: AccountPatchRequest, opts: CallOpts = {}): Promise<AccountPatchResponse> {\n return this.http.json<AccountPatchResponse>('/v1/account', {\n method: 'PATCH',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n\nexport class Receipts {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * `GET /v1/receipt` — spend receipt. `sessionId` wins over `since`; with\n * neither, the last 24 hours.\n */\n get(\n query: { sessionId?: string; since?: string | Date } = {},\n opts: CallOpts = {},\n ): Promise<Receipt> {\n return this.http.json<Receipt>('/v1/receipt', {\n query: {\n session_id: query.sessionId,\n since: query.since instanceof Date ? query.since.toISOString() : query.since,\n },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n\nexport class Feedback {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * `POST /v1/feedback` — rate one turn. Exactly one of `event_id`,\n * `session_id`, `client_request_id` must be present.\n */\n submit(body: FeedbackRequest, opts: CallOpts = {}): Promise<FeedbackResponse> {\n return this.http.json<FeedbackResponse>('/v1/feedback', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n\nexport class PhoneModels {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/phone/models` — on-device model catalog with signed URLs. */\n async list(opts: CallOpts = {}): Promise<PhoneModel[]> {\n const raw = await this.http.json<Reply<'listPhoneModels'>>('/v1/phone/models', {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.models ?? [])];\n }\n}\n","/** `/v1/agents/*` — synchronous runs and the persisted async run lifecycle. */\nimport { type CodaiRequestExtensions, frameJson, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply, type Schema } from './_shared';\n\nexport type AgentRunRequest = Mutable<Body<'runAgentSync'>>;\nexport type AgentRunCreateRequest = Mutable<Body<'createAgentRun'>>;\nexport type AgentSyncResult = Reply<'runAgentSync'>;\nexport type AgentRunAccepted = Reply<'createAgentRun', 202>;\nexport type AgentRun = Reply<'getAgentRun'>;\nexport type AgentRunStep = Schema<'AgentRunStep'>;\nexport type AgentRunStats = Reply<'getAgentRunStats'>;\nexport type AgentRunStatus = Schema<'AgentRunStatus'>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nexport interface AgentRunResult {\n result: string;\n model: string;\n /** Usage-event id — exact target for `feedback.submit`. */\n eventId: string | null;\n usage: AgentSyncResult['usage'] | null;\n raw: AgentSyncResult;\n headers: Headers;\n}\n\n/** SSE frames of `GET /v1/agents/runs/{id}/stream`. */\nexport type AgentRunStreamEvent =\n | {\n event: 'step';\n data: {\n seq: number;\n kind: 'plan' | 'tool_call' | 'observation' | 'answer';\n summary: string | null;\n };\n }\n | {\n event: 'done';\n data: {\n status: 'completed' | 'failed' | 'cancelled';\n result: string | null;\n error: string | null;\n step_count: number;\n };\n }\n | { event: 'timeout'; data: Record<string, never> };\n\nexport class AgentRuns {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /v1/agents/runs` — returns 202 with the run id. */\n create(body: AgentRunCreateRequest, opts: CallOpts = {}): Promise<AgentRunAccepted> {\n return this.http.json<AgentRunAccepted>('/v1/agents/runs', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/agents/runs/{id}` */\n get(id: string, opts: CallOpts = {}): Promise<AgentRun> {\n return this.http.json<AgentRun>(`/v1/agents/runs/${encodeURIComponent(id)}`, {\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/agents/runs/{id}/steps` — newest first. */\n async steps(id: string, opts: CallOpts = {}): Promise<AgentRunStep[]> {\n const raw = await this.http.json<Reply<'listAgentRunSteps'>>(\n `/v1/agents/runs/${encodeURIComponent(id)}/steps`,\n { ext: opts.ext, signal: opts.signal },\n );\n return [...(raw.steps ?? [])];\n }\n\n /** `GET /v1/agents/runs/stats?days=` */\n stats(days?: number, opts: CallOpts = {}): Promise<AgentRunStats> {\n return this.http.json<AgentRunStats>('/v1/agents/runs/stats', {\n query: { days },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/agents/runs/{id}/cancel` */\n cancel(id: string, opts: CallOpts = {}): Promise<Reply<'cancelAgentRun'>> {\n return this.http.json<Reply<'cancelAgentRun'>>(\n `/v1/agents/runs/${encodeURIComponent(id)}/cancel`,\n { method: 'POST', body: {}, ext: opts.ext, signal: opts.signal },\n );\n }\n\n /**\n * `GET /v1/agents/runs/{id}/stream` — async iterator over `step` / `done` /\n * `timeout` events. The iterator ends after `done`; on `timeout` (30 min)\n * it also ends and you may reconnect (full replay from seq 0).\n */\n async *stream(\n id: string,\n opts: CallOpts = {},\n ): AsyncGenerator<AgentRunStreamEvent, void, undefined> {\n const frames = this.http.sse(`/v1/agents/runs/${encodeURIComponent(id)}/stream`, {\n ext: opts.ext,\n signal: opts.signal,\n });\n for await (const frame of frames) {\n const data = frameJson<Record<string, unknown>>(frame);\n if (!data) continue;\n const ev = { event: frame.event, data } as AgentRunStreamEvent;\n yield ev;\n if (ev.event === 'done' || ev.event === 'timeout') return;\n }\n }\n}\n\nexport class Agents {\n readonly runs: AgentRuns;\n constructor(private readonly http: HttpClient) {\n this.runs = new AgentRuns(http);\n }\n\n /** `POST /v1/agents/run` — blocks until the agent loop finishes. */\n async run(body: AgentRunRequest, opts: CallOpts = {}): Promise<AgentRunResult> {\n const res = await this.http.request('/v1/agents/run', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n const raw = (await res.json()) as AgentSyncResult;\n return {\n result: String(raw.result ?? ''),\n model: String(raw.model ?? ''),\n eventId: raw.event_id ?? res.headers.get('x-codai-event-id'),\n usage: raw.usage ?? null,\n raw,\n headers: res.headers,\n };\n }\n}\n","/** `POST /v1/audio/transcriptions` and `POST /v1/audio/speech`. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply } from './_shared';\n\nexport type TranscriptionResponse = Reply<'createTranscription'>;\nexport type SpeechRequest = Mutable<Body<'createSpeech'>>;\n\nexport interface TranscriptionOptions {\n /** Audio file contents (max 25 MB). */\n file: Blob | Uint8Array | ArrayBuffer;\n /** Filename hint (extension drives format detection). Default `audio.webm`. */\n filename?: string;\n /** Default `codai-transcribe`. */\n model?: string;\n /** ISO-639-1 language hint. */\n language?: string;\n /** Text to guide style or spelling. */\n prompt?: string;\n /** `json` (default) or `verbose_json`. */\n responseFormat?: 'json' | 'verbose_json';\n /** Sampling temperature 0–1. */\n temperature?: number;\n ext?: CodaiRequestExtensions;\n signal?: AbortSignal;\n}\n\nexport interface TranscriptionResult {\n text: string;\n raw: TranscriptionResponse;\n routedTo: string | null;\n headers: Headers;\n}\n\nexport interface SpeechResult {\n /** Raw audio bytes in the requested format (mp3 by default). */\n audio: ArrayBuffer;\n /** Upstream `content-type` (`audio/mpeg` when the upstream sent none). */\n contentType: string;\n routedTo: string | null;\n headers: Headers;\n}\n\nexport class Audio {\n constructor(private readonly http: HttpClient) {}\n\n /** Speech-to-text (multipart upload; never retried). Returns the transcript (0.2.x shape). */\n async transcribe(opts: TranscriptionOptions): Promise<string> {\n return (await this.transcribeDetailed(opts)).text;\n }\n\n /** Speech-to-text with the raw upstream JSON and routing headers. */\n async transcribeDetailed(opts: TranscriptionOptions): Promise<TranscriptionResult> {\n const form = new FormData();\n const blob = opts.file instanceof Blob ? opts.file : new Blob([opts.file as BlobPart]);\n form.append('file', blob, opts.filename ?? 'audio.webm');\n form.append('model', opts.model ?? 'codai-transcribe');\n if (opts.language) form.append('language', opts.language);\n if (opts.prompt) form.append('prompt', opts.prompt);\n if (opts.responseFormat) form.append('response_format', opts.responseFormat);\n if (opts.temperature !== undefined) form.append('temperature', String(opts.temperature));\n const res = await this.http.request('/v1/audio/transcriptions', {\n method: 'POST',\n rawBody: form,\n ext: opts.ext,\n signal: opts.signal,\n });\n const raw = (await res.json()) as TranscriptionResponse;\n return {\n text: typeof raw.text === 'string' ? raw.text : '',\n raw,\n routedTo: res.headers.get('x-codai-routed-to'),\n headers: res.headers,\n };\n }\n\n /** Text-to-speech. Returns the raw audio bytes (0.2.x shape); see `speechDetailed()` for headers. */\n async speech(\n body: Omit<SpeechRequest, 'model'> & { model?: string },\n opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal } = {},\n ): Promise<ArrayBuffer> {\n return (await this.speechDetailed(body, opts)).audio;\n }\n\n /** Text-to-speech with the upstream `content-type` and routing headers. */\n async speechDetailed(\n body: Omit<SpeechRequest, 'model'> & { model?: string },\n opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal } = {},\n ): Promise<SpeechResult> {\n const res = await this.http.request('/v1/audio/speech', {\n body: { ...body, model: body.model ?? 'codai-tts', voice: body.voice ?? 'alloy' },\n ext: opts.ext,\n signal: opts.signal,\n });\n return {\n audio: await res.arrayBuffer(),\n contentType: res.headers.get('content-type') ?? 'audio/mpeg',\n routedTo: res.headers.get('x-codai-routed-to'),\n headers: res.headers,\n };\n }\n}\n","/** `POST /v1/chat/completions` — OpenAI-compatible completions (JSON + SSE). */\nimport { type CodaiRequestExtensions, frameJson, type HttpClient, readSse } from '../http';\nimport { type Body, type Mutable, type Reply, type Schema } from './_shared';\n\nexport type ChatCompletionRequest = Mutable<Body<'createChatCompletion'>>;\n/** Request body as accepted by the SDK: `stream` is set by the method and `model` defaults to `codai`. */\nexport type ChatCompletionInput = Omit<ChatCompletionRequest, 'stream' | 'model'> & {\n model?: string;\n};\nexport type ChatCompletionResponse = Reply<'createChatCompletion'>;\nexport type ChatMessage = Mutable<Schema<'ChatMessage'>>;\nexport type ChatTool = Mutable<Schema<'ChatTool'>>;\nexport type ChatToolCall = Mutable<Schema<'ChatToolCall'>>;\nexport type ChatUsage = Schema<'ChatUsage'>;\n\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n /** Prompt tokens served from the provider cache, when reported. */\n cachedTokens?: number;\n}\n\n/** Per-call options accepted by every chat method. */\nexport interface ChatCallOptions {\n /** `X-Codai-*` extension headers for this call. */\n ext?: CodaiRequestExtensions;\n signal?: AbortSignal;\n}\n\nexport interface ChatResult {\n /** Assistant message content (first choice). */\n content: string;\n /** Tool calls on the first choice (empty if none). */\n toolCalls: ChatToolCall[];\n /** Raw OpenAI-shaped response. */\n raw: ChatCompletionResponse;\n /** Request id (`x-codai-trace-id` / `x-request-id`) — pass to `feedback`. */\n requestId: string | null;\n /** Usage-event id (`x-codai-event-id`) — exact target for `feedback.submit`. */\n eventId: string | null;\n /** Which upstream model actually served (`x-codai-routed-to`). */\n routedTo: string | null;\n /** Verification status for verified-execution responses, if present. */\n execVerify: string | null;\n usage: TokenUsage | null;\n /** Response headers, for the long tail of `x-codai-*` metadata. */\n headers: Headers;\n}\n\n/** Final metadata for a completed stream — resolved via `stream.final`. */\nexport interface ChatStreamResult {\n content: string;\n toolCalls: ChatToolCall[];\n requestId: string | null;\n routedTo: string | null;\n execVerify: string | null;\n usage: TokenUsage | null;\n /** `finish_reason` of the last content chunk, when sent. */\n finishReason: string | null;\n headers: Headers | null;\n}\n\n/**\n * A live chat stream. Async-iterate it for text deltas, then await `.final`\n * for metadata. `.chunks()` yields the raw `chat.completion.chunk` objects.\n */\nexport interface ChatStream extends AsyncIterable<string> {\n readonly final: Promise<ChatStreamResult>;\n chunks(): AsyncIterable<ChatCompletionChunk>;\n}\n\nexport interface ChatCompletionChunk {\n id?: string;\n object?: 'chat.completion.chunk';\n model?: string;\n choices?: Array<{\n index?: number;\n delta?: {\n role?: string;\n content?: string | null;\n tool_calls?: Array<{ index?: number } & Record<string, unknown>>;\n };\n finish_reason?: string | null;\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n prompt_tokens_details?: { cached_tokens?: number };\n };\n [key: string]: unknown;\n}\n\nfunction toUsage(u: ChatCompletionChunk['usage'] | undefined): TokenUsage | null {\n if (!u) return null;\n const cached = u.prompt_tokens_details?.cached_tokens;\n return {\n promptTokens: u.prompt_tokens ?? 0,\n completionTokens: u.completion_tokens ?? 0,\n ...(cached !== undefined ? { cachedTokens: cached } : {}),\n };\n}\n\n/**\n * Merge a streamed tool-call fragment into the accumulator at `index`.\n * OpenAI streams tool calls piecewise: id/name arrive first, then the\n * `arguments` string is appended across many deltas.\n */\nexport function mergeToolCall(\n acc: Map<number, Record<string, unknown>>,\n index: number,\n fragment: Record<string, unknown>,\n): void {\n const existing = acc.get(index) ?? { index };\n for (const [key, val] of Object.entries(fragment)) {\n if (key === 'index') continue;\n if (key === 'function' && val && typeof val === 'object') {\n const fn = (existing.function as Record<string, unknown>) ?? {};\n for (const [fk, fv] of Object.entries(val as Record<string, unknown>)) {\n if (fk === 'arguments') fn.arguments = String(fn.arguments ?? '') + String(fv ?? '');\n else fn[fk] = fv;\n }\n existing.function = fn;\n } else {\n existing[key] = val;\n }\n }\n acc.set(index, existing);\n}\n\nexport class ChatCompletions {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Non-streaming completion. `stream` is forced to `false`; use\n * `stream()` for SSE.\n */\n async create(body: ChatCompletionInput, opts: ChatCallOptions = {}): Promise<ChatResult> {\n const res = await this.http.request('/v1/chat/completions', {\n body: { ...body, model: body.model ?? 'codai', stream: false },\n ext: opts.ext,\n signal: opts.signal,\n });\n const raw = (await res.json()) as ChatCompletionResponse;\n const first = raw.choices?.[0];\n const usage = raw.usage as ChatCompletionChunk['usage'] | undefined;\n return {\n content: typeof first?.message?.content === 'string' ? first.message.content : '',\n toolCalls: [...((first?.message?.tool_calls ?? []) as ChatToolCall[])],\n raw,\n requestId: res.headers.get('x-codai-trace-id') ?? res.headers.get('x-request-id'),\n eventId: res.headers.get('x-codai-event-id'),\n routedTo: res.headers.get('x-codai-routed-to'),\n execVerify: res.headers.get('x-codai-exec-verify'),\n usage: toUsage(usage),\n headers: res.headers,\n };\n }\n\n /** Streaming completion (`stream: true`). */\n stream(body: ChatCompletionInput, opts: ChatCallOptions = {}): ChatStream {\n const requestPromise = this.http.request('/v1/chat/completions', {\n body: { ...body, model: body.model ?? 'codai', stream: true },\n ext: opts.ext,\n signal: opts.signal,\n timeoutMs: 0,\n noRetry: true,\n });\n\n let resolveFinal!: (r: ChatStreamResult) => void;\n let rejectFinal!: (e: unknown) => void;\n const final = new Promise<ChatStreamResult>((resolve, reject) => {\n resolveFinal = resolve;\n rejectFinal = reject;\n });\n final.catch(() => {}); // no unhandled-rejection noise when `final` is never awaited\n\n const toolCallsByIndex = new Map<number, Record<string, unknown>>();\n let content = '';\n let usage: TokenUsage | null = null;\n let finishReason: string | null = null;\n let res: Response | null = null;\n\n const buildResult = (): ChatStreamResult => ({\n content,\n toolCalls: [...toolCallsByIndex.values()] as ChatToolCall[],\n requestId: res?.headers.get('x-codai-trace-id') ?? res?.headers.get('x-request-id') ?? null,\n routedTo: res?.headers.get('x-codai-routed-to') ?? null,\n execVerify: res?.headers.get('x-codai-exec-verify') ?? null,\n usage,\n finishReason,\n headers: res?.headers ?? null,\n });\n\n async function* chunks(): AsyncGenerator<ChatCompletionChunk, void, undefined> {\n try {\n res = await requestPromise;\n for await (const frame of readSse(res, opts.signal)) {\n if (frame.data === '[DONE]') break;\n const chunk = frameJson<ChatCompletionChunk>(frame);\n if (!chunk) continue;\n if (chunk.usage) usage = toUsage(chunk.usage);\n const choice = chunk.choices?.[0];\n if (choice?.finish_reason) finishReason = choice.finish_reason;\n const delta = choice?.delta;\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n mergeToolCall(toolCallsByIndex, typeof tc.index === 'number' ? tc.index : 0, tc);\n }\n }\n if (delta?.content) content += delta.content;\n yield chunk;\n }\n resolveFinal(buildResult());\n } catch (err) {\n rejectFinal(err);\n throw err;\n }\n }\n\n async function* text(): AsyncGenerator<string, void, undefined> {\n for await (const chunk of chunks()) {\n const delta = chunk.choices?.[0]?.delta?.content;\n if (delta) yield delta;\n }\n }\n\n return {\n [Symbol.asyncIterator]: () => text(),\n chunks: () => ({ [Symbol.asyncIterator]: () => chunks() }),\n final,\n };\n }\n}\n\nexport class Chat {\n readonly completions: ChatCompletions;\n constructor(http: HttpClient) {\n this.completions = new ChatCompletions(http);\n }\n}\n","/** `/v1/devices/*` — devices bound to your account + the aggregated dispatch inbox. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply, type Schema } from './_shared';\n\nexport type Device = Schema<'DeviceListItem'>;\nexport type DevicePatch = Mutable<Body<'updateDevice'>>;\nexport type DevicePatched = Reply<'updateDevice'>;\nexport type DispatchInbox = Reply<'getMyDispatchInbox'>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nexport class Devices {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/devices` — most recently seen first. */\n async list(opts: CallOpts = {}): Promise<Device[]> {\n const raw = await this.http.json<Reply<'listDevices'>>('/v1/devices', {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.devices ?? [])];\n }\n\n /** `PATCH /v1/devices/{id}` — push token and/or capabilities. */\n update(id: string, body: DevicePatch, opts: CallOpts = {}): Promise<DevicePatched> {\n return this.http.json<DevicePatched>(`/v1/devices/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `DELETE /v1/devices/{id}` */\n delete(id: string, opts: CallOpts = {}): Promise<Reply<'deleteDevice'>> {\n return this.http.json<Reply<'deleteDevice'>>(`/v1/devices/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /**\n * `GET /v1/devices/me/dispatch?limit=` — pending controls dispatched at the\n * calling device (`x-codai-device` required) across all owned sessions.\n */\n dispatchInbox(query: { limit?: number } = {}, opts: CallOpts = {}): Promise<DispatchInbox> {\n return this.http.json<DispatchInbox>('/v1/devices/me/dispatch', {\n query: { limit: query.limit },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n","/** `POST /v1/embeddings`. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply } from './_shared';\n\nexport type EmbeddingsRequest = Mutable<Body<'createEmbeddings'>>;\nexport type EmbeddingsResponse = Reply<'createEmbeddings'>;\n\nexport interface EmbeddingsResult {\n /** One vector per input, in order. */\n embeddings: number[][];\n raw: EmbeddingsResponse;\n /** Upstream embedding model that produced the vectors (`x-codai-routed-to`). */\n routedTo: string | null;\n /** `<requested>-><served>` when a different model was substituted; vectors live in another space. */\n fallback: string | null;\n headers: Headers;\n}\n\nexport class Embeddings {\n constructor(private readonly http: HttpClient) {}\n\n async create(\n body: Omit<EmbeddingsRequest, 'model'> & { model?: string },\n opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal } = {},\n ): Promise<EmbeddingsResult> {\n const res = await this.http.request('/v1/embeddings', {\n body: { ...body, model: body.model ?? 'codai-embed' },\n ext: opts.ext,\n signal: opts.signal,\n });\n const raw = (await res.json()) as EmbeddingsResponse;\n return {\n embeddings: (raw.data ?? []).map((d) => [...(d.embedding as readonly number[])]),\n raw,\n routedTo: res.headers.get('x-codai-routed-to'),\n fallback: res.headers.get('x-codai-embed-fallback'),\n headers: res.headers,\n };\n }\n}\n","/** `/v1/environments/*` — cloud / BYO dev environments, their members, ports and secrets. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type QueryOf, type Reply, type Schema } from './_shared';\n\nexport type Environment = Schema<'Environment'>;\nexport type EnvironmentDetail = Schema<'EnvironmentDetail'>;\nexport type EnvironmentState = Schema<'EnvironmentState'>;\nexport type EnvironmentProvider = Schema<'EnvironmentProvider'>;\nexport type EnvironmentRole = Schema<'EnvironmentRole'>;\nexport type EnvironmentTransition = Schema<'EnvironmentTransition'>;\nexport type EnvironmentEnrollToken = Schema<'EnvironmentEnrollToken'>;\nexport type EnvironmentEnrolled = Schema<'EnvironmentEnrolled'>;\nexport type EnvironmentMember = Schema<'EnvironmentMember'>;\nexport type EnvironmentMemberCreated = Schema<'EnvironmentMemberCreated'>;\nexport type EnvironmentPort = Schema<'EnvironmentPort'>;\nexport type EnvironmentSecret = Schema<'EnvironmentSecret'>;\nexport type EnvironmentSecretSet = Schema<'EnvironmentSecretSet'>;\nexport type EnvironmentCreateBody = Mutable<Body<'createEnvironment'>>;\nexport type EnvironmentPatchBody = Mutable<Body<'updateEnvironment'>>;\nexport type EnvironmentEnrollBody = Mutable<Body<'enrollEnvironment'>>;\nexport type EnvironmentAddMemberBody = Mutable<Body<'addEnvironmentMember'>>;\nexport type EnvironmentPortBody = Mutable<Body<'setEnvironmentPort'>>;\nexport type ListEnvironmentsQuery = Mutable<QueryOf<'listEnvironments'>>;\nexport type EnvironmentSshCert = Reply<'issueMyEnvironmentSshCert'>;\nexport type EnvironmentSshCertBody = Mutable<Body<'issueMyEnvironmentSshCert'>>;\nexport type EnvironmentSshCa = Reply<'getEnvironmentSshCa'>;\nexport type EnvironmentTaskList = Reply<'listEnvironmentTasks'>;\nexport type EnvironmentTaskCreateBody = Mutable<Body<'createEnvironmentTask'>>;\nexport type EnvironmentTaskCreated = Reply<'createEnvironmentTask'>;\nexport type EnvironmentTaskDetail = Reply<'getEnvironmentTask'>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nconst envPath = (id: string, suffix = ''): string =>\n `/v1/environments/${encodeURIComponent(id)}${suffix}`;\n\nexport class EnvironmentMembers {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/environments/{id}/members` — any role. */\n async list(envId: string, opts: CallOpts = {}): Promise<EnvironmentMember[]> {\n const raw = await this.http.json<Reply<'listEnvironmentMembers'>>(envPath(envId, '/members'), {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.members ?? [])];\n }\n\n /** `POST /v1/environments/{id}/members` — exactly one of `user_id` / `email`. */\n async add(\n envId: string,\n body: EnvironmentAddMemberBody,\n opts: CallOpts = {},\n ): Promise<EnvironmentMemberCreated> {\n const raw = await this.http.json<Reply<'addEnvironmentMember', 201>>(\n envPath(envId, '/members'),\n { body, ext: opts.ext, signal: opts.signal },\n );\n return raw.member;\n }\n\n /** `PUT /v1/environments/{id}/members/me/ssh-key` — one `authorized_keys` line. */\n setSshKey(\n envId: string,\n publicKey: string,\n opts: CallOpts = {},\n ): Promise<Reply<'setMyEnvironmentSshKey'>> {\n const body: Mutable<Body<'setMyEnvironmentSshKey'>> = { public_key: publicKey };\n return this.http.json<Reply<'setMyEnvironmentSshKey'>>(envPath(envId, '/members/me/ssh-key'), {\n method: 'PUT',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `PATCH /v1/environments/{id}/members/{userId}` — 409 `last_owner` on demoting the last owner. */\n async setRole(\n envId: string,\n userId: string,\n role: EnvironmentRole,\n opts: CallOpts = {},\n ): Promise<Reply<'setEnvironmentMemberRole'>['member']> {\n const raw = await this.http.json<Reply<'setEnvironmentMemberRole'>>(\n envPath(envId, `/members/${encodeURIComponent(userId)}`),\n { method: 'PATCH', body: { role }, ext: opts.ext, signal: opts.signal },\n );\n return raw.member;\n }\n\n /** `DELETE /v1/environments/{id}/members/{userId}` — pass your own id to leave. */\n remove(\n envId: string,\n userId: string,\n opts: CallOpts = {},\n ): Promise<Reply<'removeEnvironmentMember'>> {\n return this.http.json<Reply<'removeEnvironmentMember'>>(\n envPath(envId, `/members/${encodeURIComponent(userId)}`),\n { method: 'DELETE', ext: opts.ext, signal: opts.signal },\n );\n }\n\n /** `POST /v1/environments/{id}/members/me/ssh-cert` — 12 h OpenSSH user certificate for your key. */\n sshCert(envId: string, body: EnvironmentSshCertBody, opts: CallOpts = {}): Promise<EnvironmentSshCert> {\n return this.http.json<EnvironmentSshCert>(envPath(envId, '/members/me/ssh-cert'), {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n }\n}\n\n/** `/v1/environments/{id}/tasks` — fire-and-forget agent tasks run in the environment. */\nexport class EnvironmentTasks {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/environments/{id}/tasks` */\n list(envId: string, opts: CallOpts = {}): Promise<EnvironmentTaskList> {\n return this.http.json<EnvironmentTaskList>(envPath(envId, '/tasks'), { ext: opts.ext, signal: opts.signal });\n }\n\n /** `POST /v1/environments/{id}/tasks` — queued; you get a notification when it finishes. */\n create(envId: string, body: EnvironmentTaskCreateBody, opts: CallOpts = {}): Promise<EnvironmentTaskCreated> {\n return this.http.json<EnvironmentTaskCreated>(envPath(envId, '/tasks'), {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n }\n\n /** `GET /v1/environments/{id}/tasks/{taskId}` */\n get(envId: string, taskId: string, opts: CallOpts = {}): Promise<EnvironmentTaskDetail> {\n return this.http.json<EnvironmentTaskDetail>(envPath(envId, `/tasks/${encodeURIComponent(taskId)}`), { ext: opts.ext, signal: opts.signal });\n }\n}\n\nexport class EnvironmentPorts {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/environments/{id}/ports` — published (forwarded) ports. */\n async list(envId: string, opts: CallOpts = {}): Promise<EnvironmentPort[]> {\n const raw = await this.http.json<Reply<'listEnvironmentPorts'>>(envPath(envId, '/ports'), {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.ports ?? [])];\n }\n\n /** `PUT /v1/environments/{id}/ports/{port}` — publish or change visibility (upsert). */\n async set(\n envId: string,\n port: number,\n body: EnvironmentPortBody,\n opts: CallOpts = {},\n ): Promise<EnvironmentPort> {\n const raw = await this.http.json<Reply<'setEnvironmentPort'>>(\n envPath(envId, `/ports/${encodeURIComponent(String(port))}`),\n { method: 'PUT', body, ext: opts.ext, signal: opts.signal },\n );\n return raw.port;\n }\n\n /** `DELETE /v1/environments/{id}/ports/{port}` — unpublish. */\n remove(\n envId: string,\n port: number,\n opts: CallOpts = {},\n ): Promise<Reply<'removeEnvironmentPort'>> {\n return this.http.json<Reply<'removeEnvironmentPort'>>(\n envPath(envId, `/ports/${encodeURIComponent(String(port))}`),\n { method: 'DELETE', ext: opts.ext, signal: opts.signal },\n );\n }\n}\n\nexport class EnvironmentSecrets {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/environments/{id}/secrets` — names and timestamps only, never values. */\n async list(envId: string, opts: CallOpts = {}): Promise<EnvironmentSecret[]> {\n const raw = await this.http.json<Reply<'listEnvironmentSecrets'>>(envPath(envId, '/secrets'), {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.secrets ?? [])];\n }\n\n /** `PUT /v1/environments/{id}/secrets/{name}` — upsert; `name` is `ENV_STYLE`. */\n set(\n envId: string,\n name: string,\n value: string,\n opts: CallOpts = {},\n ): Promise<EnvironmentSecretSet> {\n const body: Mutable<Body<'setEnvironmentSecret'>> = { value };\n return this.http.json<EnvironmentSecretSet>(\n envPath(envId, `/secrets/${encodeURIComponent(name)}`),\n { method: 'PUT', body, ext: opts.ext, signal: opts.signal },\n );\n }\n\n /** `DELETE /v1/environments/{id}/secrets/{name}` */\n remove(\n envId: string,\n name: string,\n opts: CallOpts = {},\n ): Promise<Reply<'removeEnvironmentSecret'>> {\n return this.http.json<Reply<'removeEnvironmentSecret'>>(\n envPath(envId, `/secrets/${encodeURIComponent(name)}`),\n { method: 'DELETE', ext: opts.ext, signal: opts.signal },\n );\n }\n}\n\nexport class Environments {\n readonly members: EnvironmentMembers;\n readonly ports: EnvironmentPorts;\n readonly secrets: EnvironmentSecrets;\n readonly tasks: EnvironmentTasks;\n\n constructor(private readonly http: HttpClient) {\n this.members = new EnvironmentMembers(http);\n this.ports = new EnvironmentPorts(http);\n this.secrets = new EnvironmentSecrets(http);\n this.tasks = new EnvironmentTasks(http);\n }\n\n /** `GET /v1/environments/{id}/ssh-ca` — CA public keys to trust (`@cert-authority` lines). */\n sshCa(envId: string, opts: CallOpts = {}): Promise<EnvironmentSshCa> {\n return this.http.json<EnvironmentSshCa>(envPath(envId, '/ssh-ca'), { ext: opts.ext, signal: opts.signal });\n }\n\n /** `GET /v1/environments?project_id=&for_user_id=me` — newest first, every state. */\n async list(query: ListEnvironmentsQuery = {}, opts: CallOpts = {}): Promise<Environment[]> {\n const raw = await this.http.json<Reply<'listEnvironments'>>('/v1/environments', {\n query: { project_id: query.project_id, for_user_id: query.for_user_id },\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.environments ?? [])];\n }\n\n /**\n * `POST /v1/environments` — `byo` starts `pending`; managed providers start\n * `creating`. 409 `already_has_env` in a `vm_per_dev` project (the error\n * body carries the `environment_id` to reuse).\n */\n async create(body: EnvironmentCreateBody, opts: CallOpts = {}): Promise<Environment> {\n const raw = await this.http.json<Reply<'createEnvironment', 201>>('/v1/environments', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n return raw.environment;\n }\n\n /**\n * `POST /v1/environments/enroll` — daemon side. The one-time `codai_env_…`\n * token in the body is the only credential; the client's API key header is\n * ignored by this route. Managed environments additionally receive a\n * freshly minted `api_key`, returned exactly once.\n */\n enroll(body: EnvironmentEnrollBody, opts: CallOpts = {}): Promise<EnvironmentEnrolled> {\n return this.http.json<EnvironmentEnrolled>('/v1/environments/enroll', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n // The token is consumed on success; a retried POST would 401.\n noRetry: true,\n });\n }\n\n /** `GET /v1/environments/{id}` — environment, your role, members, ports, recent events. */\n get(envId: string, opts: CallOpts = {}): Promise<EnvironmentDetail> {\n return this.http.json<EnvironmentDetail>(envPath(envId), {\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `PATCH /v1/environments/{id}` — `name` and/or `idle_timeout_minutes` (5..1440). */\n async update(\n envId: string,\n body: EnvironmentPatchBody,\n opts: CallOpts = {},\n ): Promise<Environment> {\n const raw = await this.http.json<Reply<'updateEnvironment'>>(envPath(envId), {\n method: 'PATCH',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n return raw.environment;\n }\n\n /** `POST /v1/environments/{id}/start` — managed providers only (`stopped` → `starting`). */\n start(envId: string, opts: CallOpts = {}): Promise<EnvironmentTransition> {\n return this.transition(envId, 'start', opts);\n }\n\n /** `POST /v1/environments/{id}/stop` — managed providers only (`running` → `stopping`). */\n stop(envId: string, opts: CallOpts = {}): Promise<EnvironmentTransition> {\n return this.transition(envId, 'stop', opts);\n }\n\n /** `POST /v1/environments/{id}/archive` — keeps history, releases the machine. */\n archive(envId: string, opts: CallOpts = {}): Promise<EnvironmentTransition> {\n return this.transition(envId, 'archive', opts);\n }\n\n /** `POST /v1/environments/{id}/destroy` — owner only; terminal. */\n destroy(envId: string, opts: CallOpts = {}): Promise<EnvironmentTransition> {\n return this.transition(envId, 'destroy', opts);\n }\n\n /**\n * `POST /v1/environments/{id}/enroll-token` — `byo` only; a 30-minute\n * one-time token for `enroll()`. Minting again replaces the previous one.\n */\n enrollToken(envId: string, opts: CallOpts = {}): Promise<EnvironmentEnrollToken> {\n return this.http.json<EnvironmentEnrollToken>(envPath(envId, '/enroll-token'), {\n method: 'POST',\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n }\n\n private transition(\n envId: string,\n action: 'start' | 'stop' | 'archive' | 'destroy',\n opts: CallOpts,\n ): Promise<EnvironmentTransition> {\n return this.http.json<EnvironmentTransition>(envPath(envId, `/${action}`), {\n method: 'POST',\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n","/** Unauthenticated probes at the root: `/health`, `/health/ready`, `/status`. */\nimport { type HttpClient } from '../http';\nimport { type Reply } from './_shared';\n\nexport type HealthResponse = Reply<'getHealth'>;\nexport type HealthReadyResponse = Reply<'getHealthReady'>;\nexport type StatusResponse = Reply<'getStatus'>;\n\nexport class Health {\n constructor(private readonly http: HttpClient) {}\n\n /** Liveness probe. */\n get(opts: { signal?: AbortSignal } = {}): Promise<HealthResponse> {\n return this.http.json<HealthResponse>('/health', { signal: opts.signal, noRetry: true });\n }\n\n /**\n * Deep readiness probe. A 503 is returned as `{ ok: false, ... }` rather\n * than thrown, so callers can read the failing check.\n */\n async ready(\n opts: { signal?: AbortSignal } = {},\n ): Promise<HealthReadyResponse & { httpStatus: number }> {\n const res = await this.http.request('/health/ready', {\n signal: opts.signal,\n noRetry: true,\n acceptStatus: [503],\n });\n const body = (await res.json()) as HealthReadyResponse;\n return { ...body, httpStatus: res.status };\n }\n\n /** Registry snapshot (aliases + provider health). */\n status(opts: { signal?: AbortSignal } = {}): Promise<StatusResponse> {\n return this.http.json<StatusResponse>('/status', { signal: opts.signal, noRetry: true });\n }\n}\n","/** `/v1/hosts/*` — host relay (desktop announces itself; clients exec ops on it). */\nimport { type CodaiRequestExtensions, frameJson, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply, type Schema } from './_shared';\n\nexport type HostPresence = Schema<'HostPresence'>;\nexport type HostOp = Schema<'HostOp'>;\nexport type HostExecBody = Mutable<Body<'execOnHost'>>;\nexport type HostExecResponse = Reply<'execOnHost'>;\nexport type HostExecRequest = Schema<'HostExecRequest'>;\nexport type HostExecResultBody = Mutable<Body<'postHostExecResult'>>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\n/** Frames of `GET /v1/hosts/stream`. */\nexport type HostStreamEvent =\n | { event: 'hello'; data: { device_id: string; heartbeat_ms: number } }\n | { event: 'ping'; data: { t: number } }\n | { event: 'exec'; data: HostExecRequest }\n | { event: string; data: Record<string, unknown> };\n\nexport class Hosts {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/hosts` — your devices currently connected as hosts. */\n async list(opts: CallOpts = {}): Promise<HostPresence[]> {\n const raw = await this.http.json<Reply<'listHosts'>>('/v1/hosts', {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.hosts ?? [])];\n }\n\n /**\n * `POST /v1/hosts/{deviceId}/exec` — run one op on a connected host and\n * block until it answers (or `timeout_ms`, default 60 s).\n */\n exec(\n deviceId: string,\n op: HostOp,\n args: Record<string, unknown> = {},\n extra: { timeoutMs?: number; label?: string } & CallOpts = {},\n ): Promise<HostExecResponse> {\n const body: HostExecBody = {\n op,\n args,\n ...(extra.timeoutMs !== undefined ? { timeout_ms: extra.timeoutMs } : {}),\n ...(extra.label !== undefined ? { label: extra.label } : {}),\n };\n return this.http.json<HostExecResponse>(`/v1/hosts/${encodeURIComponent(deviceId)}/exec`, {\n body,\n ext: extra.ext,\n signal: extra.signal,\n // The gateway itself waits up to timeout_ms + 2 s; give the HTTP layer headroom.\n timeoutMs: (extra.timeoutMs ?? 60_000) + 10_000,\n noRetry: true,\n });\n }\n\n /** `POST /v1/hosts/exec/{reqId}/result` — host side: deliver an exec result. */\n postResult(\n reqId: string,\n body: HostExecResultBody,\n opts: CallOpts = {},\n ): Promise<Reply<'postHostExecResult'>> {\n return this.http.json<Reply<'postHostExecResult'>>(\n `/v1/hosts/exec/${encodeURIComponent(reqId)}/result`,\n { body, ext: opts.ext, signal: opts.signal },\n );\n }\n\n /**\n * `GET /v1/hosts/stream?os=&hostname=&roots=` — host side: announce this\n * device and receive `hello` / `ping` / `exec` events. Closed by the server\n * after 6 h; reconnect to re-announce presence.\n */\n async *stream(\n query: { os?: string; hostname?: string; roots?: string[] } = {},\n opts: CallOpts = {},\n ): AsyncGenerator<HostStreamEvent, void, undefined> {\n const frames = this.http.sse('/v1/hosts/stream', {\n query: {\n os: query.os,\n hostname: query.hostname,\n roots: query.roots?.length ? query.roots.join(',') : undefined,\n },\n ext: opts.ext,\n signal: opts.signal,\n });\n for await (const frame of frames) {\n const data = frameJson<Record<string, unknown>>(frame);\n if (!data) continue;\n yield { event: frame.event, data } as HostStreamEvent;\n }\n }\n}\n","/** `POST /v1/messages` — Anthropic Messages wire (JSON + named-event SSE). */\nimport { type CodaiRequestExtensions, frameJson, type HttpClient, readSse } from '../http';\nimport { type Body, type Mutable, type Reply } from './_shared';\n\nexport type MessageRequest = Mutable<Body<'createMessage'>>;\nexport type MessageResponse = Reply<'createMessage'>;\n/** Request body as accepted by the SDK: `stream` is set by the method and `model` defaults to `codai`. */\nexport type MessageInput = Omit<MessageRequest, 'stream' | 'model'> & { model?: string };\n\nexport interface MessageCallOptions {\n ext?: CodaiRequestExtensions;\n signal?: AbortSignal;\n}\n\nexport interface MessageResult {\n /** Concatenated `text` blocks of the reply. */\n text: string;\n raw: MessageResponse;\n requestId: string | null;\n routedTo: string | null;\n headers: Headers;\n}\n\n/** One Anthropic streaming event: `event.type` mirrors the SSE `event:` name. */\nexport interface MessageStreamEvent {\n type:\n | 'message_start'\n | 'content_block_start'\n | 'content_block_delta'\n | 'content_block_stop'\n | 'message_delta'\n | 'message_stop'\n | 'ping'\n | 'error'\n | (string & {});\n [key: string]: unknown;\n}\n\nexport interface MessageStreamResult {\n /** Concatenated `text_delta` payloads. */\n text: string;\n /** Final `stop_reason` from `message_delta`, when sent. */\n stopReason: string | null;\n /** Cumulative usage: `input_tokens` from `message_start`, `output_tokens` from `message_delta`. */\n usage: { inputTokens: number; outputTokens: number } | null;\n requestId: string | null;\n routedTo: string | null;\n headers: Headers | null;\n}\n\nexport interface MessageStream extends AsyncIterable<MessageStreamEvent> {\n readonly final: Promise<MessageStreamResult>;\n /** Text deltas only. */\n text(): AsyncIterable<string>;\n}\n\nexport class Messages {\n constructor(private readonly http: HttpClient) {}\n\n async create(body: MessageInput, opts: MessageCallOptions = {}): Promise<MessageResult> {\n const res = await this.http.request('/v1/messages', {\n body: { ...body, model: body.model ?? 'codai', stream: false },\n ext: opts.ext,\n signal: opts.signal,\n });\n const raw = (await res.json()) as MessageResponse;\n const text = (raw.content ?? [])\n .map((b) => (b.type === 'text' && typeof b.text === 'string' ? b.text : ''))\n .join('');\n return {\n text,\n raw,\n requestId: res.headers.get('x-codai-trace-id') ?? res.headers.get('x-request-id'),\n routedTo: res.headers.get('x-codai-routed-to'),\n headers: res.headers,\n };\n }\n\n stream(body: MessageInput, opts: MessageCallOptions = {}): MessageStream {\n const requestPromise = this.http.request('/v1/messages', {\n body: { ...body, model: body.model ?? 'codai', stream: true },\n ext: opts.ext,\n signal: opts.signal,\n timeoutMs: 0,\n noRetry: true,\n });\n\n let resolveFinal!: (r: MessageStreamResult) => void;\n let rejectFinal!: (e: unknown) => void;\n const final = new Promise<MessageStreamResult>((resolve, reject) => {\n resolveFinal = resolve;\n rejectFinal = reject;\n });\n final.catch(() => {});\n\n let text = '';\n let stopReason: string | null = null;\n let inputTokens: number | null = null;\n let outputTokens: number | null = null;\n let res: Response | null = null;\n\n async function* events(): AsyncGenerator<MessageStreamEvent, void, undefined> {\n try {\n res = await requestPromise;\n for await (const frame of readSse(res, opts.signal)) {\n const ev = frameJson<MessageStreamEvent>(frame);\n if (!ev) continue;\n if (typeof ev.type !== 'string') ev.type = frame.event;\n if (ev.type === 'message_start') {\n const usage = (ev.message as { usage?: { input_tokens?: number } } | undefined)?.usage;\n if (usage?.input_tokens !== undefined) inputTokens = usage.input_tokens;\n } else if (ev.type === 'content_block_delta') {\n const delta = ev.delta as { type?: string; text?: string } | undefined;\n if (delta?.type === 'text_delta' && typeof delta.text === 'string') text += delta.text;\n } else if (ev.type === 'message_delta') {\n const delta = ev.delta as { stop_reason?: string | null } | undefined;\n if (delta?.stop_reason) stopReason = delta.stop_reason;\n const usage = ev.usage as { output_tokens?: number } | undefined;\n if (usage?.output_tokens !== undefined) outputTokens = usage.output_tokens;\n }\n yield ev;\n if (ev.type === 'message_stop') break;\n }\n resolveFinal({\n text,\n stopReason,\n usage:\n inputTokens !== null || outputTokens !== null\n ? { inputTokens: inputTokens ?? 0, outputTokens: outputTokens ?? 0 }\n : null,\n requestId: res.headers.get('x-codai-trace-id') ?? res.headers.get('x-request-id') ?? null,\n routedTo: res.headers.get('x-codai-routed-to'),\n headers: res.headers,\n });\n } catch (err) {\n rejectFinal(err);\n throw err;\n }\n }\n\n async function* textOnly(): AsyncGenerator<string, void, undefined> {\n for await (const ev of events()) {\n if (ev.type !== 'content_block_delta') continue;\n const delta = ev.delta as { type?: string; text?: string } | undefined;\n if (delta?.type === 'text_delta' && delta.text) yield delta.text;\n }\n }\n\n return {\n [Symbol.asyncIterator]: () => events(),\n text: () => ({ [Symbol.asyncIterator]: () => textOnly() }),\n final,\n };\n }\n}\n","/** `GET /v1/models`. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Reply, type Schema } from './_shared';\n\nexport type Model = Schema<'CoreModel'>;\nexport type ModelList = Reply<'listModels'>;\n\nexport class Models {\n constructor(private readonly http: HttpClient) {}\n\n /** Every model the calling key may address (OpenAI list shape, `data[]`). */\n async list(opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal } = {}): Promise<Model[]> {\n const raw = await this.http.json<ModelList>('/v1/models', {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.data ?? [])];\n }\n}\n","/** `/v1/orgs/*` — the orgs (teams) you belong to and their members. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply, type Schema } from './_shared';\n\nexport type Org = Schema<'OrgWithRole'>;\nexport type OrgMember = Schema<'OrgMember'>;\nexport type OrgRole = Schema<'OrgRole'>;\nexport type OrgAddMemberBody = Mutable<Body<'addOrgMember'>>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nexport class OrgMembers {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/orgs/{id}/members` */\n async list(orgId: string, opts: CallOpts = {}): Promise<OrgMember[]> {\n const raw = await this.http.json<Reply<'listOrgMembers'>>(\n `/v1/orgs/${encodeURIComponent(orgId)}/members`,\n { ext: opts.ext, signal: opts.signal },\n );\n return [...(raw.members ?? [])];\n }\n\n /** `POST /v1/orgs/{id}/members` — add or re-role (owner/admin). */\n add(\n orgId: string,\n body: OrgAddMemberBody,\n opts: CallOpts = {},\n ): Promise<Reply<'addOrgMember', 201>> {\n return this.http.json<Reply<'addOrgMember', 201>>(\n `/v1/orgs/${encodeURIComponent(orgId)}/members`,\n { body, ext: opts.ext, signal: opts.signal },\n );\n }\n\n /** `DELETE /v1/orgs/{id}/members/{userId}` */\n remove(orgId: string, userId: string, opts: CallOpts = {}): Promise<Reply<'removeOrgMember'>> {\n return this.http.json<Reply<'removeOrgMember'>>(\n `/v1/orgs/${encodeURIComponent(orgId)}/members/${encodeURIComponent(userId)}`,\n { method: 'DELETE', ext: opts.ext, signal: opts.signal },\n );\n }\n}\n\nexport class Orgs {\n readonly members: OrgMembers;\n constructor(private readonly http: HttpClient) {\n this.members = new OrgMembers(http);\n }\n\n /** `POST /v1/orgs` */\n create(name: string, opts: CallOpts = {}): Promise<Org> {\n return this.http.json<Org>('/v1/orgs', { body: { name }, ext: opts.ext, signal: opts.signal });\n }\n\n /** `GET /v1/orgs` */\n async list(opts: CallOpts = {}): Promise<Org[]> {\n const raw = await this.http.json<Reply<'listOrgs'>>('/v1/orgs', {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.orgs ?? [])];\n }\n}\n","/** `/v1/projects/*` — projects (a repo + isolation policy) that group environments. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply, type Schema } from './_shared';\n\nexport type Project = Schema<'Project'>;\nexport type ProjectIsolation = Schema<'ProjectIsolation'>;\nexport type ProjectCreateBody = Mutable<Body<'createProject'>>;\nexport type ProjectPatchBody = Mutable<Body<'updateProject'>>;\nexport type ProjectDetail = Reply<'getProject'>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nexport class Projects {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/projects` — projects you own plus those of your orgs, newest first. */\n async list(opts: CallOpts = {}): Promise<Project[]> {\n const raw = await this.http.json<Reply<'listProjects'>>('/v1/projects', {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.projects ?? [])];\n }\n\n /** `POST /v1/projects` — 409 `slug_taken` when the slug is already yours. */\n async create(body: ProjectCreateBody, opts: CallOpts = {}): Promise<Project> {\n const raw = await this.http.json<Reply<'createProject', 201>>('/v1/projects', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n return raw.project;\n }\n\n /** `GET /v1/projects/{id}` — the project plus every environment in it. */\n get(projectId: string, opts: CallOpts = {}): Promise<ProjectDetail> {\n return this.http.json<ProjectDetail>(`/v1/projects/${encodeURIComponent(projectId)}`, {\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `PATCH /v1/projects/{id}` — owner or org owner/admin; the slug cannot change. */\n async update(projectId: string, body: ProjectPatchBody, opts: CallOpts = {}): Promise<Project> {\n const raw = await this.http.json<Reply<'updateProject'>>(\n `/v1/projects/${encodeURIComponent(projectId)}`,\n { method: 'PATCH', body, ext: opts.ext, signal: opts.signal },\n );\n return raw.project;\n }\n\n /** `DELETE /v1/projects/{id}` — 409 `project_has_environments` until all are destroyed. */\n delete(projectId: string, opts: CallOpts = {}): Promise<Reply<'deleteProject'>> {\n return this.http.json<Reply<'deleteProject'>>(`/v1/projects/${encodeURIComponent(projectId)}`, {\n method: 'DELETE',\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n","/**\n * codai Resolve — execution-verified bug fixes, no fix no fee\n * (`https://resolve.codai.ro`, spec `apps/docs/openapi/en/resolve.yaml`).\n *\n * Resolve is a separate service from the gateway: it has its own host and a\n * flat `{ error: string }` error shape, so it gets its own `HttpClient` and\n * maps failures to `ResolveError` / `ResolveInsufficientFundsError`.\n */\nimport type { components } from '../generated/resolve';\nimport { CodaiError, type HttpClient, type RequestOptions } from '../http';\nimport { type Mutable } from './_shared';\n\ntype ResolveSchemas = components['schemas'];\n\nexport type ResolveIntake = Mutable<ResolveSchemas['ResolveIntake']>;\nexport type ResolveQuote = ResolveSchemas['ResolveQuote'];\nexport type ResolveDeclined = ResolveSchemas['ResolveDeclined'];\n/** `submit()` result: `201` quote / free-tier auto-accept, or `200` decline. */\nexport type ResolveSubmitResult = ResolveQuote | ResolveDeclined;\nexport type ResolveAccepted = ResolveSchemas['ResolveAccepted'];\n/** How an accepted job is paid: `free` > `intro` (€1) > `credit` (t7 fix credit) > `wallet`. */\nexport type ResolvePaidWith = ResolveSchemas['ResolvePaidWith'];\n/** `GET /v1/resolve/balance` — fix credits, intro availability, wallet (EUR micros). */\nexport type ResolveBalance = ResolveSchemas['ResolveBalance'];\nexport type ResolveJob = ResolveSchemas['ResolveJob'];\nexport type ResolveJobStatus = ResolveSchemas['ResolveJobStatus'];\nexport type ResolveTier = ResolveSchemas['ResolveTier'];\nexport type ResolveAttestation = ResolveSchemas['ResolveAttestation'];\n/** DSSE v1 envelope in `ResolveAttestation.signature` (`null` = unsigned, pre-2026-09-27). */\nexport type ResolveAttestationEnvelope = ResolveSchemas['ResolveAttestationEnvelope'];\nexport type ResolveKeys = ResolveSchemas['ResolveKeys'];\nexport type ResolveKey = ResolveSchemas['ResolveKey'];\nexport type ResolveReproTest = ResolveSchemas['ResolveReproTest'];\nexport type ResolveHealth = ResolveSchemas['ResolveHealth'];\nexport type ResolveValidationDetails = ResolveSchemas['ResolveValidationDetails'];\nexport type ResolveInsufficientFunds = ResolveSchemas['ResolveInsufficientFunds'];\n/** Body POSTed to `callback_url` (verify with `verifyResolveWebhook` first). */\nexport type ResolveWebhookEvent = ResolveSchemas['ResolveWebhookEvent'];\nexport type ResolveWebhookEventName = ResolveSchemas['ResolveWebhookEventName'];\nexport type ResolveWebhookJob = ResolveSchemas['ResolveWebhookJob'];\n\nexport interface VerifyResolveWebhookOptions {\n /** Maximum age (and future skew) of `t`, in seconds. Default 300. */\n toleranceSeconds?: number;\n /** Current unix time in seconds (tests). Default `Date.now() / 1000`. */\n nowSeconds?: number;\n}\n\n/**\n * Verify a Resolve webhook delivery: `x-codai-signature: t=<unix>,v1=<hex>`\n * with `v1 = HMAC-SHA256(callback_secret, \"<t>.<rawBody>\")`. Pass the RAW\n * request body (before JSON parsing). Constant-time compare; rejects a\n * timestamp outside `toleranceSeconds`. Returns `false` for any bad input.\n *\n * Server-side only: uses `node:crypto` (Node 20.16+/22.3+, Bun, Deno), loaded\n * lazily so the rest of the SDK still bundles for browsers and edge runtimes.\n * Throws only when `node:crypto` is unavailable in the current runtime.\n */\nexport function verifyResolveWebhook(\n secret: string,\n rawBody: string | Uint8Array,\n signatureHeader: string | null | undefined,\n opts: VerifyResolveWebhookOptions = {},\n): boolean {\n if (!secret || !signatureHeader) return false;\n let t: string | undefined;\n const v1s: string[] = [];\n for (const part of signatureHeader.split(',')) {\n const eq = part.indexOf('=');\n if (eq === -1) continue;\n const k = part.slice(0, eq).trim();\n const v = part.slice(eq + 1).trim();\n if (k === 't') t = v;\n else if (k === 'v1') v1s.push(v.toLowerCase());\n }\n if (!t || !/^\\d+$/.test(t) || v1s.length === 0) return false;\n const tolerance = opts.toleranceSeconds ?? 300;\n const now = opts.nowSeconds ?? Math.floor(Date.now() / 1000);\n if (Math.abs(now - Number(t)) > tolerance) return false;\n const { createHmac, timingSafeEqual } = nodeCrypto();\n const enc = new TextEncoder();\n const body = typeof rawBody === 'string' ? enc.encode(rawBody) : rawBody;\n const expected = createHmac('sha256', secret)\n .update(enc.encode(`${t}.`))\n .update(body)\n .digest();\n return v1s.some((v1) => {\n if (!/^[0-9a-f]{64}$/.test(v1)) return false;\n return timingSafeEqual(hexToBytes(v1), expected);\n });\n}\n\ntype NodeCrypto = {\n createHmac(\n alg: string,\n key: string,\n ): { update(d: Uint8Array): { update(d: Uint8Array): { digest(): Uint8Array } } };\n timingSafeEqual(a: Uint8Array, b: Uint8Array): boolean;\n};\n\nfunction nodeCrypto(): NodeCrypto {\n const proc = (globalThis as { process?: { getBuiltinModule?: (id: string) => unknown } }).process;\n const mod = proc?.getBuiltinModule?.('node:crypto') as NodeCrypto | undefined;\n if (!mod) {\n throw new Error(\n 'verifyResolveWebhook needs node:crypto (Node 20.16+/22.3+, Bun or Deno); run it server-side',\n );\n }\n return mod;\n}\n\nfunction hexToBytes(hex: string): Uint8Array {\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < out.length; i++) out[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n return out;\n}\n\n/** `payloadType` of Resolve attestation envelopes. */\nexport const RESOLVE_ATTESTATION_PAYLOAD_TYPE =\n 'application/vnd.codai.resolve.attestation+json;v=1';\n\nexport type ResolveAttestationVerifyResult =\n | { ok: true; keyid: string }\n | { ok: false; reason: 'UNSIGNED' | 'BAD_SIGNATURE' | 'STATEMENT_MISMATCH' | 'BAD_PAYLOAD_TYPE' };\n\ntype VerifyCrypto = {\n createHash(alg: string): { update(d: Uint8Array): { digest(enc: 'hex'): string } };\n createVerify(alg: string): {\n update(d: Uint8Array): void;\n verify(key: { key: string; dsaEncoding: 'der' }, sig: Uint8Array): boolean;\n };\n};\n\nfunction verifyCrypto(): VerifyCrypto {\n const proc = (globalThis as { process?: { getBuiltinModule?: (id: string) => unknown } }).process;\n const mod = proc?.getBuiltinModule?.('node:crypto') as VerifyCrypto | undefined;\n if (!mod) {\n throw new Error(\n 'verifyAttestation needs node:crypto (Node 20.16+/22.3+, Bun or Deno); run it server-side',\n );\n }\n return mod;\n}\n\n/** RFC 8785 (JCS) for the JSON subset a statement uses: sorted keys, no whitespace. */\nfunction canonicalJson(v: unknown): string {\n if (v === null || typeof v !== 'object') return JSON.stringify(v);\n if (Array.isArray(v)) return `[${v.map(canonicalJson).join(',')}]`;\n const o = v as Record<string, unknown>;\n return `{${Object.keys(o)\n .filter((k) => o[k] !== undefined)\n .sort()\n .map((k) => `${JSON.stringify(k)}:${canonicalJson(o[k])}`)\n .join(',')}}`;\n}\n\nfunction base64ToBytes(b64: string): Uint8Array {\n const bin = atob(b64);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n}\n\n/** DSSE v1 PAE: `\"DSSEv1\" SP len(type) SP type SP len(body) SP body` (byte lengths). */\nfunction pae(payloadType: string, body: Uint8Array): Uint8Array {\n const enc = new TextEncoder();\n const typeBytes = enc.encode(payloadType);\n const head = enc.encode(`DSSEv1 ${typeBytes.length} ${payloadType} ${body.length} `);\n const out = new Uint8Array(head.length + body.length);\n out.set(head, 0);\n out.set(body, head.length);\n return out;\n}\n\n/** The statement the Resolve service signs, recomputed from the attestation JSON. */\nexport function resolveAttestationStatement(att: ResolveAttestation): Record<string, unknown> {\n const { createHash } = verifyCrypto();\n const enc = new TextEncoder();\n const sha = (s: string | null | undefined) =>\n s == null ? null : createHash('sha256').update(enc.encode(s)).digest('hex');\n return {\n kind: 'codai.resolve.attestation.v1',\n attestation_id: att.id,\n repo_url: att.repo_url,\n base_commit: att.base_commit,\n patch_sha256: sha(att.patch),\n repro_test: att.repro_test?.path\n ? { path: att.repro_test.path, sha256: sha(att.repro_test.content) }\n : null,\n test_command: att.test_command,\n regression_command: att.regression_command,\n test_output_before_sha256: sha(att.test_output_before),\n test_output_after_sha256: sha(att.test_output_after),\n regression_output_sha256: sha(att.regression_output),\n runner_image_digest: att.runner_image_digest,\n started_at: att.started_at,\n verified_at: att.verified_at,\n };\n}\n\n/**\n * Verify a Resolve attestation offline against published keys: the DSSE\n * signature (ECDSA P-256/SHA-256, DER) over `PAE(payloadType, payload)` must\n * match one key, AND the signed statement must equal the one recomputed from\n * the attestation's own fields (so a valid signature over other content fails).\n * Server-side only (`node:crypto`, loaded lazily).\n */\nexport function verifyAttestationWithKeys(\n att: ResolveAttestation,\n keys: ResolveKeys,\n): ResolveAttestationVerifyResult {\n const env = att.signature;\n if (!env || !Array.isArray(env.signatures) || env.signatures.length === 0)\n return { ok: false, reason: 'UNSIGNED' };\n if (env.payloadType !== RESOLVE_ATTESTATION_PAYLOAD_TYPE)\n return { ok: false, reason: 'BAD_PAYLOAD_TYPE' };\n const { createVerify } = verifyCrypto();\n let body: Uint8Array;\n try {\n body = base64ToBytes(env.payload);\n } catch {\n return { ok: false, reason: 'BAD_SIGNATURE' };\n }\n const msg = pae(env.payloadType, body);\n let keyid: string | null = null;\n outer: for (const s of env.signatures) {\n let sig: Uint8Array;\n try {\n sig = base64ToBytes(s.sig);\n } catch {\n continue;\n }\n for (const k of keys.keys) {\n if (k.payload_type && k.payload_type !== env.payloadType) continue;\n try {\n const v = createVerify('SHA256');\n v.update(msg);\n if (v.verify({ key: k.public_key_pem, dsaEncoding: 'der' }, sig)) {\n keyid = k.keyid;\n break outer;\n }\n } catch {\n /* malformed key/signature — try the next */\n }\n }\n }\n if (keyid === null) return { ok: false, reason: 'BAD_SIGNATURE' };\n let signed: unknown;\n try {\n signed = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(body));\n } catch {\n return { ok: false, reason: 'STATEMENT_MISMATCH' };\n }\n if (canonicalJson(signed) !== canonicalJson(resolveAttestationStatement(att)))\n return { ok: false, reason: 'STATEMENT_MISMATCH' };\n return { ok: true, keyid };\n}\n\n/** Statuses after which a job never changes again. */\nexport const RESOLVE_TERMINAL_STATUSES: ReadonlySet<ResolveJobStatus> = new Set<ResolveJobStatus>([\n 'resolved',\n 'failed',\n 'declined',\n 'error',\n]);\n\n/** Any non-2xx answer from the Resolve service (flat `{ error }` body). */\nexport class ResolveError extends CodaiError {\n /** The `error` field of the body: a message, or Zod `flatten()` details on a 400. */\n readonly detail: string | ResolveValidationDetails | null;\n\n constructor(\n message: string,\n status: number,\n body: unknown,\n meta: { requestId?: string | null; retryAfter?: number | null } = {},\n ) {\n super(message, status, body, meta);\n this.name = 'ResolveError';\n this.detail = extractDetail(body);\n }\n}\n\n/** `402` on `accept()` — the wallet cannot hold the quote; the job stays `quoted`. */\nexport class ResolveInsufficientFundsError extends ResolveError {\n /** Wallet balance, in `currency` units (EUR micros). */\n readonly balance: number;\n /** Amount the hold needs, in `currency` units (EUR micros). */\n readonly required: number;\n readonly currency: 'micro_eur';\n /** pay.codai.ro checkout link for the shortfall — open it, then retry `accept()`. */\n readonly topupUrl: string;\n /** Present only for a `t7` job: fix-bundle checkout (10 t7 fix credits for €49). */\n readonly bundleUrl?: string;\n\n constructor(\n message: string,\n body: ResolveInsufficientFunds,\n meta: { requestId?: string | null } = {},\n ) {\n super(message, 402, body, meta);\n this.name = 'ResolveInsufficientFundsError';\n this.balance = body.balance;\n this.required = body.required;\n this.currency = body.currency;\n this.topupUrl = body.topup_url;\n if (typeof body.bundle_url === 'string') this.bundleUrl = body.bundle_url;\n }\n}\n\nexport interface ResolveWaitOptions {\n /** Poll interval (ms). Default 5_000. */\n intervalMs?: number;\n /** Give up after this long (ms); throws `ResolveError` (status 0, body = last job). Default 1_800_000. */\n timeoutMs?: number;\n /** Stop when the job reaches one of these. Default `RESOLVE_TERMINAL_STATUSES`. */\n until?: Iterable<ResolveJobStatus>;\n signal?: AbortSignal;\n /** Called with every polled job (progress UIs). */\n onPoll?: (job: ResolveJob) => void;\n}\n\ntype CallOpts = { signal?: AbortSignal };\n\nexport class Resolve {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * `POST /v1/resolve/jobs` — submit a public GitHub repo + issue for triage.\n * Returns a quote (`status: 'quoted'`), a free-tier auto-accept\n * (`status: 'accepted'`) or a decline (`status: 'declined'`). Never retried:\n * a retry could create a second job.\n */\n submit(body: ResolveIntake, opts: CallOpts = {}): Promise<ResolveSubmitResult> {\n if (!body.issue_url && !body.issue_text)\n throw new TypeError('resolve.submit: one of issue_url or issue_text is required');\n return this.call<ResolveSubmitResult>('/v1/resolve/jobs', {\n method: 'POST',\n body,\n noRetry: true,\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/resolve/jobs/{id}` — status, quote, reasons, cost and attestation pointer. */\n get(id: string, opts: CallOpts = {}): Promise<ResolveJob> {\n return this.call<ResolveJob>(`/v1/resolve/jobs/${encodeURIComponent(id)}`, {\n signal: opts.signal,\n });\n }\n\n /**\n * `POST /v1/resolve/jobs/{id}/accept` — accept a paid quote and start the job.\n * The result's `paid_with` says how it was paid (`intro` €1 hold, `credit`\n * t7 fix credit, or `wallet`). Throws `ResolveInsufficientFundsError` (402,\n * carries `topupUrl`, plus `bundleUrl` for t7) when the wallet is short,\n * `ResolveError` 409 when the job is not `quoted`.\n */\n accept(id: string, opts: CallOpts = {}): Promise<ResolveAccepted> {\n return this.call<ResolveAccepted>(`/v1/resolve/jobs/${encodeURIComponent(id)}/accept`, {\n method: 'POST',\n rawBody: '', // no body — sent with content-length: 0\n noRetry: true,\n signal: opts.signal,\n });\n }\n\n /**\n * `GET /v1/resolve/attestations/{id}` — public execution proof (no auth needed\n * server-side). Accepts the attestation id or the job's `attestation_url`.\n */\n attestation(idOrUrl: string, opts: CallOpts = {}): Promise<ResolveAttestation> {\n const id = idOrUrl.replace(/^.*\\/v1\\/resolve\\/attestations\\//, '');\n return this.call<ResolveAttestation>(`/v1/resolve/attestations/${encodeURIComponent(id)}`, {\n signal: opts.signal,\n });\n }\n\n /** `GET /health` — liveness of the Resolve service. */\n health(opts: CallOpts = {}): Promise<ResolveHealth> {\n return this.call<ResolveHealth>('/health', { signal: opts.signal });\n }\n\n /** `GET /v1/resolve/balance` — fix credits (t7 only), intro availability and wallet balance. */\n balance(opts: CallOpts = {}): Promise<ResolveBalance> {\n return this.call<ResolveBalance>('/v1/resolve/balance', { signal: opts.signal });\n }\n\n /** `GET /v1/resolve/keys` — public keys that sign attestations (no auth needed server-side). */\n keys(opts: CallOpts = {}): Promise<ResolveKeys> {\n return this.call<ResolveKeys>('/v1/resolve/keys', { signal: opts.signal });\n }\n\n /**\n * Verify an attestation's signature and that the signed statement matches\n * its fields. Fetches `keys()` unless `opts.keys` is given (pin them to\n * avoid trusting the network). `{ ok: false, reason: 'UNSIGNED' }` for\n * attestations created before signing (2026-09-27). Server-side only.\n */\n async verifyAttestation(\n att: ResolveAttestation,\n opts: { keys?: ResolveKeys; signal?: AbortSignal } = {},\n ): Promise<ResolveAttestationVerifyResult> {\n if (!att.signature) return { ok: false, reason: 'UNSIGNED' };\n const keys = opts.keys ?? (await this.keys({ signal: opts.signal }));\n return verifyAttestationWithKeys(att, keys);\n }\n\n /**\n * Poll `get(id)` until the job reaches a terminal status (`resolved`,\n * `failed`, `declined`, `error`) or one of `opts.until`. A `quoted` job\n * does not move until you `accept()` it.\n */\n async waitFor(id: string, opts: ResolveWaitOptions = {}): Promise<ResolveJob> {\n const intervalMs = opts.intervalMs ?? 5_000;\n const timeoutMs = opts.timeoutMs ?? 1_800_000;\n const until = new Set(opts.until ?? RESOLVE_TERMINAL_STATUSES);\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n const job = await this.get(id, { signal: opts.signal });\n opts.onPoll?.(job);\n if (until.has(job.status)) return job;\n const left = deadline - Date.now();\n if (left <= 0)\n throw new ResolveError(\n `codai-resolve job ${id} still ${job.status} after ${timeoutMs} ms`,\n 0,\n job,\n );\n await abortableSleep(Math.min(intervalMs, left), opts.signal);\n }\n }\n\n private async call<T>(path: string, init: RequestOptions): Promise<T> {\n try {\n return await this.http.json<T>(path, init);\n } catch (err) {\n throw toResolveError(path, err);\n }\n }\n}\n\nfunction extractDetail(body: unknown): string | ResolveValidationDetails | null {\n if (body && typeof body === 'object' && 'error' in body) {\n const e = (body as { error: unknown }).error;\n if (typeof e === 'string') return e;\n if (e && typeof e === 'object') return e as ResolveValidationDetails;\n }\n return null;\n}\n\nfunction isInsufficientFunds(body: unknown): body is ResolveInsufficientFunds {\n return (\n !!body &&\n typeof body === 'object' &&\n (body as { error?: unknown }).error === 'insufficient_funds' &&\n typeof (body as { topup_url?: unknown }).topup_url === 'string'\n );\n}\n\n/** Re-type a `CodaiError` from the shared HTTP layer into the Resolve hierarchy. */\nfunction toResolveError(path: string, err: unknown): unknown {\n if (!(err instanceof CodaiError) || err instanceof ResolveError) return err;\n if (err.status === 0) return err; // network/timeout — nothing Resolve-specific\n const meta = { requestId: err.requestId, retryAfter: err.retryAfter };\n if (err.status === 402 && isInsufficientFunds(err.body)) {\n const b = err.body;\n return new ResolveInsufficientFundsError(\n `codai-resolve ${path} → 402: insufficient funds (balance ${b.balance}, required ${b.required} ${b.currency}); top up at ${b.topup_url}${b.bundle_url ? ` or buy 10 t7 fixes for €49 at ${b.bundle_url}` : ''}`,\n b,\n meta,\n );\n }\n const detail = extractDetail(err.body);\n const text =\n detail === null ? '' : `: ${typeof detail === 'string' ? detail : JSON.stringify(detail)}`;\n return new ResolveError(\n `codai-resolve ${path} → ${err.status}${text}`,\n err.status,\n err.body,\n meta,\n );\n}\n\nfunction abortableSleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(signal.reason);\n const onAbort = () => {\n clearTimeout(t);\n reject(signal?.reason);\n };\n const t = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n","/** `POST /v1/responses` — OpenAI Responses API compatibility (JSON + named-event SSE). */\nimport { type CodaiRequestExtensions, frameJson, type HttpClient, readSse } from '../http';\nimport { type Body, type Mutable, type Reply } from './_shared';\n\nexport type ResponsesRequest = Mutable<Body<'createResponse'>>;\nexport type ResponsesResponse = Reply<'createResponse'>;\n/** Request body as accepted by the SDK: `stream` is set by the method and `model` defaults to `codai`. */\nexport type ResponsesInput = Omit<ResponsesRequest, 'stream' | 'model'> & { model?: string };\n\nexport interface ResponsesCallOptions {\n ext?: CodaiRequestExtensions;\n signal?: AbortSignal;\n}\n\nexport interface ResponsesResult {\n /** `output_text` of the response. */\n outputText: string;\n raw: ResponsesResponse;\n requestId: string | null;\n routedTo: string | null;\n headers: Headers;\n}\n\n/** One Responses streaming event; `type` mirrors the SSE `event:` name. */\nexport interface ResponsesStreamEvent {\n type:\n | 'response.created'\n | 'response.output_text.delta'\n | 'response.output_item.done'\n | 'response.output_text.done'\n | 'response.completed'\n | (string & {});\n sequence_number?: number;\n [key: string]: unknown;\n}\n\nexport interface ResponsesStreamResult {\n outputText: string;\n /** The full `response` object from `response.completed`, when received. */\n response: ResponsesResponse | null;\n requestId: string | null;\n routedTo: string | null;\n headers: Headers | null;\n}\n\nexport interface ResponsesStream extends AsyncIterable<ResponsesStreamEvent> {\n readonly final: Promise<ResponsesStreamResult>;\n /** Text deltas only. */\n text(): AsyncIterable<string>;\n}\n\nexport class Responses {\n constructor(private readonly http: HttpClient) {}\n\n async create(body: ResponsesInput, opts: ResponsesCallOptions = {}): Promise<ResponsesResult> {\n const res = await this.http.request('/v1/responses', {\n body: { ...body, model: body.model ?? 'codai', stream: false },\n ext: opts.ext,\n signal: opts.signal,\n });\n const raw = (await res.json()) as ResponsesResponse;\n return {\n outputText: typeof raw.output_text === 'string' ? raw.output_text : '',\n raw,\n requestId: res.headers.get('x-codai-trace-id') ?? res.headers.get('x-request-id'),\n routedTo: res.headers.get('x-codai-routed-to'),\n headers: res.headers,\n };\n }\n\n stream(body: ResponsesInput, opts: ResponsesCallOptions = {}): ResponsesStream {\n const requestPromise = this.http.request('/v1/responses', {\n body: { ...body, model: body.model ?? 'codai', stream: true },\n ext: opts.ext,\n signal: opts.signal,\n timeoutMs: 0,\n noRetry: true,\n });\n\n let resolveFinal!: (r: ResponsesStreamResult) => void;\n let rejectFinal!: (e: unknown) => void;\n const final = new Promise<ResponsesStreamResult>((resolve, reject) => {\n resolveFinal = resolve;\n rejectFinal = reject;\n });\n final.catch(() => {});\n\n let outputText = '';\n let response: ResponsesResponse | null = null;\n let res: Response | null = null;\n\n async function* events(): AsyncGenerator<ResponsesStreamEvent, void, undefined> {\n try {\n res = await requestPromise;\n for await (const frame of readSse(res, opts.signal)) {\n const ev = frameJson<ResponsesStreamEvent>(frame);\n if (!ev) continue;\n if (typeof ev.type !== 'string') ev.type = frame.event;\n if (ev.type === 'response.output_text.delta' && typeof ev.delta === 'string') {\n outputText += ev.delta;\n } else if (ev.type === 'response.completed' && ev.response) {\n response = ev.response as ResponsesResponse;\n }\n yield ev;\n if (ev.type === 'response.completed') break;\n }\n resolveFinal({\n outputText,\n response,\n requestId: res.headers.get('x-codai-trace-id') ?? res.headers.get('x-request-id') ?? null,\n routedTo: res.headers.get('x-codai-routed-to'),\n headers: res.headers,\n });\n } catch (err) {\n rejectFinal(err);\n throw err;\n }\n }\n\n async function* textOnly(): AsyncGenerator<string, void, undefined> {\n for await (const ev of events()) {\n if (ev.type === 'response.output_text.delta' && typeof ev.delta === 'string')\n yield ev.delta;\n }\n }\n\n return {\n [Symbol.asyncIterator]: () => events(),\n text: () => ({ [Symbol.asyncIterator]: () => textOnly() }),\n final,\n };\n }\n}\n","/**\n * `/v1/sessions/*` — shared-sessions protocol v2 (events, controls, lease,\n * dispatch, SSE stream) plus the per-session shares under `/shares`.\n *\n * Every call needs the `x-codai-device` header: set it once via\n * `new Codai({ device: '<uuid>' })` or per call through `ext.device`.\n */\nimport { type CodaiRequestExtensions, frameJson, type HttpClient } from '../http';\nimport { type Body, type Mutable, type QueryOf, type Reply, type Schema } from './_shared';\n\nexport type Session = Schema<'Session'>;\nexport type SessionListItem = Schema<'SessionListItem'>;\nexport type SessionDetail = Reply<'getSession'>;\nexport type SessionCreateRequest = Mutable<Body<'createSession'>>;\nexport type SessionPatchRequest = Mutable<Body<'updateSession'>>;\nexport type SessionEvent = Schema<'SessionEvent'>;\nexport type SessionIncomingEvent = Mutable<Schema<'SessionIncomingEvent'>>;\nexport type SessionEventsAppendRequest = Mutable<Body<'appendSessionEvents'>>;\nexport type SessionEventsAppendResponse = Reply<'appendSessionEvents'>;\nexport type SessionEventsPage = Reply<'listSessionEvents'>;\nexport type SessionControl = Schema<'SessionControl'>;\nexport type SessionControlRequest = Mutable<Body<'submitSessionControl'>>;\nexport type SessionControlAccepted = Reply<'submitSessionControl', 202>;\nexport type SessionDispatchRequest = Mutable<Body<'dispatchToDevice'>>;\nexport type SessionDispatchResponse = Reply<'dispatchToDevice', 202>;\nexport type SessionLeaseClaimRequest = Mutable<Body<'claimSessionLease'>>;\nexport type SessionLeaseResponse = Reply<'claimSessionLease'>;\nexport type SessionShare = Schema<'OrgSessionShare'>;\nexport type SessionShareCreateRequest = Mutable<Body<'createSessionShare'>>;\nexport type SessionShareCreated = Reply<'createSessionShare', 201>;\nexport type SharedSession = Schema<'OrgSharedSession'>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\n/** Frames of `GET /v1/sessions/{id}/stream`; every payload carries `v: 1`. */\nexport type SessionStreamEvent =\n | { event: 'event'; data: { v: 1; seq: number } & Record<string, unknown> }\n | {\n event: 'control';\n data: { v: 1; id: string; kind: string; seq: number | null; applied: boolean } & Record<\n string,\n unknown\n >;\n }\n | { event: 'lease'; data: { v: 1; holder_device_id: string | null; expires_at: string | null } }\n | {\n event: 'presence';\n data: {\n v: 1;\n device_id: string;\n user_id: string;\n role: string;\n executor: boolean;\n last_seen: string;\n driving: boolean;\n online: boolean;\n };\n }\n | { event: string; data: Record<string, unknown> };\n\nconst enc = encodeURIComponent;\n\nexport class SessionLease {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /v1/sessions/{id}/lease` — CAS claim; `force: true` takes over a live lease. */\n acquire(\n sessionId: string,\n body: SessionLeaseClaimRequest = {},\n opts: CallOpts = {},\n ): Promise<SessionLeaseResponse> {\n return this.http.json<SessionLeaseResponse>(`/v1/sessions/${enc(sessionId)}/lease`, {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `PUT /v1/sessions/{id}/lease` — heartbeat every 10 s (TTL 30 s). */\n renew(sessionId: string, opts: CallOpts = {}): Promise<SessionLeaseResponse> {\n return this.http.json<SessionLeaseResponse>(`/v1/sessions/${enc(sessionId)}/lease`, {\n method: 'PUT',\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `DELETE /v1/sessions/{id}/lease` */\n release(sessionId: string, opts: CallOpts = {}): Promise<Reply<'releaseSessionLease'>> {\n return this.http.json<Reply<'releaseSessionLease'>>(`/v1/sessions/${enc(sessionId)}/lease`, {\n method: 'DELETE',\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n\nexport class SessionEvents {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/sessions/{id}/events?after=&limit=` */\n list(\n sessionId: string,\n query: Mutable<QueryOf<'listSessionEvents'>> = {},\n opts: CallOpts = {},\n ): Promise<SessionEventsPage> {\n return this.http.json<SessionEventsPage>(`/v1/sessions/${enc(sessionId)}/events`, {\n query: { after: query.after, limit: query.limit },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/sessions/{id}/events` — executor only (needs the live lease). */\n append(\n sessionId: string,\n body: SessionEventsAppendRequest,\n opts: CallOpts = {},\n ): Promise<SessionEventsAppendResponse> {\n return this.http.json<SessionEventsAppendResponse>(`/v1/sessions/${enc(sessionId)}/events`, {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n\nexport class SessionControls {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/sessions/{id}/controls?applied=&target=` — drain the control queue. */\n async list(\n sessionId: string,\n query: { applied?: boolean; target?: 'me' | string } = {},\n opts: CallOpts = {},\n ): Promise<SessionControl[]> {\n const raw = await this.http.json<Reply<'listSessionControls'>>(\n `/v1/sessions/${enc(sessionId)}/controls`,\n {\n query: { applied: query.applied, target: query.target },\n ext: opts.ext,\n signal: opts.signal,\n },\n );\n return [...(raw.controls ?? [])];\n }\n\n /** `POST /v1/sessions/{id}/control` — send a control to the executor (editor+). */\n submit(\n sessionId: string,\n body: SessionControlRequest,\n opts: CallOpts = {},\n ): Promise<SessionControlAccepted> {\n return this.http.json<SessionControlAccepted>(`/v1/sessions/${enc(sessionId)}/control`, {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/sessions/{id}/control/{cid}/applied` — executor only. */\n markApplied(\n sessionId: string,\n controlId: string,\n opts: CallOpts = {},\n ): Promise<Reply<'markSessionControlApplied'>> {\n return this.http.json<Reply<'markSessionControlApplied'>>(\n `/v1/sessions/${enc(sessionId)}/control/${enc(controlId)}/applied`,\n { method: 'POST', ext: opts.ext, signal: opts.signal },\n );\n }\n}\n\nexport class SessionShares {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/sessions/{id}/shares` — owner only. */\n async list(sessionId: string, opts: CallOpts = {}): Promise<SessionShare[]> {\n const raw = await this.http.json<Reply<'listSessionShares'>>(\n `/v1/sessions/${enc(sessionId)}/shares`,\n { ext: opts.ext, signal: opts.signal },\n );\n return [...(raw.shares ?? [])];\n }\n\n /** `POST /v1/sessions/{id}/shares` — `token` is returned once for link shares. */\n create(\n sessionId: string,\n body: SessionShareCreateRequest,\n opts: CallOpts = {},\n ): Promise<SessionShareCreated> {\n return this.http.json<SessionShareCreated>(`/v1/sessions/${enc(sessionId)}/shares`, {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `DELETE /v1/sessions/{id}/shares/{shareId}` */\n delete(\n sessionId: string,\n shareId: string,\n opts: CallOpts = {},\n ): Promise<Reply<'deleteSessionShare'>> {\n return this.http.json<Reply<'deleteSessionShare'>>(\n `/v1/sessions/${enc(sessionId)}/shares/${enc(shareId)}`,\n { method: 'DELETE', ext: opts.ext, signal: opts.signal },\n );\n }\n\n /** `GET /v1/sessions/shared-with-me` */\n async sharedWithMe(\n query: { archived?: boolean } = {},\n opts: CallOpts = {},\n ): Promise<SharedSession[]> {\n const raw = await this.http.json<Reply<'listSessionsSharedWithMe'>>(\n '/v1/sessions/shared-with-me',\n {\n query: { archived: query.archived ? '1' : undefined },\n ext: opts.ext,\n signal: opts.signal,\n },\n );\n return [...(raw.sessions ?? [])];\n }\n}\n\nexport class Sessions {\n readonly events: SessionEvents;\n readonly controls: SessionControls;\n readonly lease: SessionLease;\n readonly shares: SessionShares;\n\n constructor(private readonly http: HttpClient) {\n this.events = new SessionEvents(http);\n this.controls = new SessionControls(http);\n this.lease = new SessionLease(http);\n this.shares = new SessionShares(http);\n }\n\n /** `POST /v1/sessions` — idempotent on `session_key` (200 existing / 201 created). */\n async create(\n body: SessionCreateRequest = {},\n opts: CallOpts = {},\n ): Promise<Session & { created: boolean }> {\n const res = await this.http.request('/v1/sessions', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n const session = (await res.json()) as Session;\n return { ...session, created: res.status === 201 };\n }\n\n /** `GET /v1/sessions?limit=&archived=` — own sessions first, then shared. */\n async list(\n query: { limit?: number; archived?: boolean } = {},\n opts: CallOpts = {},\n ): Promise<SessionListItem[]> {\n const raw = await this.http.json<Reply<'listSessions'>>('/v1/sessions', {\n query: { limit: query.limit, archived: query.archived ? '1' : undefined, v: '2' },\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.sessions ?? [])];\n }\n\n /** `GET /v1/sessions/{id}` — detail with members, lease and presence. */\n get(\n sessionId: string,\n query: { share?: string } = {},\n opts: CallOpts = {},\n ): Promise<SessionDetail> {\n return this.http.json<SessionDetail>(`/v1/sessions/${enc(sessionId)}`, {\n query: { share: query.share, v: '2' },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `PATCH /v1/sessions/{id}` — rename / archive (owner). */\n update(sessionId: string, body: SessionPatchRequest, opts: CallOpts = {}): Promise<Session> {\n return this.http.json<Session>(`/v1/sessions/${enc(sessionId)}`, {\n method: 'PATCH',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `DELETE /v1/sessions/{id}` — irreversible (owner). */\n delete(sessionId: string, opts: CallOpts = {}): Promise<Reply<'deleteSession'>> {\n return this.http.json<Reply<'deleteSession'>>(`/v1/sessions/${enc(sessionId)}`, {\n method: 'DELETE',\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/sessions/{id}/dispatch` — queue a `send` for one device and wake it over FCM. */\n dispatch(\n sessionId: string,\n body: SessionDispatchRequest,\n opts: CallOpts = {},\n ): Promise<SessionDispatchResponse> {\n return this.http.json<SessionDispatchResponse>(`/v1/sessions/${enc(sessionId)}/dispatch`, {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /**\n * `GET /v1/sessions/{id}/stream?after=` — live SSE of `event` / `control` /\n * `lease` / `presence` frames. `: ping` heartbeats are skipped. The server\n * closes after 30 min; reconnect with `after` = highest `seq` seen.\n */\n async *stream(\n sessionId: string,\n query: { after?: number; share?: string } = {},\n opts: CallOpts = {},\n ): AsyncGenerator<SessionStreamEvent, void, undefined> {\n const frames = this.http.sse(`/v1/sessions/${enc(sessionId)}/stream`, {\n query: { after: query.after, share: query.share },\n ext: opts.ext,\n signal: opts.signal,\n });\n for await (const frame of frames) {\n const data = frameJson<Record<string, unknown>>(frame);\n if (!data) continue;\n yield { event: frame.event, data } as SessionStreamEvent;\n }\n }\n}\n","/** `POST /v1/systemone` — typed decisions from codai-s1 (Choice / Score / Noul). */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply } from './_shared';\n\nexport type SystemOneRequest = Mutable<Body<'createSystemOne'>>;\nexport type SystemOneResponse = Reply<'createSystemOne'>;\n\nexport class SystemOne {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Ask one or more typed questions about `state`. Throws on 503 `s1_unavailable` like any other\n * error — keep a local fallback and catch it: the gateway never substitutes a generative model.\n */\n async create(\n body: SystemOneRequest,\n opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal } = {},\n ): Promise<SystemOneResponse> {\n const res = await this.http.request('/v1/systemone', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n return (await res.json()) as SystemOneResponse;\n }\n}\n","/** `/v1/tasks/*` — outcome-billing task lifecycle. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type QueryOf, type Reply, type Schema } from './_shared';\n\nexport type Task = Schema<'Task'>;\nexport type TaskOutcome = Schema<'TaskOutcome'>;\nexport type TaskStats = Reply<'getTaskStats'>;\nexport type TaskListPage = Reply<'listTasks'>;\nexport type TaskConfirmRequest = Mutable<Body<'confirmTask'>>;\nexport type TaskConfirmResponse = Reply<'confirmTask'>;\nexport type TaskListQuery = Mutable<QueryOf<'listTasks'>>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nexport class Tasks {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/tasks` — newest first; page with `cursor` = previous `next_cursor`. */\n list(query: TaskListQuery = {}, opts: CallOpts = {}): Promise<TaskListPage> {\n return this.http.json<TaskListPage>('/v1/tasks', {\n query: { outcome: query.outcome, limit: query.limit, cursor: query.cursor },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/tasks/pending` — tasks awaiting your confirmation (max 100). */\n async pending(opts: CallOpts = {}): Promise<Task[]> {\n const raw = await this.http.json<Reply<'listPendingTasks'>>('/v1/tasks/pending', {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.tasks ?? [])];\n }\n\n /** `GET /v1/tasks/stats?since=` */\n stats(since?: string | Date, opts: CallOpts = {}): Promise<TaskStats> {\n return this.http.json<TaskStats>('/v1/tasks/stats', {\n query: { since: since instanceof Date ? since.toISOString() : since },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/tasks/{id}` */\n get(id: string, opts: CallOpts = {}): Promise<Task> {\n return this.http.json<Task>(`/v1/tasks/${encodeURIComponent(id)}`, {\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/tasks/{id}/confirm` — answer \"Did codai solve it?\". */\n confirm(id: string, body: TaskConfirmRequest, opts: CallOpts = {}): Promise<TaskConfirmResponse> {\n return this.http.json<TaskConfirmResponse>(`/v1/tasks/${encodeURIComponent(id)}/confirm`, {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n","/** `/v1/triggers/*` + `/v1/notifications/*` — event triggers (webhooks → agent sessions) and the inbox. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply } from './_shared';\n\nexport type TriggerList = Reply<'listTriggers'>;\nexport type TriggerCreateRequest = Mutable<Body<'createTrigger'>>;\nexport type TriggerCreated = Reply<'createTrigger'>;\nexport type TriggerPatch = Mutable<Body<'updateTrigger'>>;\nexport type TriggerUpdated = Reply<'updateTrigger'>;\nexport type TriggerTestRequest = Mutable<Body<'testTrigger'>>;\nexport type TriggerTestResult = Reply<'testTrigger'>;\nexport type TriggerEvents = Reply<'listTriggerEvents'>;\nexport type NotificationList = Reply<'listNotifications'>;\nexport type NotificationsRead = Reply<'markNotificationsRead'>;\n/** Reply of `DELETE /v1/notifications/:id` and `POST /v1/notifications/delete`. */\nexport type NotificationsDeleted = { readonly deleted: number };\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nexport class Triggers {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/triggers` — never includes the signing secret. */\n list(opts: CallOpts = {}): Promise<TriggerList> {\n return this.http.json<TriggerList>('/v1/triggers', { ext: opts.ext, signal: opts.signal });\n }\n\n /** `POST /v1/triggers` — the response carries the signing `secret` ONCE. */\n create(body: TriggerCreateRequest, opts: CallOpts = {}): Promise<TriggerCreated> {\n return this.http.json<TriggerCreated>('/v1/triggers', { method: 'POST', body, ext: opts.ext, signal: opts.signal });\n }\n\n /** `PATCH /v1/triggers/{id}` — name / enabled / policy. */\n update(id: string, body: TriggerPatch, opts: CallOpts = {}): Promise<TriggerUpdated> {\n return this.http.json<TriggerUpdated>(`/v1/triggers/${encodeURIComponent(id)}`, { method: 'PATCH', body, ext: opts.ext, signal: opts.signal });\n }\n\n /** `DELETE /v1/triggers/{id}` — its hook URL stops working immediately. */\n delete(id: string, opts: CallOpts = {}): Promise<Reply<'deleteTrigger'>> {\n return this.http.json<Reply<'deleteTrigger'>>(`/v1/triggers/${encodeURIComponent(id)}`, { method: 'DELETE', ext: opts.ext, signal: opts.signal });\n }\n\n /** `POST /v1/triggers/{id}/rotate-secret` — new secret, shown once. */\n rotateSecret(id: string, opts: CallOpts = {}): Promise<Reply<'rotateTriggerSecret'>> {\n return this.http.json<Reply<'rotateTriggerSecret'>>(`/v1/triggers/${encodeURIComponent(id)}/rotate-secret`, { method: 'POST', body: {}, ext: opts.ext, signal: opts.signal });\n }\n\n /** `POST /v1/triggers/{id}/test` — manual fire through the full pipeline; returns the decision + reason. */\n /** `PUT /v1/triggers/{id}/secret` — store a secret issued by the source (e.g. a Sentry integration's client secret). */\n setSecret(id: string, secret: string, opts: CallOpts = {}): Promise<Reply<'setTriggerSecret'>> {\n return this.http.json<Reply<'setTriggerSecret'>>(`/v1/triggers/${encodeURIComponent(id)}/secret`, { method: 'PUT', body: { secret }, ext: opts.ext, signal: opts.signal, noRetry: true });\n }\n\n /** `POST /v1/triggers/{id}/test` — manual fire through the full pipeline; returns the decision + reason. */\n test(id: string, body: TriggerTestRequest = {}, opts: CallOpts = {}): Promise<TriggerTestResult> {\n return this.http.json<TriggerTestResult>(`/v1/triggers/${encodeURIComponent(id)}/test`, { method: 'POST', body, ext: opts.ext, signal: opts.signal });\n }\n\n /** `GET /v1/triggers/{id}/events?limit=` — recent deliveries with decisions. */\n events(id: string, limit?: number, opts: CallOpts = {}): Promise<TriggerEvents> {\n return this.http.json<TriggerEvents>(`/v1/triggers/${encodeURIComponent(id)}/events`, { query: { limit }, ext: opts.ext, signal: opts.signal });\n }\n\n /**\n * `POST /v1/hooks/{id}` — send an event to a `generic` / `form` trigger from your own code. Signs the body\n * (`X-Codai-Signature: t=<unix>,v1=HMAC_SHA256(secret, \"<t>.<body>\")`, WebCrypto — Node 20+, browsers, Deno,\n * Workers). `deliveryId` makes retries idempotent. The hook needs no API key (the signature is the auth).\n */\n async fireHook(\n id: string,\n secret: string,\n event: { title: string; message?: string; severity?: 'info' | 'low' | 'medium' | 'high' | 'critical'; url?: string; subject?: string; labels?: string[]; dedupe_key?: string; resolved?: boolean },\n opts: CallOpts & { deliveryId?: string } = {},\n ): Promise<Reply<'receiveTriggerHook'>> {\n const raw = JSON.stringify(event);\n const t = Math.floor(Date.now() / 1000);\n const key = await crypto.subtle.importKey('raw', new TextEncoder().encode(secret), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);\n const mac = new Uint8Array(await crypto.subtle.sign('HMAC', key, new TextEncoder().encode(`${t}.${raw}`)));\n const v1 = Array.from(mac, (b) => b.toString(16).padStart(2, '0')).join('');\n return this.http.json<Reply<'receiveTriggerHook'>>(`/v1/hooks/${encodeURIComponent(id)}`, {\n method: 'POST',\n rawBody: raw,\n ext: {\n ...opts.ext,\n headers: {\n ...opts.ext?.headers,\n 'Content-Type': 'application/json',\n 'x-codai-signature': `t=${t},v1=${v1}`,\n ...(opts.deliveryId ? { 'x-codai-delivery': opts.deliveryId } : {}),\n },\n },\n signal: opts.signal,\n });\n }\n}\n\nexport class Notifications {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/notifications?unread=1&limit=` — newest first. */\n list(query: { unread?: boolean; limit?: number } = {}, opts: CallOpts = {}): Promise<NotificationList> {\n return this.http.json<NotificationList>('/v1/notifications', {\n query: { unread: query.unread ? '1' : undefined, limit: query.limit },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/notifications/read` — `ids` omitted = every unread one. */\n markRead(ids?: number[], opts: CallOpts = {}): Promise<NotificationsRead> {\n return this.http.json<NotificationsRead>('/v1/notifications/read', { method: 'POST', body: ids ? { ids } : {}, ext: opts.ext, signal: opts.signal });\n }\n\n /** `DELETE /v1/notifications/:id` — `{ deleted: 0 }` when the id is missing or not yours. */\n delete(id: number, opts: CallOpts = {}): Promise<NotificationsDeleted> {\n return this.http.json<NotificationsDeleted>(`/v1/notifications/${encodeURIComponent(String(id))}`, { method: 'DELETE', ext: opts.ext, signal: opts.signal });\n }\n\n /** `POST /v1/notifications/delete` — 1..200 ids; ids of other users are skipped. */\n deleteMany(ids: number[], opts: CallOpts = {}): Promise<NotificationsDeleted> {\n return this.http.json<NotificationsDeleted>('/v1/notifications/delete', { method: 'POST', body: { ids }, ext: opts.ext, signal: opts.signal });\n }\n}\n","/** `POST /v1/tokens` — ephemeral scoped tokens for browsers / webviews. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Reply } from './_shared';\n\nexport type EphemeralScope = 'realtime' | 'audio' | 'embeddings';\nexport type EphemeralTokenResponse = Reply<'createEphemeralToken'>;\n\nexport interface EphemeralToken {\n token: string;\n expiresAt: string;\n scope: EphemeralScope;\n raw: EphemeralTokenResponse;\n}\n\nexport class Tokens {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Mint a short-lived token (60–3600 s, default 600) bound to one surface.\n * Only a real `codai_` key may mint.\n */\n async create(\n scope: EphemeralScope,\n ttlSeconds?: number,\n opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal } = {},\n ): Promise<EphemeralToken> {\n const raw = await this.http.json<EphemeralTokenResponse>('/v1/tokens', {\n body: { scope, ...(ttlSeconds !== undefined ? { ttl_seconds: ttlSeconds } : {}) },\n ext: opts.ext,\n signal: opts.signal,\n });\n return { token: raw.token, expiresAt: raw.expires_at, scope: raw.scope, raw };\n }\n}\n","/** `/v1/tools/*` — verified web search and server-side page fetch. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply } from './_shared';\n\nexport type ToolSearchRequest = Mutable<Body<'toolsSearch'>>;\nexport type ToolSearchResponse = Reply<'toolsSearch'>;\nexport type ToolFetchRequest = Mutable<Body<'toolsFetch'>>;\nexport type ToolFetchResponse = Reply<'toolsFetch'>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nexport class Tools {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /v1/tools/search` — verified web search (never falls back to an unverified provider). */\n search(body: ToolSearchRequest, opts: CallOpts = {}): Promise<ToolSearchResponse> {\n return this.http.json<ToolSearchResponse>('/v1/tools/search', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/tools/fetch` — fetch + extract a public page (SSRF-guarded). */\n fetch(body: ToolFetchRequest, opts: CallOpts = {}): Promise<ToolFetchResponse> {\n return this.http.json<ToolFetchResponse>('/v1/tools/fetch', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n","/**\n * Single source of truth for OpenAPI parity: every `operationId` in\n * `apps/docs/openapi/en/gateway.yaml` maps to exactly one dotted method path\n * on the `Codai` client. `operations.test.ts` parses the YAML and fails when\n * an operation is missing, mapped to a non-function, or when this table\n * carries a key the YAML does not have.\n */\nexport const OPERATION_METHODS: Record<string, string> = {\n // Chat & Completions\n createChatCompletion: 'chat.completions.create',\n createResponse: 'responses.create',\n createMessage: 'messages.create',\n // Embeddings & Audio\n createEmbeddings: 'embeddings.create',\n createSystemOne: 'systemOne.create',\n createTranscription: 'audio.transcribe',\n createSpeech: 'audio.speech',\n createEphemeralToken: 'tokens.create',\n // Models\n listModels: 'models.list',\n // Health\n getHealth: 'health.get',\n getHealthReady: 'health.ready',\n getStatus: 'health.status',\n // Agents\n runAgentSync: 'agents.run',\n createAgentRun: 'agents.runs.create',\n getAgentRunStats: 'agents.runs.stats',\n getAgentRun: 'agents.runs.get',\n listAgentRunSteps: 'agents.runs.steps',\n streamAgentRun: 'agents.runs.stream',\n cancelAgentRun: 'agents.runs.cancel',\n // Tools\n toolsSearch: 'tools.search',\n toolsFetch: 'tools.fetch',\n // Tasks\n listTasks: 'tasks.list',\n listPendingTasks: 'tasks.pending',\n getTaskStats: 'tasks.stats',\n getTask: 'tasks.get',\n confirmTask: 'tasks.confirm',\n // Event triggers + inbox\n listTriggers: 'triggers.list',\n createTrigger: 'triggers.create',\n updateTrigger: 'triggers.update',\n deleteTrigger: 'triggers.delete',\n rotateTriggerSecret: 'triggers.rotateSecret',\n setTriggerSecret: 'triggers.setSecret',\n testTrigger: 'triggers.test',\n listTriggerEvents: 'triggers.events',\n receiveTriggerHook: 'triggers.fireHook',\n listNotifications: 'notifications.list',\n markNotificationsRead: 'notifications.markRead',\n deleteNotification: 'notifications.delete',\n deleteNotifications: 'notifications.deleteMany',\n // Sessions\n createSession: 'sessions.create',\n listSessions: 'sessions.list',\n getSession: 'sessions.get',\n updateSession: 'sessions.update',\n deleteSession: 'sessions.delete',\n listSessionEvents: 'sessions.events.list',\n appendSessionEvents: 'sessions.events.append',\n listSessionControls: 'sessions.controls.list',\n submitSessionControl: 'sessions.controls.submit',\n markSessionControlApplied: 'sessions.controls.markApplied',\n dispatchToDevice: 'sessions.dispatch',\n claimSessionLease: 'sessions.lease.acquire',\n heartbeatSessionLease: 'sessions.lease.renew',\n releaseSessionLease: 'sessions.lease.release',\n streamSession: 'sessions.stream',\n // Devices\n getMyDispatchInbox: 'devices.dispatchInbox',\n listDevices: 'devices.list',\n updateDevice: 'devices.update',\n deleteDevice: 'devices.delete',\n // Hosts\n listHosts: 'hosts.list',\n streamHost: 'hosts.stream',\n execOnHost: 'hosts.exec',\n postHostExecResult: 'hosts.postResult',\n // Orgs & Sharing\n listSessionsSharedWithMe: 'sessions.shares.sharedWithMe',\n listSessionShares: 'sessions.shares.list',\n createSessionShare: 'sessions.shares.create',\n deleteSessionShare: 'sessions.shares.delete',\n createOrg: 'orgs.create',\n listOrgs: 'orgs.list',\n listOrgMembers: 'orgs.members.list',\n addOrgMember: 'orgs.members.add',\n removeOrgMember: 'orgs.members.remove',\n // Projects\n listProjects: 'projects.list',\n createProject: 'projects.create',\n getProject: 'projects.get',\n updateProject: 'projects.update',\n deleteProject: 'projects.delete',\n // Environments\n listEnvironments: 'environments.list',\n createEnvironment: 'environments.create',\n enrollEnvironment: 'environments.enroll',\n getEnvironment: 'environments.get',\n updateEnvironment: 'environments.update',\n startEnvironment: 'environments.start',\n stopEnvironment: 'environments.stop',\n archiveEnvironment: 'environments.archive',\n destroyEnvironment: 'environments.destroy',\n createEnvironmentEnrollToken: 'environments.enrollToken',\n listEnvironmentMembers: 'environments.members.list',\n addEnvironmentMember: 'environments.members.add',\n setMyEnvironmentSshKey: 'environments.members.setSshKey',\n setEnvironmentMemberRole: 'environments.members.setRole',\n removeEnvironmentMember: 'environments.members.remove',\n issueMyEnvironmentSshCert: 'environments.members.sshCert',\n getEnvironmentSshCa: 'environments.sshCa',\n listEnvironmentTasks: 'environments.tasks.list',\n createEnvironmentTask: 'environments.tasks.create',\n getEnvironmentTask: 'environments.tasks.get',\n listEnvironmentPorts: 'environments.ports.list',\n setEnvironmentPort: 'environments.ports.set',\n removeEnvironmentPort: 'environments.ports.remove',\n listEnvironmentSecrets: 'environments.secrets.list',\n setEnvironmentSecret: 'environments.secrets.set',\n removeEnvironmentSecret: 'environments.secrets.remove',\n // Account\n getAccount: 'account.get',\n patchAccount: 'account.update',\n getReceipt: 'receipt.get',\n submitFeedback: 'feedback.submit',\n listPhoneModels: 'phoneModels.list',\n};\n\n/** Operations whose SDK method is an async iterator (SSE-only endpoints). */\nexport const STREAMING_OPERATIONS: ReadonlySet<string> = new Set([\n 'streamAgentRun',\n 'streamSession',\n 'streamHost',\n]);\n\n/**\n * Same parity contract for the separate Resolve service\n * (`apps/docs/openapi/en/resolve.yaml`, host `resolveBaseUrl`) —\n * checked by `operations.resolve.test.ts`.\n */\nexport const RESOLVE_OPERATION_METHODS: Record<string, string> = {\n resolveHealth: 'resolve.health',\n createResolveJob: 'resolve.submit',\n getResolveJob: 'resolve.get',\n acceptResolveJob: 'resolve.accept',\n getResolveAttestation: 'resolve.attestation',\n getResolveKeys: 'resolve.keys',\n getResolveBalance: 'resolve.balance',\n};\n","/**\n * codai-sdk — official TypeScript client for the codai AI gateway.\n *\n * Full parity with the public gateway OpenAPI (every `operationId` has one\n * method — see `OPERATION_METHODS`). Resources hang off the `Codai` client:\n *\n * client.chat.completions.create / .stream client.messages / client.responses\n * client.embeddings / client.audio / client.tokens / client.models / client.health\n * client.systemOne.create (typed decisions, codai-s1)\n * client.agents.run + client.agents.runs.* client.tools.search / .fetch\n * client.tasks.* client.sessions.* (events, controls, lease, shares, stream)\n * client.devices.* / client.hosts.* client.orgs.* / client.account / client.receipt\n * client.projects.* client.environments.* (members, ports, secrets)\n * client.feedback / client.phoneModels\n * client.resolve.* (verified bug fixes on https://resolve.codai.ro — resolve.yaml)\n *\n * Top-level `chat()`, `chatStream()`, `embeddings()`, `models()`, `feedback()`,\n * `mintToken()` from 0.2.x are kept as thin aliases.\n *\n * Zero runtime dependencies; Node 18+ (global fetch) and modern edge runtimes.\n */\n\nimport { type CodaiRequestExtensions, HttpClient } from './http';\nimport { Account, Feedback, PhoneModels, Receipts } from './resources/account';\nimport { Agents } from './resources/agents';\nimport { Audio } from './resources/audio';\nimport {\n Chat,\n type ChatCompletionInput,\n type ChatCompletionRequest,\n type ChatMessage,\n type ChatResult,\n type ChatStream,\n} from './resources/chat';\nimport { Devices } from './resources/devices';\nimport { Embeddings } from './resources/embeddings';\nimport { Environments } from './resources/environments';\nimport { Health } from './resources/health';\nimport { Hosts } from './resources/hosts';\nimport { Messages } from './resources/messages';\nimport { Models } from './resources/models';\nimport { Orgs } from './resources/orgs';\nimport { Projects } from './resources/projects';\nimport { Resolve } from './resources/resolve';\nimport { Responses } from './resources/responses';\nimport { Sessions } from './resources/sessions';\nimport { SystemOne } from './resources/system-one';\nimport { Tasks } from './resources/tasks';\nimport { Notifications, Triggers } from './resources/triggers';\nimport { type EphemeralScope, type EphemeralToken, Tokens } from './resources/tokens';\nimport { Tools } from './resources/tools';\n\nexport interface CodaiClientOptions {\n apiKey: string;\n /** Defaults to https://ai.codai.ro */\n baseUrl?: string;\n /** codai Resolve service host (`client.resolve`). Defaults to https://resolve.codai.ro */\n resolveBaseUrl?: string;\n /** Stable conversation/session id — sent as `x-codai-session-id` on every request. */\n sessionId?: string;\n /** Device UUID for shared-sessions / hosts — sent as `x-codai-device` on every request. */\n device?: string;\n /** Device name / platform recorded on first registration. */\n deviceName?: string;\n devicePlatform?: CodaiRequestExtensions['devicePlatform'];\n /** Client surface tag (`x-codai-client`). */\n client?: string;\n /** Any other default `X-Codai-*` extensions (per-call bags override). */\n defaults?: CodaiRequestExtensions;\n /** Default request timeout (ms). Default 120_000. Streams are not time-capped. */\n timeoutMs?: number;\n /** Retries on 429/5xx with exponential backoff. Default 2. */\n maxRetries?: number;\n /** Injectable fetch (tests / custom agents). */\n fetch?: typeof fetch;\n}\n\n/** 0.2.x-compatible chat options (thin alias over `chat.completions`). */\nexport interface ChatOptions {\n model?: string;\n messages: ChatMessage[];\n temperature?: number;\n maxTokens?: number;\n tools?: ChatCompletionRequest['tools'];\n /** codai extension: plan-and-execute agent mode (Pro+). */\n agentMode?: boolean;\n /** codai extension: server-side context compaction ('auto'). */\n compact?: 'auto';\n /** codai extension: best-of-N override (0 disables, 3 forces). */\n bestOf?: 0 | 3;\n /** Attribution id recorded on tool calls (agent fleets). */\n agentId?: string;\n /** Per-call session override. */\n sessionId?: string;\n /** Any other `X-Codai-*` extension. */\n ext?: CodaiRequestExtensions;\n signal?: AbortSignal;\n}\n\nexport interface EmbeddingsOptions {\n input: string | string[];\n model?: string;\n dimensions?: number;\n signal?: AbortSignal;\n}\n\nexport class Codai {\n readonly http: HttpClient;\n\n /** Resource group (`chat.completions.create/stream`) that is also callable with the 0.2.x `chat({ messages })` shape. */\n readonly chat: Chat & ((opts: ChatOptions) => Promise<ChatResult>);\n readonly messages: Messages;\n readonly responses: Responses;\n readonly embeddings: Embeddings &\n ((opts: EmbeddingsOptions) => Promise<{ embeddings: number[][]; raw: unknown }>);\n readonly audio: Audio;\n /** Typed decisions from codai-s1 (`systemOne.create({ state, questions })`). */\n readonly systemOne: SystemOne;\n readonly tokens: Tokens;\n readonly models: Models & (() => Promise<Array<{ id: string }>>);\n readonly health: Health;\n readonly agents: Agents;\n readonly tools: Tools;\n readonly tasks: Tasks;\n /** Event triggers — webhooks that notify you or start agent sessions. */\n readonly triggers: Triggers;\n /** Inbox of trigger / cloud-task notifications. */\n readonly notifications: Notifications;\n readonly sessions: Sessions;\n readonly devices: Devices;\n readonly hosts: Hosts;\n readonly orgs: Orgs;\n readonly projects: Projects;\n readonly environments: Environments;\n readonly account: Account;\n readonly receipt: Receipts;\n readonly feedback: Feedback &\n ((requestId: string, rating: 1 | -1, comment?: string) => Promise<void>);\n readonly phoneModels: PhoneModels;\n /** codai Resolve — execution-verified bug fixes (separate host, `resolveBaseUrl`). */\n readonly resolve: Resolve;\n\n constructor(opts: CodaiClientOptions) {\n if (!opts.apiKey) throw new Error('Codai: apiKey is required');\n this.http = new HttpClient({\n apiKey: opts.apiKey,\n baseUrl: opts.baseUrl ?? 'https://ai.codai.ro',\n timeoutMs: opts.timeoutMs ?? 120_000,\n maxRetries: opts.maxRetries ?? 2,\n fetch: opts.fetch,\n defaults: {\n ...opts.defaults,\n ...(opts.sessionId ? { sessionId: opts.sessionId } : {}),\n ...(opts.device ? { device: opts.device } : {}),\n ...(opts.deviceName ? { deviceName: opts.deviceName } : {}),\n ...(opts.devicePlatform ? { devicePlatform: opts.devicePlatform } : {}),\n ...(opts.client ? { client: opts.client } : {}),\n },\n });\n const http = this.http;\n\n this.messages = new Messages(http);\n this.responses = new Responses(http);\n this.audio = new Audio(http);\n this.systemOne = new SystemOne(http);\n this.tokens = new Tokens(http);\n this.health = new Health(http);\n this.agents = new Agents(http);\n this.tools = new Tools(http);\n this.tasks = new Tasks(http);\n this.triggers = new Triggers(http);\n this.notifications = new Notifications(http);\n this.sessions = new Sessions(http);\n this.devices = new Devices(http);\n this.hosts = new Hosts(http);\n this.orgs = new Orgs(http);\n this.projects = new Projects(http);\n this.environments = new Environments(http);\n this.account = new Account(http);\n this.receipt = new Receipts(http);\n this.phoneModels = new PhoneModels(http);\n this.resolve = new Resolve(\n new HttpClient({\n apiKey: opts.apiKey,\n baseUrl: opts.resolveBaseUrl ?? 'https://resolve.codai.ro',\n timeoutMs: opts.timeoutMs ?? 120_000,\n maxRetries: opts.maxRetries ?? 2,\n fetch: opts.fetch,\n defaults: opts.client ? { client: opts.client } : {},\n }),\n );\n\n // Callable resources keep the 0.2.x top-level signatures working\n // (`client.embeddings({...})`, `client.models()`, `client.feedback(id, 1)`)\n // while also exposing `.create()` / `.list()` / `.submit()`.\n this.chat = callable(new Chat(http), (o: ChatOptions) =>\n this.chat.completions.create(this.legacyBody(o), {\n ext: this.legacyExt(o),\n signal: o.signal,\n }),\n );\n this.embeddings = callable(new Embeddings(http), async (o: EmbeddingsOptions) => {\n const r = await this.embeddings.create(\n { input: o.input, model: o.model, dimensions: o.dimensions },\n { signal: o.signal },\n );\n return { embeddings: r.embeddings, raw: r.raw };\n });\n this.models = callable(new Models(http), async () =>\n (await this.models.list()).map((m) => ({ id: m.id })),\n );\n this.feedback = callable(\n new Feedback(http),\n async (requestId: string, rating: 1 | -1, comment?: string) => {\n await this.feedback.submit({\n event_id: requestId,\n rating,\n ...(comment ? { comment } : {}),\n });\n },\n );\n }\n\n // ------------------------------------------------- 0.2.x compatibility aliases\n\n /** Alias of `chat.completions.stream()` with the 0.2.x option names. */\n chatStream(opts: ChatOptions): ChatStream {\n return this.chat.completions.stream(this.legacyBody(opts), {\n ext: this.legacyExt(opts),\n signal: opts.signal,\n });\n }\n\n /** Alias of `tokens.create()`. */\n mintToken(scope: EphemeralScope, ttlSeconds?: number): Promise<EphemeralToken> {\n return this.tokens.create(scope, ttlSeconds);\n }\n\n private legacyBody(opts: ChatOptions): ChatCompletionInput {\n return {\n model: opts.model ?? 'codai',\n messages: opts.messages,\n ...(opts.temperature !== undefined ? { temperature: opts.temperature } : {}),\n ...(opts.maxTokens !== undefined ? { max_tokens: opts.maxTokens } : {}),\n ...(opts.tools ? { tools: opts.tools } : {}),\n };\n }\n\n private legacyExt(opts: ChatOptions): CodaiRequestExtensions {\n return {\n ...opts.ext,\n ...(opts.sessionId ? { sessionId: opts.sessionId } : {}),\n ...(opts.agentMode ? { mode: 'agent' as const } : {}),\n ...(opts.compact ? { compact: opts.compact } : {}),\n ...(opts.bestOf !== undefined ? { bestOf: opts.bestOf } : {}),\n ...(opts.agentId ? { agentId: opts.agentId } : {}),\n };\n }\n}\n\n/**\n * Make an object callable: returns a function that forwards calls to `fn`\n * and carries every own/prototype member of `target` (methods bound).\n */\nfunction callable<T extends object, F extends (...args: never[]) => unknown>(\n target: T,\n fn: F,\n): T & F {\n const f = ((...args: Parameters<F>) => fn(...args)) as T & F;\n for (const key of allKeys(target)) {\n const value = (target as Record<string, unknown>)[key];\n Object.defineProperty(f, key, {\n value:\n typeof value === 'function' ? (value as (...a: unknown[]) => unknown).bind(target) : value,\n enumerable: true,\n writable: false,\n });\n }\n return f;\n}\n\nfunction allKeys(obj: object): string[] {\n const keys = new Set<string>();\n let cur: object | null = obj;\n while (cur && cur !== Object.prototype) {\n for (const k of Object.getOwnPropertyNames(cur)) if (k !== 'constructor') keys.add(k);\n cur = Object.getPrototypeOf(cur);\n }\n return [...keys];\n}\n\nexport default Codai;\n\n// ------------------------------------------------------------------ exports\nexport { CodaiError, HttpClient, extensionHeaders, readSse, frameJson } from './http';\nexport type { CodaiRequestExtensions, ErrorCode, SseFrame, RequestOptions } from './http';\nexport { OPERATION_METHODS, STREAMING_OPERATIONS, RESOLVE_OPERATION_METHODS } from './operations';\nexport type { paths, components, operations } from './generated/gateway';\nexport type {\n paths as ResolvePaths,\n components as ResolveComponents,\n operations as ResolveOperations,\n} from './generated/resolve';\n\nexport * from './resources/chat';\nexport * from './resources/messages';\nexport * from './resources/responses';\nexport * from './resources/embeddings';\nexport * from './resources/audio';\nexport * from './resources/tokens';\nexport * from './resources/models';\nexport * from './resources/health';\nexport * from './resources/agents';\nexport * from './resources/tools';\nexport * from './resources/tasks';\nexport * from './resources/triggers';\nexport * from './resources/sessions';\nexport * from './resources/devices';\nexport * from './resources/hosts';\nexport * from './resources/orgs';\nexport * from './resources/projects';\nexport * from './resources/environments';\nexport * from './resources/account';\nexport * from './resources/resolve';\n"]}
1
+ {"version":3,"file":"index.js","names":["base64ToBytes","decodeBase64","abortableSleep","abortableSleep","enc","one","one"],"sources":["../src/http.ts","../src/resources/account.ts","../src/resources/agents.ts","../src/resources/audio.ts","../src/resources/cards.ts","../src/resources/chat.ts","../src/resources/devices.ts","../src/resources/embeddings.ts","../src/resources/environments.ts","../src/resources/health.ts","../src/resources/hosts.ts","../src/resources/assets.ts","../src/resources/images.ts","../src/resources/media.ts","../src/resources/documents.ts","../src/resources/messages.ts","../src/resources/models.ts","../src/resources/orgs.ts","../src/resources/projects.ts","../src/resources/realtime.ts","../src/resources/resolve.ts","../src/resources/responses.ts","../src/resources/sessions.ts","../src/resources/settings.ts","../src/resources/sfx.ts","../src/resources/system-one.ts","../src/resources/tasks.ts","../src/resources/triggers.ts","../src/resources/prompts.ts","../src/resources/schedules.ts","../src/resources/transcripts.ts","../src/resources/tokens.ts","../src/resources/tools.ts","../src/resources/usage-keys.ts","../src/resources/verify.ts","../src/operations.ts","../src/resources/apps.ts","../src/index.ts"],"sourcesContent":["/**\n * Shared HTTP layer for every resource: base URL, bearer auth, `X-Codai-*`\n * extension headers, retries, timeouts, JSON + SSE helpers and the\n * `CodaiError` mapping of the gateway error envelope.\n */\n\nimport type { components } from './generated/gateway';\n\nexport type ErrorEnvelope = components['schemas']['Error'];\nexport type ErrorCode = ErrorEnvelope['error']['code'];\n\nexport class CodaiError extends Error {\n /** Stable gateway error code (`invalid_api_key`, `rate_limit_exceeded`, …) when the body was an error envelope. */\n readonly code: ErrorCode | null;\n /** `x-codai-trace-id` (or `x-request-id`) of the failed response, when present. */\n readonly requestId: string | null;\n /** Seconds to wait before retrying, from `Retry-After` on 429s. */\n readonly retryAfter: number | null;\n\n constructor(\n message: string,\n public readonly status: number,\n public readonly body: unknown,\n meta: { code?: ErrorCode | null; requestId?: string | null; retryAfter?: number | null } = {},\n ) {\n super(message);\n this.name = 'CodaiError';\n this.code = meta.code ?? extractCode(body);\n this.requestId = meta.requestId ?? null;\n this.retryAfter = meta.retryAfter ?? null;\n }\n}\n\nfunction extractCode(body: unknown): ErrorCode | null {\n if (body && typeof body === 'object') {\n const err = (body as { error?: { code?: unknown } }).error;\n if (err && typeof err === 'object' && typeof err.code === 'string')\n return err.code as ErrorCode;\n }\n return null;\n}\n\nfunction extractMessage(body: unknown): string | null {\n if (body && typeof body === 'object') {\n const err = (body as { error?: { message?: unknown } }).error;\n if (err && typeof err === 'object' && typeof err.message === 'string') return err.message;\n }\n return null;\n}\n\nconst RETRYABLE = new Set([429, 500, 502, 503, 504]);\n\n/**\n * Per-request `X-Codai-*` extension headers. Every field maps 1:1 to the\n * request header of the same name (`effort` → `x-codai-effort`). Values are\n * sent verbatim; booleans become `1` / `0`.\n */\nexport interface CodaiRequestExtensions {\n /** `x-codai-session-id` — groups requests of one conversation. */\n sessionId?: string;\n /** `x-request-id` — echoed as `x-codai-trace-id`. */\n requestId?: string;\n /** `x-codai-effort` */\n effort?: 'minimal' | 'low' | 'medium' | 'high' | 'max';\n /** `x-codai-thinking` */\n thinking?: boolean;\n /** `x-codai-thinking-budget` */\n thinkingBudget?: number;\n /** `x-codai-thinking-pin` */\n thinkingPin?: boolean;\n /** `x-codai-cache` (`false` disables caching on direct model ids). */\n cache?: boolean;\n /** `x-codai-no-task` */\n noTask?: boolean;\n /** `x-codai-task-id` */\n taskId?: string;\n /** `x-codai-task-outcome` */\n taskOutcome?: 'pass' | 'fail';\n /** `x-codai-task-evidence` */\n taskEvidence?: 'exec_verdict' | 'reexec';\n /** `x-codai-client` */\n client?: string;\n /** `x-codai-incognito` */\n incognito?: boolean;\n /** `x-codai-no-recall` */\n noRecall?: boolean;\n /** `x-codai-proven-only` */\n provenOnly?: boolean;\n /** `x-codai-new-session` */\n newSession?: boolean;\n /** `x-codai-repo` */\n repo?: string;\n /** `x-codai-agent-id` */\n agentId?: string;\n /** `x-codai-disable-subagents` */\n disableSubagents?: boolean;\n /** `x-codai-mode: agent` */\n mode?: 'agent';\n /** `x-codai-server-tools` */\n serverTools?: boolean;\n /** `x-codai-orchestrate` */\n orchestrate?: boolean;\n /** `x-codai-cascade` */\n cascade?: 'verify';\n /** `x-codai-best-of` (number or `off`). */\n bestOf?: number | 'off';\n /** `x-codai-best-of-depth` */\n bestOfDepth?: number;\n /** `x-codai-reflect` */\n reflect?: boolean;\n /** `x-codai-step-verify` */\n stepVerify?: boolean;\n /** `x-codai-plan` */\n plan?: boolean;\n /** `x-codai-consensus` */\n consensus?: boolean;\n /** `x-codai-compact` (`'auto'` and `true` both send `1`). */\n compact?: boolean | 'auto';\n /** `x-codai-retrieval` */\n retrieval?: boolean;\n /** `x-codai-heuristics` */\n heuristics?: boolean;\n /** `x-codai-identity` */\n identity?: 'on' | 'off' | 'shadow';\n /** `x-codai-playbook` */\n playbook?: string;\n /** `x-codai-no-playbook` */\n noPlaybook?: boolean;\n /** `x-codai-debug` */\n debug?: boolean;\n /** `x-codai-device` — shared-sessions / hosts device UUID. */\n device?: string;\n /** `x-codai-device-name` */\n deviceName?: string;\n /** `x-codai-device-platform` */\n devicePlatform?: 'android' | 'ios' | 'web' | 'desktop' | 'cli' | 'agent' | 'wear' | 'vscode';\n /** `x-codai-push-token` */\n pushToken?: string;\n /** `x-codai-share-token` */\n shareToken?: string;\n /** Escape hatch: any additional raw headers. */\n headers?: Record<string, string>;\n}\n\nconst EXTENSION_HEADERS: Record<Exclude<keyof CodaiRequestExtensions, 'headers'>, string> = {\n sessionId: 'x-codai-session-id',\n requestId: 'x-request-id',\n effort: 'x-codai-effort',\n thinking: 'x-codai-thinking',\n thinkingBudget: 'x-codai-thinking-budget',\n thinkingPin: 'x-codai-thinking-pin',\n cache: 'x-codai-cache',\n noTask: 'x-codai-no-task',\n taskId: 'x-codai-task-id',\n taskOutcome: 'x-codai-task-outcome',\n taskEvidence: 'x-codai-task-evidence',\n client: 'x-codai-client',\n incognito: 'x-codai-incognito',\n noRecall: 'x-codai-no-recall',\n provenOnly: 'x-codai-proven-only',\n newSession: 'x-codai-new-session',\n repo: 'x-codai-repo',\n agentId: 'x-codai-agent-id',\n disableSubagents: 'x-codai-disable-subagents',\n mode: 'x-codai-mode',\n serverTools: 'x-codai-server-tools',\n orchestrate: 'x-codai-orchestrate',\n cascade: 'x-codai-cascade',\n bestOf: 'x-codai-best-of',\n bestOfDepth: 'x-codai-best-of-depth',\n reflect: 'x-codai-reflect',\n stepVerify: 'x-codai-step-verify',\n plan: 'x-codai-plan',\n consensus: 'x-codai-consensus',\n compact: 'x-codai-compact',\n retrieval: 'x-codai-retrieval',\n heuristics: 'x-codai-heuristics',\n identity: 'x-codai-identity',\n playbook: 'x-codai-playbook',\n noPlaybook: 'x-codai-no-playbook',\n debug: 'x-codai-debug',\n device: 'x-codai-device',\n deviceName: 'x-codai-device-name',\n devicePlatform: 'x-codai-device-platform',\n pushToken: 'x-codai-push-token',\n shareToken: 'x-codai-share-token',\n};\n\n/** Translate an extensions bag into raw `X-Codai-*` headers. Exported for tests. */\nexport function extensionHeaders(ext: CodaiRequestExtensions | undefined): Record<string, string> {\n const out: Record<string, string> = {};\n if (!ext) return out;\n for (const [key, header] of Object.entries(EXTENSION_HEADERS) as Array<\n [Exclude<keyof CodaiRequestExtensions, 'headers'>, string]\n >) {\n const value = ext[key];\n if (value === undefined || value === null) continue;\n if (typeof value === 'boolean') out[header] = value ? '1' : '0';\n else if (key === 'compact' && value === 'auto') out[header] = '1';\n else out[header] = String(value);\n }\n if (ext.headers) Object.assign(out, ext.headers);\n return out;\n}\n\nexport interface HttpClientOptions {\n apiKey: string;\n baseUrl: string;\n timeoutMs: number;\n maxRetries: number;\n /** Extensions applied to every request (per-call bags override per key). */\n defaults?: CodaiRequestExtensions;\n /** Injectable fetch (defaults to the global one). */\n fetch?: typeof fetch;\n}\n\nexport type Query = Record<string, string | number | boolean | undefined | null>;\n\nexport interface RequestOptions {\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS';\n /** Extra raw headers for this call (e.g. tus `Upload-Offset`); applied last. */\n headers?: Record<string, string>;\n /** JSON body (serialised) — pass `undefined` for no body. */\n body?: unknown;\n /** A pre-built body (FormData / Blob) sent as-is; disables retries. */\n rawBody?: BodyInit;\n query?: Query;\n ext?: CodaiRequestExtensions;\n signal?: AbortSignal;\n /** Override the client timeout for this call (ms). `0` disables it (streams). */\n timeoutMs?: number;\n /** Never retry this call (multipart uploads, streams). */\n noRetry?: boolean;\n /** Statuses treated as success besides 2xx (e.g. 503 on `/health/ready`). */\n acceptStatus?: number[];\n}\n\nexport class HttpClient {\n readonly apiKey: string;\n readonly baseUrl: string;\n readonly timeoutMs: number;\n readonly maxRetries: number;\n readonly defaults: CodaiRequestExtensions;\n private readonly fetchImpl: typeof fetch;\n\n constructor(opts: HttpClientOptions) {\n this.apiKey = opts.apiKey;\n this.baseUrl = opts.baseUrl.replace(/\\/$/, '');\n this.timeoutMs = opts.timeoutMs;\n this.maxRetries = opts.maxRetries;\n this.defaults = opts.defaults ?? {};\n this.fetchImpl = opts.fetch ?? ((input, init) => fetch(input, init));\n }\n\n url(path: string, query?: Query): string {\n const url = new URL(`${this.baseUrl}${path}`);\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue;\n url.searchParams.set(k, typeof v === 'boolean' ? (v ? '1' : '0') : String(v));\n }\n }\n return url.toString();\n }\n\n headers(ext?: CodaiRequestExtensions, json = true): Record<string, string> {\n return {\n Authorization: `Bearer ${this.apiKey}`,\n ...(json ? { 'Content-Type': 'application/json' } : {}),\n ...extensionHeaders(this.defaults),\n ...extensionHeaders(ext),\n };\n }\n\n /** Perform a request; throws `CodaiError` on non-2xx (after retries on 429/5xx). */\n async request(path: string, init: RequestOptions = {}): Promise<Response> {\n const url = this.url(path, init.query);\n const hasJson = init.body !== undefined;\n const headers = { ...this.headers(init.ext, hasJson), ...init.headers };\n const method = init.method ?? (hasJson || init.rawBody !== undefined ? 'POST' : 'GET');\n const retries = init.noRetry || init.rawBody !== undefined ? 0 : this.maxRetries;\n const timeout = init.timeoutMs ?? this.timeoutMs;\n const accept = new Set(init.acceptStatus ?? []);\n let lastErr: unknown;\n for (let attempt = 0; attempt <= retries; attempt++) {\n const signal = init.signal ?? (timeout > 0 ? AbortSignal.timeout(timeout) : undefined);\n try {\n const res = await this.fetchImpl(url, {\n method,\n headers,\n ...(hasJson ? { body: JSON.stringify(init.body) } : {}),\n ...(init.rawBody !== undefined ? { body: init.rawBody } : {}),\n ...(signal ? { signal } : {}),\n });\n if (res.ok || accept.has(res.status)) return res;\n if (RETRYABLE.has(res.status) && attempt < retries) {\n await sleep(500 * 2 ** attempt + Math.random() * 250);\n continue;\n }\n throw await this.toError(path, res);\n } catch (err) {\n if (err instanceof CodaiError) throw err;\n lastErr = err;\n // Caller aborts are never retried.\n if (init.signal?.aborted) throw err;\n if (attempt < retries) {\n await sleep(500 * 2 ** attempt);\n continue;\n }\n }\n }\n throw new CodaiError(`codai ${path} failed after retries: ${String(lastErr)}`, 0, null);\n }\n\n async json<T>(path: string, init: RequestOptions = {}): Promise<T> {\n const res = await this.request(path, init);\n return (await res.json()) as T;\n }\n\n /**\n * Open a `text/event-stream` and iterate parsed frames. Frames are\n * `\\n\\n`-separated blocks; each yields `{ event, data }` where `event`\n * defaults to `message` and `data` is the joined `data:` payload (raw\n * string — the caller decides whether it is JSON or `[DONE]`). Comment\n * lines (`: ping`) are skipped. The stream is retried like any request\n * up to the first byte; after that errors propagate.\n */\n async *sse(\n path: string,\n init: RequestOptions = {},\n ): AsyncGenerator<SseFrame, Response, undefined> {\n const res = await this.request(path, {\n ...init,\n timeoutMs: init.timeoutMs ?? 0,\n noRetry: true,\n });\n yield* readSse(res, init.signal);\n return res;\n }\n\n private async toError(path: string, res: Response): Promise<CodaiError> {\n let body: unknown = null;\n try {\n body = await res.json();\n } catch {\n /* non-JSON error body */\n }\n const retryAfterRaw = res.headers.get('retry-after');\n const retryAfter = retryAfterRaw && /^\\d+$/.test(retryAfterRaw) ? Number(retryAfterRaw) : null;\n const message = extractMessage(body);\n return new CodaiError(\n message ? `codai ${path} → ${res.status}: ${message}` : `codai ${path} → ${res.status}`,\n res.status,\n body,\n {\n requestId: res.headers.get('x-codai-trace-id') ?? res.headers.get('x-request-id'),\n retryAfter,\n },\n );\n }\n}\n\nexport interface SseFrame {\n /** `event:` name; `message` when the frame has none (OpenAI-style streams). */\n event: string;\n /** Joined `data:` lines (a multi-line data block is joined with `\\n`). */\n data: string;\n}\n\n/** Parse an SSE body into frames. Exported for the resources and for tests. */\nexport async function* readSse(res: Response, signal?: AbortSignal): AsyncGenerator<SseFrame> {\n const reader = res.body?.getReader();\n if (!reader) throw new CodaiError('no response body', res.status, null);\n const decoder = new TextDecoder();\n let buffer = '';\n const onAbort = () => void reader.cancel().catch(() => {});\n signal?.addEventListener('abort', onAbort, { once: true });\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n // Normalise CRLF so both `\\n\\n` and `\\r\\n\\r\\n` delimit frames.\n buffer = buffer.replace(/\\r\\n/g, '\\n');\n const blocks = buffer.split('\\n\\n');\n buffer = blocks.pop() ?? '';\n for (const block of blocks) {\n const frame = parseSseBlock(block);\n if (frame) yield frame;\n }\n }\n const tail = buffer.trim() ? parseSseBlock(buffer) : null;\n if (tail) yield tail;\n } finally {\n signal?.removeEventListener('abort', onAbort);\n reader.releaseLock?.();\n }\n}\n\nfunction parseSseBlock(block: string): SseFrame | null {\n let event = 'message';\n const data: string[] = [];\n for (const line of block.split('\\n')) {\n if (!line || line.startsWith(':')) continue;\n if (line.startsWith('event:')) event = line.slice(6).trim();\n else if (line.startsWith('data:')) data.push(line.slice(5).replace(/^ /, ''));\n // `id:` / `retry:` are never emitted by the gateway; ignore anything else.\n }\n if (data.length === 0) return null;\n return { event, data: data.join('\\n') };\n}\n\n/** Parse a frame's data as JSON, returning `null` for `[DONE]` / non-JSON. */\nexport function frameJson<T = unknown>(frame: SseFrame): T | null {\n if (frame.data === '[DONE]') return null;\n try {\n return JSON.parse(frame.data) as T;\n } catch {\n return null;\n }\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n","/** `/v1/account`, `/v1/receipt`, `/v1/feedback`, `/v1/phone/models`. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply, type Schema } from './_shared';\n\nexport type AccountView = Reply<'getAccount'>;\nexport type AccountPatchRequest = Mutable<Body<'patchAccount'>>;\nexport type AccountPatchResponse = Reply<'patchAccount'>;\nexport type Receipt = Reply<'getReceipt'>;\nexport type FeedbackRequest = Mutable<Body<'submitFeedback'>>;\nexport type FeedbackResponse = Reply<'submitFeedback'>;\nexport type PhoneModel = Schema<'AccountPhoneModel'>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nexport class Account {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/account` — the full account card. */\n get(opts: CallOpts = {}): Promise<AccountView> {\n return this.http.json<AccountView>('/v1/account', { ext: opts.ext, signal: opts.signal });\n }\n\n /** `PATCH /v1/account` — consents, username, referral (at least one field). */\n update(body: AccountPatchRequest, opts: CallOpts = {}): Promise<AccountPatchResponse> {\n return this.http.json<AccountPatchResponse>('/v1/account', {\n method: 'PATCH',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n\nexport class Receipts {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * `GET /v1/receipt` — spend receipt. `sessionId` wins over `since`; with\n * neither, the last 24 hours.\n */\n get(\n query: { sessionId?: string; since?: string | Date } = {},\n opts: CallOpts = {},\n ): Promise<Receipt> {\n return this.http.json<Receipt>('/v1/receipt', {\n query: {\n session_id: query.sessionId,\n since: query.since instanceof Date ? query.since.toISOString() : query.since,\n },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n\nexport class Feedback {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * `POST /v1/feedback` — rate one turn. Exactly one of `event_id`,\n * `session_id`, `client_request_id` must be present.\n */\n submit(body: FeedbackRequest, opts: CallOpts = {}): Promise<FeedbackResponse> {\n return this.http.json<FeedbackResponse>('/v1/feedback', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n\nexport class PhoneModels {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/phone/models` — on-device model catalog with signed URLs. */\n async list(opts: CallOpts = {}): Promise<PhoneModel[]> {\n const raw = await this.http.json<Reply<'listPhoneModels'>>('/v1/phone/models', {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.models ?? [])];\n }\n}\n","/** `/v1/agents/*` — synchronous runs and the persisted async run lifecycle. */\nimport { type CodaiRequestExtensions, frameJson, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply, type Schema } from './_shared';\n\nexport type AgentRunRequest = Mutable<Body<'runAgentSync'>>;\nexport type AgentRunCreateRequest = Mutable<Body<'createAgentRun'>>;\nexport type AgentSyncResult = Reply<'runAgentSync'>;\nexport type AgentRunAccepted = Reply<'createAgentRun', 202>;\nexport type AgentRun = Reply<'getAgentRun'>;\nexport type AgentRunStep = Schema<'AgentRunStep'>;\nexport type AgentRunStats = Reply<'getAgentRunStats'>;\nexport type AgentRunStatus = Schema<'AgentRunStatus'>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nexport interface AgentRunResult {\n result: string;\n model: string;\n /** Usage-event id — exact target for `feedback.submit`. */\n eventId: string | null;\n usage: AgentSyncResult['usage'] | null;\n raw: AgentSyncResult;\n headers: Headers;\n}\n\n/** SSE frames of `GET /v1/agents/runs/{id}/stream`. */\nexport type AgentRunStreamEvent =\n | {\n event: 'step';\n data: {\n seq: number;\n kind: 'plan' | 'tool_call' | 'observation' | 'answer';\n summary: string | null;\n };\n }\n | {\n event: 'done';\n data: {\n status: 'completed' | 'failed' | 'cancelled';\n result: string | null;\n error: string | null;\n step_count: number;\n };\n }\n | { event: 'timeout'; data: Record<string, never> };\n\nexport class AgentRuns {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /v1/agents/runs` — returns 202 with the run id. */\n create(body: AgentRunCreateRequest, opts: CallOpts = {}): Promise<AgentRunAccepted> {\n return this.http.json<AgentRunAccepted>('/v1/agents/runs', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/agents/runs/{id}` */\n get(id: string, opts: CallOpts = {}): Promise<AgentRun> {\n return this.http.json<AgentRun>(`/v1/agents/runs/${encodeURIComponent(id)}`, {\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/agents/runs/{id}/steps` — newest first. */\n async steps(id: string, opts: CallOpts = {}): Promise<AgentRunStep[]> {\n const raw = await this.http.json<Reply<'listAgentRunSteps'>>(\n `/v1/agents/runs/${encodeURIComponent(id)}/steps`,\n { ext: opts.ext, signal: opts.signal },\n );\n return [...(raw.steps ?? [])];\n }\n\n /** `GET /v1/agents/runs/stats?days=` */\n stats(days?: number, opts: CallOpts = {}): Promise<AgentRunStats> {\n return this.http.json<AgentRunStats>('/v1/agents/runs/stats', {\n query: { days },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/agents/runs/{id}/cancel` */\n cancel(id: string, opts: CallOpts = {}): Promise<Reply<'cancelAgentRun'>> {\n return this.http.json<Reply<'cancelAgentRun'>>(\n `/v1/agents/runs/${encodeURIComponent(id)}/cancel`,\n { method: 'POST', body: {}, ext: opts.ext, signal: opts.signal },\n );\n }\n\n /**\n * `GET /v1/agents/runs/{id}/stream` — async iterator over `step` / `done` /\n * `timeout` events. The iterator ends after `done`; on `timeout` (30 min)\n * it also ends and you may reconnect (full replay from seq 0).\n */\n async *stream(\n id: string,\n opts: CallOpts = {},\n ): AsyncGenerator<AgentRunStreamEvent, void, undefined> {\n const frames = this.http.sse(`/v1/agents/runs/${encodeURIComponent(id)}/stream`, {\n ext: opts.ext,\n signal: opts.signal,\n });\n for await (const frame of frames) {\n const data = frameJson<Record<string, unknown>>(frame);\n if (!data) continue;\n const ev = { event: frame.event, data } as AgentRunStreamEvent;\n yield ev;\n if (ev.event === 'done' || ev.event === 'timeout') return;\n }\n }\n}\n\nexport class Agents {\n readonly runs: AgentRuns;\n constructor(private readonly http: HttpClient) {\n this.runs = new AgentRuns(http);\n }\n\n /** `POST /v1/agents/run` — blocks until the agent loop finishes. */\n async run(body: AgentRunRequest, opts: CallOpts = {}): Promise<AgentRunResult> {\n const res = await this.http.request('/v1/agents/run', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n const raw = (await res.json()) as AgentSyncResult;\n return {\n result: String(raw.result ?? ''),\n model: String(raw.model ?? ''),\n eventId: raw.event_id ?? res.headers.get('x-codai-event-id'),\n usage: raw.usage ?? null,\n raw,\n headers: res.headers,\n };\n }\n}\n","/** `POST /v1/audio/transcriptions`, `POST /v1/audio/speech` and `POST /v1/audio/speech/stream`. */\nimport { type CodaiRequestExtensions, type HttpClient, frameJson } from '../http';\nimport { type Body, type Mutable, type Reply, type Schema } from './_shared';\n\nexport type TranscriptionResponse = Reply<'createTranscription'>;\nexport type SpeechRequest = Mutable<Body<'createSpeech'>>;\nexport type SpeechStreamRequest = Mutable<Body<'createSpeechStream'>>;\n/** One word timing of a `speechJson()` result (seconds from the start of the audio). */\nexport type SpeechWord = Schema<'SpeechWord'>;\n/** JSON shape of `POST /v1/audio/speech` when `timestamps` or `store` is true. */\nexport type SpeechJson = Schema<'SpeechJson'>;\n\n/** One event of `audio.speechStream()` (Azure neural TTS with lip-sync timing). */\nexport type SpeechStreamEvent =\n | {\n type: 'start';\n model: string;\n voice: string;\n format: 'pcm' | 'mp3';\n content_type: string;\n sample_rate: number;\n }\n /** `delta` is base64; `audio` is the decoded bytes (PCM16 LE mono 24 kHz for `pcm`). */\n | { type: 'audio'; delta: string; audio: Uint8Array }\n /** Azure viseme id (0-21) at `offsetMs` on the audio timeline. */\n | { type: 'viseme'; id: number; offsetMs: number }\n | { type: 'word'; text: string; offsetMs: number; durationMs: number }\n | {\n type: 'done';\n audio_ms: number | null;\n audioBytes: number;\n visemes: number;\n words: number;\n }\n | { type: 'error'; error: { code: string; message: string } };\n/** Raw generated event schema (all fields optional). */\nexport type SpeechStreamEventSchema = Schema<'SpeechStreamEvent'>;\n\nfunction base64ToBytes(b64: string): Uint8Array {\n const bin = atob(b64);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n}\n\nexport interface TranscriptionOptions {\n /** Audio file contents (max 25 MB). */\n file: Blob | Uint8Array | ArrayBuffer;\n /** Filename hint (extension drives format detection). Default `audio.webm`. */\n filename?: string;\n /** Default `codai-transcribe`. */\n model?: string;\n /** ISO-639-1 language hint. */\n language?: string;\n /** Text to guide style or spelling. */\n prompt?: string;\n /** `json` (default) or `verbose_json`. */\n responseFormat?: 'json' | 'verbose_json';\n /** Sampling temperature 0–1. */\n temperature?: number;\n ext?: CodaiRequestExtensions;\n signal?: AbortSignal;\n}\n\nexport interface TranscriptionResult {\n text: string;\n raw: TranscriptionResponse;\n routedTo: string | null;\n headers: Headers;\n}\n\nexport interface SpeechResult {\n /** Raw audio bytes in the requested format (mp3 by default). */\n audio: ArrayBuffer;\n /** Upstream `content-type` (`audio/mpeg` when the upstream sent none). */\n contentType: string;\n routedTo: string | null;\n headers: Headers;\n}\n\nexport interface SpeechJsonResult {\n /** Decoded audio bytes (empty when `store: true` — use `asset.url`). */\n audio: Uint8Array;\n /** Word timings (`timestamps: true`); `null` when not requested or the timing pass failed. */\n words: SpeechWord[] | null;\n /** The stored studio asset (`store: true`), referenceable as `asset:<asset_id>` in renders. */\n asset: SpeechJson['asset'] | null;\n durationSeconds: number;\n /** Upstream cost of the request in micro-USD. */\n costMicroUsd: number | null;\n /** True when `timestamps` was requested but the gateway answered `x-codai-timestamps: unavailable`. */\n timestampsUnavailable: boolean;\n raw: SpeechJson;\n routedTo: string | null;\n headers: Headers;\n}\n\nexport class Audio {\n constructor(private readonly http: HttpClient) {}\n\n /** Speech-to-text (multipart upload; never retried). Returns the transcript (0.2.x shape). */\n async transcribe(opts: TranscriptionOptions): Promise<string> {\n return (await this.transcribeDetailed(opts)).text;\n }\n\n /** Speech-to-text with the raw upstream JSON and routing headers. */\n async transcribeDetailed(opts: TranscriptionOptions): Promise<TranscriptionResult> {\n const form = new FormData();\n const blob = opts.file instanceof Blob ? opts.file : new Blob([opts.file as BlobPart]);\n form.append('file', blob, opts.filename ?? 'audio.webm');\n form.append('model', opts.model ?? 'codai-transcribe');\n if (opts.language) form.append('language', opts.language);\n if (opts.prompt) form.append('prompt', opts.prompt);\n if (opts.responseFormat) form.append('response_format', opts.responseFormat);\n if (opts.temperature !== undefined) form.append('temperature', String(opts.temperature));\n const res = await this.http.request('/v1/audio/transcriptions', {\n method: 'POST',\n rawBody: form,\n ext: opts.ext,\n signal: opts.signal,\n });\n const raw = (await res.json()) as TranscriptionResponse;\n return {\n text: typeof raw.text === 'string' ? raw.text : '',\n raw,\n routedTo: res.headers.get('x-codai-routed-to'),\n headers: res.headers,\n };\n }\n\n /** Text-to-speech. Returns the raw audio bytes (0.2.x shape); see `speechDetailed()` for headers. */\n async speech(\n body: Omit<SpeechRequest, 'model'> & { model?: string },\n opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal } = {},\n ): Promise<ArrayBuffer> {\n return (await this.speechDetailed(body, opts)).audio;\n }\n\n /** Text-to-speech with the upstream `content-type` and routing headers. */\n async speechDetailed(\n body: Omit<SpeechRequest, 'model'> & { model?: string },\n opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal } = {},\n ): Promise<SpeechResult> {\n const model = body.model ?? 'codai-tts';\n // codai-speech* pick their own default (Aoede / Kore); `alloy` is an Azure voice name.\n const voice = body.voice ?? (model.startsWith('codai-speech') ? undefined : 'alloy');\n const res = await this.http.request('/v1/audio/speech', {\n body: { ...body, model, ...(voice === undefined ? {} : { voice }) },\n ext: opts.ext,\n signal: opts.signal,\n });\n return {\n audio: await res.arrayBuffer(),\n contentType: res.headers.get('content-type') ?? 'audio/mpeg',\n routedTo: res.headers.get('x-codai-routed-to'),\n headers: res.headers,\n };\n }\n\n /**\n * Text-to-speech with JSON output: per-word timings (`timestamps`, default true here) and/or a stored studio\n * asset (`store`). Works for every speech model; `codai-speech` (Chirp 3 HD) and `codai-speech-expressive`\n * (Gemini TTS, honours `instructions`) speak Romanian natively (`language`, default `ro-RO`).\n */\n async speechJson(\n body: Omit<SpeechRequest, 'model'> & { model?: string },\n opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal } = {},\n ): Promise<SpeechJsonResult> {\n const timestamps = body.timestamps ?? (body.store ? undefined : true);\n const res = await this.http.request('/v1/audio/speech', {\n body: {\n ...body,\n model: body.model ?? 'codai-speech',\n ...(timestamps === undefined ? {} : { timestamps }),\n },\n ext: opts.ext,\n signal: opts.signal,\n });\n const raw = (await res.json()) as SpeechJson;\n const cost = raw.cost_micro_usd ?? res.headers.get('x-codai-cost-micro-usd');\n return {\n audio: raw.b64_json ? base64ToBytes(raw.b64_json) : new Uint8Array(0),\n words: raw.words ? [...raw.words] : null,\n asset: raw.asset ?? null,\n durationSeconds: raw.duration_seconds,\n costMicroUsd: cost === null || cost === undefined ? null : Number(cost),\n timestampsUnavailable: res.headers.get('x-codai-timestamps') === 'unavailable',\n raw,\n routedTo: res.headers.get('x-codai-routed-to'),\n headers: res.headers,\n };\n }\n\n /**\n * Streaming neural TTS with visemes + word boundaries (`codai-tts-ro`, Azure AI Speech).\n * Yields `start`, then `audio` / `viseme` / `word` in synthesis order, then `done` (or `error`).\n * Voices: `alina` (default), `emil`, or any Azure neural voice name. Default format `pcm`\n * (PCM16 mono 24 kHz). Works with an ephemeral token of scope `audio` or `live`.\n */\n async *speechStream(\n body: SpeechStreamRequest,\n opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal } = {},\n ): AsyncGenerator<SpeechStreamEvent, void, undefined> {\n const frames = this.http.sse('/v1/audio/speech/stream', {\n body: { ...body, model: body.model ?? 'codai-tts-ro' },\n ext: opts.ext,\n signal: opts.signal,\n });\n for await (const frame of frames) {\n const data = frameJson<Record<string, unknown>>(frame);\n if (!data || typeof data.type !== 'string') continue;\n if (data.type === 'audio' && typeof data.delta === 'string') {\n yield { type: 'audio', delta: data.delta, audio: base64ToBytes(data.delta) };\n continue;\n }\n yield data as SpeechStreamEvent;\n if (data.type === 'done' || data.type === 'error') return;\n }\n }\n}\n","/**\n * `/v1/cards/*` — server-side DATA for typed cards (`@codai/cards`). Every JSON method returns `{ block, provenance }`\n * where `block` is already a valid card block (weather, places, map, metric, table or links) that can be dropped into\n * a card unchanged; `staticMap` returns PNG bytes.\n *\n * Weather and FX are free. Places, geocode and static maps are Google calls billed to your usage at Google's list price\n * (Places text/nearby $0.032, geocoding $0.005, static map $0.002) and limited per user per UTC day (200 Places,\n * 500 maps); `unfurl` is free but limited to 500 fetches per day (cache hits do not count). Maps methods throw a 503\n * `CodaiError` with code `maps_not_configured` when the gateway has no maps key — fall back to text.\n */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type QueryOf, type Reply, type Schema } from './_shared';\n\n/** `{ block, provenance }` (+ `results` for geocode) as returned by every JSON card endpoint. */\nexport type CardDataResponse = Schema<'CardDataResponse'>;\nexport type CardsWeatherParams = QueryOf<'cardsWeather'>;\nexport type CardsPlacesParams = QueryOf<'cardsPlaces'>;\nexport type CardsGeocodeParams = QueryOf<'cardsGeocode'>;\nexport type CardsStaticMapParams = QueryOf<'cardsStaticMap'>;\nexport type CardsFxParams = QueryOf<'cardsFx'>;\nexport type CardsUnfurlBody = Body<'cardsUnfurl'>;\nexport type CardsWeatherResponse = Reply<'cardsWeather'>;\nexport type CardsPlacesResponse = Reply<'cardsPlaces'>;\nexport type CardsGeocodeResponse = Reply<'cardsGeocode'>;\nexport type CardsFxResponse = Reply<'cardsFx'>;\nexport type CardsUnfurlResponse = Reply<'cardsUnfurl'>;\n\n/** A rendered static map: PNG bytes plus the attribution the gateway sent (`x-codai-attribution`). */\nexport interface CardsStaticMap {\n bytes: Uint8Array;\n contentType: string;\n attribution: string | null;\n}\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\ntype Q = Record<string, string | number | boolean | undefined | null>;\n\nexport class Cards {\n constructor(private readonly http: HttpClient) {}\n\n private get<T>(path: string, query: object, opts: CallOpts): Promise<T> {\n return this.http.json<T>(path, { query: query as Q, ext: opts.ext, signal: opts.signal });\n }\n\n /** `GET /v1/cards/weather` — `weather` block from MET Norway (cached 30–60 min per 0.01°, free). */\n weather(params: CardsWeatherParams, opts: CallOpts = {}): Promise<CardsWeatherResponse> {\n return this.get('/v1/cards/weather', params, opts);\n }\n\n /**\n * `GET /v1/cards/places` — `places` block from Google Places: Text Search with `q` (biased to `lat`/`lng`/`radius`),\n * Nearby Search without it. Billed per call; `block` is null when nothing matched.\n */\n places(params: CardsPlacesParams, opts: CallOpts = {}): Promise<CardsPlacesResponse> {\n return this.get('/v1/cards/places', params, opts);\n }\n\n /** `GET /v1/cards/geocode` — `map` block (≤ 5 markers) plus raw `results` (Google Geocoding, billed). */\n geocode(params: CardsGeocodeParams, opts: CallOpts = {}): Promise<CardsGeocodeResponse> {\n return this.get('/v1/cards/geocode', params, opts);\n }\n\n /**\n * `GET /v1/cards/static-map` — PNG from Google Maps Static proxied through the gateway (no maps key on the client).\n * Needs `center` or `markers` (`lat,lng[,L]` joined by `|`); ≤ 640×400 points. Billed per call.\n */\n async staticMap(params: CardsStaticMapParams, opts: CallOpts = {}): Promise<CardsStaticMap> {\n const res = await this.http.request('/v1/cards/static-map', {\n query: params as Q,\n ext: opts.ext,\n signal: opts.signal,\n });\n return {\n bytes: new Uint8Array(await res.arrayBuffer()),\n contentType: res.headers.get('content-type') ?? 'image/png',\n attribution: res.headers.get('x-codai-attribution'),\n };\n }\n\n /**\n * `GET /v1/cards/fx` — BNR (default) or ECB reference rates: a `metric` block with `from`+`to`, otherwise a `table`\n * block against `quote`, optionally limited to `symbols` (comma-separated). Free.\n */\n fx(params: CardsFxParams = {}, opts: CallOpts = {}): Promise<CardsFxResponse> {\n return this.get('/v1/cards/fx', params, opts);\n }\n\n /**\n * `POST /v1/cards/unfurl` — `links` block (variant `preview`) for a public https page; SSRF-guarded, cached 24 h.\n * Private targets throw 400 `unfurl_blocked`, non-https pages 422 `unfurl_not_https`.\n */\n unfurl(url: string, opts: CallOpts = {}): Promise<CardsUnfurlResponse> {\n const body: CardsUnfurlBody = { url };\n return this.http.json<CardsUnfurlResponse>('/v1/cards/unfurl', {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n","/** `POST /v1/chat/completions` — OpenAI-compatible completions (JSON + SSE). */\nimport { type CodaiRequestExtensions, frameJson, type HttpClient, readSse } from '../http';\nimport { type Body, type Mutable, type Reply, type Schema } from './_shared';\n\nexport type ChatCompletionRequest = Mutable<Body<'createChatCompletion'>>;\n/** Request body as accepted by the SDK: `stream` is set by the method and `model` defaults to `codai`. */\nexport type ChatCompletionInput = Omit<ChatCompletionRequest, 'stream' | 'model'> & {\n model?: string;\n};\nexport type ChatCompletionResponse = Reply<'createChatCompletion'>;\nexport type ChatMessage = Mutable<Schema<'ChatMessage'>>;\nexport type ChatTool = Mutable<Schema<'ChatTool'>>;\nexport type ChatToolCall = Mutable<Schema<'ChatToolCall'>>;\nexport type ChatUsage = Schema<'ChatUsage'>;\n\nexport interface TokenUsage {\n promptTokens: number;\n completionTokens: number;\n /** Prompt tokens served from the provider cache, when reported. */\n cachedTokens?: number;\n}\n\n/** Per-call options accepted by every chat method. */\nexport interface ChatCallOptions {\n /** `X-Codai-*` extension headers for this call. */\n ext?: CodaiRequestExtensions;\n signal?: AbortSignal;\n}\n\nexport interface ChatResult {\n /** Assistant message content (first choice). */\n content: string;\n /** Tool calls on the first choice (empty if none). */\n toolCalls: ChatToolCall[];\n /** Raw OpenAI-shaped response. */\n raw: ChatCompletionResponse;\n /** Request id (`x-codai-trace-id` / `x-request-id`) — pass to `feedback`. */\n requestId: string | null;\n /** Usage-event id (`x-codai-event-id`) — exact target for `feedback.submit`. */\n eventId: string | null;\n /** Which upstream model actually served (`x-codai-routed-to`). */\n routedTo: string | null;\n /** Verification status for verified-execution responses, if present. */\n execVerify: string | null;\n usage: TokenUsage | null;\n /** Response headers, for the long tail of `x-codai-*` metadata. */\n headers: Headers;\n}\n\n/** Final metadata for a completed stream — resolved via `stream.final`. */\nexport interface ChatStreamResult {\n content: string;\n toolCalls: ChatToolCall[];\n requestId: string | null;\n routedTo: string | null;\n execVerify: string | null;\n usage: TokenUsage | null;\n /** `finish_reason` of the last content chunk, when sent. */\n finishReason: string | null;\n headers: Headers | null;\n}\n\n/**\n * A live chat stream. Async-iterate it for text deltas, then await `.final`\n * for metadata. `.chunks()` yields the raw `chat.completion.chunk` objects.\n */\nexport interface ChatStream extends AsyncIterable<string> {\n readonly final: Promise<ChatStreamResult>;\n chunks(): AsyncIterable<ChatCompletionChunk>;\n}\n\nexport interface ChatCompletionChunk {\n id?: string;\n object?: 'chat.completion.chunk';\n model?: string;\n choices?: Array<{\n index?: number;\n delta?: {\n role?: string;\n content?: string | null;\n tool_calls?: Array<{ index?: number } & Record<string, unknown>>;\n };\n finish_reason?: string | null;\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n prompt_tokens_details?: { cached_tokens?: number };\n };\n [key: string]: unknown;\n}\n\nfunction toUsage(u: ChatCompletionChunk['usage'] | undefined): TokenUsage | null {\n if (!u) return null;\n const cached = u.prompt_tokens_details?.cached_tokens;\n return {\n promptTokens: u.prompt_tokens ?? 0,\n completionTokens: u.completion_tokens ?? 0,\n ...(cached !== undefined ? { cachedTokens: cached } : {}),\n };\n}\n\n/**\n * Merge a streamed tool-call fragment into the accumulator at `index`.\n * OpenAI streams tool calls piecewise: id/name arrive first, then the\n * `arguments` string is appended across many deltas.\n */\nexport function mergeToolCall(\n acc: Map<number, Record<string, unknown>>,\n index: number,\n fragment: Record<string, unknown>,\n): void {\n const existing = acc.get(index) ?? { index };\n for (const [key, val] of Object.entries(fragment)) {\n if (key === 'index') continue;\n if (key === 'function' && val && typeof val === 'object') {\n const fn = (existing.function as Record<string, unknown>) ?? {};\n for (const [fk, fv] of Object.entries(val as Record<string, unknown>)) {\n if (fk === 'arguments') fn.arguments = String(fn.arguments ?? '') + String(fv ?? '');\n else fn[fk] = fv;\n }\n existing.function = fn;\n } else {\n existing[key] = val;\n }\n }\n acc.set(index, existing);\n}\n\nexport class ChatCompletions {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Non-streaming completion. `stream` is forced to `false`; use\n * `stream()` for SSE.\n */\n async create(body: ChatCompletionInput, opts: ChatCallOptions = {}): Promise<ChatResult> {\n const res = await this.http.request('/v1/chat/completions', {\n body: { ...body, model: body.model ?? 'codai', stream: false },\n ext: opts.ext,\n signal: opts.signal,\n });\n const raw = (await res.json()) as ChatCompletionResponse;\n const first = raw.choices?.[0];\n const usage = raw.usage as ChatCompletionChunk['usage'] | undefined;\n return {\n content: typeof first?.message?.content === 'string' ? first.message.content : '',\n toolCalls: [...((first?.message?.tool_calls ?? []) as ChatToolCall[])],\n raw,\n requestId: res.headers.get('x-codai-trace-id') ?? res.headers.get('x-request-id'),\n eventId: res.headers.get('x-codai-event-id'),\n routedTo: res.headers.get('x-codai-routed-to'),\n execVerify: res.headers.get('x-codai-exec-verify'),\n usage: toUsage(usage),\n headers: res.headers,\n };\n }\n\n /** Streaming completion (`stream: true`). */\n stream(body: ChatCompletionInput, opts: ChatCallOptions = {}): ChatStream {\n const requestPromise = this.http.request('/v1/chat/completions', {\n body: { ...body, model: body.model ?? 'codai', stream: true },\n ext: opts.ext,\n signal: opts.signal,\n timeoutMs: 0,\n noRetry: true,\n });\n\n let resolveFinal!: (r: ChatStreamResult) => void;\n let rejectFinal!: (e: unknown) => void;\n const final = new Promise<ChatStreamResult>((resolve, reject) => {\n resolveFinal = resolve;\n rejectFinal = reject;\n });\n final.catch(() => {}); // no unhandled-rejection noise when `final` is never awaited\n\n const toolCallsByIndex = new Map<number, Record<string, unknown>>();\n let content = '';\n let usage: TokenUsage | null = null;\n let finishReason: string | null = null;\n let res: Response | null = null;\n\n const buildResult = (): ChatStreamResult => ({\n content,\n toolCalls: [...toolCallsByIndex.values()] as ChatToolCall[],\n requestId: res?.headers.get('x-codai-trace-id') ?? res?.headers.get('x-request-id') ?? null,\n routedTo: res?.headers.get('x-codai-routed-to') ?? null,\n execVerify: res?.headers.get('x-codai-exec-verify') ?? null,\n usage,\n finishReason,\n headers: res?.headers ?? null,\n });\n\n async function* chunks(): AsyncGenerator<ChatCompletionChunk, void, undefined> {\n try {\n res = await requestPromise;\n for await (const frame of readSse(res, opts.signal)) {\n if (frame.data === '[DONE]') break;\n const chunk = frameJson<ChatCompletionChunk>(frame);\n if (!chunk) continue;\n if (chunk.usage) usage = toUsage(chunk.usage);\n const choice = chunk.choices?.[0];\n if (choice?.finish_reason) finishReason = choice.finish_reason;\n const delta = choice?.delta;\n if (delta?.tool_calls) {\n for (const tc of delta.tool_calls) {\n mergeToolCall(toolCallsByIndex, typeof tc.index === 'number' ? tc.index : 0, tc);\n }\n }\n if (delta?.content) content += delta.content;\n yield chunk;\n }\n resolveFinal(buildResult());\n } catch (err) {\n rejectFinal(err);\n throw err;\n }\n }\n\n async function* text(): AsyncGenerator<string, void, undefined> {\n for await (const chunk of chunks()) {\n const delta = chunk.choices?.[0]?.delta?.content;\n if (delta) yield delta;\n }\n }\n\n return {\n [Symbol.asyncIterator]: () => text(),\n chunks: () => ({ [Symbol.asyncIterator]: () => chunks() }),\n final,\n };\n }\n}\n\nexport class Chat {\n readonly completions: ChatCompletions;\n constructor(http: HttpClient) {\n this.completions = new ChatCompletions(http);\n }\n}\n","/** `/v1/devices/*` — devices bound to your account + the aggregated dispatch inbox. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply, type Schema } from './_shared';\n\nexport type Device = Schema<'DeviceListItem'>;\nexport type DevicePatch = Mutable<Body<'updateDevice'>>;\nexport type DevicePatched = Reply<'updateDevice'>;\nexport type DispatchInbox = Reply<'getMyDispatchInbox'>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nexport class Devices {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/devices` — most recently seen first. */\n async list(opts: CallOpts = {}): Promise<Device[]> {\n const raw = await this.http.json<Reply<'listDevices'>>('/v1/devices', {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.devices ?? [])];\n }\n\n /** `PATCH /v1/devices/{id}` — push token and/or capabilities. */\n update(id: string, body: DevicePatch, opts: CallOpts = {}): Promise<DevicePatched> {\n return this.http.json<DevicePatched>(`/v1/devices/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `DELETE /v1/devices/{id}` */\n delete(id: string, opts: CallOpts = {}): Promise<Reply<'deleteDevice'>> {\n return this.http.json<Reply<'deleteDevice'>>(`/v1/devices/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /**\n * `POST /v1/keys/self/revoke` — the API key this client uses revokes ITSELF (sign out).\n * Every later call with it fails with 401.\n */\n revokeSelfKey(opts: CallOpts = {}): Promise<Reply<'revokeSelfKey'>> {\n return this.http.json<Reply<'revokeSelfKey'>>('/v1/keys/self/revoke', {\n method: 'POST',\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /**\n * `GET /v1/devices/me/dispatch?limit=` — pending controls dispatched at the\n * calling device (`x-codai-device` required) across all owned sessions.\n */\n dispatchInbox(query: { limit?: number } = {}, opts: CallOpts = {}): Promise<DispatchInbox> {\n return this.http.json<DispatchInbox>('/v1/devices/me/dispatch', {\n query: { limit: query.limit },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n","/** `POST /v1/embeddings`. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply } from './_shared';\n\nexport type EmbeddingsRequest = Mutable<Body<'createEmbeddings'>>;\nexport type EmbeddingsResponse = Reply<'createEmbeddings'>;\n\nexport interface EmbeddingsResult {\n /** One vector per input, in order. */\n embeddings: number[][];\n raw: EmbeddingsResponse;\n /** Upstream embedding model that produced the vectors (`x-codai-routed-to`). */\n routedTo: string | null;\n /** `<requested>-><served>` when a different model was substituted; vectors live in another space. */\n fallback: string | null;\n headers: Headers;\n}\n\nexport class Embeddings {\n constructor(private readonly http: HttpClient) {}\n\n async create(\n body: Omit<EmbeddingsRequest, 'model'> & { model?: string },\n opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal } = {},\n ): Promise<EmbeddingsResult> {\n const res = await this.http.request('/v1/embeddings', {\n body: { ...body, model: body.model ?? 'codai-embed' },\n ext: opts.ext,\n signal: opts.signal,\n });\n const raw = (await res.json()) as EmbeddingsResponse;\n return {\n embeddings: (raw.data ?? []).map((d) => [...(d.embedding as readonly number[])]),\n raw,\n routedTo: res.headers.get('x-codai-routed-to'),\n fallback: res.headers.get('x-codai-embed-fallback'),\n headers: res.headers,\n };\n }\n}\n","/** `/v1/environments/*` — cloud / BYO dev environments, their members, ports and secrets. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type QueryOf, type Reply, type Schema } from './_shared';\n\nexport type Environment = Schema<'Environment'>;\nexport type EnvironmentDetail = Schema<'EnvironmentDetail'>;\nexport type EnvironmentState = Schema<'EnvironmentState'>;\nexport type EnvironmentProvider = Schema<'EnvironmentProvider'>;\nexport type EnvironmentRole = Schema<'EnvironmentRole'>;\nexport type EnvironmentTransition = Schema<'EnvironmentTransition'>;\nexport type EnvironmentEnrollToken = Schema<'EnvironmentEnrollToken'>;\nexport type EnvironmentEnrolled = Schema<'EnvironmentEnrolled'>;\nexport type EnvironmentMember = Schema<'EnvironmentMember'>;\nexport type EnvironmentMemberCreated = Schema<'EnvironmentMemberCreated'>;\nexport type EnvironmentPort = Schema<'EnvironmentPort'>;\nexport type EnvironmentSecret = Schema<'EnvironmentSecret'>;\nexport type EnvironmentSecretSet = Schema<'EnvironmentSecretSet'>;\nexport type EnvironmentCreateBody = Mutable<Body<'createEnvironment'>>;\nexport type EnvironmentPatchBody = Mutable<Body<'updateEnvironment'>>;\nexport type EnvironmentEnrollBody = Mutable<Body<'enrollEnvironment'>>;\nexport type EnvironmentAddMemberBody = Mutable<Body<'addEnvironmentMember'>>;\nexport type EnvironmentPortBody = Mutable<Body<'setEnvironmentPort'>>;\nexport type ListEnvironmentsQuery = Mutable<QueryOf<'listEnvironments'>>;\nexport type EnvironmentSshCert = Reply<'issueMyEnvironmentSshCert'>;\nexport type EnvironmentSshCertBody = Mutable<Body<'issueMyEnvironmentSshCert'>>;\nexport type EnvironmentSshCa = Reply<'getEnvironmentSshCa'>;\nexport type EnvironmentTaskList = Reply<'listEnvironmentTasks'>;\nexport type EnvironmentTaskCreateBody = Mutable<Body<'createEnvironmentTask'>>;\nexport type EnvironmentTaskCreated = Reply<'createEnvironmentTask'>;\nexport type EnvironmentTaskDetail = Reply<'getEnvironmentTask'>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nconst envPath = (id: string, suffix = ''): string =>\n `/v1/environments/${encodeURIComponent(id)}${suffix}`;\n\nexport class EnvironmentMembers {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/environments/{id}/members` — any role. */\n async list(envId: string, opts: CallOpts = {}): Promise<EnvironmentMember[]> {\n const raw = await this.http.json<Reply<'listEnvironmentMembers'>>(envPath(envId, '/members'), {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.members ?? [])];\n }\n\n /** `POST /v1/environments/{id}/members` — exactly one of `user_id` / `email`. */\n async add(\n envId: string,\n body: EnvironmentAddMemberBody,\n opts: CallOpts = {},\n ): Promise<EnvironmentMemberCreated> {\n const raw = await this.http.json<Reply<'addEnvironmentMember', 201>>(\n envPath(envId, '/members'),\n { body, ext: opts.ext, signal: opts.signal },\n );\n return raw.member;\n }\n\n /** `PUT /v1/environments/{id}/members/me/ssh-key` — one `authorized_keys` line. */\n setSshKey(\n envId: string,\n publicKey: string,\n opts: CallOpts = {},\n ): Promise<Reply<'setMyEnvironmentSshKey'>> {\n const body: Mutable<Body<'setMyEnvironmentSshKey'>> = { public_key: publicKey };\n return this.http.json<Reply<'setMyEnvironmentSshKey'>>(envPath(envId, '/members/me/ssh-key'), {\n method: 'PUT',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `PATCH /v1/environments/{id}/members/{userId}` — 409 `last_owner` on demoting the last owner. */\n async setRole(\n envId: string,\n userId: string,\n role: EnvironmentRole,\n opts: CallOpts = {},\n ): Promise<Reply<'setEnvironmentMemberRole'>['member']> {\n const raw = await this.http.json<Reply<'setEnvironmentMemberRole'>>(\n envPath(envId, `/members/${encodeURIComponent(userId)}`),\n { method: 'PATCH', body: { role }, ext: opts.ext, signal: opts.signal },\n );\n return raw.member;\n }\n\n /** `DELETE /v1/environments/{id}/members/{userId}` — pass your own id to leave. */\n remove(\n envId: string,\n userId: string,\n opts: CallOpts = {},\n ): Promise<Reply<'removeEnvironmentMember'>> {\n return this.http.json<Reply<'removeEnvironmentMember'>>(\n envPath(envId, `/members/${encodeURIComponent(userId)}`),\n { method: 'DELETE', ext: opts.ext, signal: opts.signal },\n );\n }\n\n /** `POST /v1/environments/{id}/members/me/ssh-cert` — 12 h OpenSSH user certificate for your key. */\n sshCert(envId: string, body: EnvironmentSshCertBody, opts: CallOpts = {}): Promise<EnvironmentSshCert> {\n return this.http.json<EnvironmentSshCert>(envPath(envId, '/members/me/ssh-cert'), {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n }\n}\n\n/** `/v1/environments/{id}/tasks` — fire-and-forget agent tasks run in the environment. */\nexport class EnvironmentTasks {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/environments/{id}/tasks` */\n list(envId: string, opts: CallOpts = {}): Promise<EnvironmentTaskList> {\n return this.http.json<EnvironmentTaskList>(envPath(envId, '/tasks'), { ext: opts.ext, signal: opts.signal });\n }\n\n /** `POST /v1/environments/{id}/tasks` — queued; you get a notification when it finishes. */\n create(envId: string, body: EnvironmentTaskCreateBody, opts: CallOpts = {}): Promise<EnvironmentTaskCreated> {\n return this.http.json<EnvironmentTaskCreated>(envPath(envId, '/tasks'), {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n }\n\n /** `GET /v1/environments/{id}/tasks/{taskId}` */\n get(envId: string, taskId: string, opts: CallOpts = {}): Promise<EnvironmentTaskDetail> {\n return this.http.json<EnvironmentTaskDetail>(envPath(envId, `/tasks/${encodeURIComponent(taskId)}`), { ext: opts.ext, signal: opts.signal });\n }\n}\n\nexport class EnvironmentPorts {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/environments/{id}/ports` — published (forwarded) ports. */\n async list(envId: string, opts: CallOpts = {}): Promise<EnvironmentPort[]> {\n const raw = await this.http.json<Reply<'listEnvironmentPorts'>>(envPath(envId, '/ports'), {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.ports ?? [])];\n }\n\n /** `PUT /v1/environments/{id}/ports/{port}` — publish or change visibility (upsert). */\n async set(\n envId: string,\n port: number,\n body: EnvironmentPortBody,\n opts: CallOpts = {},\n ): Promise<EnvironmentPort> {\n const raw = await this.http.json<Reply<'setEnvironmentPort'>>(\n envPath(envId, `/ports/${encodeURIComponent(String(port))}`),\n { method: 'PUT', body, ext: opts.ext, signal: opts.signal },\n );\n return raw.port;\n }\n\n /** `DELETE /v1/environments/{id}/ports/{port}` — unpublish. */\n remove(\n envId: string,\n port: number,\n opts: CallOpts = {},\n ): Promise<Reply<'removeEnvironmentPort'>> {\n return this.http.json<Reply<'removeEnvironmentPort'>>(\n envPath(envId, `/ports/${encodeURIComponent(String(port))}`),\n { method: 'DELETE', ext: opts.ext, signal: opts.signal },\n );\n }\n}\n\nexport class EnvironmentSecrets {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/environments/{id}/secrets` — names and timestamps only, never values. */\n async list(envId: string, opts: CallOpts = {}): Promise<EnvironmentSecret[]> {\n const raw = await this.http.json<Reply<'listEnvironmentSecrets'>>(envPath(envId, '/secrets'), {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.secrets ?? [])];\n }\n\n /** `PUT /v1/environments/{id}/secrets/{name}` — upsert; `name` is `ENV_STYLE`. */\n set(\n envId: string,\n name: string,\n value: string,\n opts: CallOpts = {},\n ): Promise<EnvironmentSecretSet> {\n const body: Mutable<Body<'setEnvironmentSecret'>> = { value };\n return this.http.json<EnvironmentSecretSet>(\n envPath(envId, `/secrets/${encodeURIComponent(name)}`),\n { method: 'PUT', body, ext: opts.ext, signal: opts.signal },\n );\n }\n\n /** `DELETE /v1/environments/{id}/secrets/{name}` */\n remove(\n envId: string,\n name: string,\n opts: CallOpts = {},\n ): Promise<Reply<'removeEnvironmentSecret'>> {\n return this.http.json<Reply<'removeEnvironmentSecret'>>(\n envPath(envId, `/secrets/${encodeURIComponent(name)}`),\n { method: 'DELETE', ext: opts.ext, signal: opts.signal },\n );\n }\n}\n\nexport class Environments {\n readonly members: EnvironmentMembers;\n readonly ports: EnvironmentPorts;\n readonly secrets: EnvironmentSecrets;\n readonly tasks: EnvironmentTasks;\n\n constructor(private readonly http: HttpClient) {\n this.members = new EnvironmentMembers(http);\n this.ports = new EnvironmentPorts(http);\n this.secrets = new EnvironmentSecrets(http);\n this.tasks = new EnvironmentTasks(http);\n }\n\n /** `GET /v1/environments/{id}/ssh-ca` — CA public keys to trust (`@cert-authority` lines). */\n sshCa(envId: string, opts: CallOpts = {}): Promise<EnvironmentSshCa> {\n return this.http.json<EnvironmentSshCa>(envPath(envId, '/ssh-ca'), { ext: opts.ext, signal: opts.signal });\n }\n\n /** `GET /v1/environments?project_id=&for_user_id=me` — newest first, every state. */\n async list(query: ListEnvironmentsQuery = {}, opts: CallOpts = {}): Promise<Environment[]> {\n const raw = await this.http.json<Reply<'listEnvironments'>>('/v1/environments', {\n query: { project_id: query.project_id, for_user_id: query.for_user_id },\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.environments ?? [])];\n }\n\n /**\n * `POST /v1/environments` — `byo` starts `pending`; managed providers start\n * `creating`. 409 `already_has_env` in a `vm_per_dev` project (the error\n * body carries the `environment_id` to reuse).\n */\n async create(body: EnvironmentCreateBody, opts: CallOpts = {}): Promise<Environment> {\n const raw = await this.http.json<Reply<'createEnvironment', 201>>('/v1/environments', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n return raw.environment;\n }\n\n /**\n * `POST /v1/environments/enroll` — daemon side. The one-time `codai_env_…`\n * token in the body is the only credential; the client's API key header is\n * ignored by this route. Managed environments additionally receive a\n * freshly minted `api_key`, returned exactly once.\n */\n enroll(body: EnvironmentEnrollBody, opts: CallOpts = {}): Promise<EnvironmentEnrolled> {\n return this.http.json<EnvironmentEnrolled>('/v1/environments/enroll', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n // The token is consumed on success; a retried POST would 401.\n noRetry: true,\n });\n }\n\n /** `GET /v1/environments/{id}` — environment, your role, members, ports, recent events. */\n get(envId: string, opts: CallOpts = {}): Promise<EnvironmentDetail> {\n return this.http.json<EnvironmentDetail>(envPath(envId), {\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `PATCH /v1/environments/{id}` — `name` and/or `idle_timeout_minutes` (5..1440). */\n async update(\n envId: string,\n body: EnvironmentPatchBody,\n opts: CallOpts = {},\n ): Promise<Environment> {\n const raw = await this.http.json<Reply<'updateEnvironment'>>(envPath(envId), {\n method: 'PATCH',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n return raw.environment;\n }\n\n /** `POST /v1/environments/{id}/start` — managed providers only (`stopped` → `starting`). */\n start(envId: string, opts: CallOpts = {}): Promise<EnvironmentTransition> {\n return this.transition(envId, 'start', opts);\n }\n\n /** `POST /v1/environments/{id}/stop` — managed providers only (`running` → `stopping`). */\n stop(envId: string, opts: CallOpts = {}): Promise<EnvironmentTransition> {\n return this.transition(envId, 'stop', opts);\n }\n\n /** `POST /v1/environments/{id}/archive` — keeps history, releases the machine. */\n archive(envId: string, opts: CallOpts = {}): Promise<EnvironmentTransition> {\n return this.transition(envId, 'archive', opts);\n }\n\n /** `POST /v1/environments/{id}/destroy` — owner only; terminal. */\n destroy(envId: string, opts: CallOpts = {}): Promise<EnvironmentTransition> {\n return this.transition(envId, 'destroy', opts);\n }\n\n /**\n * `POST /v1/environments/{id}/enroll-token` — `byo` only; a 30-minute\n * one-time token for `enroll()`. Minting again replaces the previous one.\n */\n enrollToken(envId: string, opts: CallOpts = {}): Promise<EnvironmentEnrollToken> {\n return this.http.json<EnvironmentEnrollToken>(envPath(envId, '/enroll-token'), {\n method: 'POST',\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n }\n\n private transition(\n envId: string,\n action: 'start' | 'stop' | 'archive' | 'destroy',\n opts: CallOpts,\n ): Promise<EnvironmentTransition> {\n return this.http.json<EnvironmentTransition>(envPath(envId, `/${action}`), {\n method: 'POST',\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n","/** Unauthenticated probes at the root: `/health`, `/health/ready`, `/status`. */\nimport { type HttpClient } from '../http';\nimport { type Reply } from './_shared';\n\nexport type HealthResponse = Reply<'getHealth'>;\nexport type HealthReadyResponse = Reply<'getHealthReady'>;\nexport type StatusResponse = Reply<'getStatus'>;\n\nexport class Health {\n constructor(private readonly http: HttpClient) {}\n\n /** Liveness probe. */\n get(opts: { signal?: AbortSignal } = {}): Promise<HealthResponse> {\n return this.http.json<HealthResponse>('/health', { signal: opts.signal, noRetry: true });\n }\n\n /**\n * Deep readiness probe. A 503 is returned as `{ ok: false, ... }` rather\n * than thrown, so callers can read the failing check.\n */\n async ready(\n opts: { signal?: AbortSignal } = {},\n ): Promise<HealthReadyResponse & { httpStatus: number }> {\n const res = await this.http.request('/health/ready', {\n signal: opts.signal,\n noRetry: true,\n acceptStatus: [503],\n });\n const body = (await res.json()) as HealthReadyResponse;\n return { ...body, httpStatus: res.status };\n }\n\n /** Registry snapshot (aliases + provider health). */\n status(opts: { signal?: AbortSignal } = {}): Promise<StatusResponse> {\n return this.http.json<StatusResponse>('/status', { signal: opts.signal, noRetry: true });\n }\n}\n","/** `/v1/hosts/*` — host relay (desktop announces itself; clients exec ops on it). */\nimport { type CodaiRequestExtensions, frameJson, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply, type Schema } from './_shared';\n\nexport type HostPresence = Schema<'HostPresence'>;\nexport type HostOp = Schema<'HostOp'>;\nexport type HostExecBody = Mutable<Body<'execOnHost'>>;\nexport type HostExecResponse = Reply<'execOnHost'>;\nexport type HostExecRequest = Schema<'HostExecRequest'>;\nexport type HostExecResultBody = Mutable<Body<'postHostExecResult'>>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\n/** Frames of `GET /v1/hosts/stream`. */\nexport type HostStreamEvent =\n | { event: 'hello'; data: { device_id: string; heartbeat_ms: number } }\n | { event: 'ping'; data: { t: number } }\n | { event: 'exec'; data: HostExecRequest }\n | { event: string; data: Record<string, unknown> };\n\nexport class Hosts {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/hosts` — your devices currently connected as hosts. */\n async list(opts: CallOpts = {}): Promise<HostPresence[]> {\n const raw = await this.http.json<Reply<'listHosts'>>('/v1/hosts', {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.hosts ?? [])];\n }\n\n /**\n * `POST /v1/hosts/{deviceId}/exec` — run one op on a connected host and\n * block until it answers (or `timeout_ms`, default 60 s).\n */\n exec(\n deviceId: string,\n op: HostOp,\n args: Record<string, unknown> = {},\n extra: { timeoutMs?: number; label?: string } & CallOpts = {},\n ): Promise<HostExecResponse> {\n const body: HostExecBody = {\n op,\n args,\n ...(extra.timeoutMs !== undefined ? { timeout_ms: extra.timeoutMs } : {}),\n ...(extra.label !== undefined ? { label: extra.label } : {}),\n };\n return this.http.json<HostExecResponse>(`/v1/hosts/${encodeURIComponent(deviceId)}/exec`, {\n body,\n ext: extra.ext,\n signal: extra.signal,\n // The gateway itself waits up to timeout_ms + 2 s; give the HTTP layer headroom.\n timeoutMs: (extra.timeoutMs ?? 60_000) + 10_000,\n noRetry: true,\n });\n }\n\n /** `POST /v1/hosts/exec/{reqId}/result` — host side: deliver an exec result. */\n postResult(\n reqId: string,\n body: HostExecResultBody,\n opts: CallOpts = {},\n ): Promise<Reply<'postHostExecResult'>> {\n return this.http.json<Reply<'postHostExecResult'>>(\n `/v1/hosts/exec/${encodeURIComponent(reqId)}/result`,\n { body, ext: opts.ext, signal: opts.signal },\n );\n }\n\n /**\n * `GET /v1/hosts/stream?os=&hostname=&roots=` — host side: announce this\n * device and receive `hello` / `ping` / `exec` events. Closed by the server\n * after 6 h; reconnect to re-announce presence.\n */\n async *stream(\n query: { os?: string; hostname?: string; roots?: string[] } = {},\n opts: CallOpts = {},\n ): AsyncGenerator<HostStreamEvent, void, undefined> {\n const frames = this.http.sse('/v1/hosts/stream', {\n query: {\n os: query.os,\n hostname: query.hostname,\n roots: query.roots?.length ? query.roots.join(',') : undefined,\n },\n ext: opts.ext,\n signal: opts.signal,\n });\n for await (const frame of frames) {\n const data = frameJson<Record<string, unknown>>(frame);\n if (!data) continue;\n yield { event: frame.event, data } as HostStreamEvent;\n }\n }\n}\n","/**\n * `/v1/assets` — the caller's codai Studio assets (media generated with `response_format: 'url'` and every finished\n * video job). Owner-scoped (a foreign id is 404), kept 90 days; each `ready` asset carries a 1 h V4 signed `url`.\n */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type QueryOf, type Reply, type Schema } from './_shared';\n\n/** A stored asset (`GET /v1/assets/{id}`; `data` items with `response_format: 'url'`). */\nexport type AssetDto = Schema<'AssetDto'>;\nexport type AssetKind = Schema<'AssetKind'>;\nexport type AssetList = Reply<'listAssets'>;\nexport type AssetDeleted = Reply<'deleteAsset'>;\nexport type AssetListQuery = QueryOf<'listAssets'>;\n/** `b64_json` (default, inline bytes) or `url` (stored asset + 1 h signed URL; 503 `assets_unavailable` without storage). */\nexport type MediaResponseFormat = Schema<'MediaResponseFormat'>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\n/** True for a `data` item that is a stored asset rather than inline base64. */\nexport function isAssetDto(item: unknown): item is AssetDto {\n return typeof item === 'object' && item !== null && 'asset_id' in item;\n}\n\nexport class Assets {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/assets` — newest first, `limit` ≤ 100 (default 30). Paginate by passing `next_before` as `before`. */\n list(query: AssetListQuery = {}, opts: CallOpts = {}): Promise<AssetList> {\n return this.http.json<AssetList>('/v1/assets', {\n query: { kind: query.kind, before: query.before, limit: query.limit },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** Iterate every asset across pages (`list` with `before` = previous `next_before`). */\n async *iterate(\n query: Omit<AssetListQuery, 'before'> = {},\n opts: CallOpts = {},\n ): AsyncGenerator<AssetDto, void, undefined> {\n let before: string | undefined;\n for (;;) {\n const page = await this.list({ ...query, before }, opts);\n yield* page.data;\n if (!page.next_before) return;\n before = page.next_before;\n }\n }\n\n /** `GET /v1/assets/{id}` — one asset with a fresh 1 h signed `url` (`null` while not `ready`). */\n retrieve(id: string, opts: CallOpts = {}): Promise<AssetDto> {\n return this.http.json<AssetDto>(`/v1/assets/${encodeURIComponent(id)}`, {\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /**\n * A fresh signed URL of the asset's bytes (valid 1 h), from `GET /v1/assets/{id}`. Throws when the asset has no\n * content yet. Use it in `<audio>`/`<video>`/`fetch` — it needs no Authorization header.\n */\n async contentUrl(id: string, opts: CallOpts = {}): Promise<string> {\n const a = await this.retrieve(id, opts);\n if (!a.url) throw new Error(`codai asset ${id} has no content yet (status ${a.status})`);\n return a.url;\n }\n\n /**\n * The authenticated redirect endpoint `GET /v1/assets/{id}/content` (302 to the signed URL). Useful for tools that\n * follow redirects with the API key (`curl -L -H 'Authorization: Bearer …'`); browsers should use `contentUrl()`.\n */\n contentPath(id: string): string {\n return this.http.url(`/v1/assets/${encodeURIComponent(id)}/content`);\n }\n\n /** Download the asset's bytes (fetches the signed URL, no API key sent to storage). */\n async content(id: string, opts: CallOpts = {}): Promise<Uint8Array> {\n const url = await this.contentUrl(id, opts);\n const res = await fetch(url, opts.signal ? { signal: opts.signal } : {});\n if (!res.ok) throw new Error(`codai asset ${id} download failed: HTTP ${res.status}`);\n return new Uint8Array(await res.arrayBuffer());\n }\n\n /** `DELETE /v1/assets/{id}` — deletes the object; signed URLs already handed out stop working. */\n delete(id: string, opts: CallOpts = {}): Promise<AssetDeleted> {\n return this.http.json<AssetDeleted>(`/v1/assets/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n","/**\n * `POST /v1/images/generations` and `POST /v1/images/edits` — Gemini image models on Vertex AI.\n * `codai-image` (default, gemini-3.1-flash-image, EU), `codai-image-fast`, `codai-image-pro`.\n * Output from the EU endpoint carries C2PA credentials + SynthID: keep the bytes as returned.\n *\n * `response_format: 'url'` stores each image as a codai Studio asset (kept 90 days) and returns `assets`\n * (1 h signed URLs) instead of decoded bytes; the default `b64_json` is unchanged.\n */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply } from './_shared';\nimport { type AssetDto, isAssetDto } from './assets';\n\nexport type ImagesRequest = Mutable<Body<'createImage'>>;\nexport type ImagesResponse = Reply<'createImage'>;\nexport type ImageEditRequest = Mutable<Body<'editImage'>>;\n\nexport interface ImagesResult {\n /** Decoded image bytes, one per generated image (see `mimeTypes`). Empty with `response_format: 'url'`. */\n images: Uint8Array[];\n /** MIME type of each generated image (usually `image/png`). */\n mimeTypes: string[];\n /** Stored assets with signed URLs (`response_format: 'url'` only; empty otherwise). */\n assets: AssetDto[];\n raw: ImagesResponse;\n /** Upstream model that produced the images (`x-codai-routed-to`). */\n routedTo: string | null;\n /** Vertex location that processed the request, `eu` or `global` (`x-codai-data-region`). */\n dataRegion: string | null;\n /** Usage-based charge for this request in micro-USD (`x-codai-cost-micro-usd`). */\n costMicroUsd: number | null;\n headers: Headers;\n}\n\n/** Image generation typically takes 5–30 s; the gateway allows 120 s upstream. */\nconst MIN_IMAGE_TIMEOUT_MS = 150_000;\n\nfunction decodeBase64(b64: string): Uint8Array {\n const bin = atob(b64);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n}\n\nexport class Images {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Generate images. Needs a real API key (ephemeral tokens are rejected).\n * Pass `reference_images` to keep a logo/palette/product consistent.\n */\n async generate(\n body: Omit<ImagesRequest, 'model'> & { model?: string },\n opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal } = {},\n ): Promise<ImagesResult> {\n return this.post(\n '/v1/images/generations',\n { ...body, model: body.model ?? 'codai-image' },\n opts,\n );\n }\n\n /**\n * Edit one or more input images (`image`: one `{ b64_json, mime_type }` or an array of up to 14)\n * from a text instruction. JSON body; `mask` is not supported — describe the region in `prompt`.\n */\n async edit(\n body: Omit<ImageEditRequest, 'model'> & { model?: string },\n opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal } = {},\n ): Promise<ImagesResult> {\n return this.post('/v1/images/edits', { ...body, model: body.model ?? 'codai-image' }, opts);\n }\n\n private async post(\n path: string,\n body: unknown,\n opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal },\n ): Promise<ImagesResult> {\n const res = await this.http.request(path, {\n body,\n ext: opts.ext,\n signal: opts.signal,\n // 0 = timeout disabled on the client; otherwise never cap below the image floor.\n timeoutMs:\n this.http.timeoutMs === 0 ? 0 : Math.max(this.http.timeoutMs, MIN_IMAGE_TIMEOUT_MS),\n });\n const raw = (await res.json()) as ImagesResponse;\n const cost = res.headers.get('x-codai-cost-micro-usd');\n const data = raw.data ?? [];\n const assets = data.filter(isAssetDto);\n const inline = data.filter((d): d is Exclude<typeof d, AssetDto> => !isAssetDto(d));\n return {\n images: inline.map((d) => decodeBase64(d.b64_json)),\n mimeTypes: data.map((d) => d.mime_type ?? 'image/png'),\n assets,\n raw,\n routedTo: res.headers.get('x-codai-routed-to'),\n dataRegion: res.headers.get('x-codai-data-region'),\n costMicroUsd: cost === null ? null : Number(cost),\n headers: res.headers,\n };\n }\n}\n","/**\n * codai Studio media lanes (US-only, English prompts; refused for EU data-residency keys).\n *\n * `POST /v1/audio/music` — `codai-music` (Lyria 3 Clip, 30 s MP3 with vocals/lyrics), `codai-music-pro`\n * (Lyria 3 Pro, full song up to 184 s), `codai-music-legacy` (Lyria 2, 30 s instrumental WAV).\n * `POST /v1/videos` — Veo 3.1 Fast: starts a job (HTTP 202).\n * `GET /v1/videos/{id}` — polls the job; the MP4 is returned (and billed once) when it succeeds.\n * `POST /v1/studio/renders` — `codai-render`: renders a HyperFrames HTML composition to MP4 (HTTP 202).\n * `GET /v1/studio/renders/{id}` — polls the render; the MP4 asset is returned (and billed once) when it succeeds.\n *\n * `response_format: 'url'` (music body, video poll query) returns stored assets with 1 h signed URLs (`assets`)\n * instead of base64 bytes; the default `b64_json` shape is unchanged. Wire types are declared here.\n */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type AssetDto, type MediaResponseFormat, isAssetDto } from './assets';\n\nexport interface MusicRequest {\n /** `codai-music` (default, Lyria 3 Clip), `codai-music-pro` (Lyria 3 Pro) or `codai-music-legacy` (Lyria 2). */\n model?: 'codai-music' | 'codai-music-pro' | 'codai-music-legacy' | (string & {});\n /** Music description (genre, mood, instruments; no artist names). English is most reliable. */\n prompt: string;\n /** Lyrics to sing exactly (Lyria 3, <= 3000 chars). Non-English lyrics are best effort (see `lyrics_match`). */\n lyrics?: string;\n /** Instrumental only, no vocals (Lyria 3). */\n instrumental?: boolean;\n /** Target tempo, 40-220 (Lyria 3). */\n bpm?: number;\n /** Target length 10-184 s; `codai-music-pro` only (`codai-music` is always ~30 s). */\n duration_seconds?: number;\n /** Lyrics language hint, e.g. `ro`. */\n language?: string;\n /** `codai-music-legacy` only (400 for Lyria 3). */\n negative_prompt?: string;\n /** `codai-music-legacy` only (400 for Lyria 3). A seed forces a single clip. */\n seed?: number;\n /** Number of clips, 1-4; more than 1 only with `codai-music-legacy` (ignored when `seed` is set). */\n n?: number;\n /** `b64_json` (default) or `url` — store each clip as an asset and return signed URLs in `assets`. */\n response_format?: MediaResponseFormat;\n}\n\n/** Extra per-item fields returned by the Lyria 3 models (also present on `AssetDto` items). */\nexport interface MusicTrackMeta {\n /** Lyrics as sung, with `[start:end]` timing per line (Lyria 3 only). */\n lyrics?: string | null;\n /** The model's description of the track (may include `bpm` / `duration_secs`). */\n caption?: string | null;\n /** 0..1 match between the supplied `lyrics` and the sung words; `null` when not checked. */\n lyrics_match?: number | null;\n /** e.g. `lyrics_mismatch`, `lyrics_check_unavailable`. */\n warnings?: string[];\n}\n\nexport interface MusicClip extends MusicTrackMeta {\n b64_json: string;\n mime_type: string;\n duration_seconds: number;\n sample_rate?: number;\n}\n\nexport interface MusicResponse {\n created: number;\n model: string;\n /** `MusicClip` items by default; `AssetDto` items with `response_format: 'url'`. */\n data: Array<MusicClip | (AssetDto & MusicTrackMeta)>;\n}\n\nexport interface MusicResult {\n /** Decoded audio bytes (MP3 for Lyria 3, WAV for legacy), one per clip. Empty with `response_format: 'url'`. */\n clips: Uint8Array[];\n /** MIME type of each clip (`audio/mpeg` or `audio/wav`). */\n mimeTypes: string[];\n /** Stored assets with signed URLs (`response_format: 'url'` only; empty otherwise). */\n assets: AssetDto[];\n /** Per-item lyrics / caption / lyrics_match / warnings, in `data` order. */\n tracks: MusicTrackMeta[];\n /** All warnings across items (deduplicated), e.g. `lyrics_mismatch`. */\n warnings: string[];\n raw: MusicResponse;\n /** Upstream model (`x-codai-routed-to`). */\n routedTo: string | null;\n /** Charge in micro-USD (`x-codai-cost-micro-usd`). */\n costMicroUsd: number | null;\n headers: Headers;\n}\n\nexport interface VideoRequest {\n model?: string;\n /** English prompt. */\n prompt: string;\n negative_prompt?: string;\n seconds?: 4 | 6 | 8;\n aspect_ratio?: '16:9' | '9:16';\n resolution?: '720p' | '1080p';\n /** Generate an audio track (default true). */\n audio?: boolean;\n /** Optional first frame (image-to-video); forces 8 s. */\n image?: { b64_json: string; mime_type?: 'image/png' | 'image/jpeg' };\n seed?: number;\n}\n\nexport interface VideoJob {\n id: string;\n object: 'video.job';\n status: 'running';\n model: string;\n seconds: number;\n /** Price of the job in micro-USD (string, bigint-safe). */\n estimated_cost_micro_usd: string;\n}\n\nexport type VideoStatus = 'running' | 'succeeded' | 'failed' | 'filtered';\n\nexport interface VideoJobStatus {\n id: string;\n object: 'video.job';\n status: VideoStatus;\n error?: string;\n model?: string;\n seconds?: number;\n /** Inline MP4 by default; one `AssetDto` when polled with `responseFormat: 'url'`. */\n data?: Array<{ b64_json: string; mime_type: string } | AssetDto>;\n}\n\nexport interface VideoResult {\n /** Decoded MP4 bytes. Empty with `responseFormat: 'url'` (use `asset.url`). */\n video: Uint8Array;\n mimeType: string;\n id: string;\n seconds: number | null;\n /** The stored asset (`responseFormat: 'url'` only). */\n asset: AssetDto | null;\n raw: VideoJobStatus;\n}\n\nexport type RenderAspectRatio = '16:9' | '9:16' | '1:1';\nexport type RenderQuality = 'draft' | 'final';\nexport type RenderStatus = 'queued' | 'rendering' | 'succeeded' | 'failed';\n\nexport interface RenderRequest {\n /** Defaults to `codai-render`. */\n model?: string;\n /**\n * A complete HyperFrames composition (`index.html`, <= 2,000,000 chars). Reference Studio assets as\n * `asset:<asset_id>` in any `src` / `href` / `url(...)` (max 50 distinct assets).\n */\n html: string;\n /** HyperFrames composition variables. */\n variables?: Record<string, unknown>;\n /** Must match the root `data-width` / `data-height` (default `16:9`). */\n aspect_ratio?: RenderAspectRatio;\n /** `final` (default) or `draft` (15 fps, 540p short side, no loudness pass, half price). */\n quality?: RenderQuality;\n /** `final` only (default 30). */\n fps?: 24 | 25 | 30;\n title?: string;\n}\n\nexport interface RenderJob {\n id: string;\n object: 'studio.render';\n status: 'queued';\n model: string;\n quality: RenderQuality;\n aspect_ratio: RenderAspectRatio;\n fps: number;\n /** Micro-USD per output second (string, bigint-safe). */\n price_micro_usd_per_second: string;\n /** Minimum charge in micro-USD (string, bigint-safe). */\n minimum_micro_usd: string;\n}\n\nexport interface RenderQa {\n duration_seconds: number;\n width: number;\n height: number;\n lufs: number | null;\n warnings: Array<'silent_audio' | 'no_audio' | 'lufs_off_target'>;\n}\n\nexport interface RenderJobStatus {\n id: string;\n object: 'studio.render';\n status: RenderStatus;\n /** 0..1 */\n progress: number;\n quality: RenderQuality;\n aspect_ratio: RenderAspectRatio;\n fps: number;\n /** `<code>: <message>` when `failed`. */\n error: string | null;\n qa?: RenderQa | null;\n /** Charge in micro-USD (string), once succeeded. */\n cost_micro_usd?: string | null;\n /** The MP4 as one `AssetDto` (`kind: 'render'`), only when succeeded. */\n data?: AssetDto[];\n /** Signed JPEG poster URL, only when succeeded. */\n poster_url?: string | null;\n}\n\nexport interface RenderResult {\n id: string;\n /** The stored MP4 (1 h signed `url`; refresh with `assets.retrieve(id)`). */\n asset: AssetDto;\n posterUrl: string | null;\n qa: RenderQa | null;\n costMicroUsd: number | null;\n raw: RenderJobStatus;\n}\n\n/** Lyria 3 Pro can take minutes for a long song; the gateway allows 240 s upstream (+ lyrics check). */\nconst MIN_MUSIC_TIMEOUT_MS = 300_000;\n\nfunction decodeBase64(b64: string): Uint8Array {\n const bin = atob(b64);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n}\n\nfunction abortableSleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(signal.reason ?? new Error('Aborted'));\n const t = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(t);\n reject(signal?.reason ?? new Error('Aborted'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nexport class Music {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Generate music (`POST /v1/audio/music`): `codai-music` 30 s clip with vocals, `codai-music-pro` full song up to\n * 184 s, `codai-music-legacy` instrumental Lyria 2. List price $0.04 / $0.08 / $0.06 per call.\n */\n async generate(\n body: MusicRequest,\n opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal } = {},\n ): Promise<MusicResult> {\n const res = await this.http.request('/v1/audio/music', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n // 0 = timeout disabled on the client; otherwise never cap below the music floor.\n timeoutMs:\n this.http.timeoutMs === 0 ? 0 : Math.max(this.http.timeoutMs, MIN_MUSIC_TIMEOUT_MS),\n });\n const raw = (await res.json()) as MusicResponse;\n const cost = res.headers.get('x-codai-cost-micro-usd');\n const data = raw.data ?? [];\n const inline = data.filter((d): d is MusicClip => !isAssetDto(d));\n const tracks = data.map((d): MusicTrackMeta => ({\n lyrics: d.lyrics ?? null,\n caption: d.caption ?? null,\n lyrics_match: d.lyrics_match ?? null,\n warnings: d.warnings ?? [],\n }));\n return {\n clips: inline.map((d) => decodeBase64(d.b64_json)),\n mimeTypes: data.map((d) => d.mime_type ?? 'audio/wav'),\n assets: data.filter(isAssetDto),\n tracks,\n warnings: [...new Set(tracks.flatMap((t) => t.warnings ?? []))],\n raw,\n routedTo: res.headers.get('x-codai-routed-to'),\n costMicroUsd: cost === null ? null : Number(cost),\n headers: res.headers,\n };\n }\n}\n\nexport class Videos {\n constructor(private readonly http: HttpClient) {}\n\n /** Start a video job (`POST /v1/videos`, HTTP 202). Nothing is charged until it succeeds. */\n async create(\n body: VideoRequest,\n opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal } = {},\n ): Promise<VideoJob> {\n const res = await this.http.request('/v1/videos', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n return (await res.json()) as VideoJob;\n }\n\n /**\n * Poll a job (`GET /v1/videos/{id}`). Billed exactly once ($0.10 / s) on the first `succeeded` poll, across gateway\n * instances. `responseFormat: 'url'` returns the stored MP4 as one `AssetDto` (1 h signed URL) instead of base64.\n */\n async retrieve(\n id: string,\n opts: {\n ext?: CodaiRequestExtensions;\n signal?: AbortSignal;\n responseFormat?: MediaResponseFormat;\n } = {},\n ): Promise<VideoJobStatus> {\n const res = await this.http.request(`/v1/videos/${encodeURIComponent(id)}`, {\n method: 'GET',\n query: { response_format: opts.responseFormat },\n ext: opts.ext,\n signal: opts.signal,\n });\n return (await res.json()) as VideoJobStatus;\n }\n\n /** Create a job and poll until it succeeds. Throws on `failed`, `filtered` or timeout. */\n async generate(\n body: VideoRequest,\n opts: {\n pollIntervalMs?: number;\n timeoutMs?: number;\n signal?: AbortSignal;\n ext?: CodaiRequestExtensions;\n /** `url`: the final poll returns the stored asset (`result.asset`) instead of the MP4 bytes. */\n responseFormat?: MediaResponseFormat;\n } = {},\n ): Promise<VideoResult> {\n const { pollIntervalMs = 5000, timeoutMs = 300_000, signal, ext, responseFormat } = opts;\n const job = await this.create(body, { ext, signal });\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n const st = await this.retrieve(job.id, { ext, signal, responseFormat });\n if (st.status === 'succeeded') {\n const d = st.data?.[0];\n if (isAssetDto(d)) {\n return {\n video: new Uint8Array(0),\n mimeType: d.mime_type,\n id: job.id,\n seconds: st.seconds ?? job.seconds ?? null,\n asset: d,\n raw: st,\n };\n }\n if (!d?.b64_json) throw new Error(`codai video job ${job.id} succeeded without video data`);\n return {\n video: decodeBase64(d.b64_json),\n mimeType: d.mime_type ?? 'video/mp4',\n id: job.id,\n seconds: st.seconds ?? job.seconds ?? null,\n asset: null,\n raw: st,\n };\n }\n if (st.status === 'failed' || st.status === 'filtered') {\n throw new Error(`codai video job ${st.status}: ${st.error ?? 'no details'}`);\n }\n if (Date.now() + pollIntervalMs > deadline) {\n throw new Error(`codai video job ${job.id} did not finish within ${timeoutMs} ms`);\n }\n await abortableSleep(pollIntervalMs, signal);\n }\n }\n}\n\nexport class Renders {\n constructor(private readonly http: HttpClient) {}\n\n /** Queue a render (`POST /v1/studio/renders`, HTTP 202). Nothing is charged until it succeeds. */\n async create(\n body: RenderRequest,\n opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal } = {},\n ): Promise<RenderJob> {\n const res = await this.http.request('/v1/studio/renders', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n return (await res.json()) as RenderJob;\n }\n\n /**\n * Poll a render (`GET /v1/studio/renders/{id}`). Billed exactly once (final $0.01 / s, min $0.05; draft half) on the\n * first poll that sees the finished render; failed renders cost nothing.\n */\n async retrieve(\n id: string,\n opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal } = {},\n ): Promise<RenderJobStatus> {\n const res = await this.http.request(`/v1/studio/renders/${encodeURIComponent(id)}`, {\n method: 'GET',\n ext: opts.ext,\n signal: opts.signal,\n });\n return (await res.json()) as RenderJobStatus;\n }\n\n /** Queue a render and poll until it succeeds. Throws on `failed` or timeout. */\n async render(\n body: RenderRequest,\n opts: {\n pollIntervalMs?: number;\n timeoutMs?: number;\n signal?: AbortSignal;\n ext?: CodaiRequestExtensions;\n } = {},\n ): Promise<RenderResult> {\n const { pollIntervalMs = 5000, timeoutMs = 900_000, signal, ext } = opts;\n const job = await this.create(body, { ext, signal });\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n const st = await this.retrieve(job.id, { ext, signal });\n if (st.status === 'succeeded') {\n const asset = st.data?.find(isAssetDto);\n if (!asset) throw new Error(`codai render ${job.id} succeeded without an asset`);\n const cost = st.cost_micro_usd;\n return {\n id: job.id,\n asset,\n posterUrl: st.poster_url ?? null,\n qa: st.qa ?? null,\n costMicroUsd: cost === null || cost === undefined ? null : Number(cost),\n raw: st,\n };\n }\n if (st.status === 'failed') {\n throw new Error(`codai render failed: ${st.error ?? 'no details'}`);\n }\n if (Date.now() + pollIntervalMs > deadline) {\n throw new Error(`codai render ${job.id} did not finish within ${timeoutMs} ms`);\n }\n await abortableSleep(pollIntervalMs, signal);\n }\n }\n}\n","/**\n * codai Studio documents (EU-served, everything runs in europe-west1).\n *\n * `POST /v1/studio/documents` — `codai-docs`: builds a deck (PPTX), doc (DOCX) or sheet (XLSX)\n * synchronously from a JSON `spec` (free; asset `kind: 'document'`).\n * `GET /v1/studio/documents/{id}` — the document, a fresh signed `file.url` and the stored `spec`.\n * `POST /v1/studio/documents/{id}/previews` — `codai-docs-preview`: tagged PDF + page PNGs + contact sheet (HTTP 202).\n * `GET /v1/studio/previews/{id}` — polls the preview; billed once ($0.002 / page, min $0.01) when done.\n * `POST /v1/studio/documents/{id}/video` — deck -> MP4 slideshow, queued as a `codai-render` (HTTP 202); poll it\n * with `renders.retrieve` (narration is billed at POST).\n */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { isAssetDto } from './assets';\nimport { type RenderResult, Renders } from './media';\nimport { type Body, type Mutable, type Reply, type Schema } from './_shared';\n\nexport type DocumentType = 'deck' | 'doc' | 'sheet';\nexport type DocumentTheme = Schema<'DocumentTheme'>;\nexport type DeckSpec = Mutable<Schema<'DeckSpec'>>;\nexport type DocSpec = Mutable<Schema<'DocSpec'>>;\nexport type SheetSpec = Mutable<Schema<'SheetSpec'>>;\nexport type DocumentCreateRequest = Mutable<Body<'createDocument'>>;\n/** `POST` adds `cost_micro_usd` / `preview`; `GET` adds `spec` / `latest_preview_id`. */\nexport type StudioDocument = Reply<'createDocument'>;\nexport type DocumentPreviewRequest = Mutable<Body<'createDocumentPreview'>>;\nexport type DocumentPreviewAccepted = Reply<'createDocumentPreview', 202>;\nexport type DocumentPreview = Reply<'retrievePreview'>;\nexport type DocumentPreviewStatus = DocumentPreview['status'];\nexport type DocumentVideoRequest = Mutable<Body<'createDocumentVideo'>>;\nexport type DocumentVideoAccepted = Reply<'createDocumentVideo', 202>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\nexport interface DocumentPollOptions extends CallOpts {\n /** Delay between polls (default 3000 ms for previews, 5000 ms for videos). */\n pollIntervalMs?: number;\n /** Give up after this long (default 300 000 ms for previews, 900 000 ms for videos). */\n timeoutMs?: number;\n}\n\nfunction abortableSleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(signal.reason ?? new Error('Aborted'));\n const t = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(t);\n reject(signal?.reason ?? new Error('Aborted'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nexport class Documents {\n private readonly renders: Renders;\n\n constructor(private readonly http: HttpClient) {\n this.renders = new Renders(http);\n }\n\n /**\n * Build a document (`POST /v1/studio/documents`). `spec` must match `type` (`deck` -> `DeckSpec`, `doc` -> `DocSpec`,\n * `sheet` -> `SheetSpec`); invalid specs are 400 `invalid_spec`. Files are free. `based_on` creates the next version\n * of one of your documents; `preview: true` also queues a (billed) preview, returned as `preview`.\n */\n create(body: DocumentCreateRequest, opts: CallOpts = {}): Promise<StudioDocument> {\n return this.http.json<StudioDocument>('/v1/studio/documents', {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n }\n\n /** `GET /v1/studio/documents/{id}` — fresh 1 h signed `file.url`, the stored `spec` and `latest_preview_id`. */\n retrieve(id: string, opts: CallOpts = {}): Promise<StudioDocument> {\n return this.http.json<StudioDocument>(`/v1/studio/documents/${encodeURIComponent(id)}`, {\n method: 'GET',\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /**\n * Queue a preview (`POST /v1/studio/documents/{id}/previews`, HTTP 202): tagged PDF, page PNGs (1280 px) and a\n * contact sheet. Billed once on the first poll that sees the result; at most 3 active previews per user (429).\n */\n preview(\n id: string,\n body: DocumentPreviewRequest = {},\n opts: CallOpts = {},\n ): Promise<DocumentPreviewAccepted> {\n return this.http.json<DocumentPreviewAccepted>(\n `/v1/studio/documents/${encodeURIComponent(id)}/previews`,\n { method: 'POST', body, ext: opts.ext, signal: opts.signal, noRetry: true },\n );\n }\n\n /** Poll a preview (`GET /v1/studio/previews/{id}`): `queued` | `rendering` | `succeeded` | `failed`. */\n retrievePreview(previewId: string, opts: CallOpts = {}): Promise<DocumentPreview> {\n return this.http.json<DocumentPreview>(`/v1/studio/previews/${encodeURIComponent(previewId)}`, {\n method: 'GET',\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /**\n * Turn a deck into an MP4 (`POST /v1/studio/documents/{id}/video`, HTTP 202). Returns a render: poll it with\n * `renders.retrieve(id)` or use `videoAndWait`. Narration (`narrate`) is synthesized and billed now.\n */\n video(\n id: string,\n body: DocumentVideoRequest = {},\n opts: CallOpts = {},\n ): Promise<DocumentVideoAccepted> {\n return this.http.json<DocumentVideoAccepted>(\n `/v1/studio/documents/${encodeURIComponent(id)}/video`,\n { method: 'POST', body, ext: opts.ext, signal: opts.signal, noRetry: true },\n );\n }\n\n /** Queue a preview and poll until it succeeds. Throws on `failed` or timeout. */\n async createPreviewAndWait(\n id: string,\n opts: DocumentPollOptions & { body?: DocumentPreviewRequest } = {},\n ): Promise<DocumentPreview> {\n const { pollIntervalMs = 3000, timeoutMs = 300_000, signal, ext, body } = opts;\n const job = await this.preview(id, body ?? {}, { ext, signal });\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n const st = await this.retrievePreview(job.id, { ext, signal });\n if (st.status === 'succeeded') return st;\n if (st.status === 'failed') {\n throw new Error(`codai document preview failed: ${st.error ?? 'no details'}`);\n }\n if (Date.now() + pollIntervalMs > deadline) {\n throw new Error(`codai document preview ${job.id} did not finish within ${timeoutMs} ms`);\n }\n await abortableSleep(pollIntervalMs, signal);\n }\n }\n\n /** Queue a deck video and poll `renders.retrieve` until it succeeds. Throws on `failed` or timeout. */\n async videoAndWait(\n id: string,\n body: DocumentVideoRequest = {},\n opts: DocumentPollOptions = {},\n ): Promise<RenderResult & { accepted: DocumentVideoAccepted }> {\n const { pollIntervalMs = 5000, timeoutMs = 900_000, signal, ext } = opts;\n const accepted = await this.video(id, body, { ext, signal });\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n const st = await this.renders.retrieve(accepted.id, { ext, signal });\n if (st.status === 'succeeded') {\n const asset = st.data?.find(isAssetDto);\n if (!asset) throw new Error(`codai render ${accepted.id} succeeded without an asset`);\n const cost = st.cost_micro_usd;\n return {\n id: accepted.id,\n asset,\n posterUrl: st.poster_url ?? null,\n qa: st.qa ?? null,\n costMicroUsd: cost === null || cost === undefined ? null : Number(cost),\n raw: st,\n accepted,\n };\n }\n if (st.status === 'failed') {\n throw new Error(`codai deck video failed: ${st.error ?? 'no details'}`);\n }\n if (Date.now() + pollIntervalMs > deadline) {\n throw new Error(`codai deck video ${accepted.id} did not finish within ${timeoutMs} ms`);\n }\n await abortableSleep(pollIntervalMs, signal);\n }\n }\n}\n","/** `POST /v1/messages` — Anthropic Messages wire (JSON + named-event SSE). */\nimport { type CodaiRequestExtensions, frameJson, type HttpClient, readSse } from '../http';\nimport { type Body, type Mutable, type Reply } from './_shared';\n\nexport type MessageRequest = Mutable<Body<'createMessage'>>;\nexport type MessageResponse = Reply<'createMessage'>;\n/** Request body as accepted by the SDK: `stream` is set by the method and `model` defaults to `codai`. */\nexport type MessageInput = Omit<MessageRequest, 'stream' | 'model'> & { model?: string };\n\nexport interface MessageCallOptions {\n ext?: CodaiRequestExtensions;\n signal?: AbortSignal;\n}\n\nexport interface MessageResult {\n /** Concatenated `text` blocks of the reply. */\n text: string;\n raw: MessageResponse;\n requestId: string | null;\n routedTo: string | null;\n headers: Headers;\n}\n\n/** One Anthropic streaming event: `event.type` mirrors the SSE `event:` name. */\nexport interface MessageStreamEvent {\n type:\n | 'message_start'\n | 'content_block_start'\n | 'content_block_delta'\n | 'content_block_stop'\n | 'message_delta'\n | 'message_stop'\n | 'ping'\n | 'error'\n | (string & {});\n [key: string]: unknown;\n}\n\nexport interface MessageStreamResult {\n /** Concatenated `text_delta` payloads. */\n text: string;\n /** Final `stop_reason` from `message_delta`, when sent. */\n stopReason: string | null;\n /** Cumulative usage: `input_tokens` from `message_start`, `output_tokens` from `message_delta`. */\n usage: { inputTokens: number; outputTokens: number } | null;\n requestId: string | null;\n routedTo: string | null;\n headers: Headers | null;\n}\n\nexport interface MessageStream extends AsyncIterable<MessageStreamEvent> {\n readonly final: Promise<MessageStreamResult>;\n /** Text deltas only. */\n text(): AsyncIterable<string>;\n}\n\nexport class Messages {\n constructor(private readonly http: HttpClient) {}\n\n async create(body: MessageInput, opts: MessageCallOptions = {}): Promise<MessageResult> {\n const res = await this.http.request('/v1/messages', {\n body: { ...body, model: body.model ?? 'codai', stream: false },\n ext: opts.ext,\n signal: opts.signal,\n });\n const raw = (await res.json()) as MessageResponse;\n const text = (raw.content ?? [])\n .map((b) => (b.type === 'text' && typeof b.text === 'string' ? b.text : ''))\n .join('');\n return {\n text,\n raw,\n requestId: res.headers.get('x-codai-trace-id') ?? res.headers.get('x-request-id'),\n routedTo: res.headers.get('x-codai-routed-to'),\n headers: res.headers,\n };\n }\n\n stream(body: MessageInput, opts: MessageCallOptions = {}): MessageStream {\n const requestPromise = this.http.request('/v1/messages', {\n body: { ...body, model: body.model ?? 'codai', stream: true },\n ext: opts.ext,\n signal: opts.signal,\n timeoutMs: 0,\n noRetry: true,\n });\n\n let resolveFinal!: (r: MessageStreamResult) => void;\n let rejectFinal!: (e: unknown) => void;\n const final = new Promise<MessageStreamResult>((resolve, reject) => {\n resolveFinal = resolve;\n rejectFinal = reject;\n });\n final.catch(() => {});\n\n let text = '';\n let stopReason: string | null = null;\n let inputTokens: number | null = null;\n let outputTokens: number | null = null;\n let res: Response | null = null;\n\n async function* events(): AsyncGenerator<MessageStreamEvent, void, undefined> {\n try {\n res = await requestPromise;\n for await (const frame of readSse(res, opts.signal)) {\n const ev = frameJson<MessageStreamEvent>(frame);\n if (!ev) continue;\n if (typeof ev.type !== 'string') ev.type = frame.event;\n if (ev.type === 'message_start') {\n const usage = (ev.message as { usage?: { input_tokens?: number } } | undefined)?.usage;\n if (usage?.input_tokens !== undefined) inputTokens = usage.input_tokens;\n } else if (ev.type === 'content_block_delta') {\n const delta = ev.delta as { type?: string; text?: string } | undefined;\n if (delta?.type === 'text_delta' && typeof delta.text === 'string') text += delta.text;\n } else if (ev.type === 'message_delta') {\n const delta = ev.delta as { stop_reason?: string | null } | undefined;\n if (delta?.stop_reason) stopReason = delta.stop_reason;\n const usage = ev.usage as { output_tokens?: number } | undefined;\n if (usage?.output_tokens !== undefined) outputTokens = usage.output_tokens;\n }\n yield ev;\n if (ev.type === 'message_stop') break;\n }\n resolveFinal({\n text,\n stopReason,\n usage:\n inputTokens !== null || outputTokens !== null\n ? { inputTokens: inputTokens ?? 0, outputTokens: outputTokens ?? 0 }\n : null,\n requestId: res.headers.get('x-codai-trace-id') ?? res.headers.get('x-request-id') ?? null,\n routedTo: res.headers.get('x-codai-routed-to'),\n headers: res.headers,\n });\n } catch (err) {\n rejectFinal(err);\n throw err;\n }\n }\n\n async function* textOnly(): AsyncGenerator<string, void, undefined> {\n for await (const ev of events()) {\n if (ev.type !== 'content_block_delta') continue;\n const delta = ev.delta as { type?: string; text?: string } | undefined;\n if (delta?.type === 'text_delta' && delta.text) yield delta.text;\n }\n }\n\n return {\n [Symbol.asyncIterator]: () => events(),\n text: () => ({ [Symbol.asyncIterator]: () => textOnly() }),\n final,\n };\n }\n}\n","/** `GET /v1/models`. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Reply, type Schema } from './_shared';\n\nexport type Model = Schema<'CoreModel'>;\nexport type ModelList = Reply<'listModels'>;\n\nexport class Models {\n constructor(private readonly http: HttpClient) {}\n\n /** Every model the calling key may address (OpenAI list shape, `data[]`). */\n async list(opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal } = {}): Promise<Model[]> {\n const raw = await this.http.json<ModelList>('/v1/models', {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.data ?? [])];\n }\n}\n","/** `/v1/orgs/*` — the orgs (teams) you belong to and their members. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply, type Schema } from './_shared';\n\nexport type Org = Schema<'OrgWithRole'>;\nexport type OrgMember = Schema<'OrgMember'>;\nexport type OrgRole = Schema<'OrgRole'>;\nexport type OrgAddMemberBody = Mutable<Body<'addOrgMember'>>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nexport class OrgMembers {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/orgs/{id}/members` */\n async list(orgId: string, opts: CallOpts = {}): Promise<OrgMember[]> {\n const raw = await this.http.json<Reply<'listOrgMembers'>>(\n `/v1/orgs/${encodeURIComponent(orgId)}/members`,\n { ext: opts.ext, signal: opts.signal },\n );\n return [...(raw.members ?? [])];\n }\n\n /** `POST /v1/orgs/{id}/members` — add or re-role (owner/admin). */\n add(\n orgId: string,\n body: OrgAddMemberBody,\n opts: CallOpts = {},\n ): Promise<Reply<'addOrgMember', 201>> {\n return this.http.json<Reply<'addOrgMember', 201>>(\n `/v1/orgs/${encodeURIComponent(orgId)}/members`,\n { body, ext: opts.ext, signal: opts.signal },\n );\n }\n\n /** `DELETE /v1/orgs/{id}/members/{userId}` */\n remove(orgId: string, userId: string, opts: CallOpts = {}): Promise<Reply<'removeOrgMember'>> {\n return this.http.json<Reply<'removeOrgMember'>>(\n `/v1/orgs/${encodeURIComponent(orgId)}/members/${encodeURIComponent(userId)}`,\n { method: 'DELETE', ext: opts.ext, signal: opts.signal },\n );\n }\n}\n\nexport class Orgs {\n readonly members: OrgMembers;\n constructor(private readonly http: HttpClient) {\n this.members = new OrgMembers(http);\n }\n\n /** `POST /v1/orgs` */\n create(name: string, opts: CallOpts = {}): Promise<Org> {\n return this.http.json<Org>('/v1/orgs', { body: { name }, ext: opts.ext, signal: opts.signal });\n }\n\n /** `GET /v1/orgs` */\n async list(opts: CallOpts = {}): Promise<Org[]> {\n const raw = await this.http.json<Reply<'listOrgs'>>('/v1/orgs', {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.orgs ?? [])];\n }\n}\n","/** `/v1/projects/*` — projects (a repo + isolation policy) that group environments. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply, type Schema } from './_shared';\n\nexport type Project = Schema<'Project'>;\nexport type ProjectIsolation = Schema<'ProjectIsolation'>;\nexport type ProjectCreateBody = Mutable<Body<'createProject'>>;\nexport type ProjectPatchBody = Mutable<Body<'updateProject'>>;\nexport type ProjectDetail = Reply<'getProject'>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nexport class Projects {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/projects` — projects you own plus those of your orgs, newest first. */\n async list(opts: CallOpts = {}): Promise<Project[]> {\n const raw = await this.http.json<Reply<'listProjects'>>('/v1/projects', {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.projects ?? [])];\n }\n\n /** `POST /v1/projects` — 409 `slug_taken` when the slug is already yours. */\n async create(body: ProjectCreateBody, opts: CallOpts = {}): Promise<Project> {\n const raw = await this.http.json<Reply<'createProject', 201>>('/v1/projects', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n return raw.project;\n }\n\n /** `GET /v1/projects/{id}` — the project plus every environment in it. */\n get(projectId: string, opts: CallOpts = {}): Promise<ProjectDetail> {\n return this.http.json<ProjectDetail>(`/v1/projects/${encodeURIComponent(projectId)}`, {\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `PATCH /v1/projects/{id}` — owner or org owner/admin; the slug cannot change. */\n async update(projectId: string, body: ProjectPatchBody, opts: CallOpts = {}): Promise<Project> {\n const raw = await this.http.json<Reply<'updateProject'>>(\n `/v1/projects/${encodeURIComponent(projectId)}`,\n { method: 'PATCH', body, ext: opts.ext, signal: opts.signal },\n );\n return raw.project;\n }\n\n /** `DELETE /v1/projects/{id}` — 409 `project_has_environments` until all are destroyed. */\n delete(projectId: string, opts: CallOpts = {}): Promise<Reply<'deleteProject'>> {\n return this.http.json<Reply<'deleteProject'>>(`/v1/projects/${encodeURIComponent(projectId)}`, {\n method: 'DELETE',\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n","/**\n * `wss://…/v1/realtime` — dependency-free realtime client (live transcription and the OpenAI\n * Realtime protocol lanes). Not an OpenAPI operation (OpenAPI cannot describe WebSockets), so it is\n * outside the `OPERATION_METHODS` parity table.\n *\n * const live = codai.realtime.connect({ model: 'codai-transcribe-live', language: 'ro', token });\n * live.appendAudio(pcm16At24kHz); // Int16Array | ArrayBuffer | Uint8Array\n * for await (const ev of live) {\n * if (ev.type === 'conversation.item.input_audio_transcription.delta') draw(ev.delta);\n * }\n *\n * Uses the global `WebSocket` (browsers, Node ≥ 22, Deno, Bun) or an injected constructor.\n * - Browser path: pass an ephemeral `token` (scope `realtime` or `live`); it travels as `?key=`.\n * Raw `codai_` keys in the query string are refused by the gateway (close 4401).\n * - Server path: pass `apiKey` (or a token) with a WebSocket constructor that accepts headers\n * (e.g. `ws`); it is sent as `Authorization: Bearer` on the upgrade.\n */\n\n/** Minimal WebSocket surface (browser `WebSocket`, Node 22 global, or the `ws` package). */\nexport interface RealtimeSocket {\n readonly readyState: number;\n binaryType?: string;\n send(data: string | ArrayBuffer | ArrayBufferView): void;\n close(code?: number, reason?: string): void;\n onopen: ((ev: unknown) => void) | null;\n onmessage: ((ev: { data: unknown }) => void) | null;\n onclose: ((ev: { code: number; reason: string }) => void) | null;\n onerror: ((ev: unknown) => void) | null;\n}\n\n/** `new (url, protocols?, options?)` — the third argument is used for headers by `ws`. */\nexport type RealtimeSocketCtor = new (\n url: string,\n protocols?: string | string[],\n options?: { headers?: Record<string, string> },\n) => RealtimeSocket;\n\nexport type RealtimeModel =\n 'codai-transcribe-live' | 'codai-realtime' | 'codai-voice' | (string & Record<never, never>);\n\nexport interface RealtimeConnectOptions {\n /** Default `codai-transcribe-live`. */\n model?: RealtimeModel;\n /** Language hint (`ro`, `en`, …). `ro` uses the Deepgram Nova-3 lane when the gateway has it. */\n language?: string;\n /** Ephemeral token (scope `realtime` or `live`) — sent as `?key=`. Required in browsers. */\n token?: string;\n /** Raw API key — sent as `Authorization: Bearer` (needs a ctor that supports headers). */\n apiKey?: string;\n /** Conversation id recorded on the usage row (`?session_id=`). */\n sessionId?: string;\n /**\n * First frame sent on open. Default for `codai-transcribe-live`: a transcription\n * `session.update` (PCM 24 kHz, `language` when set). Pass `null` to send nothing.\n */\n sessionUpdate?: Record<string, unknown> | null;\n /** Injectable WebSocket constructor (tests, `ws` on older Node). Defaults to `globalThis.WebSocket`. */\n WebSocket?: RealtimeSocketCtor;\n /** Override the gateway base URL (default: the client's `baseUrl`). */\n baseUrl?: string;\n}\n\n/** Typed subset of server events; anything else arrives as `RealtimeUnknownEvent`. */\nexport type RealtimeEvent =\n | {\n type: 'session.created' | 'session.updated';\n session?: Record<string, unknown>;\n event_id?: string;\n }\n | {\n type: 'conversation.item.input_audio_transcription.delta';\n item_id: string;\n content_index?: number;\n delta: string;\n event_id?: string;\n }\n | {\n type: 'conversation.item.input_audio_transcription.completed';\n item_id: string;\n content_index?: number;\n transcript: string;\n event_id?: string;\n }\n | { type: 'input_audio_buffer.committed'; item_id?: string; previous_item_id?: string | null }\n | { type: 'input_audio_buffer.cleared' }\n | { type: 'error'; error: { type?: string; code?: string; message?: string } }\n /** Emitted by the client itself when the socket closes (always the last event). */\n | { type: 'close'; code: number; reason: string };\nexport type RealtimeUnknownEvent = { type: string; [k: string]: unknown };\nexport type RealtimeAnyEvent = RealtimeEvent | RealtimeUnknownEvent;\n\ntype Listener = (ev: RealtimeAnyEvent) => void;\n\nconst OPEN = 1;\n\nfunction toBytes(audio: Int16Array | ArrayBuffer | Uint8Array): Uint8Array {\n if (audio instanceof ArrayBuffer) return new Uint8Array(audio);\n return new Uint8Array(audio.buffer, audio.byteOffset, audio.byteLength);\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n let bin = '';\n const CHUNK = 0x8000;\n for (let i = 0; i < bytes.length; i += CHUNK) {\n bin += String.fromCharCode(...bytes.subarray(i, i + CHUNK));\n }\n return btoa(bin);\n}\n\n/** A live realtime session: async-iterable of events + `on()` listeners. */\nexport class RealtimeSession implements AsyncIterable<RealtimeAnyEvent> {\n private readonly listeners = new Map<string, Set<Listener>>();\n private readonly queue: RealtimeAnyEvent[] = [];\n private readonly waiters: Array<(r: IteratorResult<RealtimeAnyEvent>) => void> = [];\n private readonly outbox: string[] = [];\n private closed = false;\n /** Resolves when the socket is open (rejects if it closes first). */\n readonly ready: Promise<void>;\n\n constructor(\n readonly socket: RealtimeSocket,\n firstFrame: Record<string, unknown> | null,\n ) {\n let resolveReady!: () => void;\n let rejectReady!: (e: Error) => void;\n this.ready = new Promise<void>((res, rej) => {\n resolveReady = res;\n rejectReady = rej;\n });\n // Unhandled-rejection safety: callers that never await `ready` still get the `close` event.\n this.ready.catch(() => undefined);\n socket.onopen = () => {\n if (firstFrame) socket.send(JSON.stringify(firstFrame));\n for (const f of this.outbox.splice(0)) socket.send(f);\n resolveReady();\n };\n socket.onmessage = (ev) => {\n if (typeof ev.data !== 'string') return;\n let parsed: unknown;\n try {\n parsed = JSON.parse(ev.data);\n } catch {\n return;\n }\n if (\n parsed &&\n typeof parsed === 'object' &&\n typeof (parsed as { type?: unknown }).type === 'string'\n ) {\n this.emit(parsed as RealtimeAnyEvent);\n }\n };\n socket.onerror = () => {\n /* the close event carries the code */\n };\n socket.onclose = (ev) => {\n rejectReady(\n new Error(`realtime socket closed before open (${String(ev.code)} ${ev.reason})`),\n );\n this.emit({ type: 'close', code: ev.code, reason: ev.reason });\n this.closed = true;\n for (const w of this.waiters.splice(0)) w({ value: undefined, done: true });\n };\n }\n\n /** Listen for one event type (`'*'` = every event). Returns an unsubscribe function. */\n on(type: string, fn: Listener): () => void {\n let set = this.listeners.get(type);\n if (!set) this.listeners.set(type, (set = new Set()));\n set.add(fn);\n return () => set.delete(fn);\n }\n\n /** Send any client event (JSON). Queued until the socket opens. */\n send(event: Record<string, unknown>): void {\n if (this.closed) throw new Error('realtime session is closed');\n const frame = JSON.stringify(event);\n if (this.socket.readyState === OPEN) this.socket.send(frame);\n else this.outbox.push(frame);\n }\n\n /** Append PCM16 little-endian mono audio (24 kHz for `codai-transcribe-live`). */\n appendAudio(audio: Int16Array | ArrayBuffer | Uint8Array): void {\n const bytes = toBytes(audio);\n if (bytes.byteLength === 0) return;\n this.send({ type: 'input_audio_buffer.append', audio: bytesToBase64(bytes) });\n }\n\n /** Close the current utterance: the server answers with one `...transcription.completed`. */\n commit(): void {\n this.send({ type: 'input_audio_buffer.commit' });\n }\n\n /** Drop audio the server holds for the current utterance. */\n clear(): void {\n this.send({ type: 'input_audio_buffer.clear' });\n }\n\n close(code = 1000, reason = 'client closed'): void {\n if (this.closed) return;\n this.socket.close(code, reason);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<RealtimeAnyEvent> {\n return {\n next: () => {\n const ev = this.queue.shift();\n if (ev) return Promise.resolve({ value: ev, done: false });\n if (this.closed) return Promise.resolve({ value: undefined, done: true });\n return new Promise((resolve) => this.waiters.push(resolve));\n },\n return: () => {\n this.close();\n return Promise.resolve({ value: undefined, done: true });\n },\n };\n }\n\n private emit(ev: RealtimeAnyEvent): void {\n for (const fn of this.listeners.get(ev.type) ?? []) fn(ev);\n for (const fn of this.listeners.get('*') ?? []) fn(ev);\n const w = this.waiters.shift();\n if (w) w({ value: ev, done: false });\n else this.queue.push(ev);\n }\n}\n\n/** Build the `wss://…/v1/realtime?…` URL (exported for tests and custom transports). */\nexport function realtimeUrl(baseUrl: string, opts: RealtimeConnectOptions): string {\n const url = new URL(`${baseUrl.replace(/\\/$/, '').replace(/^http/, 'ws')}/v1/realtime`);\n url.searchParams.set('model', opts.model ?? 'codai-transcribe-live');\n if (opts.language) url.searchParams.set('language', opts.language);\n if (opts.sessionId) url.searchParams.set('session_id', opts.sessionId);\n if (opts.token) url.searchParams.set('key', opts.token);\n return url.toString();\n}\n\nexport class Realtime {\n constructor(private readonly defaults: { baseUrl: string; apiKey?: string }) {}\n\n /** Open a realtime session. Returns immediately; `await session.ready` to wait for the socket. */\n connect(opts: RealtimeConnectOptions = {}): RealtimeSession {\n const Ctor = opts.WebSocket ?? (globalThis as { WebSocket?: RealtimeSocketCtor }).WebSocket;\n if (!Ctor) throw new Error('codai.realtime: no WebSocket available — pass options.WebSocket');\n const model = opts.model ?? 'codai-transcribe-live';\n let token = opts.token;\n let apiKey = token ? undefined : (opts.apiKey ?? this.defaults.apiKey);\n // A client constructed with an ephemeral token uses it the browser way (`?key=`).\n if (apiKey?.startsWith('codai_eph_v1.')) {\n token = apiKey;\n apiKey = undefined;\n }\n if (!token && !apiKey) throw new Error('codai.realtime: pass `token` (browser) or `apiKey`');\n const url = realtimeUrl(opts.baseUrl ?? this.defaults.baseUrl, { ...opts, model, token });\n const socket = apiKey\n ? new Ctor(url, undefined, { headers: { Authorization: `Bearer ${apiKey}` } })\n : new Ctor(url);\n if ('binaryType' in socket) socket.binaryType = 'arraybuffer';\n const first =\n opts.sessionUpdate !== undefined\n ? opts.sessionUpdate\n : model === 'codai-transcribe-live'\n ? {\n type: 'session.update',\n session: {\n type: 'transcription',\n audio: {\n input: {\n format: { type: 'audio/pcm', rate: 24000 },\n transcription: {\n model,\n ...(opts.language ? { language: opts.language } : {}),\n },\n },\n },\n },\n }\n : null;\n return new RealtimeSession(socket, first);\n }\n}\n","/**\n * codai Resolve — execution-verified bug fixes, no fix no fee\n * (`https://resolve.codai.ro`, spec `apps/docs/openapi/en/resolve.yaml`).\n *\n * Resolve is a separate service from the gateway: it has its own host and a\n * flat `{ error: string }` error shape, so it gets its own `HttpClient` and\n * maps failures to `ResolveError` / `ResolveInsufficientFundsError`.\n */\nimport type { components } from '../generated/resolve';\nimport { CodaiError, type HttpClient, type RequestOptions } from '../http';\nimport { type Mutable } from './_shared';\n\ntype ResolveSchemas = components['schemas'];\n\nexport type ResolveIntake = Mutable<ResolveSchemas['ResolveIntake']>;\nexport type ResolveQuote = ResolveSchemas['ResolveQuote'];\nexport type ResolveDeclined = ResolveSchemas['ResolveDeclined'];\n/** `submit()` result: `201` quote / free-tier auto-accept, or `200` decline. */\nexport type ResolveSubmitResult = ResolveQuote | ResolveDeclined;\nexport type ResolveAccepted = ResolveSchemas['ResolveAccepted'];\n/** How an accepted job is paid: `free` > `intro` (€1) > `credit` (t7 fix credit) > `wallet`. */\nexport type ResolvePaidWith = ResolveSchemas['ResolvePaidWith'];\n/** `GET /v1/resolve/balance` — fix credits, intro availability, wallet (EUR micros). */\nexport type ResolveBalance = ResolveSchemas['ResolveBalance'];\nexport type ResolveJob = ResolveSchemas['ResolveJob'];\nexport type ResolveJobStatus = ResolveSchemas['ResolveJobStatus'];\nexport type ResolveTier = ResolveSchemas['ResolveTier'];\nexport type ResolveAttestation = ResolveSchemas['ResolveAttestation'];\n/** DSSE v1 envelope in `ResolveAttestation.signature` (`null` = unsigned, pre-2026-09-27). */\nexport type ResolveAttestationEnvelope = ResolveSchemas['ResolveAttestationEnvelope'];\nexport type ResolveKeys = ResolveSchemas['ResolveKeys'];\nexport type ResolveKey = ResolveSchemas['ResolveKey'];\nexport type ResolveReproTest = ResolveSchemas['ResolveReproTest'];\nexport type ResolveHealth = ResolveSchemas['ResolveHealth'];\nexport type ResolveValidationDetails = ResolveSchemas['ResolveValidationDetails'];\nexport type ResolveInsufficientFunds = ResolveSchemas['ResolveInsufficientFunds'];\n/** Body POSTed to `callback_url` (verify with `verifyResolveWebhook` first). */\nexport type ResolveWebhookEvent = ResolveSchemas['ResolveWebhookEvent'];\nexport type ResolveWebhookEventName = ResolveSchemas['ResolveWebhookEventName'];\nexport type ResolveWebhookJob = ResolveSchemas['ResolveWebhookJob'];\n\nexport interface VerifyResolveWebhookOptions {\n /** Maximum age (and future skew) of `t`, in seconds. Default 300. */\n toleranceSeconds?: number;\n /** Current unix time in seconds (tests). Default `Date.now() / 1000`. */\n nowSeconds?: number;\n}\n\n/**\n * Verify a Resolve webhook delivery: `x-codai-signature: t=<unix>,v1=<hex>`\n * with `v1 = HMAC-SHA256(callback_secret, \"<t>.<rawBody>\")`. Pass the RAW\n * request body (before JSON parsing). Constant-time compare; rejects a\n * timestamp outside `toleranceSeconds`. Returns `false` for any bad input.\n *\n * Server-side only: uses `node:crypto` (Node 20.16+/22.3+, Bun, Deno), loaded\n * lazily so the rest of the SDK still bundles for browsers and edge runtimes.\n * Throws only when `node:crypto` is unavailable in the current runtime.\n */\nexport function verifyResolveWebhook(\n secret: string,\n rawBody: string | Uint8Array,\n signatureHeader: string | null | undefined,\n opts: VerifyResolveWebhookOptions = {},\n): boolean {\n if (!secret || !signatureHeader) return false;\n let t: string | undefined;\n const v1s: string[] = [];\n for (const part of signatureHeader.split(',')) {\n const eq = part.indexOf('=');\n if (eq === -1) continue;\n const k = part.slice(0, eq).trim();\n const v = part.slice(eq + 1).trim();\n if (k === 't') t = v;\n else if (k === 'v1') v1s.push(v.toLowerCase());\n }\n if (!t || !/^\\d+$/.test(t) || v1s.length === 0) return false;\n const tolerance = opts.toleranceSeconds ?? 300;\n const now = opts.nowSeconds ?? Math.floor(Date.now() / 1000);\n if (Math.abs(now - Number(t)) > tolerance) return false;\n const { createHmac, timingSafeEqual } = nodeCrypto();\n const enc = new TextEncoder();\n const body = typeof rawBody === 'string' ? enc.encode(rawBody) : rawBody;\n const expected = createHmac('sha256', secret)\n .update(enc.encode(`${t}.`))\n .update(body)\n .digest();\n return v1s.some((v1) => {\n if (!/^[0-9a-f]{64}$/.test(v1)) return false;\n return timingSafeEqual(hexToBytes(v1), expected);\n });\n}\n\ntype NodeCrypto = {\n createHmac(\n alg: string,\n key: string,\n ): { update(d: Uint8Array): { update(d: Uint8Array): { digest(): Uint8Array } } };\n timingSafeEqual(a: Uint8Array, b: Uint8Array): boolean;\n};\n\nfunction nodeCrypto(): NodeCrypto {\n const proc = (globalThis as { process?: { getBuiltinModule?: (id: string) => unknown } }).process;\n const mod = proc?.getBuiltinModule?.('node:crypto') as NodeCrypto | undefined;\n if (!mod) {\n throw new Error(\n 'verifyResolveWebhook needs node:crypto (Node 20.16+/22.3+, Bun or Deno); run it server-side',\n );\n }\n return mod;\n}\n\nfunction hexToBytes(hex: string): Uint8Array {\n const out = new Uint8Array(hex.length / 2);\n for (let i = 0; i < out.length; i++) out[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n return out;\n}\n\n/** `payloadType` of Resolve attestation envelopes. */\nexport const RESOLVE_ATTESTATION_PAYLOAD_TYPE =\n 'application/vnd.codai.resolve.attestation+json;v=1';\n\nexport type ResolveAttestationVerifyResult =\n | { ok: true; keyid: string }\n | { ok: false; reason: 'UNSIGNED' | 'BAD_SIGNATURE' | 'STATEMENT_MISMATCH' | 'BAD_PAYLOAD_TYPE' };\n\ntype VerifyCrypto = {\n createHash(alg: string): { update(d: Uint8Array): { digest(enc: 'hex'): string } };\n createVerify(alg: string): {\n update(d: Uint8Array): void;\n verify(key: { key: string; dsaEncoding: 'der' }, sig: Uint8Array): boolean;\n };\n};\n\nfunction verifyCrypto(): VerifyCrypto {\n const proc = (globalThis as { process?: { getBuiltinModule?: (id: string) => unknown } }).process;\n const mod = proc?.getBuiltinModule?.('node:crypto') as VerifyCrypto | undefined;\n if (!mod) {\n throw new Error(\n 'verifyAttestation needs node:crypto (Node 20.16+/22.3+, Bun or Deno); run it server-side',\n );\n }\n return mod;\n}\n\n/** RFC 8785 (JCS) for the JSON subset a statement uses: sorted keys, no whitespace. */\nfunction canonicalJson(v: unknown): string {\n if (v === null || typeof v !== 'object') return JSON.stringify(v);\n if (Array.isArray(v)) return `[${v.map(canonicalJson).join(',')}]`;\n const o = v as Record<string, unknown>;\n return `{${Object.keys(o)\n .filter((k) => o[k] !== undefined)\n .sort()\n .map((k) => `${JSON.stringify(k)}:${canonicalJson(o[k])}`)\n .join(',')}}`;\n}\n\nfunction base64ToBytes(b64: string): Uint8Array {\n const bin = atob(b64);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n}\n\n/** DSSE v1 PAE: `\"DSSEv1\" SP len(type) SP type SP len(body) SP body` (byte lengths). */\nfunction pae(payloadType: string, body: Uint8Array): Uint8Array {\n const enc = new TextEncoder();\n const typeBytes = enc.encode(payloadType);\n const head = enc.encode(`DSSEv1 ${typeBytes.length} ${payloadType} ${body.length} `);\n const out = new Uint8Array(head.length + body.length);\n out.set(head, 0);\n out.set(body, head.length);\n return out;\n}\n\n/** The statement the Resolve service signs, recomputed from the attestation JSON. */\nexport function resolveAttestationStatement(att: ResolveAttestation): Record<string, unknown> {\n const { createHash } = verifyCrypto();\n const enc = new TextEncoder();\n const sha = (s: string | null | undefined) =>\n s == null ? null : createHash('sha256').update(enc.encode(s)).digest('hex');\n return {\n kind: 'codai.resolve.attestation.v1',\n attestation_id: att.id,\n repo_url: att.repo_url,\n base_commit: att.base_commit,\n patch_sha256: sha(att.patch),\n repro_test: att.repro_test?.path\n ? { path: att.repro_test.path, sha256: sha(att.repro_test.content) }\n : null,\n test_command: att.test_command,\n regression_command: att.regression_command,\n test_output_before_sha256: sha(att.test_output_before),\n test_output_after_sha256: sha(att.test_output_after),\n regression_output_sha256: sha(att.regression_output),\n runner_image_digest: att.runner_image_digest,\n started_at: att.started_at,\n verified_at: att.verified_at,\n };\n}\n\n/**\n * Verify a Resolve attestation offline against published keys: the DSSE\n * signature (ECDSA P-256/SHA-256, DER) over `PAE(payloadType, payload)` must\n * match one key, AND the signed statement must equal the one recomputed from\n * the attestation's own fields (so a valid signature over other content fails).\n * Server-side only (`node:crypto`, loaded lazily).\n */\nexport function verifyAttestationWithKeys(\n att: ResolveAttestation,\n keys: ResolveKeys,\n): ResolveAttestationVerifyResult {\n const env = att.signature;\n if (!env || !Array.isArray(env.signatures) || env.signatures.length === 0)\n return { ok: false, reason: 'UNSIGNED' };\n if (env.payloadType !== RESOLVE_ATTESTATION_PAYLOAD_TYPE)\n return { ok: false, reason: 'BAD_PAYLOAD_TYPE' };\n const { createVerify } = verifyCrypto();\n let body: Uint8Array;\n try {\n body = base64ToBytes(env.payload);\n } catch {\n return { ok: false, reason: 'BAD_SIGNATURE' };\n }\n const msg = pae(env.payloadType, body);\n let keyid: string | null = null;\n outer: for (const s of env.signatures) {\n let sig: Uint8Array;\n try {\n sig = base64ToBytes(s.sig);\n } catch {\n continue;\n }\n for (const k of keys.keys) {\n if (k.payload_type && k.payload_type !== env.payloadType) continue;\n try {\n const v = createVerify('SHA256');\n v.update(msg);\n if (v.verify({ key: k.public_key_pem, dsaEncoding: 'der' }, sig)) {\n keyid = k.keyid;\n break outer;\n }\n } catch {\n /* malformed key/signature — try the next */\n }\n }\n }\n if (keyid === null) return { ok: false, reason: 'BAD_SIGNATURE' };\n let signed: unknown;\n try {\n signed = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(body));\n } catch {\n return { ok: false, reason: 'STATEMENT_MISMATCH' };\n }\n if (canonicalJson(signed) !== canonicalJson(resolveAttestationStatement(att)))\n return { ok: false, reason: 'STATEMENT_MISMATCH' };\n return { ok: true, keyid };\n}\n\n/** Statuses after which a job never changes again. */\nexport const RESOLVE_TERMINAL_STATUSES: ReadonlySet<ResolveJobStatus> = new Set<ResolveJobStatus>([\n 'resolved',\n 'failed',\n 'declined',\n 'error',\n]);\n\n/** Any non-2xx answer from the Resolve service (flat `{ error }` body). */\nexport class ResolveError extends CodaiError {\n /** The `error` field of the body: a message, or Zod `flatten()` details on a 400. */\n readonly detail: string | ResolveValidationDetails | null;\n\n constructor(\n message: string,\n status: number,\n body: unknown,\n meta: { requestId?: string | null; retryAfter?: number | null } = {},\n ) {\n super(message, status, body, meta);\n this.name = 'ResolveError';\n this.detail = extractDetail(body);\n }\n}\n\n/** `402` on `accept()` — the wallet cannot hold the quote; the job stays `quoted`. */\nexport class ResolveInsufficientFundsError extends ResolveError {\n /** Wallet balance, in `currency` units (EUR micros). */\n readonly balance: number;\n /** Amount the hold needs, in `currency` units (EUR micros). */\n readonly required: number;\n readonly currency: 'micro_eur';\n /** pay.codai.ro checkout link for the shortfall — open it, then retry `accept()`. */\n readonly topupUrl: string;\n /** Present only for a `t7` job: fix-bundle checkout (10 t7 fix credits for €49). */\n readonly bundleUrl?: string;\n\n constructor(\n message: string,\n body: ResolveInsufficientFunds,\n meta: { requestId?: string | null } = {},\n ) {\n super(message, 402, body, meta);\n this.name = 'ResolveInsufficientFundsError';\n this.balance = body.balance;\n this.required = body.required;\n this.currency = body.currency;\n this.topupUrl = body.topup_url;\n if (typeof body.bundle_url === 'string') this.bundleUrl = body.bundle_url;\n }\n}\n\nexport interface ResolveWaitOptions {\n /** Poll interval (ms). Default 5_000. */\n intervalMs?: number;\n /** Give up after this long (ms); throws `ResolveError` (status 0, body = last job). Default 1_800_000. */\n timeoutMs?: number;\n /** Stop when the job reaches one of these. Default `RESOLVE_TERMINAL_STATUSES`. */\n until?: Iterable<ResolveJobStatus>;\n signal?: AbortSignal;\n /** Called with every polled job (progress UIs). */\n onPoll?: (job: ResolveJob) => void;\n}\n\ntype CallOpts = { signal?: AbortSignal };\n\nexport class Resolve {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * `POST /v1/resolve/jobs` — submit a public GitHub repo + issue for triage.\n * Returns a quote (`status: 'quoted'`), a free-tier auto-accept\n * (`status: 'accepted'`) or a decline (`status: 'declined'`). Never retried:\n * a retry could create a second job.\n */\n submit(body: ResolveIntake, opts: CallOpts = {}): Promise<ResolveSubmitResult> {\n if (!body.issue_url && !body.issue_text)\n throw new TypeError('resolve.submit: one of issue_url or issue_text is required');\n return this.call<ResolveSubmitResult>('/v1/resolve/jobs', {\n method: 'POST',\n body,\n noRetry: true,\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/resolve/jobs/{id}` — status, quote, reasons, cost and attestation pointer. */\n get(id: string, opts: CallOpts = {}): Promise<ResolveJob> {\n return this.call<ResolveJob>(`/v1/resolve/jobs/${encodeURIComponent(id)}`, {\n signal: opts.signal,\n });\n }\n\n /**\n * `POST /v1/resolve/jobs/{id}/accept` — accept a paid quote and start the job.\n * The result's `paid_with` says how it was paid (`intro` €1 hold, `credit`\n * t7 fix credit, or `wallet`). Throws `ResolveInsufficientFundsError` (402,\n * carries `topupUrl`, plus `bundleUrl` for t7) when the wallet is short,\n * `ResolveError` 409 when the job is not `quoted`.\n */\n accept(id: string, opts: CallOpts = {}): Promise<ResolveAccepted> {\n return this.call<ResolveAccepted>(`/v1/resolve/jobs/${encodeURIComponent(id)}/accept`, {\n method: 'POST',\n rawBody: '', // no body — sent with content-length: 0\n noRetry: true,\n signal: opts.signal,\n });\n }\n\n /**\n * `GET /v1/resolve/attestations/{id}` — public execution proof (no auth needed\n * server-side). Accepts the attestation id or the job's `attestation_url`.\n */\n attestation(idOrUrl: string, opts: CallOpts = {}): Promise<ResolveAttestation> {\n const id = idOrUrl.replace(/^.*\\/v1\\/resolve\\/attestations\\//, '');\n return this.call<ResolveAttestation>(`/v1/resolve/attestations/${encodeURIComponent(id)}`, {\n signal: opts.signal,\n });\n }\n\n /** `GET /health` — liveness of the Resolve service. */\n health(opts: CallOpts = {}): Promise<ResolveHealth> {\n return this.call<ResolveHealth>('/health', { signal: opts.signal });\n }\n\n /** `GET /v1/resolve/balance` — fix credits (t7 only), intro availability and wallet balance. */\n balance(opts: CallOpts = {}): Promise<ResolveBalance> {\n return this.call<ResolveBalance>('/v1/resolve/balance', { signal: opts.signal });\n }\n\n /** `GET /v1/resolve/keys` — public keys that sign attestations (no auth needed server-side). */\n keys(opts: CallOpts = {}): Promise<ResolveKeys> {\n return this.call<ResolveKeys>('/v1/resolve/keys', { signal: opts.signal });\n }\n\n /**\n * Verify an attestation's signature and that the signed statement matches\n * its fields. Fetches `keys()` unless `opts.keys` is given (pin them to\n * avoid trusting the network). `{ ok: false, reason: 'UNSIGNED' }` for\n * attestations created before signing (2026-09-27). Server-side only.\n */\n async verifyAttestation(\n att: ResolveAttestation,\n opts: { keys?: ResolveKeys; signal?: AbortSignal } = {},\n ): Promise<ResolveAttestationVerifyResult> {\n if (!att.signature) return { ok: false, reason: 'UNSIGNED' };\n const keys = opts.keys ?? (await this.keys({ signal: opts.signal }));\n return verifyAttestationWithKeys(att, keys);\n }\n\n /**\n * Poll `get(id)` until the job reaches a terminal status (`resolved`,\n * `failed`, `declined`, `error`) or one of `opts.until`. A `quoted` job\n * does not move until you `accept()` it.\n */\n async waitFor(id: string, opts: ResolveWaitOptions = {}): Promise<ResolveJob> {\n const intervalMs = opts.intervalMs ?? 5_000;\n const timeoutMs = opts.timeoutMs ?? 1_800_000;\n const until = new Set(opts.until ?? RESOLVE_TERMINAL_STATUSES);\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n const job = await this.get(id, { signal: opts.signal });\n opts.onPoll?.(job);\n if (until.has(job.status)) return job;\n const left = deadline - Date.now();\n if (left <= 0)\n throw new ResolveError(\n `codai-resolve job ${id} still ${job.status} after ${timeoutMs} ms`,\n 0,\n job,\n );\n await abortableSleep(Math.min(intervalMs, left), opts.signal);\n }\n }\n\n private async call<T>(path: string, init: RequestOptions): Promise<T> {\n try {\n return await this.http.json<T>(path, init);\n } catch (err) {\n throw toResolveError(path, err);\n }\n }\n}\n\nfunction extractDetail(body: unknown): string | ResolveValidationDetails | null {\n if (body && typeof body === 'object' && 'error' in body) {\n const e = (body as { error: unknown }).error;\n if (typeof e === 'string') return e;\n if (e && typeof e === 'object') return e as ResolveValidationDetails;\n }\n return null;\n}\n\nfunction isInsufficientFunds(body: unknown): body is ResolveInsufficientFunds {\n return (\n !!body &&\n typeof body === 'object' &&\n (body as { error?: unknown }).error === 'insufficient_funds' &&\n typeof (body as { topup_url?: unknown }).topup_url === 'string'\n );\n}\n\n/** Re-type a `CodaiError` from the shared HTTP layer into the Resolve hierarchy. */\nfunction toResolveError(path: string, err: unknown): unknown {\n if (!(err instanceof CodaiError) || err instanceof ResolveError) return err;\n if (err.status === 0) return err; // network/timeout — nothing Resolve-specific\n const meta = { requestId: err.requestId, retryAfter: err.retryAfter };\n if (err.status === 402 && isInsufficientFunds(err.body)) {\n const b = err.body;\n return new ResolveInsufficientFundsError(\n `codai-resolve ${path} → 402: insufficient funds (balance ${b.balance}, required ${b.required} ${b.currency}); top up at ${b.topup_url}${b.bundle_url ? ` or buy 10 t7 fixes for €49 at ${b.bundle_url}` : ''}`,\n b,\n meta,\n );\n }\n const detail = extractDetail(err.body);\n const text =\n detail === null ? '' : `: ${typeof detail === 'string' ? detail : JSON.stringify(detail)}`;\n return new ResolveError(\n `codai-resolve ${path} → ${err.status}${text}`,\n err.status,\n err.body,\n meta,\n );\n}\n\nfunction abortableSleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) return reject(signal.reason);\n const onAbort = () => {\n clearTimeout(t);\n reject(signal?.reason);\n };\n const t = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, ms);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n","/** `POST /v1/responses` — OpenAI Responses API compatibility (JSON + named-event SSE). */\nimport { type CodaiRequestExtensions, frameJson, type HttpClient, readSse } from '../http';\nimport { type Body, type Mutable, type Reply } from './_shared';\n\nexport type ResponsesRequest = Mutable<Body<'createResponse'>>;\nexport type ResponsesResponse = Reply<'createResponse'>;\n/** Request body as accepted by the SDK: `stream` is set by the method and `model` defaults to `codai`. */\nexport type ResponsesInput = Omit<ResponsesRequest, 'stream' | 'model'> & { model?: string };\n\nexport interface ResponsesCallOptions {\n ext?: CodaiRequestExtensions;\n signal?: AbortSignal;\n}\n\nexport interface ResponsesResult {\n /** `output_text` of the response. */\n outputText: string;\n raw: ResponsesResponse;\n requestId: string | null;\n routedTo: string | null;\n headers: Headers;\n}\n\n/** One Responses streaming event; `type` mirrors the SSE `event:` name. */\nexport interface ResponsesStreamEvent {\n type:\n | 'response.created'\n | 'response.output_text.delta'\n | 'response.output_item.done'\n | 'response.output_text.done'\n | 'response.completed'\n | (string & {});\n sequence_number?: number;\n [key: string]: unknown;\n}\n\nexport interface ResponsesStreamResult {\n outputText: string;\n /** The full `response` object from `response.completed`, when received. */\n response: ResponsesResponse | null;\n requestId: string | null;\n routedTo: string | null;\n headers: Headers | null;\n}\n\nexport interface ResponsesStream extends AsyncIterable<ResponsesStreamEvent> {\n readonly final: Promise<ResponsesStreamResult>;\n /** Text deltas only. */\n text(): AsyncIterable<string>;\n}\n\nexport class Responses {\n constructor(private readonly http: HttpClient) {}\n\n async create(body: ResponsesInput, opts: ResponsesCallOptions = {}): Promise<ResponsesResult> {\n const res = await this.http.request('/v1/responses', {\n body: { ...body, model: body.model ?? 'codai', stream: false },\n ext: opts.ext,\n signal: opts.signal,\n });\n const raw = (await res.json()) as ResponsesResponse;\n return {\n outputText: typeof raw.output_text === 'string' ? raw.output_text : '',\n raw,\n requestId: res.headers.get('x-codai-trace-id') ?? res.headers.get('x-request-id'),\n routedTo: res.headers.get('x-codai-routed-to'),\n headers: res.headers,\n };\n }\n\n stream(body: ResponsesInput, opts: ResponsesCallOptions = {}): ResponsesStream {\n const requestPromise = this.http.request('/v1/responses', {\n body: { ...body, model: body.model ?? 'codai', stream: true },\n ext: opts.ext,\n signal: opts.signal,\n timeoutMs: 0,\n noRetry: true,\n });\n\n let resolveFinal!: (r: ResponsesStreamResult) => void;\n let rejectFinal!: (e: unknown) => void;\n const final = new Promise<ResponsesStreamResult>((resolve, reject) => {\n resolveFinal = resolve;\n rejectFinal = reject;\n });\n final.catch(() => {});\n\n let outputText = '';\n let response: ResponsesResponse | null = null;\n let res: Response | null = null;\n\n async function* events(): AsyncGenerator<ResponsesStreamEvent, void, undefined> {\n try {\n res = await requestPromise;\n for await (const frame of readSse(res, opts.signal)) {\n const ev = frameJson<ResponsesStreamEvent>(frame);\n if (!ev) continue;\n if (typeof ev.type !== 'string') ev.type = frame.event;\n if (ev.type === 'response.output_text.delta' && typeof ev.delta === 'string') {\n outputText += ev.delta;\n } else if (ev.type === 'response.completed' && ev.response) {\n response = ev.response as ResponsesResponse;\n }\n yield ev;\n if (ev.type === 'response.completed') break;\n }\n resolveFinal({\n outputText,\n response,\n requestId: res.headers.get('x-codai-trace-id') ?? res.headers.get('x-request-id') ?? null,\n routedTo: res.headers.get('x-codai-routed-to'),\n headers: res.headers,\n });\n } catch (err) {\n rejectFinal(err);\n throw err;\n }\n }\n\n async function* textOnly(): AsyncGenerator<string, void, undefined> {\n for await (const ev of events()) {\n if (ev.type === 'response.output_text.delta' && typeof ev.delta === 'string')\n yield ev.delta;\n }\n }\n\n return {\n [Symbol.asyncIterator]: () => events(),\n text: () => ({ [Symbol.asyncIterator]: () => textOnly() }),\n final,\n };\n }\n}\n","/**\n * `/v1/sessions/*` — shared-sessions protocol v2 (events, controls, lease,\n * dispatch, SSE stream) plus the per-session shares under `/shares`.\n *\n * Every call needs the `x-codai-device` header: set it once via\n * `new Codai({ device: '<uuid>' })` or per call through `ext.device`.\n */\nimport { type CodaiRequestExtensions, frameJson, type HttpClient } from '../http';\nimport { type Body, type Mutable, type QueryOf, type Reply, type Schema } from './_shared';\n\nexport type Session = Schema<'Session'>;\nexport type SessionListItem = Schema<'SessionListItem'>;\nexport type SessionDetail = Reply<'getSession'>;\nexport type SessionCreateRequest = Mutable<Body<'createSession'>>;\nexport type SessionPatchRequest = Mutable<Body<'updateSession'>>;\nexport type SessionEvent = Schema<'SessionEvent'>;\nexport type SessionIncomingEvent = Mutable<Schema<'SessionIncomingEvent'>>;\nexport type SessionEventsAppendRequest = Mutable<Body<'appendSessionEvents'>>;\nexport type SessionEventsAppendResponse = Reply<'appendSessionEvents'>;\nexport type SessionEventsPage = Reply<'listSessionEvents'>;\nexport type SessionControl = Schema<'SessionControl'>;\nexport type SessionControlRequest = Mutable<Body<'submitSessionControl'>>;\nexport type SessionControlAccepted = Reply<'submitSessionControl', 202>;\ntype SessionDispatchBase = Omit<Mutable<Body<'dispatchToDevice'>>, 'mode' | 'text' | 'turn_id'>;\n/**\n * `POST …/dispatch` body. `send` (the default) needs `text` and runs it as a new turn on the\n * target; `open` is a handoff — the target only opens the session, so it takes no text/turn.\n */\nexport type SessionDispatchRequest =\n | (SessionDispatchBase & { mode?: 'send'; text: string; turn_id?: string })\n | (SessionDispatchBase & { mode: 'open'; text?: never; turn_id?: never });\nexport type SessionDispatchMode = NonNullable<Body<'dispatchToDevice'>['mode']>;\nexport type SessionDispatchResponse = Reply<'dispatchToDevice', 202>;\nexport type SessionLeaseClaimRequest = Mutable<Body<'claimSessionLease'>>;\nexport type SessionLeaseResponse = Reply<'claimSessionLease'>;\nexport type SessionShare = Schema<'OrgSessionShare'>;\nexport type SessionShareCreateRequest = Mutable<Body<'createSessionShare'>>;\nexport type SessionShareCreated = Reply<'createSessionShare', 201>;\nexport type SharedSession = Schema<'OrgSharedSession'>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\n/** Frames of `GET /v1/sessions/{id}/stream`; every payload carries `v: 1`. */\nexport type SessionStreamEvent =\n | { event: 'event'; data: { v: 1; seq: number } & Record<string, unknown> }\n | {\n event: 'control';\n data: { v: 1; id: string; kind: string; seq: number | null; applied: boolean } & Record<\n string,\n unknown\n >;\n }\n | { event: 'lease'; data: { v: 1; holder_device_id: string | null; expires_at: string | null } }\n | {\n event: 'presence';\n data: {\n v: 1;\n device_id: string;\n user_id: string;\n role: string;\n executor: boolean;\n last_seen: string;\n driving: boolean;\n online: boolean;\n };\n }\n | { event: string; data: Record<string, unknown> };\n\nconst enc = encodeURIComponent;\n\nexport class SessionLease {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /v1/sessions/{id}/lease` — CAS claim; `force: true` takes over a live lease. */\n acquire(\n sessionId: string,\n body: SessionLeaseClaimRequest = {},\n opts: CallOpts = {},\n ): Promise<SessionLeaseResponse> {\n return this.http.json<SessionLeaseResponse>(`/v1/sessions/${enc(sessionId)}/lease`, {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `PUT /v1/sessions/{id}/lease` — heartbeat every 10 s (TTL 30 s). */\n renew(sessionId: string, opts: CallOpts = {}): Promise<SessionLeaseResponse> {\n return this.http.json<SessionLeaseResponse>(`/v1/sessions/${enc(sessionId)}/lease`, {\n method: 'PUT',\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `DELETE /v1/sessions/{id}/lease` */\n release(sessionId: string, opts: CallOpts = {}): Promise<Reply<'releaseSessionLease'>> {\n return this.http.json<Reply<'releaseSessionLease'>>(`/v1/sessions/${enc(sessionId)}/lease`, {\n method: 'DELETE',\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n\nexport class SessionEvents {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/sessions/{id}/events?after=&limit=` */\n list(\n sessionId: string,\n query: Mutable<QueryOf<'listSessionEvents'>> = {},\n opts: CallOpts = {},\n ): Promise<SessionEventsPage> {\n return this.http.json<SessionEventsPage>(`/v1/sessions/${enc(sessionId)}/events`, {\n query: { after: query.after, limit: query.limit },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/sessions/{id}/events` — executor only (needs the live lease). */\n append(\n sessionId: string,\n body: SessionEventsAppendRequest,\n opts: CallOpts = {},\n ): Promise<SessionEventsAppendResponse> {\n return this.http.json<SessionEventsAppendResponse>(`/v1/sessions/${enc(sessionId)}/events`, {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n\nexport class SessionControls {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/sessions/{id}/controls?applied=&target=` — drain the control queue. */\n async list(\n sessionId: string,\n query: { applied?: boolean; target?: 'me' | string } = {},\n opts: CallOpts = {},\n ): Promise<SessionControl[]> {\n const raw = await this.http.json<Reply<'listSessionControls'>>(\n `/v1/sessions/${enc(sessionId)}/controls`,\n {\n query: { applied: query.applied, target: query.target },\n ext: opts.ext,\n signal: opts.signal,\n },\n );\n return [...(raw.controls ?? [])];\n }\n\n /** `POST /v1/sessions/{id}/control` — send a control to the executor (editor+). */\n submit(\n sessionId: string,\n body: SessionControlRequest,\n opts: CallOpts = {},\n ): Promise<SessionControlAccepted> {\n return this.http.json<SessionControlAccepted>(`/v1/sessions/${enc(sessionId)}/control`, {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/sessions/{id}/control/{cid}/applied` — executor only. */\n markApplied(\n sessionId: string,\n controlId: string,\n opts: CallOpts = {},\n ): Promise<Reply<'markSessionControlApplied'>> {\n return this.http.json<Reply<'markSessionControlApplied'>>(\n `/v1/sessions/${enc(sessionId)}/control/${enc(controlId)}/applied`,\n { method: 'POST', ext: opts.ext, signal: opts.signal },\n );\n }\n}\n\nexport class SessionShares {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/sessions/{id}/shares` — owner only. */\n async list(sessionId: string, opts: CallOpts = {}): Promise<SessionShare[]> {\n const raw = await this.http.json<Reply<'listSessionShares'>>(\n `/v1/sessions/${enc(sessionId)}/shares`,\n { ext: opts.ext, signal: opts.signal },\n );\n return [...(raw.shares ?? [])];\n }\n\n /** `POST /v1/sessions/{id}/shares` — `token` is returned once for link shares. */\n create(\n sessionId: string,\n body: SessionShareCreateRequest,\n opts: CallOpts = {},\n ): Promise<SessionShareCreated> {\n return this.http.json<SessionShareCreated>(`/v1/sessions/${enc(sessionId)}/shares`, {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `DELETE /v1/sessions/{id}/shares/{shareId}` */\n delete(\n sessionId: string,\n shareId: string,\n opts: CallOpts = {},\n ): Promise<Reply<'deleteSessionShare'>> {\n return this.http.json<Reply<'deleteSessionShare'>>(\n `/v1/sessions/${enc(sessionId)}/shares/${enc(shareId)}`,\n { method: 'DELETE', ext: opts.ext, signal: opts.signal },\n );\n }\n\n /** `GET /v1/sessions/shared-with-me` */\n async sharedWithMe(\n query: { archived?: boolean } = {},\n opts: CallOpts = {},\n ): Promise<SharedSession[]> {\n const raw = await this.http.json<Reply<'listSessionsSharedWithMe'>>(\n '/v1/sessions/shared-with-me',\n {\n query: { archived: query.archived ? '1' : undefined },\n ext: opts.ext,\n signal: opts.signal,\n },\n );\n return [...(raw.sessions ?? [])];\n }\n}\n\nexport class Sessions {\n readonly events: SessionEvents;\n readonly controls: SessionControls;\n readonly lease: SessionLease;\n readonly shares: SessionShares;\n\n constructor(private readonly http: HttpClient) {\n this.events = new SessionEvents(http);\n this.controls = new SessionControls(http);\n this.lease = new SessionLease(http);\n this.shares = new SessionShares(http);\n }\n\n /** `POST /v1/sessions` — idempotent on `session_key` (200 existing / 201 created). */\n async create(\n body: SessionCreateRequest = {},\n opts: CallOpts = {},\n ): Promise<Session & { created: boolean }> {\n const res = await this.http.request('/v1/sessions', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n const session = (await res.json()) as Session;\n return { ...session, created: res.status === 201 };\n }\n\n /** `GET /v1/sessions?limit=&archived=` — own sessions first, then shared. */\n async list(\n query: { limit?: number; archived?: boolean } = {},\n opts: CallOpts = {},\n ): Promise<SessionListItem[]> {\n const raw = await this.http.json<Reply<'listSessions'>>('/v1/sessions', {\n query: { limit: query.limit, archived: query.archived ? '1' : undefined, v: '2' },\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.sessions ?? [])];\n }\n\n /** `GET /v1/sessions/{id}` — detail with members, lease and presence. */\n get(\n sessionId: string,\n query: { share?: string } = {},\n opts: CallOpts = {},\n ): Promise<SessionDetail> {\n return this.http.json<SessionDetail>(`/v1/sessions/${enc(sessionId)}`, {\n query: { share: query.share, v: '2' },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `PATCH /v1/sessions/{id}` — rename / archive (owner). */\n update(sessionId: string, body: SessionPatchRequest, opts: CallOpts = {}): Promise<Session> {\n return this.http.json<Session>(`/v1/sessions/${enc(sessionId)}`, {\n method: 'PATCH',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `DELETE /v1/sessions/{id}` — irreversible (owner). */\n delete(sessionId: string, opts: CallOpts = {}): Promise<Reply<'deleteSession'>> {\n return this.http.json<Reply<'deleteSession'>>(`/v1/sessions/${enc(sessionId)}`, {\n method: 'DELETE',\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /**\n * `POST /v1/sessions/{id}/dispatch` — queue a `send` for one device and wake it over FCM.\n * `{ mode: 'open' }` hands the session off instead: the target just opens it (no user turn).\n */\n dispatch(\n sessionId: string,\n body: SessionDispatchRequest,\n opts: CallOpts = {},\n ): Promise<SessionDispatchResponse> {\n return this.http.json<SessionDispatchResponse>(`/v1/sessions/${enc(sessionId)}/dispatch`, {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /**\n * `GET /v1/sessions/{id}/stream?after=` — live SSE of `event` / `control` /\n * `lease` / `presence` frames. `: ping` heartbeats are skipped. The server\n * closes after 30 min; reconnect with `after` = highest `seq` seen.\n */\n async *stream(\n sessionId: string,\n query: { after?: number; share?: string } = {},\n opts: CallOpts = {},\n ): AsyncGenerator<SessionStreamEvent, void, undefined> {\n const frames = this.http.sse(`/v1/sessions/${enc(sessionId)}/stream`, {\n query: { after: query.after, share: query.share },\n ext: opts.ext,\n signal: opts.signal,\n });\n for await (const frame of frames) {\n const data = frameJson<Record<string, unknown>>(frame);\n if (!data) continue;\n yield { event: frame.event, data } as SessionStreamEvent;\n }\n }\n}\n","/**\n * `/v1/settings` — account-level settings shared by every device of the account (per user, not per key). Reads\n * always return the full object with defaults applied; writes deep-merge a partial and are validated strictly.\n *\n * Optimistic concurrency: pass `{ version }` from the last read to `update()`. On a mismatch the gateway answers 409\n * `version_conflict` and nothing is written; the thrown `CodaiError` carries the current state in\n * `(err.body as SettingsConflict).current` (see {@link settingsConflictCurrent}).\n */\nimport { CodaiError, type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Reply, type Schema } from './_shared';\n\nexport type SettingsResponse = Reply<'getSettings'>;\nexport type UserSettings = Schema<'UserSettings'>;\nexport type TranscriptsSettings = Schema<'TranscriptsSettings'>;\nexport type SettingsConflict = Schema<'SettingsConflict'>;\n\n/** A deep partial of {@link UserSettings}: only the fields to change (`language: null` = auto-detect). */\nexport type SettingsPatch = {\n transcripts?: { -readonly [K in keyof TranscriptsSettings]?: TranscriptsSettings[K] };\n};\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\ntype UpdateOpts = CallOpts & { version?: number };\n\n/** The `current` state of a 409 `version_conflict` thrown by `settings.update`, else null. */\nexport function settingsConflictCurrent(err: unknown): SettingsResponse | null {\n if (!(err instanceof CodaiError) || err.status !== 409 || err.code !== 'version_conflict')\n return null;\n const current = (err.body as Partial<SettingsConflict> | null)?.current;\n return current ?? null;\n}\n\nexport class Settings {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/settings` — full settings with defaults; `version` 0 / `updatedAt` null until the first write. */\n get(opts: CallOpts = {}): Promise<SettingsResponse> {\n return this.http.json<SettingsResponse>('/v1/settings', { ext: opts.ext, signal: opts.signal });\n }\n\n /**\n * `PATCH /v1/settings` — deep-merge `partial` into the stored settings. With `opts.version` the write is\n * conditional (409 `version_conflict` on a mismatch). Unknown keys / invalid values throw a 400 `CodaiError`.\n */\n update(partial: SettingsPatch, opts: UpdateOpts = {}): Promise<SettingsResponse> {\n return this.http.json<SettingsResponse>('/v1/settings', {\n method: 'PATCH',\n body: { settings: partial, ...(opts.version !== undefined ? { version: opts.version } : {}) },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n","/**\n * `/v1/studio/sfx` — the codai Studio sound-effects library (`codai-sfx`): curated CC0 sounds (Kenney packs) plus a\n * Freesound CC0-only fallback when the gateway has one configured. Searching and importing are free; an imported\n * sound becomes a studio asset (`kind: 'sfx'`) usable as `asset:<asset_id>` in `renders.create`.\n */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type AssetDto } from './assets';\nimport { type QueryOf, type Reply, type Schema } from './_shared';\n\n/** One sound (always `license: 'CC0-1.0'`). */\nexport type SfxDto = Schema<'SfxDto'>;\nexport type SfxCategory = Schema<'SfxCategory'>;\nexport type SfxList = Reply<'searchSfx'>;\n/** `GET /v1/studio/sfx` query; `tags` may also be passed as an array (joined with commas). */\nexport type SfxSearchParams = Omit<QueryOf<'searchSfx'>, 'tags'> & {\n tags?: string | readonly string[];\n};\n/** Search result plus whether the Freesound fallback failed (`x-codai-sfx-fallback: unavailable`). */\nexport type SfxSearchResult = SfxList & { fallbackUnavailable: boolean };\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nexport class Sfx {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/studio/sfx` — best match first; `limit` 1–50 (default 20). */\n async search(params: SfxSearchParams = {}, opts: CallOpts = {}): Promise<SfxSearchResult> {\n const tags = Array.isArray(params.tags)\n ? params.tags.join(',')\n : (params.tags as string | undefined);\n const res = await this.http.request('/v1/studio/sfx', {\n query: {\n q: params.q,\n category: params.category,\n tags: tags || undefined,\n max_duration: params.max_duration,\n limit: params.limit,\n },\n ext: opts.ext,\n signal: opts.signal,\n });\n const body = (await res.json()) as SfxList;\n return {\n ...body,\n fallbackUnavailable: res.headers.get('x-codai-sfx-fallback') === 'unavailable',\n };\n }\n\n /**\n * `POST /v1/studio/sfx/{sfx_id}/import` — copies the sound into your assets (`kind: 'sfx'`, free). Freesound items\n * whose licence is not CC0 are refused with 400 `license_not_allowed`; an unknown id is 404.\n */\n import(sfxId: string, opts: CallOpts = {}): Promise<AssetDto> {\n return this.http.json<AssetDto>(`/v1/studio/sfx/${encodeURIComponent(sfxId)}/import`, {\n method: 'POST',\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n","/** `POST /v1/systemone` — typed decisions from codai-s1 (Choice / Score / Noul). */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply } from './_shared';\n\nexport type SystemOneRequest = Mutable<Body<'createSystemOne'>>;\nexport type SystemOneResponse = Reply<'createSystemOne'>;\ntype SystemOneState = NonNullable<SystemOneRequest['state']>;\nexport type SystemOneAnswers = NonNullable<SystemOneResponse['answers']>;\n\n/** Single-state call: `answers` is always present. */\nexport type SystemOneSingleRequest = Omit<SystemOneRequest, 'items'> & { state: SystemOneState };\nexport type SystemOneSingleResponse = SystemOneResponse & { answers: SystemOneAnswers };\n\n/** Batch call (1-16 items, same questions, run concurrently). */\nexport type SystemOneBatchRequest = Omit<SystemOneRequest, 'state' | 'items'> & {\n items: Array<{ id: string; state: SystemOneState }>;\n};\nexport type SystemOneBatchResponse = SystemOneResponse & {\n items: Array<{ id: string; answers: SystemOneAnswers }>;\n};\n\nexport class SystemOne {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Ask one or more typed questions about `state` (or about each of `items`). Throws on 503\n * `s1_unavailable` like any other error — keep a local fallback and catch it. The gateway\n * substitutes a generative model ONLY when you pass `fallback: 'codai-fast'`, and then the\n * response says `fallback_used: true`. `timeout_ms` (100-5000) bounds the s1 call.\n */\n async create(\n body: SystemOneSingleRequest,\n opts?: { ext?: CodaiRequestExtensions; signal?: AbortSignal },\n ): Promise<SystemOneSingleResponse>;\n async create(\n body: SystemOneBatchRequest,\n opts?: { ext?: CodaiRequestExtensions; signal?: AbortSignal },\n ): Promise<SystemOneBatchResponse>;\n async create(\n body: SystemOneRequest,\n opts?: { ext?: CodaiRequestExtensions; signal?: AbortSignal },\n ): Promise<SystemOneResponse>;\n async create(\n body: SystemOneRequest,\n opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal } = {},\n ): Promise<SystemOneResponse> {\n const res = await this.http.request('/v1/systemone', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n return (await res.json()) as SystemOneResponse;\n }\n\n /** Same questions about up to 16 states in one call; results come back in `items` order. */\n batch(\n body: SystemOneBatchRequest,\n opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal } = {},\n ): Promise<SystemOneBatchResponse> {\n return this.create(body, opts);\n }\n}\n","/** `/v1/tasks/*` — outcome-billing task lifecycle. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type QueryOf, type Reply, type Schema } from './_shared';\n\nexport type Task = Schema<'Task'>;\nexport type TaskOutcome = Schema<'TaskOutcome'>;\nexport type TaskStats = Reply<'getTaskStats'>;\nexport type TaskListPage = Reply<'listTasks'>;\nexport type TaskConfirmRequest = Mutable<Body<'confirmTask'>>;\nexport type TaskConfirmResponse = Reply<'confirmTask'>;\nexport type TaskListQuery = Mutable<QueryOf<'listTasks'>>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nexport class Tasks {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/tasks` — newest first; page with `cursor` = previous `next_cursor`. */\n list(query: TaskListQuery = {}, opts: CallOpts = {}): Promise<TaskListPage> {\n return this.http.json<TaskListPage>('/v1/tasks', {\n query: { outcome: query.outcome, limit: query.limit, cursor: query.cursor },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/tasks/pending` — tasks awaiting your confirmation (max 100). */\n async pending(opts: CallOpts = {}): Promise<Task[]> {\n const raw = await this.http.json<Reply<'listPendingTasks'>>('/v1/tasks/pending', {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...(raw.tasks ?? [])];\n }\n\n /** `GET /v1/tasks/stats?since=` */\n stats(since?: string | Date, opts: CallOpts = {}): Promise<TaskStats> {\n return this.http.json<TaskStats>('/v1/tasks/stats', {\n query: { since: since instanceof Date ? since.toISOString() : since },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/tasks/{id}` */\n get(id: string, opts: CallOpts = {}): Promise<Task> {\n return this.http.json<Task>(`/v1/tasks/${encodeURIComponent(id)}`, {\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/tasks/{id}/confirm` — answer \"Did codai solve it?\". */\n confirm(id: string, body: TaskConfirmRequest, opts: CallOpts = {}): Promise<TaskConfirmResponse> {\n return this.http.json<TaskConfirmResponse>(`/v1/tasks/${encodeURIComponent(id)}/confirm`, {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n","/** `/v1/triggers/*` + `/v1/notifications/*` — event triggers (webhooks → agent sessions) and the inbox. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply } from './_shared';\n\nexport type TriggerList = Reply<'listTriggers'>;\nexport type TriggerCreateRequest = Mutable<Body<'createTrigger'>>;\nexport type TriggerCreated = Reply<'createTrigger'>;\nexport type TriggerPatch = Mutable<Body<'updateTrigger'>>;\nexport type TriggerUpdated = Reply<'updateTrigger'>;\nexport type TriggerTestRequest = Mutable<Body<'testTrigger'>>;\nexport type TriggerTestResult = Reply<'testTrigger'>;\nexport type TriggerEvents = Reply<'listTriggerEvents'>;\nexport type NotificationList = Reply<'listNotifications'>;\nexport type NotificationsRead = Reply<'markNotificationsRead'>;\n/** Reply of `DELETE /v1/notifications/:id` and `POST /v1/notifications/delete`. */\nexport type NotificationsDeleted = { readonly deleted: number };\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nexport class Triggers {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/triggers` — never includes the signing secret. */\n list(opts: CallOpts = {}): Promise<TriggerList> {\n return this.http.json<TriggerList>('/v1/triggers', { ext: opts.ext, signal: opts.signal });\n }\n\n /** `POST /v1/triggers` — the response carries the signing `secret` ONCE. */\n create(body: TriggerCreateRequest, opts: CallOpts = {}): Promise<TriggerCreated> {\n return this.http.json<TriggerCreated>('/v1/triggers', { method: 'POST', body, ext: opts.ext, signal: opts.signal });\n }\n\n /** `PATCH /v1/triggers/{id}` — name / enabled / policy. */\n update(id: string, body: TriggerPatch, opts: CallOpts = {}): Promise<TriggerUpdated> {\n return this.http.json<TriggerUpdated>(`/v1/triggers/${encodeURIComponent(id)}`, { method: 'PATCH', body, ext: opts.ext, signal: opts.signal });\n }\n\n /** `DELETE /v1/triggers/{id}` — its hook URL stops working immediately. */\n delete(id: string, opts: CallOpts = {}): Promise<Reply<'deleteTrigger'>> {\n return this.http.json<Reply<'deleteTrigger'>>(`/v1/triggers/${encodeURIComponent(id)}`, { method: 'DELETE', ext: opts.ext, signal: opts.signal });\n }\n\n /** `POST /v1/triggers/{id}/rotate-secret` — new secret, shown once. */\n rotateSecret(id: string, opts: CallOpts = {}): Promise<Reply<'rotateTriggerSecret'>> {\n return this.http.json<Reply<'rotateTriggerSecret'>>(`/v1/triggers/${encodeURIComponent(id)}/rotate-secret`, { method: 'POST', body: {}, ext: opts.ext, signal: opts.signal });\n }\n\n /** `POST /v1/triggers/{id}/test` — manual fire through the full pipeline; returns the decision + reason. */\n /** `PUT /v1/triggers/{id}/secret` — store a secret issued by the source (e.g. a Sentry integration's client secret). */\n setSecret(id: string, secret: string, opts: CallOpts = {}): Promise<Reply<'setTriggerSecret'>> {\n return this.http.json<Reply<'setTriggerSecret'>>(`/v1/triggers/${encodeURIComponent(id)}/secret`, { method: 'PUT', body: { secret }, ext: opts.ext, signal: opts.signal, noRetry: true });\n }\n\n /** `POST /v1/triggers/{id}/test` — manual fire through the full pipeline; returns the decision + reason. */\n test(id: string, body: TriggerTestRequest = {}, opts: CallOpts = {}): Promise<TriggerTestResult> {\n return this.http.json<TriggerTestResult>(`/v1/triggers/${encodeURIComponent(id)}/test`, { method: 'POST', body, ext: opts.ext, signal: opts.signal });\n }\n\n /** `GET /v1/triggers/{id}/events?limit=` — recent deliveries with decisions. */\n events(id: string, limit?: number, opts: CallOpts = {}): Promise<TriggerEvents> {\n return this.http.json<TriggerEvents>(`/v1/triggers/${encodeURIComponent(id)}/events`, { query: { limit }, ext: opts.ext, signal: opts.signal });\n }\n\n /**\n * `POST /v1/hooks/{id}` — send an event to a `generic` / `form` trigger from your own code. Signs the body\n * (`X-Codai-Signature: t=<unix>,v1=HMAC_SHA256(secret, \"<t>.<body>\")`, WebCrypto — Node 20+, browsers, Deno,\n * Workers). `deliveryId` makes retries idempotent. The hook needs no API key (the signature is the auth).\n */\n async fireHook(\n id: string,\n secret: string,\n event: { title: string; message?: string; severity?: 'info' | 'low' | 'medium' | 'high' | 'critical'; url?: string; subject?: string; labels?: string[]; dedupe_key?: string; resolved?: boolean },\n opts: CallOpts & { deliveryId?: string } = {},\n ): Promise<Reply<'receiveTriggerHook'>> {\n const raw = JSON.stringify(event);\n const t = Math.floor(Date.now() / 1000);\n const key = await crypto.subtle.importKey('raw', new TextEncoder().encode(secret), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);\n const mac = new Uint8Array(await crypto.subtle.sign('HMAC', key, new TextEncoder().encode(`${t}.${raw}`)));\n const v1 = Array.from(mac, (b) => b.toString(16).padStart(2, '0')).join('');\n return this.http.json<Reply<'receiveTriggerHook'>>(`/v1/hooks/${encodeURIComponent(id)}`, {\n method: 'POST',\n rawBody: raw,\n ext: {\n ...opts.ext,\n headers: {\n ...opts.ext?.headers,\n 'Content-Type': 'application/json',\n 'x-codai-signature': `t=${t},v1=${v1}`,\n ...(opts.deliveryId ? { 'x-codai-delivery': opts.deliveryId } : {}),\n },\n },\n signal: opts.signal,\n });\n }\n}\n\nexport class Notifications {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/notifications?unread=1&limit=` — newest first. */\n list(query: { unread?: boolean; limit?: number } = {}, opts: CallOpts = {}): Promise<NotificationList> {\n return this.http.json<NotificationList>('/v1/notifications', {\n query: { unread: query.unread ? '1' : undefined, limit: query.limit },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/notifications/read` — `ids` omitted = every unread one. */\n markRead(ids?: number[], opts: CallOpts = {}): Promise<NotificationsRead> {\n return this.http.json<NotificationsRead>('/v1/notifications/read', { method: 'POST', body: ids ? { ids } : {}, ext: opts.ext, signal: opts.signal });\n }\n\n /** `DELETE /v1/notifications/:id` — `{ deleted: 0 }` when the id is missing or not yours. */\n delete(id: number, opts: CallOpts = {}): Promise<NotificationsDeleted> {\n return this.http.json<NotificationsDeleted>(`/v1/notifications/${encodeURIComponent(String(id))}`, { method: 'DELETE', ext: opts.ext, signal: opts.signal });\n }\n\n /** `POST /v1/notifications/delete` — 1..200 ids; ids of other users are skipped. */\n deleteMany(ids: number[], opts: CallOpts = {}): Promise<NotificationsDeleted> {\n return this.http.json<NotificationsDeleted>('/v1/notifications/delete', { method: 'POST', body: { ids }, ext: opts.ext, signal: opts.signal });\n }\n}\n","/** `/v1/prompts/*` — pending prompts: ready-to-paste prompts left for a future chat (handoffs, follow-ups). */\nimport { type CodaiRequestExtensions, frameJson, type HttpClient } from '../http';\nimport { type Body, type Mutable, type QueryOf, type Reply, type Schema } from './_shared';\n\nexport type Prompt = Schema<'Prompt'>;\nexport type PromptStatus = Schema<'PromptStatus'>;\nexport type PromptSource = Schema<'PromptSource'>;\nexport type PromptList = Reply<'listPrompts'>;\nexport type PromptListQuery = Mutable<QueryOf<'listPrompts'>>;\nexport type PromptCreateRequest = Mutable<Body<'createPrompt'>>;\nexport type PromptCreated = Reply<'createPrompt'>;\nexport type PromptPatch = Mutable<Body<'updatePrompt'>>;\nexport type PromptLaunched = Reply<'launchPrompt'>;\nexport type PromptDeleted = Reply<'deletePrompt'>;\nexport type PromptReport = Schema<'PromptReport'>;\nexport type PromptMatchRequest = Mutable<Body<'matchPrompt'>>;\nexport type PromptMatched = Reply<'matchPrompt'>;\nexport type PromptVerifyRequest = Mutable<Body<'verifyPrompt'>>;\nexport type PromptVerified = Reply<'verifyPrompt'>;\nexport type PromptVerifyManyRequest = Mutable<Body<'verifyPrompts'>>;\nexport type PromptVerifyManyResult = Reply<'verifyPrompts'>;\n\n/** One `event: prompt` frame of `GET /v1/prompts/stream`. */\nexport interface PromptStreamEvent {\n op: 'upsert' | 'delete';\n id: string;\n status: PromptStatus | 'deleted';\n /** Full prompt on `upsert`. */\n prompt?: Prompt;\n}\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nconst one = (id: string, suffix = '') => `/v1/prompts/${encodeURIComponent(id)}${suffix}`;\n\nexport class Prompts {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/prompts?status=&limit=` — default `open`; `due` = open and `not_before` empty or passed. */\n list(query: PromptListQuery = {}, opts: CallOpts = {}): Promise<PromptList> {\n return this.http.json<PromptList>('/v1/prompts', {\n query: { status: query.status, limit: query.limit },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/prompts` — idempotent on the text (`created: false` for a duplicate); `goal_key` supersedes older open ones. */\n create(body: PromptCreateRequest, opts: CallOpts = {}): Promise<PromptCreated> {\n return this.http.json<PromptCreated>('/v1/prompts', {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/prompts/{id}`. */\n get(id: string, opts: CallOpts = {}): Promise<Prompt> {\n return this.http.json<Prompt>(one(id), { ext: opts.ext, signal: opts.signal });\n }\n\n /** `PATCH /v1/prompts/{id}` — edit, snooze (`not_before`), close (`status: 'done' | 'dismissed'`). */\n update(id: string, body: PromptPatch, opts: CallOpts = {}): Promise<Prompt> {\n return this.http.json<Prompt>(one(id), {\n method: 'PATCH',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `DELETE /v1/prompts/{id}` — `{ deleted: 0 }` when the id is missing or not yours. */\n delete(id: string, opts: CallOpts = {}): Promise<PromptDeleted> {\n return this.http.json<PromptDeleted>(one(id), {\n method: 'DELETE',\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/prompts/{id}/launch` — new shared session + `send` control on a device; the prompt becomes `launched`. */\n launch(id: string, deviceId?: string, opts: CallOpts = {}): Promise<PromptLaunched> {\n return this.http.json<PromptLaunched>(one(id, '/launch'), {\n method: 'POST',\n body: deviceId ? { device_id: deviceId } : {},\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n }\n\n /** `POST /v1/prompts/{id}/match` — the prompt was sent in a chat → `sent` (or `answered`); never downgrades. */\n match(id: string, body: PromptMatchRequest, opts: CallOpts = {}): Promise<PromptMatched> {\n return this.http.json<PromptMatched>(one(id, '/match'), {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /**\n * `POST /v1/prompts/{id}/verify` — LLM report over the transcript (sent, or the matched session's stored\n * events) and an optional diff; verdict `done` → `verified`. 502 when the model call fails.\n */\n verify(id: string, body: PromptVerifyRequest = {}, opts: CallOpts = {}): Promise<PromptVerified> {\n return this.http.json<PromptVerified>(one(id, '/verify'), {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n }\n\n /** `POST /v1/prompts/verify` — transcript-only verification of up to 20 prompts, sequentially. */\n verifyMany(body: PromptVerifyManyRequest, opts: CallOpts = {}): Promise<PromptVerifyManyResult> {\n return this.http.json<PromptVerifyManyResult>('/v1/prompts/verify', {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n }\n\n /** `GET /v1/prompts/stream` — live `prompt` events (keepalive comments are skipped). Closed by the server after 6 h. */\n async *stream(opts: CallOpts = {}): AsyncGenerator<PromptStreamEvent, void, undefined> {\n const frames = this.http.sse('/v1/prompts/stream', { ext: opts.ext, signal: opts.signal });\n for await (const frame of frames) {\n if (frame.event !== 'prompt') continue;\n const data = frameJson<PromptStreamEvent>(frame);\n if (data) yield data;\n }\n }\n}\n","/** `/v1/schedules/*`, `/v1/schedule-runs/*`, `/v1/scheduler/*` — the codai Scheduler (ADR 0006). */\nimport { type CodaiRequestExtensions, frameJson, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply, type Schema } from './_shared';\n\nexport type Schedule = Schema<'Schedule'>;\nexport type ScheduleInput = Mutable<Schema<'ScheduleInput'>>;\nexport type ScheduleRun = Schema<'ScheduleRun'>;\nexport type SchedulerHost = Schema<'SchedulerHost'>;\nexport type SchedulePreviewRequest = Mutable<Body<'previewSchedule'>>;\nexport type SchedulePreview = Reply<'previewSchedule'>;\nexport type SchedulerHostPatch = Mutable<Body<'updateSchedulerHost'>>;\nexport type ScheduleRunResult = Mutable<Body<'reportScheduleRunResult'>>;\nexport type ScheduleClaim = Reply<'claimScheduleRun'>;\nexport type HeartbeatMonitor = Schema<'HeartbeatMonitor'>;\nexport type HeartbeatCreateRequest = Mutable<Body<'createHeartbeat'>>;\nexport type HeartbeatPatch = Mutable<Body<'updateHeartbeat'>>;\n\n/** One `event: schedule` frame of `GET /v1/schedules/stream`. */\nexport interface ScheduleStreamEvent {\n op: 'schedule' | 'run';\n id: string;\n schedule_id?: string;\n state?: string;\n device_id?: string | null;\n}\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nconst one = (id: string, suffix = '') => `/v1/schedules/${encodeURIComponent(id)}${suffix}`;\nconst run = (id: string, suffix: string) => `/v1/schedule-runs/${encodeURIComponent(id)}${suffix}`;\n\n/** Host-side executor protocol: claim → heartbeat → result. Needs a device header (`device` client option). */\nexport class ScheduleExecutor {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /v1/scheduler/claim` — the next run this device may execute, or `null` (204). Lease 60 s. */\n async claim(opts: CallOpts = {}): Promise<ScheduleClaim | null> {\n const res = await this.http.request('/v1/scheduler/claim', {\n method: 'POST',\n body: {},\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n if (res.status === 204) return null;\n return (await res.json()) as ScheduleClaim;\n }\n\n /** `POST /v1/schedule-runs/{id}/heartbeat` — extend the lease, append log. Throws 409 when the lease was lost. */\n async heartbeat(\n runId: string,\n body: { attempt: number; log?: string },\n opts: CallOpts = {},\n ): Promise<void> {\n await this.http.request(run(runId, '/heartbeat'), {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n }\n\n /** `POST /v1/schedule-runs/{id}/result` — finish the run (retries / chains are decided server-side). */\n result(runId: string, body: ScheduleRunResult, opts: CallOpts = {}): Promise<ScheduleRun> {\n return this.http.json<ScheduleRun>(run(runId, '/result'), {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n }\n\n /** `POST /v1/schedules/{id}/approve-command` — this host approves the exact shell command hash it showed the user. */\n approveCommand(\n scheduleId: string,\n commandHash: string,\n opts: CallOpts = {},\n ): Promise<Reply<'approveScheduleCommand'>> {\n return this.http.json(one(scheduleId, '/approve-command'), {\n method: 'POST',\n body: { command_hash: commandHash },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n\n/** Scheduler hosts (your devices as executors). */\nexport class SchedulerHosts {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/scheduler/hosts`. */\n async list(opts: CallOpts = {}): Promise<SchedulerHost[]> {\n const r = await this.http.json<Reply<'listSchedulerHosts'>>('/v1/scheduler/hosts', {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...r.hosts];\n }\n\n /** `PATCH /v1/scheduler/hosts/{id}` — name, tags, kind, os, arch. */\n update(\n id: string,\n body: SchedulerHostPatch,\n opts: CallOpts = {},\n ): Promise<Reply<'updateSchedulerHost'>> {\n return this.http.json(`/v1/scheduler/hosts/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n\n/** Heartbeat monitors: dead-man switches for jobs codai does not run (`/ping/<token>`). */\nexport class Heartbeats {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/heartbeats`. */\n async list(opts: CallOpts = {}): Promise<HeartbeatMonitor[]> {\n const r = await this.http.json<Reply<'listHeartbeats'>>('/v1/heartbeats', {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...r.heartbeats];\n }\n\n /** `POST /v1/heartbeats` — the response carries `ping_url` once. */\n create(body: HeartbeatCreateRequest, opts: CallOpts = {}): Promise<HeartbeatMonitor> {\n return this.http.json<HeartbeatMonitor>('/v1/heartbeats', {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n acceptStatus: [201],\n });\n }\n\n /** `PATCH /v1/heartbeats/{id}` — name, period_s, grace_s, paused. */\n update(id: string, body: HeartbeatPatch, opts: CallOpts = {}): Promise<HeartbeatMonitor> {\n return this.http.json<HeartbeatMonitor>(`/v1/heartbeats/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `DELETE /v1/heartbeats/{id}`. */\n async delete(id: string, opts: CallOpts = {}): Promise<void> {\n await this.http.request(`/v1/heartbeats/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n\nexport class Schedules {\n readonly hosts: SchedulerHosts;\n readonly executor: ScheduleExecutor;\n\n constructor(private readonly http: HttpClient) {\n this.hosts = new SchedulerHosts(http);\n this.executor = new ScheduleExecutor(http);\n }\n\n /** `GET /v1/schedules`. */\n async list(opts: CallOpts = {}): Promise<Schedule[]> {\n const r = await this.http.json<Reply<'listSchedules'>>('/v1/schedules', {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...r.schedules];\n }\n\n /** `POST /v1/schedules`. */\n create(body: ScheduleInput, opts: CallOpts = {}): Promise<Schedule> {\n return this.http.json<Schedule>('/v1/schedules', {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n acceptStatus: [201],\n });\n }\n\n /** `POST /v1/schedules/preview` — cron or plain words (RO/EN) → trigger + next runs + DST warning. */\n preview(body: SchedulePreviewRequest, opts: CallOpts = {}): Promise<SchedulePreview> {\n return this.http.json<SchedulePreview>('/v1/schedules/preview', {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/schedules/{id}`. */\n get(id: string, opts: CallOpts = {}): Promise<Schedule> {\n return this.http.json<Schedule>(one(id), { ext: opts.ext, signal: opts.signal });\n }\n\n /** `PATCH /v1/schedules/{id}` — partial; a changed shell command clears host approvals. */\n update(id: string, body: Partial<ScheduleInput>, opts: CallOpts = {}): Promise<Schedule> {\n return this.http.json<Schedule>(one(id), {\n method: 'PATCH',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `DELETE /v1/schedules/{id}`. */\n async delete(id: string, opts: CallOpts = {}): Promise<void> {\n await this.http.request(one(id), { method: 'DELETE', ext: opts.ext, signal: opts.signal });\n }\n\n /** `POST /v1/schedules/{id}/run` — run now (policy still applies). */\n runNow(id: string, opts: CallOpts = {}): Promise<Reply<'runSchedule', 202>> {\n return this.http.json(one(id, '/run'), {\n method: 'POST',\n body: {},\n ext: opts.ext,\n signal: opts.signal,\n acceptStatus: [202],\n noRetry: true,\n });\n }\n\n /** `GET /v1/schedules/{id}/runs`. */\n async runs(id: string, opts: CallOpts = {}): Promise<ScheduleRun[]> {\n const r = await this.http.json<Reply<'listScheduleRuns'>>(one(id, '/runs'), {\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...r.runs];\n }\n\n /** `GET /v1/schedule-runs?limit=` — recent runs of every schedule. */\n async recentRuns(limit = 50, opts: CallOpts = {}): Promise<ScheduleRun[]> {\n const r = await this.http.json<Reply<'listRecentScheduleRuns'>>('/v1/schedule-runs', {\n query: { limit },\n ext: opts.ext,\n signal: opts.signal,\n });\n return [...r.runs];\n }\n\n /** `POST /v1/schedule-runs/{id}/decision` — approve or skip a run waiting for you. */\n decide(runId: string, approve: boolean, opts: CallOpts = {}): Promise<ScheduleRun> {\n return this.http.json<ScheduleRun>(run(runId, '/decision'), {\n method: 'POST',\n body: { approve },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/schedules/pause` — vacation mode until `until` (or until resumed). */\n pause(\n body: { until?: string | null; resume_policy?: 'skip' | 'backfill' } = {},\n opts: CallOpts = {},\n ): Promise<Reply<'pauseSchedules'>> {\n return this.http.json('/v1/schedules/pause', {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/schedules/resume` — `backfill: true` runs each missed schedule once. */\n resume(\n body: { backfill?: boolean } = {},\n opts: CallOpts = {},\n ): Promise<Reply<'resumeSchedules'>> {\n return this.http.json('/v1/schedules/resume', {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/schedules/templates`. */\n templates(opts: CallOpts = {}): Promise<Reply<'listScheduleTemplates'>> {\n return this.http.json('/v1/schedules/templates', { ext: opts.ext, signal: opts.signal });\n }\n\n /** `POST /v1/schedules/templates` — canonical prompt + draft create body (no write). */\n renderTemplate(\n template: string,\n params: Record<string, unknown> = {},\n opts: CallOpts = {},\n ): Promise<Reply<'renderScheduleTemplate'>> {\n return this.http.json('/v1/schedules/templates', {\n method: 'POST',\n body: { template, params },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/schedules/stream` — live `schedule` events (keepalives skipped). */\n async *stream(opts: CallOpts = {}): AsyncGenerator<ScheduleStreamEvent, void, undefined> {\n for await (const frame of this.http.sse('/v1/schedules/stream', {\n ext: opts.ext,\n signal: opts.signal,\n })) {\n if (frame.event !== 'schedule') continue;\n const data = frameJson<ScheduleStreamEvent>(frame);\n if (data) yield data;\n }\n }\n}\n","/**\n * `/v1/transcripts/*` + `/v1/transcript-folders` + `/v1/transcript-vocabulary` + tus `/v1/uploads` — voice\n * recordings → diarized RO/EN transcripts → insights (summary, key points, actions, suggested agent prompts).\n * Feature-flagged per account (404 until enabled). Bodies are snake_case.\n */\nimport { CodaiError, type CodaiRequestExtensions, frameJson, type HttpClient } from '../http';\nimport { type Body, type Mutable, type QueryOf, type Reply, type Schema } from './_shared';\n\nexport type Transcript = Schema<'Transcript'>;\nexport type TranscriptDetail = Schema<'TranscriptDetail'>;\nexport type TranscriptStatus = Schema<'TranscriptStatus'>;\nexport type TranscriptFolder = Schema<'TranscriptFolder'>;\nexport type TranscriptList = Reply<'listTranscripts'>;\nexport type TranscriptListQuery = Mutable<QueryOf<'listTranscripts'>>;\nexport type TranscriptCreateRequest = Mutable<Body<'createTranscript'>>;\nexport type TranscriptPatch = Mutable<Body<'updateTranscript'>>;\nexport type TranscriptFinalizeRequest = Mutable<Body<'finalizeTranscript'>>;\nexport type TranscriptUsage = Reply<'getTranscriptUsage'>;\nexport type TranscriptSearchQuery = Mutable<QueryOf<'searchTranscripts'>>;\nexport type TranscriptSearchResult = Reply<'searchTranscripts'>;\nexport type TranscriptAskRequest = Mutable<Body<'askTranscripts'>>;\nexport type TranscriptAskResult = Reply<'askTranscripts'>;\nexport type TranscriptAudio = Reply<'getTranscriptAudio'>;\nexport type TranscriptBookmarkRequest = Mutable<Body<'addTranscriptBookmark'>>;\nexport type TranscriptSpeakerPatch = Mutable<Body<'updateTranscriptSpeaker'>>;\nexport type TranscriptExportFormat = 'md' | 'txt' | 'srt' | 'vtt' | 'json' | 'pdf' | 'docx';\nexport type TranscriptBinaryExportFormat = 'pdf' | 'docx';\nexport type TranscriptShareCreateRequest = Mutable<Schema<'TranscriptShareCreateRequest'>>;\nexport type TranscriptShareCreated = Schema<'TranscriptShareCreated'>;\nexport type TranscriptShare = Schema<'TranscriptShare'>;\nexport type PublicTranscript = Schema<'PublicTranscript'>;\n\n/** A text export (`md` / `txt` / `srt` / `vtt` / `json`). */\nexport interface TranscriptTextExport {\n text: string;\n filename: string | null;\n contentType: string | null;\n}\n\n/** A binary export (`pdf` / `docx`): raw bytes, save them as-is. */\nexport interface TranscriptBinaryExport {\n bytes: Uint8Array;\n filename: string | null;\n contentType: string | null;\n}\n\n/** One `event: transcript` frame of `GET /v1/transcripts/stream`. */\nexport interface TranscriptStreamEvent {\n op: 'upsert' | 'delete' | 'progress' | 'live';\n id: string;\n status?: TranscriptStatus;\n /** 0..1 on `progress`. */\n progress?: number;\n title?: string;\n /** `live`: rolling caption from the recording device (committed tail + partial); never persisted. */\n finals?: string;\n partial?: string;\n /** `live`: 0..1 input level. */\n level?: number;\n /** `live`: phone | wear | desktop. */\n device?: string;\n elapsed_ms?: number;\n paused?: boolean;\n}\n\n/** Body of `POST /v1/transcripts/{id}/live` (the recording device's caption, ~1/s). */\nexport interface TranscriptLiveCaption {\n finals?: string;\n partial?: string;\n level?: number;\n device: 'phone' | 'wear' | 'desktop';\n elapsed_ms: number;\n paused?: boolean;\n}\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nconst one = (id: string, suffix = '') => `/v1/transcripts/${encodeURIComponent(id)}${suffix}`;\n\nconst TUS = { 'Tus-Resumable': '1.0.0' } as const;\nexport const TUS_CHUNK_BYTES = 8 * 1024 * 1024;\n\n/** base64 of a UTF-8 string, without Buffer (browser + node). */\nfunction b64(s: string): string {\n const bytes = new TextEncoder().encode(s);\n let bin = '';\n for (const b of bytes) bin += String.fromCharCode(b);\n return btoa(bin);\n}\n\n/** Last path segment of a tus `Location` (absolute or relative). Exported for tests. */\nexport function uploadIdFromLocation(location: string): string {\n const path = location.replace(/[?#].*$/, '').replace(/\\/+$/, '');\n const id = decodeURIComponent(path.slice(path.lastIndexOf('/') + 1));\n if (!id) throw new CodaiError(`tus: no upload id in Location ${location}`, 0, null);\n return id;\n}\n\nexport interface UploadAudioOptions extends CallOpts {\n track?: 'mic' | 'system' | 'mixed';\n transcriptId?: string;\n durationMs?: number;\n chunkSize?: number;\n /** Resume a previous upload (its id) instead of creating one. */\n uploadId?: string;\n onProgress?: (sent: number, total: number) => void;\n}\n\nclass TranscriptFolders {\n constructor(private readonly http: HttpClient) {}\n /** `GET /v1/transcript-folders`. */\n list(opts: CallOpts = {}): Promise<Reply<'listTranscriptFolders'>> {\n return this.http.json('/v1/transcript-folders', { ext: opts.ext, signal: opts.signal });\n }\n /** `POST /v1/transcript-folders` — upsert on `name`. */\n create(\n body: Mutable<Body<'createTranscriptFolder'>>,\n opts: CallOpts = {},\n ): Promise<TranscriptFolder> {\n return this.http.json('/v1/transcript-folders', {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n /** `PATCH /v1/transcript-folders/{id}`. */\n update(\n id: string,\n body: Mutable<Body<'updateTranscriptFolder'>>,\n opts: CallOpts = {},\n ): Promise<TranscriptFolder> {\n return this.http.json(`/v1/transcript-folders/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n /** `DELETE /v1/transcript-folders/{id}` — transcripts stay, `folder_id` cleared. */\n async delete(id: string, opts: CallOpts = {}): Promise<void> {\n await this.http.request(`/v1/transcript-folders/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n\nclass TranscriptVocabulary {\n constructor(private readonly http: HttpClient) {}\n /** `GET /v1/transcript-vocabulary`. */\n get(opts: CallOpts = {}): Promise<Reply<'getTranscriptVocabulary'>> {\n return this.http.json('/v1/transcript-vocabulary', { ext: opts.ext, signal: opts.signal });\n }\n /** `PUT /v1/transcript-vocabulary` — replaces the whole list. */\n put(terms: string[], opts: CallOpts = {}): Promise<Reply<'putTranscriptVocabulary'>> {\n return this.http.json('/v1/transcript-vocabulary', {\n method: 'PUT',\n body: { terms },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n\nclass TranscriptShares {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * `POST /v1/transcripts/{id}/shares` — read-only public link (`https://hub.codai.ro/t/<token>`). The token/url\n * are returned ONCE (only a hash is stored). Omit `expiresInDays` for a link that never expires.\n */\n create(\n id: string,\n body: TranscriptShareCreateRequest = {},\n opts: CallOpts = {},\n ): Promise<TranscriptShareCreated> {\n return this.http.json<TranscriptShareCreated>(one(id, '/shares'), {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n }\n\n /** `GET /v1/transcripts/{id}/shares` — active links; `url` is always null (token not recoverable). */\n async list(id: string, opts: CallOpts = {}): Promise<TranscriptShare[]> {\n const r = await this.http.json<{ data: TranscriptShare[] }>(one(id, '/shares'), {\n ext: opts.ext,\n signal: opts.signal,\n });\n return r.data;\n }\n\n /** `DELETE /v1/transcripts/{id}/shares/{shareId}` — the public URL answers 404 from then on. */\n async revoke(id: string, shareId: string, opts: CallOpts = {}): Promise<void> {\n await this.http.request(one(id, `/shares/${encodeURIComponent(shareId)}`), {\n method: 'DELETE',\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n\nclass Uploads {\n constructor(private readonly http: HttpClient) {}\n\n /** `OPTIONS /v1/uploads` — tus capabilities (headers). */\n async capabilities(\n opts: CallOpts = {},\n ): Promise<{ version: string | null; extensions: string[]; maxSize: number | null }> {\n const res = await this.http.request('/v1/uploads', {\n method: 'OPTIONS',\n headers: TUS,\n ext: opts.ext,\n signal: opts.signal,\n });\n const max = res.headers.get('tus-max-size');\n return {\n version: res.headers.get('tus-version'),\n extensions: (res.headers.get('tus-extension') ?? '')\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean),\n maxSize: max ? Number(max) : null,\n };\n }\n\n /** `POST /v1/uploads` — tus creation; returns the upload id. */\n async create(\n length: number | null,\n metadata: Record<string, string>,\n opts: CallOpts = {},\n ): Promise<string> {\n const md = Object.entries(metadata)\n .map(([k, v]) => `${k} ${b64(v)}`)\n .join(',');\n const res = await this.http.request('/v1/uploads', {\n method: 'POST',\n headers: {\n ...TUS,\n ...(length === null ? { 'Upload-Defer-Length': '1' } : { 'Upload-Length': String(length) }),\n ...(md ? { 'Upload-Metadata': md } : {}),\n },\n noRetry: true,\n ext: opts.ext,\n signal: opts.signal,\n });\n const loc = res.headers.get('location');\n if (!loc) throw new CodaiError('tus: create response has no Location header', res.status, null);\n return uploadIdFromLocation(loc);\n }\n\n /** tus HEAD `/v1/uploads/{id}` — bytes the server holds (resume point). */\n async offset(\n id: string,\n opts: CallOpts = {},\n ): Promise<{ offset: number; length: number | null }> {\n const res = await this.http.request(`/v1/uploads/${encodeURIComponent(id)}`, {\n method: 'HEAD',\n headers: TUS,\n ext: opts.ext,\n signal: opts.signal,\n });\n const len = res.headers.get('upload-length');\n return {\n offset: Number(res.headers.get('upload-offset') ?? 0),\n length: len ? Number(len) : null,\n };\n }\n\n /** tus PATCH `/v1/uploads/{id}` — append one chunk at `offset`; returns the new offset. */\n async append(\n id: string,\n offset: number,\n chunk: Uint8Array,\n opts: CallOpts & { length?: number } = {},\n ): Promise<number> {\n const res = await this.http.request(`/v1/uploads/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n headers: {\n ...TUS,\n 'Upload-Offset': String(offset),\n 'Content-Type': 'application/offset+octet-stream',\n ...(opts.length !== undefined ? { 'Upload-Length': String(opts.length) } : {}),\n },\n rawBody: chunk as unknown as BodyInit,\n ext: opts.ext,\n signal: opts.signal,\n });\n const next = Number(res.headers.get('upload-offset') ?? -1);\n if (!(next > offset))\n throw new CodaiError(\n `tus: server offset ${next} did not advance past ${offset}`,\n res.status,\n null,\n );\n return next;\n }\n}\n\nexport class Transcripts {\n readonly folders: TranscriptFolders;\n readonly vocabulary: TranscriptVocabulary;\n readonly uploads: Uploads;\n readonly shares: TranscriptShares;\n\n constructor(private readonly http: HttpClient) {\n this.folders = new TranscriptFolders(http);\n this.vocabulary = new TranscriptVocabulary(http);\n this.uploads = new Uploads(http);\n this.shares = new TranscriptShares(http);\n }\n\n /** `GET /v1/transcripts` — pinned first, newest next; page with `next_cursor`. */\n list(query: TranscriptListQuery = {}, opts: CallOpts = {}): Promise<TranscriptList> {\n return this.http.json<TranscriptList>('/v1/transcripts', {\n query: query as Record<string, string | number | boolean | undefined>,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/transcripts` — status `recording`; idempotent on `client_id`. */\n create(body: TranscriptCreateRequest, opts: CallOpts = {}): Promise<Transcript> {\n return this.http.json<Transcript>('/v1/transcripts', {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/transcripts/{id}` — speakers, utterances (word timings), bookmarks, latest insights. */\n get(id: string, opts: CallOpts = {}): Promise<TranscriptDetail> {\n return this.http.json<TranscriptDetail>(one(id), { ext: opts.ext, signal: opts.signal });\n }\n\n /** `PATCH /v1/transcripts/{id}` — setting `title` locks it. */\n update(id: string, body: TranscriptPatch, opts: CallOpts = {}): Promise<Transcript> {\n return this.http.json<Transcript>(one(id), {\n method: 'PATCH',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `DELETE /v1/transcripts/{id}` — row + audio objects. */\n async delete(id: string, opts: CallOpts = {}): Promise<void> {\n await this.http.request(one(id), { method: 'DELETE', ext: opts.ext, signal: opts.signal });\n }\n\n /** `POST /v1/transcripts/{id}/finalize` — attach tus uploads + bookmarks → `queued`. */\n finalize(id: string, body: TranscriptFinalizeRequest, opts: CallOpts = {}): Promise<Transcript> {\n return this.http.json<Transcript>(one(id, '/finalize'), {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n acceptStatus: [202],\n });\n }\n\n /** `POST /v1/transcripts/{id}/retranscribe`. */\n retranscribe(id: string, opts: CallOpts = {}): Promise<Transcript> {\n return this.http.json<Transcript>(one(id, '/retranscribe'), {\n method: 'POST',\n body: {},\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n }\n\n /** `POST /v1/transcripts/{id}/reanalyze` — new insights version. */\n reanalyze(id: string, opts: CallOpts = {}): Promise<Transcript> {\n return this.http.json<Transcript>(one(id, '/reanalyze'), {\n method: 'POST',\n body: {},\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n }\n\n /**\n * `POST /v1/transcripts/{id}/live` — publish the recording device's live caption to every viewer of the transcript\n * (`stream()` / hub live view). Only while `recording`; frames closer than 250 ms are dropped. Returns nothing (204).\n */\n async publishLive(id: string, body: TranscriptLiveCaption, opts: CallOpts = {}): Promise<void> {\n await this.http.request(one(id, '/live'), {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n }\n\n /** `POST /v1/transcripts/{id}/bookmarks`. */\n addBookmark(\n id: string,\n body: TranscriptBookmarkRequest,\n opts: CallOpts = {},\n ): Promise<Reply<'addTranscriptBookmark', 201>> {\n return this.http.json(one(id, '/bookmarks'), {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `PATCH /v1/transcripts/{id}/speakers/{label}` — name a speaker / mark yourself (`is_owner`). */\n renameSpeaker(\n id: string,\n label: string,\n body: TranscriptSpeakerPatch,\n opts: CallOpts = {},\n ): Promise<Reply<'updateTranscriptSpeaker'>> {\n return this.http.json(one(id, `/speakers/${encodeURIComponent(label)}`), {\n method: 'PATCH',\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `PATCH /v1/transcripts/{id}/utterances/{seq}` — correct one utterance. */\n editUtterance(\n id: string,\n seq: number,\n text: string,\n opts: CallOpts = {},\n ): Promise<Reply<'updateTranscriptUtterance'>> {\n return this.http.json(one(id, `/utterances/${seq}`), {\n method: 'PATCH',\n body: { text },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/transcripts/{id}/audio` — signed playback URLs per track (empty after the 30-day retention). */\n audio(id: string, opts: CallOpts = {}): Promise<TranscriptAudio> {\n return this.http.json<TranscriptAudio>(one(id, '/audio'), {\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/transcripts/{id}/export?format=` — text for md/txt/srt/vtt/json, bytes for pdf/docx. */\n export(\n id: string,\n format: TranscriptBinaryExportFormat,\n opts?: CallOpts,\n ): Promise<TranscriptBinaryExport>;\n export(\n id: string,\n format?: Exclude<TranscriptExportFormat, TranscriptBinaryExportFormat>,\n opts?: CallOpts,\n ): Promise<TranscriptTextExport>;\n async export(\n id: string,\n format: TranscriptExportFormat = 'md',\n opts: CallOpts = {},\n ): Promise<TranscriptTextExport | TranscriptBinaryExport> {\n const res = await this.http.request(one(id, '/export'), {\n query: { format },\n ext: opts.ext,\n signal: opts.signal,\n });\n const cd = res.headers.get('content-disposition') ?? '';\n const m = /filename\\*=UTF-8''([^;]+)/i.exec(cd);\n const filename = m ? decodeURIComponent(m[1]!) : null;\n const contentType = res.headers.get('content-type');\n if (format === 'pdf' || format === 'docx')\n return { bytes: new Uint8Array(await res.arrayBuffer()), filename, contentType };\n return { text: await res.text(), filename, contentType };\n }\n\n /**\n * `GET /v1/public/transcripts/{token}` — the read-only view behind a share link (no API key needed; the\n * client's key is sent but ignored). 404 for unknown / expired / revoked links.\n */\n publicView(token: string, opts: CallOpts = {}): Promise<PublicTranscript> {\n return this.http.json<PublicTranscript>(`/v1/public/transcripts/${encodeURIComponent(token)}`, {\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/transcripts/{id}/prompts/{index}/accept` — suggested agent prompt → pending prompt. */\n acceptPrompt(\n id: string,\n index: number,\n opts: CallOpts = {},\n ): Promise<Reply<'acceptTranscriptPrompt', 201>> {\n return this.http.json(one(id, `/prompts/${index}/accept`), {\n method: 'POST',\n body: {},\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n }\n\n /** `GET /v1/transcripts/usage` — this month's allowance. */\n usage(opts: CallOpts = {}): Promise<TranscriptUsage> {\n return this.http.json<TranscriptUsage>('/v1/transcripts/usage', {\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `GET /v1/transcripts/search` — full-text (+ semantic in `hybrid`). */\n search(query: TranscriptSearchQuery, opts: CallOpts = {}): Promise<TranscriptSearchResult> {\n return this.http.json<TranscriptSearchResult>('/v1/transcripts/search', {\n query: query as Record<string, string | number | undefined>,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/transcripts/ask` — answer across your recordings with `[n]` citations. */\n ask(body: TranscriptAskRequest, opts: CallOpts = {}): Promise<TranscriptAskResult> {\n return this.http.json<TranscriptAskResult>('/v1/transcripts/ask', {\n method: 'POST',\n body,\n ext: opts.ext,\n signal: opts.signal,\n noRetry: true,\n });\n }\n\n /** `GET /v1/transcripts/stream` — live `transcript` events (keepalives skipped). Server closes after 55 min. */\n async *stream(opts: CallOpts = {}): AsyncGenerator<TranscriptStreamEvent, void, undefined> {\n const frames = this.http.sse('/v1/transcripts/stream', { ext: opts.ext, signal: opts.signal });\n for await (const frame of frames) {\n if (frame.event !== 'transcript') continue;\n const data = frameJson<TranscriptStreamEvent>(frame);\n if (data) yield data;\n }\n }\n\n /**\n * Upload one audio track with tus 1.0 (resumable): creates the upload (or resumes `uploadId` from the server's\n * offset), PATCHes ≤ 8 MB chunks and returns the upload id to pass to `finalize`.\n */\n async uploadAudio(\n data: Uint8Array | ArrayBuffer | Blob,\n opts: UploadAudioOptions = {},\n ): Promise<string> {\n const bytes =\n data instanceof Uint8Array\n ? data\n : data instanceof ArrayBuffer\n ? new Uint8Array(data)\n : new Uint8Array(await data.arrayBuffer());\n const total = bytes.byteLength;\n const chunk = Math.max(1, Math.min(opts.chunkSize ?? TUS_CHUNK_BYTES, TUS_CHUNK_BYTES));\n let id = opts.uploadId;\n let offset = 0;\n if (id) offset = (await this.uploads.offset(id, opts)).offset;\n else {\n const md: Record<string, string> = { track: opts.track ?? 'mic' };\n if (opts.transcriptId) md.transcript = opts.transcriptId;\n if (opts.durationMs !== undefined) md.durationMs = String(opts.durationMs);\n id = await this.uploads.create(total, md, opts);\n }\n opts.onProgress?.(offset, total);\n while (offset < total) {\n offset = await this.uploads.append(\n id,\n offset,\n bytes.subarray(offset, Math.min(total, offset + chunk)),\n opts,\n );\n opts.onProgress?.(offset, total);\n }\n return id;\n }\n}\n","/** `POST /v1/tokens` — ephemeral scoped tokens for browsers / webviews. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Reply } from './_shared';\n\n/** `live` = realtime + audio in one token (a live co-host's speech-to-text and text-to-speech). */\nexport type EphemeralScope = 'realtime' | 'audio' | 'embeddings' | 'live';\nexport type EphemeralTokenResponse = Reply<'createEphemeralToken'>;\n\nexport interface EphemeralToken {\n token: string;\n expiresAt: string;\n scope: EphemeralScope;\n raw: EphemeralTokenResponse;\n}\n\nexport class Tokens {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Mint a short-lived token (60–3600 s, default 600) bound to one surface.\n * Only a real `codai_` key may mint.\n */\n async create(\n scope: EphemeralScope,\n ttlSeconds?: number,\n opts: { ext?: CodaiRequestExtensions; signal?: AbortSignal } = {},\n ): Promise<EphemeralToken> {\n const raw = await this.http.json<EphemeralTokenResponse>('/v1/tokens', {\n body: { scope, ...(ttlSeconds !== undefined ? { ttl_seconds: ttlSeconds } : {}) },\n ext: opts.ext,\n signal: opts.signal,\n });\n return { token: raw.token, expiresAt: raw.expires_at, scope: raw.scope, raw };\n }\n}\n","/** `/v1/tools/*` — verified web search, server-side page fetch and GUI grounding. */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply } from './_shared';\n\nexport type ToolSearchRequest = Mutable<Body<'toolsSearch'>>;\nexport type ToolSearchResponse = Reply<'toolsSearch'>;\nexport type ToolFetchRequest = Mutable<Body<'toolsFetch'>>;\nexport type ToolFetchResponse = Reply<'toolsFetch'>;\nexport type ToolGroundRequest = Mutable<Body<'toolsGround'>>;\nexport type ToolGroundResponse = Reply<'toolsGround'>;\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nexport class Tools {\n constructor(private readonly http: HttpClient) {}\n\n /** `POST /v1/tools/search` — verified web search (never falls back to an unverified provider). */\n search(body: ToolSearchRequest, opts: CallOpts = {}): Promise<ToolSearchResponse> {\n return this.http.json<ToolSearchResponse>('/v1/tools/search', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `POST /v1/tools/fetch` — fetch + extract a public page (SSRF-guarded). */\n fetch(body: ToolFetchRequest, opts: CallOpts = {}): Promise<ToolFetchResponse> {\n return this.http.json<ToolFetchResponse>('/v1/tools/fetch', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /**\n * `POST /v1/tools/ground` — find a described UI element on an inline screenshot (`data:image/...;base64`).\n * Returns `x_norm`/`y_norm` in 0..1 (plus `x`/`y` pixels when `width`/`height` are sent); `found: false` = not on it.\n */\n ground(body: ToolGroundRequest, opts: CallOpts = {}): Promise<ToolGroundResponse> {\n return this.http.json<ToolGroundResponse>('/v1/tools/ground', {\n body,\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n","/** `/v1/usage` + `/v1/keys` — the caller's own usage breakdown and API keys (device attribution, tags). */\nimport { type CodaiRequestExtensions, type HttpClient } from '../http';\nimport { type Mutable, type QueryOf, type Reply, type Schema } from './_shared';\n\nexport type UsageReport = Schema<'UsageReport'>;\nexport type UsageRow = Schema<'UsageRow'>;\nexport type UsageGroupBy = UsageReport['group_by'];\n/** `from` / `to` are inclusive `YYYY-MM-DD` UTC dates; `cost_micro_usd` in the reply is USD micros as a string. */\nexport type UsageQuery = Mutable<QueryOf<'getUsage'>>;\nexport type ApiKeyInfo = Schema<'ApiKeyInfo'>;\nexport type ApiKeyList = Reply<'listKeys'>;\nexport type ApiKeyTags = Reply<'setKeyTags'>;\n\nexport interface ApiKeyListQuery {\n /** Also return revoked keys. */\n include_revoked?: boolean;\n}\n\ntype CallOpts = { ext?: CodaiRequestExtensions; signal?: AbortSignal };\n\nexport class Usage {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/usage` — default: last 30 days grouped by `day`; at most 400 days per call. */\n get(query: UsageQuery = {}, opts: CallOpts = {}): Promise<UsageReport> {\n return this.http.json<UsageReport>('/v1/usage', {\n query: {\n from: query.from,\n to: query.to,\n group_by: query.group_by,\n key: query.key,\n device: query.device,\n app: query.app,\n platform: query.platform,\n model: query.model,\n tag: query.tag,\n },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n\nexport class Keys {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/keys` — your keys (never the secret); `current: true` marks the calling key. */\n list(query: ApiKeyListQuery = {}, opts: CallOpts = {}): Promise<ApiKeyList> {\n return this.http.json<ApiKeyList>('/v1/keys', {\n query: { include_revoked: query.include_revoked ? 'true' : undefined },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n\n /** `PATCH /v1/keys/{id}` — replace the key's tags (≤ 16, each ≤ 32 chars; `[]` clears). */\n setTags(id: string, tags: string[], opts: CallOpts = {}): Promise<ApiKeyTags> {\n return this.http.json<ApiKeyTags>(`/v1/keys/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: { tags },\n ext: opts.ext,\n signal: opts.signal,\n });\n }\n}\n","/**\n * `/v1/verify/agent-output*` — EXPERIMENTAL, unaudited (HIDE protocol) verification of\n * signed agent outputs. Provenance only, never authentication. Unauthenticated endpoints.\n */\nimport { type HttpClient } from '../http';\nimport { type Body, type Mutable, type Reply, type Schema } from './_shared';\n\nexport type EnvironmentTaskOutputSignature = Schema<'EnvironmentTaskOutputSignature'>;\nexport type AgentOutputKey = Reply<'getAgentOutputKey'>;\nexport type AgentOutputVerifyBody = Mutable<Body<'verifyAgentOutput'>>;\nexport type AgentOutputVerifyResult = Reply<'verifyAgentOutput'>;\n\ntype CallOpts = { signal?: AbortSignal };\n\nexport class Verify {\n constructor(private readonly http: HttpClient) {}\n\n /** `GET /v1/verify/agent-output/key` — `{ enabled: false }` when signing is off. */\n agentOutputKey(opts: CallOpts = {}): Promise<AgentOutputKey> {\n return this.http.json<AgentOutputKey>('/v1/verify/agent-output/key', { signal: opts.signal });\n }\n\n /** `POST /v1/verify/agent-output` — 503 `signing_disabled` when signing is off. */\n agentOutput(body: AgentOutputVerifyBody, opts: CallOpts = {}): Promise<AgentOutputVerifyResult> {\n return this.http.json<AgentOutputVerifyResult>('/v1/verify/agent-output', {\n method: 'POST',\n body,\n signal: opts.signal,\n // 503 here means `signing_disabled`, not a transient outage.\n noRetry: true,\n });\n }\n}\n","/**\n * Single source of truth for OpenAPI parity: every `operationId` in\n * `apps/docs/openapi/en/gateway.yaml` maps to exactly one dotted method path\n * on the `Codai` client. `operations.test.ts` parses the YAML and fails when\n * an operation is missing, mapped to a non-function, or when this table\n * carries a key the YAML does not have.\n */\nexport const OPERATION_METHODS: Record<string, string> = {\n // Chat & Completions\n createChatCompletion: 'chat.completions.create',\n createResponse: 'responses.create',\n createMessage: 'messages.create',\n // Embeddings & Audio\n createEmbeddings: 'embeddings.create',\n createImage: 'images.generate',\n editImage: 'images.edit',\n createMusic: 'music.generate',\n createVideo: 'videos.create',\n getVideo: 'videos.retrieve',\n createRender: 'renders.create',\n getRender: 'renders.retrieve',\n listAssets: 'assets.list',\n getAsset: 'assets.retrieve',\n getAssetContent: 'assets.contentUrl',\n deleteAsset: 'assets.delete',\n searchSfx: 'sfx.search',\n importSfx: 'sfx.import',\n // Cards (typed card data)\n cardsWeather: 'cards.weather',\n cardsPlaces: 'cards.places',\n cardsGeocode: 'cards.geocode',\n cardsStaticMap: 'cards.staticMap',\n cardsFx: 'cards.fx',\n cardsUnfurl: 'cards.unfurl',\n createDocument: 'documents.create',\n retrieveDocument: 'documents.retrieve',\n createDocumentPreview: 'documents.preview',\n retrievePreview: 'documents.retrievePreview',\n createDocumentVideo: 'documents.video',\n createSystemOne: 'systemOne.create',\n createTranscription: 'audio.transcribe',\n createSpeech: 'audio.speech',\n createSpeechStream: 'audio.speechStream',\n createEphemeralToken: 'tokens.create',\n // Models\n listModels: 'models.list',\n // Health\n getHealth: 'health.get',\n getHealthReady: 'health.ready',\n getStatus: 'health.status',\n // Agents\n runAgentSync: 'agents.run',\n createAgentRun: 'agents.runs.create',\n getAgentRunStats: 'agents.runs.stats',\n getAgentRun: 'agents.runs.get',\n listAgentRunSteps: 'agents.runs.steps',\n streamAgentRun: 'agents.runs.stream',\n cancelAgentRun: 'agents.runs.cancel',\n // Tools\n toolsSearch: 'tools.search',\n toolsFetch: 'tools.fetch',\n toolsGround: 'tools.ground',\n // Tasks\n listTasks: 'tasks.list',\n listPendingTasks: 'tasks.pending',\n getTaskStats: 'tasks.stats',\n getTask: 'tasks.get',\n confirmTask: 'tasks.confirm',\n // Event triggers + inbox\n listTriggers: 'triggers.list',\n createTrigger: 'triggers.create',\n updateTrigger: 'triggers.update',\n deleteTrigger: 'triggers.delete',\n rotateTriggerSecret: 'triggers.rotateSecret',\n setTriggerSecret: 'triggers.setSecret',\n testTrigger: 'triggers.test',\n listTriggerEvents: 'triggers.events',\n receiveTriggerHook: 'triggers.fireHook',\n listNotifications: 'notifications.list',\n markNotificationsRead: 'notifications.markRead',\n deleteNotification: 'notifications.delete',\n deleteNotifications: 'notifications.deleteMany',\n // Pending prompts\n listPrompts: 'prompts.list',\n createPrompt: 'prompts.create',\n getPrompt: 'prompts.get',\n updatePrompt: 'prompts.update',\n deletePrompt: 'prompts.delete',\n launchPrompt: 'prompts.launch',\n matchPrompt: 'prompts.match',\n verifyPrompt: 'prompts.verify',\n verifyPrompts: 'prompts.verifyMany',\n streamPrompts: 'prompts.stream',\n // Transcripts\n listTranscripts: 'transcripts.list',\n createTranscript: 'transcripts.create',\n getTranscriptUsage: 'transcripts.usage',\n streamTranscripts: 'transcripts.stream',\n searchTranscripts: 'transcripts.search',\n askTranscripts: 'transcripts.ask',\n getTranscript: 'transcripts.get',\n updateTranscript: 'transcripts.update',\n deleteTranscript: 'transcripts.delete',\n finalizeTranscript: 'transcripts.finalize',\n retranscribeTranscript: 'transcripts.retranscribe',\n reanalyzeTranscript: 'transcripts.reanalyze',\n addTranscriptBookmark: 'transcripts.addBookmark',\n updateTranscriptSpeaker: 'transcripts.renameSpeaker',\n updateTranscriptUtterance: 'transcripts.editUtterance',\n getTranscriptAudio: 'transcripts.audio',\n exportTranscript: 'transcripts.export',\n acceptTranscriptPrompt: 'transcripts.acceptPrompt',\n createTranscriptShare: 'transcripts.shares.create',\n listTranscriptShares: 'transcripts.shares.list',\n revokeTranscriptShare: 'transcripts.shares.revoke',\n getPublicTranscript: 'transcripts.publicView',\n listTranscriptFolders: 'transcripts.folders.list',\n createTranscriptFolder: 'transcripts.folders.create',\n updateTranscriptFolder: 'transcripts.folders.update',\n deleteTranscriptFolder: 'transcripts.folders.delete',\n getTranscriptVocabulary: 'transcripts.vocabulary.get',\n putTranscriptVocabulary: 'transcripts.vocabulary.put',\n getUploadCapabilities: 'transcripts.uploads.capabilities',\n createUpload: 'transcripts.uploads.create',\n getUploadOffset: 'transcripts.uploads.offset',\n appendUpload: 'transcripts.uploads.append',\n publishTranscriptLive: 'transcripts.publishLive',\n // Scheduler\n listSchedules: 'schedules.list',\n createSchedule: 'schedules.create',\n previewSchedule: 'schedules.preview',\n streamSchedules: 'schedules.stream',\n getSchedule: 'schedules.get',\n updateSchedule: 'schedules.update',\n deleteSchedule: 'schedules.delete',\n runSchedule: 'schedules.runNow',\n listScheduleRuns: 'schedules.runs',\n listRecentScheduleRuns: 'schedules.recentRuns',\n decideScheduleRun: 'schedules.decide',\n approveScheduleCommand: 'schedules.executor.approveCommand',\n claimScheduleRun: 'schedules.executor.claim',\n heartbeatScheduleRun: 'schedules.executor.heartbeat',\n reportScheduleRunResult: 'schedules.executor.result',\n listSchedulerHosts: 'schedules.hosts.list',\n updateSchedulerHost: 'schedules.hosts.update',\n pauseSchedules: 'schedules.pause',\n resumeSchedules: 'schedules.resume',\n listScheduleTemplates: 'schedules.templates',\n renderScheduleTemplate: 'schedules.renderTemplate',\n listHeartbeats: 'heartbeats.list',\n createHeartbeat: 'heartbeats.create',\n updateHeartbeat: 'heartbeats.update',\n deleteHeartbeat: 'heartbeats.delete',\n // Usage & keys\n getUsage: 'usage.get',\n listKeys: 'keys.list',\n setKeyTags: 'keys.setTags',\n // Sessions\n createSession: 'sessions.create',\n listSessions: 'sessions.list',\n getSession: 'sessions.get',\n updateSession: 'sessions.update',\n deleteSession: 'sessions.delete',\n listSessionEvents: 'sessions.events.list',\n appendSessionEvents: 'sessions.events.append',\n listSessionControls: 'sessions.controls.list',\n submitSessionControl: 'sessions.controls.submit',\n markSessionControlApplied: 'sessions.controls.markApplied',\n dispatchToDevice: 'sessions.dispatch',\n claimSessionLease: 'sessions.lease.acquire',\n heartbeatSessionLease: 'sessions.lease.renew',\n releaseSessionLease: 'sessions.lease.release',\n streamSession: 'sessions.stream',\n // Devices\n getMyDispatchInbox: 'devices.dispatchInbox',\n listDevices: 'devices.list',\n updateDevice: 'devices.update',\n deleteDevice: 'devices.delete',\n revokeSelfKey: 'devices.revokeSelfKey',\n // Hosts\n listHosts: 'hosts.list',\n streamHost: 'hosts.stream',\n execOnHost: 'hosts.exec',\n postHostExecResult: 'hosts.postResult',\n // Orgs & Sharing\n listSessionsSharedWithMe: 'sessions.shares.sharedWithMe',\n listSessionShares: 'sessions.shares.list',\n createSessionShare: 'sessions.shares.create',\n deleteSessionShare: 'sessions.shares.delete',\n createOrg: 'orgs.create',\n listOrgs: 'orgs.list',\n listOrgMembers: 'orgs.members.list',\n addOrgMember: 'orgs.members.add',\n removeOrgMember: 'orgs.members.remove',\n // Projects\n listProjects: 'projects.list',\n createProject: 'projects.create',\n getProject: 'projects.get',\n updateProject: 'projects.update',\n deleteProject: 'projects.delete',\n // Environments\n listEnvironments: 'environments.list',\n createEnvironment: 'environments.create',\n enrollEnvironment: 'environments.enroll',\n getEnvironment: 'environments.get',\n updateEnvironment: 'environments.update',\n startEnvironment: 'environments.start',\n stopEnvironment: 'environments.stop',\n archiveEnvironment: 'environments.archive',\n destroyEnvironment: 'environments.destroy',\n createEnvironmentEnrollToken: 'environments.enrollToken',\n listEnvironmentMembers: 'environments.members.list',\n addEnvironmentMember: 'environments.members.add',\n setMyEnvironmentSshKey: 'environments.members.setSshKey',\n setEnvironmentMemberRole: 'environments.members.setRole',\n removeEnvironmentMember: 'environments.members.remove',\n issueMyEnvironmentSshCert: 'environments.members.sshCert',\n getEnvironmentSshCa: 'environments.sshCa',\n listEnvironmentTasks: 'environments.tasks.list',\n createEnvironmentTask: 'environments.tasks.create',\n getEnvironmentTask: 'environments.tasks.get',\n // Agent-output signatures (EXPERIMENTAL, HIDE)\n getAgentOutputKey: 'verify.agentOutputKey',\n verifyAgentOutput: 'verify.agentOutput',\n listEnvironmentPorts: 'environments.ports.list',\n setEnvironmentPort: 'environments.ports.set',\n removeEnvironmentPort: 'environments.ports.remove',\n listEnvironmentSecrets: 'environments.secrets.list',\n setEnvironmentSecret: 'environments.secrets.set',\n removeEnvironmentSecret: 'environments.secrets.remove',\n // Account\n getAccount: 'account.get',\n patchAccount: 'account.update',\n getSettings: 'settings.get',\n patchSettings: 'settings.update',\n getReceipt: 'receipt.get',\n submitFeedback: 'feedback.submit',\n listPhoneModels: 'phoneModels.list',\n};\n\n/** Operations whose SDK method is an async iterator (SSE-only endpoints). */\nexport const STREAMING_OPERATIONS: ReadonlySet<string> = new Set([\n 'streamAgentRun',\n 'streamSession',\n 'streamHost',\n 'createSpeechStream',\n 'streamPrompts',\n 'streamTranscripts',\n 'streamSchedules',\n]);\n\n/**\n * Same parity contract for the separate Resolve service\n * (`apps/docs/openapi/en/resolve.yaml`, host `resolveBaseUrl`) —\n * checked by `operations.resolve.test.ts`.\n */\nexport const RESOLVE_OPERATION_METHODS: Record<string, string> = {\n resolveHealth: 'resolve.health',\n createResolveJob: 'resolve.submit',\n getResolveJob: 'resolve.get',\n acceptResolveJob: 'resolve.accept',\n getResolveAttestation: 'resolve.attestation',\n getResolveKeys: 'resolve.keys',\n getResolveBalance: 'resolve.balance',\n};\n","/**\n * `CodaiApps` — management client for host apps (studiai.ro, …) that resell\n * codai to their own end users. It talks to the mgmt API (`api.codai.ro`),\n * not the gateway, and authenticates with an app connection token\n * (`codai_app_…`, created at codai.ro/console/apps/<app>), never a user key.\n *\n * keys.mint / list / update / revoke / usage → `/apps/keys*`\n * users.getOverride / setOverride / clearOverride → `/apps/users/:externalId/overrides`\n * subscriptions.sync → `/apps/subscriptions/sync`\n * validateKey → `/internal/keys/validate` (separate shared secret)\n *\n * Every call unwraps the `{ ok, data }` envelope and throws `CodaiError` on\n * a non-2xx reply (`error.code` such as `missing_scope:keys.mint`,\n * `no_key_for_external_id`, `not_owned_by_app`).\n */\n\nimport { CodaiError, HttpClient, type RequestOptions } from '../http';\n\nexport interface CodaiAppsOptions {\n /** App connection token (`codai_app_…`). Required for everything except `validateKey`. */\n appToken?: string;\n /** Shared secret for `POST /internal/keys/validate` (CODAI_VALIDATE_SHARED_SECRET on codai's side). */\n validateToken?: string;\n /** Defaults to https://api.codai.ro */\n baseUrl?: string;\n /** Default request timeout (ms). Default 20_000. */\n timeoutMs?: number;\n /** Retries on 429/5xx for idempotent calls. Default 1. `keys.mint` is never retried. */\n maxRetries?: number;\n fetch?: typeof fetch;\n}\n\nexport interface AppKeyMintInput {\n /** End user email; codai upserts its user by email so subscription syncs land on the same user. */\n email: string;\n /** The app's own stable id for the end user (≤ 200 chars). */\n endUserExternalId: string;\n label?: string;\n /** Tier slug within the app (defaults to the app's `default_tier_slug`). */\n tierSlug?: string;\n /** Attach to an existing subscription of this app + user. */\n subscriptionId?: string;\n /** Accepted for back-compat and ignored (euro caps were removed product-wide). */\n budgetEurPerDay?: number;\n /** Intersected with the app's own allowlist. */\n allowedModels?: string[];\n ratePerMinute?: number;\n ratePerHour?: number;\n maxInputTokens?: number;\n maxOutputTokens?: number;\n /** ISO 8601 with offset, in the future. Omit = never expires. */\n expiresAt?: string;\n}\n\nexport interface AppKeyMinted {\n id: string;\n /** Plaintext key — returned exactly once. */\n key: string;\n prefix: string;\n subscriptionId: string | null;\n expiresAt: string | null;\n}\n\nexport interface AppKeyListQuery {\n endUserExternalId?: string;\n /** 1..200, default 50. */\n limit?: number;\n offset?: number;\n}\n\nexport interface AppKey {\n id: string;\n label: string;\n prefix: string;\n enabled: boolean;\n subscriptionId: string | null;\n endUserExternalId: string | null;\n lastUsedAt: string | null;\n createdAt: string;\n revokedAt: string | null;\n expiresAt?: string | null;\n}\n\nexport interface AppKeyUpdate {\n label?: string;\n enabled?: boolean;\n}\n\nexport interface AppKeyUsageWindow {\n requests: number;\n tasks: number;\n costUsd: number;\n}\n\nexport interface AppKeyUsage {\n key: { id: string; prefix: string; label: string; createdAt: string };\n usage: {\n total: AppKeyUsageWindow & {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n today: AppKeyUsageWindow;\n month: AppKeyUsageWindow;\n tokensPerMinute?: {\n inputUsed: number;\n outputUsed: number;\n lastActiveInput?: number;\n lastActiveOutput?: number;\n lastActiveAt?: string | null;\n inputPeak?: number;\n inputPeakAt?: string | null;\n inputLimit: number;\n isDefaultLimit: boolean;\n };\n daily: Array<\n AppKeyUsageWindow & { date: string; promptTokens: number; completionTokens: number }\n >;\n };\n limits: {\n tierSlug: string | null;\n tierLabel: string | null;\n tasksPerDay: number | null;\n tasksPerMonth: number | null;\n ratePerMinute: number | null;\n ratePerHour: number | null;\n inputTokensPerMinute?: number | null;\n budgetEurPerDay: number | null;\n budgetEurPerMonth?: number | null;\n hasActiveSubscription: boolean;\n };\n}\n\n/** Per-(app, end user) override fields; `null` clears a field back to the tier value. */\nexport interface AppOverrideInput {\n forceTierSlug?: string | null;\n allowedModels?: string[] | null;\n ratePerMinute?: number | null;\n ratePerHour?: number | null;\n budgetEurPerDay?: number | null;\n budgetEurPerMonth?: number | null;\n tasksPerDay?: number | null;\n tasksPerMonth?: number | null;\n /** ISO 8601; null = never expires. */\n expiresAt?: string | null;\n note?: string | null;\n /** Restart task counting from now (usage history is kept). */\n resetUsage?: boolean | null;\n}\n\nexport interface AppOverrideRow {\n id: string;\n forceTierSlug: string | null;\n allowedModels: string[] | null;\n ratePerMinute: number | null;\n ratePerHour: number | null;\n budgetEurPerDay: string | number | null;\n budgetEurPerMonth?: string | number | null;\n tasksPerDay: number | null;\n tasksPerMonth: number | null;\n expiresAt: string | null;\n note: string | null;\n}\n\n/** Effective limits after merging the override on top of the subscription tier. */\nexport interface AppEffectiveLimits {\n tierSlug: string | null;\n tierLabel: string | null;\n allowedModels: string[] | null;\n ratePerMinute: number | null;\n ratePerDay?: number | null;\n budgetEurPerDay: number | null;\n budgetEurPerMonth?: number | null;\n tasksPerDay: number | null;\n tasksPerMonth: number | null;\n maxRoutingTier?: 'small' | 'medium' | 'large' | null;\n hasActiveSubscription: boolean;\n [extra: string]: unknown;\n}\n\nexport interface AppOverride {\n override: AppOverrideRow | null;\n effectiveLimits: AppEffectiveLimits;\n /** Present on reads: whether overrides are enabled for the app at all. */\n allowOverride?: boolean;\n}\n\nexport interface AppSubscriptionSyncInput {\n /** Email of the subscribing end user. */\n email: string;\n /** The Stripe event verbatim; codai re-shapes it server-side. */\n event: { id: string; type: string; data?: { object?: unknown } };\n}\n\nexport interface AppKeyValidation {\n ok: boolean;\n valid: boolean;\n key?: {\n id: string;\n prefix: string;\n label: string;\n appId: string;\n subscriptionId: string | null;\n endUserExternalId: string | null;\n };\n user?: { id: string };\n entitlements?: {\n tierSlug: string | null;\n hasActiveSubscription: boolean;\n allowedModels: string[] | null;\n ratePerMinute: number | null;\n ratePerHour: number | null;\n maxInputTokens: number | null;\n maxOutputTokens: number | null;\n budgetEurPerDay: number | null;\n supportsSubagents: boolean;\n supportsByok: boolean;\n };\n /** Set when `valid` is false (`key_not_found_or_disabled`). */\n reason?: string;\n}\n\ntype CallOpts = { signal?: AbortSignal };\ntype Envelope<T> = { ok: boolean; data?: T; error?: unknown };\n\nconst enc = encodeURIComponent;\n\nclass AppKeys {\n constructor(private readonly apps: CodaiApps) {}\n\n /** `POST /apps/keys` — mint a key for one of the app's end users (scope `keys.mint`). Never retried. */\n mint(input: AppKeyMintInput, o: CallOpts = {}): Promise<AppKeyMinted> {\n return this.apps.call('/apps/keys', { method: 'POST', body: input, noRetry: true, ...o });\n }\n\n /** `GET /apps/keys` — keys minted by this app, newest first (scope `usage.read`). */\n list(query: AppKeyListQuery = {}, o: CallOpts = {}): Promise<AppKey[]> {\n return this.apps.call('/apps/keys', {\n query: {\n endUserExternalId: query.endUserExternalId,\n limit: query.limit,\n offset: query.offset,\n },\n ...o,\n });\n }\n\n /** `PATCH /apps/keys/{id}` — change label / enabled (scope `keys.mint`). */\n update(\n id: string,\n patch: AppKeyUpdate,\n o: CallOpts = {},\n ): Promise<{ id: string } & AppKeyUpdate> {\n return this.apps.call(`/apps/keys/${enc(id)}`, { method: 'PATCH', body: patch, ...o });\n }\n\n /** `DELETE /apps/keys/{id}` — revoke (scope `keys.revoke`). */\n revoke(id: string, o: CallOpts = {}): Promise<{ id: string }> {\n return this.apps.call(`/apps/keys/${enc(id)}`, { method: 'DELETE', ...o });\n }\n\n /** `GET /apps/keys/{id}/usage?days=` — codai-side usage + effective limits; `days` clamps to 1..90. */\n usage(id: string, days = 30, o: CallOpts = {}): Promise<AppKeyUsage> {\n return this.apps.call(`/apps/keys/${enc(id)}/usage`, { query: { days }, ...o });\n }\n\n /** Revoke every non-revoked key minted for `endUserExternalId`; returns how many were revoked. */\n async revokeAllFor(endUserExternalId: string, o: CallOpts = {}): Promise<number> {\n const keys = await this.list({ endUserExternalId, limit: 200 }, o);\n let revoked = 0;\n for (const k of keys) {\n if (k.revokedAt) continue;\n await this.revoke(k.id, o);\n revoked++;\n }\n return revoked;\n }\n}\n\nclass AppUsers {\n constructor(private readonly apps: CodaiApps) {}\n\n /** `GET /apps/users/{externalId}/overrides` — current override + effective limits (scope `usage.read`). */\n getOverride(externalId: string, o: CallOpts = {}): Promise<AppOverride> {\n return this.apps.call(`/apps/users/${enc(externalId)}/overrides`, o);\n }\n\n /** `PUT /apps/users/{externalId}/overrides` — set / replace (scope `overrides.write`, app must allow overrides). */\n setOverride(externalId: string, input: AppOverrideInput, o: CallOpts = {}): Promise<AppOverride> {\n return this.apps.call(`/apps/users/${enc(externalId)}/overrides`, {\n method: 'PUT',\n body: input,\n ...o,\n });\n }\n\n /** `DELETE /apps/users/{externalId}/overrides` — clear (scope `overrides.write`). */\n clearOverride(externalId: string, o: CallOpts = {}): Promise<{ removed: boolean }> {\n return this.apps.call(`/apps/users/${enc(externalId)}/overrides`, { method: 'DELETE', ...o });\n }\n}\n\nclass AppSubscriptions {\n constructor(private readonly apps: CodaiApps) {}\n\n /** `POST /apps/subscriptions/sync` — forward a Stripe subscription event (scope `subscriptions.sync`; idempotent per subscription). */\n sync(\n input: AppSubscriptionSyncInput,\n o: CallOpts = {},\n ): Promise<{ subscriptionId: string | null }> {\n return this.apps.call('/apps/subscriptions/sync', { method: 'POST', body: input, ...o });\n }\n}\n\nexport class CodaiApps {\n readonly keys: AppKeys;\n readonly users: AppUsers;\n readonly subscriptions: AppSubscriptions;\n private readonly appHttp: HttpClient | null;\n private readonly validateHttp: HttpClient | null;\n\n constructor(opts: CodaiAppsOptions) {\n if (!opts.appToken && !opts.validateToken) {\n throw new Error('CodaiApps: appToken or validateToken is required');\n }\n const common = {\n baseUrl: opts.baseUrl ?? 'https://api.codai.ro',\n timeoutMs: opts.timeoutMs ?? 20_000,\n maxRetries: opts.maxRetries ?? 1,\n fetch: opts.fetch,\n };\n this.appHttp = opts.appToken ? new HttpClient({ apiKey: opts.appToken, ...common }) : null;\n this.validateHttp = opts.validateToken\n ? new HttpClient({ apiKey: opts.validateToken, ...common })\n : null;\n this.keys = new AppKeys(this);\n this.users = new AppUsers(this);\n this.subscriptions = new AppSubscriptions(this);\n }\n\n /**\n * `POST /internal/keys/validate` — does this plaintext key resolve to an\n * enabled codai key? Returns `{ valid: false, reason }` for unknown /\n * disabled keys; throws `CodaiError` for auth or transport failures.\n */\n async validateKey(key: string, o: CallOpts = {}): Promise<AppKeyValidation> {\n if (!this.validateHttp) throw new Error('CodaiApps: validateToken is required for validateKey');\n return this.validateHttp.json<AppKeyValidation>('/internal/keys/validate', {\n method: 'POST',\n body: { key },\n ...o,\n });\n }\n\n /** @internal Perform an app-token call and unwrap `{ ok, data }`. */\n async call<T>(path: string, init: RequestOptions = {}): Promise<T> {\n if (!this.appHttp) throw new Error('CodaiApps: appToken is required for /apps/* calls');\n const env = await this.appHttp.json<Envelope<T>>(path, init);\n if (!env || env.ok !== true || env.data === undefined) {\n throw new CodaiError(`codai ${path} → ok=false`, 200, env);\n }\n return env.data;\n }\n}\n","/**\n * codai-sdk — official TypeScript client for the codai AI gateway.\n *\n * Full parity with the public gateway OpenAPI (every `operationId` has one\n * method — see `OPERATION_METHODS`). Resources hang off the `Codai` client:\n *\n * client.chat.completions.create / .stream client.messages / client.responses\n * client.embeddings / client.images / client.audio / client.tokens / client.models / client.health\n * client.music.generate / client.videos.create / .retrieve / .generate (codai Studio, US-only)\n * client.renders.create / .retrieve / .render (codai Studio HyperFrames → MP4, codai-render)\n * client.assets.list / .retrieve / .contentUrl / .delete (stored codai Studio assets)\n * client.sfx.search / .import (codai Studio CC0 sound-effects library, codai-sfx)\n * client.documents.create / .retrieve / .preview / .retrievePreview / .video / .createPreviewAndWait / .videoAndWait\n * (codai Studio decks / docs / sheets → PPTX / DOCX / XLSX, codai-docs; previews codai-docs-preview)\n * client.systemOne.create / .batch (typed decisions, codai-s1)\n * client.realtime.connect (WebSocket live STT / voice; not an OpenAPI operation)\n * client.agents.run + client.agents.runs.* client.tools.search / .fetch\n * client.cards.weather / .places / .geocode / .staticMap / .fx / .unfurl (typed card data, `{ block, provenance }`)\n * client.tasks.* client.sessions.* (events, controls, lease, shares, stream)\n * client.devices.* / client.hosts.* client.orgs.* / client.account / client.receipt\n * client.settings.get / .update (account-level settings shared by every device)\n * client.usage.get / client.keys.list / .setTags (own usage breakdown + API keys)\n * client.projects.* client.environments.* (members, ports, secrets)\n * client.verify.agentOutputKey / .agentOutput (EXPERIMENTAL HIDE-signed agent outputs)\n * client.feedback / client.phoneModels\n * client.resolve.* (verified bug fixes on https://resolve.codai.ro — resolve.yaml)\n *\n * Top-level `chat()`, `chatStream()`, `embeddings()`, `models()`, `feedback()`,\n * `mintToken()` from 0.2.x are kept as thin aliases.\n *\n * Zero runtime dependencies; Node 18+ (global fetch) and modern edge runtimes.\n */\n\nimport { type CodaiRequestExtensions, HttpClient } from './http';\nimport { Account, Feedback, PhoneModels, Receipts } from './resources/account';\nimport { Agents } from './resources/agents';\nimport { Audio } from './resources/audio';\nimport { Cards } from './resources/cards';\nimport {\n Chat,\n type ChatCompletionInput,\n type ChatCompletionRequest,\n type ChatMessage,\n type ChatResult,\n type ChatStream,\n} from './resources/chat';\nimport { Devices } from './resources/devices';\nimport { Embeddings } from './resources/embeddings';\nimport { Environments } from './resources/environments';\nimport { Health } from './resources/health';\nimport { Hosts } from './resources/hosts';\nimport { Assets } from './resources/assets';\nimport { Images } from './resources/images';\nimport { Music, Renders, Videos } from './resources/media';\nimport { Documents } from './resources/documents';\nimport { Messages } from './resources/messages';\nimport { Models } from './resources/models';\nimport { Orgs } from './resources/orgs';\nimport { Projects } from './resources/projects';\nimport { Realtime } from './resources/realtime';\nimport { Resolve } from './resources/resolve';\nimport { Responses } from './resources/responses';\nimport { Sessions } from './resources/sessions';\nimport { Settings } from './resources/settings';\nimport { Sfx } from './resources/sfx';\nimport { SystemOne } from './resources/system-one';\nimport { Tasks } from './resources/tasks';\nimport { Notifications, Triggers } from './resources/triggers';\nimport { Prompts } from './resources/prompts';\nimport { Heartbeats, Schedules } from './resources/schedules';\nimport { Transcripts } from './resources/transcripts';\nimport { type EphemeralScope, type EphemeralToken, Tokens } from './resources/tokens';\nimport { Tools } from './resources/tools';\nimport { Keys, Usage } from './resources/usage-keys';\nimport { Verify } from './resources/verify';\n\nexport interface CodaiClientOptions {\n apiKey: string;\n /** Defaults to https://ai.codai.ro */\n baseUrl?: string;\n /** codai Resolve service host (`client.resolve`). Defaults to https://resolve.codai.ro */\n resolveBaseUrl?: string;\n /** Stable conversation/session id — sent as `x-codai-session-id` on every request. */\n sessionId?: string;\n /** Device UUID for shared-sessions / hosts — sent as `x-codai-device` on every request. */\n device?: string;\n /** Device name / platform recorded on first registration. */\n deviceName?: string;\n devicePlatform?: CodaiRequestExtensions['devicePlatform'];\n /** Client surface tag (`x-codai-client`). */\n client?: string;\n /** Any other default `X-Codai-*` extensions (per-call bags override). */\n defaults?: CodaiRequestExtensions;\n /** Default request timeout (ms). Default 120_000. Streams are not time-capped. */\n timeoutMs?: number;\n /** Retries on 429/5xx with exponential backoff. Default 2. */\n maxRetries?: number;\n /** Injectable fetch (tests / custom agents). */\n fetch?: typeof fetch;\n}\n\n/** 0.2.x-compatible chat options (thin alias over `chat.completions`). */\nexport interface ChatOptions {\n model?: string;\n messages: ChatMessage[];\n temperature?: number;\n maxTokens?: number;\n tools?: ChatCompletionRequest['tools'];\n /** codai extension: plan-and-execute agent mode (Pro+). */\n agentMode?: boolean;\n /** codai extension: server-side context compaction ('auto'). */\n compact?: 'auto';\n /** codai extension: best-of-N override (0 disables, 3 forces). */\n bestOf?: 0 | 3;\n /** Attribution id recorded on tool calls (agent fleets). */\n agentId?: string;\n /** Per-call session override. */\n sessionId?: string;\n /** Any other `X-Codai-*` extension. */\n ext?: CodaiRequestExtensions;\n signal?: AbortSignal;\n}\n\nexport interface EmbeddingsOptions {\n input: string | string[];\n model?: string;\n dimensions?: number;\n signal?: AbortSignal;\n}\n\nexport class Codai {\n readonly http: HttpClient;\n\n /** Resource group (`chat.completions.create/stream`) that is also callable with the 0.2.x `chat({ messages })` shape. */\n readonly chat: Chat & ((opts: ChatOptions) => Promise<ChatResult>);\n readonly messages: Messages;\n readonly responses: Responses;\n readonly embeddings: Embeddings &\n ((opts: EmbeddingsOptions) => Promise<{ embeddings: number[][]; raw: unknown }>);\n /** Image generation and editing (`images.generate({ prompt })`, `images.edit({ prompt, image })`; codai-image = gemini-3.1-flash-image, EU). */\n readonly images: Images;\n readonly audio: Audio;\n /** codai Studio music (`music.generate({ prompt, lyrics?, model? })`; Lyria 3 clip / pro with vocals, Lyria 2 legacy; US-only). */\n readonly music: Music;\n /** codai Studio video jobs (`videos.generate({ prompt })`; Veo 3.1 Fast, US-only, English prompts). */\n readonly videos: Videos;\n /** codai Studio renders (`renders.render({ html })`; HyperFrames HTML → MP4, codai-render, up to 180 s 1080p). */\n readonly renders: Renders;\n /** Stored codai Studio assets (`assets.list()`, `.retrieve(id)`, `.contentUrl(id)`, `.delete(id)`; 1 h signed URLs, kept 90 days). */\n readonly assets: Assets;\n /** codai Studio CC0 sound effects (`sfx.search({ q })`, `sfx.import(sfxId)` → asset `kind: 'sfx'`; free). */\n readonly sfx: Sfx;\n /** codai Studio documents (`documents.create({ type: 'deck', spec })` → PPTX / DOCX / XLSX, codai-docs, free; previews + deck → MP4). */\n readonly documents: Documents;\n /** Typed decisions from codai-s1 (`systemOne.create({ state, questions })`). */\n readonly systemOne: SystemOne;\n readonly tokens: Tokens;\n /** WebSocket realtime sessions (`realtime.connect({ model, language, token })`) — live STT and voice. */\n readonly realtime: Realtime;\n readonly models: Models & (() => Promise<Array<{ id: string }>>);\n readonly health: Health;\n readonly agents: Agents;\n readonly tools: Tools;\n /** Typed card data (`cards.weather({ lat, lng })`, `.places({ q })`, `.fx()`, `.unfurl(url)` → `{ block, provenance }`). */\n readonly cards: Cards;\n readonly tasks: Tasks;\n /** Event triggers — webhooks that notify you or start agent sessions. */\n readonly triggers: Triggers;\n /** Inbox of trigger / cloud-task notifications. */\n readonly notifications: Notifications;\n /** Pending prompts — ready-to-paste prompts left for a future chat (handoffs, dated follow-ups). */\n readonly prompts: Prompts;\n /** codai Scheduler — cron / natural-language schedules run on any of your hosts or in the cloud (`schedules.create`, `.executor.claim`). */\n readonly schedules: Schedules;\n /** Heartbeat monitors — dead-man switches for crons codai does not run (`heartbeats.create({ name, period_s })` → `ping_url`). */\n readonly heartbeats: Heartbeats;\n /** Transcripts — voice recordings → diarized transcripts + insights (feature-flagged per account). */\n readonly transcripts: Transcripts;\n /** Your own usage split by day / key / device / app / platform / model / client / tag. */\n readonly usage: Usage;\n /** Your API keys (device attribution, tags). */\n readonly keys: Keys;\n readonly sessions: Sessions;\n readonly devices: Devices;\n readonly hosts: Hosts;\n readonly orgs: Orgs;\n readonly projects: Projects;\n readonly environments: Environments;\n /** EXPERIMENTAL (HIDE, unaudited): verify signed agent outputs. Provenance only. */\n readonly verify: Verify;\n readonly account: Account;\n /** Account-level settings shared by every device (`settings.get()`, `settings.update(partial, { version })`). */\n readonly settings: Settings;\n readonly receipt: Receipts;\n readonly feedback: Feedback &\n ((requestId: string, rating: 1 | -1, comment?: string) => Promise<void>);\n readonly phoneModels: PhoneModels;\n /** codai Resolve — execution-verified bug fixes (separate host, `resolveBaseUrl`). */\n readonly resolve: Resolve;\n\n constructor(opts: CodaiClientOptions) {\n if (!opts.apiKey) throw new Error('Codai: apiKey is required');\n this.http = new HttpClient({\n apiKey: opts.apiKey,\n baseUrl: opts.baseUrl ?? 'https://ai.codai.ro',\n timeoutMs: opts.timeoutMs ?? 120_000,\n maxRetries: opts.maxRetries ?? 2,\n fetch: opts.fetch,\n defaults: {\n ...opts.defaults,\n ...(opts.sessionId ? { sessionId: opts.sessionId } : {}),\n ...(opts.device ? { device: opts.device } : {}),\n ...(opts.deviceName ? { deviceName: opts.deviceName } : {}),\n ...(opts.devicePlatform ? { devicePlatform: opts.devicePlatform } : {}),\n ...(opts.client ? { client: opts.client } : {}),\n },\n });\n const http = this.http;\n\n this.messages = new Messages(http);\n this.responses = new Responses(http);\n this.images = new Images(http);\n this.audio = new Audio(http);\n this.music = new Music(http);\n this.videos = new Videos(http);\n this.renders = new Renders(http);\n this.assets = new Assets(http);\n this.sfx = new Sfx(http);\n this.documents = new Documents(http);\n this.systemOne = new SystemOne(http);\n this.tokens = new Tokens(http);\n this.realtime = new Realtime({ baseUrl: http.baseUrl, apiKey: opts.apiKey });\n this.health = new Health(http);\n this.agents = new Agents(http);\n this.tools = new Tools(http);\n this.cards = new Cards(http);\n this.tasks = new Tasks(http);\n this.triggers = new Triggers(http);\n this.notifications = new Notifications(http);\n this.prompts = new Prompts(http);\n this.schedules = new Schedules(http);\n this.heartbeats = new Heartbeats(http);\n this.transcripts = new Transcripts(http);\n this.usage = new Usage(http);\n this.keys = new Keys(http);\n this.sessions = new Sessions(http);\n this.devices = new Devices(http);\n this.hosts = new Hosts(http);\n this.orgs = new Orgs(http);\n this.projects = new Projects(http);\n this.environments = new Environments(http);\n this.verify = new Verify(http);\n this.account = new Account(http);\n this.settings = new Settings(http);\n this.receipt = new Receipts(http);\n this.phoneModels = new PhoneModels(http);\n this.resolve = new Resolve(\n new HttpClient({\n apiKey: opts.apiKey,\n baseUrl: opts.resolveBaseUrl ?? 'https://resolve.codai.ro',\n timeoutMs: opts.timeoutMs ?? 120_000,\n maxRetries: opts.maxRetries ?? 2,\n fetch: opts.fetch,\n defaults: opts.client ? { client: opts.client } : {},\n }),\n );\n\n // Callable resources keep the 0.2.x top-level signatures working\n // (`client.embeddings({...})`, `client.models()`, `client.feedback(id, 1)`)\n // while also exposing `.create()` / `.list()` / `.submit()`.\n this.chat = callable(new Chat(http), (o: ChatOptions) =>\n this.chat.completions.create(this.legacyBody(o), {\n ext: this.legacyExt(o),\n signal: o.signal,\n }),\n );\n this.embeddings = callable(new Embeddings(http), async (o: EmbeddingsOptions) => {\n const r = await this.embeddings.create(\n { input: o.input, model: o.model, dimensions: o.dimensions },\n { signal: o.signal },\n );\n return { embeddings: r.embeddings, raw: r.raw };\n });\n this.models = callable(new Models(http), async () =>\n (await this.models.list()).map((m) => ({ id: m.id })),\n );\n this.feedback = callable(\n new Feedback(http),\n async (requestId: string, rating: 1 | -1, comment?: string) => {\n await this.feedback.submit({\n event_id: requestId,\n rating,\n ...(comment ? { comment } : {}),\n });\n },\n );\n }\n\n // ------------------------------------------------- 0.2.x compatibility aliases\n\n /** Alias of `chat.completions.stream()` with the 0.2.x option names. */\n chatStream(opts: ChatOptions): ChatStream {\n return this.chat.completions.stream(this.legacyBody(opts), {\n ext: this.legacyExt(opts),\n signal: opts.signal,\n });\n }\n\n /** Alias of `tokens.create()`. */\n mintToken(scope: EphemeralScope, ttlSeconds?: number): Promise<EphemeralToken> {\n return this.tokens.create(scope, ttlSeconds);\n }\n\n private legacyBody(opts: ChatOptions): ChatCompletionInput {\n return {\n model: opts.model ?? 'codai',\n messages: opts.messages,\n ...(opts.temperature !== undefined ? { temperature: opts.temperature } : {}),\n ...(opts.maxTokens !== undefined ? { max_tokens: opts.maxTokens } : {}),\n ...(opts.tools ? { tools: opts.tools } : {}),\n };\n }\n\n private legacyExt(opts: ChatOptions): CodaiRequestExtensions {\n return {\n ...opts.ext,\n ...(opts.sessionId ? { sessionId: opts.sessionId } : {}),\n ...(opts.agentMode ? { mode: 'agent' as const } : {}),\n ...(opts.compact ? { compact: opts.compact } : {}),\n ...(opts.bestOf !== undefined ? { bestOf: opts.bestOf } : {}),\n ...(opts.agentId ? { agentId: opts.agentId } : {}),\n };\n }\n}\n\n/**\n * Make an object callable: returns a function that forwards calls to `fn`\n * and carries every own/prototype member of `target` (methods bound).\n */\nfunction callable<T extends object, F extends (...args: never[]) => unknown>(\n target: T,\n fn: F,\n): T & F {\n const f = ((...args: Parameters<F>) => fn(...args)) as T & F;\n for (const key of allKeys(target)) {\n const value = (target as Record<string, unknown>)[key];\n Object.defineProperty(f, key, {\n value:\n typeof value === 'function' ? (value as (...a: unknown[]) => unknown).bind(target) : value,\n enumerable: true,\n writable: false,\n });\n }\n return f;\n}\n\nfunction allKeys(obj: object): string[] {\n const keys = new Set<string>();\n let cur: object | null = obj;\n while (cur && cur !== Object.prototype) {\n for (const k of Object.getOwnPropertyNames(cur)) if (k !== 'constructor') keys.add(k);\n cur = Object.getPrototypeOf(cur);\n }\n return [...keys];\n}\n\nexport default Codai;\n\n// ------------------------------------------------------------------ exports\nexport { CodaiError, HttpClient, extensionHeaders, readSse, frameJson } from './http';\nexport type { CodaiRequestExtensions, ErrorCode, SseFrame, RequestOptions } from './http';\nexport { OPERATION_METHODS, STREAMING_OPERATIONS, RESOLVE_OPERATION_METHODS } from './operations';\nexport type { paths, components, operations } from './generated/gateway';\nexport type {\n paths as ResolvePaths,\n components as ResolveComponents,\n operations as ResolveOperations,\n} from './generated/resolve';\n\nexport * from './resources/chat';\nexport * from './resources/messages';\nexport * from './resources/responses';\nexport * from './resources/embeddings';\nexport * from './resources/images';\nexport * from './resources/audio';\nexport * from './resources/media';\nexport * from './resources/assets';\nexport * from './resources/sfx';\nexport * from './resources/documents';\nexport * from './resources/tokens';\nexport * from './resources/realtime';\nexport * from './resources/system-one';\nexport * from './resources/models';\nexport * from './resources/health';\nexport * from './resources/agents';\nexport * from './resources/tools';\nexport * from './resources/cards';\nexport * from './resources/tasks';\nexport * from './resources/triggers';\nexport * from './resources/prompts';\nexport * from './resources/schedules';\nexport * from './resources/transcripts';\nexport * from './resources/usage-keys';\nexport * from './resources/sessions';\nexport * from './resources/devices';\nexport * from './resources/hosts';\nexport * from './resources/orgs';\nexport * from './resources/projects';\nexport * from './resources/environments';\nexport * from './resources/verify';\nexport * from './resources/account';\nexport * from './resources/settings';\nexport * from './resources/resolve';\nexport * from './resources/apps';\n"],"mappings":"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"}