@convai/web-sdk 1.8.0-beta.6 → 1.8.0-beta.8

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.
Files changed (99) hide show
  1. package/README.md +303 -1
  2. package/dist/core/ConvaiClient.d.ts +59 -2
  3. package/dist/core/ConvaiClient.d.ts.map +1 -1
  4. package/dist/core/ConvaiClient.js +457 -6
  5. package/dist/core/ConvaiClient.js.map +1 -1
  6. package/dist/core/MessageHandler.d.ts +11 -0
  7. package/dist/core/MessageHandler.d.ts.map +1 -1
  8. package/dist/core/MessageHandler.js +325 -30
  9. package/dist/core/MessageHandler.js.map +1 -1
  10. package/dist/core/SSESession.js +2 -2
  11. package/dist/core/SSESession.js.map +1 -1
  12. package/dist/core/connectRequest.d.ts +38 -3
  13. package/dist/core/connectRequest.d.ts.map +1 -1
  14. package/dist/core/connectRequest.js +57 -11
  15. package/dist/core/connectRequest.js.map +1 -1
  16. package/dist/core/index.d.ts +5 -1
  17. package/dist/core/index.d.ts.map +1 -1
  18. package/dist/core/index.js +8 -1
  19. package/dist/core/index.js.map +1 -1
  20. package/dist/core/logicalTurn.d.ts +4 -1
  21. package/dist/core/logicalTurn.d.ts.map +1 -1
  22. package/dist/core/logicalTurn.js +35 -4
  23. package/dist/core/logicalTurn.js.map +1 -1
  24. package/dist/core/modelOutput.d.ts +40 -0
  25. package/dist/core/modelOutput.d.ts.map +1 -0
  26. package/dist/core/modelOutput.js +187 -0
  27. package/dist/core/modelOutput.js.map +1 -0
  28. package/dist/core/publishedChat.d.ts +9 -0
  29. package/dist/core/publishedChat.d.ts.map +1 -0
  30. package/dist/core/publishedChat.js +13 -0
  31. package/dist/core/publishedChat.js.map +1 -0
  32. package/dist/core/types.d.ts +225 -25
  33. package/dist/core/types.d.ts.map +1 -1
  34. package/dist/core/types.js.map +1 -1
  35. package/dist/embed/ConvaiChatElement.d.ts +103 -0
  36. package/dist/embed/ConvaiChatElement.d.ts.map +1 -0
  37. package/dist/embed/ConvaiChatElement.js +679 -0
  38. package/dist/embed/ConvaiChatElement.js.map +1 -0
  39. package/dist/embed/browser.d.ts +3 -0
  40. package/dist/embed/browser.d.ts.map +1 -0
  41. package/dist/embed/browser.js +5 -0
  42. package/dist/embed/browser.js.map +1 -0
  43. package/dist/embed/chat-embed-v1.js +200 -0
  44. package/dist/embed/chat-embed-v1.js.map +7 -0
  45. package/dist/embed/index.d.ts +9 -0
  46. package/dist/embed/index.d.ts.map +1 -0
  47. package/dist/embed/index.js +9 -0
  48. package/dist/embed/index.js.map +1 -0
  49. package/dist/embed/publicationApi.d.ts +23 -0
  50. package/dist/embed/publicationApi.d.ts.map +1 -0
  51. package/dist/embed/publicationApi.js +141 -0
  52. package/dist/embed/publicationApi.js.map +1 -0
  53. package/dist/react/components/ConvaiWidget.d.ts +11 -1
  54. package/dist/react/components/ConvaiWidget.d.ts.map +1 -1
  55. package/dist/react/components/ConvaiWidget.js +67 -11
  56. package/dist/react/components/ConvaiWidget.js.map +1 -1
  57. package/dist/react/components/rtc-widget/components/MarkdownRenderer.d.ts +7 -0
  58. package/dist/react/components/rtc-widget/components/MarkdownRenderer.d.ts.map +1 -1
  59. package/dist/react/components/rtc-widget/components/MarkdownRenderer.js +111 -17
  60. package/dist/react/components/rtc-widget/components/MarkdownRenderer.js.map +1 -1
  61. package/dist/react/components/rtc-widget/components/UserMessage.js +1 -1
  62. package/dist/react/components/rtc-widget/components/UserMessage.js.map +1 -1
  63. package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.d.ts +1 -1
  64. package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.d.ts.map +1 -1
  65. package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.js +2 -2
  66. package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.js.map +1 -1
  67. package/dist/react/hooks/useConvaiClient.d.ts +2 -0
  68. package/dist/react/hooks/useConvaiClient.d.ts.map +1 -1
  69. package/dist/react/hooks/useConvaiClient.js +8 -0
  70. package/dist/react/hooks/useConvaiClient.js.map +1 -1
  71. package/dist/react/index.d.ts +4 -1
  72. package/dist/react/index.d.ts.map +1 -1
  73. package/dist/react/index.js +8 -1
  74. package/dist/react/index.js.map +1 -1
  75. package/dist/utils/inlineMarkdown.d.ts +22 -0
  76. package/dist/utils/inlineMarkdown.d.ts.map +1 -1
  77. package/dist/utils/inlineMarkdown.js +84 -7
  78. package/dist/utils/inlineMarkdown.js.map +1 -1
  79. package/dist/vanilla/ConvaiWidget.d.ts.map +1 -1
  80. package/dist/vanilla/ConvaiWidget.js +290 -43
  81. package/dist/vanilla/ConvaiWidget.js.map +1 -1
  82. package/dist/vanilla/WidgetEventSubscriptions.d.ts +15 -0
  83. package/dist/vanilla/WidgetEventSubscriptions.d.ts.map +1 -0
  84. package/dist/vanilla/WidgetEventSubscriptions.js +37 -0
  85. package/dist/vanilla/WidgetEventSubscriptions.js.map +1 -0
  86. package/dist/vanilla/index.d.ts +3 -1
  87. package/dist/vanilla/index.d.ts.map +1 -1
  88. package/dist/vanilla/index.js +3 -1
  89. package/dist/vanilla/index.js.map +1 -1
  90. package/dist/vanilla/styles.d.ts.map +1 -1
  91. package/dist/vanilla/styles.js +12 -0
  92. package/dist/vanilla/styles.js.map +1 -1
  93. package/dist/vanilla/types.d.ts +8 -1
  94. package/dist/vanilla/types.d.ts.map +1 -1
  95. package/dist/vanilla/types.js.map +1 -1
  96. package/dist/version.d.ts +1 -1
  97. package/dist/version.js +1 -1
  98. package/dist/version.js.map +1 -1
  99. package/package.json +48 -13
