@runwayml/avatars 0.16.0-beta.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/error.ts","../src/api/config.ts","../src/api/consume.ts","../src/utils/flatDeltaAccumulator.ts","../src/utils/parseClientEvent.ts","../src/utils/parseTranscription.ts","../src/emitter.ts","../src/transcript-accumulator.ts","../src/types.ts","../src/client.ts","../src/tools.ts","../src/api/page-actions.ts"],"names":["changed","LKConnectionQuality"],"mappings":";;;;;;;AASO,IAAM,WAAA,GAAN,cAA0B,KAAA,CAAM;AAAA,EAIrC,WAAA,CAAY,IAAA,EAAuB,OAAA,EAAiB,KAAA,EAAe;AACjE,IAAA,KAAA,CAAM,OAAO,CAAA;AAJf,IAAA,aAAA,CAAA,IAAA,EAAS,MAAA,CAAA;AACT,IAAA,aAAA,CAAA,IAAA,EAAS,OAAA,CAAA;AAIP,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AACF;AAEO,SAAS,aAAA,CACd,IAAA,EACA,eAAA,EACA,GAAA,EACa;AACb,EAAA,IAAI,GAAA,YAAe,aAAa,OAAO,GAAA;AACvC,EAAA,MAAM,KAAA,GAAQ,GAAA,YAAe,KAAA,GAAQ,GAAA,GAAM,MAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,OAAO,OAAA,IAAW,eAAA;AAClC,EAAA,OAAO,IAAI,WAAA,CAAY,IAAA,EAAM,OAAA,EAAS,KAAK,CAAA;AAC7C;;;AC9BO,IAAM,gBAAA,GAAmB,8BAAA;;;ACIhC,eAAsB,eACpB,OAAA,EACiC;AACjC,EAAA,MAAM,EAAE,SAAA,EAAW,UAAA,EAAY,OAAA,GAAU,kBAAiB,GAAI,OAAA;AAE9D,EAAA,MAAM,GAAA,GAAM,CAAA,EAAG,OAAO,CAAA,sBAAA,EAAyB,SAAS,CAAA,QAAA,CAAA;AACxD,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,IAChC,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB,kBAAA;AAAA,MAChB,aAAA,EAAe,UAAU,UAAU,CAAA;AAAA;AACrC,GACD,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,EAAK;AACtC,IAAA,MAAM,IAAI,WAAA;AAAA,MACR,gBAAA;AAAA,MACA,CAAA,2BAAA,EAA8B,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA;AAAA,KAC5D;AAAA,EACF;AAEA,EAAA,OAAO,SAAS,IAAA,EAAK;AACvB;;;ACIO,IAAM,uBAAN,MAA2B;AAAA,EAA3B,WAAA,GAAA;AACL,IAAA,aAAA,CAAA,IAAA,EAAiB,OAAA,sBAAY,GAAA,EAG3B,CAAA;AACF,IAAA,aAAA,CAAA,IAAA,EAAiB,WAAA,sBAAgB,GAAA,EAAY,CAAA;AAAA,EAAA;AAAA,EAE7C,MAAA,CAAO,OAAkB,mBAAA,EAAgD;AACvE,IAAA,MAAM,KAAK,CAAA,qBAAA,EAAwB,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,MAAM,IAAI,CAAA,CAAA;AAC3D,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAC9B,IAAA,MAAM,IAAA,GAAA,CAAQ,IAAA,EAAM,IAAA,IAAQ,EAAA,IAAM,KAAA,CAAM,SAAA;AACxC,IAAA,MAAM,QAAA,GAAW,MAAM,mBAAA,IAAuB,mBAAA;AAC9C,IAAA,IAAA,CAAK,MAAM,GAAA,CAAI,EAAA,EAAI,EAAE,IAAA,EAAM,mBAAA,EAAqB,UAAU,CAAA;AAE1D,IAAA,MAAM,MAAA,GAAS,CAAA,qBAAA,EAAwB,KAAA,CAAM,IAAI,CAAA,CAAA,CAAA;AACjD,IAAA,MAAM,YAAkC,EAAC;AACzC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,KAAK,KAAA,EAAO;AACpC,MAAA,IAAI,QAAQ,EAAA,IAAM,CAAC,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,EAAG;AAC3C,MAAA,IAAI,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,EAAG;AAC7B,MAAA,IAAA,CAAK,SAAA,CAAU,IAAI,GAAG,CAAA;AACtB,MAAA,SAAA,CAAU,IAAA,CAAK;AAAA,QACb,EAAA,EAAI,GAAA;AAAA,QACJ,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,qBAAqB,IAAA,CAAK;AAAA,OAC3B,CAAA;AAAA,IACH;AAEA,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,MAAA,EAAQ,EAAE,EAAA,EAAI,IAAA,EAAM,qBAAqB,QAAA;AAAS,KACpD;AAAA,EACF;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAM,KAAA,EAAM;AACjB,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACvB;AACF;;;AC9DA,SAAS,aAAa,IAAA,EAAwC;AAC5D,EAAA,OAAO,QAAA,IAAY,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,YAAA;AAC7C;AAMO,SAAS,iBAAiB,OAAA,EAAyC;AACxE,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAM,IAAI,aAAY,CAAE,MAAA,CAAO,OAAO,CAAC,CAAA;AAE5D,IAAA,IACE,SAAS,IAAA,KAAS,cAAA,IAClB,OAAO,OAAA,CAAQ,IAAA,KAAS,YACxB,OAAA,CAAQ,IAAA,IAAQ,IAAA,IAChB,OAAO,QAAQ,IAAA,KAAS,QAAA,IACxB,CAAC,YAAA,CAAa,OAAA,CAAQ,IAAI,CAAA,EAC1B;AACA,MAAA,OAAO,OAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC5BO,SAAS,cAAc,OAAA,EAA6C;AACzE,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,IAAI,WAAA,GAAc,MAAA,CAAO,OAAO,EAAE,IAAA,EAAK;AACpD,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,GAAG,GAAG,OAAO,IAAA;AAClC,IAAA,MAAM,MAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACvC,IAAA,OAAO,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,GAC9B,MAAA,GACD,IAAA;AAAA,EACN,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAOO,SAAS,oBAAA,CACd,MACA,WAAA,EACkC;AAClC,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,EAAA,MAAM,cACJ,IAAA,KAAS,MAAA,IACT,SAAS,eAAA,IACT,IAAA,KAAS,gBACT,IAAA,KAAS,kBAAA;AACX,EAAA,IAAI,CAAC,aAAa,OAAO,IAAA;AAEzB,EAAA,IAAI,WAAoB,IAAA,CAAK,QAAA;AAC7B,EAAA,IACE,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,IACvB,KAAK,IAAA,IACL,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,EACrB;AACA,IAAA,QAAA,GAAY,KAAK,IAAA,CAAyB,QAAA;AAAA,EAC5C;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,GAAG,OAAO,IAAA;AAErC,EAAA,MAAM,QAAA,GAAW,aAAa,QAAA,IAAY,SAAA;AAC1C,EAAA,MAAM,MAAiC,EAAC;AAExC,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACvC,IAAA,MAAM,GAAA,GAAM,IAAA;AACZ,IAAA,IAAI,OAAO,GAAA,CAAI,EAAA,KAAO,YAAY,OAAO,GAAA,CAAI,SAAS,QAAA,EAAU;AAChE,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA,MACP,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,OAAO,OAAO,GAAA,CAAI,KAAA,KAAU,SAAA,GAAY,IAAI,KAAA,GAAQ,IAAA;AAAA,MACpD,qBACE,OAAO,GAAA,CAAI,mBAAA,KAAwB,QAAA,GAC/B,IAAI,mBAAA,GACJ;AAAA,KACP,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,GAAA,CAAI,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,IAAA;AAChC;AAMO,SAAS,kBACd,IAAA,EAC0D;AAC1D,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,eAAA,EAAiB,OAAO,IAAA;AAC1C,EAAA,IAAI,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU,OAAO,IAAA;AAE1C,EAAA,OAAO;AAAA,IACL,MAAM,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,KAAK,IAAA,GAAO,WAAA;AAAA,IAClD,MAAM,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,KAAK,IAAA,GAAO,CAAA;AAAA,IAClD,WAAW,IAAA,CAAK;AAAA,GAClB;AACF;;;ACjEO,IAAM,UAAN,MAAkC;AAAA,EAAlC,WAAA,GAAA;AACL,IAAA,aAAA,CAAA,IAAA,EAAQ,WAAA,sBAAgB,GAAA,EAA2C,CAAA;AAAA,EAAA;AAAA,EAEnE,EAAA,CAAsB,OAAU,OAAA,EAA8B;AAC5D,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAClC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,uBAAU,GAAA,EAAI;AACd,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,EAAO,GAAG,CAAA;AAAA,IAC/B;AACA,IAAA,GAAA,CAAI,IAAI,OAAkC,CAAA;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAA,CAAwB,OAAU,OAAA,EAA8B;AAC9D,IAAA,MAAM,OAAA,IAAW,IAAI,IAAA,KAAe;AAClC,MAAA,IAAA,CAAK,GAAA,CAAI,OAAO,OAAO,CAAA;AACvB,MAAA,OAAA,CAAQ,GAAG,IAAI,CAAA;AAAA,IACjB,CAAA,CAAA;AACA,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO,OAAO,CAAA;AAAA,EAC/B;AAAA,EAEA,GAAA,CAAuB,OAAU,OAAA,EAA8B;AAC7D,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,OAAkC,CAAA;AACpE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEU,IAAA,CAAwB,UAAa,IAAA,EAAkB;AAC/D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,KAAA,MAAW,WAAW,GAAA,EAAK;AACzB,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,GAAG,IAAI,CAAA;AAAA,MACjB,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,MAAM,CAAA,6BAAA,EAAgC,MAAA,CAAO,KAAK,CAAC,aAAa,GAAG,CAAA;AAAA,MAC7E;AAAA,IACF;AAAA,EACF;AAAA,EAEA,mBAAmB,KAAA,EAAuB;AACxC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,IAC7B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,IACvB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAA;;;ACnDA,IAAM,mBAAA,GAAsB,GAAA;AAcrB,IAAM,qBAAA,GAAN,cAAoC,OAAA,CAA0B;AAAA,EAOnE,YAAY,OAAA,EAA6B;AACvC,IAAA,KAAA,EAAM;AAPR,IAAA,aAAA,CAAA,IAAA,EAAiB,KAAA,sBAAU,GAAA,EAAgC,CAAA;AAC3D,IAAA,aAAA,CAAA,IAAA,EAAiB,SAAA,EAAU,IAAI,oBAAA,EAAqB,CAAA;AACpD,IAAA,aAAA,CAAA,IAAA,EAAiB,SAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAiB,YAAA,CAAA;AACjB,IAAA,aAAA,CAAA,IAAA,EAAQ,YAA8C,EAAC,CAAA;AAIrD,IAAA,IAAA,CAAK,OAAA,GAAU,SAAS,OAAA,IAAW,KAAA;AACnC,IAAA,IAAA,CAAK,UAAA,GAAa,SAAS,UAAA,IAAc,mBAAA;AAAA,EAC3C;AAAA,EAEA,IAAI,OAAA,GAA6C;AAC/C,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CACE,UACA,mBAAA,EACM;AACN,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,CAAC,QAAQ,KAAA,EAAO;AACrC,MAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI;AAAA,QACvB,IAAI,OAAA,CAAQ,EAAA;AAAA,QACZ,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,mBAAA;AAAA,QACA,OAAA,EAAS;AAAA,OACV,CAAA;AACD,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AACA,IAAA,IAAI,OAAA,OAAc,KAAA,EAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAA,CACE,SACA,mBAAA,EACM;AACN,IAAA,MAAM,IAAA,GAAO,cAAc,OAAO,CAAA;AAClC,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,QAAA,GAAW,qBAAqB,IAAA,EAAM;AAAA,MAC1C,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAIA,QAAAA,GAAU,KAAA;AACd,MAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,QAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,CAAC,MAAM,KAAA,EAAO;AACnC,QAAA,IAAA,CAAK,GAAA,CAAI,IAAI,KAAA,CAAM,EAAA,EAAI,EAAE,GAAG,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,CAAA;AACtD,QAAAA,QAAAA,GAAU,IAAA;AAAA,MACZ;AACA,MAAA,IAAIA,QAAAA,OAAc,KAAA,EAAM;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,kBAAkB,IAAI,CAAA;AACpC,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAI,KAAK,OAAA,CAAQ,MAAA;AAAA,MACzC,KAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,MAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,CAAA;AACjE,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AAEA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,CAAA;AACtE,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ;AAEA,IAAA,IAAI,OAAA,OAAc,KAAA,EAAM;AAAA,EAC1B;AAAA,EAEA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,IAAI,KAAA,EAAM;AACf,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,WAAW,EAAC;AACjB,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AAAA,EAEQ,KAAA,GAAc;AACpB,IAAA,MAAM,SAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA;AAC3C,IAAA,IAAA,CAAK,QAAA,GACH,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,UAAA,GACjB,OAAO,KAAA,CAAM,CAAC,IAAA,CAAK,UAAU,CAAA,GAC7B,MAAA;AACN,IAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,QAAQ,CAAA;AAAA,EACnC;AACF;;;ACvDO,IAAM,WAAA,GAAc;AAAA,EACzB,YAAA,EAAc,cAAA;AAAA,EACd,UAAA,EAAY,YAAA;AAAA,EACZ,WAAA,EAAa,aAAA;AAAA,EACb,KAAA,EAAO,OAAA;AAAA,EACP,gBAAA,EAAkB,kBAAA;AAAA,EAClB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,eAAA,EAAiB,iBAAA;AAAA,EACjB,YAAA,EAAc,cAAA;AAAA,EACd,iBAAA,EAAmB,mBAAA;AAAA,EACnB,eAAA,EAAiB,iBAAA;AAAA,EACjB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,oBAAA,EAAsB,sBAAA;AAAA,EACtB,qBAAA,EAAuB;AACzB;;;AClDA,SAAS,YAAY,CAAA,EAA2C;AAC9D,EAAA,QAAQ,CAAA;AAAG,IACT,KAAKC,iBAAA,CAAoB,SAAA;AACvB,MAAA,OAAO,WAAA;AAAA,IACT,KAAKA,iBAAA,CAAoB,IAAA;AACvB,MAAA,OAAO,MAAA;AAAA,IACT,KAAKA,iBAAA,CAAoB,IAAA;AACvB,MAAA,OAAO,MAAA;AAAA,IACT,KAAKA,iBAAA,CAAoB,IAAA;AACvB,MAAA,OAAO,MAAA;AAAA,IACT;AACE,MAAA,OAAO,SAAA;AAAA;AAEb;AAEA,SAAS,eAAe,EAAA,EAAmC;AACzD,EAAA,QAAQ,EAAA;AAAI,IACV,KAAK,eAAA,CAAgB,UAAA;AACnB,MAAA,OAAO,YAAA;AAAA,IACT,KAAK,eAAA,CAAgB,SAAA;AACnB,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,eAAA,CAAgB,YAAA;AACnB,MAAA,OAAO,cAAA;AAAA,IACT,KAAK,eAAA,CAAgB,YAAA;AACnB,MAAA,OAAO,OAAA;AAAA,IACT;AACE,MAAA,OAAO,OAAA;AAAA;AAEb;AAQO,IAAM,aAAA,GAAN,cAA4B,OAAA,CAAwB;AAAA,EAuBzD,YAAY,SAAA,EAAmB;AAC7B,IAAA,KAAA,EAAM;AAvBR,IAAA,aAAA,CAAA,IAAA,EAAQ,MAAA,EAAoB,IAAA,CAAA;AAC5B,IAAA,aAAA,CAAA,IAAA,EAAQ,YAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,QAAA,EAAuB,MAAA,CAAA;AAC/B,IAAA,aAAA,CAAA,IAAA,EAAQ,QAAA,EAAuB,IAAA,CAAA;AAC/B,IAAA,aAAA,CAAA,IAAA,EAAQ,aAAA,EAAc,KAAA,CAAA;AACtB,IAAA,aAAA,CAAA,IAAA,EAAQ,gBAAA,EAAiB,KAAA,CAAA;AACzB,IAAA,aAAA,CAAA,IAAA,EAAQ,oBAAA,EAAqB,KAAA,CAAA;AAC7B,IAAA,aAAA,CAAA,IAAA,EAAQ,sBAAA,EAAgD,IAAA,CAAA;AACxD,IAAA,aAAA,CAAA,IAAA,EAAQ,sBAAA,EAAgD,IAAA,CAAA;AACxD,IAAA,aAAA,CAAA,IAAA,EAAQ,kBAAA,EAA4C,IAAA,CAAA;AACpD,IAAA,aAAA,CAAA,IAAA,EAAQ,kBAAA,EAA4C,IAAA,CAAA;AACpD,IAAA,aAAA,CAAA,IAAA,EAAQ,kBAAA,EAA4C,IAAA,CAAA;AACpD,IAAA,aAAA,CAAA,IAAA,EAAQ,kBAAA,EAA4C,IAAA,CAAA;AACpD,IAAA,aAAA,CAAA,IAAA,EAAQ,cAAA,EAAe,IAAI,oBAAA,EAAqB,CAAA;AAChD,IAAA,aAAA,CAAA,IAAA,EAAQ,eAAA,EAAgB,KAAA,CAAA;AACxB,IAAA,aAAA,CAAA,IAAA,EAAQ,iBAAA,EAAkB,KAAA,CAAA;AAC1B,IAAA,aAAA,CAAA,IAAA,EAAQ,cAAA,EAA8B,IAAA,CAAA;AAEtC,IAAA,aAAA,CAAA,IAAA,EAAS,KAAA,CAAA;AACT,IAAA,aAAA,CAAA,IAAA,EAAS,QAAA,CAAA;AACT,IAAA,aAAA,CAAA,IAAA,EAAS,aAAA,CAAA;AAIP,IAAA,IAAA,CAAK,UAAA,GAAa,SAAA;AAElB,IAAA,MAAM,IAAA,GAAO,IAAA;AAEb,IAAA,IAAA,CAAK,GAAA,GAAM;AAAA,MACT,IAAI,SAAA,GAAY;AACd,QAAA,OAAO,IAAA,CAAK,WAAA;AAAA,MACd,CAAA;AAAA,MACA,MAAA,EAAQ,MAAM,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AAAA,MAC9B,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAAA,MAChC,QAAQ,MAAM,IAAA,CAAK,MAAA,CAAO,CAAC,KAAK,WAAW,CAAA;AAAA,MAC3C,WAAW,CAAC,QAAA,KAAqB,IAAA,CAAK,YAAA,CAAa,cAAc,QAAQ;AAAA,KAC3E;AAEA,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,IAAI,SAAA,GAAY;AACd,QAAA,OAAO,IAAA,CAAK,cAAA;AAAA,MACd,CAAA;AAAA,MACA,MAAA,EAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AAAA,MACjC,OAAA,EAAS,MAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAAA,MACnC,QAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,CAAC,KAAK,cAAc,CAAA;AAAA,MACjD,WAAW,CAAC,QAAA,KAAqB,IAAA,CAAK,YAAA,CAAa,cAAc,QAAQ;AAAA,KAC3E;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc;AAAA,MACjB,IAAI,QAAA,GAAW;AACb,QAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,MACd,CAAA;AAAA,MACA,KAAA,EAAO,MAAM,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAAA,MACrC,IAAA,EAAM,MAAM,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAAA,MACrC,QAAQ,MAAM,IAAA,CAAK,cAAA,CAAe,CAAC,KAAK,kBAAkB;AAAA,KAC5D;AAAA,EACF;AAAA,EAEA,IAAI,KAAA,GAAsB;AACxB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,IAAI,SAAA,GAAoB;AACtB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,IAAI,KAAA,GAAsB;AACxB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA,EAEA,IAAI,eAAA,GAA2C;AAC7C,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA,EAEA,IAAI,QAAA,GAAmB;AACrB,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,EAAc,OAAO,CAAA;AAC/B,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,YAAA;AAAA,EAC3B;AAAA,EAEA,QAAwC,KAAA,EAAyC;AAC/E,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,MAAA,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,CAAA,GAAI,IAAA,KAA4B;AAChD,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAyB,CAAA;AAAA,MACzC,CAAA,EAA0C;AAAA,IAC5C,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,SAAS,OAAA,EAAiC;AACxC,IAAA,IAAA,CAAK,oBAAA,GAAuB,OAAA;AAC5B,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,OAAA,CAAQ,YAAY,IAAI,WAAA,CAAY,CAAC,IAAA,CAAK,gBAAgB,CAAC,CAAA;AAC3D,MAAA,OAAA,CAAQ,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,aAAA,GAAsB;AACpB,IAAA,IAAI,KAAK,oBAAA,EAAsB;AAC7B,MAAA,IAAA,CAAK,qBAAqB,SAAA,GAAY,IAAA;AAAA,IACxC;AACA,IAAA,IAAA,CAAK,oBAAA,GAAuB,IAAA;AAAA,EAC9B;AAAA,EAEA,YAAY,OAAA,EAAiC;AAC3C,IAAA,IAAA,CAAK,oBAAA,GAAuB,OAAA;AAC5B,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,OAAA,CAAQ,YAAY,IAAI,WAAA,CAAY,CAAC,IAAA,CAAK,gBAAgB,CAAC,CAAA;AAC3D,MAAA,OAAA,CAAQ,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,WAAA,GAAoB;AAClB,IAAA,IAAI,KAAK,oBAAA,EAAsB;AAC7B,MAAA,IAAA,CAAK,qBAAqB,SAAA,GAAY,IAAA;AAAA,IACxC;AACA,IAAA,IAAA,CAAK,oBAAA,GAAuB,IAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,GAAA,GAAqB;AACzB,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AAChB,IAAA,IAAA,CAAK,SAAS,QAAQ,CAAA;AAEtB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,MAAA,MAAM,IAAA,GAAO,QAAQ,MAAA,CAAO,IAAA,CAAK,UAAU,EAAE,IAAA,EAAM,UAAA,EAAY,CAAC,CAAA;AAChE,MAAA,MAAM,IAAA,CAAK,KAAK,gBAAA,CAAiB,WAAA,CAAY,MAAM,EAAE,QAAA,EAAU,MAAM,CAAA;AAAA,IACvE,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,EACf;AAAA,EAEA,WAAW,OAAA,EAAoD;AAC7D,IAAA,MAAM,GAAA,GAAM,IAAI,qBAAA,CAAsB,OAAO,CAAA;AAE7C,IAAA,MAAM,gBAAA,GAAmB,CAAC,KAAA,KAA8B;AACtD,MAAA,GAAA,CAAI,YAAA;AAAA,QACF,CAAC,EAAE,EAAA,EAAI,KAAA,CAAM,EAAA,EAAI,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,CAAA;AAAA,QACvD,KAAA,CAAM;AAAA,OACR;AAAA,IACF,CAAA;AAEA,IAAA,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,UAAA,EAAY,gBAAgB,CAAA;AAEhD,IAAA,MAAM,eAAA,GAAkB,GAAA,CAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAC5C,IAAA,GAAA,CAAI,UAAU,MAAM;AAClB,MAAA,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,UAAA,EAAY,gBAAgB,CAAA;AACjD,MAAA,eAAA,EAAgB;AAAA,IAClB,CAAA;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,aAAA,CACE,YACA,OAAA,EACY;AACZ,IAAA,MAAM,IAAA,GAAO,OAAO,UAAA,KAAe,QAAA,GAAW,aAAa,UAAA,CAAW,IAAA;AACtE,IAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAuB;AAC7C,MAAA,IAAI,KAAA,CAAM,SAAS,IAAA,EAAM;AACvB,QAAA,OAAA,CAAQ,MAAM,IAAS,CAAA;AAAA,MACzB;AAAA,IACF,CAAA;AACA,IAAA,IAAA,CAAK,EAAA,CAAG,WAAA,CAAY,WAAA,EAAa,cAAc,CAAA;AAC/C,IAAA,OAAO,MAAM,IAAA,CAAK,GAAA,CAAI,WAAA,CAAY,aAAa,cAAc,CAAA;AAAA,EAC/D;AAAA;AAAA,EAGA,MAAM,QAAA,CACJ,SAAA,EACA,KAAA,EACA,OAAA,EACe;AACf,IAAA,IAAA,CAAK,SAAS,YAAY,CAAA;AAE1B,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK;AAAA,MACpB,cAAA,EAAgB,KAAA;AAAA,MAChB,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,MAAA,IAAA,CAAK,eAAe,IAAI,CAAA;AACxB,MAAA,MAAM,KAAK,OAAA,CAAQ,SAAA,EAAW,OAAO,EAAE,aAAA,EAAe,MAAM,CAAA;AAC5D,MAAA,MAAM,IAAA,CAAK,kBAAA,CAAmB,IAAA,EAAM,OAAO,CAAA;AAAA,IAC7C,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,MAAA,IAAA,CAAK,UAAA,EAAW,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAChC,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,mBAAA,EAAqB,8BAAA,EAAgC,GAAG,CAAA;AACpF,MAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AACnB,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,mBAAmB,MAAA,EAAoC;AAC3D,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AAChB,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,cAAA,EAAe,CAAE,CAAC,CAAA;AAC5C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,YAAA,CAAa,UAAA,EAAY;AAAA,QACxD,MAAA,EAAQ,MAAM,MAAA,CAAO;AAAA,OACtB,CAAA;AAAA,IACH;AACA,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,cAAA,EAAe,CAAE,CAAC,CAAA;AAC5C,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,YAAA,CAAa,UAAA,EAAY;AAAA,QACxD,MAAA,EAAQ,MAAM,MAAA,CAAO;AAAA,OACtB,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,eAAe,IAAA,EAAkB;AACvC,IAAA,IAAA,CAAK,EAAA,CAAG,SAAA,CAAU,sBAAA,EAAwB,CAAC,KAAA,KAA2B;AACpE,MAAA,IAAA,CAAK,QAAA,CAAS,cAAA,CAAe,KAAK,CAAC,CAAA;AAAA,IACrC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,SAAA,CAAU,YAAA,EAAc,MAAM;AACpC,MAAA,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,IACvB,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,SAAA,CAAU,WAAA,EAAa,MAAM;AACnC,MAAA,IAAA,CAAK,cAAA,EAAe;AAAA,IACtB,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA;AAAA,MACH,SAAA,CAAU,eAAA;AAAA,MACV,CAAC,OAAO,WAAA,KAAwC;AAC9C,QAAA,IAAI,MAAM,IAAA,KAAS,OAAA,IAAW,YAAY,MAAA,KAAW,KAAA,CAAM,OAAO,MAAA,EAAQ;AACxE,UAAA,MAAM,aAAa,KAAA,CAAM,gBAAA;AACzB,UAAA,IAAA,CAAK,gBAAA,GAAmB,UAAA;AACxB,UAAA,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,gBAAA,EAAkB,UAAU,CAAA;AAClD,UAAA,IAAA,CAAK,iBAAiB,UAAU,CAAA;AAAA,QAClC;AAEA,QAAA,IAAI,MAAM,IAAA,KAAS,OAAA,IAAW,YAAY,MAAA,KAAW,KAAA,CAAM,OAAO,UAAA,EAAY;AAC5E,UAAA,MAAM,aAAa,KAAA,CAAM,gBAAA;AACzB,UAAA,IAAA,CAAK,gBAAA,GAAmB,UAAA;AACxB,UAAA,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,gBAAA,EAAkB,UAAU,CAAA;AAElD,UAAA,IAAI,KAAK,oBAAA,EAAsB;AAC7B,YAAA,IAAA,CAAK,qBAAqB,SAAA,GAAY,IAAI,WAAA,CAAY,CAAC,UAAU,CAAC,CAAA;AAClE,YAAA,IAAA,CAAK,oBAAA,CAAqB,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM;AAAA,YAAC,CAAC,CAAA;AAAA,UACjD,CAAA,MAAO;AACL,YAAA,IAAA,CAAK,cAAc,UAAU,CAAA;AAAA,UAC/B;AAAA,QACF;AAEA,QAAA,IAAI,MAAM,IAAA,KAAS,OAAA,IAAW,YAAY,MAAA,KAAW,KAAA,CAAM,OAAO,WAAA,EAAa;AAC7E,UAAA,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,gBAAA,EAAkB,KAAA,CAAM,gBAAgB,CAAA;AAAA,QAChE;AAAA,MACF;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,EAAA,CAAG,SAAA,CAAU,iBAAA,EAAmB,CAAC,QAAQ,WAAA,KAAwC;AACpF,MAAA,IAAI,WAAA,CAAY,MAAA,KAAW,KAAA,CAAM,MAAA,CAAO,MAAA,EAAQ;AAC9C,QAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,MAC1B;AACA,MAAA,IAAI,WAAA,CAAY,MAAA,KAAW,KAAA,CAAM,MAAA,CAAO,UAAA,EAAY;AAClD,QAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,MAC1B;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA;AAAA,MACH,SAAA,CAAU,YAAA;AAAA,MACV,CAAC,SAAqB,WAAA,KAA8B;AAClD,QAAA,MAAM,KAAA,GAAQ,iBAAiB,OAAO,CAAA;AACtC,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,WAAA,EAAa,KAAK,CAAA;AACxC,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,QAAA,GAAW,aAAa,QAAA,IAAY,SAAA;AAC1C,QAAA,MAAM,IAAA,GAAO,cAAc,OAAO,CAAA;AAClC,QAAA,IAAI,CAAC,IAAA,EAAM;AAEX,QAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,IAAA,EAAM,EAAE,UAAU,CAAA;AACxD,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,YAAA,IAAA,CAAK,IAAA,CAAK,YAAY,UAAA,EAAY,EAAE,GAAG,KAAA,EAAO,OAAA,EAAS,UAAU,CAAA;AAAA,UACnE;AACA,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,KAAA,GAAQ,kBAAkB,IAAI,CAAA;AACpC,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAI,KAAK,YAAA,CAAa,MAAA;AAAA,YAC9C,KAAA;AAAA,YACA;AAAA,WACF;AACA,UAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,YAAA,IAAA,CAAK,IAAA,CAAK,YAAY,UAAA,EAAY;AAAA,cAChC,GAAG,IAAA;AAAA,cACH,KAAA,EAAO,IAAA;AAAA,cACP,OAAA,EAAS;AAAA,aACV,CAAA;AAAA,UACH;AACA,UAAA,IAAA,CAAK,IAAA,CAAK,YAAY,UAAA,EAAY;AAAA,YAChC,GAAG,MAAA;AAAA,YACH,KAAA,EAAO,KAAA;AAAA,YACP,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH;AAAA,MACF;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,EAAA;AAAA,MACH,SAAA,CAAU,qBAAA;AAAA,MACV,CAAC,UAAuC,WAAA,KAA8B;AACpE,QAAA,MAAM,QAAA,GAAW,aAAa,QAAA,IAAY,SAAA;AAC1C,QAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,UAAA,IAAA,CAAK,IAAA,CAAK,YAAY,UAAA,EAAY;AAAA,YAChC,IAAI,OAAA,CAAQ,EAAA;AAAA,YACZ,MAAM,OAAA,CAAQ,IAAA;AAAA,YACd,OAAO,OAAA,CAAQ,KAAA;AAAA,YACf,mBAAA,EAAqB,QAAA;AAAA,YACrB,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH;AAAA,MACF;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,EAAA,CAAG,SAAA,CAAU,iBAAA,EAAmB,CAAC,KAAA,KAAiB;AACrD,MAAA,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,KAAK,CAAA;AAAA,IACpC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,SAAA,CAAU,qBAAA,EAAuB,CAAC,QAAA,KAAiC;AACzE,MAAA,MAAM,aAAA,GAAgB,KAAK,gBAAA,CAAiB,QAAA;AAC5C,MAAA,MAAM,gBAAgB,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,aAAa,CAAA;AACvE,MAAA,MAAM,iBAAiB,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,aAAa,CAAA;AAExE,MAAA,IAAI,aAAA,IAAiB,CAAC,IAAA,CAAK,aAAA,EAAe;AACxC,QAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,QAAA,IAAA,CAAK,IAAA,CAAK,YAAY,iBAAiB,CAAA;AAAA,MACzC,CAAA,MAAA,IAAW,CAAC,aAAA,IAAiB,IAAA,CAAK,aAAA,EAAe;AAC/C,QAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,QAAA,IAAA,CAAK,IAAA,CAAK,YAAY,eAAe,CAAA;AAAA,MACvC;AAEA,MAAA,IAAI,cAAA,IAAkB,CAAC,IAAA,CAAK,eAAA,EAAiB;AAC3C,QAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,QAAA,IAAA,CAAK,IAAA,CAAK,YAAY,mBAAmB,CAAA;AAAA,MAC3C,CAAA,MAAA,IAAW,CAAC,cAAA,IAAkB,IAAA,CAAK,eAAA,EAAiB;AAClD,QAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,QAAA,IAAA,CAAK,IAAA,CAAK,YAAY,iBAAiB,CAAA;AAAA,MACzC;AAEA,MAAA,MAAM,SAA+B,EAAC;AACtC,MAAA,IAAI,aAAA,EAAe,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AACrC,MAAA,IAAI,cAAA,EAAgB,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA;AACxC,MAAA,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,qBAAA,EAAuB,MAAM,CAAA;AAAA,IACrD,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA;AAAA,MACH,SAAA,CAAU,wBAAA;AAAA,MACV,CAAC,SAA8B,YAAA,KAA8B;AAC3D,QAAA,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,wBAAA,EAA0B,WAAA,CAAY,OAAO,CAAC,CAAA;AAAA,MACtE;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,cAAA,GAAuB;AAC7B,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,IAAA,CAAK,gBAAA,CAAiB,KAAK,gBAAgB,CAAA;AAAA,IAC7C;AACA,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,IAAI,KAAK,oBAAA,EAAsB;AAC7B,QAAA,IAAA,CAAK,qBAAqB,SAAA,GAAY,IAAI,YAAY,CAAC,IAAA,CAAK,gBAAgB,CAAC,CAAA;AAC7E,QAAA,IAAA,CAAK,oBAAA,CAAqB,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MACjD,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,aAAA,CAAc,KAAK,gBAAgB,CAAA;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iBAAiB,KAAA,EAA+B;AACtD,IAAA,IAAI,KAAK,oBAAA,EAAsB;AAC7B,MAAA,IAAA,CAAK,qBAAqB,SAAA,GAAY,IAAI,WAAA,CAAY,CAAC,KAAK,CAAC,CAAA;AAC7D,MAAA,IAAA,CAAK,oBAAA,CAAqB,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IACjD;AAAA,EACF;AAAA,EAEA,MAAc,kBAAA,CACZ,IAAA,EACA,OAAA,EACe;AACf,IAAA,IACE,OAAO,SAAA,KAAc,WAAA,IACrB,CAAC,SAAA,CAAU,cAAc,YAAA,EACzB;AACA,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OACF;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,KAAA,GAAQ,IAAA,EAAM,KAAA,GAAQ,MAAK,GAAI,OAAA;AAEvC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,oBAAA,EAAsB,SAAS,CAAA;AACrD,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,oBAAA,CAAqB,IAAI,CAAA;AACrD,QAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,QAAA,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,oBAAA,EAAsB,SAAS,CAAA;AAAA,MACvD,SAAS,GAAA,EAAK;AACZ,QAAA,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,oBAAA,EAAsB,QAAQ,CAAA;AACpD,QAAA,IAAA,CAAK,KAAK,WAAA,CAAY,KAAA,EAAO,cAAc,yBAAA,EAA2B,0BAAA,EAA4B,GAAG,CAAC,CAAA;AAAA,MACxG;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,gBAAA,CAAiB,IAAI,CAAA;AACjD,QAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,QAAA,IAAA,CAAK,oBAAoB,IAAI,CAAA;AAAA,MAC/B,SAAS,GAAA,EAAK;AACZ,QAAA,IAAA,CAAK,KAAK,WAAA,CAAY,KAAA,EAAO,cAAc,yBAAA,EAA2B,sBAAA,EAAwB,GAAG,CAAC,CAAA;AAAA,MACpG;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,YAAY,YAAY,CAAA;AAAA,EACpC;AAAA,EAEA,MAAc,OAAO,OAAA,EAAiC;AACpD,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,IAAQ,CAAC,SAAA,CAAU,cAAc,YAAA,EAAc;AACzD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,oBAAA,CAAqB,OAAO,CAAA;AAC7D,MAAA,IAAA,CAAK,WAAA,GAAc,OAAA;AACnB,MAAA,IAAA,CAAK,IAAA,CAAK,YAAY,YAAY,CAAA;AAAA,IACpC,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,KAAK,WAAA,CAAY,KAAA,EAAO,cAAc,oBAAA,EAAsB,6BAAA,EAA+B,GAAG,CAAC,CAAA;AAAA,IACtG;AAAA,EACF;AAAA,EAEA,MAAc,UAAU,OAAA,EAAiC;AACvD,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,IAAQ,CAAC,SAAA,CAAU,cAAc,YAAA,EAAc;AACzD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,gBAAA,CAAiB,OAAO,CAAA;AACzD,MAAA,IAAA,CAAK,cAAA,GAAiB,OAAA;AACtB,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAA,CAAK,mBAAA,CAAoB,KAAK,IAAI,CAAA;AAAA,MACpC,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,MAC1B;AACA,MAAA,IAAA,CAAK,IAAA,CAAK,YAAY,YAAY,CAAA;AAAA,IACpC,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,KAAK,WAAA,CAAY,KAAA,EAAO,cAAc,oBAAA,EAAsB,yBAAA,EAA2B,GAAG,CAAC,CAAA;AAAA,IAClG;AAAA,EACF;AAAA,EAEQ,oBAAoB,IAAA,EAAkB;AAC5C,IAAA,MAAM,MAAM,IAAA,CAAK,gBAAA,CAAiB,mBAAA,CAAoB,KAAA,CAAM,OAAO,MAAM,CAAA;AACzE,IAAA,MAAM,UAAA,GAAa,KAAK,KAAA,EAAO,gBAAA;AAC/B,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAA,CAAK,gBAAA,GAAmB,UAAA;AACxB,MAAA,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,eAAA,EAAiB,UAAU,CAAA;AACjD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,cAAc,MAAM;AACxB,MAAA,MAAM,WAAW,IAAA,CAAK,gBAAA,CAAiB,mBAAA,CAAoB,KAAA,CAAM,OAAO,MAAM,CAAA;AAC9E,MAAA,MAAM,UAAA,GAAa,UAAU,KAAA,EAAO,gBAAA;AACpC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,IAAA,CAAK,gBAAA,GAAmB,UAAA;AACxB,QAAA,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,eAAA,EAAiB,UAAU,CAAA;AACjD,QAAA,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,mBAAA,EAAqB,WAAW,CAAA;AAAA,MACrD;AAAA,IACF,CAAA;AACA,IAAA,IAAA,CAAK,EAAA,CAAG,SAAA,CAAU,mBAAA,EAAqB,WAAW,CAAA;AAAA,EACpD;AAAA,EAEA,MAAc,eAAe,MAAA,EAAgC;AAC3D,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,IAAQ,CAAC,SAAA,CAAU,cAAc,eAAA,EAAiB;AAC5D,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,qBAAA,CAAsB,MAAM,CAAA;AAC7D,MAAA,IAAA,CAAK,kBAAA,GAAqB,MAAA;AAC1B,MAAA,IAAA,CAAK,IAAA,CAAK,YAAY,YAAY,CAAA;AAAA,IACpC,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,KAAK,WAAA,CAAY,KAAA,EAAO,cAAc,qBAAA,EAAuB,+BAAA,EAAiC,GAAG,CAAC,CAAA;AAAA,IACzG;AAAA,EACF;AAAA,EAEA,MAAc,YAAA,CAAa,IAAA,EAAuB,QAAA,EAAiC;AACjF,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AAChB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,kBAAA,CAAmB,IAAA,EAAM,QAAQ,CAAA;AACjD,MAAA,IAAA,CAAK,IAAA,CAAK,YAAY,YAAY,CAAA;AAAA,IACpC,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,IAAA,CAAK,YAAY,KAAA,EAAO,aAAA,CAAc,sBAAsB,CAAA,iBAAA,EAAoB,IAAI,CAAA,CAAA,EAAI,GAAG,CAAC,CAAA;AAAA,IACnG;AAAA,EACF;AAAA,EAEQ,cAAc,KAAA,EAA+B;AACnD,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,MAAA,IAAA,CAAK,gBAAA,GAAmB,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AACtD,MAAA,IAAA,CAAK,iBAAiB,QAAA,GAAW,IAAA;AAAA,IACnC;AACA,IAAA,IAAA,CAAK,iBAAiB,SAAA,GAAY,IAAI,WAAA,CAAY,CAAC,KAAK,CAAC,CAAA;AACzD,IAAA,IAAA,CAAK,gBAAA,CAAiB,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAAA,EAC7C;AAAA,EAEQ,SAAS,KAAA,EAAoB;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,IAAA,CAAK,SAAS,OAAO,CAAA;AACrB,IAAA,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,KAAA,EAAO,KAAK,CAAA;AAAA,EACpC;AAAA,EAEQ,SAAS,KAAA,EAA2B;AAC1C,IAAA,IAAI,IAAA,CAAK,WAAW,KAAA,EAAO;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AACd,IAAA,IAAI,KAAA,KAAU,QAAA,IAAY,CAAC,IAAA,CAAK,YAAA,EAAc;AAC5C,MAAA,IAAA,CAAK,YAAA,GAAe,KAAK,GAAA,EAAI;AAAA,IAC/B;AACA,IAAA,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,YAAA,EAAc,KAAK,CAAA;AAAA,EAC3C;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAA,CAAK,WAAA,EAAY;AACjB,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,IAAA,CAAK,iBAAiB,SAAA,GAAY,IAAA;AAClC,MAAA,IAAA,CAAK,iBAAiB,MAAA,EAAO;AAC7B,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,IAC1B;AACA,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAExB,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,IAAA,CAAK,KAAK,kBAAA,EAAmB;AAC7B,MAAA,IAAA,CAAK,KAAK,UAAA,EAAW;AACrB,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,IACd;AAEA,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAC1B,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAA;AACrB,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAA;AACvB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AACxB,IAAA,IAAA,CAAK,SAAS,OAAO,CAAA;AAAA,EACvB;AACF;AAEA,eAAe,mBAAmB,OAAA,EAI/B;AACD,EAAA,MAAM,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAM,GAAI,MAAM,cAAA,CAAe;AAAA,IACrD,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,SAAS,OAAA,CAAQ;AAAA,GAClB,CAAA;AACD,EAAA,OAAO,EAAE,WAAW,KAAA,EAAM;AAC5B;AAkBA,eAAsB,SAAS,OAAA,EAKJ;AACzB,EAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAQ,KAAA,EAAO,OAAM,GAAI,OAAA;AAC9C,EAAA,MAAM,EAAE,SAAA,EAAW,UAAA,EAAY,OAAA,EAAQ,GAAI,WAAA;AAC3C,EAAA,MAAM,EAAE,SAAA,EAAW,KAAA,EAAM,GAAI,MAAM,mBAAmB,EAAE,SAAA,EAAW,UAAA,EAAY,OAAA,EAAS,CAAA;AAExF,EAAA,MAAM,OAAA,GAAU,IAAI,aAAA,CAAc,SAAS,CAAA;AAC3C,EAAA,OAAA,CAAQ,SAAS,MAAM,CAAA;AACvB,EAAA,MAAM,QAAQ,QAAA,CAAS,SAAA,EAAW,OAAO,EAAE,KAAA,EAAO,OAAO,CAAA;AAEzD,EAAA,OAAO,OAAA;AACT;AAcA,eAAsB,QAAQ,OAAA,EAIH;AACzB,EAAA,MAAM,EAAE,WAAA,EAAa,KAAA,EAAO,KAAA,EAAM,GAAI,OAAA;AACtC,EAAA,MAAM,EAAE,SAAA,EAAW,UAAA,EAAY,OAAA,EAAQ,GAAI,WAAA;AAC3C,EAAA,MAAM,EAAE,SAAA,EAAW,KAAA,EAAM,GAAI,MAAM,mBAAmB,EAAE,SAAA,EAAW,UAAA,EAAY,OAAA,EAAS,CAAA;AAExF,EAAA,MAAM,OAAA,GAAU,IAAI,aAAA,CAAc,SAAS,CAAA;AAC3C,EAAA,MAAM,QAAQ,QAAA,CAAS,SAAA,EAAW,OAAO,EAAE,KAAA,EAAO,OAAO,CAAA;AAEzD,EAAA,OAAO,OAAA;AACT;;;AC3nBA,IAAM,WAAA,uBAAkB,OAAA,EAAyC;AAIjE,IAAM,iBAAA,uBAAwB,OAAA,EAAuB;AAM9C,SAAS,oBACd,IAAA,EAC8B;AAC9B,EAAA,OAAO,WAAA,CAAY,IAAI,IAAI,CAAA;AAC7B;AAaO,SAAS,sBAAA,CACd,MACA,IAAA,EAC6B;AAC7B,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AACnC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,WAAW,CAAA,CAAE,SAAS,IAAI,CAAA;AAChD,EAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,IAAA,IAAI,CAAC,iBAAA,CAAkB,GAAA,CAAI,IAAI,CAAA,IAAK,OAAO,YAAY,WAAA,EAAa;AAClE,MAAA,iBAAA,CAAkB,IAAI,IAAI,CAAA;AAC1B,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,qGAAA,EAAwG,KAAK,IAAI,CAAA,6DAAA;AAAA,OACnH;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,SAAA,CAAU,MAAM,CAAA,GAAK,MAAA,CAAO,KAAA,GAAiC,IAAA;AACtE;AAEA,SAAS,UACP,MAAA,EACmE;AACnE,EAAA,OAAO,OAAO,MAAA,IAAU,IAAA;AAC1B;AAkDO,SAAS,UAAA,CACd,MACA,MAAA,EAGqB;AACrB,EAAA,MAAM,IAAA,GAA4B;AAAA,IAChC,IAAA,EAAM,cAAA;AAAA,IACN,IAAA;AAAA,IACA,aAAa,MAAA,CAAO;AAAA,GACtB;AAEA,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,WAAA,CAAY,GAAA,CAAI,IAAA,EAAM,MAAA,CAAO,MAAM,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO,IAAA;AACT;;;AC7KO,IAAM,SAAA,GAAY,WAAW,OAAA,EAAS;AAAA,EAC3C,WAAA,EAAa,4DAAA;AAAA,EACb,MAAM;AACR,CAAC,CAAA;AAEM,IAAM,YAAA,GAAe,WAAW,WAAA,EAAa;AAAA,EAClD,WAAA,EAAa,iDAAA;AAAA,EACb,MAAM;AACR,CAAC,CAAA;AAEM,IAAM,aAAA,GAAgB,WAAW,WAAA,EAAa;AAAA,EACnD,WAAA,EACE,4EAAA;AAAA,EACF,MAAM;AACR,CAAC,CAAA;AAqBM,IAAM,eAAA,GAAkB;AAAA,EAC7B;AAAA,IACE,GAAG,SAAA;AAAA,IACH,UAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EACE;AAAA;AACJ;AACF,GACF;AAAA,EACA;AAAA,IACE,GAAG,YAAA;AAAA,IACH,UAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EACE;AAAA;AACJ;AACF,GACF;AAAA,EACA;AAAA,IACE,GAAG,aAAA;AAAA,IACH,UAAA,EAAY;AAAA,MACV;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EACE;AAAA,OACJ;AAAA,MACA;AAAA,QACE,IAAA,EAAM,UAAA;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa;AAAA;AACf;AACF;AAEJ","file":"index.js","sourcesContent":["export type AvatarErrorCode =\n | 'CONSUME_FAILED'\n | 'CONNECTION_FAILED'\n | 'MEDIA_PERMISSION_DENIED'\n | 'MEDIA_DEVICE_ERROR'\n | 'SCREEN_SHARE_FAILED'\n | 'PUBLISH_FAILED'\n | 'UNKNOWN';\n\nexport class AvatarError extends Error {\n readonly code: AvatarErrorCode;\n readonly cause?: Error;\n\n constructor(code: AvatarErrorCode, message: string, cause?: Error) {\n super(message);\n this.name = 'AvatarError';\n this.code = code;\n this.cause = cause;\n }\n}\n\nexport function toAvatarError(\n code: AvatarErrorCode,\n fallbackMessage: string,\n err: unknown,\n): AvatarError {\n if (err instanceof AvatarError) return err;\n const cause = err instanceof Error ? err : undefined;\n const message = cause?.message ?? fallbackMessage;\n return new AvatarError(code, message, cause);\n}\n","export const DEFAULT_BASE_URL = 'https://api.dev.runwayml.com';\n","import { AvatarError } from '../error';\nimport type { ConsumeSessionOptions, ConsumeSessionResponse } from '../types';\nimport { DEFAULT_BASE_URL } from './config';\n\nexport async function consumeSession(\n options: ConsumeSessionOptions,\n): Promise<ConsumeSessionResponse> {\n const { sessionId, sessionKey, baseUrl = DEFAULT_BASE_URL } = options;\n\n const url = `${baseUrl}/v1/realtime_sessions/${sessionId}/consume`;\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${sessionKey}`,\n },\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new AvatarError(\n 'CONSUME_FAILED',\n `Failed to consume session: ${response.status} ${errorText}`,\n );\n }\n\n return response.json();\n}\n","export interface FlatDelta {\n role: string;\n turn: number;\n textDelta: string;\n}\n\nexport interface FlatDeltaTurn {\n id: string;\n text: string;\n participantIdentity: string;\n}\n\nexport interface FlatDeltaEmission {\n /** Prior turns on the same role that were just promoted to final by this delta. */\n finalized: Array<FlatDeltaTurn>;\n /** The turn this delta belongs to — still streaming, always interim. */\n active: FlatDeltaTurn;\n}\n\n/**\n * Accumulates Runway flat-delta transcription fragments into coherent turns.\n *\n * The flat-delta protocol sends `{ role, turn, textDelta }` messages without\n * an explicit end-of-turn signal, so we infer the end: when a delta arrives\n * on a higher turn for the same role, prior turns on that role are done and\n * get emitted once as final. The active turn is always interim.\n *\n * Identity is remembered per-turn, so finalized priors are attributed to\n * whoever originally produced them — not to whoever triggered the role\n * switch.\n */\nexport class FlatDeltaAccumulator {\n private readonly turns = new Map<\n string,\n { text: string; participantIdentity: string }\n >();\n private readonly finalized = new Set<string>();\n\n ingest(delta: FlatDelta, participantIdentity: string): FlatDeltaEmission {\n const id = `runway-transcription-${delta.role}-${delta.turn}`;\n const prev = this.turns.get(id);\n const text = (prev?.text ?? '') + delta.textDelta;\n const identity = prev?.participantIdentity ?? participantIdentity;\n this.turns.set(id, { text, participantIdentity: identity });\n\n const prefix = `runway-transcription-${delta.role}-`;\n const finalized: Array<FlatDeltaTurn> = [];\n for (const [key, turn] of this.turns) {\n if (key === id || !key.startsWith(prefix)) continue;\n if (this.finalized.has(key)) continue;\n this.finalized.add(key);\n finalized.push({\n id: key,\n text: turn.text,\n participantIdentity: turn.participantIdentity,\n });\n }\n\n return {\n finalized,\n active: { id, text, participantIdentity: identity },\n };\n }\n\n reset(): void {\n this.turns.clear();\n this.finalized.clear();\n }\n}\n","import type { ClientEvent } from '../types';\n\n/**\n * Server-side ack messages contain `status: \"event_sent\"` — they echo back\n * tool calls and should not be surfaced as client events.\n */\nfunction isAckMessage(args: Record<string, unknown>): boolean {\n return 'status' in args && args.status === 'event_sent';\n}\n\n/**\n * Parse and validate a data channel payload as a ClientEvent.\n * Returns null for non-client-event messages, ack messages, or malformed payloads.\n */\nexport function parseClientEvent(payload: Uint8Array): ClientEvent | null {\n try {\n const message = JSON.parse(new TextDecoder().decode(payload));\n\n if (\n message?.type === 'client_event' &&\n typeof message.tool === 'string' &&\n message.args != null &&\n typeof message.args === 'object' &&\n !isAckMessage(message.args)\n ) {\n return message as ClientEvent;\n }\n\n return null;\n } catch {\n return null;\n }\n}\n","import type { TranscriptionEntry } from '../types';\n\nexport type DataChannelJSON = Record<string, unknown>;\n\nexport function tryDecodeJSON(payload: Uint8Array): DataChannelJSON | null {\n try {\n const text = new TextDecoder().decode(payload).trim();\n if (!text.startsWith('{')) return null;\n const parsed: unknown = JSON.parse(text);\n return parsed && typeof parsed === 'object'\n ? (parsed as DataChannelJSON)\n : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Parse LiveKit-style segment arrays: `{ segments: [{ id, text, final? }] }`\n * Also handles wrapper shapes like `{ type: \"transcription\", segments: [...] }`\n * and `{ data: { segments: [...] } }`.\n */\nexport function tryParseSegmentArray(\n root: DataChannelJSON,\n participant?: { identity: string },\n): Array<TranscriptionEntry> | null {\n const type = root.type;\n const typeAllowed =\n type === undefined ||\n type === 'transcription' ||\n type === 'transcript' ||\n type === 'voice_transcript';\n if (!typeAllowed) return null;\n\n let segments: unknown = root.segments;\n if (\n !Array.isArray(segments) &&\n root.data &&\n typeof root.data === 'object'\n ) {\n segments = (root.data as DataChannelJSON).segments;\n }\n if (!Array.isArray(segments)) return null;\n\n const identity = participant?.identity ?? 'unknown';\n const out: Array<TranscriptionEntry> = [];\n\n for (const item of segments) {\n if (!item || typeof item !== 'object') continue;\n const seg = item as DataChannelJSON;\n if (typeof seg.id !== 'string' || typeof seg.text !== 'string') continue;\n out.push({\n id: seg.id,\n text: seg.text,\n final: typeof seg.final === 'boolean' ? seg.final : true,\n participantIdentity:\n typeof seg.participantIdentity === 'string'\n ? seg.participantIdentity\n : identity,\n });\n }\n\n return out.length > 0 ? out : null;\n}\n\n/**\n * Parse Runway flat streaming deltas: `{ type: \"transcription\", role, turn, text }`\n * These arrive one delta at a time and are accumulated per role+turn.\n */\nexport function tryParseFlatDelta(\n root: DataChannelJSON,\n): { role: string; turn: number; textDelta: string } | null {\n if (root.type !== 'transcription') return null;\n if (typeof root.text !== 'string') return null;\n\n return {\n role: typeof root.role === 'string' ? root.role : 'assistant',\n turn: typeof root.turn === 'number' ? root.turn : 0,\n textDelta: root.text,\n };\n}\n","/**\n * Tiny typed event emitter. No Node.js polyfills, no dependencies.\n *\n * @example\n * ```ts\n * type Events = { count: [number]; ready: [] };\n * const ee = new Emitter<Events>();\n * ee.on('count', (n) => console.log(n));\n * ee.emit('count', 42);\n * ```\n */\nexport type EventMap = Record<string, Array<unknown>>;\n\ntype Handler<Args extends Array<unknown>> = (...args: Args) => void;\n\nexport class Emitter<E extends EventMap> {\n private listeners = new Map<keyof E, Set<Handler<Array<unknown>>>>();\n\n on<K extends keyof E>(event: K, handler: Handler<E[K]>): this {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(handler as Handler<Array<unknown>>);\n return this;\n }\n\n once<K extends keyof E>(event: K, handler: Handler<E[K]>): this {\n const wrapper = ((...args: E[K]) => {\n this.off(event, wrapper);\n handler(...args);\n }) as Handler<E[K]>;\n return this.on(event, wrapper);\n }\n\n off<K extends keyof E>(event: K, handler: Handler<E[K]>): this {\n this.listeners.get(event)?.delete(handler as Handler<Array<unknown>>);\n return this;\n }\n\n protected emit<K extends keyof E>(event: K, ...args: E[K]): void {\n const set = this.listeners.get(event);\n if (!set) return;\n for (const handler of set) {\n try {\n handler(...args);\n } catch (err) {\n console.error(`[@runwayml/avatars] Error in ${String(event)} handler:`, err);\n }\n }\n }\n\n removeAllListeners(event?: keyof E): this {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n return this;\n }\n}\n","import type { TranscriptionEntry } from './types';\nimport { FlatDeltaAccumulator } from './utils/flatDeltaAccumulator';\nimport {\n tryDecodeJSON,\n tryParseFlatDelta,\n tryParseSegmentArray,\n} from './utils/parseTranscription';\nimport { Emitter } from './emitter';\nimport type { TranscriptOptions } from './types';\n\nconst DEFAULT_BUFFER_SIZE = 100;\n\ntype TranscriptEvents = {\n update: [entries: ReadonlyArray<TranscriptionEntry>];\n};\n\n/**\n * Stateful transcript accumulator. Deduplicates by segment `id`, caps at\n * `bufferSize`, and emits `update` on every change.\n *\n * Handles both LiveKit-style `{ segments: [...] }` and Runway flat-delta\n * `{ type: \"transcription\", role, turn, text }` data-channel payloads,\n * as well as native `TranscriptionReceived` segment arrays.\n */\nexport class TranscriptAccumulator extends Emitter<TranscriptEvents> {\n private readonly map = new Map<string, TranscriptionEntry>();\n private readonly flatAcc = new FlatDeltaAccumulator();\n private readonly interim: boolean;\n private readonly bufferSize: number;\n private snapshot: ReadonlyArray<TranscriptionEntry> = [];\n\n constructor(options?: TranscriptOptions) {\n super();\n this.interim = options?.interim ?? false;\n this.bufferSize = options?.bufferSize ?? DEFAULT_BUFFER_SIZE;\n }\n\n get entries(): ReadonlyArray<TranscriptionEntry> {\n return this.snapshot;\n }\n\n /**\n * Ingest a native transcription segment (from `RoomEvent.TranscriptionReceived`).\n */\n ingestNative(\n segments: ReadonlyArray<{ id: string; text: string; final: boolean }>,\n participantIdentity: string,\n ): void {\n let changed = false;\n for (const segment of segments) {\n if (!this.interim && !segment.final) continue;\n this.map.set(segment.id, {\n id: segment.id,\n text: segment.text,\n final: segment.final,\n participantIdentity,\n channel: 'native',\n });\n changed = true;\n }\n if (changed) this.flush();\n }\n\n /**\n * Ingest a raw data-channel payload (from `RoomEvent.DataReceived`).\n * Handles both segment arrays and flat deltas.\n */\n ingestDataChannel(\n payload: Uint8Array,\n participantIdentity: string,\n ): void {\n const json = tryDecodeJSON(payload);\n if (!json) return;\n\n const segments = tryParseSegmentArray(json, {\n identity: participantIdentity,\n });\n if (segments) {\n let changed = false;\n for (const entry of segments) {\n if (!this.interim && !entry.final) continue;\n this.map.set(entry.id, { ...entry, channel: 'custom' });\n changed = true;\n }\n if (changed) this.flush();\n return;\n }\n\n const delta = tryParseFlatDelta(json);\n if (!delta) return;\n\n const { finalized, active } = this.flatAcc.ingest(\n delta,\n participantIdentity,\n );\n\n let changed = false;\n for (const turn of finalized) {\n this.map.set(turn.id, { ...turn, final: true, channel: 'custom' });\n changed = true;\n }\n\n if (this.interim) {\n this.map.set(active.id, { ...active, final: false, channel: 'custom' });\n changed = true;\n }\n\n if (changed) this.flush();\n }\n\n dispose(): void {\n this.map.clear();\n this.flatAcc.reset();\n this.snapshot = [];\n this.removeAllListeners();\n }\n\n private flush(): void {\n const values = Array.from(this.map.values());\n this.snapshot =\n values.length > this.bufferSize\n ? values.slice(-this.bufferSize)\n : values;\n this.emit('update', this.snapshot);\n }\n}\n","/**\n * @runwayml/avatars Types\n *\n * Core types for the avatar SDK. No React or framework dependencies.\n */\n\nexport type SessionState =\n | 'idle'\n | 'connecting'\n | 'reconnecting'\n | 'active'\n | 'ending'\n | 'ended'\n | 'error';\n\nexport interface ConsumeSessionResponse {\n url: string;\n token: string;\n roomName: string;\n}\n\nexport interface SessionCredentials {\n sessionId: string;\n serverUrl: string;\n token: string;\n roomName: string;\n}\n\nexport interface SessionKeyResponse {\n sessionId: string;\n sessionKey: string;\n}\n\nexport type ConnectResponse = SessionCredentials | SessionKeyResponse;\n\nexport interface ConsumeSessionOptions {\n sessionId: string;\n sessionKey: string;\n baseUrl?: string;\n}\n\nexport interface ClientEvent<\n T extends string = string,\n A = Record<string, unknown>,\n> {\n type: 'client_event';\n tool: T;\n args: A;\n}\n\nexport type ClientEventHandler<E extends ClientEvent = ClientEvent> = (\n event: E,\n) => void;\n\nexport interface TranscriptionEntry {\n id: string;\n text: string;\n final: boolean;\n participantIdentity: string;\n channel?: 'native' | 'custom';\n}\n\nexport type TranscriptionHandler = (entry: TranscriptionEntry) => void;\n\nexport type MicPermissionState = 'pending' | 'granted' | 'denied';\n\nexport type ConnectionQuality = 'excellent' | 'good' | 'poor' | 'lost' | 'unknown';\n\nexport type ActiveSpeaker = 'user' | 'avatar';\n\nexport const AvatarEvent = {\n StateChanged: 'stateChanged',\n Transcript: 'transcript',\n ClientEvent: 'clientEvent',\n Error: 'error',\n AvatarVideoReady: 'avatarVideoReady',\n AvatarAudioReady: 'avatarAudioReady',\n ScreenShareReady: 'screenShareReady',\n LocalVideoReady: 'localVideoReady',\n MediaChanged: 'mediaChanged',\n UserSpeechStarted: 'userSpeechStarted',\n UserSpeechEnded: 'userSpeechEnded',\n AvatarSpeechStarted: 'avatarSpeechStarted',\n AvatarSpeechEnded: 'avatarSpeechEnded',\n ConnectionQualityChanged: 'connectionQualityChanged',\n MicPermissionChanged: 'micPermissionChanged',\n ActiveSpeakersChanged: 'activeSpeakersChanged',\n} as const;\n\nexport type AvatarEventMap = {\n [AvatarEvent.StateChanged]: [state: SessionState];\n [AvatarEvent.Transcript]: [entry: TranscriptionEntry];\n [AvatarEvent.ClientEvent]: [event: ClientEvent];\n [AvatarEvent.Error]: [error: Error];\n [AvatarEvent.AvatarVideoReady]: [track: MediaStreamTrack];\n [AvatarEvent.AvatarAudioReady]: [track: MediaStreamTrack];\n [AvatarEvent.ScreenShareReady]: [track: MediaStreamTrack];\n [AvatarEvent.LocalVideoReady]: [track: MediaStreamTrack];\n [AvatarEvent.MediaChanged]: [];\n [AvatarEvent.UserSpeechStarted]: [];\n [AvatarEvent.UserSpeechEnded]: [];\n [AvatarEvent.AvatarSpeechStarted]: [];\n [AvatarEvent.AvatarSpeechEnded]: [];\n [AvatarEvent.ConnectionQualityChanged]: [quality: ConnectionQuality];\n [AvatarEvent.MicPermissionChanged]: [state: MicPermissionState];\n [AvatarEvent.ActiveSpeakersChanged]: [speakers: ReadonlyArray<ActiveSpeaker>];\n};\n\nexport interface MediaController {\n readonly isEnabled: boolean;\n enable(): Promise<void>;\n disable(): Promise<void>;\n toggle(): Promise<void>;\n setDevice(deviceId: string): Promise<void>;\n}\n\nexport interface ScreenShareController {\n readonly isActive: boolean;\n start(): Promise<void>;\n stop(): Promise<void>;\n toggle(): Promise<void>;\n}\n\nexport interface TranscriptOptions {\n interim?: boolean;\n bufferSize?: number;\n}\n","import {\n ConnectionQuality as LKConnectionQuality,\n ConnectionState,\n Room,\n RoomEvent,\n Track,\n} from 'livekit-client';\nimport type {\n Participant,\n RemoteTrackPublication,\n TranscriptionSegment,\n} from 'livekit-client';\n\nimport { consumeSession } from './api/consume';\nimport { toAvatarError } from './error';\nimport { FlatDeltaAccumulator } from './utils/flatDeltaAccumulator';\nimport { parseClientEvent } from './utils/parseClientEvent';\nimport {\n tryDecodeJSON,\n tryParseFlatDelta,\n tryParseSegmentArray,\n} from './utils/parseTranscription';\nimport { Emitter } from './emitter';\nimport { TranscriptAccumulator } from './transcript-accumulator';\nimport {\n AvatarEvent,\n type ActiveSpeaker,\n type AvatarEventMap,\n type ClientEvent,\n type ConnectionQuality,\n type MediaController,\n type ScreenShareController,\n type SessionState,\n type TranscriptOptions,\n type TranscriptionEntry,\n} from './types';\n\nfunction toLKQuality(q: LKConnectionQuality): ConnectionQuality {\n switch (q) {\n case LKConnectionQuality.Excellent:\n return 'excellent';\n case LKConnectionQuality.Good:\n return 'good';\n case LKConnectionQuality.Poor:\n return 'poor';\n case LKConnectionQuality.Lost:\n return 'lost';\n default:\n return 'unknown';\n }\n}\n\nfunction toSessionState(cs: ConnectionState): SessionState {\n switch (cs) {\n case ConnectionState.Connecting:\n return 'connecting';\n case ConnectionState.Connected:\n return 'active';\n case ConnectionState.Reconnecting:\n return 'reconnecting';\n case ConnectionState.Disconnected:\n return 'ended';\n default:\n return 'ended';\n }\n}\n\n/**\n * A live avatar session. Returned by `streamTo` or `connect`.\n *\n * Wraps a LiveKit Room behind a clean event-driven API. No LiveKit\n * types are exposed — tracks are standard `MediaStreamTrack` objects.\n */\nexport class AvatarSession extends Emitter<AvatarEventMap> {\n private room: Room | null = null;\n private _sessionId: string;\n private _state: SessionState = 'idle';\n private _error: Error | null = null;\n private _micEnabled = false;\n private _cameraEnabled = false;\n private _screenShareActive = false;\n private attachedVideoElement: HTMLVideoElement | null = null;\n private attachedAudioElement: HTMLAudioElement | null = null;\n private avatarVideoTrack: MediaStreamTrack | null = null;\n private avatarAudioTrack: MediaStreamTrack | null = null;\n private _localVideoTrack: MediaStreamTrack | null = null;\n private autoAudioElement: HTMLAudioElement | null = null;\n private flatDeltaAcc = new FlatDeltaAccumulator();\n private _userSpeaking = false;\n private _avatarSpeaking = false;\n private _connectedAt: number | null = null;\n\n readonly mic: MediaController;\n readonly camera: MediaController;\n readonly screenShare: ScreenShareController;\n\n constructor(sessionId: string) {\n super();\n this._sessionId = sessionId;\n\n const self = this;\n\n this.mic = {\n get isEnabled() {\n return self._micEnabled;\n },\n enable: () => this.setMic(true),\n disable: () => this.setMic(false),\n toggle: () => this.setMic(!this._micEnabled),\n setDevice: (deviceId: string) => this.switchDevice('audioinput', deviceId),\n };\n\n this.camera = {\n get isEnabled() {\n return self._cameraEnabled;\n },\n enable: () => this.setCamera(true),\n disable: () => this.setCamera(false),\n toggle: () => this.setCamera(!this._cameraEnabled),\n setDevice: (deviceId: string) => this.switchDevice('videoinput', deviceId),\n };\n\n this.screenShare = {\n get isActive() {\n return self._screenShareActive;\n },\n start: () => this.setScreenShare(true),\n stop: () => this.setScreenShare(false),\n toggle: () => this.setScreenShare(!this._screenShareActive),\n };\n }\n\n get state(): SessionState {\n return this._state;\n }\n\n get sessionId(): string {\n return this._sessionId;\n }\n\n get error(): Error | null {\n return this._error;\n }\n\n get localVideoTrack(): MediaStreamTrack | null {\n return this._localVideoTrack;\n }\n\n get duration(): number {\n if (!this._connectedAt) return 0;\n return Date.now() - this._connectedAt;\n }\n\n waitFor<K extends keyof AvatarEventMap>(event: K): Promise<AvatarEventMap[K][0]> {\n return new Promise((resolve) => {\n this.once(event, ((...args: AvatarEventMap[K]) => {\n resolve(args[0] as AvatarEventMap[K][0]);\n }) as (...args: AvatarEventMap[K]) => void);\n });\n }\n\n streamTo(element: HTMLVideoElement): void {\n this.attachedVideoElement = element;\n if (this.avatarVideoTrack) {\n element.srcObject = new MediaStream([this.avatarVideoTrack]);\n element.play().catch(() => {});\n }\n }\n\n stopStreaming(): void {\n if (this.attachedVideoElement) {\n this.attachedVideoElement.srcObject = null;\n }\n this.attachedVideoElement = null;\n }\n\n attachAudio(element: HTMLAudioElement): void {\n this.attachedAudioElement = element;\n if (this.avatarAudioTrack) {\n element.srcObject = new MediaStream([this.avatarAudioTrack]);\n element.play().catch(() => {});\n }\n }\n\n detachAudio(): void {\n if (this.attachedAudioElement) {\n this.attachedAudioElement.srcObject = null;\n }\n this.attachedAudioElement = null;\n }\n\n async end(): Promise<void> {\n if (!this.room) return;\n this.setState('ending');\n\n try {\n const encoder = new TextEncoder();\n const data = encoder.encode(JSON.stringify({ type: 'END_CALL' }));\n await this.room.localParticipant.publishData(data, { reliable: true });\n } catch {\n // Best-effort end message\n }\n\n this.cleanup();\n }\n\n transcript(options?: TranscriptOptions): TranscriptAccumulator {\n const acc = new TranscriptAccumulator(options);\n\n const handleTranscript = (entry: TranscriptionEntry) => {\n acc.ingestNative(\n [{ id: entry.id, text: entry.text, final: entry.final }],\n entry.participantIdentity,\n );\n };\n\n this.on(AvatarEvent.Transcript, handleTranscript);\n\n const originalDispose = acc.dispose.bind(acc);\n acc.dispose = () => {\n this.off(AvatarEvent.Transcript, handleTranscript);\n originalDispose();\n };\n\n return acc;\n }\n\n onClientEvent<T extends string, A>(\n toolOrName: { name: T } | T,\n handler: (args: A) => void,\n ): () => void {\n const name = typeof toolOrName === 'string' ? toolOrName : toolOrName.name;\n const wrappedHandler = (event: ClientEvent) => {\n if (event.tool === name) {\n handler(event.args as A);\n }\n };\n this.on(AvatarEvent.ClientEvent, wrappedHandler);\n return () => this.off(AvatarEvent.ClientEvent, wrappedHandler);\n }\n\n /** @internal Called by `streamTo` and `connect` entry points. */\n async _connect(\n serverUrl: string,\n token: string,\n options: { audio?: boolean; video?: boolean },\n ): Promise<void> {\n this.setState('connecting');\n\n const room = new Room({\n adaptiveStream: false,\n dynacast: false,\n });\n\n try {\n this.room = room;\n this.bindRoomEvents(room);\n await room.connect(serverUrl, token, { autoSubscribe: true });\n await this.enableInitialMedia(room, options);\n } catch (err) {\n room.removeAllListeners();\n room.disconnect().catch(() => {});\n this.room = null;\n const error = toAvatarError('CONNECTION_FAILED', 'Failed to connect to session', err);\n this.setError(error);\n throw error;\n }\n }\n\n async publishScreenShare(stream: MediaStream): Promise<void> {\n if (!this.room) return;\n const videoTrack = stream.getVideoTracks()[0];\n if (videoTrack) {\n await this.room.localParticipant.publishTrack(videoTrack, {\n source: Track.Source.ScreenShare,\n });\n }\n const audioTrack = stream.getAudioTracks()[0];\n if (audioTrack) {\n await this.room.localParticipant.publishTrack(audioTrack, {\n source: Track.Source.ScreenShareAudio,\n });\n }\n }\n\n private bindRoomEvents(room: Room): void {\n room.on(RoomEvent.ConnectionStateChanged, (state: ConnectionState) => {\n this.setState(toSessionState(state));\n });\n\n room.on(RoomEvent.Disconnected, () => {\n this.setState('ended');\n });\n\n room.on(RoomEvent.Reconnected, () => {\n this.reattachTracks();\n });\n\n room.on(\n RoomEvent.TrackSubscribed,\n (track, publication: RemoteTrackPublication) => {\n if (track.kind === 'video' && publication.source === Track.Source.Camera) {\n const mediaTrack = track.mediaStreamTrack;\n this.avatarVideoTrack = mediaTrack;\n this.emit(AvatarEvent.AvatarVideoReady, mediaTrack);\n this.syncVideoElement(mediaTrack);\n }\n\n if (track.kind === 'audio' && publication.source === Track.Source.Microphone) {\n const mediaTrack = track.mediaStreamTrack;\n this.avatarAudioTrack = mediaTrack;\n this.emit(AvatarEvent.AvatarAudioReady, mediaTrack);\n\n if (this.attachedAudioElement) {\n this.attachedAudioElement.srcObject = new MediaStream([mediaTrack]);\n this.attachedAudioElement.play().catch(() => {});\n } else {\n this.autoPlayAudio(mediaTrack);\n }\n }\n\n if (track.kind === 'video' && publication.source === Track.Source.ScreenShare) {\n this.emit(AvatarEvent.ScreenShareReady, track.mediaStreamTrack);\n }\n },\n );\n\n room.on(RoomEvent.TrackUnsubscribed, (_track, publication: RemoteTrackPublication) => {\n if (publication.source === Track.Source.Camera) {\n this.avatarVideoTrack = null;\n }\n if (publication.source === Track.Source.Microphone) {\n this.avatarAudioTrack = null;\n }\n });\n\n room.on(\n RoomEvent.DataReceived,\n (payload: Uint8Array, participant?: Participant) => {\n const event = parseClientEvent(payload);\n if (event) {\n this.emit(AvatarEvent.ClientEvent, event);\n return;\n }\n\n const identity = participant?.identity ?? 'unknown';\n const json = tryDecodeJSON(payload);\n if (!json) return;\n\n const segments = tryParseSegmentArray(json, { identity });\n if (segments) {\n for (const entry of segments) {\n this.emit(AvatarEvent.Transcript, { ...entry, channel: 'custom' });\n }\n return;\n }\n\n const delta = tryParseFlatDelta(json);\n if (delta) {\n const { finalized, active } = this.flatDeltaAcc.ingest(\n delta,\n identity,\n );\n for (const turn of finalized) {\n this.emit(AvatarEvent.Transcript, {\n ...turn,\n final: true,\n channel: 'custom',\n });\n }\n this.emit(AvatarEvent.Transcript, {\n ...active,\n final: false,\n channel: 'custom',\n });\n }\n },\n );\n\n room.on(\n RoomEvent.TranscriptionReceived,\n (segments: Array<TranscriptionSegment>, participant?: Participant) => {\n const identity = participant?.identity ?? 'unknown';\n for (const segment of segments) {\n this.emit(AvatarEvent.Transcript, {\n id: segment.id,\n text: segment.text,\n final: segment.final,\n participantIdentity: identity,\n channel: 'native',\n });\n }\n },\n );\n\n room.on(RoomEvent.MediaDevicesError, (error: Error) => {\n this.emit(AvatarEvent.Error, error);\n });\n\n room.on(RoomEvent.ActiveSpeakersChanged, (speakers: Array<Participant>) => {\n const localIdentity = room.localParticipant.identity;\n const localSpeaking = speakers.some((p) => p.identity === localIdentity);\n const remoteSpeaking = speakers.some((p) => p.identity !== localIdentity);\n\n if (localSpeaking && !this._userSpeaking) {\n this._userSpeaking = true;\n this.emit(AvatarEvent.UserSpeechStarted);\n } else if (!localSpeaking && this._userSpeaking) {\n this._userSpeaking = false;\n this.emit(AvatarEvent.UserSpeechEnded);\n }\n\n if (remoteSpeaking && !this._avatarSpeaking) {\n this._avatarSpeaking = true;\n this.emit(AvatarEvent.AvatarSpeechStarted);\n } else if (!remoteSpeaking && this._avatarSpeaking) {\n this._avatarSpeaking = false;\n this.emit(AvatarEvent.AvatarSpeechEnded);\n }\n\n const active: Array<ActiveSpeaker> = [];\n if (localSpeaking) active.push('user');\n if (remoteSpeaking) active.push('avatar');\n this.emit(AvatarEvent.ActiveSpeakersChanged, active);\n });\n\n room.on(\n RoomEvent.ConnectionQualityChanged,\n (quality: LKConnectionQuality, _participant: Participant) => {\n this.emit(AvatarEvent.ConnectionQualityChanged, toLKQuality(quality));\n },\n );\n }\n\n private reattachTracks(): void {\n if (this.avatarVideoTrack) {\n this.syncVideoElement(this.avatarVideoTrack);\n }\n if (this.avatarAudioTrack) {\n if (this.attachedAudioElement) {\n this.attachedAudioElement.srcObject = new MediaStream([this.avatarAudioTrack]);\n this.attachedAudioElement.play().catch(() => {});\n } else {\n this.autoPlayAudio(this.avatarAudioTrack);\n }\n }\n }\n\n private syncVideoElement(track: MediaStreamTrack): void {\n if (this.attachedVideoElement) {\n this.attachedVideoElement.srcObject = new MediaStream([track]);\n this.attachedVideoElement.play().catch(() => {});\n }\n }\n\n private async enableInitialMedia(\n room: Room,\n options: { audio?: boolean; video?: boolean },\n ): Promise<void> {\n if (\n typeof navigator === 'undefined' ||\n !navigator.mediaDevices?.getUserMedia\n ) {\n console.warn(\n '[@runwayml/avatars] mediaDevices not available (requires secure context). Skipping mic/camera.',\n );\n return;\n }\n\n const { audio = true, video = true } = options;\n\n if (audio) {\n this.emit(AvatarEvent.MicPermissionChanged, 'pending');\n try {\n await room.localParticipant.setMicrophoneEnabled(true);\n this._micEnabled = true;\n this.emit(AvatarEvent.MicPermissionChanged, 'granted');\n } catch (err) {\n this.emit(AvatarEvent.MicPermissionChanged, 'denied');\n this.emit(AvatarEvent.Error, toAvatarError('MEDIA_PERMISSION_DENIED', 'Microphone access denied', err));\n }\n }\n\n if (video) {\n try {\n await room.localParticipant.setCameraEnabled(true);\n this._cameraEnabled = true;\n this.emitLocalVideoTrack(room);\n } catch (err) {\n this.emit(AvatarEvent.Error, toAvatarError('MEDIA_PERMISSION_DENIED', 'Camera access denied', err));\n }\n }\n\n this.emit(AvatarEvent.MediaChanged);\n }\n\n private async setMic(enabled: boolean): Promise<void> {\n if (!this.room || !navigator.mediaDevices?.getUserMedia) return;\n try {\n await this.room.localParticipant.setMicrophoneEnabled(enabled);\n this._micEnabled = enabled;\n this.emit(AvatarEvent.MediaChanged);\n } catch (err) {\n this.emit(AvatarEvent.Error, toAvatarError('MEDIA_DEVICE_ERROR', 'Failed to toggle microphone', err));\n }\n }\n\n private async setCamera(enabled: boolean): Promise<void> {\n if (!this.room || !navigator.mediaDevices?.getUserMedia) return;\n try {\n await this.room.localParticipant.setCameraEnabled(enabled);\n this._cameraEnabled = enabled;\n if (enabled) {\n this.emitLocalVideoTrack(this.room);\n } else {\n this._localVideoTrack = null;\n }\n this.emit(AvatarEvent.MediaChanged);\n } catch (err) {\n this.emit(AvatarEvent.Error, toAvatarError('MEDIA_DEVICE_ERROR', 'Failed to toggle camera', err));\n }\n }\n\n private emitLocalVideoTrack(room: Room): void {\n const pub = room.localParticipant.getTrackPublication(Track.Source.Camera);\n const mediaTrack = pub?.track?.mediaStreamTrack;\n if (mediaTrack) {\n this._localVideoTrack = mediaTrack;\n this.emit(AvatarEvent.LocalVideoReady, mediaTrack);\n return;\n }\n\n const onPublished = () => {\n const retryPub = room.localParticipant.getTrackPublication(Track.Source.Camera);\n const retryTrack = retryPub?.track?.mediaStreamTrack;\n if (retryTrack) {\n this._localVideoTrack = retryTrack;\n this.emit(AvatarEvent.LocalVideoReady, retryTrack);\n room.off(RoomEvent.LocalTrackPublished, onPublished);\n }\n };\n room.on(RoomEvent.LocalTrackPublished, onPublished);\n }\n\n private async setScreenShare(active: boolean): Promise<void> {\n if (!this.room || !navigator.mediaDevices?.getDisplayMedia) return;\n try {\n await this.room.localParticipant.setScreenShareEnabled(active);\n this._screenShareActive = active;\n this.emit(AvatarEvent.MediaChanged);\n } catch (err) {\n this.emit(AvatarEvent.Error, toAvatarError('SCREEN_SHARE_FAILED', 'Failed to toggle screen share', err));\n }\n }\n\n private async switchDevice(kind: MediaDeviceKind, deviceId: string): Promise<void> {\n if (!this.room) return;\n try {\n await this.room.switchActiveDevice(kind, deviceId);\n this.emit(AvatarEvent.MediaChanged);\n } catch (err) {\n this.emit(AvatarEvent.Error, toAvatarError('MEDIA_DEVICE_ERROR', `Failed to switch ${kind}`, err));\n }\n }\n\n private autoPlayAudio(track: MediaStreamTrack): void {\n if (!this.autoAudioElement) {\n this.autoAudioElement = document.createElement('audio');\n this.autoAudioElement.autoplay = true;\n }\n this.autoAudioElement.srcObject = new MediaStream([track]);\n this.autoAudioElement.play().catch(() => {});\n }\n\n private setError(error: Error): void {\n this._error = error;\n this.setState('error');\n this.emit(AvatarEvent.Error, error);\n }\n\n private setState(state: SessionState): void {\n if (this._state === state) return;\n this._state = state;\n if (state === 'active' && !this._connectedAt) {\n this._connectedAt = Date.now();\n }\n this.emit(AvatarEvent.StateChanged, state);\n }\n\n private cleanup(): void {\n this.stopStreaming();\n this.detachAudio();\n if (this.autoAudioElement) {\n this.autoAudioElement.srcObject = null;\n this.autoAudioElement.remove();\n this.autoAudioElement = null;\n }\n this.avatarVideoTrack = null;\n this.avatarAudioTrack = null;\n this._localVideoTrack = null;\n\n if (this.room) {\n this.room.removeAllListeners();\n this.room.disconnect();\n this.room = null;\n }\n\n this._micEnabled = false;\n this._cameraEnabled = false;\n this._screenShareActive = false;\n this._userSpeaking = false;\n this._avatarSpeaking = false;\n this._connectedAt = null;\n this.flatDeltaAcc.reset();\n this.setState('ended');\n }\n}\n\nasync function resolveCredentials(options: {\n sessionId: string;\n sessionKey: string;\n baseUrl?: string;\n}) {\n const { url: serverUrl, token } = await consumeSession({\n sessionId: options.sessionId,\n sessionKey: options.sessionKey,\n baseUrl: options.baseUrl,\n });\n return { serverUrl, token };\n}\n\n/**\n * Start an avatar session and stream video to an element.\n *\n * Handles the consume call, LiveKit connection, and media setup\n * in one call. Returns an `AvatarSession` for media controls,\n * events, and ending the call.\n *\n * @example\n * ```ts\n * const credentials = await fetch('/api/connect').then(r => r.json());\n * const session = await streamTo({ credentials, target: document.getElementById('avatar') });\n *\n * session.mic.toggle();\n * session.end();\n * ```\n */\nexport async function streamTo(options: {\n credentials: { sessionId: string; sessionKey: string; baseUrl?: string };\n target: HTMLVideoElement;\n audio?: boolean;\n video?: boolean;\n}): Promise<AvatarSession> {\n const { credentials, target, audio, video } = options;\n const { sessionId, sessionKey, baseUrl } = credentials;\n const { serverUrl, token } = await resolveCredentials({ sessionId, sessionKey, baseUrl });\n\n const session = new AvatarSession(sessionId);\n session.streamTo(target);\n await session._connect(serverUrl, token, { audio, video });\n\n return session;\n}\n\n/**\n * Start an avatar session without a video element (headless).\n *\n * Use `session.streamTo(element)` later to attach video, or use\n * this for audio-only sessions.\n *\n * @example\n * ```ts\n * const credentials = await fetch('/api/connect').then(r => r.json());\n * const session = await connect({ credentials });\n * ```\n */\nexport async function connect(options: {\n credentials: { sessionId: string; sessionKey: string; baseUrl?: string };\n audio?: boolean;\n video?: boolean;\n}): Promise<AvatarSession> {\n const { credentials, audio, video } = options;\n const { sessionId, sessionKey, baseUrl } = credentials;\n const { serverUrl, token } = await resolveCredentials({ sessionId, sessionKey, baseUrl });\n\n const session = new AvatarSession(sessionId);\n await session._connect(serverUrl, token, { audio, video });\n\n return session;\n}\n","import type {\n InferSchemaOutput,\n StandardSchemaResult,\n StandardSchemaV1,\n} from './standard-schema';\nimport type { ClientEvent } from './types';\n\n/**\n * A standalone client tool definition. Composable — combine into arrays\n * and derive event types with `ClientEventsFrom`.\n *\n * At runtime this is just `{ type, name, description }` (exactly what the\n * Runway session create payload expects). The `Args` generic is phantom —\n * it only exists at the TypeScript level for type narrowing.\n *\n * When the tool is defined with a `schema` ([Standard Schema](https://standardschema.dev/)),\n * the schema is attached internally (not serialized) for runtime validation\n * and to infer `Args` from the schema output type.\n */\nexport interface ClientToolDef<Name extends string = string, Args = unknown> {\n readonly type: 'client_event';\n readonly name: Name;\n readonly description: string;\n /** @internal phantom field — always `undefined` at runtime */\n readonly _args?: Args;\n}\n\nexport type ClientToolArgs<Tool extends ClientToolDef> =\n Tool extends ClientToolDef<string, infer Args> ? Args : never;\n\nexport type ClientEventFromTool<Tool extends ClientToolDef> =\n Tool extends ClientToolDef<infer Name, infer Args>\n ? ClientEvent<Name, Args>\n : never;\n\n/**\n * Derive a discriminated union of ClientEvent types from an array of tools.\n *\n * @example\n * ```typescript\n * const tools = [showQuestion, playSound];\n * type MyEvent = ClientEventsFrom<typeof tools>;\n * ```\n */\nexport type ClientEventsFrom<T extends ReadonlyArray<ClientToolDef>> =\n T[number] extends infer U\n ? U extends ClientToolDef<infer Name, infer Args>\n ? ClientEvent<Name, Args>\n : never\n : never;\n\n// Schemas live in a WeakMap so the tool def itself stays a clean\n// `{ type, name, description }` object — safe to spread into the API\n// payload and JSON.stringify without leaking schema internals.\nconst toolSchemas = new WeakMap<ClientToolDef, StandardSchemaV1>();\n\n// Tracks tools that have already emitted the async-schema warning so a\n// misconfigured schema doesn't spam the console on every incoming event.\nconst asyncSchemaWarned = new WeakSet<ClientToolDef>();\n\n/**\n * Return the Standard Schema associated with a tool, if any.\n * Useful when composing validation outside of the SDK hooks.\n */\nexport function getClientToolSchema(\n tool: ClientToolDef,\n): StandardSchemaV1 | undefined {\n return toolSchemas.get(tool);\n}\n\n/**\n * Validate parsed client event args against a tool's schema.\n *\n * Returns the typed args on success, or `null` when the schema fails or\n * when the schema would need to resolve asynchronously (Standard Schema\n * allows async `validate`, but for fire-and-forget client events we only\n * accept sync results here).\n *\n * Tools defined without a schema always validate successfully — the\n * incoming args are returned as-is.\n */\nexport function validateClientToolArgs<Tool extends ClientToolDef>(\n tool: Tool,\n args: unknown,\n): ClientToolArgs<Tool> | null {\n const schema = toolSchemas.get(tool);\n if (!schema) {\n return args as ClientToolArgs<Tool>;\n }\n\n const result = schema['~standard'].validate(args);\n if (result instanceof Promise) {\n if (!asyncSchemaWarned.has(tool) && typeof console !== 'undefined') {\n asyncSchemaWarned.add(tool);\n console.warn(\n `[@runwayml/avatars-react] Async Standard Schema validation is not supported for client events (tool \"${tool.name}\"); subsequent events for this tool will be dropped silently.`,\n );\n }\n return null;\n }\n\n return isSuccess(result) ? (result.value as ClientToolArgs<Tool>) : null;\n}\n\nfunction isSuccess<Output>(\n result: StandardSchemaResult<Output>,\n): result is { readonly value: Output; readonly issues?: undefined } {\n return result.issues == null;\n}\n\n/**\n * Define a single client tool.\n *\n * Returns a standalone object that can be composed into arrays and passed\n * to `realtimeSessions.create({ tools })`.\n *\n * Two forms are supported:\n *\n * 1. **Schema-driven** (recommended) — pass a\n * [Standard Schema](https://standardschema.dev/) (Zod, Valibot, ArkType, …)\n * to infer `args` types and enable runtime validation of incoming events:\n *\n * ```typescript\n * import { z } from 'zod';\n * const showCaption = clientTool('show_caption', {\n * description: 'Display a caption',\n * schema: z.object({ text: z.string() }),\n * });\n * ```\n *\n * 2. **Type-only** — pass an `args` type via a cast when you don't need\n * runtime validation:\n *\n * ```typescript\n * const showCaption = clientTool('show_caption', {\n * description: 'Display a caption',\n * args: {} as { text: string },\n * });\n * ```\n *\n * Combine tools and derive event types with `ClientEventsFrom`:\n *\n * ```typescript\n * const tools = [showCaption, playSound];\n * type MyEvent = ClientEventsFrom<typeof tools>;\n * ```\n */\nexport function clientTool<\n Name extends string,\n Schema extends StandardSchemaV1,\n>(\n name: Name,\n config: { description: string; schema: Schema },\n): ClientToolDef<Name, InferSchemaOutput<Schema>>;\nexport function clientTool<Name extends string, Args>(\n name: Name,\n config: { description: string; args: Args },\n): ClientToolDef<Name, Args>;\nexport function clientTool<Name extends string>(\n name: Name,\n config:\n | { description: string; schema: StandardSchemaV1 }\n | { description: string; args: unknown },\n): ClientToolDef<Name> {\n const tool: ClientToolDef<Name> = {\n type: 'client_event',\n name,\n description: config.description,\n };\n\n if ('schema' in config) {\n toolSchemas.set(tool, config.schema);\n }\n\n return tool;\n}\n","import { clientTool, type ClientEventsFrom } from '../tools';\n\nexport const clickTool = clientTool('click', {\n description: 'Clicks an interactive element on the page by its target ID',\n args: {} as { target: string },\n});\n\nexport const scrollToTool = clientTool('scroll_to', {\n description: 'Scrolls the page to an element by its target ID',\n args: {} as { target: string },\n});\n\nexport const highlightTool = clientTool('highlight', {\n description:\n 'Highlights an element on the page to draw attention to it by its target ID',\n args: {} as { target: string; duration?: number },\n});\n\nconst toolDefs = [clickTool, scrollToTool, highlightTool] as const;\n\nexport type PageActionEvent = ClientEventsFrom<typeof toolDefs>;\n\n/**\n * Pre-built tool definitions with `parameters` arrays, ready to spread\n * into `realtimeSessions.create({ tools })`.\n *\n * @example\n * ```ts\n * import { pageActionTools } from '@runwayml/avatars-react/api';\n *\n * await client.realtimeSessions.create({\n * model: 'gwm1_avatars',\n * avatar: { type: 'runway-preset', presetId: 'music-superstar' },\n * tools: [...pageActionTools, ...myCustomTools],\n * });\n * ```\n */\nexport const pageActionTools = [\n {\n ...clickTool,\n parameters: [\n {\n name: 'target',\n type: 'string',\n description:\n 'The ID or data-avatar-target value of the element to click',\n },\n ],\n },\n {\n ...scrollToTool,\n parameters: [\n {\n name: 'target',\n type: 'string',\n description:\n 'The ID or data-avatar-target value of the element to scroll to',\n },\n ],\n },\n {\n ...highlightTool,\n parameters: [\n {\n name: 'target',\n type: 'string',\n description:\n 'The ID or data-avatar-target value of the element to highlight',\n },\n {\n name: 'duration',\n type: 'number',\n description: 'How long to highlight in milliseconds. Defaults to 2000',\n },\n ],\n },\n];\n"]}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@runwayml/avatars",
3
+ "version": "0.16.0-beta.0",
4
+ "description": "Framework-agnostic SDK for real-time AI avatar interactions",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.cts",
17
+ "default": "./dist/index.cjs"
18
+ }
19
+ },
20
+ "./api": {
21
+ "import": {
22
+ "types": "./dist/api.d.ts",
23
+ "default": "./dist/api.js"
24
+ },
25
+ "require": {
26
+ "types": "./dist/api.d.cts",
27
+ "default": "./dist/api.cjs"
28
+ }
29
+ }
30
+ },
31
+ "typesVersions": {
32
+ "*": {
33
+ "api": ["./dist/api.d.ts"]
34
+ }
35
+ },
36
+ "files": [
37
+ "dist",
38
+ "README.md",
39
+ "LICENSE"
40
+ ],
41
+ "scripts": {
42
+ "build": "tsup",
43
+ "dev": "tsup --watch",
44
+ "typecheck": "tsc --noEmit",
45
+ "lint": "biome lint src/",
46
+ "test": "bun test"
47
+ },
48
+ "keywords": [
49
+ "runwayml",
50
+ "avatar",
51
+ "ai",
52
+ "realtime",
53
+ "gwm-1",
54
+ "video",
55
+ "webrtc",
56
+ "streaming"
57
+ ],
58
+ "author": "RunwayML",
59
+ "license": "MIT",
60
+ "dependencies": {
61
+ "livekit-client": "^2.18.2"
62
+ }
63
+ }