@convai/web-sdk 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/README.md +239 -0
  2. package/dist/components/RTCWidget.d.ts +56 -0
  3. package/dist/components/RTCWidget.d.ts.map +1 -0
  4. package/dist/components/RTCWidget.js +419 -0
  5. package/dist/components/RTCWidget.js.map +1 -0
  6. package/dist/components/index.d.ts +3 -0
  7. package/dist/components/index.d.ts.map +1 -0
  8. package/dist/components/index.js +5 -0
  9. package/dist/components/index.js.map +1 -0
  10. package/dist/components/rtc-widget/components/AudioSettingsPanel.d.ts +10 -0
  11. package/dist/components/rtc-widget/components/AudioSettingsPanel.d.ts.map +1 -0
  12. package/dist/components/rtc-widget/components/AudioSettingsPanel.js +316 -0
  13. package/dist/components/rtc-widget/components/AudioSettingsPanel.js.map +1 -0
  14. package/dist/components/rtc-widget/components/ConviMessage.d.ts +10 -0
  15. package/dist/components/rtc-widget/components/ConviMessage.d.ts.map +1 -0
  16. package/dist/components/rtc-widget/components/ConviMessage.js +14 -0
  17. package/dist/components/rtc-widget/components/ConviMessage.js.map +1 -0
  18. package/dist/components/rtc-widget/components/FloatingVideo.d.ts +9 -0
  19. package/dist/components/rtc-widget/components/FloatingVideo.d.ts.map +1 -0
  20. package/dist/components/rtc-widget/components/FloatingVideo.js +122 -0
  21. package/dist/components/rtc-widget/components/FloatingVideo.js.map +1 -0
  22. package/dist/components/rtc-widget/components/MarkdownRenderer.d.ts +7 -0
  23. package/dist/components/rtc-widget/components/MarkdownRenderer.d.ts.map +1 -0
  24. package/dist/components/rtc-widget/components/MarkdownRenderer.js +68 -0
  25. package/dist/components/rtc-widget/components/MarkdownRenderer.js.map +1 -0
  26. package/dist/components/rtc-widget/components/MessageBubble.d.ts +10 -0
  27. package/dist/components/rtc-widget/components/MessageBubble.d.ts.map +1 -0
  28. package/dist/components/rtc-widget/components/MessageBubble.js +23 -0
  29. package/dist/components/rtc-widget/components/MessageBubble.js.map +1 -0
  30. package/dist/components/rtc-widget/components/MessageList.d.ts +11 -0
  31. package/dist/components/rtc-widget/components/MessageList.d.ts.map +1 -0
  32. package/dist/components/rtc-widget/components/MessageList.js +89 -0
  33. package/dist/components/rtc-widget/components/MessageList.js.map +1 -0
  34. package/dist/components/rtc-widget/components/UserMessage.d.ts +9 -0
  35. package/dist/components/rtc-widget/components/UserMessage.d.ts.map +1 -0
  36. package/dist/components/rtc-widget/components/UserMessage.js +15 -0
  37. package/dist/components/rtc-widget/components/UserMessage.js.map +1 -0
  38. package/dist/components/rtc-widget/components/conviComponents/ConviButton.d.ts +6 -0
  39. package/dist/components/rtc-widget/components/conviComponents/ConviButton.d.ts.map +1 -0
  40. package/dist/components/rtc-widget/components/conviComponents/ConviButton.js +15 -0
  41. package/dist/components/rtc-widget/components/conviComponents/ConviButton.js.map +1 -0
  42. package/dist/components/rtc-widget/components/conviComponents/ConviFooter.d.ts +25 -0
  43. package/dist/components/rtc-widget/components/conviComponents/ConviFooter.d.ts.map +1 -0
  44. package/dist/components/rtc-widget/components/conviComponents/ConviFooter.js +172 -0
  45. package/dist/components/rtc-widget/components/conviComponents/ConviFooter.js.map +1 -0
  46. package/dist/components/rtc-widget/components/conviComponents/ConviHeader.d.ts +17 -0
  47. package/dist/components/rtc-widget/components/conviComponents/ConviHeader.d.ts.map +1 -0
  48. package/dist/components/rtc-widget/components/conviComponents/ConviHeader.js +66 -0
  49. package/dist/components/rtc-widget/components/conviComponents/ConviHeader.js.map +1 -0
  50. package/dist/components/rtc-widget/components/conviComponents/SettingsTray.d.ts +12 -0
  51. package/dist/components/rtc-widget/components/conviComponents/SettingsTray.d.ts.map +1 -0
  52. package/dist/components/rtc-widget/components/conviComponents/SettingsTray.js +68 -0
  53. package/dist/components/rtc-widget/components/conviComponents/SettingsTray.js.map +1 -0
  54. package/dist/components/rtc-widget/components/conviComponents/VoiceModeOverlay.d.ts +8 -0
  55. package/dist/components/rtc-widget/components/conviComponents/VoiceModeOverlay.d.ts.map +1 -0
  56. package/dist/components/rtc-widget/components/conviComponents/VoiceModeOverlay.js +199 -0
  57. package/dist/components/rtc-widget/components/conviComponents/VoiceModeOverlay.js.map +1 -0
  58. package/dist/components/rtc-widget/components/conviComponents/index.d.ts +6 -0
  59. package/dist/components/rtc-widget/components/conviComponents/index.d.ts.map +1 -0
  60. package/dist/components/rtc-widget/components/conviComponents/index.js +6 -0
  61. package/dist/components/rtc-widget/components/conviComponents/index.js.map +1 -0
  62. package/dist/components/rtc-widget/components/index.d.ts +9 -0
  63. package/dist/components/rtc-widget/components/index.d.ts.map +1 -0
  64. package/dist/components/rtc-widget/components/index.js +13 -0
  65. package/dist/components/rtc-widget/components/index.js.map +1 -0
  66. package/dist/components/rtc-widget/index.d.ts +6 -0
  67. package/dist/components/rtc-widget/index.d.ts.map +1 -0
  68. package/dist/components/rtc-widget/index.js +7 -0
  69. package/dist/components/rtc-widget/index.js.map +1 -0
  70. package/dist/components/rtc-widget/styles/framerConfig.d.ts +116 -0
  71. package/dist/components/rtc-widget/styles/framerConfig.d.ts.map +1 -0
  72. package/dist/components/rtc-widget/styles/framerConfig.js +73 -0
  73. package/dist/components/rtc-widget/styles/framerConfig.js.map +1 -0
  74. package/dist/components/rtc-widget/styles/icons.d.ts +28 -0
  75. package/dist/components/rtc-widget/styles/icons.d.ts.map +1 -0
  76. package/dist/components/rtc-widget/styles/icons.js +257 -0
  77. package/dist/components/rtc-widget/styles/icons.js.map +1 -0
  78. package/dist/components/rtc-widget/styles/index.d.ts +6 -0
  79. package/dist/components/rtc-widget/styles/index.d.ts.map +1 -0
  80. package/dist/components/rtc-widget/styles/index.js +9 -0
  81. package/dist/components/rtc-widget/styles/index.js.map +1 -0
  82. package/dist/components/rtc-widget/styles/styledComponents.d.ts +90 -0
  83. package/dist/components/rtc-widget/styles/styledComponents.d.ts.map +1 -0
  84. package/dist/components/rtc-widget/styles/styledComponents.js +640 -0
  85. package/dist/components/rtc-widget/styles/styledComponents.js.map +1 -0
  86. package/dist/components/rtc-widget/styles/theme.d.ts +188 -0
  87. package/dist/components/rtc-widget/styles/theme.d.ts.map +1 -0
  88. package/dist/components/rtc-widget/styles/theme.js +290 -0
  89. package/dist/components/rtc-widget/styles/theme.js.map +1 -0
  90. package/dist/components/rtc-widget/types/index.d.ts +60 -0
  91. package/dist/components/rtc-widget/types/index.d.ts.map +1 -0
  92. package/dist/components/rtc-widget/types/index.js +2 -0
  93. package/dist/components/rtc-widget/types/index.js.map +1 -0
  94. package/dist/hooks/index.d.ts +13 -0
  95. package/dist/hooks/index.d.ts.map +1 -0
  96. package/dist/hooks/index.js +14 -0
  97. package/dist/hooks/index.js.map +1 -0
  98. package/dist/hooks/useAudioControls.d.ts +41 -0
  99. package/dist/hooks/useAudioControls.d.ts.map +1 -0
  100. package/dist/hooks/useAudioControls.js +219 -0
  101. package/dist/hooks/useAudioControls.js.map +1 -0
  102. package/dist/hooks/useCharacterInfo.d.ts +17 -0
  103. package/dist/hooks/useCharacterInfo.d.ts.map +1 -0
  104. package/dist/hooks/useCharacterInfo.js +61 -0
  105. package/dist/hooks/useCharacterInfo.js.map +1 -0
  106. package/dist/hooks/useConvaiClient.d.ts +37 -0
  107. package/dist/hooks/useConvaiClient.d.ts.map +1 -0
  108. package/dist/hooks/useConvaiClient.js +348 -0
  109. package/dist/hooks/useConvaiClient.js.map +1 -0
  110. package/dist/hooks/useDynamicInfoUpdater.d.ts +33 -0
  111. package/dist/hooks/useDynamicInfoUpdater.d.ts.map +1 -0
  112. package/dist/hooks/useDynamicInfoUpdater.js +51 -0
  113. package/dist/hooks/useDynamicInfoUpdater.js.map +1 -0
  114. package/dist/hooks/useLocalCameraTrack.d.ts +22 -0
  115. package/dist/hooks/useLocalCameraTrack.d.ts.map +1 -0
  116. package/dist/hooks/useLocalCameraTrack.js +34 -0
  117. package/dist/hooks/useLocalCameraTrack.js.map +1 -0
  118. package/dist/hooks/useMessageHandler.d.ts +28 -0
  119. package/dist/hooks/useMessageHandler.d.ts.map +1 -0
  120. package/dist/hooks/useMessageHandler.js +317 -0
  121. package/dist/hooks/useMessageHandler.js.map +1 -0
  122. package/dist/hooks/useScreenShare.d.ts +45 -0
  123. package/dist/hooks/useScreenShare.d.ts.map +1 -0
  124. package/dist/hooks/useScreenShare.js +198 -0
  125. package/dist/hooks/useScreenShare.js.map +1 -0
  126. package/dist/hooks/useTemplateKeysUpdater.d.ts +35 -0
  127. package/dist/hooks/useTemplateKeysUpdater.d.ts.map +1 -0
  128. package/dist/hooks/useTemplateKeysUpdater.js +53 -0
  129. package/dist/hooks/useTemplateKeysUpdater.js.map +1 -0
  130. package/dist/hooks/useTriggerMessageSender.d.ts +28 -0
  131. package/dist/hooks/useTriggerMessageSender.d.ts.map +1 -0
  132. package/dist/hooks/useTriggerMessageSender.js +52 -0
  133. package/dist/hooks/useTriggerMessageSender.js.map +1 -0
  134. package/dist/hooks/useTtsToggle.d.ts +37 -0
  135. package/dist/hooks/useTtsToggle.d.ts.map +1 -0
  136. package/dist/hooks/useTtsToggle.js +65 -0
  137. package/dist/hooks/useTtsToggle.js.map +1 -0
  138. package/dist/hooks/useUserTextMessageSender.d.ts +28 -0
  139. package/dist/hooks/useUserTextMessageSender.d.ts.map +1 -0
  140. package/dist/hooks/useUserTextMessageSender.js +61 -0
  141. package/dist/hooks/useUserTextMessageSender.js.map +1 -0
  142. package/dist/hooks/useVideoControls.d.ts +39 -0
  143. package/dist/hooks/useVideoControls.d.ts.map +1 -0
  144. package/dist/hooks/useVideoControls.js +211 -0
  145. package/dist/hooks/useVideoControls.js.map +1 -0
  146. package/dist/index.d.ts +5 -0
  147. package/dist/index.d.ts.map +1 -0
  148. package/dist/index.js +9 -0
  149. package/dist/index.js.map +1 -0
  150. package/dist/types/index.d.ts +225 -0
  151. package/dist/types/index.d.ts.map +1 -0
  152. package/dist/types/index.js +2 -0
  153. package/dist/types/index.js.map +1 -0
  154. package/dist/utils/logger.d.ts +27 -0
  155. package/dist/utils/logger.d.ts.map +1 -0
  156. package/dist/utils/logger.js +96 -0
  157. package/dist/utils/logger.js.map +1 -0
  158. package/package.json +94 -0
