@convai/web-sdk 0.1.1-beta.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/README.md +735 -189
  2. package/dist/core/AudioManager.d.ts +8 -0
  3. package/dist/core/AudioManager.d.ts.map +1 -1
  4. package/dist/core/AudioManager.js +45 -5
  5. package/dist/core/AudioManager.js.map +1 -1
  6. package/dist/core/ConvaiClient.d.ts +22 -9
  7. package/dist/core/ConvaiClient.d.ts.map +1 -1
  8. package/dist/core/ConvaiClient.js +92 -41
  9. package/dist/core/ConvaiClient.js.map +1 -1
  10. package/dist/core/MessageHandler.d.ts.map +1 -1
  11. package/dist/core/MessageHandler.js +27 -24
  12. package/dist/core/MessageHandler.js.map +1 -1
  13. package/dist/core/ScreenShareManager.d.ts.map +1 -1
  14. package/dist/core/ScreenShareManager.js +4 -0
  15. package/dist/core/ScreenShareManager.js.map +1 -1
  16. package/dist/core/VideoManager.d.ts.map +1 -1
  17. package/dist/core/VideoManager.js +2 -0
  18. package/dist/core/VideoManager.js.map +1 -1
  19. package/dist/core/types.d.ts +13 -1
  20. package/dist/core/types.d.ts.map +1 -1
  21. package/dist/react/components/ConvaiWidget.d.ts +3 -0
  22. package/dist/react/components/ConvaiWidget.d.ts.map +1 -1
  23. package/dist/react/components/ConvaiWidget.js +25 -22
  24. package/dist/react/components/ConvaiWidget.js.map +1 -1
  25. package/dist/react/components/index.d.ts +0 -1
  26. package/dist/react/components/index.d.ts.map +1 -1
  27. package/dist/react/components/index.js +0 -2
  28. package/dist/react/components/index.js.map +1 -1
  29. package/dist/react/hooks/useConvaiClient.d.ts +3 -0
  30. package/dist/react/hooks/useConvaiClient.d.ts.map +1 -1
  31. package/dist/react/hooks/useConvaiClient.js +46 -9
  32. package/dist/react/hooks/useConvaiClient.js.map +1 -1
  33. package/dist/types/index.d.ts +1 -3
  34. package/dist/types/index.d.ts.map +1 -1
  35. package/dist/vanilla/AudioRenderer.d.ts +45 -0
  36. package/dist/vanilla/AudioRenderer.d.ts.map +1 -0
  37. package/dist/vanilla/AudioRenderer.js +126 -0
  38. package/dist/vanilla/AudioRenderer.js.map +1 -0
  39. package/dist/vanilla/ConvaiWidget.d.ts +39 -0
  40. package/dist/vanilla/ConvaiWidget.d.ts.map +1 -0
  41. package/dist/vanilla/ConvaiWidget.js +1835 -0
  42. package/dist/vanilla/ConvaiWidget.js.map +1 -0
  43. package/dist/vanilla/icons.d.ts +34 -0
  44. package/dist/vanilla/icons.d.ts.map +1 -0
  45. package/dist/vanilla/icons.js +215 -0
  46. package/dist/vanilla/icons.js.map +1 -0
  47. package/dist/vanilla/index.d.ts +35 -0
  48. package/dist/vanilla/index.d.ts.map +1 -0
  49. package/dist/vanilla/index.js +37 -0
  50. package/dist/vanilla/index.js.map +1 -0
  51. package/dist/{components/rtc-widget/styles/theme.d.ts → vanilla/styles.d.ts} +14 -50
  52. package/dist/vanilla/styles.d.ts.map +1 -0
  53. package/dist/vanilla/styles.js +287 -0
  54. package/dist/vanilla/styles.js.map +1 -0
  55. package/dist/vanilla/types.d.ts +38 -0
  56. package/dist/vanilla/types.d.ts.map +1 -0
  57. package/dist/vanilla/types.js +2 -0
  58. package/dist/vanilla/types.js.map +1 -0
  59. package/package.json +12 -5
  60. package/dist/components/ConvaiWidget.d.ts +0 -59
  61. package/dist/components/ConvaiWidget.d.ts.map +0 -1
  62. package/dist/components/ConvaiWidget.js +0 -421
  63. package/dist/components/ConvaiWidget.js.map +0 -1
  64. package/dist/components/index.d.ts +0 -3
  65. package/dist/components/index.d.ts.map +0 -1
  66. package/dist/components/index.js +0 -5
  67. package/dist/components/index.js.map +0 -1
  68. package/dist/components/rtc-widget/components/AudioSettingsPanel.d.ts +0 -10
  69. package/dist/components/rtc-widget/components/AudioSettingsPanel.d.ts.map +0 -1
  70. package/dist/components/rtc-widget/components/AudioSettingsPanel.js +0 -316
  71. package/dist/components/rtc-widget/components/AudioSettingsPanel.js.map +0 -1
  72. package/dist/components/rtc-widget/components/ConviMessage.d.ts +0 -10
  73. package/dist/components/rtc-widget/components/ConviMessage.d.ts.map +0 -1
  74. package/dist/components/rtc-widget/components/ConviMessage.js +0 -14
  75. package/dist/components/rtc-widget/components/ConviMessage.js.map +0 -1
  76. package/dist/components/rtc-widget/components/FloatingVideo.d.ts +0 -9
  77. package/dist/components/rtc-widget/components/FloatingVideo.d.ts.map +0 -1
  78. package/dist/components/rtc-widget/components/FloatingVideo.js +0 -122
  79. package/dist/components/rtc-widget/components/FloatingVideo.js.map +0 -1
  80. package/dist/components/rtc-widget/components/MarkdownRenderer.d.ts +0 -7
  81. package/dist/components/rtc-widget/components/MarkdownRenderer.d.ts.map +0 -1
  82. package/dist/components/rtc-widget/components/MarkdownRenderer.js +0 -68
  83. package/dist/components/rtc-widget/components/MarkdownRenderer.js.map +0 -1
  84. package/dist/components/rtc-widget/components/MessageBubble.d.ts +0 -10
  85. package/dist/components/rtc-widget/components/MessageBubble.d.ts.map +0 -1
  86. package/dist/components/rtc-widget/components/MessageBubble.js +0 -23
  87. package/dist/components/rtc-widget/components/MessageBubble.js.map +0 -1
  88. package/dist/components/rtc-widget/components/MessageList.d.ts +0 -11
  89. package/dist/components/rtc-widget/components/MessageList.d.ts.map +0 -1
  90. package/dist/components/rtc-widget/components/MessageList.js +0 -89
  91. package/dist/components/rtc-widget/components/MessageList.js.map +0 -1
  92. package/dist/components/rtc-widget/components/UserMessage.d.ts +0 -9
  93. package/dist/components/rtc-widget/components/UserMessage.d.ts.map +0 -1
  94. package/dist/components/rtc-widget/components/UserMessage.js +0 -15
  95. package/dist/components/rtc-widget/components/UserMessage.js.map +0 -1
  96. package/dist/components/rtc-widget/components/conviComponents/ConviButton.d.ts +0 -6
  97. package/dist/components/rtc-widget/components/conviComponents/ConviButton.d.ts.map +0 -1
  98. package/dist/components/rtc-widget/components/conviComponents/ConviButton.js +0 -15
  99. package/dist/components/rtc-widget/components/conviComponents/ConviButton.js.map +0 -1
  100. package/dist/components/rtc-widget/components/conviComponents/ConviFooter.d.ts +0 -25
  101. package/dist/components/rtc-widget/components/conviComponents/ConviFooter.d.ts.map +0 -1
  102. package/dist/components/rtc-widget/components/conviComponents/ConviFooter.js +0 -172
  103. package/dist/components/rtc-widget/components/conviComponents/ConviFooter.js.map +0 -1
  104. package/dist/components/rtc-widget/components/conviComponents/ConviHeader.d.ts +0 -17
  105. package/dist/components/rtc-widget/components/conviComponents/ConviHeader.d.ts.map +0 -1
  106. package/dist/components/rtc-widget/components/conviComponents/ConviHeader.js +0 -66
  107. package/dist/components/rtc-widget/components/conviComponents/ConviHeader.js.map +0 -1
  108. package/dist/components/rtc-widget/components/conviComponents/SettingsTray.d.ts +0 -12
  109. package/dist/components/rtc-widget/components/conviComponents/SettingsTray.d.ts.map +0 -1
  110. package/dist/components/rtc-widget/components/conviComponents/SettingsTray.js +0 -68
  111. package/dist/components/rtc-widget/components/conviComponents/SettingsTray.js.map +0 -1
  112. package/dist/components/rtc-widget/components/conviComponents/VoiceModeOverlay.d.ts +0 -8
  113. package/dist/components/rtc-widget/components/conviComponents/VoiceModeOverlay.d.ts.map +0 -1
  114. package/dist/components/rtc-widget/components/conviComponents/VoiceModeOverlay.js +0 -199
  115. package/dist/components/rtc-widget/components/conviComponents/VoiceModeOverlay.js.map +0 -1
  116. package/dist/components/rtc-widget/components/conviComponents/index.d.ts +0 -6
  117. package/dist/components/rtc-widget/components/conviComponents/index.d.ts.map +0 -1
  118. package/dist/components/rtc-widget/components/conviComponents/index.js +0 -6
  119. package/dist/components/rtc-widget/components/conviComponents/index.js.map +0 -1
  120. package/dist/components/rtc-widget/components/index.d.ts +0 -8
  121. package/dist/components/rtc-widget/components/index.d.ts.map +0 -1
  122. package/dist/components/rtc-widget/components/index.js +0 -13
  123. package/dist/components/rtc-widget/components/index.js.map +0 -1
  124. package/dist/components/rtc-widget/index.d.ts +0 -6
  125. package/dist/components/rtc-widget/index.d.ts.map +0 -1
  126. package/dist/components/rtc-widget/index.js +0 -9
  127. package/dist/components/rtc-widget/index.js.map +0 -1
  128. package/dist/components/rtc-widget/styles/framerConfig.d.ts +0 -116
  129. package/dist/components/rtc-widget/styles/framerConfig.d.ts.map +0 -1
  130. package/dist/components/rtc-widget/styles/framerConfig.js +0 -73
  131. package/dist/components/rtc-widget/styles/framerConfig.js.map +0 -1
  132. package/dist/components/rtc-widget/styles/icons.d.ts +0 -28
  133. package/dist/components/rtc-widget/styles/icons.d.ts.map +0 -1
  134. package/dist/components/rtc-widget/styles/icons.js +0 -257
  135. package/dist/components/rtc-widget/styles/icons.js.map +0 -1
  136. package/dist/components/rtc-widget/styles/index.d.ts +0 -6
  137. package/dist/components/rtc-widget/styles/index.d.ts.map +0 -1
  138. package/dist/components/rtc-widget/styles/index.js +0 -9
  139. package/dist/components/rtc-widget/styles/index.js.map +0 -1
  140. package/dist/components/rtc-widget/styles/styledComponents.d.ts +0 -90
  141. package/dist/components/rtc-widget/styles/styledComponents.d.ts.map +0 -1
  142. package/dist/components/rtc-widget/styles/styledComponents.js +0 -661
  143. package/dist/components/rtc-widget/styles/styledComponents.js.map +0 -1
  144. package/dist/components/rtc-widget/styles/theme.d.ts.map +0 -1
  145. package/dist/components/rtc-widget/styles/theme.js +0 -290
  146. package/dist/components/rtc-widget/styles/theme.js.map +0 -1
  147. package/dist/components/rtc-widget/types/index.d.ts +0 -60
  148. package/dist/components/rtc-widget/types/index.d.ts.map +0 -1
  149. package/dist/components/rtc-widget/types/index.js +0 -2
  150. package/dist/components/rtc-widget/types/index.js.map +0 -1
  151. package/dist/hooks/index.d.ts +0 -13
  152. package/dist/hooks/index.d.ts.map +0 -1
  153. package/dist/hooks/index.js +0 -14
  154. package/dist/hooks/index.js.map +0 -1
  155. package/dist/hooks/useAudioControls.d.ts +0 -41
  156. package/dist/hooks/useAudioControls.d.ts.map +0 -1
  157. package/dist/hooks/useAudioControls.js +0 -208
  158. package/dist/hooks/useAudioControls.js.map +0 -1
  159. package/dist/hooks/useCharacterInfo.d.ts +0 -17
  160. package/dist/hooks/useCharacterInfo.d.ts.map +0 -1
  161. package/dist/hooks/useCharacterInfo.js +0 -60
  162. package/dist/hooks/useCharacterInfo.js.map +0 -1
  163. package/dist/hooks/useConvaiClient.d.ts +0 -30
  164. package/dist/hooks/useConvaiClient.d.ts.map +0 -1
  165. package/dist/hooks/useConvaiClient.js +0 -349
  166. package/dist/hooks/useConvaiClient.js.map +0 -1
  167. package/dist/hooks/useDynamicInfoUpdater.d.ts +0 -33
  168. package/dist/hooks/useDynamicInfoUpdater.d.ts.map +0 -1
  169. package/dist/hooks/useDynamicInfoUpdater.js +0 -49
  170. package/dist/hooks/useDynamicInfoUpdater.js.map +0 -1
  171. package/dist/hooks/useLocalCameraTrack.d.ts +0 -22
  172. package/dist/hooks/useLocalCameraTrack.d.ts.map +0 -1
  173. package/dist/hooks/useLocalCameraTrack.js +0 -34
  174. package/dist/hooks/useLocalCameraTrack.js.map +0 -1
  175. package/dist/hooks/useMessageHandler.d.ts +0 -28
  176. package/dist/hooks/useMessageHandler.d.ts.map +0 -1
  177. package/dist/hooks/useMessageHandler.js +0 -267
  178. package/dist/hooks/useMessageHandler.js.map +0 -1
  179. package/dist/hooks/useScreenShare.d.ts +0 -45
  180. package/dist/hooks/useScreenShare.d.ts.map +0 -1
  181. package/dist/hooks/useScreenShare.js +0 -186
  182. package/dist/hooks/useScreenShare.js.map +0 -1
  183. package/dist/hooks/useTemplateKeysUpdater.d.ts +0 -35
  184. package/dist/hooks/useTemplateKeysUpdater.d.ts.map +0 -1
  185. package/dist/hooks/useTemplateKeysUpdater.js +0 -51
  186. package/dist/hooks/useTemplateKeysUpdater.js.map +0 -1
  187. package/dist/hooks/useTriggerMessageSender.d.ts +0 -28
  188. package/dist/hooks/useTriggerMessageSender.d.ts.map +0 -1
  189. package/dist/hooks/useTriggerMessageSender.js +0 -46
  190. package/dist/hooks/useTriggerMessageSender.js.map +0 -1
  191. package/dist/hooks/useTtsToggle.d.ts +0 -37
  192. package/dist/hooks/useTtsToggle.d.ts.map +0 -1
  193. package/dist/hooks/useTtsToggle.js +0 -63
  194. package/dist/hooks/useTtsToggle.js.map +0 -1
  195. package/dist/hooks/useUserTextMessageSender.d.ts +0 -28
  196. package/dist/hooks/useUserTextMessageSender.d.ts.map +0 -1
  197. package/dist/hooks/useUserTextMessageSender.js +0 -58
  198. package/dist/hooks/useUserTextMessageSender.js.map +0 -1
  199. package/dist/hooks/useVideoControls.d.ts +0 -39
  200. package/dist/hooks/useVideoControls.d.ts.map +0 -1
  201. package/dist/hooks/useVideoControls.js +0 -193
  202. package/dist/hooks/useVideoControls.js.map +0 -1
