@convai/web-sdk 0.1.0 → 0.1.1-beta.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 (174) hide show
  1. package/README.md +277 -185
  2. package/dist/components/ConvaiWidget.d.ts.map +1 -1
  3. package/dist/components/ConvaiWidget.js +13 -0
  4. package/dist/components/ConvaiWidget.js.map +1 -1
  5. package/dist/components/rtc-widget/components/AudioSettingsPanel.js +1 -1
  6. package/dist/components/rtc-widget/components/AudioSettingsPanel.js.map +1 -1
  7. package/dist/components/rtc-widget/styles/styledComponents.d.ts.map +1 -1
  8. package/dist/components/rtc-widget/styles/styledComponents.js +72 -51
  9. package/dist/components/rtc-widget/styles/styledComponents.js.map +1 -1
  10. package/dist/core/AudioManager.d.ts +75 -0
  11. package/dist/core/AudioManager.d.ts.map +1 -0
  12. package/dist/core/AudioManager.js +219 -0
  13. package/dist/core/AudioManager.js.map +1 -0
  14. package/dist/core/ConvaiClient.d.ts +122 -0
  15. package/dist/core/ConvaiClient.d.ts.map +1 -0
  16. package/dist/core/ConvaiClient.js +509 -0
  17. package/dist/core/ConvaiClient.js.map +1 -0
  18. package/dist/core/EventEmitter.d.ts +38 -0
  19. package/dist/core/EventEmitter.d.ts.map +1 -0
  20. package/dist/core/EventEmitter.js +68 -0
  21. package/dist/core/EventEmitter.js.map +1 -0
  22. package/dist/core/MessageHandler.d.ts +52 -0
  23. package/dist/core/MessageHandler.d.ts.map +1 -0
  24. package/dist/core/MessageHandler.js +281 -0
  25. package/dist/core/MessageHandler.js.map +1 -0
  26. package/dist/core/ScreenShareManager.d.ts +57 -0
  27. package/dist/core/ScreenShareManager.d.ts.map +1 -0
  28. package/dist/core/ScreenShareManager.js +206 -0
  29. package/dist/core/ScreenShareManager.js.map +1 -0
  30. package/dist/core/VideoManager.d.ts +69 -0
  31. package/dist/core/VideoManager.d.ts.map +1 -0
  32. package/dist/core/VideoManager.js +207 -0
  33. package/dist/core/VideoManager.js.map +1 -0
  34. package/dist/core/index.d.ts +9 -0
  35. package/dist/core/index.d.ts.map +1 -0
  36. package/dist/core/index.js +12 -0
  37. package/dist/core/index.js.map +1 -0
  38. package/dist/core/types.d.ts +311 -0
  39. package/dist/core/types.d.ts.map +1 -0
  40. package/dist/core/types.js +2 -0
  41. package/dist/core/types.js.map +1 -0
  42. package/dist/hooks/useConvaiClient.d.ts.map +1 -1
  43. package/dist/hooks/useConvaiClient.js +16 -0
  44. package/dist/hooks/useConvaiClient.js.map +1 -1
  45. package/dist/hooks/useMessageHandler.d.ts.map +1 -1
  46. package/dist/hooks/useMessageHandler.js +39 -14
  47. package/dist/hooks/useMessageHandler.js.map +1 -1
  48. package/dist/index.d.ts +1 -5
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +3 -10
  51. package/dist/index.js.map +1 -1
  52. package/dist/react/components/ConvaiWidget.d.ts +59 -0
  53. package/dist/react/components/ConvaiWidget.d.ts.map +1 -0
  54. package/dist/react/components/ConvaiWidget.js +421 -0
  55. package/dist/react/components/ConvaiWidget.js.map +1 -0
  56. package/dist/react/components/index.d.ts +3 -0
  57. package/dist/react/components/index.d.ts.map +1 -0
  58. package/dist/react/components/index.js +5 -0
  59. package/dist/react/components/index.js.map +1 -0
  60. package/dist/react/components/rtc-widget/components/AudioSettingsPanel.d.ts +10 -0
  61. package/dist/react/components/rtc-widget/components/AudioSettingsPanel.d.ts.map +1 -0
  62. package/dist/react/components/rtc-widget/components/AudioSettingsPanel.js +316 -0
  63. package/dist/react/components/rtc-widget/components/AudioSettingsPanel.js.map +1 -0
  64. package/dist/react/components/rtc-widget/components/ConviMessage.d.ts +10 -0
  65. package/dist/react/components/rtc-widget/components/ConviMessage.d.ts.map +1 -0
  66. package/dist/react/components/rtc-widget/components/ConviMessage.js +14 -0
  67. package/dist/react/components/rtc-widget/components/ConviMessage.js.map +1 -0
  68. package/dist/react/components/rtc-widget/components/FloatingVideo.d.ts +9 -0
  69. package/dist/react/components/rtc-widget/components/FloatingVideo.d.ts.map +1 -0
  70. package/dist/react/components/rtc-widget/components/FloatingVideo.js +122 -0
  71. package/dist/react/components/rtc-widget/components/FloatingVideo.js.map +1 -0
  72. package/dist/react/components/rtc-widget/components/MarkdownRenderer.d.ts +7 -0
  73. package/dist/react/components/rtc-widget/components/MarkdownRenderer.d.ts.map +1 -0
  74. package/dist/react/components/rtc-widget/components/MarkdownRenderer.js +68 -0
  75. package/dist/react/components/rtc-widget/components/MarkdownRenderer.js.map +1 -0
  76. package/dist/react/components/rtc-widget/components/MessageBubble.d.ts +10 -0
  77. package/dist/react/components/rtc-widget/components/MessageBubble.d.ts.map +1 -0
  78. package/dist/react/components/rtc-widget/components/MessageBubble.js +23 -0
  79. package/dist/react/components/rtc-widget/components/MessageBubble.js.map +1 -0
  80. package/dist/react/components/rtc-widget/components/MessageList.d.ts +11 -0
  81. package/dist/react/components/rtc-widget/components/MessageList.d.ts.map +1 -0
  82. package/dist/react/components/rtc-widget/components/MessageList.js +89 -0
  83. package/dist/react/components/rtc-widget/components/MessageList.js.map +1 -0
  84. package/dist/react/components/rtc-widget/components/UserMessage.d.ts +9 -0
  85. package/dist/react/components/rtc-widget/components/UserMessage.d.ts.map +1 -0
  86. package/dist/react/components/rtc-widget/components/UserMessage.js +15 -0
  87. package/dist/react/components/rtc-widget/components/UserMessage.js.map +1 -0
  88. package/dist/react/components/rtc-widget/components/conviComponents/ConviButton.d.ts +6 -0
  89. package/dist/react/components/rtc-widget/components/conviComponents/ConviButton.d.ts.map +1 -0
  90. package/dist/react/components/rtc-widget/components/conviComponents/ConviButton.js +15 -0
  91. package/dist/react/components/rtc-widget/components/conviComponents/ConviButton.js.map +1 -0
  92. package/dist/react/components/rtc-widget/components/conviComponents/ConviFooter.d.ts +25 -0
  93. package/dist/react/components/rtc-widget/components/conviComponents/ConviFooter.d.ts.map +1 -0
  94. package/dist/react/components/rtc-widget/components/conviComponents/ConviFooter.js +172 -0
  95. package/dist/react/components/rtc-widget/components/conviComponents/ConviFooter.js.map +1 -0
  96. package/dist/react/components/rtc-widget/components/conviComponents/ConviHeader.d.ts +17 -0
  97. package/dist/react/components/rtc-widget/components/conviComponents/ConviHeader.d.ts.map +1 -0
  98. package/dist/react/components/rtc-widget/components/conviComponents/ConviHeader.js +66 -0
  99. package/dist/react/components/rtc-widget/components/conviComponents/ConviHeader.js.map +1 -0
  100. package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.d.ts +12 -0
  101. package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.d.ts.map +1 -0
  102. package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.js +68 -0
  103. package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.js.map +1 -0
  104. package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.d.ts +8 -0
  105. package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.d.ts.map +1 -0
  106. package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.js +199 -0
  107. package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.js.map +1 -0
  108. package/dist/react/components/rtc-widget/components/conviComponents/index.d.ts +6 -0
  109. package/dist/react/components/rtc-widget/components/conviComponents/index.d.ts.map +1 -0
  110. package/dist/react/components/rtc-widget/components/conviComponents/index.js +6 -0
  111. package/dist/react/components/rtc-widget/components/conviComponents/index.js.map +1 -0
  112. package/dist/react/components/rtc-widget/components/index.d.ts +8 -0
  113. package/dist/react/components/rtc-widget/components/index.d.ts.map +1 -0
  114. package/dist/react/components/rtc-widget/components/index.js +13 -0
  115. package/dist/react/components/rtc-widget/components/index.js.map +1 -0
  116. package/dist/react/components/rtc-widget/index.d.ts +6 -0
  117. package/dist/react/components/rtc-widget/index.d.ts.map +1 -0
  118. package/dist/react/components/rtc-widget/index.js +9 -0
  119. package/dist/react/components/rtc-widget/index.js.map +1 -0
  120. package/dist/react/components/rtc-widget/styles/framerConfig.d.ts +116 -0
  121. package/dist/react/components/rtc-widget/styles/framerConfig.d.ts.map +1 -0
  122. package/dist/react/components/rtc-widget/styles/framerConfig.js +73 -0
  123. package/dist/react/components/rtc-widget/styles/framerConfig.js.map +1 -0
  124. package/dist/react/components/rtc-widget/styles/icons.d.ts +28 -0
  125. package/dist/react/components/rtc-widget/styles/icons.d.ts.map +1 -0
  126. package/dist/react/components/rtc-widget/styles/icons.js +257 -0
  127. package/dist/react/components/rtc-widget/styles/icons.js.map +1 -0
  128. package/dist/react/components/rtc-widget/styles/index.d.ts +6 -0
  129. package/dist/react/components/rtc-widget/styles/index.d.ts.map +1 -0
  130. package/dist/react/components/rtc-widget/styles/index.js +9 -0
  131. package/dist/react/components/rtc-widget/styles/index.js.map +1 -0
  132. package/dist/react/components/rtc-widget/styles/styledComponents.d.ts +90 -0
  133. package/dist/react/components/rtc-widget/styles/styledComponents.d.ts.map +1 -0
  134. package/dist/react/components/rtc-widget/styles/styledComponents.js +661 -0
  135. package/dist/react/components/rtc-widget/styles/styledComponents.js.map +1 -0
  136. package/dist/react/components/rtc-widget/styles/theme.d.ts +188 -0
  137. package/dist/react/components/rtc-widget/styles/theme.d.ts.map +1 -0
  138. package/dist/react/components/rtc-widget/styles/theme.js +290 -0
  139. package/dist/react/components/rtc-widget/styles/theme.js.map +1 -0
  140. package/dist/react/components/rtc-widget/types/index.d.ts +60 -0
  141. package/dist/react/components/rtc-widget/types/index.d.ts.map +1 -0
  142. package/dist/react/components/rtc-widget/types/index.js +2 -0
  143. package/dist/react/components/rtc-widget/types/index.js.map +1 -0
  144. package/dist/react/hooks/index.d.ts +4 -0
  145. package/dist/react/hooks/index.d.ts.map +1 -0
  146. package/dist/react/hooks/index.js +6 -0
  147. package/dist/react/hooks/index.js.map +1 -0
  148. package/dist/react/hooks/useCharacterInfo.d.ts +17 -0
  149. package/dist/react/hooks/useCharacterInfo.d.ts.map +1 -0
  150. package/dist/react/hooks/useCharacterInfo.js +60 -0
  151. package/dist/react/hooks/useCharacterInfo.js.map +1 -0
  152. package/dist/react/hooks/useConvaiClient.d.ts +32 -0
  153. package/dist/react/hooks/useConvaiClient.d.ts.map +1 -0
  154. package/dist/react/hooks/useConvaiClient.js +140 -0
  155. package/dist/react/hooks/useConvaiClient.js.map +1 -0
  156. package/dist/react/hooks/useLocalCameraTrack.d.ts +22 -0
  157. package/dist/react/hooks/useLocalCameraTrack.d.ts.map +1 -0
  158. package/dist/react/hooks/useLocalCameraTrack.js +34 -0
  159. package/dist/react/hooks/useLocalCameraTrack.js.map +1 -0
  160. package/dist/react/index.d.ts +8 -0
  161. package/dist/react/index.d.ts.map +1 -0
  162. package/dist/react/index.js +15 -0
  163. package/dist/react/index.js.map +1 -0
  164. package/dist/types/index.d.ts +20 -0
  165. package/dist/types/index.d.ts.map +1 -1
  166. package/dist/utils/speakerManagement.d.ts +22 -0
  167. package/dist/utils/speakerManagement.d.ts.map +1 -0
  168. package/dist/utils/speakerManagement.js +71 -0
  169. package/dist/utils/speakerManagement.js.map +1 -0
  170. package/dist/vanilla/index.d.ts +3 -0
  171. package/dist/vanilla/index.d.ts.map +1 -0
  172. package/dist/vanilla/index.js +5 -0
  173. package/dist/vanilla/index.js.map +1 -0
  174. package/package.json +22 -5
