@convai/web-sdk 1.7.0 → 1.8.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/ConvaiClient.d.ts +40 -1
- package/dist/core/ConvaiClient.d.ts.map +1 -1
- package/dist/core/ConvaiClient.js +276 -167
- package/dist/core/ConvaiClient.js.map +1 -1
- package/dist/core/connectRequest.d.ts +1 -1
- package/dist/core/connectRequest.d.ts.map +1 -1
- package/dist/core/connectRequest.js.map +1 -1
- package/dist/core/types.d.ts +50 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/react/components/rtc-widget/components/AudioVisualizer.d.ts.map +1 -1
- package/dist/react/components/rtc-widget/components/AudioVisualizer.js +28 -1
- package/dist/react/components/rtc-widget/components/AudioVisualizer.js.map +1 -1
- package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.d.ts.map +1 -1
- package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.js +93 -49
- package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.js.map +1 -1
- package/dist/react/hooks/useConvaiClient.d.ts.map +1 -1
- package/dist/react/hooks/useConvaiClient.js +1 -0
- package/dist/react/hooks/useConvaiClient.js.map +1 -1
- package/dist/vanilla/AudioRenderer.d.ts +3 -1
- package/dist/vanilla/AudioRenderer.d.ts.map +1 -1
- package/dist/vanilla/AudioRenderer.js +2 -2
- package/dist/vanilla/AudioRenderer.js.map +1 -1
- package/dist/vanilla/ConvaiWidget.d.ts.map +1 -1
- package/dist/vanilla/ConvaiWidget.js +602 -114
- package/dist/vanilla/ConvaiWidget.js.map +1 -1
- package/dist/vanilla/icons.d.ts.map +1 -1
- package/dist/vanilla/icons.js +62 -15
- package/dist/vanilla/icons.js.map +1 -1
- package/dist/vanilla/index.d.ts +1 -1
- package/dist/vanilla/index.d.ts.map +1 -1
- package/dist/vanilla/index.js.map +1 -1
- package/dist/vanilla/styles.d.ts +18 -1
- package/dist/vanilla/styles.d.ts.map +1 -1
- package/dist/vanilla/styles.js +105 -29
- package/dist/vanilla/styles.js.map +1 -1
- package/dist/vanilla/types.d.ts +74 -0
- package/dist/vanilla/types.d.ts.map +1 -1
- package/dist/vanilla/types.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +14 -7
package/dist/core/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,gBAAgB,IAAI,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAEvD;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;CAWvB,CAAC;AAEX;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,GAAG,MAAM,CA6BlF;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC;AAEjC;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/C,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAEjC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAElE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;CAC9D;AAED;;;;;GAKG;AACH,MAAM,MAAM,uBAAuB,GAAG,CACpC,SAAS,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,EACxC,SAAS,EAAE,OAAO,KACf,iBAAiB,CAAC;AAEvB;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IAEnC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAE3B,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,sBAAsB,CAAC,EAAE,WAAW,CAAC;IACrC,mBAAmB,CAAC,EAAE,WAAW,CAAC;IAClC,iBAAiB,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAC9C,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAC3C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,yBAAyB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,uBAAuB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IAC7D,mBAAmB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACtC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAC;IACnB,wBAAwB;IACxB,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,YAAY,GAAG,SAAS,CAAC;IACvD,+CAA+C;IAC/C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,qCAAqC;IACrC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC;CACrC;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,qDAAqD;IACrD,aAAa,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;IACtC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IACpC;;;OAGG;IACH,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE7D,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,OAAO,GACP,QAAQ,GACR,gBAAgB,GAChB,SAAS,GACT,gBAAgB,CAAC;AAErB,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,aAAa,CAAC,EAAE,WAAW,CAAC;IAC5B,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,aAAa,CAAC,EAAE,WAAW,CAAC;CAC7B;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,0BAA0B,EAAE,CAAC;IAC/C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACxC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,8BAA8B,CAAC,EAAE,MAAM,CAAC;IACxC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,WAAW,CAAC,EAAE;QACZ,sBAAsB,CAAC,EAAE,MAAM,CAAC;QAChC,uBAAuB,CAAC,EAAE,MAAM,CAAC;QACjC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACpC,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,yBAAyB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1C,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,MAAM,gBAAgB,GACxB,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GAER,QAAQ,GACR,cAAc,GACd,SAAS,CAAC;AAEd,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,2FAA2F;IAC3F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,gBAAgB,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,gBAAgB,CAAC;IACzB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0EAA0E;IAC1E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B;;;;;;;;;;;;;;;;;OAiBG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uFAAuF;IACvF,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,wEAAwE;IACxE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mGAAmG;IACnG,SAAS,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;IACpC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,sDAAsD;IACtD,YAAY,CAAC,EAAE,kBAAkB,CAAC;IAClC;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,qBAAqB,CAAC;IAC3C,6DAA6D;IAC7D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,wEAAwE;IACxE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE;QACjB,qFAAqF;QACrF;;;;;;;WAOG;QACH,MAAM,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,cAAc,GAAG,QAAQ,GAAG,SAAS,CAAC;QACjE;;;;;;;;;;;;;;;;;;;;;WAqBG;QACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,YAAY,KAAK,YAAY,CAAC;QAChE;;;WAGG;QACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;QAChC;;;;;;;;;WASG;QACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B;;;;;;WAMG;QACH,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,sFAAsF;IACtF,aAAa,CAAC,EACV;QACE,mFAAmF;QACnF,QAAQ,EAAE,KAAK,CAAC;KACjB,GACD;QACE,uCAAuC;QACvC,QAAQ,EAAE,QAAQ,CAAC;QACnB,mDAAmD;QACnD,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,oCAAoC;QACpC,uBAAuB,CAAC,EAAE,MAAM,CAAC;QACjC,qCAAqC;QACrC,wBAAwB,CAAC,EAAE,MAAM,CAAC;KACvC,CAAC;IACF,oEAAoE;IACpE,YAAY,CAAC,EAAE;QACb,qDAAqD;QACrD,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,4DAA4D;QAC5D,UAAU,EAAE,KAAK,CAAC;YAChB,qBAAqB;YACrB,IAAI,EAAE,MAAM,CAAC;YACb,yCAAyC;YACzC,GAAG,EAAE,MAAM,CAAC;SACb,CAAC,CAAC;QACH,oDAAoD;QACpD,OAAO,EAAE,KAAK,CAAC;YACb,kBAAkB;YAClB,IAAI,EAAE,MAAM,CAAC;YACb,uCAAuC;YACvC,WAAW,EAAE,MAAM,CAAC;SACrB,CAAC,CAAC;QACH,kGAAkG;QAClG,wBAAwB,CAAC,EAAE,MAAM,CAAC;KACnC,CAAC;IACF;;;;OAIG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,kBAAkB,CAAC,EAAE;QACnB,gEAAgE;QAChE,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,yBAAyB;QACzB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iCAAiC;QACjC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACzC,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX;;;;;;;;;;;;;;;OAeG;IACH,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,eAAe,GAAG,QAAQ,GAAG,oBAAoB,GAAG,cAAc,GAAG,YAAY,GAAG,aAAa,GAAG,eAAe,GAAG,eAAe,GAAG,cAAc,GAAG,iBAAiB,CAAC;IACjN,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,WAAW,EAAE,OAAO,CAAC;IACrB,kDAAkD;IAClD,YAAY,EAAE,OAAO,CAAC;IACtB,mIAAmI;IACnI,WAAW,EAAE,OAAO,CAAC;IACrB,oEAAoE;IACpE,UAAU,EAAE,OAAO,CAAC;IACpB,kDAAkD;IAClD,UAAU,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,UAAU,EAAE,cAAc,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,CAAC;IACjF,qGAAqG;IACrG,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACpD;;;OAGG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChD;;;;OAIG;IACH,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB;;;;;;;;;;;;;;;OAeG;IACH,gBAAgB,EAAE,gBAAgB,GAAG,IAAI,CAAC;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,eAAe,EAAE,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAClD,yBAAyB,EAAE,MAAM,IAAI,CAAC;IACtC,wBAAwB,EAAE,MAAM,IAAI,CAAC;IAErC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IACtE,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC;CAClE;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC9C,qBAAqB,EAAE,OAAO,CAAC;IAC/B,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD,eAAe,EAAE,MAAM,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAClD,eAAe,EAAE,CAAC,OAAO,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,aAAa,EAAE,CACb,MAAM,EAAE,iBAAiB,EACzB,OAAO,CAAC,EAAE,oBAAoB,KAC3B,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACjC,iBAAiB,EAAE,CACjB,KAAK,EAAE,gBAAgB,EACvB,OAAO,CAAC,EAAE,wBAAwB,KAC/B,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACjC,qBAAqB,EAAE,CACrB,MAAM,CAAC,EAAE,kBAAkB,GAAG,gBAAgB,KAC3C,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnB,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IACtE,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC;CAClE;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,0BAA0B,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,oBAAoB,EAAE,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAE3C,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IACtE,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC;CAClE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,mDAAmD;IACnD,KAAK,EAAE,KAAK,CAAC;IACb,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,6CAA6C;IAC7C,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,qBAAqB;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wBAAwB;IACxB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,qBAAqB;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,sBAAsB;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,qBAAqB;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAElC;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC;IAElD,mFAAmF;IACnF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEhC,yFAAyF;IACzF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnC,2EAA2E;IAC3E,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpC,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAEpB,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC;IAErC,qDAAqD;IACrD,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IAEnC,+DAA+D;IAC/D,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3C,kFAAkF;IAClF,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAE7B,gEAAgE;IAChE,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IAEtC,0DAA0D;IAC1D,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IAEtC,qCAAqC;IACrC,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;IAElD,8DAA8D;IAC9D,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAE1C,gGAAgG;IAChG,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IAEvC;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,aAAa,EAAE,OAAO,iBAAiB,EAAE,aAAa,GAAG,IAAI,CAAC;IAEvE;;OAEG;IACH,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAElD;;;;;;;;;;;;;;;;;;OAkBG;IACH,yBAAyB,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1F,oDAAoD;IACpD,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhC,mEAAmE;IACnE,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/B,wEAAwE;IACxE,YAAY,EAAE,MAAM,IAAI,CAAC;IAEzB,2CAA2C;IAC3C,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAE5C;;;;OAIG;IACH,kBAAkB,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAE5E;;;OAGG;IACH,oBAAoB,EAAE,MAAM,IAAI,CAAC;IAEjC;;;;;;OAMG;IACH,cAAc,EAAE,MAAM,IAAI,CAAC;IAE3B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,kBAAkB,EAAE,CAAC,YAAY,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAEtE;;;;OAIG;IACH,iBAAiB,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC;IAEtD;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,aAAa,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAEvD,wEAAwE;IACxE,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE,mBAAmB,KAAK,MAAM,GAAG,IAAI,CAAC;IAE/D,gEAAgE;IAChE,aAAa,EAAE,CAAC,OAAO,CAAC,EAAE,oBAAoB,KAAK,MAAM,GAAG,IAAI,CAAC;IAEjE,6CAA6C;IAC7C,iBAAiB,EAAE,CAAC,OAAO,EAAE,wBAAwB,KAAK,MAAM,GAAG,IAAI,CAAC;IAExE;;;OAGG;IACH,aAAa,EAAE,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAEpD;;;OAGG;IACH,mBAAmB,EAAE,CACnB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,EACnD,OAAO,CAAC,EAAE,0BAA0B,KACjC,IAAI,CAAC;IAEV;;;OAGG;IACH,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAEtC;;;;OAIG;IACH,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAEtC;;;;;;;;;;;;;;;OAeG;IACH,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvE;;;;;OAKG;IACH,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IAEtE;;;;OAIG;IACH,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC;CAClE"}
|
package/dist/core/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAuBA;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,cAAc,EAAE,CAAC;IACjB,gBAAgB,EAAE,CAAC;IACnB,kBAAkB,EAAE,CAAC;IACrB,eAAe,EAAE,CAAC;IAClB,mBAAmB,EAAE,CAAC;IACtB,YAAY,EAAE,CAAC;IACf,cAAc,EAAE,CAAC;IACjB,YAAY,EAAE,CAAC;IACf,SAAS,EAAE,CAAC;IACZ,YAAY,EAAE,CAAC;CACP,CAAC;AAEX;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAA+B;IACxE,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,oBAAoB,CAAC,cAAc;YACtC,OAAO,sCAAsC,CAAC;QAChD,KAAK,oBAAoB,CAAC,gBAAgB;YACxC,OAAO,mBAAmB,CAAC;QAC7B,KAAK,oBAAoB,CAAC,kBAAkB;YAC1C,OAAO,0CAA0C,CAAC;QACpD,KAAK,oBAAoB,CAAC,eAAe;YACvC,OAAO,yBAAyB,CAAC;QACnC,KAAK,oBAAoB,CAAC,mBAAmB;YAC3C,OAAO,kCAAkC,CAAC;QAC5C,KAAK,oBAAoB,CAAC,YAAY;YACpC,OAAO,+BAA+B,CAAC;QACzC,KAAK,oBAAoB,CAAC,cAAc;YACtC,OAAO,gBAAgB,CAAC;QAC1B,KAAK,oBAAoB,CAAC,YAAY;YACpC,OAAO,gBAAgB,CAAC;QAC1B,KAAK,oBAAoB,CAAC,SAAS;YACjC,OAAO,qCAAqC,CAAC;QAC/C,KAAK,oBAAoB,CAAC,YAAY;YACpC,OAAO,0BAA0B,CAAC;QACpC;YACE,OAAO,cAAc,CAAC;IAC1B,CAAC;AACH,CAAC","sourcesContent":["import { Room, DisconnectReason as LiveKitDisconnectReason } from 'livekit-client';\nimport { BlendshapeQueue } from './BlendshapeQueue';\n\n/**\n * LiveKit disconnect reasons.\n * Helps determine why a participant was disconnected from the room.\n * \n * These values map to LiveKit's DisconnectReason enum:\n * - UNKNOWN_REASON (0): Unknown disconnect reason\n * - CLIENT_INITIATED (1): Client called disconnect() - intentional disconnect\n * - DUPLICATE_IDENTITY (2): Another client with the same identity joined the room\n * - SERVER_SHUTDOWN (3): LiveKit server is shutting down\n * - PARTICIPANT_REMOVED (4): Participant was removed by RemoveParticipant API\n * - ROOM_DELETED (5): Room was ended via DeleteRoom API\n * - STATE_MISMATCH (6): State mismatch between client and server\n * - JOIN_FAILURE (7): Failed to join the room\n * - MIGRATION (8): Participant moved to a different room\n * - SIGNAL_CLOSE (9): Signal connection was closed\n * \n * @see https://docs.livekit.io/reference/client-sdk-js/enums/DisconnectReason.html\n */\nexport type DisconnectReason = LiveKitDisconnectReason;\n\n/**\n * Export LiveKit's DisconnectReason enum values for easy access\n */\nexport const DisconnectReasonEnum = {\n UNKNOWN_REASON: 0,\n CLIENT_INITIATED: 1,\n DUPLICATE_IDENTITY: 2,\n SERVER_SHUTDOWN: 3,\n PARTICIPANT_REMOVED: 4,\n ROOM_DELETED: 5,\n STATE_MISMATCH: 6,\n JOIN_FAILURE: 7,\n MIGRATION: 8,\n SIGNAL_CLOSE: 9,\n} as const;\n\n/**\n * Get a human-readable message for a disconnect reason.\n * \n * @param reason - The disconnect reason code from LiveKit\n * @returns A human-readable message describing the disconnect reason\n * \n * @example\n * ```typescript\n * client.on('disconnect', (reason) => {\n * console.log(getDisconnectReasonMessage(reason));\n * // Output: \"User disconnected\"\n * });\n * ```\n */\nexport function getDisconnectReasonMessage(reason: DisconnectReason | null): string {\n if (reason === null) {\n return 'Connected';\n }\n\n switch (reason) {\n case DisconnectReasonEnum.UNKNOWN_REASON:\n return 'Network unavailable or unknown cause';\n case DisconnectReasonEnum.CLIENT_INITIATED:\n return 'User disconnected';\n case DisconnectReasonEnum.DUPLICATE_IDENTITY:\n return 'Another client with same identity joined';\n case DisconnectReasonEnum.SERVER_SHUTDOWN:\n return 'Server is shutting down';\n case DisconnectReasonEnum.PARTICIPANT_REMOVED:\n return 'Removed by RemoveParticipant API';\n case DisconnectReasonEnum.ROOM_DELETED:\n return 'Room ended via DeleteRoom API';\n case DisconnectReasonEnum.STATE_MISMATCH:\n return 'State mismatch';\n case DisconnectReasonEnum.JOIN_FAILURE:\n return 'Failed to join';\n case DisconnectReasonEnum.MIGRATION:\n return 'Participant moved to different room';\n case DisconnectReasonEnum.SIGNAL_CLOSE:\n return 'Signal connection closed';\n default:\n return 'Disconnected';\n }\n}\n\n/**\n * Dynamic information structure for passing real-time context to the character.\n * Pass a text description of the current dynamic context.\n * \n * @example\n * ```typescript\n * const dynamicInfo = \"Player health is low, in combat mode\";\n * ```\n */\nexport type DynamicInfo = string;\n\n/**\n * Minimal contract that ConvaiClient and AudioManager require from a WebSocket\n * session implementation. Defined here so core has zero import dependency on\n * the pipecat packages — the concrete class lives in the vanilla/websocket subpath.\n */\nexport interface IWebSocketSession {\n readonly isConnected: boolean;\n connectWithUrl(wsUrl: string): Promise<void>;\n disconnect(): Promise<void>;\n sendMessage(type: string, data: unknown): void;\n enableMic(enable: boolean): void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n on(event: string, listener: (...args: any[]) => void): () => void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n off(event: string, listener: (...args: any[]) => void): void;\n}\n\n/**\n * Factory function signature used to register a WebSocket transport implementation\n * via {@link ConvaiClient.registerWebSocketTransport}. Import\n * `@convai/web-sdk/vanilla/websocket` (or `@convai/web-sdk/react/websocket`) as a\n * side-effect to register the default Pipecat-based implementation.\n */\nexport type WebSocketSessionFactory = (\n onMessage: (payload: Uint8Array) => void,\n enableMic: boolean,\n) => IWebSocketSession;\n\n/**\n * Options for {@link IConvaiClient.uploadFile}.\n *\n * Supported formats: JPEG, PNG, GIF, WebP. Maximum file size: 10 MB.\n * Files are sent as raw binary over the WebRTC byte stream — not base64 encoded.\n */\nexport interface UploadFileOptions {\n /** Server routing topic. Defaults to `'file-upload'`. */\n topic?: string;\n /**\n * Progress callback. Called with an integer percentage (0–100) as the upload proceeds.\n */\n onProgress?: (progressPercent: number) => void;\n}\n\n/**\n * Extra data returned in a server-response for specific event types.\n */\nexport interface ServerResponseExtras {\n // context-update extras\n token_count?: number;\n static_token_count?: number;\n runtime_token_count?: number;\n max_tokens?: number;\n static_max_tokens?: number;\n runtime_max_tokens?: number;\n remaining_tokens?: number;\n /** Full retained runtime dynamic context text after the update */\n content?: string;\n // tts-toggle extras\n enabled?: boolean;\n // stt-toggle extras\n muted?: boolean;\n // trigger-message extras\n trigger_name?: string;\n has_speak_tag?: boolean;\n // user_text_message extras\n text?: string;\n // kill-pipeline extras\n room_name?: string;\n // unknown-message-type error extras\n supported_types?: string[];\n // vision-status / vision-trigger extras\n vision_buffer?: VisionBufferStatus;\n requested_respond_mode?: RespondMode;\n actual_respond_mode?: RespondMode;\n requested_run_llm?: \"true\" | \"false\" | \"auto\";\n actual_run_llm?: \"true\" | \"false\" | \"auto\";\n llm_triggered?: boolean;\n downgraded?: boolean;\n downgrade_reason?: string | null;\n interrupted?: boolean;\n vision_frames_attached?: number;\n vision_image_tokens_est?: number;\n vision_detail_level?: string | null;\n vision_attach_outcome?: string;\n vision_source_participant?: string | null;\n attached_frame_pts?: number[];\n frame_binding?: string;\n frame_binding_error?: string | null;\n requested_frame_indices?: [number, number] | number[] | null;\n requested_frame_ids?: number[] | null;\n frame_indices_clamped?: boolean;\n frame_ids_stale_exempt?: boolean;\n [key: string]: unknown;\n}\n\n/**\n * Acknowledgment sent by the server for every client-to-server message.\n * Analogous to an HTTP response: use `status` to check success/failure and\n * `extras` for event-specific data such as context token counts.\n *\n * @example\n * ```typescript\n * client.on('serverResponse', (response) => {\n * if (response.event_type === 'context-update') {\n * const { remaining_tokens, max_tokens } = response.extras ?? {};\n * console.log(`Tokens remaining: ${remaining_tokens} / ${max_tokens}`);\n * }\n * if (response.status === 'error') {\n * console.error('Server error:', response.message);\n * }\n * });\n * ```\n */\nexport interface ServerResponse {\n /** The original client message type that triggered this response */\n event_type: string;\n /** Processing status */\n status: 'success' | 'error' | 'processing' | 'pending';\n /** Human-readable description of the result */\n message: string | null;\n /** Additional event-specific data */\n extras: ServerResponseExtras | null;\n}\n\n/**\n * Emitted when the server assigns an interaction ID to the session.\n * Store the interactionId for analytics or session tracking.\n */\nexport interface InteractionCreated {\n /** Unique identifier for this interaction session */\n interactionId: string;\n /** Character session identifier */\n characterSessionId: string;\n}\n\n/**\n * A single action the character performs, emitted via the `actionResponse`\n * event. When `target` is present the action is *parameterized* (the character\n * acts on a specific object/character); simple actions (e.g. `\"Wave\"`) omit it.\n */\nexport interface ConvaiAction {\n /** Base action name, e.g. `\"Move To\"`, `\"Pick Up\"`, `\"Wave\"`. */\n name: string;\n /**\n * The object or character the action targets — must match a name from\n * `actionConfig.objects[]` / `actionConfig.characters[]`. Absent for simple\n * (non-parameterized) actions.\n */\n target?: string;\n}\n\n/**\n * Payload of the `actionResponse` event. Actions execute sequentially; an\n * empty array is a valid \"no action\" turn.\n */\nexport interface ActionResponseEvent {\n actions: ConvaiAction[];\n}\n\n/**\n * Options for updating the bot's temporary runtime context.\n * Provides flexible control over how context is managed during conversation.\n * \n * @example\n * ```typescript\n * // Append to existing context\n * client.updateContext({\n * text: \"User just completed dragon quest\",\n * mode: \"append\",\n * run_llm: \"false\"\n * });\n * \n * // Replace entire context\n * client.updateContext({\n * text: \"New game state: level 5, combat mode\",\n * mode: \"replace\",\n * run_llm: \"auto\"\n * });\n * \n * // Reset/clear context\n * client.updateContext({\n * mode: \"reset\"\n * });\n * ```\n */\nexport interface ContextUpdateOptions {\n /**\n * The context text to inject.\n * Required unless mode is \"reset\" or only current_attention_object is being updated.\n */\n text?: string;\n /**\n * How to apply the context:\n * - \"append\" (default): Add text to existing ephemeral context\n * - \"replace\": Replace existing ephemeral context with new text\n * - \"reset\": Clear ephemeral context; text is optional\n */\n mode?: \"append\" | \"replace\" | \"reset\";\n /**\n * Whether to trigger LLM response:\n * - \"true\": Always trigger a response from the bot and preempt active local playback\n * - \"false\": Never trigger a response\n * - \"auto\" (default): Server decides based on context without preempting active playback\n */\n run_llm?: \"true\" | \"false\" | \"auto\";\n /**\n * Optional respond-mode alias for backends that expose unified respond modes.\n * If `run_llm` is provided, it takes precedence.\n */\n respond_mode?: RespondMode;\n /**\n * The object the character should currently focus on.\n * Must match one of action_config.objects[].name.\n * Pass an empty string to clear current attention.\n */\n current_attention_object?: string;\n}\n\nexport type RespondMode = \"must_respond\" | \"auto\" | \"silent\";\n\nexport type RespondModality =\n | \"text\"\n | \"audio\"\n | \"vision\"\n | \"context_update\"\n | \"trigger\"\n | \"scene_metadata\";\n\nexport interface RespondModesConfig {\n text?: \"must_respond\";\n audio?: \"must_respond\";\n vision?: RespondMode;\n contextUpdate?: RespondMode;\n trigger?: RespondMode;\n sceneMetadata?: RespondMode;\n}\n\nexport interface VisionSamplingWindowConfig {\n count: number;\n intervalMs: number;\n}\n\nexport interface VisionInputConfig {\n /**\n * Enable unified vision context for this session.\n *\n * Defaults to true when enableVideo is true. Set false to keep the video\n * channel available while opting out of unified vision context.\n */\n enabled?: boolean;\n sampleIntervalSecs?: number;\n framesPerTurn?: number;\n bufferFrames?: number;\n samplingWindows?: VisionSamplingWindowConfig[];\n stalenessSeconds?: number;\n maxResolution?: number | null;\n replacePreviousVisionContext?: boolean;\n}\n\nexport interface VisionBufferStatus {\n enabled?: boolean;\n first_frame_pts?: number | null;\n last_frame_pts?: number | null;\n first_frame_index?: number | null;\n retained_frames?: number;\n buffer_frames?: number;\n frames_per_turn?: number;\n replace_previous_vision_context?: boolean;\n evicted_frames?: number;\n effective_fps?: number | null;\n selected_participant?: string | null;\n frames_admitted?: number;\n frames_dropped_foreign_source?: number;\n frames_dropped_inactive_source?: number;\n frames_dropped_rate_limited?: number;\n last_attach?: {\n vision_frames_attached?: number;\n vision_image_tokens_est?: number;\n vision_detail_level?: string | null;\n vision_attach_outcome?: string;\n vision_source_participant?: string | null;\n attached_frame_pts?: number[];\n };\n}\n\nexport interface VisionStatusOptions {\n updateId?: string;\n}\n\nexport interface VisionTriggerOptions {\n updateId?: string;\n text?: string;\n respondMode?: RespondMode;\n frameIndices?: [number, number];\n frameIds?: number[];\n}\n\nexport interface RespondModeUpdateOptions {\n updateId?: string;\n modality: RespondModality;\n mode: RespondMode;\n}\n\nexport interface UpdateSceneMetadataOptions {\n respondMode?: RespondMode;\n}\n\nexport type VisionSourceKind =\n | \"webcam\"\n | \"canvas\"\n | \"screen\"\n | \"custom\"\n // Backward-compatible aliases accepted by the existing SDK surface.\n | \"camera\"\n | \"screen_share\"\n | \"unknown\";\n\nexport interface VisionSourceState {\n active: boolean;\n source: VisionSourceKind | null;\n sourceName: string | null;\n trackState: MediaStreamTrackState | null;\n transport?: \"livekit\" | \"websocket\";\n reason?: string;\n}\n\nexport interface PublishCanvasOptions {\n fps?: number;\n name?: string;\n source?: VisionSourceKind;\n stopTrackOnUnpublish?: boolean;\n}\n\nexport interface PublishVideoTrackOptions {\n name?: string;\n source?: VisionSourceKind;\n /** WebSocket transport frame publish cadence. LiveKit publishes the track continuously. */\n fps?: number;\n stopTrackOnUnpublish?: boolean;\n}\n\nexport interface VisionSourceHandle {\n track: MediaStreamTrack;\n publication?: unknown;\n transport?: \"livekit\" | \"websocket\";\n sourceName: string;\n source: VisionSourceKind;\n stopTrackOnUnpublish: boolean;\n unpublish: () => Promise<void>;\n cleanup?: () => void;\n}\n\n/**\n * Audio processing settings for the microphone input.\n * These settings help optimize the audio quality and reduce interruptions.\n * @internal - This is a fixed configuration and should not be modified by users\n */\nexport interface AudioSettings {\n /** Enable echo cancellation to prevent audio feedback (default: true) */\n echoCancellation?: boolean;\n /** Enable noise suppression to reduce background noise (default: true) */\n noiseSuppression?: boolean;\n /** Enable automatic gain control for consistent volume (default: true) */\n autoGainControl?: boolean;\n /** Audio sample rate in Hz (default: 48000) */\n sampleRate?: number;\n /** Number of audio channels, 1 for mono, 2 for stereo (default: 1) */\n channelCount?: number;\n}\n\n/**\n * Configuration object for connecting to a Convai character.\n * \n * @example\n * ```typescript\n * const config: ConvaiConfig = {\n * apiKey: 'your-api-key',\n * characterId: 'your-character-id',\n * endUserId: 'user-uuid', // Optional: enables long-term memory and analytics\n * enableVideo: false, // If false, connection_type will be \"audio\"\n * };\n * ```\n */\nexport interface ConvaiConfig {\n /** Your Convai API key or Auth Token (at least one is required) */\n apiKey?: string;\n authToken?: string;\n /** The Character ID to connect to (required) */\n characterId: string;\n /** Temporary character state of mind sent as `state_of_mind` on connect. */\n stateOfMind?: string | null;\n /**\n * Stable identifier for the end user (optional).\n *\n * Any non-empty string is accepted. Use a value that uniquely identifies the\n * user across sessions — a UUID or email address are the most common choices:\n *\n * ```ts\n * endUserId: 'a1b2c3d4-...' // UUID (preferred)\n * endUserId: 'user@example.com' // email\n * endUserId: 'device-fingerprint' // any stable unique string\n * ```\n *\n * When provided:\n * - Enables long-term memory: character remembers context from previous sessions\n * - Enables per-user analytics and engagement tracking\n *\n * When omitted the session is anonymous — no memory, no cross-session tracking.\n */\n endUserId?: string;\n /** Optional metadata object for the end user (sent as end_user_metadata to the API) */\n endUserMetadata?: Record<string, unknown>;\n /** Custom Convai API URL (optional, defaults to production endpoint) */\n url?: string;\n /** Transport layer to use. Default: \"livekit\". Use \"websocket\" for Pipecat WebSocket transport. */\n transport?: \"livekit\" | \"websocket\";\n /**\n * Character session ID (optional). Pass to resume an existing session;\n * otherwise populated from the connect API response after first connection.\n */\n characterSessionId?: string;\n /** \n * Enable video capability (default: false).\n * If true, connection_type will be \"video\" (supports audio, video, and screenshare).\n * If false, connection_type will be \"audio\" (audio only).\n */\n enableVideo?: boolean;\n /** \n * Start with video camera on when connecting (default: false).\n * Only works if enableVideo is true. If false, camera stays off until user enables it.\n */\n startWithVideoOn?: boolean;\n /** \n * Start with microphone on when connecting (default: false).\n * If false, microphone stays off until user enables it using audioControls.enableAudio().\n * Useful for text-only modes where you want to defer microphone permission until voice mode.\n */\n startWithAudioOn?: boolean;\n /**\n * Dynamic vision context controls for discrete vision-capable backends.\n * Defaults to enabled when enableVideo=true. Set\n * visionInputConfig.enabled=false to opt out while keeping the video channel.\n */\n visionInputConfig?: VisionInputConfig;\n /** Connect-time respond-mode defaults by modality. */\n respondModes?: RespondModesConfig;\n /** Enable text-to-speech audio generation (default: true) */\n ttsEnabled?: boolean;\n /** \n * Enable lipsync/facial animation blendshapes (default: false).\n * When true, sets blendshape_provider to \"neurosync\".\n * When false, sets blendshape_provider to \"none\" (no facial animation data).\n */\n enableLipsync?: boolean;\n /** Enable emotion detection and bot-emotion updates (default: false) */\n enableEmotion?: boolean;\n /** Blendshape configuration for facial animation format */\n blendshapeConfig?: {\n /** Format of blendshapes: \"arkit\" or \"mha\" (Meta Human Animation, default: \"mha\") */\n format?: \"arkit\" | \"mha\";\n /** \n * Custom mapper function to transform incoming blendshapes.\n * Use this to map Convai blendshapes to your character's morph targets.\n * The function receives the raw blendshape array and should return a Float32Array.\n * \n * @example\n * ```typescript\n * import { createARKitNameMapper } from '@convai/web-sdk/lipsync-helpers';\n * \n * const mapper = createARKitNameMapper({\n * 'Character__Mouth_Open': ['Jaw_Open'],\n * 'Character__EyeL_Blink': ['Eye_Blink_L'],\n * }, 'optimized');\n * \n * const config = {\n * blendshapeConfig: {\n * format: 'arkit',\n * customMapper: mapper,\n * }\n * };\n * ```\n */\n customMapper?: (input: number[] | Float32Array) => Float32Array;\n /** \n * Buffer duration for blendshape frames in seconds (default: 1).\n * Controls how much time the server should wait after generating blendshapes before playing the audio.\n */\n frames_buffer_duration?: number;\n /**\n * Enable server ahead-delivery for NeuroSync chunks.\n *\n * Defaults to `true` when `enableLipsync` is on. The server may send\n * indexed blendshape chunks before audio playback, so use the SDK\n * BlendshapeQueue/player path, which handles owner-scoped cancellation and\n * buffered-frame drops on interruption.\n *\n * Set `false` to fall back to the legacy paced delivery path.\n */\n deliver_chunks_ahead?: boolean;\n /**\n * Requested ahead-delivery blendshape timeline FPS.\n * Applies to the ahead-delivery path, where chunks carry fps\n * metadata for the SDK player. The legacy paced path keeps its fixed 90fps\n * delivery cadence for backward compatibility while SDK playback remains on\n * the normal visual timeline.\n */\n output_fps?: number;\n };\n /** Emotion configuration for character emotional state (sent to server on connect) */\n emotionConfig?:\n | {\n /** LLM-based emotion detection — infers emotion from response context (default) */\n provider: \"llm\";\n }\n | {\n /** NRCLex word-level lexicon lookup */\n provider: \"nrclex\";\n /** Minimum word threshold for emotion detection */\n min_word_threshold?: number;\n /** Low intensity threshold (0–1) */\n low_intensity_threshold?: number;\n /** High intensity threshold (0–1) */\n high_intensity_threshold?: number;\n };\n /** Configuration for character actions and environmental context */\n actionConfig?: {\n /** List of action names the character can perform */\n actions: string[];\n /** Other characters present in the scene or conversation */\n characters: Array<{\n /** Character name */\n name: string;\n /** Character biography or description */\n bio: string;\n }>;\n /** Objects available in the scene or environment */\n objects: Array<{\n /** Object name */\n name: string;\n /** Object description or properties */\n description: string;\n }>;\n /** Name of the object the character is currently focused on. Must match one of objects[].name. */\n current_attention_object?: string;\n };\n /** \n * Dynamic contextual information about the current situation.\n * This can be updated during the conversation to provide real-time context.\n * Use the DynamicInfo type to pass flexible key-value pairs with a required \"text\" field.\n */\n dynamicInfo?: DynamicInfo;\n /**\n * Template key values for Narrative Design placeholder substitution,\n * sent as `narrative_template_keys` in the /connect request.\n *\n * Narrative Design section objectives and speak tags may contain\n * placeholders such as `{player_name}` or `{quest_item}`; they are replaced\n * with these values when the section is evaluated, so one narrative graph\n * can serve many personalized sessions. Keys are case-sensitive; missing\n * keys resolve to an empty string.\n *\n * To change the keys mid-session, call `updateTemplateKeys()` — it replaces\n * this same map at runtime (before the next trigger fires).\n *\n * @example\n * ```typescript\n * const client = new ConvaiClient({\n * apiKey: 'your-api-key',\n * characterId: 'your-character-id',\n * narrativeTemplateKeys: {\n * player_name: 'Alex',\n * location: 'Engineering Deck',\n * quest_item: 'oxygen generator',\n * },\n * });\n * ```\n */\n narrativeTemplateKeys?: Record<string, string>;\n /**\n * Keep dynamic info in context as a static prompt (default: false).\n * \n * When true:\n * - Dynamic info behaves as a static prompt sent to the LLM for that WebRTC connection\n * - Dynamic info persists throughout the session\n * - You need to set it again after disconnecting/reconnecting\n * \n * When false:\n * - Allows resetting and updating via updateContext() or updateDynamicInfo()\n * - Dynamic info can be changed during the session\n */\n keepInContext?: boolean;\n /** \n * Enable debug mode for additional logging and diagnostics (default: false).\n */\n debug?: boolean;\n /**\n * Log decoded RTVI data messages to the browser console (default: true).\n * Set to false to silence incoming and outgoing RTVI message logs.\n */\n logRtviMessages?: boolean;\n /** \n * Metadata about the invocation source and client information.\n * Used for analytics and debugging purposes.\n */\n invocationMetadata?: {\n /** Source of the invocation (e.g., \"web\", \"mobile\", \"unity\") */\n source?: string;\n /** Client SDK version */\n clientVersion?: string;\n /** Additional custom metadata */\n extraMetadata?: Record<string, unknown>;\n };\n}\n\n/**\n * Represents a single message in the chat conversation.\n * Different message types are used for various parts of the conversation flow.\n */\nexport interface ChatMessage {\n /** Unique identifier for the message */\n id: string;\n /** \n * Type of message:\n * - `user`: User's sent message\n * - `convai`: Character's response\n * - `user-transcription`: Real-time speech-to-text from user\n * - `bot-llm-text`: Character's LLM-generated text (token-by-token streaming)\n * - `bot-output`: Aggregated bot output (sentence/word-level chunks with spoken status)\n * - `emotion`: Character's emotional state\n * - `behavior-tree`: Behavior tree response\n * - `action`: Action execution\n * - `bot-emotion`: Bot emotional response\n * - `user-llm-text`: User text processed by LLM\n * - `interrupt-bot`: Interrupt the bot's current response\n * - `idle-warning`: Server idle-timeout warning; `content` holds remaining seconds as a numeric string (e.g. `\"45\"`)\n * - `llm-no-response`: LLM deliberately did not respond (abstain); `content` is always `\"\"`\n */\n type: 'user' | 'convai' | 'emotion' | 'behavior-tree' | 'action' | 'user-transcription' | 'bot-llm-text' | 'bot-output' | 'bot-emotion' | 'user-llm-text' | 'interrupt-bot' | 'idle-warning' | 'llm-no-response';\n /** The text content of the message */\n content: string;\n /** ISO timestamp string of when the message was created */\n timestamp: string;\n /** Whether this message is still streaming (mutable); false when finalized */\n isStreaming?: boolean;\n}\n\n/**\n * Represents a single metrics event from the server.\n * Multiple metrics may be received during a conversation.\n */\nexport interface ConvaiMetrics {\n /** Raw metrics data from the server */\n data: Record<string, unknown>;\n /** Timestamp when the metrics were received */\n timestamp: string;\n /** Unique identifier for this metrics event */\n id: string;\n}\n\n/**\n * Represents the current state of the Convai client connection and activity.\n * Use this to provide UI feedback about the conversation state.\n * \n * @example\n * ```typescript\n * const { state } = convaiClient;\n * \n * if (state.isConnected) {\n * console.log('Connected to character');\n * }\n * \n * if (state.isSpeaking) {\n * console.log('Character is speaking');\n * }\n * \n * // Or use the combined state\n * console.log(state.agentState); // 'listening' | 'thinking' | 'speaking'\n * \n * // Access end user information\n * console.log(state.endUserId); // 'user@example.com'\n * console.log(state.endUserMetadata); // { name: 'John', age: '30' }\n * \n * // Access metrics for the current conversation\n * console.log(state.metrics); // Array of metrics events\n * \n * // Check disconnect reason\n * if (state.disconnectReason !== null) {\n * console.log('Disconnected due to:', state.disconnectReason);\n * }\n * ```\n */\nexport interface ConvaiClientState {\n /** Whether the client is currently connected to Convai */\n isConnected: boolean;\n /** Whether a connection attempt is in progress */\n isConnecting: boolean;\n /** True from user-started-speaking until user-stopped-speaking (user is speaking, bot is listening). Priority below isSpeaking. */\n isListening: boolean;\n /** Whether the character is processing/thinking about a response */\n isThinking: boolean;\n /** Whether the character is currently speaking */\n isSpeaking: boolean;\n /** \n * Combined state indicator for the character's current activity.\n * Priority: speaking > listening (user speaking) > thinking > connected.\n */\n agentState: 'disconnected' | 'connected' | 'listening' | 'thinking' | 'speaking';\n /** Current bot emotion (name and optional scale). Updated when bot-emotion messages are received. */\n emotion: { emotion: string; scale?: number } | null;\n /** \n * End user ID returned from the connection response.\n * This is the actual end user ID used by the server (may differ from the one provided in config).\n */\n endUserId: string | null;\n /** \n * End user metadata returned from the connection response.\n * Contains additional information about the end user.\n */\n endUserMetadata: Record<string, unknown> | null;\n /** \n * Array of metrics events received during the current session.\n * Multiple metrics may be received per conversation.\n * Clears when resetSession() is called.\n */\n metrics: ConvaiMetrics[];\n /** \n * Disconnect reason from LiveKit when disconnected.\n * null when connected, otherwise contains the reason code.\n * Use this to differentiate between client-initiated disconnects and network/server issues.\n * \n * Notable reasons:\n * - CLIENT_INITIATED (1): User disconnected intentionally\n * - DUPLICATE_IDENTITY (2): Another client with same identity joined\n * - SERVER_SHUTDOWN (3): Server shutting down\n * - PARTICIPANT_REMOVED (4): Removed by API\n * - ROOM_DELETED (5): Room was ended\n * \n * Non-CLIENT_INITIATED reasons may indicate network disruptions where reconnection is appropriate.\n * \n * @see DisconnectReason\n */\n disconnectReason: DisconnectReason | null;\n}\n\n/**\n * Audio control interface for managing microphone\n */\nexport interface AudioControls {\n isAudioEnabled: boolean;\n isAudioMuted: boolean;\n audioLevel: number;\n enableAudio: () => Promise<void>;\n disableAudio: () => Promise<void>;\n muteAudio: () => Promise<void>;\n unmuteAudio: () => Promise<void>;\n toggleAudio: () => Promise<void>;\n setAudioDevice: (deviceId: string) => Promise<void>;\n getAudioDevices: () => Promise<MediaDeviceInfo[]>;\n startAudioLevelMonitoring: () => void;\n stopAudioLevelMonitoring: () => void;\n // EventEmitter methods for React integration\n on: (event: string, callback: (...args: any[]) => void) => () => void;\n off: (event: string, callback: (...args: any[]) => void) => void;\n}\n\n/**\n * Video control interface for managing camera\n */\nexport interface VideoControls {\n isVideoEnabled: boolean;\n isVideoHidden: boolean;\n activeVisionSource: VisionSourceHandle | null;\n hasActiveVisionSource: boolean;\n visionSourceState: VisionSourceState;\n enableVideo: () => Promise<void>;\n disableVideo: () => Promise<void>;\n hideVideo: () => Promise<void>;\n showVideo: () => Promise<void>;\n toggleVideo: () => Promise<void>;\n setVideoDevice: (deviceId: string) => Promise<void>;\n getVideoDevices: () => Promise<MediaDeviceInfo[]>;\n setVideoQuality: (quality: 'low' | 'medium' | 'high') => Promise<void>;\n publishCanvas: (\n canvas: HTMLCanvasElement,\n options?: PublishCanvasOptions,\n ) => Promise<VisionSourceHandle>;\n publishVideoTrack: (\n track: MediaStreamTrack,\n options?: PublishVideoTrackOptions,\n ) => Promise<VisionSourceHandle>;\n unpublishVisionSource: (\n source?: VisionSourceHandle | MediaStreamTrack,\n ) => Promise<void>;\n // EventEmitter methods for React integration\n on: (event: string, callback: (...args: any[]) => void) => () => void;\n off: (event: string, callback: (...args: any[]) => void) => void;\n}\n\n/**\n * Screen share control interface\n */\nexport interface ScreenShareControls {\n isScreenShareEnabled: boolean;\n isScreenShareActive: boolean;\n enableScreenShare: () => Promise<void>;\n disableScreenShare: () => Promise<void>;\n toggleScreenShare: () => Promise<void>;\n enableScreenShareWithAudio: () => Promise<void>;\n getScreenShareTracks: () => Promise<any[]>;\n // EventEmitter methods for React integration\n on: (event: string, callback: (...args: any[]) => void) => () => void;\n off: (event: string, callback: (...args: any[]) => void) => void;\n}\n\n/**\n * Main Convai client interface.\n * Provides complete control over Convai character connections and interactions.\n * \n * @example\n * ```typescript\n * import { ConvaiClient } from '@convai/web-sdk/core';\n * \n * const client = new ConvaiClient();\n * \n * // Connect to character\n * await client.connect({\n * apiKey: 'your-api-key',\n * characterId: 'your-character-id',\n * endUserId: '-1' // Dev mode\n * });\n * \n * // Send a message\n * client.sendUserTextMessage('Hello!');\n * \n * // Listen for state changes\n * client.on('stateChange', (state) => {\n * console.log('State:', state);\n * });\n * \n * // Listen for messages\n * client.on('message', (message) => {\n * console.log('New message:', message);\n * });\n * ```\n */\n/**\n * Memory API Types\n * Types for Convai's long-term memory management APIs\n */\n\n/**\n * Memory object returned from the API\n */\nexport interface Memory {\n /** Unique memory identifier (UUID) */\n id: string;\n /** Memory text content */\n memory: string;\n /** ISO timestamp when the memory was created */\n created_at: string;\n /** ISO timestamp when the memory was last updated */\n updated_at: string;\n}\n\n/**\n * Memory event object from add operation\n */\nexport interface MemoryAddEvent {\n /** Memory identifier */\n id: string;\n /** Event type (always \"ADD\" for add operations) */\n event: 'ADD';\n /** Memory text content */\n memory: string;\n}\n\n/**\n * Request to add memories\n */\nexport interface MemoryAddRequest {\n /** Character UUID */\n character_id: string;\n /** End user identifier */\n end_user_id: string;\n /** Array of memory strings to add */\n memories: string[];\n}\n\n/**\n * Response from add memories operation\n */\nexport interface MemoryAddResponse {\n /** Array of added memories with their IDs */\n memories: MemoryAddEvent[];\n}\n\n/**\n * Request to list memories with pagination\n */\nexport interface MemoryListRequest {\n /** Character UUID */\n character_id: string;\n /** End user identifier */\n end_user_id: string;\n /** Page number (default: 1, clamped to 1-1000) */\n page?: number;\n /** Number of memories per page (default: 50, clamped to 1-100) */\n page_size?: number;\n}\n\n/**\n * Response from list memories operation\n */\nexport interface MemoryListResponse {\n /** Array of memories */\n memories: Memory[];\n /** Total count of memories for this character/user pair */\n total_count: number;\n /** Current page number */\n page: number;\n /** Number of memories per page */\n page_size: number;\n /** Whether there are more pages available */\n has_more: boolean;\n}\n\n/**\n * Request to get a single memory\n */\nexport interface MemoryGetRequest {\n /** Character UUID */\n character_id: string;\n /** End user identifier */\n end_user_id: string;\n /** Memory UUID to fetch */\n memory_id: string;\n}\n\n/**\n * Response from get memory operation\n */\nexport type MemoryGetResponse = Memory;\n\n/**\n * Request to delete a memory\n */\nexport interface MemoryDeleteRequest {\n /** Character UUID */\n character_id: string;\n /** End user identifier */\n end_user_id: string;\n /** Memory UUID to delete */\n memory_id: string;\n}\n\n/**\n * Response from delete memory operation\n */\nexport interface MemoryDeleteResponse {\n /** Success message */\n message: string;\n /** Memory ID that was deleted */\n memory_id: string;\n /** Whether the memory was successfully deleted */\n deleted: boolean;\n}\n\n/**\n * Request to delete all memories\n */\nexport interface MemoryDeleteAllRequest {\n /** Character UUID */\n character_id: string;\n /** End user identifier */\n end_user_id: string;\n}\n\n/**\n * Response from delete all memories operation\n */\nexport interface MemoryDeleteAllResponse {\n /** Status message (deletion is asynchronous) */\n message: string;\n /** Character ID for which memories are being deleted */\n character_id: string;\n /** End user ID for which memories are being deleted */\n end_user_id: string;\n}\n\n/**\n * Error response from Memory API\n */\nexport interface MemoryError {\n /** Error message */\n ERROR: string;\n /** Transaction reference ID for debugging */\n 'Reference ID': string;\n}\n\nexport interface IConvaiClient {\n /** Current connection and activity state of the client */\n readonly state: ConvaiClientState;\n \n /** \n * Connection type: \"audio\" (audio only) or \"video\" (audio + video + screenshare).\n * Set based on enableVideo in connect config.\n */\n readonly connectionType: 'audio' | 'video' | null;\n \n /** API key used for the current connection, if apiKey was used (null otherwise) */\n readonly apiKey?: string | null;\n\n /** Auth token used for the current connection, if authToken was used (null otherwise) */\n readonly authToken?: string | null;\n\n /** Character ID used for the current connection (null if not connected) */\n readonly characterId: string | null;\n \n /** Internal LiveKit Room instance (for advanced usage) */\n readonly room: Room;\n \n /** Array of all chat messages in the current conversation */\n readonly chatMessages: ChatMessage[];\n \n /** Current real-time transcription of user speech */\n readonly userTranscription: string;\n \n /** Unique session ID for the current character conversation */\n readonly characterSessionId: string | null;\n \n /** Whether the bot is ready to receive messages (true after bot-ready message) */\n readonly isBotReady: boolean;\n \n /** Audio control methods for managing microphone mute/unmute */\n readonly audioControls: AudioControls;\n \n /** Video control methods for enabling/disabling camera */\n readonly videoControls: VideoControls;\n \n /** Screen sharing control methods */\n readonly screenShareControls: ScreenShareControls;\n \n /** Blendshape queue for time-based lipsync synchronization */\n readonly blendshapeQueue: BlendshapeQueue;\n \n /** Incremental turn session ID used by conversation events (e.g. conversationStart, turnEnd) */\n readonly conversationSessionId: number;\n \n /** \n * Memory manager for long-term memory operations.\n * Returns null if no API key or end user ID is available.\n * \n * @example\n * ```typescript\n * const memoryManager = client.memoryManager;\n * if (memoryManager) {\n * const memories = await memoryManager.listMemories();\n * }\n * ```\n */\n readonly memoryManager: import('./MemoryManager').MemoryManager | null;\n \n /** \n * Connect to a Convai character.\n */\n connect: (config?: ConvaiConfig) => Promise<void>;\n \n /** Disconnect from the current character session */\n disconnect: () => Promise<void>;\n \n /** Reconnect - disconnect and connect again using stored config */\n reconnect: () => Promise<void>;\n \n /** Reset the session ID to start a new conversation (clears history) */\n resetSession: () => void;\n \n /** Send a text message to the character */\n sendUserTextMessage: (text: string) => void;\n \n /** \n * Send a trigger message to invoke specific character actions or responses.\n * @param triggerName - Name of the trigger to invoke\n * @param triggerMessage - Optional message to accompany the trigger\n */\n sendTriggerMessage: (triggerName?: string, triggerMessage?: string) => void;\n \n /**\n * Send an interrupt message to stop the bot's current response.\n * This can be used to interrupt the bot when the user wants to speak.\n */\n sendInterruptMessage: () => void;\n\n /**\n * Reset the server-side idle timer.\n * Call this on any user activity (clicks, UI interactions, etc.) to prevent\n * the session from being disconnected due to inactivity.\n * The server sends `user-idle-warning` events (via the `idleWarning` event) before\n * disconnecting; use this method to keep the session alive.\n */\n resetIdleTimer: () => void;\n \n /**\n * Replace the Narrative Design template keys on the live session.\n *\n * These are the same keys as the `narrativeTemplateKeys` config option\n * (which seeds them at `/connect`) — this method REPLACES the entire map\n * at runtime, so include every key you still need. New values apply when\n * the next section objective or speak tag is evaluated (i.e. set them\n * before firing the next narrative trigger).\n *\n * Requires a character with Narrative Design enabled; otherwise the server\n * acks `update-template-keys` with error \"Narrative design service not\n * available\". Placeholders use single braces (`{player_name}`), keys are\n * case-sensitive, and missing keys resolve to an empty string.\n *\n * @example\n * ```typescript\n * client.updateTemplateKeys({ player_name: 'Aria', quest_item: 'lantern' });\n * client.sendTriggerMessage('QuestUpdate');\n * ```\n */\n updateTemplateKeys: (templateKeys: { [key: string]: string }) => void;\n \n /** \n * Update dynamic information about the current context.\n * This helps the character understand the current situation.\n * Pass any key-value pairs you want, but \"text\" field is required.\n */\n updateDynamicInfo: (dynamicInfo: DynamicInfo) => void;\n \n /**\n * Update the bot's temporary runtime context in a unified way.\n * Provides flexible control over ephemeral context management.\n * \n * @param options - Context update configuration\n * \n * @example\n * ```typescript\n * // Append to context\n * client.updateContext({ \n * text: \"User completed quest\", \n * mode: \"append\",\n * run_llm: \"false\"\n * });\n * \n * // Replace context\n * client.updateContext({ \n * text: \"New game state\", \n * mode: \"replace\",\n * run_llm: \"auto\"\n * });\n * \n * // Clear context\n * client.updateContext({ mode: \"reset\" });\n * ```\n */\n updateContext: (options: ContextUpdateOptions) => void;\n\n /** Request a server ack containing the current vision buffer status. */\n visionStatus: (options?: VisionStatusOptions) => string | null;\n\n /** Attach buffered frames and optionally trigger a response. */\n visionTrigger: (options?: VisionTriggerOptions) => string | null;\n\n /** Update a session respond-mode default. */\n respondModeUpdate: (options: RespondModeUpdateOptions) => string | null;\n\n /**\n * Set or clear the character's temporary state of mind without triggering a response.\n * Pass `null` (or `\"neutral\"`) to clear it.\n */\n updateEmotion: (stateOfMind: string | null) => void;\n\n /**\n * Send descriptive scene updates so the bot knows what is visible or nearby.\n * Does not modify actionConfig.\n */\n updateSceneMetadata: (\n items: Array<{ name: string; description: string }>,\n options?: UpdateSceneMetadataOptions,\n ) => void;\n\n /**\n * Toggle text-to-speech on or off.\n * When disabled, character responses won't be spoken aloud.\n */\n toggleTts: (enabled: boolean) => void;\n \n /** \n * Toggle speech-to-text on or off.\n * When enabled, user speech is transcribed to text (e.g. for dictation).\n * When disabled, STT is off.\n */\n toggleStt: (enabled: boolean) => void;\n\n /**\n * Upload a file to the character via the LiveKit byte stream transport.\n * Only works when connected with the LiveKit transport.\n *\n * @param file - The File object to send\n * @param options - Optional upload options\n * @returns Promise that resolves when the upload is complete\n *\n * @example\n * ```typescript\n * await client.uploadFile(file, {\n * topic: 'file-upload',\n * onProgress: (pct) => console.log(`${pct}% uploaded`),\n * });\n * ```\n */\n uploadFile: (file: File, options?: UploadFileOptions) => Promise<void>;\n\n /**\n * Subscribe to an event\n * @param event Event name ('stateChange', 'message', 'connect', 'disconnect', 'error')\n * @param callback Callback function\n * @returns Unsubscribe function\n */\n on: (event: string, callback: (...args: any[]) => void) => () => void;\n \n /**\n * Unsubscribe from an event\n * @param event Event name\n * @param callback Callback function to remove\n */\n off: (event: string, callback: (...args: any[]) => void) => void;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAuBA;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,cAAc,EAAE,CAAC;IACjB,gBAAgB,EAAE,CAAC;IACnB,kBAAkB,EAAE,CAAC;IACrB,eAAe,EAAE,CAAC;IAClB,mBAAmB,EAAE,CAAC;IACtB,YAAY,EAAE,CAAC;IACf,cAAc,EAAE,CAAC;IACjB,YAAY,EAAE,CAAC;IACf,SAAS,EAAE,CAAC;IACZ,YAAY,EAAE,CAAC;CACP,CAAC;AAEX;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAA+B;IACxE,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,oBAAoB,CAAC,cAAc;YACtC,OAAO,sCAAsC,CAAC;QAChD,KAAK,oBAAoB,CAAC,gBAAgB;YACxC,OAAO,mBAAmB,CAAC;QAC7B,KAAK,oBAAoB,CAAC,kBAAkB;YAC1C,OAAO,0CAA0C,CAAC;QACpD,KAAK,oBAAoB,CAAC,eAAe;YACvC,OAAO,yBAAyB,CAAC;QACnC,KAAK,oBAAoB,CAAC,mBAAmB;YAC3C,OAAO,kCAAkC,CAAC;QAC5C,KAAK,oBAAoB,CAAC,YAAY;YACpC,OAAO,+BAA+B,CAAC;QACzC,KAAK,oBAAoB,CAAC,cAAc;YACtC,OAAO,gBAAgB,CAAC;QAC1B,KAAK,oBAAoB,CAAC,YAAY;YACpC,OAAO,gBAAgB,CAAC;QAC1B,KAAK,oBAAoB,CAAC,SAAS;YACjC,OAAO,qCAAqC,CAAC;QAC/C,KAAK,oBAAoB,CAAC,YAAY;YACpC,OAAO,0BAA0B,CAAC;QACpC;YACE,OAAO,cAAc,CAAC;IAC1B,CAAC;AACH,CAAC","sourcesContent":["import { Room, DisconnectReason as LiveKitDisconnectReason } from 'livekit-client';\nimport { BlendshapeQueue } from './BlendshapeQueue';\n\n/**\n * LiveKit disconnect reasons.\n * Helps determine why a participant was disconnected from the room.\n * \n * These values map to LiveKit's DisconnectReason enum:\n * - UNKNOWN_REASON (0): Unknown disconnect reason\n * - CLIENT_INITIATED (1): Client called disconnect() - intentional disconnect\n * - DUPLICATE_IDENTITY (2): Another client with the same identity joined the room\n * - SERVER_SHUTDOWN (3): LiveKit server is shutting down\n * - PARTICIPANT_REMOVED (4): Participant was removed by RemoveParticipant API\n * - ROOM_DELETED (5): Room was ended via DeleteRoom API\n * - STATE_MISMATCH (6): State mismatch between client and server\n * - JOIN_FAILURE (7): Failed to join the room\n * - MIGRATION (8): Participant moved to a different room\n * - SIGNAL_CLOSE (9): Signal connection was closed\n * \n * @see https://docs.livekit.io/reference/client-sdk-js/enums/DisconnectReason.html\n */\nexport type DisconnectReason = LiveKitDisconnectReason;\n\n/**\n * Export LiveKit's DisconnectReason enum values for easy access\n */\nexport const DisconnectReasonEnum = {\n UNKNOWN_REASON: 0,\n CLIENT_INITIATED: 1,\n DUPLICATE_IDENTITY: 2,\n SERVER_SHUTDOWN: 3,\n PARTICIPANT_REMOVED: 4,\n ROOM_DELETED: 5,\n STATE_MISMATCH: 6,\n JOIN_FAILURE: 7,\n MIGRATION: 8,\n SIGNAL_CLOSE: 9,\n} as const;\n\n/**\n * Get a human-readable message for a disconnect reason.\n * \n * @param reason - The disconnect reason code from LiveKit\n * @returns A human-readable message describing the disconnect reason\n * \n * @example\n * ```typescript\n * client.on('disconnect', (reason) => {\n * console.log(getDisconnectReasonMessage(reason));\n * // Output: \"User disconnected\"\n * });\n * ```\n */\nexport function getDisconnectReasonMessage(reason: DisconnectReason | null): string {\n if (reason === null) {\n return 'Connected';\n }\n\n switch (reason) {\n case DisconnectReasonEnum.UNKNOWN_REASON:\n return 'Network unavailable or unknown cause';\n case DisconnectReasonEnum.CLIENT_INITIATED:\n return 'User disconnected';\n case DisconnectReasonEnum.DUPLICATE_IDENTITY:\n return 'Another client with same identity joined';\n case DisconnectReasonEnum.SERVER_SHUTDOWN:\n return 'Server is shutting down';\n case DisconnectReasonEnum.PARTICIPANT_REMOVED:\n return 'Removed by RemoveParticipant API';\n case DisconnectReasonEnum.ROOM_DELETED:\n return 'Room ended via DeleteRoom API';\n case DisconnectReasonEnum.STATE_MISMATCH:\n return 'State mismatch';\n case DisconnectReasonEnum.JOIN_FAILURE:\n return 'Failed to join';\n case DisconnectReasonEnum.MIGRATION:\n return 'Participant moved to different room';\n case DisconnectReasonEnum.SIGNAL_CLOSE:\n return 'Signal connection closed';\n default:\n return 'Disconnected';\n }\n}\n\n/**\n * Dynamic information structure for passing real-time context to the character.\n * Pass a text description of the current dynamic context.\n * \n * @example\n * ```typescript\n * const dynamicInfo = \"Player health is low, in combat mode\";\n * ```\n */\nexport type DynamicInfo = string;\n\n/**\n * Minimal contract that ConvaiClient and AudioManager require from a WebSocket\n * session implementation. Defined here so core has zero import dependency on\n * the pipecat packages — the concrete class lives in the vanilla/websocket subpath.\n */\nexport interface IWebSocketSession {\n readonly isConnected: boolean;\n connectWithUrl(wsUrl: string): Promise<void>;\n disconnect(): Promise<void>;\n sendMessage(type: string, data: unknown): void;\n enableMic(enable: boolean): void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n on(event: string, listener: (...args: any[]) => void): () => void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n off(event: string, listener: (...args: any[]) => void): void;\n}\n\n/**\n * Factory function signature used to register a WebSocket transport implementation\n * via {@link ConvaiClient.registerWebSocketTransport}. Import\n * `@convai/web-sdk/vanilla/websocket` (or `@convai/web-sdk/react/websocket`) as a\n * side-effect to register the default Pipecat-based implementation.\n */\nexport type WebSocketSessionFactory = (\n onMessage: (payload: Uint8Array) => void,\n enableMic: boolean,\n) => IWebSocketSession;\n\n/**\n * Options for {@link IConvaiClient.uploadFile}.\n *\n * Supported formats: JPEG, PNG, GIF, WebP. Maximum file size: 10 MB.\n * Files are sent as raw binary over the WebRTC byte stream — not base64 encoded.\n */\nexport interface UploadFileOptions {\n /** Server routing topic. Defaults to `'file-upload'`. */\n topic?: string;\n /**\n * Progress callback. Called with an integer percentage (0–100) as the upload proceeds.\n */\n onProgress?: (progressPercent: number) => void;\n}\n\n/**\n * Extra data returned in a server-response for specific event types.\n */\nexport interface ServerResponseExtras {\n // context-update extras\n token_count?: number;\n static_token_count?: number;\n runtime_token_count?: number;\n max_tokens?: number;\n static_max_tokens?: number;\n runtime_max_tokens?: number;\n remaining_tokens?: number;\n /** Full retained runtime dynamic context text after the update */\n content?: string;\n // tts-toggle extras\n enabled?: boolean;\n // stt-toggle extras\n muted?: boolean;\n // trigger-message extras\n trigger_name?: string;\n has_speak_tag?: boolean;\n // user_text_message extras\n text?: string;\n // kill-pipeline extras\n room_name?: string;\n // unknown-message-type error extras\n supported_types?: string[];\n // vision-status / vision-trigger extras\n vision_buffer?: VisionBufferStatus;\n requested_respond_mode?: RespondMode;\n actual_respond_mode?: RespondMode;\n requested_run_llm?: \"true\" | \"false\" | \"auto\";\n actual_run_llm?: \"true\" | \"false\" | \"auto\";\n llm_triggered?: boolean;\n downgraded?: boolean;\n downgrade_reason?: string | null;\n interrupted?: boolean;\n vision_frames_attached?: number;\n vision_image_tokens_est?: number;\n vision_detail_level?: string | null;\n vision_attach_outcome?: string;\n vision_source_participant?: string | null;\n attached_frame_pts?: number[];\n frame_binding?: string;\n frame_binding_error?: string | null;\n requested_frame_indices?: [number, number] | number[] | null;\n requested_frame_ids?: number[] | null;\n frame_indices_clamped?: boolean;\n frame_ids_stale_exempt?: boolean;\n [key: string]: unknown;\n}\n\n/**\n * Acknowledgment sent by the server for every client-to-server message.\n * Analogous to an HTTP response: use `status` to check success/failure and\n * `extras` for event-specific data such as context token counts.\n *\n * @example\n * ```typescript\n * client.on('serverResponse', (response) => {\n * if (response.event_type === 'context-update') {\n * const { remaining_tokens, max_tokens } = response.extras ?? {};\n * console.log(`Tokens remaining: ${remaining_tokens} / ${max_tokens}`);\n * }\n * if (response.status === 'error') {\n * console.error('Server error:', response.message);\n * }\n * });\n * ```\n */\nexport interface ServerResponse {\n /** The original client message type that triggered this response */\n event_type: string;\n /** Processing status */\n status: 'success' | 'error' | 'processing' | 'pending';\n /** Human-readable description of the result */\n message: string | null;\n /** Additional event-specific data */\n extras: ServerResponseExtras | null;\n}\n\n/**\n * Emitted when the server assigns an interaction ID to the session.\n * Store the interactionId for analytics or session tracking.\n */\nexport interface InteractionCreated {\n /** Unique identifier for this interaction session */\n interactionId: string;\n /** Character session identifier */\n characterSessionId: string;\n}\n\n/**\n * A single action the character performs, emitted via the `actionResponse`\n * event. When `target` is present the action is *parameterized* (the character\n * acts on a specific object/character); simple actions (e.g. `\"Wave\"`) omit it.\n */\nexport interface ConvaiAction {\n /** Base action name, e.g. `\"Move To\"`, `\"Pick Up\"`, `\"Wave\"`. */\n name: string;\n /**\n * The object or character the action targets — must match a name from\n * `actionConfig.objects[]` / `actionConfig.characters[]`. Absent for simple\n * (non-parameterized) actions.\n */\n target?: string;\n}\n\n/**\n * Payload of the `actionResponse` event. Actions execute sequentially; an\n * empty array is a valid \"no action\" turn.\n */\nexport interface ActionResponseEvent {\n actions: ConvaiAction[];\n}\n\n/**\n * Options for updating the bot's temporary runtime context.\n * Provides flexible control over how context is managed during conversation.\n * \n * @example\n * ```typescript\n * // Append to existing context\n * client.updateContext({\n * text: \"User just completed dragon quest\",\n * mode: \"append\",\n * run_llm: \"false\"\n * });\n * \n * // Replace entire context\n * client.updateContext({\n * text: \"New game state: level 5, combat mode\",\n * mode: \"replace\",\n * run_llm: \"auto\"\n * });\n * \n * // Reset/clear context\n * client.updateContext({\n * mode: \"reset\"\n * });\n * ```\n */\nexport interface ContextUpdateOptions {\n /**\n * The context text to inject.\n * Required unless mode is \"reset\" or only current_attention_object is being updated.\n */\n text?: string;\n /**\n * How to apply the context:\n * - \"append\" (default): Add text to existing ephemeral context\n * - \"replace\": Replace existing ephemeral context with new text\n * - \"reset\": Clear ephemeral context; text is optional\n */\n mode?: \"append\" | \"replace\" | \"reset\";\n /**\n * Whether to trigger LLM response:\n * - \"true\": Always trigger a response from the bot and preempt active local playback\n * - \"false\": Never trigger a response\n * - \"auto\" (default): Server decides based on context without preempting active playback\n */\n run_llm?: \"true\" | \"false\" | \"auto\";\n /**\n * Optional respond-mode alias for backends that expose unified respond modes.\n * If `run_llm` is provided, it takes precedence.\n */\n respond_mode?: RespondMode;\n /**\n * The object the character should currently focus on.\n * Must match one of action_config.objects[].name.\n * Pass an empty string to clear current attention.\n */\n current_attention_object?: string;\n}\n\nexport type RespondMode = \"must_respond\" | \"auto\" | \"silent\";\n\nexport type RespondModality =\n | \"text\"\n | \"audio\"\n | \"vision\"\n | \"context_update\"\n | \"trigger\"\n | \"scene_metadata\";\n\nexport interface RespondModesConfig {\n text?: \"must_respond\";\n audio?: \"must_respond\";\n vision?: RespondMode;\n contextUpdate?: RespondMode;\n trigger?: RespondMode;\n sceneMetadata?: RespondMode;\n}\n\nexport interface VisionSamplingWindowConfig {\n count: number;\n intervalMs: number;\n}\n\nexport interface VisionInputConfig {\n /**\n * Enable unified vision context for this session.\n *\n * Defaults to true when enableVideo is true. Set false to keep the video\n * channel available while opting out of unified vision context.\n */\n enabled?: boolean;\n sampleIntervalSecs?: number;\n framesPerTurn?: number;\n bufferFrames?: number;\n samplingWindows?: VisionSamplingWindowConfig[];\n stalenessSeconds?: number;\n maxResolution?: number | null;\n replacePreviousVisionContext?: boolean;\n}\n\nexport interface VisionBufferStatus {\n enabled?: boolean;\n first_frame_pts?: number | null;\n last_frame_pts?: number | null;\n first_frame_index?: number | null;\n retained_frames?: number;\n buffer_frames?: number;\n frames_per_turn?: number;\n replace_previous_vision_context?: boolean;\n evicted_frames?: number;\n effective_fps?: number | null;\n selected_participant?: string | null;\n frames_admitted?: number;\n frames_dropped_foreign_source?: number;\n frames_dropped_inactive_source?: number;\n frames_dropped_rate_limited?: number;\n last_attach?: {\n vision_frames_attached?: number;\n vision_image_tokens_est?: number;\n vision_detail_level?: string | null;\n vision_attach_outcome?: string;\n vision_source_participant?: string | null;\n attached_frame_pts?: number[];\n };\n}\n\nexport interface VisionStatusOptions {\n updateId?: string;\n}\n\nexport interface VisionTriggerOptions {\n updateId?: string;\n text?: string;\n respondMode?: RespondMode;\n frameIndices?: [number, number];\n frameIds?: number[];\n}\n\nexport interface RespondModeUpdateOptions {\n updateId?: string;\n modality: RespondModality;\n mode: RespondMode;\n}\n\nexport interface UpdateSceneMetadataOptions {\n respondMode?: RespondMode;\n}\n\nexport type VisionSourceKind =\n | \"webcam\"\n | \"canvas\"\n | \"screen\"\n | \"custom\"\n // Backward-compatible aliases accepted by the existing SDK surface.\n | \"camera\"\n | \"screen_share\"\n | \"unknown\";\n\nexport interface VisionSourceState {\n active: boolean;\n source: VisionSourceKind | null;\n sourceName: string | null;\n trackState: MediaStreamTrackState | null;\n transport?: \"livekit\" | \"websocket\";\n reason?: string;\n}\n\nexport interface PublishCanvasOptions {\n fps?: number;\n name?: string;\n source?: VisionSourceKind;\n stopTrackOnUnpublish?: boolean;\n}\n\nexport interface PublishVideoTrackOptions {\n name?: string;\n source?: VisionSourceKind;\n /** WebSocket transport frame publish cadence. LiveKit publishes the track continuously. */\n fps?: number;\n stopTrackOnUnpublish?: boolean;\n}\n\nexport interface VisionSourceHandle {\n track: MediaStreamTrack;\n publication?: unknown;\n transport?: \"livekit\" | \"websocket\";\n sourceName: string;\n source: VisionSourceKind;\n stopTrackOnUnpublish: boolean;\n unpublish: () => Promise<void>;\n cleanup?: () => void;\n}\n\n/**\n * Audio processing settings for the microphone input.\n * These settings help optimize the audio quality and reduce interruptions.\n * @internal - This is a fixed configuration and should not be modified by users\n */\nexport interface AudioSettings {\n /** Enable echo cancellation to prevent audio feedback (default: true) */\n echoCancellation?: boolean;\n /** Enable noise suppression to reduce background noise (default: true) */\n noiseSuppression?: boolean;\n /** Enable automatic gain control for consistent volume (default: true) */\n autoGainControl?: boolean;\n /** Audio sample rate in Hz (default: 48000) */\n sampleRate?: number;\n /** Number of audio channels, 1 for mono, 2 for stereo (default: 1) */\n channelCount?: number;\n}\n\n/**\n * Configuration object for connecting to a Convai character.\n * \n * @example\n * ```typescript\n * const config: ConvaiConfig = {\n * apiKey: 'your-api-key',\n * characterId: 'your-character-id',\n * endUserId: 'user-uuid', // Optional: enables long-term memory and analytics\n * enableVideo: false, // If false, connection_type will be \"audio\"\n * };\n * ```\n */\nexport interface ConvaiConfig {\n /** Your Convai API key or Auth Token (at least one is required) */\n apiKey?: string;\n authToken?: string;\n /** The Character ID to connect to (required) */\n characterId: string;\n /** Temporary character state of mind sent as `state_of_mind` on connect. */\n stateOfMind?: string | null;\n /**\n * Stable identifier for the end user (optional).\n *\n * Any non-empty string is accepted. Use a value that uniquely identifies the\n * user across sessions — a UUID or email address are the most common choices:\n *\n * ```ts\n * endUserId: 'a1b2c3d4-...' // UUID (preferred)\n * endUserId: 'user@example.com' // email\n * endUserId: 'device-fingerprint' // any stable unique string\n * ```\n *\n * When provided:\n * - Enables long-term memory: character remembers context from previous sessions\n * - Enables per-user analytics and engagement tracking\n *\n * When omitted the session is anonymous — no memory, no cross-session tracking.\n */\n endUserId?: string;\n /** Optional metadata object for the end user (sent as end_user_metadata to the API) */\n endUserMetadata?: Record<string, unknown>;\n /** Custom Convai API URL (optional, defaults to production endpoint) */\n url?: string;\n /** Transport layer to use. Default: \"livekit\". Use \"websocket\" for Pipecat WebSocket transport. */\n transport?: \"livekit\" | \"websocket\";\n /**\n * Character session ID (optional). Pass to resume an existing session;\n * otherwise populated from the connect API response after first connection.\n */\n characterSessionId?: string;\n /** \n * Enable video capability (default: false).\n * If true, connection_type will be \"video\" (supports audio, video, and screenshare).\n * If false, connection_type will be \"audio\" (audio only).\n */\n enableVideo?: boolean;\n /** \n * Start with video camera on when connecting (default: false).\n * Only works if enableVideo is true. If false, camera stays off until user enables it.\n */\n startWithVideoOn?: boolean;\n /** \n * Start with microphone on when connecting (default: false).\n * If false, microphone stays off until user enables it using audioControls.enableAudio().\n * Useful for text-only modes where you want to defer microphone permission until voice mode.\n */\n startWithAudioOn?: boolean;\n /**\n * Dynamic vision context controls for discrete vision-capable backends.\n * Defaults to enabled when enableVideo=true. Set\n * visionInputConfig.enabled=false to opt out while keeping the video channel.\n */\n visionInputConfig?: VisionInputConfig;\n /** Connect-time respond-mode defaults by modality. */\n respondModes?: RespondModesConfig;\n /**\n * WebRTC ICE transport policy for the LiveKit connection (default: \"relay\").\n * \"relay\" forces TURN-only (reliable against Convai's hosted LiveKit which\n * provides TURN). Set \"all\" to also allow host/srflx candidates when the\n * LiveKit has no TURN server (e.g. local dev).\n */\n iceTransportPolicy?: RTCIceTransportPolicy;\n /** Enable text-to-speech audio generation (default: true) */\n ttsEnabled?: boolean;\n /** \n * Enable lipsync/facial animation blendshapes (default: false).\n * When true, sets blendshape_provider to \"neurosync\".\n * When false, sets blendshape_provider to \"none\" (no facial animation data).\n */\n enableLipsync?: boolean;\n /** Enable emotion detection and bot-emotion updates (default: false) */\n enableEmotion?: boolean;\n /** Blendshape configuration for facial animation format */\n blendshapeConfig?: {\n /** Format of blendshapes: \"arkit\" or \"mha\" (Meta Human Animation, default: \"mha\") */\n /**\n * Blendshape stream format (default: \"mha\"). Server-verified set:\n * - \"mha\" — 251 channels (Unreal MetaHuman Animation, CTRL_expressions_*)\n * - \"arkit\" — 61 channels (Apple ARKit names)\n * - \"cc4_extended\" — 170 channels (Reallusion CC4 ExpressionPlus)\n * - \"cc5_hd\" — accepted by the server but currently delivers no frames\n * - \"visemes\" — 15 channels (OVR viseme set)\n */\n format?: \"arkit\" | \"mha\" | \"cc4_extended\" | \"cc5_hd\" | \"visemes\";\n /** \n * Custom mapper function to transform incoming blendshapes.\n * Use this to map Convai blendshapes to your character's morph targets.\n * The function receives the raw blendshape array and should return a Float32Array.\n * \n * @example\n * ```typescript\n * import { createARKitNameMapper } from '@convai/web-sdk/lipsync-helpers';\n * \n * const mapper = createARKitNameMapper({\n * 'Character__Mouth_Open': ['Jaw_Open'],\n * 'Character__EyeL_Blink': ['Eye_Blink_L'],\n * }, 'optimized');\n * \n * const config = {\n * blendshapeConfig: {\n * format: 'arkit',\n * customMapper: mapper,\n * }\n * };\n * ```\n */\n customMapper?: (input: number[] | Float32Array) => Float32Array;\n /** \n * Buffer duration for blendshape frames in seconds (default: 1).\n * Controls how much time the server should wait after generating blendshapes before playing the audio.\n */\n frames_buffer_duration?: number;\n /**\n * Enable server ahead-delivery for NeuroSync chunks (default: true).\n *\n * Defaults to `true` when `enableLipsync` is on. The server may send\n * indexed blendshape chunks before audio playback, so use the SDK\n * BlendshapeQueue/player path, which handles owner-scoped cancellation and\n * buffered-frame drops on interruption.\n *\n * Set `false` to fall back to the legacy paced delivery path.\n */\n deliver_chunks_ahead?: boolean;\n /**\n * Requested ahead-delivery blendshape timeline FPS.\n * Applies to the ahead-delivery path, where chunks carry fps\n * metadata for the SDK player. The legacy paced path keeps its fixed 90fps\n * delivery cadence for backward compatibility while SDK playback remains on\n * the normal visual timeline.\n */\n output_fps?: number;\n };\n /** Emotion configuration for character emotional state (sent to server on connect) */\n emotionConfig?:\n | {\n /** LLM-based emotion detection — infers emotion from response context (default) */\n provider: \"llm\";\n }\n | {\n /** NRCLex word-level lexicon lookup */\n provider: \"nrclex\";\n /** Minimum word threshold for emotion detection */\n min_word_threshold?: number;\n /** Low intensity threshold (0–1) */\n low_intensity_threshold?: number;\n /** High intensity threshold (0–1) */\n high_intensity_threshold?: number;\n };\n /** Configuration for character actions and environmental context */\n actionConfig?: {\n /** List of action names the character can perform */\n actions: string[];\n /** Other characters present in the scene or conversation */\n characters: Array<{\n /** Character name */\n name: string;\n /** Character biography or description */\n bio: string;\n }>;\n /** Objects available in the scene or environment */\n objects: Array<{\n /** Object name */\n name: string;\n /** Object description or properties */\n description: string;\n }>;\n /** Name of the object the character is currently focused on. Must match one of objects[].name. */\n current_attention_object?: string;\n };\n /** \n * Dynamic contextual information about the current situation.\n * This can be updated during the conversation to provide real-time context.\n * Use the DynamicInfo type to pass flexible key-value pairs with a required \"text\" field.\n */\n dynamicInfo?: DynamicInfo;\n /**\n * Template key values for Narrative Design placeholder substitution,\n * sent as `narrative_template_keys` in the /connect request.\n *\n * Narrative Design section objectives and speak tags may contain\n * placeholders such as `{player_name}` or `{quest_item}`; they are replaced\n * with these values when the section is evaluated, so one narrative graph\n * can serve many personalized sessions. Keys are case-sensitive; missing\n * keys resolve to an empty string.\n *\n * To change the keys mid-session, call `updateTemplateKeys()` — it replaces\n * this same map at runtime (before the next trigger fires).\n *\n * @example\n * ```typescript\n * const client = new ConvaiClient({\n * apiKey: 'your-api-key',\n * characterId: 'your-character-id',\n * narrativeTemplateKeys: {\n * player_name: 'Alex',\n * location: 'Engineering Deck',\n * quest_item: 'oxygen generator',\n * },\n * });\n * ```\n */\n narrativeTemplateKeys?: Record<string, string>;\n /**\n * Keep dynamic info in context as a static prompt (default: false).\n * \n * When true:\n * - Dynamic info behaves as a static prompt sent to the LLM for that WebRTC connection\n * - Dynamic info persists throughout the session\n * - You need to set it again after disconnecting/reconnecting\n * \n * When false:\n * - Allows resetting and updating via updateContext() or updateDynamicInfo()\n * - Dynamic info can be changed during the session\n */\n keepInContext?: boolean;\n /** \n * Enable debug mode for additional logging and diagnostics (default: false).\n */\n debug?: boolean;\n /**\n * Log decoded RTVI data messages to the browser console (default: true).\n * Set to false to silence incoming and outgoing RTVI message logs.\n */\n logRtviMessages?: boolean;\n /** \n * Metadata about the invocation source and client information.\n * Used for analytics and debugging purposes.\n */\n invocationMetadata?: {\n /** Source of the invocation (e.g., \"web\", \"mobile\", \"unity\") */\n source?: string;\n /** Client SDK version */\n clientVersion?: string;\n /** Additional custom metadata */\n extraMetadata?: Record<string, unknown>;\n };\n}\n\n/**\n * The body returned by POST /connect. The embed receives this from a\n * customer-hosted proxy route rather than fetching it directly.\n */\nexport interface ConnectionData {\n /** LiveKit room URL, or the WebSocket URL when the transport is websocket. */\n room_url: string;\n /** LiveKit access token. Absent on the WebSocket transport. */\n token?: string;\n character_session_id?: string;\n end_user_id?: string;\n end_user_metadata?: Record<string, unknown>;\n}\n\n/**\n * Represents a single message in the chat conversation.\n * Different message types are used for various parts of the conversation flow.\n */\nexport interface ChatMessage {\n /** Unique identifier for the message */\n id: string;\n /** \n * Type of message:\n * - `user`: User's sent message\n * - `convai`: Character's response\n * - `user-transcription`: Real-time speech-to-text from user\n * - `bot-llm-text`: Character's LLM-generated text (token-by-token streaming)\n * - `bot-output`: Aggregated bot output (sentence/word-level chunks with spoken status)\n * - `emotion`: Character's emotional state\n * - `behavior-tree`: Behavior tree response\n * - `action`: Action execution\n * - `bot-emotion`: Bot emotional response\n * - `user-llm-text`: User text processed by LLM\n * - `interrupt-bot`: Interrupt the bot's current response\n * - `idle-warning`: Server idle-timeout warning; `content` holds remaining seconds as a numeric string (e.g. `\"45\"`)\n * - `llm-no-response`: LLM deliberately did not respond (abstain); `content` is always `\"\"`\n */\n type: 'user' | 'convai' | 'emotion' | 'behavior-tree' | 'action' | 'user-transcription' | 'bot-llm-text' | 'bot-output' | 'bot-emotion' | 'user-llm-text' | 'interrupt-bot' | 'idle-warning' | 'llm-no-response';\n /** The text content of the message */\n content: string;\n /** ISO timestamp string of when the message was created */\n timestamp: string;\n /** Whether this message is still streaming (mutable); false when finalized */\n isStreaming?: boolean;\n}\n\n/**\n * Represents a single metrics event from the server.\n * Multiple metrics may be received during a conversation.\n */\nexport interface ConvaiMetrics {\n /** Raw metrics data from the server */\n data: Record<string, unknown>;\n /** Timestamp when the metrics were received */\n timestamp: string;\n /** Unique identifier for this metrics event */\n id: string;\n}\n\n/**\n * Represents the current state of the Convai client connection and activity.\n * Use this to provide UI feedback about the conversation state.\n * \n * @example\n * ```typescript\n * const { state } = convaiClient;\n * \n * if (state.isConnected) {\n * console.log('Connected to character');\n * }\n * \n * if (state.isSpeaking) {\n * console.log('Character is speaking');\n * }\n * \n * // Or use the combined state\n * console.log(state.agentState); // 'listening' | 'thinking' | 'speaking'\n * \n * // Access end user information\n * console.log(state.endUserId); // 'user@example.com'\n * console.log(state.endUserMetadata); // { name: 'John', age: '30' }\n * \n * // Access metrics for the current conversation\n * console.log(state.metrics); // Array of metrics events\n * \n * // Check disconnect reason\n * if (state.disconnectReason !== null) {\n * console.log('Disconnected due to:', state.disconnectReason);\n * }\n * ```\n */\nexport interface ConvaiClientState {\n /** Whether the client is currently connected to Convai */\n isConnected: boolean;\n /** Whether a connection attempt is in progress */\n isConnecting: boolean;\n /** True from user-started-speaking until user-stopped-speaking (user is speaking, bot is listening). Priority below isSpeaking. */\n isListening: boolean;\n /** Whether the character is processing/thinking about a response */\n isThinking: boolean;\n /** Whether the character is currently speaking */\n isSpeaking: boolean;\n /** \n * Combined state indicator for the character's current activity.\n * Priority: speaking > listening (user speaking) > thinking > connected.\n */\n agentState: 'disconnected' | 'connected' | 'listening' | 'thinking' | 'speaking';\n /** Current bot emotion (name and optional scale). Updated when bot-emotion messages are received. */\n emotion: { emotion: string; scale?: number } | null;\n /** \n * End user ID returned from the connection response.\n * This is the actual end user ID used by the server (may differ from the one provided in config).\n */\n endUserId: string | null;\n /** \n * End user metadata returned from the connection response.\n * Contains additional information about the end user.\n */\n endUserMetadata: Record<string, unknown> | null;\n /** \n * Array of metrics events received during the current session.\n * Multiple metrics may be received per conversation.\n * Clears when resetSession() is called.\n */\n metrics: ConvaiMetrics[];\n /** \n * Disconnect reason from LiveKit when disconnected.\n * null when connected, otherwise contains the reason code.\n * Use this to differentiate between client-initiated disconnects and network/server issues.\n * \n * Notable reasons:\n * - CLIENT_INITIATED (1): User disconnected intentionally\n * - DUPLICATE_IDENTITY (2): Another client with same identity joined\n * - SERVER_SHUTDOWN (3): Server shutting down\n * - PARTICIPANT_REMOVED (4): Removed by API\n * - ROOM_DELETED (5): Room was ended\n * \n * Non-CLIENT_INITIATED reasons may indicate network disruptions where reconnection is appropriate.\n * \n * @see DisconnectReason\n */\n disconnectReason: DisconnectReason | null;\n}\n\n/**\n * Audio control interface for managing microphone\n */\nexport interface AudioControls {\n isAudioEnabled: boolean;\n isAudioMuted: boolean;\n audioLevel: number;\n enableAudio: () => Promise<void>;\n disableAudio: () => Promise<void>;\n muteAudio: () => Promise<void>;\n unmuteAudio: () => Promise<void>;\n toggleAudio: () => Promise<void>;\n setAudioDevice: (deviceId: string) => Promise<void>;\n getAudioDevices: () => Promise<MediaDeviceInfo[]>;\n startAudioLevelMonitoring: () => void;\n stopAudioLevelMonitoring: () => void;\n // EventEmitter methods for React integration\n on: (event: string, callback: (...args: any[]) => void) => () => void;\n off: (event: string, callback: (...args: any[]) => void) => void;\n}\n\n/**\n * Video control interface for managing camera\n */\nexport interface VideoControls {\n isVideoEnabled: boolean;\n isVideoHidden: boolean;\n activeVisionSource: VisionSourceHandle | null;\n hasActiveVisionSource: boolean;\n visionSourceState: VisionSourceState;\n enableVideo: () => Promise<void>;\n disableVideo: () => Promise<void>;\n hideVideo: () => Promise<void>;\n showVideo: () => Promise<void>;\n toggleVideo: () => Promise<void>;\n setVideoDevice: (deviceId: string) => Promise<void>;\n getVideoDevices: () => Promise<MediaDeviceInfo[]>;\n setVideoQuality: (quality: 'low' | 'medium' | 'high') => Promise<void>;\n publishCanvas: (\n canvas: HTMLCanvasElement,\n options?: PublishCanvasOptions,\n ) => Promise<VisionSourceHandle>;\n publishVideoTrack: (\n track: MediaStreamTrack,\n options?: PublishVideoTrackOptions,\n ) => Promise<VisionSourceHandle>;\n unpublishVisionSource: (\n source?: VisionSourceHandle | MediaStreamTrack,\n ) => Promise<void>;\n // EventEmitter methods for React integration\n on: (event: string, callback: (...args: any[]) => void) => () => void;\n off: (event: string, callback: (...args: any[]) => void) => void;\n}\n\n/**\n * Screen share control interface\n */\nexport interface ScreenShareControls {\n isScreenShareEnabled: boolean;\n isScreenShareActive: boolean;\n enableScreenShare: () => Promise<void>;\n disableScreenShare: () => Promise<void>;\n toggleScreenShare: () => Promise<void>;\n enableScreenShareWithAudio: () => Promise<void>;\n getScreenShareTracks: () => Promise<any[]>;\n // EventEmitter methods for React integration\n on: (event: string, callback: (...args: any[]) => void) => () => void;\n off: (event: string, callback: (...args: any[]) => void) => void;\n}\n\n/**\n * Main Convai client interface.\n * Provides complete control over Convai character connections and interactions.\n * \n * @example\n * ```typescript\n * import { ConvaiClient } from '@convai/web-sdk/core';\n * \n * const client = new ConvaiClient();\n * \n * // Connect to character\n * await client.connect({\n * apiKey: 'your-api-key',\n * characterId: 'your-character-id',\n * endUserId: '-1' // Dev mode\n * });\n * \n * // Send a message\n * client.sendUserTextMessage('Hello!');\n * \n * // Listen for state changes\n * client.on('stateChange', (state) => {\n * console.log('State:', state);\n * });\n * \n * // Listen for messages\n * client.on('message', (message) => {\n * console.log('New message:', message);\n * });\n * ```\n */\n/**\n * Memory API Types\n * Types for Convai's long-term memory management APIs\n */\n\n/**\n * Memory object returned from the API\n */\nexport interface Memory {\n /** Unique memory identifier (UUID) */\n id: string;\n /** Memory text content */\n memory: string;\n /** ISO timestamp when the memory was created */\n created_at: string;\n /** ISO timestamp when the memory was last updated */\n updated_at: string;\n}\n\n/**\n * Memory event object from add operation\n */\nexport interface MemoryAddEvent {\n /** Memory identifier */\n id: string;\n /** Event type (always \"ADD\" for add operations) */\n event: 'ADD';\n /** Memory text content */\n memory: string;\n}\n\n/**\n * Request to add memories\n */\nexport interface MemoryAddRequest {\n /** Character UUID */\n character_id: string;\n /** End user identifier */\n end_user_id: string;\n /** Array of memory strings to add */\n memories: string[];\n}\n\n/**\n * Response from add memories operation\n */\nexport interface MemoryAddResponse {\n /** Array of added memories with their IDs */\n memories: MemoryAddEvent[];\n}\n\n/**\n * Request to list memories with pagination\n */\nexport interface MemoryListRequest {\n /** Character UUID */\n character_id: string;\n /** End user identifier */\n end_user_id: string;\n /** Page number (default: 1, clamped to 1-1000) */\n page?: number;\n /** Number of memories per page (default: 50, clamped to 1-100) */\n page_size?: number;\n}\n\n/**\n * Response from list memories operation\n */\nexport interface MemoryListResponse {\n /** Array of memories */\n memories: Memory[];\n /** Total count of memories for this character/user pair */\n total_count: number;\n /** Current page number */\n page: number;\n /** Number of memories per page */\n page_size: number;\n /** Whether there are more pages available */\n has_more: boolean;\n}\n\n/**\n * Request to get a single memory\n */\nexport interface MemoryGetRequest {\n /** Character UUID */\n character_id: string;\n /** End user identifier */\n end_user_id: string;\n /** Memory UUID to fetch */\n memory_id: string;\n}\n\n/**\n * Response from get memory operation\n */\nexport type MemoryGetResponse = Memory;\n\n/**\n * Request to delete a memory\n */\nexport interface MemoryDeleteRequest {\n /** Character UUID */\n character_id: string;\n /** End user identifier */\n end_user_id: string;\n /** Memory UUID to delete */\n memory_id: string;\n}\n\n/**\n * Response from delete memory operation\n */\nexport interface MemoryDeleteResponse {\n /** Success message */\n message: string;\n /** Memory ID that was deleted */\n memory_id: string;\n /** Whether the memory was successfully deleted */\n deleted: boolean;\n}\n\n/**\n * Request to delete all memories\n */\nexport interface MemoryDeleteAllRequest {\n /** Character UUID */\n character_id: string;\n /** End user identifier */\n end_user_id: string;\n}\n\n/**\n * Response from delete all memories operation\n */\nexport interface MemoryDeleteAllResponse {\n /** Status message (deletion is asynchronous) */\n message: string;\n /** Character ID for which memories are being deleted */\n character_id: string;\n /** End user ID for which memories are being deleted */\n end_user_id: string;\n}\n\n/**\n * Error response from Memory API\n */\nexport interface MemoryError {\n /** Error message */\n ERROR: string;\n /** Transaction reference ID for debugging */\n 'Reference ID': string;\n}\n\nexport interface IConvaiClient {\n /** Current connection and activity state of the client */\n readonly state: ConvaiClientState;\n \n /** \n * Connection type: \"audio\" (audio only) or \"video\" (audio + video + screenshare).\n * Set based on enableVideo in connect config.\n */\n readonly connectionType: 'audio' | 'video' | null;\n \n /** API key used for the current connection, if apiKey was used (null otherwise) */\n readonly apiKey?: string | null;\n\n /** Auth token used for the current connection, if authToken was used (null otherwise) */\n readonly authToken?: string | null;\n\n /** Character ID used for the current connection (null if not connected) */\n readonly characterId: string | null;\n \n /** Internal LiveKit Room instance (for advanced usage) */\n readonly room: Room;\n \n /** Array of all chat messages in the current conversation */\n readonly chatMessages: ChatMessage[];\n \n /** Current real-time transcription of user speech */\n readonly userTranscription: string;\n \n /** Unique session ID for the current character conversation */\n readonly characterSessionId: string | null;\n \n /** Whether the bot is ready to receive messages (true after bot-ready message) */\n readonly isBotReady: boolean;\n \n /** Audio control methods for managing microphone mute/unmute */\n readonly audioControls: AudioControls;\n \n /** Video control methods for enabling/disabling camera */\n readonly videoControls: VideoControls;\n \n /** Screen sharing control methods */\n readonly screenShareControls: ScreenShareControls;\n \n /** Blendshape queue for time-based lipsync synchronization */\n readonly blendshapeQueue: BlendshapeQueue;\n \n /** Incremental turn session ID used by conversation events (e.g. conversationStart, turnEnd) */\n readonly conversationSessionId: number;\n \n /** \n * Memory manager for long-term memory operations.\n * Returns null if no API key or end user ID is available.\n * \n * @example\n * ```typescript\n * const memoryManager = client.memoryManager;\n * if (memoryManager) {\n * const memories = await memoryManager.listMemories();\n * }\n * ```\n */\n readonly memoryManager: import('./MemoryManager').MemoryManager | null;\n \n /** \n * Connect to a Convai character.\n */\n connect: (config?: ConvaiConfig) => Promise<void>;\n \n /**\n * Complete a connection from an already-fetched /connect response body.\n *\n * `connect()` fetches /connect and then calls this internally. Call it\n * directly when the response was obtained elsewhere — a server-side session\n * manager, or the embed's connect-proxy flow, where the API key must never\n * reach the browser.\n *\n * @example\n * // Server (customer's backend): holds the API key, calls Convai's\n * // /connect, and relays the response body verbatim.\n * // Browser: never sees the API key, only the relayed response.\n * const data = await fetch('/api/convai-connect', {\n * method: 'POST',\n * headers: { 'Content-Type': 'application/json' },\n * body: JSON.stringify({ characterId: 'your-character-id' }),\n * }).then(r => r.json())\n * await client.connectWithConnectionData(data)\n */\n connectWithConnectionData: (data: ConnectionData, config?: ConvaiConfig) => Promise<void>;\n\n /** Disconnect from the current character session */\n disconnect: () => Promise<void>;\n \n /** Reconnect - disconnect and connect again using stored config */\n reconnect: () => Promise<void>;\n \n /** Reset the session ID to start a new conversation (clears history) */\n resetSession: () => void;\n \n /** Send a text message to the character */\n sendUserTextMessage: (text: string) => void;\n \n /** \n * Send a trigger message to invoke specific character actions or responses.\n * @param triggerName - Name of the trigger to invoke\n * @param triggerMessage - Optional message to accompany the trigger\n */\n sendTriggerMessage: (triggerName?: string, triggerMessage?: string) => void;\n \n /**\n * Send an interrupt message to stop the bot's current response.\n * This can be used to interrupt the bot when the user wants to speak.\n */\n sendInterruptMessage: () => void;\n\n /**\n * Reset the server-side idle timer.\n * Call this on any user activity (clicks, UI interactions, etc.) to prevent\n * the session from being disconnected due to inactivity.\n * The server sends `user-idle-warning` events (via the `idleWarning` event) before\n * disconnecting; use this method to keep the session alive.\n */\n resetIdleTimer: () => void;\n \n /**\n * Replace the Narrative Design template keys on the live session.\n *\n * These are the same keys as the `narrativeTemplateKeys` config option\n * (which seeds them at `/connect`) — this method REPLACES the entire map\n * at runtime, so include every key you still need. New values apply when\n * the next section objective or speak tag is evaluated (i.e. set them\n * before firing the next narrative trigger).\n *\n * Requires a character with Narrative Design enabled; otherwise the server\n * acks `update-template-keys` with error \"Narrative design service not\n * available\". Placeholders use single braces (`{player_name}`), keys are\n * case-sensitive, and missing keys resolve to an empty string.\n *\n * @example\n * ```typescript\n * client.updateTemplateKeys({ player_name: 'Aria', quest_item: 'lantern' });\n * client.sendTriggerMessage('QuestUpdate');\n * ```\n */\n updateTemplateKeys: (templateKeys: { [key: string]: string }) => void;\n \n /** \n * Update dynamic information about the current context.\n * This helps the character understand the current situation.\n * Pass any key-value pairs you want, but \"text\" field is required.\n */\n updateDynamicInfo: (dynamicInfo: DynamicInfo) => void;\n \n /**\n * Update the bot's temporary runtime context in a unified way.\n * Provides flexible control over ephemeral context management.\n * \n * @param options - Context update configuration\n * \n * @example\n * ```typescript\n * // Append to context\n * client.updateContext({ \n * text: \"User completed quest\", \n * mode: \"append\",\n * run_llm: \"false\"\n * });\n * \n * // Replace context\n * client.updateContext({ \n * text: \"New game state\", \n * mode: \"replace\",\n * run_llm: \"auto\"\n * });\n * \n * // Clear context\n * client.updateContext({ mode: \"reset\" });\n * ```\n */\n updateContext: (options: ContextUpdateOptions) => void;\n\n /** Request a server ack containing the current vision buffer status. */\n visionStatus: (options?: VisionStatusOptions) => string | null;\n\n /** Attach buffered frames and optionally trigger a response. */\n visionTrigger: (options?: VisionTriggerOptions) => string | null;\n\n /** Update a session respond-mode default. */\n respondModeUpdate: (options: RespondModeUpdateOptions) => string | null;\n\n /**\n * Set or clear the character's temporary state of mind without triggering a response.\n * Pass `null` (or `\"neutral\"`) to clear it.\n */\n updateEmotion: (stateOfMind: string | null) => void;\n\n /**\n * Send descriptive scene updates so the bot knows what is visible or nearby.\n * Does not modify actionConfig.\n */\n updateSceneMetadata: (\n items: Array<{ name: string; description: string }>,\n options?: UpdateSceneMetadataOptions,\n ) => void;\n\n /**\n * Toggle text-to-speech on or off.\n * When disabled, character responses won't be spoken aloud.\n */\n toggleTts: (enabled: boolean) => void;\n \n /** \n * Toggle speech-to-text on or off.\n * When enabled, user speech is transcribed to text (e.g. for dictation).\n * When disabled, STT is off.\n */\n toggleStt: (enabled: boolean) => void;\n\n /**\n * Upload a file to the character via the LiveKit byte stream transport.\n * Only works when connected with the LiveKit transport.\n *\n * @param file - The File object to send\n * @param options - Optional upload options\n * @returns Promise that resolves when the upload is complete\n *\n * @example\n * ```typescript\n * await client.uploadFile(file, {\n * topic: 'file-upload',\n * onProgress: (pct) => console.log(`${pct}% uploaded`),\n * });\n * ```\n */\n uploadFile: (file: File, options?: UploadFileOptions) => Promise<void>;\n\n /**\n * Subscribe to an event\n * @param event Event name ('stateChange', 'message', 'connect', 'disconnect', 'error')\n * @param callback Callback function\n * @returns Unsubscribe function\n */\n on: (event: string, callback: (...args: any[]) => void) => () => void;\n \n /**\n * Unsubscribe from an event\n * @param event Event name\n * @param callback Callback function to remove\n */\n off: (event: string, callback: (...args: any[]) => void) => void;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioVisualizer.d.ts","sourceRoot":"","sources":["../../../../../src/react/components/rtc-widget/components/AudioVisualizer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAkBtC,UAAU,oBAAoB;IAC5B,4EAA4E;IAC5E,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;CAClD;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,
|
|
1
|
+
{"version":3,"file":"AudioVisualizer.d.ts","sourceRoot":"","sources":["../../../../../src/react/components/rtc-widget/components/AudioVisualizer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAkBtC,UAAU,oBAAoB;IAC5B,4EAA4E;IAC5E,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;CAClD;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAqT1D,CAAC"}
|
|
@@ -161,9 +161,36 @@ export const AudioVisualizer = ({ room, size = 350, color = '#10b981', opacity =
|
|
|
161
161
|
*/
|
|
162
162
|
const bufferLength = analyser.frequencyBinCount;
|
|
163
163
|
const dataArray = new Uint8Array(bufferLength);
|
|
164
|
+
let frameParity = 0;
|
|
165
|
+
let idleFramesPainted = 0;
|
|
164
166
|
const draw = () => {
|
|
165
|
-
|
|
167
|
+
// THROTTLE: 30fps, and stop repainting once the idle state has
|
|
168
|
+
// settled — every canvas update forces the compositor to re-blend
|
|
169
|
+
// the widget panel over the host page's WebGL canvas, which judders
|
|
170
|
+
// the 3D scene if done at 60fps continuously.
|
|
171
|
+
frameParity ^= 1;
|
|
172
|
+
if (frameParity) {
|
|
173
|
+
animationFrameRef.current = requestAnimationFrame(draw);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
timeRef.current += 0.16;
|
|
166
177
|
analyser.getByteFrequencyData(dataArray);
|
|
178
|
+
{
|
|
179
|
+
let t = 0;
|
|
180
|
+
for (let i = 0; i < bufferLength; i++)
|
|
181
|
+
t += dataArray[i] || 0;
|
|
182
|
+
if (!isActiveRef.current || t / (bufferLength * 255) < 0.01) {
|
|
183
|
+
// Fade the ring out over a few frames, then hold it static.
|
|
184
|
+
if (idleFramesPainted > 20) {
|
|
185
|
+
animationFrameRef.current = requestAnimationFrame(draw);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
idleFramesPainted++;
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
idleFramesPainted = 0;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
167
194
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
|
168
195
|
const centerX = canvas.width / 2;
|
|
169
196
|
const centerY = canvas.height / 2;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioVisualizer.js","sourceRoot":"","sources":["../../../../../src/react/components/rtc-widget/components/AudioVisualizer.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useRef } from 'react';\nimport styled from 'styled-components';\nimport { Room } from 'livekit-client';\n\nconst VisualizerContainer = styled.div`\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 1;\n pointer-events: none;\n border-radius: 50%;\n overflow: visible;\n`;\n\nconst Canvas = styled.canvas`\n display: block;\n width: 100%;\n height: 100%;\n`;\n\ninterface AudioVisualizerProps {\n /** LiveKit room instance containing the remote participant's audio track */\n room: Room | null;\n /** Canvas size in pixels (width and height) */\n size?: number;\n /** CSS color value for the bars */\n color?: string;\n /** Base opacity of the bars (0-1), actual opacity varies with audio intensity */\n opacity?: number;\n /** Radius of the circular visualization area in pixels */\n avatarRadius?: number;\n /** Number of radial bars to display around the circle */\n barCount?: number;\n /** Callback function called when speaking state changes */\n onSpeakingChange?: (isSpeaking: boolean) => void;\n}\n\n/**\n * Circular Audio Visualizer Component\n * \n * A real-time circular audio visualization component that displays radial bars arranged\n * in a circle around an avatar. The visualization reacts to the remote participant's\n * (bot) audio output from a LiveKit room, using logarithmic frequency bands and a\n * traveling wave animation effect.\n * \n * Features:\n * - Circular radial bar visualization with configurable bar count\n * - Logarithmic frequency band distribution (low frequencies distributed around the ring)\n * - Traveling wave animation that propagates around the circle\n * - Speaking detection with callback support\n * - Automatic track detection and reconnection\n * - Canvas-based rendering for smooth animations\n */\nexport const AudioVisualizer: React.FC<AudioVisualizerProps> = ({\n room,\n size = 350,\n color = '#10b981',\n opacity = 0.4,\n avatarRadius = 80,\n barCount = 64,\n onSpeakingChange,\n}) => {\n // Refs for canvas and Web Audio API nodes\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const animationFrameRef = useRef<number | null>(null);\n const audioContextRef = useRef<AudioContext | null>(null);\n const analyserRef = useRef<AnalyserNode | null>(null);\n const sourceNodeRef = useRef<MediaStreamAudioSourceNode | null>(null);\n const isActiveRef = useRef(false);\n \n // Refs for animation and state management\n const timeRef = useRef(0);\n const previousSpeakingStateRef = useRef(false);\n const bandEdgesRef = useRef<number[] | null>(null);\n\n useEffect(() => {\n if (!room) return;\n\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n canvas.width = size;\n canvas.height = size;\n\n // Initialize Web Audio API context and analyser\n const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n const analyser = audioContext.createAnalyser();\n analyser.fftSize = 512;\n analyser.smoothingTimeConstant = 0.6;\n\n audioContextRef.current = audioContext;\n analyserRef.current = analyser;\n\n /**\n * Builds logarithmically-spaced frequency band edges.\n * This distributes low-frequency energy (which has more power) evenly around\n * the circular visualization, rather than clustering it at the start.\n */\n const buildLogBands = () => {\n const nyquist = audioContext.sampleRate / 2;\n const bufferLength = analyser.frequencyBinCount;\n const minHz = 60;\n const maxHz = Math.min(8000, nyquist);\n const edges = Array.from({ length: barCount + 1 }, (_, k) => {\n const hz = minHz * Math.pow(maxHz / minHz, k / barCount);\n const bin = Math.max(\n 0,\n Math.min(bufferLength - 1, Math.floor((hz / nyquist) * bufferLength))\n );\n return bin;\n });\n // Ensure strictly increasing edges (no zero-width bands)\n for (let i = 1; i < edges.length; i++) {\n if (edges[i] <= edges[i - 1]) edges[i] = Math.min(edges[i - 1] + 1, bufferLength - 1);\n }\n bandEdgesRef.current = edges;\n };\n\n /**\n * Finds the bot participant from remote participants.\n */\n const findBotParticipant = (remoteParticipants: Map<string, any>, localParticipant: any) => {\n const participants = Array.from(remoteParticipants.values()).filter(\n (p) => p !== localParticipant && p !== room.localParticipant\n );\n\n if (participants.length === 0) {\n return null;\n }\n\n // Prefer participants with audio tracks (bot typically has audio)\n const participantsWithAudio = participants.filter((participant) => {\n if (!participant.trackPublications) return false;\n const audioTracks = Array.from(participant.trackPublications.values()).filter(\n (p: any) => p.kind === 'audio' && p.track\n );\n return audioTracks.length > 0;\n });\n\n return participantsWithAudio.length > 0 ? participantsWithAudio[0] : participants[0];\n };\n\n /**\n * Sets up the audio source by connecting the remote participant's (bot) audio track\n * to the Web Audio API analyser.\n */\n const setupAudioSource = async () => {\n try {\n if (audioContext.state === 'suspended') await audioContext.resume();\n\n const remoteParticipants = room.remoteParticipants;\n if (remoteParticipants.size === 0) {\n isActiveRef.current = false;\n return;\n }\n\n const botParticipant = findBotParticipant(remoteParticipants, room.localParticipant);\n if (!botParticipant) {\n isActiveRef.current = false;\n return;\n }\n \n const audioTracks = Array.from(botParticipant.trackPublications.values()).filter(\n (p: any) => p.kind === 'audio' && p.track\n );\n \n if (audioTracks.length === 0) {\n isActiveRef.current = false;\n return;\n }\n\n const liveKitTrack = (audioTracks[0] as any).track;\n const mediaStreamTrack = liveKitTrack.mediaStreamTrack;\n if (!mediaStreamTrack) {\n isActiveRef.current = false;\n return;\n }\n\n const mediaStream = new MediaStream([mediaStreamTrack]);\n\n if (sourceNodeRef.current) sourceNodeRef.current.disconnect();\n const source = audioContext.createMediaStreamSource(mediaStream);\n source.connect(analyser);\n sourceNodeRef.current = source;\n\n // Build bands after context is ready\n buildLogBands();\n\n isActiveRef.current = true;\n } catch {\n isActiveRef.current = false;\n }\n };\n\n setupAudioSource();\n const setupTimeout = setTimeout(setupAudioSource, 500);\n\n const handleTrackSubscribed = (track: any, publication: any, participant: any) => {\n if (track && track.kind === 'audio' && participant !== room.localParticipant) {\n setTimeout(setupAudioSource, 200);\n }\n };\n \n const handleParticipantConnected = (participant: any) => {\n if (participant !== room.localParticipant) setTimeout(setupAudioSource, 200);\n };\n\n room.on('trackSubscribed', handleTrackSubscribed);\n room.on('participantConnected', handleParticipantConnected);\n\n /**\n * Main rendering function that draws the circular audio visualization.\n */\n const bufferLength = analyser.frequencyBinCount;\n const dataArray = new Uint8Array(bufferLength);\n\n const draw = () => {\n timeRef.current += 0.08;\n analyser.getByteFrequencyData(dataArray);\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n // The bars should surround the character, not be clipped inside\n // Character is 120px (radius 60px), visualizer canvas is 220px (radius 110px)\n const characterRadius = 60; // Half of 120px character image\n const innerRadius = characterRadius; // Start bars at edge of character\n const outerRadius = avatarRadius; // Extend to edge of visualizer canvas\n const maxBarLength = outerRadius - innerRadius;\n\n ctx.save();\n // No clipping - let bars render freely around the circle\n\n const angleStep = (Math.PI * 2) / barCount;\n\n // Calculate overall audio level for speaking detection\n let total = 0;\n for (let i = 0; i < bufferLength; i++) total += isActiveRef.current ? (dataArray[i] || 0) : 0;\n const overallLevel = total / (bufferLength * 255);\n\n // Speaking detection\n const speakingThreshold = 0.1;\n const isSpeaking = isActiveRef.current && overallLevel > speakingThreshold;\n if (onSpeakingChange && isSpeaking !== previousSpeakingStateRef.current) {\n previousSpeakingStateRef.current = isSpeaking;\n onSpeakingChange(isSpeaking);\n }\n\n // Precompute band edges if not ready yet\n if (!bandEdgesRef.current) {\n bandEdgesRef.current = Array.from({ length: barCount + 1 }, (_, k) =>\n Math.floor((k / barCount) * bufferLength)\n );\n }\n const edges = bandEdgesRef.current;\n\n // Traveling wave parameters\n const waveRevolutions = 2;\n const phasePerBar = (Math.PI * 2 * waveRevolutions) / barCount;\n const baseWaveAmp = 0.35;\n const waveAmp = baseWaveAmp * (0.3 + 0.7 * overallLevel);\n\n for (let i = 0; i < barCount; i++) {\n const angle = i * angleStep - Math.PI / 2;\n\n // Calculate average energy for this bar's frequency band\n const startFreq = edges[i];\n const endFreq = edges[i + 1];\n let sum = 0;\n let count = 0;\n for (let f = startFreq; f < endFreq && f < bufferLength; f++) {\n sum += isActiveRef.current ? (dataArray[f] || 0) : 0;\n count++;\n }\n const bandAvg = count > 0 ? sum / (count * 255) : 0;\n\n // Mix band-specific energy with overall level\n const energy = 0.4 * bandAvg + 0.6 * overallLevel;\n\n // Apply traveling wave modulation\n const wavePhase = i * phasePerBar;\n const wave = 1 + waveAmp * Math.sin(timeRef.current + wavePhase);\n\n // Final intensity\n const intensity = Math.min(1, energy * wave);\n\n // Convert to bar length\n const length = Math.max(maxBarLength * 0.03, intensity * maxBarLength * 0.95);\n\n // Coordinates\n const startX = centerX + Math.cos(angle) * innerRadius;\n const startY = centerY + Math.sin(angle) * innerRadius;\n const endX = centerX + Math.cos(angle) * (innerRadius + length);\n const endY = centerY + Math.sin(angle) * (innerRadius + length);\n\n // Draw\n ctx.strokeStyle = color;\n ctx.lineWidth = 5;\n ctx.lineCap = 'round';\n ctx.globalAlpha = opacity * (0.5 + 0.5 * intensity);\n\n ctx.beginPath();\n ctx.moveTo(startX, startY);\n ctx.lineTo(endX, endY);\n ctx.stroke();\n }\n\n ctx.globalAlpha = 1;\n ctx.restore();\n\n animationFrameRef.current = requestAnimationFrame(draw);\n };\n\n draw();\n\n return () => {\n clearTimeout(setupTimeout);\n if (animationFrameRef.current) cancelAnimationFrame(animationFrameRef.current);\n if (sourceNodeRef.current) sourceNodeRef.current.disconnect();\n if (analyserRef.current) analyserRef.current.disconnect();\n if (audioContextRef.current && audioContextRef.current.state !== 'closed') {\n audioContextRef.current.close();\n }\n room.off('trackSubscribed', handleTrackSubscribed);\n room.off('participantConnected', handleParticipantConnected);\n };\n }, [room, size, color, opacity, avatarRadius, barCount, onSpeakingChange]);\n\n return (\n <VisualizerContainer style={{ width: size, height: size }}>\n <Canvas ref={canvasRef} />\n </VisualizerContainer>\n );\n};\n\n"]}
|
|
1
|
+
{"version":3,"file":"AudioVisualizer.js","sourceRoot":"","sources":["../../../../../src/react/components/rtc-widget/components/AudioVisualizer.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useRef } from 'react';\nimport styled from 'styled-components';\nimport { Room } from 'livekit-client';\n\nconst VisualizerContainer = styled.div`\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 1;\n pointer-events: none;\n border-radius: 50%;\n overflow: visible;\n`;\n\nconst Canvas = styled.canvas`\n display: block;\n width: 100%;\n height: 100%;\n`;\n\ninterface AudioVisualizerProps {\n /** LiveKit room instance containing the remote participant's audio track */\n room: Room | null;\n /** Canvas size in pixels (width and height) */\n size?: number;\n /** CSS color value for the bars */\n color?: string;\n /** Base opacity of the bars (0-1), actual opacity varies with audio intensity */\n opacity?: number;\n /** Radius of the circular visualization area in pixels */\n avatarRadius?: number;\n /** Number of radial bars to display around the circle */\n barCount?: number;\n /** Callback function called when speaking state changes */\n onSpeakingChange?: (isSpeaking: boolean) => void;\n}\n\n/**\n * Circular Audio Visualizer Component\n * \n * A real-time circular audio visualization component that displays radial bars arranged\n * in a circle around an avatar. The visualization reacts to the remote participant's\n * (bot) audio output from a LiveKit room, using logarithmic frequency bands and a\n * traveling wave animation effect.\n * \n * Features:\n * - Circular radial bar visualization with configurable bar count\n * - Logarithmic frequency band distribution (low frequencies distributed around the ring)\n * - Traveling wave animation that propagates around the circle\n * - Speaking detection with callback support\n * - Automatic track detection and reconnection\n * - Canvas-based rendering for smooth animations\n */\nexport const AudioVisualizer: React.FC<AudioVisualizerProps> = ({\n room,\n size = 350,\n color = '#10b981',\n opacity = 0.4,\n avatarRadius = 80,\n barCount = 64,\n onSpeakingChange,\n}) => {\n // Refs for canvas and Web Audio API nodes\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const animationFrameRef = useRef<number | null>(null);\n const audioContextRef = useRef<AudioContext | null>(null);\n const analyserRef = useRef<AnalyserNode | null>(null);\n const sourceNodeRef = useRef<MediaStreamAudioSourceNode | null>(null);\n const isActiveRef = useRef(false);\n \n // Refs for animation and state management\n const timeRef = useRef(0);\n const previousSpeakingStateRef = useRef(false);\n const bandEdgesRef = useRef<number[] | null>(null);\n\n useEffect(() => {\n if (!room) return;\n\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n canvas.width = size;\n canvas.height = size;\n\n // Initialize Web Audio API context and analyser\n const audioContext = new (window.AudioContext || (window as any).webkitAudioContext)();\n const analyser = audioContext.createAnalyser();\n analyser.fftSize = 512;\n analyser.smoothingTimeConstant = 0.6;\n\n audioContextRef.current = audioContext;\n analyserRef.current = analyser;\n\n /**\n * Builds logarithmically-spaced frequency band edges.\n * This distributes low-frequency energy (which has more power) evenly around\n * the circular visualization, rather than clustering it at the start.\n */\n const buildLogBands = () => {\n const nyquist = audioContext.sampleRate / 2;\n const bufferLength = analyser.frequencyBinCount;\n const minHz = 60;\n const maxHz = Math.min(8000, nyquist);\n const edges = Array.from({ length: barCount + 1 }, (_, k) => {\n const hz = minHz * Math.pow(maxHz / minHz, k / barCount);\n const bin = Math.max(\n 0,\n Math.min(bufferLength - 1, Math.floor((hz / nyquist) * bufferLength))\n );\n return bin;\n });\n // Ensure strictly increasing edges (no zero-width bands)\n for (let i = 1; i < edges.length; i++) {\n if (edges[i] <= edges[i - 1]) edges[i] = Math.min(edges[i - 1] + 1, bufferLength - 1);\n }\n bandEdgesRef.current = edges;\n };\n\n /**\n * Finds the bot participant from remote participants.\n */\n const findBotParticipant = (remoteParticipants: Map<string, any>, localParticipant: any) => {\n const participants = Array.from(remoteParticipants.values()).filter(\n (p) => p !== localParticipant && p !== room.localParticipant\n );\n\n if (participants.length === 0) {\n return null;\n }\n\n // Prefer participants with audio tracks (bot typically has audio)\n const participantsWithAudio = participants.filter((participant) => {\n if (!participant.trackPublications) return false;\n const audioTracks = Array.from(participant.trackPublications.values()).filter(\n (p: any) => p.kind === 'audio' && p.track\n );\n return audioTracks.length > 0;\n });\n\n return participantsWithAudio.length > 0 ? participantsWithAudio[0] : participants[0];\n };\n\n /**\n * Sets up the audio source by connecting the remote participant's (bot) audio track\n * to the Web Audio API analyser.\n */\n const setupAudioSource = async () => {\n try {\n if (audioContext.state === 'suspended') await audioContext.resume();\n\n const remoteParticipants = room.remoteParticipants;\n if (remoteParticipants.size === 0) {\n isActiveRef.current = false;\n return;\n }\n\n const botParticipant = findBotParticipant(remoteParticipants, room.localParticipant);\n if (!botParticipant) {\n isActiveRef.current = false;\n return;\n }\n \n const audioTracks = Array.from(botParticipant.trackPublications.values()).filter(\n (p: any) => p.kind === 'audio' && p.track\n );\n \n if (audioTracks.length === 0) {\n isActiveRef.current = false;\n return;\n }\n\n const liveKitTrack = (audioTracks[0] as any).track;\n const mediaStreamTrack = liveKitTrack.mediaStreamTrack;\n if (!mediaStreamTrack) {\n isActiveRef.current = false;\n return;\n }\n\n const mediaStream = new MediaStream([mediaStreamTrack]);\n\n if (sourceNodeRef.current) sourceNodeRef.current.disconnect();\n const source = audioContext.createMediaStreamSource(mediaStream);\n source.connect(analyser);\n sourceNodeRef.current = source;\n\n // Build bands after context is ready\n buildLogBands();\n\n isActiveRef.current = true;\n } catch {\n isActiveRef.current = false;\n }\n };\n\n setupAudioSource();\n const setupTimeout = setTimeout(setupAudioSource, 500);\n\n const handleTrackSubscribed = (track: any, publication: any, participant: any) => {\n if (track && track.kind === 'audio' && participant !== room.localParticipant) {\n setTimeout(setupAudioSource, 200);\n }\n };\n \n const handleParticipantConnected = (participant: any) => {\n if (participant !== room.localParticipant) setTimeout(setupAudioSource, 200);\n };\n\n room.on('trackSubscribed', handleTrackSubscribed);\n room.on('participantConnected', handleParticipantConnected);\n\n /**\n * Main rendering function that draws the circular audio visualization.\n */\n const bufferLength = analyser.frequencyBinCount;\n const dataArray = new Uint8Array(bufferLength);\n\n let frameParity = 0;\n let idleFramesPainted = 0;\n const draw = () => {\n // THROTTLE: 30fps, and stop repainting once the idle state has\n // settled — every canvas update forces the compositor to re-blend\n // the widget panel over the host page's WebGL canvas, which judders\n // the 3D scene if done at 60fps continuously.\n frameParity ^= 1;\n if (frameParity) {\n animationFrameRef.current = requestAnimationFrame(draw);\n return;\n }\n timeRef.current += 0.16;\n analyser.getByteFrequencyData(dataArray);\n {\n let t = 0;\n for (let i = 0; i < bufferLength; i++) t += dataArray[i] || 0;\n if (!isActiveRef.current || t / (bufferLength * 255) < 0.01) {\n // Fade the ring out over a few frames, then hold it static.\n if (idleFramesPainted > 20) {\n animationFrameRef.current = requestAnimationFrame(draw);\n return;\n }\n idleFramesPainted++;\n } else {\n idleFramesPainted = 0;\n }\n }\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n // The bars should surround the character, not be clipped inside\n // Character is 120px (radius 60px), visualizer canvas is 220px (radius 110px)\n const characterRadius = 60; // Half of 120px character image\n const innerRadius = characterRadius; // Start bars at edge of character\n const outerRadius = avatarRadius; // Extend to edge of visualizer canvas\n const maxBarLength = outerRadius - innerRadius;\n\n ctx.save();\n // No clipping - let bars render freely around the circle\n\n const angleStep = (Math.PI * 2) / barCount;\n\n // Calculate overall audio level for speaking detection\n let total = 0;\n for (let i = 0; i < bufferLength; i++) total += isActiveRef.current ? (dataArray[i] || 0) : 0;\n const overallLevel = total / (bufferLength * 255);\n\n // Speaking detection\n const speakingThreshold = 0.1;\n const isSpeaking = isActiveRef.current && overallLevel > speakingThreshold;\n if (onSpeakingChange && isSpeaking !== previousSpeakingStateRef.current) {\n previousSpeakingStateRef.current = isSpeaking;\n onSpeakingChange(isSpeaking);\n }\n\n // Precompute band edges if not ready yet\n if (!bandEdgesRef.current) {\n bandEdgesRef.current = Array.from({ length: barCount + 1 }, (_, k) =>\n Math.floor((k / barCount) * bufferLength)\n );\n }\n const edges = bandEdgesRef.current;\n\n // Traveling wave parameters\n const waveRevolutions = 2;\n const phasePerBar = (Math.PI * 2 * waveRevolutions) / barCount;\n const baseWaveAmp = 0.35;\n const waveAmp = baseWaveAmp * (0.3 + 0.7 * overallLevel);\n\n for (let i = 0; i < barCount; i++) {\n const angle = i * angleStep - Math.PI / 2;\n\n // Calculate average energy for this bar's frequency band\n const startFreq = edges[i];\n const endFreq = edges[i + 1];\n let sum = 0;\n let count = 0;\n for (let f = startFreq; f < endFreq && f < bufferLength; f++) {\n sum += isActiveRef.current ? (dataArray[f] || 0) : 0;\n count++;\n }\n const bandAvg = count > 0 ? sum / (count * 255) : 0;\n\n // Mix band-specific energy with overall level\n const energy = 0.4 * bandAvg + 0.6 * overallLevel;\n\n // Apply traveling wave modulation\n const wavePhase = i * phasePerBar;\n const wave = 1 + waveAmp * Math.sin(timeRef.current + wavePhase);\n\n // Final intensity\n const intensity = Math.min(1, energy * wave);\n\n // Convert to bar length\n const length = Math.max(maxBarLength * 0.03, intensity * maxBarLength * 0.95);\n\n // Coordinates\n const startX = centerX + Math.cos(angle) * innerRadius;\n const startY = centerY + Math.sin(angle) * innerRadius;\n const endX = centerX + Math.cos(angle) * (innerRadius + length);\n const endY = centerY + Math.sin(angle) * (innerRadius + length);\n\n // Draw\n ctx.strokeStyle = color;\n ctx.lineWidth = 5;\n ctx.lineCap = 'round';\n ctx.globalAlpha = opacity * (0.5 + 0.5 * intensity);\n\n ctx.beginPath();\n ctx.moveTo(startX, startY);\n ctx.lineTo(endX, endY);\n ctx.stroke();\n }\n\n ctx.globalAlpha = 1;\n ctx.restore();\n\n animationFrameRef.current = requestAnimationFrame(draw);\n };\n\n draw();\n\n return () => {\n clearTimeout(setupTimeout);\n if (animationFrameRef.current) cancelAnimationFrame(animationFrameRef.current);\n if (sourceNodeRef.current) sourceNodeRef.current.disconnect();\n if (analyserRef.current) analyserRef.current.disconnect();\n if (audioContextRef.current && audioContextRef.current.state !== 'closed') {\n audioContextRef.current.close();\n }\n room.off('trackSubscribed', handleTrackSubscribed);\n room.off('participantConnected', handleParticipantConnected);\n };\n }, [room, size, color, opacity, avatarRadius, barCount, onSpeakingChange]);\n\n return (\n <VisualizerContainer style={{ width: size, height: size }}>\n <Canvas ref={canvasRef} />\n </VisualizerContainer>\n );\n};\n\n"]}
|
package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VoiceModeOverlay.d.ts","sourceRoot":"","sources":["../../../../../../src/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEtC,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB;AAED,eAAO,MAAM,gBAAgB,GAAI,0FAQ9B,qBAAqB,
|
|
1
|
+
{"version":3,"file":"VoiceModeOverlay.d.ts","sourceRoot":"","sources":["../../../../../../src/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEtC,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB;AAED,eAAO,MAAM,gBAAgB,GAAI,0FAQ9B,qBAAqB,4CA6ZvB,CAAC"}
|