@convai/web-sdk 0.1.0 → 0.1.1-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) 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 +514 -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/useAudioControls.d.ts.map +1 -1
  43. package/dist/hooks/useAudioControls.js +9 -1
  44. package/dist/hooks/useAudioControls.js.map +1 -1
  45. package/dist/hooks/useConvaiClient.d.ts.map +1 -1
  46. package/dist/hooks/useConvaiClient.js +32 -8
  47. package/dist/hooks/useConvaiClient.js.map +1 -1
  48. package/dist/hooks/useMessageHandler.d.ts.map +1 -1
  49. package/dist/hooks/useMessageHandler.js +39 -14
  50. package/dist/hooks/useMessageHandler.js.map +1 -1
  51. package/dist/index.d.ts +1 -5
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +3 -10
  54. package/dist/index.js.map +1 -1
  55. package/dist/react/components/ConvaiWidget.d.ts +59 -0
  56. package/dist/react/components/ConvaiWidget.d.ts.map +1 -0
  57. package/dist/react/components/ConvaiWidget.js +421 -0
  58. package/dist/react/components/ConvaiWidget.js.map +1 -0
  59. package/dist/react/components/index.d.ts +3 -0
  60. package/dist/react/components/index.d.ts.map +1 -0
  61. package/dist/react/components/index.js +5 -0
  62. package/dist/react/components/index.js.map +1 -0
  63. package/dist/react/components/rtc-widget/components/AudioSettingsPanel.d.ts +10 -0
  64. package/dist/react/components/rtc-widget/components/AudioSettingsPanel.d.ts.map +1 -0
  65. package/dist/react/components/rtc-widget/components/AudioSettingsPanel.js +316 -0
  66. package/dist/react/components/rtc-widget/components/AudioSettingsPanel.js.map +1 -0
  67. package/dist/react/components/rtc-widget/components/ConviMessage.d.ts +10 -0
  68. package/dist/react/components/rtc-widget/components/ConviMessage.d.ts.map +1 -0
  69. package/dist/react/components/rtc-widget/components/ConviMessage.js +14 -0
  70. package/dist/react/components/rtc-widget/components/ConviMessage.js.map +1 -0
  71. package/dist/react/components/rtc-widget/components/FloatingVideo.d.ts +9 -0
  72. package/dist/react/components/rtc-widget/components/FloatingVideo.d.ts.map +1 -0
  73. package/dist/react/components/rtc-widget/components/FloatingVideo.js +122 -0
  74. package/dist/react/components/rtc-widget/components/FloatingVideo.js.map +1 -0
  75. package/dist/react/components/rtc-widget/components/MarkdownRenderer.d.ts +7 -0
  76. package/dist/react/components/rtc-widget/components/MarkdownRenderer.d.ts.map +1 -0
  77. package/dist/react/components/rtc-widget/components/MarkdownRenderer.js +68 -0
  78. package/dist/react/components/rtc-widget/components/MarkdownRenderer.js.map +1 -0
  79. package/dist/react/components/rtc-widget/components/MessageBubble.d.ts +10 -0
  80. package/dist/react/components/rtc-widget/components/MessageBubble.d.ts.map +1 -0
  81. package/dist/react/components/rtc-widget/components/MessageBubble.js +23 -0
  82. package/dist/react/components/rtc-widget/components/MessageBubble.js.map +1 -0
  83. package/dist/react/components/rtc-widget/components/MessageList.d.ts +11 -0
  84. package/dist/react/components/rtc-widget/components/MessageList.d.ts.map +1 -0
  85. package/dist/react/components/rtc-widget/components/MessageList.js +89 -0
  86. package/dist/react/components/rtc-widget/components/MessageList.js.map +1 -0
  87. package/dist/react/components/rtc-widget/components/UserMessage.d.ts +9 -0
  88. package/dist/react/components/rtc-widget/components/UserMessage.d.ts.map +1 -0
  89. package/dist/react/components/rtc-widget/components/UserMessage.js +15 -0
  90. package/dist/react/components/rtc-widget/components/UserMessage.js.map +1 -0
  91. package/dist/react/components/rtc-widget/components/conviComponents/ConviButton.d.ts +6 -0
  92. package/dist/react/components/rtc-widget/components/conviComponents/ConviButton.d.ts.map +1 -0
  93. package/dist/react/components/rtc-widget/components/conviComponents/ConviButton.js +15 -0
  94. package/dist/react/components/rtc-widget/components/conviComponents/ConviButton.js.map +1 -0
  95. package/dist/react/components/rtc-widget/components/conviComponents/ConviFooter.d.ts +25 -0
  96. package/dist/react/components/rtc-widget/components/conviComponents/ConviFooter.d.ts.map +1 -0
  97. package/dist/react/components/rtc-widget/components/conviComponents/ConviFooter.js +172 -0
  98. package/dist/react/components/rtc-widget/components/conviComponents/ConviFooter.js.map +1 -0
  99. package/dist/react/components/rtc-widget/components/conviComponents/ConviHeader.d.ts +17 -0
  100. package/dist/react/components/rtc-widget/components/conviComponents/ConviHeader.d.ts.map +1 -0
  101. package/dist/react/components/rtc-widget/components/conviComponents/ConviHeader.js +66 -0
  102. package/dist/react/components/rtc-widget/components/conviComponents/ConviHeader.js.map +1 -0
  103. package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.d.ts +12 -0
  104. package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.d.ts.map +1 -0
  105. package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.js +68 -0
  106. package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.js.map +1 -0
  107. package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.d.ts +8 -0
  108. package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.d.ts.map +1 -0
  109. package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.js +199 -0
  110. package/dist/react/components/rtc-widget/components/conviComponents/VoiceModeOverlay.js.map +1 -0
  111. package/dist/react/components/rtc-widget/components/conviComponents/index.d.ts +6 -0
  112. package/dist/react/components/rtc-widget/components/conviComponents/index.d.ts.map +1 -0
  113. package/dist/react/components/rtc-widget/components/conviComponents/index.js +6 -0
  114. package/dist/react/components/rtc-widget/components/conviComponents/index.js.map +1 -0
  115. package/dist/react/components/rtc-widget/components/index.d.ts +8 -0
  116. package/dist/react/components/rtc-widget/components/index.d.ts.map +1 -0
  117. package/dist/react/components/rtc-widget/components/index.js +13 -0
  118. package/dist/react/components/rtc-widget/components/index.js.map +1 -0
  119. package/dist/react/components/rtc-widget/index.d.ts +6 -0
  120. package/dist/react/components/rtc-widget/index.d.ts.map +1 -0
  121. package/dist/react/components/rtc-widget/index.js +9 -0
  122. package/dist/react/components/rtc-widget/index.js.map +1 -0
  123. package/dist/react/components/rtc-widget/styles/framerConfig.d.ts +116 -0
  124. package/dist/react/components/rtc-widget/styles/framerConfig.d.ts.map +1 -0
  125. package/dist/react/components/rtc-widget/styles/framerConfig.js +73 -0
  126. package/dist/react/components/rtc-widget/styles/framerConfig.js.map +1 -0
  127. package/dist/react/components/rtc-widget/styles/icons.d.ts +28 -0
  128. package/dist/react/components/rtc-widget/styles/icons.d.ts.map +1 -0
  129. package/dist/react/components/rtc-widget/styles/icons.js +257 -0
  130. package/dist/react/components/rtc-widget/styles/icons.js.map +1 -0
  131. package/dist/react/components/rtc-widget/styles/index.d.ts +6 -0
  132. package/dist/react/components/rtc-widget/styles/index.d.ts.map +1 -0
  133. package/dist/react/components/rtc-widget/styles/index.js +9 -0
  134. package/dist/react/components/rtc-widget/styles/index.js.map +1 -0
  135. package/dist/react/components/rtc-widget/styles/styledComponents.d.ts +90 -0
  136. package/dist/react/components/rtc-widget/styles/styledComponents.d.ts.map +1 -0
  137. package/dist/react/components/rtc-widget/styles/styledComponents.js +661 -0
  138. package/dist/react/components/rtc-widget/styles/styledComponents.js.map +1 -0
  139. package/dist/react/components/rtc-widget/styles/theme.d.ts +188 -0
  140. package/dist/react/components/rtc-widget/styles/theme.d.ts.map +1 -0
  141. package/dist/react/components/rtc-widget/styles/theme.js +290 -0
  142. package/dist/react/components/rtc-widget/styles/theme.js.map +1 -0
  143. package/dist/react/components/rtc-widget/types/index.d.ts +60 -0
  144. package/dist/react/components/rtc-widget/types/index.d.ts.map +1 -0
  145. package/dist/react/components/rtc-widget/types/index.js +2 -0
  146. package/dist/react/components/rtc-widget/types/index.js.map +1 -0
  147. package/dist/react/hooks/index.d.ts +4 -0
  148. package/dist/react/hooks/index.d.ts.map +1 -0
  149. package/dist/react/hooks/index.js +6 -0
  150. package/dist/react/hooks/index.js.map +1 -0
  151. package/dist/react/hooks/useCharacterInfo.d.ts +17 -0
  152. package/dist/react/hooks/useCharacterInfo.d.ts.map +1 -0
  153. package/dist/react/hooks/useCharacterInfo.js +60 -0
  154. package/dist/react/hooks/useCharacterInfo.js.map +1 -0
  155. package/dist/react/hooks/useConvaiClient.d.ts +32 -0
  156. package/dist/react/hooks/useConvaiClient.d.ts.map +1 -0
  157. package/dist/react/hooks/useConvaiClient.js +140 -0
  158. package/dist/react/hooks/useConvaiClient.js.map +1 -0
  159. package/dist/react/hooks/useLocalCameraTrack.d.ts +22 -0
  160. package/dist/react/hooks/useLocalCameraTrack.d.ts.map +1 -0
  161. package/dist/react/hooks/useLocalCameraTrack.js +34 -0
  162. package/dist/react/hooks/useLocalCameraTrack.js.map +1 -0
  163. package/dist/react/index.d.ts +8 -0
  164. package/dist/react/index.d.ts.map +1 -0
  165. package/dist/react/index.js +15 -0
  166. package/dist/react/index.js.map +1 -0
  167. package/dist/types/index.d.ts +26 -0
  168. package/dist/types/index.d.ts.map +1 -1
  169. package/dist/utils/speakerManagement.d.ts +22 -0
  170. package/dist/utils/speakerManagement.d.ts.map +1 -0
  171. package/dist/utils/speakerManagement.js +69 -0
  172. package/dist/utils/speakerManagement.js.map +1 -0
  173. package/dist/vanilla/index.d.ts +3 -0
  174. package/dist/vanilla/index.d.ts.map +1 -0
  175. package/dist/vanilla/index.js +5 -0
  176. package/dist/vanilla/index.js.map +1 -0
  177. package/package.json +22 -5