@@ -0,0 +1,317 @@
1
+ import { useCallback } from "react";
2
+ import { RoomEvent } from "livekit-client";
3
+ import { logger } from "../utils/logger";
4
+ /**
5
+ * Hook for handling incoming messages from Convai.
6
+ *
7
+ * Sets up data message listeners to process various message types
8
+ * from the AI assistant and updates the chat message history.
9
+ *
10
+ * @param {Room} room - LiveKit room instance
11
+ * @param {Function} setChatMessages - Function to update chat messages state
12
+ * @returns {Function} Cleanup function to remove message listeners
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * function ChatComponent() {
17
+ * const [chatMessages, setChatMessages] = useState([]);
18
+ * const cleanup = useMessageHandler(room, setChatMessages);
19
+ *
20
+ * useEffect(() => {
21
+ * return cleanup;
22
+ * }, []);
23
+ * }
24
+ * ```
25
+ */
26
+ export const useMessageHandler = (room, setChatMessages, onUserTranscription, setIsBotResponding, isBotResponding, setIsSpeaking, onConnectionStateChange, setActivity, setIsBotReady) => {
27
+ const handleDataReceived = useCallback((payload, participant) => {
28
+ try {
29
+ // Decode bytes to string
30
+ const decoder = new TextDecoder();
31
+ const messageString = decoder.decode(payload);
32
+ // Parse JSON
33
+ const messageData = JSON.parse(messageString);
34
+ logger.log("📨 Data message received:", messageData);
35
+ // Extract and categorize messages for chat display
36
+ const timestamp = new Date().toISOString();
37
+ const messageId = `${messageData.type}-${Date.now()}-${Math.random()}`;
38
+ // Debug: Log all incoming messages to see what's being received
39
+ logger.log("%c📨 INCOMING MESSAGE%c", "background: #673ab7; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;", {
40
+ type: messageData.type,
41
+ data: messageData.data,
42
+ message: messageData.message,
43
+ text: messageData.text,
44
+ content: messageData.content,
45
+ fullMessage: messageData,
46
+ });
47
+ // Handle different message types
48
+ switch (messageData.type) {
49
+ // User text messages - Skip these, only allow user-transcription
50
+ case "user_text_message":
51
+ case "user-llm-text":
52
+ case "text-input":
53
+ case "user-input":
54
+ case "text-message":
55
+ case "chat-message":
56
+ case "input-text":
57
+ case "message":
58
+ // Skip user text messages - only allow user-transcription
59
+ logger.log("%c🚫 SKIPPED USER TEXT%c %c" +
60
+ (messageData.data?.text ||
61
+ messageData.message ||
62
+ messageData.text ||
63
+ messageData.content ||
64
+ "unknown"), "background: #ff5722; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;", "color: #ff5722; font-weight: bold;", "color: #f7f1e3;");
65
+ break;
66
+ // Bot Ready - Bot is ready, connection should be true
67
+ case "bot-ready":
68
+ logger.log("%c✅ BOT READY%c", "background: #4caf50; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;");
69
+ // Set connection state to true when bot is ready
70
+ if (onConnectionStateChange) {
71
+ onConnectionStateChange(true);
72
+ }
73
+ // Set bot-ready state to true - bot can now receive messages
74
+ if (setIsBotReady) {
75
+ setIsBotReady(true);
76
+ }
77
+ // Update activity state
78
+ if (setActivity) {
79
+ setActivity("Connected");
80
+ }
81
+ break;
82
+ // Bot LLM Started - Begin streaming response
83
+ case "bot-llm-started":
84
+ logger.log("%c🤖 BOT RESPONSE STARTED%c", "background: #4caf50; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;");
85
+ if (setIsBotResponding) {
86
+ setIsBotResponding(true);
87
+ }
88
+ // Add initial streaming message to chat
89
+ const streamingMessage = {
90
+ id: messageId,
91
+ type: "bot-llm-text",
92
+ content: "",
93
+ timestamp: timestamp,
94
+ isFinal: true,
95
+ };
96
+ setChatMessages((prev) => [...prev, streamingMessage]);
97
+ break;
98
+ // Bot LLM Text Messages - Streaming chunks
99
+ case "bot-llm-text":
100
+ if (messageData.data?.text) {
101
+ const newChunk = messageData.data.text;
102
+ logger.log("%c🤖 BOT CHUNK%c %c" + newChunk, "background: #45b7d1; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;", "color: #45b7d1; font-weight: bold;", "color: #f7f1e3;");
103
+ // Update the streaming message in chat
104
+ setChatMessages((prevMessages) => {
105
+ const lastMessage = prevMessages[prevMessages.length - 1];
106
+ if (lastMessage && lastMessage.isFinal) {
107
+ return [
108
+ ...prevMessages.slice(0, -1),
109
+ { ...lastMessage, content: lastMessage.content + newChunk }
110
+ ];
111
+ }
112
+ else {
113
+ // If no streaming message exists yet, create one
114
+ const streamingMessage = {
115
+ id: `${messageData.type}-${Date.now()}-${Math.random()}`,
116
+ type: "bot-llm-text",
117
+ content: newChunk,
118
+ timestamp: new Date().toISOString(),
119
+ isFinal: true,
120
+ };
121
+ return [...prevMessages, streamingMessage];
122
+ }
123
+ });
124
+ }
125
+ break;
126
+ // Bot LLM Stopped - Complete streaming response
127
+ case "bot-llm-stopped":
128
+ // Get the most up-to-date content from the current message in chat
129
+ setChatMessages((prevMessages) => {
130
+ const lastMessage = prevMessages[prevMessages.length - 1];
131
+ if (lastMessage && lastMessage.isFinal) {
132
+ const finalContent = lastMessage.content;
133
+ logger.log("%c🤖 BOT RESPONSE COMPLETED%c %c" + finalContent, "background: #ff9800; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;", "color: #ff9800; font-weight: bold;", "color: #f7f1e3;");
134
+ return [
135
+ ...prevMessages.slice(0, -1),
136
+ { ...lastMessage, content: finalContent, isFinal: false }
137
+ ];
138
+ }
139
+ return prevMessages;
140
+ });
141
+ // Clear streaming state
142
+ if (setIsBotResponding) {
143
+ setIsBotResponding(false);
144
+ }
145
+ break;
146
+ // User Transcription Messages
147
+ case "user-transcription":
148
+ if (messageData.data?.text) {
149
+ const messageContent = messageData.data.text;
150
+ if (messageData.data?.final) {
151
+ // Final transcription - add to chat messages
152
+ // Check if this transcription already exists to prevent duplicates
153
+ setChatMessages((prev) => {
154
+ const alreadyExists = prev.some((msg) => msg.type === "user-transcription" &&
155
+ msg.content.toLowerCase().trim() ===
156
+ messageContent.toLowerCase().trim());
157
+ if (alreadyExists) {
158
+ logger.log("%c🔄 DUPLICATE SKIPPED%c UserTranscription: %c" +
159
+ messageContent, "background: #ff6b6b; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;", "color: #ff6b6b; font-weight: bold;", "color: #ffa726; font-weight: bold;");
160
+ return prev;
161
+ }
162
+ const userMessage = {
163
+ id: messageId,
164
+ type: "user-transcription",
165
+ content: messageContent,
166
+ timestamp: timestamp,
167
+ };
168
+ logger.log("%c🎤 USER TRANSCRIPTION (FINAL)%c %c" + messageContent, "background: #ffa726; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;", "color: #ffa726; font-weight: bold;", "color: #f7f1e3;");
169
+ return [...prev, userMessage];
170
+ });
171
+ // Clear live transcription when final
172
+ if (onUserTranscription) {
173
+ onUserTranscription('');
174
+ }
175
+ }
176
+ else {
177
+ // Non-final transcription - show in input field
178
+ if (onUserTranscription) {
179
+ onUserTranscription(messageContent);
180
+ logger.log("%c🎤 LIVE TRANSCRIPTION%c %c" + messageContent, "background: #4caf50; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;", "color: #4caf50; font-weight: bold;", "color: #f7f1e3;");
181
+ }
182
+ }
183
+ }
184
+ break;
185
+ // Bot Emotion Messages
186
+ case "bot-emotion":
187
+ if (messageData.data?.emotion) {
188
+ const emotionMessage = {
189
+ id: messageId,
190
+ type: "bot-emotion",
191
+ content: `${messageData.data.emotion} (scale: ${messageData.data.scale || 1})`,
192
+ timestamp,
193
+ };
194
+ setChatMessages((prev) => [...prev, emotionMessage]);
195
+ logger.log("%c😊 CONVAI EMOTION%c %c" +
196
+ messageData.data.emotion +
197
+ "%c (scale: %c" +
198
+ (messageData.data.scale || 1) +
199
+ "%c)", "background: #e91e63; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;", "color: #e91e63; font-weight: bold;", "color: #f7f1e3; font-weight: bold;", "color: #e91e63;", "color: #ffeb3b; font-weight: bold;", "color: #e91e63;");
200
+ }
201
+ break;
202
+ // Bot Started Speaking
203
+ case "bot-started-speaking":
204
+ logger.log("%c🔊 BOT STARTED SPEAKING%c", "background: #10b981; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;");
205
+ if (setIsSpeaking) {
206
+ setIsSpeaking(true);
207
+ }
208
+ break;
209
+ // Bot Stopped Speaking
210
+ case "bot-stopped-speaking":
211
+ logger.log("%c🔇 BOT STOPPED SPEAKING%c", "background: #6b7280; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;");
212
+ if (setIsSpeaking) {
213
+ setIsSpeaking(false);
214
+ }
215
+ break;
216
+ // Action Response Messages
217
+ case "action-response":
218
+ if (messageData.data?.actions) {
219
+ const actionMessage = {
220
+ id: messageId,
221
+ type: "action",
222
+ content: `Actions: ${messageData.data.actions.join(", ")}`,
223
+ timestamp,
224
+ };
225
+ setChatMessages((prev) => [...prev, actionMessage]);
226
+ logger.log("%c🎭 ACTION RESPONSE%c %c" +
227
+ messageData.data.actions.join(", "), "background: #9c27b0; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;", "color: #9c27b0; font-weight: bold;", "color: #f7f1e3;");
228
+ }
229
+ break;
230
+ // Behavior Tree Response Messages
231
+ case "behavior-tree-response":
232
+ if (messageData.data?.narrative_section_id) {
233
+ const behaviorMessage = {
234
+ id: messageId,
235
+ type: "behavior-tree",
236
+ content: `Narrative Section: ${messageData.data.narrative_section_id}`,
237
+ timestamp,
238
+ };
239
+ setChatMessages((prev) => [...prev, behaviorMessage]);
240
+ logger.log("%c🌳 BEHAVIOR TREE%c %c" +
241
+ messageData.data.narrative_section_id, "background: #4caf50; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;", "color: #4caf50; font-weight: bold;", "color: #f7f1e3;");
242
+ logger.log("%c🌳 BT DETAILS%c", "background: #4caf50; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;", {
243
+ narrativeSection: messageData.data.narrative_section_id,
244
+ btCode: messageData.data.bt_code,
245
+ btConstants: messageData.data.bt_constants,
246
+ });
247
+ }
248
+ break;
249
+ // Moderation Response Messages
250
+ case "moderation-response":
251
+ logger.log("%c🛡️ MODERATION%c %c" + (messageData.data?.result || "unknown"), "background: #ff9800; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;", "color: #ff9800; font-weight: bold;", "color: #f7f1e3;");
252
+ logger.log("%c🛡️ MODERATION DETAILS%c", "background: #ff9800; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;", {
253
+ result: messageData.data?.result,
254
+ userInput: messageData.data?.user_input,
255
+ reason: messageData.data?.reason,
256
+ });
257
+ break;
258
+ // Trigger Messages
259
+ case "trigger-message":
260
+ logger.log("%c🎯 TRIGGER MESSAGE%c", "background: #2196f3; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;", messageData.data);
261
+ break;
262
+ // Template Keys Updates
263
+ case "update-template-keys":
264
+ logger.log("%c🔑 TEMPLATE KEYS%c", "background: #607d8b; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;", messageData.data);
265
+ break;
266
+ // Dynamic Info Updates
267
+ case "update-dynamic-info":
268
+ logger.log("%c🔄 DYNAMIC INFO%c", "background: #795548; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;", messageData.data);
269
+ break;
270
+ }
271
+ // Log any unhandled message types
272
+ if (![
273
+ "user_text_message",
274
+ "user-llm-text",
275
+ "text-input",
276
+ "user-input",
277
+ "text-message",
278
+ "chat-message",
279
+ "input-text",
280
+ "message",
281
+ "bot-llm-text",
282
+ "bot-llm-started",
283
+ "bot-llm-stopped",
284
+ "user-transcription",
285
+ "bot-emotion",
286
+ "bot-started-speaking",
287
+ "bot-stopped-speaking",
288
+ "action-response",
289
+ "behavior-tree-response",
290
+ "moderation-response",
291
+ "trigger-message",
292
+ "update-template-keys",
293
+ "update-dynamic-info",
294
+ ].includes(messageData.type)) {
295
+ logger.log("%c🔍 UNHANDLED MESSAGE TYPE%c %c" + messageData.type, "background: #f44336; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;", "color: #f44336; font-weight: bold;", "color: #f7f1e3;");
296
+ logger.log("%c🔍 UNHANDLED DATA%c", "background: #f44336; color: white; padding: 2px 6px; border-radius: 3px; font-weight: bold;", messageData);
297
+ }
298
+ }
299
+ catch (error) {
300
+ logger.error("Failed to parse data message:", error);
301
+ }
302
+ }, [setChatMessages, onUserTranscription, setIsBotResponding, isBotResponding, setIsSpeaking, onConnectionStateChange, setActivity]);
303
+ const setupMessageListener = useCallback(() => {
304
+ if (!room)
305
+ return;
306
+ // Listen for data received events
307
+ room.on(RoomEvent.DataReceived, handleDataReceived);
308
+ // Return cleanup function
309
+ return () => {
310
+ room.off(RoomEvent.DataReceived, handleDataReceived);
311
+ };
312
+ }, [room, handleDataReceived]);
313
+ return {
314
+ setupMessageListener,
315
+ };
316
+ };
317
+ //# sourceMappingURL=useMessageHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMessageHandler.js","sourceRoot":"","sources":["../../src/hooks/useMessageHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { Room } from "livekit-client";
2
+ export interface ScreenShareControls {
3
+ isScreenShareEnabled: boolean;
4
+ isScreenShareActive: boolean;
5
+ enableScreenShare: () => Promise<void>;
6
+ disableScreenShare: () => Promise<void>;
7
+ toggleScreenShare: () => Promise<void>;
8
+ enableScreenShareWithAudio: () => Promise<void>;
9
+ getScreenShareTracks: () => Promise<any[]>;
10
+ }
11
+ /**
12
+ * Hook for managing screen sharing controls in LiveKit.
13
+ *
14
+ * Provides methods to enable/disable screen sharing, manage screen share state,
15
+ * and handle screen sharing with audio support.
16
+ *
17
+ * Features:
18
+ * - Includes current tab in screen share options (selfBrowserSurface: "include")
19
+ * - Supports surface switching during screen share
20
+ * - Supports system audio capture
21
+ *
22
+ * Note: By default, browsers exclude the current tab from screen share to prevent
23
+ * infinite recursion ("hall of mirrors" effect). This hook enables it by setting
24
+ * selfBrowserSurface: "include", but be aware this may cause visual feedback loops.
25
+ *
26
+ * @param {Room | null} room - LiveKit room instance
27
+ * @returns {ScreenShareControls} Object containing screen share control methods and state
28
+ *
29
+ * @example
30
+ * ```tsx
31
+ * function ScreenShareControls() {
32
+ * const screenShareControls = useScreenShare(room);
33
+ *
34
+ * return (
35
+ * <div>
36
+ * <button onClick={screenShareControls.toggleScreenShare}>
37
+ * {screenShareControls.isScreenShareEnabled ? 'Stop Sharing' : 'Share Screen'}
38
+ * </button>
39
+ * </div>
40
+ * );
41
+ * }
42
+ * ```
43
+ */
44
+ export declare const useScreenShare: (room: Room | null) => ScreenShareControls;
45
+ //# sourceMappingURL=useScreenShare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScreenShare.d.ts","sourceRoot":"","sources":["../../src/hooks/useScreenShare.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAGtC,MAAM,WAAW,mBAAmB;IAElC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,mBAAmB,EAAE,OAAO,CAAC;IAG7B,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAGvC,0BAA0B,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAGhD,oBAAoB,EAAE,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;CAC5C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,cAAc,GAAI,MAAM,IAAI,GAAG,IAAI,KAAG,mBAsLlD,CAAC"}
@@ -0,0 +1,198 @@
1
+ import { useCallback, useState, useEffect } from "react";
2
+ import { logger } from "../utils/logger";
3
+ /**
4
+ * Hook for managing screen sharing controls in LiveKit.
5
+ *
6
+ * Provides methods to enable/disable screen sharing, manage screen share state,
7
+ * and handle screen sharing with audio support.
8
+ *
9
+ * Features:
10
+ * - Includes current tab in screen share options (selfBrowserSurface: "include")
11
+ * - Supports surface switching during screen share
12
+ * - Supports system audio capture
13
+ *
14
+ * Note: By default, browsers exclude the current tab from screen share to prevent
15
+ * infinite recursion ("hall of mirrors" effect). This hook enables it by setting
16
+ * selfBrowserSurface: "include", but be aware this may cause visual feedback loops.
17
+ *
18
+ * @param {Room | null} room - LiveKit room instance
19
+ * @returns {ScreenShareControls} Object containing screen share control methods and state
20
+ *
21
+ * @example
22
+ * ```tsx
23
+ * function ScreenShareControls() {
24
+ * const screenShareControls = useScreenShare(room);
25
+ *
26
+ * return (
27
+ * <div>
28
+ * <button onClick={screenShareControls.toggleScreenShare}>
29
+ * {screenShareControls.isScreenShareEnabled ? 'Stop Sharing' : 'Share Screen'}
30
+ * </button>
31
+ * </div>
32
+ * );
33
+ * }
34
+ * ```
35
+ */
36
+ export const useScreenShare = (room) => {
37
+ const [isScreenShareEnabled, setIsScreenShareEnabled] = useState(false);
38
+ const [isScreenShareActive, setIsScreenShareActive] = useState(false);
39
+ // Update screen share state when room changes
40
+ useEffect(() => {
41
+ if (!room) {
42
+ setIsScreenShareEnabled(false);
43
+ setIsScreenShareActive(false);
44
+ return;
45
+ }
46
+ const localParticipant = room.localParticipant;
47
+ // Set initial state
48
+ setIsScreenShareEnabled(localParticipant.isScreenShareEnabled);
49
+ setIsScreenShareActive(localParticipant.isScreenShareEnabled);
50
+ // Listen for screen share state changes
51
+ const handleTrackPublished = (track) => {
52
+ if (track.source === 'screen_share') {
53
+ setIsScreenShareActive(true);
54
+ logger.log("🖥️ Screen share started");
55
+ }
56
+ };
57
+ const handleTrackUnpublished = (track) => {
58
+ if (track.source === 'screen_share') {
59
+ setIsScreenShareActive(false);
60
+ logger.log("🖥️ Screen share stopped");
61
+ }
62
+ };
63
+ const handleTrackMuted = (track) => {
64
+ if (track.source === 'screen_share') {
65
+ setIsScreenShareActive(false);
66
+ logger.log("🖥️ Screen share muted");
67
+ }
68
+ };
69
+ const handleTrackUnmuted = (track) => {
70
+ if (track.source === 'screen_share') {
71
+ setIsScreenShareActive(true);
72
+ logger.log("🖥️ Screen share unmuted");
73
+ }
74
+ };
75
+ // Subscribe to events
76
+ localParticipant.on('trackPublished', handleTrackPublished);
77
+ localParticipant.on('trackUnpublished', handleTrackUnpublished);
78
+ localParticipant.on('trackMuted', handleTrackMuted);
79
+ localParticipant.on('trackUnmuted', handleTrackUnmuted);
80
+ return () => {
81
+ localParticipant.off('trackPublished', handleTrackPublished);
82
+ localParticipant.off('trackUnpublished', handleTrackUnpublished);
83
+ localParticipant.off('trackMuted', handleTrackMuted);
84
+ localParticipant.off('trackUnmuted', handleTrackUnmuted);
85
+ };
86
+ }, [room]);
87
+ // Enable screen share
88
+ const enableScreenShare = useCallback(async () => {
89
+ if (!room) {
90
+ logger.warn("Cannot enable screen share: no room connection");
91
+ return;
92
+ }
93
+ try {
94
+ // Use setScreenShareEnabled with options to include current tab
95
+ await room.localParticipant.setScreenShareEnabled(true, {
96
+ // @ts-ignore - selfBrowserSurface is a valid Chrome option but may not be in types
97
+ selfBrowserSurface: "include",
98
+ surfaceSwitching: "include",
99
+ systemAudio: "include",
100
+ });
101
+ setIsScreenShareEnabled(true);
102
+ logger.log("🖥️ Screen share enabled successfully");
103
+ }
104
+ catch (error) {
105
+ logger.error("Failed to enable screen share:", error);
106
+ throw error;
107
+ }
108
+ }, [room]);
109
+ // Disable screen share
110
+ const disableScreenShare = useCallback(async () => {
111
+ if (!room) {
112
+ logger.warn("Cannot disable screen share: no room connection");
113
+ return;
114
+ }
115
+ try {
116
+ await room.localParticipant.setScreenShareEnabled(false);
117
+ setIsScreenShareEnabled(false);
118
+ logger.log("🖥️ Screen share disabled successfully");
119
+ }
120
+ catch (error) {
121
+ logger.error("Failed to disable screen share:", error);
122
+ throw error;
123
+ }
124
+ }, [room]);
125
+ // Toggle screen share
126
+ const toggleScreenShare = useCallback(async () => {
127
+ if (isScreenShareEnabled) {
128
+ await disableScreenShare();
129
+ }
130
+ else {
131
+ await enableScreenShare();
132
+ }
133
+ }, [isScreenShareEnabled, enableScreenShare, disableScreenShare]);
134
+ // Enable screen share with audio
135
+ const enableScreenShareWithAudio = useCallback(async () => {
136
+ if (!room) {
137
+ logger.warn("Cannot enable screen share with audio: no room connection");
138
+ return;
139
+ }
140
+ try {
141
+ // Create screen tracks with audio enabled and include current tab
142
+ const tracks = await room.localParticipant.createScreenTracks({
143
+ audio: true,
144
+ // @ts-ignore - selfBrowserSurface is a valid Chrome option but may not be in types
145
+ selfBrowserSurface: "include",
146
+ surfaceSwitching: "include",
147
+ systemAudio: "include",
148
+ });
149
+ // Publish each track
150
+ tracks.forEach((track) => {
151
+ room.localParticipant.publishTrack(track);
152
+ });
153
+ setIsScreenShareEnabled(true);
154
+ logger.log("🖥️ Screen share with audio enabled successfully");
155
+ }
156
+ catch (error) {
157
+ logger.error("Failed to enable screen share with audio:", error);
158
+ throw error;
159
+ }
160
+ }, [room]);
161
+ // Get screen share tracks
162
+ const getScreenShareTracks = useCallback(async () => {
163
+ if (!room) {
164
+ logger.warn("Cannot get screen share tracks: no room connection");
165
+ return [];
166
+ }
167
+ try {
168
+ const localParticipant = room.localParticipant;
169
+ const screenShareTracks = [];
170
+ // Get all published tracks
171
+ localParticipant.trackPublications.forEach((publication) => {
172
+ if (publication.source === 'screen_share' && publication.track) {
173
+ screenShareTracks.push(publication.track);
174
+ }
175
+ });
176
+ logger.log("🖥️ Screen share tracks:", screenShareTracks);
177
+ return screenShareTracks;
178
+ }
179
+ catch (error) {
180
+ logger.error("Failed to get screen share tracks:", error);
181
+ throw error;
182
+ }
183
+ }, [room]);
184
+ return {
185
+ // Screen share state
186
+ isScreenShareEnabled,
187
+ isScreenShareActive,
188
+ // Screen share controls
189
+ enableScreenShare,
190
+ disableScreenShare,
191
+ toggleScreenShare,
192
+ // Screen share with audio
193
+ enableScreenShareWithAudio,
194
+ // Screen share settings
195
+ getScreenShareTracks,
196
+ };
197
+ };
198
+ //# sourceMappingURL=useScreenShare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScreenShare.js","sourceRoot":"","sources":["../../src/hooks/useScreenShare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { Room } from "livekit-client";
2
+ export interface TemplateKeys {
3
+ [key: string]: string;
4
+ }
5
+ /**
6
+ * Hook for updating template keys in Convai.
7
+ *
8
+ * Updates dynamic template variables that can be used in AI responses
9
+ * to provide personalized and contextual information.
10
+ *
11
+ * @param {Room} room - LiveKit room instance
12
+ * @param {string} participantSid - Participant session ID
13
+ * @returns {Object} Object containing updateTemplateKeys function
14
+ *
15
+ * @example
16
+ * ```tsx
17
+ * function TemplateComponent() {
18
+ * const { updateTemplateKeys } = useTemplateKeysUpdater(room, participantSid);
19
+ *
20
+ * const handleUpdate = () => {
21
+ * updateTemplateKeys({
22
+ * user_name: "John",
23
+ * location: "New York",
24
+ * mood: "happy"
25
+ * });
26
+ * };
27
+ *
28
+ * return <button onClick={handleUpdate}>Update Templates</button>;
29
+ * }
30
+ * ```
31
+ */
32
+ export declare const useTemplateKeysUpdater: (room: Room, participantSid: string) => {
33
+ updateTemplateKeys: (templateKeys: TemplateKeys) => void;
34
+ };
35
+ //# sourceMappingURL=useTemplateKeysUpdater.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTemplateKeysUpdater.d.ts","sourceRoot":"","sources":["../../src/hooks/useTemplateKeysUpdater.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAGtC,MAAM,WAAW,YAAY;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,sBAAsB,GACjC,MAAM,IAAI,EACV,gBAAgB,MAAM;uCAGL,YAAY;CA4B9B,CAAC"}