@@ -1 +1 @@
1
- {"version":3,"file":"ConvaiWidget.js","sourceRoot":"","sources":["../../../src/react/components/ConvaiWidget.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAe,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,cAAc,EAAS,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,qDAAqD;AACrD,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,IAAI,EACJ,WAAW,EACX,MAAM,EACN,KAAK,EACL,WAAW,EACX,cAAc,EACd,OAAO,EACP,MAAM,EACN,cAAc,EACd,KAAK,EACL,YAAY,EACZ,SAAS,EACT,cAAc,EACd,UAAU,EACV,WAAW,GACZ,MAAM,cAAc,CAAC;AAEtB,4BAA4B;AAC5B,OAAO,EACL,WAAW,EACX,YAAY,EACZ,gBAAgB,EAEhB,aAAa,GACd,MAAM,cAAc,CAAC;AAiCtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAM,CAAC,MAAM,YAAY,GAAgC,CAAC,EACxD,YAAY,EACZ,SAAS,GAAG,IAAI,EAChB,eAAe,GAAG,IAAI,EACtB,gBAAgB,GAAG,IAAI,GACxB,EAAE,EAAE;IACH,sEAAsE;IACtE,MAAM,EACJ,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,kBAAkB,GAC9B,GAAG,gBAAgB,CAClB,YAAY,CAAC,WAAW,IAAI,SAAS,EACrC,YAAY,CAAC,MAAM,IAAI,SAAS,EAChC,YAAY,CAAC,SAAS,IAAI,SAAS,CACpC,CAAC;IAEF,WAAW;IACX,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACjE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,iCAAiC;IAChF,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5D,MAAM,CAAC,0BAA0B,EAAE,6BAA6B,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpF,MAAM,iBAAiB,GAAG,MAAM,CAAoB,IAAI,CAAC,CAAC;IAC1D,8HAA8H;IAC9H,MAAM,qBAAqB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAE5C,yDAAyD;IACzD,MAAM,iBAAiB,GAAG;QACxB,EAAE,EAAE,YAAY,CAAC,WAAW,IAAI,SAAS;QACzC,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,cAAc;KACtB,CAAC;IAEF,kDAAkD;IAClD,MAAM,iBAAiB,GAAG,GAAG,EAAE;QAC7B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YACpC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAC,MAAM;QAC5D,CAAC;QACD,IAAI,YAAY,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;YAChE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,gBAAgB;QACpE,CAAC;QACD,IAAI,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YACnC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,uBAAuB;QAC1E,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,QAAQ;IAC3D,CAAC,CAAC;IAEF,8BAA8B;IAC9B,MAAM,cAAc,GAAG,GAAqB,EAAE;QAC5C,wEAAwE;QACxE,MAAM,gBAAgB,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,CACvD,CAAC,GAAG,EAAE,EAAE,CACN,CAAC,GAAG,CAAC,IAAI,KAAK,oBAAoB;YAChC,GAAG,CAAC,IAAI,KAAK,eAAe;YAC5B,GAAG,CAAC,IAAI,KAAK,cAAc;YAC3B,GAAG,CAAC,IAAI,KAAK,YAAY;YACzB,GAAG,CAAC,IAAI,KAAK,aAAa,CAAC;YAC7B,GAAG,CAAC,OAAO,IAAI,wBAAwB;YACvC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAChC,CAAC;QAEF,OAAO,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACpC,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,IAAI,EAAE,GAAG,CAAC,OAAO;YACjB,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjC,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,EAAE,EAAE;gBACxD,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,SAAS;aAClB,CAAC;YACF,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI;YAClE,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;SACnC,CAAC,CAAC,CAAC;IACN,CAAC,CAAC;IAEF,iBAAiB;IACjB,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE;QAC9B,6DAA6D;QAC7D,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YACxE,IAAI,CAAC;gBACH,6EAA6E;gBAC7E,IAAI,qBAAqB,CAAC,OAAO,IAAI,OAAO,YAAY,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;oBAClF,MAAM,YAAY,CAAC,SAAS,EAAE,CAAC;gBACjC,CAAC;qBAAM,CAAC;oBACN,MAAM,YAAY,CAAC,OAAO,EAAE,CAAC;gBAC/B,CAAC;gBACD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,0CAA0C;YAC7D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,8CAA8C;YAC9C,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;IACF,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,SAAS,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,CAAC,CAAsC,EAAE,EAAE;QACnE,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAI,UAAU,CAAC,IAAI,EAAE,IAAI,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YACxD,YAAY,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;YAC7C,aAAa,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,CAAC,CAAsB,EAAE,EAAE;QAChD,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;YACtB,UAAU,EAAE,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IAGF,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,MAAM,aAAa,GAAG,CAAC,OAAO,CAAC;QAE/B,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,KAAK,WAAW,EAAE,CAAC;YAC7C,uDAAuD;YACvD,MAAM,kBAAkB,GAAG,KAAK,CAAC,IAAI,CACnC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAC9C,CAAC;YACF,kBAAkB,CAAC,OAAO,CAAC,CAAC,WAAgB,EAAE,EAAE;gBAC9C,WAAW,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,WAAgB,EAAE,EAAE;oBAC9D,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;wBACtB,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;oBAC5C,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,6EAA6E;YAC7E,MAAM,UAAU,GAAG,QAAQ,CAAC,gBAAgB,CAAmB,uBAAuB,CAAC,CAAC;YACxF,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,UAAU,CAAC,aAAa,CAAC,CAAC;IAC5B,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;QAC7B,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEzB,IAAI,CAAC;YACH,6BAA6B;YAC7B,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;YAEhC,4DAA4D;YAC5D,YAAY,CAAC,YAAY,EAAE,CAAC;YAE5B,8BAA8B;YAC9B,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,cAAc,CAAC,KAAK,CAAC,CAAC;YAEtB,yDAAyD;YACzD,qDAAqD;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;QAClC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACzB,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;QAEhC,8BAA8B;QAC9B,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,cAAc,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,KAAK,IAAI,EAAE;QACnC,0CAA0C;QAC1C,IAAI,YAAY,CAAC,cAAc,KAAK,OAAO,EAAE,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;YACxE,OAAO;QACT,CAAC;QAED,IAAI,YAAY,CAAC,cAAc,EAAE,CAAC;YAChC,MAAM,YAAY,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;QACjD,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,uBAAuB,GAAG,KAAK,IAAI,EAAE;QACzC,MAAM,YAAY,CAAC,mBAAmB,CAAC,iBAAiB,EAAE,CAAC;IAC7D,CAAC,CAAC;IAEF,MAAM,oBAAoB,GAAG,GAAG,EAAE;QAChC,iBAAiB,CAAC,CAAC,cAAc,CAAC,CAAC;IACrC,CAAC,CAAC;IAEF,mGAAmG;IACnG,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;YACnC,qBAAqB,CAAC,OAAO,GAAG,IAAI,CAAC;QACvC,CAAC;IACH,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAErC,kCAAkC;IAClC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YACxE,IAAI,MAAM,EAAE,CAAC;gBACX,SAAS,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;YACD,gCAAgC;YAChC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;YAC1C,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAmB;YAC1C,6BAA6B,CAAC,KAAK,CAAC,CAAC,CAAC,6DAA6D;QACrG,CAAC;IACH,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,YAAY,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IAE9E,kDAAkD;IAClD,SAAS,CAAC,GAAG,EAAE;QACb,iBAAiB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IACjD,CAAC,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;IAElC,oDAAoD;IACpD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;YAChC,IAAI,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;gBAC/C,oCAAoC;gBACpC,MAAM,YAAY,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;YAC/C,CAAC;QACH,CAAC,CAAC;QACF,cAAc,EAAE,CAAC;IACnB,CAAC,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IAEhC,0DAA0D;IAC1D,SAAS,CAAC,GAAG,EAAE;QACb,IACE,MAAM;YACN,gBAAgB;YAChB,YAAY,CAAC,KAAK,CAAC,WAAW;YAC9B,CAAC,0BAA0B;YAC3B,CAAC,WAAW,EACZ,CAAC;YACD,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;gBAChC,IAAI,CAAC;oBACH,MAAM,YAAY,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;oBAC/C,cAAc,CAAC,IAAI,CAAC,CAAC;oBACrB,6BAA6B,CAAC,IAAI,CAAC,CAAC;gBACtC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC,CAAC;YACF,cAAc,EAAE,CAAC;QACnB,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,EAAE,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,0BAA0B,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IAEtH,uCAAuC;IACvC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,kBAAkB,GAAG,CAAC,KAAiB,EAAE,EAAE;YAC/C,IAAI,cAAc,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;gBAChD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAc,CAAC;gBACpC,MAAM,cAAc,GAAG,iBAAiB,CAAC,OAAO,CAAC;gBACjD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBACrC,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC;oBACpE,IAAI,YAAY,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;wBACnD,iBAAiB,CAAC,KAAK,CAAC,CAAC;oBAC3B,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,cAAc,EAAE,CAAC;YACnB,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAChE,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,iCAAiC;IACjC,MAAM,YAAY,GAAG,GAAwC,EAAE;QAC7D,IAAI,YAAY,CAAC,KAAK,CAAC,YAAY;YAAE,OAAO,YAAY,CAAC;QACzD,IAAI,YAAY,CAAC,KAAK,CAAC,WAAW;YAAE,OAAO,WAAW,CAAC;QACvD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,IAAI,YAAY,CAAC,KAAK,CAAC,WAAW;YAAE,OAAO,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,uBAAuB;QACjG,IAAI,YAAY,CAAC,KAAK,CAAC,YAAY;YAAE,OAAO,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,gCAAgC;QAC3G,OAAO,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB;IACxD,CAAC,CAAC;IAEF,gFAAgF;IAChF,MAAM,gBAAgB,GAAG,MAAM,CAAuB,IAAI,CAAC,CAAC;IAE5D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,KAAK,WAAW;YAAE,OAAO;QAE1E,gBAAgB,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAEhE,OAAO,GAAG,EAAE;YACV,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC;gBAC7B,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACnC,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;YAClC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAExD,OAAO,CACL,MAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,aAGnG,MAAC,eAAe,IACd,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EACnC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EACjC,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,aAE9C,MAAC,iBAAiB,IAChB,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,EAC3C,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,EACjD,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,EAC/C,OAAO,EAAE;4BACP,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;4BAChC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;4BACjC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK;yBACzD,EACD,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,EAChD,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,aAGlD,KAAC,aAAa,IACZ,OAAO,EAAE;oCACP,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oCACvB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iCACxB,EACD,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,YAE7B,KAAC,IAAI,cACH,KAAC,UAAU,IACT,IAAI,EAAC,IAAI,EACT,KAAK,EAAE,YAAY,EAAE,EACrB,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,YAAY,EACxC,KAAK,EAAE,YAAY,EAAE,GACrB,GACG,GACO,EAGf,YAAY,CAAC,KAAK,CAAC,WAAW,IAAI,CACjC,MAAC,WAAW,IACV,OAAO,EAAE;oCACP,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oCACvB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;iCACxB,EACD,UAAU,EAAE;oCACV,QAAQ,EAAE,GAAG;oCACb,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iCACxB,EACD,KAAK,EAAE;oCACL,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;iCACxC,aAGD,MAAC,MAAM,IACL,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAC/B,OAAO,EAAE;4CACP,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;4CACvB,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;yCACpB,EACD,UAAU,EAAE;4CACV,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;4CACvB,GAAG,cAAc,CAAC,UAAU;yCAC7B,EACD,KAAK,EAAE;4CACL,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;4CACvC,SAAS,EAAE,QAAQ,EAAE,2BAA2B;yCACjD,aAED,KAAC,WAAW,IACV,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAC1B,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EACxB,UAAU,EAAE,cAAc,CAAC,MAAM,EACjC,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,YAEnD,KAAC,WAAW,IAAC,IAAI,EAAC,IAAI,GAAG,GACb,EAEd,MAAC,KAAK,eACH,iBAAiB,CAAC,KAAK,IAAI,CAAC,WAAW,IAAI,CAC1C,KAAC,MAAM,CAAC,GAAG,IAET,GAAG,EAAE,iBAAiB,CAAC,KAAK,EAC5B,GAAG,EAAE,iBAAiB,CAAC,IAAI,EAC3B,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,EACnC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EACjC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,EAChC,UAAU,EAAE,cAAc,CAAC,OAAO,EAClC,KAAK,EAAE;4DACL,KAAK,EAAE,QAAQ;4DACf,MAAM,EAAE,QAAQ;4DAChB,YAAY,EAAE,KAAK;4DACnB,SAAS,EAAE,OAAO;4DAClB,WAAW,EAAE,QAAQ;4DACrB,MAAM,EAAE,eAAe,iBAAiB,EAAE,CAAC,KAAK,EAAE;4DAClD,SAAS,EAAE,WAAW,iBAAiB,EAAE,CAAC,KAAK,IAAI;4DACnD,UAAU,EAAE,eAAe;yDAC5B,IAhBG,eAAe,CAAC,wDAAwD;qDAiB5E,CACH,EACA,iBAAiB,CAAC,IAAI,EACvB,KAAC,MAAM,CAAC,MAAM,IACZ,OAAO,EAAE,gBAAgB,EACzB,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAC1B,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EACxB,UAAU,EAAE,cAAc,CAAC,MAAM,EACjC,KAAK,EAAE;4DACL,MAAM,EAAE,SAAS;4DACjB,aAAa,EAAE,MAAM;4DACrB,UAAU,EAAE,aAAa;4DACzB,MAAM,EAAE,MAAM;4DACd,SAAS,EAAE,MAAM;4DACjB,KAAK,EAAE,MAAM;4DACb,MAAM,EAAE,MAAM;4DACd,OAAO,EAAE,GAAG;4DACZ,OAAO,EAAE,aAAa;4DACtB,UAAU,EAAE,QAAQ;4DACpB,UAAU,EAAE,QAAQ;4DACpB,OAAO,EAAE,MAAM;yDAChB,gBACW,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EACvC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,YAEjC,OAAO,CAAC,CAAC,CAAC,CACT,KAAC,YAAY,IAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAC,WAAW,GAAG,CAC7C,CAAC,CAAC,CAAC,CACF,KAAC,YAAY,IAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAC,SAAS,GAAG,CAC3C,GACa,EACf,WAAW,IAAI,CACd,eACE,KAAK,EAAE;4DACL,QAAQ,EAAE,MAAM;4DAChB,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK;4DACpC,UAAU,EAAE,GAAG;4DACf,UAAU,EAAE,KAAK;4DACjB,OAAO,EAAE,SAAS;4DAClB,YAAY,EAAE,KAAK;4DACnB,eAAe,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI;yDACtD,sBAGI,CACR,EACA,YAAY,CAAC,KAAK,CAAC,UAAU,IAAI,CAChC,MAAC,MAAM,CAAC,IAAI,IACV,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,EACnC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EACjC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,EAChC,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAC7B,KAAK,EAAE;4DACL,QAAQ,EAAE,MAAM;4DAChB,KAAK,EAAE,SAAS;4DAChB,UAAU,EAAE,GAAG;4DACf,UAAU,EAAE,KAAK;4DACjB,OAAO,EAAE,SAAS;4DAClB,YAAY,EAAE,KAAK;4DACnB,eAAe,EAAE,WAAW;4DAC5B,MAAM,EAAE,qBAAqB;4DAC7B,OAAO,EAAE,aAAa;4DACtB,UAAU,EAAE,QAAQ;4DACpB,GAAG,EAAE,KAAK;yDACX,aAED,KAAC,MAAM,CAAC,IAAI,IACV,OAAO,EAAE;oEACP,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;oEAClB,OAAO,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;iEACrB,EACD,UAAU,EAAE;oEACV,QAAQ,EAAE,GAAG;oEACb,MAAM,EAAE,QAAQ;oEAChB,IAAI,EAAE,WAAW;iEAClB,EACD,KAAK,EAAE;oEACL,KAAK,EAAE,KAAK;oEACZ,MAAM,EAAE,KAAK;oEACb,YAAY,EAAE,KAAK;oEACnB,eAAe,EAAE,SAAS;oEAC1B,OAAO,EAAE,cAAc;iEACxB,GACD,gBAEU,CACf,EACA,YAAY,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,IAAI,CACnE,MAAC,MAAM,CAAC,IAAI,IACV,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,EACnC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EACjC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,EAChC,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAC7B,KAAK,EAAE;4DACL,QAAQ,EAAE,MAAM;4DAChB,KAAK,EAAE,SAAS;4DAChB,UAAU,EAAE,GAAG;4DACf,UAAU,EAAE,KAAK;4DACjB,OAAO,EAAE,SAAS;4DAClB,YAAY,EAAE,KAAK;4DACnB,eAAe,EAAE,WAAW;4DAC5B,MAAM,EAAE,qBAAqB;4DAC7B,OAAO,EAAE,aAAa;4DACtB,UAAU,EAAE,QAAQ;4DACpB,GAAG,EAAE,KAAK;yDACX,aAED,KAAC,MAAM,CAAC,IAAI,IACV,OAAO,EAAE;oEACP,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;oEAClB,OAAO,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;iEACrB,EACD,UAAU,EAAE;oEACV,QAAQ,EAAE,GAAG;oEACb,MAAM,EAAE,QAAQ;oEAChB,IAAI,EAAE,WAAW;iEAClB,EACD,KAAK,EAAE;oEACL,KAAK,EAAE,KAAK;oEACZ,MAAM,EAAE,KAAK;oEACb,YAAY,EAAE,KAAK;oEACnB,eAAe,EAAE,SAAS;oEAC1B,OAAO,EAAE,cAAc;iEACxB,GACD,iBAEU,CACf,IACK,EAER,cACE,KAAK,EAAE;oDACL,OAAO,EAAE,MAAM;oDACf,UAAU,EAAE,QAAQ;oDACpB,GAAG,EAAE,QAAQ;oDACb,QAAQ,EAAE,UAAU;iDACrB,YAED,KAAC,cAAc,IACb,GAAG,EAAE,iBAAiB,EACtB,OAAO,EAAE,oBAAoB,EAC7B,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAC1B,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EACxB,UAAU,EAAE,cAAc,CAAC,MAAM,EACjC,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,YAE5B,KAAC,cAAc,IAAC,IAAI,EAAE,EAAE,GAAI,GACb,GACb,IACC,EAGT,MAAC,OAAO,IACN,KAAK,EAAE;4CACL,UAAU,EAAE,WAAW;gDACrB,CAAC,CAAC,2BAA2B;gDAC7B,CAAC,CAAC,aAAa;4CACjB,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;4CAC7C,QAAQ,EAAE,UAAU;yCACrB,aAGD,KAAC,eAAe,cACb,YAAY,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,CAC7D,MAAC,MAAM,CAAC,GAAG,IACT,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EACvB,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EACvB,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EACpB,UAAU,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,EAC7B,KAAK,EAAE;wDACL,QAAQ,EAAE,UAAU;wDACpB,GAAG,EAAE,CAAC;wDACN,IAAI,EAAE,CAAC;wDACP,KAAK,EAAE,CAAC;wDACR,MAAM,EAAE,CAAC;wDACT,OAAO,EAAE,MAAM;wDACf,aAAa,EAAE,QAAQ;wDACvB,UAAU,EAAE,QAAQ;wDACpB,cAAc,EAAE,QAAQ;wDACxB,eAAe,EAAE,2BAA2B;wDAC5C,MAAM,EAAE,GAAG;wDACX,GAAG,EAAE,MAAM;qDACZ,aAED,KAAC,MAAM,CAAC,GAAG,IACT,OAAO,EAAE;gEACP,MAAM,EAAE,GAAG;6DACZ,EACD,UAAU,EAAE;gEACV,QAAQ,EAAE,CAAC;gEACX,MAAM,EAAE,QAAQ;gEAChB,IAAI,EAAE,QAAQ;6DACf,YAED,KAAC,UAAU,IACT,IAAI,EAAC,IAAI,EACT,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EACpC,KAAK,EAAC,YAAY,GAClB,GACS,EACb,MAAC,MAAM,CAAC,GAAG,IACT,OAAO,EAAE;gEACP,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;6DACvB,EACD,UAAU,EAAE;gEACV,QAAQ,EAAE,CAAC;gEACX,MAAM,EAAE,QAAQ;gEAChB,IAAI,EAAE,WAAW;6DAClB,EACD,KAAK,EAAE;gEACL,QAAQ,EAAE,MAAM;gEAChB,UAAU,EAAE,GAAG;gEACf,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS;6DACvC,+BAEc,iBAAiB,CAAC,IAAI,WAC1B,IACF,CACd,GACe,EAEjB,WAAW,IAAI,CACd,KAAC,gBAAgB,IACf,QAAQ,EAAE,CAAC,YAAY,CAAC,YAAY,EACpC,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,UAAU,EACxC,WAAW,EAAE,YAAY,CAAC,KAAK,CAAC,WAAW,EAC3C,YAAY,EAAE,IAAI,EAClB,cAAc,EAAE,cAAc,IAAI,SAAS,EAC3C,aAAa,EAAE,aAAa,IAAI,SAAS,EACzC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,KAAK,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GACzE,CACH,EACA,CAAC,WAAW,IAAI,CACf,KAAC,WAAW,IACV,QAAQ,EAAE,cAAc,EAAE,EAC1B,WAAW,EAAE,YAAY,CAAC,KAAK,CAAC,UAAU,EAC1C,kBAAkB,EAAE,GAAG,MAAM,IAAI,YAAY,CAAC,YAAY,CAAC,MAAM,EAAE,GACnE,CACH,IACO,EAGV,KAAC,MAAM,IACL,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAC9B,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAC7B,UAAU,EAAE;4CACV,KAAK,EAAE,GAAG;4CACV,GAAG,cAAc,CAAC,UAAU;yCAC7B,EACD,KAAK,EAAE;4CACL,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM;4CAC7C,UAAU,EAAE,kBAAkB;4CAC9B,OAAO,EAAE,MAAM;4CACf,GAAG,EAAE,QAAQ;4CACb,UAAU,EAAE,QAAQ;4CACpB,QAAQ,EAAE,UAAU;4CACpB,cAAc,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY;4CACrD,SAAS,EAAE,QAAQ,EAAE,2BAA2B;yCACjD,YAGA,WAAW,CAAC,CAAC,CAAC,CACb,KAAC,MAAM,CAAC,MAAM,IAEZ,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,EACnC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EACjC,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,EAChC,UAAU,EAAE;gDACV,QAAQ,EAAE,GAAG;gDACb,IAAI,EAAE,SAAS;6CAChB,EACD,OAAO,EAAE,KAAK,IAAI,EAAE;gDAClB,YAAY,CAAC,oBAAoB,EAAE,CAAC;gDACpC,MAAM,YAAY,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;gDAC7C,yDAAyD;gDACzD,gEAAgE;gDAChE,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,KAAK,WAAW,EAAE,CAAC;oDAC7C,YAAY,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gDAChC,CAAC;gDACD,cAAc,CAAC,KAAK,CAAC,CAAC;4CACxB,CAAC,EACD,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAC1B,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EACxB,KAAK,EAAE;gDACL,MAAM,EAAE,SAAS;gDACjB,eAAe,EAAE,SAAS;gDAC1B,KAAK,EAAE,SAAS;gDAChB,MAAM,EAAE,MAAM;gDACd,YAAY,EAAE,KAAK;gDACnB,KAAK,EAAE,SAAS;gDAChB,MAAM,EAAE,SAAS;gDACjB,QAAQ,EAAE,SAAS;gDACnB,SAAS,EAAE,SAAS;gDACpB,OAAO,EAAE,MAAM;gDACf,UAAU,EAAE,QAAQ;gDACpB,cAAc,EAAE,QAAQ;gDACxB,UAAU,EAAE,CAAC;gDACb,OAAO,EAAE,CAAC;gDACV,OAAO,EAAE,MAAM;6CAChB,gBACU,iBAAiB,EAC5B,KAAK,EAAC,iBAAiB,YAEvB,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,GAAI,IAxCpB,iBAAiB,CAyCP,CACjB,CAAC,CAAC,CAAC,CACF,4BAEE,MAAC,cAAc,IAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,aAEtD,KAAC,KAAK,IACJ,IAAI,EAAC,MAAM,EACX,WAAW,EAAC,cAAc,EAC1B,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,iBAAiB,EAC3B,UAAU,EAAE,cAAc,EAC1B,KAAK,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,GAClC,EAGF,cACE,KAAK,EAAE;4DACL,QAAQ,EAAE,UAAU;4DACpB,KAAK,EAAE,UAAU;4DACjB,GAAG,EAAE,KAAK;4DACV,SAAS,EAAE,kBAAkB;4DAC7B,KAAK,EAAE,SAAS;4DAChB,MAAM,EAAE,SAAS;4DACjB,QAAQ,EAAE,SAAS;4DACnB,SAAS,EAAE,SAAS;4DACpB,UAAU,EAAE,CAAC;4DACb,QAAQ,EAAE,SAAS;4DACnB,OAAO,EAAE,MAAM;4DACf,UAAU,EAAE,QAAQ;4DACpB,cAAc,EAAE,QAAQ;4DACxB,MAAM,EAAE,CAAC;yDACV,YAED,KAAC,eAAe,IAAC,IAAI,EAAC,MAAM,YACzB,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACvB,KAAC,YAAY,IAEX,OAAO,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EACtB,OAAO,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,EACpB,IAAI,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,EACpB,UAAU,EAAE;oEACV,QAAQ,EAAE,GAAG;oEACb,IAAI,EAAE,QAAQ;iEACf,EACD,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EACxB,KAAK,EAAE;oEACL,QAAQ,EAAE,UAAU;oEACpB,GAAG,EAAE,CAAC;oEACN,IAAI,EAAE,CAAC;oEACP,MAAM,EAAE,SAAS;iEAClB,YAED,KAAC,MAAM,IAAC,IAAI,EAAE,EAAE,GAAI,IAjBhB,MAAM,CAkBG,CAChB,CAAC,CAAC,CAAC,CACF,KAAC,MAAM,CAAC,MAAM,IAEZ,OAAO,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EACtB,OAAO,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,EACpB,IAAI,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,EACpB,UAAU,EAAE;oEACV,QAAQ,EAAE,GAAG;oEACb,IAAI,EAAE,QAAQ;iEACf,EACD,OAAO,EAAE,KAAK,IAAI,EAAE;oEAClB,YAAY,CAAC,oBAAoB,EAAE,CAAC;oEACpC,mDAAmD;oEACnD,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,KAAK,WAAW,EAAE,CAAC;wEAC7C,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;oEAC/B,CAAC;oEACD,MAAM,YAAY,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;oEAC/C,cAAc,CAAC,IAAI,CAAC,CAAC;gEACvB,CAAC,EACD,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAC1B,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EACxB,KAAK,EAAE;oEACL,QAAQ,EAAE,UAAU;oEACpB,GAAG,EAAE,CAAC;oEACN,IAAI,EAAE,CAAC;oEACP,MAAM,EAAE,SAAS;oEACjB,eAAe,EAAE,aAAa;oEAC9B,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO;oEACpC,MAAM,EAAE,aAAa,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;oEACpD,YAAY,EAAE,KAAK;oEACnB,KAAK,EAAE,SAAS;oEAChB,MAAM,EAAE,SAAS;oEACjB,QAAQ,EAAE,SAAS;oEACnB,SAAS,EAAE,SAAS;oEACpB,OAAO,EAAE,MAAM;oEACf,UAAU,EAAE,QAAQ;oEACpB,cAAc,EAAE,QAAQ;oEACxB,UAAU,EAAE,CAAC;oEACb,OAAO,EAAE,CAAC;oEACV,OAAO,EAAE,MAAM;iEAChB,gBACU,kBAAkB,EAC7B,KAAK,EAAC,gBAAgB,YAEtB,KAAC,UAAU,IAAC,IAAI,EAAE,EAAE,GAAI,IA1CpB,OAAO,CA2CG,CACjB,GACe,GACd,IACS,GAChB,CACJ,GACM,IACG,CACf,IACiB,EAGnB,YAAY,CAAC,KAAK,CAAC,WAAW,IAAI,CACjC,KAAC,YAAY,IACX,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,WAAW,EACpB,YAAY,EAAE,gBAAgB,EAC9B,aAAa,EACX,YAAY,CAAC,cAAc,KAAK,OAAO,IAAI,SAAS;4BAClD,CAAC,CAAC,iBAAiB;4BACnB,CAAC,CAAC,SAAS,EAEf,cAAc,EAAE,cAAc,EAC9B,mBAAmB,EACjB,YAAY,CAAC,cAAc,KAAK,OAAO,IAAI,eAAe;4BACxD,CAAC,CAAC,uBAAuB;4BACzB,CAAC,CAAC,SAAS,EAEf,mBAAmB,EACjB,YAAY,CAAC,mBAAmB,GAElC,CACH,IACe,EAGjB,YAAY,CAAC,IAAI,EAAE,KAAK,KAAK,WAAW,IAAI,CAC3C,KAAC,aAAa,IACZ,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,KAAK,IAAI,EAAE;oBAClB,MAAM,YAAY,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;gBAClD,CAAC,EACD,MAAM,EAAE,IAAI,GACZ,CACH,IACoB,CACxB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import { useCallback, useState, useRef, useEffect } from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport { FiMoreVertical, FiMic, FiSend, FiPhoneOff } from \"react-icons/fi\";\nimport { IoVolumeMute, IoVolumeHigh } from \"react-icons/io5\";\nimport { PiWaveform } from \"react-icons/pi\";\nimport type { IConvaiClient } from \"../../core/types\";\nimport { RoomContext } from \"@livekit/components-react\";\nimport { useCharacterInfo } from \"../hooks/useCharacterInfo\";\nimport { AudioRenderer } from \"../../vanilla/AudioRenderer\";\n\n// Import styled components and theme from rtc-widget\nimport {\n ConvaiContainer,\n MorphingContainer,\n ButtonContent,\n Logo,\n ChatContent,\n Header,\n Title,\n CloseButton,\n SettingsButton,\n Content,\n Footer,\n InputContainer,\n Input,\n ActionButton,\n aeroTheme,\n iosTransitions,\n ConvaiLogo,\n ChevronDown,\n} from \"./rtc-widget\";\n\n// Import message components\nimport {\n MessageList,\n SettingsTray,\n VoiceModeOverlay,\n RTCChatMessage,\n FloatingVideo,\n} from \"./rtc-widget\";\n\ninterface Character {\n id: string;\n name?: string;\n image?: string;\n}\n\ninterface ConvaiWidgetProps {\n /** Convai client instance (required) */\n convaiClient: IConvaiClient & { \n activity?: string;\n isAudioMuted: boolean;\n isVideoEnabled: boolean;\n isScreenShareActive: boolean;\n };\n /**\n * Show video toggle button in settings (default: true).\n * Only works if connection type is \"video\". If false, hides the video button.\n */\n showVideo?: boolean;\n /**\n * Show screen share toggle button in settings (default: true).\n * Only works if connection type is \"video\". If false, hides the screen share button.\n */\n showScreenShare?: boolean;\n /**\n * Start in voice mode by default when widget opens (default: true).\n * When true, the widget will open directly in voice mode with microphone enabled.\n */\n defaultVoiceMode?: boolean;\n}\n\n/**\n * ConvaiWidget - A consolidated chat widget component for real-time conversations\n *\n * This component provides a complete UI for interacting with Convai characters.\n * Connection configuration should be handled via useConvaiClient.connect().\n *\n * Features:\n * - Collapsed circular button with status indicator\n * - Expandable/collapsible chat interface\n * - Voice mode support\n * - Real-time message streaming\n * - Audio controls (mute/unmute)\n * - Settings tray with session reset\n * - Optional video and screen share (when connection type supports it)\n *\n * @param {ConvaiWidgetProps} props - Component props\n * @param {ConvaiClient} props.convaiClient - Convai client instance (required)\n * @param {boolean} props.showVideo - Show video toggle in settings (default: true)\n * @param {boolean} props.showScreenShare - Show screen share toggle in settings (default: true)\n * @param {boolean} props.defaultVoiceMode - Start in voice mode when widget opens (default: true)\n *\n * @example\n * ```tsx\n * function App() {\n * const convaiClient = useConvaiClient({\n * apiKey: 'your-api-key',\n * characterId: 'your-character-id',\n * enableVideo: true,\n * });\n *\n * return (\n * <ConvaiWidget\n * convaiClient={convaiClient}\n * showVideo={true}\n * showScreenShare={true}\n * />\n * );\n * }\n * ```\n */\nexport const ConvaiWidget: React.FC<ConvaiWidgetProps> = ({\n convaiClient,\n showVideo = true,\n showScreenShare = true,\n defaultVoiceMode = true,\n}) => {\n // Fetch character information dynamically from client's stored values\n const {\n name: characterName,\n image: characterImage,\n isLoading: isCharacterLoading,\n } = useCharacterInfo(\n convaiClient.characterId || undefined,\n convaiClient.apiKey || undefined,\n convaiClient.authToken || undefined,\n );\n\n // UI State\n const [isOpen, setIsOpen] = useState(false);\n const [inputValue, setInputValue] = useState(\"\");\n const [isSettingsOpen, setIsSettingsOpen] = useState(false);\n const [isVoiceMode, setIsVoiceMode] = useState(defaultVoiceMode);\n const [isMuted, setIsMuted] = useState(false); // Character audio starts unmuted\n const [isVideoVisible, setIsVideoVisible] = useState(false);\n const [hasEnteredDefaultVoiceMode, setHasEnteredDefaultVoiceMode] = useState(false);\n\n const settingsButtonRef = useRef<HTMLButtonElement>(null);\n /** True after we have connected at least once; used to call reconnect() instead of connect() when opening after disconnect */\n const hasConnectedBeforeRef = useRef(false);\n\n // Character info from API (using client's stored values)\n const selectedCharacter = {\n id: convaiClient.characterId || \"unknown\",\n name: characterName,\n image: characterImage,\n };\n\n // Get bot status color for character image border\n const getBotStatusColor = () => {\n if (!convaiClient.state.isConnected) {\n return { color: \"#ef4444\", label: \"Disconnected\" }; // Red\n }\n if (convaiClient.state.isConnecting || !convaiClient.isBotReady) {\n return { color: \"#f59e0b\", label: \"Connecting\" }; // Yellow/Orange\n }\n if (convaiClient.state.isListening) {\n return { color: \"#3b82f6\", label: \"Listening\" }; // Blue - user speaking\n }\n return { color: \"#10b981\", label: \"Connected\" }; // Green\n };\n\n // Format chat messages for UI\n const formatMessages = (): RTCChatMessage[] => {\n // Filter to only show relevant message types and exclude empty messages\n const filteredMessages = convaiClient.chatMessages.filter(\n (msg) =>\n (msg.type === \"user-transcription\" ||\n msg.type === \"user-llm-text\" ||\n msg.type === \"bot-llm-text\" ||\n msg.type === \"bot-output\" ||\n msg.type === \"bot-emotion\") &&\n msg.content && // Ensure content exists\n msg.content.trim().length > 0, // Ensure content is not empty or just whitespace\n );\n\n return filteredMessages.map((msg) => ({\n id: msg.id,\n text: msg.content,\n isUser: msg.type.includes(\"user\"),\n timestamp: new Date(msg.timestamp).toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }),\n sender: msg.type.includes(\"user\") ? \"You\" : selectedCharacter.name,\n showLogo: msg.type.includes(\"bot\"),\n }));\n };\n\n // Event Handlers\n const handleToggle = async () => {\n // Connect on first click if not already connected/connecting\n if (!convaiClient.state.isConnected && !convaiClient.state.isConnecting) {\n try {\n // Use reconnect when opening again after a disconnect (reuses stored config)\n if (hasConnectedBeforeRef.current && typeof convaiClient.reconnect === \"function\") {\n await convaiClient.reconnect();\n } else {\n await convaiClient.connect();\n }\n setIsOpen(true); // Open widget after successful connection\n } catch (error) {\n console.error(\"Failed to connect:\", error);\n }\n } else {\n // Just toggle open/close if already connected\n setIsOpen(!isOpen);\n }\n };\n const handleClose = () => {\n setIsOpen(false);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n };\n\n const handleSend = () => {\n if (inputValue.trim() && convaiClient.state.isConnected) {\n convaiClient.sendUserTextMessage(inputValue);\n setInputValue(\"\");\n }\n };\n\n const handleKeyPress = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n handleSend();\n }\n };\n\n\n const handleToggleMute = () => {\n const newMutedState = !isMuted;\n\n if (convaiClient.room?.state === \"connected\") {\n // LiveKit: mute/unmute remote participant audio tracks\n const remoteParticipants = Array.from(\n convaiClient.room.remoteParticipants.values(),\n );\n remoteParticipants.forEach((participant: any) => {\n participant.audioTrackPublications.forEach((publication: any) => {\n if (publication.track) {\n publication.track.setMuted(newMutedState);\n }\n });\n });\n } else {\n // WebSocket: mute/unmute the hidden <audio> element added by useConvaiClient\n const wsAudioEls = document.querySelectorAll<HTMLAudioElement>(\"audio[data-convai-ws]\");\n wsAudioEls.forEach((el) => { el.muted = newMutedState; });\n }\n\n setIsMuted(newMutedState);\n };\n\n const handleReset = async () => {\n setIsSettingsOpen(false);\n\n try {\n // Disconnect current session\n await convaiClient.disconnect();\n\n // Reset session ID so next connection creates a new session\n convaiClient.resetSession();\n\n // Reset UI states immediately\n setIsMuted(false);\n setIsVoiceMode(false);\n\n // Note: User is responsible for reconnecting after reset\n // They should call convaiClient.connect() themselves\n } catch (error) {\n console.error(\"Failed to reset:\", error);\n }\n };\n\n const handleDisconnect = async () => {\n setIsSettingsOpen(false);\n await convaiClient.disconnect();\n\n // Reset UI states immediately\n setIsMuted(false);\n setIsVoiceMode(false);\n };\n\n const handleToggleVideo = async () => {\n // Only toggle if connection type is video\n if (convaiClient.connectionType !== \"video\") {\n console.warn(\"Video capability requires connection type to be 'video'\");\n return;\n }\n\n if (convaiClient.isVideoEnabled) {\n await convaiClient.videoControls.disableVideo();\n } else {\n await convaiClient.videoControls.enableVideo();\n }\n };\n\n const handleToggleScreenShare = async () => {\n await convaiClient.screenShareControls.toggleScreenShare();\n };\n\n const handleSettingsToggle = () => {\n setIsSettingsOpen(!isSettingsOpen);\n };\n\n // Remember that we have connected at least once (so we use reconnect() next time after disconnect)\n useEffect(() => {\n if (convaiClient.state.isConnected) {\n hasConnectedBeforeRef.current = true;\n }\n }, [convaiClient.state.isConnected]);\n\n // Auto-collapse when disconnected\n useEffect(() => {\n if (!convaiClient.state.isConnected && !convaiClient.state.isConnecting) {\n if (isOpen) {\n setIsOpen(false);\n }\n // Reset UI states on disconnect\n setIsMuted(false); // Reset character mute\n setIsVoiceMode(false); // Reset voice mode\n setHasEnteredDefaultVoiceMode(false); // Reset flag so voice mode can be entered again on reconnect\n }\n }, [convaiClient.state.isConnected, convaiClient.state.isConnecting, isOpen]);\n\n // Sync video visibility with video controls state\n useEffect(() => {\n setIsVideoVisible(convaiClient.isVideoEnabled);\n }, [convaiClient.isVideoEnabled]);\n\n // Ensure microphone is muted when not in voice mode\n useEffect(() => {\n const ensureMicState = async () => {\n if (!isVoiceMode && !convaiClient.isAudioMuted) {\n // Mute microphone when in text mode\n await convaiClient.audioControls.muteAudio();\n }\n };\n ensureMicState();\n }, [isVoiceMode, convaiClient]);\n\n // Handle default voice mode when widget opens (only once)\n useEffect(() => {\n if (\n isOpen &&\n defaultVoiceMode &&\n convaiClient.state.isConnected &&\n !hasEnteredDefaultVoiceMode &&\n !isVoiceMode\n ) {\n const enterVoiceMode = async () => {\n try {\n await convaiClient.audioControls.unmuteAudio();\n setIsVoiceMode(true);\n setHasEnteredDefaultVoiceMode(true);\n } catch (error) {\n console.error(\"Failed to enter voice mode:\", error);\n }\n };\n enterVoiceMode();\n }\n }, [isOpen, defaultVoiceMode, convaiClient.state.isConnected, hasEnteredDefaultVoiceMode, isVoiceMode, convaiClient]);\n\n // Close settings when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (isSettingsOpen && settingsButtonRef.current) {\n const target = event.target as Node;\n const settingsButton = settingsButtonRef.current;\n if (!settingsButton.contains(target)) {\n const settingsTray = document.querySelector(\"[data-settings-tray]\");\n if (settingsTray && !settingsTray.contains(target)) {\n setIsSettingsOpen(false);\n }\n }\n }\n };\n\n if (isSettingsOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isSettingsOpen]);\n\n // Determine logo state and color\n const getLogoState = (): \"idle\" | \"connecting\" | \"connected\" => {\n if (convaiClient.state.isConnecting) return \"connecting\";\n if (convaiClient.state.isConnected) return \"connected\";\n return \"idle\";\n };\n\n const getLogoColor = () => {\n if (convaiClient.state.isConnected) return aeroTheme.colors.primary[500]; // Green when connected\n if (convaiClient.state.isConnecting) return aeroTheme.colors.primary[300]; // Lighter green when connecting\n return aeroTheme.colors.primary[500]; // Default green\n };\n\n // Audio renderer for LiveKit direct audio playback (not used in WebSocket mode)\n const audioRendererRef = useRef<AudioRenderer | null>(null);\n\n useEffect(() => {\n if (!convaiClient.room || convaiClient.room.state !== \"connected\") return;\n\n audioRendererRef.current = new AudioRenderer(convaiClient.room);\n\n return () => {\n if (audioRendererRef.current) {\n audioRendererRef.current.destroy();\n audioRendererRef.current = null;\n }\n };\n }, [convaiClient.room, convaiClient.state.isConnected]);\n\n return (\n <RoomContext.Provider value={convaiClient.room?.state === \"connected\" ? convaiClient.room : undefined}>\n\n {/* Convai Widget Chat UI - Always visible */}\n <ConvaiContainer\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.4, ease: \"easeOut\" }}\n >\n <MorphingContainer\n onClick={!isOpen ? handleToggle : undefined}\n whileHover={!isOpen ? { scale: 1.05 } : undefined}\n whileTap={!isOpen ? { scale: 0.95 } : undefined}\n animate={{\n width: isOpen ? \"400px\" : \"4rem\",\n height: isOpen ? \"600px\" : \"4rem\",\n borderRadius: isOpen ? aeroTheme.borderRadius.xl : \"50%\",\n }}\n transition={{ duration: 0.3, ease: \"easeInOut\" }}\n style={{ cursor: !isOpen ? \"pointer\" : \"default\" }}\n >\n {/* Button Content - fades out when chat opens */}\n <ButtonContent\n animate={{\n opacity: isOpen ? 0 : 1,\n scale: isOpen ? 0.8 : 1,\n }}\n transition={{ duration: 0.3 }}\n >\n <Logo>\n <ConvaiLogo\n size=\"xl\"\n color={getLogoColor()}\n animate={convaiClient.state.isConnecting}\n state={getLogoState()}\n />\n </Logo>\n </ButtonContent>\n\n {/* Chat Content - fades in when chat opens (only show if connected) */}\n {convaiClient.state.isConnected && (\n <ChatContent\n animate={{\n opacity: isOpen ? 1 : 0,\n scale: isOpen ? 1 : 0.8,\n }}\n transition={{\n duration: 0.2,\n delay: isOpen ? 0.2 : 0,\n }}\n style={{\n pointerEvents: isOpen ? \"auto\" : \"none\",\n }}\n >\n {/* Header */}\n <Header\n initial={{ opacity: 0, y: -20 }}\n animate={{\n opacity: isOpen ? 1 : 0,\n y: isOpen ? 0 : -20,\n }}\n transition={{\n delay: isOpen ? 0.4 : 0,\n ...iosTransitions.modalSlide,\n }}\n style={{ \n pointerEvents: isOpen ? \"auto\" : \"none\",\n minHeight: \"3.5rem\", // Ensure consistent height\n }}\n >\n <CloseButton\n onClick={handleClose}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n transition={iosTransitions.snappy}\n style={{ cursor: \"pointer\", pointerEvents: \"auto\" }}\n >\n <ChevronDown size=\"md\" />\n </CloseButton>\n\n <Title>\n {selectedCharacter.image && !isVoiceMode && (\n <motion.img\n key=\"header-avatar\" // Use key instead of layoutId for independent animation\n src={selectedCharacter.image}\n alt={selectedCharacter.name}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={iosTransitions.fadePop}\n style={{\n width: \"1.5rem\",\n height: \"1.5rem\",\n borderRadius: \"50%\",\n objectFit: \"cover\",\n marginRight: \"0.5rem\",\n border: `1.5px solid ${getBotStatusColor().color}`,\n boxShadow: `0 0 6px ${getBotStatusColor().color}40`,\n transition: \"all 0.3s ease\",\n }}\n />\n )}\n {selectedCharacter.name}\n <motion.button\n onClick={handleToggleMute}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n transition={iosTransitions.snappy}\n style={{\n cursor: \"pointer\",\n pointerEvents: \"auto\",\n background: \"transparent\",\n border: \"none\",\n boxShadow: \"none\",\n width: \"auto\",\n height: \"auto\",\n padding: \"0\",\n display: \"inline-flex\",\n alignItems: \"center\",\n marginLeft: \"0.5rem\",\n outline: \"none\",\n }}\n aria-label={isMuted ? \"Unmute\" : \"Mute\"}\n title={isMuted ? \"Unmute\" : \"Mute\"}\n >\n {isMuted ? (\n <IoVolumeMute size={16} color=\"#919EABA6\" />\n ) : (\n <IoVolumeHigh size={16} color=\"#0E7360\" />\n )}\n </motion.button>\n {isVoiceMode && (\n <span\n style={{\n fontSize: \"10px\",\n color: aeroTheme.colors.convai.light,\n fontWeight: 500,\n marginLeft: \"8px\",\n padding: \"2px 6px\",\n borderRadius: \"4px\",\n backgroundColor: aeroTheme.colors.convai.light + \"20\",\n }}\n >\n VOICE\n </span>\n )}\n {convaiClient.state.isSpeaking && (\n <motion.span\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.2 }}\n style={{\n fontSize: \"10px\",\n color: \"#10b981\",\n fontWeight: 600,\n marginLeft: \"8px\",\n padding: \"3px 8px\",\n borderRadius: \"6px\",\n backgroundColor: \"#10b98120\",\n border: \"1px solid #10b98140\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n }}\n >\n <motion.span\n animate={{\n scale: [1, 1.2, 1],\n opacity: [1, 0.7, 1],\n }}\n transition={{\n duration: 1.5,\n repeat: Infinity,\n ease: \"easeInOut\",\n }}\n style={{\n width: \"6px\",\n height: \"6px\",\n borderRadius: \"50%\",\n backgroundColor: \"#10b981\",\n display: \"inline-block\",\n }}\n />\n SPEAKING\n </motion.span>\n )}\n {convaiClient.state.isListening && !convaiClient.state.isSpeaking && (\n <motion.span\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.2 }}\n style={{\n fontSize: \"10px\",\n color: \"#3b82f6\",\n fontWeight: 600,\n marginLeft: \"8px\",\n padding: \"3px 8px\",\n borderRadius: \"6px\",\n backgroundColor: \"#3b82f620\",\n border: \"1px solid #3b82f640\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n }}\n >\n <motion.span\n animate={{\n scale: [1, 1.2, 1],\n opacity: [1, 0.7, 1],\n }}\n transition={{\n duration: 1.5,\n repeat: Infinity,\n ease: \"easeInOut\",\n }}\n style={{\n width: \"6px\",\n height: \"6px\",\n borderRadius: \"50%\",\n backgroundColor: \"#3b82f6\",\n display: \"inline-block\",\n }}\n />\n LISTENING\n </motion.span>\n )}\n </Title>\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n position: \"relative\",\n }}\n >\n <SettingsButton\n ref={settingsButtonRef}\n onClick={handleSettingsToggle}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n transition={iosTransitions.snappy}\n style={{ cursor: \"pointer\" }}\n >\n <FiMoreVertical size={20} />\n </SettingsButton>\n </div>\n </Header>\n\n {/* Content Area */}\n <Content\n style={{\n background: isVoiceMode\n ? \"rgba(255, 255, 255, 0.98)\"\n : \"transparent\",\n filter: isSettingsOpen ? \"blur(3px)\" : \"none\",\n position: \"relative\",\n }}\n >\n {/* Connecting Overlay - shown until bot is ready */}\n <AnimatePresence>\n {convaiClient.state.isConnected && !convaiClient.isBotReady && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.3 }}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"rgba(255, 255, 255, 0.95)\",\n zIndex: 100,\n gap: \"1rem\",\n }}\n >\n <motion.div\n animate={{\n rotate: 360,\n }}\n transition={{\n duration: 2,\n repeat: Infinity,\n ease: \"linear\",\n }}\n >\n <ConvaiLogo\n size=\"xl\"\n color={aeroTheme.colors.convai.light}\n state=\"connecting\"\n />\n </motion.div>\n <motion.div\n animate={{\n opacity: [0.5, 1, 0.5],\n }}\n transition={{\n duration: 2,\n repeat: Infinity,\n ease: \"easeInOut\",\n }}\n style={{\n fontSize: \"14px\",\n fontWeight: 500,\n color: aeroTheme.colors.text.secondary,\n }}\n >\n Connecting to {selectedCharacter.name}...\n </motion.div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {isVoiceMode && (\n <VoiceModeOverlay\n isActive={!convaiClient.isAudioMuted}\n isTalking={convaiClient.state.isSpeaking}\n isListening={convaiClient.state.isListening}\n convaiClient={null}\n characterImage={characterImage || undefined}\n characterName={characterName || undefined}\n room={convaiClient.room?.state === \"connected\" ? convaiClient.room : null}\n />\n )}\n {!isVoiceMode && (\n <MessageList\n messages={formatMessages()}\n isStreaming={convaiClient.state.isSpeaking}\n forceToBottomToken={`${isOpen}-${convaiClient.chatMessages.length}`}\n />\n )}\n </Content>\n\n {/* Footer */}\n <Footer\n initial={{ y: 20, opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n transition={{\n delay: 0.7,\n ...iosTransitions.modalSlide,\n }}\n style={{\n filter: isSettingsOpen ? \"blur(3px)\" : \"none\",\n transition: \"filter 0.2s ease\",\n display: \"flex\",\n gap: \"0.5rem\",\n alignItems: \"center\",\n position: \"relative\",\n justifyContent: isVoiceMode ? \"center\" : \"flex-start\",\n minHeight: \"3.5rem\", // Ensure consistent height\n }}\n >\n {/* In Voice Mode: Show only centered exit button */}\n {isVoiceMode ? (\n <motion.button\n key=\"voice-mode-exit\"\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{\n duration: 0.3,\n ease: \"easeOut\",\n }}\n onClick={async () => {\n convaiClient.sendInterruptMessage();\n await convaiClient.audioControls.muteAudio();\n // WebSocket: tell server to stop processing audio so the\n // character doesn't prompt \"tap microphone to talk\" on silence.\n if (convaiClient.room?.state !== \"connected\") {\n convaiClient.toggleStt(false);\n }\n setIsVoiceMode(false);\n }}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n style={{\n cursor: \"pointer\",\n backgroundColor: \"#ef4444\",\n color: \"#ffffff\",\n border: \"none\",\n borderRadius: \"50%\",\n width: \"2.25rem\",\n height: \"2.25rem\",\n minWidth: \"2.25rem\",\n minHeight: \"2.25rem\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n padding: 0,\n outline: \"none\",\n }}\n aria-label=\"Exit Voice Mode\"\n title=\"Exit voice mode\"\n >\n <FiPhoneOff size={20} />\n </motion.button>\n ) : (\n <>\n {/* Input Container */}\n <InputContainer style={{ flex: 1, position: \"relative\" }}>\n {/* Input field */}\n <Input\n type=\"text\"\n placeholder=\"Conversation\"\n value={inputValue}\n onChange={handleInputChange}\n onKeyPress={handleKeyPress}\n style={{ paddingRight: \"2.75rem\" }}\n />\n\n {/* Send/Voice Mode button */}\n <div\n style={{\n position: \"absolute\",\n right: \"0.375rem\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n width: \"2.25rem\",\n height: \"2.25rem\",\n minWidth: \"2.25rem\",\n minHeight: \"2.25rem\",\n flexShrink: 0,\n overflow: \"visible\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 2,\n }}\n >\n <AnimatePresence mode=\"wait\">\n {inputValue.length > 0 ? (\n <ActionButton\n key=\"send\"\n initial={{ y: \"100%\" }}\n animate={{ y: \"0%\" }}\n exit={{ y: \"-100%\" }}\n transition={{\n duration: 0.1,\n ease: \"linear\",\n }}\n onClick={handleSend}\n whileTap={{ scale: 0.9 }}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n cursor: \"pointer\",\n }}\n >\n <FiSend size={20} />\n </ActionButton>\n ) : (\n <motion.button\n key=\"voice\"\n initial={{ y: \"100%\" }}\n animate={{ y: \"0%\" }}\n exit={{ y: \"-100%\" }}\n transition={{\n duration: 0.1,\n ease: \"linear\",\n }}\n onClick={async () => {\n convaiClient.sendInterruptMessage();\n // WebSocket: re-enable server STT before unmuting.\n if (convaiClient.room?.state !== \"connected\") {\n convaiClient.toggleStt(true);\n }\n await convaiClient.audioControls.unmuteAudio();\n setIsVoiceMode(true);\n }}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n cursor: \"pointer\",\n backgroundColor: \"transparent\",\n color: aeroTheme.colors.text.primary,\n border: `1px solid ${aeroTheme.colors.neutral[300]}`,\n borderRadius: \"50%\",\n width: \"2.25rem\",\n height: \"2.25rem\",\n minWidth: \"2.25rem\",\n minHeight: \"2.25rem\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n padding: 0,\n outline: \"none\",\n }}\n aria-label=\"Enter Voice Mode\"\n title=\"Use voice mode\"\n >\n <PiWaveform size={20} />\n </motion.button>\n )}\n </AnimatePresence>\n </div>\n </InputContainer>\n </>\n )}\n </Footer>\n </ChatContent>\n )}\n </MorphingContainer>\n\n {/* Settings Tray - only show when connected */}\n {convaiClient.state.isConnected && (\n <SettingsTray\n isOpen={isSettingsOpen}\n onReset={handleReset}\n onDisconnect={handleDisconnect}\n onToggleVideo={\n convaiClient.connectionType === \"video\" && showVideo\n ? handleToggleVideo\n : undefined\n }\n isVideoVisible={isVideoVisible}\n onToggleScreenShare={\n convaiClient.connectionType === \"video\" && showScreenShare\n ? handleToggleScreenShare\n : undefined\n }\n isScreenShareActive={\n convaiClient.isScreenShareActive\n }\n />\n )}\n </ConvaiContainer>\n\n {/* Floating Video - only rendered in LiveKit mode (requires RoomContext) */}\n {convaiClient.room?.state === \"connected\" && (\n <FloatingVideo\n isVisible={isVideoVisible}\n onClose={async () => {\n await convaiClient.videoControls.disableVideo();\n }}\n mirror={true}\n />\n )}\n </RoomContext.Provider>\n );\n};\n"]}
1
+ {"version":3,"file":"ConvaiWidget.js","sourceRoot":"","sources":["../../../src/react/components/ConvaiWidget.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useState, useRef, useEffect } from \"react\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport { FiMoreVertical, FiMic, FiSend, FiPhoneOff } from \"react-icons/fi\";\nimport { IoVolumeMute, IoVolumeHigh } from \"react-icons/io5\";\nimport { PiWaveform } from \"react-icons/pi\";\nimport type {\n IConvaiClient,\n PublishedChatConnectOptions,\n} from \"../../core/types\";\nimport { RoomContext } from \"@livekit/components-react\";\nimport { useCharacterInfo } from \"../hooks/useCharacterInfo\";\nimport { AudioRenderer } from \"../../vanilla/AudioRenderer\";\nimport type { PublishedChatDescriptor } from \"../../embed/publicationApi\";\nimport { freshPublicationGrantOptions } from \"../../core/publishedChat\";\n\n// Import styled components and theme from rtc-widget\nimport {\n ConvaiContainer,\n MorphingContainer,\n ButtonContent,\n Logo,\n ChatContent,\n Header,\n Title,\n CloseButton,\n SettingsButton,\n Content,\n Footer,\n InputContainer,\n Input,\n ActionButton,\n aeroTheme,\n iosTransitions,\n ConvaiLogo,\n ChevronDown,\n} from \"./rtc-widget\";\n\n// Import message components\nimport {\n MessageList,\n SettingsTray,\n VoiceModeOverlay,\n RTCChatMessage,\n FloatingVideo,\n} from \"./rtc-widget\";\n\ninterface Character {\n id: string;\n name?: string;\n image?: string;\n}\n\ninterface ConvaiWidgetProps {\n /** Convai client instance (required) */\n convaiClient: IConvaiClient & { \n activity?: string;\n isAudioMuted: boolean;\n isVideoEnabled: boolean;\n isScreenShareActive: boolean;\n };\n /**\n * Show video toggle button in settings (default: true).\n * Only works if connection type is \"video\". If false, hides the video button.\n */\n showVideo?: boolean;\n /**\n * Show screen share toggle button in settings (default: true).\n * Only works if connection type is \"video\". If false, hides the screen share button.\n */\n showScreenShare?: boolean;\n /**\n * Start in voice mode by default when widget opens (default: true).\n * When true, the widget will open directly in voice mode with microphone enabled.\n */\n defaultVoiceMode?: boolean;\n /**\n * Mint a fresh single-use grant when a published-chat session is reopened.\n * Required when using this widget with connectWithPublicationGrant().\n */\n requestPublicationGrant?: () => Promise<string>;\n /** Core endpoint override used with requestPublicationGrant. */\n publishedChatConnectOptions?: PublishedChatConnectOptions;\n /** Public descriptor used to label a credential-free published session. */\n publishedChatDescriptor?: Pick<\n PublishedChatDescriptor,\n \"display_name\" | \"image_url\"\n >;\n}\n\n/**\n * ConvaiWidget - A consolidated chat widget component for real-time conversations\n *\n * This component provides a complete UI for interacting with Convai characters.\n * Connection configuration should be handled via useConvaiClient.connect().\n *\n * Features:\n * - Collapsed circular button with status indicator\n * - Expandable/collapsible chat interface\n * - Voice mode support\n * - Real-time message streaming\n * - Audio controls (mute/unmute)\n * - Settings tray with session reset\n * - Optional video and screen share (when connection type supports it)\n *\n * @param {ConvaiWidgetProps} props - Component props\n * @param {ConvaiClient} props.convaiClient - Convai client instance (required)\n * @param {boolean} props.showVideo - Show video toggle in settings (default: true)\n * @param {boolean} props.showScreenShare - Show screen share toggle in settings (default: true)\n * @param {boolean} props.defaultVoiceMode - Start in voice mode when widget opens (default: true)\n *\n * @example\n * ```tsx\n * function App() {\n * const convaiClient = useConvaiClient({\n * apiKey: 'your-api-key',\n * characterId: 'your-character-id',\n * enableVideo: true,\n * });\n *\n * return (\n * <ConvaiWidget\n * convaiClient={convaiClient}\n * showVideo={true}\n * showScreenShare={true}\n * />\n * );\n * }\n * ```\n */\nexport const ConvaiWidget: React.FC<ConvaiWidgetProps> = ({\n convaiClient,\n showVideo = true,\n showScreenShare = true,\n defaultVoiceMode = true,\n requestPublicationGrant,\n publishedChatConnectOptions,\n publishedChatDescriptor,\n}) => {\n const isTextOnly =\n Boolean(requestPublicationGrant) || convaiClient.connectionType === \"text\";\n // Fetch character information dynamically from client's stored values\n const {\n name: fetchedCharacterName,\n image: fetchedCharacterImage,\n isLoading: isFetchedCharacterLoading,\n } = useCharacterInfo(\n convaiClient.characterId || undefined,\n convaiClient.apiKey || undefined,\n convaiClient.authToken || undefined,\n );\n const characterName =\n publishedChatDescriptor?.display_name || fetchedCharacterName;\n const characterImage =\n publishedChatDescriptor?.image_url ?? fetchedCharacterImage;\n const isCharacterLoading = publishedChatDescriptor\n ? false\n : isFetchedCharacterLoading;\n\n // UI State\n const [isOpen, setIsOpen] = useState(false);\n const [inputValue, setInputValue] = useState(\"\");\n const [isSettingsOpen, setIsSettingsOpen] = useState(false);\n const [isVoiceMode, setIsVoiceMode] = useState(\n defaultVoiceMode && !isTextOnly,\n );\n const [isMuted, setIsMuted] = useState(false); // Character audio starts unmuted\n const [isVideoVisible, setIsVideoVisible] = useState(false);\n const [hasEnteredDefaultVoiceMode, setHasEnteredDefaultVoiceMode] = useState(false);\n\n const settingsButtonRef = useRef<HTMLButtonElement>(null);\n /** True after we have connected at least once; used to call reconnect() instead of connect() when opening after disconnect */\n const hasConnectedBeforeRef = useRef(false);\n /** Prevent repeated open clicks from minting multiple one-time publication grants. */\n const isStartingConnectionRef = useRef(false);\n /** Avoid opening a room after this widget has been removed from the tree. */\n const isUnmountedRef = useRef(false);\n\n // Only published sessions wait for Core's bot-ready handshake. A normal\n // authenticated text session still uses the text-only layout, but can send\n // as soon as it connects.\n const requiresBotReadyForText =\n Boolean(requestPublicationGrant) || convaiClient.isPublishedChatSession;\n const canSendText =\n convaiClient.state.isConnected &&\n (!requiresBotReadyForText || convaiClient.isBotReady);\n\n // Character info from API (using client's stored values)\n const selectedCharacter = {\n id: convaiClient.characterId || \"unknown\",\n name: characterName,\n image: characterImage,\n };\n\n // Get bot status color for character image border\n const getBotStatusColor = () => {\n if (!convaiClient.state.isConnected) {\n return { color: \"#ef4444\", label: \"Disconnected\" }; // Red\n }\n if (convaiClient.state.isConnecting || !convaiClient.isBotReady) {\n return { color: \"#f59e0b\", label: \"Connecting\" }; // Yellow/Orange\n }\n if (convaiClient.state.isListening) {\n return { color: \"#3b82f6\", label: \"Listening\" }; // Blue - user speaking\n }\n return { color: \"#10b981\", label: \"Connected\" }; // Green\n };\n\n // Format chat messages for UI\n const formatMessages = (): RTCChatMessage[] => {\n // Filter to only show relevant message types and exclude empty messages\n const filteredMessages = convaiClient.chatMessages.filter(\n (msg) =>\n (msg.type === \"user-transcription\" ||\n msg.type === \"user-llm-text\" ||\n msg.type === \"bot-llm-text\" ||\n msg.type === \"bot-output\" ||\n msg.type === \"bot-emotion\") &&\n msg.content && // Ensure content exists\n msg.content.trim().length > 0, // Ensure content is not empty or just whitespace\n );\n\n return filteredMessages.map((msg) => ({\n id: msg.id,\n text: msg.content,\n isUser: msg.type.includes(\"user\"),\n timestamp: new Date(msg.timestamp).toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }),\n sender: msg.type.includes(\"user\") ? \"You\" : selectedCharacter.name,\n showLogo: msg.type.includes(\"bot\"),\n }));\n };\n\n // Event Handlers\n const handleToggle = async () => {\n if (isStartingConnectionRef.current) {\n return;\n }\n\n // Connect on first click if not already connected/connecting\n if (!convaiClient.state.isConnected && !convaiClient.state.isConnecting) {\n isStartingConnectionRef.current = true;\n try {\n if (requestPublicationGrant || convaiClient.isPublishedChatSession) {\n if (!requestPublicationGrant) {\n throw new Error(\n \"Published chat widgets require requestPublicationGrant to start a new session\",\n );\n }\n if (!convaiClient.connectWithPublicationGrant) {\n throw new Error(\n \"This Convai client does not support published chat connections\",\n );\n }\n const launchToken = await requestPublicationGrant();\n if (isUnmountedRef.current) return;\n await convaiClient.connectWithPublicationGrant(\n launchToken,\n freshPublicationGrantOptions(publishedChatConnectOptions),\n );\n } else if (\n hasConnectedBeforeRef.current &&\n typeof convaiClient.reconnect === \"function\"\n ) {\n await convaiClient.reconnect();\n } else {\n await convaiClient.connect();\n }\n if (isUnmountedRef.current) {\n await convaiClient.disconnect();\n return;\n }\n setIsOpen(true); // Open widget after successful connection\n } catch (error) {\n console.error(\"Failed to connect:\", error);\n } finally {\n isStartingConnectionRef.current = false;\n }\n } else {\n // Just toggle open/close if already connected\n setIsOpen(!isOpen);\n }\n };\n const handleClose = () => {\n setIsOpen(false);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value);\n };\n\n const handleSend = () => {\n if (inputValue.trim() && canSendText) {\n convaiClient.sendUserTextMessage(inputValue);\n setInputValue(\"\");\n }\n };\n\n const handleKeyPress = (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\") {\n handleSend();\n }\n };\n\n\n const handleToggleMute = () => {\n const newMutedState = !isMuted;\n\n if (convaiClient.room?.state === \"connected\") {\n // LiveKit: mute/unmute remote participant audio tracks\n const remoteParticipants = Array.from(\n convaiClient.room.remoteParticipants.values(),\n );\n remoteParticipants.forEach((participant: any) => {\n participant.audioTrackPublications.forEach((publication: any) => {\n if (publication.track) {\n publication.track.setMuted(newMutedState);\n }\n });\n });\n } else {\n // WebSocket: mute/unmute the hidden <audio> element added by useConvaiClient\n const wsAudioEls = document.querySelectorAll<HTMLAudioElement>(\"audio[data-convai-ws]\");\n wsAudioEls.forEach((el) => { el.muted = newMutedState; });\n }\n\n setIsMuted(newMutedState);\n };\n\n const handleReset = async () => {\n setIsSettingsOpen(false);\n\n try {\n // Disconnect current session\n await convaiClient.disconnect();\n\n // Reset session ID so next connection creates a new session\n convaiClient.resetSession();\n\n // Reset UI states immediately\n setIsMuted(false);\n setIsVoiceMode(false);\n\n // Note: User is responsible for reconnecting after reset\n // They should call convaiClient.connect() themselves\n } catch (error) {\n console.error(\"Failed to reset:\", error);\n }\n };\n\n const handleDisconnect = async () => {\n setIsSettingsOpen(false);\n await convaiClient.disconnect();\n\n // Reset UI states immediately\n setIsMuted(false);\n setIsVoiceMode(false);\n };\n\n const handleToggleVideo = async () => {\n // Only toggle if connection type is video\n if (convaiClient.connectionType !== \"video\") {\n console.warn(\"Video capability requires connection type to be 'video'\");\n return;\n }\n\n if (convaiClient.isVideoEnabled) {\n await convaiClient.videoControls.disableVideo();\n } else {\n await convaiClient.videoControls.enableVideo();\n }\n };\n\n const handleToggleScreenShare = async () => {\n await convaiClient.screenShareControls.toggleScreenShare();\n };\n\n const handleSettingsToggle = () => {\n setIsSettingsOpen(!isSettingsOpen);\n };\n\n useEffect(() => {\n isUnmountedRef.current = false;\n return () => {\n isUnmountedRef.current = true;\n };\n }, []);\n\n // Remember that we have connected at least once (so we use reconnect() next time after disconnect)\n useEffect(() => {\n if (convaiClient.state.isConnected) {\n hasConnectedBeforeRef.current = true;\n }\n }, [convaiClient.state.isConnected]);\n\n // Auto-collapse when disconnected\n useEffect(() => {\n if (!convaiClient.state.isConnected && !convaiClient.state.isConnecting) {\n if (isOpen) {\n setIsOpen(false);\n }\n // Reset UI states on disconnect\n setIsMuted(false); // Reset character mute\n setIsVoiceMode(false); // Reset voice mode\n setHasEnteredDefaultVoiceMode(false); // Reset flag so voice mode can be entered again on reconnect\n }\n }, [convaiClient.state.isConnected, convaiClient.state.isConnecting, isOpen]);\n\n // Sync video visibility with video controls state\n useEffect(() => {\n setIsVideoVisible(convaiClient.isVideoEnabled);\n }, [convaiClient.isVideoEnabled]);\n\n // Ensure microphone is muted when not in voice mode\n useEffect(() => {\n if (isTextOnly && isVoiceMode) {\n setIsVoiceMode(false);\n }\n }, [isTextOnly, isVoiceMode]);\n\n useEffect(() => {\n const ensureMicState = async () => {\n if (!isVoiceMode && !convaiClient.isAudioMuted) {\n // Mute microphone when in text mode\n await convaiClient.audioControls.muteAudio();\n }\n };\n ensureMicState();\n }, [isVoiceMode, convaiClient]);\n\n // Handle default voice mode when widget opens (only once)\n useEffect(() => {\n if (\n isOpen &&\n defaultVoiceMode &&\n !isTextOnly &&\n convaiClient.state.isConnected &&\n !hasEnteredDefaultVoiceMode &&\n !isVoiceMode\n ) {\n const enterVoiceMode = async () => {\n try {\n await convaiClient.audioControls.unmuteAudio();\n setIsVoiceMode(true);\n setHasEnteredDefaultVoiceMode(true);\n } catch (error) {\n console.error(\"Failed to enter voice mode:\", error);\n }\n };\n enterVoiceMode();\n }\n }, [isOpen, defaultVoiceMode, isTextOnly, convaiClient.state.isConnected, hasEnteredDefaultVoiceMode, isVoiceMode, convaiClient]);\n\n // Close settings when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (isSettingsOpen && settingsButtonRef.current) {\n const target = event.target as Node;\n const settingsButton = settingsButtonRef.current;\n if (!settingsButton.contains(target)) {\n const settingsTray = document.querySelector(\"[data-settings-tray]\");\n if (settingsTray && !settingsTray.contains(target)) {\n setIsSettingsOpen(false);\n }\n }\n }\n };\n\n if (isSettingsOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isSettingsOpen]);\n\n // Determine logo state and color\n const getLogoState = (): \"idle\" | \"connecting\" | \"connected\" => {\n if (convaiClient.state.isConnecting) return \"connecting\";\n if (convaiClient.state.isConnected) return \"connected\";\n return \"idle\";\n };\n\n const getLogoColor = () => {\n if (convaiClient.state.isConnected) return aeroTheme.colors.primary[500]; // Green when connected\n if (convaiClient.state.isConnecting) return aeroTheme.colors.primary[300]; // Lighter green when connecting\n return aeroTheme.colors.primary[500]; // Default green\n };\n\n // Audio renderer for LiveKit direct audio playback (not used in WebSocket mode)\n const audioRendererRef = useRef<AudioRenderer | null>(null);\n\n useEffect(() => {\n if (!convaiClient.room || convaiClient.room.state !== \"connected\") return;\n\n audioRendererRef.current = new AudioRenderer(convaiClient.room);\n\n return () => {\n if (audioRendererRef.current) {\n audioRendererRef.current.destroy();\n audioRendererRef.current = null;\n }\n };\n }, [convaiClient.room, convaiClient.state.isConnected]);\n\n return (\n <RoomContext.Provider value={convaiClient.room?.state === \"connected\" ? convaiClient.room : undefined}>\n\n {/* Convai Widget Chat UI - Always visible */}\n <ConvaiContainer\n initial={{ opacity: 0, scale: 0.8 }}\n animate={{ opacity: 1, scale: 1 }}\n transition={{ duration: 0.4, ease: \"easeOut\" }}\n >\n <MorphingContainer\n onClick={!isOpen ? handleToggle : undefined}\n whileHover={!isOpen ? { scale: 1.05 } : undefined}\n whileTap={!isOpen ? { scale: 0.95 } : undefined}\n animate={{\n width: isOpen ? \"400px\" : \"4rem\",\n height: isOpen ? \"600px\" : \"4rem\",\n borderRadius: isOpen ? aeroTheme.borderRadius.xl : \"50%\",\n }}\n transition={{ duration: 0.3, ease: \"easeInOut\" }}\n style={{ cursor: !isOpen ? \"pointer\" : \"default\" }}\n >\n {/* Button Content - fades out when chat opens */}\n <ButtonContent\n animate={{\n opacity: isOpen ? 0 : 1,\n scale: isOpen ? 0.8 : 1,\n }}\n transition={{ duration: 0.3 }}\n >\n <Logo>\n <ConvaiLogo\n size=\"xl\"\n color={getLogoColor()}\n animate={convaiClient.state.isConnecting}\n state={getLogoState()}\n />\n </Logo>\n </ButtonContent>\n\n {/* Chat Content - fades in when chat opens (only show if connected) */}\n {convaiClient.state.isConnected && (\n <ChatContent\n animate={{\n opacity: isOpen ? 1 : 0,\n scale: isOpen ? 1 : 0.8,\n }}\n transition={{\n duration: 0.2,\n delay: isOpen ? 0.2 : 0,\n }}\n style={{\n pointerEvents: isOpen ? \"auto\" : \"none\",\n }}\n >\n {/* Header */}\n <Header\n initial={{ opacity: 0, y: -20 }}\n animate={{\n opacity: isOpen ? 1 : 0,\n y: isOpen ? 0 : -20,\n }}\n transition={{\n delay: isOpen ? 0.4 : 0,\n ...iosTransitions.modalSlide,\n }}\n style={{ \n pointerEvents: isOpen ? \"auto\" : \"none\",\n minHeight: \"3.5rem\", // Ensure consistent height\n }}\n >\n <CloseButton\n onClick={handleClose}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n transition={iosTransitions.snappy}\n style={{ cursor: \"pointer\", pointerEvents: \"auto\" }}\n >\n <ChevronDown size=\"md\" />\n </CloseButton>\n\n <Title>\n {selectedCharacter.image && !isVoiceMode && (\n <motion.img\n key=\"header-avatar\" // Use key instead of layoutId for independent animation\n src={selectedCharacter.image}\n alt={selectedCharacter.name}\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={iosTransitions.fadePop}\n style={{\n width: \"1.5rem\",\n height: \"1.5rem\",\n borderRadius: \"50%\",\n objectFit: \"cover\",\n marginRight: \"0.5rem\",\n border: `1.5px solid ${getBotStatusColor().color}`,\n boxShadow: `0 0 6px ${getBotStatusColor().color}40`,\n transition: \"all 0.3s ease\",\n }}\n />\n )}\n {selectedCharacter.name}\n <motion.button\n onClick={handleToggleMute}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n transition={iosTransitions.snappy}\n style={{\n cursor: \"pointer\",\n pointerEvents: \"auto\",\n background: \"transparent\",\n border: \"none\",\n boxShadow: \"none\",\n width: \"auto\",\n height: \"auto\",\n padding: \"0\",\n display: \"inline-flex\",\n alignItems: \"center\",\n marginLeft: \"0.5rem\",\n outline: \"none\",\n }}\n aria-label={isMuted ? \"Unmute\" : \"Mute\"}\n title={isMuted ? \"Unmute\" : \"Mute\"}\n >\n {isMuted ? (\n <IoVolumeMute size={16} color=\"#919EABA6\" />\n ) : (\n <IoVolumeHigh size={16} color=\"#0E7360\" />\n )}\n </motion.button>\n {isVoiceMode && (\n <span\n style={{\n fontSize: \"10px\",\n color: aeroTheme.colors.convai.light,\n fontWeight: 500,\n marginLeft: \"8px\",\n padding: \"2px 6px\",\n borderRadius: \"4px\",\n backgroundColor: aeroTheme.colors.convai.light + \"20\",\n }}\n >\n VOICE\n </span>\n )}\n {convaiClient.state.isSpeaking && (\n <motion.span\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.2 }}\n style={{\n fontSize: \"10px\",\n color: \"#10b981\",\n fontWeight: 600,\n marginLeft: \"8px\",\n padding: \"3px 8px\",\n borderRadius: \"6px\",\n backgroundColor: \"#10b98120\",\n border: \"1px solid #10b98140\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n }}\n >\n <motion.span\n animate={{\n scale: [1, 1.2, 1],\n opacity: [1, 0.7, 1],\n }}\n transition={{\n duration: 1.5,\n repeat: Infinity,\n ease: \"easeInOut\",\n }}\n style={{\n width: \"6px\",\n height: \"6px\",\n borderRadius: \"50%\",\n backgroundColor: \"#10b981\",\n display: \"inline-block\",\n }}\n />\n SPEAKING\n </motion.span>\n )}\n {convaiClient.state.isListening && !convaiClient.state.isSpeaking && (\n <motion.span\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{ duration: 0.2 }}\n style={{\n fontSize: \"10px\",\n color: \"#3b82f6\",\n fontWeight: 600,\n marginLeft: \"8px\",\n padding: \"3px 8px\",\n borderRadius: \"6px\",\n backgroundColor: \"#3b82f620\",\n border: \"1px solid #3b82f640\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n }}\n >\n <motion.span\n animate={{\n scale: [1, 1.2, 1],\n opacity: [1, 0.7, 1],\n }}\n transition={{\n duration: 1.5,\n repeat: Infinity,\n ease: \"easeInOut\",\n }}\n style={{\n width: \"6px\",\n height: \"6px\",\n borderRadius: \"50%\",\n backgroundColor: \"#3b82f6\",\n display: \"inline-block\",\n }}\n />\n LISTENING\n </motion.span>\n )}\n </Title>\n\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n position: \"relative\",\n }}\n >\n <SettingsButton\n ref={settingsButtonRef}\n onClick={handleSettingsToggle}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n transition={iosTransitions.snappy}\n style={{ cursor: \"pointer\" }}\n >\n <FiMoreVertical size={20} />\n </SettingsButton>\n </div>\n </Header>\n\n {/* Content Area */}\n <Content\n style={{\n background: isVoiceMode\n ? \"rgba(255, 255, 255, 0.98)\"\n : \"transparent\",\n filter: isSettingsOpen ? \"blur(3px)\" : \"none\",\n position: \"relative\",\n }}\n >\n {/* Connecting Overlay - shown until bot is ready */}\n <AnimatePresence>\n {convaiClient.state.isConnected && !convaiClient.isBotReady && (\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.3 }}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"rgba(255, 255, 255, 0.95)\",\n zIndex: 100,\n gap: \"1rem\",\n }}\n >\n <motion.div\n animate={{\n rotate: 360,\n }}\n transition={{\n duration: 2,\n repeat: Infinity,\n ease: \"linear\",\n }}\n >\n <ConvaiLogo\n size=\"xl\"\n color={aeroTheme.colors.convai.light}\n state=\"connecting\"\n />\n </motion.div>\n <motion.div\n animate={{\n opacity: [0.5, 1, 0.5],\n }}\n transition={{\n duration: 2,\n repeat: Infinity,\n ease: \"easeInOut\",\n }}\n style={{\n fontSize: \"14px\",\n fontWeight: 500,\n color: aeroTheme.colors.text.secondary,\n }}\n >\n Connecting to {selectedCharacter.name}...\n </motion.div>\n </motion.div>\n )}\n </AnimatePresence>\n\n {isVoiceMode && (\n <VoiceModeOverlay\n isActive={!convaiClient.isAudioMuted}\n isTalking={convaiClient.state.isSpeaking}\n isListening={convaiClient.state.isListening}\n convaiClient={null}\n characterImage={characterImage || undefined}\n characterName={characterName || undefined}\n room={convaiClient.room?.state === \"connected\" ? convaiClient.room : null}\n />\n )}\n {!isVoiceMode && (\n <MessageList\n messages={formatMessages()}\n isStreaming={convaiClient.state.isSpeaking}\n forceToBottomToken={`${isOpen}-${convaiClient.chatMessages.length}`}\n />\n )}\n </Content>\n\n {/* Footer */}\n <Footer\n initial={{ y: 20, opacity: 0 }}\n animate={{ y: 0, opacity: 1 }}\n transition={{\n delay: 0.7,\n ...iosTransitions.modalSlide,\n }}\n style={{\n filter: isSettingsOpen ? \"blur(3px)\" : \"none\",\n transition: \"filter 0.2s ease\",\n display: \"flex\",\n gap: \"0.5rem\",\n alignItems: \"center\",\n position: \"relative\",\n justifyContent: isVoiceMode ? \"center\" : \"flex-start\",\n minHeight: \"3.5rem\", // Ensure consistent height\n }}\n >\n {/* In Voice Mode: Show only centered exit button */}\n {isVoiceMode ? (\n <motion.button\n key=\"voice-mode-exit\"\n initial={{ scale: 0.8, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0.8, opacity: 0 }}\n transition={{\n duration: 0.3,\n ease: \"easeOut\",\n }}\n onClick={async () => {\n convaiClient.sendInterruptMessage();\n await convaiClient.audioControls.muteAudio();\n // WebSocket: tell server to stop processing audio so the\n // character doesn't prompt \"tap microphone to talk\" on silence.\n if (convaiClient.room?.state !== \"connected\") {\n convaiClient.toggleStt(false);\n }\n setIsVoiceMode(false);\n }}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n style={{\n cursor: \"pointer\",\n backgroundColor: \"#ef4444\",\n color: \"#ffffff\",\n border: \"none\",\n borderRadius: \"50%\",\n width: \"2.25rem\",\n height: \"2.25rem\",\n minWidth: \"2.25rem\",\n minHeight: \"2.25rem\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n padding: 0,\n outline: \"none\",\n }}\n aria-label=\"Exit Voice Mode\"\n title=\"Exit voice mode\"\n >\n <FiPhoneOff size={20} />\n </motion.button>\n ) : (\n <>\n {/* Input Container */}\n <InputContainer style={{ flex: 1, position: \"relative\" }}>\n {/* Input field */}\n <Input\n type=\"text\"\n placeholder=\"Conversation\"\n value={inputValue}\n onChange={handleInputChange}\n onKeyPress={handleKeyPress}\n disabled={!canSendText}\n style={{ paddingRight: \"2.75rem\" }}\n />\n\n {/* Send/Voice Mode button */}\n <div\n style={{\n position: \"absolute\",\n right: \"0.375rem\",\n top: \"50%\",\n transform: \"translateY(-50%)\",\n width: \"2.25rem\",\n height: \"2.25rem\",\n minWidth: \"2.25rem\",\n minHeight: \"2.25rem\",\n flexShrink: 0,\n overflow: \"visible\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n zIndex: 2,\n }}\n >\n <AnimatePresence mode=\"wait\">\n {inputValue.length > 0 || isTextOnly ? (\n <ActionButton\n key=\"send\"\n initial={{ y: \"100%\" }}\n animate={{ y: \"0%\" }}\n exit={{ y: \"-100%\" }}\n transition={{\n duration: 0.1,\n ease: \"linear\",\n }}\n onClick={handleSend}\n disabled={inputValue.length === 0 || !canSendText}\n whileTap={{ scale: 0.9 }}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n cursor: \"pointer\",\n }}\n >\n <FiSend size={20} />\n </ActionButton>\n ) : (\n <motion.button\n key=\"voice\"\n initial={{ y: \"100%\" }}\n animate={{ y: \"0%\" }}\n exit={{ y: \"-100%\" }}\n transition={{\n duration: 0.1,\n ease: \"linear\",\n }}\n onClick={async () => {\n convaiClient.sendInterruptMessage();\n // WebSocket: re-enable server STT before unmuting.\n if (convaiClient.room?.state !== \"connected\") {\n convaiClient.toggleStt(true);\n }\n await convaiClient.audioControls.unmuteAudio();\n setIsVoiceMode(true);\n }}\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.9 }}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n cursor: \"pointer\",\n backgroundColor: \"transparent\",\n color: aeroTheme.colors.text.primary,\n border: `1px solid ${aeroTheme.colors.neutral[300]}`,\n borderRadius: \"50%\",\n width: \"2.25rem\",\n height: \"2.25rem\",\n minWidth: \"2.25rem\",\n minHeight: \"2.25rem\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: 0,\n padding: 0,\n outline: \"none\",\n }}\n aria-label=\"Enter Voice Mode\"\n title=\"Use voice mode\"\n >\n <PiWaveform size={20} />\n </motion.button>\n )}\n </AnimatePresence>\n </div>\n </InputContainer>\n </>\n )}\n </Footer>\n </ChatContent>\n )}\n </MorphingContainer>\n\n {/* Settings Tray - only show when connected */}\n {convaiClient.state.isConnected && (\n <SettingsTray\n isOpen={isSettingsOpen}\n onReset={\n convaiClient.isPublishedChatSession && !requestPublicationGrant\n ? undefined\n : handleReset\n }\n onDisconnect={\n convaiClient.isPublishedChatSession && !requestPublicationGrant\n ? undefined\n : handleDisconnect\n }\n onToggleVideo={\n convaiClient.connectionType === \"video\" && showVideo\n ? handleToggleVideo\n : undefined\n }\n isVideoVisible={isVideoVisible}\n onToggleScreenShare={\n convaiClient.connectionType === \"video\" && showScreenShare\n ? handleToggleScreenShare\n : undefined\n }\n isScreenShareActive={\n convaiClient.isScreenShareActive\n }\n />\n )}\n </ConvaiContainer>\n\n {/* Floating Video - only rendered in LiveKit mode (requires RoomContext) */}\n {convaiClient.room?.state === \"connected\" && (\n <FloatingVideo\n isVisible={isVideoVisible}\n onClose={async () => {\n await convaiClient.videoControls.disableVideo();\n }}\n mirror={true}\n />\n )}\n </RoomContext.Provider>\n );\n};\n"]}
@@ -1,6 +1,13 @@
1
1
  import React from "react";