@@ -0,0 +1,514 @@
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
+ if (resolvedSpeakerId) {
246
+ logger.info(`Speaker ID resolved: ${resolvedSpeakerId.substring(0, 8)}...`);
247
+ }
248
+ else {
249
+ logger.info('No speaker ID - connecting without persistent memory');
250
+ }
251
+ // Determine connection type based on enableVideo
252
+ const connType = configWithDefaults.enableVideo ? "video" : "audio";
253
+ this._connectionType = connType;
254
+ // Prepare request body with required parameters
255
+ const requestBody = {
256
+ character_id: configWithDefaults.characterId,
257
+ ...(resolvedSpeakerId && { speaker_id: resolvedSpeakerId }),
258
+ transport: "livekit",
259
+ connection_type: connType,
260
+ llm_provider: "dynamic",
261
+ default_tts_enabled: configWithDefaults.ttsEnabled !== undefined ? configWithDefaults.ttsEnabled : true,
262
+ ...(this._characterSessionId &&
263
+ this._characterSessionId !== "-1" && {
264
+ character_session_id: this._characterSessionId,
265
+ }),
266
+ ...(configWithDefaults.actionConfig && { action_config: configWithDefaults.actionConfig }),
267
+ };
268
+ // Call Core Service API
269
+ const response = await fetch(`${configWithDefaults.url}/connect`, {
270
+ method: "POST",
271
+ headers: {
272
+ "x-api-key": configWithDefaults.apiKey,
273
+ "Content-Type": "application/json",
274
+ },
275
+ body: JSON.stringify(requestBody),
276
+ });
277
+ if (!response.ok) {
278
+ const errorText = await response.text();
279
+ logger.error("API Error Response:", {
280
+ status: response.status,
281
+ statusText: response.statusText,
282
+ body: errorText,
283
+ });
284
+ let errorMessage = `HTTP error! status: ${response.status}`;
285
+ try {
286
+ const errorData = JSON.parse(errorText);
287
+ if (errorData.message) {
288
+ errorMessage = errorData.message;
289
+ }
290
+ else if (errorData.error) {
291
+ errorMessage = errorData.error;
292
+ }
293
+ else if (errorData.detail) {
294
+ errorMessage = errorData.detail;
295
+ }
296
+ }
297
+ catch (e) {
298
+ if (errorText) {
299
+ errorMessage = `${errorMessage}: ${errorText}`;
300
+ }
301
+ }
302
+ throw new Error(errorMessage);
303
+ }
304
+ const connectionData = await response.json();
305
+ // Capture character_session_id from connection response
306
+ if (connectionData.character_session_id) {
307
+ this._characterSessionId = connectionData.character_session_id;
308
+ }
309
+ // Connect to LiveKit room
310
+ await this._room.connect(connectionData.room_url, connectionData.token, {
311
+ rtcConfig: {
312
+ iceTransportPolicy: "relay",
313
+ },
314
+ });
315
+ // Always enable microphone with fixed audio settings
316
+ await this._room.localParticipant.setMicrophoneEnabled(true, {
317
+ echoCancellation: this._audioSettings.echoCancellation,
318
+ noiseSuppression: this._audioSettings.noiseSuppression,
319
+ autoGainControl: this._audioSettings.autoGainControl,
320
+ sampleRate: this._audioSettings.sampleRate,
321
+ channelCount: this._audioSettings.channelCount,
322
+ });
323
+ // Enable camera only if enableVideo is true AND startWithVideoOn is true
324
+ if (configWithDefaults.enableVideo && configWithDefaults.startWithVideoOn) {
325
+ await this._room.localParticipant.setCameraEnabled(true);
326
+ }
327
+ // Capture participant SID
328
+ this._participantSid = this._room.localParticipant.sid;
329
+ this.updateState({
330
+ isConnected: true,
331
+ isConnecting: false,
332
+ });
333
+ this.emit('connect');
334
+ }
335
+ catch (error) {
336
+ logger.error("Connection failed:", error);
337
+ this.updateState({
338
+ isConnected: false,
339
+ isConnecting: false,
340
+ });
341
+ this.emit('error', error);
342
+ throw error;
343
+ }
344
+ }
345
+ /**
346
+ * Disconnect from the current character session
347
+ */
348
+ async disconnect() {
349
+ if (this._room && this._room.state !== "disconnected") {
350
+ try {
351
+ await this._room.disconnect();
352
+ this.resetConnectionState();
353
+ }
354
+ catch (error) {
355
+ // Handle disconnect errors gracefully
356
+ if (!(error instanceof Error && error.message.includes("disconnect"))) {
357
+ logger.error("Disconnect error:", error);
358
+ }
359
+ this.resetConnectionState();
360
+ }
361
+ }
362
+ }
363
+ /**
364
+ * Reset connection state
365
+ */
366
+ resetConnectionState() {
367
+ this.updateState({
368
+ isConnected: false,
369
+ isConnecting: false,
370
+ isSpeaking: false,
371
+ isThinking: false,
372
+ isListening: false,
373
+ });
374
+ this._isBotReady = false;
375
+ this._connectionType = null;
376
+ this._apiKey = null;
377
+ this._characterId = null;
378
+ this._speakerId = null;
379
+ this._messageHandler.reset();
380
+ this._audioManager.reset();
381
+ this._videoManager.reset();
382
+ this._screenShareManager.reset();
383
+ }
384
+ /**
385
+ * Reconnect - disconnect and connect again using stored config
386
+ */
387
+ async reconnect() {
388
+ if (!this._storedConfig) {
389
+ throw new Error("No stored config available for reconnection");
390
+ }
391
+ await this.disconnect();
392
+ await this.connect(this._storedConfig);
393
+ }
394
+ /**
395
+ * Reset the session ID to start a new conversation
396
+ */
397
+ resetSession() {
398
+ this._characterSessionId = "-1";
399
+ this._messageHandler.reset();
400
+ }
401
+ /**
402
+ * Send a text message to the character
403
+ */
404
+ sendUserTextMessage(text) {
405
+ if (!this._room || this._room.state === 'disconnected' || !this._room.localParticipant) {
406
+ logger.warn('Cannot send message: not connected');
407
+ return;
408
+ }
409
+ if (!text || !text.trim()) {
410
+ return;
411
+ }
412
+ try {
413
+ const message = {
414
+ type: "user_text_message",
415
+ data: {
416
+ text: text.trim(),
417
+ participant_sid: this._participantSid || this._room.localParticipant.sid,
418
+ },
419
+ };
420
+ const encodedData = new TextEncoder().encode(JSON.stringify(message));
421
+ this._room.localParticipant.publishData(encodedData, {
422
+ reliable: true,
423
+ });
424
+ }
425
+ catch (error) {
426
+ logger.error("Failed to send user text message:", error);
427
+ throw error;
428
+ }
429
+ }
430
+ /**
431
+ * Send a trigger message to invoke specific character actions
432
+ */
433
+ sendTriggerMessage(triggerName, triggerMessage) {
434
+ if (this._room && this._room.localParticipant) {
435
+ const message = {
436
+ type: "trigger-message",
437
+ data: {
438
+ ...(triggerName && { trigger_name: triggerName }),
439
+ ...(triggerMessage && { trigger_message: triggerMessage }),
440
+ participant_sid: this._participantSid || this._room.localParticipant.sid,
441
+ },
442
+ };
443
+ const encodedData = new TextEncoder().encode(JSON.stringify(message));
444
+ this._room.localParticipant.publishData(encodedData, {
445
+ reliable: true,
446
+ });
447
+ }
448
+ }
449
+ /**
450
+ * Update template keys in the character's context
451
+ */
452
+ updateTemplateKeys(templateKeys) {
453
+ if (this._room &&
454
+ this._room.localParticipant &&
455
+ Object.keys(templateKeys).length > 0) {
456
+ const message = {
457
+ type: "update-template-keys",
458
+ data: {
459
+ template_keys: templateKeys,
460
+ participant_sid: this._participantSid || this._room.localParticipant.sid,
461
+ },
462
+ };
463
+ const encodedData = new TextEncoder().encode(JSON.stringify(message));
464
+ this._room.localParticipant.publishData(encodedData, {
465
+ reliable: true,
466
+ });
467
+ }
468
+ }
469
+ /**
470
+ * Update dynamic information about the current context
471
+ */
472
+ updateDynamicInfo(dynamicInfo) {
473
+ if (this._room && this._room.localParticipant && dynamicInfo.text?.trim()) {
474
+ const message = {
475
+ type: "update-dynamic-info",
476
+ data: {
477
+ dynamic_info: {
478
+ text: dynamicInfo.text.trim(),
479
+ },
480
+ participant_sid: this._participantSid || this._room.localParticipant.sid,
481
+ },
482
+ };
483
+ const encodedData = new TextEncoder().encode(JSON.stringify(message));
484
+ this._room.localParticipant.publishData(encodedData, {
485
+ reliable: true,
486
+ });
487
+ }
488
+ }
489
+ /**
490
+ * Toggle text-to-speech on or off
491
+ */
492
+ toggleTts(enabled) {
493
+ if (!this._room || this._room.state === 'disconnected' || !this._room.localParticipant) {
494
+ return;
495
+ }
496
+ try {
497
+ const message = {
498
+ type: "tts-toggle",
499
+ data: {
500
+ "enabled": enabled
501
+ }
502
+ };
503
+ const encodedData = new TextEncoder().encode(JSON.stringify(message));
504
+ this._room.localParticipant.publishData(encodedData, {
505
+ reliable: true,
506
+ });
507
+ }
508
+ catch (error) {
509
+ logger.error("Failed to toggle TTS:", error);
510
+ throw error;
511
+ }
512
+ }
513
+ }
514
+ //# 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"}