@elevenlabs/react 1.12.0 → 1.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/conversation/ConversationClientTools.d.ts +1 -1
- package/dist/conversation/ConversationClientTools.d.ts.map +1 -1
- package/dist/conversation/ConversationControls.d.ts +1 -1
- package/dist/conversation/ConversationControls.d.ts.map +1 -1
- package/dist/conversation/ConversationFeedback.d.ts +1 -1
- package/dist/conversation/ConversationFeedback.d.ts.map +1 -1
- package/dist/conversation/ConversationInput.d.ts +1 -1
- package/dist/conversation/ConversationInput.d.ts.map +1 -1
- package/dist/conversation/ConversationMode.d.ts +1 -1
- package/dist/conversation/ConversationMode.d.ts.map +1 -1
- package/dist/conversation/ConversationProvider.d.ts +1 -1
- package/dist/conversation/ConversationProvider.d.ts.map +1 -1
- package/dist/conversation/ConversationProvider.js +82 -22
- package/dist/conversation/ConversationProvider.js.map +1 -1
- package/dist/conversation/ConversationStatus.d.ts +1 -1
- package/dist/conversation/ConversationStatus.d.ts.map +1 -1
- package/dist/conversation/ConversationStatus.js +5 -5
- package/dist/conversation/ConversationStatus.js.map +1 -1
- package/dist/conversation/types.d.ts +1 -1
- package/dist/conversation/types.d.ts.map +1 -1
- package/dist/lib.iife.js +38 -17
- package/dist/lib.iife.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +5 -5
|
@@ -7,7 +7,7 @@ type ClientToolEntry = ClientToolsConfig["clientTools"][string];
|
|
|
7
7
|
* name conflicts with an option-provided tool.
|
|
8
8
|
*/
|
|
9
9
|
export declare function buildClientTools(optionTools: Record<string, ClientToolEntry> | undefined, registry: Map<string, ClientToolEntry>): Record<string, ClientToolEntry>;
|
|
10
|
-
export declare function ConversationClientToolsProvider({ children, }: React.PropsWithChildren): import("react
|
|
10
|
+
export declare function ConversationClientToolsProvider({ children, }: React.PropsWithChildren): import("react").JSX.Element;
|
|
11
11
|
/**
|
|
12
12
|
* Registers a named client tool with the nearest `ConversationProvider`.
|
|
13
13
|
* The tool is available during any active conversation and is automatically
|
|
@@ -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,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
|
|
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,+BAqCzB;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"}
|
|
@@ -27,7 +27,7 @@ export declare const ConversationControlsContext: import("react").Context<Conver
|
|
|
27
27
|
* Reads from `ConversationContext` and provides stable action references to
|
|
28
28
|
* `ConversationControlsContext`. Must be rendered inside a `ConversationProvider`.
|
|
29
29
|
*/
|
|
30
|
-
export declare function ConversationControlsProvider({ children, }: React.PropsWithChildren): import("react
|
|
30
|
+
export declare function ConversationControlsProvider({ children, }: React.PropsWithChildren): import("react").JSX.Element;
|
|
31
31
|
/**
|
|
32
32
|
* Returns stable action references for controlling the conversation.
|
|
33
33
|
* All function references are stable and will never cause re-renders.
|
|
@@ -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,EAC3B,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC7B,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,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtD,oBAAoB,EAAE,CACpB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,uBAAuB,KAC9B,IAAI,CAAC;IACV,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,yBAAyB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7E,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
|
|
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,EAC3B,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC7B,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,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACtD,oBAAoB,EAAE,CACpB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,uBAAuB,KAC9B,IAAI,CAAC;IACV,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,yBAAyB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7E,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,+BAgKzB;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI,yBAAyB,CAQnE"}
|
|
@@ -8,7 +8,7 @@ export type ConversationFeedbackValue = {
|
|
|
8
8
|
* a `sendFeedback` action through `ConversationFeedbackContext`.
|
|
9
9
|
* Must be rendered inside a `ConversationProvider`.
|
|
10
10
|
*/
|
|
11
|
-
export declare function ConversationFeedbackProvider({ children, }: React.PropsWithChildren): import("react
|
|
11
|
+
export declare function ConversationFeedbackProvider({ children, }: React.PropsWithChildren): import("react").JSX.Element;
|
|
12
12
|
/**
|
|
13
13
|
* Returns the current feedback state and a `sendFeedback` action.
|
|
14
14
|
* Re-renders only when `canSendFeedback` changes.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationFeedback.d.ts","sourceRoot":"","sources":["../../src/conversation/ConversationFeedback.tsx"],"names":[],"mappings":"AAYA,MAAM,MAAM,yBAAyB,GAAG;IACtC,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAChE,CAAC;AAKF;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,EAC3C,QAAQ,GACT,EAAE,KAAK,CAAC,iBAAiB
|
|
1
|
+
{"version":3,"file":"ConversationFeedback.d.ts","sourceRoot":"","sources":["../../src/conversation/ConversationFeedback.tsx"],"names":[],"mappings":"AAYA,MAAM,MAAM,yBAAyB,GAAG;IACtC,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAChE,CAAC;AAKF;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,EAC3C,QAAQ,GACT,EAAE,KAAK,CAAC,iBAAiB,+BAiCzB;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI,yBAAyB,CAQnE"}
|
|
@@ -13,7 +13,7 @@ export type ConversationInputProviderProps = React.PropsWithChildren<{
|
|
|
13
13
|
* `setMuted` calls `conversation.setMicMuted()` and updates local state.
|
|
14
14
|
* Must be rendered inside a `ConversationProvider`.
|
|
15
15
|
*/
|
|
16
|
-
export declare function ConversationInputProvider({ children, isMuted: controlledIsMuted, onMutedChange, }: ConversationInputProviderProps): import("react
|
|
16
|
+
export declare function ConversationInputProvider({ children, isMuted: controlledIsMuted, onMutedChange, }: ConversationInputProviderProps): import("react").JSX.Element;
|
|
17
17
|
/**
|
|
18
18
|
* Returns the current microphone mute state and a function to change it.
|
|
19
19
|
* Re-renders only when the mute state changes.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationInput.d.ts","sourceRoot":"","sources":["../../src/conversation/ConversationInput.tsx"],"names":[],"mappings":"AAcA,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG,KAAK,CAAC,iBAAiB,CAAC;IACnE,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C,CAAC,CAAC;AAMH;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,EACxC,QAAQ,EACR,OAAO,EAAE,iBAAiB,EAC1B,aAAa,GACd,EAAE,8BAA8B
|
|
1
|
+
{"version":3,"file":"ConversationInput.d.ts","sourceRoot":"","sources":["../../src/conversation/ConversationInput.tsx"],"names":[],"mappings":"AAcA,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG,KAAK,CAAC,iBAAiB,CAAC;IACnE,4EAA4E;IAC5E,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C,CAAC,CAAC;AAMH;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,EACxC,QAAQ,EACR,OAAO,EAAE,iBAAiB,EAC1B,aAAa,GACd,EAAE,8BAA8B,+BA8ChC;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,sBAAsB,CAQ7D"}
|
|
@@ -8,7 +8,7 @@ export type ConversationModeValue = {
|
|
|
8
8
|
* Manages its own `mode` state and provides it through
|
|
9
9
|
* `ConversationModeContext`. Must be rendered inside a `ConversationProvider`.
|
|
10
10
|
*/
|
|
11
|
-
export declare function ConversationModeProvider({ children, }: React.PropsWithChildren): import("react
|
|
11
|
+
export declare function ConversationModeProvider({ children, }: React.PropsWithChildren): import("react").JSX.Element;
|
|
12
12
|
/**
|
|
13
13
|
* Returns the current conversation mode (speaking/listening) and
|
|
14
14
|
* convenience booleans. Re-renders only when the mode changes.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationMode.d.ts","sourceRoot":"","sources":["../../src/conversation/ConversationMode.tsx"],"names":[],"mappings":"AAIA,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,UAAU,GAAG,WAAW,CAAC;IAC/B,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAMF;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,QAAQ,GACT,EAAE,KAAK,CAAC,iBAAiB
|
|
1
|
+
{"version":3,"file":"ConversationMode.d.ts","sourceRoot":"","sources":["../../src/conversation/ConversationMode.tsx"],"names":[],"mappings":"AAIA,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,UAAU,GAAG,WAAW,CAAC;IAC/B,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAMF;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,QAAQ,GACT,EAAE,KAAK,CAAC,iBAAiB,+BA0BzB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,qBAAqB,CAQ3D"}
|
|
@@ -2,6 +2,6 @@ import { type HookOptions } from "./types.js";
|
|
|
2
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
|
-
export declare function ConversationProvider({ children, isMuted, onMutedChange, ...defaultOptions }: ConversationProviderProps): import("react
|
|
5
|
+
export declare function ConversationProvider({ children, isMuted, onMutedChange, ...defaultOptions }: ConversationProviderProps): import("react").JSX.Element;
|
|
6
6
|
export {};
|
|
7
7
|
//# sourceMappingURL=ConversationProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationProvider.d.ts","sourceRoot":"","sources":["../../src/conversation/ConversationProvider.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ConversationProvider.d.ts","sourceRoot":"","sources":["../../src/conversation/ConversationProvider.tsx"],"names":[],"mappings":"AAeA,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;AAWF,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,+BA8S3B"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { useCallback, useEffect,
|
|
2
|
+
import { useCallback, useEffect, 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
5
|
import { ConversationContext, } from "./ConversationContext.js";
|
|
@@ -41,17 +41,6 @@ export function ConversationProvider({ children, isMuted, onMutedChange, ...defa
|
|
|
41
41
|
const [conversation, setConversation] = useState(null);
|
|
42
42
|
const stableCallbacks = useStableCallbacks(defaultOptions);
|
|
43
43
|
const registerCallbacks = useCallback((callbacks) => listenerMap.register(callbacks), [listenerMap]);
|
|
44
|
-
// Sync provider state when session ends externally (agent disconnect,
|
|
45
|
-
// raw instance endSession(), etc.). Uses the listener map so it composes
|
|
46
|
-
// with user-provided onDisconnect callbacks.
|
|
47
|
-
useLayoutEffect(() => {
|
|
48
|
-
return listenerMap.register({
|
|
49
|
-
onDisconnect: () => {
|
|
50
|
-
conversationRef.current = null;
|
|
51
|
-
setConversation(null);
|
|
52
|
-
},
|
|
53
|
-
});
|
|
54
|
-
}, [listenerMap]);
|
|
55
44
|
const startSession = useCallback((options) => {
|
|
56
45
|
if (conversationRef.current) {
|
|
57
46
|
return;
|
|
@@ -75,9 +64,33 @@ export function ConversationProvider({ children, isMuted, onMutedChange, ...defa
|
|
|
75
64
|
const clientTools = buildClientTools(sessionOptions.clientTools, clientToolsRegistry);
|
|
76
65
|
clientToolsRef.current = clientTools;
|
|
77
66
|
sessionOptions.clientTools = clientTools;
|
|
78
|
-
const userOnConversationCreated = sessionOptions.onConversationCreated;
|
|
79
67
|
const isStaleStartSession = () => startSessionId !== startSessionIdRef.current;
|
|
68
|
+
// A superseded session can outlive its replacement's start: its async
|
|
69
|
+
// teardown keeps emitting events (final "disconnected", teardown
|
|
70
|
+
// onDisconnect, errors) that would otherwise reach the listener map
|
|
71
|
+
// and clobber sub-provider state now reflecting the newer session
|
|
72
|
+
// (e.g. ConversationModeProvider resets mode on onDisconnect). Drop
|
|
73
|
+
// every callback once this start is stale.
|
|
74
|
+
for (const key of CALLBACK_KEYS) {
|
|
75
|
+
const callback = sessionOptions[key];
|
|
76
|
+
if (typeof callback === "function") {
|
|
77
|
+
sessionOptions[key] = (...args) => {
|
|
78
|
+
if (!isStaleStartSession()) {
|
|
79
|
+
callback(...args);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const userOnConversationCreated = sessionOptions.onConversationCreated;
|
|
85
|
+
const userOnDisconnect = sessionOptions.onDisconnect;
|
|
86
|
+
// Set once this session's conversation is known. endSession() clears
|
|
87
|
+
// conversationRef optimistically (so restart-from-callback patterns
|
|
88
|
+
// keep working), which means a session's own onDisconnect can still
|
|
89
|
+
// arrive after a *newer* session has taken the ref — this check stops
|
|
90
|
+
// that late arrival from clearing state that isn't its own.
|
|
91
|
+
let thisSessionConv = null;
|
|
80
92
|
const handleConversationCreated = (conv) => {
|
|
93
|
+
thisSessionConv = conv;
|
|
81
94
|
if (shouldEndRef.current || isStaleStartSession()) {
|
|
82
95
|
return;
|
|
83
96
|
}
|
|
@@ -92,9 +105,43 @@ export function ConversationProvider({ children, isMuted, onMutedChange, ...defa
|
|
|
92
105
|
lockRef.current = null;
|
|
93
106
|
sessionOptions.onConnect?.(props);
|
|
94
107
|
};
|
|
108
|
+
// "disconnecting" marks the moment the session stops being usable, on
|
|
109
|
+
// every path (agent hangup, raw endSession(), provider endSession()) —
|
|
110
|
+
// release the conversation here so it clears in the same React batch
|
|
111
|
+
// as the status transition, and consumers never observe a live status
|
|
112
|
+
// with a released conversation (or vice versa). Stale sessions are
|
|
113
|
+
// dropped entirely so a late "disconnected" can't clobber the status
|
|
114
|
+
// of a session that replaced this one.
|
|
115
|
+
const handleStatusChange = props => {
|
|
116
|
+
if (isStaleStartSession()) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (props.status === "disconnecting" &&
|
|
120
|
+
thisSessionConv !== null &&
|
|
121
|
+
conversationRef.current === thisSessionConv) {
|
|
122
|
+
conversationRef.current = null;
|
|
123
|
+
setConversation(null);
|
|
124
|
+
}
|
|
125
|
+
sessionOptions.onStatusChange?.(props);
|
|
126
|
+
};
|
|
127
|
+
// Syncs provider state when this session ends, whether externally
|
|
128
|
+
// (agent disconnect) or via endSession(). Only clears conversationRef
|
|
129
|
+
// if it still points at this session's conversation.
|
|
130
|
+
const handleDisconnect = details => {
|
|
131
|
+
if (isStaleStartSession()) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (conversationRef.current === thisSessionConv) {
|
|
135
|
+
conversationRef.current = null;
|
|
136
|
+
setConversation(null);
|
|
137
|
+
}
|
|
138
|
+
userOnDisconnect?.(details);
|
|
139
|
+
};
|
|
95
140
|
const providerLifecycleOptions = {
|
|
96
141
|
onConversationCreated: handleConversationCreated,
|
|
97
142
|
onConnect: handleConnect,
|
|
143
|
+
onDisconnect: handleDisconnect,
|
|
144
|
+
onStatusChange: handleStatusChange,
|
|
98
145
|
};
|
|
99
146
|
const startSessionOptions = {
|
|
100
147
|
...sessionOptions,
|
|
@@ -106,11 +153,14 @@ export function ConversationProvider({ children, isMuted, onMutedChange, ...defa
|
|
|
106
153
|
return;
|
|
107
154
|
}
|
|
108
155
|
if (shouldEndRef.current) {
|
|
109
|
-
conv
|
|
156
|
+
conv
|
|
157
|
+
.endSession()
|
|
158
|
+
.catch(error => console.warn("Error ending session:", error));
|
|
110
159
|
lockRef.current = null;
|
|
111
160
|
return;
|
|
112
161
|
}
|
|
113
162
|
if (conversationRef.current !== conv) {
|
|
163
|
+
thisSessionConv = conv;
|
|
114
164
|
conversationRef.current = conv;
|
|
115
165
|
setConversation(conv);
|
|
116
166
|
}
|
|
@@ -129,9 +179,7 @@ export function ConversationProvider({ children, isMuted, onMutedChange, ...defa
|
|
|
129
179
|
// rejecting, but never calls onError — surface the failure here
|
|
130
180
|
// so listeners (e.g. ConversationStatusProvider) transition to
|
|
131
181
|
// the "error" state with a meaningful message.
|
|
132
|
-
const message = error instanceof Error
|
|
133
|
-
? error.message
|
|
134
|
-
: "Session failed to start";
|
|
182
|
+
const message = error instanceof Error ? error.message : "Session failed to start";
|
|
135
183
|
sessionOptions.onError?.(message, error);
|
|
136
184
|
});
|
|
137
185
|
}, [stableCallbacks, listenerMap, clientToolsRegistry, clientToolsRef]);
|
|
@@ -142,10 +190,14 @@ export function ConversationProvider({ children, isMuted, onMutedChange, ...defa
|
|
|
142
190
|
conversationRef.current = null;
|
|
143
191
|
setConversation(null);
|
|
144
192
|
if (pendingConnection) {
|
|
145
|
-
pendingConnection.then(c => c
|
|
193
|
+
pendingConnection.then(c => c
|
|
194
|
+
.endSession()
|
|
195
|
+
.catch(error => console.warn("Error ending session:", error)), () => { });
|
|
146
196
|
}
|
|
147
197
|
else {
|
|
148
|
-
conv
|
|
198
|
+
conv
|
|
199
|
+
?.endSession()
|
|
200
|
+
.catch(error => console.warn("Error ending session:", error));
|
|
149
201
|
}
|
|
150
202
|
}, []);
|
|
151
203
|
// Cleanup on unmount
|
|
@@ -153,10 +205,10 @@ export function ConversationProvider({ children, isMuted, onMutedChange, ...defa
|
|
|
153
205
|
return () => {
|
|
154
206
|
shouldEndRef.current = true;
|
|
155
207
|
if (lockRef.current) {
|
|
156
|
-
lockRef.current.then(conv => conv.endSession(), () => { });
|
|
208
|
+
lockRef.current.then(conv => conv.endSession().catch(() => { }), () => { });
|
|
157
209
|
}
|
|
158
210
|
else {
|
|
159
|
-
conversationRef.current?.endSession();
|
|
211
|
+
conversationRef.current?.endSession().catch(() => { });
|
|
160
212
|
}
|
|
161
213
|
};
|
|
162
214
|
}, []);
|
|
@@ -168,7 +220,15 @@ export function ConversationProvider({ children, isMuted, onMutedChange, ...defa
|
|
|
168
220
|
registerCallbacks,
|
|
169
221
|
clientToolsRegistry,
|
|
170
222
|
clientToolsRef,
|
|
171
|
-
}), [
|
|
223
|
+
}), [
|
|
224
|
+
conversation,
|
|
225
|
+
conversationRef,
|
|
226
|
+
startSession,
|
|
227
|
+
endSession,
|
|
228
|
+
registerCallbacks,
|
|
229
|
+
clientToolsRegistry,
|
|
230
|
+
clientToolsRef,
|
|
231
|
+
]);
|
|
172
232
|
const wrappedChildren = SUB_PROVIDERS_WITHOUT_PROPS.reduceRight((nested, Provider) => _jsx(Provider, { children: nested }), _jsx(ConversationInputProvider, { isMuted: isMuted, onMutedChange: onMutedChange, children: children }));
|
|
173
233
|
return (_jsx(ConversationContext.Provider, { value: contextValue, children: wrappedChildren }));
|
|
174
234
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationProvider.js","sourceRoot":"","sources":["../../src/conversation/ConversationProvider.tsx"],"names":[],"mappings":";AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ConversationProvider.js","sourceRoot":"","sources":["../../src/conversation/ConversationProvider.tsx"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ export type ConversationStatusValue = {
|
|
|
8
8
|
* callbacks. Manages its own `status`/`message` state and provides it through
|
|
9
9
|
* `ConversationStatusContext`. Must be rendered inside a `ConversationProvider`.
|
|
10
10
|
*/
|
|
11
|
-
export declare function ConversationStatusProvider({ children, }: React.PropsWithChildren): import("react
|
|
11
|
+
export declare function ConversationStatusProvider({ children, }: React.PropsWithChildren): import("react").JSX.Element;
|
|
12
12
|
/**
|
|
13
13
|
* Returns the current conversation status and any error message.
|
|
14
14
|
* Re-renders when the connection status or error message changes.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationStatus.d.ts","sourceRoot":"","sources":["../../src/conversation/ConversationStatus.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,kBAAkB,GAC1B,cAAc,GACd,YAAY,GACZ,WAAW,GACX,OAAO,CAAC;AAEZ,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAMF;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,EACzC,QAAQ,GACT,EAAE,KAAK,CAAC,iBAAiB
|
|
1
|
+
{"version":3,"file":"ConversationStatus.d.ts","sourceRoot":"","sources":["../../src/conversation/ConversationStatus.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,kBAAkB,GAC1B,cAAc,GACd,YAAY,GACZ,WAAW,GACX,OAAO,CAAC;AAEZ,MAAM,MAAM,uBAAuB,GAAG;IACpC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAMF;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,EACzC,QAAQ,GACT,EAAE,KAAK,CAAC,iBAAiB,+BA+BzB;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,IAAI,uBAAuB,CAQ/D"}
|
|
@@ -12,11 +12,11 @@ export function ConversationStatusProvider({ children, }) {
|
|
|
12
12
|
const [message, setMessage] = useState(undefined);
|
|
13
13
|
useRegisterCallbacks({
|
|
14
14
|
onStatusChange({ status: newStatus }) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
setStatus(newStatus);
|
|
15
|
+
// "disconnecting" means the provider has already released the
|
|
16
|
+
// conversation (endSession clears it optimistically), so report
|
|
17
|
+
// "disconnected" immediately — holding "connected" here would let
|
|
18
|
+
// consumers observe status === "connected" with no conversation.
|
|
19
|
+
setStatus(newStatus === "disconnecting" ? "disconnected" : newStatus);
|
|
20
20
|
// Clear error message when transitioning to a non-error state
|
|
21
21
|
setMessage(undefined);
|
|
22
22
|
},
|
|
@@ -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,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,
|
|
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,8DAA8D;YAC9D,gEAAgE;YAChE,kEAAkE;YAClE,iEAAiE;YACjE,SAAS,CAAC,SAAS,KAAK,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACtE,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"}
|
|
@@ -2,7 +2,7 @@ import type { SessionConfig, ClientToolsConfig, InputConfig, AudioWorkletConfig,
|
|
|
2
2
|
export type ClientToolResult = string | number | void;
|
|
3
3
|
export type ClientTool<Parameters extends Record<string, unknown> = Record<string, unknown>, Result extends ClientToolResult = ClientToolResult> = (parameters: Parameters) => Promise<Result> | Result;
|
|
4
4
|
export type ClientTools = Record<string, ClientTool>;
|
|
5
|
-
export type HookCallbacks = Pick<Callbacks, "onConnect" | "onDisconnect" | "onError" | "onMessage" | "onAudio" | "onModeChange" | "onStatusChange" | "onCanSendFeedbackChange" | "onDebug" | "onUnhandledClientToolCall" | "onVadScore" | "onInterruption" | "onAgentToolResponse" | "onAgentToolRequest" | "onConversationMetadata" | "onMCPToolCall" | "onMCPConnectionStatus" | "onAsrInitiationMetadata" | "onAgentChatResponsePart" | "onAgentReasoningResponsePart" | "onAgentResponseCorrection" | "onAudioAlignment" | "onGuardrailTriggered" | "onAgentTyping" | "onExternalAgentConnected" | "onPing">;
|
|
5
|
+
export type HookCallbacks = Pick<Callbacks, "onConnect" | "onDisconnect" | "onError" | "onMessage" | "onAudio" | "onModeChange" | "onStatusChange" | "onCanSendFeedbackChange" | "onDebug" | "onUnhandledClientToolCall" | "onVadScore" | "onInterruption" | "onAgentToolResponse" | "onAgentToolRequest" | "onConversationMetadata" | "onMCPToolCall" | "onMCPConnectionStatus" | "onAsrInitiationMetadata" | "onAgentChatResponsePart" | "onAgentReasoningResponsePart" | "onAgentResponseCorrection" | "onRichContent" | "onAudioAlignment" | "onGuardrailTriggered" | "onAgentTyping" | "onExternalAgentConnected" | "onPing" | "onIncomingEvent" | "onOutgoingEvent">;
|
|
6
6
|
export type HookOptions = Partial<SessionConfig & HookCallbacks & ConversationLifecycleOptions & ClientToolsConfig & InputConfig & OutputConfig & AudioWorkletConfig & FormatConfig & {
|
|
7
7
|
serverLocation?: Location | string;
|
|
8
8
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/conversation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,4BAA4B,EAC5B,QAAQ,EACT,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAEtD,MAAM,MAAM,UAAU,CACpB,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpE,MAAM,SAAS,gBAAgB,GAAG,gBAAgB,IAChD,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAEzD,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAErD,MAAM,MAAM,aAAa,GAAG,IAAI,CAC9B,SAAS,EACP,WAAW,GACX,cAAc,GACd,SAAS,GACT,WAAW,GACX,SAAS,GACT,cAAc,GACd,gBAAgB,GAChB,yBAAyB,GACzB,SAAS,GACT,2BAA2B,GAC3B,YAAY,GACZ,gBAAgB,GAChB,qBAAqB,GACrB,oBAAoB,GACpB,wBAAwB,GACxB,eAAe,GACf,uBAAuB,GACvB,yBAAyB,GACzB,yBAAyB,GACzB,8BAA8B,GAC9B,2BAA2B,GAC3B,kBAAkB,GAClB,sBAAsB,GACtB,eAAe,GACf,0BAA0B,GAC1B,QAAQ,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/conversation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,4BAA4B,EAC5B,QAAQ,EACT,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAEtD,MAAM,MAAM,UAAU,CACpB,UAAU,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpE,MAAM,SAAS,gBAAgB,GAAG,gBAAgB,IAChD,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;AAEzD,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAErD,MAAM,MAAM,aAAa,GAAG,IAAI,CAC9B,SAAS,EACP,WAAW,GACX,cAAc,GACd,SAAS,GACT,WAAW,GACX,SAAS,GACT,cAAc,GACd,gBAAgB,GAChB,yBAAyB,GACzB,SAAS,GACT,2BAA2B,GAC3B,YAAY,GACZ,gBAAgB,GAChB,qBAAqB,GACrB,oBAAoB,GACpB,wBAAwB,GACxB,eAAe,GACf,uBAAuB,GACvB,yBAAyB,GACzB,yBAAyB,GACzB,8BAA8B,GAC9B,2BAA2B,GAC3B,eAAe,GACf,kBAAkB,GAClB,sBAAsB,GACtB,eAAe,GACf,0BAA0B,GAC1B,QAAQ,GACR,iBAAiB,GACjB,iBAAiB,CACpB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,OAAO,CAC/B,aAAa,GACX,aAAa,GACb,4BAA4B,GAC5B,iBAAiB,GACjB,WAAW,GACX,YAAY,GACZ,kBAAkB,GAClB,YAAY,GAAG;IACb,cAAc,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CACpC,CACJ,CAAC"}
|
package/dist/lib.iife.js
CHANGED
|
@@ -4,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.12.
|
|
7
|
+
const PACKAGE_VERSION = "1.12.1";
|
|
8
8
|
//#endregion
|
|
9
9
|
//#region src/scribe.ts
|
|
10
10
|
function useScribe(options = {}) {
|
|
@@ -347,7 +347,7 @@ var ElevenLabsReact = (function(exports, _elevenlabs_client_internal, _elevenlab
|
|
|
347
347
|
}, [registerCallbacks, activeKeyToken]);
|
|
348
348
|
}
|
|
349
349
|
//#endregion
|
|
350
|
-
//#region ../../node_modules/.pnpm/react@19.2.
|
|
350
|
+
//#region ../../node_modules/.pnpm/react@19.2.8/node_modules/react/cjs/react-jsx-runtime.production.js
|
|
351
351
|
/**
|
|
352
352
|
* @license React
|
|
353
353
|
* react-jsx-runtime.production.js
|
|
@@ -508,8 +508,7 @@ var ElevenLabsReact = (function(exports, _elevenlabs_client_internal, _elevenlab
|
|
|
508
508
|
const [message, setMessage] = (0, react.useState)(void 0);
|
|
509
509
|
useRegisterCallbacks({
|
|
510
510
|
onStatusChange({ status: newStatus }) {
|
|
511
|
-
|
|
512
|
-
setStatus(newStatus);
|
|
511
|
+
setStatus(newStatus === "disconnecting" ? "disconnected" : newStatus);
|
|
513
512
|
setMessage(void 0);
|
|
514
513
|
},
|
|
515
514
|
onError(errorMessage) {
|
|
@@ -864,12 +863,6 @@ var ElevenLabsReact = (function(exports, _elevenlabs_client_internal, _elevenlab
|
|
|
864
863
|
const [conversation, setConversation] = (0, react.useState)(null);
|
|
865
864
|
const stableCallbacks = useStableCallbacks(defaultOptions);
|
|
866
865
|
const registerCallbacks = (0, react.useCallback)((callbacks) => listenerMap.register(callbacks), [listenerMap]);
|
|
867
|
-
(0, react.useLayoutEffect)(() => {
|
|
868
|
-
return listenerMap.register({ onDisconnect: () => {
|
|
869
|
-
conversationRef.current = null;
|
|
870
|
-
setConversation(null);
|
|
871
|
-
} });
|
|
872
|
-
}, [listenerMap]);
|
|
873
866
|
const startSession = (0, react.useCallback)((options) => {
|
|
874
867
|
if (conversationRef.current) return;
|
|
875
868
|
if (lockRef.current) return;
|
|
@@ -885,9 +878,18 @@ var ElevenLabsReact = (function(exports, _elevenlabs_client_internal, _elevenlab
|
|
|
885
878
|
const clientTools = buildClientTools(sessionOptions.clientTools, clientToolsRegistry);
|
|
886
879
|
clientToolsRef.current = clientTools;
|
|
887
880
|
sessionOptions.clientTools = clientTools;
|
|
888
|
-
const userOnConversationCreated = sessionOptions.onConversationCreated;
|
|
889
881
|
const isStaleStartSession = () => startSessionId !== startSessionIdRef.current;
|
|
882
|
+
for (const key of _elevenlabs_client_internal.CALLBACK_KEYS) {
|
|
883
|
+
const callback = sessionOptions[key];
|
|
884
|
+
if (typeof callback === "function") sessionOptions[key] = (...args) => {
|
|
885
|
+
if (!isStaleStartSession()) callback(...args);
|
|
886
|
+
};
|
|
887
|
+
}
|
|
888
|
+
const userOnConversationCreated = sessionOptions.onConversationCreated;
|
|
889
|
+
const userOnDisconnect = sessionOptions.onDisconnect;
|
|
890
|
+
let thisSessionConv = null;
|
|
890
891
|
const handleConversationCreated = (conv) => {
|
|
892
|
+
thisSessionConv = conv;
|
|
891
893
|
if (shouldEndRef.current || isStaleStartSession()) return;
|
|
892
894
|
conversationRef.current = conv;
|
|
893
895
|
setConversation(conv);
|
|
@@ -898,9 +900,27 @@ var ElevenLabsReact = (function(exports, _elevenlabs_client_internal, _elevenlab
|
|
|
898
900
|
lockRef.current = null;
|
|
899
901
|
sessionOptions.onConnect?.(props);
|
|
900
902
|
};
|
|
903
|
+
const handleStatusChange = (props) => {
|
|
904
|
+
if (isStaleStartSession()) return;
|
|
905
|
+
if (props.status === "disconnecting" && thisSessionConv !== null && conversationRef.current === thisSessionConv) {
|
|
906
|
+
conversationRef.current = null;
|
|
907
|
+
setConversation(null);
|
|
908
|
+
}
|
|
909
|
+
sessionOptions.onStatusChange?.(props);
|
|
910
|
+
};
|
|
911
|
+
const handleDisconnect = (details) => {
|
|
912
|
+
if (isStaleStartSession()) return;
|
|
913
|
+
if (conversationRef.current === thisSessionConv) {
|
|
914
|
+
conversationRef.current = null;
|
|
915
|
+
setConversation(null);
|
|
916
|
+
}
|
|
917
|
+
userOnDisconnect?.(details);
|
|
918
|
+
};
|
|
901
919
|
const providerLifecycleOptions = {
|
|
902
920
|
onConversationCreated: handleConversationCreated,
|
|
903
|
-
onConnect: handleConnect
|
|
921
|
+
onConnect: handleConnect,
|
|
922
|
+
onDisconnect: handleDisconnect,
|
|
923
|
+
onStatusChange: handleStatusChange
|
|
904
924
|
};
|
|
905
925
|
const startSessionOptions = {
|
|
906
926
|
...sessionOptions,
|
|
@@ -910,11 +930,12 @@ var ElevenLabsReact = (function(exports, _elevenlabs_client_internal, _elevenlab
|
|
|
910
930
|
lockRef.current.then((conv) => {
|
|
911
931
|
if (isStaleStartSession()) return;
|
|
912
932
|
if (shouldEndRef.current) {
|
|
913
|
-
conv.endSession();
|
|
933
|
+
conv.endSession().catch((error) => console.warn("Error ending session:", error));
|
|
914
934
|
lockRef.current = null;
|
|
915
935
|
return;
|
|
916
936
|
}
|
|
917
937
|
if (conversationRef.current !== conv) {
|
|
938
|
+
thisSessionConv = conv;
|
|
918
939
|
conversationRef.current = conv;
|
|
919
940
|
setConversation(conv);
|
|
920
941
|
}
|
|
@@ -940,14 +961,14 @@ var ElevenLabsReact = (function(exports, _elevenlabs_client_internal, _elevenlab
|
|
|
940
961
|
const conv = conversationRef.current;
|
|
941
962
|
conversationRef.current = null;
|
|
942
963
|
setConversation(null);
|
|
943
|
-
if (pendingConnection) pendingConnection.then((c) => c.endSession(), () => {});
|
|
944
|
-
else conv?.endSession();
|
|
964
|
+
if (pendingConnection) pendingConnection.then((c) => c.endSession().catch((error) => console.warn("Error ending session:", error)), () => {});
|
|
965
|
+
else conv?.endSession().catch((error) => console.warn("Error ending session:", error));
|
|
945
966
|
}, []);
|
|
946
967
|
(0, react.useEffect)(() => {
|
|
947
968
|
return () => {
|
|
948
969
|
shouldEndRef.current = true;
|
|
949
|
-
if (lockRef.current) lockRef.current.then((conv) => conv.endSession(), () => {});
|
|
950
|
-
else conversationRef.current?.endSession();
|
|
970
|
+
if (lockRef.current) lockRef.current.then((conv) => conv.endSession().catch(() => {}), () => {});
|
|
971
|
+
else conversationRef.current?.endSession().catch(() => {});
|
|
951
972
|
};
|
|
952
973
|
}, []);
|
|
953
974
|
const contextValue = (0, react.useMemo)(() => ({
|
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.2.6/node_modules/react/cjs/react-jsx-runtime.production.js","../../../node_modules/.pnpm/react@19.2.6/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.12.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 /** Detected language code (only present when includeLanguageDetection is enabled) */\n languageCode?: string;\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 language_code?: string;\n words?: WordTimestamp[];\n }) => void;\n /** Called for any error (also called when specific error callbacks fire) */\n onError?: (error: Error | Event) => void;\n onAuthError?: (data: { error: string }) => void;\n onQuotaExceededError?: (data: { error: string }) => void;\n onCommitThrottledError?: (data: { error: string }) => void;\n onTranscriberError?: (data: { error: string }) => void;\n onUnacceptedTermsError?: (data: { error: string }) => void;\n onRateLimitedError?: (data: { error: string }) => void;\n onInputError?: (data: { error: string }) => void;\n onQueueOverflowError?: (data: { error: string }) => void;\n onResourceExhaustedError?: (data: { error: string }) => void;\n onSessionTimeLimitExceededError?: (data: { error: string }) => void;\n onChunkSizeExceededError?: (data: { error: string }) => void;\n onInsufficientAudioActivityError?: (data: { error: string }) => void;\n\n onConnect?: () => void;\n onDisconnect?: () => void;\n}\n\nexport interface ScribeHookOptions extends ScribeCallbacks {\n // Connection options\n token?: string;\n modelId?: string;\n baseUri?: string;\n\n // VAD options\n commitStrategy?: CommitStrategy;\n vadSilenceThresholdSecs?: number;\n vadThreshold?: number;\n minSpeechDurationMs?: number;\n minSilenceDurationMs?: number;\n languageCode?: string;\n\n // Microphone options (for automatic microphone mode)\n microphone?: MicrophoneOptions[\"microphone\"];\n\n // Manual audio options\n audioFormat?: AudioFormat;\n sampleRate?: number;\n\n // Auto-connect on mount\n autoConnect?: boolean;\n\n // Include timestamps\n includeTimestamps?: boolean;\n /** Include detected language information in transcription results */\n includeLanguageDetection?: boolean;\n\n // Keyterms and verbatim control\n keyterms?: string[];\n noVerbatim?: boolean;\n\n /**\n * Whether the session may be logged by ElevenLabs. Set to `false` to use zero\n * retention mode, which makes history features unavailable for the session.\n * Zero retention mode may only be used by enterprise customers.\n * @default true\n */\n enableLogging?: boolean;\n}\n\nexport interface UseScribeReturn {\n // State\n status: ScribeStatus;\n isConnected: boolean;\n isTranscribing: boolean;\n isMuted: boolean;\n partialTranscript: string;\n committedTranscripts: TranscriptSegment[];\n error: string | null;\n\n // Connection methods\n connect: (options?: Partial<ScribeHookOptions>) => Promise<void>;\n disconnect: () => void;\n\n // Mute / unmute\n mute: () => void;\n unmute: () => void;\n\n // Audio methods (for manual mode)\n sendAudio: (\n audioBase64: string,\n options?: { commit?: boolean; sampleRate?: number; previousText?: string }\n ) => void;\n commit: () => void;\n\n // Utility methods\n clearTranscripts: () => void;\n getConnection: () => RealtimeConnection | null;\n}\n\n// ============= Hook Implementation =============\n\nexport function useScribe(options: ScribeHookOptions = {}): UseScribeReturn {\n const {\n // Callbacks\n onSessionStarted,\n onPartialTranscript,\n onCommittedTranscript,\n onCommittedTranscriptWithTimestamps,\n onError,\n onAuthError,\n onQuotaExceededError,\n onCommitThrottledError,\n onTranscriberError,\n onUnacceptedTermsError,\n onRateLimitedError,\n onInputError,\n onQueueOverflowError,\n onResourceExhaustedError,\n onSessionTimeLimitExceededError,\n onChunkSizeExceededError,\n onInsufficientAudioActivityError,\n onConnect,\n onDisconnect,\n\n // Connection options\n token: defaultToken,\n modelId: defaultModelId,\n baseUri: defaultBaseUri,\n commitStrategy: defaultCommitStrategy,\n vadSilenceThresholdSecs: defaultVadSilenceThresholdSecs,\n vadThreshold: defaultVadThreshold,\n minSpeechDurationMs: defaultMinSpeechDurationMs,\n minSilenceDurationMs: defaultMinSilenceDurationMs,\n languageCode: defaultLanguageCode,\n\n // Mode options\n microphone: defaultMicrophone,\n audioFormat: defaultAudioFormat,\n sampleRate: defaultSampleRate,\n\n // Auto-connect\n autoConnect = false,\n\n // Timestamps\n includeTimestamps: defaultIncludeTimestamps,\n includeLanguageDetection: defaultIncludeLanguageDetection,\n\n // Keyterms and verbatim control\n keyterms: defaultKeyterms,\n noVerbatim: defaultNoVerbatim,\n\n // Logging\n enableLogging: defaultEnableLogging,\n } = options;\n\n const connectionRef = useRef<RealtimeConnection | null>(null);\n\n const [status, setStatus] = useState<ScribeStatus>(\"disconnected\");\n const [isMuted, setIsMuted] = useState<boolean>(false);\n const [partialTranscript, setPartialTranscript] = useState<string>(\"\");\n const [committedTranscripts, setCommittedTranscripts] = useState<\n TranscriptSegment[]\n >([]);\n const [error, setError] = useState<string | null>(null);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n connectionRef.current?.close();\n };\n }, []);\n\n const connect = useCallback(\n async (runtimeOptions: Partial<ScribeHookOptions> = {}) => {\n if (connectionRef.current) {\n console.warn(\"Already connected\");\n return;\n }\n\n try {\n setStatus(\"connecting\");\n setError(null);\n\n // Merge default options with runtime options\n const token = runtimeOptions.token || defaultToken;\n const modelId = runtimeOptions.modelId || defaultModelId;\n\n if (!token) {\n throw new Error(\"Token is required\");\n }\n if (!modelId) {\n throw new Error(\"Model ID is required\");\n }\n\n // Determine mode: microphone or manual\n const microphone = runtimeOptions.microphone || defaultMicrophone;\n const audioFormat = runtimeOptions.audioFormat || defaultAudioFormat;\n const sampleRate = runtimeOptions.sampleRate || defaultSampleRate;\n\n let connection: RealtimeConnection;\n\n // Include timestamps if explicitly requested OR if the callback is provided\n const includeTimestamps =\n runtimeOptions.includeTimestamps ??\n defaultIncludeTimestamps ??\n !!(\n runtimeOptions.onCommittedTranscriptWithTimestamps ||\n onCommittedTranscriptWithTimestamps\n );\n const includeLanguageDetection =\n runtimeOptions.includeLanguageDetection ??\n defaultIncludeLanguageDetection;\n const enableLogging =\n runtimeOptions.enableLogging ?? defaultEnableLogging;\n\n if (microphone) {\n // Microphone mode\n connection = Scribe.connect({\n token,\n modelId,\n baseUri: runtimeOptions.baseUri || defaultBaseUri,\n commitStrategy:\n runtimeOptions.commitStrategy || defaultCommitStrategy,\n vadSilenceThresholdSecs:\n runtimeOptions.vadSilenceThresholdSecs ||\n defaultVadSilenceThresholdSecs,\n vadThreshold: runtimeOptions.vadThreshold || defaultVadThreshold,\n minSpeechDurationMs:\n runtimeOptions.minSpeechDurationMs || defaultMinSpeechDurationMs,\n minSilenceDurationMs:\n runtimeOptions.minSilenceDurationMs ||\n defaultMinSilenceDurationMs,\n languageCode: runtimeOptions.languageCode || defaultLanguageCode,\n keyterms: runtimeOptions.keyterms || defaultKeyterms,\n noVerbatim: runtimeOptions.noVerbatim ?? defaultNoVerbatim,\n microphone,\n includeTimestamps,\n includeLanguageDetection,\n enableLogging,\n } as MicrophoneOptions);\n } else if (audioFormat && sampleRate) {\n // Manual audio mode\n connection = Scribe.connect({\n token,\n modelId,\n baseUri: runtimeOptions.baseUri || defaultBaseUri,\n commitStrategy:\n runtimeOptions.commitStrategy || defaultCommitStrategy,\n vadSilenceThresholdSecs:\n runtimeOptions.vadSilenceThresholdSecs ||\n defaultVadSilenceThresholdSecs,\n vadThreshold: runtimeOptions.vadThreshold || defaultVadThreshold,\n minSpeechDurationMs:\n runtimeOptions.minSpeechDurationMs || defaultMinSpeechDurationMs,\n minSilenceDurationMs:\n runtimeOptions.minSilenceDurationMs ||\n defaultMinSilenceDurationMs,\n languageCode: runtimeOptions.languageCode || defaultLanguageCode,\n keyterms: runtimeOptions.keyterms || defaultKeyterms,\n noVerbatim: runtimeOptions.noVerbatim ?? defaultNoVerbatim,\n includeTimestamps,\n includeLanguageDetection,\n enableLogging,\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 languageCode: message.language_code,\n words: message.words,\n };\n setCommittedTranscripts(prev => [...prev, segment]);\n setPartialTranscript(\"\");\n onCommittedTranscriptWithTimestamps?.(message);\n }\n );\n\n connection.on(RealtimeEvents.ERROR, (err: unknown) => {\n const message = err as ScribeErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onError?.(new Error(message.error));\n });\n\n connection.on(RealtimeEvents.AUTH_ERROR, (data: unknown) => {\n const message = data as ScribeAuthErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onAuthError?.(message);\n });\n\n connection.on(RealtimeEvents.QUOTA_EXCEEDED, (data: unknown) => {\n const message = data as ScribeQuotaExceededErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onQuotaExceededError?.(message);\n });\n\n connection.on(RealtimeEvents.COMMIT_THROTTLED, (data: unknown) => {\n const message = data as ScribeCommitThrottledErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onCommitThrottledError?.(message);\n });\n\n connection.on(RealtimeEvents.TRANSCRIBER_ERROR, (data: unknown) => {\n const message = data as ScribeTranscriberErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onTranscriberError?.(message);\n });\n\n connection.on(RealtimeEvents.UNACCEPTED_TERMS, (data: unknown) => {\n const message = data as ScribeUnacceptedTermsErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onUnacceptedTermsError?.(message);\n });\n\n connection.on(RealtimeEvents.RATE_LIMITED, (data: unknown) => {\n const message = data as ScribeRateLimitedErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onRateLimitedError?.(message);\n });\n\n connection.on(RealtimeEvents.INPUT_ERROR, (data: unknown) => {\n const message = data as ScribeInputErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onInputError?.(message);\n });\n\n connection.on(RealtimeEvents.QUEUE_OVERFLOW, (data: unknown) => {\n const message = data as ScribeQueueOverflowErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onQueueOverflowError?.(message);\n });\n\n connection.on(RealtimeEvents.RESOURCE_EXHAUSTED, (data: unknown) => {\n const message = data as ScribeResourceExhaustedErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onResourceExhaustedError?.(message);\n });\n\n connection.on(\n RealtimeEvents.SESSION_TIME_LIMIT_EXCEEDED,\n (data: unknown) => {\n const message = data as ScribeSessionTimeLimitExceededErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onSessionTimeLimitExceededError?.(message);\n }\n );\n\n connection.on(RealtimeEvents.CHUNK_SIZE_EXCEEDED, (data: unknown) => {\n const message = data as ScribeChunkSizeExceededErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onChunkSizeExceededError?.(message);\n });\n\n connection.on(\n RealtimeEvents.INSUFFICIENT_AUDIO_ACTIVITY,\n (data: unknown) => {\n const message = data as ScribeInsufficientAudioActivityErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onInsufficientAudioActivityError?.(message);\n }\n );\n\n connection.on(RealtimeEvents.OPEN, () => {\n onConnect?.();\n });\n\n connection.on(RealtimeEvents.CLOSE, () => {\n setStatus(\"disconnected\");\n setIsMuted(false);\n connectionRef.current = null;\n onDisconnect?.();\n });\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"Failed to connect\";\n setError(errorMessage);\n setStatus(\"error\");\n throw err;\n }\n },\n [\n defaultToken,\n defaultModelId,\n defaultBaseUri,\n defaultCommitStrategy,\n defaultVadSilenceThresholdSecs,\n defaultVadThreshold,\n defaultMinSpeechDurationMs,\n defaultMinSilenceDurationMs,\n defaultLanguageCode,\n defaultMicrophone,\n defaultAudioFormat,\n defaultSampleRate,\n defaultIncludeTimestamps,\n defaultIncludeLanguageDetection,\n defaultKeyterms,\n defaultNoVerbatim,\n defaultEnableLogging,\n onSessionStarted,\n onPartialTranscript,\n onCommittedTranscript,\n onCommittedTranscriptWithTimestamps,\n onError,\n onAuthError,\n onQuotaExceededError,\n onCommitThrottledError,\n onTranscriberError,\n onUnacceptedTermsError,\n onRateLimitedError,\n onInputError,\n onQueueOverflowError,\n onResourceExhaustedError,\n onSessionTimeLimitExceededError,\n onChunkSizeExceededError,\n onInsufficientAudioActivityError,\n onConnect,\n onDisconnect,\n ]\n );\n\n const disconnect = useCallback(() => {\n connectionRef.current?.close();\n connectionRef.current = null;\n setStatus(\"disconnected\");\n setIsMuted(false);\n }, []);\n\n const mute = useCallback(() => {\n if (!connectionRef.current) {\n throw new Error(\"Not connected to Scribe\");\n }\n connectionRef.current.mute();\n setIsMuted(true);\n }, []);\n\n const unmute = useCallback(() => {\n if (!connectionRef.current) {\n throw new Error(\"Not connected to Scribe\");\n }\n connectionRef.current.unmute();\n setIsMuted(false);\n }, []);\n\n const sendAudio = useCallback(\n (\n audioBase64: string,\n options?: { commit?: boolean; sampleRate?: number; previousText?: string }\n ) => {\n if (!connectionRef.current) {\n throw new Error(\"Not connected to Scribe\");\n }\n connectionRef.current.send({ audioBase64, ...options });\n },\n []\n );\n\n const commit = useCallback(() => {\n if (!connectionRef.current) {\n throw new Error(\"Not connected to Scribe\");\n }\n connectionRef.current.commit();\n }, []);\n\n const clearTranscripts = useCallback(() => {\n setCommittedTranscripts([]);\n setPartialTranscript(\"\");\n }, []);\n\n const getConnection = useCallback(() => {\n return connectionRef.current;\n }, []);\n\n // Auto-connect if enabled\n useEffect(() => {\n if (autoConnect) {\n // eslint-disable-next-line react-hooks/set-state-in-effect -- autoConnect intentionally starts the connection when the hook mounts\n connect();\n }\n }, [autoConnect, connect]);\n\n return {\n // State\n status,\n isConnected: status === \"connected\" || status === \"transcribing\",\n isTranscribing: status === \"transcribing\",\n isMuted,\n partialTranscript,\n committedTranscripts,\n error,\n\n // Methods\n connect,\n disconnect,\n mute,\n unmute,\n sendAudio,\n commit,\n clearTranscripts,\n getConnection,\n };\n}\n\n// Export types and enums from client for convenience\nexport {\n AudioFormat,\n CommitStrategy,\n RealtimeEvents,\n} from \"@elevenlabs/client\";\nexport type { RealtimeConnection } from \"@elevenlabs/client\";\n","import {\n createContext,\n useContext,\n useLayoutEffect,\n useRef,\n type MutableRefObject,\n type RefObject,\n} from \"react\";\nimport type {\n Callbacks,\n ClientToolsConfig,\n Conversation,\n} from \"@elevenlabs/client\";\nimport type { HookOptions } from \"./types.js\";\n\ntype ClientToolEntry = ClientToolsConfig[\"clientTools\"][string];\n\nexport type ConversationContextValue = {\n conversation: Conversation | null;\n /** Stable ref to the active conversation — use in callbacks to avoid re-renders. */\n conversationRef: RefObject<Conversation | null>;\n startSession: (options?: HookOptions) => void;\n endSession: () => void;\n /**\n * For sub-providers — register callback handlers to be composed into the\n * next `Conversation.startSession()` call. Returns an unsubscribe function.\n */\n registerCallbacks: (callbacks: Partial<Callbacks>) => () => void;\n /** Registry of hook-registered client tools. Survives across sessions. */\n clientToolsRegistry: Map<string, ClientToolEntry>;\n /** Ref to the live clientTools object currently held by BaseConversation. */\n clientToolsRef: MutableRefObject<Record<string, ClientToolEntry>>;\n};\n\nexport const ConversationContext =\n createContext<ConversationContextValue | null>(null);\n\n/**\n * Returns the raw `Conversation` instance (or `null` if no session is active).\n * This is a public escape hatch for advanced use cases that need direct access\n * to the underlying `@elevenlabs/client` Conversation object.\n *\n * Can be used outside a `ConversationProvider` — returns `null` in that case.\n */\nexport function useRawConversation(): Conversation | null {\n const ctx = useContext(ConversationContext);\n return ctx?.conversation ?? null;\n}\n\n/**\n * Returns a stable ref to the active `Conversation` instance.\n * The ref's `.current` is `null` when no session is active, and updates\n * without causing re-renders — ideal for use inside callbacks and sub-providers.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useRawConversationRef(): RefObject<Conversation | null> {\n const ctx = useContext(ConversationContext);\n if (!ctx) {\n throw new Error(\n \"useRawConversationRef must be used within a ConversationProvider\"\n );\n }\n return ctx.conversationRef;\n}\n\n/**\n * Registers callback handlers with the nearest `ConversationProvider`.\n * Uses a ref internally so the latest callback values are always invoked\n * without re-subscribing on every render.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useRegisterCallbacks(callbacks: Partial<Callbacks>): void {\n const ctx = useContext(ConversationContext);\n if (!ctx) {\n throw new Error(\n \"useRegisterCallbacks must be used within a ConversationProvider\"\n );\n }\n\n const { registerCallbacks } = ctx;\n const callbacksRef = useRef(callbacks);\n\n // Re-subscribe when the set of provided callback keys changes.\n const activeKeyToken = Object.keys(callbacks)\n .filter(key => callbacks[key as keyof Callbacks] !== undefined)\n .sort()\n .join(\"|\");\n\n useLayoutEffect(() => {\n callbacksRef.current = callbacks;\n });\n\n useLayoutEffect(() => {\n const activeKeys = activeKeyToken === \"\" ? [] : activeKeyToken.split(\"|\");\n const stableCallbacks = Object.fromEntries(\n activeKeys.map((key: string) => [\n key,\n (...args: never[]) => {\n const fn = callbacksRef.current[key as keyof Callbacks];\n if (typeof fn === \"function\") {\n (fn as (...a: never[]) => void)(...args);\n }\n },\n ])\n ) as Partial<Callbacks>;\n return registerCallbacks(stableCallbacks);\n }, [registerCallbacks, activeKeyToken]);\n}\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import { createContext, useCallback, useContext, useMemo } from \"react\";\nimport {\n VoiceConversation,\n type FormatConfig,\n type InputDeviceConfig,\n type OutputConfig,\n type MultimodalMessageInput,\n type UploadFileResult,\n type ContextualUpdateOptions,\n} from \"@elevenlabs/client\";\nimport type { HookOptions } from \"./types.js\";\nimport { ConversationContext } from \"./ConversationContext.js\";\n\nconst EMPTY_FREQUENCY_DATA = new Uint8Array(0);\n\nexport type ConversationControlsValue = {\n startSession: (options?: HookOptions) => void;\n endSession: () => void;\n sendUserMessage: (text: string) => void;\n sendMultimodalMessage: (options: MultimodalMessageInput) => void;\n uploadFile: (file: Blob) => Promise<UploadFileResult>;\n sendContextualUpdate: (\n text: string,\n options?: ContextualUpdateOptions\n ) => void;\n sendUserActivity: () => void;\n sendMCPToolApprovalResult: (toolCallId: string, isApproved: boolean) => void;\n setVolume: (options: { volume: number }) => void;\n changeInputDevice: (\n config: Partial<FormatConfig> & InputDeviceConfig\n ) => Promise<void>;\n changeOutputDevice: (\n config: Partial<FormatConfig> & OutputConfig\n ) => Promise<void>;\n /** Returns byte frequency data (0-255) for the input, focused on 100-8000 Hz. */\n getInputByteFrequencyData: () => Uint8Array;\n /** Returns byte frequency data (0-255) for the output, focused on 100-8000 Hz. */\n getOutputByteFrequencyData: () => Uint8Array;\n getInputVolume: () => number;\n getOutputVolume: () => number;\n getId: () => string;\n};\n\nexport const ConversationControlsContext =\n createContext<ConversationControlsValue | null>(null);\n\n/**\n * Reads from `ConversationContext` and provides stable action references to\n * `ConversationControlsContext`. Must be rendered inside a `ConversationProvider`.\n */\nexport function ConversationControlsProvider({\n children,\n}: React.PropsWithChildren) {\n const ctx = useContext(ConversationContext);\n if (!ctx) {\n throw new Error(\n \"ConversationControlsProvider must be rendered inside a ConversationProvider\"\n );\n }\n\n const { conversationRef } = ctx;\n\n const getConversation = useCallback(() => {\n const conversation = conversationRef.current;\n if (!conversation) {\n throw new Error(\"No active conversation. Call startSession() first.\");\n }\n return conversation;\n }, [conversationRef]);\n\n const sendUserMessage = useCallback(\n (text: string) => {\n getConversation().sendUserMessage(text);\n },\n [getConversation]\n );\n\n const sendMultimodalMessage = useCallback(\n (options: MultimodalMessageInput) => {\n getConversation().sendMultimodalMessage(options);\n },\n [getConversation]\n );\n\n const uploadFile = useCallback(\n (file: Blob) => {\n return getConversation().uploadFile(file);\n },\n [getConversation]\n );\n\n const sendContextualUpdate = useCallback(\n (text: string, options?: ContextualUpdateOptions) => {\n getConversation().sendContextualUpdate(text, options);\n },\n [getConversation]\n );\n\n const sendUserActivity = useCallback(() => {\n getConversation().sendUserActivity();\n }, [getConversation]);\n\n const sendMCPToolApprovalResult = useCallback(\n (toolCallId: string, isApproved: boolean) => {\n getConversation().sendMCPToolApprovalResult(toolCallId, isApproved);\n },\n [getConversation]\n );\n\n const setVolume = useCallback(\n (options: { volume: number }) => {\n getConversation().setVolume(options);\n },\n [getConversation]\n );\n\n const changeInputDevice = useCallback(\n async (config: Partial<FormatConfig> & InputDeviceConfig) => {\n const conversation = getConversation();\n if (conversation instanceof VoiceConversation) {\n return await conversation.changeInputDevice(config);\n }\n throw new Error(\n \"Device switching is only available for voice conversations\"\n );\n },\n [getConversation]\n );\n\n const changeOutputDevice = useCallback(\n async (config: Partial<FormatConfig> & OutputConfig) => {\n const conversation = getConversation();\n if (conversation instanceof VoiceConversation) {\n return await conversation.changeOutputDevice(config);\n }\n throw new Error(\n \"Device switching is only available for voice conversations\"\n );\n },\n [getConversation]\n );\n\n const getInputByteFrequencyData = useCallback(() => {\n return (\n conversationRef.current?.getInputByteFrequencyData() ??\n EMPTY_FREQUENCY_DATA\n );\n }, [conversationRef]);\n\n const getOutputByteFrequencyData = useCallback(() => {\n return (\n conversationRef.current?.getOutputByteFrequencyData() ??\n EMPTY_FREQUENCY_DATA\n );\n }, [conversationRef]);\n\n const getInputVolume = useCallback(() => {\n return conversationRef.current?.getInputVolume() ?? 0;\n }, [conversationRef]);\n\n const getOutputVolume = useCallback(() => {\n return conversationRef.current?.getOutputVolume() ?? 0;\n }, [conversationRef]);\n\n const getId = useCallback(() => {\n return getConversation().getId();\n }, [getConversation]);\n\n const value = useMemo<ConversationControlsValue>(\n () => ({\n startSession: ctx.startSession,\n endSession: ctx.endSession,\n sendUserMessage,\n sendMultimodalMessage,\n uploadFile,\n sendContextualUpdate,\n sendUserActivity,\n sendMCPToolApprovalResult,\n setVolume,\n changeInputDevice,\n changeOutputDevice,\n getInputByteFrequencyData,\n getOutputByteFrequencyData,\n getInputVolume,\n getOutputVolume,\n getId,\n }),\n [\n ctx.startSession,\n ctx.endSession,\n sendUserMessage,\n sendMultimodalMessage,\n uploadFile,\n sendContextualUpdate,\n sendUserActivity,\n sendMCPToolApprovalResult,\n setVolume,\n changeInputDevice,\n changeOutputDevice,\n getInputByteFrequencyData,\n getOutputByteFrequencyData,\n getInputVolume,\n getOutputVolume,\n getId,\n ]\n );\n\n return (\n <ConversationControlsContext.Provider value={value}>\n {children}\n </ConversationControlsContext.Provider>\n );\n}\n\n/**\n * Returns stable action references for controlling the conversation.\n * All function references are stable and will never cause re-renders.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useConversationControls(): ConversationControlsValue {\n const ctx = useContext(ConversationControlsContext);\n if (!ctx) {\n throw new Error(\n \"useConversationControls must be used within a ConversationProvider\"\n );\n }\n return ctx;\n}\n","import { createContext, useContext, useMemo, useState } from \"react\";\nimport { useRegisterCallbacks } from \"./ConversationContext.js\";\n\nexport type ConversationStatus =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"error\";\n\nexport type ConversationStatusValue = {\n status: ConversationStatus;\n message?: string;\n};\n\nconst ConversationStatusContext = createContext<ConversationStatusValue | null>(\n null\n);\n\n/**\n * Reads from `ConversationContext` and registers `onStatusChange` + `onError`\n * callbacks. Manages its own `status`/`message` state and provides it through\n * `ConversationStatusContext`. Must be rendered inside a `ConversationProvider`.\n */\nexport function ConversationStatusProvider({\n children,\n}: React.PropsWithChildren) {\n const [status, setStatus] =\n useState<ConversationStatusValue[\"status\"]>(\"disconnected\");\n const [message, setMessage] = useState<string | undefined>(undefined);\n\n useRegisterCallbacks({\n onStatusChange({ status: newStatus }) {\n if (newStatus === \"disconnecting\") {\n // Transient state — keep current status\n return;\n }\n setStatus(newStatus);\n // Clear error message when transitioning to a non-error state\n setMessage(undefined);\n },\n onError(errorMessage) {\n setStatus(\"error\");\n setMessage(errorMessage);\n },\n });\n\n const value = useMemo<ConversationStatusValue>(\n () => ({ status, message }),\n [status, message]\n );\n\n return (\n <ConversationStatusContext.Provider value={value}>\n {children}\n </ConversationStatusContext.Provider>\n );\n}\n\n/**\n * Returns the current conversation status and any error message.\n * Re-renders when the connection status or error message changes.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useConversationStatus(): ConversationStatusValue {\n const ctx = useContext(ConversationStatusContext);\n if (!ctx) {\n throw new Error(\n \"useConversationStatus must be used within a ConversationProvider\"\n );\n }\n return ctx;\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n useRawConversation,\n useRawConversationRef,\n useRegisterCallbacks,\n} from \"./ConversationContext.js\";\n\nexport type ConversationInputValue = {\n isMuted: boolean;\n setMuted: (isMuted: boolean) => void;\n};\n\nexport type ConversationInputProviderProps = React.PropsWithChildren<{\n /** Controlled mute state. If omitted, provider manages state internally. */\n isMuted?: boolean;\n /** Called whenever mute state is changed via setMuted. */\n onMutedChange?: (isMuted: boolean) => void;\n}>;\n\nconst ConversationInputContext = createContext<ConversationInputValue | null>(\n null\n);\n\n/**\n * Reads from `ConversationContext` and manages microphone mute state.\n * `setMuted` calls `conversation.setMicMuted()` and updates local state.\n * Must be rendered inside a `ConversationProvider`.\n */\nexport function ConversationInputProvider({\n children,\n isMuted: controlledIsMuted,\n onMutedChange,\n}: ConversationInputProviderProps) {\n const conversation = useRawConversation();\n const conversationRef = useRawConversationRef();\n const isControlled = typeof controlledIsMuted === \"boolean\";\n const [uncontrolledIsMuted, setUncontrolledIsMuted] = useState(false);\n const isMuted = isControlled ? controlledIsMuted : uncontrolledIsMuted;\n\n useRegisterCallbacks({\n onDisconnect() {\n if (!isControlled) {\n setUncontrolledIsMuted(false);\n }\n },\n });\n\n useEffect(() => {\n if (isControlled && conversation) {\n conversation.setMicMuted(controlledIsMuted);\n }\n }, [conversation, controlledIsMuted, isControlled]);\n\n const setMuted = useCallback(\n (muted: boolean) => {\n const conversation = conversationRef.current;\n if (!conversation) {\n throw new Error(\"No active conversation. Call startSession() first.\");\n }\n if (!isControlled) {\n conversation.setMicMuted(muted);\n setUncontrolledIsMuted(muted);\n }\n onMutedChange?.(muted);\n },\n [conversationRef, isControlled, onMutedChange]\n );\n\n const value = useMemo<ConversationInputValue>(\n () => ({ isMuted, setMuted }),\n [isMuted, setMuted]\n );\n\n return (\n <ConversationInputContext.Provider value={value}>\n {children}\n </ConversationInputContext.Provider>\n );\n}\n\n/**\n * Returns the current microphone mute state and a function to change it.\n * Re-renders only when the mute state changes.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useConversationInput(): ConversationInputValue {\n const ctx = useContext(ConversationInputContext);\n if (!ctx) {\n throw new Error(\n \"useConversationInput must be used within a ConversationProvider\"\n );\n }\n return ctx;\n}\n","import { createContext, useContext, useMemo, useState } from \"react\";\nimport type { Mode } from \"@elevenlabs/client\";\nimport { useRegisterCallbacks } from \"./ConversationContext.js\";\n\nexport type ConversationModeValue = {\n mode: \"speaking\" | \"listening\";\n isSpeaking: boolean;\n isListening: boolean;\n};\n\nconst ConversationModeContext = createContext<ConversationModeValue | null>(\n null\n);\n\n/**\n * Reads from `ConversationContext` and registers an `onModeChange` callback.\n * Manages its own `mode` state and provides it through\n * `ConversationModeContext`. Must be rendered inside a `ConversationProvider`.\n */\nexport function ConversationModeProvider({\n children,\n}: React.PropsWithChildren) {\n const [mode, setMode] = useState<Mode>(\"listening\");\n\n useRegisterCallbacks({\n onModeChange({ mode: newMode }) {\n setMode(newMode);\n },\n onDisconnect() {\n setMode(\"listening\");\n },\n });\n\n const value = useMemo<ConversationModeValue>(\n () => ({\n mode,\n isSpeaking: mode === \"speaking\",\n isListening: mode === \"listening\",\n }),\n [mode]\n );\n\n return (\n <ConversationModeContext.Provider value={value}>\n {children}\n </ConversationModeContext.Provider>\n );\n}\n\n/**\n * Returns the current conversation mode (speaking/listening) and\n * convenience booleans. Re-renders only when the mode changes.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useConversationMode(): ConversationModeValue {\n const ctx = useContext(ConversationModeContext);\n if (!ctx) {\n throw new Error(\n \"useConversationMode must be used within a ConversationProvider\"\n );\n }\n return ctx;\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from \"react\";\nimport {\n useRawConversationRef,\n useRegisterCallbacks,\n} from \"./ConversationContext.js\";\n\nexport type ConversationFeedbackValue = {\n canSendFeedback: boolean;\n sendFeedback: (like: boolean | null, eventId?: number) => 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(\n (like: boolean | null, eventId?: number) => {\n conversationRef.current?.sendFeedback(like, eventId);\n },\n [conversationRef]\n );\n\n const value = useMemo<ConversationFeedbackValue>(\n () => ({\n canSendFeedback,\n sendFeedback,\n }),\n [canSendFeedback, sendFeedback]\n );\n\n return (\n <ConversationFeedbackContext.Provider value={value}>\n {children}\n </ConversationFeedbackContext.Provider>\n );\n}\n\n/**\n * Returns the current feedback state and a `sendFeedback` action.\n * Re-renders only when `canSendFeedback` changes.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useConversationFeedback(): ConversationFeedbackValue {\n const ctx = useContext(ConversationFeedbackContext);\n if (!ctx) {\n throw new Error(\n \"useConversationFeedback must be used within a ConversationProvider\"\n );\n }\n return ctx;\n}\n","import { createContext, useCallback, useContext, useLayoutEffect, useRef } from \"react\";\nimport type { ClientToolsConfig } from \"@elevenlabs/client\";\nimport { ConversationContext } from \"./ConversationContext.js\";\nimport type { ClientTool, ClientTools } from \"./types.js\";\n\ntype ClientToolEntry = ClientToolsConfig[\"clientTools\"][string];\n\n/**\n * Creates a fresh clientTools object by merging option-provided tools with\n * hook-registered tools from the registry. Throws if a hook-registered tool\n * name conflicts with an option-provided tool.\n */\nexport function buildClientTools(\n optionTools: Record<string, ClientToolEntry> | undefined,\n registry: Map<string, ClientToolEntry>\n): Record<string, ClientToolEntry> {\n const clientTools: Record<string, ClientToolEntry> = { ...optionTools };\n for (const [name, handler] of registry) {\n if (Object.hasOwn(clientTools, name)) {\n throw new Error(\n `Client tool \"${name}\" is already provided via props/options. ` +\n `Remove it from props or do not register it with useConversationClientTool.`\n );\n }\n clientTools[name] = handler;\n }\n return clientTools;\n}\n\n// ---------------------------------------------------------------------------\n// Sub-provider\n// ---------------------------------------------------------------------------\n\ntype RegisterClientTool = (\n name: string,\n handler: ClientToolEntry\n) => () => void;\n\nconst ConversationClientToolsContext = createContext<RegisterClientTool | null>(\n null\n);\n\nexport function ConversationClientToolsProvider({\n children,\n}: React.PropsWithChildren) {\n const ctx = useContext(ConversationContext);\n if (!ctx) {\n throw new Error(\n \"ConversationClientToolsProvider must be rendered inside a ConversationProvider\"\n );\n }\n\n const { clientToolsRegistry, clientToolsRef } = ctx;\n\n const registerClientTool: RegisterClientTool = useCallback(\n (name, handler) => {\n if (clientToolsRegistry.has(name)) {\n throw new Error(\n `Client tool \"${name}\" is already registered by another hook. ` +\n `Each tool name must be unique.`\n );\n }\n clientToolsRegistry.set(name, handler);\n clientToolsRef.current[name] = handler;\n return () => {\n if (clientToolsRegistry.get(name) === handler) {\n clientToolsRegistry.delete(name);\n }\n if (clientToolsRef.current[name] === handler) {\n delete clientToolsRef.current[name];\n }\n };\n },\n [clientToolsRegistry, clientToolsRef]\n );\n\n return (\n <ConversationClientToolsContext.Provider value={registerClientTool}>\n {children}\n </ConversationClientToolsContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Registers a named client tool with the nearest `ConversationProvider`.\n * The tool is available during any active conversation and is automatically\n * unregistered when the component unmounts.\n *\n * The handler always reflects the latest closure value (ref pattern),\n * so it is safe to reference component state or props without listing\n * them as dependencies.\n *\n * @typeParam TTools - An interface mapping tool names to function signatures.\n * @typeParam TName - The specific tool name (inferred from the first argument).\n * @param name - The tool name (must match the name configured on the agent).\n * @param handler - The function invoked when the agent calls this tool.\n *\n * @example\n * ```tsx\n * type Tools = {\n * get_weather: (params: { city: string }) => string;\n * set_volume: (params: { level: number }) => void;\n * };\n *\n * useConversationClientTool<Tools>(\"get_weather\", (params) => {\n * return `Weather in ${params.city} is sunny.`;\n * });\n * ```\n */\nexport function useConversationClientTool<\n TTools extends ClientTools = Record<string, ClientTool>,\n TName extends string & keyof TTools = string & keyof TTools,\n>(name: TName, handler: TTools[TName]): void {\n const registerClientTool = useContext(ConversationClientToolsContext);\n if (!registerClientTool) {\n throw new Error(\n \"useConversationClientTool must be used within a ConversationProvider\"\n );\n }\n\n const handlerRef = useRef(handler);\n // eslint-disable-next-line react-hooks/refs -- intentional sync during render for latest-ref pattern\n handlerRef.current = handler;\n\n useLayoutEffect(() => {\n const stableHandler: ClientToolEntry = parameters =>\n handlerRef.current(parameters as Parameters<TTools[TName]>[0]);\n return registerClientTool(name, stableHandler);\n }, [registerClientTool, name]);\n}\n","export class ListenerSet<Args extends unknown[]> {\n private listeners = new Set<(...args: Args) => void>();\n\n add(fn: (...args: Args) => void): () => void {\n this.listeners.add(fn);\n return () => {\n this.listeners.delete(fn);\n };\n }\n\n invoke(...args: Args): void {\n for (const fn of this.listeners) fn(...args);\n }\n\n get size(): number {\n return this.listeners.size;\n }\n}\n","import { ListenerSet } from \"./ListenerSet.js\";\n\nfunction assertFunction(\n value: unknown,\n key: string\n): asserts value is (...args: unknown[]) => void {\n if (typeof value !== \"function\") {\n throw new Error(`Expected function for key \"${key}\", got ${typeof value}`);\n }\n}\n\n/**\n * A map of named listener sets. Each key maps to a `ListenerSet` that can have\n * multiple listeners registered. Typed through `T` so that `register` and\n * `compose` preserve per-key callback signatures.\n *\n * All keys are pre-initialized in the constructor so `register` can validate\n * keys. `compose()` only includes keys with at least one registered listener,\n * preserving callback-presence semantics used by the client as feature guards.\n * For included keys, composed functions delegate to the live listener set, so\n * listeners added/removed after `compose()` still take effect. Keys with no\n * listeners at compose time are omitted entirely; call `compose()` again after\n * registering listeners to pick up newly populated keys.\n */\nexport class ListenerMap<\n T extends Record<string, ((...args: never[]) => void) | undefined>,\n> {\n private sets = new Map<string, ListenerSet<unknown[]>>();\n\n constructor(keys: readonly (keyof T & string)[]) {\n for (const key of keys) {\n this.sets.set(key, new ListenerSet<unknown[]>());\n }\n }\n\n /**\n * Register listeners for one or more keys. Returns a function that removes\n * all listeners added by this call.\n */\n register(callbacks: Partial<T>): () => void {\n const removers = Object.entries(callbacks)\n .filter(([, fn]) => fn !== undefined)\n .map(([key, fn]) => {\n assertFunction(fn, key);\n const set = this.sets.get(key);\n if (!set) {\n throw new Error(`Unknown callback key \"${key}\"`);\n }\n return set.add(fn);\n });\n return () => {\n for (const remove of removers) remove();\n };\n }\n\n /**\n * Compose all registered listeners into a single callbacks object. Each\n * composed function delegates to the live listener set, so listeners\n * added/removed after this call still take effect.\n */\n compose(): Partial<T> {\n return Object.fromEntries(\n Array.from(this.sets.entries())\n .filter(([, set]) => set.size > 0)\n .map(([key, set]) => [\n key,\n (...args: never[]) => {\n set.invoke(...args);\n },\n ])\n ) as Partial<T>;\n }\n}\n","import { useMemo, useRef } from \"react\";\nimport type { Callbacks } from \"@elevenlabs/client\";\nimport { CALLBACK_KEYS } from \"@elevenlabs/client/internal\";\nimport type { HookOptions } from \"./types.js\";\n\n/**\n * Wraps user-provided callback props in stable ref-backed functions,\n * preventing stale closure bugs when the session outlives renders.\n *\n * Returns a `Partial<Callbacks>` containing only the keys the caller\n * actually provided. Function references are stable per key across\n * renders, but always invoke the latest prop value. The returned object\n * reference is stable as long as the set of provided keys doesn't change.\n */\nexport function useStableCallbacks(props: HookOptions): Partial<Callbacks> {\n // Store the latest prop value for each callback in a ref.\n // Uses Record<string, unknown> to avoid TypeScript's union-to-intersection\n // issue when indexing Callbacks with a union of all its keys.\n const callbackRefs = useRef<Record<string, unknown>>({});\n\n // Compute a stable scalar from the set of provided keys so we can\n // memoize the result object.\n const activeKeys = CALLBACK_KEYS.filter(key => props[key] !== undefined);\n const activeKeySet = activeKeys.join(\"|\");\n const stableCallbacks = useMemo(\n () =>\n Object.fromEntries(\n activeKeys.map(key => [\n key,\n (...args: unknown[]) => {\n const fn = callbackRefs.current[key] as\n | ((...a: unknown[]) => void)\n | undefined;\n fn?.(...args);\n },\n ])\n ) as Partial<Callbacks>,\n // eslint-disable-next-line react-hooks/exhaustive-deps -- activeKeySet is a stable scalar derived from activeKeys\n [activeKeySet]\n );\n\n for (const key of CALLBACK_KEYS) {\n // eslint-disable-next-line react-hooks/refs -- callback refs intentionally track latest props for stable event handlers\n callbackRefs.current[key] = props[key];\n }\n\n return stableCallbacks;\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n Conversation,\n type Options,\n type Callbacks,\n type ConversationLifecycleOptions,\n} from \"@elevenlabs/client\";\nimport {\n CALLBACK_KEYS,\n mergeOptions,\n parseLocation,\n getOriginForLocation,\n getLivekitUrlForLocation,\n} from \"@elevenlabs/client/internal\";\n\nimport { type HookOptions } from \"./types.js\";\nimport {\n ConversationContext,\n type ConversationContextValue,\n} from \"./ConversationContext.js\";\nimport { ConversationControlsProvider } from \"./ConversationControls.js\";\nimport { ConversationStatusProvider } from \"./ConversationStatus.js\";\nimport {\n ConversationInputProvider,\n type ConversationInputProviderProps,\n} from \"./ConversationInput.js\";\nimport { ConversationModeProvider } from \"./ConversationMode.js\";\nimport { ConversationFeedbackProvider } from \"./ConversationFeedback.js\";\nimport {\n ConversationClientToolsProvider,\n buildClientTools,\n} from \"./ConversationClientTools.js\";\nimport { ListenerMap } from \"./ListenerMap.js\";\nimport { useStableCallbacks } from \"./useStableCallbacks.js\";\n\ntype ConversationInputControlProps = Pick<\n ConversationInputProviderProps,\n \"isMuted\" | \"onMutedChange\"\n>;\n\nconst SUB_PROVIDERS_WITHOUT_PROPS: React.ComponentType<React.PropsWithChildren>[] = [\n ConversationControlsProvider,\n ConversationStatusProvider,\n ConversationModeProvider,\n ConversationFeedbackProvider,\n ConversationClientToolsProvider,\n];\n\nexport type ConversationProviderProps = React.PropsWithChildren<\n HookOptions & ConversationInputControlProps\n>;\n\nexport function ConversationProvider({\n children,\n isMuted,\n onMutedChange,\n ...defaultOptions\n}: ConversationProviderProps) {\n /** The active conversation instance, if any. */\n const conversationRef = useRef<Conversation | null>(null);\n /** In-flight startSession promise, used to prevent duplicate connections. */\n const lockRef = useRef<Promise<Conversation> | null>(null);\n /** Monotonic id used to ignore stale async handlers from older starts. */\n const startSessionIdRef = useRef(0);\n /** Signals that endSession was called while a connection was still pending. */\n const shouldEndRef = useRef(false);\n /** Registry of hook-registered client tools. Survives across sessions. */\n const [clientToolsRegistry] = useState(\n () => new Map<string, NonNullable<Options[\"clientTools\"]>[string]>()\n );\n /** Ref to the live clientTools object currently held by BaseConversation. */\n const clientToolsRef = useRef<Record<string, NonNullable<Options[\"clientTools\"]>[string]>>({});\n /** Always holds the latest provider props, avoiding stale closures in callbacks. */\n const defaultOptionsRef = useRef(defaultOptions);\n // eslint-disable-next-line react-hooks/refs -- intentional sync during render for latest-ref pattern\n defaultOptionsRef.current = defaultOptions;\n\n /** Callback registry for sub-providers (status, mode, feedback, etc.). */\n const [listenerMap] = useState(\n () => new ListenerMap<Callbacks>(CALLBACK_KEYS)\n );\n\n /** Reactive mirror of conversationRef, triggers re-renders for context consumers. */\n const [conversation, setConversation] = useState<Conversation | null>(null);\n\n const stableCallbacks = useStableCallbacks(defaultOptions);\n\n const registerCallbacks = useCallback(\n (callbacks: Partial<Callbacks>) => listenerMap.register(callbacks),\n [listenerMap]\n );\n\n // Sync provider state when session ends externally (agent disconnect,\n // raw instance endSession(), etc.). Uses the listener map so it composes\n // with user-provided onDisconnect callbacks.\n useLayoutEffect(() => {\n return listenerMap.register({\n onDisconnect: () => {\n conversationRef.current = null;\n setConversation(null);\n },\n });\n }, [listenerMap]);\n\n const startSession = useCallback(\n (options?: HookOptions) => {\n if (conversationRef.current) {\n return;\n }\n if (lockRef.current) {\n return;\n }\n\n shouldEndRef.current = false;\n const startSessionId = ++startSessionIdRef.current;\n\n const defaults = defaultOptionsRef.current;\n const resolvedServerLocation = parseLocation(\n options?.serverLocation || defaults?.serverLocation\n );\n const origin = getOriginForLocation(resolvedServerLocation);\n const calculatedLivekitUrl = getLivekitUrlForLocation(\n resolvedServerLocation\n );\n\n // Strip raw callbacks from defaults — stableCallbacks provides\n // ref-backed versions that won't go stale across renders.\n const defaultConfig = { ...defaults };\n for (const key of CALLBACK_KEYS) {\n delete (defaultConfig as Record<string, unknown>)[key];\n }\n\n const sessionOptions = mergeOptions<Options>(\n { livekitUrl: calculatedLivekitUrl },\n defaultConfig,\n stableCallbacks,\n listenerMap.compose(),\n options ?? {},\n { origin }\n );\n\n const clientTools = buildClientTools(\n sessionOptions.clientTools,\n clientToolsRegistry\n );\n clientToolsRef.current = clientTools;\n sessionOptions.clientTools = clientTools;\n\n const userOnConversationCreated = sessionOptions.onConversationCreated;\n const isStaleStartSession = () =>\n startSessionId !== startSessionIdRef.current;\n\n const handleConversationCreated = (conv: Conversation) => {\n if (shouldEndRef.current || isStaleStartSession()) {\n return;\n }\n conversationRef.current = conv;\n setConversation(conv);\n userOnConversationCreated?.(conv);\n };\n\n const handleConnect: NonNullable<Callbacks[\"onConnect\"]> = props => {\n if (shouldEndRef.current || isStaleStartSession()) {\n return;\n }\n lockRef.current = null;\n sessionOptions.onConnect?.(props);\n };\n\n const providerLifecycleOptions: ConversationLifecycleOptions &\n Pick<Callbacks, \"onConnect\"> = {\n onConversationCreated: handleConversationCreated,\n onConnect: handleConnect,\n };\n\n const startSessionOptions: Options = {\n ...sessionOptions,\n ...providerLifecycleOptions,\n };\n\n lockRef.current = Conversation.startSession(startSessionOptions);\n\n lockRef.current.then(\n conv => {\n if (isStaleStartSession()) {\n return;\n }\n if (shouldEndRef.current) {\n conv.endSession();\n lockRef.current = null;\n return;\n }\n if (conversationRef.current !== conv) {\n conversationRef.current = conv;\n setConversation(conv);\n }\n lockRef.current = null;\n },\n (error: unknown) => {\n if (isStaleStartSession()) {\n return;\n }\n conversationRef.current = null;\n setConversation(null);\n lockRef.current = null;\n if (shouldEndRef.current) {\n return;\n }\n // The client SDK calls onStatusChange(\"disconnected\") before\n // rejecting, but never calls onError — surface the failure here\n // so listeners (e.g. ConversationStatusProvider) transition to\n // the \"error\" state with a meaningful message.\n const message =\n error instanceof Error\n ? error.message\n : \"Session failed to start\";\n sessionOptions.onError?.(message, error);\n }\n );\n },\n [stableCallbacks, listenerMap, clientToolsRegistry, clientToolsRef]\n );\n\n const endSession = useCallback(() => {\n shouldEndRef.current = true;\n const pendingConnection = lockRef.current;\n const conv = conversationRef.current;\n conversationRef.current = null;\n setConversation(null);\n\n if (pendingConnection) {\n pendingConnection.then(c => c.endSession(), () => {});\n } else {\n conv?.endSession();\n }\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n shouldEndRef.current = true;\n if (lockRef.current) {\n lockRef.current.then(conv => conv.endSession(), () => {});\n } else {\n conversationRef.current?.endSession();\n }\n };\n }, []);\n\n const contextValue = useMemo<ConversationContextValue>(\n () => ({\n conversation,\n conversationRef,\n startSession,\n endSession,\n registerCallbacks,\n clientToolsRegistry,\n clientToolsRef,\n }),\n [conversation, conversationRef, startSession, endSession, registerCallbacks, clientToolsRegistry, clientToolsRef]\n );\n\n const wrappedChildren = SUB_PROVIDERS_WITHOUT_PROPS.reduceRight<React.ReactNode>(\n (nested, Provider) => <Provider>{nested}</Provider>,\n <ConversationInputProvider\n isMuted={isMuted}\n onMutedChange={onMutedChange}\n >\n {children}\n </ConversationInputProvider>\n );\n\n return (\n <ConversationContext.Provider value={contextValue}>\n {wrappedChildren}\n </ConversationContext.Provider>\n );\n}\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { CALLBACK_KEYS } from \"@elevenlabs/client/internal\";\n\nimport { useConversationControls } from \"./ConversationControls.js\";\nimport { useConversationStatus } from \"./ConversationStatus.js\";\nimport { useConversationInput } from \"./ConversationInput.js\";\nimport { useConversationMode } from \"./ConversationMode.js\";\nimport { useConversationFeedback } from \"./ConversationFeedback.js\";\nimport {\n useRawConversation,\n useRegisterCallbacks,\n} from \"./ConversationContext.js\";\nimport { useStableCallbacks } from \"./useStableCallbacks.js\";\nimport type { HookOptions } from \"./types.js\";\n\nexport type UseConversationOptions = HookOptions & {\n micMuted?: boolean;\n volume?: number;\n};\n\n/**\n * Convenience hook that combines all granular conversation hooks into a single\n * return value. Less performant than using individual hooks because any state\n * change in any sub-context triggers a re-render of the consuming component.\n *\n * Accepts optional `micMuted`, `volume`, session config, and callback props.\n * Session config and callbacks passed here are used as defaults when calling\n * `startSession()` without arguments. Callbacks are also registered with the\n * provider so they stay up-to-date across re-renders.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useConversation(props: UseConversationOptions = {}) {\n const { micMuted, volume, ...hookOptions } = props;\n\n const stableCallbacks = useStableCallbacks(hookOptions);\n useRegisterCallbacks(stableCallbacks);\n\n const hookOptionsRef = useRef(hookOptions);\n // eslint-disable-next-line react-hooks/refs -- intentional sync during render for latest-ref pattern\n hookOptionsRef.current = hookOptions;\n\n const controls = useConversationControls();\n const { status, message } = useConversationStatus();\n const { isMuted, setMuted } = useConversationInput();\n const { mode, isSpeaking, isListening } = useConversationMode();\n const { canSendFeedback, sendFeedback } = useConversationFeedback();\n\n const startSession = useCallback(\n (options?: HookOptions) => {\n // Strip callbacks from the hook-level defaults: those are registered via\n // useRegisterCallbacks and kept ref-stable across renders.\n // NOTE: We intentionally do NOT strip callbacks from the `options` parameter\n // here. Callbacks passed directly to startSession() are treated as one-shot\n // per-session overrides, and may capture render-local state. This asymmetry\n // (hook callbacks are ref-stable; startSession callbacks are one-shot) is\n // intentional and relied on by the public API.\n const sessionConfig = { ...hookOptionsRef.current };\n for (const key of CALLBACK_KEYS) {\n delete (sessionConfig as Record<string, unknown>)[key];\n }\n controls.startSession({\n ...sessionConfig,\n ...options,\n } as HookOptions);\n },\n [controls, hookOptionsRef]\n );\n\n const conversation = useRawConversation();\n\n useEffect(() => {\n if (micMuted !== undefined && conversation) {\n setMuted(micMuted);\n }\n }, [micMuted, conversation, setMuted]);\n\n useEffect(() => {\n if (volume !== undefined && conversation) {\n conversation.setVolume({ volume });\n }\n }, [volume, conversation]);\n\n return {\n ...controls,\n startSession,\n status,\n message,\n isMuted: micMuted ?? isMuted,\n setMuted,\n mode,\n isSpeaking,\n isListening,\n canSendFeedback,\n sendFeedback,\n };\n}\n","import { setSourceInfo } from \"@elevenlabs/client/internal\";\nimport { PACKAGE_VERSION } from \"./version.js\";\n\nsetSourceInfo({ name: \"react_sdk\", version: PACKAGE_VERSION });\n\nexport * from \"@elevenlabs/client\";\n\n// Scribe exports\nexport {\n useScribe,\n AudioFormat,\n CommitStrategy,\n RealtimeEvents,\n} from \"./scribe.js\";\nexport type {\n ScribeStatus,\n TranscriptSegment,\n WordTimestamp,\n ScribeCallbacks,\n ScribeHookOptions,\n UseScribeReturn,\n RealtimeConnection,\n} from \"./scribe.js\";\n\n// Conversation context API\nexport { ConversationProvider } from \"./conversation/ConversationProvider.js\";\nexport { useConversationControls } from \"./conversation/ConversationControls.js\";\nexport { useConversationStatus } from \"./conversation/ConversationStatus.js\";\nexport { useConversationInput } from \"./conversation/ConversationInput.js\";\nexport { useConversationMode } from \"./conversation/ConversationMode.js\";\nexport { useConversationFeedback } from \"./conversation/ConversationFeedback.js\";\nexport { useRawConversation } from \"./conversation/ConversationContext.js\";\nexport { useConversation } from \"./conversation/useConversation.js\";\nexport { useConversationClientTool } from \"./conversation/ConversationClientTools.js\";\nexport type { UseConversationOptions } from \"./conversation/useConversation.js\";\nexport type { ConversationControlsValue } from \"./conversation/ConversationControls.js\";\nexport type { ConversationInputValue } from \"./conversation/ConversationInput.js\";\nexport type {\n ConversationStatus,\n ConversationStatusValue,\n} from \"./conversation/ConversationStatus.js\";\nexport type { ConversationModeValue } from \"./conversation/ConversationMode.js\";\nexport type { ConversationFeedbackValue } from \"./conversation/ConversationFeedback.js\";\nexport type { ConversationProviderProps } from \"./conversation/ConversationProvider.js\";\nexport type {\n HookOptions,\n HookCallbacks,\n ClientTool,\n ClientTools,\n ClientToolResult,\n} from \"./conversation/types.js\";\n"],"x_google_ignoreList":[3,4],"mappings":"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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.2.8/node_modules/react/cjs/react-jsx-runtime.production.js","../../../node_modules/.pnpm/react@19.2.8/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.12.1\";\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 /** Detected language code (only present when includeLanguageDetection is enabled) */\n languageCode?: string;\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 language_code?: string;\n words?: WordTimestamp[];\n }) => void;\n /** Called for any error (also called when specific error callbacks fire) */\n onError?: (error: Error | Event) => void;\n onAuthError?: (data: { error: string }) => void;\n onQuotaExceededError?: (data: { error: string }) => void;\n onCommitThrottledError?: (data: { error: string }) => void;\n onTranscriberError?: (data: { error: string }) => void;\n onUnacceptedTermsError?: (data: { error: string }) => void;\n onRateLimitedError?: (data: { error: string }) => void;\n onInputError?: (data: { error: string }) => void;\n onQueueOverflowError?: (data: { error: string }) => void;\n onResourceExhaustedError?: (data: { error: string }) => void;\n onSessionTimeLimitExceededError?: (data: { error: string }) => void;\n onChunkSizeExceededError?: (data: { error: string }) => void;\n onInsufficientAudioActivityError?: (data: { error: string }) => void;\n\n onConnect?: () => void;\n onDisconnect?: () => void;\n}\n\nexport interface ScribeHookOptions extends ScribeCallbacks {\n // Connection options\n token?: string;\n modelId?: string;\n baseUri?: string;\n\n // VAD options\n commitStrategy?: CommitStrategy;\n vadSilenceThresholdSecs?: number;\n vadThreshold?: number;\n minSpeechDurationMs?: number;\n minSilenceDurationMs?: number;\n languageCode?: string;\n\n // Microphone options (for automatic microphone mode)\n microphone?: MicrophoneOptions[\"microphone\"];\n\n // Manual audio options\n audioFormat?: AudioFormat;\n sampleRate?: number;\n\n // Auto-connect on mount\n autoConnect?: boolean;\n\n // Include timestamps\n includeTimestamps?: boolean;\n /** Include detected language information in transcription results */\n includeLanguageDetection?: boolean;\n\n // Keyterms and verbatim control\n keyterms?: string[];\n noVerbatim?: boolean;\n\n /**\n * Whether the session may be logged by ElevenLabs. Set to `false` to use zero\n * retention mode, which makes history features unavailable for the session.\n * Zero retention mode may only be used by enterprise customers.\n * @default true\n */\n enableLogging?: boolean;\n}\n\nexport interface UseScribeReturn {\n // State\n status: ScribeStatus;\n isConnected: boolean;\n isTranscribing: boolean;\n isMuted: boolean;\n partialTranscript: string;\n committedTranscripts: TranscriptSegment[];\n error: string | null;\n\n // Connection methods\n connect: (options?: Partial<ScribeHookOptions>) => Promise<void>;\n disconnect: () => void;\n\n // Mute / unmute\n mute: () => void;\n unmute: () => void;\n\n // Audio methods (for manual mode)\n sendAudio: (\n audioBase64: string,\n options?: { commit?: boolean; sampleRate?: number; previousText?: string }\n ) => void;\n commit: () => void;\n\n // Utility methods\n clearTranscripts: () => void;\n getConnection: () => RealtimeConnection | null;\n}\n\n// ============= Hook Implementation =============\n\nexport function useScribe(options: ScribeHookOptions = {}): UseScribeReturn {\n const {\n // Callbacks\n onSessionStarted,\n onPartialTranscript,\n onCommittedTranscript,\n onCommittedTranscriptWithTimestamps,\n onError,\n onAuthError,\n onQuotaExceededError,\n onCommitThrottledError,\n onTranscriberError,\n onUnacceptedTermsError,\n onRateLimitedError,\n onInputError,\n onQueueOverflowError,\n onResourceExhaustedError,\n onSessionTimeLimitExceededError,\n onChunkSizeExceededError,\n onInsufficientAudioActivityError,\n onConnect,\n onDisconnect,\n\n // Connection options\n token: defaultToken,\n modelId: defaultModelId,\n baseUri: defaultBaseUri,\n commitStrategy: defaultCommitStrategy,\n vadSilenceThresholdSecs: defaultVadSilenceThresholdSecs,\n vadThreshold: defaultVadThreshold,\n minSpeechDurationMs: defaultMinSpeechDurationMs,\n minSilenceDurationMs: defaultMinSilenceDurationMs,\n languageCode: defaultLanguageCode,\n\n // Mode options\n microphone: defaultMicrophone,\n audioFormat: defaultAudioFormat,\n sampleRate: defaultSampleRate,\n\n // Auto-connect\n autoConnect = false,\n\n // Timestamps\n includeTimestamps: defaultIncludeTimestamps,\n includeLanguageDetection: defaultIncludeLanguageDetection,\n\n // Keyterms and verbatim control\n keyterms: defaultKeyterms,\n noVerbatim: defaultNoVerbatim,\n\n // Logging\n enableLogging: defaultEnableLogging,\n } = options;\n\n const connectionRef = useRef<RealtimeConnection | null>(null);\n\n const [status, setStatus] = useState<ScribeStatus>(\"disconnected\");\n const [isMuted, setIsMuted] = useState<boolean>(false);\n const [partialTranscript, setPartialTranscript] = useState<string>(\"\");\n const [committedTranscripts, setCommittedTranscripts] = useState<\n TranscriptSegment[]\n >([]);\n const [error, setError] = useState<string | null>(null);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n connectionRef.current?.close();\n };\n }, []);\n\n const connect = useCallback(\n async (runtimeOptions: Partial<ScribeHookOptions> = {}) => {\n if (connectionRef.current) {\n console.warn(\"Already connected\");\n return;\n }\n\n try {\n setStatus(\"connecting\");\n setError(null);\n\n // Merge default options with runtime options\n const token = runtimeOptions.token || defaultToken;\n const modelId = runtimeOptions.modelId || defaultModelId;\n\n if (!token) {\n throw new Error(\"Token is required\");\n }\n if (!modelId) {\n throw new Error(\"Model ID is required\");\n }\n\n // Determine mode: microphone or manual\n const microphone = runtimeOptions.microphone || defaultMicrophone;\n const audioFormat = runtimeOptions.audioFormat || defaultAudioFormat;\n const sampleRate = runtimeOptions.sampleRate || defaultSampleRate;\n\n let connection: RealtimeConnection;\n\n // Include timestamps if explicitly requested OR if the callback is provided\n const includeTimestamps =\n runtimeOptions.includeTimestamps ??\n defaultIncludeTimestamps ??\n !!(\n runtimeOptions.onCommittedTranscriptWithTimestamps ||\n onCommittedTranscriptWithTimestamps\n );\n const includeLanguageDetection =\n runtimeOptions.includeLanguageDetection ??\n defaultIncludeLanguageDetection;\n const enableLogging =\n runtimeOptions.enableLogging ?? defaultEnableLogging;\n\n if (microphone) {\n // Microphone mode\n connection = Scribe.connect({\n token,\n modelId,\n baseUri: runtimeOptions.baseUri || defaultBaseUri,\n commitStrategy:\n runtimeOptions.commitStrategy || defaultCommitStrategy,\n vadSilenceThresholdSecs:\n runtimeOptions.vadSilenceThresholdSecs ||\n defaultVadSilenceThresholdSecs,\n vadThreshold: runtimeOptions.vadThreshold || defaultVadThreshold,\n minSpeechDurationMs:\n runtimeOptions.minSpeechDurationMs || defaultMinSpeechDurationMs,\n minSilenceDurationMs:\n runtimeOptions.minSilenceDurationMs ||\n defaultMinSilenceDurationMs,\n languageCode: runtimeOptions.languageCode || defaultLanguageCode,\n keyterms: runtimeOptions.keyterms || defaultKeyterms,\n noVerbatim: runtimeOptions.noVerbatim ?? defaultNoVerbatim,\n microphone,\n includeTimestamps,\n includeLanguageDetection,\n enableLogging,\n } as MicrophoneOptions);\n } else if (audioFormat && sampleRate) {\n // Manual audio mode\n connection = Scribe.connect({\n token,\n modelId,\n baseUri: runtimeOptions.baseUri || defaultBaseUri,\n commitStrategy:\n runtimeOptions.commitStrategy || defaultCommitStrategy,\n vadSilenceThresholdSecs:\n runtimeOptions.vadSilenceThresholdSecs ||\n defaultVadSilenceThresholdSecs,\n vadThreshold: runtimeOptions.vadThreshold || defaultVadThreshold,\n minSpeechDurationMs:\n runtimeOptions.minSpeechDurationMs || defaultMinSpeechDurationMs,\n minSilenceDurationMs:\n runtimeOptions.minSilenceDurationMs ||\n defaultMinSilenceDurationMs,\n languageCode: runtimeOptions.languageCode || defaultLanguageCode,\n keyterms: runtimeOptions.keyterms || defaultKeyterms,\n noVerbatim: runtimeOptions.noVerbatim ?? defaultNoVerbatim,\n includeTimestamps,\n includeLanguageDetection,\n enableLogging,\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 languageCode: message.language_code,\n words: message.words,\n };\n setCommittedTranscripts(prev => [...prev, segment]);\n setPartialTranscript(\"\");\n onCommittedTranscriptWithTimestamps?.(message);\n }\n );\n\n connection.on(RealtimeEvents.ERROR, (err: unknown) => {\n const message = err as ScribeErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onError?.(new Error(message.error));\n });\n\n connection.on(RealtimeEvents.AUTH_ERROR, (data: unknown) => {\n const message = data as ScribeAuthErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onAuthError?.(message);\n });\n\n connection.on(RealtimeEvents.QUOTA_EXCEEDED, (data: unknown) => {\n const message = data as ScribeQuotaExceededErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onQuotaExceededError?.(message);\n });\n\n connection.on(RealtimeEvents.COMMIT_THROTTLED, (data: unknown) => {\n const message = data as ScribeCommitThrottledErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onCommitThrottledError?.(message);\n });\n\n connection.on(RealtimeEvents.TRANSCRIBER_ERROR, (data: unknown) => {\n const message = data as ScribeTranscriberErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onTranscriberError?.(message);\n });\n\n connection.on(RealtimeEvents.UNACCEPTED_TERMS, (data: unknown) => {\n const message = data as ScribeUnacceptedTermsErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onUnacceptedTermsError?.(message);\n });\n\n connection.on(RealtimeEvents.RATE_LIMITED, (data: unknown) => {\n const message = data as ScribeRateLimitedErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onRateLimitedError?.(message);\n });\n\n connection.on(RealtimeEvents.INPUT_ERROR, (data: unknown) => {\n const message = data as ScribeInputErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onInputError?.(message);\n });\n\n connection.on(RealtimeEvents.QUEUE_OVERFLOW, (data: unknown) => {\n const message = data as ScribeQueueOverflowErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onQueueOverflowError?.(message);\n });\n\n connection.on(RealtimeEvents.RESOURCE_EXHAUSTED, (data: unknown) => {\n const message = data as ScribeResourceExhaustedErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onResourceExhaustedError?.(message);\n });\n\n connection.on(\n RealtimeEvents.SESSION_TIME_LIMIT_EXCEEDED,\n (data: unknown) => {\n const message = data as ScribeSessionTimeLimitExceededErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onSessionTimeLimitExceededError?.(message);\n }\n );\n\n connection.on(RealtimeEvents.CHUNK_SIZE_EXCEEDED, (data: unknown) => {\n const message = data as ScribeChunkSizeExceededErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onChunkSizeExceededError?.(message);\n });\n\n connection.on(\n RealtimeEvents.INSUFFICIENT_AUDIO_ACTIVITY,\n (data: unknown) => {\n const message = data as ScribeInsufficientAudioActivityErrorMessage;\n setError(message.error);\n setStatus(\"error\");\n onInsufficientAudioActivityError?.(message);\n }\n );\n\n connection.on(RealtimeEvents.OPEN, () => {\n onConnect?.();\n });\n\n connection.on(RealtimeEvents.CLOSE, () => {\n setStatus(\"disconnected\");\n setIsMuted(false);\n connectionRef.current = null;\n onDisconnect?.();\n });\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"Failed to connect\";\n setError(errorMessage);\n setStatus(\"error\");\n throw err;\n }\n },\n [\n defaultToken,\n defaultModelId,\n defaultBaseUri,\n defaultCommitStrategy,\n defaultVadSilenceThresholdSecs,\n defaultVadThreshold,\n defaultMinSpeechDurationMs,\n defaultMinSilenceDurationMs,\n defaultLanguageCode,\n defaultMicrophone,\n defaultAudioFormat,\n defaultSampleRate,\n defaultIncludeTimestamps,\n defaultIncludeLanguageDetection,\n defaultKeyterms,\n defaultNoVerbatim,\n defaultEnableLogging,\n onSessionStarted,\n onPartialTranscript,\n onCommittedTranscript,\n onCommittedTranscriptWithTimestamps,\n onError,\n onAuthError,\n onQuotaExceededError,\n onCommitThrottledError,\n onTranscriberError,\n onUnacceptedTermsError,\n onRateLimitedError,\n onInputError,\n onQueueOverflowError,\n onResourceExhaustedError,\n onSessionTimeLimitExceededError,\n onChunkSizeExceededError,\n onInsufficientAudioActivityError,\n onConnect,\n onDisconnect,\n ]\n );\n\n const disconnect = useCallback(() => {\n connectionRef.current?.close();\n connectionRef.current = null;\n setStatus(\"disconnected\");\n setIsMuted(false);\n }, []);\n\n const mute = useCallback(() => {\n if (!connectionRef.current) {\n throw new Error(\"Not connected to Scribe\");\n }\n connectionRef.current.mute();\n setIsMuted(true);\n }, []);\n\n const unmute = useCallback(() => {\n if (!connectionRef.current) {\n throw new Error(\"Not connected to Scribe\");\n }\n connectionRef.current.unmute();\n setIsMuted(false);\n }, []);\n\n const sendAudio = useCallback(\n (\n audioBase64: string,\n options?: { commit?: boolean; sampleRate?: number; previousText?: string }\n ) => {\n if (!connectionRef.current) {\n throw new Error(\"Not connected to Scribe\");\n }\n connectionRef.current.send({ audioBase64, ...options });\n },\n []\n );\n\n const commit = useCallback(() => {\n if (!connectionRef.current) {\n throw new Error(\"Not connected to Scribe\");\n }\n connectionRef.current.commit();\n }, []);\n\n const clearTranscripts = useCallback(() => {\n setCommittedTranscripts([]);\n setPartialTranscript(\"\");\n }, []);\n\n const getConnection = useCallback(() => {\n return connectionRef.current;\n }, []);\n\n // Auto-connect if enabled\n useEffect(() => {\n if (autoConnect) {\n // eslint-disable-next-line react-hooks/set-state-in-effect -- autoConnect intentionally starts the connection when the hook mounts\n connect();\n }\n }, [autoConnect, connect]);\n\n return {\n // State\n status,\n isConnected: status === \"connected\" || status === \"transcribing\",\n isTranscribing: status === \"transcribing\",\n isMuted,\n partialTranscript,\n committedTranscripts,\n error,\n\n // Methods\n connect,\n disconnect,\n mute,\n unmute,\n sendAudio,\n commit,\n clearTranscripts,\n getConnection,\n };\n}\n\n// Export types and enums from client for convenience\nexport {\n AudioFormat,\n CommitStrategy,\n RealtimeEvents,\n} from \"@elevenlabs/client\";\nexport type { RealtimeConnection } from \"@elevenlabs/client\";\n","import {\n createContext,\n useContext,\n useLayoutEffect,\n useRef,\n type MutableRefObject,\n type RefObject,\n} from \"react\";\nimport type {\n Callbacks,\n ClientToolsConfig,\n Conversation,\n} from \"@elevenlabs/client\";\nimport type { HookOptions } from \"./types.js\";\n\ntype ClientToolEntry = ClientToolsConfig[\"clientTools\"][string];\n\nexport type ConversationContextValue = {\n conversation: Conversation | null;\n /** Stable ref to the active conversation — use in callbacks to avoid re-renders. */\n conversationRef: RefObject<Conversation | null>;\n startSession: (options?: HookOptions) => void;\n endSession: () => void;\n /**\n * For sub-providers — register callback handlers to be composed into the\n * next `Conversation.startSession()` call. Returns an unsubscribe function.\n */\n registerCallbacks: (callbacks: Partial<Callbacks>) => () => void;\n /** Registry of hook-registered client tools. Survives across sessions. */\n clientToolsRegistry: Map<string, ClientToolEntry>;\n /** Ref to the live clientTools object currently held by BaseConversation. */\n clientToolsRef: MutableRefObject<Record<string, ClientToolEntry>>;\n};\n\nexport const ConversationContext =\n createContext<ConversationContextValue | null>(null);\n\n/**\n * Returns the raw `Conversation` instance (or `null` if no session is active).\n * This is a public escape hatch for advanced use cases that need direct access\n * to the underlying `@elevenlabs/client` Conversation object.\n *\n * Can be used outside a `ConversationProvider` — returns `null` in that case.\n */\nexport function useRawConversation(): Conversation | null {\n const ctx = useContext(ConversationContext);\n return ctx?.conversation ?? null;\n}\n\n/**\n * Returns a stable ref to the active `Conversation` instance.\n * The ref's `.current` is `null` when no session is active, and updates\n * without causing re-renders — ideal for use inside callbacks and sub-providers.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useRawConversationRef(): RefObject<Conversation | null> {\n const ctx = useContext(ConversationContext);\n if (!ctx) {\n throw new Error(\n \"useRawConversationRef must be used within a ConversationProvider\"\n );\n }\n return ctx.conversationRef;\n}\n\n/**\n * Registers callback handlers with the nearest `ConversationProvider`.\n * Uses a ref internally so the latest callback values are always invoked\n * without re-subscribing on every render.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useRegisterCallbacks(callbacks: Partial<Callbacks>): void {\n const ctx = useContext(ConversationContext);\n if (!ctx) {\n throw new Error(\n \"useRegisterCallbacks must be used within a ConversationProvider\"\n );\n }\n\n const { registerCallbacks } = ctx;\n const callbacksRef = useRef(callbacks);\n\n // Re-subscribe when the set of provided callback keys changes.\n const activeKeyToken = Object.keys(callbacks)\n .filter(key => callbacks[key as keyof Callbacks] !== undefined)\n .sort()\n .join(\"|\");\n\n useLayoutEffect(() => {\n callbacksRef.current = callbacks;\n });\n\n useLayoutEffect(() => {\n const activeKeys = activeKeyToken === \"\" ? [] : activeKeyToken.split(\"|\");\n const stableCallbacks = Object.fromEntries(\n activeKeys.map((key: string) => [\n key,\n (...args: never[]) => {\n const fn = callbacksRef.current[key as keyof Callbacks];\n if (typeof fn === \"function\") {\n (fn as (...a: never[]) => void)(...args);\n }\n },\n ])\n ) as Partial<Callbacks>;\n return registerCallbacks(stableCallbacks);\n }, [registerCallbacks, activeKeyToken]);\n}\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import { createContext, useCallback, useContext, useMemo } from \"react\";\nimport {\n VoiceConversation,\n type FormatConfig,\n type InputDeviceConfig,\n type OutputConfig,\n type MultimodalMessageInput,\n type UploadFileResult,\n type ContextualUpdateOptions,\n} from \"@elevenlabs/client\";\nimport type { HookOptions } from \"./types.js\";\nimport { ConversationContext } from \"./ConversationContext.js\";\n\nconst EMPTY_FREQUENCY_DATA = new Uint8Array(0);\n\nexport type ConversationControlsValue = {\n startSession: (options?: HookOptions) => void;\n endSession: () => void;\n sendUserMessage: (text: string) => void;\n sendMultimodalMessage: (options: MultimodalMessageInput) => void;\n uploadFile: (file: Blob) => Promise<UploadFileResult>;\n sendContextualUpdate: (\n text: string,\n options?: ContextualUpdateOptions\n ) => void;\n sendUserActivity: () => void;\n sendMCPToolApprovalResult: (toolCallId: string, isApproved: boolean) => void;\n setVolume: (options: { volume: number }) => void;\n changeInputDevice: (\n config: Partial<FormatConfig> & InputDeviceConfig\n ) => Promise<void>;\n changeOutputDevice: (\n config: Partial<FormatConfig> & OutputConfig\n ) => Promise<void>;\n /** Returns byte frequency data (0-255) for the input, focused on 100-8000 Hz. */\n getInputByteFrequencyData: () => Uint8Array;\n /** Returns byte frequency data (0-255) for the output, focused on 100-8000 Hz. */\n getOutputByteFrequencyData: () => Uint8Array;\n getInputVolume: () => number;\n getOutputVolume: () => number;\n getId: () => string;\n};\n\nexport const ConversationControlsContext =\n createContext<ConversationControlsValue | null>(null);\n\n/**\n * Reads from `ConversationContext` and provides stable action references to\n * `ConversationControlsContext`. Must be rendered inside a `ConversationProvider`.\n */\nexport function ConversationControlsProvider({\n children,\n}: React.PropsWithChildren) {\n const ctx = useContext(ConversationContext);\n if (!ctx) {\n throw new Error(\n \"ConversationControlsProvider must be rendered inside a ConversationProvider\"\n );\n }\n\n const { conversationRef } = ctx;\n\n const getConversation = useCallback(() => {\n const conversation = conversationRef.current;\n if (!conversation) {\n throw new Error(\"No active conversation. Call startSession() first.\");\n }\n return conversation;\n }, [conversationRef]);\n\n const sendUserMessage = useCallback(\n (text: string) => {\n getConversation().sendUserMessage(text);\n },\n [getConversation]\n );\n\n const sendMultimodalMessage = useCallback(\n (options: MultimodalMessageInput) => {\n getConversation().sendMultimodalMessage(options);\n },\n [getConversation]\n );\n\n const uploadFile = useCallback(\n (file: Blob) => {\n return getConversation().uploadFile(file);\n },\n [getConversation]\n );\n\n const sendContextualUpdate = useCallback(\n (text: string, options?: ContextualUpdateOptions) => {\n getConversation().sendContextualUpdate(text, options);\n },\n [getConversation]\n );\n\n const sendUserActivity = useCallback(() => {\n getConversation().sendUserActivity();\n }, [getConversation]);\n\n const sendMCPToolApprovalResult = useCallback(\n (toolCallId: string, isApproved: boolean) => {\n getConversation().sendMCPToolApprovalResult(toolCallId, isApproved);\n },\n [getConversation]\n );\n\n const setVolume = useCallback(\n (options: { volume: number }) => {\n getConversation().setVolume(options);\n },\n [getConversation]\n );\n\n const changeInputDevice = useCallback(\n async (config: Partial<FormatConfig> & InputDeviceConfig) => {\n const conversation = getConversation();\n if (conversation instanceof VoiceConversation) {\n return await conversation.changeInputDevice(config);\n }\n throw new Error(\n \"Device switching is only available for voice conversations\"\n );\n },\n [getConversation]\n );\n\n const changeOutputDevice = useCallback(\n async (config: Partial<FormatConfig> & OutputConfig) => {\n const conversation = getConversation();\n if (conversation instanceof VoiceConversation) {\n return await conversation.changeOutputDevice(config);\n }\n throw new Error(\n \"Device switching is only available for voice conversations\"\n );\n },\n [getConversation]\n );\n\n const getInputByteFrequencyData = useCallback(() => {\n return (\n conversationRef.current?.getInputByteFrequencyData() ??\n EMPTY_FREQUENCY_DATA\n );\n }, [conversationRef]);\n\n const getOutputByteFrequencyData = useCallback(() => {\n return (\n conversationRef.current?.getOutputByteFrequencyData() ??\n EMPTY_FREQUENCY_DATA\n );\n }, [conversationRef]);\n\n const getInputVolume = useCallback(() => {\n return conversationRef.current?.getInputVolume() ?? 0;\n }, [conversationRef]);\n\n const getOutputVolume = useCallback(() => {\n return conversationRef.current?.getOutputVolume() ?? 0;\n }, [conversationRef]);\n\n const getId = useCallback(() => {\n return getConversation().getId();\n }, [getConversation]);\n\n const value = useMemo<ConversationControlsValue>(\n () => ({\n startSession: ctx.startSession,\n endSession: ctx.endSession,\n sendUserMessage,\n sendMultimodalMessage,\n uploadFile,\n sendContextualUpdate,\n sendUserActivity,\n sendMCPToolApprovalResult,\n setVolume,\n changeInputDevice,\n changeOutputDevice,\n getInputByteFrequencyData,\n getOutputByteFrequencyData,\n getInputVolume,\n getOutputVolume,\n getId,\n }),\n [\n ctx.startSession,\n ctx.endSession,\n sendUserMessage,\n sendMultimodalMessage,\n uploadFile,\n sendContextualUpdate,\n sendUserActivity,\n sendMCPToolApprovalResult,\n setVolume,\n changeInputDevice,\n changeOutputDevice,\n getInputByteFrequencyData,\n getOutputByteFrequencyData,\n getInputVolume,\n getOutputVolume,\n getId,\n ]\n );\n\n return (\n <ConversationControlsContext.Provider value={value}>\n {children}\n </ConversationControlsContext.Provider>\n );\n}\n\n/**\n * Returns stable action references for controlling the conversation.\n * All function references are stable and will never cause re-renders.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useConversationControls(): ConversationControlsValue {\n const ctx = useContext(ConversationControlsContext);\n if (!ctx) {\n throw new Error(\n \"useConversationControls must be used within a ConversationProvider\"\n );\n }\n return ctx;\n}\n","import { createContext, useContext, useMemo, useState } from \"react\";\nimport { useRegisterCallbacks } from \"./ConversationContext.js\";\n\nexport type ConversationStatus =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"error\";\n\nexport type ConversationStatusValue = {\n status: ConversationStatus;\n message?: string;\n};\n\nconst ConversationStatusContext = createContext<ConversationStatusValue | null>(\n null\n);\n\n/**\n * Reads from `ConversationContext` and registers `onStatusChange` + `onError`\n * callbacks. Manages its own `status`/`message` state and provides it through\n * `ConversationStatusContext`. Must be rendered inside a `ConversationProvider`.\n */\nexport function ConversationStatusProvider({\n children,\n}: React.PropsWithChildren) {\n const [status, setStatus] =\n useState<ConversationStatusValue[\"status\"]>(\"disconnected\");\n const [message, setMessage] = useState<string | undefined>(undefined);\n\n useRegisterCallbacks({\n onStatusChange({ status: newStatus }) {\n // \"disconnecting\" means the provider has already released the\n // conversation (endSession clears it optimistically), so report\n // \"disconnected\" immediately — holding \"connected\" here would let\n // consumers observe status === \"connected\" with no conversation.\n setStatus(newStatus === \"disconnecting\" ? \"disconnected\" : 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 {\n useRawConversationRef,\n useRegisterCallbacks,\n} from \"./ConversationContext.js\";\n\nexport type ConversationFeedbackValue = {\n canSendFeedback: boolean;\n sendFeedback: (like: boolean | null, eventId?: number) => 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(\n (like: boolean | null, eventId?: number) => {\n conversationRef.current?.sendFeedback(like, eventId);\n },\n [conversationRef]\n );\n\n const value = useMemo<ConversationFeedbackValue>(\n () => ({\n canSendFeedback,\n sendFeedback,\n }),\n [canSendFeedback, sendFeedback]\n );\n\n return (\n <ConversationFeedbackContext.Provider value={value}>\n {children}\n </ConversationFeedbackContext.Provider>\n );\n}\n\n/**\n * Returns the current feedback state and a `sendFeedback` action.\n * Re-renders only when `canSendFeedback` changes.\n *\n * Must be used within a `ConversationProvider`.\n */\nexport function useConversationFeedback(): ConversationFeedbackValue {\n const ctx = useContext(ConversationFeedbackContext);\n if (!ctx) {\n throw new Error(\n \"useConversationFeedback must be used within a ConversationProvider\"\n );\n }\n return ctx;\n}\n","import { createContext, useCallback, useContext, useLayoutEffect, useRef } from \"react\";\nimport type { ClientToolsConfig } from \"@elevenlabs/client\";\nimport { ConversationContext } from \"./ConversationContext.js\";\nimport type { ClientTool, ClientTools } from \"./types.js\";\n\ntype ClientToolEntry = ClientToolsConfig[\"clientTools\"][string];\n\n/**\n * Creates a fresh clientTools object by merging option-provided tools with\n * hook-registered tools from the registry. Throws if a hook-registered tool\n * name conflicts with an option-provided tool.\n */\nexport function buildClientTools(\n optionTools: Record<string, ClientToolEntry> | undefined,\n registry: Map<string, ClientToolEntry>\n): Record<string, ClientToolEntry> {\n const clientTools: Record<string, ClientToolEntry> = { ...optionTools };\n for (const [name, handler] of registry) {\n if (Object.hasOwn(clientTools, name)) {\n throw new Error(\n `Client tool \"${name}\" is already provided via props/options. ` +\n `Remove it from props or do not register it with useConversationClientTool.`\n );\n }\n clientTools[name] = handler;\n }\n return clientTools;\n}\n\n// ---------------------------------------------------------------------------\n// Sub-provider\n// ---------------------------------------------------------------------------\n\ntype RegisterClientTool = (\n name: string,\n handler: ClientToolEntry\n) => () => void;\n\nconst ConversationClientToolsContext = createContext<RegisterClientTool | null>(\n null\n);\n\nexport function ConversationClientToolsProvider({\n children,\n}: React.PropsWithChildren) {\n const ctx = useContext(ConversationContext);\n if (!ctx) {\n throw new Error(\n \"ConversationClientToolsProvider must be rendered inside a ConversationProvider\"\n );\n }\n\n const { clientToolsRegistry, clientToolsRef } = ctx;\n\n const registerClientTool: RegisterClientTool = useCallback(\n (name, handler) => {\n if (clientToolsRegistry.has(name)) {\n throw new Error(\n `Client tool \"${name}\" is already registered by another hook. ` +\n `Each tool name must be unique.`\n );\n }\n clientToolsRegistry.set(name, handler);\n clientToolsRef.current[name] = handler;\n return () => {\n if (clientToolsRegistry.get(name) === handler) {\n clientToolsRegistry.delete(name);\n }\n if (clientToolsRef.current[name] === handler) {\n delete clientToolsRef.current[name];\n }\n };\n },\n [clientToolsRegistry, clientToolsRef]\n );\n\n return (\n <ConversationClientToolsContext.Provider value={registerClientTool}>\n {children}\n </ConversationClientToolsContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Registers a named client tool with the nearest `ConversationProvider`.\n * The tool is available during any active conversation and is automatically\n * unregistered when the component unmounts.\n *\n * The handler always reflects the latest closure value (ref pattern),\n * so it is safe to reference component state or props without listing\n * them as dependencies.\n *\n * @typeParam TTools - An interface mapping tool names to function signatures.\n * @typeParam TName - The specific tool name (inferred from the first argument).\n * @param name - The tool name (must match the name configured on the agent).\n * @param handler - The function invoked when the agent calls this tool.\n *\n * @example\n * ```tsx\n * type Tools = {\n * get_weather: (params: { city: string }) => string;\n * set_volume: (params: { level: number }) => void;\n * };\n *\n * useConversationClientTool<Tools>(\"get_weather\", (params) => {\n * return `Weather in ${params.city} is sunny.`;\n * });\n * ```\n */\nexport function useConversationClientTool<\n TTools extends ClientTools = Record<string, ClientTool>,\n TName extends string & keyof TTools = string & keyof TTools,\n>(name: TName, handler: TTools[TName]): void {\n const registerClientTool = useContext(ConversationClientToolsContext);\n if (!registerClientTool) {\n throw new Error(\n \"useConversationClientTool must be used within a ConversationProvider\"\n );\n }\n\n const handlerRef = useRef(handler);\n // eslint-disable-next-line react-hooks/refs -- intentional sync during render for latest-ref pattern\n handlerRef.current = handler;\n\n useLayoutEffect(() => {\n const stableHandler: ClientToolEntry = parameters =>\n handlerRef.current(parameters as Parameters<TTools[TName]>[0]);\n return registerClientTool(name, stableHandler);\n }, [registerClientTool, name]);\n}\n","export class ListenerSet<Args extends unknown[]> {\n private listeners = new Set<(...args: Args) => void>();\n\n add(fn: (...args: Args) => void): () => void {\n this.listeners.add(fn);\n return () => {\n this.listeners.delete(fn);\n };\n }\n\n invoke(...args: Args): void {\n for (const fn of this.listeners) fn(...args);\n }\n\n get size(): number {\n return this.listeners.size;\n }\n}\n","import { ListenerSet } from \"./ListenerSet.js\";\n\nfunction assertFunction(\n value: unknown,\n key: string\n): asserts value is (...args: unknown[]) => void {\n if (typeof value !== \"function\") {\n throw new Error(`Expected function for key \"${key}\", got ${typeof value}`);\n }\n}\n\n/**\n * A map of named listener sets. Each key maps to a `ListenerSet` that can have\n * multiple listeners registered. Typed through `T` so that `register` and\n * `compose` preserve per-key callback signatures.\n *\n * All keys are pre-initialized in the constructor so `register` can validate\n * keys. `compose()` only includes keys with at least one registered listener,\n * preserving callback-presence semantics used by the client as feature guards.\n * For included keys, composed functions delegate to the live listener set, so\n * listeners added/removed after `compose()` still take effect. Keys with no\n * listeners at compose time are omitted entirely; call `compose()` again after\n * registering listeners to pick up newly populated keys.\n */\nexport class ListenerMap<\n T extends Record<string, ((...args: never[]) => void) | undefined>,\n> {\n private sets = new Map<string, ListenerSet<unknown[]>>();\n\n constructor(keys: readonly (keyof T & string)[]) {\n for (const key of keys) {\n this.sets.set(key, new ListenerSet<unknown[]>());\n }\n }\n\n /**\n * Register listeners for one or more keys. Returns a function that removes\n * all listeners added by this call.\n */\n register(callbacks: Partial<T>): () => void {\n const removers = Object.entries(callbacks)\n .filter(([, fn]) => fn !== undefined)\n .map(([key, fn]) => {\n assertFunction(fn, key);\n const set = this.sets.get(key);\n if (!set) {\n throw new Error(`Unknown callback key \"${key}\"`);\n }\n return set.add(fn);\n });\n return () => {\n for (const remove of removers) remove();\n };\n }\n\n /**\n * Compose all registered listeners into a single callbacks object. Each\n * composed function delegates to the live listener set, so listeners\n * added/removed after this call still take effect.\n */\n compose(): Partial<T> {\n return Object.fromEntries(\n Array.from(this.sets.entries())\n .filter(([, set]) => set.size > 0)\n .map(([key, set]) => [\n key,\n (...args: never[]) => {\n set.invoke(...args);\n },\n ])\n ) as Partial<T>;\n }\n}\n","import { useMemo, useRef } from \"react\";\nimport type { Callbacks } from \"@elevenlabs/client\";\nimport { CALLBACK_KEYS } from \"@elevenlabs/client/internal\";\nimport type { HookOptions } from \"./types.js\";\n\n/**\n * Wraps user-provided callback props in stable ref-backed functions,\n * preventing stale closure bugs when the session outlives renders.\n *\n * Returns a `Partial<Callbacks>` containing only the keys the caller\n * actually provided. Function references are stable per key across\n * renders, but always invoke the latest prop value. The returned object\n * reference is stable as long as the set of provided keys doesn't change.\n */\nexport function useStableCallbacks(props: HookOptions): Partial<Callbacks> {\n // Store the latest prop value for each callback in a ref.\n // Uses Record<string, unknown> to avoid TypeScript's union-to-intersection\n // issue when indexing Callbacks with a union of all its keys.\n const callbackRefs = useRef<Record<string, unknown>>({});\n\n // Compute a stable scalar from the set of provided keys so we can\n // memoize the result object.\n const activeKeys = CALLBACK_KEYS.filter(key => props[key] !== undefined);\n const activeKeySet = activeKeys.join(\"|\");\n const stableCallbacks = useMemo(\n () =>\n Object.fromEntries(\n activeKeys.map(key => [\n key,\n (...args: unknown[]) => {\n const fn = callbackRefs.current[key] as\n | ((...a: unknown[]) => void)\n | undefined;\n fn?.(...args);\n },\n ])\n ) as Partial<Callbacks>,\n // eslint-disable-next-line react-hooks/exhaustive-deps -- activeKeySet is a stable scalar derived from activeKeys\n [activeKeySet]\n );\n\n for (const key of CALLBACK_KEYS) {\n // eslint-disable-next-line react-hooks/refs -- callback refs intentionally track latest props for stable event handlers\n callbackRefs.current[key] = props[key];\n }\n\n return stableCallbacks;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n Conversation,\n type Options,\n type Callbacks,\n type ConversationLifecycleOptions,\n} from \"@elevenlabs/client\";\nimport {\n CALLBACK_KEYS,\n mergeOptions,\n parseLocation,\n getOriginForLocation,\n getLivekitUrlForLocation,\n} from \"@elevenlabs/client/internal\";\n\nimport { type HookOptions } from \"./types.js\";\nimport {\n ConversationContext,\n type ConversationContextValue,\n} from \"./ConversationContext.js\";\nimport { ConversationControlsProvider } from \"./ConversationControls.js\";\nimport { ConversationStatusProvider } from \"./ConversationStatus.js\";\nimport {\n ConversationInputProvider,\n type ConversationInputProviderProps,\n} from \"./ConversationInput.js\";\nimport { ConversationModeProvider } from \"./ConversationMode.js\";\nimport { ConversationFeedbackProvider } from \"./ConversationFeedback.js\";\nimport {\n ConversationClientToolsProvider,\n buildClientTools,\n} from \"./ConversationClientTools.js\";\nimport { ListenerMap } from \"./ListenerMap.js\";\nimport { useStableCallbacks } from \"./useStableCallbacks.js\";\n\ntype ConversationInputControlProps = Pick<\n ConversationInputProviderProps,\n \"isMuted\" | \"onMutedChange\"\n>;\n\nconst SUB_PROVIDERS_WITHOUT_PROPS: React.ComponentType<React.PropsWithChildren>[] =\n [\n ConversationControlsProvider,\n ConversationStatusProvider,\n ConversationModeProvider,\n ConversationFeedbackProvider,\n ConversationClientToolsProvider,\n ];\n\nexport type ConversationProviderProps = React.PropsWithChildren<\n HookOptions & ConversationInputControlProps\n>;\n\nexport function ConversationProvider({\n children,\n isMuted,\n onMutedChange,\n ...defaultOptions\n}: ConversationProviderProps) {\n /** The active conversation instance, if any. */\n const conversationRef = useRef<Conversation | null>(null);\n /** In-flight startSession promise, used to prevent duplicate connections. */\n const lockRef = useRef<Promise<Conversation> | null>(null);\n /** Monotonic id used to ignore stale async handlers from older starts. */\n const startSessionIdRef = useRef(0);\n /** Signals that endSession was called while a connection was still pending. */\n const shouldEndRef = useRef(false);\n /** Registry of hook-registered client tools. Survives across sessions. */\n const [clientToolsRegistry] = useState(\n () => new Map<string, NonNullable<Options[\"clientTools\"]>[string]>()\n );\n /** Ref to the live clientTools object currently held by BaseConversation. */\n const clientToolsRef = useRef<\n Record<string, NonNullable<Options[\"clientTools\"]>[string]>\n >({});\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 const startSession = useCallback(\n (options?: HookOptions) => {\n if (conversationRef.current) {\n return;\n }\n if (lockRef.current) {\n return;\n }\n\n shouldEndRef.current = false;\n const startSessionId = ++startSessionIdRef.current;\n\n const defaults = defaultOptionsRef.current;\n const resolvedServerLocation = parseLocation(\n options?.serverLocation || defaults?.serverLocation\n );\n const origin = getOriginForLocation(resolvedServerLocation);\n const calculatedLivekitUrl = getLivekitUrlForLocation(\n resolvedServerLocation\n );\n\n // Strip raw callbacks from defaults — stableCallbacks provides\n // ref-backed versions that won't go stale across renders.\n const defaultConfig = { ...defaults };\n for (const key of CALLBACK_KEYS) {\n delete (defaultConfig as Record<string, unknown>)[key];\n }\n\n const sessionOptions = mergeOptions<Options>(\n { livekitUrl: calculatedLivekitUrl },\n defaultConfig,\n stableCallbacks,\n listenerMap.compose(),\n options ?? {},\n { origin }\n );\n\n const clientTools = buildClientTools(\n sessionOptions.clientTools,\n clientToolsRegistry\n );\n clientToolsRef.current = clientTools;\n sessionOptions.clientTools = clientTools;\n\n const isStaleStartSession = () =>\n startSessionId !== startSessionIdRef.current;\n\n // A superseded session can outlive its replacement's start: its async\n // teardown keeps emitting events (final \"disconnected\", teardown\n // onDisconnect, errors) that would otherwise reach the listener map\n // and clobber sub-provider state now reflecting the newer session\n // (e.g. ConversationModeProvider resets mode on onDisconnect). Drop\n // every callback once this start is stale.\n for (const key of CALLBACK_KEYS) {\n const callback = sessionOptions[key];\n if (typeof callback === \"function\") {\n (sessionOptions as Record<string, unknown>)[key] = (\n ...args: never[]\n ) => {\n if (!isStaleStartSession()) {\n (callback as (...a: never[]) => void)(...args);\n }\n };\n }\n }\n\n const userOnConversationCreated = sessionOptions.onConversationCreated;\n const userOnDisconnect = sessionOptions.onDisconnect;\n\n // Set once this session's conversation is known. endSession() clears\n // conversationRef optimistically (so restart-from-callback patterns\n // keep working), which means a session's own onDisconnect can still\n // arrive after a *newer* session has taken the ref — this check stops\n // that late arrival from clearing state that isn't its own.\n let thisSessionConv: Conversation | null = null;\n\n const handleConversationCreated = (conv: Conversation) => {\n thisSessionConv = conv;\n if (shouldEndRef.current || isStaleStartSession()) {\n return;\n }\n conversationRef.current = conv;\n setConversation(conv);\n userOnConversationCreated?.(conv);\n };\n\n const handleConnect: NonNullable<Callbacks[\"onConnect\"]> = props => {\n if (shouldEndRef.current || isStaleStartSession()) {\n return;\n }\n lockRef.current = null;\n sessionOptions.onConnect?.(props);\n };\n\n // \"disconnecting\" marks the moment the session stops being usable, on\n // every path (agent hangup, raw endSession(), provider endSession()) —\n // release the conversation here so it clears in the same React batch\n // as the status transition, and consumers never observe a live status\n // with a released conversation (or vice versa). Stale sessions are\n // dropped entirely so a late \"disconnected\" can't clobber the status\n // of a session that replaced this one.\n const handleStatusChange: NonNullable<\n Callbacks[\"onStatusChange\"]\n > = props => {\n if (isStaleStartSession()) {\n return;\n }\n if (\n props.status === \"disconnecting\" &&\n thisSessionConv !== null &&\n conversationRef.current === thisSessionConv\n ) {\n conversationRef.current = null;\n setConversation(null);\n }\n sessionOptions.onStatusChange?.(props);\n };\n\n // Syncs provider state when this session ends, whether externally\n // (agent disconnect) or via endSession(). Only clears conversationRef\n // if it still points at this session's conversation.\n const handleDisconnect: NonNullable<\n Callbacks[\"onDisconnect\"]\n > = details => {\n if (isStaleStartSession()) {\n return;\n }\n if (conversationRef.current === thisSessionConv) {\n conversationRef.current = null;\n setConversation(null);\n }\n userOnDisconnect?.(details);\n };\n\n const providerLifecycleOptions: ConversationLifecycleOptions &\n Pick<Callbacks, \"onConnect\" | \"onDisconnect\" | \"onStatusChange\"> = {\n onConversationCreated: handleConversationCreated,\n onConnect: handleConnect,\n onDisconnect: handleDisconnect,\n onStatusChange: handleStatusChange,\n };\n\n const startSessionOptions: Options = {\n ...sessionOptions,\n ...providerLifecycleOptions,\n };\n\n lockRef.current = Conversation.startSession(startSessionOptions);\n\n lockRef.current.then(\n conv => {\n if (isStaleStartSession()) {\n return;\n }\n if (shouldEndRef.current) {\n conv\n .endSession()\n .catch(error => console.warn(\"Error ending session:\", error));\n lockRef.current = null;\n return;\n }\n if (conversationRef.current !== conv) {\n thisSessionConv = conv;\n conversationRef.current = conv;\n setConversation(conv);\n }\n lockRef.current = null;\n },\n (error: unknown) => {\n if (isStaleStartSession()) {\n return;\n }\n conversationRef.current = null;\n setConversation(null);\n lockRef.current = null;\n if (shouldEndRef.current) {\n return;\n }\n // The client SDK calls onStatusChange(\"disconnected\") before\n // rejecting, but never calls onError — surface the failure here\n // so listeners (e.g. ConversationStatusProvider) transition to\n // the \"error\" state with a meaningful message.\n const message =\n error instanceof Error ? error.message : \"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(\n c =>\n c\n .endSession()\n .catch(error => console.warn(\"Error ending session:\", error)),\n () => {}\n );\n } else {\n conv\n ?.endSession()\n .catch(error => console.warn(\"Error ending session:\", error));\n }\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n shouldEndRef.current = true;\n if (lockRef.current) {\n lockRef.current.then(\n conv => conv.endSession().catch(() => {}),\n () => {}\n );\n } else {\n conversationRef.current?.endSession().catch(() => {});\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 [\n conversation,\n conversationRef,\n startSession,\n endSession,\n registerCallbacks,\n clientToolsRegistry,\n clientToolsRef,\n ]\n );\n\n const wrappedChildren =\n 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.12.
|
|
1
|
+
export declare const PACKAGE_VERSION = "1.12.1";
|
|
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.12.
|
|
3
|
+
"version": "1.12.1",
|
|
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.18.0"
|
|
22
22
|
},
|
|
23
23
|
"peerDependencies": {
|
|
24
24
|
"react": ">=16.8.0"
|
|
@@ -26,13 +26,13 @@
|
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@eslint/js": "^10.0.1",
|
|
28
28
|
"@testing-library/react": "^16.3.2",
|
|
29
|
-
"@types/react": "^19.2.
|
|
29
|
+
"@types/react": "^19.2.18",
|
|
30
30
|
"eslint": "^10.3.0",
|
|
31
31
|
"eslint-import-resolver-typescript": "^4.4.4",
|
|
32
32
|
"eslint-plugin-import-x": "^4.16.2",
|
|
33
33
|
"eslint-plugin-react-hooks": "^7.1.1",
|
|
34
|
-
"react": "19.2.
|
|
35
|
-
"react-dom": "19.2.
|
|
34
|
+
"react": "19.2.8",
|
|
35
|
+
"react-dom": "19.2.8",
|
|
36
36
|
"rolldown": "^1.0.0-rc.9",
|
|
37
37
|
"typescript": "^5.5.4",
|
|
38
38
|
"typescript-eslint": "^8.59.2",
|