@elevenlabs/react 0.14.2 → 1.0.0-rc.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 (83) hide show
  1. package/README.md +33 -1085
  2. package/dist/conversation/ConversationClientTools.d.ts +39 -0
  3. package/dist/conversation/ConversationClientTools.d.ts.map +1 -0
  4. package/dist/conversation/ConversationClientTools.js +87 -0
  5. package/dist/conversation/ConversationClientTools.js.map +1 -0
  6. package/dist/conversation/ConversationContext.d.ts +47 -0
  7. package/dist/conversation/ConversationContext.d.ts.map +1 -0
  8. package/dist/conversation/ConversationContext.js +61 -0
  9. package/dist/conversation/ConversationContext.js.map +1 -0
  10. package/dist/conversation/ConversationControls.d.ts +34 -0
  11. package/dist/conversation/ConversationControls.d.ts.map +1 -0
  12. package/dist/conversation/ConversationControls.js +113 -0
  13. package/dist/conversation/ConversationControls.js.map +1 -0
  14. package/dist/conversation/ConversationFeedback.d.ts +19 -0
  15. package/dist/conversation/ConversationFeedback.d.ts.map +1 -0
  16. package/dist/conversation/ConversationFeedback.js +44 -0
  17. package/dist/conversation/ConversationFeedback.js.map +1 -0
  18. package/dist/conversation/ConversationInput.d.ts +18 -0
  19. package/dist/conversation/ConversationInput.d.ts.map +1 -0
  20. package/dist/conversation/ConversationInput.js +40 -0
  21. package/dist/conversation/ConversationInput.js.map +1 -0
  22. package/dist/conversation/ConversationMode.d.ts +19 -0
  23. package/dist/conversation/ConversationMode.d.ts.map +1 -0
  24. package/dist/conversation/ConversationMode.js +40 -0
  25. package/dist/conversation/ConversationMode.js.map +1 -0
  26. package/dist/conversation/ConversationProvider.d.ts +4 -0
  27. package/dist/conversation/ConversationProvider.d.ts.map +1 -0
  28. package/dist/conversation/ConversationProvider.js +127 -0
  29. package/dist/conversation/ConversationProvider.js.map +1 -0
  30. package/dist/conversation/ConversationStatus.d.ts +19 -0
  31. package/dist/conversation/ConversationStatus.d.ts.map +1 -0
  32. package/dist/conversation/ConversationStatus.js +44 -0
  33. package/dist/conversation/ConversationStatus.js.map +1 -0
  34. package/dist/conversation/ListenerMap.d.ts +29 -0
  35. package/dist/conversation/ListenerMap.d.ts.map +1 -0
  36. package/dist/conversation/ListenerMap.js +63 -0
  37. package/dist/conversation/ListenerMap.js.map +1 -0
  38. package/dist/conversation/ListenerSet.d.ts +7 -0
  39. package/dist/conversation/ListenerSet.d.ts.map +1 -0
  40. package/dist/conversation/ListenerSet.js +17 -0
  41. package/dist/conversation/ListenerSet.js.map +1 -0
  42. package/dist/conversation/types.d.ts +9 -0
  43. package/dist/conversation/types.d.ts.map +1 -0
  44. package/dist/conversation/types.js +2 -0
  45. package/dist/conversation/types.js.map +1 -0
  46. package/dist/conversation/useConversation.d.ts +45 -0
  47. package/dist/conversation/useConversation.d.ts.map +1 -0
  48. package/dist/conversation/useConversation.js +76 -0
  49. package/dist/conversation/useConversation.js.map +1 -0
  50. package/dist/conversation/useStableCallbacks.d.ts +13 -0
  51. package/dist/conversation/useStableCallbacks.d.ts.map +1 -0
  52. package/dist/conversation/useStableCallbacks.js +33 -0
  53. package/dist/conversation/useStableCallbacks.js.map +1 -0
  54. package/dist/index.d.ts +19 -47
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +17 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/lib.iife.js +984 -0
  59. package/dist/lib.iife.js.map +1 -0
  60. package/dist/scribe.d.ts +1 -0
  61. package/dist/scribe.d.ts.map +1 -0
  62. package/dist/scribe.js +307 -0
  63. package/dist/scribe.js.map +1 -0
  64. package/dist/version.d.ts +2 -1
  65. package/dist/version.d.ts.map +1 -0
  66. package/dist/version.js +3 -0
  67. package/dist/version.js.map +1 -0
  68. package/package.json +25 -20
  69. package/.turbo/turbo-build.log +0 -29
  70. package/.turbo/turbo-check-types.log +0 -4
  71. package/.turbo/turbo-generate-version.log +0 -4
  72. package/.turbo/turbo-lint$colon$es.log +0 -6
  73. package/.turbo/turbo-lint$colon$prettier.log +0 -6
  74. package/CHANGELOG.md +0 -45
  75. package/dist/lib.cjs +0 -2
  76. package/dist/lib.cjs.map +0 -1
  77. package/dist/lib.modern.js +0 -2
  78. package/dist/lib.modern.js.map +0 -1
  79. package/dist/lib.module.js +0 -2
  80. package/dist/lib.module.js.map +0 -1
  81. package/dist/lib.umd.js +0 -2
  82. package/dist/lib.umd.js.map +0 -1
  83. package/jest.config.cjs +0 -23