@@ -0,0 +1,509 @@
1
+ import { Room, RoomEvent } from "livekit-client";
2
+ import { AudioManager } from "./AudioManager";
3
+ import { VideoManager } from "./VideoManager";
4
+ import { ScreenShareManager } from "./ScreenShareManager";
5
+ import { MessageHandler } from "./MessageHandler";
6
+ import { EventEmitter } from "./EventEmitter";
7
+ import { logger } from "../utils/logger";
8
+ import { resolveSpeakerId } from "../utils/speakerManagement";
9
+ /**
10
+ * Main Convai client class for managing AI voice assistant connections
11
+ * Provides complete interface for connecting to Convai's voice assistants,
12
+ * managing real-time audio/video conversations, and handling messages.
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * import { ConvaiClient } from '@convai/web-sdk/core';
17
+ *
18
+ * const client = new ConvaiClient();
19
+ *
20
+ * // Listen for state changes
21
+ * client.on('stateChange', (state) => {
22
+ * console.log('State:', state);
23
+ * });
24
+ *
25
+ * // Connect to character
26
+ * await client.connect({
27
+ * apiKey: 'your-api-key',
28
+ * characterId: 'your-character-id',
29
+ * endUserId: 'user-uuid' // Optional: enables memory & analytics
30
+ * });
31
+ *
32
+ * // Send a message
33
+ * client.sendUserTextMessage('Hello!');
34
+ * ```
35
+ */
36
+ export class ConvaiClient extends EventEmitter {
37
+ constructor() {
38
+ super();
39
+ this._connectionType = null;
40
+ this._apiKey = null;
41
+ this._characterId = null;
42
+ this._speakerId = null;
43
+ this._characterSessionId = "-1";
44
+ this._isBotReady = false;
45
+ this._participantSid = "";
46
+ this._storedConfig = null;
47
+ // Initialize room
48
+ this._room = new Room();
49
+ // Initialize state
50
+ this._state = {
51
+ isConnected: false,
52
+ isConnecting: false,
53
+ isListening: false,
54
+ isThinking: false,
55
+ isSpeaking: false,
56
+ agentState: 'disconnected',
57
+ };
58
+ // Default audio settings for optimal interruption handling
59
+ this._audioSettings = {
60
+ echoCancellation: true,
61
+ noiseSuppression: true,
62
+ autoGainControl: true,
63
+ sampleRate: 48000,
64
+ channelCount: 1,
65
+ };
66
+ // Initialize managers
67
+ this._audioManager = new AudioManager(this._room);
68
+ this._videoManager = new VideoManager(this._room);
69
+ this._screenShareManager = new ScreenShareManager(this._room);
70
+ this._messageHandler = new MessageHandler(this._room);
71
+ // Setup event listeners
72
+ this.setupEventListeners();
73
+ }
74
+ // Getters
75
+ get state() {
76
+ return { ...this._state };
77
+ }
78
+ get connectionType() {
79
+ return this._connectionType;
80
+ }
81
+ get apiKey() {
82
+ return this._apiKey;
83
+ }
84
+ get characterId() {
85
+ return this._characterId;
86
+ }
87
+ get speakerId() {
88
+ return this._speakerId;
89
+ }
90
+ get room() {
91
+ return this._room;
92
+ }
93
+ get chatMessages() {
94
+ return this._messageHandler.getChatMessages();
95
+ }
96
+ get userTranscription() {
97
+ return this._messageHandler.getUserTranscription();
98
+ }
99
+ get characterSessionId() {
100
+ return this._characterSessionId;
101
+ }
102
+ get isBotReady() {
103
+ return this._isBotReady;
104
+ }
105
+ get audioControls() {
106
+ return this._audioManager;
107
+ }
108
+ get videoControls() {
109
+ return this._videoManager;
110
+ }
111
+ get screenShareControls() {
112
+ return this._screenShareManager;
113
+ }
114
+ /**
115
+ * Setup event listeners for room and managers
116
+ */
117
+ setupEventListeners() {
118
+ // Room event listeners
119
+ this._room.on(RoomEvent.Disconnected, this.handleDisconnected.bind(this));
120
+ this._room.on(RoomEvent.ConnectionStateChanged, this.handleConnectionStateChanged.bind(this));
121
+ // Message handler events
122
+ this._messageHandler.on('botReady', () => {
123
+ this._isBotReady = true;
124
+ this.updateState({ isConnected: true });
125
+ this.emit('botReady');
126
+ });
127
+ this._messageHandler.on('messagesChange', (messages) => {
128
+ this.emit('message', messages[messages.length - 1]);
129
+ this.emit('messagesChange', messages);
130
+ });
131
+ this._messageHandler.on('userTranscriptionChange', (transcription) => {
132
+ this.emit('userTranscriptionChange', transcription);
133
+ });
134
+ this._messageHandler.on('speakingChange', (isSpeaking) => {
135
+ this.updateState({ isSpeaking });
136
+ this.emit('speakingChange', isSpeaking);
137
+ });
138
+ this._messageHandler.on('botRespondingChange', (isResponding) => {
139
+ this.updateState({ isThinking: isResponding });
140
+ });
141
+ }
142
+ /**
143
+ * Handle room disconnection
144
+ */
145
+ handleDisconnected() {
146
+ this.updateState({
147
+ isConnected: false,
148
+ isConnecting: false,
149
+ isSpeaking: false,
150
+ isThinking: false,
151
+ isListening: false,
152
+ });
153
+ this._isBotReady = false;
154
+ this._messageHandler.reset();
155
+ this.emit('disconnect');
156
+ }
157
+ /**
158
+ * Handle connection state changes
159
+ */
160
+ handleConnectionStateChanged(state) {
161
+ if (state === "disconnected") {
162
+ this.updateState({
163
+ isConnected: false,
164
+ isConnecting: false,
165
+ });
166
+ this._isBotReady = false;
167
+ this._messageHandler.reset();
168
+ }
169
+ else if (state === "connected") {
170
+ this.updateState({
171
+ isConnected: true,
172
+ isConnecting: false,
173
+ });
174
+ this._isBotReady = false; // Wait for bot-ready message
175
+ }
176
+ else if (state === "connecting") {
177
+ this.updateState({
178
+ isConnecting: true,
179
+ isConnected: false,
180
+ });
181
+ this._isBotReady = false;
182
+ }
183
+ }
184
+ /**
185
+ * Update state and emit changes
186
+ */
187
+ updateState(updates) {
188
+ const oldState = { ...this._state };
189
+ this._state = { ...this._state, ...updates };
190
+ // Update agentState based on individual flags
191
+ if (!this._state.isConnected) {
192
+ this._state.agentState = 'disconnected';
193
+ }
194
+ else if (this._state.isSpeaking) {
195
+ this._state.agentState = 'speaking';
196
+ }
197
+ else if (this._state.isThinking) {
198
+ this._state.agentState = 'thinking';
199
+ }
200
+ else if (this._state.isListening) {
201
+ this._state.agentState = 'listening';
202
+ }
203
+ else {
204
+ this._state.agentState = 'connected';
205
+ }
206
+ // Emit state change if changed
207
+ if (JSON.stringify(oldState) !== JSON.stringify(this._state)) {
208
+ this.emit('stateChange', this._state);
209
+ }
210
+ }
211
+ /**
212
+ * Connect to a Convai character
213
+ */
214
+ async connect(config) {
215
+ // Use provided config or stored config
216
+ const finalConfig = config || this._storedConfig;
217
+ if (!finalConfig) {
218
+ throw new Error('No configuration provided. Pass config to connect() or store it in the client');
219
+ }
220
+ // Store config for reconnection
221
+ this._storedConfig = finalConfig;
222
+ // Add default URL if not provided
223
+ const configWithDefaults = {
224
+ url: "https://realtime-api.convai.com",
225
+ ...finalConfig,
226
+ };
227
+ if (!configWithDefaults.apiKey ||
228
+ !configWithDefaults.characterId) {
229
+ throw new Error("apiKey and characterId are required");
230
+ }
231
+ this.updateState({ isConnecting: true });
232
+ try {
233
+ // Store connection config
234
+ this._apiKey = configWithDefaults.apiKey;
235
+ this._characterId = configWithDefaults.characterId;
236
+ // Resolve speaker ID based on endUserId
237
+ if (configWithDefaults.endUserId) {
238
+ logger.info(`Resolving speaker ID for endUserId: ${configWithDefaults.endUserId}`);
239
+ }
240
+ else {
241
+ logger.info('Connecting in anonymous mode (no endUserId provided)');
242
+ }
243
+ const resolvedSpeakerId = await resolveSpeakerId(configWithDefaults.endUserId, configWithDefaults.apiKey);
244
+ this._speakerId = resolvedSpeakerId;
245
+ logger.info(`Speaker ID resolved: ${resolvedSpeakerId.substring(0, 8)}...`);
246
+ // Determine connection type based on enableVideo
247
+ const connType = configWithDefaults.enableVideo ? "video" : "audio";
248
+ this._connectionType = connType;
249
+ // Prepare request body with required parameters
250
+ const requestBody = {
251
+ character_id: configWithDefaults.characterId,
252
+ speaker_id: resolvedSpeakerId,
253
+ transport: "livekit",
254
+ connection_type: connType,
255
+ llm_provider: "dynamic",
256
+ default_tts_enabled: configWithDefaults.ttsEnabled !== undefined ? configWithDefaults.ttsEnabled : true,
257
+ ...(this._characterSessionId &&
258
+ this._characterSessionId !== "-1" && {
259
+ character_session_id: this._characterSessionId,
260
+ }),
261
+ ...(configWithDefaults.actionConfig && { action_config: configWithDefaults.actionConfig }),
262
+ };
263
+ // Call Core Service API
264
+ const response = await fetch(`${configWithDefaults.url}/connect`, {
265
+ method: "POST",
266
+ headers: {
267
+ "x-api-key": configWithDefaults.apiKey,
268
+ "Content-Type": "application/json",
269
+ },
270
+ body: JSON.stringify(requestBody),
271
+ });
272
+ if (!response.ok) {
273
+ const errorText = await response.text();
274
+ logger.error("API Error Response:", {
275
+ status: response.status,
276
+ statusText: response.statusText,
277
+ body: errorText,
278
+ });
279
+ let errorMessage = `HTTP error! status: ${response.status}`;
280
+ try {
281
+ const errorData = JSON.parse(errorText);
282
+ if (errorData.message) {
283
+ errorMessage = errorData.message;
284
+ }
285
+ else if (errorData.error) {
286
+ errorMessage = errorData.error;
287
+ }
288
+ else if (errorData.detail) {
289
+ errorMessage = errorData.detail;
290
+ }
291
+ }
292
+ catch (e) {
293
+ if (errorText) {
294
+ errorMessage = `${errorMessage}: ${errorText}`;
295
+ }
296
+ }
297
+ throw new Error(errorMessage);
298
+ }
299
+ const connectionData = await response.json();
300
+ // Capture character_session_id from connection response
301
+ if (connectionData.character_session_id) {
302
+ this._characterSessionId = connectionData.character_session_id;
303
+ }
304
+ // Connect to LiveKit room
305
+ await this._room.connect(connectionData.room_url, connectionData.token, {
306
+ rtcConfig: {
307
+ iceTransportPolicy: "relay",
308
+ },
309
+ });
310
+ // Always enable microphone with fixed audio settings
311
+ await this._room.localParticipant.setMicrophoneEnabled(true, {
312
+ echoCancellation: this._audioSettings.echoCancellation,
313
+ noiseSuppression: this._audioSettings.noiseSuppression,
314
+ autoGainControl: this._audioSettings.autoGainControl,
315
+ sampleRate: this._audioSettings.sampleRate,
316
+ channelCount: this._audioSettings.channelCount,
317
+ });
318
+ // Enable camera only if enableVideo is true AND startWithVideoOn is true
319
+ if (configWithDefaults.enableVideo && configWithDefaults.startWithVideoOn) {
320
+ await this._room.localParticipant.setCameraEnabled(true);
321
+ }
322
+ // Capture participant SID
323
+ this._participantSid = this._room.localParticipant.sid;
324
+ this.updateState({
325
+ isConnected: true,
326
+ isConnecting: false,
327
+ });
328
+ this.emit('connect');
329
+ }
330
+ catch (error) {
331
+ logger.error("Connection failed:", error);
332
+ this.updateState({
333
+ isConnected: false,
334
+ isConnecting: false,
335
+ });
336
+ this.emit('error', error);
337
+ throw error;
338
+ }
339
+ }
340
+ /**
341
+ * Disconnect from the current character session
342
+ */
343
+ async disconnect() {
344
+ if (this._room && this._room.state !== "disconnected") {
345
+ try {
346
+ await this._room.disconnect();
347
+ this.resetConnectionState();
348
+ }
349
+ catch (error) {
350
+ // Handle disconnect errors gracefully
351
+ if (!(error instanceof Error && error.message.includes("disconnect"))) {
352
+ logger.error("Disconnect error:", error);
353
+ }
354
+ this.resetConnectionState();
355
+ }
356
+ }
357
+ }
358
+ /**
359
+ * Reset connection state
360
+ */
361
+ resetConnectionState() {
362
+ this.updateState({
363
+ isConnected: false,
364
+ isConnecting: false,
365
+ isSpeaking: false,
366
+ isThinking: false,
367
+ isListening: false,
368
+ });
369
+ this._isBotReady = false;
370
+ this._connectionType = null;
371
+ this._apiKey = null;
372
+ this._characterId = null;
373
+ this._speakerId = null;
374
+ this._messageHandler.reset();
375
+ this._audioManager.reset();
376
+ this._videoManager.reset();
377
+ this._screenShareManager.reset();
378
+ }
379
+ /**
380
+ * Reconnect - disconnect and connect again using stored config
381
+ */
382
+ async reconnect() {
383
+ if (!this._storedConfig) {
384
+ throw new Error("No stored config available for reconnection");
385
+ }
386
+ await this.disconnect();
387
+ await this.connect(this._storedConfig);
388
+ }
389
+ /**
390
+ * Reset the session ID to start a new conversation
391
+ */
392
+ resetSession() {
393
+ this._characterSessionId = "-1";
394
+ this._messageHandler.reset();
395
+ }
396
+ /**
397
+ * Send a text message to the character
398
+ */
399
+ sendUserTextMessage(text) {
400
+ if (!this._room || this._room.state === 'disconnected' || !this._room.localParticipant) {
401
+ logger.warn('Cannot send message: not connected');
402
+ return;
403
+ }
404
+ if (!text || !text.trim()) {
405
+ return;
406
+ }
407
+ try {
408
+ const message = {
409
+ type: "user_text_message",
410
+ data: {
411
+ text: text.trim(),
412
+ participant_sid: this._participantSid || this._room.localParticipant.sid,
413
+ },
414
+ };
415
+ const encodedData = new TextEncoder().encode(JSON.stringify(message));
416
+ this._room.localParticipant.publishData(encodedData, {
417
+ reliable: true,
418
+ });
419
+ }
420
+ catch (error) {
421
+ logger.error("Failed to send user text message:", error);
422
+ throw error;
423
+ }
424
+ }
425
+ /**
426
+ * Send a trigger message to invoke specific character actions
427
+ */
428
+ sendTriggerMessage(triggerName, triggerMessage) {
429
+ if (this._room && this._room.localParticipant) {
430
+ const message = {
431
+ type: "trigger-message",
432
+ data: {
433
+ ...(triggerName && { trigger_name: triggerName }),
434
+ ...(triggerMessage && { trigger_message: triggerMessage }),
435
+ participant_sid: this._participantSid || this._room.localParticipant.sid,
436
+ },
437
+ };
438
+ const encodedData = new TextEncoder().encode(JSON.stringify(message));
439
+ this._room.localParticipant.publishData(encodedData, {
440
+ reliable: true,
441
+ });
442
+ }
443
+ }
444
+ /**
445
+ * Update template keys in the character's context
446
+ */
447
+ updateTemplateKeys(templateKeys) {
448
+ if (this._room &&
449
+ this._room.localParticipant &&
450
+ Object.keys(templateKeys).length > 0) {
451
+ const message = {
452
+ type: "update-template-keys",
453
+ data: {
454
+ template_keys: templateKeys,
455
+ participant_sid: this._participantSid || this._room.localParticipant.sid,
456
+ },
457
+ };
458
+ const encodedData = new TextEncoder().encode(JSON.stringify(message));
459
+ this._room.localParticipant.publishData(encodedData, {
460
+ reliable: true,
461
+ });
462
+ }
463
+ }
464
+ /**
465
+ * Update dynamic information about the current context
466
+ */
467
+ updateDynamicInfo(dynamicInfo) {
468
+ if (this._room && this._room.localParticipant && dynamicInfo.text?.trim()) {
469
+ const message = {
470
+ type: "update-dynamic-info",
471
+ data: {
472
+ dynamic_info: {
473
+ text: dynamicInfo.text.trim(),
474
+ },
475
+ participant_sid: this._participantSid || this._room.localParticipant.sid,
476
+ },
477
+ };
478
+ const encodedData = new TextEncoder().encode(JSON.stringify(message));
479
+ this._room.localParticipant.publishData(encodedData, {
480
+ reliable: true,
481
+ });
482
+ }
483
+ }
484
+ /**
485
+ * Toggle text-to-speech on or off
486
+ */
487
+ toggleTts(enabled) {
488
+ if (!this._room || this._room.state === 'disconnected' || !this._room.localParticipant) {
489
+ return;
490
+ }
491
+ try {
492
+ const message = {
493
+ type: "tts-toggle",
494
+ data: {
495
+ "enabled": enabled
496
+ }
497
+ };
498
+ const encodedData = new TextEncoder().encode(JSON.stringify(message));
499
+ this._room.localParticipant.publishData(encodedData, {
500
+ reliable: true,
501
+ });
502
+ }
503
+ catch (error) {
504
+ logger.error("Failed to toggle TTS:", error);
505
+ throw error;
506
+ }
507
+ }
508
+ }
509
+ //# sourceMappingURL=ConvaiClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConvaiClient.js","sourceRoot":"","sources":["../../src/core/ConvaiClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Simple event emitter for state change notifications
3
+ * Allows subscribers to listen for state changes without React dependencies
4
+ */
5
+ export type EventCallback = (...args: any[]) => void;
6
+ export declare class EventEmitter {
7
+ private events;
8
+ /**
9
+ * Subscribe to an event
10
+ * @param event Event name
11
+ * @param callback Callback function
12
+ * @returns Unsubscribe function
13
+ */
14
+ on(event: string, callback: EventCallback): () => void;
15
+ /**
16
+ * Unsubscribe from an event
17
+ * @param event Event name
18
+ * @param callback Callback function to remove
19
+ */
20
+ off(event: string, callback: EventCallback): void;
21
+ /**
22
+ * Emit an event to all subscribers
23
+ * @param event Event name
24
+ * @param args Arguments to pass to callbacks
25
+ */
26
+ emit(event: string, ...args: any[]): void;
27
+ /**
28
+ * Remove all event listeners
29
+ */
30
+ removeAllListeners(): void;
31
+ /**
32
+ * Get the number of listeners for an event
33
+ * @param event Event name
34
+ * @returns Number of listeners
35
+ */
36
+ listenerCount(event: string): number;
37
+ }
38
+ //# sourceMappingURL=EventEmitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventEmitter.d.ts","sourceRoot":"","sources":["../../src/core/EventEmitter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;AAErD,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA8C;IAE5D;;;;;OAKG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,IAAI;IAatD;;;;OAIG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAUjD;;;;OAIG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAazC;;OAEG;IACH,kBAAkB,IAAI,IAAI;IAI1B;;;;OAIG;IACH,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAGrC"}
@@ -0,0 +1,68 @@
1
+ export class EventEmitter {
2
+ constructor() {
3
+ this.events = new Map();
4
+ }
5
+ /**
6
+ * Subscribe to an event
7
+ * @param event Event name
8
+ * @param callback Callback function
9
+ * @returns Unsubscribe function
10
+ */
11
+ on(event, callback) {
12
+ if (!this.events.has(event)) {
13
+ this.events.set(event, new Set());
14
+ }
15
+ this.events.get(event).add(callback);
16
+ // Return unsubscribe function
17
+ return () => {
18
+ this.off(event, callback);
19
+ };
20
+ }
21
+ /**
22
+ * Unsubscribe from an event
23
+ * @param event Event name
24
+ * @param callback Callback function to remove
25
+ */
26
+ off(event, callback) {
27
+ const callbacks = this.events.get(event);
28
+ if (callbacks) {
29
+ callbacks.delete(callback);
30
+ if (callbacks.size === 0) {
31
+ this.events.delete(event);
32
+ }
33
+ }
34
+ }
35
+ /**
36
+ * Emit an event to all subscribers
37
+ * @param event Event name
38
+ * @param args Arguments to pass to callbacks
39
+ */
40
+ emit(event, ...args) {
41
+ const callbacks = this.events.get(event);
42
+ if (callbacks) {
43
+ callbacks.forEach((callback) => {
44
+ try {
45
+ callback(...args);
46
+ }
47
+ catch (error) {
48
+ console.error(`Error in event handler for "${event}":`, error);
49
+ }
50
+ });
51
+ }
52
+ }
53
+ /**
54
+ * Remove all event listeners
55
+ */
56
+ removeAllListeners() {
57
+ this.events.clear();
58
+ }
59
+ /**
60
+ * Get the number of listeners for an event
61
+ * @param event Event name
62
+ * @returns Number of listeners
63
+ */
64
+ listenerCount(event) {
65
+ return this.events.get(event)?.size ?? 0;
66
+ }
67
+ }
68
+ //# sourceMappingURL=EventEmitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventEmitter.js","sourceRoot":"","sources":["../../src/core/EventEmitter.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,YAAY;IAAzB;QACU,WAAM,GAAoC,IAAI,GAAG,EAAE,CAAC;IAqE9D,CAAC;IAnEC;;;;;OAKG;IACH,EAAE,CAAC,KAAa,EAAE,QAAuB;QACvC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACpC,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEtC,8BAA8B;QAC9B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC5B,CAAC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAC,KAAa,EAAE,QAAuB;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3B,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,IAAI,CAAC,KAAa,EAAE,GAAG,IAAW;QAChC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC7B,IAAI,CAAC;oBACH,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;gBACpB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,KAAK,IAAI,EAAE,KAAK,CAAC,CAAC;gBACjE,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,KAAa;QACzB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;IAC3C,CAAC;CACF"}