@elevenlabs/react 1.0.2 → 1.1.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.
- package/dist/conversation/ConversationClientTools.d.ts +1 -1
- package/dist/conversation/ConversationClientTools.d.ts.map +1 -1
- package/dist/conversation/ConversationClientTools.js +1 -1
- package/dist/conversation/ConversationClientTools.js.map +1 -1
- package/dist/conversation/ConversationContext.d.ts +1 -1
- package/dist/conversation/ConversationContext.d.ts.map +1 -1
- package/dist/conversation/ConversationControls.d.ts +5 -3
- package/dist/conversation/ConversationControls.d.ts.map +1 -1
- package/dist/conversation/ConversationControls.js +1 -1
- package/dist/conversation/ConversationControls.js.map +1 -1
- package/dist/conversation/ConversationFeedback.js +1 -1
- package/dist/conversation/ConversationFeedback.js.map +1 -1
- package/dist/conversation/ConversationInput.js +1 -1
- package/dist/conversation/ConversationInput.js.map +1 -1
- package/dist/conversation/ConversationMode.js +1 -1
- package/dist/conversation/ConversationMode.js.map +1 -1
- package/dist/conversation/ConversationProvider.d.ts +2 -2
- package/dist/conversation/ConversationProvider.d.ts.map +1 -1
- package/dist/conversation/ConversationProvider.js +23 -12
- package/dist/conversation/ConversationProvider.js.map +1 -1
- package/dist/conversation/ConversationStatus.js +1 -1
- package/dist/conversation/ConversationStatus.js.map +1 -1
- package/dist/conversation/ListenerMap.js +1 -1
- package/dist/conversation/ListenerMap.js.map +1 -1
- package/dist/conversation/useConversation.d.ts +4 -4
- package/dist/conversation/useConversation.d.ts.map +1 -1
- package/dist/conversation/useConversation.js +7 -7
- package/dist/conversation/useConversation.js.map +1 -1
- package/dist/conversation/useStableCallbacks.d.ts +1 -1
- package/dist/conversation/useStableCallbacks.d.ts.map +1 -1
- package/dist/index.d.ts +19 -19
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -11
- package/dist/index.js.map +1 -1
- package/dist/lib.iife.js +7 -4
- package/dist/lib.iife.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ClientToolsConfig } from "@elevenlabs/client";
|
|
2
|
-
import type { ClientTool, ClientTools } from "./types";
|
|
2
|
+
import type { ClientTool, ClientTools } from "./types.js";
|
|
3
3
|
type ClientToolEntry = ClientToolsConfig["clientTools"][string];
|
|
4
4
|
/**
|
|
5
5
|
* Creates a fresh clientTools object by merging option-provided tools with
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationClientTools.d.ts","sourceRoot":"","sources":["../../src/conversation/ConversationClientTools.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ConversationClientTools.d.ts","sourceRoot":"","sources":["../../src/conversation/ConversationClientTools.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE1D,KAAK,eAAe,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,SAAS,EACxD,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,GACrC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAYjC;AAeD,wBAAgB,+BAA+B,CAAC,EAC9C,QAAQ,GACT,EAAE,KAAK,CAAC,iBAAiB,2CAqCzB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,SAAS,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,EACvD,KAAK,SAAS,MAAM,GAAG,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,MAAM,EAC3D,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAiB3C"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { createContext, useCallback, useContext, useLayoutEffect, useRef } from "react";
|
|
3
|
-
import { ConversationContext } from "./ConversationContext";
|
|
3
|
+
import { ConversationContext } from "./ConversationContext.js";
|
|
4
4
|
/**
|
|
5
5
|
* Creates a fresh clientTools object by merging option-provided tools with
|
|
6
6
|
* hook-registered tools from the registry. Throws if a hook-registered tool
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationClientTools.js","sourceRoot":"","sources":["../../src/conversation/ConversationClientTools.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAExF,OAAO,EAAE,mBAAmB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ConversationClientTools.js","sourceRoot":"","sources":["../../src/conversation/ConversationClientTools.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type MutableRefObject, type RefObject } from "react";
|
|
2
2
|
import type { Callbacks, ClientToolsConfig, Conversation } from "@elevenlabs/client";
|
|
3
|
-
import type { HookOptions } from "./types";
|
|
3
|
+
import type { HookOptions } from "./types.js";
|
|
4
4
|
type ClientToolEntry = ClientToolsConfig["clientTools"][string];
|
|
5
5
|
export type ConversationContextValue = {
|
|
6
6
|
conversation: Conversation | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationContext.d.ts","sourceRoot":"","sources":["../../src/conversation/ConversationContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsD,KAAK,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClH,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ConversationContext.d.ts","sourceRoot":"","sources":["../../src/conversation/ConversationContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsD,KAAK,gBAAgB,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAClH,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,KAAK,eAAe,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE,MAAM,MAAM,wBAAwB,GAAG;IACrC,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,oFAAoF;IACpF,eAAe,EAAE,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAChD,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE,WAAW,KAAK,IAAI,CAAC;IAC9C,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB;;;OAGG;IACH,iBAAiB,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,MAAM,IAAI,CAAC;IACjE,0EAA0E;IAC1E,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAClD,6EAA6E;IAC7E,cAAc,EAAE,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;CACnE,CAAC;AAEF,eAAO,MAAM,mBAAmB,0DACsB,CAAC;AAEvD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,GAAG,IAAI,CAGxD;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,IAAI,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,CAQtE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAgCxE"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type FormatConfig, type InputDeviceConfig, type OutputConfig, type MultimodalMessageInput } from "@elevenlabs/client";
|
|
2
|
-
import type { HookOptions } from "./types";
|
|
2
|
+
import type { HookOptions } from "./types.js";
|
|
3
3
|
export type ConversationControlsValue = {
|
|
4
4
|
startSession: (options?: HookOptions) => void;
|
|
5
5
|
endSession: () => void;
|
|
@@ -11,9 +11,11 @@ export type ConversationControlsValue = {
|
|
|
11
11
|
setVolume: (options: {
|
|
12
12
|
volume: number;
|
|
13
13
|
}) => void;
|
|
14
|
-
changeInputDevice: (config: FormatConfig & InputDeviceConfig) => Promise<void>;
|
|
15
|
-
changeOutputDevice: (config: FormatConfig & OutputConfig) => Promise<void>;
|
|
14
|
+
changeInputDevice: (config: Partial<FormatConfig> & InputDeviceConfig) => Promise<void>;
|
|
15
|
+
changeOutputDevice: (config: Partial<FormatConfig> & OutputConfig) => Promise<void>;
|
|
16
|
+
/** Returns byte frequency data (0-255) for the input, focused on 100-8000 Hz. */
|
|
16
17
|
getInputByteFrequencyData: () => Uint8Array;
|
|
18
|
+
/** Returns byte frequency data (0-255) for the output, focused on 100-8000 Hz. */
|
|
17
19
|
getOutputByteFrequencyData: () => Uint8Array;
|
|
18
20
|
getInputVolume: () => number;
|
|
19
21
|
getOutputVolume: () => number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationControls.d.ts","sourceRoot":"","sources":["../../src/conversation/ConversationControls.tsx"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,sBAAsB,EAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ConversationControls.d.ts","sourceRoot":"","sources":["../../src/conversation/ConversationControls.tsx"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,sBAAsB,EAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9C,MAAM,MAAM,yBAAyB,GAAG;IACtC,YAAY,EAAE,CAAC,OAAO,CAAC,EAAE,WAAW,KAAK,IAAI,CAAC;IAC9C,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,qBAAqB,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,IAAI,CAAC;IACjE,oBAAoB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,yBAAyB,EAAE,CACzB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,OAAO,KAChB,IAAI,CAAC;IACV,SAAS,EAAE,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACjD,iBAAiB,EAAE,CACjB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,iBAAiB,KAC9C,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,kBAAkB,EAAE,CAClB,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,YAAY,KACzC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,iFAAiF;IACjF,yBAAyB,EAAE,MAAM,UAAU,CAAC;IAC5C,kFAAkF;IAClF,0BAA0B,EAAE,MAAM,UAAU,CAAC;IAC7C,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,MAAM,CAAC;IAC9B,KAAK,EAAE,MAAM,MAAM,CAAC;CACrB,CAAC;AAEF,eAAO,MAAM,2BAA2B,2DACe,CAAC;AAExD;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,EAC3C,QAAQ,GACT,EAAE,KAAK,CAAC,iBAAiB,2CAwIzB;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI,yBAAyB,CAQnE"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { createContext, useCallback, useContext, useMemo } from "react";
|
|
3
3
|
import { VoiceConversation, } from "@elevenlabs/client";
|
|
4
|
-
import { ConversationContext } from "./ConversationContext";
|
|
4
|
+
import { ConversationContext } from "./ConversationContext.js";
|
|
5
5
|
const EMPTY_FREQUENCY_DATA = new Uint8Array(0);
|
|
6
6
|
export const ConversationControlsContext = createContext(null);
|
|
7
7
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationControls.js","sourceRoot":"","sources":["../../src/conversation/ConversationControls.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACxE,OAAO,EACL,iBAAiB,GAKlB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ConversationControls.js","sourceRoot":"","sources":["../../src/conversation/ConversationControls.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { createContext, useCallback, useContext, useMemo, useState, } from "react";
|
|
3
|
-
import { useRawConversationRef, useRegisterCallbacks } from "./ConversationContext";
|
|
3
|
+
import { useRawConversationRef, useRegisterCallbacks } from "./ConversationContext.js";
|
|
4
4
|
const ConversationFeedbackContext = createContext(null);
|
|
5
5
|
/**
|
|
6
6
|
* Reads from `ConversationContext` and registers an `onCanSendFeedbackChange`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationFeedback.js","sourceRoot":"","sources":["../../src/conversation/ConversationFeedback.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,aAAa,EACb,WAAW,EACX,UAAU,EACV,OAAO,EACP,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ConversationFeedback.js","sourceRoot":"","sources":["../../src/conversation/ConversationFeedback.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,aAAa,EACb,WAAW,EACX,UAAU,EACV,OAAO,EACP,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAOvF,MAAM,2BAA2B,GAC/B,aAAa,CAAmC,IAAI,CAAC,CAAC;AAExD;;;;;GAKG;AACH,MAAM,UAAU,4BAA4B,CAAC,EAC3C,QAAQ,GACgB;IACxB,MAAM,eAAe,GAAG,qBAAqB,EAAE,CAAC;IAChD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9D,oBAAoB,CAAC;QACnB,uBAAuB,CAAC,EAAE,eAAe,EAAE,QAAQ,EAAE;YACnD,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QACD,YAAY;YACV,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,IAAa,EAAE,EAAE;QACjD,eAAe,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEtB,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC;QACL,eAAe;QACf,YAAY;KACb,CAAC,EACF,CAAC,eAAe,EAAE,YAAY,CAAC,CAChC,CAAC;IAEF,OAAO,CACL,KAAC,2BAA2B,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAC/C,QAAQ,GAC4B,CACxC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,GAAG,GAAG,UAAU,CAAC,2BAA2B,CAAC,CAAC;IACpD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { createContext, useCallback, useContext, useEffect, useMemo, useState, } from "react";
|
|
3
|
-
import { useRawConversation, useRawConversationRef, useRegisterCallbacks, } from "./ConversationContext";
|
|
3
|
+
import { useRawConversation, useRawConversationRef, useRegisterCallbacks, } from "./ConversationContext.js";
|
|
4
4
|
const ConversationInputContext = createContext(null);
|
|
5
5
|
/**
|
|
6
6
|
* Reads from `ConversationContext` and manages microphone mute state.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationInput.js","sourceRoot":"","sources":["../../src/conversation/ConversationInput.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,aAAa,EACb,WAAW,EACX,UAAU,EACV,SAAS,EACT,OAAO,EACP,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,
|
|
1
|
+
{"version":3,"file":"ConversationInput.js","sourceRoot":"","sources":["../../src/conversation/ConversationInput.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,aAAa,EACb,WAAW,EACX,UAAU,EACV,SAAS,EACT,OAAO,EACP,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAclC,MAAM,wBAAwB,GAAG,aAAa,CAC5C,IAAI,CACL,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,EACxC,QAAQ,EACR,OAAO,EAAE,iBAAiB,EAC1B,aAAa,GACkB;IAC/B,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;IAC1C,MAAM,eAAe,GAAG,qBAAqB,EAAE,CAAC;IAChD,MAAM,YAAY,GAAG,OAAO,iBAAiB,KAAK,SAAS,CAAC;IAC5D,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,mBAAmB,CAAC;IAEvE,oBAAoB,CAAC;QACnB,YAAY;YACV,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,sBAAsB,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,YAAY,IAAI,YAAY,EAAE,CAAC;YACjC,YAAY,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC,EAAE,CAAC,YAAY,EAAE,iBAAiB,EAAE,YAAY,CAAC,CAAC,CAAC;IAEpD,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,KAAc,EAAE,EAAE;QACjB,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC;QAC7C,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAChC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,EACD,CAAC,eAAe,EAAE,YAAY,EAAE,aAAa,CAAC,CAC/C,CAAC;IAEF,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAC7B,CAAC,OAAO,EAAE,QAAQ,CAAC,CACpB,CAAC;IAEF,OAAO,CACL,KAAC,wBAAwB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAC5C,QAAQ,GACyB,CACrC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,GAAG,GAAG,UAAU,CAAC,wBAAwB,CAAC,CAAC;IACjD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { createContext, useContext, useMemo, useState } from "react";
|
|
3
|
-
import { useRegisterCallbacks } from "./ConversationContext";
|
|
3
|
+
import { useRegisterCallbacks } from "./ConversationContext.js";
|
|
4
4
|
const ConversationModeContext = createContext(null);
|
|
5
5
|
/**
|
|
6
6
|
* Reads from `ConversationContext` and registers an `onModeChange` callback.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationMode.js","sourceRoot":"","sources":["../../src/conversation/ConversationMode.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAErE,OAAO,EAAE,oBAAoB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ConversationMode.js","sourceRoot":"","sources":["../../src/conversation/ConversationMode.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAErE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAQhE,MAAM,uBAAuB,GAAG,aAAa,CAC3C,IAAI,CACL,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,EACvC,QAAQ,GACgB;IACxB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAO,WAAW,CAAC,CAAC;IAEpD,oBAAoB,CAAC;QACnB,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE;YAC5B,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC;QACD,YAAY;YACV,OAAO,CAAC,WAAW,CAAC,CAAC;QACvB,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC;QACL,IAAI;QACJ,UAAU,EAAE,IAAI,KAAK,UAAU;QAC/B,WAAW,EAAE,IAAI,KAAK,WAAW;KAClC,CAAC,EACF,CAAC,IAAI,CAAC,CACP,CAAC;IAEF,OAAO,CACL,KAAC,uBAAuB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAC3C,QAAQ,GACwB,CACpC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,GAAG,GAAG,UAAU,CAAC,uBAAuB,CAAC,CAAC;IAChD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,gEAAgE,CACjE,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { type HookOptions } from "./types";
|
|
2
|
-
import { type ConversationInputProviderProps } from "./ConversationInput";
|
|
1
|
+
import { type HookOptions } from "./types.js";
|
|
2
|
+
import { type ConversationInputProviderProps } from "./ConversationInput.js";
|
|
3
3
|
type ConversationInputControlProps = Pick<ConversationInputProviderProps, "isMuted" | "onMutedChange">;
|
|
4
4
|
export type ConversationProviderProps = React.PropsWithChildren<HookOptions & ConversationInputControlProps>;
|
|
5
5
|
export declare function ConversationProvider({ children, isMuted, onMutedChange, ...defaultOptions }: ConversationProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationProvider.d.ts","sourceRoot":"","sources":["../../src/conversation/ConversationProvider.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ConversationProvider.d.ts","sourceRoot":"","sources":["../../src/conversation/ConversationProvider.tsx"],"names":[],"mappings":"AAiBA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAO9C,OAAO,EAEL,KAAK,8BAA8B,EACpC,MAAM,wBAAwB,CAAC;AAUhC,KAAK,6BAA6B,GAAG,IAAI,CACvC,8BAA8B,EAC9B,SAAS,GAAG,eAAe,CAC5B,CAAC;AAUF,MAAM,MAAM,yBAAyB,GAAG,KAAK,CAAC,iBAAiB,CAC7D,WAAW,GAAG,6BAA6B,CAC5C,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,OAAO,EACP,aAAa,EACb,GAAG,cAAc,EAClB,EAAE,yBAAyB,2CA+K3B"}
|
|
@@ -2,15 +2,15 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
2
2
|
import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, } from "react";
|
|
3
3
|
import { Conversation } from "@elevenlabs/client";
|
|
4
4
|
import { CALLBACK_KEYS, mergeOptions, parseLocation, getOriginForLocation, getLivekitUrlForLocation, } from "@elevenlabs/client/internal";
|
|
5
|
-
import { ConversationContext, } from "./ConversationContext";
|
|
6
|
-
import { ConversationControlsProvider } from "./ConversationControls";
|
|
7
|
-
import { ConversationStatusProvider } from "./ConversationStatus";
|
|
8
|
-
import { ConversationInputProvider, } from "./ConversationInput";
|
|
9
|
-
import { ConversationModeProvider } from "./ConversationMode";
|
|
10
|
-
import { ConversationFeedbackProvider } from "./ConversationFeedback";
|
|
11
|
-
import { ConversationClientToolsProvider, buildClientTools, } from "./ConversationClientTools";
|
|
12
|
-
import { ListenerMap } from "./ListenerMap";
|
|
13
|
-
import { useStableCallbacks } from "./useStableCallbacks";
|
|
5
|
+
import { ConversationContext, } from "./ConversationContext.js";
|
|
6
|
+
import { ConversationControlsProvider } from "./ConversationControls.js";
|
|
7
|
+
import { ConversationStatusProvider } from "./ConversationStatus.js";
|
|
8
|
+
import { ConversationInputProvider, } from "./ConversationInput.js";
|
|
9
|
+
import { ConversationModeProvider } from "./ConversationMode.js";
|
|
10
|
+
import { ConversationFeedbackProvider } from "./ConversationFeedback.js";
|
|
11
|
+
import { ConversationClientToolsProvider, buildClientTools, } from "./ConversationClientTools.js";
|
|
12
|
+
import { ListenerMap } from "./ListenerMap.js";
|
|
13
|
+
import { useStableCallbacks } from "./useStableCallbacks.js";
|
|
14
14
|
const SUB_PROVIDERS_WITHOUT_PROPS = [
|
|
15
15
|
ConversationControlsProvider,
|
|
16
16
|
ConversationStatusProvider,
|
|
@@ -82,8 +82,19 @@ export function ConversationProvider({ children, isMuted, onMutedChange, ...defa
|
|
|
82
82
|
conversationRef.current = conv;
|
|
83
83
|
setConversation(conv);
|
|
84
84
|
lockRef.current = null;
|
|
85
|
-
}, () => {
|
|
85
|
+
}, (error) => {
|
|
86
86
|
lockRef.current = null;
|
|
87
|
+
if (shouldEndRef.current) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
// The client SDK calls onStatusChange("disconnected") before
|
|
91
|
+
// rejecting, but never calls onError — surface the failure here
|
|
92
|
+
// so listeners (e.g. ConversationStatusProvider) transition to
|
|
93
|
+
// the "error" state with a meaningful message.
|
|
94
|
+
const message = error instanceof Error
|
|
95
|
+
? error.message
|
|
96
|
+
: "Session failed to start";
|
|
97
|
+
sessionOptions.onError?.(message, error);
|
|
87
98
|
});
|
|
88
99
|
}, [stableCallbacks, listenerMap, clientToolsRegistry, clientToolsRef]);
|
|
89
100
|
const endSession = useCallback(() => {
|
|
@@ -93,7 +104,7 @@ export function ConversationProvider({ children, isMuted, onMutedChange, ...defa
|
|
|
93
104
|
conversationRef.current = null;
|
|
94
105
|
setConversation(null);
|
|
95
106
|
if (pendingConnection) {
|
|
96
|
-
pendingConnection.then(c => c.endSession());
|
|
107
|
+
pendingConnection.then(c => c.endSession(), () => { });
|
|
97
108
|
}
|
|
98
109
|
else {
|
|
99
110
|
conv?.endSession();
|
|
@@ -104,7 +115,7 @@ export function ConversationProvider({ children, isMuted, onMutedChange, ...defa
|
|
|
104
115
|
return () => {
|
|
105
116
|
shouldEndRef.current = true;
|
|
106
117
|
if (lockRef.current) {
|
|
107
|
-
lockRef.current.then(conv => conv.endSession());
|
|
118
|
+
lockRef.current.then(conv => conv.endSession(), () => { });
|
|
108
119
|
}
|
|
109
120
|
else {
|
|
110
121
|
conversationRef.current?.endSession();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationProvider.js","sourceRoot":"","sources":["../../src/conversation/ConversationProvider.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,WAAW,EACX,SAAS,EACT,eAAe,EACf,OAAO,EACP,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,YAAY,EAAgC,MAAM,oBAAoB,CAAC;AAChF,OAAO,EACL,aAAa,EACb,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,mBAAmB,GAEpB,MAAM,
|
|
1
|
+
{"version":3,"file":"ConversationProvider.js","sourceRoot":"","sources":["../../src/conversation/ConversationProvider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { createContext, useContext, useMemo, useState } from "react";
|
|
3
|
-
import { useRegisterCallbacks } from "./ConversationContext";
|
|
3
|
+
import { useRegisterCallbacks } from "./ConversationContext.js";
|
|
4
4
|
const ConversationStatusContext = createContext(null);
|
|
5
5
|
/**
|
|
6
6
|
* Reads from `ConversationContext` and registers `onStatusChange` + `onError`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationStatus.js","sourceRoot":"","sources":["../../src/conversation/ConversationStatus.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ConversationStatus.js","sourceRoot":"","sources":["../../src/conversation/ConversationStatus.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAahE,MAAM,yBAAyB,GAAG,aAAa,CAC7C,IAAI,CACL,CAAC;AAEF;;;;GAIG;AACH,MAAM,UAAU,0BAA0B,CAAC,EACzC,QAAQ,GACgB;IACxB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GACvB,QAAQ,CAAoC,cAAc,CAAC,CAAC;IAC9D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAqB,SAAS,CAAC,CAAC;IAEtE,oBAAoB,CAAC;QACnB,cAAc,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE;YAClC,IAAI,SAAS,KAAK,eAAe,EAAE,CAAC;gBAClC,wCAAwC;gBACxC,OAAO;YACT,CAAC;YACD,SAAS,CAAC,SAAS,CAAC,CAAC;YACrB,8DAA8D;YAC9D,UAAU,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,CAAC,YAAY;YAClB,SAAS,CAAC,OAAO,CAAC,CAAC;YACnB,UAAU,CAAC,YAAY,CAAC,CAAC;QAC3B,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,OAAO,CACnB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAC3B,CAAC,MAAM,EAAE,OAAO,CAAC,CAClB,CAAC;IAEF,OAAO,CACL,KAAC,yBAAyB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAC7C,QAAQ,GAC0B,CACtC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,GAAG,GAAG,UAAU,CAAC,yBAAyB,CAAC,CAAC;IAClD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListenerMap.js","sourceRoot":"","sources":["../../src/conversation/ListenerMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"ListenerMap.js","sourceRoot":"","sources":["../../src/conversation/ListenerMap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,SAAS,cAAc,CACrB,KAAc,EACd,GAAW;IAEX,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,UAAU,OAAO,KAAK,EAAE,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,WAAW;IAGd,IAAI,GAAG,IAAI,GAAG,EAAkC,CAAC;IAEzD,YAAY,IAAmC;QAC7C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,WAAW,EAAa,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,QAAQ,CAAC,SAAqB;QAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;aACvC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,SAAS,CAAC;aACpC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;YACjB,cAAc,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACxB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,GAAG,CAAC,CAAC;YACnD,CAAC;YACD,OAAO,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;QACL,OAAO,GAAG,EAAE;YACV,KAAK,MAAM,MAAM,IAAI,QAAQ;gBAAE,MAAM,EAAE,CAAC;QAC1C,CAAC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,OAAO;QACL,OAAO,MAAM,CAAC,WAAW,CACvB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;aAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;aACjC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;YACnB,GAAG;YACH,CAAC,GAAG,IAAa,EAAE,EAAE;gBACnB,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;YACtB,CAAC;SACF,CAAC,CACS,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { HookOptions } from "./types";
|
|
1
|
+
import type { HookOptions } from "./types.js";
|
|
2
2
|
export type UseConversationOptions = HookOptions & {
|
|
3
3
|
micMuted?: boolean;
|
|
4
4
|
volume?: number;
|
|
@@ -17,7 +17,7 @@ export type UseConversationOptions = HookOptions & {
|
|
|
17
17
|
*/
|
|
18
18
|
export declare function useConversation(props?: UseConversationOptions): {
|
|
19
19
|
startSession: (options?: HookOptions) => void;
|
|
20
|
-
status: import("./ConversationStatus").ConversationStatus;
|
|
20
|
+
status: import("./ConversationStatus.js").ConversationStatus;
|
|
21
21
|
message: string | undefined;
|
|
22
22
|
isMuted: boolean;
|
|
23
23
|
setMuted: (isMuted: boolean) => void;
|
|
@@ -35,8 +35,8 @@ export declare function useConversation(props?: UseConversationOptions): {
|
|
|
35
35
|
setVolume: (options: {
|
|
36
36
|
volume: number;
|
|
37
37
|
}) => void;
|
|
38
|
-
changeInputDevice: (config: import("@elevenlabs/client").FormatConfig & import("@elevenlabs/client").InputDeviceConfig) => Promise<void>;
|
|
39
|
-
changeOutputDevice: (config: import("@elevenlabs/client").FormatConfig & import("@elevenlabs/client").OutputConfig) => Promise<void>;
|
|
38
|
+
changeInputDevice: (config: Partial<import("@elevenlabs/client").FormatConfig> & import("@elevenlabs/client").InputDeviceConfig) => Promise<void>;
|
|
39
|
+
changeOutputDevice: (config: Partial<import("@elevenlabs/client").FormatConfig> & import("@elevenlabs/client").OutputConfig) => Promise<void>;
|
|
40
40
|
getInputByteFrequencyData: () => Uint8Array;
|
|
41
41
|
getOutputByteFrequencyData: () => Uint8Array;
|
|
42
42
|
getInputVolume: () => number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useConversation.d.ts","sourceRoot":"","sources":["../../src/conversation/useConversation.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"useConversation.d.ts","sourceRoot":"","sources":["../../src/conversation/useConversation.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,sBAAsB,GAAG,WAAW,GAAG;IACjD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,KAAK,GAAE,sBAA2B;6BAiBnD,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CzB"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { useCallback, useEffect, useRef } from "react";
|
|
2
2
|
import { CALLBACK_KEYS } from "@elevenlabs/client/internal";
|
|
3
|
-
import { useConversationControls } from "./ConversationControls";
|
|
4
|
-
import { useConversationStatus } from "./ConversationStatus";
|
|
5
|
-
import { useConversationInput } from "./ConversationInput";
|
|
6
|
-
import { useConversationMode } from "./ConversationMode";
|
|
7
|
-
import { useConversationFeedback } from "./ConversationFeedback";
|
|
8
|
-
import { useRawConversation, useRegisterCallbacks, } from "./ConversationContext";
|
|
9
|
-
import { useStableCallbacks } from "./useStableCallbacks";
|
|
3
|
+
import { useConversationControls } from "./ConversationControls.js";
|
|
4
|
+
import { useConversationStatus } from "./ConversationStatus.js";
|
|
5
|
+
import { useConversationInput } from "./ConversationInput.js";
|
|
6
|
+
import { useConversationMode } from "./ConversationMode.js";
|
|
7
|
+
import { useConversationFeedback } from "./ConversationFeedback.js";
|
|
8
|
+
import { useRawConversation, useRegisterCallbacks, } from "./ConversationContext.js";
|
|
9
|
+
import { useStableCallbacks } from "./useStableCallbacks.js";
|
|
10
10
|
/**
|
|
11
11
|
* Convenience hook that combines all granular conversation hooks into a single
|
|
12
12
|
* return value. Less performant than using individual hooks because any state
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useConversation.js","sourceRoot":"","sources":["../../src/conversation/useConversation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"useConversation.js","sourceRoot":"","sources":["../../src/conversation/useConversation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EACL,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAQ7D;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgC,EAAE;IAChE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,GAAG,KAAK,CAAC;IAEnD,MAAM,eAAe,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IACxD,oBAAoB,CAAC,eAAe,CAAC,CAAC;IAEtC,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3C,qGAAqG;IACrG,cAAc,CAAC,OAAO,GAAG,WAAW,CAAC;IAErC,MAAM,QAAQ,GAAG,uBAAuB,EAAE,CAAC;IAC3C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,qBAAqB,EAAE,CAAC;IACpD,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,oBAAoB,EAAE,CAAC;IACrD,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,mBAAmB,EAAE,CAAC;IAChE,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,GAAG,uBAAuB,EAAE,CAAC;IAEpE,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,OAAqB,EAAE,EAAE;QACxB,yEAAyE;QACzE,2DAA2D;QAC3D,6EAA6E;QAC7E,4EAA4E;QAC5E,4EAA4E;QAC5E,0EAA0E;QAC1E,+CAA+C;QAC/C,MAAM,aAAa,GAAG,EAAE,GAAG,cAAc,CAAC,OAAO,EAAE,CAAC;QACpD,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,OAAQ,aAAyC,CAAC,GAAG,CAAC,CAAC;QACzD,CAAC;QACD,QAAQ,CAAC,YAAY,CAAC;YACpB,GAAG,aAAa;YAChB,GAAG,OAAO;SACI,CAAC,CAAC;IACpB,CAAC,EACD,CAAC,QAAQ,EAAE,cAAc,CAAC,CAC3B,CAAC;IAEF,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;IAE1C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ,KAAK,SAAS,IAAI,YAAY,EAAE,CAAC;YAC3C,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEvC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,KAAK,SAAS,IAAI,YAAY,EAAE,CAAC;YACzC,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IAE3B,OAAO;QACL,GAAG,QAAQ;QACX,YAAY;QACZ,MAAM;QACN,OAAO;QACP,OAAO,EAAE,QAAQ,IAAI,OAAO;QAC5B,QAAQ;QACR,IAAI;QACJ,UAAU;QACV,WAAW;QACX,eAAe;QACf,YAAY;KACb,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Callbacks } from "@elevenlabs/client";
|
|
2
|
-
import type { HookOptions } from "./types";
|
|
2
|
+
import type { HookOptions } from "./types.js";
|
|
3
3
|
/**
|
|
4
4
|
* Wraps user-provided callback props in stable ref-backed functions,
|
|
5
5
|
* preventing stale closure bugs when the session outlives renders.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useStableCallbacks.d.ts","sourceRoot":"","sources":["../../src/conversation/useStableCallbacks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"useStableCallbacks.d.ts","sourceRoot":"","sources":["../../src/conversation/useStableCallbacks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,CA6BzE"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
export * from "@elevenlabs/client";
|
|
2
|
-
export { useScribe, AudioFormat, CommitStrategy, RealtimeEvents, } from "./scribe";
|
|
3
|
-
export type { ScribeStatus, TranscriptSegment, WordTimestamp, ScribeCallbacks, ScribeHookOptions, UseScribeReturn, RealtimeConnection, } from "./scribe";
|
|
4
|
-
export { ConversationProvider } from "./conversation/ConversationProvider";
|
|
5
|
-
export { useConversationControls } from "./conversation/ConversationControls";
|
|
6
|
-
export { useConversationStatus } from "./conversation/ConversationStatus";
|
|
7
|
-
export { useConversationInput } from "./conversation/ConversationInput";
|
|
8
|
-
export { useConversationMode } from "./conversation/ConversationMode";
|
|
9
|
-
export { useConversationFeedback } from "./conversation/ConversationFeedback";
|
|
10
|
-
export { useRawConversation } from "./conversation/ConversationContext";
|
|
11
|
-
export { useConversation } from "./conversation/useConversation";
|
|
12
|
-
export { useConversationClientTool } from "./conversation/ConversationClientTools";
|
|
13
|
-
export type { UseConversationOptions } from "./conversation/useConversation";
|
|
14
|
-
export type { ConversationControlsValue } from "./conversation/ConversationControls";
|
|
15
|
-
export type { ConversationInputValue } from "./conversation/ConversationInput";
|
|
16
|
-
export type { ConversationStatus, ConversationStatusValue, } from "./conversation/ConversationStatus";
|
|
17
|
-
export type { ConversationModeValue } from "./conversation/ConversationMode";
|
|
18
|
-
export type { ConversationFeedbackValue } from "./conversation/ConversationFeedback";
|
|
19
|
-
export type { ConversationProviderProps } from "./conversation/ConversationProvider";
|
|
20
|
-
export type { HookOptions, HookCallbacks, ClientTool, ClientTools, ClientToolResult, } from "./conversation/types";
|
|
2
|
+
export { useScribe, AudioFormat, CommitStrategy, RealtimeEvents, } from "./scribe.js";
|
|
3
|
+
export type { ScribeStatus, TranscriptSegment, WordTimestamp, ScribeCallbacks, ScribeHookOptions, UseScribeReturn, RealtimeConnection, } from "./scribe.js";
|
|
4
|
+
export { ConversationProvider } from "./conversation/ConversationProvider.js";
|
|
5
|
+
export { useConversationControls } from "./conversation/ConversationControls.js";
|
|
6
|
+
export { useConversationStatus } from "./conversation/ConversationStatus.js";
|
|
7
|
+
export { useConversationInput } from "./conversation/ConversationInput.js";
|
|
8
|
+
export { useConversationMode } from "./conversation/ConversationMode.js";
|
|
9
|
+
export { useConversationFeedback } from "./conversation/ConversationFeedback.js";
|
|
10
|
+
export { useRawConversation } from "./conversation/ConversationContext.js";
|
|
11
|
+
export { useConversation } from "./conversation/useConversation.js";
|
|
12
|
+
export { useConversationClientTool } from "./conversation/ConversationClientTools.js";
|
|
13
|
+
export type { UseConversationOptions } from "./conversation/useConversation.js";
|
|
14
|
+
export type { ConversationControlsValue } from "./conversation/ConversationControls.js";
|
|
15
|
+
export type { ConversationInputValue } from "./conversation/ConversationInput.js";
|
|
16
|
+
export type { ConversationStatus, ConversationStatusValue, } from "./conversation/ConversationStatus.js";
|
|
17
|
+
export type { ConversationModeValue } from "./conversation/ConversationMode.js";
|
|
18
|
+
export type { ConversationFeedbackValue } from "./conversation/ConversationFeedback.js";
|
|
19
|
+
export type { ConversationProviderProps } from "./conversation/ConversationProvider.js";
|
|
20
|
+
export type { HookOptions, HookCallbacks, ClientTool, ClientTools, ClientToolResult, } from "./conversation/types.js";
|
|
21
21
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,cAAc,oBAAoB,CAAC;AAGnC,OAAO,EACL,SAAS,EACT,WAAW,EACX,cAAc,EACd,cAAc,GACf,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,cAAc,oBAAoB,CAAC;AAGnC,OAAO,EACL,SAAS,EACT,WAAW,EACX,cAAc,EACd,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAC;AACtF,YAAY,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAChF,YAAY,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACxF,YAAY,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAClF,YAAY,EACV,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,sCAAsC,CAAC;AAC9C,YAAY,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAChF,YAAY,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACxF,YAAY,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACxF,YAAY,EACV,WAAW,EACX,aAAa,EACb,UAAU,EACV,WAAW,EACX,gBAAgB,GACjB,MAAM,yBAAyB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { setSourceInfo } from "@elevenlabs/client/internal";
|
|
2
|
-
import { PACKAGE_VERSION } from "./version";
|
|
2
|
+
import { PACKAGE_VERSION } from "./version.js";
|
|
3
3
|
setSourceInfo({ name: "react_sdk", version: PACKAGE_VERSION });
|
|
4
4
|
export * from "@elevenlabs/client";
|
|
5
5
|
// Scribe exports
|
|
6
|
-
export { useScribe, AudioFormat, CommitStrategy, RealtimeEvents, } from "./scribe";
|
|
6
|
+
export { useScribe, AudioFormat, CommitStrategy, RealtimeEvents, } from "./scribe.js";
|
|
7
7
|
// Conversation context API
|
|
8
|
-
export { ConversationProvider } from "./conversation/ConversationProvider";
|
|
9
|
-
export { useConversationControls } from "./conversation/ConversationControls";
|
|
10
|
-
export { useConversationStatus } from "./conversation/ConversationStatus";
|
|
11
|
-
export { useConversationInput } from "./conversation/ConversationInput";
|
|
12
|
-
export { useConversationMode } from "./conversation/ConversationMode";
|
|
13
|
-
export { useConversationFeedback } from "./conversation/ConversationFeedback";
|
|
14
|
-
export { useRawConversation } from "./conversation/ConversationContext";
|
|
15
|
-
export { useConversation } from "./conversation/useConversation";
|
|
16
|
-
export { useConversationClientTool } from "./conversation/ConversationClientTools";
|
|
8
|
+
export { ConversationProvider } from "./conversation/ConversationProvider.js";
|
|
9
|
+
export { useConversationControls } from "./conversation/ConversationControls.js";
|
|
10
|
+
export { useConversationStatus } from "./conversation/ConversationStatus.js";
|
|
11
|
+
export { useConversationInput } from "./conversation/ConversationInput.js";
|
|
12
|
+
export { useConversationMode } from "./conversation/ConversationMode.js";
|
|
13
|
+
export { useConversationFeedback } from "./conversation/ConversationFeedback.js";
|
|
14
|
+
export { useRawConversation } from "./conversation/ConversationContext.js";
|
|
15
|
+
export { useConversation } from "./conversation/useConversation.js";
|
|
16
|
+
export { useConversationClientTool } from "./conversation/ConversationClientTools.js";
|
|
17
17
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,aAAa,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;AAE/D,cAAc,oBAAoB,CAAC;AAEnC,iBAAiB;AACjB,OAAO,EACL,SAAS,EACT,WAAW,EACX,cAAc,EACd,cAAc,GACf,MAAM,aAAa,CAAC;AAWrB,2BAA2B;AAC3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2CAA2C,CAAC"}
|
package/dist/lib.iife.js
CHANGED
|
@@ -4,7 +4,7 @@ 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.0
|
|
7
|
+
const PACKAGE_VERSION = "1.1.0";
|
|
8
8
|
//#endregion
|
|
9
9
|
//#region src/scribe.ts
|
|
10
10
|
function useScribe(options = {}) {
|
|
@@ -852,8 +852,11 @@ var ElevenLabsReact = (function(exports, _elevenlabs_client_internal, _elevenlab
|
|
|
852
852
|
conversationRef.current = conv;
|
|
853
853
|
setConversation(conv);
|
|
854
854
|
lockRef.current = null;
|
|
855
|
-
}, () => {
|
|
855
|
+
}, (error) => {
|
|
856
856
|
lockRef.current = null;
|
|
857
|
+
if (shouldEndRef.current) return;
|
|
858
|
+
const message = error instanceof Error ? error.message : "Session failed to start";
|
|
859
|
+
sessionOptions.onError?.(message, error);
|
|
857
860
|
});
|
|
858
861
|
}, [
|
|
859
862
|
stableCallbacks,
|
|
@@ -867,13 +870,13 @@ var ElevenLabsReact = (function(exports, _elevenlabs_client_internal, _elevenlab
|
|
|
867
870
|
const conv = conversationRef.current;
|
|
868
871
|
conversationRef.current = null;
|
|
869
872
|
setConversation(null);
|
|
870
|
-
if (pendingConnection) pendingConnection.then((c) => c.endSession());
|
|
873
|
+
if (pendingConnection) pendingConnection.then((c) => c.endSession(), () => {});
|
|
871
874
|
else conv?.endSession();
|
|
872
875
|
}, []);
|
|
873
876
|
(0, react.useEffect)(() => {
|
|
874
877
|
return () => {
|
|
875
878
|
shouldEndRef.current = true;
|
|
876
|
-
if (lockRef.current) lockRef.current.then((conv) => conv.endSession());
|
|
879
|
+
if (lockRef.current) lockRef.current.then((conv) => conv.endSession(), () => {});
|
|
877
880
|
else conversationRef.current?.endSession();
|
|
878
881
|
};
|
|
879
882
|
}, []);
|
package/dist/lib.iife.js.map
CHANGED
|
@@ -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.0.2\";\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?: {\n deviceId?: string;\n echoCancellation?: boolean;\n noiseSuppression?: boolean;\n autoGainControl?: boolean;\n channelCount?: number;\n };\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\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 } = 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 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 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 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 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 { createContext, useContext, useLayoutEffect, useRef, type MutableRefObject, type RefObject } from \"react\";\nimport type { Callbacks, ClientToolsConfig, Conversation } from \"@elevenlabs/client\";\nimport type { HookOptions } from \"./types\";\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 callbacksRef.current = callbacks;\n\n // Re-subscribe when the set of provided callback keys changes.\n const activeKeys = Object.keys(callbacks)\n .filter(key => callbacks[key as keyof Callbacks] !== undefined)\n .sort();\n\n useLayoutEffect(() => {\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 // eslint-disable-next-line react-hooks/exhaustive-deps -- activeKeys.join() is a stable scalar derived from activeKeys; no split needed since the effect closes over activeKeys directly\n }, [registerCallbacks, activeKeys.join(\"|\")]);\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} from \"@elevenlabs/client\";\nimport type { HookOptions } from \"./types\";\nimport { ConversationContext } from \"./ConversationContext\";\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 sendContextualUpdate: (text: string) => void;\n sendUserActivity: () => void;\n sendMCPToolApprovalResult: (\n toolCallId: string,\n isApproved: boolean\n ) => void;\n setVolume: (options: { volume: number }) => void;\n changeInputDevice: (\n config: FormatConfig & InputDeviceConfig\n ) => Promise<void>;\n changeOutputDevice: (config: FormatConfig & OutputConfig) => Promise<void>;\n getInputByteFrequencyData: () => Uint8Array;\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((text: string) => {\n getConversation().sendUserMessage(text);\n }, [getConversation]);\n\n const sendMultimodalMessage = useCallback(\n (options: MultimodalMessageInput) => {\n getConversation().sendMultimodalMessage(options);\n },\n [getConversation]\n );\n\n const sendContextualUpdate = useCallback((text: string) => {\n getConversation().sendContextualUpdate(text);\n }, [getConversation]);\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((options: { volume: number }) => {\n getConversation().setVolume(options);\n }, [getConversation]);\n\n const changeInputDevice = useCallback(\n async (config: 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: 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 conversationRef.current?.getInputByteFrequencyData() ?? EMPTY_FREQUENCY_DATA;\n }, [conversationRef]);\n\n const getOutputByteFrequencyData = useCallback(() => {\n return conversationRef.current?.getOutputByteFrequencyData() ?? EMPTY_FREQUENCY_DATA;\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 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 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\";\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\";\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\";\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\";\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\";\nimport type { ClientTool, ClientTools } from \"./types\";\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\";\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\";\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 for (const key of CALLBACK_KEYS) {\n callbackRefs.current[key] = props[key];\n }\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\n return 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 -- joined string is a stable scalar derived from activeKeys\n [activeKeys.join(\"|\")]\n );\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Conversation, type Options, type Callbacks } 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\";\nimport {\n ConversationContext,\n type ConversationContextValue,\n} from \"./ConversationContext\";\nimport { ConversationControlsProvider } from \"./ConversationControls\";\nimport { ConversationStatusProvider } from \"./ConversationStatus\";\nimport {\n ConversationInputProvider,\n type ConversationInputProviderProps,\n} from \"./ConversationInput\";\nimport { ConversationModeProvider } from \"./ConversationMode\";\nimport { ConversationFeedbackProvider } from \"./ConversationFeedback\";\nimport {\n ConversationClientToolsProvider,\n buildClientTools,\n} from \"./ConversationClientTools\";\nimport { ListenerMap } from \"./ListenerMap\";\nimport { useStableCallbacks } from \"./useStableCallbacks\";\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 /** 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\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 lockRef.current = Conversation.startSession(sessionOptions);\n\n lockRef.current.then(\n conv => {\n if (shouldEndRef.current) {\n conv.endSession();\n lockRef.current = null;\n return;\n }\n conversationRef.current = conv;\n setConversation(conv);\n lockRef.current = null;\n },\n () => {\n lockRef.current = null;\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\";\nimport { useConversationStatus } from \"./ConversationStatus\";\nimport { useConversationInput } from \"./ConversationInput\";\nimport { useConversationMode } from \"./ConversationMode\";\nimport { useConversationFeedback } from \"./ConversationFeedback\";\nimport {\n useRawConversation,\n useRegisterCallbacks,\n} from \"./ConversationContext\";\nimport { useStableCallbacks } from \"./useStableCallbacks\";\nimport type { HookOptions } from \"./types\";\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\";\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\";\nexport type {\n ScribeStatus,\n TranscriptSegment,\n WordTimestamp,\n ScribeCallbacks,\n ScribeHookOptions,\n UseScribeReturn,\n RealtimeConnection,\n} from \"./scribe\";\n\n// Conversation context API\nexport { ConversationProvider } from \"./conversation/ConversationProvider\";\nexport { useConversationControls } from \"./conversation/ConversationControls\";\nexport { useConversationStatus } from \"./conversation/ConversationStatus\";\nexport { useConversationInput } from \"./conversation/ConversationInput\";\nexport { useConversationMode } from \"./conversation/ConversationMode\";\nexport { useConversationFeedback } from \"./conversation/ConversationFeedback\";\nexport { useRawConversation } from \"./conversation/ConversationContext\";\nexport { useConversation } from \"./conversation/useConversation\";\nexport { useConversationClientTool } from \"./conversation/ConversationClientTools\";\nexport type { UseConversationOptions } from \"./conversation/useConversation\";\nexport type { ConversationControlsValue } from \"./conversation/ConversationControls\";\nexport type { ConversationInputValue } from \"./conversation/ConversationInput\";\nexport type {\n ConversationStatus,\n ConversationStatusValue,\n} from \"./conversation/ConversationStatus\";\nexport type { ConversationModeValue } from \"./conversation/ConversationMode\";\nexport type { ConversationFeedbackValue } from \"./conversation/ConversationFeedback\";\nexport type { ConversationProviderProps } from \"./conversation/ConversationProvider\";\nexport type {\n HookOptions,\n HookCallbacks,\n ClientTool,\n ClientTools,\n ClientToolResult,\n} from \"./conversation/types\";\n"],"x_google_ignoreList":[3,4],"mappings":"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"}
|
|
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.1.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?: {\n deviceId?: string;\n echoCancellation?: boolean;\n noiseSuppression?: boolean;\n autoGainControl?: boolean;\n channelCount?: number;\n };\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\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 } = 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 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 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 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 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 { createContext, useContext, useLayoutEffect, useRef, type MutableRefObject, type RefObject } from \"react\";\nimport type { Callbacks, ClientToolsConfig, Conversation } 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 callbacksRef.current = callbacks;\n\n // Re-subscribe when the set of provided callback keys changes.\n const activeKeys = Object.keys(callbacks)\n .filter(key => callbacks[key as keyof Callbacks] !== undefined)\n .sort();\n\n useLayoutEffect(() => {\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 // eslint-disable-next-line react-hooks/exhaustive-deps -- activeKeys.join() is a stable scalar derived from activeKeys; no split needed since the effect closes over activeKeys directly\n }, [registerCallbacks, activeKeys.join(\"|\")]);\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} 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 sendContextualUpdate: (text: string) => void;\n sendUserActivity: () => void;\n sendMCPToolApprovalResult: (\n toolCallId: string,\n isApproved: boolean\n ) => 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((text: string) => {\n getConversation().sendUserMessage(text);\n }, [getConversation]);\n\n const sendMultimodalMessage = useCallback(\n (options: MultimodalMessageInput) => {\n getConversation().sendMultimodalMessage(options);\n },\n [getConversation]\n );\n\n const sendContextualUpdate = useCallback((text: string) => {\n getConversation().sendContextualUpdate(text);\n }, [getConversation]);\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((options: { volume: number }) => {\n getConversation().setVolume(options);\n }, [getConversation]);\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 conversationRef.current?.getInputByteFrequencyData() ?? EMPTY_FREQUENCY_DATA;\n }, [conversationRef]);\n\n const getOutputByteFrequencyData = useCallback(() => {\n return conversationRef.current?.getOutputByteFrequencyData() ?? EMPTY_FREQUENCY_DATA;\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 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 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 for (const key of CALLBACK_KEYS) {\n callbackRefs.current[key] = props[key];\n }\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\n return 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 -- joined string is a stable scalar derived from activeKeys\n [activeKeys.join(\"|\")]\n );\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { Conversation, type Options, type Callbacks } 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 /** 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\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 lockRef.current = Conversation.startSession(sessionOptions);\n\n lockRef.current.then(\n conv => {\n if (shouldEndRef.current) {\n conv.endSession();\n lockRef.current = null;\n return;\n }\n conversationRef.current = conv;\n setConversation(conv);\n lockRef.current = null;\n },\n (error: unknown) => {\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":"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"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const PACKAGE_VERSION = "1.0
|
|
1
|
+
export declare const PACKAGE_VERSION = "1.1.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elevenlabs/react",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.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.
|
|
21
|
+
"@elevenlabs/client": "1.2.0"
|
|
22
22
|
},
|
|
23
23
|
"peerDependencies": {
|
|
24
24
|
"react": ">=16.8.0"
|