@@ -0,0 +1,984 @@
1
+ var ElevenLabsReact = (function(exports, _elevenlabs_client_internal, _elevenlabs_client, react) {
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ //#region \0rolldown/runtime.js
4
+ var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
5
+ //#endregion
6
+ //#region src/version.ts
7
+ const PACKAGE_VERSION = "1.0.0-rc.0";
8
+ //#endregion
9
+ //#region src/scribe.ts
10
+ function useScribe(options = {}) {
11
+ const { onSessionStarted, onPartialTranscript, onCommittedTranscript, onCommittedTranscriptWithTimestamps, onError, onAuthError, onQuotaExceededError, onCommitThrottledError, onTranscriberError, onUnacceptedTermsError, onRateLimitedError, onInputError, onQueueOverflowError, onResourceExhaustedError, onSessionTimeLimitExceededError, onChunkSizeExceededError, onInsufficientAudioActivityError, onConnect, onDisconnect, token: defaultToken, modelId: defaultModelId, baseUri: defaultBaseUri, commitStrategy: defaultCommitStrategy, vadSilenceThresholdSecs: defaultVadSilenceThresholdSecs, vadThreshold: defaultVadThreshold, minSpeechDurationMs: defaultMinSpeechDurationMs, minSilenceDurationMs: defaultMinSilenceDurationMs, languageCode: defaultLanguageCode, microphone: defaultMicrophone, audioFormat: defaultAudioFormat, sampleRate: defaultSampleRate, autoConnect = false, includeTimestamps: defaultIncludeTimestamps } = options;
12
+ const connectionRef = (0, react.useRef)(null);
13
+ const [status, setStatus] = (0, react.useState)("disconnected");
14
+ const [partialTranscript, setPartialTranscript] = (0, react.useState)("");
15
+ const [committedTranscripts, setCommittedTranscripts] = (0, react.useState)([]);
16
+ const [error, setError] = (0, react.useState)(null);
17
+ (0, react.useEffect)(() => {
18
+ return () => {
19
+ connectionRef.current?.close();
20
+ };
21
+ }, []);
22
+ const connect = (0, react.useCallback)(async (runtimeOptions = {}) => {
23
+ if (connectionRef.current) {
24
+ console.warn("Already connected");
25
+ return;
26
+ }
27
+ try {
28
+ setStatus("connecting");
29
+ setError(null);
30
+ const token = runtimeOptions.token || defaultToken;
31
+ const modelId = runtimeOptions.modelId || defaultModelId;
32
+ if (!token) throw new Error("Token is required");
33
+ if (!modelId) throw new Error("Model ID is required");
34
+ const microphone = runtimeOptions.microphone || defaultMicrophone;
35
+ const audioFormat = runtimeOptions.audioFormat || defaultAudioFormat;
36
+ const sampleRate = runtimeOptions.sampleRate || defaultSampleRate;
37
+ let connection;
38
+ const includeTimestamps = runtimeOptions.includeTimestamps ?? defaultIncludeTimestamps ?? !!(runtimeOptions.onCommittedTranscriptWithTimestamps || onCommittedTranscriptWithTimestamps);
39
+ if (microphone) connection = _elevenlabs_client.Scribe.connect({
40
+ token,
41
+ modelId,
42
+ baseUri: runtimeOptions.baseUri || defaultBaseUri,
43
+ commitStrategy: runtimeOptions.commitStrategy || defaultCommitStrategy,
44
+ vadSilenceThresholdSecs: runtimeOptions.vadSilenceThresholdSecs || defaultVadSilenceThresholdSecs,
45
+ vadThreshold: runtimeOptions.vadThreshold || defaultVadThreshold,
46
+ minSpeechDurationMs: runtimeOptions.minSpeechDurationMs || defaultMinSpeechDurationMs,
47
+ minSilenceDurationMs: runtimeOptions.minSilenceDurationMs || defaultMinSilenceDurationMs,
48
+ languageCode: runtimeOptions.languageCode || defaultLanguageCode,
49
+ microphone,
50
+ includeTimestamps
51
+ });
52
+ else if (audioFormat && sampleRate) connection = _elevenlabs_client.Scribe.connect({
53
+ token,
54
+ modelId,
55
+ baseUri: runtimeOptions.baseUri || defaultBaseUri,
56
+ commitStrategy: runtimeOptions.commitStrategy || defaultCommitStrategy,
57
+ vadSilenceThresholdSecs: runtimeOptions.vadSilenceThresholdSecs || defaultVadSilenceThresholdSecs,
58
+ vadThreshold: runtimeOptions.vadThreshold || defaultVadThreshold,
59
+ minSpeechDurationMs: runtimeOptions.minSpeechDurationMs || defaultMinSpeechDurationMs,
60
+ minSilenceDurationMs: runtimeOptions.minSilenceDurationMs || defaultMinSilenceDurationMs,
61
+ languageCode: runtimeOptions.languageCode || defaultLanguageCode,
62
+ includeTimestamps,
63
+ audioFormat,
64
+ sampleRate
65
+ });
66
+ else throw new Error("Either microphone options or (audioFormat + sampleRate) must be provided");
67
+ connectionRef.current = connection;
68
+ connection.on(_elevenlabs_client.RealtimeEvents.SESSION_STARTED, () => {
69
+ setStatus("connected");
70
+ onSessionStarted?.();
71
+ });
72
+ connection.on(_elevenlabs_client.RealtimeEvents.PARTIAL_TRANSCRIPT, (data) => {
73
+ const message = data;
74
+ setPartialTranscript(message.text);
75
+ setStatus("transcribing");
76
+ onPartialTranscript?.(message);
77
+ });
78
+ connection.on(_elevenlabs_client.RealtimeEvents.COMMITTED_TRANSCRIPT, (data) => {
79
+ const message = data;
80
+ const segment = {
81
+ id: `${Date.now()}-${Math.random()}`,
82
+ text: message.text,
83
+ timestamp: Date.now(),
84
+ isFinal: true
85
+ };
86
+ setCommittedTranscripts((prev) => [...prev, segment]);
87
+ setPartialTranscript("");
88
+ onCommittedTranscript?.(message);
89
+ });
90
+ connection.on(_elevenlabs_client.RealtimeEvents.COMMITTED_TRANSCRIPT_WITH_TIMESTAMPS, (data) => {
91
+ const message = data;
92
+ const segment = {
93
+ id: `${Date.now()}-${Math.random()}`,
94
+ text: message.text,
95
+ timestamp: Date.now(),
96
+ isFinal: true,
97
+ words: message.words
98
+ };
99
+ setCommittedTranscripts((prev) => [...prev, segment]);
100
+ setPartialTranscript("");
101
+ onCommittedTranscriptWithTimestamps?.(message);
102
+ });
103
+ connection.on(_elevenlabs_client.RealtimeEvents.ERROR, (err) => {
104
+ const message = err;
105
+ setError(message.error);
106
+ setStatus("error");
107
+ onError?.(new Error(message.error));
108
+ });
109
+ connection.on(_elevenlabs_client.RealtimeEvents.AUTH_ERROR, (data) => {
110
+ const message = data;
111
+ setError(message.error);
112
+ setStatus("error");
113
+ onAuthError?.(message);
114
+ });
115
+ connection.on(_elevenlabs_client.RealtimeEvents.QUOTA_EXCEEDED, (data) => {
116
+ const message = data;
117
+ setError(message.error);
118
+ setStatus("error");
119
+ onQuotaExceededError?.(message);
120
+ });
121
+ connection.on(_elevenlabs_client.RealtimeEvents.COMMIT_THROTTLED, (data) => {
122
+ const message = data;
123
+ setError(message.error);
124
+ setStatus("error");
125
+ onCommitThrottledError?.(message);
126
+ });
127
+ connection.on(_elevenlabs_client.RealtimeEvents.TRANSCRIBER_ERROR, (data) => {
128
+ const message = data;
129
+ setError(message.error);
130
+ setStatus("error");
131
+ onTranscriberError?.(message);
132
+ });
133
+ connection.on(_elevenlabs_client.RealtimeEvents.UNACCEPTED_TERMS, (data) => {
134
+ const message = data;
135
+ setError(message.error);
136
+ setStatus("error");
137
+ onUnacceptedTermsError?.(message);
138
+ });
139
+ connection.on(_elevenlabs_client.RealtimeEvents.RATE_LIMITED, (data) => {
140
+ const message = data;
141
+ setError(message.error);
142
+ setStatus("error");
143
+ onRateLimitedError?.(message);
144
+ });
145
+ connection.on(_elevenlabs_client.RealtimeEvents.INPUT_ERROR, (data) => {
146
+ const message = data;
147
+ setError(message.error);
148
+ setStatus("error");
149
+ onInputError?.(message);
150
+ });
151
+ connection.on(_elevenlabs_client.RealtimeEvents.QUEUE_OVERFLOW, (data) => {
152
+ const message = data;
153
+ setError(message.error);
154
+ setStatus("error");
155
+ onQueueOverflowError?.(message);
156
+ });
157
+ connection.on(_elevenlabs_client.RealtimeEvents.RESOURCE_EXHAUSTED, (data) => {
158
+ const message = data;
159
+ setError(message.error);
160
+ setStatus("error");
161
+ onResourceExhaustedError?.(message);
162
+ });
163
+ connection.on(_elevenlabs_client.RealtimeEvents.SESSION_TIME_LIMIT_EXCEEDED, (data) => {
164
+ const message = data;
165
+ setError(message.error);
166
+ setStatus("error");
167
+ onSessionTimeLimitExceededError?.(message);
168
+ });
169
+ connection.on(_elevenlabs_client.RealtimeEvents.CHUNK_SIZE_EXCEEDED, (data) => {
170
+ const message = data;
171
+ setError(message.error);
172
+ setStatus("error");
173
+ onChunkSizeExceededError?.(message);
174
+ });
175
+ connection.on(_elevenlabs_client.RealtimeEvents.INSUFFICIENT_AUDIO_ACTIVITY, (data) => {
176
+ const message = data;
177
+ setError(message.error);
178
+ setStatus("error");
179
+ onInsufficientAudioActivityError?.(message);
180
+ });
181
+ connection.on(_elevenlabs_client.RealtimeEvents.OPEN, () => {
182
+ onConnect?.();
183
+ });
184
+ connection.on(_elevenlabs_client.RealtimeEvents.CLOSE, () => {
185
+ setStatus("disconnected");
186
+ connectionRef.current = null;
187
+ onDisconnect?.();
188
+ });
189
+ } catch (err) {
190
+ setError(err instanceof Error ? err.message : "Failed to connect");
191
+ setStatus("error");
192
+ throw err;
193
+ }
194
+ }, [
195
+ defaultToken,
196
+ defaultModelId,
197
+ defaultBaseUri,
198
+ defaultCommitStrategy,
199
+ defaultVadSilenceThresholdSecs,
200
+ defaultVadThreshold,
201
+ defaultMinSpeechDurationMs,
202
+ defaultMinSilenceDurationMs,
203
+ defaultLanguageCode,
204
+ defaultMicrophone,
205
+ defaultAudioFormat,
206
+ defaultSampleRate,
207
+ defaultIncludeTimestamps,
208
+ onSessionStarted,
209
+ onPartialTranscript,
210
+ onCommittedTranscript,
211
+ onCommittedTranscriptWithTimestamps,
212
+ onError,
213
+ onAuthError,
214
+ onQuotaExceededError,
215
+ onCommitThrottledError,
216
+ onTranscriberError,
217
+ onUnacceptedTermsError,
218
+ onRateLimitedError,
219
+ onInputError,
220
+ onQueueOverflowError,
221
+ onResourceExhaustedError,
222
+ onSessionTimeLimitExceededError,
223
+ onChunkSizeExceededError,
224
+ onInsufficientAudioActivityError,
225
+ onConnect,
226
+ onDisconnect
227
+ ]);
228
+ const disconnect = (0, react.useCallback)(() => {
229
+ connectionRef.current?.close();
230
+ connectionRef.current = null;
231
+ setStatus("disconnected");
232
+ }, []);
233
+ const sendAudio = (0, react.useCallback)((audioBase64, options) => {
234
+ if (!connectionRef.current) throw new Error("Not connected to Scribe");
235
+ connectionRef.current.send({
236
+ audioBase64,
237
+ ...options
238
+ });
239
+ }, []);
240
+ const commit = (0, react.useCallback)(() => {
241
+ if (!connectionRef.current) throw new Error("Not connected to Scribe");
242
+ connectionRef.current.commit();
243
+ }, []);
244
+ const clearTranscripts = (0, react.useCallback)(() => {
245
+ setCommittedTranscripts([]);
246
+ setPartialTranscript("");
247
+ }, []);
248
+ const getConnection = (0, react.useCallback)(() => {
249
+ return connectionRef.current;
250
+ }, []);
251
+ (0, react.useEffect)(() => {
252
+ if (autoConnect) connect();
253
+ }, [autoConnect, connect]);
254
+ return {
255
+ status,
256
+ isConnected: status === "connected" || status === "transcribing",
257
+ isTranscribing: status === "transcribing",
258
+ partialTranscript,
259
+ committedTranscripts,
260
+ error,
261
+ connect,
262
+ disconnect,
263
+ sendAudio,
264
+ commit,
265
+ clearTranscripts,
266
+ getConnection
267
+ };
268
+ }
269
+ //#endregion
270
+ //#region src/conversation/ConversationContext.tsx
271
+ const ConversationContext = (0, react.createContext)(null);
272
+ /**
273
+ * Returns the raw `Conversation` instance (or `null` if no session is active).
274
+ * This is a public escape hatch for advanced use cases that need direct access
275
+ * to the underlying `@elevenlabs/client` Conversation object.
276
+ *
277
+ * Can be used outside a `ConversationProvider` — returns `null` in that case.
278
+ */
279
+ function useRawConversation() {
280
+ return (0, react.useContext)(ConversationContext)?.conversation ?? null;
281
+ }
282
+ /**
283
+ * Returns a stable ref to the active `Conversation` instance.
284
+ * The ref's `.current` is `null` when no session is active, and updates
285
+ * without causing re-renders — ideal for use inside callbacks and sub-providers.
286
+ *
287
+ * Must be used within a `ConversationProvider`.
288
+ */
289
+ function useRawConversationRef() {
290
+ const ctx = (0, react.useContext)(ConversationContext);
291
+ if (!ctx) throw new Error("useRawConversationRef must be used within a ConversationProvider");
292
+ return ctx.conversationRef;
293
+ }
294
+ /**
295
+ * Registers callback handlers with the nearest `ConversationProvider`.
296
+ * Uses a ref internally so the latest callback values are always invoked
297
+ * without re-subscribing on every render.
298
+ *
299
+ * Must be used within a `ConversationProvider`.
300
+ */
301
+ function useRegisterCallbacks(callbacks) {
302
+ const ctx = (0, react.useContext)(ConversationContext);
303
+ if (!ctx) throw new Error("useRegisterCallbacks must be used within a ConversationProvider");
304
+ const { registerCallbacks } = ctx;
305
+ const callbacksRef = (0, react.useRef)(callbacks);
306
+ callbacksRef.current = callbacks;
307
+ const activeKeys = Object.keys(callbacks).filter((key) => callbacks[key] !== void 0).sort();
308
+ (0, react.useLayoutEffect)(() => {
309
+ return registerCallbacks(Object.fromEntries(activeKeys.map((key) => [key, (...args) => {
310
+ const fn = callbacksRef.current[key];
311
+ if (typeof fn === "function") fn(...args);
312
+ }])));
313
+ }, [registerCallbacks, activeKeys.join("|")]);
314
+ }
315
+ //#endregion
316
+ //#region ../../node_modules/.pnpm/react@19.1.0/node_modules/react/cjs/react-jsx-runtime.production.js
317
+ /**
318
+ * @license React
319
+ * react-jsx-runtime.production.js
320
+ *
321
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
322
+ *
323
+ * This source code is licensed under the MIT license found in the
324
+ * LICENSE file in the root directory of this source tree.
325
+ */
326
+ var require_react_jsx_runtime_production = /* @__PURE__ */ __commonJSMin(((exports) => {
327
+ var REACT_ELEMENT_TYPE = Symbol.for("react.transitional.element");
328
+ function jsxProd(type, config, maybeKey) {
329
+ var key = null;
330
+ void 0 !== maybeKey && (key = "" + maybeKey);
331
+ void 0 !== config.key && (key = "" + config.key);
332
+ if ("key" in config) {
333
+ maybeKey = {};
334
+ for (var propName in config) "key" !== propName && (maybeKey[propName] = config[propName]);
335
+ } else maybeKey = config;
336
+ config = maybeKey.ref;
337
+ return {
338
+ $$typeof: REACT_ELEMENT_TYPE,
339
+ type,
340
+ key,
341
+ ref: void 0 !== config ? config : null,
342
+ props: maybeKey
343
+ };
344
+ }
345
+ exports.jsx = jsxProd;
346
+ }));
347
+ //#endregion
348
+ //#region src/conversation/ConversationControls.tsx
349
+ var import_jsx_runtime = (/* @__PURE__ */ __commonJSMin(((exports, module) => {
350
+ module.exports = require_react_jsx_runtime_production();
351
+ })))();
352
+ const ConversationControlsContext = (0, react.createContext)(null);
353
+ /**
354
+ * Reads from `ConversationContext` and provides stable action references to
355
+ * `ConversationControlsContext`. Must be rendered inside a `ConversationProvider`.
356
+ */
357
+ function ConversationControlsProvider({ children }) {
358
+ const ctx = (0, react.useContext)(ConversationContext);
359
+ if (!ctx) throw new Error("ConversationControlsProvider must be rendered inside a ConversationProvider");
360
+ const { conversationRef } = ctx;
361
+ const getConversation = (0, react.useCallback)(() => {
362
+ const conversation = conversationRef.current;
363
+ if (!conversation) throw new Error("No active conversation. Call startSession() first.");
364
+ return conversation;
365
+ }, [conversationRef]);
366
+ const sendUserMessage = (0, react.useCallback)((text) => {
367
+ getConversation().sendUserMessage(text);
368
+ }, [getConversation]);
369
+ const sendContextualUpdate = (0, react.useCallback)((text) => {
370
+ getConversation().sendContextualUpdate(text);
371
+ }, [getConversation]);
372
+ const sendUserActivity = (0, react.useCallback)(() => {
373
+ getConversation().sendUserActivity();
374
+ }, [getConversation]);
375
+ const sendMCPToolApprovalResult = (0, react.useCallback)((toolCallId, isApproved) => {
376
+ getConversation().sendMCPToolApprovalResult(toolCallId, isApproved);
377
+ }, [getConversation]);
378
+ const setVolume = (0, react.useCallback)((options) => {
379
+ getConversation().setVolume(options);
380
+ }, [getConversation]);
381
+ const changeInputDevice = (0, react.useCallback)(async (config) => {
382
+ const conversation = getConversation();
383
+ if (conversation instanceof _elevenlabs_client.VoiceConversation) return await conversation.changeInputDevice(config);
384
+ throw new Error("Device switching is only available for voice conversations");
385
+ }, [getConversation]);
386
+ const changeOutputDevice = (0, react.useCallback)(async (config) => {
387
+ const conversation = getConversation();
388
+ if (conversation instanceof _elevenlabs_client.VoiceConversation) return await conversation.changeOutputDevice(config);
389
+ throw new Error("Device switching is only available for voice conversations");
390
+ }, [getConversation]);
391
+ const getInputByteFrequencyData = (0, react.useCallback)(() => {
392
+ return getConversation().getInputByteFrequencyData();
393
+ }, [getConversation]);
394
+ const getOutputByteFrequencyData = (0, react.useCallback)(() => {
395
+ return getConversation().getOutputByteFrequencyData();
396
+ }, [getConversation]);
397
+ const getInputVolume = (0, react.useCallback)(() => {
398
+ return getConversation().getInputVolume();
399
+ }, [getConversation]);
400
+ const getOutputVolume = (0, react.useCallback)(() => {
401
+ return getConversation().getOutputVolume();
402
+ }, [getConversation]);
403
+ const getId = (0, react.useCallback)(() => {
404
+ return getConversation().getId();
405
+ }, [getConversation]);
406
+ const value = (0, react.useMemo)(() => ({
407
+ startSession: ctx.startSession,
408
+ endSession: ctx.endSession,
409
+ sendUserMessage,
410
+ sendContextualUpdate,
411
+ sendUserActivity,
412
+ sendMCPToolApprovalResult,
413
+ setVolume,
414
+ changeInputDevice,
415
+ changeOutputDevice,
416
+ getInputByteFrequencyData,
417
+ getOutputByteFrequencyData,
418
+ getInputVolume,
419
+ getOutputVolume,
420
+ getId
421
+ }), [
422
+ ctx.startSession,
423
+ ctx.endSession,
424
+ sendUserMessage,
425
+ sendContextualUpdate,
426
+ sendUserActivity,
427
+ sendMCPToolApprovalResult,
428
+ setVolume,
429
+ changeInputDevice,
430
+ changeOutputDevice,
431
+ getInputByteFrequencyData,
432
+ getOutputByteFrequencyData,
433
+ getInputVolume,
434
+ getOutputVolume,
435
+ getId
436
+ ]);
437
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ConversationControlsContext.Provider, {
438
+ value,
439
+ children
440
+ });
441
+ }
442
+ /**
443
+ * Returns stable action references for controlling the conversation.
444
+ * All function references are stable and will never cause re-renders.
445
+ *
446
+ * Must be used within a `ConversationProvider`.
447
+ */
448
+ function useConversationControls() {
449
+ const ctx = (0, react.useContext)(ConversationControlsContext);
450
+ if (!ctx) throw new Error("useConversationControls must be used within a ConversationProvider");
451
+ return ctx;
452
+ }
453
+ //#endregion
454
+ //#region src/conversation/ConversationStatus.tsx
455
+ const ConversationStatusContext = (0, react.createContext)(null);
456
+ /**
457
+ * Reads from `ConversationContext` and registers `onStatusChange` + `onError`
458
+ * callbacks. Manages its own `status`/`message` state and provides it through
459
+ * `ConversationStatusContext`. Must be rendered inside a `ConversationProvider`.
460
+ */
461
+ function ConversationStatusProvider({ children }) {
462
+ const [status, setStatus] = (0, react.useState)("disconnected");
463
+ const [message, setMessage] = (0, react.useState)(void 0);
464
+ useRegisterCallbacks({
465
+ onStatusChange({ status: newStatus }) {
466
+ if (newStatus === "disconnecting") return;
467
+ setStatus(newStatus);
468
+ setMessage(void 0);
469
+ },
470
+ onError(errorMessage) {
471
+ setStatus("error");
472
+ setMessage(errorMessage);
473
+ }
474
+ });
475
+ const value = (0, react.useMemo)(() => ({
476
+ status,
477
+ message
478
+ }), [status, message]);
479
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ConversationStatusContext.Provider, {
480
+ value,
481
+ children
482
+ });
483
+ }
484
+ /**
485
+ * Returns the current conversation status and any error message.
486
+ * Re-renders when the connection status or error message changes.
487
+ *
488
+ * Must be used within a `ConversationProvider`.
489
+ */
490
+ function useConversationStatus() {
491
+ const ctx = (0, react.useContext)(ConversationStatusContext);
492
+ if (!ctx) throw new Error("useConversationStatus must be used within a ConversationProvider");
493
+ return ctx;
494
+ }
495
+ //#endregion
496
+ //#region src/conversation/ConversationInput.tsx
497
+ const ConversationInputContext = (0, react.createContext)(null);
498
+ /**
499
+ * Reads from `ConversationContext` and manages microphone mute state.
500
+ * `setMuted` calls `conversation.setMicMuted()` and updates local state.
501
+ * Must be rendered inside a `ConversationProvider`.
502
+ */
503
+ function ConversationInputProvider({ children }) {
504
+ const conversationRef = useRawConversationRef();
505
+ const [isMuted, setIsMuted] = (0, react.useState)(false);
506
+ useRegisterCallbacks({ onDisconnect() {
507
+ setIsMuted(false);
508
+ } });
509
+ const setMuted = (0, react.useCallback)((muted) => {
510
+ const conversation = conversationRef.current;
511
+ if (!conversation) throw new Error("No active conversation. Call startSession() first.");
512
+ conversation.setMicMuted(muted);
513
+ setIsMuted(muted);
514
+ }, [conversationRef]);
515
+ const value = (0, react.useMemo)(() => ({
516
+ isMuted,
517
+ setMuted
518
+ }), [isMuted, setMuted]);
519
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ConversationInputContext.Provider, {
520
+ value,
521
+ children
522
+ });
523
+ }
524
+ /**
525
+ * Returns the current microphone mute state and a function to change it.
526
+ * Re-renders only when the mute state changes.
527
+ *
528
+ * Must be used within a `ConversationProvider`.
529
+ */
530
+ function useConversationInput() {
531
+ const ctx = (0, react.useContext)(ConversationInputContext);
532
+ if (!ctx) throw new Error("useConversationInput must be used within a ConversationProvider");
533
+ return ctx;
534
+ }
535
+ //#endregion
536
+ //#region src/conversation/ConversationMode.tsx
537
+ const ConversationModeContext = (0, react.createContext)(null);
538
+ /**
539
+ * Reads from `ConversationContext` and registers an `onModeChange` callback.
540
+ * Manages its own `mode` state and provides it through
541
+ * `ConversationModeContext`. Must be rendered inside a `ConversationProvider`.
542
+ */
543
+ function ConversationModeProvider({ children }) {
544
+ const [mode, setMode] = (0, react.useState)("listening");
545
+ useRegisterCallbacks({
546
+ onModeChange({ mode: newMode }) {
547
+ setMode(newMode);
548
+ },
549
+ onDisconnect() {
550
+ setMode("listening");
551
+ }
552
+ });
553
+ const value = (0, react.useMemo)(() => ({
554
+ mode,
555
+ isSpeaking: mode === "speaking",
556
+ isListening: mode === "listening"
557
+ }), [mode]);
558
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ConversationModeContext.Provider, {
559
+ value,
560
+ children
561
+ });
562
+ }
563
+ /**
564
+ * Returns the current conversation mode (speaking/listening) and
565
+ * convenience booleans. Re-renders only when the mode changes.
566
+ *
567
+ * Must be used within a `ConversationProvider`.
568
+ */
569
+ function useConversationMode() {
570
+ const ctx = (0, react.useContext)(ConversationModeContext);
571
+ if (!ctx) throw new Error("useConversationMode must be used within a ConversationProvider");
572
+ return ctx;
573
+ }
574
+ //#endregion
575
+ //#region src/conversation/ConversationFeedback.tsx
576
+ const ConversationFeedbackContext = (0, react.createContext)(null);
577
+ /**
578
+ * Reads from `ConversationContext` and registers an `onCanSendFeedbackChange`
579
+ * callback. Manages its own `canSendFeedback` state and provides it along with
580
+ * a `sendFeedback` action through `ConversationFeedbackContext`.
581
+ * Must be rendered inside a `ConversationProvider`.
582
+ */
583
+ function ConversationFeedbackProvider({ children }) {
584
+ const conversationRef = useRawConversationRef();
585
+ const [canSendFeedback, setCanSendFeedback] = (0, react.useState)(false);
586
+ useRegisterCallbacks({
587
+ onCanSendFeedbackChange({ canSendFeedback: newValue }) {
588
+ setCanSendFeedback(newValue);
589
+ },
590
+ onDisconnect() {
591
+ setCanSendFeedback(false);
592
+ }
593
+ });
594
+ const sendFeedback = (0, react.useCallback)((like) => {
595
+ conversationRef.current?.sendFeedback(like);
596
+ }, [conversationRef]);
597
+ const value = (0, react.useMemo)(() => ({
598
+ canSendFeedback,
599
+ sendFeedback
600
+ }), [canSendFeedback, sendFeedback]);
601
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ConversationFeedbackContext.Provider, {
602
+ value,
603
+ children
604
+ });
605
+ }
606
+ /**
607
+ * Returns the current feedback state and a `sendFeedback` action.
608
+ * Re-renders only when `canSendFeedback` changes.
609
+ *
610
+ * Must be used within a `ConversationProvider`.
611
+ */
612
+ function useConversationFeedback() {
613
+ const ctx = (0, react.useContext)(ConversationFeedbackContext);
614
+ if (!ctx) throw new Error("useConversationFeedback must be used within a ConversationProvider");
615
+ return ctx;
616
+ }
617
+ //#endregion
618
+ //#region src/conversation/ConversationClientTools.tsx
619
+ /**
620
+ * Creates a fresh clientTools object by merging option-provided tools with
621
+ * hook-registered tools from the registry. Throws if a hook-registered tool
622
+ * name conflicts with an option-provided tool.
623
+ */
624
+ function buildClientTools(optionTools, registry) {
625
+ const clientTools = { ...optionTools };
626
+ for (const [name, handler] of registry) {
627
+ if (Object.hasOwn(clientTools, name)) throw new Error(`Client tool "${name}" is already provided via props/options. Remove it from props or do not register it with useConversationClientTool.`);
628
+ clientTools[name] = handler;
629
+ }
630
+ return clientTools;
631
+ }
632
+ const ConversationClientToolsContext = (0, react.createContext)(null);
633
+ function ConversationClientToolsProvider({ children }) {
634
+ const ctx = (0, react.useContext)(ConversationContext);
635
+ if (!ctx) throw new Error("ConversationClientToolsProvider must be rendered inside a ConversationProvider");
636
+ const { clientToolsRegistry, clientToolsRef } = ctx;
637
+ const registerClientTool = (0, react.useCallback)((name, handler) => {
638
+ if (clientToolsRegistry.has(name)) throw new Error(`Client tool "${name}" is already registered by another hook. Each tool name must be unique.`);
639
+ clientToolsRegistry.set(name, handler);
640
+ clientToolsRef.current[name] = handler;
641
+ return () => {
642
+ if (clientToolsRegistry.get(name) === handler) clientToolsRegistry.delete(name);
643
+ if (clientToolsRef.current[name] === handler) delete clientToolsRef.current[name];
644
+ };
645
+ }, [clientToolsRegistry, clientToolsRef]);
646
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ConversationClientToolsContext.Provider, {
647
+ value: registerClientTool,
648
+ children
649
+ });
650
+ }
651
+ /**
652
+ * Registers a named client tool with the nearest `ConversationProvider`.
653
+ * The tool is available during any active conversation and is automatically
654
+ * unregistered when the component unmounts.
655
+ *
656
+ * The handler always reflects the latest closure value (ref pattern),
657
+ * so it is safe to reference component state or props without listing
658
+ * them as dependencies.
659
+ *
660
+ * @typeParam TTools - An interface mapping tool names to function signatures.
661
+ * @typeParam TName - The specific tool name (inferred from the first argument).
662
+ * @param name - The tool name (must match the name configured on the agent).
663
+ * @param handler - The function invoked when the agent calls this tool.
664
+ *
665
+ * @example
666
+ * ```tsx
667
+ * type Tools = {
668
+ * get_weather: (params: { city: string }) => string;
669
+ * set_volume: (params: { level: number }) => void;
670
+ * };
671
+ *
672
+ * useConversationClientTool<Tools>("get_weather", (params) => {
673
+ * return `Weather in ${params.city} is sunny.`;
674
+ * });
675
+ * ```
676
+ */
677
+ function useConversationClientTool(name, handler) {
678
+ const registerClientTool = (0, react.useContext)(ConversationClientToolsContext);
679
+ if (!registerClientTool) throw new Error("useConversationClientTool must be used within a ConversationProvider");
680
+ const handlerRef = (0, react.useRef)(handler);
681
+ handlerRef.current = handler;
682
+ (0, react.useLayoutEffect)(() => {
683
+ const stableHandler = (parameters) => handlerRef.current(parameters);
684
+ return registerClientTool(name, stableHandler);
685
+ }, [registerClientTool, name]);
686
+ }
687
+ //#endregion
688
+ //#region src/conversation/ListenerSet.ts
689
+ var ListenerSet = class {
690
+ listeners = /* @__PURE__ */ new Set();
691
+ add(fn) {
692
+ this.listeners.add(fn);
693
+ return () => {
694
+ this.listeners.delete(fn);
695
+ };
696
+ }
697
+ invoke(...args) {
698
+ for (const fn of this.listeners) fn(...args);
699
+ }
700
+ get size() {
701
+ return this.listeners.size;
702
+ }
703
+ };
704
+ //#endregion
705
+ //#region src/conversation/ListenerMap.ts
706
+ function assertFunction(value, key) {
707
+ if (typeof value !== "function") throw new Error(`Expected function for key "${key}", got ${typeof value}`);
708
+ }
709
+ /**
710
+ * A map of named listener sets. Each key maps to a `ListenerSet` that can have
711
+ * multiple listeners registered. Typed through `T` so that `register` and
712
+ * `compose` preserve per-key callback signatures.
713
+ *
714
+ * All keys are pre-initialized in the constructor so `register` can validate
715
+ * keys. `compose()` only includes keys with at least one registered listener,
716
+ * preserving callback-presence semantics used by the client as feature guards.
717
+ * For included keys, composed functions delegate to the live listener set, so
718
+ * listeners added/removed after `compose()` still take effect. Keys with no
719
+ * listeners at compose time are omitted entirely; call `compose()` again after
720
+ * registering listeners to pick up newly populated keys.
721
+ */
722
+ var ListenerMap = class {
723
+ sets = /* @__PURE__ */ new Map();
724
+ constructor(keys) {
725
+ for (const key of keys) this.sets.set(key, new ListenerSet());
726
+ }
727
+ /**
728
+ * Register listeners for one or more keys. Returns a function that removes
729
+ * all listeners added by this call.
730
+ */
731
+ register(callbacks) {
732
+ const removers = Object.entries(callbacks).filter(([, fn]) => fn !== void 0).map(([key, fn]) => {
733
+ assertFunction(fn, key);
734
+ const set = this.sets.get(key);
735
+ if (!set) throw new Error(`Unknown callback key "${key}"`);
736
+ return set.add(fn);
737
+ });
738
+ return () => {
739
+ for (const remove of removers) remove();
740
+ };
741
+ }
742
+ /**
743
+ * Compose all registered listeners into a single callbacks object. Each
744
+ * composed function delegates to the live listener set, so listeners
745
+ * added/removed after this call still take effect.
746
+ */
747
+ compose() {
748
+ return Object.fromEntries(Array.from(this.sets.entries()).filter(([, set]) => set.size > 0).map(([key, set]) => [key, (...args) => {
749
+ set.invoke(...args);
750
+ }]));
751
+ }
752
+ };
753
+ //#endregion
754
+ //#region src/conversation/useStableCallbacks.ts
755
+ /**
756
+ * Wraps user-provided callback props in stable ref-backed functions,
757
+ * preventing stale closure bugs when the session outlives renders.
758
+ *
759
+ * Returns a `Partial<Callbacks>` containing only the keys the caller
760
+ * actually provided. Function references are stable per key across
761
+ * renders, but always invoke the latest prop value. The returned object
762
+ * reference is stable as long as the set of provided keys doesn't change.
763
+ */
764
+ function useStableCallbacks(props) {
765
+ const callbackRefs = (0, react.useRef)({});
766
+ for (const key of _elevenlabs_client_internal.CALLBACK_KEYS) callbackRefs.current[key] = props[key];
767
+ const activeKeys = _elevenlabs_client_internal.CALLBACK_KEYS.filter((key) => props[key] !== void 0);
768
+ return (0, react.useMemo)(() => Object.fromEntries(activeKeys.map((key) => [key, (...args) => {
769
+ const fn = callbackRefs.current[key];
770
+ fn?.(...args);
771
+ }])), [activeKeys.join("|")]);
772
+ }
773
+ //#endregion
774
+ //#region src/conversation/ConversationProvider.tsx
775
+ const SUB_PROVIDERS = [
776
+ ConversationControlsProvider,
777
+ ConversationStatusProvider,
778
+ ConversationInputProvider,
779
+ ConversationModeProvider,
780
+ ConversationFeedbackProvider,
781
+ ConversationClientToolsProvider
782
+ ];
783
+ function ConversationProvider({ children, ...defaultOptions }) {
784
+ /** The active conversation instance, if any. */
785
+ const conversationRef = (0, react.useRef)(null);
786
+ /** In-flight startSession promise, used to prevent duplicate connections. */
787
+ const lockRef = (0, react.useRef)(null);
788
+ /** Signals that endSession was called while a connection was still pending. */
789
+ const shouldEndRef = (0, react.useRef)(false);
790
+ /** Registry of hook-registered client tools. Survives across sessions. */
791
+ const [clientToolsRegistry] = (0, react.useState)(() => /* @__PURE__ */ new Map());
792
+ /** Ref to the live clientTools object currently held by BaseConversation. */
793
+ const clientToolsRef = (0, react.useRef)({});
794
+ /** Always holds the latest provider props, avoiding stale closures in callbacks. */
795
+ const defaultOptionsRef = (0, react.useRef)(defaultOptions);
796
+ defaultOptionsRef.current = defaultOptions;
797
+ /** Callback registry for sub-providers (status, mode, feedback, etc.). */
798
+ const [listenerMap] = (0, react.useState)(() => new ListenerMap(_elevenlabs_client_internal.CALLBACK_KEYS));
799
+ /** Reactive mirror of conversationRef, triggers re-renders for context consumers. */
800
+ const [conversation, setConversation] = (0, react.useState)(null);
801
+ const stableCallbacks = useStableCallbacks(defaultOptions);
802
+ const registerCallbacks = (0, react.useCallback)((callbacks) => listenerMap.register(callbacks), [listenerMap]);
803
+ (0, react.useLayoutEffect)(() => {
804
+ return listenerMap.register({ onDisconnect: () => {
805
+ conversationRef.current = null;
806
+ setConversation(null);
807
+ } });
808
+ }, [listenerMap]);
809
+ const startSession = (0, react.useCallback)((options) => {
810
+ if (conversationRef.current) return;
811
+ if (lockRef.current) return;
812
+ shouldEndRef.current = false;
813
+ const defaults = defaultOptionsRef.current;
814
+ const resolvedServerLocation = (0, _elevenlabs_client_internal.parseLocation)(options?.serverLocation || defaults?.serverLocation);
815
+ const origin = (0, _elevenlabs_client_internal.getOriginForLocation)(resolvedServerLocation);
816
+ const calculatedLivekitUrl = (0, _elevenlabs_client_internal.getLivekitUrlForLocation)(resolvedServerLocation);
817
+ const defaultConfig = { ...defaults };
818
+ for (const key of _elevenlabs_client_internal.CALLBACK_KEYS) delete defaultConfig[key];
819
+ const sessionOptions = (0, _elevenlabs_client_internal.mergeOptions)({ livekitUrl: calculatedLivekitUrl }, defaultConfig, stableCallbacks, listenerMap.compose(), options ?? {}, { origin });
820
+ const clientTools = buildClientTools(sessionOptions.clientTools, clientToolsRegistry);
821
+ clientToolsRef.current = clientTools;
822
+ sessionOptions.clientTools = clientTools;
823
+ lockRef.current = _elevenlabs_client.Conversation.startSession(sessionOptions);
824
+ lockRef.current.then((conv) => {
825
+ if (shouldEndRef.current) {
826
+ conv.endSession();
827
+ lockRef.current = null;
828
+ return;
829
+ }
830
+ conversationRef.current = conv;
831
+ setConversation(conv);
832
+ lockRef.current = null;
833
+ }, () => {
834
+ lockRef.current = null;
835
+ });
836
+ }, [
837
+ stableCallbacks,
838
+ listenerMap,
839
+ clientToolsRegistry,
840
+ clientToolsRef
841
+ ]);
842
+ const endSession = (0, react.useCallback)(() => {
843
+ shouldEndRef.current = true;
844
+ const pendingConnection = lockRef.current;
845
+ const conv = conversationRef.current;
846
+ conversationRef.current = null;
847
+ setConversation(null);
848
+ if (pendingConnection) pendingConnection.then((c) => c.endSession());
849
+ else conv?.endSession();
850
+ }, []);
851
+ (0, react.useEffect)(() => {
852
+ return () => {
853
+ shouldEndRef.current = true;
854
+ if (lockRef.current) lockRef.current.then((conv) => conv.endSession());
855
+ else conversationRef.current?.endSession();
856
+ };
857
+ }, []);
858
+ const contextValue = (0, react.useMemo)(() => ({
859
+ conversation,
860
+ conversationRef,
861
+ startSession,
862
+ endSession,
863
+ registerCallbacks,
864
+ clientToolsRegistry,
865
+ clientToolsRef
866
+ }), [
867
+ conversation,
868
+ conversationRef,
869
+ startSession,
870
+ endSession,
871
+ registerCallbacks,
872
+ clientToolsRegistry,
873
+ clientToolsRef
874
+ ]);
875
+ const wrappedChildren = SUB_PROVIDERS.reduceRight((nested, Provider) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Provider, { children: nested }), children);
876
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ConversationContext.Provider, {
877
+ value: contextValue,
878
+ children: wrappedChildren
879
+ });
880
+ }
881
+ //#endregion
882
+ //#region src/conversation/useConversation.ts
883
+ /**
884
+ * Convenience hook that combines all granular conversation hooks into a single
885
+ * return value. Less performant than using individual hooks because any state
886
+ * change in any sub-context triggers a re-render of the consuming component.
887
+ *
888
+ * Accepts optional `micMuted`, `volume`, session config, and callback props.
889
+ * Session config and callbacks passed here are used as defaults when calling
890
+ * `startSession()` without arguments. Callbacks are also registered with the
891
+ * provider so they stay up-to-date across re-renders.
892
+ *
893
+ * Must be used within a `ConversationProvider`.
894
+ */
895
+ function useConversation(props = {}) {
896
+ const { micMuted, volume, ...hookOptions } = props;
897
+ useRegisterCallbacks(useStableCallbacks(hookOptions));
898
+ const hookOptionsRef = (0, react.useRef)(hookOptions);
899
+ hookOptionsRef.current = hookOptions;
900
+ const controls = useConversationControls();
901
+ const { status, message } = useConversationStatus();
902
+ const { isMuted, setMuted } = useConversationInput();
903
+ const { mode, isSpeaking, isListening } = useConversationMode();
904
+ const { canSendFeedback, sendFeedback } = useConversationFeedback();
905
+ const startSession = (0, react.useCallback)((options) => {
906
+ const sessionConfig = { ...hookOptionsRef.current };
907
+ for (const key of _elevenlabs_client_internal.CALLBACK_KEYS) delete sessionConfig[key];
908
+ controls.startSession({
909
+ ...sessionConfig,
910
+ ...options
911
+ });
912
+ }, [controls, hookOptionsRef]);
913
+ const conversation = useRawConversation();
914
+ (0, react.useEffect)(() => {
915
+ if (micMuted !== void 0 && conversation) setMuted(micMuted);
916
+ }, [
917
+ micMuted,
918
+ conversation,
919
+ setMuted
920
+ ]);
921
+ (0, react.useEffect)(() => {
922
+ if (volume !== void 0 && conversation) conversation.setVolume({ volume });
923
+ }, [volume, conversation]);
924
+ return {
925
+ ...controls,
926
+ startSession,
927
+ status,
928
+ message,
929
+ isMuted: micMuted ?? isMuted,
930
+ setMuted,
931
+ mode,
932
+ isSpeaking,
933
+ isListening,
934
+ canSendFeedback,
935
+ sendFeedback
936
+ };
937
+ }
938
+ //#endregion
939
+ //#region src/index.ts
940
+ (0, _elevenlabs_client_internal.setSourceInfo)({
941
+ name: "react_sdk",
942
+ version: PACKAGE_VERSION
943
+ });
944
+ //#endregion
945
+ Object.defineProperty(exports, "AudioFormat", {
946
+ enumerable: true,
947
+ get: function() {
948
+ return _elevenlabs_client.AudioFormat;
949
+ }
950
+ });
951
+ Object.defineProperty(exports, "CommitStrategy", {
952
+ enumerable: true,
953
+ get: function() {
954
+ return _elevenlabs_client.CommitStrategy;
955
+ }
956
+ });
957
+ exports.ConversationProvider = ConversationProvider;
958
+ Object.defineProperty(exports, "RealtimeEvents", {
959
+ enumerable: true,
960
+ get: function() {
961
+ return _elevenlabs_client.RealtimeEvents;
962
+ }
963
+ });
964
+ exports.useConversation = useConversation;
965
+ exports.useConversationClientTool = useConversationClientTool;
966
+ exports.useConversationControls = useConversationControls;
967
+ exports.useConversationFeedback = useConversationFeedback;
968
+ exports.useConversationInput = useConversationInput;
969
+ exports.useConversationMode = useConversationMode;
970
+ exports.useConversationStatus = useConversationStatus;
971
+ exports.useRawConversation = useRawConversation;
972
+ exports.useScribe = useScribe;
973
+ Object.keys(_elevenlabs_client).forEach(function(k) {
974
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
975
+ enumerable: true,
976
+ get: function() {
977
+ return _elevenlabs_client[k];
978
+ }
979
+ });
980
+ });
981
+ return exports;
982
+ })({}, _elevenlabs_client_internal, _elevenlabs_client, react);
983
+
984
+ //# sourceMappingURL=lib.iife.js.map