diff --git a/dist/VideoAgent.js b/dist/VideoAgent.js index bce0020..cabf4a2 100644 --- a/dist/VideoAgent.js +++ b/dist/VideoAgent.js @@ -71,7 +71,7 @@ Use tools when needed to provide accurate information.`; this.endpoint = options.endpoint; this.voice = options.voice || "alloy"; this.speechInstructions = options.speechInstructions; - this.outputFormat = options.outputFormat || "mp3"; + this.outputFormat = options.outputFormat || "opus"; this.maxAudioInputSize = options.maxAudioInputSize ?? types_1.DEFAULT_MAX_AUDIO_SIZE; this.maxFrameInputSize = options.maxFrameInputSize ?? DEFAULT_MAX_FRAME_SIZE; // Generate or use provided session ID diff --git a/dist/VideoAgent.js.map b/dist/VideoAgent.js.map index db9e59b..7df5e66 100644 --- a/dist/VideoAgent.js.map +++ b/dist/VideoAgent.js.map @@ -1 +1 @@ -{"version":3,"file":"VideoAgent.js","sourceRoot":"","sources":["../src/VideoAgent.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"VideoAgent.js","sourceRoot":"","sources":["../src/VideoAgent.ts"],"names":[],"mappings":";;;AAAA,2BAA+B;AAC/B,mCAAsC;AACtC,2BAUY;AACZ,mCAOiB;AAyDjB,8CAA8C;AAC9C,MAAM,sBAAsB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/C,iCAAiC;AACjC,MAAM,0BAA0B,GAAqB;IACjD,gBAAgB,EAAE,EAAE;CACvB,CAAC;AA+BF,MAAa,UAAW,SAAQ,qBAAY;IAChC,MAAM,CAAa;IACnB,KAAK,GAAyB,EAAE,CAAC;IACjC,KAAK,CAAgB;IACrB,kBAAkB,CAAsB;IACxC,WAAW,CAAe;IAC1B,YAAY,CAAS;IACrB,QAAQ,CAA4D;IACpE,QAAQ,CAAU;IAClB,WAAW,GAAG,KAAK,CAAC;IACpB,mBAAmB,GAAmB,EAAE,CAAC;IACzC,KAAK,CAAS;IACd,kBAAkB,CAAU;IAC5B,YAAY,CAAS;IACrB,YAAY,GAAG,KAAK,CAAC;IACrB,WAAW,GAAG,KAAK,CAAC;IAE5B,qBAAqB;IACb,SAAS,CAAS;IAClB,aAAa,GAAG,CAAC,CAAC;IAClB,kBAAkB,GAAG,CAAC,CAAC;IACvB,aAAa,CAAU;IAE/B,uDAAuD;IAC/C,kBAAkB,GAAmB,EAAE,CAAC;IACxC,gBAAgB,CAAU,CAAC,+BAA+B;IAElE,4BAA4B;IACpB,WAAW,CAAmB;IAEtC,4DAA4D;IACpD,UAAU,GAMb,EAAE,CAAC;IACA,eAAe,GAAG,KAAK,CAAC;IAEhC,0FAA0F;IAClF,4BAA4B,CAAmB;IAEvD,oBAAoB;IACZ,aAAa,CAAgB;IAC7B,iBAAiB,CAAS;IAC1B,iBAAiB,CAAS;IAElC,yBAAyB;IACjB,qBAAqB,CAAwB;IAC7C,4BAA4B,CAAmB;IAC/C,gBAAgB,GAAkB,EAAE,CAAC;IACrC,WAAW,GAAG,CAAC,CAAC;IAChB,UAAU,GAAG,KAAK,CAAC;IACnB,iBAAiB,GAAG,EAAE,CAAC;IAE/B,mDAAmD;IAC3C,sBAAsB,CAAiB;IACvC,sBAAsB,CAAc;IAE5C,YAAY,OAA0B;QAClC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;QACrD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QACvC,IAAI,CAAC,YAAY;YACb,OAAO,CAAC,YAAY;gBACpB;;;uDAG2C,CAAC;QAChD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAA,gBAAW,EAAC,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC;QACtC,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;QACrD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,MAAM,CAAC;QACnD,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,8BAAsB,CAAC;QAC7E,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,sBAAsB,CAAC;QAE7E,sCAAsC;QACtC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE/D,0BAA0B;QAC1B,IAAI,CAAC,WAAW,GAAG;YACf,GAAG,0BAA0B;YAC7B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,0BAA0B,CAAC,gBAAgB;SAC5F,CAAC;QAEF,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QACtC,CAAC;QAED,mDAAmD;QACnD,IAAI,CAAC,qBAAqB,GAAG;YACzB,GAAG,uCAA+B;YAClC,GAAG,OAAO,CAAC,eAAe;SAC7B,CAAC;QAEF,0CAA0C;QAC1C,IAAI,CAAC,aAAa,GAAG;YACjB,GAAG,8BAAsB;YACzB,GAAG,OAAO,CAAC,OAAO;SACrB,CAAC;IACN,CAAC;IAED;;OAEG;IACK,iBAAiB;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/D,OAAO,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;IAC3C,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,IAAY;QAC1B,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;YACnC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,2BAA2B;QACnD,CAAC;QACD,OAAO,SAAS,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;IACxE,CAAC;IAED;;OAEG;IACK,kBAAkB;QACtB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACxE,CAAC;IACL,CAAC;IAED;;OAEG;IACI,SAAS;QACZ,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC;IAED;;OAEG;IACI,YAAY,CAAC,MAAiC;QACjD,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,EAAE,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;IAEO,cAAc;QAClB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACrC,IAAI,CAAC;gBACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAE5C,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;oBACnB,8CAA8C;oBAC9C,KAAK,YAAY;wBACb,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;4BAC3D,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,8CAA8C,CAAC,CAAC;4BACrE,OAAO;wBACX,CAAC;wBACD,gEAAgE;wBAChE,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,CAAC;wBAC/C,+CAA+C;wBAC/C,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;wBACzC,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;wBAC1C,MAAM;oBAEV,iDAAiD;oBACjD,KAAK,OAAO;wBACR,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;4BACpD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,yCAAyC,CAAC,CAAC;4BAChE,OAAO;wBACX,CAAC;wBACD,gEAAgE;wBAChE,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,CAAC;wBAC/C,+CAA+C;wBAC/C,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;wBACzC,IAAI,CAAC;4BACD,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;wBAC1C,CAAC;wBAAC,OAAO,UAAU,EAAE,CAAC;4BAClB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;wBACnC,CAAC;wBACD,MAAM;oBAEV,iCAAiC;oBACjC,KAAK,aAAa;wBACd,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;wBACrC,MAAM;oBAEV,gDAAgD;oBAChD,KAAK,WAAW;wBACZ,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,MAAM,IAAI,gBAAgB,CAAC,CAAC;wBAClE,MAAM;oBAEV,6BAA6B;oBAC7B,KAAK,cAAc;wBACf,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;wBAChC,MAAM;oBAEV;wBACI,MAAM;gBACd,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC5B,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACzB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,OAAY;QAClC,8BAA8B;QAC9B,IAAI,CAAC,oBAAoB,CAAC;YACtB,IAAI,EAAE,cAAc;YACpB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC5B,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,KAAiB;QAC5C,IAAI,CAAC;YACD,iBAAiB;YACjB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;gBACrB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uCAAuC,CAAC,CAAC;gBAC9D,OAAO;YACX,CAAC;YAED,mBAAmB;YACnB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC;YACjE,IAAI,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACrC,MAAM,MAAM,GAAG,CAAC,SAAS,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACtD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAClE,IAAI,CAAC,IAAI,CACL,OAAO,EACP,IAAI,KAAK,CAAC,oBAAoB,MAAM,0BAA0B,KAAK,KAAK,CAAC,CAC5E,CAAC;gBACF,OAAO;YACX,CAAC;YAED,wBAAwB;YACxB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACnD,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,SAAS,CAAC;YAC1C,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;YAC/B,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;YAEzC,wBAAwB;YACxB,IAAI,CAAC,iBAAiB,CAAC;gBACnB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,SAAS;aACZ,CAAC,CAAC;YAEH,4BAA4B;YAC5B,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE;aACvE,CAAC,CAAC;YAEH,sCAAsC;YACtC,IAAI,CAAC,oBAAoB,CAAC;gBACtB,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACxB,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;IACL,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,OAAqB;QAC3C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEtC,wBAAwB;QACxB,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC;YACrE,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QACpC,CAAC;IACL,CAAC;IAED;;OAEG;IACI,mBAAmB,CAAC,MAA0B;QACjD,IAAI,CAAC,oBAAoB,CAAC;YACtB,IAAI,EAAE,eAAe;YACrB,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACK,mBAAmB;QACvB,2BAA2B;QAC3B,IAAI,IAAI,CAAC,4BAA4B,EAAE,CAAC;YACpC,IAAI,CAAC,4BAA4B,CAAC,KAAK,EAAE,CAAC;YAC1C,IAAI,CAAC,4BAA4B,GAAG,SAAS,CAAC;QAClD,CAAC;QACD,kCAAkC;QAClC,IAAI,IAAI,CAAC,4BAA4B,EAAE,CAAC;YACpC,IAAI,CAAC,4BAA4B,CAAC,KAAK,EAAE,CAAC;YAC1C,IAAI,CAAC,4BAA4B,GAAG,SAAS,CAAC;QAClD,CAAC;QACD,qBAAqB;QACrB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,oBAAoB;QACpB,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QAClC,0CAA0C;QAC1C,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;YACxC,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;QAC5C,CAAC;QACD,2BAA2B;QAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IACjC,CAAC;IAEM,aAAa,CAAC,KAA2B;QAC5C,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC;IAC7C,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,eAAe,CAAC,SAA8B;QACvD,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAU,EAAC;gBAC5B,KAAK,EAAE,IAAI,CAAC,kBAAkB;gBAC9B,KAAK,EAAE,SAAS;aACnB,CAAC,CAAC;YAEH,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;gBACvB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC5B,CAAC,CAAC;YAEH,2DAA2D;YAC3D,IAAI,CAAC,oBAAoB,CAAC;gBACtB,IAAI,EAAE,sBAAsB;gBAC5B,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC5B,CAAC,CAAC;YAEH,OAAO,MAAM,CAAC,IAAI,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,sBAAsB,CAC/B,IAAY,EACZ,WAAyB;QAEzB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAA,gCAAc,EAAC;YAChC,KAAK,EAAE,IAAI,CAAC,WAAW;YACvB,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,YAAY,EAAE,IAAI,CAAC,kBAAkB;YACrC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,WAAW;SACd,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;IACnC,CAAC;IAED;;OAEG;IACI,eAAe,CAAC,SAAiB,aAAa;QACjD,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzD,OAAO;QACX,CAAC;QAED,IAAI,IAAI,CAAC,4BAA4B,EAAE,CAAC;YACpC,IAAI,CAAC,4BAA4B,CAAC,KAAK,EAAE,CAAC;YAC1C,IAAI,CAAC,4BAA4B,GAAG,SAAS,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAExB,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;YACxC,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,oBAAoB,CAAC;YACtB,IAAI,EAAE,oBAAoB;YAC1B,MAAM;SACT,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACI,wBAAwB,CAAC,SAAiB,aAAa;QAC1D,IAAI,IAAI,CAAC,4BAA4B,EAAE,CAAC;YACpC,IAAI,CAAC,4BAA4B,CAAC,KAAK,EAAE,CAAC;YAC1C,IAAI,CAAC,4BAA4B,GAAG,SAAS,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,IAAY;QACjC,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,IAAI,SAAS,GAAG,IAAI,CAAC;QAErB,MAAM,kBAAkB,GAAG,kBAAkB,CAAC;QAC9C,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,KAAK,CAAC;QAEV,OAAO,CAAC,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7E,IAAI,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE,CAAC;gBAC7D,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACzB,SAAS,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC9C,CAAC;iBAAM,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,GAAG,GAAG,QAAQ,CAAC;gBAClD,SAAS,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC9C,CAAC;QACL,CAAC;QAED,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAElC,IAAI,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE,CAAC;YAC7D,MAAM,aAAa,GAAG,WAAW,CAAC;YAClC,IAAI,WAAW,CAAC;YAChB,IAAI,UAAU,GAAG,CAAC,CAAC;YAEnB,OAAO,CAAC,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC5D,IAAI,WAAW,CAAC,KAAK,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE,CAAC;oBAC/D,UAAU,GAAG,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;oBACvD,MAAM;gBACV,CAAC;YACL,CAAC;YAED,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;gBACjB,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBACtD,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAC5C,CAAC;QACL,CAAC;QAED,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACK,WAAW;QACf,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC;QAE1D,IAAI,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;YACnE,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,WAAW,CAAC;YAC7D,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YACxD,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;QACrF,CAAC;QAED,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACpB,IAAI,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;gBAC1D,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC5F,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;YAChC,CAAC,EAAE,CAAC,CAAC,CAAC;YAEN,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,OAAO,UAAU,GAAG,aAAa,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvE,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;gBACjD,IAAI,OAAO,EAAE,CAAC;oBACV,MAAM,OAAO,GACT,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC5F,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;oBAC7B,YAAY,EAAE,CAAC;gBACnB,CAAC;YACL,CAAC;YACD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACnB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;YAC9E,CAAC;QACL,CAAC;IACL,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,IAAY;QACjC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,OAAO;QAE9C,IAAI,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC9C,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QACzB,CAAC;QAED,MAAM,KAAK,GAAgB;YACvB,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE;YACtB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;SACpB,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC/B,IAAI,CAAC,sBAAsB,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBACxD,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC;YAC1C,CAAC,CAAC,CAAC;QACP,CAAC;QAED,IAAI,IAAI,CAAC,qBAAqB,CAAC,kBAAkB,EAAE,CAAC;YAChD,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC;YAElF,IAAI,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAAC,mBAAmB,EAAE,CAAC;gBAClE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACxD,CAAC;QACL,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAErE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC9B,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB,CAAC,KAAkB;QAC/C,IAAI,CAAC,IAAI,CAAC,4BAA4B,EAAE,CAAC;YACrC,IAAI,CAAC,4BAA4B,GAAG,IAAI,eAAe,EAAE,CAAC;QAC9D,CAAC;QAED,IAAI,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAC/C,KAAK,CAAC,IAAI,EACV,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAC3C,CAAC;YACF,OAAO,SAAS,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAK,KAAe,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACzC,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1B,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB;QAC5B,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC;QAE3D,IAAI,CAAC;YACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtC,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;gBAEvC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;oBACtB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBACxD,CAAC;gBAED,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC;gBAE3C,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;oBACnB,MAAM;gBACV,CAAC;gBAED,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;gBAE9B,IAAI,SAAS,EAAE,CAAC;oBACZ,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAE9D,IAAI,CAAC,oBAAoB,CAAC;wBACtB,IAAI,EAAE,aAAa;wBACnB,OAAO,EAAE,KAAK,CAAC,EAAE;wBACjB,IAAI,EAAE,WAAW;wBACjB,MAAM,EAAE,IAAI,CAAC,YAAY;wBACzB,IAAI,EAAE,KAAK,CAAC,IAAI;qBACnB,CAAC,CAAC;oBAEH,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;wBACrB,OAAO,EAAE,KAAK,CAAC,EAAE;wBACjB,IAAI,EAAE,WAAW;wBACjB,MAAM,EAAE,IAAI,CAAC,YAAY;wBACzB,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,UAAU,EAAE,SAAS;qBACxB,CAAC,CAAC;gBACP,CAAC;gBAED,IAAI,IAAI,CAAC,qBAAqB,CAAC,kBAAkB,EAAE,CAAC;oBAChD,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC;oBAClF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CACpB,IAAI,CAAC,qBAAqB,CAAC,mBAAmB,GAAG,cAAc,EAC/D,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAC/B,CAAC;oBAEF,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;wBACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;4BAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;4BACrE,IAAI,SAAS,EAAE,CAAC;gCACZ,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;4BAChE,CAAC;wBACL,CAAC;oBACL,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,4BAA4B,GAAG,SAAS,CAAC;YAE9C,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAC9B,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAC9B,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;gBACxC,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;YAC5C,CAAC;YAED,IAAI,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC;IACL,CAAC;IAED;;OAEG;IACK,6BAA6B,CAAC,SAAiB;QACnD,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAE9B,IAAI,CAAC,iBAAiB,IAAI,SAAS,CAAC;QAEpC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC7E,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;QAEnC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,oBAAoB;QACxB,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE;YAAE,OAAO;QAEhE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9C,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAChC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB,CAAC,YAA6F;QACzH,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;YAC9E,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,oBAAoB,CAAC;gBACtB,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;YACH,OAAO;QACX,CAAC;QAED,IAAI,CAAC;YACD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAE7D,IAAI,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC9C,MAAM,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC/D,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAClE,IAAI,CAAC,IAAI,CACL,OAAO,EACP,IAAI,KAAK,CAAC,0BAA0B,MAAM,0BAA0B,KAAK,KAAK,CAAC,CAClF,CAAC;gBACF,OAAO;YACX,CAAC;YAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,2BAA2B,CAAC,CAAC;gBAClD,OAAO;YACX,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBACxB,IAAI,EAAE,WAAW,CAAC,MAAM;gBACxB,MAAM,EAAE,YAAY,CAAC,MAAM;gBAC3B,SAAS,EAAE,YAAY,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS;aACtD,CAAC,CAAC;YAGH,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;YAEhE,IAAI,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC;gBACzB,MAAM,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;YACjD,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,mCAAmC,CAAC,CAAC;gBAC1D,IAAI,CAAC,oBAAoB,CAAC;oBACtB,IAAI,EAAE,qBAAqB;oBAC3B,KAAK,EAAE,6BAA6B;iBACvC,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,oBAAoB,CAAC;gBACtB,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE,yBAA0B,KAAe,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;aAC9E,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,GAAY;QAC7B,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5B,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,IAAI,CAAC;gBACD,MAAM,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC,QAAQ,IAAI,qBAAqB,CAAC;gBAC5D,IAAI,CAAC,MAAM,GAAG,IAAI,cAAS,CAAC,KAAK,CAAC,CAAC;gBACnC,IAAI,CAAC,cAAc,EAAE,CAAC;gBAEtB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;oBAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;oBACxB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBACvB,OAAO,EAAE,CAAC;gBACd,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBAChC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAClB,CAAC,CAAC,CAAC;YACP,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,MAAM,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACI,YAAY,CAAC,MAAiB;QACjC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,QAAQ,CAAC,IAAY;QAC9B,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,SAAS,CAAC,SAAiB;QACpC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,iBAAiB,CAAC;YACzB,IAAI,EAAE,OAAO;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,eAAe,CAAC,WAAgC;QACzD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAChE,MAAM,IAAI,CAAC,iBAAiB,CAAC;YACzB,IAAI,EAAE,OAAO;YACb,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,SAAS,CAClB,SAAiB,EACjB,KAAc,EACd,OAA8D;QAE9D,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,MAAM,KAAK,GAAe;YACtB,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE;YAC9B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,aAAa,EAAE,cAAc;YAC7B,gBAAgB,EAAE,IAAI,CAAC,aAAa;YACpC,KAAK,EAAE;gBACH,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,MAAM;gBACjC,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG;gBAC5B,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG;aACjC;SACJ,CAAC;QAEF,2BAA2B;QAC3B,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAEnC,IAAI,KAAK,EAAE,CAAC;YACR,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,EAAE,CAAC;IACd,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,IAAY;QACjC,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAChD,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACK,sBAAsB,CAAC,IAAY,EAAE,KAAiB;QAC1D,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YACvD,IAAI,CAAC,eAAe,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe;QACzB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,OAAO;QACX,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAE5B,IAAI,CAAC;YACD,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,EAAG,CAAC;gBACtC,IAAI,CAAC;oBACD,IAAI,MAAc,CAAC;oBACnB,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;wBAC1B,MAAM,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;oBACtE,CAAC;yBAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;wBACnB,MAAM,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACpD,CAAC;yBAAM,CAAC;wBACJ,MAAM,GAAG,EAAE,CAAC;oBAChB,CAAC;oBACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACzB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvB,CAAC;YACL,CAAC;QACL,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QACjC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,sBAAsB,CAC1B,IAAY,EACZ,SAAkB;QAElB,MAAM,OAAO,GAA6E,EAAE,CAAC;QAE7F,6CAA6C;QAC7C,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,cAAc,GAAG,oBAAoB,IAAI,CAAC,kBAAkB,CAAC,MAAM,+BAA+B,IAAI,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC;YAC3J,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,iCAAiC;QACjC,MAAM,SAAS,GAAG,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC;QACrD,IAAI,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,SAAS;aACnB,CAAC,CAAC;QACP,CAAC;QAED,iBAAiB;QACjB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAErC,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,sBAAsB,CAAC,IAAY,EAAE,KAAiB;QAChE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,4BAA4B,GAAG,IAAI,eAAe,EAAE,CAAC;QAC1D,MAAM,iBAAiB,GAAG,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC;QAEnE,IAAI,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAE1D,mCAAmC;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEpE,uDAAuD;YACvD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;gBAC1B,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,IAAI,EAAE,EAAE,CAAC;aAChE,CAAC,CAAC;YACH,IAAI,CAAC,WAAW,EAAE,CAAC;YAEnB,yCAAyC;YACzC,MAAM,MAAM,GAAG,IAAA,eAAU,EAAC;gBACtB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,YAAY;gBACzB,QAAQ,EAAE;oBACN,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,mBAAmB;oBAC7D,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,6BAA6B;iBAC3D;gBACD,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,WAAW,EAAE,iBAAiB;gBAC9B,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;oBACnB,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBAClC,CAAC;gBACD,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBACtB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;wBAC7B,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;4BACxC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;gCACrB,IAAI,EAAE,UAAU,CAAC,QAAQ;gCACzB,UAAU,EAAE,UAAU,CAAC,UAAU;gCACjC,MAAM,EAAE,UAAU,CAAC,MAAM;6BAC5B,CAAC,CAAC;wBACP,CAAC;oBACL,CAAC;gBACL,CAAC;gBACD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;oBACnB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAC9B,CAAC;aACJ,CAAC,CAAC;YAEH,OAAO,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACtD,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;YACzC,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,4BAA4B,GAAG,SAAS,CAAC;QAClD,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,IAAY;QACvC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,4BAA4B,GAAG,IAAI,eAAe,EAAE,CAAC;QAC1D,MAAM,iBAAiB,GAAG,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAAC;QAEnE,IAAI,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAE1C,0DAA0D;YAC1D,MAAM,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;YAEjD,IAAI,QAAwB,CAAC;YAE7B,IAAI,gBAAgB,EAAE,CAAC;gBACnB,2BAA2B;gBAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;gBAElD,sCAAsC;gBACtC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;oBAC1B,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,IAAI,EAAE,EAAE,CAAC;iBAChE,CAAC,CAAC;gBAEH,QAAQ,GAAG;oBACP,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBACxC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;iBAC5B,CAAC;YACN,CAAC;iBAAM,CAAC;gBACJ,oBAAoB;gBACpB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/D,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC;YACxC,CAAC;YAED,IAAI,CAAC,WAAW,EAAE,CAAC;YAEnB,MAAM,MAAM,GAAG,IAAA,eAAU,EAAC;gBACtB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,YAAY;gBACzB,QAAQ;gBACR,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,WAAW,EAAE,iBAAiB;gBAC9B,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;oBACnB,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gBAClC,CAAC;gBACD,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBACtB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;wBAC7B,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;4BACxC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;gCACrB,IAAI,EAAE,UAAU,CAAC,QAAQ;gCACzB,UAAU,EAAE,UAAU,CAAC,UAAU;gCACjC,MAAM,EAAE,UAAU,CAAC,MAAM;6BAC5B,CAAC,CAAC;wBACP,CAAC;oBACL,CAAC;gBACL,CAAC;gBACD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;oBACnB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAC9B,CAAC;aACJ,CAAC,CAAC;YAEH,OAAO,MAAM,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACtD,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;YACzC,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,4BAA4B,GAAG,SAAS,CAAC;QAClD,CAAC;IACL,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,KAAU;QAChC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,YAAY;gBACb,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBAClE,MAAM;YAEV,KAAK,iBAAiB;gBAClB,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBACvE,MAAM;YAEV,KAAK,WAAW;gBACZ,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;oBACzB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;iBACrB,CAAC,CAAC;gBACH,MAAM;YAEV,KAAK,aAAa;gBACd,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;oBAC3B,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,MAAM,EAAE,KAAK,CAAC,MAAM;iBACvB,CAAC,CAAC;gBACH,MAAM;YAEV,KAAK,kBAAkB;gBACnB,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;oBAChC,EAAE,EAAE,KAAK,CAAC,EAAE;oBACZ,QAAQ,EAAE,KAAK,CAAC,QAAQ;iBAC3B,CAAC,CAAC;gBACH,MAAM;YAEV,KAAK,kBAAkB;gBACnB,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;oBAChC,EAAE,EAAE,KAAK,CAAC,EAAE;oBACZ,KAAK,EAAE,KAAK,CAAC,KAAK;iBACrB,CAAC,CAAC;gBACH,MAAM;YAEV,KAAK,QAAQ;gBACT,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;gBACjC,MAAM;QACd,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAAC,MAAqC;QACnE,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,MAAM,YAAY,GAIb,EAAE,CAAC;QACR,MAAM,cAAc,GAIf,EAAE,CAAC;QACR,MAAM,UAAU,GAAmB,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAmB,EAAE,CAAC;QAEpC,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACzC,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;gBAChB,KAAK,OAAO;oBACR,IAAI,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;oBACpD,MAAM;gBAEV,KAAK,QAAQ;oBACT,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;oBACzD,IAAI,CAAC,oBAAoB,CAAC;wBACtB,IAAI,EAAE,eAAe;wBACrB,YAAY,EAAE,IAAI,CAAC,YAAY;wBAC/B,KAAK,EAAE,IAAI,CAAC,UAAU;qBACzB,CAAC,CAAC;oBACH,MAAM;gBAEV,KAAK,OAAO;oBACR,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;oBAC/B,IAAI,CAAC,oBAAoB,CAAC;wBACtB,IAAI,EAAE,cAAc;wBACpB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;qBAC5B,CAAC,CAAC;oBACH,MAAM;gBAEV,KAAK,OAAO;oBACR,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;oBAC5C,IAAI,CAAC,oBAAoB,CAAC;wBACtB,IAAI,EAAE,cAAc;wBACpB,MAAM,EAAE,IAAI,CAAC,MAAM;qBACtB,CAAC,CAAC;oBACH,MAAM;gBAEV,KAAK,YAAY;oBACb,IAAI,CAAC,oBAAoB,CAAC;wBACtB,IAAI,EAAE,YAAY;wBAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ;qBAC1B,CAAC,CAAC;oBACH,MAAM;gBAEV,KAAK,aAAa;oBACd,IAAI,CAAC,oBAAoB,CAAC;wBACtB,IAAI,EAAE,aAAa;wBACnB,YAAY,EAAE,IAAI,CAAC,YAAY;wBAC/B,KAAK,EAAE,IAAI,CAAC,KAAK;qBACpB,CAAC,CAAC;oBACH,MAAM;gBAEV,KAAK,YAAY;oBACb,IAAI,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC/D,MAAM;gBAEV,KAAK,YAAY;oBACb,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC;oBACtB,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC9C,IAAI,CAAC,oBAAoB,CAAC;wBACtB,IAAI,EAAE,YAAY;wBAClB,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,IAAI,EAAE,IAAI,CAAC,IAAI;qBAClB,CAAC,CAAC;oBACH,MAAM;gBAEV,KAAK,UAAU;oBACX,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC5B,IAAI,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC7D,MAAM;gBAEV,KAAK,iBAAiB;oBAClB,IAAI,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;oBACpE,MAAM;gBAEV,KAAK,iBAAiB;oBAClB,aAAa,IAAI,IAAI,CAAC,IAAI,CAAC;oBAC3B,IAAI,CAAC,oBAAoB,CAAC;wBACtB,IAAI,EAAE,iBAAiB;wBACvB,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,IAAI,EAAE,IAAI,CAAC,IAAI;qBAClB,CAAC,CAAC;oBACH,MAAM;gBAEV,KAAK,eAAe;oBAChB,IAAI,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;oBAClE,MAAM;gBAEV,KAAK,kBAAkB;oBACnB,IAAI,CAAC,oBAAoB,CAAC;wBACtB,IAAI,EAAE,kBAAkB;wBACxB,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;qBAC1B,CAAC,CAAC;oBACH,MAAM;gBAEV,KAAK,kBAAkB;oBACnB,IAAI,CAAC,oBAAoB,CAAC;wBACtB,IAAI,EAAE,kBAAkB;wBACxB,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,KAAK,EAAE,IAAI,CAAC,KAAK;qBACpB,CAAC,CAAC;oBACH,MAAM;gBAEV,KAAK,gBAAgB;oBACjB,IAAI,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;oBACnE,MAAM;gBAEV,KAAK,WAAW;oBACZ,YAAY,CAAC,IAAI,CAAC;wBACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;qBACpB,CAAC,CAAC;oBACH,IAAI,CAAC,oBAAoB,CAAC;wBACtB,IAAI,EAAE,WAAW;wBACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;qBACpB,CAAC,CAAC;oBACH,MAAM;gBAEV,KAAK,aAAa;oBACd,cAAc,CAAC,IAAI,CAAC;wBAChB,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;qBACtB,CAAC,CAAC;oBACH,IAAI,CAAC,oBAAoB,CAAC;wBACtB,IAAI,EAAE,aAAa;wBACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;qBACtB,CAAC,CAAC;oBACH,MAAM;gBAEV,KAAK,YAAY;oBACb,IAAI,CAAC,oBAAoB,CAAC;wBACtB,IAAI,EAAE,YAAY;wBAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;qBAC5B,CAAC,CAAC;oBACH,MAAM;gBAEV,KAAK,QAAQ;oBACT,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACtB,IAAI,CAAC,oBAAoB,CAAC;wBACtB,IAAI,EAAE,QAAQ;wBACd,MAAM,EAAE,IAAI;qBACf,CAAC,CAAC;oBACH,MAAM;gBAEV,KAAK,MAAM;oBACP,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACzB,IAAI,CAAC,oBAAoB,CAAC;wBACtB,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,IAAI,CAAC,IAAI;qBAClB,CAAC,CAAC;oBACH,MAAM;YACd,CAAC;QACL,CAAC;QAED,iDAAiD;QACjD,IAAI,QAAQ,EAAE,CAAC;YACX,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;QAED,yCAAyC;QACzC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE5B,yCAAyC;QACzC,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,MAAM,IAAI,CAAC,sBAAsB,CAAC;QACtC,CAAC;QAED,6BAA6B;QAC7B,IAAI,CAAC,oBAAoB,CAAC;YACtB,IAAI,EAAE,mBAAmB;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,aAAa,IAAI,SAAS;YACrC,SAAS,EAAE,YAAY;YACvB,WAAW,EAAE,cAAc;YAC3B,OAAO,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YACvD,KAAK,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;YACjD,YAAY,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC/C,UAAU,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM;gBAC1C,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,QAAQ;aAC3F,CAAC,CAAC,CAAC,SAAS;SAChB,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,OAAgC;QACzD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,OAAO;QAE9C,IAAI,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,cAAS,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;IACL,CAAC;IAED;;OAEG;IACH,cAAc;QACV,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,aAAa;QACT,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,YAAY;QACR,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;QAC9B,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,UAAU;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,OAAuB;QAC9B,IAAI,CAAC,mBAAmB,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACH,eAAe;QACX,OAAO,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,YAAY;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED;;OAEG;IACK,gBAAgB;QACpB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAEzB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,IAAI,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;YACjC,IACI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,cAAS,CAAC,IAAI;gBACzC,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,cAAS,CAAC,UAAU,EACjD,CAAC;gBACC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,sBAAsB;QAC1B,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,UAAU;QACN,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,OAAO;QACH,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;QAC9B,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAI,mBAAmB;QACnB,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,IAAI,oBAAoB;QACpB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,IAAI,gBAAgB;QAChB,OAAO,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;IACnC,CAAC;CACJ;AA1+CD,gCA0+CC"} \ No newline at end of file diff --git a/dist/VideoAgent.new.d.ts b/dist/VideoAgent.new.d.ts new file mode 100644 index 0000000..8287b32 --- /dev/null +++ b/dist/VideoAgent.new.d.ts @@ -0,0 +1,175 @@ +import { WebSocket } from "ws"; +import { EventEmitter } from "events"; +import { streamText, type LanguageModel, type Tool, type ModelMessage, type TranscriptionModel, type SpeechModel } from "ai"; +import { type StreamingSpeechConfig, type HistoryConfig } from "./types"; +/** + * Trigger reasons for frame capture + */ +type FrameTriggerReason = "scene_change" | "user_request" | "timer" | "initial"; +/** + * Video frame data structure sent to/from the client + */ +interface VideoFrame { + type: "video_frame"; + sessionId: string; + sequence: number; + timestamp: number; + triggerReason: FrameTriggerReason; + previousFrameRef?: string; + image: { + data: string; + format: string; + width: number; + height: number; + }; +} +/** + * Audio data structure + */ +interface AudioData { + type: "audio"; + sessionId: string; + data: string; + format: string; + sampleRate?: number; + duration?: number; + timestamp: number; +} +/** + * Backend configuration for video processing + */ +interface VideoAgentConfig { + /** Maximum frames to keep in context buffer for conversation history */ + maxContextFrames: number; +} +/** + * Frame context for maintaining visual conversation history + */ +interface FrameContext { + sequence: number; + timestamp: number; + triggerReason: FrameTriggerReason; + frameHash: string; + description?: string; +} +export interface VideoAgentOptions { + /** + * AI SDK Model for chat. Must be a vision-enabled model (e.g., openai('gpt-4o'), + * anthropic('claude-3.5-sonnet'), google('gemini-1.5-pro')) to process video frames. + */ + model: LanguageModel; + transcriptionModel?: TranscriptionModel; + speechModel?: SpeechModel; + instructions?: string; + stopWhen?: NonNullable[0]["stopWhen"]>; + tools?: Record; + endpoint?: string; + voice?: string; + speechInstructions?: string; + outputFormat?: string; + streamingSpeech?: Partial; + history?: Partial; + maxAudioInputSize?: number; + /** Maximum frame input size in bytes (default: 5 MB) */ + maxFrameInputSize?: number; + /** Maximum frames to keep in context buffer (default: 10) */ + maxContextFrames?: number; + /** Session ID for this video agent instance */ + sessionId?: string; +} +export declare class VideoAgent extends EventEmitter { + private model; + private instructions; + private stopWhen; + private endpoint?; + private tools; + private isDestroyed; + private _isProcessing; + private currentStreamAbortController?; + private ws; + private speech; + private conversation; + private transcription; + private inputQueue; + private sessionId; + private frameSequence; + private lastFrameTimestamp; + private lastFrameHash?; + private frameContextBuffer; + private currentFrameData?; + private videoConfig; + private maxFrameInputSize; + constructor(options: VideoAgentOptions); + registerTools(tools: Record): void; + transcribeAudio(audioData: Buffer | Uint8Array): Promise; + generateSpeechFromText(text: string, abortSignal?: AbortSignal): Promise; + interruptSpeech(reason?: string): void; + interruptCurrentResponse(reason?: string): void; + connect(url?: string): Promise; + handleSocket(socket: WebSocket): void; + sendText(text: string): Promise; + sendAudio(audioData: string): Promise; + sendAudioBuffer(audioBuffer: Buffer | Uint8Array): Promise; + /** + * Send a video frame with optional text query for vision analysis + */ + sendFrame(frameData: string, query?: string, options?: { + width?: number; + height?: number; + format?: string; + }): Promise; + /** + * Request client to capture and send a frame + */ + requestFrameCapture(reason: FrameTriggerReason): void; + getConfig(): VideoAgentConfig; + updateConfig(config: Partial): void; + startListening(): void; + stopListening(): void; + clearHistory(): void; + getHistory(): ModelMessage[]; + setHistory(history: ModelMessage[]): void; + getFrameContext(): FrameContext[]; + getSessionId(): string; + disconnect(): void; + destroy(): void; + get connected(): boolean; + get processing(): boolean; + get speaking(): boolean; + get pendingSpeechChunks(): number; + get destroyed(): boolean; + get currentFrameSequence(): number; + get hasVisualContext(): boolean; + private handleMessage; + private handleClientReady; + private handleAudioInput; + private handleVideoFrame; + private addFrameToContext; + private hashFrame; + private generateSessionId; + private enqueueTextInput; + private enqueueMultimodalInput; + /** + * Route queued items to the correct processor. + */ + private processQueueItem; + private buildMultimodalContent; + /** + * Shared streamText invocation used by both processUserInput and processMultimodalInput. + */ + private runStream; + /** + * Process text-only input (with optional visual context from latest frame). + */ + private processUserInput; + /** + * Process multimodal input (text + explicit video frame). + */ + private processMultimodalInput; + private ensureNotDestroyed; + private cleanupOnDisconnect; + private bubbleEvents; +} +export type { VideoFrame, AudioData, VideoAgentConfig, FrameContext, FrameTriggerReason, }; +export type { StreamingSpeechConfig, HistoryConfig } from "./types"; +//# sourceMappingURL=VideoAgent.new.d.ts.map \ No newline at end of file diff --git a/dist/VideoAgent.new.d.ts.map b/dist/VideoAgent.new.d.ts.map new file mode 100644 index 0000000..8e6b8b8 --- /dev/null +++ b/dist/VideoAgent.new.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"VideoAgent.new.d.ts","sourceRoot":"","sources":["../src/VideoAgent.new.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/VideoAgent.new.js b/dist/VideoAgent.new.js new file mode 100644 index 0000000..5fba234 --- /dev/null +++ b/dist/VideoAgent.new.js @@ -0,0 +1,571 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.VideoAgent = void 0; +const events_1 = require("events"); +const ai_1 = require("ai"); +const core_1 = require("./core"); +/** Default maximum frame input size (5 MB) */ +const DEFAULT_MAX_FRAME_SIZE = 5 * 1024 * 1024; +/** Default video agent config */ +const DEFAULT_VIDEO_AGENT_CONFIG = { + maxContextFrames: 10, +}; +// ── VideoAgent class ──────────────────────────────────── +class VideoAgent extends events_1.EventEmitter { + model; + instructions; + stopWhen; + endpoint; + tools = {}; + isDestroyed = false; + _isProcessing = false; + // Abort controller for the current LLM stream + currentStreamAbortController; + // ── Managers ───────────────────────────────────────── + ws; + speech; + conversation; + transcription; + inputQueue; + // ── Video-specific state ──────────────────────────── + sessionId; + frameSequence = 0; + lastFrameTimestamp = 0; + lastFrameHash; + frameContextBuffer = []; + currentFrameData; + videoConfig; + maxFrameInputSize; + constructor(options) { + super(); + this.model = options.model; + this.instructions = + options.instructions || + `You are a helpful multimodal AI assistant that can see through the user's camera and hear their voice. +When analyzing images, be concise but informative. Describe what you see when asked. +Keep responses conversational since they will be spoken aloud. +Use tools when needed to provide accurate information.`; + this.stopWhen = options.stopWhen || (0, ai_1.stepCountIs)(5); + this.endpoint = options.endpoint; + this.maxFrameInputSize = options.maxFrameInputSize ?? DEFAULT_MAX_FRAME_SIZE; + this.sessionId = options.sessionId || this.generateSessionId(); + this.videoConfig = { + ...DEFAULT_VIDEO_AGENT_CONFIG, + maxContextFrames: options.maxContextFrames ?? DEFAULT_VIDEO_AGENT_CONFIG.maxContextFrames, + }; + if (options.tools) { + this.tools = { ...options.tools }; + } + // ── Initialize managers ───────────────────────── + this.ws = new core_1.WebSocketManager(); + this.speech = new core_1.SpeechManager({ + speechModel: options.speechModel, + voice: options.voice, + speechInstructions: options.speechInstructions, + outputFormat: options.outputFormat, + streamingSpeech: options.streamingSpeech, + }); + this.conversation = new core_1.ConversationManager({ + history: options.history, + }); + this.transcription = new core_1.TranscriptionManager({ + transcriptionModel: options.transcriptionModel, + maxAudioInputSize: options.maxAudioInputSize, + }); + this.inputQueue = new core_1.InputQueue(); + // ── Wire managers to WebSocket send ───────────── + const sendMsg = (msg) => this.ws.send(msg); + this.speech.sendMessage = sendMsg; + this.transcription.sendMessage = sendMsg; + // ── Wire input queue processor ────────────────── + this.inputQueue.processor = (item) => this.processQueueItem(item); + // ── Bubble events from managers ───────────────── + this.bubbleEvents(this.ws, ["connected", "error"]); + this.bubbleEvents(this.speech, [ + "speech_start", + "speech_complete", + "speech_interrupted", + "speech_chunk_queued", + "audio_chunk", + "audio", + "error", + ]); + this.bubbleEvents(this.conversation, [ + "history_cleared", + "history_trimmed", + ]); + this.bubbleEvents(this.transcription, [ + "transcription", + "audio_received", + "error", + "warning", + ]); + // ── Handle WebSocket lifecycle ────────────────── + this.ws.on("disconnected", () => { + this.cleanupOnDisconnect(); + this.emit("disconnected"); + }); + this.ws.on("message", (message) => this.handleMessage(message)); + } + // ══════════════════════════════════════════════════════ + // Public API + // ══════════════════════════════════════════════════════ + registerTools(tools) { + this.tools = { ...this.tools, ...tools }; + } + async transcribeAudio(audioData) { + return this.transcription.transcribeAudio(audioData); + } + async generateSpeechFromText(text, abortSignal) { + return this.speech.generateSpeechFromText(text, abortSignal); + } + interruptSpeech(reason = "interrupted") { + this.speech.interruptSpeech(reason); + } + interruptCurrentResponse(reason = "interrupted") { + if (this.currentStreamAbortController) { + this.currentStreamAbortController.abort(); + this.currentStreamAbortController = undefined; + } + this.speech.interruptSpeech(reason); + } + async connect(url) { + this.ensureNotDestroyed(); + const wsUrl = url || this.endpoint || "ws://localhost:8080"; + await this.ws.connect(wsUrl); + } + handleSocket(socket) { + this.ensureNotDestroyed(); + this.ws.handleSocket(socket); + } + async sendText(text) { + this.ensureNotDestroyed(); + if (!text || !text.trim()) { + throw new Error("Text input cannot be empty"); + } + return this.enqueueTextInput(text); + } + async sendAudio(audioData) { + this.ensureNotDestroyed(); + await this.handleAudioInput(audioData); + } + async sendAudioBuffer(audioBuffer) { + this.ensureNotDestroyed(); + const base64Audio = Buffer.from(audioBuffer).toString("base64"); + await this.handleAudioInput(base64Audio); + } + /** + * Send a video frame with optional text query for vision analysis + */ + async sendFrame(frameData, query, options) { + this.ensureNotDestroyed(); + const frame = { + type: "video_frame", + sessionId: this.sessionId, + sequence: this.frameSequence++, + timestamp: Date.now(), + triggerReason: "user_request", + previousFrameRef: this.lastFrameHash, + image: { + data: frameData, + format: options?.format || "webp", + width: options?.width || 640, + height: options?.height || 480, + }, + }; + // Update local frame state + await this.handleVideoFrame(frame); + if (query) { + return this.enqueueMultimodalInput(query, frame); + } + return ""; + } + /** + * Request client to capture and send a frame + */ + requestFrameCapture(reason) { + this.ws.send({ + type: "capture_frame", + reason, + timestamp: Date.now(), + }); + this.emit("frame_requested", { reason }); + } + getConfig() { + return { ...this.videoConfig }; + } + updateConfig(config) { + this.videoConfig = { ...this.videoConfig, ...config }; + this.emit("config_changed", this.videoConfig); + } + startListening() { + this.emit("listening"); + } + stopListening() { + this.emit("stopped"); + } + clearHistory() { + this.conversation.clearHistory(); + this.frameContextBuffer = []; + } + getHistory() { + return this.conversation.getHistory(); + } + setHistory(history) { + this.conversation.setHistory(history); + } + getFrameContext() { + return [...this.frameContextBuffer]; + } + getSessionId() { + return this.sessionId; + } + disconnect() { + this.ws.disconnect(); + } + destroy() { + this.isDestroyed = true; + this.cleanupOnDisconnect(); + this.ws.disconnect(); + this.conversation.clearHistory(); + this.frameContextBuffer = []; + this.tools = {}; + this.removeAllListeners(); + } + // ── Getters ───────────────────────────────────────── + get connected() { + return this.ws.isConnected; + } + get processing() { + return this._isProcessing; + } + get speaking() { + return this.speech.isSpeaking; + } + get pendingSpeechChunks() { + return this.speech.pendingChunkCount; + } + get destroyed() { + return this.isDestroyed; + } + get currentFrameSequence() { + return this.frameSequence; + } + get hasVisualContext() { + return !!this.currentFrameData; + } + // ══════════════════════════════════════════════════════ + // Private — message handling + // ══════════════════════════════════════════════════════ + async handleMessage(message) { + try { + switch (message.type) { + case "transcript": + if (typeof message.text !== "string" || !message.text.trim()) { + this.emit("warning", "Received empty or invalid transcript message"); + return; + } + this.interruptCurrentResponse("user_speaking"); + this.requestFrameCapture("user_request"); + await this.enqueueTextInput(message.text); + break; + case "audio": + if (typeof message.data !== "string" || !message.data) { + this.emit("warning", "Received empty or invalid audio message"); + return; + } + this.interruptCurrentResponse("user_speaking"); + this.requestFrameCapture("user_request"); + try { + await this.handleAudioInput(message.data, message.format); + } + catch (audioError) { + this.emit("error", audioError); + } + break; + case "video_frame": + await this.handleVideoFrame(message); + break; + case "interrupt": + this.interruptCurrentResponse(message.reason || "client_request"); + break; + case "client_ready": + this.handleClientReady(message); + break; + } + } + catch (err) { + this.emit("error", err); + } + } + handleClientReady(message) { + this.ws.send({ + type: "session_init", + sessionId: this.sessionId, + }); + this.emit("client_ready", message.capabilities); + } + // ══════════════════════════════════════════════════════ + // Private — audio + // ══════════════════════════════════════════════════════ + async handleAudioInput(base64Audio, format) { + const text = await this.transcription.processAudioInput(base64Audio, format); + if (text) { + await this.enqueueTextInput(text); + } + } + // ══════════════════════════════════════════════════════ + // Private — video frames + // ══════════════════════════════════════════════════════ + async handleVideoFrame(frame) { + try { + if (!frame.image?.data) { + this.emit("warning", "Received empty or invalid video frame"); + return; + } + const frameSize = Buffer.from(frame.image.data, "base64").length; + if (frameSize > this.maxFrameInputSize) { + const sizeMB = (frameSize / (1024 * 1024)).toFixed(1); + const maxMB = (this.maxFrameInputSize / (1024 * 1024)).toFixed(1); + this.emit("error", new Error(`Frame too large (${sizeMB} MB). Maximum allowed: ${maxMB} MB`)); + return; + } + const frameHash = this.hashFrame(frame.image.data); + this.lastFrameTimestamp = frame.timestamp; + this.lastFrameHash = frameHash; + this.currentFrameData = frame.image.data; + this.addFrameToContext({ + sequence: frame.sequence, + timestamp: frame.timestamp, + triggerReason: frame.triggerReason, + frameHash, + }); + this.emit("frame_received", { + sequence: frame.sequence, + timestamp: frame.timestamp, + triggerReason: frame.triggerReason, + size: frameSize, + dimensions: { width: frame.image.width, height: frame.image.height }, + }); + this.ws.send({ + type: "frame_ack", + sequence: frame.sequence, + timestamp: Date.now(), + }); + } + catch (error) { + this.emit("error", error); + } + } + addFrameToContext(context) { + this.frameContextBuffer.push(context); + if (this.frameContextBuffer.length > this.videoConfig.maxContextFrames) { + this.frameContextBuffer.shift(); + } + } + hashFrame(data) { + let hash = 0; + for (let i = 0; i < data.length; i++) { + const char = data.charCodeAt(i); + hash = ((hash << 5) - hash) + char; + hash = hash & hash; + } + return `frame_${this.frameSequence}_${Math.abs(hash).toString(16)}`; + } + generateSessionId() { + const timestamp = Date.now().toString(36); + const randomPart = Math.random().toString(36).substring(2, 10); + return `vs_${timestamp}_${randomPart}`; + } + // ══════════════════════════════════════════════════════ + // Private — input queue + // ══════════════════════════════════════════════════════ + enqueueTextInput(text) { + return new Promise((resolve, reject) => { + this.inputQueue.enqueue({ text, resolve, reject }); + }); + } + enqueueMultimodalInput(text, frame) { + return new Promise((resolve, reject) => { + this.inputQueue.enqueue({ text, frame, resolve, reject }); + }); + } + /** + * Route queued items to the correct processor. + */ + async processQueueItem(item) { + if (item.frame && item.text) { + return this.processMultimodalInput(item.text, item.frame); + } + else if (item.text) { + return this.processUserInput(item.text); + } + return ""; + } + // ══════════════════════════════════════════════════════ + // Private — multimodal content building + // ══════════════════════════════════════════════════════ + buildMultimodalContent(text, frameData) { + const content = []; + if (this.frameContextBuffer.length > 0) { + const contextSummary = `[Visual context: ${this.frameContextBuffer.length} frames captured, latest at ${new Date(this.lastFrameTimestamp).toISOString()}]`; + content.push({ type: "text", text: contextSummary }); + } + const imageData = frameData || this.currentFrameData; + if (imageData) { + content.push({ type: "image", image: imageData }); + } + content.push({ type: "text", text }); + return content; + } + // ══════════════════════════════════════════════════════ + // Private — LLM processing + // ══════════════════════════════════════════════════════ + /** + * Shared streamText invocation used by both processUserInput and processMultimodalInput. + */ + async runStream(messages, abortSignal) { + const result = (0, ai_1.streamText)({ + model: this.model, + system: this.instructions, + messages, + tools: this.tools, + stopWhen: this.stopWhen, + abortSignal, + onChunk: ({ chunk }) => { + (0, core_1.handleStreamChunk)(chunk, (event, data) => this.emit(event, data)); + }, + onFinish: async (event) => { + for (const step of event.steps) { + for (const toolResult of step.toolResults) { + this.emit("tool_result", { + name: toolResult.toolName, + toolCallId: toolResult.toolCallId, + result: toolResult.output, + }); + } + } + }, + onError: ({ error }) => { + this.emit("error", error); + }, + }); + const streamResult = await (0, core_1.processFullStream)(result, { + onTextDelta: (delta) => this.speech.processTextDelta(delta), + onTextEnd: () => this.speech.flushPendingText(), + sendMessage: (msg) => this.ws.send(msg), + emitEvent: (event, data) => this.emit(event, data), + }, { + sessionId: this.sessionId, + frameContext: this.frameContextBuffer.length > 0 + ? { + frameCount: this.frameContextBuffer.length, + lastFrameSequence: this.frameContextBuffer[this.frameContextBuffer.length - 1] + ?.sequence, + } + : undefined, + }); + // Add assistant response to history + if (streamResult.fullText) { + this.conversation.addMessage({ + role: "assistant", + content: streamResult.fullText, + }); + } + // Flush remaining speech & wait for queue + this.speech.flushPendingText(); + if (this.speech.queueDonePromise) { + await this.speech.queueDonePromise; + } + return streamResult.fullText; + } + /** + * Process text-only input (with optional visual context from latest frame). + */ + async processUserInput(text) { + this._isProcessing = true; + this.currentStreamAbortController = new AbortController(); + try { + this.emit("text", { role: "user", text }); + const hasVisual = !!this.currentFrameData; + let messages; + if (hasVisual) { + const content = this.buildMultimodalContent(text); + this.conversation.addMessage({ + role: "user", + content: [{ type: "text", text: `[Visual context] ${text}` }], + }); + messages = [ + ...this.conversation.getHistoryRef().slice(0, -1), + { role: "user", content }, + ]; + } + else { + this.conversation.addMessage({ role: "user", content: text }); + messages = this.conversation.getHistoryRef(); + } + return await this.runStream(messages, this.currentStreamAbortController.signal); + } + catch (error) { + this.speech.reset(); + throw error; + } + finally { + this._isProcessing = false; + this.currentStreamAbortController = undefined; + } + } + /** + * Process multimodal input (text + explicit video frame). + */ + async processMultimodalInput(text, frame) { + this._isProcessing = true; + this.currentStreamAbortController = new AbortController(); + try { + this.emit("text", { role: "user", text, hasImage: true }); + const content = this.buildMultimodalContent(text, frame.image.data); + this.conversation.addMessage({ + role: "user", + content: [{ type: "text", text: `[Image attached] ${text}` }], + }); + const messages = [ + ...this.conversation.getHistoryRef().slice(0, -1), + { role: "user", content }, + ]; + return await this.runStream(messages, this.currentStreamAbortController.signal); + } + catch (error) { + this.speech.reset(); + throw error; + } + finally { + this._isProcessing = false; + this.currentStreamAbortController = undefined; + } + } + // ══════════════════════════════════════════════════════ + // Private — helpers + // ══════════════════════════════════════════════════════ + ensureNotDestroyed() { + if (this.isDestroyed) { + throw new Error("VideoAgent has been destroyed and cannot be used"); + } + } + cleanupOnDisconnect() { + if (this.currentStreamAbortController) { + this.currentStreamAbortController.abort(); + this.currentStreamAbortController = undefined; + } + this.speech.reset(); + this._isProcessing = false; + this.currentFrameData = undefined; + this.inputQueue.rejectAll(new Error("Connection closed")); + } + bubbleEvents(source, events) { + for (const event of events) { + source.on(event, (...args) => this.emit(event, ...args)); + } + } +} +exports.VideoAgent = VideoAgent; +//# sourceMappingURL=VideoAgent.new.js.map \ No newline at end of file diff --git a/dist/VideoAgent.new.js.map b/dist/VideoAgent.new.js.map new file mode 100644 index 0000000..b94ad4d --- /dev/null +++ b/dist/VideoAgent.new.js.map @@ -0,0 +1 @@ +{"version":3,"file":"VideoAgent.new.js","sourceRoot":"","sources":["../src/VideoAgent.new.ts"],"names":[],"mappings":";;;AACA,mCAAsC;AACtC,2BAQY;AAKZ,iCASgB;AA2DhB,8CAA8C;AAC9C,MAAM,sBAAsB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/C,iCAAiC;AACjC,MAAM,0BAA0B,GAAqB;IACjD,gBAAgB,EAAE,EAAE;CACvB,CAAC;AAoCF,2DAA2D;AAE3D,MAAa,UAAW,SAAQ,qBAAY;IAChC,KAAK,CAAgB;IACrB,YAAY,CAAS;IACrB,QAAQ,CAA4D;IACpE,QAAQ,CAAU;IAClB,KAAK,GAAyB,EAAE,CAAC;IACjC,WAAW,GAAG,KAAK,CAAC;IACpB,aAAa,GAAG,KAAK,CAAC;IAE9B,8CAA8C;IACtC,4BAA4B,CAAmB;IAEvD,wDAAwD;IAChD,EAAE,CAAmB;IACrB,MAAM,CAAgB;IACtB,YAAY,CAAsB;IAClC,aAAa,CAAuB;IACpC,UAAU,CAA6B;IAE/C,uDAAuD;IAC/C,SAAS,CAAS;IAClB,aAAa,GAAG,CAAC,CAAC;IAClB,kBAAkB,GAAG,CAAC,CAAC;IACvB,aAAa,CAAU;IACvB,kBAAkB,GAAmB,EAAE,CAAC;IACxC,gBAAgB,CAAU;IAC1B,WAAW,CAAmB;IAC9B,iBAAiB,CAAS;IAElC,YAAY,OAA0B;QAClC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,YAAY;YACb,OAAO,CAAC,YAAY;gBACpB;;;uDAG2C,CAAC;QAChD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAA,gBAAW,EAAC,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,sBAAsB,CAAC;QAC7E,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC/D,IAAI,CAAC,WAAW,GAAG;YACf,GAAG,0BAA0B;YAC7B,gBAAgB,EACZ,OAAO,CAAC,gBAAgB,IAAI,0BAA0B,CAAC,gBAAgB;SAC9E,CAAC;QACF,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;QACtC,CAAC;QAED,mDAAmD;QACnD,IAAI,CAAC,EAAE,GAAG,IAAI,uBAAgB,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,IAAI,oBAAa,CAAC;YAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;YAC9C,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,eAAe,EAAE,OAAO,CAAC,eAAe;SAC3C,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,GAAG,IAAI,0BAAmB,CAAC;YACxC,OAAO,EAAE,OAAO,CAAC,OAAO;SAC3B,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,GAAG,IAAI,2BAAoB,CAAC;YAC1C,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;YAC9C,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;SAC/C,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,GAAG,IAAI,iBAAU,EAAkB,CAAC;QAEnD,mDAAmD;QACnD,MAAM,OAAO,GAAG,CAAC,GAA4B,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC;QAClC,IAAI,CAAC,aAAa,CAAC,WAAW,GAAG,OAAO,CAAC;QAEzC,mDAAmD;QACnD,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAElE,mDAAmD;QACnD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE;YAC3B,cAAc;YACd,iBAAiB;YACjB,oBAAoB;YACpB,qBAAqB;YACrB,aAAa;YACb,OAAO;YACP,OAAO;SACV,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE;YACjC,iBAAiB;YACjB,iBAAiB;SACpB,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE;YAClC,eAAe;YACf,gBAAgB;YAChB,OAAO;YACP,SAAS;SACZ,CAAC,CAAC;QAEH,mDAAmD;QACnD,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YAC5B,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAY,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,yDAAyD;IACzD,cAAc;IACd,yDAAyD;IAElD,aAAa,CAAC,KAA2B;QAC5C,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC;IAC7C,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,SAA8B;QACvD,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;IAEM,KAAK,CAAC,sBAAsB,CAC/B,IAAY,EACZ,WAAyB;QAEzB,OAAO,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACjE,CAAC;IAEM,eAAe,CAAC,SAAiB,aAAa;QACjD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAEM,wBAAwB,CAAC,SAAiB,aAAa;QAC1D,IAAI,IAAI,CAAC,4BAA4B,EAAE,CAAC;YACpC,IAAI,CAAC,4BAA4B,CAAC,KAAK,EAAE,CAAC;YAC1C,IAAI,CAAC,4BAA4B,GAAG,SAAS,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,GAAY;QAC7B,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC,QAAQ,IAAI,qBAAqB,CAAC;QAC5D,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAEM,YAAY,CAAC,MAAiB;QACjC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,IAAY;QAC9B,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,SAAiB;QACpC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,WAAgC;QACzD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAChE,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACI,KAAK,CAAC,SAAS,CAClB,SAAiB,EACjB,KAAc,EACd,OAA8D;QAE9D,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAE1B,MAAM,KAAK,GAAe;YACtB,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE;YAC9B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,aAAa,EAAE,cAAc;YAC7B,gBAAgB,EAAE,IAAI,CAAC,aAAa;YACpC,KAAK,EAAE;gBACH,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,MAAM;gBACjC,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG;gBAC5B,MAAM,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG;aACjC;SACJ,CAAC;QAEF,2BAA2B;QAC3B,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAEnC,IAAI,KAAK,EAAE,CAAC;YACR,OAAO,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,EAAE,CAAC;IACd,CAAC;IAED;;OAEG;IACI,mBAAmB,CAAC,MAA0B;QACjD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,eAAe;YACrB,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7C,CAAC;IAEM,SAAS;QACZ,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC;IAEM,YAAY,CAAC,MAAiC;QACjD,IAAI,CAAC,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,EAAE,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;IAED,cAAc;QACV,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3B,CAAC;IAED,aAAa;QACT,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;IAED,YAAY;QACR,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;QACjC,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;IACjC,CAAC;IAED,UAAU;QACN,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;IAC1C,CAAC;IAED,UAAU,CAAC,OAAuB;QAC9B,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,eAAe;QACX,OAAO,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACxC,CAAC;IAED,YAAY;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,UAAU;QACN,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;IACzB,CAAC;IAED,OAAO;QACH,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;QACrB,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;QACjC,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED,uDAAuD;IAEvD,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC;IAC/B,CAAC;IAED,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;IAClC,CAAC;IAED,IAAI,mBAAmB;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;IACzC,CAAC;IAED,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED,IAAI,oBAAoB;QACpB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,IAAI,gBAAgB;QAChB,OAAO,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;IACnC,CAAC;IAED,yDAAyD;IACzD,8BAA8B;IAC9B,yDAAyD;IAEjD,KAAK,CAAC,aAAa,CAAC,OAAY;QACpC,IAAI,CAAC;YACD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;gBACnB,KAAK,YAAY;oBACb,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;wBAC3D,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,8CAA8C,CAAC,CAAC;wBACrE,OAAO;oBACX,CAAC;oBACD,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,CAAC;oBAC/C,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;oBACzC,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBAC1C,MAAM;gBAEV,KAAK,OAAO;oBACR,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;wBACpD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,yCAAyC,CAAC,CAAC;wBAChE,OAAO;oBACX,CAAC;oBACD,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,CAAC;oBAC/C,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;oBACzC,IAAI,CAAC;wBACD,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;oBAC9D,CAAC;oBAAC,OAAO,UAAU,EAAE,CAAC;wBAClB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;oBACnC,CAAC;oBACD,MAAM;gBAEV,KAAK,aAAa;oBACd,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;oBACrC,MAAM;gBAEV,KAAK,WAAW;oBACZ,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,MAAM,IAAI,gBAAgB,CAAC,CAAC;oBAClE,MAAM;gBAEV,KAAK,cAAc;oBACf,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;oBAChC,MAAM;YACd,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC5B,CAAC;IACL,CAAC;IAEO,iBAAiB,CAAC,OAAY;QAClC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,cAAc;YACpB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC5B,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACpD,CAAC;IAED,yDAAyD;IACzD,mBAAmB;IACnB,yDAAyD;IAEjD,KAAK,CAAC,gBAAgB,CAC1B,WAAmB,EACnB,MAAe;QAEf,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC7E,IAAI,IAAI,EAAE,CAAC;YACP,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;IACL,CAAC;IAED,yDAAyD;IACzD,0BAA0B;IAC1B,yDAAyD;IAEjD,KAAK,CAAC,gBAAgB,CAAC,KAAiB;QAC5C,IAAI,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;gBACrB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uCAAuC,CAAC,CAAC;gBAC9D,OAAO;YACX,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC;YACjE,IAAI,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACrC,MAAM,MAAM,GAAG,CAAC,SAAS,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACtD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAClE,IAAI,CAAC,IAAI,CACL,OAAO,EACP,IAAI,KAAK,CAAC,oBAAoB,MAAM,0BAA0B,KAAK,KAAK,CAAC,CAC5E,CAAC;gBACF,OAAO;YACX,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACnD,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,SAAS,CAAC;YAC1C,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;YAC/B,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;YAEzC,IAAI,CAAC,iBAAiB,CAAC;gBACnB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,SAAS;aACZ,CAAC,CAAC;YAEH,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,IAAI,EAAE,SAAS;gBACf,UAAU,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE;aACvE,CAAC,CAAC;YAEH,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACxB,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;IACL,CAAC;IAEO,iBAAiB,CAAC,OAAqB;QAC3C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC;YACrE,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QACpC,CAAC;IACL,CAAC;IAEO,SAAS,CAAC,IAAY;QAC1B,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;YACnC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,OAAO,SAAS,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;IACxE,CAAC;IAEO,iBAAiB;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/D,OAAO,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;IAC3C,CAAC;IAED,yDAAyD;IACzD,yBAAyB;IACzB,yDAAyD;IAEjD,gBAAgB,CAAC,IAAY;QACjC,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,sBAAsB,CAAC,IAAY,EAAE,KAAiB;QAC1D,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,IAAoB;QAC/C,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9D,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,EAAE,CAAC;IACd,CAAC;IAED,yDAAyD;IACzD,yCAAyC;IACzC,yDAAyD;IAEjD,sBAAsB,CAC1B,IAAY,EACZ,SAAkB;QAElB,MAAM,OAAO,GAET,EAAE,CAAC;QAEP,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,MAAM,cAAc,GAAG,oBAAoB,IAAI,CAAC,kBAAkB,CAAC,MAAM,+BAA+B,IAAI,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC;YAC3J,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,SAAS,GAAG,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC;QACrD,IAAI,SAAS,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACrC,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,yDAAyD;IACzD,4BAA4B;IAC5B,yDAAyD;IAEzD;;OAEG;IACK,KAAK,CAAC,SAAS,CACnB,QAAwB,EACxB,WAAwB;QAExB,MAAM,MAAM,GAAG,IAAA,eAAU,EAAC;YACtB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,YAAY;YACzB,QAAQ;YACR,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW;YACX,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;gBACnB,IAAA,wBAAiB,EAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;YACtE,CAAC;YACD,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBACtB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBAC7B,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;wBACxC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;4BACrB,IAAI,EAAE,UAAU,CAAC,QAAQ;4BACzB,UAAU,EAAE,UAAU,CAAC,UAAU;4BACjC,MAAM,EAAE,UAAU,CAAC,MAAM;yBAC5B,CAAC,CAAC;oBACP,CAAC;gBACL,CAAC;YACL,CAAC;YACD,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;gBACnB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC9B,CAAC;SACJ,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,MAAM,IAAA,wBAAiB,EACxC,MAAM,EACN;YACI,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC;YAC3D,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE;YAC/C,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;YACvC,SAAS,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;SACrD,EACD;YACI,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,YAAY,EACR,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC;gBAC9B,CAAC,CAAC;oBACE,UAAU,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM;oBAC1C,iBAAiB,EACb,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,CAAC;wBACvD,EAAE,QAAQ;iBACrB;gBACD,CAAC,CAAC,SAAS;SACtB,CACJ,CAAC;QAEF,oCAAoC;QACpC,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;YACxB,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;gBACzB,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,YAAY,CAAC,QAAQ;aACjC,CAAC,CAAC;QACP,CAAC;QAED,0CAA0C;QAC1C,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;QACvC,CAAC;QAED,OAAO,YAAY,CAAC,QAAQ,CAAC;IACjC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,IAAY;QACvC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,4BAA4B,GAAG,IAAI,eAAe,EAAE,CAAC;QAE1D,IAAI,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAE1C,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC;YAC1C,IAAI,QAAwB,CAAC;YAE7B,IAAI,SAAS,EAAE,CAAC;gBACZ,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;gBAClD,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;oBACzB,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,IAAI,EAAE,EAAE,CAAC;iBAChE,CAAC,CAAC;gBACH,QAAQ,GAAG;oBACP,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBACjD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;iBAC5B,CAAC;YACN,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9D,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC;YACjD,CAAC;YAED,OAAO,MAAM,IAAI,CAAC,SAAS,CACvB,QAAQ,EACR,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAC3C,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpB,MAAM,KAAK,CAAC;QAChB,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,4BAA4B,GAAG,SAAS,CAAC;QAClD,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,sBAAsB,CAChC,IAAY,EACZ,KAAiB;QAEjB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,4BAA4B,GAAG,IAAI,eAAe,EAAE,CAAC;QAE1D,IAAI,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAE1D,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEpE,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;gBACzB,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,IAAI,EAAE,EAAE,CAAC;aAChE,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAmB;gBAC7B,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACjD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;aAC5B,CAAC;YAEF,OAAO,MAAM,IAAI,CAAC,SAAS,CACvB,QAAQ,EACR,IAAI,CAAC,4BAA4B,CAAC,MAAM,CAC3C,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpB,MAAM,KAAK,CAAC;QAChB,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,4BAA4B,GAAG,SAAS,CAAC;QAClD,CAAC;IACL,CAAC;IAED,yDAAyD;IACzD,qBAAqB;IACrB,yDAAyD;IAEjD,kBAAkB;QACtB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACxE,CAAC;IACL,CAAC;IAEO,mBAAmB;QACvB,IAAI,IAAI,CAAC,4BAA4B,EAAE,CAAC;YACpC,IAAI,CAAC,4BAA4B,CAAC,KAAK,EAAE,CAAC;YAC1C,IAAI,CAAC,4BAA4B,GAAG,SAAS,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QAClC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC9D,CAAC;IAEO,YAAY,CAAC,MAAoB,EAAE,MAAgB;QACvD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACzB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QACpE,CAAC;IACL,CAAC;CACJ;AAtqBD,gCAsqBC"} \ No newline at end of file diff --git a/dist/VoiceAgent.d.ts b/dist/VoiceAgent.d.ts index b7ac216..ef1678f 100644 --- a/dist/VoiceAgent.d.ts +++ b/dist/VoiceAgent.d.ts @@ -20,6 +20,25 @@ export interface VoiceAgentOptions { /** Maximum audio input size in bytes (default: 10 MB) */ maxAudioInputSize?: number; } +/** + * A single-session voice agent that manages one WebSocket connection at a time. + * + * **Important:** Each `VoiceAgent` instance holds its own conversation history, + * input queue, speech state, and WebSocket. It is designed for **one user per + * instance**. To support multiple concurrent users, create a separate + * `VoiceAgent` for each connection: + * + * ```ts + * wss.on("connection", (socket) => { + * const agent = new VoiceAgent({ model, ... }); + * agent.handleSocket(socket); + * agent.on("disconnected", () => agent.destroy()); + * }); + * ``` + * + * Sharing a single instance across multiple users will cause conversation + * history cross-contamination, interleaved audio, and unpredictable behavior. + */ export declare class VoiceAgent extends EventEmitter { private socket?; private tools; @@ -120,6 +139,10 @@ export declare class VoiceAgent extends EventEmitter { * Attach an existing WebSocket (server-side usage). * Use this when a WS server accepts a connection and you want the * agent to handle messages on that socket. + * + * **Note:** Calling this while a socket is already attached will cleanly + * tear down the previous connection first. Each `VoiceAgent` instance + * supports only one socket at a time — create a new agent per user. */ handleSocket(socket: WebSocket): void; /** diff --git a/dist/VoiceAgent.d.ts.map b/dist/VoiceAgent.d.ts.map index b558a9b..eef9944 100644 --- a/dist/VoiceAgent.d.ts.map +++ b/dist/VoiceAgent.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"VoiceAgent.d.ts","sourceRoot":"","sources":["../src/VoiceAgent.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"VoiceAgent.d.ts","sourceRoot":"","sources":["../src/VoiceAgent.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/VoiceAgent.js b/dist/VoiceAgent.js index 8bf06b3..a9e6566 100644 --- a/dist/VoiceAgent.js +++ b/dist/VoiceAgent.js @@ -5,6 +5,25 @@ const ws_1 = require("ws"); const events_1 = require("events"); const ai_1 = require("ai"); const types_1 = require("./types"); +/** + * A single-session voice agent that manages one WebSocket connection at a time. + * + * **Important:** Each `VoiceAgent` instance holds its own conversation history, + * input queue, speech state, and WebSocket. It is designed for **one user per + * instance**. To support multiple concurrent users, create a separate + * `VoiceAgent` for each connection: + * + * ```ts + * wss.on("connection", (socket) => { + * const agent = new VoiceAgent({ model, ... }); + * agent.handleSocket(socket); + * agent.on("disconnected", () => agent.destroy()); + * }); + * ``` + * + * Sharing a single instance across multiple users will cause conversation + * history cross-contamination, interleaved audio, and unpredictable behavior. + */ class VoiceAgent extends events_1.EventEmitter { socket; tools = {}; @@ -50,7 +69,7 @@ class VoiceAgent extends events_1.EventEmitter { this.endpoint = options.endpoint; this.voice = options.voice || "alloy"; this.speechInstructions = options.speechInstructions; - this.outputFormat = options.outputFormat || "mp3"; + this.outputFormat = options.outputFormat || "opus"; this.maxAudioInputSize = options.maxAudioInputSize ?? types_1.DEFAULT_MAX_AUDIO_SIZE; if (options.tools) { this.tools = { ...options.tools }; @@ -576,6 +595,10 @@ class VoiceAgent extends events_1.EventEmitter { * Attach an existing WebSocket (server-side usage). * Use this when a WS server accepts a connection and you want the * agent to handle messages on that socket. + * + * **Note:** Calling this while a socket is already attached will cleanly + * tear down the previous connection first. Each `VoiceAgent` instance + * supports only one socket at a time — create a new agent per user. */ handleSocket(socket) { this.ensureNotDestroyed(); diff --git a/dist/VoiceAgent.js.map b/dist/VoiceAgent.js.map index 50a5ae2..9640f63 100644 --- a/dist/VoiceAgent.js.map +++ b/dist/VoiceAgent.js.map @@ -1 +1 @@ -{"version":3,"file":"VoiceAgent.js","sourceRoot":"","sources":["../src/VoiceAgent.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"VoiceAgent.js","sourceRoot":"","sources":["../src/VoiceAgent.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/VoiceAgent.new.d.ts b/dist/VoiceAgent.new.d.ts new file mode 100644 index 0000000..7786ae6 --- /dev/null +++ b/dist/VoiceAgent.new.d.ts @@ -0,0 +1,137 @@ +import { WebSocket } from "ws"; +import { EventEmitter } from "events"; +import { streamText, type LanguageModel, type Tool, type ModelMessage, type TranscriptionModel, type SpeechModel } from "ai"; +import { type StreamingSpeechConfig, type HistoryConfig } from "./types"; +export interface VoiceAgentOptions { + model: LanguageModel; + transcriptionModel?: TranscriptionModel; + speechModel?: SpeechModel; + instructions?: string; + stopWhen?: NonNullable[0]["stopWhen"]>; + tools?: Record; + endpoint?: string; + voice?: string; + speechInstructions?: string; + outputFormat?: string; + /** Configuration for streaming speech generation */ + streamingSpeech?: Partial; + /** Configuration for conversation history memory limits */ + history?: Partial; + /** Maximum audio input size in bytes (default: 10 MB) */ + maxAudioInputSize?: number; +} +/** + * A single-session voice agent that manages one WebSocket connection at a time. + * + * **Important:** Each `VoiceAgent` instance holds its own conversation history, + * input queue, speech state, and WebSocket. It is designed for **one user per + * instance**. To support multiple concurrent users, create a separate + * `VoiceAgent` for each connection: + * + * ```ts + * wss.on("connection", (socket) => { + * const agent = new VoiceAgent({ model, ... }); + * agent.handleSocket(socket); + * agent.on("disconnected", () => agent.destroy()); + * }); + * ``` + * + * Sharing a single instance across multiple users will cause conversation + * history cross-contamination, interleaved audio, and unpredictable behavior. + */ +export declare class VoiceAgent extends EventEmitter { + private model; + private instructions; + private stopWhen; + private endpoint?; + private tools; + private isDestroyed; + private _isProcessing; + private currentStreamAbortController?; + private ws; + private speech; + private conversation; + private transcription; + private inputQueue; + constructor(options: VoiceAgentOptions); + registerTools(tools: Record): void; + /** + * Transcribe audio data to text using the configured transcription model. + */ + transcribeAudio(audioData: Buffer | Uint8Array): Promise; + /** + * Generate speech from text using the configured speech model. + */ + generateSpeechFromText(text: string, abortSignal?: AbortSignal): Promise; + /** + * Interrupt ongoing speech generation and playback (barge-in support). + */ + interruptSpeech(reason?: string): void; + /** + * Interrupt both the current LLM stream and ongoing speech. + */ + interruptCurrentResponse(reason?: string): void; + /** + * Connect to a WebSocket server by URL. + */ + connect(url?: string): Promise; + /** + * Attach an existing WebSocket (server-side usage). + */ + handleSocket(socket: WebSocket): void; + /** + * Send text input for processing (bypasses transcription). + */ + sendText(text: string): Promise; + /** + * Send base64 audio data to be transcribed and processed. + */ + sendAudio(audioData: string): Promise; + /** + * Send raw audio buffer to be transcribed and processed. + */ + sendAudioBuffer(audioBuffer: Buffer | Uint8Array): Promise; + /** + * Generate speech for full text at once (non-streaming fallback). + */ + generateAndSendSpeechFull(text: string): Promise; + /** Start listening for voice input */ + startListening(): void; + /** Stop listening for voice input */ + stopListening(): void; + /** Clear conversation history */ + clearHistory(): void; + /** Get current conversation history */ + getHistory(): ModelMessage[]; + /** Set conversation history (useful for restoring sessions) */ + setHistory(history: ModelMessage[]): void; + /** Disconnect from WebSocket and stop all in-flight work */ + disconnect(): void; + /** + * Permanently destroy the agent, releasing all resources. + */ + destroy(): void; + get connected(): boolean; + get processing(): boolean; + get speaking(): boolean; + get pendingSpeechChunks(): number; + get destroyed(): boolean; + private handleMessage; + private handleAudioInput; + private enqueueInput; + /** + * Process user input with streaming text generation. + * Called serially by the input queue. + */ + private processUserInput; + private ensureNotDestroyed; + /** + * Clean up all in-flight state when the connection drops. + */ + private cleanupOnDisconnect; + /** + * Forward select events from a child emitter to this agent. + */ + private bubbleEvents; +} +//# sourceMappingURL=VoiceAgent.new.d.ts.map \ No newline at end of file diff --git a/dist/VoiceAgent.new.d.ts.map b/dist/VoiceAgent.new.d.ts.map new file mode 100644 index 0000000..0c98d1f --- /dev/null +++ b/dist/VoiceAgent.new.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"VoiceAgent.new.d.ts","sourceRoot":"","sources":["../src/VoiceAgent.new.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EACL,UAAU,EACV,KAAK,aAAa,EAElB,KAAK,IAAI,EACT,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,WAAW,EACjB,MAAM,IAAI,CAAC;AACZ,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EACnB,MAAM,SAAS,CAAC;AAYjB,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,aAAa,CAAC;IACrB,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,WAAW,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,eAAe,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACjD,2DAA2D;IAC3D,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACjC,yDAAyD;IACzD,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAOD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAA4D;IAC5E,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAS;IAG9B,OAAO,CAAC,4BAA4B,CAAC,CAAkB;IAGvD,OAAO,CAAC,EAAE,CAAmB;IAC7B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,UAAU,CAA6B;gBAEnC,OAAO,EAAE,iBAAiB;IAyE/B,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;IAIhD;;OAEG;IACU,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAI7E;;OAEG;IACU,sBAAsB,CACjC,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,UAAU,CAAC;IAItB;;OAEG;IACI,eAAe,CAAC,MAAM,GAAE,MAAsB,GAAG,IAAI;IAI5D;;OAEG;IACI,wBAAwB,CAAC,MAAM,GAAE,MAAsB,GAAG,IAAI;IAQrE;;OAEG;IACU,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjD;;OAEG;IACI,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAK5C;;OAEG;IACU,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQpD;;OAEG;IACU,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxD;;OAEG;IACU,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7E;;OAEG;IACU,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInE,sCAAsC;IACtC,cAAc;IAKd,qCAAqC;IACrC,aAAa;IAKb,iCAAiC;IACjC,YAAY;IAIZ,uCAAuC;IACvC,UAAU,IAAI,YAAY,EAAE;IAI5B,+DAA+D;IAC/D,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE;IAIlC,4DAA4D;IAC5D,UAAU;IAIV;;OAEG;IACH,OAAO;IAWP,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;YAIa,aAAa;YAoCb,gBAAgB;IAe9B,OAAO,CAAC,YAAY;IAQpB;;;OAGG;YACW,gBAAgB;IAyE9B,OAAO,CAAC,kBAAkB;IAM1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAU3B;;OAEG;IACH,OAAO,CAAC,YAAY;CAKrB"} \ No newline at end of file diff --git a/dist/VoiceAgent.new.js b/dist/VoiceAgent.new.js new file mode 100644 index 0000000..a43f8fc --- /dev/null +++ b/dist/VoiceAgent.new.js @@ -0,0 +1,379 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.VoiceAgent = void 0; +const events_1 = require("events"); +const ai_1 = require("ai"); +const core_1 = require("./core"); +/** + * A single-session voice agent that manages one WebSocket connection at a time. + * + * **Important:** Each `VoiceAgent` instance holds its own conversation history, + * input queue, speech state, and WebSocket. It is designed for **one user per + * instance**. To support multiple concurrent users, create a separate + * `VoiceAgent` for each connection: + * + * ```ts + * wss.on("connection", (socket) => { + * const agent = new VoiceAgent({ model, ... }); + * agent.handleSocket(socket); + * agent.on("disconnected", () => agent.destroy()); + * }); + * ``` + * + * Sharing a single instance across multiple users will cause conversation + * history cross-contamination, interleaved audio, and unpredictable behavior. + */ +class VoiceAgent extends events_1.EventEmitter { + model; + instructions; + stopWhen; + endpoint; + tools = {}; + isDestroyed = false; + _isProcessing = false; + // Abort controller for the current LLM stream + currentStreamAbortController; + // ── Managers ────────────────────────────────────────── + ws; + speech; + conversation; + transcription; + inputQueue; + constructor(options) { + super(); + this.model = options.model; + this.instructions = + options.instructions || "You are a helpful voice assistant."; + this.stopWhen = options.stopWhen || (0, ai_1.stepCountIs)(5); + this.endpoint = options.endpoint; + if (options.tools) { + this.tools = { ...options.tools }; + } + // ── Initialize managers ────────────────────────────── + this.ws = new core_1.WebSocketManager(); + this.speech = new core_1.SpeechManager({ + speechModel: options.speechModel, + voice: options.voice, + speechInstructions: options.speechInstructions, + outputFormat: options.outputFormat, + streamingSpeech: options.streamingSpeech, + }); + this.conversation = new core_1.ConversationManager({ + history: options.history, + }); + this.transcription = new core_1.TranscriptionManager({ + transcriptionModel: options.transcriptionModel, + maxAudioInputSize: options.maxAudioInputSize, + }); + this.inputQueue = new core_1.InputQueue(); + // ── Wire managers to the WebSocket send function ───── + const sendMsg = (msg) => this.ws.send(msg); + this.speech.sendMessage = sendMsg; + this.transcription.sendMessage = sendMsg; + // ── Wire the input queue processor ─────────────────── + this.inputQueue.processor = (item) => this.processUserInput(item.text); + // ── Bubble events from managers ────────────────────── + this.bubbleEvents(this.ws, [ + "connected", + "error", + ]); + this.bubbleEvents(this.speech, [ + "speech_start", + "speech_complete", + "speech_interrupted", + "speech_chunk_queued", + "audio_chunk", + "audio", + "error", + ]); + this.bubbleEvents(this.conversation, [ + "history_cleared", + "history_trimmed", + ]); + this.bubbleEvents(this.transcription, [ + "transcription", + "audio_received", + "error", + "warning", + ]); + // ── Handle WebSocket lifecycle events ──────────────── + this.ws.on("disconnected", () => { + this.cleanupOnDisconnect(); + this.emit("disconnected"); + }); + this.ws.on("message", (message) => this.handleMessage(message)); + } + // ── Public API ──────────────────────────────────────── + registerTools(tools) { + this.tools = { ...this.tools, ...tools }; + } + /** + * Transcribe audio data to text using the configured transcription model. + */ + async transcribeAudio(audioData) { + return this.transcription.transcribeAudio(audioData); + } + /** + * Generate speech from text using the configured speech model. + */ + async generateSpeechFromText(text, abortSignal) { + return this.speech.generateSpeechFromText(text, abortSignal); + } + /** + * Interrupt ongoing speech generation and playback (barge-in support). + */ + interruptSpeech(reason = "interrupted") { + this.speech.interruptSpeech(reason); + } + /** + * Interrupt both the current LLM stream and ongoing speech. + */ + interruptCurrentResponse(reason = "interrupted") { + if (this.currentStreamAbortController) { + this.currentStreamAbortController.abort(); + this.currentStreamAbortController = undefined; + } + this.speech.interruptSpeech(reason); + } + /** + * Connect to a WebSocket server by URL. + */ + async connect(url) { + this.ensureNotDestroyed(); + const wsUrl = url || this.endpoint || "ws://localhost:8080"; + await this.ws.connect(wsUrl); + } + /** + * Attach an existing WebSocket (server-side usage). + */ + handleSocket(socket) { + this.ensureNotDestroyed(); + this.ws.handleSocket(socket); + } + /** + * Send text input for processing (bypasses transcription). + */ + async sendText(text) { + this.ensureNotDestroyed(); + if (!text || !text.trim()) { + throw new Error("Text input cannot be empty"); + } + return this.enqueueInput(text); + } + /** + * Send base64 audio data to be transcribed and processed. + */ + async sendAudio(audioData) { + this.ensureNotDestroyed(); + await this.handleAudioInput(audioData); + } + /** + * Send raw audio buffer to be transcribed and processed. + */ + async sendAudioBuffer(audioBuffer) { + this.ensureNotDestroyed(); + const base64Audio = Buffer.from(audioBuffer).toString("base64"); + await this.handleAudioInput(base64Audio); + } + /** + * Generate speech for full text at once (non-streaming fallback). + */ + async generateAndSendSpeechFull(text) { + return this.speech.generateAndSendSpeechFull(text); + } + /** Start listening for voice input */ + startListening() { + console.log("Starting voice agent..."); + this.emit("listening"); + } + /** Stop listening for voice input */ + stopListening() { + console.log("Stopping voice agent..."); + this.emit("stopped"); + } + /** Clear conversation history */ + clearHistory() { + this.conversation.clearHistory(); + } + /** Get current conversation history */ + getHistory() { + return this.conversation.getHistory(); + } + /** Set conversation history (useful for restoring sessions) */ + setHistory(history) { + this.conversation.setHistory(history); + } + /** Disconnect from WebSocket and stop all in-flight work */ + disconnect() { + this.ws.disconnect(); + } + /** + * Permanently destroy the agent, releasing all resources. + */ + destroy() { + this.isDestroyed = true; + this.cleanupOnDisconnect(); + this.ws.disconnect(); + this.conversation.clearHistory(); + this.tools = {}; + this.removeAllListeners(); + } + // ── Getters ─────────────────────────────────────────── + get connected() { + return this.ws.isConnected; + } + get processing() { + return this._isProcessing; + } + get speaking() { + return this.speech.isSpeaking; + } + get pendingSpeechChunks() { + return this.speech.pendingChunkCount; + } + get destroyed() { + return this.isDestroyed; + } + // ── Private: message handling ───────────────────────── + async handleMessage(message) { + try { + console.log(`Received WebSocket message of type: ${message.type}`); + if (message.type === "transcript") { + if (typeof message.text !== "string" || !message.text.trim()) { + this.emit("warning", "Received empty or invalid transcript message"); + return; + } + this.interruptCurrentResponse("user_speaking"); + console.log(`Processing transcript: "${message.text}"`); + await this.enqueueInput(message.text); + } + else if (message.type === "audio") { + if (typeof message.data !== "string" || !message.data) { + this.emit("warning", "Received empty or invalid audio message"); + return; + } + this.interruptCurrentResponse("user_speaking"); + console.log(`Received audio data (${message.data.length / 1000}KB) for processing, format: ${message.format || "unknown"}`); + await this.handleAudioInput(message.data, message.format); + } + else if (message.type === "interrupt") { + console.log(`Received interrupt request: ${message.reason || "client_request"}`); + this.interruptCurrentResponse(message.reason || "client_request"); + } + } + catch (err) { + console.error("Failed to process message:", err); + this.emit("error", err); + } + } + // ── Private: audio ──────────────────────────────────── + async handleAudioInput(base64Audio, format) { + const text = await this.transcription.processAudioInput(base64Audio, format); + if (text) { + await this.enqueueInput(text); + } + } + // ── Private: input queue ────────────────────────────── + enqueueInput(text) { + return new Promise((resolve, reject) => { + this.inputQueue.enqueue({ text, resolve, reject }); + }); + } + // ── Private: LLM processing ─────────────────────────── + /** + * Process user input with streaming text generation. + * Called serially by the input queue. + */ + async processUserInput(text) { + this._isProcessing = true; + this.currentStreamAbortController = new AbortController(); + const streamAbortSignal = this.currentStreamAbortController.signal; + try { + this.emit("text", { role: "user", text }); + this.conversation.addMessage({ role: "user", content: text }); + const result = (0, ai_1.streamText)({ + model: this.model, + system: this.instructions, + messages: this.conversation.getHistoryRef(), + tools: this.tools, + stopWhen: this.stopWhen, + abortSignal: streamAbortSignal, + onChunk: ({ chunk }) => { + (0, core_1.handleStreamChunk)(chunk, (event, data) => this.emit(event, data)); + }, + onFinish: async (event) => { + for (const step of event.steps) { + for (const toolResult of step.toolResults) { + this.emit("tool_result", { + name: toolResult.toolName, + toolCallId: toolResult.toolCallId, + result: toolResult.output, + }); + } + } + }, + onError: ({ error }) => { + console.error("Stream error:", error); + this.emit("error", error); + }, + }); + const streamResult = await (0, core_1.processFullStream)(result, { + onTextDelta: (delta) => this.speech.processTextDelta(delta), + onTextEnd: () => this.speech.flushPendingText(), + sendMessage: (msg) => this.ws.send(msg), + emitEvent: (event, data) => this.emit(event, data), + }); + // Add assistant response to history + if (streamResult.fullText) { + this.conversation.addMessage({ + role: "assistant", + content: streamResult.fullText, + }); + } + // Flush any remaining speech + this.speech.flushPendingText(); + // Wait for all speech chunks to complete + if (this.speech.queueDonePromise) { + await this.speech.queueDonePromise; + } + return streamResult.fullText; + } + catch (error) { + // Clean up speech state on error + this.speech.reset(); + throw error; + } + finally { + this._isProcessing = false; + this.currentStreamAbortController = undefined; + } + } + // ── Private: helpers ────────────────────────────────── + ensureNotDestroyed() { + if (this.isDestroyed) { + throw new Error("VoiceAgent has been destroyed and cannot be used"); + } + } + /** + * Clean up all in-flight state when the connection drops. + */ + cleanupOnDisconnect() { + if (this.currentStreamAbortController) { + this.currentStreamAbortController.abort(); + this.currentStreamAbortController = undefined; + } + this.speech.reset(); + this._isProcessing = false; + this.inputQueue.rejectAll(new Error("Connection closed")); + } + /** + * Forward select events from a child emitter to this agent. + */ + bubbleEvents(source, events) { + for (const event of events) { + source.on(event, (...args) => this.emit(event, ...args)); + } + } +} +exports.VoiceAgent = VoiceAgent; +//# sourceMappingURL=VoiceAgent.new.js.map \ No newline at end of file diff --git a/dist/VoiceAgent.new.js.map b/dist/VoiceAgent.new.js.map new file mode 100644 index 0000000..99d711c --- /dev/null +++ b/dist/VoiceAgent.new.js.map @@ -0,0 +1 @@ +{"version":3,"file":"VoiceAgent.new.js","sourceRoot":"","sources":["../src/VoiceAgent.new.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/core/ConversationManager.d.ts b/dist/core/ConversationManager.d.ts new file mode 100644 index 0000000..c3c1216 --- /dev/null +++ b/dist/core/ConversationManager.d.ts @@ -0,0 +1,46 @@ +import { EventEmitter } from "events"; +import { type ModelMessage } from "ai"; +import { type HistoryConfig } from "../types"; +export interface ConversationManagerOptions { + history?: Partial; +} +/** + * Manages conversation history (ModelMessage[]) with configurable + * limits on message count and total character size. + */ +export declare class ConversationManager extends EventEmitter { + private conversationHistory; + private historyConfig; + constructor(options?: ConversationManagerOptions); + /** + * Add a message to history and trim if needed. + */ + addMessage(message: ModelMessage): void; + /** + * Get a copy of the current history. + */ + getHistory(): ModelMessage[]; + /** + * Get a direct reference to the history array. + * Use with caution — prefer getHistory() for safety. + */ + getHistoryRef(): ModelMessage[]; + /** + * Replace the entire conversation history. + */ + setHistory(history: ModelMessage[]): void; + /** + * Clear all conversation history. + */ + clearHistory(): void; + /** + * Get the number of messages in history. + */ + get length(): number; + /** + * Trim conversation history to stay within configured limits. + * Removes oldest messages (always in pairs to preserve user/assistant turns). + */ + private trimHistory; +} +//# sourceMappingURL=ConversationManager.d.ts.map \ No newline at end of file diff --git a/dist/core/ConversationManager.d.ts.map b/dist/core/ConversationManager.d.ts.map new file mode 100644 index 0000000..95deab8 --- /dev/null +++ b/dist/core/ConversationManager.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ConversationManager.d.ts","sourceRoot":"","sources":["../../src/core/ConversationManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,IAAI,CAAC;AACvC,OAAO,EAAE,KAAK,aAAa,EAA0B,MAAM,UAAU,CAAC;AAEtE,MAAM,WAAW,0BAA0B;IACzC,OAAO,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;CAClC;AAED;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,aAAa,CAAgB;gBAEzB,OAAO,GAAE,0BAA+B;IAQpD;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAKvC;;OAEG;IACH,UAAU,IAAI,YAAY,EAAE;IAI5B;;;OAGG;IACH,aAAa,IAAI,YAAY,EAAE;IAI/B;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI;IAIzC;;OAEG;IACH,YAAY,IAAI,IAAI;IAKpB;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;;OAGG;IACH,OAAO,CAAC,WAAW;CAgDpB"} \ No newline at end of file diff --git a/dist/core/ConversationManager.js b/dist/core/ConversationManager.js new file mode 100644 index 0000000..1d17a6d --- /dev/null +++ b/dist/core/ConversationManager.js @@ -0,0 +1,106 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ConversationManager = void 0; +const events_1 = require("events"); +const types_1 = require("../types"); +/** + * Manages conversation history (ModelMessage[]) with configurable + * limits on message count and total character size. + */ +class ConversationManager extends events_1.EventEmitter { + conversationHistory = []; + historyConfig; + constructor(options = {}) { + super(); + this.historyConfig = { + ...types_1.DEFAULT_HISTORY_CONFIG, + ...options.history, + }; + } + /** + * Add a message to history and trim if needed. + */ + addMessage(message) { + this.conversationHistory.push(message); + this.trimHistory(); + } + /** + * Get a copy of the current history. + */ + getHistory() { + return [...this.conversationHistory]; + } + /** + * Get a direct reference to the history array. + * Use with caution — prefer getHistory() for safety. + */ + getHistoryRef() { + return this.conversationHistory; + } + /** + * Replace the entire conversation history. + */ + setHistory(history) { + this.conversationHistory = [...history]; + } + /** + * Clear all conversation history. + */ + clearHistory() { + this.conversationHistory = []; + this.emit("history_cleared"); + } + /** + * Get the number of messages in history. + */ + get length() { + return this.conversationHistory.length; + } + /** + * Trim conversation history to stay within configured limits. + * Removes oldest messages (always in pairs to preserve user/assistant turns). + */ + trimHistory() { + const { maxMessages, maxTotalChars } = this.historyConfig; + // Trim by message count + if (maxMessages > 0 && this.conversationHistory.length > maxMessages) { + const excess = this.conversationHistory.length - maxMessages; + // Round up to even number to preserve turn pairs + const toRemove = excess % 2 === 0 ? excess : excess + 1; + this.conversationHistory.splice(0, toRemove); + this.emit("history_trimmed", { + removedCount: toRemove, + reason: "max_messages", + }); + } + // Trim by total character count + if (maxTotalChars > 0) { + let totalChars = this.conversationHistory.reduce((sum, msg) => { + const content = typeof msg.content === "string" + ? msg.content + : JSON.stringify(msg.content); + return sum + content.length; + }, 0); + let removedCount = 0; + while (totalChars > maxTotalChars && + this.conversationHistory.length > 2) { + const removed = this.conversationHistory.shift(); + if (removed) { + const content = typeof removed.content === "string" + ? removed.content + : JSON.stringify(removed.content); + totalChars -= content.length; + removedCount++; + } + } + if (removedCount > 0) { + this.emit("history_trimmed", { + removedCount, + reason: "max_total_chars", + }); + } + } + } +} +exports.ConversationManager = ConversationManager; +//# sourceMappingURL=ConversationManager.js.map \ No newline at end of file diff --git a/dist/core/ConversationManager.js.map b/dist/core/ConversationManager.js.map new file mode 100644 index 0000000..9e2f8d3 --- /dev/null +++ b/dist/core/ConversationManager.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ConversationManager.js","sourceRoot":"","sources":["../../src/core/ConversationManager.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/core/InputQueue.d.ts b/dist/core/InputQueue.d.ts new file mode 100644 index 0000000..0a1620a --- /dev/null +++ b/dist/core/InputQueue.d.ts @@ -0,0 +1,33 @@ +/** + * A generic serial input queue that ensures only one processor runs at a time. + * + * @template T The shape of each queued item (must include resolve/reject) + */ +export interface QueueItem { + resolve: (v: T) => void; + reject: (e: unknown) => void; +} +export declare class InputQueue> { + private queue; + private processing; + /** Callback invoked for each item — must return a resolved value */ + processor: (item: T) => Promise; + /** + * Enqueue an item for serial processing. + */ + enqueue(item: T): void; + /** + * Reject all pending items (used on disconnect/destroy). + */ + rejectAll(reason: Error): void; + /** + * Number of items waiting in the queue. + */ + get length(): number; + /** + * Whether the queue is currently processing an item. + */ + get isProcessing(): boolean; + private drain; +} +//# sourceMappingURL=InputQueue.d.ts.map \ No newline at end of file diff --git a/dist/core/InputQueue.d.ts.map b/dist/core/InputQueue.d.ts.map new file mode 100644 index 0000000..e797083 --- /dev/null +++ b/dist/core/InputQueue.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"InputQueue.d.ts","sourceRoot":"","sources":["../../src/core/InputQueue.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,MAAM;IACnC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,CAAC;IACxB,MAAM,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CAC9B;AAED,qBAAa,UAAU,CAAC,CAAC,SAAS,SAAS,CAAC,GAAG,CAAC;IAC9C,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,UAAU,CAAS;IAE3B,oEAAoE;IAC7D,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAkB;IAE7D;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAKtB;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI;IAQ9B;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;OAEG;IACH,IAAI,YAAY,IAAI,OAAO,CAE1B;YAIa,KAAK;CAkBpB"} \ No newline at end of file diff --git a/dist/core/InputQueue.js b/dist/core/InputQueue.js new file mode 100644 index 0000000..fa101ae --- /dev/null +++ b/dist/core/InputQueue.js @@ -0,0 +1,61 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.InputQueue = void 0; +class InputQueue { + queue = []; + processing = false; + /** Callback invoked for each item — must return a resolved value */ + processor = async () => ""; + /** + * Enqueue an item for serial processing. + */ + enqueue(item) { + this.queue.push(item); + this.drain(); + } + /** + * Reject all pending items (used on disconnect/destroy). + */ + rejectAll(reason) { + for (const item of this.queue) { + item.reject(reason); + } + this.queue = []; + this.processing = false; + } + /** + * Number of items waiting in the queue. + */ + get length() { + return this.queue.length; + } + /** + * Whether the queue is currently processing an item. + */ + get isProcessing() { + return this.processing; + } + // ── Private ────────────────────────────────────────── + async drain() { + if (this.processing) + return; + this.processing = true; + try { + while (this.queue.length > 0) { + const item = this.queue.shift(); + try { + const result = await this.processor(item); + item.resolve(result); + } + catch (error) { + item.reject(error); + } + } + } + finally { + this.processing = false; + } + } +} +exports.InputQueue = InputQueue; +//# sourceMappingURL=InputQueue.js.map \ No newline at end of file diff --git a/dist/core/InputQueue.js.map b/dist/core/InputQueue.js.map new file mode 100644 index 0000000..28d6f54 --- /dev/null +++ b/dist/core/InputQueue.js.map @@ -0,0 +1 @@ +{"version":3,"file":"InputQueue.js","sourceRoot":"","sources":["../../src/core/InputQueue.ts"],"names":[],"mappings":";;;AAUA,MAAa,UAAU;IACb,KAAK,GAAQ,EAAE,CAAC;IAChB,UAAU,GAAG,KAAK,CAAC;IAE3B,oEAAoE;IAC7D,SAAS,GAA8B,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;IAE7D;;OAEG;IACH,OAAO,CAAC,IAAO;QACb,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,MAAa;QACrB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,wDAAwD;IAEhD,KAAK,CAAC,KAAK;QACjB,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO;QAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC;gBACjC,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;oBAC1C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACvB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;CACF;AA5DD,gCA4DC"} \ No newline at end of file diff --git a/dist/core/SpeechManager.d.ts b/dist/core/SpeechManager.d.ts new file mode 100644 index 0000000..5e30778 --- /dev/null +++ b/dist/core/SpeechManager.d.ts @@ -0,0 +1,83 @@ +import { EventEmitter } from "events"; +import { type SpeechModel } from "ai"; +import { type StreamingSpeechConfig } from "../types"; +export interface SpeechManagerOptions { + speechModel?: SpeechModel; + voice?: string; + speechInstructions?: string; + outputFormat?: string; + streamingSpeech?: Partial; +} +/** + * Manages text-to-speech generation, streaming speech chunking, + * parallel TTS requests, and speech interruption. + */ +export declare class SpeechManager extends EventEmitter { + private speechModel?; + private voice; + private speechInstructions?; + private outputFormat; + private streamingSpeechConfig; + private currentSpeechAbortController?; + private speechChunkQueue; + private nextChunkId; + private _isSpeaking; + private pendingTextBuffer; + private speechQueueDonePromise?; + private speechQueueDoneResolve?; + /** Callback to send messages over the WebSocket */ + sendMessage: (message: Record) => void; + constructor(options: SpeechManagerOptions); + get isSpeaking(): boolean; + get pendingChunkCount(): number; + get hasSpeechModel(): boolean; + /** + * Returns a promise that resolves when the speech queue is fully drained. + * Returns undefined if there is nothing queued. + */ + get queueDonePromise(): Promise | undefined; + /** + * Generate speech from text using the configured speech model. + */ + generateSpeechFromText(text: string, abortSignal?: AbortSignal): Promise; + /** + * Generate speech for full text at once (non-streaming fallback). + */ + generateAndSendSpeechFull(text: string): Promise; + /** + * Interrupt ongoing speech generation and playback (barge-in support). + */ + interruptSpeech(reason?: string): void; + /** + * Process a text delta for streaming speech. + * Call this as text chunks arrive from the LLM. + */ + processTextDelta(textDelta: string): void; + /** + * Flush any remaining text in the buffer to speech. + * Call this when the LLM stream ends. + */ + flushPendingText(): void; + /** + * Reset all speech state (used on disconnect / cleanup). + */ + reset(): void; + /** + * Extract complete sentences from text buffer. + * Returns [extractedSentences, remainingBuffer]. + */ + private extractSentences; + /** + * Queue a text chunk for speech generation. + */ + private queueSpeechChunk; + /** + * Generate audio for a single chunk. + */ + private generateChunkAudio; + /** + * Process the speech queue and send audio chunks in order. + */ + private processSpeechQueue; +} +//# sourceMappingURL=SpeechManager.d.ts.map \ No newline at end of file diff --git a/dist/core/SpeechManager.d.ts.map b/dist/core/SpeechManager.d.ts.map new file mode 100644 index 0000000..c3df2be --- /dev/null +++ b/dist/core/SpeechManager.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"SpeechManager.d.ts","sourceRoot":"","sources":["../../src/core/SpeechManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,IAAI,CAAC;AACZ,OAAO,EAEL,KAAK,qBAAqB,EAE3B,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;CAClD;AAED;;;GAGG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,kBAAkB,CAAC,CAAS;IACpC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,qBAAqB,CAAwB;IAErD,OAAO,CAAC,4BAA4B,CAAC,CAAkB;IACvD,OAAO,CAAC,gBAAgB,CAAqB;IAC7C,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAAM;IAG/B,OAAO,CAAC,sBAAsB,CAAC,CAAgB;IAC/C,OAAO,CAAC,sBAAsB,CAAC,CAAa;IAE5C,mDAAmD;IAC5C,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAa;gBAE/D,OAAO,EAAE,oBAAoB;IAYzC,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED;;;OAGG;IACH,IAAI,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAEhD;IAED;;OAEG;IACG,sBAAsB,CAC1B,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,UAAU,CAAC;IAiBtB;;OAEG;IACG,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4B5D;;OAEG;IACH,eAAe,CAAC,MAAM,GAAE,MAAsB,GAAG,IAAI;IAgCrD;;;OAGG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAazC;;;OAGG;IACH,gBAAgB,IAAI,IAAI;IAOxB;;OAEG;IACH,KAAK,IAAI,IAAI;IAkBb;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA+CxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAwCxB;;OAEG;YACW,kBAAkB;IAiChC;;OAEG;YACW,kBAAkB;CA0GjC"} \ No newline at end of file diff --git a/dist/core/SpeechManager.js b/dist/core/SpeechManager.js new file mode 100644 index 0000000..fa53659 --- /dev/null +++ b/dist/core/SpeechManager.js @@ -0,0 +1,356 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.SpeechManager = void 0; +const events_1 = require("events"); +const ai_1 = require("ai"); +const types_1 = require("../types"); +/** + * Manages text-to-speech generation, streaming speech chunking, + * parallel TTS requests, and speech interruption. + */ +class SpeechManager extends events_1.EventEmitter { + speechModel; + voice; + speechInstructions; + outputFormat; + streamingSpeechConfig; + currentSpeechAbortController; + speechChunkQueue = []; + nextChunkId = 0; + _isSpeaking = false; + pendingTextBuffer = ""; + // Promise-based signal for speech queue completion + speechQueueDonePromise; + speechQueueDoneResolve; + /** Callback to send messages over the WebSocket */ + sendMessage = () => { }; + constructor(options) { + super(); + this.speechModel = options.speechModel; + this.voice = options.voice || "alloy"; + this.speechInstructions = options.speechInstructions; + this.outputFormat = options.outputFormat || "opus"; + this.streamingSpeechConfig = { + ...types_1.DEFAULT_STREAMING_SPEECH_CONFIG, + ...options.streamingSpeech, + }; + } + get isSpeaking() { + return this._isSpeaking; + } + get pendingChunkCount() { + return this.speechChunkQueue.length; + } + get hasSpeechModel() { + return !!this.speechModel; + } + /** + * Returns a promise that resolves when the speech queue is fully drained. + * Returns undefined if there is nothing queued. + */ + get queueDonePromise() { + return this.speechQueueDonePromise; + } + /** + * Generate speech from text using the configured speech model. + */ + async generateSpeechFromText(text, abortSignal) { + if (!this.speechModel) { + throw new Error("Speech model not configured"); + } + const result = await (0, ai_1.experimental_generateSpeech)({ + model: this.speechModel, + text, + voice: this.voice, + instructions: this.speechInstructions, + outputFormat: this.outputFormat, + abortSignal, + }); + return result.audio.uint8Array; + } + /** + * Generate speech for full text at once (non-streaming fallback). + */ + async generateAndSendSpeechFull(text) { + if (!this.speechModel) + return; + try { + this.emit("speech_start", { text, streaming: false }); + const audioData = await this.generateSpeechFromText(text); + const base64Audio = Buffer.from(audioData).toString("base64"); + this.sendMessage({ + type: "audio", + data: base64Audio, + format: this.outputFormat, + }); + this.emit("audio", { + data: base64Audio, + format: this.outputFormat, + uint8Array: audioData, + }); + this.emit("speech_complete", { text, streaming: false }); + } + catch (error) { + console.error("Failed to generate speech:", error); + this.emit("error", error); + } + } + /** + * Interrupt ongoing speech generation and playback (barge-in support). + */ + interruptSpeech(reason = "interrupted") { + if (!this._isSpeaking && this.speechChunkQueue.length === 0) { + return; + } + // Abort any pending speech generation requests + if (this.currentSpeechAbortController) { + this.currentSpeechAbortController.abort(); + this.currentSpeechAbortController = undefined; + } + // Clear the speech queue + this.speechChunkQueue = []; + this.pendingTextBuffer = ""; + this._isSpeaking = false; + // Resolve any pending speech-done waiters so callers can finish + if (this.speechQueueDoneResolve) { + this.speechQueueDoneResolve(); + this.speechQueueDoneResolve = undefined; + this.speechQueueDonePromise = undefined; + } + // Notify clients to stop audio playback + this.sendMessage({ + type: "speech_interrupted", + reason, + }); + this.emit("speech_interrupted", { reason }); + } + /** + * Process a text delta for streaming speech. + * Call this as text chunks arrive from the LLM. + */ + processTextDelta(textDelta) { + if (!this.speechModel) + return; + this.pendingTextBuffer += textDelta; + const [sentences, remaining] = this.extractSentences(this.pendingTextBuffer); + this.pendingTextBuffer = remaining; + for (const sentence of sentences) { + this.queueSpeechChunk(sentence); + } + } + /** + * Flush any remaining text in the buffer to speech. + * Call this when the LLM stream ends. + */ + flushPendingText() { + if (!this.speechModel || !this.pendingTextBuffer.trim()) + return; + this.queueSpeechChunk(this.pendingTextBuffer); + this.pendingTextBuffer = ""; + } + /** + * Reset all speech state (used on disconnect / cleanup). + */ + reset() { + if (this.currentSpeechAbortController) { + this.currentSpeechAbortController.abort(); + this.currentSpeechAbortController = undefined; + } + this.speechChunkQueue = []; + this.pendingTextBuffer = ""; + this._isSpeaking = false; + if (this.speechQueueDoneResolve) { + this.speechQueueDoneResolve(); + this.speechQueueDoneResolve = undefined; + this.speechQueueDonePromise = undefined; + } + } + // ── Private helpers ───────────────────────────────────────── + /** + * Extract complete sentences from text buffer. + * Returns [extractedSentences, remainingBuffer]. + */ + extractSentences(text) { + const sentences = []; + let remaining = text; + // Match sentences ending with . ! ? followed by space or end of string + const sentenceEndPattern = /[.!?]+(?:\s+|$)/g; + let lastIndex = 0; + let match; + while ((match = sentenceEndPattern.exec(text)) !== null) { + const sentence = text + .slice(lastIndex, match.index + match[0].length) + .trim(); + if (sentence.length >= this.streamingSpeechConfig.minChunkSize) { + sentences.push(sentence); + lastIndex = match.index + match[0].length; + } + else if (sentences.length > 0) { + // Append short sentence to previous one + sentences[sentences.length - 1] += " " + sentence; + lastIndex = match.index + match[0].length; + } + } + remaining = text.slice(lastIndex); + // If remaining text is too long, force split at clause boundaries + if (remaining.length > this.streamingSpeechConfig.maxChunkSize) { + const clausePattern = /[,;:]\s+/g; + let clauseMatch; + let splitIndex = 0; + while ((clauseMatch = clausePattern.exec(remaining)) !== null) { + if (clauseMatch.index >= this.streamingSpeechConfig.minChunkSize) { + splitIndex = clauseMatch.index + clauseMatch[0].length; + break; + } + } + if (splitIndex > 0) { + sentences.push(remaining.slice(0, splitIndex).trim()); + remaining = remaining.slice(splitIndex); + } + } + return [sentences, remaining]; + } + /** + * Queue a text chunk for speech generation. + */ + queueSpeechChunk(text) { + if (!this.speechModel || !text.trim()) + return; + // Wrap chunk ID to prevent unbounded growth in very long sessions + if (this.nextChunkId >= Number.MAX_SAFE_INTEGER) { + this.nextChunkId = 0; + } + const chunk = { + id: this.nextChunkId++, + text: text.trim(), + }; + // Create the speech-done promise if not already present + if (!this.speechQueueDonePromise) { + this.speechQueueDonePromise = new Promise((resolve) => { + this.speechQueueDoneResolve = resolve; + }); + } + // Start generating audio immediately (parallel generation) + if (this.streamingSpeechConfig.parallelGeneration) { + const activeRequests = this.speechChunkQueue.filter((c) => c.audioPromise).length; + if (activeRequests < this.streamingSpeechConfig.maxParallelRequests) { + chunk.audioPromise = this.generateChunkAudio(chunk); + } + } + this.speechChunkQueue.push(chunk); + this.emit("speech_chunk_queued", { id: chunk.id, text: chunk.text }); + // Start processing queue if not already + if (!this._isSpeaking) { + this.processSpeechQueue(); + } + } + /** + * Generate audio for a single chunk. + */ + async generateChunkAudio(chunk) { + if (!this.currentSpeechAbortController) { + this.currentSpeechAbortController = new AbortController(); + } + try { + console.log(`Generating audio for chunk ${chunk.id}: "${chunk.text.substring(0, 50)}${chunk.text.length > 50 ? "..." : ""}"`); + const audioData = await this.generateSpeechFromText(chunk.text, this.currentSpeechAbortController.signal); + console.log(`Generated audio for chunk ${chunk.id}: ${audioData.length} bytes`); + return audioData; + } + catch (error) { + if (error.name === "AbortError") { + console.log(`Audio generation aborted for chunk ${chunk.id}`); + return null; + } + console.error(`Failed to generate audio for chunk ${chunk.id}:`, error); + this.emit("error", error); + return null; + } + } + /** + * Process the speech queue and send audio chunks in order. + */ + async processSpeechQueue() { + if (this._isSpeaking) + return; + this._isSpeaking = true; + console.log(`Starting speech queue processing with ${this.speechChunkQueue.length} chunks`); + this.emit("speech_start", { streaming: true }); + this.sendMessage({ type: "speech_stream_start" }); + try { + while (this.speechChunkQueue.length > 0) { + const chunk = this.speechChunkQueue[0]; + console.log(`Processing speech chunk #${chunk.id} (${this.speechChunkQueue.length - 1} remaining)`); + // Ensure audio generation has started + if (!chunk.audioPromise) { + chunk.audioPromise = this.generateChunkAudio(chunk); + } + // Wait for this chunk's audio + const audioData = await chunk.audioPromise; + // Check if we were interrupted while waiting + if (!this._isSpeaking) { + console.log(`Speech interrupted during chunk #${chunk.id}`); + break; + } + // Remove from queue after processing + this.speechChunkQueue.shift(); + if (audioData) { + const base64Audio = Buffer.from(audioData).toString("base64"); + console.log(`Sending audio chunk #${chunk.id} (${audioData.length} bytes, ${this.outputFormat})`); + // Send audio chunk via WebSocket + this.sendMessage({ + type: "audio_chunk", + chunkId: chunk.id, + data: base64Audio, + format: this.outputFormat, + text: chunk.text, + }); + // Emit for local handling + this.emit("audio_chunk", { + chunkId: chunk.id, + data: base64Audio, + format: this.outputFormat, + text: chunk.text, + uint8Array: audioData, + }); + } + else { + console.log(`No audio data generated for chunk #${chunk.id}`); + } + // Start generating next chunks in parallel + if (this.streamingSpeechConfig.parallelGeneration) { + const activeRequests = this.speechChunkQueue.filter((c) => c.audioPromise).length; + const toStart = Math.min(this.streamingSpeechConfig.maxParallelRequests - activeRequests, this.speechChunkQueue.length); + if (toStart > 0) { + console.log(`Starting parallel generation for ${toStart} more chunks`); + for (let i = 0; i < toStart; i++) { + const nextChunk = this.speechChunkQueue.find((c) => !c.audioPromise); + if (nextChunk) { + nextChunk.audioPromise = this.generateChunkAudio(nextChunk); + } + } + } + } + } + } + catch (error) { + console.error("Error in speech queue processing:", error); + this.emit("error", error); + } + finally { + this._isSpeaking = false; + this.currentSpeechAbortController = undefined; + // Signal that the speech queue is fully drained + if (this.speechQueueDoneResolve) { + this.speechQueueDoneResolve(); + this.speechQueueDoneResolve = undefined; + this.speechQueueDonePromise = undefined; + } + console.log(`Speech queue processing complete`); + this.sendMessage({ type: "speech_stream_end" }); + this.emit("speech_complete", { streaming: true }); + } + } +} +exports.SpeechManager = SpeechManager; +//# sourceMappingURL=SpeechManager.js.map \ No newline at end of file diff --git a/dist/core/SpeechManager.js.map b/dist/core/SpeechManager.js.map new file mode 100644 index 0000000..073d1aa --- /dev/null +++ b/dist/core/SpeechManager.js.map @@ -0,0 +1 @@ +{"version":3,"file":"SpeechManager.js","sourceRoot":"","sources":["../../src/core/SpeechManager.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/core/StreamProcessor.d.ts b/dist/core/StreamProcessor.d.ts new file mode 100644 index 0000000..7e15f84 --- /dev/null +++ b/dist/core/StreamProcessor.d.ts @@ -0,0 +1,42 @@ +import { type streamText } from "ai"; +/** + * Result of processing a full LLM stream. + */ +export interface StreamResult { + fullText: string; + fullReasoning: string; + allToolCalls: Array<{ + toolName: string; + toolCallId: string; + input: unknown; + }>; + allToolResults: Array<{ + toolName: string; + toolCallId: string; + output: unknown; + }>; + allSources: Array; + allFiles: Array; +} +export interface StreamProcessorCallbacks { + /** Called when a text delta arrives (for streaming speech, etc.) */ + onTextDelta?: (text: string) => void; + /** Called when a text-end part arrives (flush speech, etc.) */ + onTextEnd?: () => void; + /** Send a WebSocket message */ + sendMessage: (message: Record) => void; + /** Emit an event on the agent */ + emitEvent: (event: string, data?: unknown) => void; +} +/** + * Processes the fullStream from an AI SDK `streamText` call, + * forwarding events to WebSocket clients and collecting the complete response. + * + * This is a standalone function (not a class) because it has no persistent state. + */ +export declare function processFullStream(result: ReturnType, callbacks: StreamProcessorCallbacks, extraResponseFields?: Record): Promise; +/** + * Handle onChunk callback events and emit them. + */ +export declare function handleStreamChunk(chunk: any, emitEvent: (event: string, data?: unknown) => void): void; +//# sourceMappingURL=StreamProcessor.d.ts.map \ No newline at end of file diff --git a/dist/core/StreamProcessor.d.ts.map b/dist/core/StreamProcessor.d.ts.map new file mode 100644 index 0000000..a886f9e --- /dev/null +++ b/dist/core/StreamProcessor.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"StreamProcessor.d.ts","sourceRoot":"","sources":["../../src/core/StreamProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,IAAI,CAAC;AAErC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,KAAK,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC,CAAC;IACH,cAAc,EAAE,KAAK,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC,CAAC;IACH,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACvC,oEAAoE;IACpE,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,+BAA+B;IAC/B,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACxD,iCAAiC;IACjC,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CACpD;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,EACrC,SAAS,EAAE,wBAAwB,EACnC,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5C,OAAO,CAAC,YAAY,CAAC,CAkMvB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,GAAG,EACV,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,GACjD,IAAI,CA+CN"} \ No newline at end of file diff --git a/dist/core/StreamProcessor.js b/dist/core/StreamProcessor.js new file mode 100644 index 0000000..4f84d0c --- /dev/null +++ b/dist/core/StreamProcessor.js @@ -0,0 +1,228 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.processFullStream = processFullStream; +exports.handleStreamChunk = handleStreamChunk; +/** + * Processes the fullStream from an AI SDK `streamText` call, + * forwarding events to WebSocket clients and collecting the complete response. + * + * This is a standalone function (not a class) because it has no persistent state. + */ +async function processFullStream(result, callbacks, extraResponseFields) { + const { onTextDelta, onTextEnd, sendMessage, emitEvent } = callbacks; + let fullText = ""; + let fullReasoning = ""; + const allToolCalls = []; + const allToolResults = []; + const allSources = []; + const allFiles = []; + for await (const part of result.fullStream) { + switch (part.type) { + // ── Stream lifecycle ────────────────────────────── + case "start": + sendMessage({ type: "stream_start" }); + break; + case "finish": + emitEvent("text", { role: "assistant", text: fullText }); + sendMessage({ + type: "stream_finish", + finishReason: part.finishReason, + usage: part.totalUsage, + }); + break; + case "error": + emitEvent("error", part.error); + sendMessage({ + type: "stream_error", + error: String(part.error), + }); + break; + case "abort": + emitEvent("abort", { reason: part.reason }); + sendMessage({ + type: "stream_abort", + reason: part.reason, + }); + break; + // ── Step lifecycle ──────────────────────────────── + case "start-step": + sendMessage({ + type: "step_start", + warnings: part.warnings, + }); + break; + case "finish-step": + sendMessage({ + type: "step_finish", + finishReason: part.finishReason, + usage: part.usage, + }); + break; + // ── Text streaming ──────────────────────────────── + case "text-start": + sendMessage({ type: "text_start", id: part.id }); + break; + case "text-delta": + fullText += part.text; + onTextDelta?.(part.text); + sendMessage({ + type: "text_delta", + id: part.id, + text: part.text, + }); + break; + case "text-end": + onTextEnd?.(); + sendMessage({ type: "text_end", id: part.id }); + break; + // ── Reasoning streaming ─────────────────────────── + case "reasoning-start": + sendMessage({ type: "reasoning_start", id: part.id }); + break; + case "reasoning-delta": + fullReasoning += part.text; + sendMessage({ + type: "reasoning_delta", + id: part.id, + text: part.text, + }); + break; + case "reasoning-end": + sendMessage({ type: "reasoning_end", id: part.id }); + break; + // ── Tool input streaming ────────────────────────── + case "tool-input-start": + sendMessage({ + type: "tool_input_start", + id: part.id, + toolName: part.toolName, + }); + break; + case "tool-input-delta": + sendMessage({ + type: "tool_input_delta", + id: part.id, + delta: part.delta, + }); + break; + case "tool-input-end": + sendMessage({ type: "tool_input_end", id: part.id }); + break; + // ── Tool execution ──────────────────────────────── + case "tool-call": + allToolCalls.push({ + toolName: part.toolName, + toolCallId: part.toolCallId, + input: part.input, + }); + sendMessage({ + type: "tool_call", + toolName: part.toolName, + toolCallId: part.toolCallId, + input: part.input, + }); + break; + case "tool-result": + allToolResults.push({ + toolName: part.toolName, + toolCallId: part.toolCallId, + output: part.output, + }); + sendMessage({ + type: "tool_result", + toolName: part.toolName, + toolCallId: part.toolCallId, + result: part.output, + }); + break; + case "tool-error": + sendMessage({ + type: "tool_error", + toolName: part.toolName, + toolCallId: part.toolCallId, + error: String(part.error), + }); + break; + // ── Sources and files ───────────────────────────── + case "source": + allSources.push(part); + sendMessage({ + type: "source", + source: part, + }); + break; + case "file": + allFiles.push(part.file); + sendMessage({ + type: "file", + file: part.file, + }); + break; + } + } + // Send the complete response + sendMessage({ + type: "response_complete", + text: fullText, + reasoning: fullReasoning || undefined, + toolCalls: allToolCalls, + toolResults: allToolResults, + sources: allSources.length > 0 ? allSources : undefined, + files: allFiles.length > 0 ? allFiles : undefined, + ...extraResponseFields, + }); + return { + fullText, + fullReasoning, + allToolCalls, + allToolResults, + allSources, + allFiles, + }; +} +/** + * Handle onChunk callback events and emit them. + */ +function handleStreamChunk(chunk, emitEvent) { + switch (chunk.type) { + case "text-delta": + emitEvent("chunk:text_delta", { id: chunk.id, text: chunk.text }); + break; + case "reasoning-delta": + emitEvent("chunk:reasoning_delta", { + id: chunk.id, + text: chunk.text, + }); + break; + case "tool-call": + emitEvent("chunk:tool_call", { + toolName: chunk.toolName, + toolCallId: chunk.toolCallId, + input: chunk.input, + }); + break; + case "tool-result": + emitEvent("chunk:tool_result", { + toolName: chunk.toolName, + toolCallId: chunk.toolCallId, + result: chunk.output, + }); + break; + case "tool-input-start": + emitEvent("chunk:tool_input_start", { + id: chunk.id, + toolName: chunk.toolName, + }); + break; + case "tool-input-delta": + emitEvent("chunk:tool_input_delta", { + id: chunk.id, + delta: chunk.delta, + }); + break; + case "source": + emitEvent("chunk:source", chunk); + break; + } +} +//# sourceMappingURL=StreamProcessor.js.map \ No newline at end of file diff --git a/dist/core/StreamProcessor.js.map b/dist/core/StreamProcessor.js.map new file mode 100644 index 0000000..3a7c7bc --- /dev/null +++ b/dist/core/StreamProcessor.js.map @@ -0,0 +1 @@ +{"version":3,"file":"StreamProcessor.js","sourceRoot":"","sources":["../../src/core/StreamProcessor.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/core/TranscriptionManager.d.ts b/dist/core/TranscriptionManager.d.ts new file mode 100644 index 0000000..646de97 --- /dev/null +++ b/dist/core/TranscriptionManager.d.ts @@ -0,0 +1,28 @@ +import { EventEmitter } from "events"; +import { type TranscriptionModel } from "ai"; +export interface TranscriptionManagerOptions { + transcriptionModel?: TranscriptionModel; + maxAudioInputSize?: number; +} +/** + * Handles audio transcription using the AI SDK transcription model + * and validation of incoming audio data. + */ +export declare class TranscriptionManager extends EventEmitter { + private transcriptionModel?; + private maxAudioInputSize; + /** Callback to send messages over the WebSocket */ + sendMessage: (message: Record) => void; + constructor(options?: TranscriptionManagerOptions); + get hasTranscriptionModel(): boolean; + /** + * Transcribe audio data to text. + */ + transcribeAudio(audioData: Buffer | Uint8Array): Promise; + /** + * Process incoming base64-encoded audio: validate, decode, transcribe. + * Returns the transcribed text, or null if invalid / empty. + */ + processAudioInput(base64Audio: string, format?: string): Promise; +} +//# sourceMappingURL=TranscriptionManager.d.ts.map \ No newline at end of file diff --git a/dist/core/TranscriptionManager.d.ts.map b/dist/core/TranscriptionManager.d.ts.map new file mode 100644 index 0000000..acd5ae8 --- /dev/null +++ b/dist/core/TranscriptionManager.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"TranscriptionManager.d.ts","sourceRoot":"","sources":["../../src/core/TranscriptionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,IAAI,CAAC;AAGZ,MAAM,WAAW,2BAA2B;IAC1C,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,YAAY;IACpD,OAAO,CAAC,kBAAkB,CAAC,CAAqB;IAChD,OAAO,CAAC,iBAAiB,CAAS;IAElC,mDAAmD;IAC5C,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAY;gBAE9D,OAAO,GAAE,2BAAgC;IAOrD,IAAI,qBAAqB,IAAI,OAAO,CAEnC;IAED;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAsCtE;;;OAGG;IACG,iBAAiB,CACrB,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CA2D1B"} \ No newline at end of file diff --git a/dist/core/TranscriptionManager.js b/dist/core/TranscriptionManager.js new file mode 100644 index 0000000..410a3be --- /dev/null +++ b/dist/core/TranscriptionManager.js @@ -0,0 +1,106 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TranscriptionManager = void 0; +const events_1 = require("events"); +const ai_1 = require("ai"); +const types_1 = require("../types"); +/** + * Handles audio transcription using the AI SDK transcription model + * and validation of incoming audio data. + */ +class TranscriptionManager extends events_1.EventEmitter { + transcriptionModel; + maxAudioInputSize; + /** Callback to send messages over the WebSocket */ + sendMessage = () => { }; + constructor(options = {}) { + super(); + this.transcriptionModel = options.transcriptionModel; + this.maxAudioInputSize = + options.maxAudioInputSize ?? types_1.DEFAULT_MAX_AUDIO_SIZE; + } + get hasTranscriptionModel() { + return !!this.transcriptionModel; + } + /** + * Transcribe audio data to text. + */ + async transcribeAudio(audioData) { + if (!this.transcriptionModel) { + throw new Error("Transcription model not configured"); + } + console.log(`Sending ${audioData.byteLength} bytes to Whisper for transcription`); + try { + const result = await (0, ai_1.experimental_transcribe)({ + model: this.transcriptionModel, + audio: audioData, + }); + console.log(`Whisper transcription result: "${result.text}", language: ${result.language || "unknown"}`); + this.emit("transcription", { + text: result.text, + language: result.language, + }); + // Send transcription to client for immediate feedback + this.sendMessage({ + type: "transcription_result", + text: result.text, + language: result.language, + }); + return result.text; + } + catch (error) { + console.error("Whisper transcription failed:", error); + throw error; + } + } + /** + * Process incoming base64-encoded audio: validate, decode, transcribe. + * Returns the transcribed text, or null if invalid / empty. + */ + async processAudioInput(base64Audio, format) { + if (!this.transcriptionModel) { + const error = new Error("Transcription model not configured for audio input"); + this.emit("error", error); + this.sendMessage({ type: "error", error: error.message }); + return null; + } + try { + const audioBuffer = Buffer.from(base64Audio, "base64"); + // Validate audio size + if (audioBuffer.length > this.maxAudioInputSize) { + const sizeMB = (audioBuffer.length / (1024 * 1024)).toFixed(1); + const maxMB = (this.maxAudioInputSize / (1024 * 1024)).toFixed(1); + this.emit("error", new Error(`Audio input too large (${sizeMB} MB). Maximum allowed: ${maxMB} MB`)); + return null; + } + if (audioBuffer.length === 0) { + this.emit("warning", "Received empty audio data"); + return null; + } + this.emit("audio_received", { size: audioBuffer.length, format }); + console.log(`Processing audio input: ${audioBuffer.length} bytes, format: ${format || "unknown"}`); + const transcribedText = await this.transcribeAudio(audioBuffer); + console.log(`Transcribed text: "${transcribedText}"`); + if (!transcribedText.trim()) { + this.emit("warning", "Transcription returned empty text"); + this.sendMessage({ + type: "transcription_error", + error: "Whisper returned empty text", + }); + return null; + } + return transcribedText; + } + catch (error) { + console.error("Failed to process audio input:", error); + this.emit("error", error); + this.sendMessage({ + type: "transcription_error", + error: `Transcription failed: ${error.message || String(error)}`, + }); + return null; + } + } +} +exports.TranscriptionManager = TranscriptionManager; +//# sourceMappingURL=TranscriptionManager.js.map \ No newline at end of file diff --git a/dist/core/TranscriptionManager.js.map b/dist/core/TranscriptionManager.js.map new file mode 100644 index 0000000..0046c14 --- /dev/null +++ b/dist/core/TranscriptionManager.js.map @@ -0,0 +1 @@ +{"version":3,"file":"TranscriptionManager.js","sourceRoot":"","sources":["../../src/core/TranscriptionManager.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/core/WebSocketManager.d.ts b/dist/core/WebSocketManager.d.ts new file mode 100644 index 0000000..df556ae --- /dev/null +++ b/dist/core/WebSocketManager.d.ts @@ -0,0 +1,35 @@ +import { WebSocket } from "ws"; +import { EventEmitter } from "events"; +/** + * Manages a single WebSocket connection lifecycle. + * Handles connecting, attaching existing sockets, sending messages, + * and clean disconnection. + */ +export declare class WebSocketManager extends EventEmitter { + private socket?; + private _isConnected; + get isConnected(): boolean; + get currentSocket(): WebSocket | undefined; + /** + * Connect to a WebSocket server by URL. + */ + connect(url: string): Promise; + /** + * Attach an existing WebSocket (server-side usage). + */ + handleSocket(socket: WebSocket): void; + /** + * Send a JSON message via WebSocket if connected. + * Gracefully handles send failures (e.g., socket closing mid-send). + */ + send(message: Record): void; + /** + * Disconnect and clean up the current socket. + */ + disconnect(): void; + /** + * Attach internal event listeners on the current socket. + */ + private attachListeners; +} +//# sourceMappingURL=WebSocketManager.d.ts.map \ No newline at end of file diff --git a/dist/core/WebSocketManager.d.ts.map b/dist/core/WebSocketManager.d.ts.map new file mode 100644 index 0000000..14fe38c --- /dev/null +++ b/dist/core/WebSocketManager.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"WebSocketManager.d.ts","sourceRoot":"","sources":["../../src/core/WebSocketManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,OAAO,CAAC,MAAM,CAAC,CAAY;IAC3B,OAAO,CAAC,YAAY,CAAS;IAE7B,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,aAAa,IAAI,SAAS,GAAG,SAAS,CAEzC;IAED;;OAEG;IACH,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BnC;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAYrC;;;OAGG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAgB5C;;OAEG;IACH,UAAU,IAAI,IAAI;IAmBlB;;OAEG;IACH,OAAO,CAAC,eAAe;CAuBxB"} \ No newline at end of file diff --git a/dist/core/WebSocketManager.js b/dist/core/WebSocketManager.js new file mode 100644 index 0000000..dfe009f --- /dev/null +++ b/dist/core/WebSocketManager.js @@ -0,0 +1,126 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.WebSocketManager = void 0; +const ws_1 = require("ws"); +const events_1 = require("events"); +/** + * Manages a single WebSocket connection lifecycle. + * Handles connecting, attaching existing sockets, sending messages, + * and clean disconnection. + */ +class WebSocketManager extends events_1.EventEmitter { + socket; + _isConnected = false; + get isConnected() { + return this._isConnected; + } + get currentSocket() { + return this.socket; + } + /** + * Connect to a WebSocket server by URL. + */ + connect(url) { + // Clean up any existing connection first + if (this.socket) { + this.disconnect(); + } + return new Promise((resolve, reject) => { + try { + this.socket = new ws_1.WebSocket(url); + this.attachListeners(); + this.socket.once("open", () => { + this._isConnected = true; + this.emit("connected"); + resolve(); + }); + this.socket.once("error", (error) => { + reject(error); + }); + } + catch (error) { + reject(error); + } + }); + } + /** + * Attach an existing WebSocket (server-side usage). + */ + handleSocket(socket) { + // Clean up any existing connection first + if (this.socket) { + this.disconnect(); + } + this.socket = socket; + this._isConnected = true; + this.attachListeners(); + this.emit("connected"); + } + /** + * Send a JSON message via WebSocket if connected. + * Gracefully handles send failures (e.g., socket closing mid-send). + */ + send(message) { + if (!this.socket || !this._isConnected) + return; + try { + if (this.socket.readyState === ws_1.WebSocket.OPEN) { + this.socket.send(JSON.stringify(message)); + } + else { + console.warn(`Cannot send message, socket state: ${this.socket.readyState}`); + } + } + catch (error) { + // Socket may have closed between the readyState check and send() + console.error("Failed to send WebSocket message:", error); + this.emit("error", error); + } + } + /** + * Disconnect and clean up the current socket. + */ + disconnect() { + if (!this.socket) + return; + try { + this.socket.removeAllListeners(); + if (this.socket.readyState === ws_1.WebSocket.OPEN || + this.socket.readyState === ws_1.WebSocket.CONNECTING) { + this.socket.close(); + } + } + catch { + // Ignore close errors — socket may already be dead + } + this.socket = undefined; + this._isConnected = false; + } + /** + * Attach internal event listeners on the current socket. + */ + attachListeners() { + if (!this.socket) + return; + this.socket.on("message", (data) => { + try { + const message = JSON.parse(data.toString()); + this.emit("message", message); + } + catch (err) { + console.error("Failed to parse WebSocket message:", err); + this.emit("error", err); + } + }); + this.socket.on("close", () => { + this._isConnected = false; + this.emit("disconnected"); + }); + this.socket.on("error", (error) => { + console.error("WebSocket error:", error); + this.emit("error", error); + }); + } +} +exports.WebSocketManager = WebSocketManager; +//# sourceMappingURL=WebSocketManager.js.map \ No newline at end of file diff --git a/dist/core/WebSocketManager.js.map b/dist/core/WebSocketManager.js.map new file mode 100644 index 0000000..2479602 --- /dev/null +++ b/dist/core/WebSocketManager.js.map @@ -0,0 +1 @@ +{"version":3,"file":"WebSocketManager.js","sourceRoot":"","sources":["../../src/core/WebSocketManager.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/core/index.d.ts b/dist/core/index.d.ts new file mode 100644 index 0000000..4e06329 --- /dev/null +++ b/dist/core/index.d.ts @@ -0,0 +1,7 @@ +export { WebSocketManager } from "./WebSocketManager"; +export { SpeechManager, type SpeechManagerOptions } from "./SpeechManager"; +export { ConversationManager, type ConversationManagerOptions, } from "./ConversationManager"; +export { TranscriptionManager, type TranscriptionManagerOptions, } from "./TranscriptionManager"; +export { processFullStream, handleStreamChunk, type StreamResult, type StreamProcessorCallbacks, } from "./StreamProcessor"; +export { InputQueue, type QueueItem } from "./InputQueue"; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/core/index.d.ts.map b/dist/core/index.d.ts.map new file mode 100644 index 0000000..ecff749 --- /dev/null +++ b/dist/core/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,KAAK,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EACL,mBAAmB,EACnB,KAAK,0BAA0B,GAChC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,oBAAoB,EACpB,KAAK,2BAA2B,GACjC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,wBAAwB,GAC9B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC"} \ No newline at end of file diff --git a/dist/core/index.js b/dist/core/index.js new file mode 100644 index 0000000..1c94c1e --- /dev/null +++ b/dist/core/index.js @@ -0,0 +1,17 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.InputQueue = exports.handleStreamChunk = exports.processFullStream = exports.TranscriptionManager = exports.ConversationManager = exports.SpeechManager = exports.WebSocketManager = void 0; +var WebSocketManager_1 = require("./WebSocketManager"); +Object.defineProperty(exports, "WebSocketManager", { enumerable: true, get: function () { return WebSocketManager_1.WebSocketManager; } }); +var SpeechManager_1 = require("./SpeechManager"); +Object.defineProperty(exports, "SpeechManager", { enumerable: true, get: function () { return SpeechManager_1.SpeechManager; } }); +var ConversationManager_1 = require("./ConversationManager"); +Object.defineProperty(exports, "ConversationManager", { enumerable: true, get: function () { return ConversationManager_1.ConversationManager; } }); +var TranscriptionManager_1 = require("./TranscriptionManager"); +Object.defineProperty(exports, "TranscriptionManager", { enumerable: true, get: function () { return TranscriptionManager_1.TranscriptionManager; } }); +var StreamProcessor_1 = require("./StreamProcessor"); +Object.defineProperty(exports, "processFullStream", { enumerable: true, get: function () { return StreamProcessor_1.processFullStream; } }); +Object.defineProperty(exports, "handleStreamChunk", { enumerable: true, get: function () { return StreamProcessor_1.handleStreamChunk; } }); +var InputQueue_1 = require("./InputQueue"); +Object.defineProperty(exports, "InputQueue", { enumerable: true, get: function () { return InputQueue_1.InputQueue; } }); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/core/index.js.map b/dist/core/index.js.map new file mode 100644 index 0000000..d094aee --- /dev/null +++ b/dist/core/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":";;;AAAA,uDAAsD;AAA7C,oHAAA,gBAAgB,OAAA;AACzB,iDAA2E;AAAlE,8GAAA,aAAa,OAAA;AACtB,6DAG+B;AAF7B,0HAAA,mBAAmB,OAAA;AAGrB,+DAGgC;AAF9B,4HAAA,oBAAoB,OAAA;AAGtB,qDAK2B;AAJzB,oHAAA,iBAAiB,OAAA;AACjB,oHAAA,iBAAiB,OAAA;AAInB,2CAA0D;AAAjD,wGAAA,UAAU,OAAA"} \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index 90c8d3b..173425f 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -1,4 +1,4 @@ -export { VoiceAgent, type VoiceAgentOptions } from "./VoiceAgent"; -export { VideoAgent, type VideoAgentOptions, type VideoFrame, type AudioData, type VideoAgentConfig, type FrameContext, type FrameTriggerReason, } from "./VideoAgent"; +export { VoiceAgent, type VoiceAgentOptions } from "./VoiceAgent.new"; +export { VideoAgent, type VideoAgentOptions, type VideoFrame, type AudioData, type VideoAgentConfig, type FrameContext, type FrameTriggerReason, } from "./VideoAgent.new"; export { type SpeechChunk, type StreamingSpeechConfig, type HistoryConfig, type StopWhenCondition, DEFAULT_STREAMING_SPEECH_CONFIG, DEFAULT_HISTORY_CONFIG, DEFAULT_MAX_AUDIO_SIZE, } from "./types"; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/index.d.ts.map b/dist/index.d.ts.map index b9bc9e7..212cc18 100644 --- a/dist/index.d.ts.map +++ b/dist/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EACH,UAAU,EACV,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,kBAAkB,GAC1B,MAAM,cAAc,CAAC;AAGtB,OAAO,EACH,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,+BAA+B,EAC/B,sBAAsB,EACtB,sBAAsB,GACzB,MAAM,SAAS,CAAC"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACH,UAAU,EACV,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,kBAAkB,GAC1B,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACH,KAAK,WAAW,EAChB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,+BAA+B,EAC/B,sBAAsB,EACtB,sBAAsB,GACzB,MAAM,SAAS,CAAC"} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index af8affb..608b052 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2,10 +2,10 @@ Object.defineProperty(exports, "__esModule", { value: true }); exports.DEFAULT_MAX_AUDIO_SIZE = exports.DEFAULT_HISTORY_CONFIG = exports.DEFAULT_STREAMING_SPEECH_CONFIG = exports.VideoAgent = exports.VoiceAgent = void 0; // Agents -var VoiceAgent_1 = require("./VoiceAgent"); -Object.defineProperty(exports, "VoiceAgent", { enumerable: true, get: function () { return VoiceAgent_1.VoiceAgent; } }); -var VideoAgent_1 = require("./VideoAgent"); -Object.defineProperty(exports, "VideoAgent", { enumerable: true, get: function () { return VideoAgent_1.VideoAgent; } }); +var VoiceAgent_new_1 = require("./VoiceAgent.new"); +Object.defineProperty(exports, "VoiceAgent", { enumerable: true, get: function () { return VoiceAgent_new_1.VoiceAgent; } }); +var VideoAgent_new_1 = require("./VideoAgent.new"); +Object.defineProperty(exports, "VideoAgent", { enumerable: true, get: function () { return VideoAgent_new_1.VideoAgent; } }); // Shared types var types_1 = require("./types"); Object.defineProperty(exports, "DEFAULT_STREAMING_SPEECH_CONFIG", { enumerable: true, get: function () { return types_1.DEFAULT_STREAMING_SPEECH_CONFIG; } }); diff --git a/dist/index.js.map b/dist/index.js.map index 8c027fb..c9fdd12 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,SAAS;AACT,2CAAkE;AAAzD,wGAAA,UAAU,OAAA;AACnB,2CAQsB;AAPlB,wGAAA,UAAU,OAAA;AASd,eAAe;AACf,iCAQiB;AAHb,wHAAA,+BAA+B,OAAA;AAC/B,+GAAA,sBAAsB,OAAA;AACtB,+GAAA,sBAAsB,OAAA"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,SAAS;AACT,mDAAsE;AAA7D,4GAAA,UAAU,OAAA;AACnB,mDAQ0B;AAPtB,4GAAA,UAAU,OAAA;AASd,eAAe;AACf,iCAQiB;AAHb,wHAAA,+BAA+B,OAAA;AAC/B,+GAAA,sBAAsB,OAAA;AACtB,+GAAA,sBAAsB,OAAA"} \ No newline at end of file diff --git a/example/frames/frame_00000_2026-02-23T10-41-46-424Z.webp b/example/frames/frame_00000_2026-02-23T10-41-46-424Z.webp new file mode 100644 index 0000000..7085b89 Binary files /dev/null and b/example/frames/frame_00000_2026-02-23T10-41-46-424Z.webp differ diff --git a/example/frames/frame_00001_2026-02-23T10-41-50-271Z.webp b/example/frames/frame_00001_2026-02-23T10-41-50-271Z.webp new file mode 100644 index 0000000..a76772e Binary files /dev/null and b/example/frames/frame_00001_2026-02-23T10-41-50-271Z.webp differ diff --git a/example/frames/frame_00002_2026-02-23T10-41-51-387Z.webp b/example/frames/frame_00002_2026-02-23T10-41-51-387Z.webp new file mode 100644 index 0000000..2f03244 Binary files /dev/null and b/example/frames/frame_00002_2026-02-23T10-41-51-387Z.webp differ diff --git a/example/frames/frame_00003_2026-02-23T10-41-56-374Z.webp b/example/frames/frame_00003_2026-02-23T10-41-56-374Z.webp new file mode 100644 index 0000000..6af3e6d Binary files /dev/null and b/example/frames/frame_00003_2026-02-23T10-41-56-374Z.webp differ diff --git a/example/frames/frame_00004_2026-02-23T10-42-01-379Z.webp b/example/frames/frame_00004_2026-02-23T10-42-01-379Z.webp new file mode 100644 index 0000000..87609e5 Binary files /dev/null and b/example/frames/frame_00004_2026-02-23T10-42-01-379Z.webp differ diff --git a/example/frames/frame_00005_2026-02-23T10-42-06-375Z.webp b/example/frames/frame_00005_2026-02-23T10-42-06-375Z.webp new file mode 100644 index 0000000..8cc8f8d Binary files /dev/null and b/example/frames/frame_00005_2026-02-23T10-42-06-375Z.webp differ diff --git a/example/frames/frame_00006_2026-02-23T10-42-07-405Z.webp b/example/frames/frame_00006_2026-02-23T10-42-07-405Z.webp new file mode 100644 index 0000000..533b989 Binary files /dev/null and b/example/frames/frame_00006_2026-02-23T10-42-07-405Z.webp differ diff --git a/example/frames/frame_00007_2026-02-23T10-42-11-278Z.webp b/example/frames/frame_00007_2026-02-23T10-42-11-278Z.webp new file mode 100644 index 0000000..f6fb56c Binary files /dev/null and b/example/frames/frame_00007_2026-02-23T10-42-11-278Z.webp differ diff --git a/example/frames/frame_00008_2026-02-23T10-42-11-381Z.webp b/example/frames/frame_00008_2026-02-23T10-42-11-381Z.webp new file mode 100644 index 0000000..65c799a Binary files /dev/null and b/example/frames/frame_00008_2026-02-23T10-42-11-381Z.webp differ diff --git a/example/frames/frame_00009_2026-02-23T10-42-16-395Z.webp b/example/frames/frame_00009_2026-02-23T10-42-16-395Z.webp new file mode 100644 index 0000000..a45bcf7 Binary files /dev/null and b/example/frames/frame_00009_2026-02-23T10-42-16-395Z.webp differ diff --git a/example/frames/frame_00010_2026-02-23T10-42-21-373Z.webp b/example/frames/frame_00010_2026-02-23T10-42-21-373Z.webp new file mode 100644 index 0000000..e10ef66 Binary files /dev/null and b/example/frames/frame_00010_2026-02-23T10-42-21-373Z.webp differ diff --git a/example/frames/frame_00011_2026-02-23T10-42-26-364Z.webp b/example/frames/frame_00011_2026-02-23T10-42-26-364Z.webp new file mode 100644 index 0000000..d4ee192 Binary files /dev/null and b/example/frames/frame_00011_2026-02-23T10-42-26-364Z.webp differ diff --git a/example/ws-server-video.ts b/example/ws-server-video.ts index e155194..b7f8e4f 100644 --- a/example/ws-server-video.ts +++ b/example/ws-server-video.ts @@ -1,7 +1,7 @@ // ws-server-video.ts import "dotenv/config"; import { WebSocketServer } from "ws"; -import { VideoAgent } from "../src/VideoAgent"; // adjust path +import { VideoAgent } from "../src/VideoAgent.new"; // adjust path import { tool } from "ai"; import { z } from "zod"; import { openai } from "@ai-sdk/openai"; @@ -91,7 +91,7 @@ wss.on("connection", (socket) => { You can SEE what the user is showing via webcam. Describe what you see when it helps answer the question. Keep spoken answers concise and natural.`, - voice: "alloy", + voice: "echo", streamingSpeech: { minChunkSize: 25, maxChunkSize: 140, diff --git a/src/VideoAgent.new.ts b/src/VideoAgent.new.ts new file mode 100644 index 0000000..18e00a7 --- /dev/null +++ b/src/VideoAgent.new.ts @@ -0,0 +1,818 @@ +import { WebSocket } from "ws"; +import { EventEmitter } from "events"; +import { + streamText, + type LanguageModel, + stepCountIs, + type Tool, + type ModelMessage, + type TranscriptionModel, + type SpeechModel, +} from "ai"; +import { + type StreamingSpeechConfig, + type HistoryConfig, +} from "./types"; +import { + WebSocketManager, + SpeechManager, + ConversationManager, + TranscriptionManager, + InputQueue, + type QueueItem, + processFullStream, + handleStreamChunk, +} from "./core"; + +// ── Video-specific types ──────────────────────────────── + +/** + * Trigger reasons for frame capture + */ +type FrameTriggerReason = "scene_change" | "user_request" | "timer" | "initial"; + +/** + * Video frame data structure sent to/from the client + */ +interface VideoFrame { + type: "video_frame"; + sessionId: string; + sequence: number; + timestamp: number; + triggerReason: FrameTriggerReason; + previousFrameRef?: string; + image: { + data: string; + format: string; + width: number; + height: number; + }; +} + +/** + * Audio data structure + */ +interface AudioData { + type: "audio"; + sessionId: string; + data: string; + format: string; + sampleRate?: number; + duration?: number; + timestamp: number; +} + +/** + * Backend configuration for video processing + */ +interface VideoAgentConfig { + /** Maximum frames to keep in context buffer for conversation history */ + maxContextFrames: number; +} + +/** + * Frame context for maintaining visual conversation history + */ +interface FrameContext { + sequence: number; + timestamp: number; + triggerReason: FrameTriggerReason; + frameHash: string; + description?: string; +} + +/** Default maximum frame input size (5 MB) */ +const DEFAULT_MAX_FRAME_SIZE = 5 * 1024 * 1024; + +/** Default video agent config */ +const DEFAULT_VIDEO_AGENT_CONFIG: VideoAgentConfig = { + maxContextFrames: 10, +}; + +// ── Options & queue item ──────────────────────────────── + +export interface VideoAgentOptions { + /** + * AI SDK Model for chat. Must be a vision-enabled model (e.g., openai('gpt-4o'), + * anthropic('claude-3.5-sonnet'), google('gemini-1.5-pro')) to process video frames. + */ + model: LanguageModel; + transcriptionModel?: TranscriptionModel; + speechModel?: SpeechModel; + instructions?: string; + stopWhen?: NonNullable[0]["stopWhen"]>; + tools?: Record; + endpoint?: string; + voice?: string; + speechInstructions?: string; + outputFormat?: string; + streamingSpeech?: Partial; + history?: Partial; + maxAudioInputSize?: number; + /** Maximum frame input size in bytes (default: 5 MB) */ + maxFrameInputSize?: number; + /** Maximum frames to keep in context buffer (default: 10) */ + maxContextFrames?: number; + /** Session ID for this video agent instance */ + sessionId?: string; +} + +/** Shape of items in the video agent's input queue */ +interface VideoInputItem extends QueueItem { + text?: string; + frame?: VideoFrame; +} + +// ── VideoAgent class ──────────────────────────────────── + +export class VideoAgent extends EventEmitter { + private model: LanguageModel; + private instructions: string; + private stopWhen: NonNullable[0]["stopWhen"]>; + private endpoint?: string; + private tools: Record = {}; + private isDestroyed = false; + private _isProcessing = false; + + // Abort controller for the current LLM stream + private currentStreamAbortController?: AbortController; + + // ── Managers ───────────────────────────────────────── + private ws: WebSocketManager; + private speech: SpeechManager; + private conversation: ConversationManager; + private transcription: TranscriptionManager; + private inputQueue: InputQueue; + + // ── Video-specific state ──────────────────────────── + private sessionId: string; + private frameSequence = 0; + private lastFrameTimestamp = 0; + private lastFrameHash?: string; + private frameContextBuffer: FrameContext[] = []; + private currentFrameData?: string; + private videoConfig: VideoAgentConfig; + private maxFrameInputSize: number; + + constructor(options: VideoAgentOptions) { + super(); + this.model = options.model; + this.instructions = + options.instructions || + `You are a helpful multimodal AI assistant that can see through the user's camera and hear their voice. +When analyzing images, be concise but informative. Describe what you see when asked. +Keep responses conversational since they will be spoken aloud. +Use tools when needed to provide accurate information.`; + this.stopWhen = options.stopWhen || stepCountIs(5); + this.endpoint = options.endpoint; + this.maxFrameInputSize = options.maxFrameInputSize ?? DEFAULT_MAX_FRAME_SIZE; + this.sessionId = options.sessionId || this.generateSessionId(); + this.videoConfig = { + ...DEFAULT_VIDEO_AGENT_CONFIG, + maxContextFrames: + options.maxContextFrames ?? DEFAULT_VIDEO_AGENT_CONFIG.maxContextFrames, + }; + if (options.tools) { + this.tools = { ...options.tools }; + } + + // ── Initialize managers ───────────────────────── + this.ws = new WebSocketManager(); + this.speech = new SpeechManager({ + speechModel: options.speechModel, + voice: options.voice, + speechInstructions: options.speechInstructions, + outputFormat: options.outputFormat, + streamingSpeech: options.streamingSpeech, + }); + this.conversation = new ConversationManager({ + history: options.history, + }); + this.transcription = new TranscriptionManager({ + transcriptionModel: options.transcriptionModel, + maxAudioInputSize: options.maxAudioInputSize, + }); + this.inputQueue = new InputQueue(); + + // ── Wire managers to WebSocket send ───────────── + const sendMsg = (msg: Record) => this.ws.send(msg); + this.speech.sendMessage = sendMsg; + this.transcription.sendMessage = sendMsg; + + // ── Wire input queue processor ────────────────── + this.inputQueue.processor = (item) => this.processQueueItem(item); + + // ── Bubble events from managers ───────────────── + this.bubbleEvents(this.ws, ["connected", "error"]); + this.bubbleEvents(this.speech, [ + "speech_start", + "speech_complete", + "speech_interrupted", + "speech_chunk_queued", + "audio_chunk", + "audio", + "error", + ]); + this.bubbleEvents(this.conversation, [ + "history_cleared", + "history_trimmed", + ]); + this.bubbleEvents(this.transcription, [ + "transcription", + "audio_received", + "error", + "warning", + ]); + + // ── Handle WebSocket lifecycle ────────────────── + this.ws.on("disconnected", () => { + this.cleanupOnDisconnect(); + this.emit("disconnected"); + }); + + this.ws.on("message", (message: any) => this.handleMessage(message)); + } + + // ══════════════════════════════════════════════════════ + // Public API + // ══════════════════════════════════════════════════════ + + public registerTools(tools: Record) { + this.tools = { ...this.tools, ...tools }; + } + + public async transcribeAudio(audioData: Buffer | Uint8Array): Promise { + return this.transcription.transcribeAudio(audioData); + } + + public async generateSpeechFromText( + text: string, + abortSignal?: AbortSignal + ): Promise { + return this.speech.generateSpeechFromText(text, abortSignal); + } + + public interruptSpeech(reason: string = "interrupted"): void { + this.speech.interruptSpeech(reason); + } + + public interruptCurrentResponse(reason: string = "interrupted"): void { + if (this.currentStreamAbortController) { + this.currentStreamAbortController.abort(); + this.currentStreamAbortController = undefined; + } + this.speech.interruptSpeech(reason); + } + + public async connect(url?: string): Promise { + this.ensureNotDestroyed(); + const wsUrl = url || this.endpoint || "ws://localhost:8080"; + await this.ws.connect(wsUrl); + } + + public handleSocket(socket: WebSocket): void { + this.ensureNotDestroyed(); + this.ws.handleSocket(socket); + } + + public async sendText(text: string): Promise { + this.ensureNotDestroyed(); + if (!text || !text.trim()) { + throw new Error("Text input cannot be empty"); + } + return this.enqueueTextInput(text); + } + + public async sendAudio(audioData: string): Promise { + this.ensureNotDestroyed(); + await this.handleAudioInput(audioData); + } + + public async sendAudioBuffer(audioBuffer: Buffer | Uint8Array): Promise { + this.ensureNotDestroyed(); + const base64Audio = Buffer.from(audioBuffer).toString("base64"); + await this.handleAudioInput(base64Audio); + } + + /** + * Send a video frame with optional text query for vision analysis + */ + public async sendFrame( + frameData: string, + query?: string, + options?: { width?: number; height?: number; format?: string } + ): Promise { + this.ensureNotDestroyed(); + + const frame: VideoFrame = { + type: "video_frame", + sessionId: this.sessionId, + sequence: this.frameSequence++, + timestamp: Date.now(), + triggerReason: "user_request", + previousFrameRef: this.lastFrameHash, + image: { + data: frameData, + format: options?.format || "webp", + width: options?.width || 640, + height: options?.height || 480, + }, + }; + + // Update local frame state + await this.handleVideoFrame(frame); + + if (query) { + return this.enqueueMultimodalInput(query, frame); + } + + return ""; + } + + /** + * Request client to capture and send a frame + */ + public requestFrameCapture(reason: FrameTriggerReason): void { + this.ws.send({ + type: "capture_frame", + reason, + timestamp: Date.now(), + }); + this.emit("frame_requested", { reason }); + } + + public getConfig(): VideoAgentConfig { + return { ...this.videoConfig }; + } + + public updateConfig(config: Partial): void { + this.videoConfig = { ...this.videoConfig, ...config }; + this.emit("config_changed", this.videoConfig); + } + + startListening() { + this.emit("listening"); + } + + stopListening() { + this.emit("stopped"); + } + + clearHistory() { + this.conversation.clearHistory(); + this.frameContextBuffer = []; + } + + getHistory(): ModelMessage[] { + return this.conversation.getHistory(); + } + + setHistory(history: ModelMessage[]) { + this.conversation.setHistory(history); + } + + getFrameContext(): FrameContext[] { + return [...this.frameContextBuffer]; + } + + getSessionId(): string { + return this.sessionId; + } + + disconnect() { + this.ws.disconnect(); + } + + destroy() { + this.isDestroyed = true; + this.cleanupOnDisconnect(); + this.ws.disconnect(); + this.conversation.clearHistory(); + this.frameContextBuffer = []; + this.tools = {}; + this.removeAllListeners(); + } + + // ── Getters ───────────────────────────────────────── + + get connected(): boolean { + return this.ws.isConnected; + } + + get processing(): boolean { + return this._isProcessing; + } + + get speaking(): boolean { + return this.speech.isSpeaking; + } + + get pendingSpeechChunks(): number { + return this.speech.pendingChunkCount; + } + + get destroyed(): boolean { + return this.isDestroyed; + } + + get currentFrameSequence(): number { + return this.frameSequence; + } + + get hasVisualContext(): boolean { + return !!this.currentFrameData; + } + + // ══════════════════════════════════════════════════════ + // Private — message handling + // ══════════════════════════════════════════════════════ + + private async handleMessage(message: any): Promise { + try { + switch (message.type) { + case "transcript": + if (typeof message.text !== "string" || !message.text.trim()) { + this.emit("warning", "Received empty or invalid transcript message"); + return; + } + this.interruptCurrentResponse("user_speaking"); + this.requestFrameCapture("user_request"); + await this.enqueueTextInput(message.text); + break; + + case "audio": + if (typeof message.data !== "string" || !message.data) { + this.emit("warning", "Received empty or invalid audio message"); + return; + } + this.interruptCurrentResponse("user_speaking"); + this.requestFrameCapture("user_request"); + try { + await this.handleAudioInput(message.data, message.format); + } catch (audioError) { + this.emit("error", audioError); + } + break; + + case "video_frame": + await this.handleVideoFrame(message); + break; + + case "interrupt": + this.interruptCurrentResponse(message.reason || "client_request"); + break; + + case "client_ready": + this.handleClientReady(message); + break; + } + } catch (err) { + this.emit("error", err); + } + } + + private handleClientReady(message: any): void { + this.ws.send({ + type: "session_init", + sessionId: this.sessionId, + }); + this.emit("client_ready", message.capabilities); + } + + // ══════════════════════════════════════════════════════ + // Private — audio + // ══════════════════════════════════════════════════════ + + private async handleAudioInput( + base64Audio: string, + format?: string + ): Promise { + const text = await this.transcription.processAudioInput(base64Audio, format); + if (text) { + await this.enqueueTextInput(text); + } + } + + // ══════════════════════════════════════════════════════ + // Private — video frames + // ══════════════════════════════════════════════════════ + + private async handleVideoFrame(frame: VideoFrame): Promise { + try { + if (!frame.image?.data) { + this.emit("warning", "Received empty or invalid video frame"); + return; + } + + const frameSize = Buffer.from(frame.image.data, "base64").length; + if (frameSize > this.maxFrameInputSize) { + const sizeMB = (frameSize / (1024 * 1024)).toFixed(1); + const maxMB = (this.maxFrameInputSize / (1024 * 1024)).toFixed(1); + this.emit( + "error", + new Error(`Frame too large (${sizeMB} MB). Maximum allowed: ${maxMB} MB`) + ); + return; + } + + const frameHash = this.hashFrame(frame.image.data); + this.lastFrameTimestamp = frame.timestamp; + this.lastFrameHash = frameHash; + this.currentFrameData = frame.image.data; + + this.addFrameToContext({ + sequence: frame.sequence, + timestamp: frame.timestamp, + triggerReason: frame.triggerReason, + frameHash, + }); + + this.emit("frame_received", { + sequence: frame.sequence, + timestamp: frame.timestamp, + triggerReason: frame.triggerReason, + size: frameSize, + dimensions: { width: frame.image.width, height: frame.image.height }, + }); + + this.ws.send({ + type: "frame_ack", + sequence: frame.sequence, + timestamp: Date.now(), + }); + } catch (error) { + this.emit("error", error); + } + } + + private addFrameToContext(context: FrameContext): void { + this.frameContextBuffer.push(context); + if (this.frameContextBuffer.length > this.videoConfig.maxContextFrames) { + this.frameContextBuffer.shift(); + } + } + + private hashFrame(data: string): string { + let hash = 0; + for (let i = 0; i < data.length; i++) { + const char = data.charCodeAt(i); + hash = ((hash << 5) - hash) + char; + hash = hash & hash; + } + return `frame_${this.frameSequence}_${Math.abs(hash).toString(16)}`; + } + + private generateSessionId(): string { + const timestamp = Date.now().toString(36); + const randomPart = Math.random().toString(36).substring(2, 10); + return `vs_${timestamp}_${randomPart}`; + } + + // ══════════════════════════════════════════════════════ + // Private — input queue + // ══════════════════════════════════════════════════════ + + private enqueueTextInput(text: string): Promise { + return new Promise((resolve, reject) => { + this.inputQueue.enqueue({ text, resolve, reject }); + }); + } + + private enqueueMultimodalInput(text: string, frame: VideoFrame): Promise { + return new Promise((resolve, reject) => { + this.inputQueue.enqueue({ text, frame, resolve, reject }); + }); + } + + /** + * Route queued items to the correct processor. + */ + private async processQueueItem(item: VideoInputItem): Promise { + if (item.frame && item.text) { + return this.processMultimodalInput(item.text, item.frame); + } else if (item.text) { + return this.processUserInput(item.text); + } + return ""; + } + + // ══════════════════════════════════════════════════════ + // Private — multimodal content building + // ══════════════════════════════════════════════════════ + + private buildMultimodalContent( + text: string, + frameData?: string + ): Array<{ type: "text"; text: string } | { type: "image"; image: string }> { + const content: Array< + { type: "text"; text: string } | { type: "image"; image: string } + > = []; + + if (this.frameContextBuffer.length > 0) { + const contextSummary = `[Visual context: ${this.frameContextBuffer.length} frames captured, latest at ${new Date(this.lastFrameTimestamp).toISOString()}]`; + content.push({ type: "text", text: contextSummary }); + } + + const imageData = frameData || this.currentFrameData; + if (imageData) { + content.push({ type: "image", image: imageData }); + } + + content.push({ type: "text", text }); + return content; + } + + // ══════════════════════════════════════════════════════ + // Private — LLM processing + // ══════════════════════════════════════════════════════ + + /** + * Shared streamText invocation used by both processUserInput and processMultimodalInput. + */ + private async runStream( + messages: ModelMessage[], + abortSignal: AbortSignal + ): Promise { + const result = streamText({ + model: this.model, + system: this.instructions, + messages, + tools: this.tools, + stopWhen: this.stopWhen, + abortSignal, + onChunk: ({ chunk }) => { + handleStreamChunk(chunk, (event, data) => this.emit(event, data)); + }, + onFinish: async (event) => { + for (const step of event.steps) { + for (const toolResult of step.toolResults) { + this.emit("tool_result", { + name: toolResult.toolName, + toolCallId: toolResult.toolCallId, + result: toolResult.output, + }); + } + } + }, + onError: ({ error }) => { + this.emit("error", error); + }, + }); + + const streamResult = await processFullStream( + result, + { + onTextDelta: (delta) => this.speech.processTextDelta(delta), + onTextEnd: () => this.speech.flushPendingText(), + sendMessage: (msg) => this.ws.send(msg), + emitEvent: (event, data) => this.emit(event, data), + }, + { + sessionId: this.sessionId, + frameContext: + this.frameContextBuffer.length > 0 + ? { + frameCount: this.frameContextBuffer.length, + lastFrameSequence: + this.frameContextBuffer[this.frameContextBuffer.length - 1] + ?.sequence, + } + : undefined, + } + ); + + // Add assistant response to history + if (streamResult.fullText) { + this.conversation.addMessage({ + role: "assistant", + content: streamResult.fullText, + }); + } + + // Flush remaining speech & wait for queue + this.speech.flushPendingText(); + if (this.speech.queueDonePromise) { + await this.speech.queueDonePromise; + } + + return streamResult.fullText; + } + + /** + * Process text-only input (with optional visual context from latest frame). + */ + private async processUserInput(text: string): Promise { + this._isProcessing = true; + this.currentStreamAbortController = new AbortController(); + + try { + this.emit("text", { role: "user", text }); + + const hasVisual = !!this.currentFrameData; + let messages: ModelMessage[]; + + if (hasVisual) { + const content = this.buildMultimodalContent(text); + this.conversation.addMessage({ + role: "user", + content: [{ type: "text", text: `[Visual context] ${text}` }], + }); + messages = [ + ...this.conversation.getHistoryRef().slice(0, -1), + { role: "user", content }, + ]; + } else { + this.conversation.addMessage({ role: "user", content: text }); + messages = this.conversation.getHistoryRef(); + } + + return await this.runStream( + messages, + this.currentStreamAbortController.signal + ); + } catch (error) { + this.speech.reset(); + throw error; + } finally { + this._isProcessing = false; + this.currentStreamAbortController = undefined; + } + } + + /** + * Process multimodal input (text + explicit video frame). + */ + private async processMultimodalInput( + text: string, + frame: VideoFrame + ): Promise { + this._isProcessing = true; + this.currentStreamAbortController = new AbortController(); + + try { + this.emit("text", { role: "user", text, hasImage: true }); + + const content = this.buildMultimodalContent(text, frame.image.data); + + this.conversation.addMessage({ + role: "user", + content: [{ type: "text", text: `[Image attached] ${text}` }], + }); + + const messages: ModelMessage[] = [ + ...this.conversation.getHistoryRef().slice(0, -1), + { role: "user", content }, + ]; + + return await this.runStream( + messages, + this.currentStreamAbortController.signal + ); + } catch (error) { + this.speech.reset(); + throw error; + } finally { + this._isProcessing = false; + this.currentStreamAbortController = undefined; + } + } + + // ══════════════════════════════════════════════════════ + // Private — helpers + // ══════════════════════════════════════════════════════ + + private ensureNotDestroyed(): void { + if (this.isDestroyed) { + throw new Error("VideoAgent has been destroyed and cannot be used"); + } + } + + private cleanupOnDisconnect(): void { + if (this.currentStreamAbortController) { + this.currentStreamAbortController.abort(); + this.currentStreamAbortController = undefined; + } + this.speech.reset(); + this._isProcessing = false; + this.currentFrameData = undefined; + this.inputQueue.rejectAll(new Error("Connection closed")); + } + + private bubbleEvents(source: EventEmitter, events: string[]): void { + for (const event of events) { + source.on(event, (...args: any[]) => this.emit(event, ...args)); + } + } +} + +// Export types for external use +export type { + VideoFrame, + AudioData, + VideoAgentConfig, + FrameContext, + FrameTriggerReason, +}; + +// Re-export shared types +export type { StreamingSpeechConfig, HistoryConfig } from "./types"; \ No newline at end of file diff --git a/src/VideoAgent.ts b/src/VideoAgent.ts index baf72b6..6d65110 100644 --- a/src/VideoAgent.ts +++ b/src/VideoAgent.ts @@ -187,7 +187,7 @@ Use tools when needed to provide accurate information.`; this.endpoint = options.endpoint; this.voice = options.voice || "alloy"; this.speechInstructions = options.speechInstructions; - this.outputFormat = options.outputFormat || "mp3"; + this.outputFormat = options.outputFormat || "opus"; this.maxAudioInputSize = options.maxAudioInputSize ?? DEFAULT_MAX_AUDIO_SIZE; this.maxFrameInputSize = options.maxFrameInputSize ?? DEFAULT_MAX_FRAME_SIZE; diff --git a/src/VoiceAgent.new.ts b/src/VoiceAgent.new.ts new file mode 100644 index 0000000..db6940f --- /dev/null +++ b/src/VoiceAgent.new.ts @@ -0,0 +1,484 @@ +import { WebSocket } from "ws"; +import { EventEmitter } from "events"; +import { + streamText, + type LanguageModel, + stepCountIs, + type Tool, + type ModelMessage, + type TranscriptionModel, + type SpeechModel, +} from "ai"; +import { + type StreamingSpeechConfig, + type HistoryConfig, +} from "./types"; +import { + WebSocketManager, + SpeechManager, + ConversationManager, + TranscriptionManager, + InputQueue, + type QueueItem, + processFullStream, + handleStreamChunk, +} from "./core"; + +export interface VoiceAgentOptions { + model: LanguageModel; + transcriptionModel?: TranscriptionModel; + speechModel?: SpeechModel; + instructions?: string; + stopWhen?: NonNullable[0]["stopWhen"]>; + tools?: Record; + endpoint?: string; + voice?: string; + speechInstructions?: string; + outputFormat?: string; + /** Configuration for streaming speech generation */ + streamingSpeech?: Partial; + /** Configuration for conversation history memory limits */ + history?: Partial; + /** Maximum audio input size in bytes (default: 10 MB) */ + maxAudioInputSize?: number; +} + +/** Shape of items in the voice agent's input queue */ +interface VoiceInputItem extends QueueItem { + text: string; +} + +/** + * A single-session voice agent that manages one WebSocket connection at a time. + * + * **Important:** Each `VoiceAgent` instance holds its own conversation history, + * input queue, speech state, and WebSocket. It is designed for **one user per + * instance**. To support multiple concurrent users, create a separate + * `VoiceAgent` for each connection: + * + * ```ts + * wss.on("connection", (socket) => { + * const agent = new VoiceAgent({ model, ... }); + * agent.handleSocket(socket); + * agent.on("disconnected", () => agent.destroy()); + * }); + * ``` + * + * Sharing a single instance across multiple users will cause conversation + * history cross-contamination, interleaved audio, and unpredictable behavior. + */ +export class VoiceAgent extends EventEmitter { + private model: LanguageModel; + private instructions: string; + private stopWhen: NonNullable[0]["stopWhen"]>; + private endpoint?: string; + private tools: Record = {}; + private isDestroyed = false; + private _isProcessing = false; + + // Abort controller for the current LLM stream + private currentStreamAbortController?: AbortController; + + // ── Managers ────────────────────────────────────────── + private ws: WebSocketManager; + private speech: SpeechManager; + private conversation: ConversationManager; + private transcription: TranscriptionManager; + private inputQueue: InputQueue; + + constructor(options: VoiceAgentOptions) { + super(); + this.model = options.model; + this.instructions = + options.instructions || "You are a helpful voice assistant."; + this.stopWhen = options.stopWhen || stepCountIs(5); + this.endpoint = options.endpoint; + if (options.tools) { + this.tools = { ...options.tools }; + } + + // ── Initialize managers ────────────────────────────── + this.ws = new WebSocketManager(); + this.speech = new SpeechManager({ + speechModel: options.speechModel, + voice: options.voice, + speechInstructions: options.speechInstructions, + outputFormat: options.outputFormat, + streamingSpeech: options.streamingSpeech, + }); + this.conversation = new ConversationManager({ + history: options.history, + }); + this.transcription = new TranscriptionManager({ + transcriptionModel: options.transcriptionModel, + maxAudioInputSize: options.maxAudioInputSize, + }); + this.inputQueue = new InputQueue(); + + // ── Wire managers to the WebSocket send function ───── + const sendMsg = (msg: Record) => this.ws.send(msg); + this.speech.sendMessage = sendMsg; + this.transcription.sendMessage = sendMsg; + + // ── Wire the input queue processor ─────────────────── + this.inputQueue.processor = (item) => this.processUserInput(item.text); + + // ── Bubble events from managers ────────────────────── + this.bubbleEvents(this.ws, [ + "connected", + "error", + ]); + this.bubbleEvents(this.speech, [ + "speech_start", + "speech_complete", + "speech_interrupted", + "speech_chunk_queued", + "audio_chunk", + "audio", + "error", + ]); + this.bubbleEvents(this.conversation, [ + "history_cleared", + "history_trimmed", + ]); + this.bubbleEvents(this.transcription, [ + "transcription", + "audio_received", + "error", + "warning", + ]); + + // ── Handle WebSocket lifecycle events ──────────────── + this.ws.on("disconnected", () => { + this.cleanupOnDisconnect(); + this.emit("disconnected"); + }); + + this.ws.on("message", (message: any) => this.handleMessage(message)); + } + + // ── Public API ──────────────────────────────────────── + + public registerTools(tools: Record) { + this.tools = { ...this.tools, ...tools }; + } + + /** + * Transcribe audio data to text using the configured transcription model. + */ + public async transcribeAudio(audioData: Buffer | Uint8Array): Promise { + return this.transcription.transcribeAudio(audioData); + } + + /** + * Generate speech from text using the configured speech model. + */ + public async generateSpeechFromText( + text: string, + abortSignal?: AbortSignal + ): Promise { + return this.speech.generateSpeechFromText(text, abortSignal); + } + + /** + * Interrupt ongoing speech generation and playback (barge-in support). + */ + public interruptSpeech(reason: string = "interrupted"): void { + this.speech.interruptSpeech(reason); + } + + /** + * Interrupt both the current LLM stream and ongoing speech. + */ + public interruptCurrentResponse(reason: string = "interrupted"): void { + if (this.currentStreamAbortController) { + this.currentStreamAbortController.abort(); + this.currentStreamAbortController = undefined; + } + this.speech.interruptSpeech(reason); + } + + /** + * Connect to a WebSocket server by URL. + */ + public async connect(url?: string): Promise { + this.ensureNotDestroyed(); + const wsUrl = url || this.endpoint || "ws://localhost:8080"; + await this.ws.connect(wsUrl); + } + + /** + * Attach an existing WebSocket (server-side usage). + */ + public handleSocket(socket: WebSocket): void { + this.ensureNotDestroyed(); + this.ws.handleSocket(socket); + } + + /** + * Send text input for processing (bypasses transcription). + */ + public async sendText(text: string): Promise { + this.ensureNotDestroyed(); + if (!text || !text.trim()) { + throw new Error("Text input cannot be empty"); + } + return this.enqueueInput(text); + } + + /** + * Send base64 audio data to be transcribed and processed. + */ + public async sendAudio(audioData: string): Promise { + this.ensureNotDestroyed(); + await this.handleAudioInput(audioData); + } + + /** + * Send raw audio buffer to be transcribed and processed. + */ + public async sendAudioBuffer(audioBuffer: Buffer | Uint8Array): Promise { + this.ensureNotDestroyed(); + const base64Audio = Buffer.from(audioBuffer).toString("base64"); + await this.handleAudioInput(base64Audio); + } + + /** + * Generate speech for full text at once (non-streaming fallback). + */ + public async generateAndSendSpeechFull(text: string): Promise { + return this.speech.generateAndSendSpeechFull(text); + } + + /** Start listening for voice input */ + startListening() { + console.log("Starting voice agent..."); + this.emit("listening"); + } + + /** Stop listening for voice input */ + stopListening() { + console.log("Stopping voice agent..."); + this.emit("stopped"); + } + + /** Clear conversation history */ + clearHistory() { + this.conversation.clearHistory(); + } + + /** Get current conversation history */ + getHistory(): ModelMessage[] { + return this.conversation.getHistory(); + } + + /** Set conversation history (useful for restoring sessions) */ + setHistory(history: ModelMessage[]) { + this.conversation.setHistory(history); + } + + /** Disconnect from WebSocket and stop all in-flight work */ + disconnect() { + this.ws.disconnect(); + } + + /** + * Permanently destroy the agent, releasing all resources. + */ + destroy() { + this.isDestroyed = true; + this.cleanupOnDisconnect(); + this.ws.disconnect(); + this.conversation.clearHistory(); + this.tools = {}; + this.removeAllListeners(); + } + + // ── Getters ─────────────────────────────────────────── + + get connected(): boolean { + return this.ws.isConnected; + } + + get processing(): boolean { + return this._isProcessing; + } + + get speaking(): boolean { + return this.speech.isSpeaking; + } + + get pendingSpeechChunks(): number { + return this.speech.pendingChunkCount; + } + + get destroyed(): boolean { + return this.isDestroyed; + } + + // ── Private: message handling ───────────────────────── + + private async handleMessage(message: any): Promise { + try { + console.log(`Received WebSocket message of type: ${message.type}`); + + if (message.type === "transcript") { + if (typeof message.text !== "string" || !message.text.trim()) { + this.emit("warning", "Received empty or invalid transcript message"); + return; + } + this.interruptCurrentResponse("user_speaking"); + console.log(`Processing transcript: "${message.text}"`); + await this.enqueueInput(message.text); + } else if (message.type === "audio") { + if (typeof message.data !== "string" || !message.data) { + this.emit("warning", "Received empty or invalid audio message"); + return; + } + this.interruptCurrentResponse("user_speaking"); + console.log( + `Received audio data (${message.data.length / 1000}KB) for processing, format: ${message.format || "unknown"}` + ); + await this.handleAudioInput(message.data, message.format); + } else if (message.type === "interrupt") { + console.log( + `Received interrupt request: ${message.reason || "client_request"}` + ); + this.interruptCurrentResponse(message.reason || "client_request"); + } + } catch (err) { + console.error("Failed to process message:", err); + this.emit("error", err); + } + } + + // ── Private: audio ──────────────────────────────────── + + private async handleAudioInput( + base64Audio: string, + format?: string + ): Promise { + const text = await this.transcription.processAudioInput( + base64Audio, + format + ); + if (text) { + await this.enqueueInput(text); + } + } + + // ── Private: input queue ────────────────────────────── + + private enqueueInput(text: string): Promise { + return new Promise((resolve, reject) => { + this.inputQueue.enqueue({ text, resolve, reject }); + }); + } + + // ── Private: LLM processing ─────────────────────────── + + /** + * Process user input with streaming text generation. + * Called serially by the input queue. + */ + private async processUserInput(text: string): Promise { + this._isProcessing = true; + this.currentStreamAbortController = new AbortController(); + const streamAbortSignal = this.currentStreamAbortController.signal; + + try { + this.emit("text", { role: "user", text }); + + this.conversation.addMessage({ role: "user", content: text }); + + const result = streamText({ + model: this.model, + system: this.instructions, + messages: this.conversation.getHistoryRef(), + tools: this.tools, + stopWhen: this.stopWhen, + abortSignal: streamAbortSignal, + onChunk: ({ chunk }) => { + handleStreamChunk(chunk, (event, data) => this.emit(event, data)); + }, + onFinish: async (event) => { + for (const step of event.steps) { + for (const toolResult of step.toolResults) { + this.emit("tool_result", { + name: toolResult.toolName, + toolCallId: toolResult.toolCallId, + result: toolResult.output, + }); + } + } + }, + onError: ({ error }) => { + console.error("Stream error:", error); + this.emit("error", error); + }, + }); + + const streamResult = await processFullStream(result, { + onTextDelta: (delta) => this.speech.processTextDelta(delta), + onTextEnd: () => this.speech.flushPendingText(), + sendMessage: (msg) => this.ws.send(msg), + emitEvent: (event, data) => this.emit(event, data), + }); + + // Add assistant response to history + if (streamResult.fullText) { + this.conversation.addMessage({ + role: "assistant", + content: streamResult.fullText, + }); + } + + // Flush any remaining speech + this.speech.flushPendingText(); + + // Wait for all speech chunks to complete + if (this.speech.queueDonePromise) { + await this.speech.queueDonePromise; + } + + return streamResult.fullText; + } catch (error) { + // Clean up speech state on error + this.speech.reset(); + throw error; + } finally { + this._isProcessing = false; + this.currentStreamAbortController = undefined; + } + } + + // ── Private: helpers ────────────────────────────────── + + private ensureNotDestroyed(): void { + if (this.isDestroyed) { + throw new Error("VoiceAgent has been destroyed and cannot be used"); + } + } + + /** + * Clean up all in-flight state when the connection drops. + */ + private cleanupOnDisconnect(): void { + if (this.currentStreamAbortController) { + this.currentStreamAbortController.abort(); + this.currentStreamAbortController = undefined; + } + this.speech.reset(); + this._isProcessing = false; + this.inputQueue.rejectAll(new Error("Connection closed")); + } + + /** + * Forward select events from a child emitter to this agent. + */ + private bubbleEvents(source: EventEmitter, events: string[]): void { + for (const event of events) { + source.on(event, (...args: any[]) => this.emit(event, ...args)); + } + } +} diff --git a/src/VoiceAgent.ts b/src/VoiceAgent.ts index 2a20753..b3c5a68 100644 --- a/src/VoiceAgent.ts +++ b/src/VoiceAgent.ts @@ -39,6 +39,25 @@ export interface VoiceAgentOptions { maxAudioInputSize?: number; } +/** + * A single-session voice agent that manages one WebSocket connection at a time. + * + * **Important:** Each `VoiceAgent` instance holds its own conversation history, + * input queue, speech state, and WebSocket. It is designed for **one user per + * instance**. To support multiple concurrent users, create a separate + * `VoiceAgent` for each connection: + * + * ```ts + * wss.on("connection", (socket) => { + * const agent = new VoiceAgent({ model, ... }); + * agent.handleSocket(socket); + * agent.on("disconnected", () => agent.destroy()); + * }); + * ``` + * + * Sharing a single instance across multiple users will cause conversation + * history cross-contamination, interleaved audio, and unpredictable behavior. + */ export class VoiceAgent extends EventEmitter { private socket?: WebSocket; private tools: Record = {}; @@ -90,7 +109,7 @@ export class VoiceAgent extends EventEmitter { this.endpoint = options.endpoint; this.voice = options.voice || "alloy"; this.speechInstructions = options.speechInstructions; - this.outputFormat = options.outputFormat || "mp3"; + this.outputFormat = options.outputFormat || "opus"; this.maxAudioInputSize = options.maxAudioInputSize ?? DEFAULT_MAX_AUDIO_SIZE; if (options.tools) { this.tools = { ...options.tools }; @@ -695,6 +714,10 @@ export class VoiceAgent extends EventEmitter { * Attach an existing WebSocket (server-side usage). * Use this when a WS server accepts a connection and you want the * agent to handle messages on that socket. + * + * **Note:** Calling this while a socket is already attached will cleanly + * tear down the previous connection first. Each `VoiceAgent` instance + * supports only one socket at a time — create a new agent per user. */ public handleSocket(socket: WebSocket): void { this.ensureNotDestroyed(); diff --git a/src/core/ConversationManager.ts b/src/core/ConversationManager.ts new file mode 100644 index 0000000..a42b805 --- /dev/null +++ b/src/core/ConversationManager.ts @@ -0,0 +1,122 @@ +import { EventEmitter } from "events"; +import { type ModelMessage } from "ai"; +import { type HistoryConfig, DEFAULT_HISTORY_CONFIG } from "../types"; + +export interface ConversationManagerOptions { + history?: Partial; +} + +/** + * Manages conversation history (ModelMessage[]) with configurable + * limits on message count and total character size. + */ +export class ConversationManager extends EventEmitter { + private conversationHistory: ModelMessage[] = []; + private historyConfig: HistoryConfig; + + constructor(options: ConversationManagerOptions = {}) { + super(); + this.historyConfig = { + ...DEFAULT_HISTORY_CONFIG, + ...options.history, + }; + } + + /** + * Add a message to history and trim if needed. + */ + addMessage(message: ModelMessage): void { + this.conversationHistory.push(message); + this.trimHistory(); + } + + /** + * Get a copy of the current history. + */ + getHistory(): ModelMessage[] { + return [...this.conversationHistory]; + } + + /** + * Get a direct reference to the history array. + * Use with caution — prefer getHistory() for safety. + */ + getHistoryRef(): ModelMessage[] { + return this.conversationHistory; + } + + /** + * Replace the entire conversation history. + */ + setHistory(history: ModelMessage[]): void { + this.conversationHistory = [...history]; + } + + /** + * Clear all conversation history. + */ + clearHistory(): void { + this.conversationHistory = []; + this.emit("history_cleared"); + } + + /** + * Get the number of messages in history. + */ + get length(): number { + return this.conversationHistory.length; + } + + /** + * Trim conversation history to stay within configured limits. + * Removes oldest messages (always in pairs to preserve user/assistant turns). + */ + private trimHistory(): void { + const { maxMessages, maxTotalChars } = this.historyConfig; + + // Trim by message count + if (maxMessages > 0 && this.conversationHistory.length > maxMessages) { + const excess = this.conversationHistory.length - maxMessages; + // Round up to even number to preserve turn pairs + const toRemove = excess % 2 === 0 ? excess : excess + 1; + this.conversationHistory.splice(0, toRemove); + this.emit("history_trimmed", { + removedCount: toRemove, + reason: "max_messages", + }); + } + + // Trim by total character count + if (maxTotalChars > 0) { + let totalChars = this.conversationHistory.reduce((sum, msg) => { + const content = + typeof msg.content === "string" + ? msg.content + : JSON.stringify(msg.content); + return sum + content.length; + }, 0); + + let removedCount = 0; + while ( + totalChars > maxTotalChars && + this.conversationHistory.length > 2 + ) { + const removed = this.conversationHistory.shift(); + if (removed) { + const content = + typeof removed.content === "string" + ? removed.content + : JSON.stringify(removed.content); + totalChars -= content.length; + removedCount++; + } + } + if (removedCount > 0) { + this.emit("history_trimmed", { + removedCount, + reason: "max_total_chars", + }); + } + } + } +} diff --git a/src/core/InputQueue.ts b/src/core/InputQueue.ts new file mode 100644 index 0000000..511323e --- /dev/null +++ b/src/core/InputQueue.ts @@ -0,0 +1,71 @@ +/** + * A generic serial input queue that ensures only one processor runs at a time. + * + * @template T The shape of each queued item (must include resolve/reject) + */ +export interface QueueItem { + resolve: (v: T) => void; + reject: (e: unknown) => void; +} + +export class InputQueue> { + private queue: T[] = []; + private processing = false; + + /** Callback invoked for each item — must return a resolved value */ + public processor: (item: T) => Promise = async () => ""; + + /** + * Enqueue an item for serial processing. + */ + enqueue(item: T): void { + this.queue.push(item); + this.drain(); + } + + /** + * Reject all pending items (used on disconnect/destroy). + */ + rejectAll(reason: Error): void { + for (const item of this.queue) { + item.reject(reason); + } + this.queue = []; + this.processing = false; + } + + /** + * Number of items waiting in the queue. + */ + get length(): number { + return this.queue.length; + } + + /** + * Whether the queue is currently processing an item. + */ + get isProcessing(): boolean { + return this.processing; + } + + // ── Private ────────────────────────────────────────── + + private async drain(): Promise { + if (this.processing) return; + this.processing = true; + + try { + while (this.queue.length > 0) { + const item = this.queue.shift()!; + try { + const result = await this.processor(item); + item.resolve(result); + } catch (error) { + item.reject(error); + } + } + } finally { + this.processing = false; + } + } +} diff --git a/src/core/SpeechManager.ts b/src/core/SpeechManager.ts new file mode 100644 index 0000000..4a9efac --- /dev/null +++ b/src/core/SpeechManager.ts @@ -0,0 +1,453 @@ +import { EventEmitter } from "events"; +import { + experimental_generateSpeech as generateSpeech, + type SpeechModel, +} from "ai"; +import { + type SpeechChunk, + type StreamingSpeechConfig, + DEFAULT_STREAMING_SPEECH_CONFIG, +} from "../types"; + +export interface SpeechManagerOptions { + speechModel?: SpeechModel; + voice?: string; + speechInstructions?: string; + outputFormat?: string; + streamingSpeech?: Partial; +} + +/** + * Manages text-to-speech generation, streaming speech chunking, + * parallel TTS requests, and speech interruption. + */ +export class SpeechManager extends EventEmitter { + private speechModel?: SpeechModel; + private voice: string; + private speechInstructions?: string; + private outputFormat: string; + private streamingSpeechConfig: StreamingSpeechConfig; + + private currentSpeechAbortController?: AbortController; + private speechChunkQueue: SpeechChunk[] = []; + private nextChunkId = 0; + private _isSpeaking = false; + private pendingTextBuffer = ""; + + // Promise-based signal for speech queue completion + private speechQueueDonePromise?: Promise; + private speechQueueDoneResolve?: () => void; + + /** Callback to send messages over the WebSocket */ + public sendMessage: (message: Record) => void = () => { }; + + constructor(options: SpeechManagerOptions) { + super(); + this.speechModel = options.speechModel; + this.voice = options.voice || "alloy"; + this.speechInstructions = options.speechInstructions; + this.outputFormat = options.outputFormat || "opus"; + this.streamingSpeechConfig = { + ...DEFAULT_STREAMING_SPEECH_CONFIG, + ...options.streamingSpeech, + }; + } + + get isSpeaking(): boolean { + return this._isSpeaking; + } + + get pendingChunkCount(): number { + return this.speechChunkQueue.length; + } + + get hasSpeechModel(): boolean { + return !!this.speechModel; + } + + /** + * Returns a promise that resolves when the speech queue is fully drained. + * Returns undefined if there is nothing queued. + */ + get queueDonePromise(): Promise | undefined { + return this.speechQueueDonePromise; + } + + /** + * Generate speech from text using the configured speech model. + */ + async generateSpeechFromText( + text: string, + abortSignal?: AbortSignal + ): Promise { + if (!this.speechModel) { + throw new Error("Speech model not configured"); + } + + const result = await generateSpeech({ + model: this.speechModel, + text, + voice: this.voice, + instructions: this.speechInstructions, + outputFormat: this.outputFormat, + abortSignal, + }); + + return result.audio.uint8Array; + } + + /** + * Generate speech for full text at once (non-streaming fallback). + */ + async generateAndSendSpeechFull(text: string): Promise { + if (!this.speechModel) return; + + try { + this.emit("speech_start", { text, streaming: false }); + + const audioData = await this.generateSpeechFromText(text); + const base64Audio = Buffer.from(audioData).toString("base64"); + + this.sendMessage({ + type: "audio", + data: base64Audio, + format: this.outputFormat, + }); + + this.emit("audio", { + data: base64Audio, + format: this.outputFormat, + uint8Array: audioData, + }); + + this.emit("speech_complete", { text, streaming: false }); + } catch (error) { + console.error("Failed to generate speech:", error); + this.emit("error", error); + } + } + + /** + * Interrupt ongoing speech generation and playback (barge-in support). + */ + interruptSpeech(reason: string = "interrupted"): void { + if (!this._isSpeaking && this.speechChunkQueue.length === 0) { + return; + } + + // Abort any pending speech generation requests + if (this.currentSpeechAbortController) { + this.currentSpeechAbortController.abort(); + this.currentSpeechAbortController = undefined; + } + + // Clear the speech queue + this.speechChunkQueue = []; + this.pendingTextBuffer = ""; + this._isSpeaking = false; + + // Resolve any pending speech-done waiters so callers can finish + if (this.speechQueueDoneResolve) { + this.speechQueueDoneResolve(); + this.speechQueueDoneResolve = undefined; + this.speechQueueDonePromise = undefined; + } + + // Notify clients to stop audio playback + this.sendMessage({ + type: "speech_interrupted", + reason, + }); + + this.emit("speech_interrupted", { reason }); + } + + /** + * Process a text delta for streaming speech. + * Call this as text chunks arrive from the LLM. + */ + processTextDelta(textDelta: string): void { + if (!this.speechModel) return; + + this.pendingTextBuffer += textDelta; + + const [sentences, remaining] = this.extractSentences(this.pendingTextBuffer); + this.pendingTextBuffer = remaining; + + for (const sentence of sentences) { + this.queueSpeechChunk(sentence); + } + } + + /** + * Flush any remaining text in the buffer to speech. + * Call this when the LLM stream ends. + */ + flushPendingText(): void { + if (!this.speechModel || !this.pendingTextBuffer.trim()) return; + + this.queueSpeechChunk(this.pendingTextBuffer); + this.pendingTextBuffer = ""; + } + + /** + * Reset all speech state (used on disconnect / cleanup). + */ + reset(): void { + if (this.currentSpeechAbortController) { + this.currentSpeechAbortController.abort(); + this.currentSpeechAbortController = undefined; + } + this.speechChunkQueue = []; + this.pendingTextBuffer = ""; + this._isSpeaking = false; + + if (this.speechQueueDoneResolve) { + this.speechQueueDoneResolve(); + this.speechQueueDoneResolve = undefined; + this.speechQueueDonePromise = undefined; + } + } + + // ── Private helpers ───────────────────────────────────────── + + /** + * Extract complete sentences from text buffer. + * Returns [extractedSentences, remainingBuffer]. + */ + private extractSentences(text: string): [string[], string] { + const sentences: string[] = []; + let remaining = text; + + // Match sentences ending with . ! ? followed by space or end of string + const sentenceEndPattern = /[.!?]+(?:\s+|$)/g; + let lastIndex = 0; + let match; + + while ((match = sentenceEndPattern.exec(text)) !== null) { + const sentence = text + .slice(lastIndex, match.index + match[0].length) + .trim(); + if (sentence.length >= this.streamingSpeechConfig.minChunkSize) { + sentences.push(sentence); + lastIndex = match.index + match[0].length; + } else if (sentences.length > 0) { + // Append short sentence to previous one + sentences[sentences.length - 1] += " " + sentence; + lastIndex = match.index + match[0].length; + } + } + + remaining = text.slice(lastIndex); + + // If remaining text is too long, force split at clause boundaries + if (remaining.length > this.streamingSpeechConfig.maxChunkSize) { + const clausePattern = /[,;:]\s+/g; + let clauseMatch; + let splitIndex = 0; + + while ((clauseMatch = clausePattern.exec(remaining)) !== null) { + if (clauseMatch.index >= this.streamingSpeechConfig.minChunkSize) { + splitIndex = clauseMatch.index + clauseMatch[0].length; + break; + } + } + + if (splitIndex > 0) { + sentences.push(remaining.slice(0, splitIndex).trim()); + remaining = remaining.slice(splitIndex); + } + } + + return [sentences, remaining]; + } + + /** + * Queue a text chunk for speech generation. + */ + private queueSpeechChunk(text: string): void { + if (!this.speechModel || !text.trim()) return; + + // Wrap chunk ID to prevent unbounded growth in very long sessions + if (this.nextChunkId >= Number.MAX_SAFE_INTEGER) { + this.nextChunkId = 0; + } + + const chunk: SpeechChunk = { + id: this.nextChunkId++, + text: text.trim(), + }; + + // Create the speech-done promise if not already present + if (!this.speechQueueDonePromise) { + this.speechQueueDonePromise = new Promise((resolve) => { + this.speechQueueDoneResolve = resolve; + }); + } + + // Start generating audio immediately (parallel generation) + if (this.streamingSpeechConfig.parallelGeneration) { + const activeRequests = this.speechChunkQueue.filter( + (c) => c.audioPromise + ).length; + + if (activeRequests < this.streamingSpeechConfig.maxParallelRequests) { + chunk.audioPromise = this.generateChunkAudio(chunk); + } + } + + this.speechChunkQueue.push(chunk); + this.emit("speech_chunk_queued", { id: chunk.id, text: chunk.text }); + + // Start processing queue if not already + if (!this._isSpeaking) { + this.processSpeechQueue(); + } + } + + /** + * Generate audio for a single chunk. + */ + private async generateChunkAudio( + chunk: SpeechChunk + ): Promise { + if (!this.currentSpeechAbortController) { + this.currentSpeechAbortController = new AbortController(); + } + + try { + console.log( + `Generating audio for chunk ${chunk.id}: "${chunk.text.substring(0, 50)}${chunk.text.length > 50 ? "..." : ""}"` + ); + const audioData = await this.generateSpeechFromText( + chunk.text, + this.currentSpeechAbortController.signal + ); + console.log( + `Generated audio for chunk ${chunk.id}: ${audioData.length} bytes` + ); + return audioData; + } catch (error) { + if ((error as Error).name === "AbortError") { + console.log(`Audio generation aborted for chunk ${chunk.id}`); + return null; + } + console.error( + `Failed to generate audio for chunk ${chunk.id}:`, + error + ); + this.emit("error", error); + return null; + } + } + + /** + * Process the speech queue and send audio chunks in order. + */ + private async processSpeechQueue(): Promise { + if (this._isSpeaking) return; + this._isSpeaking = true; + + console.log( + `Starting speech queue processing with ${this.speechChunkQueue.length} chunks` + ); + this.emit("speech_start", { streaming: true }); + this.sendMessage({ type: "speech_stream_start" }); + + try { + while (this.speechChunkQueue.length > 0) { + const chunk = this.speechChunkQueue[0]; + + console.log( + `Processing speech chunk #${chunk.id} (${this.speechChunkQueue.length - 1} remaining)` + ); + + // Ensure audio generation has started + if (!chunk.audioPromise) { + chunk.audioPromise = this.generateChunkAudio(chunk); + } + + // Wait for this chunk's audio + const audioData = await chunk.audioPromise; + + // Check if we were interrupted while waiting + if (!this._isSpeaking) { + console.log(`Speech interrupted during chunk #${chunk.id}`); + break; + } + + // Remove from queue after processing + this.speechChunkQueue.shift(); + + if (audioData) { + const base64Audio = Buffer.from(audioData).toString("base64"); + console.log( + `Sending audio chunk #${chunk.id} (${audioData.length} bytes, ${this.outputFormat})` + ); + + // Send audio chunk via WebSocket + this.sendMessage({ + type: "audio_chunk", + chunkId: chunk.id, + data: base64Audio, + format: this.outputFormat, + text: chunk.text, + }); + + // Emit for local handling + this.emit("audio_chunk", { + chunkId: chunk.id, + data: base64Audio, + format: this.outputFormat, + text: chunk.text, + uint8Array: audioData, + }); + } else { + console.log(`No audio data generated for chunk #${chunk.id}`); + } + + // Start generating next chunks in parallel + if (this.streamingSpeechConfig.parallelGeneration) { + const activeRequests = this.speechChunkQueue.filter( + (c) => c.audioPromise + ).length; + const toStart = Math.min( + this.streamingSpeechConfig.maxParallelRequests - activeRequests, + this.speechChunkQueue.length + ); + + if (toStart > 0) { + console.log( + `Starting parallel generation for ${toStart} more chunks` + ); + for (let i = 0; i < toStart; i++) { + const nextChunk = this.speechChunkQueue.find( + (c) => !c.audioPromise + ); + if (nextChunk) { + nextChunk.audioPromise = this.generateChunkAudio(nextChunk); + } + } + } + } + } + } catch (error) { + console.error("Error in speech queue processing:", error); + this.emit("error", error); + } finally { + this._isSpeaking = false; + this.currentSpeechAbortController = undefined; + + // Signal that the speech queue is fully drained + if (this.speechQueueDoneResolve) { + this.speechQueueDoneResolve(); + this.speechQueueDoneResolve = undefined; + this.speechQueueDonePromise = undefined; + } + + console.log(`Speech queue processing complete`); + this.sendMessage({ type: "speech_stream_end" }); + this.emit("speech_complete", { streaming: true }); + } + } +} diff --git a/src/core/StreamProcessor.ts b/src/core/StreamProcessor.ts new file mode 100644 index 0000000..2034b07 --- /dev/null +++ b/src/core/StreamProcessor.ts @@ -0,0 +1,293 @@ +import { type streamText } from "ai"; + +/** + * Result of processing a full LLM stream. + */ +export interface StreamResult { + fullText: string; + fullReasoning: string; + allToolCalls: Array<{ + toolName: string; + toolCallId: string; + input: unknown; + }>; + allToolResults: Array<{ + toolName: string; + toolCallId: string; + output: unknown; + }>; + allSources: Array; + allFiles: Array; +} + +export interface StreamProcessorCallbacks { + /** Called when a text delta arrives (for streaming speech, etc.) */ + onTextDelta?: (text: string) => void; + /** Called when a text-end part arrives (flush speech, etc.) */ + onTextEnd?: () => void; + /** Send a WebSocket message */ + sendMessage: (message: Record) => void; + /** Emit an event on the agent */ + emitEvent: (event: string, data?: unknown) => void; +} + +/** + * Processes the fullStream from an AI SDK `streamText` call, + * forwarding events to WebSocket clients and collecting the complete response. + * + * This is a standalone function (not a class) because it has no persistent state. + */ +export async function processFullStream( + result: ReturnType, + callbacks: StreamProcessorCallbacks, + extraResponseFields?: Record +): Promise { + const { onTextDelta, onTextEnd, sendMessage, emitEvent } = callbacks; + + let fullText = ""; + let fullReasoning = ""; + const allToolCalls: StreamResult["allToolCalls"] = []; + const allToolResults: StreamResult["allToolResults"] = []; + const allSources: unknown[] = []; + const allFiles: unknown[] = []; + + for await (const part of result.fullStream) { + switch (part.type) { + // ── Stream lifecycle ────────────────────────────── + case "start": + sendMessage({ type: "stream_start" }); + break; + + case "finish": + emitEvent("text", { role: "assistant", text: fullText }); + sendMessage({ + type: "stream_finish", + finishReason: part.finishReason, + usage: part.totalUsage, + }); + break; + + case "error": + emitEvent("error", part.error); + sendMessage({ + type: "stream_error", + error: String(part.error), + }); + break; + + case "abort": + emitEvent("abort", { reason: part.reason }); + sendMessage({ + type: "stream_abort", + reason: part.reason, + }); + break; + + // ── Step lifecycle ──────────────────────────────── + case "start-step": + sendMessage({ + type: "step_start", + warnings: part.warnings, + }); + break; + + case "finish-step": + sendMessage({ + type: "step_finish", + finishReason: part.finishReason, + usage: part.usage, + }); + break; + + // ── Text streaming ──────────────────────────────── + case "text-start": + sendMessage({ type: "text_start", id: part.id }); + break; + + case "text-delta": + fullText += part.text; + onTextDelta?.(part.text); + sendMessage({ + type: "text_delta", + id: part.id, + text: part.text, + }); + break; + + case "text-end": + onTextEnd?.(); + sendMessage({ type: "text_end", id: part.id }); + break; + + // ── Reasoning streaming ─────────────────────────── + case "reasoning-start": + sendMessage({ type: "reasoning_start", id: part.id }); + break; + + case "reasoning-delta": + fullReasoning += part.text; + sendMessage({ + type: "reasoning_delta", + id: part.id, + text: part.text, + }); + break; + + case "reasoning-end": + sendMessage({ type: "reasoning_end", id: part.id }); + break; + + // ── Tool input streaming ────────────────────────── + case "tool-input-start": + sendMessage({ + type: "tool_input_start", + id: part.id, + toolName: part.toolName, + }); + break; + + case "tool-input-delta": + sendMessage({ + type: "tool_input_delta", + id: part.id, + delta: part.delta, + }); + break; + + case "tool-input-end": + sendMessage({ type: "tool_input_end", id: part.id }); + break; + + // ── Tool execution ──────────────────────────────── + case "tool-call": + allToolCalls.push({ + toolName: part.toolName, + toolCallId: part.toolCallId, + input: part.input, + }); + sendMessage({ + type: "tool_call", + toolName: part.toolName, + toolCallId: part.toolCallId, + input: part.input, + }); + break; + + case "tool-result": + allToolResults.push({ + toolName: part.toolName, + toolCallId: part.toolCallId, + output: part.output, + }); + sendMessage({ + type: "tool_result", + toolName: part.toolName, + toolCallId: part.toolCallId, + result: part.output, + }); + break; + + case "tool-error": + sendMessage({ + type: "tool_error", + toolName: part.toolName, + toolCallId: part.toolCallId, + error: String(part.error), + }); + break; + + // ── Sources and files ───────────────────────────── + case "source": + allSources.push(part); + sendMessage({ + type: "source", + source: part, + }); + break; + + case "file": + allFiles.push(part.file); + sendMessage({ + type: "file", + file: part.file, + }); + break; + } + } + + // Send the complete response + sendMessage({ + type: "response_complete", + text: fullText, + reasoning: fullReasoning || undefined, + toolCalls: allToolCalls, + toolResults: allToolResults, + sources: allSources.length > 0 ? allSources : undefined, + files: allFiles.length > 0 ? allFiles : undefined, + ...extraResponseFields, + }); + + return { + fullText, + fullReasoning, + allToolCalls, + allToolResults, + allSources, + allFiles, + }; +} + +/** + * Handle onChunk callback events and emit them. + */ +export function handleStreamChunk( + chunk: any, + emitEvent: (event: string, data?: unknown) => void +): void { + switch (chunk.type) { + case "text-delta": + emitEvent("chunk:text_delta", { id: chunk.id, text: chunk.text }); + break; + + case "reasoning-delta": + emitEvent("chunk:reasoning_delta", { + id: chunk.id, + text: chunk.text, + }); + break; + + case "tool-call": + emitEvent("chunk:tool_call", { + toolName: chunk.toolName, + toolCallId: chunk.toolCallId, + input: chunk.input, + }); + break; + + case "tool-result": + emitEvent("chunk:tool_result", { + toolName: chunk.toolName, + toolCallId: chunk.toolCallId, + result: chunk.output, + }); + break; + + case "tool-input-start": + emitEvent("chunk:tool_input_start", { + id: chunk.id, + toolName: chunk.toolName, + }); + break; + + case "tool-input-delta": + emitEvent("chunk:tool_input_delta", { + id: chunk.id, + delta: chunk.delta, + }); + break; + + case "source": + emitEvent("chunk:source", chunk); + break; + } +} diff --git a/src/core/TranscriptionManager.ts b/src/core/TranscriptionManager.ts new file mode 100644 index 0000000..2510648 --- /dev/null +++ b/src/core/TranscriptionManager.ts @@ -0,0 +1,142 @@ +import { EventEmitter } from "events"; +import { + experimental_transcribe as transcribe, + type TranscriptionModel, +} from "ai"; +import { DEFAULT_MAX_AUDIO_SIZE } from "../types"; + +export interface TranscriptionManagerOptions { + transcriptionModel?: TranscriptionModel; + maxAudioInputSize?: number; +} + +/** + * Handles audio transcription using the AI SDK transcription model + * and validation of incoming audio data. + */ +export class TranscriptionManager extends EventEmitter { + private transcriptionModel?: TranscriptionModel; + private maxAudioInputSize: number; + + /** Callback to send messages over the WebSocket */ + public sendMessage: (message: Record) => void = () => {}; + + constructor(options: TranscriptionManagerOptions = {}) { + super(); + this.transcriptionModel = options.transcriptionModel; + this.maxAudioInputSize = + options.maxAudioInputSize ?? DEFAULT_MAX_AUDIO_SIZE; + } + + get hasTranscriptionModel(): boolean { + return !!this.transcriptionModel; + } + + /** + * Transcribe audio data to text. + */ + async transcribeAudio(audioData: Buffer | Uint8Array): Promise { + if (!this.transcriptionModel) { + throw new Error("Transcription model not configured"); + } + + console.log( + `Sending ${audioData.byteLength} bytes to Whisper for transcription` + ); + + try { + const result = await transcribe({ + model: this.transcriptionModel, + audio: audioData, + }); + + console.log( + `Whisper transcription result: "${result.text}", language: ${result.language || "unknown"}` + ); + + this.emit("transcription", { + text: result.text, + language: result.language, + }); + + // Send transcription to client for immediate feedback + this.sendMessage({ + type: "transcription_result", + text: result.text, + language: result.language, + }); + + return result.text; + } catch (error) { + console.error("Whisper transcription failed:", error); + throw error; + } + } + + /** + * Process incoming base64-encoded audio: validate, decode, transcribe. + * Returns the transcribed text, or null if invalid / empty. + */ + async processAudioInput( + base64Audio: string, + format?: string + ): Promise { + if (!this.transcriptionModel) { + const error = new Error( + "Transcription model not configured for audio input" + ); + this.emit("error", error); + this.sendMessage({ type: "error", error: error.message }); + return null; + } + + try { + const audioBuffer = Buffer.from(base64Audio, "base64"); + + // Validate audio size + if (audioBuffer.length > this.maxAudioInputSize) { + const sizeMB = (audioBuffer.length / (1024 * 1024)).toFixed(1); + const maxMB = (this.maxAudioInputSize / (1024 * 1024)).toFixed(1); + this.emit( + "error", + new Error( + `Audio input too large (${sizeMB} MB). Maximum allowed: ${maxMB} MB` + ) + ); + return null; + } + + if (audioBuffer.length === 0) { + this.emit("warning", "Received empty audio data"); + return null; + } + + this.emit("audio_received", { size: audioBuffer.length, format }); + console.log( + `Processing audio input: ${audioBuffer.length} bytes, format: ${format || "unknown"}` + ); + + const transcribedText = await this.transcribeAudio(audioBuffer); + console.log(`Transcribed text: "${transcribedText}"`); + + if (!transcribedText.trim()) { + this.emit("warning", "Transcription returned empty text"); + this.sendMessage({ + type: "transcription_error", + error: "Whisper returned empty text", + }); + return null; + } + + return transcribedText; + } catch (error) { + console.error("Failed to process audio input:", error); + this.emit("error", error); + this.sendMessage({ + type: "transcription_error", + error: `Transcription failed: ${(error as Error).message || String(error)}`, + }); + return null; + } + } +} diff --git a/src/core/WebSocketManager.ts b/src/core/WebSocketManager.ts new file mode 100644 index 0000000..1211ca6 --- /dev/null +++ b/src/core/WebSocketManager.ts @@ -0,0 +1,133 @@ +import { WebSocket } from "ws"; +import { EventEmitter } from "events"; + +/** + * Manages a single WebSocket connection lifecycle. + * Handles connecting, attaching existing sockets, sending messages, + * and clean disconnection. + */ +export class WebSocketManager extends EventEmitter { + private socket?: WebSocket; + private _isConnected = false; + + get isConnected(): boolean { + return this._isConnected; + } + + get currentSocket(): WebSocket | undefined { + return this.socket; + } + + /** + * Connect to a WebSocket server by URL. + */ + connect(url: string): Promise { + // Clean up any existing connection first + if (this.socket) { + this.disconnect(); + } + + return new Promise((resolve, reject) => { + try { + this.socket = new WebSocket(url); + this.attachListeners(); + + this.socket.once("open", () => { + this._isConnected = true; + this.emit("connected"); + resolve(); + }); + + this.socket.once("error", (error) => { + reject(error); + }); + } catch (error) { + reject(error); + } + }); + } + + /** + * Attach an existing WebSocket (server-side usage). + */ + handleSocket(socket: WebSocket): void { + // Clean up any existing connection first + if (this.socket) { + this.disconnect(); + } + + this.socket = socket; + this._isConnected = true; + this.attachListeners(); + this.emit("connected"); + } + + /** + * Send a JSON message via WebSocket if connected. + * Gracefully handles send failures (e.g., socket closing mid-send). + */ + send(message: Record): void { + if (!this.socket || !this._isConnected) return; + + try { + if (this.socket.readyState === WebSocket.OPEN) { + this.socket.send(JSON.stringify(message)); + } else { + console.warn(`Cannot send message, socket state: ${this.socket.readyState}`); + } + } catch (error) { + // Socket may have closed between the readyState check and send() + console.error("Failed to send WebSocket message:", error); + this.emit("error", error); + } + } + + /** + * Disconnect and clean up the current socket. + */ + disconnect(): void { + if (!this.socket) return; + + try { + this.socket.removeAllListeners(); + if ( + this.socket.readyState === WebSocket.OPEN || + this.socket.readyState === WebSocket.CONNECTING + ) { + this.socket.close(); + } + } catch { + // Ignore close errors — socket may already be dead + } + + this.socket = undefined; + this._isConnected = false; + } + + /** + * Attach internal event listeners on the current socket. + */ + private attachListeners(): void { + if (!this.socket) return; + + this.socket.on("message", (data) => { + try { + const message = JSON.parse(data.toString()); + this.emit("message", message); + } catch (err) { + console.error("Failed to parse WebSocket message:", err); + this.emit("error", err); + } + }); + + this.socket.on("close", () => { + this._isConnected = false; + this.emit("disconnected"); + }); + + this.socket.on("error", (error) => { + console.error("WebSocket error:", error); + this.emit("error", error); + }); + } +} diff --git a/src/core/index.ts b/src/core/index.ts new file mode 100644 index 0000000..f81898b --- /dev/null +++ b/src/core/index.ts @@ -0,0 +1,17 @@ +export { WebSocketManager } from "./WebSocketManager"; +export { SpeechManager, type SpeechManagerOptions } from "./SpeechManager"; +export { + ConversationManager, + type ConversationManagerOptions, +} from "./ConversationManager"; +export { + TranscriptionManager, + type TranscriptionManagerOptions, +} from "./TranscriptionManager"; +export { + processFullStream, + handleStreamChunk, + type StreamResult, + type StreamProcessorCallbacks, +} from "./StreamProcessor"; +export { InputQueue, type QueueItem } from "./InputQueue"; diff --git a/src/index.ts b/src/index.ts index 5b5786a..14183f6 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ // Agents -export { VoiceAgent, type VoiceAgentOptions } from "./VoiceAgent"; +export { VoiceAgent, type VoiceAgentOptions } from "./VoiceAgent.new"; export { VideoAgent, type VideoAgentOptions, @@ -8,7 +8,7 @@ export { type VideoAgentConfig, type FrameContext, type FrameTriggerReason, -} from "./VideoAgent"; +} from "./VideoAgent.new"; // Shared types export {