@elevenlabs/react 1.4.0 → 1.5.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.
@@ -2,7 +2,7 @@ import type { SessionConfig, ClientToolsConfig, InputConfig, AudioWorkletConfig,
2
2
  export type ClientToolResult = string | number | void;
3
3
  export type ClientTool<Parameters extends Record<string, unknown> = Record<string, unknown>, Result extends ClientToolResult = ClientToolResult> = (parameters: Parameters) => Promise<Result> | Result;
4
4
  export type ClientTools = Record<string, ClientTool>;
5
- export type HookCallbacks = Pick<Callbacks, "onConnect" | "onDisconnect" | "onError" | "onMessage" | "onAudio" | "onModeChange" | "onStatusChange" | "onCanSendFeedbackChange" | "onDebug" | "onUnhandledClientToolCall" | "onVadScore" | "onInterruption" | "onAgentToolResponse" | "onAgentToolRequest" | "onConversationMetadata" | "onMCPToolCall" | "onMCPConnectionStatus" | "onAsrInitiationMetadata" | "onAgentChatResponsePart" | "onAudioAlignment" | "onGuardrailTriggered">;
5
+ export type HookCallbacks = Pick<Callbacks, "onConnect" | "onDisconnect" | "onError" | "onMessage" | "onAudio" | "onModeChange" | "onStatusChange" | "onCanSendFeedbackChange" | "onDebug" | "onUnhandledClientToolCall" | "onVadScore" | "onInterruption" | "onAgentToolResponse" | "onAgentToolRequest" | "onConversationMetadata" | "onMCPToolCall" | "onMCPConnectionStatus" | "onAsrInitiationMetadata" | "onAgentChatResponsePart" | "onAgentResponseCorrection" | "onAudioAlignment" | "onGuardrailTriggered">;
6
6
  export type HookOptions = Partial<SessionConfig & HookCallbacks & ConversationLifecycleOptions & ClientToolsConfig & InputConfig & OutputConfig & AudioWorkletConfig & FormatConfig & {
7
7
  serverLocation?: Location | string;
8
8
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/conversation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,4BAA4B,EAC5B,QAAQ,EACT,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAEtD,MAAM,MAAM,UAAU,CACpB,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpE,MAAM,SAAS,gBAAgB,GAAG,gBAAgB,IAChD,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAEzD,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAErD,MAAM,MAAM,aAAa,GAAG,IAAI,CAC9B,SAAS,EACP,WAAW,GACX,cAAc,GACd,SAAS,GACT,WAAW,GACX,SAAS,GACT,cAAc,GACd,gBAAgB,GAChB,yBAAyB,GACzB,SAAS,GACT,2BAA2B,GAC3B,YAAY,GACZ,gBAAgB,GAChB,qBAAqB,GACrB,oBAAoB,GACpB,wBAAwB,GACxB,eAAe,GACf,uBAAuB,GACvB,yBAAyB,GACzB,yBAAyB,GACzB,kBAAkB,GAClB,sBAAsB,CACzB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,OAAO,CAC/B,aAAa,GACX,aAAa,GACb,4BAA4B,GAC5B,iBAAiB,GACjB,WAAW,GACX,YAAY,GACZ,kBAAkB,GAClB,YAAY,GAAG;IACb,cAAc,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CACpC,CACJ,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/conversation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,4BAA4B,EAC5B,QAAQ,EACT,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAEtD,MAAM,MAAM,UAAU,CACpB,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpE,MAAM,SAAS,gBAAgB,GAAG,gBAAgB,IAChD,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAEzD,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAErD,MAAM,MAAM,aAAa,GAAG,IAAI,CAC9B,SAAS,EACP,WAAW,GACX,cAAc,GACd,SAAS,GACT,WAAW,GACX,SAAS,GACT,cAAc,GACd,gBAAgB,GAChB,yBAAyB,GACzB,SAAS,GACT,2BAA2B,GAC3B,YAAY,GACZ,gBAAgB,GAChB,qBAAqB,GACrB,oBAAoB,GACpB,wBAAwB,GACxB,eAAe,GACf,uBAAuB,GACvB,yBAAyB,GACzB,yBAAyB,GACzB,2BAA2B,GAC3B,kBAAkB,GAClB,sBAAsB,CACzB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,OAAO,CAC/B,aAAa,GACX,aAAa,GACb,4BAA4B,GAC5B,iBAAiB,GACjB,WAAW,GACX,YAAY,GACZ,kBAAkB,GAClB,YAAY,GAAG;IACb,cAAc,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CACpC,CACJ,CAAC"}
package/dist/lib.iife.js CHANGED
@@ -4,13 +4,14 @@ var ElevenLabsReact = (function(exports, _elevenlabs_client_internal, _elevenlab
4
4
  var __commonJSMin = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
5
5
  //#endregion
6
6
  //#region src/version.ts
7
- const PACKAGE_VERSION = "1.4.0";
7
+ const PACKAGE_VERSION = "1.5.0";
8
8
  //#endregion
9
9
  //#region src/scribe.ts
10
10
  function useScribe(options = {}) {
11
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, keyterms: defaultKeyterms, noVerbatim: defaultNoVerbatim } = options;
12
12
  const connectionRef = (0, react.useRef)(null);
13
13
  const [status, setStatus] = (0, react.useState)("disconnected");
14
+ const [isMuted, setIsMuted] = (0, react.useState)(false);
14
15
  const [partialTranscript, setPartialTranscript] = (0, react.useState)("");
15
16
  const [committedTranscripts, setCommittedTranscripts] = (0, react.useState)([]);
16
17
  const [error, setError] = (0, react.useState)(null);
@@ -187,6 +188,7 @@ var ElevenLabsReact = (function(exports, _elevenlabs_client_internal, _elevenlab
187
188
  });
188
189
  connection.on(_elevenlabs_client.RealtimeEvents.CLOSE, () => {
189
190
  setStatus("disconnected");
191
+ setIsMuted(false);
190
192
  connectionRef.current = null;
191
193
  onDisconnect?.();
192
194
  });
@@ -235,6 +237,17 @@ var ElevenLabsReact = (function(exports, _elevenlabs_client_internal, _elevenlab
235
237
  connectionRef.current?.close();
236
238
  connectionRef.current = null;
237
239
  setStatus("disconnected");
240
+ setIsMuted(false);
241
+ }, []);
242
+ const mute = (0, react.useCallback)(() => {
243
+ if (!connectionRef.current) throw new Error("Not connected to Scribe");
244
+ connectionRef.current.mute();
245
+ setIsMuted(true);
246
+ }, []);
247
+ const unmute = (0, react.useCallback)(() => {
248
+ if (!connectionRef.current) throw new Error("Not connected to Scribe");
249
+ connectionRef.current.unmute();
250
+ setIsMuted(false);
238
251
  }, []);
239
252
  const sendAudio = (0, react.useCallback)((audioBase64, options) => {
240
253
  if (!connectionRef.current) throw new Error("Not connected to Scribe");
@@ -261,11 +274,14 @@ var ElevenLabsReact = (function(exports, _elevenlabs_client_internal, _elevenlab
261
274
  status,
262
275
  isConnected: status === "connected" || status === "transcribing",
263
276
  isTranscribing: status === "transcribing",
277
+ isMuted,
264
278
  partialTranscript,
265
279
  committedTranscripts,
266
280
  error,
267
281
  connect,
268
282
  disconnect,
283
+ mute,
284
+ unmute,
269
285
  sendAudio,
270
286
  commit,
271
287
  clearTranscripts,
@@ -1 +1 @@
1
- {"version":3,"file":"lib.iife.js","names":["Scribe","RealtimeEvents","VoiceConversation","CALLBACK_KEYS","CALLBACK_KEYS","Conversation","CALLBACK_KEYS"],"sources":["../src/version.ts","../src/scribe.ts","../src/conversation/ConversationContext.tsx","../../../node_modules/.pnpm/react@19.1.0/node_modules/react/cjs/react-jsx-runtime.production.js","../../../node_modules/.pnpm/react@19.1.0/node_modules/react/jsx-runtime.js","../src/conversation/ConversationControls.tsx","../src/conversation/ConversationStatus.tsx","../src/conversation/ConversationInput.tsx","../src/conversation/ConversationMode.tsx","../src/conversation/ConversationFeedback.tsx","../src/conversation/ConversationClientTools.tsx","../src/conversation/ListenerSet.ts","../src/conversation/ListenerMap.ts","../src/conversation/useStableCallbacks.ts","../src/conversation/ConversationProvider.tsx","../src/conversation/useConversation.ts","../src/index.ts"],"sourcesContent":["// This file is auto-generated during build\nexport const PACKAGE_VERSION = \"1.4.0\";\n","import { useEffect, useRef, useState, useCallback } from \"react\";\nimport { Scribe, RealtimeEvents } from \"@elevenlabs/client\";\nimport type {\n RealtimeConnection,\n AudioOptions,\n MicrophoneOptions,\n AudioFormat,\n CommitStrategy,\n PartialTranscriptMessage,\n CommittedTranscriptMessage,\n CommittedTranscriptWithTimestampsMessage,\n ScribeErrorMessage,\n ScribeAuthErrorMessage,\n ScribeQuotaExceededErrorMessage,\n ScribeCommitThrottledErrorMessage,\n ScribeTranscriberErrorMessage,\n ScribeUnacceptedTermsErrorMessage,\n ScribeRateLimitedErrorMessage,\n ScribeInputErrorMessage,\n ScribeQueueOverflowErrorMessage,\n ScribeResourceExhaustedErrorMessage,\n ScribeSessionTimeLimitExceededErrorMessage,\n ScribeChunkSizeExceededErrorMessage,\n ScribeInsufficientAudioActivityErrorMessage,\n} from \"@elevenlabs/client\";\n\n// ============= Types =============\n\nexport type ScribeStatus =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"transcribing\"\n | \"error\";\n\nexport interface WordTimestamp {\n text?: string;\n /** Start time in seconds */\n start?: number;\n /** End time in seconds */\n end?: number;\n type?: \"word\" | \"spacing\";\n speaker_id?: string;\n logprob?: number;\n characters?: string[];\n}\n\nexport interface TranscriptSegment {\n id: string;\n text: string;\n timestamp: number;\n isFinal: boolean;\n /** Word-level timestamps (only present when includeTimestamps is enabled) */\n words?: WordTimestamp[];\n}\n\nexport interface ScribeCallbacks {\n onSessionStarted?: () => void;\n onPartialTranscript?: (data: { text: string }) => void;\n onCommittedTranscript?: (data: { text: string }) => void;\n onCommittedTranscriptWithTimestamps?: (data: {\n text: string;\n words?: WordTimestamp[];\n }) => void;\n /** Called for any error (also called when specific error callbacks fire) */\n onError?: (error: Error | Event) => void;\n onAuthError?: (data: { error: string }) => void;\n onQuotaExceededError?: (data: { error: string }) => void;\n onCommitThrottledError?: (data: { error: string }) => void;\n onTranscriberError?: (data: { error: string }) => void;\n onUnacceptedTermsError?: (data: { error: string }) => void;\n onRateLimitedError?: (data: { error: string }) => void;\n onInputError?: (data: { error: string }) => void;\n onQueueOverflowError?: (data: { error: string }) => void;\n onResourceExhaustedError?: (data: { error: string }) => void;\n onSessionTimeLimitExceededError?: (data: { error: string }) => void;\n onChunkSizeExceededError?: (data: { error: string }) => void;\n onInsufficientAudioActivityError?: (data: { error: string }) => void;\n\n onConnect?: () => void;\n onDisconnect?: () => void;\n}\n\nexport interface ScribeHookOptions extends ScribeCallbacks {\n // Connection options\n token?: string;\n modelId?: string;\n baseUri?: string;\n\n // VAD options\n commitStrategy?: CommitStrategy;\n vadSilenceThresholdSecs?: number;\n vadThreshold?: number;\n minSpeechDurationMs?: number;\n minSilenceDurationMs?: number;\n languageCode?: string;\n\n // Microphone options (for automatic microphone mode)\n microphone?: MicrophoneOptions[\"microphone\"];\n\n // Manual audio options\n audioFormat?: AudioFormat;\n sampleRate?: number;\n\n // Auto-connect on mount\n autoConnect?: boolean;\n\n // Include timestamps\n includeTimestamps?: boolean;\n\n // Keyterms and verbatim control\n keyterms?: string[];\n noVerbatim?: boolean;\n}\n\nexport interface UseScribeReturn {\n // State\n status: ScribeStatus;\n isConnected: boolean;\n isTranscribing: boolean;\n partialTranscript: string;\n committedTranscripts: TranscriptSegment[];\n error: string | null;\n\n // Connection methods\n connect: (options?: Partial<ScribeHookOptions>) => Promise<void>;\n disconnect: () => void;\n\n // Audio methods (for manual mode)\n sendAudio: (\n audioBase64: string,\n options?: { commit?: boolean; sampleRate?: number; previousText?: string }\n ) => void;\n commit: () => void;\n\n // Utility methods\n clearTranscripts: () => void;\n getConnection: () => RealtimeConnection | null;\n}\n\n// ============= Hook Implementation =============\n\nexport function useScribe(options: ScribeHookOptions = {}): UseScribeReturn {\n const {\n // Callbacks\n onSessionStarted,\n onPartialTranscript,\n onCommittedTranscript,\n onCommittedTranscriptWithTimestamps,\n onError,\n onAuthError,\n onQuotaExceededError,\n onCommitThrottledError,\n onTranscriberError,\n onUnacceptedTermsError,\n onRateLimitedError,\n onInputError,\n onQueueOverflowError,\n onResourceExhaustedError,\n onSessionTimeLimitExceededError,\n onChunkSizeExceededError,\n onInsufficientAudioActivityError,\n onConnect,\n onDisconnect,\n\n // Connection options\n token: defaultToken,\n modelId: defaultModelId,\n baseUri: defaultBaseUri,\n commitStrategy: defaultCommitStrategy,\n vadSilenceThresholdSecs: defaultVadSilenceThresholdSecs,\n vadThreshold: defaultVadThreshold,\n minSpeechDurationMs: defaultMinSpeechDurationMs,\n minSilenceDurationMs: defaultMinSilenceDurationMs,\n languageCode: defaultLanguageCode,\n\n // Mode options\n microphone: defaultMicrophone,\n audioFormat: defaultAudioFormat,\n sampleRate: defaultSampleRate,\n\n // Auto-connect\n autoConnect = false,\n\n // Timestamps\n includeTimestamps: defaultIncludeTimestamps,\n\n // Keyterms and verbatim control\n keyterms: defaultKeyterms,\n noVerbatim: defaultNoVerbatim,\n } = options;\n\n const connectionRef = useRef<RealtimeConnection | null>(null);\n\n const [status, setStatus] = useState<ScribeStatus>(\"disconnected\");\n const [partialTranscript, setPartialTranscript] = useState<string>(\"\");\n const [committedTranscripts, setCommittedTranscripts] = useState<\n TranscriptSegment[]\n >([]);\n const [error, setError] = useState<string | null>(null);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n connectionRef.current?.close();\n };\n }, []);\n\n const connect = useCallback(\n async (runtimeOptions: Partial<ScribeHookOptions> = {}) => {\n if (connectionRef.current) {\n console.warn(\"Already connected\");\n return;\n }\n\n try {\n setStatus(\"connecting\");\n setError(null);\n\n // Merge default options with runtime options\n const token = runtimeOptions.token || defaultToken;\n const modelId = runtimeOptions.modelId || defaultModelId;\n\n if (!token) {\n throw new Error(\"Token is required\");\n }\n if (!modelId) {\n throw new Error(\"Model ID is required\");\n }\n\n // Determine mode: microphone or manual\n const microphone = runtimeOptions.microphone || defaultMicrophone;\n const audioFormat = runtimeOptions.audioFormat || defaultAudioFormat;\n const sampleRate = runtimeOptions.sampleRate || defaultSampleRate;\n\n let connection: RealtimeConnection;\n\n // Include timestamps if explicitly requested OR if the callback is provided\n const includeTimestamps =\n runtimeOptions.includeTimestamps ??\n defaultIncludeTimestamps ??\n !!(\n runtimeOptions.onCommittedTranscriptWithTimestamps ||\n onCommittedTranscriptWithTimestamps\n );\n\n if (microphone) {\n // Microphone mode\n connection = Scribe.connect({\n token,\n modelId,\n baseUri: runtimeOptions.baseUri || defaultBaseUri,\n commitStrategy:\n runtimeOptions.commitStrategy || defaultCommitStrategy,\n vadSilenceThresholdSecs:\n runtimeOptions.vadSilenceThresholdSecs ||\n defaultVadSilenceThresholdSecs,\n vadThreshold: runtimeOptions.vadThreshold || defaultVadThreshold,\n minSpeechDurationMs:\n runtimeOptions.minSpeechDurationMs || defaultMinSpeechDurationMs,\n minSilenceDurationMs:\n runtimeOptions.minSilenceDurationMs ||\n defaultMinSilenceDurationMs,\n languageCode: runtimeOptions.languageCode || defaultLanguageCode,\n keyterms: runtimeOptions.keyterms || defaultKeyterms,\n noVerbatim: runtimeOptions.noVerbatim ?? defaultNoVerbatim,\n microphone,\n includeTimestamps,\n } as MicrophoneOptions);\n } else if (audioFormat && sampleRate) {\n // Manual audio mode\n connection = Scribe.connect({\n token,\n modelId,\n baseUri: runtimeOptions.baseUri || defaultBaseUri,\n commitStrategy:\n runtimeOptions.commitStrategy || defaultCommitStrategy,\n vadSilenceThresholdSecs:\n runtimeOptions.vadSilenceThresholdSecs ||\n defaultVadSilenceThresholdSecs,\n vadThreshold: runtimeOptions.vadThreshold || defaultVadThreshold,\n minSpeechDurationMs:\n runtimeOptions.minSpeechDurationMs || defaultMinSpeechDurationMs,\n minSilenceDurationMs:\n runtimeOptions.minSilenceDurationMs ||\n defaultMinSilenceDurationMs,\n languageCode: runtimeOptions.languageCode || defaultLanguageCode,\n keyterms: runtimeOptions.keyterms || defaultKeyterms,\n noVerbatim: runtimeOptions.noVerbatim ?? defaultNoVerbatim,\n includeTimestamps,\n audioFormat,\n sampleRate,\n } as AudioOptions);\n } else {\n throw new Error(\n \"Either microphone options or (audioFormat + sampleRate) must be provided\"\n );\n }\n\n connectionRef.current = connection;\n\n // Set up event listeners\n connection.on(RealtimeEvents.SESSION_STARTED, () => {\n setStatus(\"connected\");\n onSessionStarted?.();\n });\n\n connection.on(RealtimeEvents.PARTIAL_TRANSCRIPT, (data: unknown) => {\n const message = data as PartialTranscriptMessage;\n setPartialTranscript(message.text);\n setStatus(\"transcribing\");\n onPartialTranscript?.(message);\n });\n\n connection.on(RealtimeEvents.COMMITTED_TRANSCRIPT, (data: unknown) => {\n const message = data as CommittedTranscriptMessage;\n const segment: TranscriptSegment = {\n id: `${Date.now()}-${Math.random()}`,\n text: message.text,\n timestamp: Date.now(),\n isFinal: true,\n };\n setCommittedTranscripts(prev => [...prev, segment]);\n setPartialTranscript(\"\");\n onCommittedTranscript?.(message);\n });\n\n connection.on(\n RealtimeEvents.COMMITTED_TRANSCRIPT_WITH_TIMESTAMPS,\n (data: unknown) => {\n const message = data as CommittedTranscriptWithTimestampsMessage;\n const segment: TranscriptSegment = {\n id: `${Date.now()}-${Math.random()}`,\n text: message.text,\n timestamp: Date.now(),\n isFinal: true,\n words: message.words,\n };\n setCommittedTranscripts(prev => [...prev, segment]);\n setPartialTranscript(\"\");\n onCommittedTranscriptWithTimestamps?.(message);\n }\n );\n\n connection.on(RealtimeEvents.ERROR, (err: unknown) => {\n const message = err as ScribeErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onError?.(new Error(message.error));\n });\n\n connection.on(RealtimeEvents.AUTH_ERROR, (data: unknown) => {\n const message = data as ScribeAuthErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onAuthError?.(message);\n });\n\n connection.on(RealtimeEvents.QUOTA_EXCEEDED, (data: unknown) => {\n const message = data as ScribeQuotaExceededErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onQuotaExceededError?.(message);\n });\n\n connection.on(RealtimeEvents.COMMIT_THROTTLED, (data: unknown) => {\n const message = data as ScribeCommitThrottledErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onCommitThrottledError?.(message);\n });\n\n connection.on(RealtimeEvents.TRANSCRIBER_ERROR, (data: unknown) => {\n const message = data as ScribeTranscriberErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onTranscriberError?.(message);\n });\n\n connection.on(RealtimeEvents.UNACCEPTED_TERMS, (data: unknown) => {\n const message = data as ScribeUnacceptedTermsErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onUnacceptedTermsError?.(message);\n });\n\n connection.on(RealtimeEvents.RATE_LIMITED, (data: unknown) => {\n const message = data as ScribeRateLimitedErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onRateLimitedError?.(message);\n });\n\n connection.on(RealtimeEvents.INPUT_ERROR, (data: unknown) => {\n const message = data as ScribeInputErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onInputError?.(message);\n });\n\n connection.on(RealtimeEvents.QUEUE_OVERFLOW, (data: unknown) => {\n const message = data as ScribeQueueOverflowErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onQueueOverflowError?.(message);\n });\n\n connection.on(RealtimeEvents.RESOURCE_EXHAUSTED, (data: unknown) => {\n const message = data as ScribeResourceExhaustedErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onResourceExhaustedError?.(message);\n });\n\n connection.on(\n RealtimeEvents.SESSION_TIME_LIMIT_EXCEEDED,\n (data: unknown) => {\n const message = data as ScribeSessionTimeLimitExceededErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onSessionTimeLimitExceededError?.(message);\n }\n );\n\n connection.on(RealtimeEvents.CHUNK_SIZE_EXCEEDED, (data: unknown) => {\n const message = data as ScribeChunkSizeExceededErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onChunkSizeExceededError?.(message);\n });\n\n connection.on(\n RealtimeEvents.INSUFFICIENT_AUDIO_ACTIVITY,\n (data: unknown) => {\n const message = data as ScribeInsufficientAudioActivityErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onInsufficientAudioActivityError?.(message);\n }\n );\n\n connection.on(RealtimeEvents.OPEN, () => {\n onConnect?.();\n });\n\n connection.on(RealtimeEvents.CLOSE, () => {\n setStatus(\"disconnected\");\n connectionRef.current = null;\n onDisconnect?.();\n });\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"Failed to connect\";\n setError(errorMessage);\n setStatus(\"error\");\n throw err;\n }\n },\n [\n defaultToken,\n defaultModelId,\n defaultBaseUri,\n defaultCommitStrategy,\n defaultVadSilenceThresholdSecs,\n defaultVadThreshold,\n defaultMinSpeechDurationMs,\n defaultMinSilenceDurationMs,\n defaultLanguageCode,\n defaultMicrophone,\n defaultAudioFormat,\n defaultSampleRate,\n defaultIncludeTimestamps,\n defaultKeyterms,\n defaultNoVerbatim,\n onSessionStarted,\n onPartialTranscript,\n onCommittedTranscript,\n onCommittedTranscriptWithTimestamps,\n onError,\n onAuthError,\n onQuotaExceededError,\n onCommitThrottledError,\n onTranscriberError,\n onUnacceptedTermsError,\n onRateLimitedError,\n onInputError,\n onQueueOverflowError,\n onResourceExhaustedError,\n onSessionTimeLimitExceededError,\n onChunkSizeExceededError,\n onInsufficientAudioActivityError,\n onConnect,\n onDisconnect,\n ]\n );\n\n const disconnect = useCallback(() => {\n connectionRef.current?.close();\n connectionRef.current = null;\n setStatus(\"disconnected\");\n }, []);\n\n const sendAudio = useCallback(\n (\n audioBase64: string,\n options?: { commit?: boolean; sampleRate?: number; previousText?: string }\n ) => {\n if (!connectionRef.current) {\n throw new Error(\"Not connected to Scribe\");\n }\n connectionRef.current.send({ audioBase64, ...options });\n },\n []\n );\n\n const commit = useCallback(() => {\n if (!connectionRef.current) {\n throw new Error(\"Not connected to Scribe\");\n }\n connectionRef.current.commit();\n }, []);\n\n const clearTranscripts = useCallback(() => {\n setCommittedTranscripts([]);\n setPartialTranscript(\"\");\n }, []);\n\n const getConnection = useCallback(() => {\n return connectionRef.current;\n }, []);\n\n // Auto-connect if enabled\n useEffect(() => {\n if (autoConnect) {\n // eslint-disable-next-line react-hooks/set-state-in-effect -- autoConnect intentionally starts the connection when the hook mounts\n connect();\n }\n }, [autoConnect, connect]);\n\n return {\n // State\n status,\n isConnected: status === \"connected\" || status === \"transcribing\",\n isTranscribing: status === \"transcribing\",\n partialTranscript,\n committedTranscripts,\n error,\n\n // Methods\n connect,\n disconnect,\n sendAudio,\n commit,\n clearTranscripts,\n getConnection,\n };\n}\n\n// Export types and enums from client for convenience\nexport {\n AudioFormat,\n CommitStrategy,\n RealtimeEvents,\n} from \"@elevenlabs/client\";\nexport type { RealtimeConnection } from \"@elevenlabs/client\";\n","import {\n createContext,\n useContext,\n useLayoutEffect,\n useRef,\n type MutableRefObject,\n type RefObject,\n} from \"react\";\nimport type {\n Callbacks,\n ClientToolsConfig,\n Conversation,\n} from \"@elevenlabs/client\";\nimport type { HookOptions } from \"./types.js\";\n\ntype ClientToolEntry = ClientToolsConfig[\"clientTools\"][string];\n\nexport type ConversationContextValue = {\n conversation: Conversation | null;\n /** Stable ref to the active conversation — use in callbacks to avoid re-renders. */\n conversationRef: RefObject<Conversation | null>;\n startSession: (options?: HookOptions) => void;\n endSession: () => void;\n /**\n * For sub-providers — register callback handlers to be composed into the\n * next `Conversation.startSession()` call. Returns an unsubscribe function.\n */\n registerCallbacks: (callbacks: Partial<Callbacks>) => () => void;\n /** Registry of hook-registered client tools. Survives across sessions. */\n clientToolsRegistry: Map<string, ClientToolEntry>;\n /** Ref to the live clientTools object currently held by BaseConversation. */\n clientToolsRef: MutableRefObject<Record<string, ClientToolEntry>>;\n};\n\nexport const ConversationContext =\n createContext<ConversationContextValue | null>(null);\n\n/**\n * Returns the raw `Conversation` instance (or `null` if no session is active).\n * This is a public escape hatch for advanced use cases that need direct access\n * to the underlying `@elevenlabs/client` Conversation object.\n *\n * Can be used outside a `ConversationProvider` — returns `null` in that case.\n */\nexport function useRawConversation(): Conversation | null {\n const ctx = useContext(ConversationContext);\n return ctx?.conversation ?? null;\n}\n\n/**\n * Returns a stable ref to the active `Conversation` instance.\n * The ref's `.current` is `null` when no session is active, and updates\n * without causing re-renders — ideal for use inside callbacks and sub-providers.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useRawConversationRef(): RefObject<Conversation | null> {\n const ctx = useContext(ConversationContext);\n if (!ctx) {\n throw new Error(\n \"useRawConversationRef must be used within a ConversationProvider\"\n );\n }\n return ctx.conversationRef;\n}\n\n/**\n * Registers callback handlers with the nearest `ConversationProvider`.\n * Uses a ref internally so the latest callback values are always invoked\n * without re-subscribing on every render.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useRegisterCallbacks(callbacks: Partial<Callbacks>): void {\n const ctx = useContext(ConversationContext);\n if (!ctx) {\n throw new Error(\n \"useRegisterCallbacks must be used within a ConversationProvider\"\n );\n }\n\n const { registerCallbacks } = ctx;\n const callbacksRef = useRef(callbacks);\n\n // Re-subscribe when the set of provided callback keys changes.\n const activeKeyToken = Object.keys(callbacks)\n .filter(key => callbacks[key as keyof Callbacks] !== undefined)\n .sort()\n .join(\"|\");\n\n useLayoutEffect(() => {\n callbacksRef.current = callbacks;\n });\n\n useLayoutEffect(() => {\n const activeKeys = activeKeyToken === \"\" ? [] : activeKeyToken.split(\"|\");\n const stableCallbacks = Object.fromEntries(\n activeKeys.map((key: string) => [\n key,\n (...args: never[]) => {\n const fn = callbacksRef.current[key as keyof Callbacks];\n if (typeof fn === \"function\") {\n (fn as (...a: never[]) => void)(...args);\n }\n },\n ])\n ) as Partial<Callbacks>;\n return registerCallbacks(stableCallbacks);\n }, [registerCallbacks, activeKeyToken]);\n}\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import { createContext, useCallback, useContext, useMemo } from \"react\";\nimport {\n VoiceConversation,\n type FormatConfig,\n type InputDeviceConfig,\n type OutputConfig,\n type MultimodalMessageInput,\n type UploadFileResult,\n type ContextualUpdateOptions,\n} from \"@elevenlabs/client\";\nimport type { HookOptions } from \"./types.js\";\nimport { ConversationContext } from \"./ConversationContext.js\";\n\nconst EMPTY_FREQUENCY_DATA = new Uint8Array(0);\n\nexport type ConversationControlsValue = {\n startSession: (options?: HookOptions) => void;\n endSession: () => void;\n sendUserMessage: (text: string) => void;\n sendMultimodalMessage: (options: MultimodalMessageInput) => void;\n uploadFile: (file: Blob) => Promise<UploadFileResult>;\n sendContextualUpdate: (\n text: string,\n options?: ContextualUpdateOptions\n ) => void;\n sendUserActivity: () => void;\n sendMCPToolApprovalResult: (toolCallId: string, isApproved: boolean) => void;\n setVolume: (options: { volume: number }) => void;\n changeInputDevice: (\n config: Partial<FormatConfig> & InputDeviceConfig\n ) => Promise<void>;\n changeOutputDevice: (\n config: Partial<FormatConfig> & OutputConfig\n ) => Promise<void>;\n /** Returns byte frequency data (0-255) for the input, focused on 100-8000 Hz. */\n getInputByteFrequencyData: () => Uint8Array;\n /** Returns byte frequency data (0-255) for the output, focused on 100-8000 Hz. */\n getOutputByteFrequencyData: () => Uint8Array;\n getInputVolume: () => number;\n getOutputVolume: () => number;\n getId: () => string;\n};\n\nexport const ConversationControlsContext =\n createContext<ConversationControlsValue | null>(null);\n\n/**\n * Reads from `ConversationContext` and provides stable action references to\n * `ConversationControlsContext`. Must be rendered inside a `ConversationProvider`.\n */\nexport function ConversationControlsProvider({\n children,\n}: React.PropsWithChildren) {\n const ctx = useContext(ConversationContext);\n if (!ctx) {\n throw new Error(\n \"ConversationControlsProvider must be rendered inside a ConversationProvider\"\n );\n }\n\n const { conversationRef } = ctx;\n\n const getConversation = useCallback(() => {\n const conversation = conversationRef.current;\n if (!conversation) {\n throw new Error(\"No active conversation. Call startSession() first.\");\n }\n return conversation;\n }, [conversationRef]);\n\n const sendUserMessage = useCallback(\n (text: string) => {\n getConversation().sendUserMessage(text);\n },\n [getConversation]\n );\n\n const sendMultimodalMessage = useCallback(\n (options: MultimodalMessageInput) => {\n getConversation().sendMultimodalMessage(options);\n },\n [getConversation]\n );\n\n const uploadFile = useCallback(\n (file: Blob) => {\n return getConversation().uploadFile(file);\n },\n [getConversation]\n );\n\n const sendContextualUpdate = useCallback(\n (text: string, options?: ContextualUpdateOptions) => {\n getConversation().sendContextualUpdate(text, options);\n },\n [getConversation]\n );\n\n const sendUserActivity = useCallback(() => {\n getConversation().sendUserActivity();\n }, [getConversation]);\n\n const sendMCPToolApprovalResult = useCallback(\n (toolCallId: string, isApproved: boolean) => {\n getConversation().sendMCPToolApprovalResult(toolCallId, isApproved);\n },\n [getConversation]\n );\n\n const setVolume = useCallback(\n (options: { volume: number }) => {\n getConversation().setVolume(options);\n },\n [getConversation]\n );\n\n const changeInputDevice = useCallback(\n async (config: Partial<FormatConfig> & InputDeviceConfig) => {\n const conversation = getConversation();\n if (conversation instanceof VoiceConversation) {\n return await conversation.changeInputDevice(config);\n }\n throw new Error(\n \"Device switching is only available for voice conversations\"\n );\n },\n [getConversation]\n );\n\n const changeOutputDevice = useCallback(\n async (config: Partial<FormatConfig> & OutputConfig) => {\n const conversation = getConversation();\n if (conversation instanceof VoiceConversation) {\n return await conversation.changeOutputDevice(config);\n }\n throw new Error(\n \"Device switching is only available for voice conversations\"\n );\n },\n [getConversation]\n );\n\n const getInputByteFrequencyData = useCallback(() => {\n return (\n conversationRef.current?.getInputByteFrequencyData() ??\n EMPTY_FREQUENCY_DATA\n );\n }, [conversationRef]);\n\n const getOutputByteFrequencyData = useCallback(() => {\n return (\n conversationRef.current?.getOutputByteFrequencyData() ??\n EMPTY_FREQUENCY_DATA\n );\n }, [conversationRef]);\n\n const getInputVolume = useCallback(() => {\n return conversationRef.current?.getInputVolume() ?? 0;\n }, [conversationRef]);\n\n const getOutputVolume = useCallback(() => {\n return conversationRef.current?.getOutputVolume() ?? 0;\n }, [conversationRef]);\n\n const getId = useCallback(() => {\n return getConversation().getId();\n }, [getConversation]);\n\n const value = useMemo<ConversationControlsValue>(\n () => ({\n startSession: ctx.startSession,\n endSession: ctx.endSession,\n sendUserMessage,\n sendMultimodalMessage,\n uploadFile,\n sendContextualUpdate,\n sendUserActivity,\n sendMCPToolApprovalResult,\n setVolume,\n changeInputDevice,\n changeOutputDevice,\n getInputByteFrequencyData,\n getOutputByteFrequencyData,\n getInputVolume,\n getOutputVolume,\n getId,\n }),\n [\n ctx.startSession,\n ctx.endSession,\n sendUserMessage,\n sendMultimodalMessage,\n uploadFile,\n sendContextualUpdate,\n sendUserActivity,\n sendMCPToolApprovalResult,\n setVolume,\n changeInputDevice,\n changeOutputDevice,\n getInputByteFrequencyData,\n getOutputByteFrequencyData,\n getInputVolume,\n getOutputVolume,\n getId,\n ]\n );\n\n return (\n <ConversationControlsContext.Provider value={value}>\n {children}\n </ConversationControlsContext.Provider>\n );\n}\n\n/**\n * Returns stable action references for controlling the conversation.\n * All function references are stable and will never cause re-renders.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useConversationControls(): ConversationControlsValue {\n const ctx = useContext(ConversationControlsContext);\n if (!ctx) {\n throw new Error(\n \"useConversationControls must be used within a ConversationProvider\"\n );\n }\n return ctx;\n}\n","import { createContext, useContext, useMemo, useState } from \"react\";\nimport { useRegisterCallbacks } from \"./ConversationContext.js\";\n\nexport type ConversationStatus =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"error\";\n\nexport type ConversationStatusValue = {\n status: ConversationStatus;\n message?: string;\n};\n\nconst ConversationStatusContext = createContext<ConversationStatusValue | null>(\n null\n);\n\n/**\n * Reads from `ConversationContext` and registers `onStatusChange` + `onError`\n * callbacks. Manages its own `status`/`message` state and provides it through\n * `ConversationStatusContext`. Must be rendered inside a `ConversationProvider`.\n */\nexport function ConversationStatusProvider({\n children,\n}: React.PropsWithChildren) {\n const [status, setStatus] =\n useState<ConversationStatusValue[\"status\"]>(\"disconnected\");\n const [message, setMessage] = useState<string | undefined>(undefined);\n\n useRegisterCallbacks({\n onStatusChange({ status: newStatus }) {\n if (newStatus === \"disconnecting\") {\n // Transient state — keep current status\n return;\n }\n setStatus(newStatus);\n // Clear error message when transitioning to a non-error state\n setMessage(undefined);\n },\n onError(errorMessage) {\n setStatus(\"error\");\n setMessage(errorMessage);\n },\n });\n\n const value = useMemo<ConversationStatusValue>(\n () => ({ status, message }),\n [status, message]\n );\n\n return (\n <ConversationStatusContext.Provider value={value}>\n {children}\n </ConversationStatusContext.Provider>\n );\n}\n\n/**\n * Returns the current conversation status and any error message.\n * Re-renders when the connection status or error message changes.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useConversationStatus(): ConversationStatusValue {\n const ctx = useContext(ConversationStatusContext);\n if (!ctx) {\n throw new Error(\n \"useConversationStatus must be used within a ConversationProvider\"\n );\n }\n return ctx;\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n useRawConversation,\n useRawConversationRef,\n useRegisterCallbacks,\n} from \"./ConversationContext.js\";\n\nexport type ConversationInputValue = {\n isMuted: boolean;\n setMuted: (isMuted: boolean) => void;\n};\n\nexport type ConversationInputProviderProps = React.PropsWithChildren<{\n /** Controlled mute state. If omitted, provider manages state internally. */\n isMuted?: boolean;\n /** Called whenever mute state is changed via setMuted. */\n onMutedChange?: (isMuted: boolean) => void;\n}>;\n\nconst ConversationInputContext = createContext<ConversationInputValue | null>(\n null\n);\n\n/**\n * Reads from `ConversationContext` and manages microphone mute state.\n * `setMuted` calls `conversation.setMicMuted()` and updates local state.\n * Must be rendered inside a `ConversationProvider`.\n */\nexport function ConversationInputProvider({\n children,\n isMuted: controlledIsMuted,\n onMutedChange,\n}: ConversationInputProviderProps) {\n const conversation = useRawConversation();\n const conversationRef = useRawConversationRef();\n const isControlled = typeof controlledIsMuted === \"boolean\";\n const [uncontrolledIsMuted, setUncontrolledIsMuted] = useState(false);\n const isMuted = isControlled ? controlledIsMuted : uncontrolledIsMuted;\n\n useRegisterCallbacks({\n onDisconnect() {\n if (!isControlled) {\n setUncontrolledIsMuted(false);\n }\n },\n });\n\n useEffect(() => {\n if (isControlled && conversation) {\n conversation.setMicMuted(controlledIsMuted);\n }\n }, [conversation, controlledIsMuted, isControlled]);\n\n const setMuted = useCallback(\n (muted: boolean) => {\n const conversation = conversationRef.current;\n if (!conversation) {\n throw new Error(\"No active conversation. Call startSession() first.\");\n }\n if (!isControlled) {\n conversation.setMicMuted(muted);\n setUncontrolledIsMuted(muted);\n }\n onMutedChange?.(muted);\n },\n [conversationRef, isControlled, onMutedChange]\n );\n\n const value = useMemo<ConversationInputValue>(\n () => ({ isMuted, setMuted }),\n [isMuted, setMuted]\n );\n\n return (\n <ConversationInputContext.Provider value={value}>\n {children}\n </ConversationInputContext.Provider>\n );\n}\n\n/**\n * Returns the current microphone mute state and a function to change it.\n * Re-renders only when the mute state changes.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useConversationInput(): ConversationInputValue {\n const ctx = useContext(ConversationInputContext);\n if (!ctx) {\n throw new Error(\n \"useConversationInput must be used within a ConversationProvider\"\n );\n }\n return ctx;\n}\n","import { createContext, useContext, useMemo, useState } from \"react\";\nimport type { Mode } from \"@elevenlabs/client\";\nimport { useRegisterCallbacks } from \"./ConversationContext.js\";\n\nexport type ConversationModeValue = {\n mode: \"speaking\" | \"listening\";\n isSpeaking: boolean;\n isListening: boolean;\n};\n\nconst ConversationModeContext = createContext<ConversationModeValue | null>(\n null\n);\n\n/**\n * Reads from `ConversationContext` and registers an `onModeChange` callback.\n * Manages its own `mode` state and provides it through\n * `ConversationModeContext`. Must be rendered inside a `ConversationProvider`.\n */\nexport function ConversationModeProvider({\n children,\n}: React.PropsWithChildren) {\n const [mode, setMode] = useState<Mode>(\"listening\");\n\n useRegisterCallbacks({\n onModeChange({ mode: newMode }) {\n setMode(newMode);\n },\n onDisconnect() {\n setMode(\"listening\");\n },\n });\n\n const value = useMemo<ConversationModeValue>(\n () => ({\n mode,\n isSpeaking: mode === \"speaking\",\n isListening: mode === \"listening\",\n }),\n [mode]\n );\n\n return (\n <ConversationModeContext.Provider value={value}>\n {children}\n </ConversationModeContext.Provider>\n );\n}\n\n/**\n * Returns the current conversation mode (speaking/listening) and\n * convenience booleans. Re-renders only when the mode changes.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useConversationMode(): ConversationModeValue {\n const ctx = useContext(ConversationModeContext);\n if (!ctx) {\n throw new Error(\n \"useConversationMode must be used within a ConversationProvider\"\n );\n }\n return ctx;\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from \"react\";\nimport { useRawConversationRef, useRegisterCallbacks } from \"./ConversationContext.js\";\n\nexport type ConversationFeedbackValue = {\n canSendFeedback: boolean;\n sendFeedback: (like: boolean) => void;\n};\n\nconst ConversationFeedbackContext =\n createContext<ConversationFeedbackValue | null>(null);\n\n/**\n * Reads from `ConversationContext` and registers an `onCanSendFeedbackChange`\n * callback. Manages its own `canSendFeedback` state and provides it along with\n * a `sendFeedback` action through `ConversationFeedbackContext`.\n * Must be rendered inside a `ConversationProvider`.\n */\nexport function ConversationFeedbackProvider({\n children,\n}: React.PropsWithChildren) {\n const conversationRef = useRawConversationRef();\n const [canSendFeedback, setCanSendFeedback] = useState(false);\n\n useRegisterCallbacks({\n onCanSendFeedbackChange({ canSendFeedback: newValue }) {\n setCanSendFeedback(newValue);\n },\n onDisconnect() {\n setCanSendFeedback(false);\n },\n });\n\n const sendFeedback = useCallback((like: boolean) => {\n conversationRef.current?.sendFeedback(like);\n }, [conversationRef]);\n\n const value = useMemo<ConversationFeedbackValue>(\n () => ({\n canSendFeedback,\n sendFeedback,\n }),\n [canSendFeedback, sendFeedback]\n );\n\n return (\n <ConversationFeedbackContext.Provider value={value}>\n {children}\n </ConversationFeedbackContext.Provider>\n );\n}\n\n/**\n * Returns the current feedback state and a `sendFeedback` action.\n * Re-renders only when `canSendFeedback` changes.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useConversationFeedback(): ConversationFeedbackValue {\n const ctx = useContext(ConversationFeedbackContext);\n if (!ctx) {\n throw new Error(\n \"useConversationFeedback must be used within a ConversationProvider\"\n );\n }\n return ctx;\n}\n","import { createContext, useCallback, useContext, useLayoutEffect, useRef } from \"react\";\nimport type { ClientToolsConfig } from \"@elevenlabs/client\";\nimport { ConversationContext } from \"./ConversationContext.js\";\nimport type { ClientTool, ClientTools } from \"./types.js\";\n\ntype ClientToolEntry = ClientToolsConfig[\"clientTools\"][string];\n\n/**\n * Creates a fresh clientTools object by merging option-provided tools with\n * hook-registered tools from the registry. Throws if a hook-registered tool\n * name conflicts with an option-provided tool.\n */\nexport function buildClientTools(\n optionTools: Record<string, ClientToolEntry> | undefined,\n registry: Map<string, ClientToolEntry>\n): Record<string, ClientToolEntry> {\n const clientTools: Record<string, ClientToolEntry> = { ...optionTools };\n for (const [name, handler] of registry) {\n if (Object.hasOwn(clientTools, name)) {\n throw new Error(\n `Client tool \"${name}\" is already provided via props/options. ` +\n `Remove it from props or do not register it with useConversationClientTool.`\n );\n }\n clientTools[name] = handler;\n }\n return clientTools;\n}\n\n// ---------------------------------------------------------------------------\n// Sub-provider\n// ---------------------------------------------------------------------------\n\ntype RegisterClientTool = (\n name: string,\n handler: ClientToolEntry\n) => () => void;\n\nconst ConversationClientToolsContext = createContext<RegisterClientTool | null>(\n null\n);\n\nexport function ConversationClientToolsProvider({\n children,\n}: React.PropsWithChildren) {\n const ctx = useContext(ConversationContext);\n if (!ctx) {\n throw new Error(\n \"ConversationClientToolsProvider must be rendered inside a ConversationProvider\"\n );\n }\n\n const { clientToolsRegistry, clientToolsRef } = ctx;\n\n const registerClientTool: RegisterClientTool = useCallback(\n (name, handler) => {\n if (clientToolsRegistry.has(name)) {\n throw new Error(\n `Client tool \"${name}\" is already registered by another hook. ` +\n `Each tool name must be unique.`\n );\n }\n clientToolsRegistry.set(name, handler);\n clientToolsRef.current[name] = handler;\n return () => {\n if (clientToolsRegistry.get(name) === handler) {\n clientToolsRegistry.delete(name);\n }\n if (clientToolsRef.current[name] === handler) {\n delete clientToolsRef.current[name];\n }\n };\n },\n [clientToolsRegistry, clientToolsRef]\n );\n\n return (\n <ConversationClientToolsContext.Provider value={registerClientTool}>\n {children}\n </ConversationClientToolsContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Registers a named client tool with the nearest `ConversationProvider`.\n * The tool is available during any active conversation and is automatically\n * unregistered when the component unmounts.\n *\n * The handler always reflects the latest closure value (ref pattern),\n * so it is safe to reference component state or props without listing\n * them as dependencies.\n *\n * @typeParam TTools - An interface mapping tool names to function signatures.\n * @typeParam TName - The specific tool name (inferred from the first argument).\n * @param name - The tool name (must match the name configured on the agent).\n * @param handler - The function invoked when the agent calls this tool.\n *\n * @example\n * ```tsx\n * type Tools = {\n * get_weather: (params: { city: string }) => string;\n * set_volume: (params: { level: number }) => void;\n * };\n *\n * useConversationClientTool<Tools>(\"get_weather\", (params) => {\n * return `Weather in ${params.city} is sunny.`;\n * });\n * ```\n */\nexport function useConversationClientTool<\n TTools extends ClientTools = Record<string, ClientTool>,\n TName extends string & keyof TTools = string & keyof TTools,\n>(name: TName, handler: TTools[TName]): void {\n const registerClientTool = useContext(ConversationClientToolsContext);\n if (!registerClientTool) {\n throw new Error(\n \"useConversationClientTool must be used within a ConversationProvider\"\n );\n }\n\n const handlerRef = useRef(handler);\n // eslint-disable-next-line react-hooks/refs -- intentional sync during render for latest-ref pattern\n handlerRef.current = handler;\n\n useLayoutEffect(() => {\n const stableHandler: ClientToolEntry = parameters =>\n handlerRef.current(parameters as Parameters<TTools[TName]>[0]);\n return registerClientTool(name, stableHandler);\n }, [registerClientTool, name]);\n}\n","export class ListenerSet<Args extends unknown[]> {\n private listeners = new Set<(...args: Args) => void>();\n\n add(fn: (...args: Args) => void): () => void {\n this.listeners.add(fn);\n return () => {\n this.listeners.delete(fn);\n };\n }\n\n invoke(...args: Args): void {\n for (const fn of this.listeners) fn(...args);\n }\n\n get size(): number {\n return this.listeners.size;\n }\n}\n","import { ListenerSet } from \"./ListenerSet.js\";\n\nfunction assertFunction(\n value: unknown,\n key: string\n): asserts value is (...args: unknown[]) => void {\n if (typeof value !== \"function\") {\n throw new Error(`Expected function for key \"${key}\", got ${typeof value}`);\n }\n}\n\n/**\n * A map of named listener sets. Each key maps to a `ListenerSet` that can have\n * multiple listeners registered. Typed through `T` so that `register` and\n * `compose` preserve per-key callback signatures.\n *\n * All keys are pre-initialized in the constructor so `register` can validate\n * keys. `compose()` only includes keys with at least one registered listener,\n * preserving callback-presence semantics used by the client as feature guards.\n * For included keys, composed functions delegate to the live listener set, so\n * listeners added/removed after `compose()` still take effect. Keys with no\n * listeners at compose time are omitted entirely; call `compose()` again after\n * registering listeners to pick up newly populated keys.\n */\nexport class ListenerMap<\n T extends Record<string, ((...args: never[]) => void) | undefined>,\n> {\n private sets = new Map<string, ListenerSet<unknown[]>>();\n\n constructor(keys: readonly (keyof T & string)[]) {\n for (const key of keys) {\n this.sets.set(key, new ListenerSet<unknown[]>());\n }\n }\n\n /**\n * Register listeners for one or more keys. Returns a function that removes\n * all listeners added by this call.\n */\n register(callbacks: Partial<T>): () => void {\n const removers = Object.entries(callbacks)\n .filter(([, fn]) => fn !== undefined)\n .map(([key, fn]) => {\n assertFunction(fn, key);\n const set = this.sets.get(key);\n if (!set) {\n throw new Error(`Unknown callback key \"${key}\"`);\n }\n return set.add(fn);\n });\n return () => {\n for (const remove of removers) remove();\n };\n }\n\n /**\n * Compose all registered listeners into a single callbacks object. Each\n * composed function delegates to the live listener set, so listeners\n * added/removed after this call still take effect.\n */\n compose(): Partial<T> {\n return Object.fromEntries(\n Array.from(this.sets.entries())\n .filter(([, set]) => set.size > 0)\n .map(([key, set]) => [\n key,\n (...args: never[]) => {\n set.invoke(...args);\n },\n ])\n ) as Partial<T>;\n }\n}\n","import { useMemo, useRef } from \"react\";\nimport type { Callbacks } from \"@elevenlabs/client\";\nimport { CALLBACK_KEYS } from \"@elevenlabs/client/internal\";\nimport type { HookOptions } from \"./types.js\";\n\n/**\n * Wraps user-provided callback props in stable ref-backed functions,\n * preventing stale closure bugs when the session outlives renders.\n *\n * Returns a `Partial<Callbacks>` containing only the keys the caller\n * actually provided. Function references are stable per key across\n * renders, but always invoke the latest prop value. The returned object\n * reference is stable as long as the set of provided keys doesn't change.\n */\nexport function useStableCallbacks(props: HookOptions): Partial<Callbacks> {\n // Store the latest prop value for each callback in a ref.\n // Uses Record<string, unknown> to avoid TypeScript's union-to-intersection\n // issue when indexing Callbacks with a union of all its keys.\n const callbackRefs = useRef<Record<string, unknown>>({});\n\n // Compute a stable scalar from the set of provided keys so we can\n // memoize the result object.\n const activeKeys = CALLBACK_KEYS.filter(key => props[key] !== undefined);\n const activeKeySet = activeKeys.join(\"|\");\n const stableCallbacks = useMemo(\n () =>\n Object.fromEntries(\n activeKeys.map(key => [\n key,\n (...args: unknown[]) => {\n const fn = callbackRefs.current[key] as\n | ((...a: unknown[]) => void)\n | undefined;\n fn?.(...args);\n },\n ])\n ) as Partial<Callbacks>,\n // eslint-disable-next-line react-hooks/exhaustive-deps -- activeKeySet is a stable scalar derived from activeKeys\n [activeKeySet]\n );\n\n for (const key of CALLBACK_KEYS) {\n // eslint-disable-next-line react-hooks/refs -- callback refs intentionally track latest props for stable event handlers\n callbackRefs.current[key] = props[key];\n }\n\n return stableCallbacks;\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n Conversation,\n type Options,\n type Callbacks,\n type ConversationLifecycleOptions,\n} from \"@elevenlabs/client\";\nimport {\n CALLBACK_KEYS,\n mergeOptions,\n parseLocation,\n getOriginForLocation,\n getLivekitUrlForLocation,\n} from \"@elevenlabs/client/internal\";\n\nimport { type HookOptions } from \"./types.js\";\nimport {\n ConversationContext,\n type ConversationContextValue,\n} from \"./ConversationContext.js\";\nimport { ConversationControlsProvider } from \"./ConversationControls.js\";\nimport { ConversationStatusProvider } from \"./ConversationStatus.js\";\nimport {\n ConversationInputProvider,\n type ConversationInputProviderProps,\n} from \"./ConversationInput.js\";\nimport { ConversationModeProvider } from \"./ConversationMode.js\";\nimport { ConversationFeedbackProvider } from \"./ConversationFeedback.js\";\nimport {\n ConversationClientToolsProvider,\n buildClientTools,\n} from \"./ConversationClientTools.js\";\nimport { ListenerMap } from \"./ListenerMap.js\";\nimport { useStableCallbacks } from \"./useStableCallbacks.js\";\n\ntype ConversationInputControlProps = Pick<\n ConversationInputProviderProps,\n \"isMuted\" | \"onMutedChange\"\n>;\n\nconst SUB_PROVIDERS_WITHOUT_PROPS: React.ComponentType<React.PropsWithChildren>[] = [\n ConversationControlsProvider,\n ConversationStatusProvider,\n ConversationModeProvider,\n ConversationFeedbackProvider,\n ConversationClientToolsProvider,\n];\n\nexport type ConversationProviderProps = React.PropsWithChildren<\n HookOptions & ConversationInputControlProps\n>;\n\nexport function ConversationProvider({\n children,\n isMuted,\n onMutedChange,\n ...defaultOptions\n}: ConversationProviderProps) {\n /** The active conversation instance, if any. */\n const conversationRef = useRef<Conversation | null>(null);\n /** In-flight startSession promise, used to prevent duplicate connections. */\n const lockRef = useRef<Promise<Conversation> | null>(null);\n /** Monotonic id used to ignore stale async handlers from older starts. */\n const startSessionIdRef = useRef(0);\n /** Signals that endSession was called while a connection was still pending. */\n const shouldEndRef = useRef(false);\n /** Registry of hook-registered client tools. Survives across sessions. */\n const [clientToolsRegistry] = useState(\n () => new Map<string, NonNullable<Options[\"clientTools\"]>[string]>()\n );\n /** Ref to the live clientTools object currently held by BaseConversation. */\n const clientToolsRef = useRef<Record<string, NonNullable<Options[\"clientTools\"]>[string]>>({});\n /** Always holds the latest provider props, avoiding stale closures in callbacks. */\n const defaultOptionsRef = useRef(defaultOptions);\n // eslint-disable-next-line react-hooks/refs -- intentional sync during render for latest-ref pattern\n defaultOptionsRef.current = defaultOptions;\n\n /** Callback registry for sub-providers (status, mode, feedback, etc.). */\n const [listenerMap] = useState(\n () => new ListenerMap<Callbacks>(CALLBACK_KEYS)\n );\n\n /** Reactive mirror of conversationRef, triggers re-renders for context consumers. */\n const [conversation, setConversation] = useState<Conversation | null>(null);\n\n const stableCallbacks = useStableCallbacks(defaultOptions);\n\n const registerCallbacks = useCallback(\n (callbacks: Partial<Callbacks>) => listenerMap.register(callbacks),\n [listenerMap]\n );\n\n // Sync provider state when session ends externally (agent disconnect,\n // raw instance endSession(), etc.). Uses the listener map so it composes\n // with user-provided onDisconnect callbacks.\n useLayoutEffect(() => {\n return listenerMap.register({\n onDisconnect: () => {\n conversationRef.current = null;\n setConversation(null);\n },\n });\n }, [listenerMap]);\n\n const startSession = useCallback(\n (options?: HookOptions) => {\n if (conversationRef.current) {\n return;\n }\n if (lockRef.current) {\n return;\n }\n\n shouldEndRef.current = false;\n const startSessionId = ++startSessionIdRef.current;\n\n const defaults = defaultOptionsRef.current;\n const resolvedServerLocation = parseLocation(\n options?.serverLocation || defaults?.serverLocation\n );\n const origin = getOriginForLocation(resolvedServerLocation);\n const calculatedLivekitUrl = getLivekitUrlForLocation(\n resolvedServerLocation\n );\n\n // Strip raw callbacks from defaults — stableCallbacks provides\n // ref-backed versions that won't go stale across renders.\n const defaultConfig = { ...defaults };\n for (const key of CALLBACK_KEYS) {\n delete (defaultConfig as Record<string, unknown>)[key];\n }\n\n const sessionOptions = mergeOptions<Options>(\n { livekitUrl: calculatedLivekitUrl },\n defaultConfig,\n stableCallbacks,\n listenerMap.compose(),\n options ?? {},\n { origin }\n );\n\n const clientTools = buildClientTools(\n sessionOptions.clientTools,\n clientToolsRegistry\n );\n clientToolsRef.current = clientTools;\n sessionOptions.clientTools = clientTools;\n\n const userOnConversationCreated = sessionOptions.onConversationCreated;\n const isStaleStartSession = () =>\n startSessionId !== startSessionIdRef.current;\n\n const handleConversationCreated = (conv: Conversation) => {\n if (shouldEndRef.current || isStaleStartSession()) {\n return;\n }\n conversationRef.current = conv;\n setConversation(conv);\n userOnConversationCreated?.(conv);\n };\n\n const handleConnect: NonNullable<Callbacks[\"onConnect\"]> = props => {\n if (shouldEndRef.current || isStaleStartSession()) {\n return;\n }\n lockRef.current = null;\n sessionOptions.onConnect?.(props);\n };\n\n const providerLifecycleOptions: ConversationLifecycleOptions &\n Pick<Callbacks, \"onConnect\"> = {\n onConversationCreated: handleConversationCreated,\n onConnect: handleConnect,\n };\n\n const startSessionOptions: Options = {\n ...sessionOptions,\n ...providerLifecycleOptions,\n };\n\n lockRef.current = Conversation.startSession(startSessionOptions);\n\n lockRef.current.then(\n conv => {\n if (isStaleStartSession()) {\n return;\n }\n if (shouldEndRef.current) {\n conv.endSession();\n lockRef.current = null;\n return;\n }\n if (conversationRef.current !== conv) {\n conversationRef.current = conv;\n setConversation(conv);\n }\n lockRef.current = null;\n },\n (error: unknown) => {\n if (isStaleStartSession()) {\n return;\n }\n conversationRef.current = null;\n setConversation(null);\n lockRef.current = null;\n if (shouldEndRef.current) {\n return;\n }\n // The client SDK calls onStatusChange(\"disconnected\") before\n // rejecting, but never calls onError — surface the failure here\n // so listeners (e.g. ConversationStatusProvider) transition to\n // the \"error\" state with a meaningful message.\n const message =\n error instanceof Error\n ? error.message\n : \"Session failed to start\";\n sessionOptions.onError?.(message, error);\n }\n );\n },\n [stableCallbacks, listenerMap, clientToolsRegistry, clientToolsRef]\n );\n\n const endSession = useCallback(() => {\n shouldEndRef.current = true;\n const pendingConnection = lockRef.current;\n const conv = conversationRef.current;\n conversationRef.current = null;\n setConversation(null);\n\n if (pendingConnection) {\n pendingConnection.then(c => c.endSession(), () => {});\n } else {\n conv?.endSession();\n }\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n shouldEndRef.current = true;\n if (lockRef.current) {\n lockRef.current.then(conv => conv.endSession(), () => {});\n } else {\n conversationRef.current?.endSession();\n }\n };\n }, []);\n\n const contextValue = useMemo<ConversationContextValue>(\n () => ({\n conversation,\n conversationRef,\n startSession,\n endSession,\n registerCallbacks,\n clientToolsRegistry,\n clientToolsRef,\n }),\n [conversation, conversationRef, startSession, endSession, registerCallbacks, clientToolsRegistry, clientToolsRef]\n );\n\n const wrappedChildren = SUB_PROVIDERS_WITHOUT_PROPS.reduceRight<React.ReactNode>(\n (nested, Provider) => <Provider>{nested}</Provider>,\n <ConversationInputProvider\n isMuted={isMuted}\n onMutedChange={onMutedChange}\n >\n {children}\n </ConversationInputProvider>\n );\n\n return (\n <ConversationContext.Provider value={contextValue}>\n {wrappedChildren}\n </ConversationContext.Provider>\n );\n}\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { CALLBACK_KEYS } from \"@elevenlabs/client/internal\";\n\nimport { useConversationControls } from \"./ConversationControls.js\";\nimport { useConversationStatus } from \"./ConversationStatus.js\";\nimport { useConversationInput } from \"./ConversationInput.js\";\nimport { useConversationMode } from \"./ConversationMode.js\";\nimport { useConversationFeedback } from \"./ConversationFeedback.js\";\nimport {\n useRawConversation,\n useRegisterCallbacks,\n} from \"./ConversationContext.js\";\nimport { useStableCallbacks } from \"./useStableCallbacks.js\";\nimport type { HookOptions } from \"./types.js\";\n\nexport type UseConversationOptions = HookOptions & {\n micMuted?: boolean;\n volume?: number;\n};\n\n/**\n * Convenience hook that combines all granular conversation hooks into a single\n * return value. Less performant than using individual hooks because any state\n * change in any sub-context triggers a re-render of the consuming component.\n *\n * Accepts optional `micMuted`, `volume`, session config, and callback props.\n * Session config and callbacks passed here are used as defaults when calling\n * `startSession()` without arguments. Callbacks are also registered with the\n * provider so they stay up-to-date across re-renders.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useConversation(props: UseConversationOptions = {}) {\n const { micMuted, volume, ...hookOptions } = props;\n\n const stableCallbacks = useStableCallbacks(hookOptions);\n useRegisterCallbacks(stableCallbacks);\n\n const hookOptionsRef = useRef(hookOptions);\n // eslint-disable-next-line react-hooks/refs -- intentional sync during render for latest-ref pattern\n hookOptionsRef.current = hookOptions;\n\n const controls = useConversationControls();\n const { status, message } = useConversationStatus();\n const { isMuted, setMuted } = useConversationInput();\n const { mode, isSpeaking, isListening } = useConversationMode();\n const { canSendFeedback, sendFeedback } = useConversationFeedback();\n\n const startSession = useCallback(\n (options?: HookOptions) => {\n // Strip callbacks from the hook-level defaults: those are registered via\n // useRegisterCallbacks and kept ref-stable across renders.\n // NOTE: We intentionally do NOT strip callbacks from the `options` parameter\n // here. Callbacks passed directly to startSession() are treated as one-shot\n // per-session overrides, and may capture render-local state. This asymmetry\n // (hook callbacks are ref-stable; startSession callbacks are one-shot) is\n // intentional and relied on by the public API.\n const sessionConfig = { ...hookOptionsRef.current };\n for (const key of CALLBACK_KEYS) {\n delete (sessionConfig as Record<string, unknown>)[key];\n }\n controls.startSession({\n ...sessionConfig,\n ...options,\n } as HookOptions);\n },\n [controls, hookOptionsRef]\n );\n\n const conversation = useRawConversation();\n\n useEffect(() => {\n if (micMuted !== undefined && conversation) {\n setMuted(micMuted);\n }\n }, [micMuted, conversation, setMuted]);\n\n useEffect(() => {\n if (volume !== undefined && conversation) {\n conversation.setVolume({ volume });\n }\n }, [volume, conversation]);\n\n return {\n ...controls,\n startSession,\n status,\n message,\n isMuted: micMuted ?? isMuted,\n setMuted,\n mode,\n isSpeaking,\n isListening,\n canSendFeedback,\n sendFeedback,\n };\n}\n","import { setSourceInfo } from \"@elevenlabs/client/internal\";\nimport { PACKAGE_VERSION } from \"./version.js\";\n\nsetSourceInfo({ name: \"react_sdk\", version: PACKAGE_VERSION });\n\nexport * from \"@elevenlabs/client\";\n\n// Scribe exports\nexport {\n useScribe,\n AudioFormat,\n CommitStrategy,\n RealtimeEvents,\n} from \"./scribe.js\";\nexport type {\n ScribeStatus,\n TranscriptSegment,\n WordTimestamp,\n ScribeCallbacks,\n ScribeHookOptions,\n UseScribeReturn,\n RealtimeConnection,\n} from \"./scribe.js\";\n\n// Conversation context API\nexport { ConversationProvider } from \"./conversation/ConversationProvider.js\";\nexport { useConversationControls } from \"./conversation/ConversationControls.js\";\nexport { useConversationStatus } from \"./conversation/ConversationStatus.js\";\nexport { useConversationInput } from \"./conversation/ConversationInput.js\";\nexport { useConversationMode } from \"./conversation/ConversationMode.js\";\nexport { useConversationFeedback } from \"./conversation/ConversationFeedback.js\";\nexport { useRawConversation } from \"./conversation/ConversationContext.js\";\nexport { useConversation } from \"./conversation/useConversation.js\";\nexport { useConversationClientTool } from \"./conversation/ConversationClientTools.js\";\nexport type { UseConversationOptions } from \"./conversation/useConversation.js\";\nexport type { ConversationControlsValue } from \"./conversation/ConversationControls.js\";\nexport type { ConversationInputValue } from \"./conversation/ConversationInput.js\";\nexport type {\n ConversationStatus,\n ConversationStatusValue,\n} from \"./conversation/ConversationStatus.js\";\nexport type { ConversationModeValue } from \"./conversation/ConversationMode.js\";\nexport type { ConversationFeedbackValue } from \"./conversation/ConversationFeedback.js\";\nexport type { ConversationProviderProps } from \"./conversation/ConversationProvider.js\";\nexport type {\n HookOptions,\n HookCallbacks,\n ClientTool,\n ClientTools,\n ClientToolResult,\n} from \"./conversation/types.js\";\n"],"x_google_ignoreList":[3,4],"mappings":";;;;;;CACA,MAAa,kBAAkB;;;CC6I/B,SAAgB,UAAU,UAA6B,EAAE,EAAmB;EAC1E,MAAM,EAEJ,kBACA,qBACA,uBACA,qCACA,SACA,aACA,sBACA,wBACA,oBACA,wBACA,oBACA,cACA,sBACA,0BACA,iCACA,0BACA,kCACA,WACA,cAGA,OAAO,cACP,SAAS,gBACT,SAAS,gBACT,gBAAgB,uBAChB,yBAAyB,gCACzB,cAAc,qBACd,qBAAqB,4BACrB,sBAAsB,6BACtB,cAAc,qBAGd,YAAY,mBACZ,aAAa,oBACb,YAAY,mBAGZ,cAAc,OAGd,mBAAmB,0BAGnB,UAAU,iBACV,YAAY,sBACV;EAEJ,MAAM,iBAAA,GAAA,MAAA,QAAkD,KAAK;EAE7D,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,UAAoC,eAAe;EAClE,MAAM,CAAC,mBAAmB,yBAAA,GAAA,MAAA,UAAyC,GAAG;EACtE,MAAM,CAAC,sBAAsB,4BAAA,GAAA,MAAA,UAE3B,EAAE,CAAC;EACL,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,UAAoC,KAAK;AAGvD,GAAA,GAAA,MAAA,iBAAgB;AACd,gBAAa;AACX,kBAAc,SAAS,OAAO;;KAE/B,EAAE,CAAC;EAEN,MAAM,WAAA,GAAA,MAAA,aACJ,OAAO,iBAA6C,EAAE,KAAK;AACzD,OAAI,cAAc,SAAS;AACzB,YAAQ,KAAK,oBAAoB;AACjC;;AAGF,OAAI;AACF,cAAU,aAAa;AACvB,aAAS,KAAK;IAGd,MAAM,QAAQ,eAAe,SAAS;IACtC,MAAM,UAAU,eAAe,WAAW;AAE1C,QAAI,CAAC,MACH,OAAM,IAAI,MAAM,oBAAoB;AAEtC,QAAI,CAAC,QACH,OAAM,IAAI,MAAM,uBAAuB;IAIzC,MAAM,aAAa,eAAe,cAAc;IAChD,MAAM,cAAc,eAAe,eAAe;IAClD,MAAM,aAAa,eAAe,cAAc;IAEhD,IAAI;IAGJ,MAAM,oBACJ,eAAe,qBACf,4BACA,CAAC,EACC,eAAe,uCACf;AAGJ,QAAI,WAEF,cAAaA,mBAAAA,OAAO,QAAQ;KAC1B;KACA;KACA,SAAS,eAAe,WAAW;KACnC,gBACE,eAAe,kBAAkB;KACnC,yBACE,eAAe,2BACf;KACF,cAAc,eAAe,gBAAgB;KAC7C,qBACE,eAAe,uBAAuB;KACxC,sBACE,eAAe,wBACf;KACF,cAAc,eAAe,gBAAgB;KAC7C,UAAU,eAAe,YAAY;KACrC,YAAY,eAAe,cAAc;KACzC;KACA;KACD,CAAsB;aACd,eAAe,WAExB,cAAaA,mBAAAA,OAAO,QAAQ;KAC1B;KACA;KACA,SAAS,eAAe,WAAW;KACnC,gBACE,eAAe,kBAAkB;KACnC,yBACE,eAAe,2BACf;KACF,cAAc,eAAe,gBAAgB;KAC7C,qBACE,eAAe,uBAAuB;KACxC,sBACE,eAAe,wBACf;KACF,cAAc,eAAe,gBAAgB;KAC7C,UAAU,eAAe,YAAY;KACrC,YAAY,eAAe,cAAc;KACzC;KACA;KACA;KACD,CAAiB;QAElB,OAAM,IAAI,MACR,2EACD;AAGH,kBAAc,UAAU;AAGxB,eAAW,GAAGC,mBAAAA,eAAe,uBAAuB;AAClD,eAAU,YAAY;AACtB,yBAAoB;MACpB;AAEF,eAAW,GAAGA,mBAAAA,eAAe,qBAAqB,SAAkB;KAClE,MAAM,UAAU;AAChB,0BAAqB,QAAQ,KAAK;AAClC,eAAU,eAAe;AACzB,2BAAsB,QAAQ;MAC9B;AAEF,eAAW,GAAGA,mBAAAA,eAAe,uBAAuB,SAAkB;KACpE,MAAM,UAAU;KAChB,MAAM,UAA6B;MACjC,IAAI,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ;MAClC,MAAM,QAAQ;MACd,WAAW,KAAK,KAAK;MACrB,SAAS;MACV;AACD,8BAAwB,SAAQ,CAAC,GAAG,MAAM,QAAQ,CAAC;AACnD,0BAAqB,GAAG;AACxB,6BAAwB,QAAQ;MAChC;AAEF,eAAW,GACTA,mBAAAA,eAAe,uCACd,SAAkB;KACjB,MAAM,UAAU;KAChB,MAAM,UAA6B;MACjC,IAAI,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ;MAClC,MAAM,QAAQ;MACd,WAAW,KAAK,KAAK;MACrB,SAAS;MACT,OAAO,QAAQ;MAChB;AACD,8BAAwB,SAAQ,CAAC,GAAG,MAAM,QAAQ,CAAC;AACnD,0BAAqB,GAAG;AACxB,2CAAsC,QAAQ;MAEjD;AAED,eAAW,GAAGA,mBAAAA,eAAe,QAAQ,QAAiB;KACpD,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,eAAU,IAAI,MAAM,QAAQ,MAAM,CAAC;MACnC;AAEF,eAAW,GAAGA,mBAAAA,eAAe,aAAa,SAAkB;KAC1D,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,mBAAc,QAAQ;MACtB;AAEF,eAAW,GAAGA,mBAAAA,eAAe,iBAAiB,SAAkB;KAC9D,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,4BAAuB,QAAQ;MAC/B;AAEF,eAAW,GAAGA,mBAAAA,eAAe,mBAAmB,SAAkB;KAChE,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,8BAAyB,QAAQ;MACjC;AAEF,eAAW,GAAGA,mBAAAA,eAAe,oBAAoB,SAAkB;KACjE,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,0BAAqB,QAAQ;MAC7B;AAEF,eAAW,GAAGA,mBAAAA,eAAe,mBAAmB,SAAkB;KAChE,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,8BAAyB,QAAQ;MACjC;AAEF,eAAW,GAAGA,mBAAAA,eAAe,eAAe,SAAkB;KAC5D,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,0BAAqB,QAAQ;MAC7B;AAEF,eAAW,GAAGA,mBAAAA,eAAe,cAAc,SAAkB;KAC3D,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,oBAAe,QAAQ;MACvB;AAEF,eAAW,GAAGA,mBAAAA,eAAe,iBAAiB,SAAkB;KAC9D,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,4BAAuB,QAAQ;MAC/B;AAEF,eAAW,GAAGA,mBAAAA,eAAe,qBAAqB,SAAkB;KAClE,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,gCAA2B,QAAQ;MACnC;AAEF,eAAW,GACTA,mBAAAA,eAAe,8BACd,SAAkB;KACjB,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,uCAAkC,QAAQ;MAE7C;AAED,eAAW,GAAGA,mBAAAA,eAAe,sBAAsB,SAAkB;KACnE,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,gCAA2B,QAAQ;MACnC;AAEF,eAAW,GACTA,mBAAAA,eAAe,8BACd,SAAkB;KACjB,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,wCAAmC,QAAQ;MAE9C;AAED,eAAW,GAAGA,mBAAAA,eAAe,YAAY;AACvC,kBAAa;MACb;AAEF,eAAW,GAAGA,mBAAAA,eAAe,aAAa;AACxC,eAAU,eAAe;AACzB,mBAAc,UAAU;AACxB,qBAAgB;MAChB;YACK,KAAK;AAGZ,aADE,eAAe,QAAQ,IAAI,UAAU,oBACjB;AACtB,cAAU,QAAQ;AAClB,UAAM;;KAGV;GACE;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CACF;EAED,MAAM,cAAA,GAAA,MAAA,mBAA+B;AACnC,iBAAc,SAAS,OAAO;AAC9B,iBAAc,UAAU;AACxB,aAAU,eAAe;KACxB,EAAE,CAAC;EAEN,MAAM,aAAA,GAAA,MAAA,cAEF,aACA,YACG;AACH,OAAI,CAAC,cAAc,QACjB,OAAM,IAAI,MAAM,0BAA0B;AAE5C,iBAAc,QAAQ,KAAK;IAAE;IAAa,GAAG;IAAS,CAAC;KAEzD,EAAE,CACH;EAED,MAAM,UAAA,GAAA,MAAA,mBAA2B;AAC/B,OAAI,CAAC,cAAc,QACjB,OAAM,IAAI,MAAM,0BAA0B;AAE5C,iBAAc,QAAQ,QAAQ;KAC7B,EAAE,CAAC;EAEN,MAAM,oBAAA,GAAA,MAAA,mBAAqC;AACzC,2BAAwB,EAAE,CAAC;AAC3B,wBAAqB,GAAG;KACvB,EAAE,CAAC;EAEN,MAAM,iBAAA,GAAA,MAAA,mBAAkC;AACtC,UAAO,cAAc;KACpB,EAAE,CAAC;AAGN,GAAA,GAAA,MAAA,iBAAgB;AACd,OAAI,YAEF,UAAS;KAEV,CAAC,aAAa,QAAQ,CAAC;AAE1B,SAAO;GAEL;GACA,aAAa,WAAW,eAAe,WAAW;GAClD,gBAAgB,WAAW;GAC3B;GACA;GACA;GAGA;GACA;GACA;GACA;GACA;GACA;GACD;;;;CCzgBH,MAAa,uBAAA,GAAA,MAAA,eACoC,KAAK;;;;;;;;CAStD,SAAgB,qBAA0C;AAExD,UAAA,GAAA,MAAA,YADuB,oBAAoB,EAC/B,gBAAgB;;;;;;;;;CAU9B,SAAgB,wBAAwD;EACtE,MAAM,OAAA,GAAA,MAAA,YAAiB,oBAAoB;AAC3C,MAAI,CAAC,IACH,OAAM,IAAI,MACR,mEACD;AAEH,SAAO,IAAI;;;;;;;;;CAUb,SAAgB,qBAAqB,WAAqC;EACxE,MAAM,OAAA,GAAA,MAAA,YAAiB,oBAAoB;AAC3C,MAAI,CAAC,IACH,OAAM,IAAI,MACR,kEACD;EAGH,MAAM,EAAE,sBAAsB;EAC9B,MAAM,gBAAA,GAAA,MAAA,QAAsB,UAAU;EAGtC,MAAM,iBAAiB,OAAO,KAAK,UAAU,CAC1C,QAAO,QAAO,UAAU,SAA4B,KAAA,EAAU,CAC9D,MAAM,CACN,KAAK,IAAI;AAEZ,GAAA,GAAA,MAAA,uBAAsB;AACpB,gBAAa,UAAU;IACvB;AAEF,GAAA,GAAA,MAAA,uBAAsB;GACpB,MAAM,aAAa,mBAAmB,KAAK,EAAE,GAAG,eAAe,MAAM,IAAI;AAYzE,UAAO,kBAXiB,OAAO,YAC7B,WAAW,KAAK,QAAgB,CAC9B,MACC,GAAG,SAAkB;IACpB,MAAM,KAAK,aAAa,QAAQ;AAChC,QAAI,OAAO,OAAO,WACf,IAA+B,GAAG,KAAK;KAG7C,CAAC,CACH,CACwC;KACxC,CAAC,mBAAmB,eAAe,CAAC;;;;;;;;;;;;;;ECjGzC,IAAI,qBAAqB,OAAO,IAAI,6BAA6B;EAEjE,SAAS,QAAQ,MAAM,QAAQ,UAAU;GACvC,IAAI,MAAM;AACV,QAAK,MAAM,aAAa,MAAM,KAAK;AACnC,QAAK,MAAM,OAAO,QAAQ,MAAM,KAAK,OAAO;AAC5C,OAAI,SAAS,QAAQ;AACnB,eAAW,EAAE;AACb,SAAK,IAAI,YAAY,OACnB,WAAU,aAAa,SAAS,YAAY,OAAO;SAChD,YAAW;AAClB,YAAS,SAAS;AAClB,UAAO;IACL,UAAU;IACJ;IACD;IACL,KAAK,KAAK,MAAM,SAAS,SAAS;IAClC,OAAO;IACR;;AAGH,UAAQ,MAAM;;;;;AC7BZ,SAAO,UAAA,sCAAA;;CCUT,MAAM,uBAAuB,IAAI,WAAW,EAAE;CA8B9C,MAAa,+BAAA,GAAA,MAAA,eACqC,KAAK;;;;;CAMvD,SAAgB,6BAA6B,EAC3C,YAC0B;EAC1B,MAAM,OAAA,GAAA,MAAA,YAAiB,oBAAoB;AAC3C,MAAI,CAAC,IACH,OAAM,IAAI,MACR,8EACD;EAGH,MAAM,EAAE,oBAAoB;EAE5B,MAAM,mBAAA,GAAA,MAAA,mBAAoC;GACxC,MAAM,eAAe,gBAAgB;AACrC,OAAI,CAAC,aACH,OAAM,IAAI,MAAM,qDAAqD;AAEvE,UAAO;KACN,CAAC,gBAAgB,CAAC;EAErB,MAAM,mBAAA,GAAA,MAAA,cACH,SAAiB;AAChB,oBAAiB,CAAC,gBAAgB,KAAK;KAEzC,CAAC,gBAAgB,CAClB;EAED,MAAM,yBAAA,GAAA,MAAA,cACH,YAAoC;AACnC,oBAAiB,CAAC,sBAAsB,QAAQ;KAElD,CAAC,gBAAgB,CAClB;EAED,MAAM,cAAA,GAAA,MAAA,cACH,SAAe;AACd,UAAO,iBAAiB,CAAC,WAAW,KAAK;KAE3C,CAAC,gBAAgB,CAClB;EAED,MAAM,wBAAA,GAAA,MAAA,cACH,MAAc,YAAsC;AACnD,oBAAiB,CAAC,qBAAqB,MAAM,QAAQ;KAEvD,CAAC,gBAAgB,CAClB;EAED,MAAM,oBAAA,GAAA,MAAA,mBAAqC;AACzC,oBAAiB,CAAC,kBAAkB;KACnC,CAAC,gBAAgB,CAAC;EAErB,MAAM,6BAAA,GAAA,MAAA,cACH,YAAoB,eAAwB;AAC3C,oBAAiB,CAAC,0BAA0B,YAAY,WAAW;KAErE,CAAC,gBAAgB,CAClB;EAED,MAAM,aAAA,GAAA,MAAA,cACH,YAAgC;AAC/B,oBAAiB,CAAC,UAAU,QAAQ;KAEtC,CAAC,gBAAgB,CAClB;EAED,MAAM,qBAAA,GAAA,MAAA,aACJ,OAAO,WAAsD;GAC3D,MAAM,eAAe,iBAAiB;AACtC,OAAI,wBAAwBC,mBAAAA,kBAC1B,QAAO,MAAM,aAAa,kBAAkB,OAAO;AAErD,SAAM,IAAI,MACR,6DACD;KAEH,CAAC,gBAAgB,CAClB;EAED,MAAM,sBAAA,GAAA,MAAA,aACJ,OAAO,WAAiD;GACtD,MAAM,eAAe,iBAAiB;AACtC,OAAI,wBAAwBA,mBAAAA,kBAC1B,QAAO,MAAM,aAAa,mBAAmB,OAAO;AAEtD,SAAM,IAAI,MACR,6DACD;KAEH,CAAC,gBAAgB,CAClB;EAED,MAAM,6BAAA,GAAA,MAAA,mBAA8C;AAClD,UACE,gBAAgB,SAAS,2BAA2B,IACpD;KAED,CAAC,gBAAgB,CAAC;EAErB,MAAM,8BAAA,GAAA,MAAA,mBAA+C;AACnD,UACE,gBAAgB,SAAS,4BAA4B,IACrD;KAED,CAAC,gBAAgB,CAAC;EAErB,MAAM,kBAAA,GAAA,MAAA,mBAAmC;AACvC,UAAO,gBAAgB,SAAS,gBAAgB,IAAI;KACnD,CAAC,gBAAgB,CAAC;EAErB,MAAM,mBAAA,GAAA,MAAA,mBAAoC;AACxC,UAAO,gBAAgB,SAAS,iBAAiB,IAAI;KACpD,CAAC,gBAAgB,CAAC;EAErB,MAAM,SAAA,GAAA,MAAA,mBAA0B;AAC9B,UAAO,iBAAiB,CAAC,OAAO;KAC/B,CAAC,gBAAgB,CAAC;EAErB,MAAM,SAAA,GAAA,MAAA,gBACG;GACL,cAAc,IAAI;GAClB,YAAY,IAAI;GAChB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,GACD;GACE,IAAI;GACJ,IAAI;GACJ;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CACF;AAED,SACE,iBAAA,GAAA,mBAAA,KAAC,4BAA4B,UAA7B;GAA6C;GAC1C;GACoC,CAAA;;;;;;;;CAU3C,SAAgB,0BAAqD;EACnE,MAAM,OAAA,GAAA,MAAA,YAAiB,4BAA4B;AACnD,MAAI,CAAC,IACH,OAAM,IAAI,MACR,qEACD;AAEH,SAAO;;;;CCrNT,MAAM,6BAAA,GAAA,MAAA,eACJ,KACD;;;;;;CAOD,SAAgB,2BAA2B,EACzC,YAC0B;EAC1B,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,UAC+B,eAAe;EAC7D,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,UAA2C,KAAA,EAAU;AAErE,uBAAqB;GACnB,eAAe,EAAE,QAAQ,aAAa;AACpC,QAAI,cAAc,gBAEhB;AAEF,cAAU,UAAU;AAEpB,eAAW,KAAA,EAAU;;GAEvB,QAAQ,cAAc;AACpB,cAAU,QAAQ;AAClB,eAAW,aAAa;;GAE3B,CAAC;EAEF,MAAM,SAAA,GAAA,MAAA,gBACG;GAAE;GAAQ;GAAS,GAC1B,CAAC,QAAQ,QAAQ,CAClB;AAED,SACE,iBAAA,GAAA,mBAAA,KAAC,0BAA0B,UAA3B;GAA2C;GACxC;GACkC,CAAA;;;;;;;;CAUzC,SAAgB,wBAAiD;EAC/D,MAAM,OAAA,GAAA,MAAA,YAAiB,0BAA0B;AACjD,MAAI,CAAC,IACH,OAAM,IAAI,MACR,mEACD;AAEH,SAAO;;;;CC7CT,MAAM,4BAAA,GAAA,MAAA,eACJ,KACD;;;;;;CAOD,SAAgB,0BAA0B,EACxC,UACA,SAAS,mBACT,iBACiC;EACjC,MAAM,eAAe,oBAAoB;EACzC,MAAM,kBAAkB,uBAAuB;EAC/C,MAAM,eAAe,OAAO,sBAAsB;EAClD,MAAM,CAAC,qBAAqB,2BAAA,GAAA,MAAA,UAAmC,MAAM;EACrE,MAAM,UAAU,eAAe,oBAAoB;AAEnD,uBAAqB,EACnB,eAAe;AACb,OAAI,CAAC,aACH,wBAAuB,MAAM;KAGlC,CAAC;AAEF,GAAA,GAAA,MAAA,iBAAgB;AACd,OAAI,gBAAgB,aAClB,cAAa,YAAY,kBAAkB;KAE5C;GAAC;GAAc;GAAmB;GAAa,CAAC;EAEnD,MAAM,YAAA,GAAA,MAAA,cACH,UAAmB;GAClB,MAAM,eAAe,gBAAgB;AACrC,OAAI,CAAC,aACH,OAAM,IAAI,MAAM,qDAAqD;AAEvE,OAAI,CAAC,cAAc;AACjB,iBAAa,YAAY,MAAM;AAC/B,2BAAuB,MAAM;;AAE/B,mBAAgB,MAAM;KAExB;GAAC;GAAiB;GAAc;GAAc,CAC/C;EAED,MAAM,SAAA,GAAA,MAAA,gBACG;GAAE;GAAS;GAAU,GAC5B,CAAC,SAAS,SAAS,CACpB;AAED,SACE,iBAAA,GAAA,mBAAA,KAAC,yBAAyB,UAA1B;GAA0C;GACvC;GACiC,CAAA;;;;;;;;CAUxC,SAAgB,uBAA+C;EAC7D,MAAM,OAAA,GAAA,MAAA,YAAiB,yBAAyB;AAChD,MAAI,CAAC,IACH,OAAM,IAAI,MACR,kEACD;AAEH,SAAO;;;;CC1FT,MAAM,2BAAA,GAAA,MAAA,eACJ,KACD;;;;;;CAOD,SAAgB,yBAAyB,EACvC,YAC0B;EAC1B,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,UAA0B,YAAY;AAEnD,uBAAqB;GACnB,aAAa,EAAE,MAAM,WAAW;AAC9B,YAAQ,QAAQ;;GAElB,eAAe;AACb,YAAQ,YAAY;;GAEvB,CAAC;EAEF,MAAM,SAAA,GAAA,MAAA,gBACG;GACL;GACA,YAAY,SAAS;GACrB,aAAa,SAAS;GACvB,GACD,CAAC,KAAK,CACP;AAED,SACE,iBAAA,GAAA,mBAAA,KAAC,wBAAwB,UAAzB;GAAyC;GACtC;GACgC,CAAA;;;;;;;;CAUvC,SAAgB,sBAA6C;EAC3D,MAAM,OAAA,GAAA,MAAA,YAAiB,wBAAwB;AAC/C,MAAI,CAAC,IACH,OAAM,IAAI,MACR,iEACD;AAEH,SAAO;;;;CChDT,MAAM,+BAAA,GAAA,MAAA,eAC4C,KAAK;;;;;;;CAQvD,SAAgB,6BAA6B,EAC3C,YAC0B;EAC1B,MAAM,kBAAkB,uBAAuB;EAC/C,MAAM,CAAC,iBAAiB,uBAAA,GAAA,MAAA,UAA+B,MAAM;AAE7D,uBAAqB;GACnB,wBAAwB,EAAE,iBAAiB,YAAY;AACrD,uBAAmB,SAAS;;GAE9B,eAAe;AACb,uBAAmB,MAAM;;GAE5B,CAAC;EAEF,MAAM,gBAAA,GAAA,MAAA,cAA4B,SAAkB;AAClD,mBAAgB,SAAS,aAAa,KAAK;KAC1C,CAAC,gBAAgB,CAAC;EAErB,MAAM,SAAA,GAAA,MAAA,gBACG;GACL;GACA;GACD,GACD,CAAC,iBAAiB,aAAa,CAChC;AAED,SACE,iBAAA,GAAA,mBAAA,KAAC,4BAA4B,UAA7B;GAA6C;GAC1C;GACoC,CAAA;;;;;;;;CAU3C,SAAgB,0BAAqD;EACnE,MAAM,OAAA,GAAA,MAAA,YAAiB,4BAA4B;AACnD,MAAI,CAAC,IACH,OAAM,IAAI,MACR,qEACD;AAEH,SAAO;;;;;;;;;CC1DT,SAAgB,iBACd,aACA,UACiC;EACjC,MAAM,cAA+C,EAAE,GAAG,aAAa;AACvE,OAAK,MAAM,CAAC,MAAM,YAAY,UAAU;AACtC,OAAI,OAAO,OAAO,aAAa,KAAK,CAClC,OAAM,IAAI,MACR,gBAAgB,KAAK,qHAEtB;AAEH,eAAY,QAAQ;;AAEtB,SAAO;;CAYT,MAAM,kCAAA,GAAA,MAAA,eACJ,KACD;CAED,SAAgB,gCAAgC,EAC9C,YAC0B;EAC1B,MAAM,OAAA,GAAA,MAAA,YAAiB,oBAAoB;AAC3C,MAAI,CAAC,IACH,OAAM,IAAI,MACR,iFACD;EAGH,MAAM,EAAE,qBAAqB,mBAAmB;EAEhD,MAAM,sBAAA,GAAA,MAAA,cACH,MAAM,YAAY;AACjB,OAAI,oBAAoB,IAAI,KAAK,CAC/B,OAAM,IAAI,MACR,gBAAgB,KAAK,yEAEtB;AAEH,uBAAoB,IAAI,MAAM,QAAQ;AACtC,kBAAe,QAAQ,QAAQ;AAC/B,gBAAa;AACX,QAAI,oBAAoB,IAAI,KAAK,KAAK,QACpC,qBAAoB,OAAO,KAAK;AAElC,QAAI,eAAe,QAAQ,UAAU,QACnC,QAAO,eAAe,QAAQ;;KAIpC,CAAC,qBAAqB,eAAe,CACtC;AAED,SACE,iBAAA,GAAA,mBAAA,KAAC,+BAA+B,UAAhC;GAAyC,OAAO;GAC7C;GACuC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkC9C,SAAgB,0BAGd,MAAa,SAA8B;EAC3C,MAAM,sBAAA,GAAA,MAAA,YAAgC,+BAA+B;AACrE,MAAI,CAAC,mBACH,OAAM,IAAI,MACR,uEACD;EAGH,MAAM,cAAA,GAAA,MAAA,QAAoB,QAAQ;AAElC,aAAW,UAAU;AAErB,GAAA,GAAA,MAAA,uBAAsB;GACpB,MAAM,iBAAiC,eACrC,WAAW,QAAQ,WAA2C;AAChE,UAAO,mBAAmB,MAAM,cAAc;KAC7C,CAAC,oBAAoB,KAAK,CAAC;;;;CCpIhC,IAAa,cAAb,MAAiD;EAC/C,4BAAoB,IAAI,KAA8B;EAEtD,IAAI,IAAyC;AAC3C,QAAK,UAAU,IAAI,GAAG;AACtB,gBAAa;AACX,SAAK,UAAU,OAAO,GAAG;;;EAI7B,OAAO,GAAG,MAAkB;AAC1B,QAAK,MAAM,MAAM,KAAK,UAAW,IAAG,GAAG,KAAK;;EAG9C,IAAI,OAAe;AACjB,UAAO,KAAK,UAAU;;;;;CCb1B,SAAS,eACP,OACA,KAC+C;AAC/C,MAAI,OAAO,UAAU,WACnB,OAAM,IAAI,MAAM,8BAA8B,IAAI,SAAS,OAAO,QAAQ;;;;;;;;;;;;;;;CAiB9E,IAAa,cAAb,MAEE;EACA,uBAAe,IAAI,KAAqC;EAExD,YAAY,MAAqC;AAC/C,QAAK,MAAM,OAAO,KAChB,MAAK,KAAK,IAAI,KAAK,IAAI,aAAwB,CAAC;;;;;;EAQpD,SAAS,WAAmC;GAC1C,MAAM,WAAW,OAAO,QAAQ,UAAU,CACvC,QAAQ,GAAG,QAAQ,OAAO,KAAA,EAAU,CACpC,KAAK,CAAC,KAAK,QAAQ;AAClB,mBAAe,IAAI,IAAI;IACvB,MAAM,MAAM,KAAK,KAAK,IAAI,IAAI;AAC9B,QAAI,CAAC,IACH,OAAM,IAAI,MAAM,yBAAyB,IAAI,GAAG;AAElD,WAAO,IAAI,IAAI,GAAG;KAClB;AACJ,gBAAa;AACX,SAAK,MAAM,UAAU,SAAU,SAAQ;;;;;;;;EAS3C,UAAsB;AACpB,UAAO,OAAO,YACZ,MAAM,KAAK,KAAK,KAAK,SAAS,CAAC,CAC5B,QAAQ,GAAG,SAAS,IAAI,OAAO,EAAE,CACjC,KAAK,CAAC,KAAK,SAAS,CACnB,MACC,GAAG,SAAkB;AACpB,QAAI,OAAO,GAAG,KAAK;KAEtB,CAAC,CACL;;;;;;;;;;;;;;CCxDL,SAAgB,mBAAmB,OAAwC;EAIzE,MAAM,gBAAA,GAAA,MAAA,QAA+C,EAAE,CAAC;EAIxD,MAAM,aAAaC,4BAAAA,cAAc,QAAO,QAAO,MAAM,SAAS,KAAA,EAAU;EAExE,MAAM,mBAAA,GAAA,MAAA,eAEF,OAAO,YACL,WAAW,KAAI,QAAO,CACpB,MACC,GAAG,SAAoB;GACtB,MAAM,KAAK,aAAa,QAAQ;AAGhC,QAAK,GAAG,KAAK;IAEhB,CAAC,CACH,EAEH,CAfmB,WAAW,KAAK,IAAI,CAezB,CACf;AAED,OAAK,MAAM,OAAOA,4BAAAA,cAEhB,cAAa,QAAQ,OAAO,MAAM;AAGpC,SAAO;;;;CCCT,MAAM,8BAA8E;EAClF;EACA;EACA;EACA;EACA;EACD;CAMD,SAAgB,qBAAqB,EACnC,UACA,SACA,eACA,GAAG,kBACyB;;EAE5B,MAAM,mBAAA,GAAA,MAAA,QAA8C,KAAK;;EAEzD,MAAM,WAAA,GAAA,MAAA,QAA+C,KAAK;;EAE1D,MAAM,qBAAA,GAAA,MAAA,QAA2B,EAAE;;EAEnC,MAAM,gBAAA,GAAA,MAAA,QAAsB,MAAM;;EAElC,MAAM,CAAC,wBAAA,GAAA,MAAA,gCACC,IAAI,KAA0D,CACrE;;EAED,MAAM,kBAAA,GAAA,MAAA,QAAqF,EAAE,CAAC;;EAE9F,MAAM,qBAAA,GAAA,MAAA,QAA2B,eAAe;AAEhD,oBAAkB,UAAU;;EAG5B,MAAM,CAAC,gBAAA,GAAA,MAAA,gBACC,IAAI,YAAuBC,4BAAAA,cAAc,CAChD;;EAGD,MAAM,CAAC,cAAc,oBAAA,GAAA,MAAA,UAAiD,KAAK;EAE3E,MAAM,kBAAkB,mBAAmB,eAAe;EAE1D,MAAM,qBAAA,GAAA,MAAA,cACH,cAAkC,YAAY,SAAS,UAAU,EAClE,CAAC,YAAY,CACd;AAKD,GAAA,GAAA,MAAA,uBAAsB;AACpB,UAAO,YAAY,SAAS,EAC1B,oBAAoB;AAClB,oBAAgB,UAAU;AAC1B,oBAAgB,KAAK;MAExB,CAAC;KACD,CAAC,YAAY,CAAC;EAEjB,MAAM,gBAAA,GAAA,MAAA,cACH,YAA0B;AACzB,OAAI,gBAAgB,QAClB;AAEF,OAAI,QAAQ,QACV;AAGF,gBAAa,UAAU;GACvB,MAAM,iBAAiB,EAAE,kBAAkB;GAE3C,MAAM,WAAW,kBAAkB;GACnC,MAAM,0BAAA,GAAA,4BAAA,eACJ,SAAS,kBAAkB,UAAU,eACtC;GACD,MAAM,UAAA,GAAA,4BAAA,sBAA8B,uBAAuB;GAC3D,MAAM,wBAAA,GAAA,4BAAA,0BACJ,uBACD;GAID,MAAM,gBAAgB,EAAE,GAAG,UAAU;AACrC,QAAK,MAAM,OAAOA,4BAAAA,cAChB,QAAQ,cAA0C;GAGpD,MAAM,kBAAA,GAAA,4BAAA,cACJ,EAAE,YAAY,sBAAsB,EACpC,eACA,iBACA,YAAY,SAAS,EACrB,WAAW,EAAE,EACb,EAAE,QAAQ,CACX;GAED,MAAM,cAAc,iBAClB,eAAe,aACf,oBACD;AACD,kBAAe,UAAU;AACzB,kBAAe,cAAc;GAE7B,MAAM,4BAA4B,eAAe;GACjD,MAAM,4BACJ,mBAAmB,kBAAkB;GAEvC,MAAM,6BAA6B,SAAuB;AACxD,QAAI,aAAa,WAAW,qBAAqB,CAC/C;AAEF,oBAAgB,UAAU;AAC1B,oBAAgB,KAAK;AACrB,gCAA4B,KAAK;;GAGnC,MAAM,iBAAqD,UAAS;AAClE,QAAI,aAAa,WAAW,qBAAqB,CAC/C;AAEF,YAAQ,UAAU;AAClB,mBAAe,YAAY,MAAM;;GAGnC,MAAM,2BAC2B;IAC/B,uBAAuB;IACvB,WAAW;IACZ;GAED,MAAM,sBAA+B;IACnC,GAAG;IACH,GAAG;IACJ;AAED,WAAQ,UAAUC,mBAAAA,aAAa,aAAa,oBAAoB;AAEhE,WAAQ,QAAQ,MACd,SAAQ;AACN,QAAI,qBAAqB,CACvB;AAEF,QAAI,aAAa,SAAS;AACxB,UAAK,YAAY;AACjB,aAAQ,UAAU;AAClB;;AAEF,QAAI,gBAAgB,YAAY,MAAM;AACpC,qBAAgB,UAAU;AAC1B,qBAAgB,KAAK;;AAEvB,YAAQ,UAAU;OAEnB,UAAmB;AAClB,QAAI,qBAAqB,CACvB;AAEF,oBAAgB,UAAU;AAC1B,oBAAgB,KAAK;AACrB,YAAQ,UAAU;AAClB,QAAI,aAAa,QACf;IAMF,MAAM,UACJ,iBAAiB,QACb,MAAM,UACN;AACN,mBAAe,UAAU,SAAS,MAAM;KAE3C;KAEH;GAAC;GAAiB;GAAa;GAAqB;GAAe,CACpE;EAED,MAAM,cAAA,GAAA,MAAA,mBAA+B;AACnC,gBAAa,UAAU;GACvB,MAAM,oBAAoB,QAAQ;GAClC,MAAM,OAAO,gBAAgB;AAC7B,mBAAgB,UAAU;AAC1B,mBAAgB,KAAK;AAErB,OAAI,kBACF,mBAAkB,MAAK,MAAK,EAAE,YAAY,QAAQ,GAAG;OAErD,OAAM,YAAY;KAEnB,EAAE,CAAC;AAGN,GAAA,GAAA,MAAA,iBAAgB;AACd,gBAAa;AACX,iBAAa,UAAU;AACvB,QAAI,QAAQ,QACV,SAAQ,QAAQ,MAAK,SAAQ,KAAK,YAAY,QAAQ,GAAG;QAEzD,iBAAgB,SAAS,YAAY;;KAGxC,EAAE,CAAC;EAEN,MAAM,gBAAA,GAAA,MAAA,gBACG;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACD,GACD;GAAC;GAAc;GAAiB;GAAc;GAAY;GAAmB;GAAqB;GAAe,CAClH;EAED,MAAM,kBAAkB,4BAA4B,aACjD,QAAQ,aAAa,iBAAA,GAAA,mBAAA,KAAC,UAAD,EAAA,UAAW,QAAkB,CAAA,EACnD,iBAAA,GAAA,mBAAA,KAAC,2BAAD;GACW;GACM;GAEd;GACyB,CAAA,CAC7B;AAED,SACE,iBAAA,GAAA,mBAAA,KAAC,oBAAoB,UAArB;GAA8B,OAAO;aAClC;GAC4B,CAAA;;;;;;;;;;;;;;;;CC1PnC,SAAgB,gBAAgB,QAAgC,EAAE,EAAE;EAClE,MAAM,EAAE,UAAU,QAAQ,GAAG,gBAAgB;AAG7C,uBADwB,mBAAmB,YAAY,CAClB;EAErC,MAAM,kBAAA,GAAA,MAAA,QAAwB,YAAY;AAE1C,iBAAe,UAAU;EAEzB,MAAM,WAAW,yBAAyB;EAC1C,MAAM,EAAE,QAAQ,YAAY,uBAAuB;EACnD,MAAM,EAAE,SAAS,aAAa,sBAAsB;EACpD,MAAM,EAAE,MAAM,YAAY,gBAAgB,qBAAqB;EAC/D,MAAM,EAAE,iBAAiB,iBAAiB,yBAAyB;EAEnE,MAAM,gBAAA,GAAA,MAAA,cACH,YAA0B;GAQzB,MAAM,gBAAgB,EAAE,GAAG,eAAe,SAAS;AACnD,QAAK,MAAM,OAAOC,4BAAAA,cAChB,QAAQ,cAA0C;AAEpD,YAAS,aAAa;IACpB,GAAG;IACH,GAAG;IACJ,CAAgB;KAEnB,CAAC,UAAU,eAAe,CAC3B;EAED,MAAM,eAAe,oBAAoB;AAEzC,GAAA,GAAA,MAAA,iBAAgB;AACd,OAAI,aAAa,KAAA,KAAa,aAC5B,UAAS,SAAS;KAEnB;GAAC;GAAU;GAAc;GAAS,CAAC;AAEtC,GAAA,GAAA,MAAA,iBAAgB;AACd,OAAI,WAAW,KAAA,KAAa,aAC1B,cAAa,UAAU,EAAE,QAAQ,CAAC;KAEnC,CAAC,QAAQ,aAAa,CAAC;AAE1B,SAAO;GACL,GAAG;GACH;GACA;GACA;GACA,SAAS,YAAY;GACrB;GACA;GACA;GACA;GACA;GACA;GACD;;;;AC5FH,EAAA,GAAA,4BAAA,eAAc;EAAE,MAAM;EAAa,SAAS;EAAiB,CAAC"}
1
+ {"version":3,"file":"lib.iife.js","names":["Scribe","RealtimeEvents","VoiceConversation","CALLBACK_KEYS","CALLBACK_KEYS","Conversation","CALLBACK_KEYS"],"sources":["../src/version.ts","../src/scribe.ts","../src/conversation/ConversationContext.tsx","../../../node_modules/.pnpm/react@19.1.0/node_modules/react/cjs/react-jsx-runtime.production.js","../../../node_modules/.pnpm/react@19.1.0/node_modules/react/jsx-runtime.js","../src/conversation/ConversationControls.tsx","../src/conversation/ConversationStatus.tsx","../src/conversation/ConversationInput.tsx","../src/conversation/ConversationMode.tsx","../src/conversation/ConversationFeedback.tsx","../src/conversation/ConversationClientTools.tsx","../src/conversation/ListenerSet.ts","../src/conversation/ListenerMap.ts","../src/conversation/useStableCallbacks.ts","../src/conversation/ConversationProvider.tsx","../src/conversation/useConversation.ts","../src/index.ts"],"sourcesContent":["// This file is auto-generated during build\nexport const PACKAGE_VERSION = \"1.5.0\";\n","import { useEffect, useRef, useState, useCallback } from \"react\";\nimport { Scribe, RealtimeEvents } from \"@elevenlabs/client\";\nimport type {\n RealtimeConnection,\n AudioOptions,\n MicrophoneOptions,\n AudioFormat,\n CommitStrategy,\n PartialTranscriptMessage,\n CommittedTranscriptMessage,\n CommittedTranscriptWithTimestampsMessage,\n ScribeErrorMessage,\n ScribeAuthErrorMessage,\n ScribeQuotaExceededErrorMessage,\n ScribeCommitThrottledErrorMessage,\n ScribeTranscriberErrorMessage,\n ScribeUnacceptedTermsErrorMessage,\n ScribeRateLimitedErrorMessage,\n ScribeInputErrorMessage,\n ScribeQueueOverflowErrorMessage,\n ScribeResourceExhaustedErrorMessage,\n ScribeSessionTimeLimitExceededErrorMessage,\n ScribeChunkSizeExceededErrorMessage,\n ScribeInsufficientAudioActivityErrorMessage,\n} from \"@elevenlabs/client\";\n\n// ============= Types =============\n\nexport type ScribeStatus =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"transcribing\"\n | \"error\";\n\nexport interface WordTimestamp {\n text?: string;\n /** Start time in seconds */\n start?: number;\n /** End time in seconds */\n end?: number;\n type?: \"word\" | \"spacing\";\n speaker_id?: string;\n logprob?: number;\n characters?: string[];\n}\n\nexport interface TranscriptSegment {\n id: string;\n text: string;\n timestamp: number;\n isFinal: boolean;\n /** Word-level timestamps (only present when includeTimestamps is enabled) */\n words?: WordTimestamp[];\n}\n\nexport interface ScribeCallbacks {\n onSessionStarted?: () => void;\n onPartialTranscript?: (data: { text: string }) => void;\n onCommittedTranscript?: (data: { text: string }) => void;\n onCommittedTranscriptWithTimestamps?: (data: {\n text: string;\n words?: WordTimestamp[];\n }) => void;\n /** Called for any error (also called when specific error callbacks fire) */\n onError?: (error: Error | Event) => void;\n onAuthError?: (data: { error: string }) => void;\n onQuotaExceededError?: (data: { error: string }) => void;\n onCommitThrottledError?: (data: { error: string }) => void;\n onTranscriberError?: (data: { error: string }) => void;\n onUnacceptedTermsError?: (data: { error: string }) => void;\n onRateLimitedError?: (data: { error: string }) => void;\n onInputError?: (data: { error: string }) => void;\n onQueueOverflowError?: (data: { error: string }) => void;\n onResourceExhaustedError?: (data: { error: string }) => void;\n onSessionTimeLimitExceededError?: (data: { error: string }) => void;\n onChunkSizeExceededError?: (data: { error: string }) => void;\n onInsufficientAudioActivityError?: (data: { error: string }) => void;\n\n onConnect?: () => void;\n onDisconnect?: () => void;\n}\n\nexport interface ScribeHookOptions extends ScribeCallbacks {\n // Connection options\n token?: string;\n modelId?: string;\n baseUri?: string;\n\n // VAD options\n commitStrategy?: CommitStrategy;\n vadSilenceThresholdSecs?: number;\n vadThreshold?: number;\n minSpeechDurationMs?: number;\n minSilenceDurationMs?: number;\n languageCode?: string;\n\n // Microphone options (for automatic microphone mode)\n microphone?: MicrophoneOptions[\"microphone\"];\n\n // Manual audio options\n audioFormat?: AudioFormat;\n sampleRate?: number;\n\n // Auto-connect on mount\n autoConnect?: boolean;\n\n // Include timestamps\n includeTimestamps?: boolean;\n\n // Keyterms and verbatim control\n keyterms?: string[];\n noVerbatim?: boolean;\n}\n\nexport interface UseScribeReturn {\n // State\n status: ScribeStatus;\n isConnected: boolean;\n isTranscribing: boolean;\n isMuted: boolean;\n partialTranscript: string;\n committedTranscripts: TranscriptSegment[];\n error: string | null;\n\n // Connection methods\n connect: (options?: Partial<ScribeHookOptions>) => Promise<void>;\n disconnect: () => void;\n\n // Mute / unmute\n mute: () => void;\n unmute: () => void;\n\n // Audio methods (for manual mode)\n sendAudio: (\n audioBase64: string,\n options?: { commit?: boolean; sampleRate?: number; previousText?: string }\n ) => void;\n commit: () => void;\n\n // Utility methods\n clearTranscripts: () => void;\n getConnection: () => RealtimeConnection | null;\n}\n\n// ============= Hook Implementation =============\n\nexport function useScribe(options: ScribeHookOptions = {}): UseScribeReturn {\n const {\n // Callbacks\n onSessionStarted,\n onPartialTranscript,\n onCommittedTranscript,\n onCommittedTranscriptWithTimestamps,\n onError,\n onAuthError,\n onQuotaExceededError,\n onCommitThrottledError,\n onTranscriberError,\n onUnacceptedTermsError,\n onRateLimitedError,\n onInputError,\n onQueueOverflowError,\n onResourceExhaustedError,\n onSessionTimeLimitExceededError,\n onChunkSizeExceededError,\n onInsufficientAudioActivityError,\n onConnect,\n onDisconnect,\n\n // Connection options\n token: defaultToken,\n modelId: defaultModelId,\n baseUri: defaultBaseUri,\n commitStrategy: defaultCommitStrategy,\n vadSilenceThresholdSecs: defaultVadSilenceThresholdSecs,\n vadThreshold: defaultVadThreshold,\n minSpeechDurationMs: defaultMinSpeechDurationMs,\n minSilenceDurationMs: defaultMinSilenceDurationMs,\n languageCode: defaultLanguageCode,\n\n // Mode options\n microphone: defaultMicrophone,\n audioFormat: defaultAudioFormat,\n sampleRate: defaultSampleRate,\n\n // Auto-connect\n autoConnect = false,\n\n // Timestamps\n includeTimestamps: defaultIncludeTimestamps,\n\n // Keyterms and verbatim control\n keyterms: defaultKeyterms,\n noVerbatim: defaultNoVerbatim,\n } = options;\n\n const connectionRef = useRef<RealtimeConnection | null>(null);\n\n const [status, setStatus] = useState<ScribeStatus>(\"disconnected\");\n const [isMuted, setIsMuted] = useState<boolean>(false);\n const [partialTranscript, setPartialTranscript] = useState<string>(\"\");\n const [committedTranscripts, setCommittedTranscripts] = useState<\n TranscriptSegment[]\n >([]);\n const [error, setError] = useState<string | null>(null);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n connectionRef.current?.close();\n };\n }, []);\n\n const connect = useCallback(\n async (runtimeOptions: Partial<ScribeHookOptions> = {}) => {\n if (connectionRef.current) {\n console.warn(\"Already connected\");\n return;\n }\n\n try {\n setStatus(\"connecting\");\n setError(null);\n\n // Merge default options with runtime options\n const token = runtimeOptions.token || defaultToken;\n const modelId = runtimeOptions.modelId || defaultModelId;\n\n if (!token) {\n throw new Error(\"Token is required\");\n }\n if (!modelId) {\n throw new Error(\"Model ID is required\");\n }\n\n // Determine mode: microphone or manual\n const microphone = runtimeOptions.microphone || defaultMicrophone;\n const audioFormat = runtimeOptions.audioFormat || defaultAudioFormat;\n const sampleRate = runtimeOptions.sampleRate || defaultSampleRate;\n\n let connection: RealtimeConnection;\n\n // Include timestamps if explicitly requested OR if the callback is provided\n const includeTimestamps =\n runtimeOptions.includeTimestamps ??\n defaultIncludeTimestamps ??\n !!(\n runtimeOptions.onCommittedTranscriptWithTimestamps ||\n onCommittedTranscriptWithTimestamps\n );\n\n if (microphone) {\n // Microphone mode\n connection = Scribe.connect({\n token,\n modelId,\n baseUri: runtimeOptions.baseUri || defaultBaseUri,\n commitStrategy:\n runtimeOptions.commitStrategy || defaultCommitStrategy,\n vadSilenceThresholdSecs:\n runtimeOptions.vadSilenceThresholdSecs ||\n defaultVadSilenceThresholdSecs,\n vadThreshold: runtimeOptions.vadThreshold || defaultVadThreshold,\n minSpeechDurationMs:\n runtimeOptions.minSpeechDurationMs || defaultMinSpeechDurationMs,\n minSilenceDurationMs:\n runtimeOptions.minSilenceDurationMs ||\n defaultMinSilenceDurationMs,\n languageCode: runtimeOptions.languageCode || defaultLanguageCode,\n keyterms: runtimeOptions.keyterms || defaultKeyterms,\n noVerbatim: runtimeOptions.noVerbatim ?? defaultNoVerbatim,\n microphone,\n includeTimestamps,\n } as MicrophoneOptions);\n } else if (audioFormat && sampleRate) {\n // Manual audio mode\n connection = Scribe.connect({\n token,\n modelId,\n baseUri: runtimeOptions.baseUri || defaultBaseUri,\n commitStrategy:\n runtimeOptions.commitStrategy || defaultCommitStrategy,\n vadSilenceThresholdSecs:\n runtimeOptions.vadSilenceThresholdSecs ||\n defaultVadSilenceThresholdSecs,\n vadThreshold: runtimeOptions.vadThreshold || defaultVadThreshold,\n minSpeechDurationMs:\n runtimeOptions.minSpeechDurationMs || defaultMinSpeechDurationMs,\n minSilenceDurationMs:\n runtimeOptions.minSilenceDurationMs ||\n defaultMinSilenceDurationMs,\n languageCode: runtimeOptions.languageCode || defaultLanguageCode,\n keyterms: runtimeOptions.keyterms || defaultKeyterms,\n noVerbatim: runtimeOptions.noVerbatim ?? defaultNoVerbatim,\n includeTimestamps,\n audioFormat,\n sampleRate,\n } as AudioOptions);\n } else {\n throw new Error(\n \"Either microphone options or (audioFormat + sampleRate) must be provided\"\n );\n }\n\n connectionRef.current = connection;\n\n // Set up event listeners\n connection.on(RealtimeEvents.SESSION_STARTED, () => {\n setStatus(\"connected\");\n onSessionStarted?.();\n });\n\n connection.on(RealtimeEvents.PARTIAL_TRANSCRIPT, (data: unknown) => {\n const message = data as PartialTranscriptMessage;\n setPartialTranscript(message.text);\n setStatus(\"transcribing\");\n onPartialTranscript?.(message);\n });\n\n connection.on(RealtimeEvents.COMMITTED_TRANSCRIPT, (data: unknown) => {\n const message = data as CommittedTranscriptMessage;\n const segment: TranscriptSegment = {\n id: `${Date.now()}-${Math.random()}`,\n text: message.text,\n timestamp: Date.now(),\n isFinal: true,\n };\n setCommittedTranscripts(prev => [...prev, segment]);\n setPartialTranscript(\"\");\n onCommittedTranscript?.(message);\n });\n\n connection.on(\n RealtimeEvents.COMMITTED_TRANSCRIPT_WITH_TIMESTAMPS,\n (data: unknown) => {\n const message = data as CommittedTranscriptWithTimestampsMessage;\n const segment: TranscriptSegment = {\n id: `${Date.now()}-${Math.random()}`,\n text: message.text,\n timestamp: Date.now(),\n isFinal: true,\n words: message.words,\n };\n setCommittedTranscripts(prev => [...prev, segment]);\n setPartialTranscript(\"\");\n onCommittedTranscriptWithTimestamps?.(message);\n }\n );\n\n connection.on(RealtimeEvents.ERROR, (err: unknown) => {\n const message = err as ScribeErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onError?.(new Error(message.error));\n });\n\n connection.on(RealtimeEvents.AUTH_ERROR, (data: unknown) => {\n const message = data as ScribeAuthErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onAuthError?.(message);\n });\n\n connection.on(RealtimeEvents.QUOTA_EXCEEDED, (data: unknown) => {\n const message = data as ScribeQuotaExceededErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onQuotaExceededError?.(message);\n });\n\n connection.on(RealtimeEvents.COMMIT_THROTTLED, (data: unknown) => {\n const message = data as ScribeCommitThrottledErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onCommitThrottledError?.(message);\n });\n\n connection.on(RealtimeEvents.TRANSCRIBER_ERROR, (data: unknown) => {\n const message = data as ScribeTranscriberErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onTranscriberError?.(message);\n });\n\n connection.on(RealtimeEvents.UNACCEPTED_TERMS, (data: unknown) => {\n const message = data as ScribeUnacceptedTermsErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onUnacceptedTermsError?.(message);\n });\n\n connection.on(RealtimeEvents.RATE_LIMITED, (data: unknown) => {\n const message = data as ScribeRateLimitedErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onRateLimitedError?.(message);\n });\n\n connection.on(RealtimeEvents.INPUT_ERROR, (data: unknown) => {\n const message = data as ScribeInputErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onInputError?.(message);\n });\n\n connection.on(RealtimeEvents.QUEUE_OVERFLOW, (data: unknown) => {\n const message = data as ScribeQueueOverflowErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onQueueOverflowError?.(message);\n });\n\n connection.on(RealtimeEvents.RESOURCE_EXHAUSTED, (data: unknown) => {\n const message = data as ScribeResourceExhaustedErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onResourceExhaustedError?.(message);\n });\n\n connection.on(\n RealtimeEvents.SESSION_TIME_LIMIT_EXCEEDED,\n (data: unknown) => {\n const message = data as ScribeSessionTimeLimitExceededErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onSessionTimeLimitExceededError?.(message);\n }\n );\n\n connection.on(RealtimeEvents.CHUNK_SIZE_EXCEEDED, (data: unknown) => {\n const message = data as ScribeChunkSizeExceededErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onChunkSizeExceededError?.(message);\n });\n\n connection.on(\n RealtimeEvents.INSUFFICIENT_AUDIO_ACTIVITY,\n (data: unknown) => {\n const message = data as ScribeInsufficientAudioActivityErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onInsufficientAudioActivityError?.(message);\n }\n );\n\n connection.on(RealtimeEvents.OPEN, () => {\n onConnect?.();\n });\n\n connection.on(RealtimeEvents.CLOSE, () => {\n setStatus(\"disconnected\");\n setIsMuted(false);\n connectionRef.current = null;\n onDisconnect?.();\n });\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"Failed to connect\";\n setError(errorMessage);\n setStatus(\"error\");\n throw err;\n }\n },\n [\n defaultToken,\n defaultModelId,\n defaultBaseUri,\n defaultCommitStrategy,\n defaultVadSilenceThresholdSecs,\n defaultVadThreshold,\n defaultMinSpeechDurationMs,\n defaultMinSilenceDurationMs,\n defaultLanguageCode,\n defaultMicrophone,\n defaultAudioFormat,\n defaultSampleRate,\n defaultIncludeTimestamps,\n defaultKeyterms,\n defaultNoVerbatim,\n onSessionStarted,\n onPartialTranscript,\n onCommittedTranscript,\n onCommittedTranscriptWithTimestamps,\n onError,\n onAuthError,\n onQuotaExceededError,\n onCommitThrottledError,\n onTranscriberError,\n onUnacceptedTermsError,\n onRateLimitedError,\n onInputError,\n onQueueOverflowError,\n onResourceExhaustedError,\n onSessionTimeLimitExceededError,\n onChunkSizeExceededError,\n onInsufficientAudioActivityError,\n onConnect,\n onDisconnect,\n ]\n );\n\n const disconnect = useCallback(() => {\n connectionRef.current?.close();\n connectionRef.current = null;\n setStatus(\"disconnected\");\n setIsMuted(false);\n }, []);\n\n const mute = useCallback(() => {\n if (!connectionRef.current) {\n throw new Error(\"Not connected to Scribe\");\n }\n connectionRef.current.mute();\n setIsMuted(true);\n }, []);\n\n const unmute = useCallback(() => {\n if (!connectionRef.current) {\n throw new Error(\"Not connected to Scribe\");\n }\n connectionRef.current.unmute();\n setIsMuted(false);\n }, []);\n\n const sendAudio = useCallback(\n (\n audioBase64: string,\n options?: { commit?: boolean; sampleRate?: number; previousText?: string }\n ) => {\n if (!connectionRef.current) {\n throw new Error(\"Not connected to Scribe\");\n }\n connectionRef.current.send({ audioBase64, ...options });\n },\n []\n );\n\n const commit = useCallback(() => {\n if (!connectionRef.current) {\n throw new Error(\"Not connected to Scribe\");\n }\n connectionRef.current.commit();\n }, []);\n\n const clearTranscripts = useCallback(() => {\n setCommittedTranscripts([]);\n setPartialTranscript(\"\");\n }, []);\n\n const getConnection = useCallback(() => {\n return connectionRef.current;\n }, []);\n\n // Auto-connect if enabled\n useEffect(() => {\n if (autoConnect) {\n // eslint-disable-next-line react-hooks/set-state-in-effect -- autoConnect intentionally starts the connection when the hook mounts\n connect();\n }\n }, [autoConnect, connect]);\n\n return {\n // State\n status,\n isConnected: status === \"connected\" || status === \"transcribing\",\n isTranscribing: status === \"transcribing\",\n isMuted,\n partialTranscript,\n committedTranscripts,\n error,\n\n // Methods\n connect,\n disconnect,\n mute,\n unmute,\n sendAudio,\n commit,\n clearTranscripts,\n getConnection,\n };\n}\n\n// Export types and enums from client for convenience\nexport {\n AudioFormat,\n CommitStrategy,\n RealtimeEvents,\n} from \"@elevenlabs/client\";\nexport type { RealtimeConnection } from \"@elevenlabs/client\";\n","import {\n createContext,\n useContext,\n useLayoutEffect,\n useRef,\n type MutableRefObject,\n type RefObject,\n} from \"react\";\nimport type {\n Callbacks,\n ClientToolsConfig,\n Conversation,\n} from \"@elevenlabs/client\";\nimport type { HookOptions } from \"./types.js\";\n\ntype ClientToolEntry = ClientToolsConfig[\"clientTools\"][string];\n\nexport type ConversationContextValue = {\n conversation: Conversation | null;\n /** Stable ref to the active conversation — use in callbacks to avoid re-renders. */\n conversationRef: RefObject<Conversation | null>;\n startSession: (options?: HookOptions) => void;\n endSession: () => void;\n /**\n * For sub-providers — register callback handlers to be composed into the\n * next `Conversation.startSession()` call. Returns an unsubscribe function.\n */\n registerCallbacks: (callbacks: Partial<Callbacks>) => () => void;\n /** Registry of hook-registered client tools. Survives across sessions. */\n clientToolsRegistry: Map<string, ClientToolEntry>;\n /** Ref to the live clientTools object currently held by BaseConversation. */\n clientToolsRef: MutableRefObject<Record<string, ClientToolEntry>>;\n};\n\nexport const ConversationContext =\n createContext<ConversationContextValue | null>(null);\n\n/**\n * Returns the raw `Conversation` instance (or `null` if no session is active).\n * This is a public escape hatch for advanced use cases that need direct access\n * to the underlying `@elevenlabs/client` Conversation object.\n *\n * Can be used outside a `ConversationProvider` — returns `null` in that case.\n */\nexport function useRawConversation(): Conversation | null {\n const ctx = useContext(ConversationContext);\n return ctx?.conversation ?? null;\n}\n\n/**\n * Returns a stable ref to the active `Conversation` instance.\n * The ref's `.current` is `null` when no session is active, and updates\n * without causing re-renders — ideal for use inside callbacks and sub-providers.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useRawConversationRef(): RefObject<Conversation | null> {\n const ctx = useContext(ConversationContext);\n if (!ctx) {\n throw new Error(\n \"useRawConversationRef must be used within a ConversationProvider\"\n );\n }\n return ctx.conversationRef;\n}\n\n/**\n * Registers callback handlers with the nearest `ConversationProvider`.\n * Uses a ref internally so the latest callback values are always invoked\n * without re-subscribing on every render.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useRegisterCallbacks(callbacks: Partial<Callbacks>): void {\n const ctx = useContext(ConversationContext);\n if (!ctx) {\n throw new Error(\n \"useRegisterCallbacks must be used within a ConversationProvider\"\n );\n }\n\n const { registerCallbacks } = ctx;\n const callbacksRef = useRef(callbacks);\n\n // Re-subscribe when the set of provided callback keys changes.\n const activeKeyToken = Object.keys(callbacks)\n .filter(key => callbacks[key as keyof Callbacks] !== undefined)\n .sort()\n .join(\"|\");\n\n useLayoutEffect(() => {\n callbacksRef.current = callbacks;\n });\n\n useLayoutEffect(() => {\n const activeKeys = activeKeyToken === \"\" ? [] : activeKeyToken.split(\"|\");\n const stableCallbacks = Object.fromEntries(\n activeKeys.map((key: string) => [\n key,\n (...args: never[]) => {\n const fn = callbacksRef.current[key as keyof Callbacks];\n if (typeof fn === \"function\") {\n (fn as (...a: never[]) => void)(...args);\n }\n },\n ])\n ) as Partial<Callbacks>;\n return registerCallbacks(stableCallbacks);\n }, [registerCallbacks, activeKeyToken]);\n}\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import { createContext, useCallback, useContext, useMemo } from \"react\";\nimport {\n VoiceConversation,\n type FormatConfig,\n type InputDeviceConfig,\n type OutputConfig,\n type MultimodalMessageInput,\n type UploadFileResult,\n type ContextualUpdateOptions,\n} from \"@elevenlabs/client\";\nimport type { HookOptions } from \"./types.js\";\nimport { ConversationContext } from \"./ConversationContext.js\";\n\nconst EMPTY_FREQUENCY_DATA = new Uint8Array(0);\n\nexport type ConversationControlsValue = {\n startSession: (options?: HookOptions) => void;\n endSession: () => void;\n sendUserMessage: (text: string) => void;\n sendMultimodalMessage: (options: MultimodalMessageInput) => void;\n uploadFile: (file: Blob) => Promise<UploadFileResult>;\n sendContextualUpdate: (\n text: string,\n options?: ContextualUpdateOptions\n ) => void;\n sendUserActivity: () => void;\n sendMCPToolApprovalResult: (toolCallId: string, isApproved: boolean) => void;\n setVolume: (options: { volume: number }) => void;\n changeInputDevice: (\n config: Partial<FormatConfig> & InputDeviceConfig\n ) => Promise<void>;\n changeOutputDevice: (\n config: Partial<FormatConfig> & OutputConfig\n ) => Promise<void>;\n /** Returns byte frequency data (0-255) for the input, focused on 100-8000 Hz. */\n getInputByteFrequencyData: () => Uint8Array;\n /** Returns byte frequency data (0-255) for the output, focused on 100-8000 Hz. */\n getOutputByteFrequencyData: () => Uint8Array;\n getInputVolume: () => number;\n getOutputVolume: () => number;\n getId: () => string;\n};\n\nexport const ConversationControlsContext =\n createContext<ConversationControlsValue | null>(null);\n\n/**\n * Reads from `ConversationContext` and provides stable action references to\n * `ConversationControlsContext`. Must be rendered inside a `ConversationProvider`.\n */\nexport function ConversationControlsProvider({\n children,\n}: React.PropsWithChildren) {\n const ctx = useContext(ConversationContext);\n if (!ctx) {\n throw new Error(\n \"ConversationControlsProvider must be rendered inside a ConversationProvider\"\n );\n }\n\n const { conversationRef } = ctx;\n\n const getConversation = useCallback(() => {\n const conversation = conversationRef.current;\n if (!conversation) {\n throw new Error(\"No active conversation. Call startSession() first.\");\n }\n return conversation;\n }, [conversationRef]);\n\n const sendUserMessage = useCallback(\n (text: string) => {\n getConversation().sendUserMessage(text);\n },\n [getConversation]\n );\n\n const sendMultimodalMessage = useCallback(\n (options: MultimodalMessageInput) => {\n getConversation().sendMultimodalMessage(options);\n },\n [getConversation]\n );\n\n const uploadFile = useCallback(\n (file: Blob) => {\n return getConversation().uploadFile(file);\n },\n [getConversation]\n );\n\n const sendContextualUpdate = useCallback(\n (text: string, options?: ContextualUpdateOptions) => {\n getConversation().sendContextualUpdate(text, options);\n },\n [getConversation]\n );\n\n const sendUserActivity = useCallback(() => {\n getConversation().sendUserActivity();\n }, [getConversation]);\n\n const sendMCPToolApprovalResult = useCallback(\n (toolCallId: string, isApproved: boolean) => {\n getConversation().sendMCPToolApprovalResult(toolCallId, isApproved);\n },\n [getConversation]\n );\n\n const setVolume = useCallback(\n (options: { volume: number }) => {\n getConversation().setVolume(options);\n },\n [getConversation]\n );\n\n const changeInputDevice = useCallback(\n async (config: Partial<FormatConfig> & InputDeviceConfig) => {\n const conversation = getConversation();\n if (conversation instanceof VoiceConversation) {\n return await conversation.changeInputDevice(config);\n }\n throw new Error(\n \"Device switching is only available for voice conversations\"\n );\n },\n [getConversation]\n );\n\n const changeOutputDevice = useCallback(\n async (config: Partial<FormatConfig> & OutputConfig) => {\n const conversation = getConversation();\n if (conversation instanceof VoiceConversation) {\n return await conversation.changeOutputDevice(config);\n }\n throw new Error(\n \"Device switching is only available for voice conversations\"\n );\n },\n [getConversation]\n );\n\n const getInputByteFrequencyData = useCallback(() => {\n return (\n conversationRef.current?.getInputByteFrequencyData() ??\n EMPTY_FREQUENCY_DATA\n );\n }, [conversationRef]);\n\n const getOutputByteFrequencyData = useCallback(() => {\n return (\n conversationRef.current?.getOutputByteFrequencyData() ??\n EMPTY_FREQUENCY_DATA\n );\n }, [conversationRef]);\n\n const getInputVolume = useCallback(() => {\n return conversationRef.current?.getInputVolume() ?? 0;\n }, [conversationRef]);\n\n const getOutputVolume = useCallback(() => {\n return conversationRef.current?.getOutputVolume() ?? 0;\n }, [conversationRef]);\n\n const getId = useCallback(() => {\n return getConversation().getId();\n }, [getConversation]);\n\n const value = useMemo<ConversationControlsValue>(\n () => ({\n startSession: ctx.startSession,\n endSession: ctx.endSession,\n sendUserMessage,\n sendMultimodalMessage,\n uploadFile,\n sendContextualUpdate,\n sendUserActivity,\n sendMCPToolApprovalResult,\n setVolume,\n changeInputDevice,\n changeOutputDevice,\n getInputByteFrequencyData,\n getOutputByteFrequencyData,\n getInputVolume,\n getOutputVolume,\n getId,\n }),\n [\n ctx.startSession,\n ctx.endSession,\n sendUserMessage,\n sendMultimodalMessage,\n uploadFile,\n sendContextualUpdate,\n sendUserActivity,\n sendMCPToolApprovalResult,\n setVolume,\n changeInputDevice,\n changeOutputDevice,\n getInputByteFrequencyData,\n getOutputByteFrequencyData,\n getInputVolume,\n getOutputVolume,\n getId,\n ]\n );\n\n return (\n <ConversationControlsContext.Provider value={value}>\n {children}\n </ConversationControlsContext.Provider>\n );\n}\n\n/**\n * Returns stable action references for controlling the conversation.\n * All function references are stable and will never cause re-renders.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useConversationControls(): ConversationControlsValue {\n const ctx = useContext(ConversationControlsContext);\n if (!ctx) {\n throw new Error(\n \"useConversationControls must be used within a ConversationProvider\"\n );\n }\n return ctx;\n}\n","import { createContext, useContext, useMemo, useState } from \"react\";\nimport { useRegisterCallbacks } from \"./ConversationContext.js\";\n\nexport type ConversationStatus =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"error\";\n\nexport type ConversationStatusValue = {\n status: ConversationStatus;\n message?: string;\n};\n\nconst ConversationStatusContext = createContext<ConversationStatusValue | null>(\n null\n);\n\n/**\n * Reads from `ConversationContext` and registers `onStatusChange` + `onError`\n * callbacks. Manages its own `status`/`message` state and provides it through\n * `ConversationStatusContext`. Must be rendered inside a `ConversationProvider`.\n */\nexport function ConversationStatusProvider({\n children,\n}: React.PropsWithChildren) {\n const [status, setStatus] =\n useState<ConversationStatusValue[\"status\"]>(\"disconnected\");\n const [message, setMessage] = useState<string | undefined>(undefined);\n\n useRegisterCallbacks({\n onStatusChange({ status: newStatus }) {\n if (newStatus === \"disconnecting\") {\n // Transient state — keep current status\n return;\n }\n setStatus(newStatus);\n // Clear error message when transitioning to a non-error state\n setMessage(undefined);\n },\n onError(errorMessage) {\n setStatus(\"error\");\n setMessage(errorMessage);\n },\n });\n\n const value = useMemo<ConversationStatusValue>(\n () => ({ status, message }),\n [status, message]\n );\n\n return (\n <ConversationStatusContext.Provider value={value}>\n {children}\n </ConversationStatusContext.Provider>\n );\n}\n\n/**\n * Returns the current conversation status and any error message.\n * Re-renders when the connection status or error message changes.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useConversationStatus(): ConversationStatusValue {\n const ctx = useContext(ConversationStatusContext);\n if (!ctx) {\n throw new Error(\n \"useConversationStatus must be used within a ConversationProvider\"\n );\n }\n return ctx;\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n useRawConversation,\n useRawConversationRef,\n useRegisterCallbacks,\n} from \"./ConversationContext.js\";\n\nexport type ConversationInputValue = {\n isMuted: boolean;\n setMuted: (isMuted: boolean) => void;\n};\n\nexport type ConversationInputProviderProps = React.PropsWithChildren<{\n /** Controlled mute state. If omitted, provider manages state internally. */\n isMuted?: boolean;\n /** Called whenever mute state is changed via setMuted. */\n onMutedChange?: (isMuted: boolean) => void;\n}>;\n\nconst ConversationInputContext = createContext<ConversationInputValue | null>(\n null\n);\n\n/**\n * Reads from `ConversationContext` and manages microphone mute state.\n * `setMuted` calls `conversation.setMicMuted()` and updates local state.\n * Must be rendered inside a `ConversationProvider`.\n */\nexport function ConversationInputProvider({\n children,\n isMuted: controlledIsMuted,\n onMutedChange,\n}: ConversationInputProviderProps) {\n const conversation = useRawConversation();\n const conversationRef = useRawConversationRef();\n const isControlled = typeof controlledIsMuted === \"boolean\";\n const [uncontrolledIsMuted, setUncontrolledIsMuted] = useState(false);\n const isMuted = isControlled ? controlledIsMuted : uncontrolledIsMuted;\n\n useRegisterCallbacks({\n onDisconnect() {\n if (!isControlled) {\n setUncontrolledIsMuted(false);\n }\n },\n });\n\n useEffect(() => {\n if (isControlled && conversation) {\n conversation.setMicMuted(controlledIsMuted);\n }\n }, [conversation, controlledIsMuted, isControlled]);\n\n const setMuted = useCallback(\n (muted: boolean) => {\n const conversation = conversationRef.current;\n if (!conversation) {\n throw new Error(\"No active conversation. Call startSession() first.\");\n }\n if (!isControlled) {\n conversation.setMicMuted(muted);\n setUncontrolledIsMuted(muted);\n }\n onMutedChange?.(muted);\n },\n [conversationRef, isControlled, onMutedChange]\n );\n\n const value = useMemo<ConversationInputValue>(\n () => ({ isMuted, setMuted }),\n [isMuted, setMuted]\n );\n\n return (\n <ConversationInputContext.Provider value={value}>\n {children}\n </ConversationInputContext.Provider>\n );\n}\n\n/**\n * Returns the current microphone mute state and a function to change it.\n * Re-renders only when the mute state changes.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useConversationInput(): ConversationInputValue {\n const ctx = useContext(ConversationInputContext);\n if (!ctx) {\n throw new Error(\n \"useConversationInput must be used within a ConversationProvider\"\n );\n }\n return ctx;\n}\n","import { createContext, useContext, useMemo, useState } from \"react\";\nimport type { Mode } from \"@elevenlabs/client\";\nimport { useRegisterCallbacks } from \"./ConversationContext.js\";\n\nexport type ConversationModeValue = {\n mode: \"speaking\" | \"listening\";\n isSpeaking: boolean;\n isListening: boolean;\n};\n\nconst ConversationModeContext = createContext<ConversationModeValue | null>(\n null\n);\n\n/**\n * Reads from `ConversationContext` and registers an `onModeChange` callback.\n * Manages its own `mode` state and provides it through\n * `ConversationModeContext`. Must be rendered inside a `ConversationProvider`.\n */\nexport function ConversationModeProvider({\n children,\n}: React.PropsWithChildren) {\n const [mode, setMode] = useState<Mode>(\"listening\");\n\n useRegisterCallbacks({\n onModeChange({ mode: newMode }) {\n setMode(newMode);\n },\n onDisconnect() {\n setMode(\"listening\");\n },\n });\n\n const value = useMemo<ConversationModeValue>(\n () => ({\n mode,\n isSpeaking: mode === \"speaking\",\n isListening: mode === \"listening\",\n }),\n [mode]\n );\n\n return (\n <ConversationModeContext.Provider value={value}>\n {children}\n </ConversationModeContext.Provider>\n );\n}\n\n/**\n * Returns the current conversation mode (speaking/listening) and\n * convenience booleans. Re-renders only when the mode changes.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useConversationMode(): ConversationModeValue {\n const ctx = useContext(ConversationModeContext);\n if (!ctx) {\n throw new Error(\n \"useConversationMode must be used within a ConversationProvider\"\n );\n }\n return ctx;\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from \"react\";\nimport { useRawConversationRef, useRegisterCallbacks } from \"./ConversationContext.js\";\n\nexport type ConversationFeedbackValue = {\n canSendFeedback: boolean;\n sendFeedback: (like: boolean) => void;\n};\n\nconst ConversationFeedbackContext =\n createContext<ConversationFeedbackValue | null>(null);\n\n/**\n * Reads from `ConversationContext` and registers an `onCanSendFeedbackChange`\n * callback. Manages its own `canSendFeedback` state and provides it along with\n * a `sendFeedback` action through `ConversationFeedbackContext`.\n * Must be rendered inside a `ConversationProvider`.\n */\nexport function ConversationFeedbackProvider({\n children,\n}: React.PropsWithChildren) {\n const conversationRef = useRawConversationRef();\n const [canSendFeedback, setCanSendFeedback] = useState(false);\n\n useRegisterCallbacks({\n onCanSendFeedbackChange({ canSendFeedback: newValue }) {\n setCanSendFeedback(newValue);\n },\n onDisconnect() {\n setCanSendFeedback(false);\n },\n });\n\n const sendFeedback = useCallback((like: boolean) => {\n conversationRef.current?.sendFeedback(like);\n }, [conversationRef]);\n\n const value = useMemo<ConversationFeedbackValue>(\n () => ({\n canSendFeedback,\n sendFeedback,\n }),\n [canSendFeedback, sendFeedback]\n );\n\n return (\n <ConversationFeedbackContext.Provider value={value}>\n {children}\n </ConversationFeedbackContext.Provider>\n );\n}\n\n/**\n * Returns the current feedback state and a `sendFeedback` action.\n * Re-renders only when `canSendFeedback` changes.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useConversationFeedback(): ConversationFeedbackValue {\n const ctx = useContext(ConversationFeedbackContext);\n if (!ctx) {\n throw new Error(\n \"useConversationFeedback must be used within a ConversationProvider\"\n );\n }\n return ctx;\n}\n","import { createContext, useCallback, useContext, useLayoutEffect, useRef } from \"react\";\nimport type { ClientToolsConfig } from \"@elevenlabs/client\";\nimport { ConversationContext } from \"./ConversationContext.js\";\nimport type { ClientTool, ClientTools } from \"./types.js\";\n\ntype ClientToolEntry = ClientToolsConfig[\"clientTools\"][string];\n\n/**\n * Creates a fresh clientTools object by merging option-provided tools with\n * hook-registered tools from the registry. Throws if a hook-registered tool\n * name conflicts with an option-provided tool.\n */\nexport function buildClientTools(\n optionTools: Record<string, ClientToolEntry> | undefined,\n registry: Map<string, ClientToolEntry>\n): Record<string, ClientToolEntry> {\n const clientTools: Record<string, ClientToolEntry> = { ...optionTools };\n for (const [name, handler] of registry) {\n if (Object.hasOwn(clientTools, name)) {\n throw new Error(\n `Client tool \"${name}\" is already provided via props/options. ` +\n `Remove it from props or do not register it with useConversationClientTool.`\n );\n }\n clientTools[name] = handler;\n }\n return clientTools;\n}\n\n// ---------------------------------------------------------------------------\n// Sub-provider\n// ---------------------------------------------------------------------------\n\ntype RegisterClientTool = (\n name: string,\n handler: ClientToolEntry\n) => () => void;\n\nconst ConversationClientToolsContext = createContext<RegisterClientTool | null>(\n null\n);\n\nexport function ConversationClientToolsProvider({\n children,\n}: React.PropsWithChildren) {\n const ctx = useContext(ConversationContext);\n if (!ctx) {\n throw new Error(\n \"ConversationClientToolsProvider must be rendered inside a ConversationProvider\"\n );\n }\n\n const { clientToolsRegistry, clientToolsRef } = ctx;\n\n const registerClientTool: RegisterClientTool = useCallback(\n (name, handler) => {\n if (clientToolsRegistry.has(name)) {\n throw new Error(\n `Client tool \"${name}\" is already registered by another hook. ` +\n `Each tool name must be unique.`\n );\n }\n clientToolsRegistry.set(name, handler);\n clientToolsRef.current[name] = handler;\n return () => {\n if (clientToolsRegistry.get(name) === handler) {\n clientToolsRegistry.delete(name);\n }\n if (clientToolsRef.current[name] === handler) {\n delete clientToolsRef.current[name];\n }\n };\n },\n [clientToolsRegistry, clientToolsRef]\n );\n\n return (\n <ConversationClientToolsContext.Provider value={registerClientTool}>\n {children}\n </ConversationClientToolsContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Registers a named client tool with the nearest `ConversationProvider`.\n * The tool is available during any active conversation and is automatically\n * unregistered when the component unmounts.\n *\n * The handler always reflects the latest closure value (ref pattern),\n * so it is safe to reference component state or props without listing\n * them as dependencies.\n *\n * @typeParam TTools - An interface mapping tool names to function signatures.\n * @typeParam TName - The specific tool name (inferred from the first argument).\n * @param name - The tool name (must match the name configured on the agent).\n * @param handler - The function invoked when the agent calls this tool.\n *\n * @example\n * ```tsx\n * type Tools = {\n * get_weather: (params: { city: string }) => string;\n * set_volume: (params: { level: number }) => void;\n * };\n *\n * useConversationClientTool<Tools>(\"get_weather\", (params) => {\n * return `Weather in ${params.city} is sunny.`;\n * });\n * ```\n */\nexport function useConversationClientTool<\n TTools extends ClientTools = Record<string, ClientTool>,\n TName extends string & keyof TTools = string & keyof TTools,\n>(name: TName, handler: TTools[TName]): void {\n const registerClientTool = useContext(ConversationClientToolsContext);\n if (!registerClientTool) {\n throw new Error(\n \"useConversationClientTool must be used within a ConversationProvider\"\n );\n }\n\n const handlerRef = useRef(handler);\n // eslint-disable-next-line react-hooks/refs -- intentional sync during render for latest-ref pattern\n handlerRef.current = handler;\n\n useLayoutEffect(() => {\n const stableHandler: ClientToolEntry = parameters =>\n handlerRef.current(parameters as Parameters<TTools[TName]>[0]);\n return registerClientTool(name, stableHandler);\n }, [registerClientTool, name]);\n}\n","export class ListenerSet<Args extends unknown[]> {\n private listeners = new Set<(...args: Args) => void>();\n\n add(fn: (...args: Args) => void): () => void {\n this.listeners.add(fn);\n return () => {\n this.listeners.delete(fn);\n };\n }\n\n invoke(...args: Args): void {\n for (const fn of this.listeners) fn(...args);\n }\n\n get size(): number {\n return this.listeners.size;\n }\n}\n","import { ListenerSet } from \"./ListenerSet.js\";\n\nfunction assertFunction(\n value: unknown,\n key: string\n): asserts value is (...args: unknown[]) => void {\n if (typeof value !== \"function\") {\n throw new Error(`Expected function for key \"${key}\", got ${typeof value}`);\n }\n}\n\n/**\n * A map of named listener sets. Each key maps to a `ListenerSet` that can have\n * multiple listeners registered. Typed through `T` so that `register` and\n * `compose` preserve per-key callback signatures.\n *\n * All keys are pre-initialized in the constructor so `register` can validate\n * keys. `compose()` only includes keys with at least one registered listener,\n * preserving callback-presence semantics used by the client as feature guards.\n * For included keys, composed functions delegate to the live listener set, so\n * listeners added/removed after `compose()` still take effect. Keys with no\n * listeners at compose time are omitted entirely; call `compose()` again after\n * registering listeners to pick up newly populated keys.\n */\nexport class ListenerMap<\n T extends Record<string, ((...args: never[]) => void) | undefined>,\n> {\n private sets = new Map<string, ListenerSet<unknown[]>>();\n\n constructor(keys: readonly (keyof T & string)[]) {\n for (const key of keys) {\n this.sets.set(key, new ListenerSet<unknown[]>());\n }\n }\n\n /**\n * Register listeners for one or more keys. Returns a function that removes\n * all listeners added by this call.\n */\n register(callbacks: Partial<T>): () => void {\n const removers = Object.entries(callbacks)\n .filter(([, fn]) => fn !== undefined)\n .map(([key, fn]) => {\n assertFunction(fn, key);\n const set = this.sets.get(key);\n if (!set) {\n throw new Error(`Unknown callback key \"${key}\"`);\n }\n return set.add(fn);\n });\n return () => {\n for (const remove of removers) remove();\n };\n }\n\n /**\n * Compose all registered listeners into a single callbacks object. Each\n * composed function delegates to the live listener set, so listeners\n * added/removed after this call still take effect.\n */\n compose(): Partial<T> {\n return Object.fromEntries(\n Array.from(this.sets.entries())\n .filter(([, set]) => set.size > 0)\n .map(([key, set]) => [\n key,\n (...args: never[]) => {\n set.invoke(...args);\n },\n ])\n ) as Partial<T>;\n }\n}\n","import { useMemo, useRef } from \"react\";\nimport type { Callbacks } from \"@elevenlabs/client\";\nimport { CALLBACK_KEYS } from \"@elevenlabs/client/internal\";\nimport type { HookOptions } from \"./types.js\";\n\n/**\n * Wraps user-provided callback props in stable ref-backed functions,\n * preventing stale closure bugs when the session outlives renders.\n *\n * Returns a `Partial<Callbacks>` containing only the keys the caller\n * actually provided. Function references are stable per key across\n * renders, but always invoke the latest prop value. The returned object\n * reference is stable as long as the set of provided keys doesn't change.\n */\nexport function useStableCallbacks(props: HookOptions): Partial<Callbacks> {\n // Store the latest prop value for each callback in a ref.\n // Uses Record<string, unknown> to avoid TypeScript's union-to-intersection\n // issue when indexing Callbacks with a union of all its keys.\n const callbackRefs = useRef<Record<string, unknown>>({});\n\n // Compute a stable scalar from the set of provided keys so we can\n // memoize the result object.\n const activeKeys = CALLBACK_KEYS.filter(key => props[key] !== undefined);\n const activeKeySet = activeKeys.join(\"|\");\n const stableCallbacks = useMemo(\n () =>\n Object.fromEntries(\n activeKeys.map(key => [\n key,\n (...args: unknown[]) => {\n const fn = callbackRefs.current[key] as\n | ((...a: unknown[]) => void)\n | undefined;\n fn?.(...args);\n },\n ])\n ) as Partial<Callbacks>,\n // eslint-disable-next-line react-hooks/exhaustive-deps -- activeKeySet is a stable scalar derived from activeKeys\n [activeKeySet]\n );\n\n for (const key of CALLBACK_KEYS) {\n // eslint-disable-next-line react-hooks/refs -- callback refs intentionally track latest props for stable event handlers\n callbackRefs.current[key] = props[key];\n }\n\n return stableCallbacks;\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n Conversation,\n type Options,\n type Callbacks,\n type ConversationLifecycleOptions,\n} from \"@elevenlabs/client\";\nimport {\n CALLBACK_KEYS,\n mergeOptions,\n parseLocation,\n getOriginForLocation,\n getLivekitUrlForLocation,\n} from \"@elevenlabs/client/internal\";\n\nimport { type HookOptions } from \"./types.js\";\nimport {\n ConversationContext,\n type ConversationContextValue,\n} from \"./ConversationContext.js\";\nimport { ConversationControlsProvider } from \"./ConversationControls.js\";\nimport { ConversationStatusProvider } from \"./ConversationStatus.js\";\nimport {\n ConversationInputProvider,\n type ConversationInputProviderProps,\n} from \"./ConversationInput.js\";\nimport { ConversationModeProvider } from \"./ConversationMode.js\";\nimport { ConversationFeedbackProvider } from \"./ConversationFeedback.js\";\nimport {\n ConversationClientToolsProvider,\n buildClientTools,\n} from \"./ConversationClientTools.js\";\nimport { ListenerMap } from \"./ListenerMap.js\";\nimport { useStableCallbacks } from \"./useStableCallbacks.js\";\n\ntype ConversationInputControlProps = Pick<\n ConversationInputProviderProps,\n \"isMuted\" | \"onMutedChange\"\n>;\n\nconst SUB_PROVIDERS_WITHOUT_PROPS: React.ComponentType<React.PropsWithChildren>[] = [\n ConversationControlsProvider,\n ConversationStatusProvider,\n ConversationModeProvider,\n ConversationFeedbackProvider,\n ConversationClientToolsProvider,\n];\n\nexport type ConversationProviderProps = React.PropsWithChildren<\n HookOptions & ConversationInputControlProps\n>;\n\nexport function ConversationProvider({\n children,\n isMuted,\n onMutedChange,\n ...defaultOptions\n}: ConversationProviderProps) {\n /** The active conversation instance, if any. */\n const conversationRef = useRef<Conversation | null>(null);\n /** In-flight startSession promise, used to prevent duplicate connections. */\n const lockRef = useRef<Promise<Conversation> | null>(null);\n /** Monotonic id used to ignore stale async handlers from older starts. */\n const startSessionIdRef = useRef(0);\n /** Signals that endSession was called while a connection was still pending. */\n const shouldEndRef = useRef(false);\n /** Registry of hook-registered client tools. Survives across sessions. */\n const [clientToolsRegistry] = useState(\n () => new Map<string, NonNullable<Options[\"clientTools\"]>[string]>()\n );\n /** Ref to the live clientTools object currently held by BaseConversation. */\n const clientToolsRef = useRef<Record<string, NonNullable<Options[\"clientTools\"]>[string]>>({});\n /** Always holds the latest provider props, avoiding stale closures in callbacks. */\n const defaultOptionsRef = useRef(defaultOptions);\n // eslint-disable-next-line react-hooks/refs -- intentional sync during render for latest-ref pattern\n defaultOptionsRef.current = defaultOptions;\n\n /** Callback registry for sub-providers (status, mode, feedback, etc.). */\n const [listenerMap] = useState(\n () => new ListenerMap<Callbacks>(CALLBACK_KEYS)\n );\n\n /** Reactive mirror of conversationRef, triggers re-renders for context consumers. */\n const [conversation, setConversation] = useState<Conversation | null>(null);\n\n const stableCallbacks = useStableCallbacks(defaultOptions);\n\n const registerCallbacks = useCallback(\n (callbacks: Partial<Callbacks>) => listenerMap.register(callbacks),\n [listenerMap]\n );\n\n // Sync provider state when session ends externally (agent disconnect,\n // raw instance endSession(), etc.). Uses the listener map so it composes\n // with user-provided onDisconnect callbacks.\n useLayoutEffect(() => {\n return listenerMap.register({\n onDisconnect: () => {\n conversationRef.current = null;\n setConversation(null);\n },\n });\n }, [listenerMap]);\n\n const startSession = useCallback(\n (options?: HookOptions) => {\n if (conversationRef.current) {\n return;\n }\n if (lockRef.current) {\n return;\n }\n\n shouldEndRef.current = false;\n const startSessionId = ++startSessionIdRef.current;\n\n const defaults = defaultOptionsRef.current;\n const resolvedServerLocation = parseLocation(\n options?.serverLocation || defaults?.serverLocation\n );\n const origin = getOriginForLocation(resolvedServerLocation);\n const calculatedLivekitUrl = getLivekitUrlForLocation(\n resolvedServerLocation\n );\n\n // Strip raw callbacks from defaults — stableCallbacks provides\n // ref-backed versions that won't go stale across renders.\n const defaultConfig = { ...defaults };\n for (const key of CALLBACK_KEYS) {\n delete (defaultConfig as Record<string, unknown>)[key];\n }\n\n const sessionOptions = mergeOptions<Options>(\n { livekitUrl: calculatedLivekitUrl },\n defaultConfig,\n stableCallbacks,\n listenerMap.compose(),\n options ?? {},\n { origin }\n );\n\n const clientTools = buildClientTools(\n sessionOptions.clientTools,\n clientToolsRegistry\n );\n clientToolsRef.current = clientTools;\n sessionOptions.clientTools = clientTools;\n\n const userOnConversationCreated = sessionOptions.onConversationCreated;\n const isStaleStartSession = () =>\n startSessionId !== startSessionIdRef.current;\n\n const handleConversationCreated = (conv: Conversation) => {\n if (shouldEndRef.current || isStaleStartSession()) {\n return;\n }\n conversationRef.current = conv;\n setConversation(conv);\n userOnConversationCreated?.(conv);\n };\n\n const handleConnect: NonNullable<Callbacks[\"onConnect\"]> = props => {\n if (shouldEndRef.current || isStaleStartSession()) {\n return;\n }\n lockRef.current = null;\n sessionOptions.onConnect?.(props);\n };\n\n const providerLifecycleOptions: ConversationLifecycleOptions &\n Pick<Callbacks, \"onConnect\"> = {\n onConversationCreated: handleConversationCreated,\n onConnect: handleConnect,\n };\n\n const startSessionOptions: Options = {\n ...sessionOptions,\n ...providerLifecycleOptions,\n };\n\n lockRef.current = Conversation.startSession(startSessionOptions);\n\n lockRef.current.then(\n conv => {\n if (isStaleStartSession()) {\n return;\n }\n if (shouldEndRef.current) {\n conv.endSession();\n lockRef.current = null;\n return;\n }\n if (conversationRef.current !== conv) {\n conversationRef.current = conv;\n setConversation(conv);\n }\n lockRef.current = null;\n },\n (error: unknown) => {\n if (isStaleStartSession()) {\n return;\n }\n conversationRef.current = null;\n setConversation(null);\n lockRef.current = null;\n if (shouldEndRef.current) {\n return;\n }\n // The client SDK calls onStatusChange(\"disconnected\") before\n // rejecting, but never calls onError — surface the failure here\n // so listeners (e.g. ConversationStatusProvider) transition to\n // the \"error\" state with a meaningful message.\n const message =\n error instanceof Error\n ? error.message\n : \"Session failed to start\";\n sessionOptions.onError?.(message, error);\n }\n );\n },\n [stableCallbacks, listenerMap, clientToolsRegistry, clientToolsRef]\n );\n\n const endSession = useCallback(() => {\n shouldEndRef.current = true;\n const pendingConnection = lockRef.current;\n const conv = conversationRef.current;\n conversationRef.current = null;\n setConversation(null);\n\n if (pendingConnection) {\n pendingConnection.then(c => c.endSession(), () => {});\n } else {\n conv?.endSession();\n }\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n shouldEndRef.current = true;\n if (lockRef.current) {\n lockRef.current.then(conv => conv.endSession(), () => {});\n } else {\n conversationRef.current?.endSession();\n }\n };\n }, []);\n\n const contextValue = useMemo<ConversationContextValue>(\n () => ({\n conversation,\n conversationRef,\n startSession,\n endSession,\n registerCallbacks,\n clientToolsRegistry,\n clientToolsRef,\n }),\n [conversation, conversationRef, startSession, endSession, registerCallbacks, clientToolsRegistry, clientToolsRef]\n );\n\n const wrappedChildren = SUB_PROVIDERS_WITHOUT_PROPS.reduceRight<React.ReactNode>(\n (nested, Provider) => <Provider>{nested}</Provider>,\n <ConversationInputProvider\n isMuted={isMuted}\n onMutedChange={onMutedChange}\n >\n {children}\n </ConversationInputProvider>\n );\n\n return (\n <ConversationContext.Provider value={contextValue}>\n {wrappedChildren}\n </ConversationContext.Provider>\n );\n}\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { CALLBACK_KEYS } from \"@elevenlabs/client/internal\";\n\nimport { useConversationControls } from \"./ConversationControls.js\";\nimport { useConversationStatus } from \"./ConversationStatus.js\";\nimport { useConversationInput } from \"./ConversationInput.js\";\nimport { useConversationMode } from \"./ConversationMode.js\";\nimport { useConversationFeedback } from \"./ConversationFeedback.js\";\nimport {\n useRawConversation,\n useRegisterCallbacks,\n} from \"./ConversationContext.js\";\nimport { useStableCallbacks } from \"./useStableCallbacks.js\";\nimport type { HookOptions } from \"./types.js\";\n\nexport type UseConversationOptions = HookOptions & {\n micMuted?: boolean;\n volume?: number;\n};\n\n/**\n * Convenience hook that combines all granular conversation hooks into a single\n * return value. Less performant than using individual hooks because any state\n * change in any sub-context triggers a re-render of the consuming component.\n *\n * Accepts optional `micMuted`, `volume`, session config, and callback props.\n * Session config and callbacks passed here are used as defaults when calling\n * `startSession()` without arguments. Callbacks are also registered with the\n * provider so they stay up-to-date across re-renders.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useConversation(props: UseConversationOptions = {}) {\n const { micMuted, volume, ...hookOptions } = props;\n\n const stableCallbacks = useStableCallbacks(hookOptions);\n useRegisterCallbacks(stableCallbacks);\n\n const hookOptionsRef = useRef(hookOptions);\n // eslint-disable-next-line react-hooks/refs -- intentional sync during render for latest-ref pattern\n hookOptionsRef.current = hookOptions;\n\n const controls = useConversationControls();\n const { status, message } = useConversationStatus();\n const { isMuted, setMuted } = useConversationInput();\n const { mode, isSpeaking, isListening } = useConversationMode();\n const { canSendFeedback, sendFeedback } = useConversationFeedback();\n\n const startSession = useCallback(\n (options?: HookOptions) => {\n // Strip callbacks from the hook-level defaults: those are registered via\n // useRegisterCallbacks and kept ref-stable across renders.\n // NOTE: We intentionally do NOT strip callbacks from the `options` parameter\n // here. Callbacks passed directly to startSession() are treated as one-shot\n // per-session overrides, and may capture render-local state. This asymmetry\n // (hook callbacks are ref-stable; startSession callbacks are one-shot) is\n // intentional and relied on by the public API.\n const sessionConfig = { ...hookOptionsRef.current };\n for (const key of CALLBACK_KEYS) {\n delete (sessionConfig as Record<string, unknown>)[key];\n }\n controls.startSession({\n ...sessionConfig,\n ...options,\n } as HookOptions);\n },\n [controls, hookOptionsRef]\n );\n\n const conversation = useRawConversation();\n\n useEffect(() => {\n if (micMuted !== undefined && conversation) {\n setMuted(micMuted);\n }\n }, [micMuted, conversation, setMuted]);\n\n useEffect(() => {\n if (volume !== undefined && conversation) {\n conversation.setVolume({ volume });\n }\n }, [volume, conversation]);\n\n return {\n ...controls,\n startSession,\n status,\n message,\n isMuted: micMuted ?? isMuted,\n setMuted,\n mode,\n isSpeaking,\n isListening,\n canSendFeedback,\n sendFeedback,\n };\n}\n","import { setSourceInfo } from \"@elevenlabs/client/internal\";\nimport { PACKAGE_VERSION } from \"./version.js\";\n\nsetSourceInfo({ name: \"react_sdk\", version: PACKAGE_VERSION });\n\nexport * from \"@elevenlabs/client\";\n\n// Scribe exports\nexport {\n useScribe,\n AudioFormat,\n CommitStrategy,\n RealtimeEvents,\n} from \"./scribe.js\";\nexport type {\n ScribeStatus,\n TranscriptSegment,\n WordTimestamp,\n ScribeCallbacks,\n ScribeHookOptions,\n UseScribeReturn,\n RealtimeConnection,\n} from \"./scribe.js\";\n\n// Conversation context API\nexport { ConversationProvider } from \"./conversation/ConversationProvider.js\";\nexport { useConversationControls } from \"./conversation/ConversationControls.js\";\nexport { useConversationStatus } from \"./conversation/ConversationStatus.js\";\nexport { useConversationInput } from \"./conversation/ConversationInput.js\";\nexport { useConversationMode } from \"./conversation/ConversationMode.js\";\nexport { useConversationFeedback } from \"./conversation/ConversationFeedback.js\";\nexport { useRawConversation } from \"./conversation/ConversationContext.js\";\nexport { useConversation } from \"./conversation/useConversation.js\";\nexport { useConversationClientTool } from \"./conversation/ConversationClientTools.js\";\nexport type { UseConversationOptions } from \"./conversation/useConversation.js\";\nexport type { ConversationControlsValue } from \"./conversation/ConversationControls.js\";\nexport type { ConversationInputValue } from \"./conversation/ConversationInput.js\";\nexport type {\n ConversationStatus,\n ConversationStatusValue,\n} from \"./conversation/ConversationStatus.js\";\nexport type { ConversationModeValue } from \"./conversation/ConversationMode.js\";\nexport type { ConversationFeedbackValue } from \"./conversation/ConversationFeedback.js\";\nexport type { ConversationProviderProps } from \"./conversation/ConversationProvider.js\";\nexport type {\n HookOptions,\n HookCallbacks,\n ClientTool,\n ClientTools,\n ClientToolResult,\n} from \"./conversation/types.js\";\n"],"x_google_ignoreList":[3,4],"mappings":";;;;;;CACA,MAAa,kBAAkB;;;CCkJ/B,SAAgB,UAAU,UAA6B,EAAE,EAAmB;EAC1E,MAAM,EAEJ,kBACA,qBACA,uBACA,qCACA,SACA,aACA,sBACA,wBACA,oBACA,wBACA,oBACA,cACA,sBACA,0BACA,iCACA,0BACA,kCACA,WACA,cAGA,OAAO,cACP,SAAS,gBACT,SAAS,gBACT,gBAAgB,uBAChB,yBAAyB,gCACzB,cAAc,qBACd,qBAAqB,4BACrB,sBAAsB,6BACtB,cAAc,qBAGd,YAAY,mBACZ,aAAa,oBACb,YAAY,mBAGZ,cAAc,OAGd,mBAAmB,0BAGnB,UAAU,iBACV,YAAY,sBACV;EAEJ,MAAM,iBAAA,GAAA,MAAA,QAAkD,KAAK;EAE7D,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,UAAoC,eAAe;EAClE,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,UAAgC,MAAM;EACtD,MAAM,CAAC,mBAAmB,yBAAA,GAAA,MAAA,UAAyC,GAAG;EACtE,MAAM,CAAC,sBAAsB,4BAAA,GAAA,MAAA,UAE3B,EAAE,CAAC;EACL,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,UAAoC,KAAK;AAGvD,GAAA,GAAA,MAAA,iBAAgB;AACd,gBAAa;AACX,kBAAc,SAAS,OAAO;;KAE/B,EAAE,CAAC;EAEN,MAAM,WAAA,GAAA,MAAA,aACJ,OAAO,iBAA6C,EAAE,KAAK;AACzD,OAAI,cAAc,SAAS;AACzB,YAAQ,KAAK,oBAAoB;AACjC;;AAGF,OAAI;AACF,cAAU,aAAa;AACvB,aAAS,KAAK;IAGd,MAAM,QAAQ,eAAe,SAAS;IACtC,MAAM,UAAU,eAAe,WAAW;AAE1C,QAAI,CAAC,MACH,OAAM,IAAI,MAAM,oBAAoB;AAEtC,QAAI,CAAC,QACH,OAAM,IAAI,MAAM,uBAAuB;IAIzC,MAAM,aAAa,eAAe,cAAc;IAChD,MAAM,cAAc,eAAe,eAAe;IAClD,MAAM,aAAa,eAAe,cAAc;IAEhD,IAAI;IAGJ,MAAM,oBACJ,eAAe,qBACf,4BACA,CAAC,EACC,eAAe,uCACf;AAGJ,QAAI,WAEF,cAAaA,mBAAAA,OAAO,QAAQ;KAC1B;KACA;KACA,SAAS,eAAe,WAAW;KACnC,gBACE,eAAe,kBAAkB;KACnC,yBACE,eAAe,2BACf;KACF,cAAc,eAAe,gBAAgB;KAC7C,qBACE,eAAe,uBAAuB;KACxC,sBACE,eAAe,wBACf;KACF,cAAc,eAAe,gBAAgB;KAC7C,UAAU,eAAe,YAAY;KACrC,YAAY,eAAe,cAAc;KACzC;KACA;KACD,CAAsB;aACd,eAAe,WAExB,cAAaA,mBAAAA,OAAO,QAAQ;KAC1B;KACA;KACA,SAAS,eAAe,WAAW;KACnC,gBACE,eAAe,kBAAkB;KACnC,yBACE,eAAe,2BACf;KACF,cAAc,eAAe,gBAAgB;KAC7C,qBACE,eAAe,uBAAuB;KACxC,sBACE,eAAe,wBACf;KACF,cAAc,eAAe,gBAAgB;KAC7C,UAAU,eAAe,YAAY;KACrC,YAAY,eAAe,cAAc;KACzC;KACA;KACA;KACD,CAAiB;QAElB,OAAM,IAAI,MACR,2EACD;AAGH,kBAAc,UAAU;AAGxB,eAAW,GAAGC,mBAAAA,eAAe,uBAAuB;AAClD,eAAU,YAAY;AACtB,yBAAoB;MACpB;AAEF,eAAW,GAAGA,mBAAAA,eAAe,qBAAqB,SAAkB;KAClE,MAAM,UAAU;AAChB,0BAAqB,QAAQ,KAAK;AAClC,eAAU,eAAe;AACzB,2BAAsB,QAAQ;MAC9B;AAEF,eAAW,GAAGA,mBAAAA,eAAe,uBAAuB,SAAkB;KACpE,MAAM,UAAU;KAChB,MAAM,UAA6B;MACjC,IAAI,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ;MAClC,MAAM,QAAQ;MACd,WAAW,KAAK,KAAK;MACrB,SAAS;MACV;AACD,8BAAwB,SAAQ,CAAC,GAAG,MAAM,QAAQ,CAAC;AACnD,0BAAqB,GAAG;AACxB,6BAAwB,QAAQ;MAChC;AAEF,eAAW,GACTA,mBAAAA,eAAe,uCACd,SAAkB;KACjB,MAAM,UAAU;KAChB,MAAM,UAA6B;MACjC,IAAI,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ;MAClC,MAAM,QAAQ;MACd,WAAW,KAAK,KAAK;MACrB,SAAS;MACT,OAAO,QAAQ;MAChB;AACD,8BAAwB,SAAQ,CAAC,GAAG,MAAM,QAAQ,CAAC;AACnD,0BAAqB,GAAG;AACxB,2CAAsC,QAAQ;MAEjD;AAED,eAAW,GAAGA,mBAAAA,eAAe,QAAQ,QAAiB;KACpD,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,eAAU,IAAI,MAAM,QAAQ,MAAM,CAAC;MACnC;AAEF,eAAW,GAAGA,mBAAAA,eAAe,aAAa,SAAkB;KAC1D,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,mBAAc,QAAQ;MACtB;AAEF,eAAW,GAAGA,mBAAAA,eAAe,iBAAiB,SAAkB;KAC9D,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,4BAAuB,QAAQ;MAC/B;AAEF,eAAW,GAAGA,mBAAAA,eAAe,mBAAmB,SAAkB;KAChE,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,8BAAyB,QAAQ;MACjC;AAEF,eAAW,GAAGA,mBAAAA,eAAe,oBAAoB,SAAkB;KACjE,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,0BAAqB,QAAQ;MAC7B;AAEF,eAAW,GAAGA,mBAAAA,eAAe,mBAAmB,SAAkB;KAChE,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,8BAAyB,QAAQ;MACjC;AAEF,eAAW,GAAGA,mBAAAA,eAAe,eAAe,SAAkB;KAC5D,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,0BAAqB,QAAQ;MAC7B;AAEF,eAAW,GAAGA,mBAAAA,eAAe,cAAc,SAAkB;KAC3D,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,oBAAe,QAAQ;MACvB;AAEF,eAAW,GAAGA,mBAAAA,eAAe,iBAAiB,SAAkB;KAC9D,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,4BAAuB,QAAQ;MAC/B;AAEF,eAAW,GAAGA,mBAAAA,eAAe,qBAAqB,SAAkB;KAClE,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,gCAA2B,QAAQ;MACnC;AAEF,eAAW,GACTA,mBAAAA,eAAe,8BACd,SAAkB;KACjB,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,uCAAkC,QAAQ;MAE7C;AAED,eAAW,GAAGA,mBAAAA,eAAe,sBAAsB,SAAkB;KACnE,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,gCAA2B,QAAQ;MACnC;AAEF,eAAW,GACTA,mBAAAA,eAAe,8BACd,SAAkB;KACjB,MAAM,UAAU;AAChB,cAAS,QAAQ,MAAM;AACvB,eAAU,QAAQ;AAClB,wCAAmC,QAAQ;MAE9C;AAED,eAAW,GAAGA,mBAAAA,eAAe,YAAY;AACvC,kBAAa;MACb;AAEF,eAAW,GAAGA,mBAAAA,eAAe,aAAa;AACxC,eAAU,eAAe;AACzB,gBAAW,MAAM;AACjB,mBAAc,UAAU;AACxB,qBAAgB;MAChB;YACK,KAAK;AAGZ,aADE,eAAe,QAAQ,IAAI,UAAU,oBACjB;AACtB,cAAU,QAAQ;AAClB,UAAM;;KAGV;GACE;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CACF;EAED,MAAM,cAAA,GAAA,MAAA,mBAA+B;AACnC,iBAAc,SAAS,OAAO;AAC9B,iBAAc,UAAU;AACxB,aAAU,eAAe;AACzB,cAAW,MAAM;KAChB,EAAE,CAAC;EAEN,MAAM,QAAA,GAAA,MAAA,mBAAyB;AAC7B,OAAI,CAAC,cAAc,QACjB,OAAM,IAAI,MAAM,0BAA0B;AAE5C,iBAAc,QAAQ,MAAM;AAC5B,cAAW,KAAK;KACf,EAAE,CAAC;EAEN,MAAM,UAAA,GAAA,MAAA,mBAA2B;AAC/B,OAAI,CAAC,cAAc,QACjB,OAAM,IAAI,MAAM,0BAA0B;AAE5C,iBAAc,QAAQ,QAAQ;AAC9B,cAAW,MAAM;KAChB,EAAE,CAAC;EAEN,MAAM,aAAA,GAAA,MAAA,cAEF,aACA,YACG;AACH,OAAI,CAAC,cAAc,QACjB,OAAM,IAAI,MAAM,0BAA0B;AAE5C,iBAAc,QAAQ,KAAK;IAAE;IAAa,GAAG;IAAS,CAAC;KAEzD,EAAE,CACH;EAED,MAAM,UAAA,GAAA,MAAA,mBAA2B;AAC/B,OAAI,CAAC,cAAc,QACjB,OAAM,IAAI,MAAM,0BAA0B;AAE5C,iBAAc,QAAQ,QAAQ;KAC7B,EAAE,CAAC;EAEN,MAAM,oBAAA,GAAA,MAAA,mBAAqC;AACzC,2BAAwB,EAAE,CAAC;AAC3B,wBAAqB,GAAG;KACvB,EAAE,CAAC;EAEN,MAAM,iBAAA,GAAA,MAAA,mBAAkC;AACtC,UAAO,cAAc;KACpB,EAAE,CAAC;AAGN,GAAA,GAAA,MAAA,iBAAgB;AACd,OAAI,YAEF,UAAS;KAEV,CAAC,aAAa,QAAQ,CAAC;AAE1B,SAAO;GAEL;GACA,aAAa,WAAW,eAAe,WAAW;GAClD,gBAAgB,WAAW;GAC3B;GACA;GACA;GACA;GAGA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD;;;;CCpiBH,MAAa,uBAAA,GAAA,MAAA,eACoC,KAAK;;;;;;;;CAStD,SAAgB,qBAA0C;AAExD,UAAA,GAAA,MAAA,YADuB,oBAAoB,EAC/B,gBAAgB;;;;;;;;;CAU9B,SAAgB,wBAAwD;EACtE,MAAM,OAAA,GAAA,MAAA,YAAiB,oBAAoB;AAC3C,MAAI,CAAC,IACH,OAAM,IAAI,MACR,mEACD;AAEH,SAAO,IAAI;;;;;;;;;CAUb,SAAgB,qBAAqB,WAAqC;EACxE,MAAM,OAAA,GAAA,MAAA,YAAiB,oBAAoB;AAC3C,MAAI,CAAC,IACH,OAAM,IAAI,MACR,kEACD;EAGH,MAAM,EAAE,sBAAsB;EAC9B,MAAM,gBAAA,GAAA,MAAA,QAAsB,UAAU;EAGtC,MAAM,iBAAiB,OAAO,KAAK,UAAU,CAC1C,QAAO,QAAO,UAAU,SAA4B,KAAA,EAAU,CAC9D,MAAM,CACN,KAAK,IAAI;AAEZ,GAAA,GAAA,MAAA,uBAAsB;AACpB,gBAAa,UAAU;IACvB;AAEF,GAAA,GAAA,MAAA,uBAAsB;GACpB,MAAM,aAAa,mBAAmB,KAAK,EAAE,GAAG,eAAe,MAAM,IAAI;AAYzE,UAAO,kBAXiB,OAAO,YAC7B,WAAW,KAAK,QAAgB,CAC9B,MACC,GAAG,SAAkB;IACpB,MAAM,KAAK,aAAa,QAAQ;AAChC,QAAI,OAAO,OAAO,WACf,IAA+B,GAAG,KAAK;KAG7C,CAAC,CACH,CACwC;KACxC,CAAC,mBAAmB,eAAe,CAAC;;;;;;;;;;;;;;ECjGzC,IAAI,qBAAqB,OAAO,IAAI,6BAA6B;EAEjE,SAAS,QAAQ,MAAM,QAAQ,UAAU;GACvC,IAAI,MAAM;AACV,QAAK,MAAM,aAAa,MAAM,KAAK;AACnC,QAAK,MAAM,OAAO,QAAQ,MAAM,KAAK,OAAO;AAC5C,OAAI,SAAS,QAAQ;AACnB,eAAW,EAAE;AACb,SAAK,IAAI,YAAY,OACnB,WAAU,aAAa,SAAS,YAAY,OAAO;SAChD,YAAW;AAClB,YAAS,SAAS;AAClB,UAAO;IACL,UAAU;IACJ;IACD;IACL,KAAK,KAAK,MAAM,SAAS,SAAS;IAClC,OAAO;IACR;;AAGH,UAAQ,MAAM;;;;;AC7BZ,SAAO,UAAA,sCAAA;;CCUT,MAAM,uBAAuB,IAAI,WAAW,EAAE;CA8B9C,MAAa,+BAAA,GAAA,MAAA,eACqC,KAAK;;;;;CAMvD,SAAgB,6BAA6B,EAC3C,YAC0B;EAC1B,MAAM,OAAA,GAAA,MAAA,YAAiB,oBAAoB;AAC3C,MAAI,CAAC,IACH,OAAM,IAAI,MACR,8EACD;EAGH,MAAM,EAAE,oBAAoB;EAE5B,MAAM,mBAAA,GAAA,MAAA,mBAAoC;GACxC,MAAM,eAAe,gBAAgB;AACrC,OAAI,CAAC,aACH,OAAM,IAAI,MAAM,qDAAqD;AAEvE,UAAO;KACN,CAAC,gBAAgB,CAAC;EAErB,MAAM,mBAAA,GAAA,MAAA,cACH,SAAiB;AAChB,oBAAiB,CAAC,gBAAgB,KAAK;KAEzC,CAAC,gBAAgB,CAClB;EAED,MAAM,yBAAA,GAAA,MAAA,cACH,YAAoC;AACnC,oBAAiB,CAAC,sBAAsB,QAAQ;KAElD,CAAC,gBAAgB,CAClB;EAED,MAAM,cAAA,GAAA,MAAA,cACH,SAAe;AACd,UAAO,iBAAiB,CAAC,WAAW,KAAK;KAE3C,CAAC,gBAAgB,CAClB;EAED,MAAM,wBAAA,GAAA,MAAA,cACH,MAAc,YAAsC;AACnD,oBAAiB,CAAC,qBAAqB,MAAM,QAAQ;KAEvD,CAAC,gBAAgB,CAClB;EAED,MAAM,oBAAA,GAAA,MAAA,mBAAqC;AACzC,oBAAiB,CAAC,kBAAkB;KACnC,CAAC,gBAAgB,CAAC;EAErB,MAAM,6BAAA,GAAA,MAAA,cACH,YAAoB,eAAwB;AAC3C,oBAAiB,CAAC,0BAA0B,YAAY,WAAW;KAErE,CAAC,gBAAgB,CAClB;EAED,MAAM,aAAA,GAAA,MAAA,cACH,YAAgC;AAC/B,oBAAiB,CAAC,UAAU,QAAQ;KAEtC,CAAC,gBAAgB,CAClB;EAED,MAAM,qBAAA,GAAA,MAAA,aACJ,OAAO,WAAsD;GAC3D,MAAM,eAAe,iBAAiB;AACtC,OAAI,wBAAwBC,mBAAAA,kBAC1B,QAAO,MAAM,aAAa,kBAAkB,OAAO;AAErD,SAAM,IAAI,MACR,6DACD;KAEH,CAAC,gBAAgB,CAClB;EAED,MAAM,sBAAA,GAAA,MAAA,aACJ,OAAO,WAAiD;GACtD,MAAM,eAAe,iBAAiB;AACtC,OAAI,wBAAwBA,mBAAAA,kBAC1B,QAAO,MAAM,aAAa,mBAAmB,OAAO;AAEtD,SAAM,IAAI,MACR,6DACD;KAEH,CAAC,gBAAgB,CAClB;EAED,MAAM,6BAAA,GAAA,MAAA,mBAA8C;AAClD,UACE,gBAAgB,SAAS,2BAA2B,IACpD;KAED,CAAC,gBAAgB,CAAC;EAErB,MAAM,8BAAA,GAAA,MAAA,mBAA+C;AACnD,UACE,gBAAgB,SAAS,4BAA4B,IACrD;KAED,CAAC,gBAAgB,CAAC;EAErB,MAAM,kBAAA,GAAA,MAAA,mBAAmC;AACvC,UAAO,gBAAgB,SAAS,gBAAgB,IAAI;KACnD,CAAC,gBAAgB,CAAC;EAErB,MAAM,mBAAA,GAAA,MAAA,mBAAoC;AACxC,UAAO,gBAAgB,SAAS,iBAAiB,IAAI;KACpD,CAAC,gBAAgB,CAAC;EAErB,MAAM,SAAA,GAAA,MAAA,mBAA0B;AAC9B,UAAO,iBAAiB,CAAC,OAAO;KAC/B,CAAC,gBAAgB,CAAC;EAErB,MAAM,SAAA,GAAA,MAAA,gBACG;GACL,cAAc,IAAI;GAClB,YAAY,IAAI;GAChB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,GACD;GACE,IAAI;GACJ,IAAI;GACJ;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACD,CACF;AAED,SACE,iBAAA,GAAA,mBAAA,KAAC,4BAA4B,UAA7B;GAA6C;GAC1C;GACoC,CAAA;;;;;;;;CAU3C,SAAgB,0BAAqD;EACnE,MAAM,OAAA,GAAA,MAAA,YAAiB,4BAA4B;AACnD,MAAI,CAAC,IACH,OAAM,IAAI,MACR,qEACD;AAEH,SAAO;;;;CCrNT,MAAM,6BAAA,GAAA,MAAA,eACJ,KACD;;;;;;CAOD,SAAgB,2BAA2B,EACzC,YAC0B;EAC1B,MAAM,CAAC,QAAQ,cAAA,GAAA,MAAA,UAC+B,eAAe;EAC7D,MAAM,CAAC,SAAS,eAAA,GAAA,MAAA,UAA2C,KAAA,EAAU;AAErE,uBAAqB;GACnB,eAAe,EAAE,QAAQ,aAAa;AACpC,QAAI,cAAc,gBAEhB;AAEF,cAAU,UAAU;AAEpB,eAAW,KAAA,EAAU;;GAEvB,QAAQ,cAAc;AACpB,cAAU,QAAQ;AAClB,eAAW,aAAa;;GAE3B,CAAC;EAEF,MAAM,SAAA,GAAA,MAAA,gBACG;GAAE;GAAQ;GAAS,GAC1B,CAAC,QAAQ,QAAQ,CAClB;AAED,SACE,iBAAA,GAAA,mBAAA,KAAC,0BAA0B,UAA3B;GAA2C;GACxC;GACkC,CAAA;;;;;;;;CAUzC,SAAgB,wBAAiD;EAC/D,MAAM,OAAA,GAAA,MAAA,YAAiB,0BAA0B;AACjD,MAAI,CAAC,IACH,OAAM,IAAI,MACR,mEACD;AAEH,SAAO;;;;CC7CT,MAAM,4BAAA,GAAA,MAAA,eACJ,KACD;;;;;;CAOD,SAAgB,0BAA0B,EACxC,UACA,SAAS,mBACT,iBACiC;EACjC,MAAM,eAAe,oBAAoB;EACzC,MAAM,kBAAkB,uBAAuB;EAC/C,MAAM,eAAe,OAAO,sBAAsB;EAClD,MAAM,CAAC,qBAAqB,2BAAA,GAAA,MAAA,UAAmC,MAAM;EACrE,MAAM,UAAU,eAAe,oBAAoB;AAEnD,uBAAqB,EACnB,eAAe;AACb,OAAI,CAAC,aACH,wBAAuB,MAAM;KAGlC,CAAC;AAEF,GAAA,GAAA,MAAA,iBAAgB;AACd,OAAI,gBAAgB,aAClB,cAAa,YAAY,kBAAkB;KAE5C;GAAC;GAAc;GAAmB;GAAa,CAAC;EAEnD,MAAM,YAAA,GAAA,MAAA,cACH,UAAmB;GAClB,MAAM,eAAe,gBAAgB;AACrC,OAAI,CAAC,aACH,OAAM,IAAI,MAAM,qDAAqD;AAEvE,OAAI,CAAC,cAAc;AACjB,iBAAa,YAAY,MAAM;AAC/B,2BAAuB,MAAM;;AAE/B,mBAAgB,MAAM;KAExB;GAAC;GAAiB;GAAc;GAAc,CAC/C;EAED,MAAM,SAAA,GAAA,MAAA,gBACG;GAAE;GAAS;GAAU,GAC5B,CAAC,SAAS,SAAS,CACpB;AAED,SACE,iBAAA,GAAA,mBAAA,KAAC,yBAAyB,UAA1B;GAA0C;GACvC;GACiC,CAAA;;;;;;;;CAUxC,SAAgB,uBAA+C;EAC7D,MAAM,OAAA,GAAA,MAAA,YAAiB,yBAAyB;AAChD,MAAI,CAAC,IACH,OAAM,IAAI,MACR,kEACD;AAEH,SAAO;;;;CC1FT,MAAM,2BAAA,GAAA,MAAA,eACJ,KACD;;;;;;CAOD,SAAgB,yBAAyB,EACvC,YAC0B;EAC1B,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,UAA0B,YAAY;AAEnD,uBAAqB;GACnB,aAAa,EAAE,MAAM,WAAW;AAC9B,YAAQ,QAAQ;;GAElB,eAAe;AACb,YAAQ,YAAY;;GAEvB,CAAC;EAEF,MAAM,SAAA,GAAA,MAAA,gBACG;GACL;GACA,YAAY,SAAS;GACrB,aAAa,SAAS;GACvB,GACD,CAAC,KAAK,CACP;AAED,SACE,iBAAA,GAAA,mBAAA,KAAC,wBAAwB,UAAzB;GAAyC;GACtC;GACgC,CAAA;;;;;;;;CAUvC,SAAgB,sBAA6C;EAC3D,MAAM,OAAA,GAAA,MAAA,YAAiB,wBAAwB;AAC/C,MAAI,CAAC,IACH,OAAM,IAAI,MACR,iEACD;AAEH,SAAO;;;;CChDT,MAAM,+BAAA,GAAA,MAAA,eAC4C,KAAK;;;;;;;CAQvD,SAAgB,6BAA6B,EAC3C,YAC0B;EAC1B,MAAM,kBAAkB,uBAAuB;EAC/C,MAAM,CAAC,iBAAiB,uBAAA,GAAA,MAAA,UAA+B,MAAM;AAE7D,uBAAqB;GACnB,wBAAwB,EAAE,iBAAiB,YAAY;AACrD,uBAAmB,SAAS;;GAE9B,eAAe;AACb,uBAAmB,MAAM;;GAE5B,CAAC;EAEF,MAAM,gBAAA,GAAA,MAAA,cAA4B,SAAkB;AAClD,mBAAgB,SAAS,aAAa,KAAK;KAC1C,CAAC,gBAAgB,CAAC;EAErB,MAAM,SAAA,GAAA,MAAA,gBACG;GACL;GACA;GACD,GACD,CAAC,iBAAiB,aAAa,CAChC;AAED,SACE,iBAAA,GAAA,mBAAA,KAAC,4BAA4B,UAA7B;GAA6C;GAC1C;GACoC,CAAA;;;;;;;;CAU3C,SAAgB,0BAAqD;EACnE,MAAM,OAAA,GAAA,MAAA,YAAiB,4BAA4B;AACnD,MAAI,CAAC,IACH,OAAM,IAAI,MACR,qEACD;AAEH,SAAO;;;;;;;;;CC1DT,SAAgB,iBACd,aACA,UACiC;EACjC,MAAM,cAA+C,EAAE,GAAG,aAAa;AACvE,OAAK,MAAM,CAAC,MAAM,YAAY,UAAU;AACtC,OAAI,OAAO,OAAO,aAAa,KAAK,CAClC,OAAM,IAAI,MACR,gBAAgB,KAAK,qHAEtB;AAEH,eAAY,QAAQ;;AAEtB,SAAO;;CAYT,MAAM,kCAAA,GAAA,MAAA,eACJ,KACD;CAED,SAAgB,gCAAgC,EAC9C,YAC0B;EAC1B,MAAM,OAAA,GAAA,MAAA,YAAiB,oBAAoB;AAC3C,MAAI,CAAC,IACH,OAAM,IAAI,MACR,iFACD;EAGH,MAAM,EAAE,qBAAqB,mBAAmB;EAEhD,MAAM,sBAAA,GAAA,MAAA,cACH,MAAM,YAAY;AACjB,OAAI,oBAAoB,IAAI,KAAK,CAC/B,OAAM,IAAI,MACR,gBAAgB,KAAK,yEAEtB;AAEH,uBAAoB,IAAI,MAAM,QAAQ;AACtC,kBAAe,QAAQ,QAAQ;AAC/B,gBAAa;AACX,QAAI,oBAAoB,IAAI,KAAK,KAAK,QACpC,qBAAoB,OAAO,KAAK;AAElC,QAAI,eAAe,QAAQ,UAAU,QACnC,QAAO,eAAe,QAAQ;;KAIpC,CAAC,qBAAqB,eAAe,CACtC;AAED,SACE,iBAAA,GAAA,mBAAA,KAAC,+BAA+B,UAAhC;GAAyC,OAAO;GAC7C;GACuC,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkC9C,SAAgB,0BAGd,MAAa,SAA8B;EAC3C,MAAM,sBAAA,GAAA,MAAA,YAAgC,+BAA+B;AACrE,MAAI,CAAC,mBACH,OAAM,IAAI,MACR,uEACD;EAGH,MAAM,cAAA,GAAA,MAAA,QAAoB,QAAQ;AAElC,aAAW,UAAU;AAErB,GAAA,GAAA,MAAA,uBAAsB;GACpB,MAAM,iBAAiC,eACrC,WAAW,QAAQ,WAA2C;AAChE,UAAO,mBAAmB,MAAM,cAAc;KAC7C,CAAC,oBAAoB,KAAK,CAAC;;;;CCpIhC,IAAa,cAAb,MAAiD;EAC/C,4BAAoB,IAAI,KAA8B;EAEtD,IAAI,IAAyC;AAC3C,QAAK,UAAU,IAAI,GAAG;AACtB,gBAAa;AACX,SAAK,UAAU,OAAO,GAAG;;;EAI7B,OAAO,GAAG,MAAkB;AAC1B,QAAK,MAAM,MAAM,KAAK,UAAW,IAAG,GAAG,KAAK;;EAG9C,IAAI,OAAe;AACjB,UAAO,KAAK,UAAU;;;;;CCb1B,SAAS,eACP,OACA,KAC+C;AAC/C,MAAI,OAAO,UAAU,WACnB,OAAM,IAAI,MAAM,8BAA8B,IAAI,SAAS,OAAO,QAAQ;;;;;;;;;;;;;;;CAiB9E,IAAa,cAAb,MAEE;EACA,uBAAe,IAAI,KAAqC;EAExD,YAAY,MAAqC;AAC/C,QAAK,MAAM,OAAO,KAChB,MAAK,KAAK,IAAI,KAAK,IAAI,aAAwB,CAAC;;;;;;EAQpD,SAAS,WAAmC;GAC1C,MAAM,WAAW,OAAO,QAAQ,UAAU,CACvC,QAAQ,GAAG,QAAQ,OAAO,KAAA,EAAU,CACpC,KAAK,CAAC,KAAK,QAAQ;AAClB,mBAAe,IAAI,IAAI;IACvB,MAAM,MAAM,KAAK,KAAK,IAAI,IAAI;AAC9B,QAAI,CAAC,IACH,OAAM,IAAI,MAAM,yBAAyB,IAAI,GAAG;AAElD,WAAO,IAAI,IAAI,GAAG;KAClB;AACJ,gBAAa;AACX,SAAK,MAAM,UAAU,SAAU,SAAQ;;;;;;;;EAS3C,UAAsB;AACpB,UAAO,OAAO,YACZ,MAAM,KAAK,KAAK,KAAK,SAAS,CAAC,CAC5B,QAAQ,GAAG,SAAS,IAAI,OAAO,EAAE,CACjC,KAAK,CAAC,KAAK,SAAS,CACnB,MACC,GAAG,SAAkB;AACpB,QAAI,OAAO,GAAG,KAAK;KAEtB,CAAC,CACL;;;;;;;;;;;;;;CCxDL,SAAgB,mBAAmB,OAAwC;EAIzE,MAAM,gBAAA,GAAA,MAAA,QAA+C,EAAE,CAAC;EAIxD,MAAM,aAAaC,4BAAAA,cAAc,QAAO,QAAO,MAAM,SAAS,KAAA,EAAU;EAExE,MAAM,mBAAA,GAAA,MAAA,eAEF,OAAO,YACL,WAAW,KAAI,QAAO,CACpB,MACC,GAAG,SAAoB;GACtB,MAAM,KAAK,aAAa,QAAQ;AAGhC,QAAK,GAAG,KAAK;IAEhB,CAAC,CACH,EAEH,CAfmB,WAAW,KAAK,IAAI,CAezB,CACf;AAED,OAAK,MAAM,OAAOA,4BAAAA,cAEhB,cAAa,QAAQ,OAAO,MAAM;AAGpC,SAAO;;;;CCCT,MAAM,8BAA8E;EAClF;EACA;EACA;EACA;EACA;EACD;CAMD,SAAgB,qBAAqB,EACnC,UACA,SACA,eACA,GAAG,kBACyB;;EAE5B,MAAM,mBAAA,GAAA,MAAA,QAA8C,KAAK;;EAEzD,MAAM,WAAA,GAAA,MAAA,QAA+C,KAAK;;EAE1D,MAAM,qBAAA,GAAA,MAAA,QAA2B,EAAE;;EAEnC,MAAM,gBAAA,GAAA,MAAA,QAAsB,MAAM;;EAElC,MAAM,CAAC,wBAAA,GAAA,MAAA,gCACC,IAAI,KAA0D,CACrE;;EAED,MAAM,kBAAA,GAAA,MAAA,QAAqF,EAAE,CAAC;;EAE9F,MAAM,qBAAA,GAAA,MAAA,QAA2B,eAAe;AAEhD,oBAAkB,UAAU;;EAG5B,MAAM,CAAC,gBAAA,GAAA,MAAA,gBACC,IAAI,YAAuBC,4BAAAA,cAAc,CAChD;;EAGD,MAAM,CAAC,cAAc,oBAAA,GAAA,MAAA,UAAiD,KAAK;EAE3E,MAAM,kBAAkB,mBAAmB,eAAe;EAE1D,MAAM,qBAAA,GAAA,MAAA,cACH,cAAkC,YAAY,SAAS,UAAU,EAClE,CAAC,YAAY,CACd;AAKD,GAAA,GAAA,MAAA,uBAAsB;AACpB,UAAO,YAAY,SAAS,EAC1B,oBAAoB;AAClB,oBAAgB,UAAU;AAC1B,oBAAgB,KAAK;MAExB,CAAC;KACD,CAAC,YAAY,CAAC;EAEjB,MAAM,gBAAA,GAAA,MAAA,cACH,YAA0B;AACzB,OAAI,gBAAgB,QAClB;AAEF,OAAI,QAAQ,QACV;AAGF,gBAAa,UAAU;GACvB,MAAM,iBAAiB,EAAE,kBAAkB;GAE3C,MAAM,WAAW,kBAAkB;GACnC,MAAM,0BAAA,GAAA,4BAAA,eACJ,SAAS,kBAAkB,UAAU,eACtC;GACD,MAAM,UAAA,GAAA,4BAAA,sBAA8B,uBAAuB;GAC3D,MAAM,wBAAA,GAAA,4BAAA,0BACJ,uBACD;GAID,MAAM,gBAAgB,EAAE,GAAG,UAAU;AACrC,QAAK,MAAM,OAAOA,4BAAAA,cAChB,QAAQ,cAA0C;GAGpD,MAAM,kBAAA,GAAA,4BAAA,cACJ,EAAE,YAAY,sBAAsB,EACpC,eACA,iBACA,YAAY,SAAS,EACrB,WAAW,EAAE,EACb,EAAE,QAAQ,CACX;GAED,MAAM,cAAc,iBAClB,eAAe,aACf,oBACD;AACD,kBAAe,UAAU;AACzB,kBAAe,cAAc;GAE7B,MAAM,4BAA4B,eAAe;GACjD,MAAM,4BACJ,mBAAmB,kBAAkB;GAEvC,MAAM,6BAA6B,SAAuB;AACxD,QAAI,aAAa,WAAW,qBAAqB,CAC/C;AAEF,oBAAgB,UAAU;AAC1B,oBAAgB,KAAK;AACrB,gCAA4B,KAAK;;GAGnC,MAAM,iBAAqD,UAAS;AAClE,QAAI,aAAa,WAAW,qBAAqB,CAC/C;AAEF,YAAQ,UAAU;AAClB,mBAAe,YAAY,MAAM;;GAGnC,MAAM,2BAC2B;IAC/B,uBAAuB;IACvB,WAAW;IACZ;GAED,MAAM,sBAA+B;IACnC,GAAG;IACH,GAAG;IACJ;AAED,WAAQ,UAAUC,mBAAAA,aAAa,aAAa,oBAAoB;AAEhE,WAAQ,QAAQ,MACd,SAAQ;AACN,QAAI,qBAAqB,CACvB;AAEF,QAAI,aAAa,SAAS;AACxB,UAAK,YAAY;AACjB,aAAQ,UAAU;AAClB;;AAEF,QAAI,gBAAgB,YAAY,MAAM;AACpC,qBAAgB,UAAU;AAC1B,qBAAgB,KAAK;;AAEvB,YAAQ,UAAU;OAEnB,UAAmB;AAClB,QAAI,qBAAqB,CACvB;AAEF,oBAAgB,UAAU;AAC1B,oBAAgB,KAAK;AACrB,YAAQ,UAAU;AAClB,QAAI,aAAa,QACf;IAMF,MAAM,UACJ,iBAAiB,QACb,MAAM,UACN;AACN,mBAAe,UAAU,SAAS,MAAM;KAE3C;KAEH;GAAC;GAAiB;GAAa;GAAqB;GAAe,CACpE;EAED,MAAM,cAAA,GAAA,MAAA,mBAA+B;AACnC,gBAAa,UAAU;GACvB,MAAM,oBAAoB,QAAQ;GAClC,MAAM,OAAO,gBAAgB;AAC7B,mBAAgB,UAAU;AAC1B,mBAAgB,KAAK;AAErB,OAAI,kBACF,mBAAkB,MAAK,MAAK,EAAE,YAAY,QAAQ,GAAG;OAErD,OAAM,YAAY;KAEnB,EAAE,CAAC;AAGN,GAAA,GAAA,MAAA,iBAAgB;AACd,gBAAa;AACX,iBAAa,UAAU;AACvB,QAAI,QAAQ,QACV,SAAQ,QAAQ,MAAK,SAAQ,KAAK,YAAY,QAAQ,GAAG;QAEzD,iBAAgB,SAAS,YAAY;;KAGxC,EAAE,CAAC;EAEN,MAAM,gBAAA,GAAA,MAAA,gBACG;GACL;GACA;GACA;GACA;GACA;GACA;GACA;GACD,GACD;GAAC;GAAc;GAAiB;GAAc;GAAY;GAAmB;GAAqB;GAAe,CAClH;EAED,MAAM,kBAAkB,4BAA4B,aACjD,QAAQ,aAAa,iBAAA,GAAA,mBAAA,KAAC,UAAD,EAAA,UAAW,QAAkB,CAAA,EACnD,iBAAA,GAAA,mBAAA,KAAC,2BAAD;GACW;GACM;GAEd;GACyB,CAAA,CAC7B;AAED,SACE,iBAAA,GAAA,mBAAA,KAAC,oBAAoB,UAArB;GAA8B,OAAO;aAClC;GAC4B,CAAA;;;;;;;;;;;;;;;;CC1PnC,SAAgB,gBAAgB,QAAgC,EAAE,EAAE;EAClE,MAAM,EAAE,UAAU,QAAQ,GAAG,gBAAgB;AAG7C,uBADwB,mBAAmB,YAAY,CAClB;EAErC,MAAM,kBAAA,GAAA,MAAA,QAAwB,YAAY;AAE1C,iBAAe,UAAU;EAEzB,MAAM,WAAW,yBAAyB;EAC1C,MAAM,EAAE,QAAQ,YAAY,uBAAuB;EACnD,MAAM,EAAE,SAAS,aAAa,sBAAsB;EACpD,MAAM,EAAE,MAAM,YAAY,gBAAgB,qBAAqB;EAC/D,MAAM,EAAE,iBAAiB,iBAAiB,yBAAyB;EAEnE,MAAM,gBAAA,GAAA,MAAA,cACH,YAA0B;GAQzB,MAAM,gBAAgB,EAAE,GAAG,eAAe,SAAS;AACnD,QAAK,MAAM,OAAOC,4BAAAA,cAChB,QAAQ,cAA0C;AAEpD,YAAS,aAAa;IACpB,GAAG;IACH,GAAG;IACJ,CAAgB;KAEnB,CAAC,UAAU,eAAe,CAC3B;EAED,MAAM,eAAe,oBAAoB;AAEzC,GAAA,GAAA,MAAA,iBAAgB;AACd,OAAI,aAAa,KAAA,KAAa,aAC5B,UAAS,SAAS;KAEnB;GAAC;GAAU;GAAc;GAAS,CAAC;AAEtC,GAAA,GAAA,MAAA,iBAAgB;AACd,OAAI,WAAW,KAAA,KAAa,aAC1B,cAAa,UAAU,EAAE,QAAQ,CAAC;KAEnC,CAAC,QAAQ,aAAa,CAAC;AAE1B,SAAO;GACL,GAAG;GACH;GACA;GACA;GACA,SAAS,YAAY;GACrB;GACA;GACA;GACA;GACA;GACA;GACD;;;;AC5FH,EAAA,GAAA,4BAAA,eAAc;EAAE,MAAM;EAAa,SAAS;EAAiB,CAAC"}
package/dist/scribe.d.ts CHANGED
@@ -94,11 +94,14 @@ export interface UseScribeReturn {
94
94
  status: ScribeStatus;
95
95
  isConnected: boolean;
96
96
  isTranscribing: boolean;
97
+ isMuted: boolean;
97
98
  partialTranscript: string;
98
99
  committedTranscripts: TranscriptSegment[];
99
100
  error: string | null;
100
101
  connect: (options?: Partial<ScribeHookOptions>) => Promise<void>;
101
102
  disconnect: () => void;
103
+ mute: () => void;
104
+ unmute: () => void;
102
105
  sendAudio: (audioBase64: string, options?: {
103
106
  commit?: boolean;
104
107
  sampleRate?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"scribe.d.ts","sourceRoot":"","sources":["../src/scribe.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scribe.d.ts","sourceRoot":"","sources":["../src/scribe.ts"],"names":[],"mappings":"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"}
package/dist/scribe.js CHANGED
@@ -17,6 +17,7 @@ export function useScribe(options = {}) {
17
17
  keyterms: defaultKeyterms, noVerbatim: defaultNoVerbatim, } = options;
18
18
  const connectionRef = useRef(null);
19
19
  const [status, setStatus] = useState("disconnected");
20
+ const [isMuted, setIsMuted] = useState(false);
20
21
  const [partialTranscript, setPartialTranscript] = useState("");
21
22
  const [committedTranscripts, setCommittedTranscripts] = useState([]);
22
23
  const [error, setError] = useState(null);
@@ -217,6 +218,7 @@ export function useScribe(options = {}) {
217
218
  });
218
219
  connection.on(RealtimeEvents.CLOSE, () => {
219
220
  setStatus("disconnected");
221
+ setIsMuted(false);
220
222
  connectionRef.current = null;
221
223
  onDisconnect?.();
222
224
  });
@@ -267,6 +269,21 @@ export function useScribe(options = {}) {
267
269
  connectionRef.current?.close();
268
270
  connectionRef.current = null;
269
271
  setStatus("disconnected");
272
+ setIsMuted(false);
273
+ }, []);
274
+ const mute = useCallback(() => {
275
+ if (!connectionRef.current) {
276
+ throw new Error("Not connected to Scribe");
277
+ }
278
+ connectionRef.current.mute();
279
+ setIsMuted(true);
280
+ }, []);
281
+ const unmute = useCallback(() => {
282
+ if (!connectionRef.current) {
283
+ throw new Error("Not connected to Scribe");
284
+ }
285
+ connectionRef.current.unmute();
286
+ setIsMuted(false);
270
287
  }, []);
271
288
  const sendAudio = useCallback((audioBase64, options) => {
272
289
  if (!connectionRef.current) {
@@ -299,12 +316,15 @@ export function useScribe(options = {}) {
299
316
  status,
300
317
  isConnected: status === "connected" || status === "transcribing",
301
318
  isTranscribing: status === "transcribing",
319
+ isMuted,
302
320
  partialTranscript,
303
321
  committedTranscripts,
304
322
  error,
305
323
  // Methods
306
324
  connect,
307
325
  disconnect,
326
+ mute,
327
+ unmute,
308
328
  sendAudio,
309
329
  commit,
310
330
  clearTranscripts,
@@ -1 +1 @@
1
- {"version":3,"file":"scribe.js","sourceRoot":"","sources":["../src/scribe.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scribe.js","sourceRoot":"","sources":["../src/scribe.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const PACKAGE_VERSION = "1.4.0";
1
+ export declare const PACKAGE_VERSION = "1.5.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  // This file is auto-generated during build
2
- export const PACKAGE_VERSION = "1.4.0";
2
+ export const PACKAGE_VERSION = "1.5.0";
3
3
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elevenlabs/react",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "ElevenLabs React Library",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
@@ -18,7 +18,7 @@
18
18
  "author": "ElevenLabs",
19
19
  "license": "MIT",
20
20
  "dependencies": {
21
- "@elevenlabs/client": "1.5.0"
21
+ "@elevenlabs/client": "1.6.0"
22
22
  },
23
23
  "peerDependencies": {
24
24
  "react": ">=16.8.0"
@@ -27,7 +27,7 @@
27
27
  "@eslint/js": "^10.0.1",
28
28
  "@testing-library/react": "^16.3.2",
29
29
  "@types/react": "^18.3.3",
30
- "eslint": "^10.2.1",
30
+ "eslint": "^10.3.0",
31
31
  "eslint-import-resolver-typescript": "^4.4.4",
32
32
  "eslint-plugin-import-x": "^4.16.2",
33
33
  "eslint-plugin-react-hooks": "^7.1.1",
@@ -35,7 +35,7 @@
35
35
  "react-dom": "19.1.0",
36
36
  "rolldown": "^1.0.0-rc.9",
37
37
  "typescript": "^5.5.4",
38
- "typescript-eslint": "^8.59.1",
38
+ "typescript-eslint": "^8.59.2",
39
39
  "vitest": "^4.1.5"
40
40
  },
41
41
  "repository": {