{"version":3,"sources":["../src/tools/streaming-media.ts"],"names":["tool","z","TASK_ALIASES","TASK_REGISTRY"],"mappings":";;;;;;AAuCA,SAAS,QAAA,GAAqC;AAC5C,EAAA,IAAI,CAAC,MAAA,CAAO,iBAAA,EAAmB,MAAA,CAAO,iBAAA,uBAAwB,GAAA,EAAI;AAClE,EAAA,OAAO,MAAA,CAAO,iBAAA;AAChB;AACA,SAAS,YAAA,GAAkD;AACzD,EAAA,IAAI,CAAC,MAAA,CAAO,qBAAA,EAAuB,MAAA,CAAO,qBAAA,uBAA4B,GAAA,EAAI;AAC1E,EAAA,OAAO,MAAA,CAAO,qBAAA;AAChB;AACA,SAAS,eAAA,GAAkD;AACzD,EAAA,IAAI,CAAC,MAAA,CAAO,yBAAA,EAA2B,MAAA,CAAO,yBAAA,uBAAgC,GAAA,EAAI;AAClF,EAAA,OAAO,MAAA,CAAO,yBAAA;AAChB;AAEA,SAAS,MAAM,IAAA,EAAsB;AACnC,EAAA,OAAO,GAAG,IAAI,CAAA,CAAA,EAAI,KAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAC,IAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACrF;AAEA,eAAe,mBAAmB,KAAA,EAA+C;AAC/E,EAAA,IAAI,MAAM,OAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,WAAA,SAAoB,KAAA,CAAM,OAAA;AAC7D,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AACxC,EAAA,CAAA,CAAE,QAAA,GAAW,IAAA;AACb,EAAA,CAAA,CAAE,KAAA,GAAQ,IAAA;AACV,EAAA,CAAA,CAAE,WAAA,GAAc,IAAA;AAChB,EAAA,CAAA,CAAE,MAAM,OAAA,GAAU,MAAA;AAClB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,EAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,SAAA,GAAY,KAAA,CAAM,MAAA;AAAA,OAAA,IAC7B,KAAA,CAAM,GAAA,EAAK,CAAA,CAAE,GAAA,GAAM,KAAA,CAAM,GAAA;AAClC,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,CAAA,KAAM;AAC7B,IAAA,IAAI,CAAA,CAAE,UAAA,IAAc,CAAA,EAAG,OAAO,CAAA,EAAE;AAChC,IAAA,CAAA,CAAE,YAAA,GAAe,MAAM,CAAA,EAAE;AACzB,IAAA,UAAA,CAAW,GAAG,GAAI,CAAA;AAAA,EACpB,CAAC,CAAA;AACD,EAAA,KAAA,CAAM,OAAA,GAAU,CAAA;AAChB,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,mBAAA,CAAoB,KAAA,EAAoB,OAAA,GAAU,IAAA,EAAM,OAAO,YAAA,EAA+B;AACrG,EAAA,OAAO,IAAI,OAAA,CAAQ,OAAO,OAAA,EAAS,MAAA,KAAW;AAC5C,IAAA,IAAI;AACF,MAAA,MAAM,CAAA,GAAI,MAAM,kBAAA,CAAmB,KAAK,CAAA;AACxC,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,MAAA,MAAA,CAAO,KAAA,GAAQ,EAAE,UAAA,IAAc,GAAA;AAC/B,MAAA,MAAA,CAAO,MAAA,GAAS,EAAE,WAAA,IAAe,GAAA;AACjC,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,MAAA,IAAI,CAAC,GAAA,EAAK,OAAO,OAAO,IAAI,KAAA,CAAM,wBAAwB,CAAC,CAAA;AAC3D,MAAA,GAAA,CAAI,UAAU,CAAA,EAAG,CAAA,EAAG,GAAG,MAAA,CAAO,KAAA,EAAO,OAAO,MAAM,CAAA;AAClD,MAAA,KAAA,CAAM,WAAA,GAAc,KAAK,GAAA,EAAI;AAC7B,MAAA,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,IACzC,SAAS,CAAA,EAAG;AAAE,MAAA,MAAA,CAAO,CAAC,CAAA;AAAA,IAAE;AAAA,EAC1B,CAAC,CAAA;AACH;AAMO,IAAM,iBAAiBA,QAAA,CAAK;AAAA,EACjC,IAAA,EAAM,aAAA;AAAA,EACN,WAAA,EACE,8RAAA;AAAA,EAIF,WAAA,EAAaC,MAAE,MAAA,CAAO;AAAA,IACpB,IAAA,EAAMA,MAAE,IAAA,CAAK,CAAC,UAAU,KAAA,EAAO,QAAA,EAAU,WAAW,CAAC,CAAA;AAAA,IACrD,UAAA,EAAYA,KAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,aAAa,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,gDAAgD,CAAA;AAAA,IAChH,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC3B,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC5B,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC/B,OAAOA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,iDAAiD,CAAA;AAAA,IACxF,KAAKA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,qCAAqC;AAAA,GAC1E,CAAA;AAAA,EACD,QAAA,EAAU,OAAO,KAAA,KAAU;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAC3B,MAAA,IAAI,MAAA,GAA6B,IAAA;AACjC,MAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU;AAC3B,QAAA,MAAA,GAAS,MAAM,SAAA,CAAU,YAAA,CAAa,YAAA,CAAa;AAAA,UACjD,KAAA,EAAO;AAAA,YACL,UAAA,EAAY,MAAM,UAAA,IAAc,MAAA;AAAA,YAChC,OAAO,KAAA,CAAM,KAAA,GAAQ,EAAE,KAAA,EAAO,KAAA,CAAM,OAAM,GAAI,KAAA,CAAA;AAAA,YAC9C,QAAQ,KAAA,CAAM,MAAA,GAAS,EAAE,KAAA,EAAO,KAAA,CAAM,QAAO,GAAI,KAAA,CAAA;AAAA,YACjD,WAAW,KAAA,CAAM,SAAA,GAAY,EAAE,KAAA,EAAO,KAAA,CAAM,WAAU,GAAI,KAAA;AAAA,WAC5D;AAAA,UACA,KAAA,EAAO,MAAM,KAAA,IAAS;AAAA,SACvB,CAAA;AAAA,MACH,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,KAAA,EAAO;AAC/B,QAAA,MAAA,GAAS,MAAM,UAAU,YAAA,CAAa,YAAA,CAAa,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,CAAA;AAAA,MAClF,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU;AAElC,QAAA,MAAA,GAAS,MAAO,UAAU,YAAA,CAAqB,eAAA,CAAgB,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,CAAA;AAAA,MAC9F,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,WAAA,EAAa;AACrC,QAAA,IAAI,CAAC,KAAA,CAAM,GAAA,EAAK,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,MACrE;AACA,MAAA,MAAM,KAAA,GAAqB;AAAA,QACzB,EAAA;AAAA,QACA,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,MAAA;AAAA,QACA,KAAK,KAAA,CAAM,GAAA;AAAA,QACX,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,WAAA,EAAa;AAAA,OACf;AACA,MAAA,QAAA,EAAS,CAAE,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AAGxB,MAAA,MAAM,SAAS,MAAA,EAAQ,SAAA,EAAU,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC7C,MAAM,CAAA,CAAE,IAAA;AAAA,QAAM,OAAO,CAAA,CAAE,KAAA;AAAA,QAAO,SAAS,CAAA,CAAE,OAAA;AAAA,QAAS,YAAY,CAAA,CAAE;AAAA,OAClE,CAAE,KAAK,EAAC;AACR,MAAA,OAAO,KAAK,SAAA,CAAU;AAAA,QACpB,MAAA,EAAQ,SAAA;AAAA,QACR,EAAA;AAAA,QACA,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,MAAA;AAAA,QACA,IAAA,EAAM,kBAAkB,EAAE,CAAA,0EAAA;AAAA,OAC3B,CAAA;AAAA,IACH,SAAS,GAAA,EAAc;AACrB,MAAA,OAAO,IAAA,CAAK,UAAU,EAAE,MAAA,EAAQ,SAAS,KAAA,EAAQ,GAAA,CAAc,SAAS,CAAA;AAAA,IAC1E;AAAA,EACF;AACF,CAAC;AAEM,IAAM,kBAAkBD,QAAA,CAAK;AAAA,EAClC,IAAA,EAAM,aAAA;AAAA,EACN,WAAA,EAAa,kEAAA;AAAA,EACb,WAAA,EAAaC,KAAA,CAAE,MAAA,CAAO,EAAE,CAAA;AAAA,EACxB,UAAU,MAAM;AACd,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,QAAA,EAAS,CAAE,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC1D,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,KAAK,CAAA,CAAE,GAAA;AAAA,MACP,QAAQ,CAAA,CAAE,MAAA,EAAQ,SAAA,EAAU,CAAE,IAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,KAAA,EAAO,EAAE,KAAA,EAAM,CAAE,KAAK,EAAC;AAAA,MACjF,SAAS,IAAA,CAAK,KAAA,CAAA,CAAO,GAAA,GAAM,CAAA,CAAE,aAAa,GAAI,CAAA;AAAA,MAC9C,kBAAA,EAAoB,EAAE,WAAA,GAAc,IAAA,CAAK,OAAO,GAAA,GAAM,CAAA,CAAE,WAAA,IAAe,GAAI,CAAA,GAAI;AAAA,KACjF,CAAE,CAAA;AACF,IAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,YAAA,EAAa,CAAE,MAAM,CAAA;AAC9C,IAAA,OAAO,KAAK,SAAA,CAAU;AAAA,MACpB,MAAA,EAAQ,SAAA;AAAA,MACR,OAAO,OAAA,CAAQ,MAAA;AAAA,MACf,OAAA;AAAA,MACA,YAAA,EAAc;AAAA,KACf,CAAA;AAAA,EACH;AACF,CAAC;AAEM,IAAM,kBAAkBD,QAAA,CAAK;AAAA,EAClC,IAAA,EAAM,cAAA;AAAA,EACN,WAAA,EAAa,iGAAA;AAAA,EACb,WAAA,EAAaC,MAAE,MAAA,CAAO;AAAA,IACpB,IAAIA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,oDAAoD,CAAA;AAAA,IACvF,GAAA,EAAKA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,GAC3B,CAAA;AAAA,EACD,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,IAAA,MAAM,MAAM,QAAA,EAAS;AACrB,IAAA,MAAM,QAAQ,YAAA,EAAa;AAC3B,IAAA,MAAM,SAAmB,EAAC;AAC1B,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAA,GAAM,KAAA,CAAM,KAAK,GAAA,CAAI,IAAA,EAAM,CAAA,GAAI,MAAM,EAAA,GAAK,CAAC,KAAA,CAAM,EAAE,IAAI,EAAC;AAC1E,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA;AACxB,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,IAAI;AACF,QAAA,KAAA,CAAM,MAAA,EAAQ,WAAU,CAAE,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA;AACjD,QAAA,KAAA,CAAM,SAAS,MAAA,EAAO;AACtB,QAAA,GAAA,CAAI,OAAO,EAAE,CAAA;AACb,QAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AAEd,QAAA,KAAA,MAAW,CAAC,KAAK,EAAE,CAAA,IAAK,MAAM,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,CAAA,EAAG;AACnD,UAAA,IAAI,GAAA,CAAI,QAAA,CAAS,EAAE,CAAA,EAAG;AAAE,YAAA,EAAA,CAAG,IAAA,EAAK;AAAG,YAAA,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,UAAE;AAAA,QACvD;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX;AACA,IAAA,OAAO,IAAA,CAAK,UAAU,EAAE,MAAA,EAAQ,WAAW,MAAA,EAAQ,SAAA,EAAW,GAAA,CAAI,IAAA,EAAM,CAAA;AAAA,EAC1E;AACF,CAAC;AAEM,IAAM,mBAAmBD,QAAA,CAAK;AAAA,EACnC,IAAA,EAAM,sBAAA;AAAA,EACN,WAAA,EAAa,0HAAA;AAAA,EACb,WAAA,EAAaC,MAAE,MAAA,CAAO;AAAA,IACpB,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,IACpB,SAASA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,iCAAiC,CAAA;AAAA,IACzE,IAAA,EAAMA,MAAE,IAAA,CAAK,CAAC,cAAc,WAAW,CAAC,EAAE,QAAA;AAAS,GACpD,CAAA;AAAA,EACD,QAAA,EAAU,OAAO,KAAA,KAAU;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,QAAA,EAAS,CAAE,GAAA,CAAI,MAAM,SAAS,CAAA;AAC5C,MAAA,IAAI,CAAC,OAAO,MAAM,IAAI,MAAM,CAAA,kBAAA,EAAqB,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AAClE,MAAA,MAAM,OAAA,GAAU,MAAM,mBAAA,CAAoB,KAAA,EAAO,MAAM,OAAA,IAAW,IAAA,EAAM,KAAA,CAAM,IAAA,IAAQ,YAAY,CAAA;AAClG,MAAA,OAAO,KAAK,SAAA,CAAU;AAAA,QACpB,MAAA,EAAQ,SAAA;AAAA,QACR,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,OAAA;AAAA,QACA,SAAS,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAA,GAAS,OAAO,IAAI;AAAA,OACjD,CAAA;AAAA,IACH,SAAS,GAAA,EAAc;AACrB,MAAA,OAAO,IAAA,CAAK,UAAU,EAAE,MAAA,EAAQ,SAAS,KAAA,EAAQ,GAAA,CAAc,SAAS,CAAA;AAAA,IAC1E;AAAA,EACF;AACF,CAAC;AASM,IAAM,uBAAuBD,QAAA,CAAK;AAAA,EACvC,IAAA,EAAM,oBAAA;AAAA,EACN,WAAA,EACE,oTAAA;AAAA,EAGF,WAAA,EAAaC,MAAE,MAAA,CAAO;AAAA,IACpB,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,SAAS,kBAAkB,CAAA;AAAA,IACjD,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC3B,OAAOA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,iCAAiC,CAAA;AAAA,IACvE,QAAQA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,gDAAgD,CAAA;AAAA,IACvF,SAASA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,6FAAwF,CAAA;AAAA,IACjI,OAAOA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,cAAc,CAAA;AAAA,IACrD,UAAUA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,8CAA8C;AAAA,GACzF,CAAA;AAAA,EACD,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,QAAA,EAAS,CAAE,GAAA,CAAI,MAAM,SAAS,CAAA;AAC1C,MAAA,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,CAAA,kBAAA,EAAqB,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AAChE,MAAA,MAAM,EAAA,GAAK,CAAA,MAAA,EAAS,KAAA,CAAM,SAAS,CAAA,CAAA;AACnC,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,CAAA,UAAA,EAAM,IAAI,IAAI,CAAA,EAAA,EAAK,MAAM,SAAS,CAAA,CAAA,CAAA;AAC/D,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,GAAA;AAC7B,MAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,IAAY,GAAA,CAAI,IAAA,KAAS,KAAA;AAClD,MAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,IAAA;AAC7B,MAAA,MAAM,QAAA,GAAW,MAAM,QAAA,IAAY,KAAA;AAInC,MAAA,MAAM,IAAA,GAAO;AAAA,sCAAA,EACqB,KAAA,CAAM,SAAS,CAAA,iCAAA,EAAoC,KAAK,CAAA;AAAA,EAAA,EAC5F,GAAA,CAAI,SAAS,KAAA,GAAQ;AAAA;AAAA,oFAAA,EAEsD,MAAM,SAAS,CAAA;AAAA,qCAAA,EACvD,KAAK,CAAA;AAAA;AAAA,EAAA,CAAA,GAEtC;AAAA,8BAAA,EAC0B,KAAA,GAAQ,OAAA,GAAU,EAAE,CAAA,CAAA,EAAI,QAAA,GAAW,UAAA,GAAa,EAAE,CAAA,+CAAA,EAAkD,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,OAAO,MAAM,CAAA;AAAA,EAAA,EAC3K,UAAA,GAAa,yHAAyH,EAAE;AAAA,EAAA,CACzI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AASG,MAAA,MAAM,EAAA,GAAK;AAAA;AAAA,mBAAA,EAEI,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAoF9C,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,oBAAA,EAAsB;AAAA,UACzD,MAAA,EAAQ,EAAE,EAAA,EAAI,KAAA,EAAO,IAAA,EAAM,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,SAAA,EAAW,IAAA,CAAK,GAAA,EAAI;AAAE,SAC/D,CAAC,CAAA;AAAA,MACJ;AACA,MAAA,OAAO,KAAK,SAAA,CAAU;AAAA,QACpB,MAAA,EAAQ,UAAA;AAAA,QACR,EAAA;AAAA,QACA,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,WAAA,EAAa,UAAA;AAAA,QACb,iBAAA,EAAmB,UAAA,GAAa,KAAA,CAAM,SAAA,GAAY;AAAA,OACnD,CAAA;AAAA,IACH,SAAS,GAAA,EAAc;AACrB,MAAA,OAAO,IAAA,CAAK,UAAU,EAAE,MAAA,EAAQ,SAAS,KAAA,EAAQ,GAAA,CAAc,SAAS,CAAA;AAAA,IAC1E;AAAA,EACF;AACF,CAAC;AAMM,IAAM,kBAAkBD,QAAA,CAAK;AAAA,EAClC,IAAA,EAAM,qBAAA;AAAA,EACN,WAAA,EACE,mOAAA;AAAA,EAEF,WAAA,EAAaC,MAAE,MAAA,CAAO;AAAA,IACpB,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,IACpB,OAAOA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,qCAAqC,CAAA;AAAA,IAC5E,IAAA,EAAMA,KAAA,CAAE,KAAA,CAAMA,KAAA,CAAE,MAAA,CAAO;AAAA,MACrB,IAAA,EAAMA,KAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,OAAO,CAAC,CAAA;AAAA,MACpF,CAAA,EAAGA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACvB,CAAA,EAAGA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACvB,CAAA,EAAGA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACvB,CAAA,EAAGA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACvB,EAAA,EAAIA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACxB,EAAA,EAAIA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACxB,CAAA,EAAGA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACvB,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MAC1B,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MAC3B,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MAC/B,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MAC1B,IAAA,EAAMA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,MAC3B,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MAC3B,aAAaA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,4EAAuE;AAAA,KACpH,CAAC,CAAA,CAAE,QAAA,CAAS,iCAAiC;AAAA,GAC/C,CAAA;AAAA,EACD,QAAA,EAAU,OAAO,KAAA,KAAU;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,eAAA,EAAgB,CAAE,GAAA,CAAI,MAAM,SAAS,CAAA;AACrD,MAAA,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,CAAA,sBAAA,EAAyB,KAAA,CAAM,SAAS,CAAA,+CAAA,CAAiD,CAAA;AACvH,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA;AACnC,MAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAC1D,MAAA,IAAI,KAAA,CAAM,KAAA,KAAU,KAAA,EAAO,GAAA,CAAI,SAAA,CAAU,GAAG,CAAA,EAAG,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,MAAM,CAAA;AAE5E,MAAA,KAAA,MAAW,EAAA,IAAM,MAAM,IAAA,EAAM;AAC3B,QAAA,GAAA,CAAI,IAAA,EAAK;AACT,QAAA,IAAI,EAAA,CAAG,KAAA,KAAU,KAAA,CAAA,EAAW,GAAA,CAAI,cAAc,EAAA,CAAG,KAAA;AACjD,QAAA,MAAM,KAAA,GAAQ,GAAG,KAAA,IAAS,SAAA;AAC1B,QAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,QAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,QAAA,GAAA,CAAI,SAAA,GAAY,GAAG,SAAA,IAAa,CAAA;AAChC,QAAA,GAAA,CAAI,IAAA,GAAO,GAAG,IAAA,IAAQ,oBAAA;AAEtB,QAAA,QAAQ,GAAG,IAAA;AAAM,UACf,KAAK,OAAA;AAAS,YAAA,GAAA,CAAI,SAAA,CAAU,EAAA,CAAG,CAAA,IAAK,CAAA,EAAG,GAAG,CAAA,IAAK,CAAA,EAAG,EAAA,CAAG,CAAA,IAAK,OAAA,CAAQ,KAAA,EAAO,EAAA,CAAG,CAAA,IAAK,QAAQ,MAAM,CAAA;AAAG,YAAA;AAAA,UAClG,KAAK,MAAA;AACH,YAAA,IAAI,EAAA,CAAG,CAAA,KAAM,KAAA,CAAA,IAAa,EAAA,CAAG,MAAM,KAAA,CAAA,EAAW;AAC5C,cAAA,GAAA,CAAI,UAAA,CAAW,EAAA,CAAG,CAAA,IAAK,CAAA,EAAG,EAAA,CAAG,KAAK,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA;AAC/C,cAAA,IAAI,EAAA,CAAG,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,EAAA,CAAG,CAAA,IAAK,CAAA,EAAG,EAAA,CAAG,CAAA,IAAK,CAAA,EAAG,EAAA,CAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAC1D,cAAA,IAAI,GAAG,IAAA,EAAM;AACX,gBAAA,MAAM,GAAA,GAAM,CAAA;AACZ,gBAAA,MAAM,KAAK,GAAA,CAAI,WAAA,CAAY,GAAG,IAAI,CAAA,CAAE,QAAQ,GAAA,GAAM,CAAA;AAClD,gBAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,gBAAA,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,IAAK,CAAA,EAAA,CAAI,GAAG,CAAA,IAAK,CAAA,IAAK,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAChD,gBAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,gBAAA,GAAA,CAAI,QAAA,CAAS,EAAA,CAAG,IAAA,EAAA,CAAO,EAAA,CAAG,CAAA,IAAK,KAAK,GAAA,EAAA,CAAM,EAAA,CAAG,CAAA,IAAK,CAAA,IAAK,CAAC,CAAA;AAAA,cAC1D;AAAA,YACF;AACA,YAAA;AAAA,UACF,KAAK,QAAA;AACH,YAAA,GAAA,CAAI,SAAA,EAAU;AAAG,YAAA,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,CAAA,IAAK,CAAA,EAAG,EAAA,CAAG,CAAA,IAAK,CAAA,EAAG,EAAA,CAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAC,CAAA;AACxE,YAAA,IAAI,EAAA,CAAG,IAAA,EAAM,GAAA,CAAI,IAAA,EAAK;AAAA,qBAAY,MAAA,EAAO;AACzC,YAAA;AAAA,UACF,KAAK,MAAA;AACH,YAAA,GAAA,CAAI,SAAA,EAAU;AAAG,YAAA,GAAA,CAAI,OAAO,EAAA,CAAG,CAAA,IAAK,CAAA,EAAG,EAAA,CAAG,KAAK,CAAC,CAAA;AAAG,YAAA,GAAA,CAAI,OAAO,EAAA,CAAG,EAAA,IAAM,CAAA,EAAG,EAAA,CAAG,MAAM,CAAC,CAAA;AAAG,YAAA,GAAA,CAAI,MAAA,EAAO;AAClG,YAAA;AAAA,UACF,KAAK,MAAA;AACH,YAAA,IAAI,EAAA,CAAG,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,EAAA,CAAG,IAAA,EAAM,EAAA,CAAG,CAAA,IAAK,CAAA,EAAG,EAAA,CAAG,CAAA,IAAK,CAAC,CAAA;AACvD,YAAA;AAAA,UACF,KAAK,OAAA;AACH,YAAA,IAAI,GAAG,IAAA,EAAM;AACX,cAAA,MAAM,GAAA,GAAM,CAAA;AACZ,cAAA,MAAM,KAAK,GAAA,CAAI,WAAA,CAAY,GAAG,IAAI,CAAA,CAAE,QAAQ,GAAA,GAAM,CAAA;AAClD,cAAA,GAAA,CAAI,QAAA,CAAA,CAAU,EAAA,CAAG,CAAA,IAAK,CAAA,IAAK,GAAA,EAAA,CAAM,GAAG,CAAA,IAAK,CAAA,IAAK,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AACxD,cAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,cAAA,GAAA,CAAI,QAAA,CAAS,GAAG,IAAA,EAAM,EAAA,CAAG,KAAK,CAAA,EAAG,EAAA,CAAG,KAAK,CAAC,CAAA;AAAA,YAC5C;AACA,YAAA;AAAA,UACF,KAAK,MAAA;AACH,YAAA,IAAI,GAAG,WAAA,EAAa;AAElB,cAAA,MAAM,GAAA,GAAM,IAAI,KAAA,EAAM;AACtB,cAAA,MAAM,IAAI,OAAA,CAAc,CAAC,CAAA,KAAM;AAAE,gBAAA,GAAA,CAAI,MAAA,GAAS,MAAM,CAAA,EAAE;AAAG,gBAAA,GAAA,CAAI,OAAA,GAAU,MAAM,CAAA,EAAE;AAAG,gBAAA,GAAA,CAAI,MAAM,EAAA,CAAG,WAAA;AAAA,cAAa,CAAC,CAAA;AAC7G,cAAA,GAAA,CAAI,SAAA,CAAU,GAAA,EAAK,EAAA,CAAG,CAAA,IAAK,GAAG,EAAA,CAAG,CAAA,IAAK,CAAA,EAAG,EAAA,CAAG,KAAK,OAAA,CAAQ,KAAA,EAAO,EAAA,CAAG,CAAA,IAAK,QAAQ,MAAM,CAAA;AAAA,YACxF;AACA,YAAA;AAAA,UACF,KAAK,SAAA;AAEH,YAAA,IAAI,GAAG,IAAA,EAAM;AACX,cAAA,IAAI;AACF,gBAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,IAAI,CAAA;AAC9B,gBAAA,KAAA,MAAW,KAAK,GAAA,EAAK;AACnB,kBAAA,MAAM,CAAA,GAAI,IAAI,oBAAA,CAAqB,CAAA,CAAE,IAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAG,CAAA,CAAE,IAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,GAAI,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAC9H,kBAAA,CAAA,CAAE,YAAA,CAAa,CAAA,EAAG,CAAA,aAAA,EAAgB,CAAA,CAAE,CAAC,CAAA,CAAA,CAAG,CAAA;AACxC,kBAAA,CAAA,CAAE,YAAA,CAAa,GAAG,iBAAiB,CAAA;AACnC,kBAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,kBAAA,GAAA,CAAI,SAAS,CAAA,EAAG,CAAA,EAAG,OAAA,CAAQ,KAAA,EAAO,QAAQ,MAAM,CAAA;AAAA,gBAClD;AAAA,cACF,CAAA,CAAA,MAAQ;AAAA,cAAC;AAAA,YACX;AACA,YAAA;AAAA;AAEJ,QAAA,GAAA,CAAI,OAAA,EAAQ;AAAA,MACd;AACA,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,IACnG,SAAS,GAAA,EAAc;AACrB,MAAA,OAAO,IAAA,CAAK,UAAU,EAAE,MAAA,EAAQ,SAAS,KAAA,EAAQ,GAAA,CAAc,SAAS,CAAA;AAAA,IAC1E;AAAA,EACF;AACF,CAAC;AAMM,IAAM,2BAA2BD,QAAA,CAAK;AAAA,EAC3C,IAAA,EAAM,wBAAA;AAAA,EACN,WAAA,EACE,wVAAA;AAAA,EAIF,WAAA,EAAaC,MAAE,MAAA,CAAO;AAAA,IACpB,SAAA,EAAWA,MAAE,MAAA,EAAO;AAAA,IACpB,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qJAAqJ,CAAA;AAAA,IAC/K,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC3B,MAAA,EAAQA,MAAE,IAAA,CAAK,CAAC,QAAQ,QAAQ,CAAC,EAAE,QAAA,EAAS;AAAA,IAC5C,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC3B,KAAKA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,2DAA2D,CAAA;AAAA,IAC/F,OAAA,EAASA,KAAA,CAAE,MAAA,CAAOA,KAAA,CAAE,MAAA,EAAO,EAAGA,KAAA,CAAE,GAAA,EAAK,CAAA,CAAE,QAAA,EAAS,CAAE,SAAS,qDAAqD,CAAA;AAAA,IAChH,WAAWA,KAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,6EAA6E,CAAA;AAAA,IACxH,gBAAgBA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,6CAA6C,CAAA;AAAA,IAC5F,SAASA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,gCAAgC;AAAA,GACzE,CAAA;AAAA,EACD,QAAA,EAAU,OAAO,KAAA,KAAU;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,QAAA,EAAS,CAAE,GAAA,CAAI,MAAM,SAAS,CAAA;AAC5C,MAAA,IAAI,CAAC,OAAO,MAAM,IAAI,MAAM,CAAA,kBAAA,EAAqB,KAAA,CAAM,SAAS,CAAA,CAAE,CAAA;AAGlE,MAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAW,GAAI,MAAM,OAAO,2BAA2B,CAAA;AACzE,MAAA,MAAM,YAAA,GAAeC,8BAAA,CAAa,KAAA,CAAM,IAAI,KAAK,KAAA,CAAM,IAAA;AACvD,MAAA,MAAM,IAAA,GAAOC,gCAAc,YAAY,CAAA;AACvC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,IAAS,IAAA,EAAM,YAAA;AACnC,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,IAAU,MAAA;AAC/B,MAAA,MAAM,QAAA,GAAgB,EAAE,MAAA,EAAO;AAI/B,MAAA,MAAM,OAAA,GAAU;AAAA,QACd,KAAA,EAAO,MAAA;AAAA,QAAQ,aAAA,EAAe,MAAA;AAAA,QAAQ,oBAAA,EAAsB,MAAA;AAAA,QAC5D,aAAA,EAAe,MAAA;AAAA,QAAQ,YAAA,EAAc,MAAA;AAAA,QAAQ,cAAA,EAAgB,MAAA;AAAA,QAC7D,aAAA,EAAe,MAAA;AAAA,QAAQ,qBAAA,EAAuB;AAAA,OAChD;AACA,MAAA,MAAM,mBAAmB,YAAA,KAAiB,iBAAA,IACvC,KAAA,IAAS,8BAAA,CAA+B,KAAK,KAAK,CAAA;AACrD,MAAA,IAAI,MAAM,KAAA,EAAO;AACf,QAAA,QAAA,CAAS,QAAQ,KAAA,CAAM,KAAA;AAAA,MACzB,CAAA,MAAA,IAAW,CAAC,gBAAA,EAAkB;AAC5B,QAAA,QAAA,CAAS,KAAA,GAAQ,OAAA;AAAA,MACnB,CAAA,MAAA,IAAW,MAAM,YAAA,EAAc;AAC7B,QAAA,QAAA,CAAS,QAAQ,IAAA,CAAK,YAAA;AAAA,MACxB;AAEA,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,MAAM,UAAA,CAAW,YAAA,EAAqB,KAAA,EAAO,QAAQ,CAAA;AAAA,MAC9D,SAAS,GAAA,EAAc;AACrB,QAAA,MAAM,GAAA,GAAO,IAAc,OAAA,IAAW,EAAA;AACtC,QAAA,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,uBAAuB,CAAA,IAAK,GAAA,CAAI,SAAS,wBAAwB,CAAA,KAAM,CAAC,KAAA,CAAM,KAAA,EAAO;AAErG,UAAA,IAAA,GAAO,MAAM,WAAW,YAAA,EAAqB,KAAA,EAAO,EAAE,GAAG,QAAA,EAAU,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA,QACrF,CAAA,MAAO;AACL,UAAA,MAAM,GAAA;AAAA,QACR;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,IAAW,CAAA,KAAA,EAAQ,KAAA,CAAM,SAAS,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AAClF,MAAA,MAAM,GAAA,GAAM,MAAM,GAAA,IAAO,CAAA;AACzB,MAAA,MAAM,aAAa,GAAA,GAAO,GAAA;AAC1B,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,SAAA,IAAa,CAAC,kBAAA,EAAoB,8BAA8B,oBAAA,EAAsB,kBAAkB,CAAA,CAAE,QAAA,CAAS,YAAY,CAAA;AAEtJ,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,MAAA,MAAM,OAAO,YAAY;AACvB,QAAA,IAAI,OAAA,EAAS;AACb,QAAA,IAAI,KAAA,CAAM,cAAA,IAAkB,UAAA,IAAc,KAAA,CAAM,cAAA,EAAgB;AAC9D,UAAA,IAAA,EAAK;AAAG,UAAA;AAAA,QACV;AACA,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,MAAM,mBAAA,CAAoB,KAAA,EAAO,MAAM,YAAY,CAAA;AACnE,UAAA,MAAM,SAAS,MAAM,IAAA,CAAK,SAAS,KAAA,CAAM,OAAA,IAAW,EAAE,CAAA;AACtD,UAAA,UAAA,EAAA;AAGA,UAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,2BAAA,EAA6B;AAAA,YAChE,MAAA,EAAQ;AAAA,cACN,OAAA,EAAS,MAAA;AAAA,cAAQ,WAAW,KAAA,CAAM,SAAA;AAAA,cAClC,IAAA,EAAM,YAAA;AAAA,cAAc,SAAA,EAAW,UAAA;AAAA,cAAY,EAAA,EAAI,KAAK,GAAA,EAAI;AAAA,cAAG;AAAA;AAC7D,WACD,CAAC,CAAA;AAGF,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,MAAM,OAAA,GAAU,eAAA,EAAgB,CAAE,GAAA,CAAI,MAAM,SAAS,CAAA;AACrD,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA;AACnC,cAAA,IAAI,GAAA,EAAK;AACP,gBAAA,GAAA,CAAI,UAAU,CAAA,EAAG,CAAA,EAAG,OAAA,CAAQ,KAAA,EAAO,QAAQ,MAAM,CAAA;AACjD,gBAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAAkB;AAClC,kBAAA,IAAI,CAAA,GAAI,CAAA;AACR,kBAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,CAAA,EAAA,EAAK,CAAA,GAAK,CAAA,GAAI,EAAA,GAAK,KAAA,CAAM,UAAA,CAAW,CAAC,CAAA,GAAK,IAAA;AAC5E,kBAAA,OAAO,CAAA,IAAA,EAAO,IAAI,GAAG,CAAA,WAAA,CAAA;AAAA,gBACvB,CAAA;AACA,gBAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,kBAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AAExB,oBAAA,IAAI,IAAI,GAAA,EAAK;AACX,sBAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAA,KAAS,GAAA,CAAI,GAAA;AACvC,sBAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,KAAA,IAAS,KAAK,CAAA;AACzC,sBAAA,GAAA,CAAI,WAAA,GAAc,KAAA;AAClB,sBAAA,GAAA,CAAI,SAAA,GAAY,CAAA;AAChB,sBAAA,GAAA,CAAI,WAAW,IAAA,EAAM,IAAA,EAAM,IAAA,GAAO,IAAA,EAAM,OAAO,IAAI,CAAA;AACnD,sBAAA,MAAM,UAAU,CAAA,EAAG,GAAA,CAAI,KAAA,IAAS,EAAE,IAAK,GAAA,CAAI,KAAA,GAAQ,GAAA,GAAM,GAAA,CAAI,MAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,EAAG,GAAG,IAAA,EAAK;AAC3F,sBAAA,IAAI,OAAA,EAAS;AACX,wBAAA,GAAA,CAAI,IAAA,GAAO,oBAAA;AACX,wBAAA,MAAM,EAAA,GAAK,GAAA,CAAI,WAAA,CAAY,OAAO,EAAE,KAAA,GAAQ,CAAA;AAC5C,wBAAA,GAAA,CAAI,SAAA,GAAY,KAAA;AAChB,wBAAA,GAAA,CAAI,QAAA,CAAS,MAAM,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,GAAO,EAAE,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA;AACjD,wBAAA,GAAA,CAAI,SAAA,GAAY,MAAA;AAChB,wBAAA,GAAA,CAAI,QAAA,CAAS,SAAS,IAAA,GAAO,CAAA,EAAG,KAAK,GAAA,CAAI,EAAA,EAAI,IAAA,GAAO,CAAC,CAAC,CAAA;AAAA,sBACxD;AAAA,oBACF;AAEA,oBAAA,IAAI,IAAI,IAAA,EAAM;AACZ,sBAAA,IAAI;AAEF,wBAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,KAAA;AACpB,wBAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,MAAA;AACpB,wBAAA,MAAM,MAAA,GAAS,QAAQ,KAAA,GAAQ,EAAA;AAC/B,wBAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,GAAS,EAAA;AAChC,wBAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,wBAAA,GAAA,CAAI,KAAA,GAAQ,EAAA;AAAI,wBAAA,GAAA,CAAI,MAAA,GAAS,EAAA;AAC7B,wBAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA;AAChC,wBAAA,IAAI,IAAA,EAAM;AACR,0BAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,EAAA,EAAI,EAAE,CAAA;AAC3C,0BAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,GAAK,IAAI,CAAA,EAAA,EAAK;AAChC,4BAAA,MAAM,CAAA,GAAI,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AACzB,4BAAA,IAAI,IAAI,GAAA,EAAK;AACX,8BAAA,MAAM,IAAI,QAAA,CAAS,GAAA,CAAI,SAAS,EAAE,CAAA,CAAE,MAAM,MAAM,CAAA;AAChD,8BAAA,OAAA,CAAQ,KAAK,CAAA,GAAE,CAAC,IAAI,QAAA,CAAS,CAAA,CAAE,CAAC,CAAC,CAAA;AACjC,8BAAA,OAAA,CAAQ,IAAA,CAAK,IAAE,CAAA,GAAE,CAAC,IAAI,QAAA,CAAS,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,IAAA;AACvC,8BAAA,OAAA,CAAQ,IAAA,CAAK,IAAE,CAAA,GAAE,CAAC,IAAI,QAAA,CAAS,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,IAAA;AACvC,8BAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,GAAE,CAAA,GAAE,CAAC,CAAA,GAAI,GAAA;AAAA,4BACxB;AAAA,0BACF;AACA,0BAAA,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA;AAC/B,0BAAA,GAAA,CAAI,WAAA,GAAc,GAAA;AAClB,0BAAA,GAAA,CAAI,UAAU,GAAA,EAAK,CAAA,EAAG,GAAG,OAAA,CAAQ,KAAA,EAAO,QAAQ,MAAM,CAAA;AACtD,0BAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AAAA,wBACpB;AAAA,sBACF,CAAA,CAAA,MAAQ;AAAA,sBAAC;AAAA,oBACX;AAAA,kBACF;AAAA,gBACF,CAAA,MAAA,IAAW,MAAA,IAAU,MAAA,CAAO,eAAA,EAAiB;AAE3C,kBAAA,IAAI;AACF,oBAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,oBAAA,IAAI,KAAA,IAAS,MAAM,IAAA,EAAM;AACvB,sBAAA,MAAM,KAAK,KAAA,CAAM,KAAA;AAAO,sBAAA,MAAM,KAAK,KAAA,CAAM,MAAA;AACzC,sBAAA,MAAM,GAAA,GAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC3C,sBAAA,GAAA,CAAI,KAAA,GAAQ,EAAA;AAAI,sBAAA,GAAA,CAAI,MAAA,GAAS,EAAA;AAC7B,sBAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA;AAChC,sBAAA,IAAI,IAAA,EAAM;AACR,wBAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,EAAA,EAAI,EAAE,CAAA;AAC3C,wBAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,GAAK,IAAI,CAAA,EAAA,EAAK;AAChC,0BAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA;AACtB,0BAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,GAAE,CAAC,CAAA,GAAI,CAAA;AACpB,0BAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,GAAE,CAAA,GAAE,CAAC,CAAA,GAAI,CAAA;AACtB,0BAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,GAAE,CAAA,GAAE,CAAC,IAAI,GAAA,GAAM,CAAA;AAC5B,0BAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,GAAE,CAAA,GAAE,CAAC,CAAA,GAAI,GAAA;AAAA,wBACxB;AACA,wBAAA,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,CAAA,EAAG,CAAC,CAAA;AAC/B,wBAAA,GAAA,CAAI,WAAA,GAAc,GAAA;AAClB,wBAAA,GAAA,CAAI,UAAU,GAAA,EAAK,CAAA,EAAG,GAAG,OAAA,CAAQ,KAAA,EAAO,QAAQ,MAAM,CAAA;AACtD,wBAAA,GAAA,CAAI,WAAA,GAAc,CAAA;AAAA,sBACpB;AAAA,oBACF;AAAA,kBACF,CAAA,CAAA,MAAQ;AAAA,kBAAC;AAAA,gBACX;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,CAAA,EAAG;AACV,UAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,2BAAA,EAA6B;AAAA,YAChE,MAAA,EAAQ,EAAE,OAAA,EAAS,MAAA,EAAQ,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW,KAAA,EAAQ,CAAA,CAAY,OAAA,EAAS,EAAA,EAAI,IAAA,CAAK,KAAI;AAAE,WACpG,CAAC,CAAA;AAAA,QACJ;AACA,QAAA,IAAI,CAAC,OAAA,EAAS,UAAA,CAAW,IAAA,EAAM,UAAU,CAAA;AAAA,MAC3C,CAAA;AAEA,MAAA,MAAM,OAAO,MAAM;AACjB,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,YAAA,EAAa,CAAE,OAAO,MAAM,CAAA;AAC5B,QAAA,IAAI;AAAE,UAAA,IAAA,EAAM,OAAA,IAAU;AAAA,QAAE,CAAA,CAAA,MAAQ;AAAA,QAAC;AAAA,MACnC,CAAA;AACA,MAAA,YAAA,EAAa,CAAE,GAAA,CAAI,MAAA,EAAQ,EAAE,MAAM,CAAA;AACnC,MAAA,IAAA,EAAK;AAEL,MAAA,OAAO,KAAK,SAAA,CAAU;AAAA,QACpB,MAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAS,MAAA;AAAA,QACT,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,IAAA,EAAM,YAAA;AAAA,QACN,KAAA;AAAA,QACA,GAAA;AAAA,QACA,SAAA,EAAW,QAAA;AAAA,QACX,IAAA,EAAM,oFAAoF,MAAM,CAAA,GAAA;AAAA,OACjG,CAAA;AAAA,IACH,SAAS,GAAA,EAAc;AACrB,MAAA,OAAO,IAAA,CAAK,UAAU,EAAE,MAAA,EAAQ,SAAS,KAAA,EAAQ,GAAA,CAAc,SAAS,CAAA;AAAA,IAC1E;AAAA,EACF;AACF,CAAC;AAEM,IAAM,qBAAqBH,QAAA,CAAK;AAAA,EACrC,IAAA,EAAM,kBAAA;AAAA,EACN,WAAA,EAAa,yDAAA;AAAA,EACb,WAAA,EAAaC,MAAE,MAAA,CAAO;AAAA,IACpB,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC7B,GAAA,EAAKA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,GAC3B,CAAA;AAAA,EACD,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,IAAA,MAAM,QAAQ,YAAA,EAAa;AAC3B,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,GAAA,GAAM,KAAA,CAAM,KAAK,KAAA,CAAM,IAAA,EAAM,CAAA,GAAI,MAAM,OAAA,GAAU,CAAC,KAAA,CAAM,OAAO,IAAI,EAAC;AACtF,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,EAAE,CAAA;AAC3B,MAAA,IAAI,MAAA,EAAQ;AAAE,QAAA,MAAA,CAAO,IAAA,EAAK;AAAG,QAAA,KAAA,CAAM,OAAO,EAAE,CAAA;AAAG,QAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AAAA,MAAE;AAAA,IAClE;AACA,IAAA,OAAO,IAAA,CAAK,UAAU,EAAE,MAAA,EAAQ,WAAW,OAAA,EAAS,SAAA,EAAW,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,EAC7E;AACF,CAAC;AAOM,IAAM,uBAAuBD,QAAA,CAAK;AAAA,EACvC,IAAA,EAAM,mBAAA;AAAA,EACN,WAAA,EACE,2NAAA;AAAA,EAEF,WAAA,EAAaC,MAAE,MAAA,CAAO;AAAA,IACpB,SAAA,EAAWA,KAAA,CAAE,MAAA,EAAO,CAAE,SAAS,sBAAsB,CAAA;AAAA,IACrD,OAAOA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,iCAAiC,CAAA;AAAA,IACvE,MAAA,EAAQA,MAAE,IAAA,CAAK,CAAC,QAAQ,QAAQ,CAAC,EAAE,QAAA,EAAS;AAAA,IAC5C,WAAWA,KAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,mCAAmC,CAAA;AAAA,IAC7E,QAAA,EAAUA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAC9B,cAAA,EAAgBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IACpC,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC9B,CAAA;AAAA,EACD,QAAA,EAAU,OAAO,KAAA,KAAU;AACzB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,QAAA,EAAS,CAAE,GAAA,CAAI,MAAM,SAAS,CAAA;AAC5C,MAAA,IAAI,CAAC,SAAS,KAAA,CAAM,IAAA,KAAS,OAAO,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAC3E,MAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAE5D,MAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAW,GAAI,MAAM,OAAO,2BAA2B,CAAA;AACzE,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,IAAU,MAAA;AAC/B,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,IAASE,+BAAA,CAAc,8BAA8B,CAAA,CAAE,YAAA;AAC3E,MAAA,MAAM,QAAA,GAAgB,EAAE,MAAA,EAAO;AAE/B,MAAA,QAAA,CAAS,KAAA,GAAQ;AAAA,QACf,KAAA,EAAO,MAAA;AAAA,QAAQ,aAAA,EAAe,MAAA;AAAA,QAAQ,oBAAA,EAAsB;AAAA,OAC9D;AACA,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,MAAM,UAAA,CAAW,8BAAA,EAAgC,KAAA,EAAO,QAAQ,CAAA;AAAA,MACzE,SAAS,GAAA,EAAc;AAGrB,QAAA,OAAO,QAAA,CAAS,KAAA;AAChB,QAAA,IAAA,GAAO,MAAM,UAAA,CAAW,8BAAA,EAAgC,KAAA,EAAO,QAAQ,CAAA;AAAA,MACzE;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,SAAA,IAAa,CAAA;AACpC,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,IAAW,CAAA,WAAA,EAAc,KAAA,CAAM,SAAS,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AACxF,MAAA,IAAI,OAAA,GAAU,KAAA;AACd,MAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,MAAA,MAAM,QAAA,GAAW,IAAI,aAAA,CAAc,KAAA,CAAM,QAAQ,EAAE,QAAA,EAAU,cAAc,CAAA;AAC3E,MAAA,MAAM,SAAiB,EAAC;AACxB,MAAA,QAAA,CAAS,eAAA,GAAkB,OAAO,CAAA,KAAM;AACtC,QAAA,IAAI,EAAE,IAAA,CAAK,IAAA,GAAO,GAAG,MAAA,CAAO,IAAA,CAAK,EAAE,IAAI,CAAA;AAAA,MACzC,CAAA;AACA,MAAA,QAAA,CAAS,SAAS,YAAY;AAC5B,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,YAAA,EAAc,CAAA;AAC9D,QAAA,IAAI;AACF,UAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,UAAA,MAAM,OAAY,EAAC;AACnB,UAAA,IAAI,KAAA,CAAM,QAAA,EAAU,IAAA,CAAK,QAAA,GAAW,KAAA,CAAM,QAAA;AAC1C,UAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AACnC,UAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AACvB,UAAA,UAAA,EAAA;AACA,UAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,2BAAA,EAA6B;AAAA,YAChE,MAAA,EAAQ,EAAE,OAAA,EAAS,MAAA,EAAQ,WAAW,KAAA,CAAM,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,WAAW,UAAA,EAAY,MAAA,EAAQ,EAAA,EAAI,IAAA,CAAK,KAAI;AAAE,WACnH,CAAC,CAAA;AAAA,QACJ,SAAS,CAAA,EAAG;AACV,UAAA,MAAA,CAAO,aAAA,CAAc,IAAI,WAAA,CAAY,2BAAA,EAA6B;AAAA,YAChE,QAAQ,EAAE,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAQ,EAAY,OAAA;AAAQ,WACxD,CAAC,CAAA;AAAA,QACJ;AACA,QAAA,IAAI,CAAC,OAAA,KAAY,CAAC,MAAM,cAAA,IAAkB,UAAA,GAAa,MAAM,cAAA,CAAA,EAAiB;AAC5E,UAAA,IAAI;AAAE,YAAA,QAAA,CAAS,KAAA,EAAM;AAAG,YAAA,UAAA,CAAW,MAAM;AAAE,cAAA,IAAI,CAAC,OAAA,IAAW,QAAA,CAAS,KAAA,KAAU,WAAA,WAAsB,IAAA,EAAK;AAAA,YAAE,CAAA,EAAG,WAAW,GAAI,CAAA;AAAA,UAAE,CAAA,CAAA,MAAQ;AAAA,UAAC;AAAA,QAC1I,CAAA,MAAO;AACL,UAAA,IAAA,EAAK;AAAA,QACP;AAAA,MACF,CAAA;AAEA,MAAA,MAAM,OAAO,MAAM;AACjB,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,IAAI;AAAE,UAAA,IAAI,QAAA,CAAS,KAAA,KAAU,UAAA,EAAY,QAAA,CAAS,IAAA,EAAK;AAAA,QAAE,CAAA,CAAA,MAAQ;AAAA,QAAC;AAClE,QAAA,YAAA,EAAa,CAAE,OAAO,MAAM,CAAA;AAC5B,QAAA,IAAI;AAAE,UAAA,IAAA,EAAM,OAAA,IAAU;AAAA,QAAE,CAAA,CAAA,MAAQ;AAAA,QAAC;AAAA,MACnC,CAAA;AACA,MAAA,YAAA,EAAa,CAAE,GAAA,CAAI,MAAA,EAAQ,EAAE,MAAM,CAAA;AACnC,MAAA,QAAA,CAAS,KAAA,EAAM;AACf,MAAA,UAAA,CAAW,MAAM;AAAE,QAAA,IAAI,CAAC,OAAA,IAAW,QAAA,CAAS,KAAA,KAAU,WAAA,WAAsB,IAAA,EAAK;AAAA,MAAE,CAAA,EAAG,WAAW,GAAI,CAAA;AAErG,MAAA,OAAO,KAAK,SAAA,CAAU;AAAA,QACpB,MAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAS,MAAA;AAAA,QACT,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,SAAA,EAAW,QAAA;AAAA,QACX,IAAA,EAAM,CAAA,4DAAA;AAAA,OACP,CAAA;AAAA,IACH,SAAS,GAAA,EAAc;AACrB,MAAA,OAAO,IAAA,CAAK,UAAU,EAAE,MAAA,EAAQ,SAAS,KAAA,EAAQ,GAAA,CAAc,SAAS,CAAA;AAAA,IAC1E;AAAA,EACF;AACF,CAAC;AAEM,IAAM,eAAA,GAAkB;AAAA,EAC7B,cAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,eAAA;AAAA,EACA,wBAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF","file":"chunk-T72SXVYD.cjs","sourcesContent":["/**\n * streaming-media.ts — Live media streams (camera/mic/screen) with registry.\n *\n * Agent opens a stream once → gets an ID → refers to it from UI panels or\n * stream_to_transformers loops. Central registry lives on window.__carelessStreams\n * so UIPanelBubble's panel.js can bind <video> elements to streams by id.\n *\n * Also: a frame grabber for pulling periodic snapshots from any stream,\n * and a loop runner that pipes snapshots through a transformers_js pipeline.\n */\nimport { tool } from '@strands-agents/sdk'\nimport { z } from 'zod'\nimport { TASK_REGISTRY, TASK_ALIASES } from './transformers-js'\n\n\n/* ──────────────────────────────────────────────────────────────────────────\n * Global stream registry on window (so panels can bind by id).\n * ──────────────────────────────────────────────────────────────────────── */\n\ntype StreamEntry = {\n  id: string\n  kind: 'camera' | 'mic' | 'screen' | 'canvas' | 'video-url'\n  stream: MediaStream | null\n  videoEl?: HTMLVideoElement\n  audioEl?: HTMLAudioElement\n  url?: string\n  createdAt: number\n  lastFrameTs: number\n  meta?: Record<string, any>\n}\n\ndeclare global {\n  interface Window {\n    __carelessStreams?: Map<string, StreamEntry>\n    __carelessStreamLoops?: Map<string, { stop: () => void }>\n    __carelessOverlayCanvases?: Map<string, HTMLCanvasElement>\n  }\n}\n\nfunction registry(): Map<string, StreamEntry> {\n  if (!window.__carelessStreams) window.__carelessStreams = new Map()\n  return window.__carelessStreams\n}\nfunction loopRegistry(): Map<string, { stop: () => void }> {\n  if (!window.__carelessStreamLoops) window.__carelessStreamLoops = new Map()\n  return window.__carelessStreamLoops\n}\nfunction overlayRegistry(): Map<string, HTMLCanvasElement> {\n  if (!window.__carelessOverlayCanvases) window.__carelessOverlayCanvases = new Map()\n  return window.__carelessOverlayCanvases\n}\n\nfunction newId(kind: string): string {\n  return `${kind}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`\n}\n\nasync function ensureVideoElement(entry: StreamEntry): Promise<HTMLVideoElement> {\n  if (entry.videoEl && entry.videoEl.isConnected) return entry.videoEl\n  const v = document.createElement('video')\n  v.autoplay = true\n  v.muted = true\n  v.playsInline = true\n  v.style.display = 'none'\n  document.body.appendChild(v)\n  if (entry.stream) v.srcObject = entry.stream\n  else if (entry.url) v.src = entry.url\n  await new Promise<void>((r) => {\n    if (v.readyState >= 2) return r()\n    v.onloadeddata = () => r()\n    setTimeout(r, 3000)\n  })\n  entry.videoEl = v\n  return v\n}\n\nfunction captureFrameDataURL(entry: StreamEntry, quality = 0.85, type = 'image/jpeg'): Promise<string> {\n  return new Promise(async (resolve, reject) => {\n    try {\n      const v = await ensureVideoElement(entry)\n      const canvas = document.createElement('canvas')\n      canvas.width = v.videoWidth || 640\n      canvas.height = v.videoHeight || 480\n      const ctx = canvas.getContext('2d')\n      if (!ctx) return reject(new Error('2D context unavailable'))\n      ctx.drawImage(v, 0, 0, canvas.width, canvas.height)\n      entry.lastFrameTs = Date.now()\n      resolve(canvas.toDataURL(type, quality))\n    } catch (e) { reject(e) }\n  })\n}\n\n/* ──────────────────────────────────────────────────────────────────────────\n * Tools\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport const openStreamTool = tool({\n  name: 'stream_open',\n  description:\n    'Open a media stream (camera/mic/screen/video URL) and register it globally. ' +\n    'Returns a stream id you can pass to render_video_panel, stream_capture_frame, ' +\n    'or stream_to_transformers. Getting camera/mic/screen requires a user gesture — fire ' +\n    'this from the click/message handler path.',\n  inputSchema: z.object({\n    kind: z.enum(['camera', 'mic', 'screen', 'video-url']),\n    facingMode: z.enum(['user', 'environment']).optional().describe('camera: \"user\" (front) or \"environment\" (rear)'),\n    width: z.number().optional(),\n    height: z.number().optional(),\n    frameRate: z.number().optional(),\n    audio: z.boolean().optional().describe('For camera: include audio track. Default false.'),\n    url: z.string().optional().describe('For video-url: the video source URL'),\n  }),\n  callback: async (input) => {\n    try {\n      const id = newId(input.kind)\n      let stream: MediaStream | null = null\n      if (input.kind === 'camera') {\n        stream = await navigator.mediaDevices.getUserMedia({\n          video: {\n            facingMode: input.facingMode || 'user',\n            width: input.width ? { ideal: input.width } : undefined,\n            height: input.height ? { ideal: input.height } : undefined,\n            frameRate: input.frameRate ? { ideal: input.frameRate } : undefined,\n          },\n          audio: input.audio ?? false,\n        })\n      } else if (input.kind === 'mic') {\n        stream = await navigator.mediaDevices.getUserMedia({ audio: true, video: false })\n      } else if (input.kind === 'screen') {\n        // getDisplayMedia — user prompted to pick a screen/window/tab\n        stream = await (navigator.mediaDevices as any).getDisplayMedia({ video: true, audio: false })\n      } else if (input.kind === 'video-url') {\n        if (!input.url) throw new Error('url required for kind=\"video-url\"')\n      }\n      const entry: StreamEntry = {\n        id,\n        kind: input.kind,\n        stream,\n        url: input.url,\n        createdAt: Date.now(),\n        lastFrameTs: 0,\n      }\n      registry().set(id, entry)\n\n      // Provide some metadata about the stream\n      const tracks = stream?.getTracks().map((t) => ({\n        kind: t.kind, label: t.label, enabled: t.enabled, readyState: t.readyState,\n      })) || []\n      return JSON.stringify({\n        status: 'success',\n        id,\n        kind: input.kind,\n        tracks,\n        hint: `Use stream_id=\"${id}\" with render_video_panel / stream_capture_frame / stream_to_transformers.`,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const listStreamsTool = tool({\n  name: 'stream_list',\n  description: 'List all open media streams with their ids, kinds, and activity.',\n  inputSchema: z.object({}),\n  callback: () => {\n    const now = Date.now()\n    const streams = Array.from(registry().values()).map((e) => ({\n      id: e.id,\n      kind: e.kind,\n      url: e.url,\n      tracks: e.stream?.getTracks().map((t) => ({ kind: t.kind, label: t.label })) || [],\n      age_sec: Math.round((now - e.createdAt) / 1000),\n      last_frame_ago_sec: e.lastFrameTs ? Math.round((now - e.lastFrameTs) / 1000) : null,\n    }))\n    const loops = Array.from(loopRegistry().keys())\n    return JSON.stringify({\n      status: 'success',\n      count: streams.length,\n      streams,\n      active_loops: loops,\n    })\n  },\n})\n\nexport const closeStreamTool = tool({\n  name: 'stream_close',\n  description: 'Stop a media stream and remove it from the registry. Also stops any associated inference loops.',\n  inputSchema: z.object({\n    id: z.string().optional().describe('Stream id. Omit with all=true to close everything.'),\n    all: z.boolean().optional(),\n  }),\n  callback: (input) => {\n    const reg = registry()\n    const loops = loopRegistry()\n    const closed: string[] = []\n    const ids = input.all ? Array.from(reg.keys()) : input.id ? [input.id] : []\n    for (const id of ids) {\n      const entry = reg.get(id)\n      if (!entry) continue\n      try {\n        entry.stream?.getTracks().forEach((t) => t.stop())\n        entry.videoEl?.remove()\n        reg.delete(id)\n        closed.push(id)\n        // Stop any loops targeting this stream\n        for (const [lid, lh] of Array.from(loops.entries())) {\n          if (lid.includes(id)) { lh.stop(); loops.delete(lid) }\n        }\n      } catch {}\n    }\n    return JSON.stringify({ status: 'success', closed, remaining: reg.size })\n  },\n})\n\nexport const captureFrameTool = tool({\n  name: 'stream_capture_frame',\n  description: 'Capture a single frame from a stream as a JPEG/PNG data URL. For video-url streams, seeks time-based if currentTime set.',\n  inputSchema: z.object({\n    stream_id: z.string(),\n    quality: z.number().optional().describe('JPEG quality 0-1. Default 0.85.'),\n    type: z.enum(['image/jpeg', 'image/png']).optional(),\n  }),\n  callback: async (input) => {\n    try {\n      const entry = registry().get(input.stream_id)\n      if (!entry) throw new Error(`Stream not found: ${input.stream_id}`)\n      const dataUrl = await captureFrameDataURL(entry, input.quality ?? 0.85, input.type ?? 'image/jpeg')\n      return JSON.stringify({\n        status: 'success',\n        stream_id: input.stream_id,\n        dataUrl,\n        size_kb: Math.round(dataUrl.length * 0.75 / 1024),\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\n/* ──────────────────────────────────────────────────────────────────────────\n * Inline video panel — leverages render_ui under the hood (same event system).\n * Emits careless:ui-render so UIPanelBubble picks it up. The panel JS wires\n * <video> to the registered MediaStream by id, and optionally attaches an\n * overlay canvas.\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport const renderVideoPanelTool = tool({\n  name: 'render_video_panel',\n  description:\n    'Render an inline video panel bound to an open stream. Shows live MediaStream (camera/screen/mic) or video URL. ' +\n    'Optionally adds a transparent overlay canvas on top for drawing bboxes / masks / depth maps from transformers output. ' +\n    'Panel renders inline in the current message via the same system as render_ui.',\n  inputSchema: z.object({\n    stream_id: z.string().describe('From stream_open'),\n    title: z.string().optional(),\n    width: z.number().optional().describe('Panel width in px (default 480)'),\n    height: z.number().optional().describe('Panel height in px (default auto / aspect-fit)'),\n    overlay: z.boolean().optional().describe('Attach overlay canvas (registered with same id) — default true for camera/screen/video'),\n    muted: z.boolean().optional().describe('Default true'),\n    controls: z.boolean().optional().describe('Show native <video> controls. Default false.'),\n  }),\n  callback: (input) => {\n    try {\n      const reg = registry().get(input.stream_id)\n      if (!reg) throw new Error(`Stream not found: ${input.stream_id}`)\n      const id = `video-${input.stream_id}`\n      const title = input.title || `🎥 ${reg.kind} (${input.stream_id})`\n      const width = input.width ?? 480\n      const hasOverlay = input.overlay ?? (reg.kind !== 'mic')\n      const muted = input.muted ?? true\n      const controls = input.controls ?? false\n\n      // HTML structure: relatively-positioned container; <video> fills it;\n      // overlay <canvas> is absolutely positioned on top with pointer-events: none.\n      const html = `\n<div class=\"video-panel\" data-stream=\"${input.stream_id}\" style=\"position:relative;width:${width}px;max-width:100%;\">\n  ${reg.kind === 'mic' ? `\n  <div class=\"mic-indicator\" style=\"padding:16px;background:#111;border-radius:6px;text-align:center;\">\n    <div style=\"font-size:12px;opacity:.7;margin-bottom:8px;\">🎤 Microphone: ${input.stream_id}</div>\n    <canvas class=\"audio-viz\" width=\"${width}\" height=\"60\" style=\"width:100%;border-radius:4px;background:#0a0a0a;\"></canvas>\n  </div>\n  ` : `\n  <video class=\"stream-video\" ${muted ? 'muted' : ''} ${controls ? 'controls' : ''} autoplay playsinline style=\"width:100%;height:${input.height ? input.height + 'px' : 'auto'};display:block;background:#000;border-radius:6px;\"></video>\n  ${hasOverlay ? `<canvas class=\"overlay\" style=\"position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;\"></canvas>` : ''}\n  `}\n  <div class=\"video-meta\" style=\"margin-top:6px;font-size:10px;font-family:ui-monospace,monospace;opacity:.55;display:flex;gap:10px;\">\n    <span class=\"status\">connecting…</span>\n    <span class=\"fps\" style=\"margin-left:auto;\"></span>\n  </div>\n</div>\n`\n      // JS runs inside UIPanelBubble with `root` as the content div.\n      // root is the <div> containing our HTML above.\n      const js = `\n(async () => {\n  const streamId = ${JSON.stringify(input.stream_id)}\n  const reg = window.__carelessStreams && window.__carelessStreams.get(streamId)\n  if (!reg) { root.querySelector('.status').textContent = 'stream not found'; return }\n  const statusEl = root.querySelector('.status')\n  const fpsEl = root.querySelector('.fps')\n\n  if (reg.kind === 'mic') {\n    // Audio visualization via AudioContext AnalyserNode\n    const canvas = root.querySelector('.audio-viz')\n    const ctx2d = canvas.getContext('2d')\n    const AC = window.AudioContext || window.webkitAudioContext\n    const ac = new AC()\n    const src = ac.createMediaStreamSource(reg.stream)\n    const analyser = ac.createAnalyser()\n    analyser.fftSize = 256\n    src.connect(analyser)\n    const data = new Uint8Array(analyser.frequencyBinCount)\n    statusEl.textContent = 'recording'\n    let raf = 0\n    const draw = () => {\n      analyser.getByteFrequencyData(data)\n      ctx2d.fillStyle = '#0a0a0a'\n      ctx2d.fillRect(0, 0, canvas.width, canvas.height)\n      const barW = canvas.width / data.length\n      for (let i = 0; i < data.length; i++) {\n        const h = (data[i] / 255) * canvas.height\n        ctx2d.fillStyle = 'hsl(' + (200 + (data[i]/2)) + ',70%,55%)'\n        ctx2d.fillRect(i * barW, canvas.height - h, barW - 1, h)\n      }\n      raf = requestAnimationFrame(draw)\n    }\n    draw()\n    // cleanup when panel closes (root removed from DOM)\n    const mo = new MutationObserver(() => {\n      if (!root.isConnected) { cancelAnimationFrame(raf); try { ac.close() } catch (e) {}; mo.disconnect() }\n    })\n    mo.observe(document.body, { childList: true, subtree: true })\n    return\n  }\n\n  const video = root.querySelector('.stream-video')\n  if (!video) return\n  if (reg.stream) video.srcObject = reg.stream\n  else if (reg.url) video.src = reg.url\n  await video.play().catch(() => {})\n  statusEl.textContent = 'live'\n\n  // Register overlay canvas so draw tools can find it\n  const overlay = root.querySelector('.overlay')\n  if (overlay) {\n    const setSize = () => {\n      overlay.width = video.videoWidth || video.clientWidth\n      overlay.height = video.videoHeight || video.clientHeight\n    }\n    if (video.readyState >= 2) setSize()\n    else video.onloadeddata = setSize\n    if (!window.__carelessOverlayCanvases) window.__carelessOverlayCanvases = new Map()\n    window.__carelessOverlayCanvases.set(streamId, overlay)\n  }\n\n  // FPS counter\n  let frames = 0\n  let lastTick = performance.now()\n  let raf = 0\n  const tick = () => {\n    frames++\n    const now = performance.now()\n    if (now - lastTick > 1000) {\n      fpsEl.textContent = Math.round(frames * 1000 / (now - lastTick)) + ' fps'\n      frames = 0; lastTick = now\n    }\n    raf = requestAnimationFrame(tick)\n  }\n  tick()\n  const mo = new MutationObserver(() => {\n    if (!root.isConnected) {\n      cancelAnimationFrame(raf)\n      if (window.__carelessOverlayCanvases) window.__carelessOverlayCanvases.delete(streamId)\n      mo.disconnect()\n    }\n  })\n  mo.observe(document.body, { childList: true, subtree: true })\n})().catch(e => { try { root.querySelector('.status').textContent = 'error: ' + e.message } catch(_){} })\n`\n      if (typeof window !== 'undefined') {\n        window.dispatchEvent(new CustomEvent('careless:ui-render', {\n          detail: { id, title, html, css: '', js, createdAt: Date.now() },\n        }))\n      }\n      return JSON.stringify({\n        status: 'rendered',\n        id,\n        stream_id: input.stream_id,\n        has_overlay: hasOverlay,\n        overlay_canvas_id: hasOverlay ? input.stream_id : null,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\n/* ──────────────────────────────────────────────────────────────────────────\n * Overlay drawing — the agent paints detections/masks/labels on top of video.\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport const drawOverlayTool = tool({\n  name: 'stream_draw_overlay',\n  description:\n    'Draw shapes/text on the overlay canvas of a streamed video. Supports bboxes, labels, masks (as dataURL), heatmaps, dots. ' +\n    'Use after render_video_panel (with overlay:true). Coordinates are in VIDEO pixel space (not CSS pixels).',\n  inputSchema: z.object({\n    stream_id: z.string(),\n    clear: z.boolean().optional().describe('Clear before drawing. Default true.'),\n    draw: z.array(z.object({\n      type: z.enum(['bbox', 'label', 'mask', 'heatmap', 'circle', 'line', 'text', 'clear']),\n      x: z.number().optional(),\n      y: z.number().optional(),\n      w: z.number().optional(),\n      h: z.number().optional(),\n      x2: z.number().optional(),\n      y2: z.number().optional(),\n      r: z.number().optional(),\n      text: z.string().optional(),\n      color: z.string().optional(),\n      lineWidth: z.number().optional(),\n      font: z.string().optional(),\n      fill: z.boolean().optional(),\n      alpha: z.number().optional(),\n      maskDataUrl: z.string().optional().describe('For type:mask — a data URL image whose non-transparent pixels overlay'),\n    })).describe('Ordered list of draw operations'),\n  }),\n  callback: async (input) => {\n    try {\n      const overlay = overlayRegistry().get(input.stream_id)\n      if (!overlay) throw new Error(`No overlay for stream ${input.stream_id}. Did you render_video_panel with overlay:true?`)\n      const ctx = overlay.getContext('2d')\n      if (!ctx) throw new Error('Overlay 2d context unavailable')\n      if (input.clear !== false) ctx.clearRect(0, 0, overlay.width, overlay.height)\n\n      for (const op of input.draw) {\n        ctx.save()\n        if (op.alpha !== undefined) ctx.globalAlpha = op.alpha\n        const color = op.color || '#00ff99'\n        ctx.strokeStyle = color\n        ctx.fillStyle = color\n        ctx.lineWidth = op.lineWidth ?? 2\n        ctx.font = op.font || '14px ui-sans-serif'\n\n        switch (op.type) {\n          case 'clear': ctx.clearRect(op.x ?? 0, op.y ?? 0, op.w ?? overlay.width, op.h ?? overlay.height); break\n          case 'bbox':\n            if (op.w !== undefined && op.h !== undefined) {\n              ctx.strokeRect(op.x ?? 0, op.y ?? 0, op.w, op.h)\n              if (op.fill) ctx.fillRect(op.x ?? 0, op.y ?? 0, op.w, op.h)\n              if (op.text) {\n                const pad = 3\n                const tw = ctx.measureText(op.text).width + pad * 2\n                ctx.fillStyle = color\n                ctx.fillRect(op.x ?? 0, (op.y ?? 0) - 16, tw, 16)\n                ctx.fillStyle = '#000'\n                ctx.fillText(op.text, (op.x ?? 0) + pad, (op.y ?? 0) - 4)\n              }\n            }\n            break\n          case 'circle':\n            ctx.beginPath(); ctx.arc(op.x ?? 0, op.y ?? 0, op.r ?? 4, 0, Math.PI * 2)\n            if (op.fill) ctx.fill(); else ctx.stroke()\n            break\n          case 'line':\n            ctx.beginPath(); ctx.moveTo(op.x ?? 0, op.y ?? 0); ctx.lineTo(op.x2 ?? 0, op.y2 ?? 0); ctx.stroke()\n            break\n          case 'text':\n            if (op.text) ctx.fillText(op.text, op.x ?? 0, op.y ?? 0)\n            break\n          case 'label':\n            if (op.text) {\n              const pad = 4\n              const tw = ctx.measureText(op.text).width + pad * 2\n              ctx.fillRect((op.x ?? 0) - pad, (op.y ?? 0) - 14, tw, 18)\n              ctx.fillStyle = '#000'\n              ctx.fillText(op.text, op.x ?? 0, op.y ?? 0)\n            }\n            break\n          case 'mask':\n            if (op.maskDataUrl) {\n              // Load mask image and composite\n              const img = new Image()\n              await new Promise<void>((r) => { img.onload = () => r(); img.onerror = () => r(); img.src = op.maskDataUrl! })\n              ctx.drawImage(img, op.x ?? 0, op.y ?? 0, op.w ?? overlay.width, op.h ?? overlay.height)\n            }\n            break\n          case 'heatmap':\n            // Expect op.text to be a JSON array of {x,y,v} points normalized 0-1; we convert to radial gradients\n            if (op.text) {\n              try {\n                const pts = JSON.parse(op.text) as { x: number; y: number; v: number }[]\n                for (const p of pts) {\n                  const g = ctx.createRadialGradient(p.x * overlay.width, p.y * overlay.height, 0, p.x * overlay.width, p.y * overlay.height, 30)\n                  g.addColorStop(0, `rgba(255,0,0,${p.v})`)\n                  g.addColorStop(1, 'rgba(255,0,0,0)')\n                  ctx.fillStyle = g\n                  ctx.fillRect(0, 0, overlay.width, overlay.height)\n                }\n              } catch {}\n            }\n            break\n        }\n        ctx.restore()\n      }\n      return JSON.stringify({ status: 'success', stream_id: input.stream_id, drawn: input.draw.length })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\n/* ──────────────────────────────────────────────────────────────────────────\n * The big one: continuous stream → transformers pipeline loop.\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport const streamToTransformersTool = tool({\n  name: 'stream_to_transformers',\n  description:\n    'Continuously pipe frames from a stream through a Transformers.js pipeline and emit results. ' +\n    'Example: camera → object-detection → draws bboxes on overlay. Or mic-chunks → whisper → updates caption. ' +\n    'Results fire as careless:stream-inference events AND (if auto_draw) paint on the overlay canvas. ' +\n    'Use stream_stop_loop to end.',\n  inputSchema: z.object({\n    stream_id: z.string(),\n    task: z.string().describe('Transformers.js task (e.g. object-detection, depth-estimation, image-to-text, zero-shot-object-detection, image-classification, image-segmentation)'),\n    model: z.string().optional(),\n    device: z.enum(['wasm', 'webgpu']).optional(),\n    dtype: z.string().optional(),\n    fps: z.number().optional().describe('Target frames per second. Default 1. Higher needs WebGPU.'),\n    options: z.record(z.string(), z.any()).optional().describe('Pipeline options (e.g. candidate_labels, threshold)'),\n    auto_draw: z.boolean().optional().describe('Auto-paint results on the overlay canvas. Default true for detection tasks.'),\n    max_iterations: z.number().optional().describe('Stop after N iterations. Default: infinite.'),\n    loop_id: z.string().optional().describe('Custom loop id. Default: auto.'),\n  }),\n  callback: async (input) => {\n    try {\n      const entry = registry().get(input.stream_id)\n      if (!entry) throw new Error(`Stream not found: ${input.stream_id}`)\n\n      // Lazy-load transformers (550 KB) only when user actually runs a stream loop\n      const { pipeline: hfPipeline } = await import('@huggingface/transformers')\n      const resolvedTask = TASK_ALIASES[input.task] ?? input.task\n      const info = TASK_REGISTRY[resolvedTask]\n      const model = input.model ?? info?.defaultModel\n      const device = input.device ?? 'wasm'\n      const pipeOpts: any = { device }\n\n      // For seq2seq/encoder-decoder/vision-seq tasks, default to all-sessions fp32\n      // to dodge the Firefox ORT \"Missing required scale\" bug on quantized weights.\n      const allFp32 = {\n        model: 'fp32', encoder_model: 'fp32', decoder_model_merged: 'fp32',\n        decoder_model: 'fp32', embed_tokens: 'fp32', vision_encoder: 'fp32',\n        audio_encoder: 'fp32', prepare_inputs_embeds: 'fp32',\n      }\n      const isDecoderOnlyLLM = resolvedTask === 'text-generation' ||\n        (model && /qwen|llama|phi|gemma|smollm/i.test(model))\n      if (input.dtype) {\n        pipeOpts.dtype = input.dtype\n      } else if (!isDecoderOnlyLLM) {\n        pipeOpts.dtype = allFp32\n      } else if (info?.defaultDtype) {\n        pipeOpts.dtype = info.defaultDtype\n      }\n\n      let pipe: any\n      try {\n        pipe = await hfPipeline(resolvedTask as any, model, pipeOpts)\n      } catch (err: unknown) {\n        const msg = (err as Error).message || ''\n        if ((msg.includes('weight_merged_0_scale') || msg.includes('Missing required scale')) && !input.dtype) {\n          // Retry with all-fp32\n          pipe = await hfPipeline(resolvedTask as any, model, { ...pipeOpts, dtype: allFp32 })\n        } else {\n          throw err\n        }\n      }\n\n      const loopId = input.loop_id ?? `loop-${input.stream_id}-${Date.now().toString(36)}`\n      const fps = input.fps ?? 1\n      const intervalMs = 1000 / fps\n      const autoDraw = input.auto_draw ?? ['object-detection', 'zero-shot-object-detection', 'image-segmentation', 'depth-estimation'].includes(resolvedTask)\n\n      let stopped = false\n      let iterations = 0\n\n      const tick = async () => {\n        if (stopped) return\n        if (input.max_iterations && iterations >= input.max_iterations) {\n          stop(); return\n        }\n        try {\n          const dataUrl = await captureFrameDataURL(entry, 0.85, 'image/jpeg')\n          const result = await pipe(dataUrl, input.options ?? {})\n          iterations++\n\n          // Emit event for UI / other tools to consume\n          window.dispatchEvent(new CustomEvent('careless:stream-inference', {\n            detail: {\n              loop_id: loopId, stream_id: input.stream_id,\n              task: resolvedTask, iteration: iterations, ts: Date.now(), result,\n            },\n          }))\n\n          // Auto-draw for detection tasks\n          if (autoDraw) {\n            const overlay = overlayRegistry().get(input.stream_id)\n            if (overlay) {\n              const ctx = overlay.getContext('2d')\n              if (ctx) {\n                ctx.clearRect(0, 0, overlay.width, overlay.height)\n                const colorFor = (label: string) => {\n                  let h = 0\n                  for (let i = 0; i < label.length; i++) h = (h * 31 + label.charCodeAt(i)) & 0xfff\n                  return `hsl(${h % 360}, 80%, 60%)`\n                }\n                if (Array.isArray(result)) {\n                  for (const det of result) {\n                    // object-detection: { score, label, box:{xmin,ymin,xmax,ymax} }\n                    if (det.box) {\n                      const { xmin, ymin, xmax, ymax } = det.box\n                      const color = colorFor(det.label ?? 'obj')\n                      ctx.strokeStyle = color\n                      ctx.lineWidth = 2\n                      ctx.strokeRect(xmin, ymin, xmax - xmin, ymax - ymin)\n                      const caption = `${det.label ?? ''} ${(det.score ? ' ' + det.score.toFixed(2) : '')}`.trim()\n                      if (caption) {\n                        ctx.font = '13px ui-sans-serif'\n                        const tw = ctx.measureText(caption).width + 8\n                        ctx.fillStyle = color\n                        ctx.fillRect(xmin, Math.max(0, ymin - 16), tw, 16)\n                        ctx.fillStyle = '#000'\n                        ctx.fillText(caption, xmin + 4, Math.max(12, ymin - 4))\n                      }\n                    }\n                    // segmentation: { label, mask, score }\n                    if (det.mask) {\n                      try {\n                        // mask is a RawImage; convert to <img> via putImageData\n                        const mw = det.mask.width\n                        const mh = det.mask.height\n                        const scaleX = overlay.width / mw\n                        const scaleY = overlay.height / mh\n                        const tmp = document.createElement('canvas')\n                        tmp.width = mw; tmp.height = mh\n                        const tctx = tmp.getContext('2d')\n                        if (tctx) {\n                          const imgData = tctx.createImageData(mw, mh)\n                          for (let i = 0; i < mw * mh; i++) {\n                            const v = det.mask.data[i]\n                            if (v > 128) {\n                              const c = colorFor(det.label ?? '').match(/\\d+/g)!\n                              imgData.data[i*4] = parseInt(c[0])\n                              imgData.data[i*4+1] = parseInt(c[1]) * 2.55\n                              imgData.data[i*4+2] = parseInt(c[2]) * 2.55\n                              imgData.data[i*4+3] = 100\n                            }\n                          }\n                          tctx.putImageData(imgData, 0, 0)\n                          ctx.globalAlpha = 0.5\n                          ctx.drawImage(tmp, 0, 0, overlay.width, overlay.height)\n                          ctx.globalAlpha = 1\n                        }\n                      } catch {}\n                    }\n                  }\n                } else if (result && result.predicted_depth) {\n                  // depth-estimation: { predicted_depth: Tensor, depth: RawImage }\n                  try {\n                    const depth = result.depth\n                    if (depth && depth.data) {\n                      const dw = depth.width; const dh = depth.height\n                      const tmp = document.createElement('canvas')\n                      tmp.width = dw; tmp.height = dh\n                      const tctx = tmp.getContext('2d')\n                      if (tctx) {\n                        const imgData = tctx.createImageData(dw, dh)\n                        for (let i = 0; i < dw * dh; i++) {\n                          const v = depth.data[i]\n                          imgData.data[i*4] = v\n                          imgData.data[i*4+1] = v\n                          imgData.data[i*4+2] = 255 - v\n                          imgData.data[i*4+3] = 200\n                        }\n                        tctx.putImageData(imgData, 0, 0)\n                        ctx.globalAlpha = 0.6\n                        ctx.drawImage(tmp, 0, 0, overlay.width, overlay.height)\n                        ctx.globalAlpha = 1\n                      }\n                    }\n                  } catch {}\n                }\n              }\n            }\n          }\n        } catch (e) {\n          window.dispatchEvent(new CustomEvent('careless:stream-inference', {\n            detail: { loop_id: loopId, stream_id: input.stream_id, error: (e as Error).message, ts: Date.now() },\n          }))\n        }\n        if (!stopped) setTimeout(tick, intervalMs)\n      }\n\n      const stop = () => {\n        stopped = true\n        loopRegistry().delete(loopId)\n        try { pipe?.dispose?.() } catch {}\n      }\n      loopRegistry().set(loopId, { stop })\n      tick() // fire-and-forget\n\n      return JSON.stringify({\n        status: 'started',\n        loop_id: loopId,\n        stream_id: input.stream_id,\n        task: resolvedTask,\n        model,\n        fps,\n        auto_draw: autoDraw,\n        hint: `Listen for careless:stream-inference events, or call stream_stop_loop({loop_id: \"${loopId}\"})`,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const stopStreamLoopTool = tool({\n  name: 'stream_stop_loop',\n  description: 'Stop a running stream→transformers inference loop.',\n  inputSchema: z.object({\n    loop_id: z.string().optional(),\n    all: z.boolean().optional(),\n  }),\n  callback: (input) => {\n    const loops = loopRegistry()\n    const stopped: string[] = []\n    const ids = input.all ? Array.from(loops.keys()) : input.loop_id ? [input.loop_id] : []\n    for (const id of ids) {\n      const handle = loops.get(id)\n      if (handle) { handle.stop(); loops.delete(id); stopped.push(id) }\n    }\n    return JSON.stringify({ status: 'success', stopped, remaining: loops.size })\n  },\n})\n\n/* ──────────────────────────────────────────────────────────────────────────\n * Audio streaming chunks for Whisper (continuous STT).\n * Records rolling chunks of audio from a mic stream and transcribes them.\n * ──────────────────────────────────────────────────────────────────────── */\n\nexport const streamTranscribeTool = tool({\n  name: 'stream_transcribe',\n  description:\n    'Continuously transcribe a microphone stream via Whisper. Records rolling chunks (default 5s) and fires ' +\n    'careless:stream-inference events with partial transcripts. Requires an active mic stream (stream_open kind=\"mic\").',\n  inputSchema: z.object({\n    stream_id: z.string().describe('Must be a mic stream'),\n    model: z.string().optional().describe('Default: Xenova/whisper-tiny.en'),\n    device: z.enum(['wasm', 'webgpu']).optional(),\n    chunk_sec: z.number().optional().describe('Rolling window length. Default 5.'),\n    language: z.string().optional(),\n    max_iterations: z.number().optional(),\n    loop_id: z.string().optional(),\n  }),\n  callback: async (input) => {\n    try {\n      const entry = registry().get(input.stream_id)\n      if (!entry || entry.kind !== 'mic') throw new Error('Requires a mic stream')\n      if (!entry.stream) throw new Error('No MediaStream on entry')\n\n      const { pipeline: hfPipeline } = await import('@huggingface/transformers')\n      const device = input.device ?? 'wasm'\n      const model = input.model ?? TASK_REGISTRY['automatic-speech-recognition'].defaultModel\n      const pipeOpts: any = { device }\n      // Always all-fp32 for Whisper — safest across Firefox/Chrome/Safari.\n      pipeOpts.dtype = {\n        model: 'fp32', encoder_model: 'fp32', decoder_model_merged: 'fp32',\n      }\n      let pipe: any\n      try {\n        pipe = await hfPipeline('automatic-speech-recognition', model, pipeOpts)\n      } catch (err: unknown) {\n        // If fp32 fails, the model probably doesn't ship fp32 weights; retry with\n        // a minimal config that lets transformers.js pick defaults.\n        delete pipeOpts.dtype\n        pipe = await hfPipeline('automatic-speech-recognition', model, pipeOpts)\n      }\n\n      const chunkSec = input.chunk_sec ?? 5\n      const loopId = input.loop_id ?? `transcribe-${input.stream_id}-${Date.now().toString(36)}`\n      let stopped = false\n      let iterations = 0\n\n      const recorder = new MediaRecorder(entry.stream, { mimeType: 'audio/webm' })\n      const chunks: Blob[] = []\n      recorder.ondataavailable = async (e) => {\n        if (e.data.size > 0) chunks.push(e.data)\n      }\n      recorder.onstop = async () => {\n        const blob = new Blob(chunks.splice(0), { type: 'audio/webm' })\n        try {\n          const url = URL.createObjectURL(blob)\n          const opts: any = {}\n          if (input.language) opts.language = input.language\n          const result = await pipe(url, opts)\n          URL.revokeObjectURL(url)\n          iterations++\n          window.dispatchEvent(new CustomEvent('careless:stream-inference', {\n            detail: { loop_id: loopId, stream_id: input.stream_id, task: 'asr', iteration: iterations, result, ts: Date.now() },\n          }))\n        } catch (e) {\n          window.dispatchEvent(new CustomEvent('careless:stream-inference', {\n            detail: { loop_id: loopId, error: (e as Error).message },\n          }))\n        }\n        if (!stopped && (!input.max_iterations || iterations < input.max_iterations)) {\n          try { recorder.start(); setTimeout(() => { if (!stopped && recorder.state === 'recording') recorder.stop() }, chunkSec * 1000) } catch {}\n        } else {\n          stop()\n        }\n      }\n\n      const stop = () => {\n        stopped = true\n        try { if (recorder.state !== 'inactive') recorder.stop() } catch {}\n        loopRegistry().delete(loopId)\n        try { pipe?.dispose?.() } catch {}\n      }\n      loopRegistry().set(loopId, { stop })\n      recorder.start()\n      setTimeout(() => { if (!stopped && recorder.state === 'recording') recorder.stop() }, chunkSec * 1000)\n\n      return JSON.stringify({\n        status: 'started',\n        loop_id: loopId,\n        stream_id: input.stream_id,\n        chunk_sec: chunkSec,\n        hint: `Listen for careless:stream-inference events with result.text`,\n      })\n    } catch (err: unknown) {\n      return JSON.stringify({ status: 'error', error: (err as Error).message })\n    }\n  },\n})\n\nexport const STREAMING_TOOLS = [\n  openStreamTool,\n  listStreamsTool,\n  closeStreamTool,\n  captureFrameTool,\n  renderVideoPanelTool,\n  drawOverlayTool,\n  streamToTransformersTool,\n  stopStreamLoopTool,\n  streamTranscribeTool,\n]\n"]}