2
2
  interface MarkdownRendererProps {
3
3
  text: string;
4
+ /**
5
+ * Render inline image/video previews under a media link. Bot messages want
6
+ * them; the user's own bubble does not — you already know what you typed, and
7
+ * a preview there would let a URL a user pasted embed remote media into the
8
+ * transcript. Links stay clickable either way.
9
+ */
10
+ media?: boolean;
4
11
  }
5
12
  export declare const MarkdownRenderer: React.FC<MarkdownRendererProps>;
6
13
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownRenderer.d.ts","sourceRoot":"","sources":["../../../../../src/react/components/rtc-widget/components/MarkdownRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,qBAAqB;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AAiDD,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAkC5D,CAAC"}
1
+ {"version":3,"file":"MarkdownRenderer.d.ts","sourceRoot":"","sources":["../../../../../src/react/components/rtc-widget/components/MarkdownRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AA6B1B,UAAU,qBAAqB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA2KD,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAkC5D,CAAC"}
@@ -1,6 +1,27 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import React from "react";
3
- import { parseInlineMarkdown } from "../../../../utils/inlineMarkdown.js";
3
+ import { parseInlineMarkdown, compactUrl, } from "../../../../utils/inlineMarkdown.js";
4
+ const MEDIA_RADIUS = 8;
5
+ const SHIMMER = "convai-preview-shimmer";
6
+ /**
7
+ * The renderer styles inline, but a keyframe cannot be expressed that way, so
8
+ * the one animation it needs is injected once per document. Guarded for SSR and
9
+ * for the tests, which render to a string with no document.
10
+ */
11
+ function ensureShimmerKeyframes() {
12
+ if (typeof document === "undefined")
13
+ return;
14
+ if (document.getElementById(SHIMMER))
15
+ return;
16
+ const style = document.createElement("style");
17
+ style.id = SHIMMER;
18
+ style.textContent = `
19
+ @keyframes ${SHIMMER} { from { background-position: 200% 0 } to { background-position: -200% 0 } }
20
+ @media (prefers-reduced-motion: reduce) {
21
+ [data-convai-skeleton] { animation: none !important }
22
+ }`;
23
+ document.head.appendChild(style);
24
+ }
4
25
  const linkStyle = {
5
26
  color: "#10b981",
6
27
  textDecoration: "underline",
@@ -8,36 +29,109 @@ const linkStyle = {
8
29
  };
9
30
  const mediaStyle = {
10
31
  display: "block",
11
- maxWidth: "100%",
12
- maxHeight: 240,
32
+ width: "100%",
33
+ height: "100%",
34
+ objectFit: "cover",
35
+ borderRadius: MEDIA_RADIUS,
36
+ };
37
+ /**
38
+ * A preview card sizes itself before the media arrives, so the bubble does not
39
+ * jump when an image decodes. 16/10 is a compromise: tall enough to read, short
40
+ * enough that several in a row still scroll.
41
+ */
42
+ const CARD_ASPECT = "16 / 10";
43
+ const cardStyle = {
44
+ // A span by default is inline, where aspect-ratio does nothing.
45
+ display: "block",
46
+ position: "relative",
47
+ marginTop: 6,
48
+ maxWidth: 320,
49
+ aspectRatio: CARD_ASPECT,
50
+ borderRadius: MEDIA_RADIUS,
51
+ overflow: "hidden",
52
+ // The widget is embedded in someone else's page on an unknown background, so
53
+ // chrome is derived from the inherited text colour rather than a fixed grey.
54
+ background: "color-mix(in srgb, currentColor 6%, transparent)",
55
+ boxShadow: "inset 0 0 0 1px color-mix(in srgb, currentColor 10%, transparent)",
56
+ };
57
+ const skeletonStyle = {
58
+ position: "absolute",
59
+ inset: 0,
60
+ borderRadius: MEDIA_RADIUS,
61
+ background: "color-mix(in srgb, currentColor 8%, transparent)",
62
+ backgroundImage: "linear-gradient(90deg, transparent, color-mix(in srgb, currentColor 12%, transparent), transparent)",
63
+ backgroundSize: "200% 100%",
64
+ animation: `${SHIMMER} 1.4s ease-in-out infinite`,
65
+ };
66
+ const captionStyle = {
67
+ display: "block",
68
+ marginTop: 4,
69
+ fontSize: 11,
70
+ opacity: 0.7,
71
+ whiteSpace: "nowrap",
72
+ overflow: "hidden",
73
+ textOverflow: "ellipsis",
74
+ };
75
+ const unavailableStyle = {
76
+ ...captionStyle,
13
77
  marginTop: 6,
14
- borderRadius: 8,
78
+ opacity: 0.55,
79
+ fontStyle: "italic",
15
80
  };
16
- /** Inline preview for an image or video URL, shown under its link. */
17
- const MediaPreview = ({ node }) => {
18
- if (node.media === "image") {
19
- return _jsx("img", { src: node.href, alt: node.label, loading: "lazy", style: mediaStyle });
81
+ /** An unsafe target: the words the character wrote, with no href behind them. */
82
+ const blockedStyle = {
83
+ opacity: 0.75,
84
+ textDecoration: "underline",
85
+ textDecorationStyle: "dotted",
86
+ cursor: "help",
87
+ };
88
+ /** `cdn.example.com/a/b/c.png` → `cdn.example.com · c.png` */
89
+ function describeUrl(url) {
90
+ try {
91
+ const { host, pathname } = new URL(url);
92
+ const file = pathname.split("/").filter(Boolean).pop();
93
+ return file ? `${host} · ${file}` : host;
94
+ }
95
+ catch {
96
+ return compactUrl(url);
20
97
  }
21
- if (node.media === "video") {
22
- return _jsx("video", { src: node.href, controls: true, preload: "metadata", style: mediaStyle });
98
+ }
99
+ /**
100
+ * Inline preview for an image or video URL, shown under its link.
101
+ *
102
+ * The media element is always in the tree so the browser starts fetching it
103
+ * immediately; the skeleton sits on top until it decodes. A URL that does not
104
+ * resolve — which a character can easily invent — collapses to one muted line
105
+ * instead of leaving an empty player in the transcript.
106
+ */
107
+ const MediaPreview = ({ src, alt, kind }) => {
108
+ const [state, setState] = React.useState("loading");
109
+ React.useEffect(ensureShimmerKeyframes, []);
110
+ if (state === "error") {
111
+ return _jsxs("span", { style: unavailableStyle, children: ["Preview unavailable \u2014 ", describeUrl(src)] });
23
112
  }
24
- return null;
113
+ const ready = state === "ready";
114
+ return (_jsxs(_Fragment, { children: [_jsxs("span", { style: cardStyle, children: [kind === "image" ? (_jsx("img", { src: src, alt: alt, loading: "lazy", onLoad: () => setState("ready"), onError: () => setState("error"), style: { ...mediaStyle, opacity: ready ? 1 : 0 } })) : (_jsx("video", { src: src, controls: true, preload: "metadata", onLoadedMetadata: () => setState("ready"), onError: () => setState("error"), style: { ...mediaStyle, objectFit: "contain", opacity: ready ? 1 : 0 } })), !ready && _jsx("span", { "data-convai-skeleton": "", style: skeletonStyle, "aria-hidden": "true" })] }), _jsx("span", { style: captionStyle, children: describeUrl(src) })] }));
25
115
  };
26
- const renderNode = (node, key) => {
116
+ const renderNode = (node, key, media) => {
27
117
  switch (node.kind) {
28
118
  case "strong":
29
119
  return _jsx("strong", { children: node.text }, key);
30
120
  case "em":
31
121
  return _jsx("em", { children: node.text }, key);
32
122
  case "link":
33
- return (_jsxs(React.Fragment, { children: [_jsx("a", { href: node.href, target: "_blank", rel: "noopener noreferrer", style: linkStyle, children: node.label }), _jsx(MediaPreview, { node: node })] }, key));
123
+ return (_jsxs(React.Fragment, { children: [_jsx("a", { href: node.href, target: "_blank", rel: "noopener noreferrer", style: linkStyle, children: node.label === node.href ? compactUrl(node.label) : node.label }), media && node.media && (_jsx(MediaPreview, { src: node.href, alt: node.label, kind: node.media }))] }, key));
124
+ case "blocked":
125
+ return (_jsx("span", { style: blockedStyle, title: `Link blocked: ${node.href}`, children: node.label }, key));
34
126
  case "image":
35
- return _jsx("img", { src: node.src, alt: node.alt, loading: "lazy", style: mediaStyle }, key);
127
+ // With previews off, an image still has to say what it pointed at, so it
128
+ // degrades to the same anchor a plain link would render.
129
+ return media ? (_jsx(MediaPreview, { src: node.src, alt: node.alt, kind: "image" }, key)) : (_jsx("a", { href: node.src, target: "_blank", rel: "noopener noreferrer", style: linkStyle, children: node.alt || node.src }, key));
36
130
  default:
37
131
  return _jsx(React.Fragment, { children: node.text }, key);
38
132
  }
39
133
  };
40
- export const MarkdownRenderer = ({ text }) => {
134
+ export const MarkdownRenderer = ({ text, media = true }) => {
41
135
  // Convert markdown to JSX elements
42
136
  const renderMarkdown = (input) => {
43
137
  if (!input)
@@ -49,7 +143,7 @@ export const MarkdownRenderer = ({ text }) => {
49
143
  const lines = normalizedText.split('\n');
50
144
  return lines.map((line, lineIndex) => {
51
145
  // Bold, italic, links, images and bare URLs — see utils/inlineMarkdown.
52
- const processedLine = parseInlineMarkdown(line).map((node, i) => renderNode(node, `${node.kind}-${lineIndex}-${i}`));
146
+ const processedLine = parseInlineMarkdown(line).map((node, i) => renderNode(node, `${node.kind}-${lineIndex}-${i}`, media));
53
147
  // Handle empty lines (creates paragraph spacing)
54
148
  if (line.trim() === "" && lineIndex > 0) {
55
149
  return _jsx("br", {}, `br-${lineIndex}`);
@@ -1 +1 @@
1
- {"version":3,"file":"MarkdownRenderer.js","sourceRoot":"","sources":["../../../../../src/react/components/rtc-widget/components/MarkdownRenderer.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { parseInlineMarkdown, type InlineNode } from \"../../../../utils/inlineMarkdown\";\n\ninterface MarkdownRendererProps {\n text: string;\n}\n\nconst linkStyle: React.CSSProperties = {\n color: \"#10b981\",\n textDecoration: \"underline\",\n wordBreak: \"break-all\",\n};\n\nconst mediaStyle: React.CSSProperties = {\n display: \"block\",\n maxWidth: \"100%\",\n maxHeight: 240,\n marginTop: 6,\n borderRadius: 8,\n};\n\n/** Inline preview for an image or video URL, shown under its link. */\nconst MediaPreview = ({ node }: { node: Extract<InlineNode, { kind: \"link\" }> }) => {\n if (node.media === \"image\") {\n return <img src={node.href} alt={node.label} loading=\"lazy\" style={mediaStyle} />;\n }\n if (node.media === \"video\") {\n return <video src={node.href} controls preload=\"metadata\" style={mediaStyle} />;\n }\n return null;\n};\n\nconst renderNode = (node: InlineNode, key: string): React.ReactNode => {\n switch (node.kind) {\n case \"strong\":\n return <strong key={key}>{node.text}</strong>;\n case \"em\":\n return <em key={key}>{node.text}</em>;\n case \"link\":\n return (\n <React.Fragment key={key}>\n <a href={node.href} target=\"_blank\" rel=\"noopener noreferrer\" style={linkStyle}>\n {node.label}\n </a>\n <MediaPreview node={node} />\n </React.Fragment>\n );\n case \"image\":\n return <img key={key} src={node.src} alt={node.alt} loading=\"lazy\" style={mediaStyle} />;\n default:\n return <React.Fragment key={key}>{node.text}</React.Fragment>;\n }\n};\n\nexport const MarkdownRenderer: React.FC<MarkdownRendererProps> = ({ text }) => {\n // Convert markdown to JSX elements\n const renderMarkdown = (input: string): React.ReactNode => {\n if (!input) return null;\n\n // Handle both actual newlines and \\n escape sequences\n // Replace literal \\n strings with actual newlines\n const normalizedText = input.replace(/\\\\n/g, '\\n');\n\n // Split by actual newlines\n const lines = normalizedText.split('\\n');\n\n return lines.map((line, lineIndex) => {\n // Bold, italic, links, images and bare URLs — see utils/inlineMarkdown.\n const processedLine = parseInlineMarkdown(line).map((node, i) =>\n renderNode(node, `${node.kind}-${lineIndex}-${i}`),\n );\n\n // Handle empty lines (creates paragraph spacing)\n if (line.trim() === \"\" && lineIndex > 0) {\n return <br key={`br-${lineIndex}`} />;\n }\n\n // Return the line with line break\n return (\n <React.Fragment key={`line-${lineIndex}`}>\n {processedLine.length > 0 ? processedLine : line}\n {lineIndex < lines.length - 1 && <br />}\n </React.Fragment>\n );\n });\n };\n\n return <div style={{ whiteSpace: 'pre-wrap', wordWrap: 'break-word' }}>{renderMarkdown(text)}</div>;\n};\n"]}
1
+ {"version":3,"file":"MarkdownRenderer.js","sourceRoot":"","sources":["../../../../../src/react/components/rtc-widget/components/MarkdownRenderer.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\nimport {\n parseInlineMarkdown,\n compactUrl,\n type InlineNode,\n type MediaKind,\n} from \"../../../../utils/inlineMarkdown\";\n\nconst MEDIA_RADIUS = 8;\nconst SHIMMER = \"convai-preview-shimmer\";\n\n/**\n * The renderer styles inline, but a keyframe cannot be expressed that way, so\n * the one animation it needs is injected once per document. Guarded for SSR and\n * for the tests, which render to a string with no document.\n */\nfunction ensureShimmerKeyframes(): void {\n if (typeof document === \"undefined\") return;\n if (document.getElementById(SHIMMER)) return;\n const style = document.createElement(\"style\");\n style.id = SHIMMER;\n style.textContent = `\n@keyframes ${SHIMMER} { from { background-position: 200% 0 } to { background-position: -200% 0 } }\n@media (prefers-reduced-motion: reduce) {\n [data-convai-skeleton] { animation: none !important }\n}`;\n document.head.appendChild(style);\n}\n\ninterface MarkdownRendererProps {\n text: string;\n /**\n * Render inline image/video previews under a media link. Bot messages want\n * them; the user's own bubble does not — you already know what you typed, and\n * a preview there would let a URL a user pasted embed remote media into the\n * transcript. Links stay clickable either way.\n */\n media?: boolean;\n}\n\nconst linkStyle: React.CSSProperties = {\n color: \"#10b981\",\n textDecoration: \"underline\",\n wordBreak: \"break-all\",\n};\n\nconst mediaStyle: React.CSSProperties = {\n display: \"block\",\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n borderRadius: MEDIA_RADIUS,\n};\n\n/**\n * A preview card sizes itself before the media arrives, so the bubble does not\n * jump when an image decodes. 16/10 is a compromise: tall enough to read, short\n * enough that several in a row still scroll.\n */\nconst CARD_ASPECT = \"16 / 10\";\n\nconst cardStyle: React.CSSProperties = {\n // A span by default is inline, where aspect-ratio does nothing.\n display: \"block\",\n position: \"relative\",\n marginTop: 6,\n maxWidth: 320,\n aspectRatio: CARD_ASPECT,\n borderRadius: MEDIA_RADIUS,\n overflow: \"hidden\",\n // The widget is embedded in someone else's page on an unknown background, so\n // chrome is derived from the inherited text colour rather than a fixed grey.\n background: \"color-mix(in srgb, currentColor 6%, transparent)\",\n boxShadow: \"inset 0 0 0 1px color-mix(in srgb, currentColor 10%, transparent)\",\n};\n\nconst skeletonStyle: React.CSSProperties = {\n position: \"absolute\",\n inset: 0,\n borderRadius: MEDIA_RADIUS,\n background: \"color-mix(in srgb, currentColor 8%, transparent)\",\n backgroundImage:\n \"linear-gradient(90deg, transparent, color-mix(in srgb, currentColor 12%, transparent), transparent)\",\n backgroundSize: \"200% 100%\",\n animation: `${SHIMMER} 1.4s ease-in-out infinite`,\n};\n\nconst captionStyle: React.CSSProperties = {\n display: \"block\",\n marginTop: 4,\n fontSize: 11,\n opacity: 0.7,\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n};\n\nconst unavailableStyle: React.CSSProperties = {\n ...captionStyle,\n marginTop: 6,\n opacity: 0.55,\n fontStyle: \"italic\",\n};\n\n/** An unsafe target: the words the character wrote, with no href behind them. */\nconst blockedStyle: React.CSSProperties = {\n opacity: 0.75,\n textDecoration: \"underline\",\n textDecorationStyle: \"dotted\",\n cursor: \"help\",\n};\n\n/** `cdn.example.com/a/b/c.png` → `cdn.example.com · c.png` */\nfunction describeUrl(url: string): string {\n try {\n const { host, pathname } = new URL(url);\n const file = pathname.split(\"/\").filter(Boolean).pop();\n return file ? `${host} · ${file}` : host;\n } catch {\n return compactUrl(url);\n }\n}\n\ntype LoadState = \"loading\" | \"ready\" | \"error\";\n\n/**\n * Inline preview for an image or video URL, shown under its link.\n *\n * The media element is always in the tree so the browser starts fetching it\n * immediately; the skeleton sits on top until it decodes. A URL that does not\n * resolve — which a character can easily invent — collapses to one muted line\n * instead of leaving an empty player in the transcript.\n */\nconst MediaPreview = ({ src, alt, kind }: { src: string; alt: string; kind: MediaKind }) => {\n const [state, setState] = React.useState<LoadState>(\"loading\");\n React.useEffect(ensureShimmerKeyframes, []);\n\n if (state === \"error\") {\n return <span style={unavailableStyle}>Preview unavailable — {describeUrl(src)}</span>;\n }\n\n const ready = state === \"ready\";\n return (\n <>\n <span style={cardStyle}>\n {kind === \"image\" ? (\n <img\n src={src}\n alt={alt}\n loading=\"lazy\"\n onLoad={() => setState(\"ready\")}\n onError={() => setState(\"error\")}\n style={{ ...mediaStyle, opacity: ready ? 1 : 0 }}\n />\n ) : (\n <video\n src={src}\n controls\n preload=\"metadata\"\n onLoadedMetadata={() => setState(\"ready\")}\n onError={() => setState(\"error\")}\n style={{ ...mediaStyle, objectFit: \"contain\", opacity: ready ? 1 : 0 }}\n />\n )}\n {!ready && <span data-convai-skeleton=\"\" style={skeletonStyle} aria-hidden=\"true\" />}\n </span>\n <span style={captionStyle}>{describeUrl(src)}</span>\n </>\n );\n};\n\nconst renderNode = (node: InlineNode, key: string, media: boolean): React.ReactNode => {\n switch (node.kind) {\n case \"strong\":\n return <strong key={key}>{node.text}</strong>;\n case \"em\":\n return <em key={key}>{node.text}</em>;\n case \"link\":\n return (\n <React.Fragment key={key}>\n <a href={node.href} target=\"_blank\" rel=\"noopener noreferrer\" style={linkStyle}>\n {node.label === node.href ? compactUrl(node.label) : node.label}\n </a>\n {media && node.media && (\n <MediaPreview src={node.href} alt={node.label} kind={node.media} />\n )}\n </React.Fragment>\n );\n case \"blocked\":\n return (\n <span key={key} style={blockedStyle} title={`Link blocked: ${node.href}`}>\n {node.label}\n </span>\n );\n case \"image\":\n // With previews off, an image still has to say what it pointed at, so it\n // degrades to the same anchor a plain link would render.\n return media ? (\n <MediaPreview key={key} src={node.src} alt={node.alt} kind=\"image\" />\n ) : (\n <a key={key} href={node.src} target=\"_blank\" rel=\"noopener noreferrer\" style={linkStyle}>\n {node.alt || node.src}\n </a>\n );\n default:\n return <React.Fragment key={key}>{node.text}</React.Fragment>;\n }\n};\n\nexport const MarkdownRenderer: React.FC<MarkdownRendererProps> = ({ text, media = true }) => {\n // Convert markdown to JSX elements\n const renderMarkdown = (input: string): React.ReactNode => {\n if (!input) return null;\n\n // Handle both actual newlines and \\n escape sequences\n // Replace literal \\n strings with actual newlines\n const normalizedText = input.replace(/\\\\n/g, '\\n');\n\n // Split by actual newlines\n const lines = normalizedText.split('\\n');\n\n return lines.map((line, lineIndex) => {\n // Bold, italic, links, images and bare URLs — see utils/inlineMarkdown.\n const processedLine = parseInlineMarkdown(line).map((node, i) =>\n renderNode(node, `${node.kind}-${lineIndex}-${i}`, media),\n );\n\n // Handle empty lines (creates paragraph spacing)\n if (line.trim() === \"\" && lineIndex > 0) {\n return <br key={`br-${lineIndex}`} />;\n }\n\n // Return the line with line break\n return (\n <React.Fragment key={`line-${lineIndex}`}>\n {processedLine.length > 0 ? processedLine : line}\n {lineIndex < lines.length - 1 && <br />}\n </React.Fragment>\n );\n });\n };\n\n return <div style={{ whiteSpace: 'pre-wrap', wordWrap: 'break-word' }}>{renderMarkdown(text)}</div>;\n};\n"]}
@@ -4,7 +4,7 @@ import { UserBubble, UserMessageContainer, MessageHeader, UserLabel, LogoWrapper
4
4
  import { FaUser } from "react-icons/fa";
5
5
  import { MarkdownRenderer } from "./MarkdownRenderer.js";
6
6
  export const UserMessage = ({ message, timestamp, className, sender, }) => {
7
- return (_jsxs(UserMessageContainer, { className: className, children: [_jsxs(UserBubble, { children: [sender && (_jsxs(MessageHeader, { children: [_jsx(LogoWrapper, { children: _jsx(FaUser, { size: 16, color: aeroTheme.colors.convai.dark }) }), _jsx(UserLabel, { children: sender === "User" ? "You" : sender })] })), _jsx(MarkdownRenderer, { text: message })] }), timestamp && (_jsx("span", { style: {
7
+ return (_jsxs(UserMessageContainer, { className: className, children: [_jsxs(UserBubble, { children: [sender && (_jsxs(MessageHeader, { children: [_jsx(LogoWrapper, { children: _jsx(FaUser, { size: 16, color: aeroTheme.colors.convai.dark }) }), _jsx(UserLabel, { children: sender === "User" ? "You" : sender })] })), _jsx(MarkdownRenderer, { text: message, media: false })] }), timestamp && (_jsx("span", { style: {
8
8
  fontSize: aeroTheme.typography.sizes.caption,
9
9
  color: aeroTheme.colors.text.secondary,
10
10
  marginTop: 4,
@@ -1 +1 @@
1
- {"version":3,"file":"UserMessage.js","sourceRoot":"","sources":["../../../../../src/react/components/rtc-widget/components/UserMessage.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACL,UAAU,EACV,oBAAoB,EACpB,aAAa,EACb,SAAS,EACT,WAAW,GACZ,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAStD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAC1B,OAAO,EACP,SAAS,EACT,SAAS,EACT,MAAM,GACW,EAAE,EAAE;IACrB,OAAO,CACL,MAAC,oBAAoB,IAAC,SAAS,EAAE,SAAS,aACxC,MAAC,UAAU,eACR,MAAM,IAAI,CACT,MAAC,aAAa,eACZ,KAAC,WAAW,cACV,KAAC,MAAM,IAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAI,GAC7C,EACd,KAAC,SAAS,cAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,GAAa,IAC7C,CACjB,EACD,KAAC,gBAAgB,IAAC,IAAI,EAAE,OAAO,GAAI,IACxB,EACZ,SAAS,IAAI,CACZ,eACE,KAAK,EAAE;oBACL,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO;oBAC5C,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS;oBACtC,SAAS,EAAE,CAAC;oBACZ,SAAS,EAAE,UAAU;oBACrB,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI;iBACjD,YAEA,SAAS,GACL,CACR,IACoB,CACxB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import React from \"react\";\nimport { aeroTheme } from \"../styles\";\nimport {\n UserBubble,\n UserMessageContainer,\n MessageHeader,\n UserLabel,\n LogoWrapper,\n} from \"../styles\";\n\nimport { FaUser } from \"react-icons/fa\";\nimport { MarkdownRenderer } from \"./MarkdownRenderer\";\n\ninterface UserMessageProps {\n message: string;\n timestamp?: string;\n className?: string;\n sender?: string;\n}\n\nexport const UserMessage = ({\n message,\n timestamp,\n className,\n sender,\n}: UserMessageProps) => {\n return (\n <UserMessageContainer className={className}>\n <UserBubble>\n {sender && (\n <MessageHeader>\n <LogoWrapper>\n <FaUser size={16} color={aeroTheme.colors.convai.dark} />\n </LogoWrapper>\n <UserLabel>{sender === \"User\" ? \"You\" : sender}</UserLabel>\n </MessageHeader>\n )}\n <MarkdownRenderer text={message} />\n </UserBubble>\n {timestamp && (\n <span\n style={{\n fontSize: aeroTheme.typography.sizes.caption,\n color: aeroTheme.colors.text.secondary,\n marginTop: 4,\n alignSelf: \"flex-end\",\n fontFamily: aeroTheme.typography.fontFamily.body,\n }}\n >\n {timestamp}\n </span>\n )}\n </UserMessageContainer>\n );\n};\n\n"]}
1
+ {"version":3,"file":"UserMessage.js","sourceRoot":"","sources":["../../../../../src/react/components/rtc-widget/components/UserMessage.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACL,UAAU,EACV,oBAAoB,EACpB,aAAa,EACb,SAAS,EACT,WAAW,GACZ,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAStD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAC1B,OAAO,EACP,SAAS,EACT,SAAS,EACT,MAAM,GACW,EAAE,EAAE;IACrB,OAAO,CACL,MAAC,oBAAoB,IAAC,SAAS,EAAE,SAAS,aACxC,MAAC,UAAU,eACR,MAAM,IAAI,CACT,MAAC,aAAa,eACZ,KAAC,WAAW,cACV,KAAC,MAAM,IAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAI,GAC7C,EACd,KAAC,SAAS,cAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,GAAa,IAC7C,CACjB,EACD,KAAC,gBAAgB,IAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,GAAI,IACtC,EACZ,SAAS,IAAI,CACZ,eACE,KAAK,EAAE;oBACL,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO;oBAC5C,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS;oBACtC,SAAS,EAAE,CAAC;oBACZ,SAAS,EAAE,UAAU;oBACrB,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI;iBACjD,YAEA,SAAS,GACL,CACR,IACoB,CACxB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import React from \"react\";\nimport { aeroTheme } from \"../styles\";\nimport {\n UserBubble,\n UserMessageContainer,\n MessageHeader,\n UserLabel,\n LogoWrapper,\n} from \"../styles\";\n\nimport { FaUser } from \"react-icons/fa\";\nimport { MarkdownRenderer } from \"./MarkdownRenderer\";\n\ninterface UserMessageProps {\n message: string;\n timestamp?: string;\n className?: string;\n sender?: string;\n}\n\nexport const UserMessage = ({\n message,\n timestamp,\n className,\n sender,\n}: UserMessageProps) => {\n return (\n <UserMessageContainer className={className}>\n <UserBubble>\n {sender && (\n <MessageHeader>\n <LogoWrapper>\n <FaUser size={16} color={aeroTheme.colors.convai.dark} />\n </LogoWrapper>\n <UserLabel>{sender === \"User\" ? \"You\" : sender}</UserLabel>\n </MessageHeader>\n )}\n <MarkdownRenderer text={message} media={false} />\n </UserBubble>\n {timestamp && (\n <span\n style={{\n fontSize: aeroTheme.typography.sizes.caption,\n color: aeroTheme.colors.text.secondary,\n marginTop: 4,\n alignSelf: \"flex-end\",\n fontFamily: aeroTheme.typography.fontFamily.body,\n }}\n >\n {timestamp}\n </span>\n )}\n </UserMessageContainer>\n );\n};\n\n"]}
@@ -2,7 +2,7 @@ interface SettingsTrayProps {
2
2
  isOpen: boolean;
3
3
  isVideoVisible?: boolean;
4
4
  isScreenShareActive?: boolean;
5
- onReset: () => void;
5
+ onReset?: () => void;
6
6
  onDisconnect?: () => void;
7
7
  onToggleVideo?: () => void;
8
8
  onToggleScreenShare?: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsTray.d.ts","sourceRoot":"","sources":["../../../../../../src/react/components/rtc-widget/components/conviComponents/SettingsTray.tsx"],"names":[],"mappings":"AAYA,UAAU,iBAAiB;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;CAClC;AAED,eAAO,MAAM,YAAY,GAAI,6GAQ1B,iBAAiB,mDAyInB,CAAC"}
1
+ {"version":3,"file":"SettingsTray.d.ts","sourceRoot":"","sources":["../../../../../../src/react/components/rtc-widget/components/conviComponents/SettingsTray.tsx"],"names":[],"mappings":"AAYA,UAAU,iBAAiB;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;CAClC;AAED,eAAO,MAAM,YAAY,GAAI,6GAQ1B,iBAAiB,mDA2InB,CAAC"}
@@ -20,12 +20,12 @@ export const SettingsTray = ({ isOpen, isVideoVisible, isScreenShareActive, onRe
20
20
  alignItems: "center",
21
21
  padding: "8px",
22
22
  gap: "4px",
23
- }, children: [_jsxs(SettingsOption, { onClick: onReset, whileHover: { scale: 1.02 }, whileTap: { scale: 0.98 }, transition: iosTransitions.snappy, style: {
23
+ }, children: [onReset && (_jsxs(SettingsOption, { onClick: onReset, whileHover: { scale: 1.02 }, whileTap: { scale: 0.98 }, transition: iosTransitions.snappy, style: {
24
24
  cursor: "pointer",
25
25
  flexDirection: "column",
26
26
  gap: "4px",
27
27
  padding: "8px 12px",
28
- }, "aria-label": "Reset", title: "Reset", children: [_jsx(LiaRedoAltSolid, { size: 18 }), _jsx("span", { style: { fontSize: "10px", fontWeight: 500 }, children: "Reset" })] }), onToggleVideo && (_jsxs(SettingsOption, { onClick: (e) => {
28
+ }, "aria-label": "Reset", title: "Reset", children: [_jsx(LiaRedoAltSolid, { size: 18 }), _jsx("span", { style: { fontSize: "10px", fontWeight: 500 }, children: "Reset" })] })), onToggleVideo && (_jsxs(SettingsOption, { onClick: (e) => {
29
29
  e.stopPropagation();
30
30
  onToggleVideo();
31
31
  }, whileHover: { scale: 1.02 }, whileTap: { scale: 0.98 }, transition: iosTransitions.snappy, style: {