@@ -1,17 +0,0 @@
1
- interface CharacterInfo {
2
- name: string;
3
- image: string | null;
4
- }
5
- /**
6
- * Hook to fetch character information from Convai API
7
- *
8
- * @param characterId - The character ID to fetch information for (optional)
9
- * @param apiKey - The Convai API key (optional)
10
- * @returns Character information including name and image URL
11
- */
12
- export declare const useCharacterInfo: (characterId?: string, apiKey?: string) => CharacterInfo & {
13
- isLoading: boolean;
14
- error: Error | null;
15
- };
16
- export {};
17
- //# sourceMappingURL=useCharacterInfo.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useCharacterInfo.d.ts","sourceRoot":"","sources":["../../src/hooks/useCharacterInfo.ts"],"names":[],"mappings":"AAGA,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAC3B,cAAc,MAAM,EACpB,SAAS,MAAM,KACd,aAAa,GAAG;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAyD3D,CAAC"}
@@ -1,60 +0,0 @@
1
- import { useState, useEffect } from "react";
2
- import { logger } from "../utils/logger";
3
- /**
4
- * Hook to fetch character information from Convai API
5
- *
6
- * @param characterId - The character ID to fetch information for (optional)
7
- * @param apiKey - The Convai API key (optional)
8
- * @returns Character information including name and image URL
9
- */
10
- export const useCharacterInfo = (characterId, apiKey) => {
11
- const [characterInfo, setCharacterInfo] = useState({
12
- name: "Convi",
13
- image: null,
14
- });
15
- const [isLoading, setIsLoading] = useState(true);
16
- const [error, setError] = useState(null);
17
- useEffect(() => {
18
- const fetchCharacterInfo = async () => {
19
- if (!characterId || !apiKey) {
20
- setIsLoading(false);
21
- return;
22
- }
23
- try {
24
- setIsLoading(true);
25
- setError(null);
26
- const response = await fetch("https://api.convai.com/character/get", {
27
- method: "POST",
28
- headers: {
29
- "Content-Type": "application/json",
30
- "CONVAI-API-KEY": apiKey,
31
- },
32
- body: JSON.stringify({ charID: characterId }),
33
- });
34
- if (!response.ok) {
35
- throw new Error(`Failed to fetch character info: ${response.status}`);
36
- }
37
- const data = await response.json();
38
- // Extract character name and image with fallbacks
39
- const name = data.character_name || "Convi";
40
- const image = data.model_details?.METAHUMAN?.avatar_image_square ||
41
- data.model_details?.METAHUMAN?.avatar_image ||
42
- data.model_details?.modelPlaceholder ||
43
- null;
44
- setCharacterInfo({ name, image });
45
- }
46
- catch (err) {
47
- const error = err instanceof Error ? err : new Error("Unknown error");
48
- logger.error("Failed to fetch character info:", error);
49
- setError(error);
50
- // Keep default values on error
51
- }
52
- finally {
53
- setIsLoading(false);
54
- }
55
- };
56
- fetchCharacterInfo();
57
- }, [characterId, apiKey]);
58
- return { ...characterInfo, isLoading, error };
59
- };
60
- //# sourceMappingURL=useCharacterInfo.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useCharacterInfo.js","sourceRoot":"","sources":["../../src/hooks/useCharacterInfo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAOzC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,WAAoB,EACpB,MAAe,EAC8C,EAAE;IAC/D,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAgB;QAChE,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;IACH,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IAEvD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,kBAAkB,GAAG,KAAK,IAAI,EAAE;YACpC,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC5B,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO;YACT,CAAC;YAED,IAAI,CAAC;gBACH,YAAY,CAAC,IAAI,CAAC,CAAC;gBACnB,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAEf,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,sCAAsC,EAAE;oBACnE,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,gBAAgB,EAAE,MAAM;qBACzB;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;iBAC9C,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,IAAI,KAAK,CAAC,mCAAmC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;gBACxE,CAAC;gBAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAEnC,kDAAkD;gBAClD,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC;gBAC5C,MAAM,KAAK,GACT,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,mBAAmB;oBAClD,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,YAAY;oBAC3C,IAAI,CAAC,aAAa,EAAE,gBAAgB;oBACpC,IAAI,CAAC;gBAEP,gBAAgB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACpC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;gBACtE,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;gBACvD,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAChB,+BAA+B;YACjC,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC,CAAC;QAEF,kBAAkB,EAAE,CAAC;IACvB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAE1B,OAAO,EAAE,GAAG,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAChD,CAAC,CAAC"}
@@ -1,30 +0,0 @@
1
- import { ConvaiConfig, ConvaiClient, ChatMessage } from "../types";
2
- /**
3
- * Main hook for managing Convai client connection and functionality.
4
- *
5
- * Provides a complete interface for connecting to Convai's AI-powered voice assistants,
6
- * managing real-time audio/video conversations, and handling various message types.
7
- *
8
- * @param config - Optional configuration to auto-connect on mount
9
- * @returns {ConvaiClient & { activity: string; chatMessages: ChatMessage[] }} Complete client interface with connection state, methods, and message history
10
- *
11
- * @example
12
- * ```tsx
13
- * function App() {
14
- * const convaiClient = useConvaiClient({
15
- * apiKey: 'your-api-key',
16
- * characterId: 'your-character-id',
17
- * enableVideo: true,
18
- * });
19
- *
20
- * return (
21
- * <ConvaiWidget convaiClient={convaiClient} />
22
- * );
23
- * }
24
- * ```
25
- */
26
- export declare const useConvaiClient: (config?: ConvaiConfig) => ConvaiClient & {
27
- activity: string;
28
- chatMessages: ChatMessage[];
29
- };
30
- //# sourceMappingURL=useConvaiClient.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useConvaiClient.d.ts","sourceRoot":"","sources":["../../src/hooks/useConvaiClient.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,YAAY,EACZ,YAAY,EAEZ,WAAW,EAEZ,MAAM,UAAU,CAAC;AAalB;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,eAAe,GAAI,SAAS,YAAY,KAAG,YAAY,GAAG;IACrE,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,WAAW,EAAE,CAAC;CAgX7B,CAAC"}
@@ -1,349 +0,0 @@
1
- import { useState, useCallback, useMemo, useEffect } from "react";
2
- import { Room, RoomEvent } from "livekit-client";
3
- import { useUserTextMessageSender } from "./useUserTextMessageSender";
4
- import { useTriggerMessageSender } from "./useTriggerMessageSender";
5
- import { useTemplateKeysUpdater } from "./useTemplateKeysUpdater";
6
- import { useDynamicInfoUpdater } from "./useDynamicInfoUpdater";
7
- import { useMessageHandler } from "./useMessageHandler";
8
- import { useAudioControls } from "./useAudioControls";
9
- import { useVideoControls } from "./useVideoControls";
10
- import { useScreenShare } from "./useScreenShare";
11
- import { logger } from "../utils/logger";
12
- import { useTtsToggle } from "./useTtsToggle";
13
- import { resolveSpeakerId } from "../utils/speakerManagement";
14
- /**
15
- * Main hook for managing Convai client connection and functionality.
16
- *
17
- * Provides a complete interface for connecting to Convai's AI-powered voice assistants,
18
- * managing real-time audio/video conversations, and handling various message types.
19
- *
20
- * @param config - Optional configuration to auto-connect on mount
21
- * @returns {ConvaiClient & { activity: string; chatMessages: ChatMessage[] }} Complete client interface with connection state, methods, and message history
22
- *
23
- * @example
24
- * ```tsx
25
- * function App() {
26
- * const convaiClient = useConvaiClient({
27
- * apiKey: 'your-api-key',
28
- * characterId: 'your-character-id',
29
- * enableVideo: true,
30
- * });
31
- *
32
- * return (
33
- * <ConvaiWidget convaiClient={convaiClient} />
34
- * );
35
- * }
36
- * ```
37
- */
38
- export const useConvaiClient = (config) => {
39
- const [room] = useState(new Room());
40
- const [isConnected, setIsConnected] = useState(false);
41
- const [isConnecting, setIsConnecting] = useState(false);
42
- const [isBotReady, setIsBotReady] = useState(false); // Bot is ready to receive messages
43
- const [activity, setActivity] = useState("Idle");
44
- const [chatMessages, setChatMessages] = useState([]);
45
- const [userTranscription, setUserTranscription] = useState("");
46
- const [isBotResponding, setIsBotResponding] = useState(false);
47
- const [participantSid, setParticipantSid] = useState("");
48
- const [isSpeaking, setIsSpeaking] = useState(false);
49
- const [characterSessionId, setCharacterSessionId] = useState("-1");
50
- const [connectionType, setConnectionType] = useState(null);
51
- const [apiKey, setApiKey] = useState(null);
52
- const [characterId, setCharacterId] = useState(null);
53
- const [speakerId, setSpeakerId] = useState(null);
54
- // Store config for later use (without auto-connecting)
55
- // Config is captured once on mount - changing the config prop won't update it
56
- const [storedConfig] = useState(config);
57
- // Default to Noisy Mode for optimal interruption handling
58
- const [audioSettings, setAudioSettings] = useState({
59
- echoCancellation: true,
60
- noiseSuppression: true,
61
- autoGainControl: true,
62
- sampleRate: 48000,
63
- channelCount: 1,
64
- });
65
- // Initialize message sender hooks
66
- const { sendUserTextMessage } = useUserTextMessageSender(room, participantSid);
67
- const { sendTriggerMessage } = useTriggerMessageSender(room, participantSid);
68
- const { updateTemplateKeys } = useTemplateKeysUpdater(room, participantSid);
69
- const { updateDynamicInfo } = useDynamicInfoUpdater(room, participantSid);
70
- const { toggleTts } = useTtsToggle(room);
71
- // Initialize message handler
72
- const { setupMessageListener } = useMessageHandler(room, setChatMessages, setUserTranscription, setIsBotResponding, isBotResponding, setIsSpeaking, setIsConnected, // Pass callback to update connection state when bot-ready is received
73
- setActivity, // Pass callback to update activity state when bot-ready is received
74
- setIsBotReady);
75
- // Initialize media controls
76
- const audioControls = useAudioControls(room);
77
- const videoControls = useVideoControls(room);
78
- const screenShareControls = useScreenShare(room);
79
- // Data message listener effect
80
- useEffect(() => {
81
- const cleanup = setupMessageListener();
82
- return cleanup;
83
- }, [setupMessageListener]);
84
- // Listen for room disconnection events (PC manager closed, network issues, etc.)
85
- useEffect(() => {
86
- if (!room)
87
- return;
88
- const handleDisconnected = () => {
89
- setIsConnected(false);
90
- setIsBotReady(false); // Reset bot-ready state on disconnect
91
- setActivity("Disconnected");
92
- setChatMessages([]);
93
- setIsBotResponding(false);
94
- };
95
- const handleConnectionStateChanged = (state) => {
96
- if (state === "disconnected") {
97
- setIsConnected(false);
98
- setActivity("Disconnected");
99
- setChatMessages([]);
100
- setIsBotResponding(false);
101
- }
102
- else if (state === "connected") {
103
- setIsConnected(true);
104
- setIsBotReady(false); // Room connected but bot not ready yet
105
- setActivity("Connected");
106
- }
107
- else if (state === "connecting") {
108
- setIsConnecting(true);
109
- setIsBotReady(false); // Reset bot-ready when reconnecting
110
- setActivity("Connecting");
111
- }
112
- };
113
- // Listen for disconnection events
114
- room.on(RoomEvent.Disconnected, handleDisconnected);
115
- room.on(RoomEvent.ConnectionStateChanged, handleConnectionStateChanged);
116
- return () => {
117
- room.off(RoomEvent.Disconnected, handleDisconnected);
118
- room.off(RoomEvent.ConnectionStateChanged, handleConnectionStateChanged);
119
- };
120
- }, [room]);
121
- // Create client state
122
- const state = useMemo(() => ({
123
- isConnected,
124
- isConnecting,
125
- isListening: false,
126
- isThinking: false,
127
- isSpeaking,
128
- agentState: "disconnected",
129
- }), [isConnected, isConnecting, isSpeaking]);
130
- // Connect function - uses stored config or accepts override
131
- const connect = useCallback(async (configOverride) => {
132
- // Use override config or stored config
133
- const finalConfig = configOverride || storedConfig;
134
- if (!finalConfig) {
135
- throw new Error("No configuration provided. Pass config to useConvaiClient() or to connect()");
136
- }
137
- // Add default URL if not provided
138
- const configWithDefaults = {
139
- url: "https://realtime-api.convai.com",
140
- ...finalConfig,
141
- };
142
- if (!configWithDefaults.apiKey ||
143
- !configWithDefaults.characterId) {
144
- throw new Error("apiKey and characterId are required");
145
- }
146
- setIsConnecting(true);
147
- setActivity("Connecting...");
148
- try {
149
- // Store connection config
150
- setApiKey(configWithDefaults.apiKey);
151
- setCharacterId(configWithDefaults.characterId);
152
- // Resolve speaker ID based on endUserId
153
- if (configWithDefaults.endUserId) {
154
- logger.info(`Resolving speaker ID for endUserId: ${configWithDefaults.endUserId}`);
155
- }
156
- else {
157
- logger.info('Connecting in anonymous mode (no endUserId provided)');
158
- }
159
- const resolvedSpeakerId = await resolveSpeakerId(configWithDefaults.endUserId, configWithDefaults.apiKey);
160
- setSpeakerId(resolvedSpeakerId);
161
- if (resolvedSpeakerId) {
162
- logger.info(`Speaker ID resolved: ${resolvedSpeakerId.substring(0, 8)}...`);
163
- }
164
- else {
165
- logger.info('No speaker ID - connecting without persistent memory');
166
- }
167
- // Determine connection type based on enableVideo
168
- const connType = configWithDefaults.enableVideo ? "video" : "audio";
169
- setConnectionType(connType);
170
- // Prepare request body with required parameters
171
- const requestBody = {
172
- character_id: configWithDefaults.characterId,
173
- ...(resolvedSpeakerId && { speaker_id: resolvedSpeakerId }),
174
- transport: "livekit",
175
- connection_type: connType,
176
- llm_provider: "dynamic",
177
- default_tts_enabled: configWithDefaults.ttsEnabled !== undefined ? configWithDefaults.ttsEnabled : true, // Use config value or default to true
178
- ...(characterSessionId &&
179
- characterSessionId !== "-1" && {
180
- character_session_id: characterSessionId,
181
- }), // Resume with existing session if available (skip if -1)
182
- ...(configWithDefaults.actionConfig && { action_config: configWithDefaults.actionConfig }),
183
- };
184
- // Call Core Service API
185
- const response = await fetch(`${configWithDefaults.url}/connect`, {
186
- method: "POST",
187
- headers: {
188
- "x-api-key": configWithDefaults.apiKey,
189
- "Content-Type": "application/json",
190
- },
191
- body: JSON.stringify(requestBody),
192
- });
193
- if (!response.ok) {
194
- const errorText = await response.text();
195
- logger.error("API Error Response:", {
196
- status: response.status,
197
- statusText: response.statusText,
198
- body: errorText,
199
- });
200
- let errorMessage = `HTTP error! status: ${response.status}`;
201
- try {
202
- const errorData = JSON.parse(errorText);
203
- if (errorData.message) {
204
- errorMessage = errorData.message;
205
- }
206
- else if (errorData.error) {
207
- errorMessage = errorData.error;
208
- }
209
- else if (errorData.detail) {
210
- errorMessage = errorData.detail;
211
- }
212
- }
213
- catch (e) {
214
- // If we can't parse the error, use the raw text
215
- if (errorText) {
216
- errorMessage = `${errorMessage}: ${errorText}`;
217
- }
218
- }
219
- throw new Error(errorMessage);
220
- }
221
- const connectionData = await response.json();
222
- // Capture character_session_id from connection response
223
- if (connectionData.character_session_id) {
224
- setCharacterSessionId(connectionData.character_session_id);
225
- }
226
- // Connect to LiveKit room
227
- await room.connect(connectionData.room_url, connectionData.token, {
228
- rtcConfig: {
229
- iceTransportPolicy: "relay",
230
- },
231
- });
232
- // Enable microphone only if startWithAudioOn is true (default: false)
233
- // If false, microphone stays off until user enables it via audioControls
234
- if (configWithDefaults.startWithAudioOn) {
235
- await room.localParticipant.setMicrophoneEnabled(true, {
236
- echoCancellation: audioSettings.echoCancellation,
237
- noiseSuppression: audioSettings.noiseSuppression,
238
- autoGainControl: audioSettings.autoGainControl,
239
- sampleRate: audioSettings.sampleRate,
240
- channelCount: audioSettings.channelCount,
241
- });
242
- }
243
- // Enable camera only if enableVideo is true AND startWithVideoOn is true
244
- if (configWithDefaults.enableVideo && configWithDefaults.startWithVideoOn) {
245
- await room.localParticipant.setCameraEnabled(true);
246
- }
247
- // Capture participant SID
248
- setParticipantSid(room.localParticipant.sid);
249
- setIsConnected(true);
250
- setActivity("Connected");
251
- }
252
- catch (error) {
253
- logger.error("Connection failed:", error);
254
- setIsConnected(false);
255
- setActivity("Connection failed");
256
- throw error;
257
- }
258
- finally {
259
- setIsConnecting(false);
260
- }
261
- }, [room, characterSessionId, storedConfig]);
262
- // Disconnect function
263
- const disconnect = useCallback(async () => {
264
- if (room && room.state !== "disconnected") {
265
- try {
266
- await room.disconnect();
267
- setIsConnected(false);
268
- setIsBotReady(false); // Reset bot-ready state on disconnect
269
- setConnectionType(null); // Reset connection type
270
- setApiKey(null); // Clear API key
271
- setCharacterId(null); // Clear character ID
272
- setSpeakerId(null); // Clear speaker ID
273
- setActivity("Disconnected");
274
- setChatMessages([]);
275
- setIsBotResponding(false);
276
- // Keep characterSessionId for reconnection - only clear on explicit reset
277
- }
278
- catch (error) {
279
- // Handle disconnect errors gracefully
280
- // ConnectionError "Client initiated disconnect" is expected in some cases
281
- if (!(error instanceof Error && error.message.includes("disconnect"))) {
282
- logger.error("Disconnect error:", error);
283
- }
284
- // Still update state even if disconnect throws
285
- setIsConnected(false);
286
- setIsBotReady(false); // Reset bot-ready state on disconnect
287
- setConnectionType(null); // Reset connection type
288
- setApiKey(null); // Clear API key
289
- setCharacterId(null); // Clear character ID
290
- setSpeakerId(null); // Clear speaker ID
291
- setActivity("Disconnected");
292
- setChatMessages([]);
293
- setIsBotResponding(false);
294
- // Keep characterSessionId for reconnection - only clear on explicit reset
295
- }
296
- }
297
- }, [room]);
298
- // Reset session function - clears character_session_id for a fresh session
299
- const resetSession = useCallback(() => {
300
- setCharacterSessionId("-1");
301
- }, []);
302
- // Send RTVI trigger
303
- const sendRTVI = useCallback((triggerName, message) => {
304
- if (room && room.localParticipant) {
305
- const data = {
306
- type: "rtvi-trigger",
307
- trigger: triggerName,
308
- message: message || "",
309
- };
310
- room.localParticipant.publishData(new TextEncoder().encode(JSON.stringify(data)), {
311
- reliable: true,
312
- });
313
- }
314
- }, [room]);
315
- // Reconnect function - disconnect and connect again with stored config
316
- const reconnect = useCallback(async () => {
317
- await disconnect();
318
- await connect();
319
- }, [disconnect, connect]);
320
- // Return client object with activity and chat messages
321
- return {
322
- state,
323
- connectionType,
324
- apiKey,
325
- characterId,
326
- speakerId,
327
- connect,
328
- disconnect,
329
- reconnect,
330
- resetSession,
331
- room,
332
- videoTrack: null,
333
- audioTrack: null,
334
- sendUserTextMessage,
335
- sendTriggerMessage,
336
- updateTemplateKeys,
337
- updateDynamicInfo,
338
- activity,
339
- chatMessages,
340
- userTranscription,
341
- characterSessionId,
342
- isBotReady,
343
- audioControls,
344
- videoControls,
345
- screenShareControls,
346
- toggleTts,
347
- };
348
- };
349
- //# sourceMappingURL=useConvaiClient.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useConvaiClient.js","sourceRoot":"","sources":["../../src/hooks/useConvaiClient.ts"],"names":[],"mappings":"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"}
@@ -1,33 +0,0 @@
1
- import { Room } from "livekit-client";
2
- export interface DynamicInfo {
3
- text: string;
4
- }
5
- /**
6
- * Hook for updating dynamic information in Convai.
7
- *
8
- * Updates contextual information that can be used by the AI assistant
9
- * to provide more relevant and up-to-date responses.
10
- *
11
- * @param {Room} room - LiveKit room instance
12
- * @param {string} participantSid - Participant session ID
13
- * @returns {Object} Object containing updateDynamicInfo function
14
- *
15
- * @example
16
- * ```tsx
17
- * function DynamicInfoComponent() {
18
- * const { updateDynamicInfo } = useDynamicInfoUpdater(room, participantSid);
19
- *
20
- * const handleUpdate = () => {
21
- * updateDynamicInfo({
22
- * text: "The user is now exploring a virtual museum"
23
- * });
24
- * };
25
- *
26
- * return <button onClick={handleUpdate}>Update Info</button>;
27
- * }
28
- * ```
29
- */
30
- export declare const useDynamicInfoUpdater: (room: Room, participantSid: string) => {
31
- updateDynamicInfo: (dynamicInfo: DynamicInfo) => void;
32
- };
33
- //# sourceMappingURL=useDynamicInfoUpdater.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useDynamicInfoUpdater.d.ts","sourceRoot":"","sources":["../../src/hooks/useDynamicInfoUpdater.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAGtC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,qBAAqB,GAChC,MAAM,IAAI,EACV,gBAAgB,MAAM;qCAGN,WAAW;CAwB5B,CAAC"}
@@ -1,49 +0,0 @@
1
- import { useCallback } from "react";
2
- /**
3
- * Hook for updating dynamic information in Convai.
4
- *
5
- * Updates contextual information that can be used by the AI assistant
6
- * to provide more relevant and up-to-date responses.
7
- *
8
- * @param {Room} room - LiveKit room instance
9
- * @param {string} participantSid - Participant session ID
10
- * @returns {Object} Object containing updateDynamicInfo function
11
- *
12
- * @example
13
- * ```tsx
14
- * function DynamicInfoComponent() {
15
- * const { updateDynamicInfo } = useDynamicInfoUpdater(room, participantSid);
16
- *
17
- * const handleUpdate = () => {
18
- * updateDynamicInfo({
19
- * text: "The user is now exploring a virtual museum"
20
- * });
21
- * };
22
- *
23
- * return <button onClick={handleUpdate}>Update Info</button>;
24
- * }
25
- * ```
26
- */
27
- export const useDynamicInfoUpdater = (room, participantSid) => {
28
- const updateDynamicInfo = useCallback((dynamicInfo) => {
29
- if (room && room.localParticipant && dynamicInfo.text?.trim()) {
30
- const message = {
31
- type: "update-dynamic-info",
32
- data: {
33
- dynamic_info: {
34
- text: dynamicInfo.text.trim(),
35
- },
36
- participant_sid: participantSid || room.localParticipant.sid,
37
- },
38
- };
39
- const encodedData = new TextEncoder().encode(JSON.stringify(message));
40
- room.localParticipant.publishData(encodedData, {
41
- reliable: true,
42
- });
43
- }
44
- }, [room, participantSid]);
45
- return {
46
- updateDynamicInfo,
47
- };
48
- };
49
- //# sourceMappingURL=useDynamicInfoUpdater.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useDynamicInfoUpdater.js","sourceRoot":"","sources":["../../src/hooks/useDynamicInfoUpdater.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAQpC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,IAAU,EACV,cAAsB,EACtB,EAAE;IACF,MAAM,iBAAiB,GAAG,WAAW,CACnC,CAAC,WAAwB,EAAE,EAAE;QAC3B,IAAI,IAAI,IAAI,IAAI,CAAC,gBAAgB,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;YAC9D,MAAM,OAAO,GAAG;gBACd,IAAI,EAAE,qBAAqB;gBAC3B,IAAI,EAAE;oBACJ,YAAY,EAAE;wBACZ,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE;qBAC9B;oBACD,eAAe,EAAE,cAAc,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG;iBAC7D;aACF,CAAC;YAEF,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YACtE,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,WAAW,EAAE;gBAC7C,QAAQ,EAAE,IAAI;aACf,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EACD,CAAC,IAAI,EAAE,cAAc,CAAC,CACvB,CAAC;IAEF,OAAO;QACL,iBAAiB;KAClB,CAAC;AACJ,CAAC,CAAC"}
@@ -1,22 +0,0 @@
1
- import { TrackReferenceOrPlaceholder } from "@livekit/components-react";
2
- /**
3
- * Hook to get the local camera track reference from LiveKit.
4
- *
5
- * Returns a track reference that can be used with LiveKit components
6
- * to display the local participant's camera feed.
7
- *
8
- * @returns {TrackReferenceOrPlaceholder} Track reference for the local camera
9
- *
10
- * @example
11
- * ```tsx
12
- * function VideoComponent() {
13
- * const cameraTrackRef = useLocalCameraTrack();
14
- *
15
- * return (
16
- * <VideoTrack trackRef={cameraTrackRef} />
17
- * );
18
- * }
19
- * ```
20
- */
21
- export declare const useLocalCameraTrack: () => TrackReferenceOrPlaceholder;
22
- //# sourceMappingURL=useLocalCameraTrack.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useLocalCameraTrack.d.ts","sourceRoot":"","sources":["../../src/hooks/useLocalCameraTrack.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAE5B,MAAM,2BAA2B,CAAC;AAInC;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,mBAAmB,mCAY/B,CAAC"}
@@ -1,34 +0,0 @@
1
- import { useLocalParticipant, } from "@livekit/components-react";
2
- import { Track } from "livekit-client";
3
- import { useMemo } from "react";
4
- /**
5
- * Hook to get the local camera track reference from LiveKit.
6
- *
7
- * Returns a track reference that can be used with LiveKit components
8
- * to display the local participant's camera feed.
9
- *
10
- * @returns {TrackReferenceOrPlaceholder} Track reference for the local camera
11
- *
12
- * @example
13
- * ```tsx
14
- * function VideoComponent() {
15
- * const cameraTrackRef = useLocalCameraTrack();
16
- *
17
- * return (
18
- * <VideoTrack trackRef={cameraTrackRef} />
19
- * );
20
- * }
21
- * ```
22
- */
23
- export const useLocalCameraTrack = () => {
24
- const { cameraTrack, localParticipant } = useLocalParticipant();
25
- const cameraTrackRef = useMemo(() => {
26
- return {
27
- participant: localParticipant,
28
- source: Track.Source.Camera,
29
- publication: cameraTrack,
30
- };
31
- }, [localParticipant, cameraTrack]);
32
- return cameraTrackRef;
33
- };
34
- //# sourceMappingURL=useLocalCameraTrack.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useLocalCameraTrack.js","sourceRoot":"","sources":["../../src/hooks/useLocalCameraTrack.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,mBAAmB,GACpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEhC;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,EAAE;IACtC,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAEhE,MAAM,cAAc,GAAgC,OAAO,CAAC,GAAG,EAAE;QAC/D,OAAO;YACL,WAAW,EAAE,gBAAgB;YAC7B,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;YAC3B,WAAW,EAAE,WAAW;SACzB,CAAC;IACJ,CAAC,EAAE,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC,CAAC;IAEpC,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC"}