@elevenlabs/react-native 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -173,6 +173,18 @@ const id = conversation.getId();
173
173
  console.log(id);
174
174
  ```
175
175
 
176
+ #### `setMicMuted(muted: boolean): void`
177
+
178
+ Mutes/unmutes the microphone
179
+
180
+ **Parameters:**
181
+ - `muted`: Whether the mic should be muted or not
182
+
183
+ ```typescript
184
+ conversation.setMicMuted(true); // mute
185
+ conversation.setMicMuted(false) // unmute
186
+ ```
187
+
176
188
  #### Properties
177
189
 
178
190
  - `status: ConversationStatus` - Current conversation status ('connecting' | 'connected' | 'disconnected')
@@ -15,6 +15,7 @@ export interface Conversation {
15
15
  sendContextualUpdate: (text: string) => void;
16
16
  sendUserMessage: (text: string) => void;
17
17
  sendUserActivity: () => void;
18
+ setMicMuted: (muted: boolean) => void;
18
19
  }
19
20
  export declare const useConversation: (options?: ConversationOptions) => Conversation;
20
21
  interface ElevenLabsProviderProps {
@@ -25,4 +25,5 @@ export declare const useConversationSession: (callbacksRef: {
25
25
  } | undefined;
26
26
  customLlmExtraBody: unknown;
27
27
  dynamicVariables: Record<string, string | number | boolean> | undefined;
28
+ userId: string | undefined;
28
29
  };
package/dist/lib.js CHANGED
@@ -1,2 +1,2 @@
1
- var e=require("react"),n=require("@livekit/react-native");function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var r=/*#__PURE__*/t(e);function o(){return o=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)({}).hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},o.apply(null,arguments)}var a="0.2.1",l=function(t){var o=t.onReady,a=t.isConnected,l=t.callbacks,c=t.sendMessage,i=t.clientTools,s=void 0===i?{}:i,u=t.updateCurrentEventId,d=n.useLocalParticipant().localParticipant,v=r.default.useRef(1);return e.useEffect(function(){a&&d&&o(d)},[a,d,o]),n.useDataChannel(function(e){var n,t,r=new TextDecoder,o=JSON.parse(r.decode(e.payload));if(o.type){var a;if(null==l.onMessage||l.onMessage({message:o,source:null!=(n=e.from)&&n.isAgent?"ai":"user"}),null!=(t=e.from)&&t.isAgent&&(null==l.onModeChange||l.onModeChange({mode:null!=(a=e.from)&&a.isSpeaking?"speaking":"listening"}),"agent_response"===o.type&&u)){var i=v.current++;u(i)}switch(o.type){case"ping":c({type:"pong",event_id:o.ping_event.event_id});break;case"client_tool_call":!function(e){try{return Promise.resolve(function(){if(Object.prototype.hasOwnProperty.call(s,e.client_tool_call.tool_name)){var n=function(n,t){try{var r=Promise.resolve(s[e.client_tool_call.tool_name](e.client_tool_call.parameters)).then(function(n){var t="object"==typeof n?JSON.stringify(n):String(n);c({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:t,is_error:!1})})}catch(e){return t(e)}return r&&r.then?r.then(void 0,t):r}(0,function(n){null==l.onError||l.onError("Client tool execution failed with following error: "+(null==n?void 0:n.message),{clientToolName:e.client_tool_call.tool_name}),c({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:"Client tool execution failed: "+(null==n?void 0:n.message),is_error:!0})});if(n&&n.then)return n.then(function(){})}else{if(l.onUnhandledClientToolCall)return void l.onUnhandledClientToolCall(e);var t="Client tool with name "+e.client_tool_call.tool_name+" is not defined on client";null==l.onError||l.onError(t,{clientToolName:e.client_tool_call.tool_name}),c({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:t,is_error:!0})}}())}catch(e){return Promise.reject(e)}}(o);break;default:null==l.onDebug||l.onDebug(o)}}else null==l.onDebug||l.onDebug({type:"invalid_event",message:o})}),null},c=function(e){var t=e.children;/*#__PURE__*/return r.default.createElement(n.LiveKitRoom,{serverUrl:e.serverUrl,token:e.token,connect:e.connect,audio:!0,video:!1,options:{adaptiveStream:{pixelDensity:"screen"}},onConnected:e.onConnected,onDisconnected:e.onDisconnected,onError:e.onError},/*#__PURE__*/r.default.createElement(l,{onReady:e.onParticipantReady,isConnected:e.roomConnected,callbacks:e.callbacks,sendMessage:e.sendMessage,clientTools:e.clientTools,updateCurrentEventId:e.updateCurrentEventId}),t)},i=["serverUrl","tokenFetchUrl","clientTools"],s=/*#__PURE__*/e.createContext(null);exports.ElevenLabsProvider=function(t){var l=t.children;n.registerGlobals();var i=e.useState(""),u=i[0],d=i[1],v=e.useState(!1),f=v[0],h=v[1],m=e.useState("disconnected"),g=m[0],C=m[1],_=e.useState("wss://livekit.rtc.elevenlabs.io"),k=_[0],b=_[1],p=e.useState(void 0),y=p[0],S=p[1],E=e.useState(""),P=E[0],w=E[1],x=e.useState(!1),T=x[0],U=x[1],D=e.useState(!1),R=D[0],F=D[1],I=r.default.useRef(1),M=r.default.useRef(1),j=r.default.useRef({}),O=function(){var n=e.useRef({}),t=e.useCallback(function(e){n.current=e},[]);return{callbacksRef:n,setCallbacks:t}}(),L=O.callbacksRef,A=O.setCallbacks,N=r.default.useCallback(function(e){var n=o({},e,{onModeChange:function(n){U("speaking"===n.mode),null==e.onModeChange||e.onModeChange(n)}});A(n)},[A]),V=function(n,t,r,o,l,c){var i=e.useState({}),s=i[0],u=i[1],d=e.useState(null),v=d[0],f=d[1],h=e.useState({}),m=h[0],g=h[1];return{startSession:e.useCallback(function(e){try{return Promise.resolve(function(i,s){try{var d=function(){function i(e){var n=function(e){try{var n,t;return(null==(t=((null==(n=JSON.parse(atob(e.split(".")[1])).video)?void 0:n.room)||"").match(/(conv_[a-zA-Z0-9]+)/))?void 0:t[0])||""}catch(e){return console.warn("Could not extract conversation ID from token"),""}}(s);l(n),o(s),r(!0)}var s;t("connecting"),null==n.current.onStatusChange||n.current.onStatusChange({status:"connecting"}),u(e.overrides||{}),f(e.customLlmExtraBody||null),g(e.dynamicVariables||{});var d=function(){if(!e.conversationToken)return function(){if(e.agentId)return console.info("Getting conversation token for agentId:",e.agentId),Promise.resolve(function(e,n){try{return Promise.resolve(fetch((n||"https://api.elevenlabs.io/v1/convai/conversation/token")+"?agent_id="+e+"&source=react_native_sdk&version="+a)).then(function(e){return Promise.resolve(e.json()).then(function(n){if(!e.ok)throw new Error("Failed to get conversation token: "+n.detail.message);if(!n.token)throw new Error("No conversation token received from API");return n.token})})}catch(e){return Promise.reject(e)}}(e.agentId,e.tokenFetchUrl||c)).then(function(e){s=e});throw new Error("Either conversationToken or agentId is required")}();s=e.conversationToken}();return d&&d.then?d.then(i):i()}()}catch(e){return s(e)}return d&&d.then?d.then(void 0,s):d}(0,function(e){throw t("disconnected"),null==n.current.onStatusChange||n.current.onStatusChange({status:"disconnected"}),null==n.current.onError||n.current.onError(e),e}))}catch(e){return Promise.reject(e)}},[n,t,r,o,l,c]),endSession:e.useCallback(function(){try{try{r(!1),o(""),t("disconnected"),null==n.current.onStatusChange||n.current.onStatusChange({status:"disconnected"}),null==n.current.onDisconnect||n.current.onDisconnect("User ended conversation")}catch(e){throw null==n.current.onError||n.current.onError(e),e}return Promise.resolve()}catch(e){return Promise.reject(e)}},[n,r,o,t]),overrides:s,customLlmExtraBody:v,dynamicVariables:m}}(L,C,h,d,w,y),B=V.startSession,J=V.endSession,q=V.overrides,K=V.customLlmExtraBody,G=V.dynamicVariables,z=function(t,r,o){var a=e.useState(!1),l=a[0],c=a[1],i=e.useState(null),s=i[0],u=i[1];return e.useEffect(function(){return function(){try{return Promise.resolve(n.AudioSession.startAudioSession()).then(function(){})}catch(e){return Promise.reject(e)}}(),function(){n.AudioSession.stopAudioSession()}},[]),{roomConnected:l,localParticipant:s,handleParticipantReady:e.useCallback(function(e){u(e)},[]),handleConnected:e.useCallback(function(){c(!0),r("connected"),null==t.current.onConnect||t.current.onConnect({conversationId:o})},[o,t,r]),handleDisconnected:e.useCallback(function(){c(!1),r("disconnected"),u(null),null==t.current.onDisconnect||t.current.onDisconnect("disconnected")},[t,r]),handleError:e.useCallback(function(e){console.error("LiveKit error:",e),null==t.current.onError||t.current.onError(e.message,void 0)},[t])}}(L,C,P),W=z.roomConnected,Z=z.localParticipant,H=z.handleParticipantReady,Q=z.handleConnected,X=z.handleDisconnected,Y=z.handleError,$=r.default.useCallback(function(){I.current=1,M.current=1,F(!1),null==L.current.onCanSendFeedbackChange||L.current.onCanSendFeedbackChange({canSendFeedback:!1}),Q()},[Q,L]),ee=r.default.useCallback(function(){F(!1),X()},[X]),ne=function(n,t,r){return{sendMessage:e.useCallback(function(e){try{if("connected"!==n||!t)return console.warn("Cannot send message: room not connected or no local participant"),Promise.resolve();var o=function(n,r){try{var o=(a=(new TextEncoder).encode(JSON.stringify(e)),Promise.resolve(t.publishData(a,{reliable:!0})).then(function(){}))}catch(e){return r(e)}var a;return o&&o.then?o.then(void 0,r):o}(0,function(e){console.error("Failed to send message via WebRTC:",e),console.error("Error details:",e),null==r.current.onError||r.current.onError(e)});return Promise.resolve(o&&o.then?o.then(function(){}):void 0)}catch(e){return Promise.reject(e)}},[n,t,r])}}(g,Z,L),te=ne.sendMessage,re=r.default.useCallback(function(){var e=I.current!==M.current;R!==e&&(F(e),null==L.current.onCanSendFeedbackChange||L.current.onCanSendFeedbackChange({canSendFeedback:e}))},[R,L]),oe=r.default.useCallback(function(e){R?(te({type:"feedback",score:e?"like":"dislike",event_id:I.current}),M.current=I.current,re()):console.warn(0===M.current?"Cannot send feedback: the conversation has not started yet.":"Cannot send feedback: feedback has already been sent for the current response.")},[R,te,re]);r.default.useCallback(function(e){console.warn("setVolume is not yet implemented in React Native SDK")},[]);var ae=r.default.useCallback(function(e){I.current=e,re()},[re]),le=r.default.useCallback(function(e){if(H(e),Z){var n=function(e){var n,t,r,o,l,c,i={type:"conversation_initiation_client_data"};return e.overrides&&(i.conversation_config_override={agent:{prompt:null==(n=e.overrides.agent)?void 0:n.prompt,first_message:null==(t=e.overrides.agent)?void 0:t.firstMessage,language:null==(r=e.overrides.agent)?void 0:r.language},tts:{voice_id:null==(o=e.overrides.tts)?void 0:o.voiceId},conversation:{text_only:null==(l=e.overrides.conversation)?void 0:l.textOnly},source_info:{source:"react_native_sdk",version:(null==(c=e.overrides)||null==(c=c.client)?void 0:c.version)||a}}),e.customLlmExtraBody&&(i.custom_llm_extra_body=e.customLlmExtraBody),e.dynamicVariables&&(i.dynamic_variables=e.dynamicVariables),e.userId&&(i.user_id=e.userId),i}({overrides:q,customLlmExtraBody:K,dynamicVariables:G});te(n)}},[H,Z,q,K,G,te]),ce={startSession:B,endSession:J,status:g,isSpeaking:T,canSendFeedback:R,getId:function(){return P},sendFeedback:oe,sendContextualUpdate:function(e){te({type:"contextual_update",text:e})},sendUserMessage:function(e){te({type:"user_message",text:e})},sendUserActivity:function(){te({type:"user_activity"})}},ie=r.default.useCallback(function(e){j.current=e},[]);/*#__PURE__*/return r.default.createElement(s.Provider,{value:{conversation:ce,callbacksRef:L,serverUrl:k,tokenFetchUrl:y,clientTools:j.current,setCallbacks:N,setServerUrl:b,setTokenFetchUrl:S,setClientTools:ie}},/*#__PURE__*/r.default.createElement(c,{serverUrl:k,token:u,connect:f,onConnected:$,onDisconnected:ee,onError:Y,roomConnected:W,callbacks:L.current,onParticipantReady:le,sendMessage:te,clientTools:j.current,updateCurrentEventId:ae},l))},exports.useConversation=function(n){void 0===n&&(n={});var t=e.useContext(s);if(!t)throw new Error("useConversation must be used within ElevenLabsProvider");var o=n.serverUrl,a=n.tokenFetchUrl,l=n.clientTools,c=function(e,n){if(null==e)return{};var t={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(-1!==n.indexOf(r))continue;t[r]=e[r]}return t}(n,i);return r.default.useEffect(function(){o&&t.setServerUrl(o)},[t,o]),r.default.useEffect(function(){a&&t.setTokenFetchUrl(a)},[t,a]),l&&t.setClientTools(l),t.setCallbacks(c),t.conversation};
1
+ var e=require("react"),n=require("@livekit/react-native");function t(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var r=/*#__PURE__*/t(e);function o(){return o=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)({}).hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},o.apply(null,arguments)}var a="0.3.0",l=function(t){var o=t.onReady,a=t.isConnected,l=t.callbacks,c=t.sendMessage,i=t.clientTools,s=void 0===i?{}:i,u=t.updateCurrentEventId,d=n.useLocalParticipant().localParticipant,v=r.default.useRef(1);return e.useEffect(function(){a&&d&&o(d)},[a,d,o]),n.useDataChannel(function(e){var n,t,r=new TextDecoder,o=JSON.parse(r.decode(e.payload));if(o.type){var a;if(null==l.onMessage||l.onMessage({message:o,source:null!=(n=e.from)&&n.isAgent?"ai":"user"}),null!=(t=e.from)&&t.isAgent&&(null==l.onModeChange||l.onModeChange({mode:null!=(a=e.from)&&a.isSpeaking?"speaking":"listening"}),"agent_response"===o.type&&u)){var i=v.current++;u(i)}switch(o.type){case"ping":c({type:"pong",event_id:o.ping_event.event_id});break;case"client_tool_call":!function(e){try{return Promise.resolve(function(){if(Object.prototype.hasOwnProperty.call(s,e.client_tool_call.tool_name)){var n=function(n,t){try{var r=Promise.resolve(s[e.client_tool_call.tool_name](e.client_tool_call.parameters)).then(function(n){var t="object"==typeof n?JSON.stringify(n):String(n);c({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:t,is_error:!1})})}catch(e){return t(e)}return r&&r.then?r.then(void 0,t):r}(0,function(n){null==l.onError||l.onError("Client tool execution failed with following error: "+(null==n?void 0:n.message),{clientToolName:e.client_tool_call.tool_name}),c({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:"Client tool execution failed: "+(null==n?void 0:n.message),is_error:!0})});if(n&&n.then)return n.then(function(){})}else{if(l.onUnhandledClientToolCall)return void l.onUnhandledClientToolCall(e);var t="Client tool with name "+e.client_tool_call.tool_name+" is not defined on client";null==l.onError||l.onError(t,{clientToolName:e.client_tool_call.tool_name}),c({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:t,is_error:!0})}}())}catch(e){return Promise.reject(e)}}(o);break;default:null==l.onDebug||l.onDebug(o)}}else null==l.onDebug||l.onDebug({type:"invalid_event",message:o})}),null},c=function(e){var t=e.children;/*#__PURE__*/return r.default.createElement(n.LiveKitRoom,{serverUrl:e.serverUrl,token:e.token,connect:e.connect,audio:!0,video:!1,options:{adaptiveStream:{pixelDensity:"screen"}},onConnected:e.onConnected,onDisconnected:e.onDisconnected,onError:e.onError},/*#__PURE__*/r.default.createElement(l,{onReady:e.onParticipantReady,isConnected:e.roomConnected,callbacks:e.callbacks,sendMessage:e.sendMessage,clientTools:e.clientTools,updateCurrentEventId:e.updateCurrentEventId}),t)},i=["serverUrl","tokenFetchUrl","clientTools"],s=/*#__PURE__*/e.createContext(null);exports.ElevenLabsProvider=function(t){var l=t.children;n.registerGlobals();var i=e.useState(""),u=i[0],d=i[1],v=e.useState(!1),f=v[0],h=v[1],m=e.useState("disconnected"),g=m[0],C=m[1],_=e.useState("wss://livekit.rtc.elevenlabs.io"),b=_[0],k=_[1],p=e.useState(void 0),y=p[0],S=p[1],E=e.useState(""),P=E[0],w=E[1],x=e.useState(!1),T=x[0],I=x[1],U=e.useState(!1),D=U[0],M=U[1],R=r.default.useRef(1),F=r.default.useRef(1),j=r.default.useRef({}),O=function(){var n=e.useRef({}),t=e.useCallback(function(e){n.current=e},[]);return{callbacksRef:n,setCallbacks:t}}(),L=O.callbacksRef,A=O.setCallbacks,N=r.default.useCallback(function(e){var n=o({},e,{onModeChange:function(n){I("speaking"===n.mode),null==e.onModeChange||e.onModeChange(n)}});A(n)},[A]),V=function(n,t,r,o,l,c){var i=e.useState({}),s=i[0],u=i[1],d=e.useState(null),v=d[0],f=d[1],h=e.useState({}),m=h[0],g=h[1],C=e.useState(void 0),_=C[0],b=C[1];return{startSession:e.useCallback(function(e){try{return Promise.resolve(function(i,s){try{var d=function(){function i(e){var n=function(e){try{var n,t;return(null==(t=((null==(n=JSON.parse(atob(e.split(".")[1])).video)?void 0:n.room)||"").match(/(conv_[a-zA-Z0-9]+)/))?void 0:t[0])||""}catch(e){return console.warn("Could not extract conversation ID from token"),""}}(s);l(n),o(s),r(!0)}var s;t("connecting"),null==n.current.onStatusChange||n.current.onStatusChange({status:"connecting"}),u(e.overrides||{}),f(e.customLlmExtraBody||null),g(e.dynamicVariables||{}),b(e.userId);var d=function(){if(!e.conversationToken)return function(){if(e.agentId)return console.info("Getting conversation token for agentId:",e.agentId),Promise.resolve(function(e,n){try{return Promise.resolve(fetch((n||"https://api.elevenlabs.io/v1/convai/conversation/token")+"?agent_id="+e+"&source=react_native_sdk&version="+a)).then(function(e){return Promise.resolve(e.json()).then(function(n){if(!e.ok)throw new Error("Failed to get conversation token: "+n.detail.message);if(!n.token)throw new Error("No conversation token received from API");return n.token})})}catch(e){return Promise.reject(e)}}(e.agentId,e.tokenFetchUrl||c)).then(function(e){s=e});throw new Error("Either conversationToken or agentId is required")}();s=e.conversationToken}();return d&&d.then?d.then(i):i()}()}catch(e){return s(e)}return d&&d.then?d.then(void 0,s):d}(0,function(e){throw t("disconnected"),null==n.current.onStatusChange||n.current.onStatusChange({status:"disconnected"}),null==n.current.onError||n.current.onError(e),e}))}catch(e){return Promise.reject(e)}},[n,t,r,o,l,c]),endSession:e.useCallback(function(){try{try{r(!1),o(""),t("disconnected"),null==n.current.onStatusChange||n.current.onStatusChange({status:"disconnected"}),null==n.current.onDisconnect||n.current.onDisconnect("User ended conversation")}catch(e){throw null==n.current.onError||n.current.onError(e),e}return Promise.resolve()}catch(e){return Promise.reject(e)}},[n,r,o,t]),overrides:s,customLlmExtraBody:v,dynamicVariables:m,userId:_}}(L,C,h,d,w,y),B=V.startSession,J=V.endSession,q=V.overrides,K=V.customLlmExtraBody,G=V.dynamicVariables,z=V.userId,W=function(t,r,o){var a=e.useState(!1),l=a[0],c=a[1],i=e.useState(null),s=i[0],u=i[1];return e.useEffect(function(){return function(){try{return Promise.resolve(n.AudioSession.startAudioSession()).then(function(){})}catch(e){return Promise.reject(e)}}(),function(){n.AudioSession.stopAudioSession()}},[]),{roomConnected:l,localParticipant:s,handleParticipantReady:e.useCallback(function(e){u(e)},[]),handleConnected:e.useCallback(function(){c(!0),r("connected"),null==t.current.onConnect||t.current.onConnect({conversationId:o})},[o,t,r]),handleDisconnected:e.useCallback(function(){c(!1),r("disconnected"),u(null),null==t.current.onDisconnect||t.current.onDisconnect("disconnected")},[t,r]),handleError:e.useCallback(function(e){console.error("LiveKit error:",e),null==t.current.onError||t.current.onError(e.message,void 0)},[t])}}(L,C,P),Z=W.roomConnected,H=W.localParticipant,Q=W.handleParticipantReady,X=W.handleConnected,Y=W.handleDisconnected,$=W.handleError,ee=r.default.useCallback(function(){R.current=1,F.current=1,M(!1),null==L.current.onCanSendFeedbackChange||L.current.onCanSendFeedbackChange({canSendFeedback:!1}),X()},[X,L]),ne=r.default.useCallback(function(){M(!1),Y()},[Y]),te=function(n,t,r){return{sendMessage:e.useCallback(function(e){try{if("connected"!==n||!t)return console.warn("Cannot send message: room not connected or no local participant"),Promise.resolve();var o=function(n,r){try{var o=(a=(new TextEncoder).encode(JSON.stringify(e)),Promise.resolve(t.publishData(a,{reliable:!0})).then(function(){}))}catch(e){return r(e)}var a;return o&&o.then?o.then(void 0,r):o}(0,function(e){console.error("Failed to send message via WebRTC:",e),console.error("Error details:",e),null==r.current.onError||r.current.onError(e)});return Promise.resolve(o&&o.then?o.then(function(){}):void 0)}catch(e){return Promise.reject(e)}},[n,t,r])}}(g,H,L),re=te.sendMessage,oe=r.default.useCallback(function(){var e=R.current!==F.current;D!==e&&(M(e),null==L.current.onCanSendFeedbackChange||L.current.onCanSendFeedbackChange({canSendFeedback:e}))},[D,L]),ae=r.default.useCallback(function(e){D?(re({type:"feedback",score:e?"like":"dislike",event_id:R.current}),F.current=R.current,oe()):console.warn(0===F.current?"Cannot send feedback: the conversation has not started yet.":"Cannot send feedback: feedback has already been sent for the current response.")},[D,re,oe]);r.default.useCallback(function(e){console.warn("setVolume is not yet implemented in React Native SDK")},[]);var le=r.default.useCallback(function(e){H&&H.setMicrophoneEnabled(!e)},[H]),ce=r.default.useCallback(function(e){R.current=e,oe()},[oe]),ie=r.default.useCallback(function(e){if(Q(e),H){var n=function(e){var n,t,r,o,l,c,i={type:"conversation_initiation_client_data"};return e.overrides&&(i.conversation_config_override={agent:{prompt:null==(n=e.overrides.agent)?void 0:n.prompt,first_message:null==(t=e.overrides.agent)?void 0:t.firstMessage,language:null==(r=e.overrides.agent)?void 0:r.language},tts:{voice_id:null==(o=e.overrides.tts)?void 0:o.voiceId},conversation:{text_only:null==(l=e.overrides.conversation)?void 0:l.textOnly},source_info:{source:"react_native_sdk",version:(null==(c=e.overrides)||null==(c=c.client)?void 0:c.version)||a}}),e.customLlmExtraBody&&(i.custom_llm_extra_body=e.customLlmExtraBody),e.dynamicVariables&&(i.dynamic_variables=e.dynamicVariables),e.userId&&(i.user_id=String(e.userId)),i}({overrides:q,customLlmExtraBody:K,dynamicVariables:G,userId:z});re(n)}},[Q,H,q,K,G,z,re]),se={startSession:B,endSession:J,status:g,isSpeaking:T,canSendFeedback:D,getId:function(){return P},setMicMuted:le,sendFeedback:ae,sendContextualUpdate:function(e){re({type:"contextual_update",text:e})},sendUserMessage:function(e){re({type:"user_message",text:e})},sendUserActivity:function(){re({type:"user_activity"})}},ue=r.default.useCallback(function(e){j.current=e},[]);/*#__PURE__*/return r.default.createElement(s.Provider,{value:{conversation:se,callbacksRef:L,serverUrl:b,tokenFetchUrl:y,clientTools:j.current,setCallbacks:N,setServerUrl:k,setTokenFetchUrl:S,setClientTools:ue}},/*#__PURE__*/r.default.createElement(c,{serverUrl:b,token:u,connect:f,onConnected:ee,onDisconnected:ne,onError:$,roomConnected:Z,callbacks:L.current,onParticipantReady:ie,sendMessage:re,clientTools:j.current,updateCurrentEventId:ce},l))},exports.useConversation=function(n){void 0===n&&(n={});var t=e.useContext(s);if(!t)throw new Error("useConversation must be used within ElevenLabsProvider");var o=n.serverUrl,a=n.tokenFetchUrl,l=n.clientTools,c=function(e,n){if(null==e)return{};var t={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(-1!==n.indexOf(r))continue;t[r]=e[r]}return t}(n,i);return r.default.useEffect(function(){o&&t.setServerUrl(o)},[t,o]),r.default.useEffect(function(){a&&t.setTokenFetchUrl(a)},[t,a]),l&&t.setClientTools(l),t.setCallbacks(c),t.conversation};
2
2
  //# sourceMappingURL=lib.js.map
package/dist/lib.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lib.js","sources":["../src/version.ts","../src/components/MessageHandler.tsx","../src/components/LiveKitRoomWrapper.tsx","../src/ElevenLabsProvider.tsx","../src/utils/constants.ts","../src/hooks/useConversationCallbacks.ts","../src/hooks/useConversationSession.ts","../src/utils/tokenUtils.ts","../src/hooks/useLiveKitRoom.ts","../src/hooks/useMessageSending.ts","../src/utils/overrides.ts"],"sourcesContent":["// This file is auto-generated during build\nexport const PACKAGE_VERSION = \"0.2.1\";\n","import { useEffect } from 'react';\nimport { useLocalParticipant, useDataChannel } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ClientToolsConfig, ClientToolCallEvent, ConversationEvent } from '../types';\nimport React from 'react';\n\ninterface MessageHandlerProps {\n onReady: (participant: LocalParticipant) => void;\n isConnected: boolean;\n callbacks: Callbacks;\n sendMessage: (message: unknown) => void;\n clientTools?: ClientToolsConfig['clientTools'];\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport function isValidEvent(event: any): event is ConversationEvent {\n return !!event.type;\n}\n\nexport const MessageHandler = ({\n onReady,\n isConnected,\n callbacks,\n sendMessage,\n clientTools = {},\n updateCurrentEventId\n}: MessageHandlerProps) => {\n const { localParticipant } = useLocalParticipant();\n\n // Track agent response count for synthetic event IDs (WebRTC mode)\n const agentResponseCountRef = React.useRef(1);\n\n useEffect(() => {\n if (isConnected && localParticipant) {\n onReady(localParticipant);\n }\n }, [isConnected, localParticipant, onReady]);\n\n const handleClientToolCall = async (clientToolCall: ClientToolCallEvent) => {\n if (\n Object.prototype.hasOwnProperty.call(\n clientTools,\n clientToolCall.client_tool_call.tool_name\n )\n ) {\n try {\n const result =\n (await clientTools[clientToolCall.client_tool_call.tool_name](\n clientToolCall.client_tool_call.parameters\n )) ?? \"Client tool execution successful.\"; // default client-tool call response\n\n // The API expects result to be a string, so we need to convert it if it's not already a string\n const formattedResult =\n typeof result === \"object\" ? JSON.stringify(result) : String(result);\n\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: formattedResult,\n is_error: false,\n });\n } catch (e) {\n const errorMessage = `Client tool execution failed with following error: ${(e as Error)?.message}`;\n callbacks.onError?.(errorMessage, {\n clientToolName: clientToolCall.client_tool_call.tool_name,\n });\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: `Client tool execution failed: ${(e as Error)?.message}`,\n is_error: true,\n });\n }\n } else {\n if (callbacks.onUnhandledClientToolCall) {\n callbacks.onUnhandledClientToolCall(clientToolCall);\n return;\n }\n\n const errorMessage = `Client tool with name ${clientToolCall.client_tool_call.tool_name} is not defined on client`;\n callbacks.onError?.(errorMessage, {\n clientToolName: clientToolCall.client_tool_call.tool_name,\n });\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: errorMessage,\n is_error: true,\n });\n }\n };\n\n const _ = useDataChannel((msg) => {\n const decoder = new TextDecoder();\n const message = JSON.parse(decoder.decode(msg.payload));\n\n if (!isValidEvent(message)) {\n callbacks.onDebug?.({\n type: \"invalid_event\",\n message,\n });\n return;\n }\n\n callbacks.onMessage?.({\n message,\n source: msg.from?.isAgent ? 'ai' : 'user',\n });\n\n if (msg.from?.isAgent) {\n callbacks.onModeChange?.({\n mode: msg.from?.isSpeaking ? 'speaking' : 'listening'\n });\n\n // Track agent responses for feedback (WebRTC mode needs synthetic event IDs)\n if (message.type === \"agent_response\" && updateCurrentEventId) {\n const eventId = agentResponseCountRef.current++;\n updateCurrentEventId(eventId);\n }\n }\n\n switch (message.type) {\n case \"ping\":\n sendMessage({\n type: \"pong\",\n event_id: message.ping_event.event_id,\n });\n break;\n case \"client_tool_call\":\n handleClientToolCall(message);\n break;\n default:\n callbacks.onDebug?.(message);\n break;\n }\n });\n\n return null;\n};","import React from 'react';\nimport { LiveKitRoom } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ClientToolsConfig } from '../types';\nimport { MessageHandler } from './MessageHandler';\n\ninterface LiveKitRoomWrapperProps {\n children: React.ReactNode;\n serverUrl: string;\n token: string;\n connect: boolean;\n onConnected: () => void;\n onDisconnected: () => void;\n onError: (error: Error) => void;\n roomConnected: boolean;\n callbacks: Callbacks;\n onParticipantReady: (participant: LocalParticipant) => void;\n sendMessage: (message: unknown) => void;\n clientTools: ClientToolsConfig['clientTools'];\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport const LiveKitRoomWrapper = ({\n children,\n serverUrl,\n token,\n connect,\n onConnected,\n onDisconnected,\n onError,\n roomConnected,\n callbacks,\n onParticipantReady,\n sendMessage,\n clientTools,\n updateCurrentEventId,\n}: LiveKitRoomWrapperProps) => {\n return (\n <LiveKitRoom\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n audio={true}\n video={false}\n options={{\n adaptiveStream: { pixelDensity: 'screen' },\n }}\n onConnected={onConnected}\n onDisconnected={onDisconnected}\n onError={onError}\n >\n <MessageHandler\n onReady={onParticipantReady}\n isConnected={roomConnected}\n callbacks={callbacks}\n sendMessage={sendMessage}\n clientTools={clientTools}\n updateCurrentEventId={updateCurrentEventId}\n />\n {children}\n </LiveKitRoom>\n );\n};","import React from 'react';\nimport { createContext, useContext, useState } from 'react';\nimport { registerGlobals } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ConversationConfig, ConversationStatus, ClientToolsConfig } from './types';\nimport { constructOverrides } from './utils/overrides';\nimport { DEFAULT_SERVER_URL } from './utils/constants';\nimport { useConversationCallbacks } from './hooks/useConversationCallbacks';\nimport { useConversationSession } from './hooks/useConversationSession';\nimport { useLiveKitRoom } from './hooks/useLiveKitRoom';\nimport { useMessageSending } from './hooks/useMessageSending';\nimport { LiveKitRoomWrapper } from './components/LiveKitRoomWrapper';\n\ninterface ConversationOptions extends Callbacks, Partial<ClientToolsConfig> {\n serverUrl?: string;\n tokenFetchUrl?: string;\n}\n\nexport interface Conversation {\n startSession: (config: ConversationConfig) => Promise<void>;\n endSession: () => Promise<void>;\n status: ConversationStatus;\n isSpeaking: boolean;\n // TODO: Implement setVolume when LiveKit React Native supports it\n // setVolume: (volume: number) => void;\n canSendFeedback: boolean;\n getId: () => string;\n sendFeedback: (like: boolean) => void;\n sendContextualUpdate: (text: string) => void;\n sendUserMessage: (text: string) => void;\n sendUserActivity: () => void;\n}\n\ninterface ElevenLabsContextType {\n conversation: Conversation;\n callbacksRef: { current: Callbacks };\n serverUrl: string;\n tokenFetchUrl?: string;\n clientTools: ClientToolsConfig['clientTools'];\n setCallbacks: (callbacks: Callbacks) => void;\n setServerUrl: (url: string) => void;\n setTokenFetchUrl: (url: string) => void;\n setClientTools: (tools: ClientToolsConfig['clientTools']) => void;\n}\n\nconst ElevenLabsContext = createContext<ElevenLabsContextType | null>(null);\n\nexport const useConversation = (options: ConversationOptions = {}): Conversation => {\n const context = useContext(ElevenLabsContext);\n if (!context) {\n throw new Error('useConversation must be used within ElevenLabsProvider');\n }\n\n const { serverUrl, tokenFetchUrl, clientTools, ...callbacks } = options;\n\n React.useEffect(() => {\n if (serverUrl) {\n context.setServerUrl(serverUrl);\n }\n }, [context, serverUrl]);\n\n React.useEffect(() => {\n if (tokenFetchUrl) {\n context.setTokenFetchUrl(tokenFetchUrl);\n }\n }, [context, tokenFetchUrl]);\n\n if (clientTools) {\n context.setClientTools(clientTools);\n }\n\n context.setCallbacks(callbacks);\n\n return context.conversation;\n};\n\ninterface ElevenLabsProviderProps {\n children: React.ReactNode;\n}\n\nexport const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children }) => {\n // Initialize globals on mount\n registerGlobals();\n\n // State management\n const [token, setToken] = useState('');\n const [connect, setConnect] = useState(false);\n const [status, setStatus] = useState<ConversationStatus>('disconnected');\n const [serverUrl, setServerUrl] = useState(DEFAULT_SERVER_URL);\n const [tokenFetchUrl, setTokenFetchUrl] = useState<string | undefined>(undefined);\n const [conversationId, setConversationId] = useState<string>('');\n const [isSpeaking, setIsSpeaking] = useState(false);\n const [canSendFeedback, setCanSendFeedback] = useState(false);\n\n // Feedback state tracking\n const currentEventIdRef = React.useRef(1);\n const lastFeedbackEventIdRef = React.useRef(1);\n\n // Use ref for clientTools to avoid re-renders (like callbacks)\n const clientToolsRef = React.useRef<ClientToolsConfig['clientTools']>({});\n\n // Custom hooks\n const { callbacksRef, setCallbacks: setCallbacksBase } = useConversationCallbacks();\n\n // Enhanced setCallbacks that wraps onModeChange to update isSpeaking state\n const setCallbacks = React.useCallback((callbacks: Callbacks) => {\n const wrappedCallbacks = {\n ...callbacks,\n onModeChange: (event: { mode: 'speaking' | 'listening' }) => {\n setIsSpeaking(event.mode === 'speaking');\n callbacks.onModeChange?.(event);\n }\n };\n setCallbacksBase(wrappedCallbacks);\n }, [setCallbacksBase]);\n\n const {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n } = useConversationSession(callbacksRef, setStatus, setConnect, setToken, setConversationId, tokenFetchUrl);\n\n const {\n roomConnected,\n localParticipant,\n handleParticipantReady,\n handleConnected,\n handleDisconnected,\n handleError,\n } = useLiveKitRoom(callbacksRef, setStatus, conversationId);\n\n // Enhanced connection handler to initialize feedback state\n const handleConnectedWithFeedback = React.useCallback(() => {\n // Reset feedback state when connecting\n currentEventIdRef.current = 1;\n lastFeedbackEventIdRef.current = 1;\n setCanSendFeedback(false);\n callbacksRef.current.onCanSendFeedbackChange?.({ canSendFeedback: false });\n\n handleConnected();\n }, [handleConnected, callbacksRef]);\n\n // Enhanced disconnection handler to reset feedback state\n const handleDisconnectedWithFeedback = React.useCallback(() => {\n setCanSendFeedback(false);\n handleDisconnected();\n }, [handleDisconnected]);\n\n const { sendMessage } = useMessageSending(status, localParticipant, callbacksRef);\n\n const updateCanSendFeedback = React.useCallback(() => {\n const newCanSendFeedback = currentEventIdRef.current !== lastFeedbackEventIdRef.current;\n\n if (canSendFeedback !== newCanSendFeedback) {\n setCanSendFeedback(newCanSendFeedback);\n callbacksRef.current.onCanSendFeedbackChange?.({ canSendFeedback: newCanSendFeedback });\n }\n }, [canSendFeedback, callbacksRef]);\n\n const sendFeedback = React.useCallback((like: boolean) => {\n if (!canSendFeedback) {\n console.warn(\n lastFeedbackEventIdRef.current === 0\n ? \"Cannot send feedback: the conversation has not started yet.\"\n : \"Cannot send feedback: feedback has already been sent for the current response.\"\n );\n return;\n }\n\n const feedbackMessage = {\n type: \"feedback\",\n score: like ? \"like\" : \"dislike\",\n event_id: currentEventIdRef.current,\n };\n\n sendMessage(feedbackMessage);\n lastFeedbackEventIdRef.current = currentEventIdRef.current;\n updateCanSendFeedback();\n }, [canSendFeedback, sendMessage, updateCanSendFeedback]);\n\n // setVolume placeholder (to be implemented when LiveKit supports it)\n const setVolume = React.useCallback((volume: number) => {\n console.warn('setVolume is not yet implemented in React Native SDK');\n }, []);\n\n const getId = () => conversationId;\n\n // Update current event ID for feedback tracking\n const updateCurrentEventId = React.useCallback((eventId: number) => {\n currentEventIdRef.current = eventId;\n updateCanSendFeedback();\n }, [updateCanSendFeedback]);\n\n // Handle participant ready with overrides\n const handleParticipantReadyWithOverrides = React.useCallback((participant: LocalParticipant) => {\n handleParticipantReady(participant);\n\n if (localParticipant) {\n const overridesEvent = constructOverrides({\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n });\n sendMessage(overridesEvent);\n }\n }, [handleParticipantReady, localParticipant, overrides, customLlmExtraBody, dynamicVariables, sendMessage]);\n\n const conversation: Conversation = {\n startSession,\n endSession,\n status,\n isSpeaking,\n // setVolume,\n canSendFeedback,\n getId,\n sendFeedback,\n sendContextualUpdate: (text: string) => {\n sendMessage({\n type: \"contextual_update\",\n text,\n });\n },\n sendUserMessage: (text: string) => {\n sendMessage({\n type: \"user_message\",\n text,\n });\n },\n sendUserActivity: () => {\n sendMessage({\n type: \"user_activity\",\n });\n },\n };\n\n // Create setClientTools function that only updates ref\n const setClientTools = React.useCallback((tools: ClientToolsConfig['clientTools']) => {\n clientToolsRef.current = tools;\n }, []);\n\n const contextValue: ElevenLabsContextType = {\n conversation,\n callbacksRef,\n serverUrl,\n tokenFetchUrl,\n clientTools: clientToolsRef.current,\n setCallbacks,\n setServerUrl,\n setTokenFetchUrl: setTokenFetchUrl,\n setClientTools,\n };\n\n return (\n <ElevenLabsContext.Provider value={contextValue}>\n <LiveKitRoomWrapper\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n onConnected={handleConnectedWithFeedback}\n onDisconnected={handleDisconnectedWithFeedback}\n onError={handleError}\n roomConnected={roomConnected}\n callbacks={callbacksRef.current}\n onParticipantReady={handleParticipantReadyWithOverrides}\n sendMessage={sendMessage}\n clientTools={clientToolsRef.current}\n updateCurrentEventId={updateCurrentEventId}\n >\n {children}\n </LiveKitRoomWrapper>\n </ElevenLabsContext.Provider>\n );\n};","export const DEFAULT_SERVER_URL = \"wss://livekit.rtc.elevenlabs.io\";\n","import { useRef, useCallback } from \"react\";\nimport type { Callbacks } from \"../types\";\n\nexport const useConversationCallbacks = () => {\n const callbacksRef = useRef<Callbacks>({});\n\n const setCallbacks = useCallback((callbacks: Callbacks) => {\n callbacksRef.current = callbacks;\n }, []);\n\n return {\n callbacksRef,\n setCallbacks,\n };\n};\n","import { useState, useCallback } from \"react\";\nimport type {\n ConversationConfig,\n ConversationStatus,\n Callbacks,\n} from \"../types\";\nimport {\n getConversationToken,\n extractConversationIdFromToken,\n} from \"../utils/tokenUtils\";\n\nexport const useConversationSession = (\n callbacksRef: { current: Callbacks },\n setStatus: (status: ConversationStatus) => void,\n setConnect: (connect: boolean) => void,\n setToken: (token: string) => void,\n setConversationId: (conversationId: string) => void,\n tokenFetchUrl?: string\n) => {\n const [overrides, setOverrides] = useState<ConversationConfig[\"overrides\"]>(\n {}\n );\n const [customLlmExtraBody, setCustomLlmExtraBody] =\n useState<ConversationConfig[\"customLlmExtraBody\"]>(null);\n const [dynamicVariables, setDynamicVariables] = useState<\n ConversationConfig[\"dynamicVariables\"]\n >({});\n\n const startSession = useCallback(\n async (config: ConversationConfig) => {\n try {\n setStatus(\"connecting\");\n callbacksRef.current.onStatusChange?.({ status: \"connecting\" });\n\n setOverrides(config.overrides || {});\n setCustomLlmExtraBody(config.customLlmExtraBody || null);\n setDynamicVariables(config.dynamicVariables || {});\n\n let conversationToken: string;\n\n if (config.conversationToken) {\n conversationToken = config.conversationToken;\n } else if (config.agentId) {\n console.info(\n \"Getting conversation token for agentId:\",\n config.agentId\n );\n // Use tokenFetchUrl from config first, then from hook parameter, then default\n const urlToUse = config.tokenFetchUrl || tokenFetchUrl;\n conversationToken = await getConversationToken(\n config.agentId,\n urlToUse\n );\n } else {\n throw new Error(\"Either conversationToken or agentId is required\");\n }\n\n const extractedConversationId =\n extractConversationIdFromToken(conversationToken);\n setConversationId(extractedConversationId);\n\n setToken(conversationToken);\n setConnect(true);\n } catch (error) {\n setStatus(\"disconnected\");\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n },\n [\n callbacksRef,\n setStatus,\n setConnect,\n setToken,\n setConversationId,\n tokenFetchUrl,\n ]\n );\n\n const endSession = useCallback(async () => {\n try {\n setConnect(false);\n setToken(\"\");\n setStatus(\"disconnected\");\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onDisconnect?.(\"User ended conversation\");\n } catch (error) {\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n }, [callbacksRef, setConnect, setToken, setStatus]);\n\n return {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n };\n};\n","import { PACKAGE_VERSION } from \"../version\";\n\nexport const extractConversationIdFromToken = (token: string): string => {\n try {\n const tokenPayload = JSON.parse(atob(token.split(\".\")[1]));\n const roomId = tokenPayload.video?.room || \"\";\n\n return roomId.match(/(conv_[a-zA-Z0-9]+)/)?.[0] || \"\";\n } catch (error) {\n console.warn(\"Could not extract conversation ID from token\");\n return \"\";\n }\n};\n\nexport const getConversationToken = async (\n agentId: string,\n tokenFetchUrl?: string\n): Promise<string> => {\n const baseUrl =\n tokenFetchUrl || \"https://api.elevenlabs.io/v1/convai/conversation/token\";\n const response = await fetch(\n `${baseUrl}?agent_id=${agentId}&source=react_native_sdk&version=${PACKAGE_VERSION}`\n );\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(`Failed to get conversation token: ${data.detail.message}`);\n }\n\n if (!data.token) {\n throw new Error(\"No conversation token received from API\");\n }\n\n return data.token;\n};\n","import { useState, useEffect, useCallback } from \"react\";\nimport { AudioSession } from \"@livekit/react-native\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type { ConversationStatus, Callbacks } from \"../types\";\n\nexport const useLiveKitRoom = (\n callbacksRef: { current: Callbacks },\n setStatus: (status: ConversationStatus) => void,\n conversationId: string\n) => {\n const [roomConnected, setRoomConnected] = useState(false);\n const [localParticipant, setLocalParticipant] =\n useState<LocalParticipant | null>(null);\n\n useEffect(() => {\n const start = async () => {\n await AudioSession.startAudioSession();\n };\n\n start();\n return () => {\n AudioSession.stopAudioSession();\n };\n }, []);\n\n const handleParticipantReady = useCallback(\n (participant: LocalParticipant) => {\n setLocalParticipant(participant);\n },\n []\n );\n\n const handleConnected = useCallback(() => {\n setRoomConnected(true);\n setStatus(\"connected\");\n callbacksRef.current.onConnect?.({ conversationId });\n }, [conversationId, callbacksRef, setStatus]);\n\n const handleDisconnected = useCallback(() => {\n setRoomConnected(false);\n setStatus(\"disconnected\");\n setLocalParticipant(null);\n callbacksRef.current.onDisconnect?.(\"disconnected\");\n }, [callbacksRef, setStatus]);\n\n const handleError = useCallback(\n (error: Error) => {\n console.error(\"LiveKit error:\", error);\n callbacksRef.current.onError?.(error.message, undefined);\n },\n [callbacksRef]\n );\n\n return {\n roomConnected,\n localParticipant,\n handleParticipantReady,\n handleConnected,\n handleDisconnected,\n handleError,\n };\n};\n","import { useCallback } from \"react\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type { ConversationStatus, Callbacks } from \"../types\";\n\nexport const useMessageSending = (\n status: ConversationStatus,\n localParticipant: LocalParticipant | null,\n callbacksRef: { current: Callbacks }\n) => {\n const sendMessage = useCallback(\n async (message: unknown) => {\n if (status !== \"connected\" || !localParticipant) {\n console.warn(\n \"Cannot send message: room not connected or no local participant\"\n );\n return;\n }\n try {\n const encoder = new TextEncoder();\n const data = encoder.encode(JSON.stringify(message));\n\n await localParticipant.publishData(data, { reliable: true });\n } catch (error) {\n console.error(\"Failed to send message via WebRTC:\", error);\n console.error(\"Error details:\", error);\n callbacksRef.current.onError?.(error as string);\n }\n },\n [status, localParticipant, callbacksRef]\n );\n\n return { sendMessage };\n};\n","import type { ConversationConfig, InitiationClientDataEvent } from \"../types\";\nimport { PACKAGE_VERSION } from \"../version\";\n\nexport function constructOverrides(\n config: ConversationConfig\n): InitiationClientDataEvent {\n const overridesEvent: InitiationClientDataEvent = {\n type: \"conversation_initiation_client_data\",\n };\n\n if (config.overrides) {\n overridesEvent.conversation_config_override = {\n agent: {\n prompt: config.overrides.agent?.prompt,\n first_message: config.overrides.agent?.firstMessage,\n language: config.overrides.agent?.language,\n },\n tts: {\n voice_id: config.overrides.tts?.voiceId,\n },\n conversation: {\n text_only: config.overrides.conversation?.textOnly,\n },\n source_info: {\n source: \"react_native_sdk\",\n version: config.overrides?.client?.version || PACKAGE_VERSION,\n },\n };\n }\n\n if (config.customLlmExtraBody) {\n overridesEvent.custom_llm_extra_body = config.customLlmExtraBody;\n }\n\n if (config.dynamicVariables) {\n overridesEvent.dynamic_variables = config.dynamicVariables;\n }\n\n if (config.userId) {\n overridesEvent.user_id = config.userId;\n }\n\n return overridesEvent;\n}\n"],"names":["PACKAGE_VERSION","MessageHandler","_ref","onReady","isConnected","callbacks","sendMessage","_ref$clientTools","clientTools","updateCurrentEventId","localParticipant","useLocalParticipant","agentResponseCountRef","React","useRef","useEffect","useDataChannel","msg","_msg$from","_msg$from2","decoder","TextDecoder","message","JSON","parse","decode","payload","type","_msg$from3","onMessage","source","from","isAgent","onModeChange","mode","isSpeaking","eventId","current","event_id","ping_event","clientToolCall","Promise","resolve","Object","prototype","hasOwnProperty","call","client_tool_call","tool_name","_temp","parameters","then","result","formattedResult","stringify","String","tool_call_id","is_error","_catch","e","onError","clientToolName","onUnhandledClientToolCall","errorMessage","reject","handleClientToolCall","onDebug","LiveKitRoomWrapper","children","createElement","LiveKitRoom","serverUrl","token","connect","audio","video","options","adaptiveStream","pixelDensity","onConnected","onDisconnected","onParticipantReady","roomConnected","_excluded","ElevenLabsContext","createContext","registerGlobals","_useState","useState","setToken","_useState2","setConnect","_useState3","status","setStatus","_useState4","setServerUrl","_useState5","undefined","tokenFetchUrl","setTokenFetchUrl","_useState6","conversationId","setConversationId","_useState7","setIsSpeaking","_useState8","canSendFeedback","setCanSendFeedback","currentEventIdRef","lastFeedbackEventIdRef","clientToolsRef","_useConversationCallb","callbacksRef","setCallbacks","useCallback","useConversationCallbacks","setCallbacksBase","wrappedCallbacks","_extends","event","_useConversationSessi","overrides","setOverrides","customLlmExtraBody","setCustomLlmExtraBody","dynamicVariables","setDynamicVariables","startSession","config","_temp2","_result2","extractedConversationId","_tokenPayload$video","_roomId$match","atob","split","room","match","error","console","warn","extractConversationIdFromToken","conversationToken","onStatusChange","agentId","info","fetch","response","json","data","ok","Error","detail","getConversationToken","_getConversationToken","endSession","onDisconnect","useConversationSession","_useLiveKitRoom","setRoomConnected","setLocalParticipant","AudioSession","startAudioSession","start","stopAudioSession","handleParticipantReady","participant","handleConnected","onConnect","handleDisconnected","handleError","useLiveKitRoom","handleConnectedWithFeedback","onCanSendFeedbackChange","handleDisconnectedWithFeedback","_useMessageSending","TextEncoder","encode","publishData","reliable","useMessageSending","updateCanSendFeedback","newCanSendFeedback","sendFeedback","like","score","volume","handleParticipantReadyWithOverrides","overridesEvent","_config$overrides$age","_config$overrides$age2","_config$overrides$age3","_config$overrides$tts","_config$overrides$con","_config$overrides","conversation_config_override","agent","prompt","first_message","firstMessage","language","tts","voice_id","voiceId","conversation","text_only","textOnly","source_info","version","client","custom_llm_extra_body","dynamic_variables","userId","user_id","constructOverrides","getId","sendContextualUpdate","text","sendUserMessage","sendUserActivity","setClientTools","tools","Provider","value","context","useContext","_objectWithoutPropertiesLoose"],"mappings":"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"}
1
+ {"version":3,"file":"lib.js","sources":["../src/version.ts","../src/components/MessageHandler.tsx","../src/components/LiveKitRoomWrapper.tsx","../src/ElevenLabsProvider.tsx","../src/utils/constants.ts","../src/hooks/useConversationCallbacks.ts","../src/hooks/useConversationSession.ts","../src/utils/tokenUtils.ts","../src/hooks/useLiveKitRoom.ts","../src/hooks/useMessageSending.ts","../src/utils/overrides.ts"],"sourcesContent":["// This file is auto-generated during build\nexport const PACKAGE_VERSION = \"0.3.0\";\n","import { useEffect } from 'react';\nimport { useLocalParticipant, useDataChannel } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ClientToolsConfig, ClientToolCallEvent, ConversationEvent } from '../types';\nimport React from 'react';\n\ninterface MessageHandlerProps {\n onReady: (participant: LocalParticipant) => void;\n isConnected: boolean;\n callbacks: Callbacks;\n sendMessage: (message: unknown) => void;\n clientTools?: ClientToolsConfig['clientTools'];\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport function isValidEvent(event: any): event is ConversationEvent {\n return !!event.type;\n}\n\nexport const MessageHandler = ({\n onReady,\n isConnected,\n callbacks,\n sendMessage,\n clientTools = {},\n updateCurrentEventId\n}: MessageHandlerProps) => {\n const { localParticipant } = useLocalParticipant();\n\n // Track agent response count for synthetic event IDs (WebRTC mode)\n const agentResponseCountRef = React.useRef(1);\n\n useEffect(() => {\n if (isConnected && localParticipant) {\n onReady(localParticipant);\n }\n }, [isConnected, localParticipant, onReady]);\n\n const handleClientToolCall = async (clientToolCall: ClientToolCallEvent) => {\n if (\n Object.prototype.hasOwnProperty.call(\n clientTools,\n clientToolCall.client_tool_call.tool_name\n )\n ) {\n try {\n const result =\n (await clientTools[clientToolCall.client_tool_call.tool_name](\n clientToolCall.client_tool_call.parameters\n )) ?? \"Client tool execution successful.\"; // default client-tool call response\n\n // The API expects result to be a string, so we need to convert it if it's not already a string\n const formattedResult =\n typeof result === \"object\" ? JSON.stringify(result) : String(result);\n\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: formattedResult,\n is_error: false,\n });\n } catch (e) {\n const errorMessage = `Client tool execution failed with following error: ${(e as Error)?.message}`;\n callbacks.onError?.(errorMessage, {\n clientToolName: clientToolCall.client_tool_call.tool_name,\n });\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: `Client tool execution failed: ${(e as Error)?.message}`,\n is_error: true,\n });\n }\n } else {\n if (callbacks.onUnhandledClientToolCall) {\n callbacks.onUnhandledClientToolCall(clientToolCall);\n return;\n }\n\n const errorMessage = `Client tool with name ${clientToolCall.client_tool_call.tool_name} is not defined on client`;\n callbacks.onError?.(errorMessage, {\n clientToolName: clientToolCall.client_tool_call.tool_name,\n });\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: errorMessage,\n is_error: true,\n });\n }\n };\n\n const _ = useDataChannel((msg) => {\n const decoder = new TextDecoder();\n const message = JSON.parse(decoder.decode(msg.payload));\n\n if (!isValidEvent(message)) {\n callbacks.onDebug?.({\n type: \"invalid_event\",\n message,\n });\n return;\n }\n\n callbacks.onMessage?.({\n message,\n source: msg.from?.isAgent ? 'ai' : 'user',\n });\n\n if (msg.from?.isAgent) {\n callbacks.onModeChange?.({\n mode: msg.from?.isSpeaking ? 'speaking' : 'listening'\n });\n\n // Track agent responses for feedback (WebRTC mode needs synthetic event IDs)\n if (message.type === \"agent_response\" && updateCurrentEventId) {\n const eventId = agentResponseCountRef.current++;\n updateCurrentEventId(eventId);\n }\n }\n\n switch (message.type) {\n case \"ping\":\n sendMessage({\n type: \"pong\",\n event_id: message.ping_event.event_id,\n });\n break;\n case \"client_tool_call\":\n handleClientToolCall(message);\n break;\n default:\n callbacks.onDebug?.(message);\n break;\n }\n });\n\n return null;\n};","import React from 'react';\nimport { LiveKitRoom } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ClientToolsConfig } from '../types';\nimport { MessageHandler } from './MessageHandler';\n\ninterface LiveKitRoomWrapperProps {\n children: React.ReactNode;\n serverUrl: string;\n token: string;\n connect: boolean;\n onConnected: () => void;\n onDisconnected: () => void;\n onError: (error: Error) => void;\n roomConnected: boolean;\n callbacks: Callbacks;\n onParticipantReady: (participant: LocalParticipant) => void;\n sendMessage: (message: unknown) => void;\n clientTools: ClientToolsConfig['clientTools'];\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport const LiveKitRoomWrapper = ({\n children,\n serverUrl,\n token,\n connect,\n onConnected,\n onDisconnected,\n onError,\n roomConnected,\n callbacks,\n onParticipantReady,\n sendMessage,\n clientTools,\n updateCurrentEventId,\n}: LiveKitRoomWrapperProps) => {\n return (\n <LiveKitRoom\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n audio={true}\n video={false}\n options={{\n adaptiveStream: { pixelDensity: 'screen' },\n }}\n onConnected={onConnected}\n onDisconnected={onDisconnected}\n onError={onError}\n >\n <MessageHandler\n onReady={onParticipantReady}\n isConnected={roomConnected}\n callbacks={callbacks}\n sendMessage={sendMessage}\n clientTools={clientTools}\n updateCurrentEventId={updateCurrentEventId}\n />\n {children}\n </LiveKitRoom>\n );\n};","import React from 'react';\nimport { createContext, useContext, useState } from 'react';\nimport { registerGlobals } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ConversationConfig, ConversationStatus, ClientToolsConfig } from './types';\nimport { constructOverrides } from './utils/overrides';\nimport { DEFAULT_SERVER_URL } from './utils/constants';\nimport { useConversationCallbacks } from './hooks/useConversationCallbacks';\nimport { useConversationSession } from './hooks/useConversationSession';\nimport { useLiveKitRoom } from './hooks/useLiveKitRoom';\nimport { useMessageSending } from './hooks/useMessageSending';\nimport { LiveKitRoomWrapper } from './components/LiveKitRoomWrapper';\n\ninterface ConversationOptions extends Callbacks, Partial<ClientToolsConfig> {\n serverUrl?: string;\n tokenFetchUrl?: string;\n}\n\nexport interface Conversation {\n startSession: (config: ConversationConfig) => Promise<void>;\n endSession: () => Promise<void>;\n status: ConversationStatus;\n isSpeaking: boolean;\n // TODO: Implement setVolume when LiveKit React Native supports it\n // setVolume: (volume: number) => void;\n canSendFeedback: boolean;\n getId: () => string;\n sendFeedback: (like: boolean) => void;\n sendContextualUpdate: (text: string) => void;\n sendUserMessage: (text: string) => void;\n sendUserActivity: () => void;\n setMicMuted: (muted: boolean) => void;\n}\n\ninterface ElevenLabsContextType {\n conversation: Conversation;\n callbacksRef: { current: Callbacks };\n serverUrl: string;\n tokenFetchUrl?: string;\n clientTools: ClientToolsConfig['clientTools'];\n setCallbacks: (callbacks: Callbacks) => void;\n setServerUrl: (url: string) => void;\n setTokenFetchUrl: (url: string) => void;\n setClientTools: (tools: ClientToolsConfig['clientTools']) => void;\n}\n\nconst ElevenLabsContext = createContext<ElevenLabsContextType | null>(null);\n\nexport const useConversation = (options: ConversationOptions = {}): Conversation => {\n const context = useContext(ElevenLabsContext);\n if (!context) {\n throw new Error('useConversation must be used within ElevenLabsProvider');\n }\n\n const { serverUrl, tokenFetchUrl, clientTools, ...callbacks } = options;\n\n React.useEffect(() => {\n if (serverUrl) {\n context.setServerUrl(serverUrl);\n }\n }, [context, serverUrl]);\n\n React.useEffect(() => {\n if (tokenFetchUrl) {\n context.setTokenFetchUrl(tokenFetchUrl);\n }\n }, [context, tokenFetchUrl]);\n\n if (clientTools) {\n context.setClientTools(clientTools);\n }\n\n context.setCallbacks(callbacks);\n\n return context.conversation;\n};\n\ninterface ElevenLabsProviderProps {\n children: React.ReactNode;\n}\n\nexport const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children }) => {\n // Initialize globals on mount\n registerGlobals();\n\n // State management\n const [token, setToken] = useState('');\n const [connect, setConnect] = useState(false);\n const [status, setStatus] = useState<ConversationStatus>('disconnected');\n const [serverUrl, setServerUrl] = useState(DEFAULT_SERVER_URL);\n const [tokenFetchUrl, setTokenFetchUrl] = useState<string | undefined>(undefined);\n const [conversationId, setConversationId] = useState<string>('');\n const [isSpeaking, setIsSpeaking] = useState(false);\n const [canSendFeedback, setCanSendFeedback] = useState(false);\n\n // Feedback state tracking\n const currentEventIdRef = React.useRef(1);\n const lastFeedbackEventIdRef = React.useRef(1);\n\n // Use ref for clientTools to avoid re-renders (like callbacks)\n const clientToolsRef = React.useRef<ClientToolsConfig['clientTools']>({});\n\n // Custom hooks\n const { callbacksRef, setCallbacks: setCallbacksBase } = useConversationCallbacks();\n\n // Enhanced setCallbacks that wraps onModeChange to update isSpeaking state\n const setCallbacks = React.useCallback((callbacks: Callbacks) => {\n const wrappedCallbacks = {\n ...callbacks,\n onModeChange: (event: { mode: 'speaking' | 'listening' }) => {\n setIsSpeaking(event.mode === 'speaking');\n callbacks.onModeChange?.(event);\n }\n };\n setCallbacksBase(wrappedCallbacks);\n }, [setCallbacksBase]);\n\n const {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n } = useConversationSession(callbacksRef, setStatus, setConnect, setToken, setConversationId, tokenFetchUrl);\n\n const {\n roomConnected,\n localParticipant,\n handleParticipantReady,\n handleConnected,\n handleDisconnected,\n handleError,\n } = useLiveKitRoom(callbacksRef, setStatus, conversationId);\n\n // Enhanced connection handler to initialize feedback state\n const handleConnectedWithFeedback = React.useCallback(() => {\n // Reset feedback state when connecting\n currentEventIdRef.current = 1;\n lastFeedbackEventIdRef.current = 1;\n setCanSendFeedback(false);\n callbacksRef.current.onCanSendFeedbackChange?.({ canSendFeedback: false });\n\n handleConnected();\n }, [handleConnected, callbacksRef]);\n\n // Enhanced disconnection handler to reset feedback state\n const handleDisconnectedWithFeedback = React.useCallback(() => {\n setCanSendFeedback(false);\n handleDisconnected();\n }, [handleDisconnected]);\n\n const { sendMessage } = useMessageSending(status, localParticipant, callbacksRef);\n\n const updateCanSendFeedback = React.useCallback(() => {\n const newCanSendFeedback = currentEventIdRef.current !== lastFeedbackEventIdRef.current;\n\n if (canSendFeedback !== newCanSendFeedback) {\n setCanSendFeedback(newCanSendFeedback);\n callbacksRef.current.onCanSendFeedbackChange?.({ canSendFeedback: newCanSendFeedback });\n }\n }, [canSendFeedback, callbacksRef]);\n\n const sendFeedback = React.useCallback((like: boolean) => {\n if (!canSendFeedback) {\n console.warn(\n lastFeedbackEventIdRef.current === 0\n ? \"Cannot send feedback: the conversation has not started yet.\"\n : \"Cannot send feedback: feedback has already been sent for the current response.\"\n );\n return;\n }\n\n const feedbackMessage = {\n type: \"feedback\",\n score: like ? \"like\" : \"dislike\",\n event_id: currentEventIdRef.current,\n };\n\n sendMessage(feedbackMessage);\n lastFeedbackEventIdRef.current = currentEventIdRef.current;\n updateCanSendFeedback();\n }, [canSendFeedback, sendMessage, updateCanSendFeedback]);\n\n // setVolume placeholder (to be implemented when LiveKit supports it)\n const setVolume = React.useCallback((volume: number) => {\n console.warn('setVolume is not yet implemented in React Native SDK');\n }, []);\n\n const getId = () => conversationId;\n\n const setMicMuted = React.useCallback((muted: boolean) => {\n if (localParticipant) {\n localParticipant.setMicrophoneEnabled(!muted);\n }\n }, [localParticipant]);\n\n // Update current event ID for feedback tracking\n const updateCurrentEventId = React.useCallback((eventId: number) => {\n currentEventIdRef.current = eventId;\n updateCanSendFeedback();\n }, [updateCanSendFeedback]);\n\n // Handle participant ready with overrides\n const handleParticipantReadyWithOverrides = React.useCallback((participant: LocalParticipant) => {\n handleParticipantReady(participant);\n\n if (localParticipant) {\n const overridesEvent = constructOverrides({\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n });\n sendMessage(overridesEvent);\n }\n }, [handleParticipantReady, localParticipant, overrides, customLlmExtraBody, dynamicVariables, userId, sendMessage]);\n\n const conversation: Conversation = {\n startSession,\n endSession,\n status,\n isSpeaking,\n // setVolume,\n canSendFeedback,\n getId,\n setMicMuted,\n sendFeedback,\n sendContextualUpdate: (text: string) => {\n sendMessage({\n type: \"contextual_update\",\n text,\n });\n },\n sendUserMessage: (text: string) => {\n sendMessage({\n type: \"user_message\",\n text,\n });\n },\n sendUserActivity: () => {\n sendMessage({\n type: \"user_activity\",\n });\n },\n };\n\n // Create setClientTools function that only updates ref\n const setClientTools = React.useCallback((tools: ClientToolsConfig['clientTools']) => {\n clientToolsRef.current = tools;\n }, []);\n\n const contextValue: ElevenLabsContextType = {\n conversation,\n callbacksRef,\n serverUrl,\n tokenFetchUrl,\n clientTools: clientToolsRef.current,\n setCallbacks,\n setServerUrl,\n setTokenFetchUrl: setTokenFetchUrl,\n setClientTools,\n };\n\n return (\n <ElevenLabsContext.Provider value={contextValue}>\n <LiveKitRoomWrapper\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n onConnected={handleConnectedWithFeedback}\n onDisconnected={handleDisconnectedWithFeedback}\n onError={handleError}\n roomConnected={roomConnected}\n callbacks={callbacksRef.current}\n onParticipantReady={handleParticipantReadyWithOverrides}\n sendMessage={sendMessage}\n clientTools={clientToolsRef.current}\n updateCurrentEventId={updateCurrentEventId}\n >\n {children}\n </LiveKitRoomWrapper>\n </ElevenLabsContext.Provider>\n );\n};","export const DEFAULT_SERVER_URL = \"wss://livekit.rtc.elevenlabs.io\";\n","import { useRef, useCallback } from \"react\";\nimport type { Callbacks } from \"../types\";\n\nexport const useConversationCallbacks = () => {\n const callbacksRef = useRef<Callbacks>({});\n\n const setCallbacks = useCallback((callbacks: Callbacks) => {\n callbacksRef.current = callbacks;\n }, []);\n\n return {\n callbacksRef,\n setCallbacks,\n };\n};\n","import { useState, useCallback } from \"react\";\nimport type {\n ConversationConfig,\n ConversationStatus,\n Callbacks,\n} from \"../types\";\nimport {\n getConversationToken,\n extractConversationIdFromToken,\n} from \"../utils/tokenUtils\";\n\nexport const useConversationSession = (\n callbacksRef: { current: Callbacks },\n setStatus: (status: ConversationStatus) => void,\n setConnect: (connect: boolean) => void,\n setToken: (token: string) => void,\n setConversationId: (conversationId: string) => void,\n tokenFetchUrl?: string\n) => {\n const [overrides, setOverrides] = useState<ConversationConfig[\"overrides\"]>(\n {}\n );\n const [customLlmExtraBody, setCustomLlmExtraBody] =\n useState<ConversationConfig[\"customLlmExtraBody\"]>(null);\n const [dynamicVariables, setDynamicVariables] = useState<\n ConversationConfig[\"dynamicVariables\"]\n >({});\n const [userId, setUserId] = useState<ConversationConfig[\"userId\"]>(undefined);\n\n const startSession = useCallback(\n async (config: ConversationConfig) => {\n try {\n setStatus(\"connecting\");\n callbacksRef.current.onStatusChange?.({ status: \"connecting\" });\n\n setOverrides(config.overrides || {});\n setCustomLlmExtraBody(config.customLlmExtraBody || null);\n setDynamicVariables(config.dynamicVariables || {});\n setUserId(config.userId);\n\n let conversationToken: string;\n\n if (config.conversationToken) {\n conversationToken = config.conversationToken;\n } else if (config.agentId) {\n console.info(\n \"Getting conversation token for agentId:\",\n config.agentId\n );\n // Use tokenFetchUrl from config first, then from hook parameter, then default\n const urlToUse = config.tokenFetchUrl || tokenFetchUrl;\n conversationToken = await getConversationToken(\n config.agentId,\n urlToUse\n );\n } else {\n throw new Error(\"Either conversationToken or agentId is required\");\n }\n\n const extractedConversationId =\n extractConversationIdFromToken(conversationToken);\n setConversationId(extractedConversationId);\n\n setToken(conversationToken);\n setConnect(true);\n } catch (error) {\n setStatus(\"disconnected\");\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n },\n [\n callbacksRef,\n setStatus,\n setConnect,\n setToken,\n setConversationId,\n tokenFetchUrl,\n ]\n );\n\n const endSession = useCallback(async () => {\n try {\n setConnect(false);\n setToken(\"\");\n setStatus(\"disconnected\");\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onDisconnect?.(\"User ended conversation\");\n } catch (error) {\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n }, [callbacksRef, setConnect, setToken, setStatus]);\n\n return {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n };\n};\n","import { PACKAGE_VERSION } from \"../version\";\n\nexport const extractConversationIdFromToken = (token: string): string => {\n try {\n const tokenPayload = JSON.parse(atob(token.split(\".\")[1]));\n const roomId = tokenPayload.video?.room || \"\";\n\n return roomId.match(/(conv_[a-zA-Z0-9]+)/)?.[0] || \"\";\n } catch (error) {\n console.warn(\"Could not extract conversation ID from token\");\n return \"\";\n }\n};\n\nexport const getConversationToken = async (\n agentId: string,\n tokenFetchUrl?: string\n): Promise<string> => {\n const baseUrl =\n tokenFetchUrl || \"https://api.elevenlabs.io/v1/convai/conversation/token\";\n const response = await fetch(\n `${baseUrl}?agent_id=${agentId}&source=react_native_sdk&version=${PACKAGE_VERSION}`\n );\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(`Failed to get conversation token: ${data.detail.message}`);\n }\n\n if (!data.token) {\n throw new Error(\"No conversation token received from API\");\n }\n\n return data.token;\n};\n","import { useState, useEffect, useCallback } from \"react\";\nimport { AudioSession } from \"@livekit/react-native\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type { ConversationStatus, Callbacks } from \"../types\";\n\nexport const useLiveKitRoom = (\n callbacksRef: { current: Callbacks },\n setStatus: (status: ConversationStatus) => void,\n conversationId: string\n) => {\n const [roomConnected, setRoomConnected] = useState(false);\n const [localParticipant, setLocalParticipant] =\n useState<LocalParticipant | null>(null);\n\n useEffect(() => {\n const start = async () => {\n await AudioSession.startAudioSession();\n };\n\n start();\n return () => {\n AudioSession.stopAudioSession();\n };\n }, []);\n\n const handleParticipantReady = useCallback(\n (participant: LocalParticipant) => {\n setLocalParticipant(participant);\n },\n []\n );\n\n const handleConnected = useCallback(() => {\n setRoomConnected(true);\n setStatus(\"connected\");\n callbacksRef.current.onConnect?.({ conversationId });\n }, [conversationId, callbacksRef, setStatus]);\n\n const handleDisconnected = useCallback(() => {\n setRoomConnected(false);\n setStatus(\"disconnected\");\n setLocalParticipant(null);\n callbacksRef.current.onDisconnect?.(\"disconnected\");\n }, [callbacksRef, setStatus]);\n\n const handleError = useCallback(\n (error: Error) => {\n console.error(\"LiveKit error:\", error);\n callbacksRef.current.onError?.(error.message, undefined);\n },\n [callbacksRef]\n );\n\n return {\n roomConnected,\n localParticipant,\n handleParticipantReady,\n handleConnected,\n handleDisconnected,\n handleError,\n };\n};\n","import { useCallback } from \"react\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type { ConversationStatus, Callbacks } from \"../types\";\n\nexport const useMessageSending = (\n status: ConversationStatus,\n localParticipant: LocalParticipant | null,\n callbacksRef: { current: Callbacks }\n) => {\n const sendMessage = useCallback(\n async (message: unknown) => {\n if (status !== \"connected\" || !localParticipant) {\n console.warn(\n \"Cannot send message: room not connected or no local participant\"\n );\n return;\n }\n try {\n const encoder = new TextEncoder();\n const data = encoder.encode(JSON.stringify(message));\n\n await localParticipant.publishData(data, { reliable: true });\n } catch (error) {\n console.error(\"Failed to send message via WebRTC:\", error);\n console.error(\"Error details:\", error);\n callbacksRef.current.onError?.(error as string);\n }\n },\n [status, localParticipant, callbacksRef]\n );\n\n return { sendMessage };\n};\n","import type { ConversationConfig, InitiationClientDataEvent } from \"../types\";\nimport { PACKAGE_VERSION } from \"../version\";\n\nexport function constructOverrides(\n config: ConversationConfig\n): InitiationClientDataEvent {\n const overridesEvent: InitiationClientDataEvent = {\n type: \"conversation_initiation_client_data\",\n };\n\n if (config.overrides) {\n overridesEvent.conversation_config_override = {\n agent: {\n prompt: config.overrides.agent?.prompt,\n first_message: config.overrides.agent?.firstMessage,\n language: config.overrides.agent?.language,\n },\n tts: {\n voice_id: config.overrides.tts?.voiceId,\n },\n conversation: {\n text_only: config.overrides.conversation?.textOnly,\n },\n source_info: {\n source: \"react_native_sdk\",\n version: config.overrides?.client?.version || PACKAGE_VERSION,\n },\n };\n }\n\n if (config.customLlmExtraBody) {\n overridesEvent.custom_llm_extra_body = config.customLlmExtraBody;\n }\n\n if (config.dynamicVariables) {\n overridesEvent.dynamic_variables = config.dynamicVariables;\n }\n\n if (config.userId) {\n overridesEvent.user_id = String(config.userId);\n }\n\n return overridesEvent;\n}\n"],"names":["PACKAGE_VERSION","MessageHandler","_ref","onReady","isConnected","callbacks","sendMessage","_ref$clientTools","clientTools","updateCurrentEventId","localParticipant","useLocalParticipant","agentResponseCountRef","React","useRef","useEffect","useDataChannel","msg","_msg$from","_msg$from2","decoder","TextDecoder","message","JSON","parse","decode","payload","type","_msg$from3","onMessage","source","from","isAgent","onModeChange","mode","isSpeaking","eventId","current","event_id","ping_event","clientToolCall","Promise","resolve","Object","prototype","hasOwnProperty","call","client_tool_call","tool_name","_temp","parameters","then","result","formattedResult","stringify","String","tool_call_id","is_error","_catch","e","onError","clientToolName","onUnhandledClientToolCall","errorMessage","reject","handleClientToolCall","onDebug","LiveKitRoomWrapper","children","createElement","LiveKitRoom","serverUrl","token","connect","audio","video","options","adaptiveStream","pixelDensity","onConnected","onDisconnected","onParticipantReady","roomConnected","_excluded","ElevenLabsContext","createContext","registerGlobals","_useState","useState","setToken","_useState2","setConnect","_useState3","status","setStatus","_useState4","setServerUrl","_useState5","undefined","tokenFetchUrl","setTokenFetchUrl","_useState6","conversationId","setConversationId","_useState7","setIsSpeaking","_useState8","canSendFeedback","setCanSendFeedback","currentEventIdRef","lastFeedbackEventIdRef","clientToolsRef","_useConversationCallb","callbacksRef","setCallbacks","useCallback","useConversationCallbacks","setCallbacksBase","wrappedCallbacks","_extends","event","_useConversationSessi","overrides","setOverrides","customLlmExtraBody","setCustomLlmExtraBody","dynamicVariables","setDynamicVariables","userId","setUserId","startSession","config","_temp2","_result2","extractedConversationId","_tokenPayload$video","_roomId$match","atob","split","room","match","error","console","warn","extractConversationIdFromToken","conversationToken","onStatusChange","agentId","info","fetch","response","json","data","ok","Error","detail","getConversationToken","_getConversationToken","endSession","onDisconnect","useConversationSession","_useLiveKitRoom","setRoomConnected","setLocalParticipant","AudioSession","startAudioSession","start","stopAudioSession","handleParticipantReady","participant","handleConnected","onConnect","handleDisconnected","handleError","useLiveKitRoom","handleConnectedWithFeedback","onCanSendFeedbackChange","handleDisconnectedWithFeedback","_useMessageSending","TextEncoder","encode","publishData","reliable","useMessageSending","updateCanSendFeedback","newCanSendFeedback","sendFeedback","like","score","volume","setMicMuted","muted","setMicrophoneEnabled","handleParticipantReadyWithOverrides","overridesEvent","_config$overrides$age","_config$overrides$age2","_config$overrides$age3","_config$overrides$tts","_config$overrides$con","_config$overrides","conversation_config_override","agent","prompt","first_message","firstMessage","language","tts","voice_id","voiceId","conversation","text_only","textOnly","source_info","version","client","custom_llm_extra_body","dynamic_variables","user_id","constructOverrides","getId","sendContextualUpdate","text","sendUserMessage","sendUserActivity","setClientTools","tools","Provider","value","context","useContext","_objectWithoutPropertiesLoose"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import e,{useRef as n,useCallback as t,useState as o,useEffect as r,useContext as l,createContext as a}from"react";import{AudioSession as c,useLocalParticipant as s,useDataChannel as i,LiveKitRoom as d,registerGlobals as u}from"@livekit/react-native";function v(){return v=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var o in t)({}).hasOwnProperty.call(t,o)&&(e[o]=t[o])}return e},v.apply(null,arguments)}const g="0.2.1",_=({onReady:n,isConnected:t,callbacks:o,sendMessage:l,clientTools:a={},updateCurrentEventId:c})=>{const{localParticipant:d}=s(),u=e.useRef(1);return r(()=>{t&&d&&n(d)},[t,d,n]),i(e=>{var n,t;const r=new TextDecoder,s=JSON.parse(r.decode(e.payload));if(s.type){var i;if(null==o.onMessage||o.onMessage({message:s,source:null!=(n=e.from)&&n.isAgent?"ai":"user"}),null!=(t=e.from)&&t.isAgent&&(null==o.onModeChange||o.onModeChange({mode:null!=(i=e.from)&&i.isSpeaking?"speaking":"listening"}),"agent_response"===s.type&&c)){const e=u.current++;c(e)}switch(s.type){case"ping":l({type:"pong",event_id:s.ping_event.event_id});break;case"client_tool_call":(async e=>{if(Object.prototype.hasOwnProperty.call(a,e.client_tool_call.tool_name))try{var n;const t=null!=(n=await a[e.client_tool_call.tool_name](e.client_tool_call.parameters))?n:"Client tool execution successful.",o="object"==typeof t?JSON.stringify(t):String(t);l({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:o,is_error:!1})}catch(n){null==o.onError||o.onError(`Client tool execution failed with following error: ${null==n?void 0:n.message}`,{clientToolName:e.client_tool_call.tool_name}),l({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:`Client tool execution failed: ${null==n?void 0:n.message}`,is_error:!0})}else{if(o.onUnhandledClientToolCall)return void o.onUnhandledClientToolCall(e);const n=`Client tool with name ${e.client_tool_call.tool_name} is not defined on client`;null==o.onError||o.onError(n,{clientToolName:e.client_tool_call.tool_name}),l({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:n,is_error:!0})}})(s);break;default:null==o.onDebug||o.onDebug(s)}}else null==o.onDebug||o.onDebug({type:"invalid_event",message:s})}),null},m=({children:n,serverUrl:t,token:o,connect:r,onConnected:l,onDisconnected:a,onError:c,roomConnected:s,callbacks:i,onParticipantReady:u,sendMessage:v,clientTools:g,updateCurrentEventId:m})=>/*#__PURE__*/e.createElement(d,{serverUrl:t,token:o,connect:r,audio:!0,video:!1,options:{adaptiveStream:{pixelDensity:"screen"}},onConnected:l,onDisconnected:a,onError:c},/*#__PURE__*/e.createElement(_,{onReady:u,isConnected:s,callbacks:i,sendMessage:v,clientTools:g,updateCurrentEventId:m}),n),C=["serverUrl","tokenFetchUrl","clientTools"],p=/*#__PURE__*/a(null),k=(n={})=>{const t=l(p);if(!t)throw new Error("useConversation must be used within ElevenLabsProvider");const{serverUrl:o,tokenFetchUrl:r,clientTools:a}=n,c=function(e,n){if(null==e)return{};var t={};for(var o in e)if({}.hasOwnProperty.call(e,o)){if(-1!==n.indexOf(o))continue;t[o]=e[o]}return t}(n,C);return e.useEffect(()=>{o&&t.setServerUrl(o)},[t,o]),e.useEffect(()=>{r&&t.setTokenFetchUrl(r)},[t,r]),a&&t.setClientTools(a),t.setCallbacks(c),t.conversation},f=({children:l})=>{u();const[a,s]=o(""),[i,d]=o(!1),[_,C]=o("disconnected"),[k,f]=o("wss://livekit.rtc.elevenlabs.io"),[h,y]=o(void 0),[b,E]=o(""),[S,w]=o(!1),[x,T]=o(!1),U=e.useRef(1),D=e.useRef(1),F=e.useRef({}),{callbacksRef:I,setCallbacks:M}=(()=>{const e=n({}),o=t(n=>{e.current=n},[]);return{callbacksRef:e,setCallbacks:o}})(),R=e.useCallback(e=>{const n=v({},e,{onModeChange:n=>{w("speaking"===n.mode),null==e.onModeChange||e.onModeChange(n)}});M(n)},[M]),{startSession:P,endSession:O,overrides:L,customLlmExtraBody:N,dynamicVariables:A}=((e,n,r,l,a,c)=>{const[s,i]=o({}),[d,u]=o(null),[v,_]=o({});return{startSession:t(async t=>{try{let o;if(n("connecting"),null==e.current.onStatusChange||e.current.onStatusChange({status:"connecting"}),i(t.overrides||{}),u(t.customLlmExtraBody||null),_(t.dynamicVariables||{}),t.conversationToken)o=t.conversationToken;else{if(!t.agentId)throw new Error("Either conversationToken or agentId is required");{console.info("Getting conversation token for agentId:",t.agentId);const e=t.tokenFetchUrl||c;o=await(async(e,n)=>{const t=n||"https://api.elevenlabs.io/v1/convai/conversation/token",o=await fetch(`${t}?agent_id=${e}&source=react_native_sdk&version=${g}`),r=await o.json();if(!o.ok)throw new Error(`Failed to get conversation token: ${r.detail.message}`);if(!r.token)throw new Error("No conversation token received from API");return r.token})(t.agentId,e)}}const s=(e=>{try{var n,t;return(null==(t=((null==(n=JSON.parse(atob(e.split(".")[1])).video)?void 0:n.room)||"").match(/(conv_[a-zA-Z0-9]+)/))?void 0:t[0])||""}catch(e){return console.warn("Could not extract conversation ID from token"),""}})(o);a(s),l(o),r(!0)}catch(t){throw n("disconnected"),null==e.current.onStatusChange||e.current.onStatusChange({status:"disconnected"}),null==e.current.onError||e.current.onError(t),t}},[e,n,r,l,a,c]),endSession:t(async()=>{try{r(!1),l(""),n("disconnected"),null==e.current.onStatusChange||e.current.onStatusChange({status:"disconnected"}),null==e.current.onDisconnect||e.current.onDisconnect("User ended conversation")}catch(n){throw null==e.current.onError||e.current.onError(n),n}},[e,r,l,n]),overrides:s,customLlmExtraBody:d,dynamicVariables:v}})(I,C,d,s,E,h),{roomConnected:V,localParticipant:$,handleParticipantReady:B,handleConnected:j,handleDisconnected:J,handleError:K}=((e,n,l)=>{const[a,s]=o(!1),[i,d]=o(null);return r(()=>((async()=>{await c.startAudioSession()})(),()=>{c.stopAudioSession()}),[]),{roomConnected:a,localParticipant:i,handleParticipantReady:t(e=>{d(e)},[]),handleConnected:t(()=>{s(!0),n("connected"),null==e.current.onConnect||e.current.onConnect({conversationId:l})},[l,e,n]),handleDisconnected:t(()=>{s(!1),n("disconnected"),d(null),null==e.current.onDisconnect||e.current.onDisconnect("disconnected")},[e,n]),handleError:t(n=>{console.error("LiveKit error:",n),null==e.current.onError||e.current.onError(n.message,void 0)},[e])}})(I,C,b),q=e.useCallback(()=>{U.current=1,D.current=1,T(!1),null==I.current.onCanSendFeedbackChange||I.current.onCanSendFeedbackChange({canSendFeedback:!1}),j()},[j,I]),z=e.useCallback(()=>{T(!1),J()},[J]),{sendMessage:G}=((e,n,o)=>({sendMessage:t(async t=>{if("connected"===e&&n)try{const e=(new TextEncoder).encode(JSON.stringify(t));await n.publishData(e,{reliable:!0})}catch(e){console.error("Failed to send message via WebRTC:",e),console.error("Error details:",e),null==o.current.onError||o.current.onError(e)}else console.warn("Cannot send message: room not connected or no local participant")},[e,n,o])}))(_,$,I),W=e.useCallback(()=>{const e=U.current!==D.current;x!==e&&(T(e),null==I.current.onCanSendFeedbackChange||I.current.onCanSendFeedbackChange({canSendFeedback:e}))},[x,I]),Z=e.useCallback(e=>{x?(G({type:"feedback",score:e?"like":"dislike",event_id:U.current}),D.current=U.current,W()):console.warn(0===D.current?"Cannot send feedback: the conversation has not started yet.":"Cannot send feedback: feedback has already been sent for the current response.")},[x,G,W]);e.useCallback(e=>{console.warn("setVolume is not yet implemented in React Native SDK")},[]);const H=e.useCallback(e=>{U.current=e,W()},[W]),Q=e.useCallback(e=>{if(B(e),$){const e=function(e){const n={type:"conversation_initiation_client_data"};var t,o,r,l,a,c;return e.overrides&&(n.conversation_config_override={agent:{prompt:null==(t=e.overrides.agent)?void 0:t.prompt,first_message:null==(o=e.overrides.agent)?void 0:o.firstMessage,language:null==(r=e.overrides.agent)?void 0:r.language},tts:{voice_id:null==(l=e.overrides.tts)?void 0:l.voiceId},conversation:{text_only:null==(a=e.overrides.conversation)?void 0:a.textOnly},source_info:{source:"react_native_sdk",version:(null==(c=e.overrides)||null==(c=c.client)?void 0:c.version)||g}}),e.customLlmExtraBody&&(n.custom_llm_extra_body=e.customLlmExtraBody),e.dynamicVariables&&(n.dynamic_variables=e.dynamicVariables),e.userId&&(n.user_id=e.userId),n}({overrides:L,customLlmExtraBody:N,dynamicVariables:A});G(e)}},[B,$,L,N,A,G]),X={startSession:P,endSession:O,status:_,isSpeaking:S,canSendFeedback:x,getId:()=>b,sendFeedback:Z,sendContextualUpdate:e=>{G({type:"contextual_update",text:e})},sendUserMessage:e=>{G({type:"user_message",text:e})},sendUserActivity:()=>{G({type:"user_activity"})}},Y=e.useCallback(e=>{F.current=e},[]);/*#__PURE__*/return e.createElement(p.Provider,{value:{conversation:X,callbacksRef:I,serverUrl:k,tokenFetchUrl:h,clientTools:F.current,setCallbacks:R,setServerUrl:f,setTokenFetchUrl:y,setClientTools:Y}},/*#__PURE__*/e.createElement(m,{serverUrl:k,token:a,connect:i,onConnected:q,onDisconnected:z,onError:K,roomConnected:V,callbacks:I.current,onParticipantReady:Q,sendMessage:G,clientTools:F.current,updateCurrentEventId:H},l))};export{f as ElevenLabsProvider,k as useConversation};
1
+ import e,{useRef as n,useCallback as t,useState as o,useEffect as r,useContext as l,createContext as a}from"react";import{AudioSession as c,useLocalParticipant as s,useDataChannel as i,LiveKitRoom as d,registerGlobals as u}from"@livekit/react-native";function v(){return v=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var o in t)({}).hasOwnProperty.call(t,o)&&(e[o]=t[o])}return e},v.apply(null,arguments)}const g="0.3.0",_=({onReady:n,isConnected:t,callbacks:o,sendMessage:l,clientTools:a={},updateCurrentEventId:c})=>{const{localParticipant:d}=s(),u=e.useRef(1);return r(()=>{t&&d&&n(d)},[t,d,n]),i(e=>{var n,t;const r=new TextDecoder,s=JSON.parse(r.decode(e.payload));if(s.type){var i;if(null==o.onMessage||o.onMessage({message:s,source:null!=(n=e.from)&&n.isAgent?"ai":"user"}),null!=(t=e.from)&&t.isAgent&&(null==o.onModeChange||o.onModeChange({mode:null!=(i=e.from)&&i.isSpeaking?"speaking":"listening"}),"agent_response"===s.type&&c)){const e=u.current++;c(e)}switch(s.type){case"ping":l({type:"pong",event_id:s.ping_event.event_id});break;case"client_tool_call":(async e=>{if(Object.prototype.hasOwnProperty.call(a,e.client_tool_call.tool_name))try{var n;const t=null!=(n=await a[e.client_tool_call.tool_name](e.client_tool_call.parameters))?n:"Client tool execution successful.",o="object"==typeof t?JSON.stringify(t):String(t);l({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:o,is_error:!1})}catch(n){null==o.onError||o.onError(`Client tool execution failed with following error: ${null==n?void 0:n.message}`,{clientToolName:e.client_tool_call.tool_name}),l({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:`Client tool execution failed: ${null==n?void 0:n.message}`,is_error:!0})}else{if(o.onUnhandledClientToolCall)return void o.onUnhandledClientToolCall(e);const n=`Client tool with name ${e.client_tool_call.tool_name} is not defined on client`;null==o.onError||o.onError(n,{clientToolName:e.client_tool_call.tool_name}),l({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:n,is_error:!0})}})(s);break;default:null==o.onDebug||o.onDebug(s)}}else null==o.onDebug||o.onDebug({type:"invalid_event",message:s})}),null},m=({children:n,serverUrl:t,token:o,connect:r,onConnected:l,onDisconnected:a,onError:c,roomConnected:s,callbacks:i,onParticipantReady:u,sendMessage:v,clientTools:g,updateCurrentEventId:m})=>/*#__PURE__*/e.createElement(d,{serverUrl:t,token:o,connect:r,audio:!0,video:!1,options:{adaptiveStream:{pixelDensity:"screen"}},onConnected:l,onDisconnected:a,onError:c},/*#__PURE__*/e.createElement(_,{onReady:u,isConnected:s,callbacks:i,sendMessage:v,clientTools:g,updateCurrentEventId:m}),n),C=["serverUrl","tokenFetchUrl","clientTools"],p=/*#__PURE__*/a(null),k=(n={})=>{const t=l(p);if(!t)throw new Error("useConversation must be used within ElevenLabsProvider");const{serverUrl:o,tokenFetchUrl:r,clientTools:a}=n,c=function(e,n){if(null==e)return{};var t={};for(var o in e)if({}.hasOwnProperty.call(e,o)){if(-1!==n.indexOf(o))continue;t[o]=e[o]}return t}(n,C);return e.useEffect(()=>{o&&t.setServerUrl(o)},[t,o]),e.useEffect(()=>{r&&t.setTokenFetchUrl(r)},[t,r]),a&&t.setClientTools(a),t.setCallbacks(c),t.conversation},b=({children:l})=>{u();const[a,s]=o(""),[i,d]=o(!1),[_,C]=o("disconnected"),[k,b]=o("wss://livekit.rtc.elevenlabs.io"),[h,f]=o(void 0),[y,E]=o(""),[S,w]=o(!1),[x,T]=o(!1),I=e.useRef(1),U=e.useRef(1),D=e.useRef({}),{callbacksRef:M,setCallbacks:F}=(()=>{const e=n({}),o=t(n=>{e.current=n},[]);return{callbacksRef:e,setCallbacks:o}})(),R=e.useCallback(e=>{const n=v({},e,{onModeChange:n=>{w("speaking"===n.mode),null==e.onModeChange||e.onModeChange(n)}});F(n)},[F]),{startSession:P,endSession:O,overrides:L,customLlmExtraBody:N,dynamicVariables:A,userId:V}=((e,n,r,l,a,c)=>{const[s,i]=o({}),[d,u]=o(null),[v,_]=o({}),[m,C]=o(void 0);return{startSession:t(async t=>{try{let o;if(n("connecting"),null==e.current.onStatusChange||e.current.onStatusChange({status:"connecting"}),i(t.overrides||{}),u(t.customLlmExtraBody||null),_(t.dynamicVariables||{}),C(t.userId),t.conversationToken)o=t.conversationToken;else{if(!t.agentId)throw new Error("Either conversationToken or agentId is required");{console.info("Getting conversation token for agentId:",t.agentId);const e=t.tokenFetchUrl||c;o=await(async(e,n)=>{const t=n||"https://api.elevenlabs.io/v1/convai/conversation/token",o=await fetch(`${t}?agent_id=${e}&source=react_native_sdk&version=${g}`),r=await o.json();if(!o.ok)throw new Error(`Failed to get conversation token: ${r.detail.message}`);if(!r.token)throw new Error("No conversation token received from API");return r.token})(t.agentId,e)}}const s=(e=>{try{var n,t;return(null==(t=((null==(n=JSON.parse(atob(e.split(".")[1])).video)?void 0:n.room)||"").match(/(conv_[a-zA-Z0-9]+)/))?void 0:t[0])||""}catch(e){return console.warn("Could not extract conversation ID from token"),""}})(o);a(s),l(o),r(!0)}catch(t){throw n("disconnected"),null==e.current.onStatusChange||e.current.onStatusChange({status:"disconnected"}),null==e.current.onError||e.current.onError(t),t}},[e,n,r,l,a,c]),endSession:t(async()=>{try{r(!1),l(""),n("disconnected"),null==e.current.onStatusChange||e.current.onStatusChange({status:"disconnected"}),null==e.current.onDisconnect||e.current.onDisconnect("User ended conversation")}catch(n){throw null==e.current.onError||e.current.onError(n),n}},[e,r,l,n]),overrides:s,customLlmExtraBody:d,dynamicVariables:v,userId:m}})(M,C,d,s,E,h),{roomConnected:$,localParticipant:B,handleParticipantReady:j,handleConnected:J,handleDisconnected:K,handleError:q}=((e,n,l)=>{const[a,s]=o(!1),[i,d]=o(null);return r(()=>((async()=>{await c.startAudioSession()})(),()=>{c.stopAudioSession()}),[]),{roomConnected:a,localParticipant:i,handleParticipantReady:t(e=>{d(e)},[]),handleConnected:t(()=>{s(!0),n("connected"),null==e.current.onConnect||e.current.onConnect({conversationId:l})},[l,e,n]),handleDisconnected:t(()=>{s(!1),n("disconnected"),d(null),null==e.current.onDisconnect||e.current.onDisconnect("disconnected")},[e,n]),handleError:t(n=>{console.error("LiveKit error:",n),null==e.current.onError||e.current.onError(n.message,void 0)},[e])}})(M,C,y),z=e.useCallback(()=>{I.current=1,U.current=1,T(!1),null==M.current.onCanSendFeedbackChange||M.current.onCanSendFeedbackChange({canSendFeedback:!1}),J()},[J,M]),G=e.useCallback(()=>{T(!1),K()},[K]),{sendMessage:W}=((e,n,o)=>({sendMessage:t(async t=>{if("connected"===e&&n)try{const e=(new TextEncoder).encode(JSON.stringify(t));await n.publishData(e,{reliable:!0})}catch(e){console.error("Failed to send message via WebRTC:",e),console.error("Error details:",e),null==o.current.onError||o.current.onError(e)}else console.warn("Cannot send message: room not connected or no local participant")},[e,n,o])}))(_,B,M),Z=e.useCallback(()=>{const e=I.current!==U.current;x!==e&&(T(e),null==M.current.onCanSendFeedbackChange||M.current.onCanSendFeedbackChange({canSendFeedback:e}))},[x,M]),H=e.useCallback(e=>{x?(W({type:"feedback",score:e?"like":"dislike",event_id:I.current}),U.current=I.current,Z()):console.warn(0===U.current?"Cannot send feedback: the conversation has not started yet.":"Cannot send feedback: feedback has already been sent for the current response.")},[x,W,Z]);e.useCallback(e=>{console.warn("setVolume is not yet implemented in React Native SDK")},[]);const Q=e.useCallback(e=>{B&&B.setMicrophoneEnabled(!e)},[B]),X=e.useCallback(e=>{I.current=e,Z()},[Z]),Y=e.useCallback(e=>{if(j(e),B){const e=function(e){const n={type:"conversation_initiation_client_data"};var t,o,r,l,a,c;return e.overrides&&(n.conversation_config_override={agent:{prompt:null==(t=e.overrides.agent)?void 0:t.prompt,first_message:null==(o=e.overrides.agent)?void 0:o.firstMessage,language:null==(r=e.overrides.agent)?void 0:r.language},tts:{voice_id:null==(l=e.overrides.tts)?void 0:l.voiceId},conversation:{text_only:null==(a=e.overrides.conversation)?void 0:a.textOnly},source_info:{source:"react_native_sdk",version:(null==(c=e.overrides)||null==(c=c.client)?void 0:c.version)||g}}),e.customLlmExtraBody&&(n.custom_llm_extra_body=e.customLlmExtraBody),e.dynamicVariables&&(n.dynamic_variables=e.dynamicVariables),e.userId&&(n.user_id=String(e.userId)),n}({overrides:L,customLlmExtraBody:N,dynamicVariables:A,userId:V});W(e)}},[j,B,L,N,A,V,W]),ee={startSession:P,endSession:O,status:_,isSpeaking:S,canSendFeedback:x,getId:()=>y,setMicMuted:Q,sendFeedback:H,sendContextualUpdate:e=>{W({type:"contextual_update",text:e})},sendUserMessage:e=>{W({type:"user_message",text:e})},sendUserActivity:()=>{W({type:"user_activity"})}},ne=e.useCallback(e=>{D.current=e},[]);/*#__PURE__*/return e.createElement(p.Provider,{value:{conversation:ee,callbacksRef:M,serverUrl:k,tokenFetchUrl:h,clientTools:D.current,setCallbacks:R,setServerUrl:b,setTokenFetchUrl:f,setClientTools:ne}},/*#__PURE__*/e.createElement(m,{serverUrl:k,token:a,connect:i,onConnected:z,onDisconnected:G,onError:q,roomConnected:$,callbacks:M.current,onParticipantReady:Y,sendMessage:W,clientTools:D.current,updateCurrentEventId:X},l))};export{b as ElevenLabsProvider,k as useConversation};
2
2
  //# sourceMappingURL=lib.modern.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lib.modern.js","sources":["../src/version.ts","../src/components/MessageHandler.tsx","../src/components/LiveKitRoomWrapper.tsx","../src/ElevenLabsProvider.tsx","../src/utils/constants.ts","../src/hooks/useConversationCallbacks.ts","../src/hooks/useConversationSession.ts","../src/utils/tokenUtils.ts","../src/hooks/useLiveKitRoom.ts","../src/hooks/useMessageSending.ts","../src/utils/overrides.ts"],"sourcesContent":["// This file is auto-generated during build\nexport const PACKAGE_VERSION = \"0.2.1\";\n","import { useEffect } from 'react';\nimport { useLocalParticipant, useDataChannel } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ClientToolsConfig, ClientToolCallEvent, ConversationEvent } from '../types';\nimport React from 'react';\n\ninterface MessageHandlerProps {\n onReady: (participant: LocalParticipant) => void;\n isConnected: boolean;\n callbacks: Callbacks;\n sendMessage: (message: unknown) => void;\n clientTools?: ClientToolsConfig['clientTools'];\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport function isValidEvent(event: any): event is ConversationEvent {\n return !!event.type;\n}\n\nexport const MessageHandler = ({\n onReady,\n isConnected,\n callbacks,\n sendMessage,\n clientTools = {},\n updateCurrentEventId\n}: MessageHandlerProps) => {\n const { localParticipant } = useLocalParticipant();\n\n // Track agent response count for synthetic event IDs (WebRTC mode)\n const agentResponseCountRef = React.useRef(1);\n\n useEffect(() => {\n if (isConnected && localParticipant) {\n onReady(localParticipant);\n }\n }, [isConnected, localParticipant, onReady]);\n\n const handleClientToolCall = async (clientToolCall: ClientToolCallEvent) => {\n if (\n Object.prototype.hasOwnProperty.call(\n clientTools,\n clientToolCall.client_tool_call.tool_name\n )\n ) {\n try {\n const result =\n (await clientTools[clientToolCall.client_tool_call.tool_name](\n clientToolCall.client_tool_call.parameters\n )) ?? \"Client tool execution successful.\"; // default client-tool call response\n\n // The API expects result to be a string, so we need to convert it if it's not already a string\n const formattedResult =\n typeof result === \"object\" ? JSON.stringify(result) : String(result);\n\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: formattedResult,\n is_error: false,\n });\n } catch (e) {\n const errorMessage = `Client tool execution failed with following error: ${(e as Error)?.message}`;\n callbacks.onError?.(errorMessage, {\n clientToolName: clientToolCall.client_tool_call.tool_name,\n });\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: `Client tool execution failed: ${(e as Error)?.message}`,\n is_error: true,\n });\n }\n } else {\n if (callbacks.onUnhandledClientToolCall) {\n callbacks.onUnhandledClientToolCall(clientToolCall);\n return;\n }\n\n const errorMessage = `Client tool with name ${clientToolCall.client_tool_call.tool_name} is not defined on client`;\n callbacks.onError?.(errorMessage, {\n clientToolName: clientToolCall.client_tool_call.tool_name,\n });\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: errorMessage,\n is_error: true,\n });\n }\n };\n\n const _ = useDataChannel((msg) => {\n const decoder = new TextDecoder();\n const message = JSON.parse(decoder.decode(msg.payload));\n\n if (!isValidEvent(message)) {\n callbacks.onDebug?.({\n type: \"invalid_event\",\n message,\n });\n return;\n }\n\n callbacks.onMessage?.({\n message,\n source: msg.from?.isAgent ? 'ai' : 'user',\n });\n\n if (msg.from?.isAgent) {\n callbacks.onModeChange?.({\n mode: msg.from?.isSpeaking ? 'speaking' : 'listening'\n });\n\n // Track agent responses for feedback (WebRTC mode needs synthetic event IDs)\n if (message.type === \"agent_response\" && updateCurrentEventId) {\n const eventId = agentResponseCountRef.current++;\n updateCurrentEventId(eventId);\n }\n }\n\n switch (message.type) {\n case \"ping\":\n sendMessage({\n type: \"pong\",\n event_id: message.ping_event.event_id,\n });\n break;\n case \"client_tool_call\":\n handleClientToolCall(message);\n break;\n default:\n callbacks.onDebug?.(message);\n break;\n }\n });\n\n return null;\n};","import React from 'react';\nimport { LiveKitRoom } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ClientToolsConfig } from '../types';\nimport { MessageHandler } from './MessageHandler';\n\ninterface LiveKitRoomWrapperProps {\n children: React.ReactNode;\n serverUrl: string;\n token: string;\n connect: boolean;\n onConnected: () => void;\n onDisconnected: () => void;\n onError: (error: Error) => void;\n roomConnected: boolean;\n callbacks: Callbacks;\n onParticipantReady: (participant: LocalParticipant) => void;\n sendMessage: (message: unknown) => void;\n clientTools: ClientToolsConfig['clientTools'];\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport const LiveKitRoomWrapper = ({\n children,\n serverUrl,\n token,\n connect,\n onConnected,\n onDisconnected,\n onError,\n roomConnected,\n callbacks,\n onParticipantReady,\n sendMessage,\n clientTools,\n updateCurrentEventId,\n}: LiveKitRoomWrapperProps) => {\n return (\n <LiveKitRoom\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n audio={true}\n video={false}\n options={{\n adaptiveStream: { pixelDensity: 'screen' },\n }}\n onConnected={onConnected}\n onDisconnected={onDisconnected}\n onError={onError}\n >\n <MessageHandler\n onReady={onParticipantReady}\n isConnected={roomConnected}\n callbacks={callbacks}\n sendMessage={sendMessage}\n clientTools={clientTools}\n updateCurrentEventId={updateCurrentEventId}\n />\n {children}\n </LiveKitRoom>\n );\n};","import React from 'react';\nimport { createContext, useContext, useState } from 'react';\nimport { registerGlobals } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ConversationConfig, ConversationStatus, ClientToolsConfig } from './types';\nimport { constructOverrides } from './utils/overrides';\nimport { DEFAULT_SERVER_URL } from './utils/constants';\nimport { useConversationCallbacks } from './hooks/useConversationCallbacks';\nimport { useConversationSession } from './hooks/useConversationSession';\nimport { useLiveKitRoom } from './hooks/useLiveKitRoom';\nimport { useMessageSending } from './hooks/useMessageSending';\nimport { LiveKitRoomWrapper } from './components/LiveKitRoomWrapper';\n\ninterface ConversationOptions extends Callbacks, Partial<ClientToolsConfig> {\n serverUrl?: string;\n tokenFetchUrl?: string;\n}\n\nexport interface Conversation {\n startSession: (config: ConversationConfig) => Promise<void>;\n endSession: () => Promise<void>;\n status: ConversationStatus;\n isSpeaking: boolean;\n // TODO: Implement setVolume when LiveKit React Native supports it\n // setVolume: (volume: number) => void;\n canSendFeedback: boolean;\n getId: () => string;\n sendFeedback: (like: boolean) => void;\n sendContextualUpdate: (text: string) => void;\n sendUserMessage: (text: string) => void;\n sendUserActivity: () => void;\n}\n\ninterface ElevenLabsContextType {\n conversation: Conversation;\n callbacksRef: { current: Callbacks };\n serverUrl: string;\n tokenFetchUrl?: string;\n clientTools: ClientToolsConfig['clientTools'];\n setCallbacks: (callbacks: Callbacks) => void;\n setServerUrl: (url: string) => void;\n setTokenFetchUrl: (url: string) => void;\n setClientTools: (tools: ClientToolsConfig['clientTools']) => void;\n}\n\nconst ElevenLabsContext = createContext<ElevenLabsContextType | null>(null);\n\nexport const useConversation = (options: ConversationOptions = {}): Conversation => {\n const context = useContext(ElevenLabsContext);\n if (!context) {\n throw new Error('useConversation must be used within ElevenLabsProvider');\n }\n\n const { serverUrl, tokenFetchUrl, clientTools, ...callbacks } = options;\n\n React.useEffect(() => {\n if (serverUrl) {\n context.setServerUrl(serverUrl);\n }\n }, [context, serverUrl]);\n\n React.useEffect(() => {\n if (tokenFetchUrl) {\n context.setTokenFetchUrl(tokenFetchUrl);\n }\n }, [context, tokenFetchUrl]);\n\n if (clientTools) {\n context.setClientTools(clientTools);\n }\n\n context.setCallbacks(callbacks);\n\n return context.conversation;\n};\n\ninterface ElevenLabsProviderProps {\n children: React.ReactNode;\n}\n\nexport const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children }) => {\n // Initialize globals on mount\n registerGlobals();\n\n // State management\n const [token, setToken] = useState('');\n const [connect, setConnect] = useState(false);\n const [status, setStatus] = useState<ConversationStatus>('disconnected');\n const [serverUrl, setServerUrl] = useState(DEFAULT_SERVER_URL);\n const [tokenFetchUrl, setTokenFetchUrl] = useState<string | undefined>(undefined);\n const [conversationId, setConversationId] = useState<string>('');\n const [isSpeaking, setIsSpeaking] = useState(false);\n const [canSendFeedback, setCanSendFeedback] = useState(false);\n\n // Feedback state tracking\n const currentEventIdRef = React.useRef(1);\n const lastFeedbackEventIdRef = React.useRef(1);\n\n // Use ref for clientTools to avoid re-renders (like callbacks)\n const clientToolsRef = React.useRef<ClientToolsConfig['clientTools']>({});\n\n // Custom hooks\n const { callbacksRef, setCallbacks: setCallbacksBase } = useConversationCallbacks();\n\n // Enhanced setCallbacks that wraps onModeChange to update isSpeaking state\n const setCallbacks = React.useCallback((callbacks: Callbacks) => {\n const wrappedCallbacks = {\n ...callbacks,\n onModeChange: (event: { mode: 'speaking' | 'listening' }) => {\n setIsSpeaking(event.mode === 'speaking');\n callbacks.onModeChange?.(event);\n }\n };\n setCallbacksBase(wrappedCallbacks);\n }, [setCallbacksBase]);\n\n const {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n } = useConversationSession(callbacksRef, setStatus, setConnect, setToken, setConversationId, tokenFetchUrl);\n\n const {\n roomConnected,\n localParticipant,\n handleParticipantReady,\n handleConnected,\n handleDisconnected,\n handleError,\n } = useLiveKitRoom(callbacksRef, setStatus, conversationId);\n\n // Enhanced connection handler to initialize feedback state\n const handleConnectedWithFeedback = React.useCallback(() => {\n // Reset feedback state when connecting\n currentEventIdRef.current = 1;\n lastFeedbackEventIdRef.current = 1;\n setCanSendFeedback(false);\n callbacksRef.current.onCanSendFeedbackChange?.({ canSendFeedback: false });\n\n handleConnected();\n }, [handleConnected, callbacksRef]);\n\n // Enhanced disconnection handler to reset feedback state\n const handleDisconnectedWithFeedback = React.useCallback(() => {\n setCanSendFeedback(false);\n handleDisconnected();\n }, [handleDisconnected]);\n\n const { sendMessage } = useMessageSending(status, localParticipant, callbacksRef);\n\n const updateCanSendFeedback = React.useCallback(() => {\n const newCanSendFeedback = currentEventIdRef.current !== lastFeedbackEventIdRef.current;\n\n if (canSendFeedback !== newCanSendFeedback) {\n setCanSendFeedback(newCanSendFeedback);\n callbacksRef.current.onCanSendFeedbackChange?.({ canSendFeedback: newCanSendFeedback });\n }\n }, [canSendFeedback, callbacksRef]);\n\n const sendFeedback = React.useCallback((like: boolean) => {\n if (!canSendFeedback) {\n console.warn(\n lastFeedbackEventIdRef.current === 0\n ? \"Cannot send feedback: the conversation has not started yet.\"\n : \"Cannot send feedback: feedback has already been sent for the current response.\"\n );\n return;\n }\n\n const feedbackMessage = {\n type: \"feedback\",\n score: like ? \"like\" : \"dislike\",\n event_id: currentEventIdRef.current,\n };\n\n sendMessage(feedbackMessage);\n lastFeedbackEventIdRef.current = currentEventIdRef.current;\n updateCanSendFeedback();\n }, [canSendFeedback, sendMessage, updateCanSendFeedback]);\n\n // setVolume placeholder (to be implemented when LiveKit supports it)\n const setVolume = React.useCallback((volume: number) => {\n console.warn('setVolume is not yet implemented in React Native SDK');\n }, []);\n\n const getId = () => conversationId;\n\n // Update current event ID for feedback tracking\n const updateCurrentEventId = React.useCallback((eventId: number) => {\n currentEventIdRef.current = eventId;\n updateCanSendFeedback();\n }, [updateCanSendFeedback]);\n\n // Handle participant ready with overrides\n const handleParticipantReadyWithOverrides = React.useCallback((participant: LocalParticipant) => {\n handleParticipantReady(participant);\n\n if (localParticipant) {\n const overridesEvent = constructOverrides({\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n });\n sendMessage(overridesEvent);\n }\n }, [handleParticipantReady, localParticipant, overrides, customLlmExtraBody, dynamicVariables, sendMessage]);\n\n const conversation: Conversation = {\n startSession,\n endSession,\n status,\n isSpeaking,\n // setVolume,\n canSendFeedback,\n getId,\n sendFeedback,\n sendContextualUpdate: (text: string) => {\n sendMessage({\n type: \"contextual_update\",\n text,\n });\n },\n sendUserMessage: (text: string) => {\n sendMessage({\n type: \"user_message\",\n text,\n });\n },\n sendUserActivity: () => {\n sendMessage({\n type: \"user_activity\",\n });\n },\n };\n\n // Create setClientTools function that only updates ref\n const setClientTools = React.useCallback((tools: ClientToolsConfig['clientTools']) => {\n clientToolsRef.current = tools;\n }, []);\n\n const contextValue: ElevenLabsContextType = {\n conversation,\n callbacksRef,\n serverUrl,\n tokenFetchUrl,\n clientTools: clientToolsRef.current,\n setCallbacks,\n setServerUrl,\n setTokenFetchUrl: setTokenFetchUrl,\n setClientTools,\n };\n\n return (\n <ElevenLabsContext.Provider value={contextValue}>\n <LiveKitRoomWrapper\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n onConnected={handleConnectedWithFeedback}\n onDisconnected={handleDisconnectedWithFeedback}\n onError={handleError}\n roomConnected={roomConnected}\n callbacks={callbacksRef.current}\n onParticipantReady={handleParticipantReadyWithOverrides}\n sendMessage={sendMessage}\n clientTools={clientToolsRef.current}\n updateCurrentEventId={updateCurrentEventId}\n >\n {children}\n </LiveKitRoomWrapper>\n </ElevenLabsContext.Provider>\n );\n};","export const DEFAULT_SERVER_URL = \"wss://livekit.rtc.elevenlabs.io\";\n","import { useRef, useCallback } from \"react\";\nimport type { Callbacks } from \"../types\";\n\nexport const useConversationCallbacks = () => {\n const callbacksRef = useRef<Callbacks>({});\n\n const setCallbacks = useCallback((callbacks: Callbacks) => {\n callbacksRef.current = callbacks;\n }, []);\n\n return {\n callbacksRef,\n setCallbacks,\n };\n};\n","import { useState, useCallback } from \"react\";\nimport type {\n ConversationConfig,\n ConversationStatus,\n Callbacks,\n} from \"../types\";\nimport {\n getConversationToken,\n extractConversationIdFromToken,\n} from \"../utils/tokenUtils\";\n\nexport const useConversationSession = (\n callbacksRef: { current: Callbacks },\n setStatus: (status: ConversationStatus) => void,\n setConnect: (connect: boolean) => void,\n setToken: (token: string) => void,\n setConversationId: (conversationId: string) => void,\n tokenFetchUrl?: string\n) => {\n const [overrides, setOverrides] = useState<ConversationConfig[\"overrides\"]>(\n {}\n );\n const [customLlmExtraBody, setCustomLlmExtraBody] =\n useState<ConversationConfig[\"customLlmExtraBody\"]>(null);\n const [dynamicVariables, setDynamicVariables] = useState<\n ConversationConfig[\"dynamicVariables\"]\n >({});\n\n const startSession = useCallback(\n async (config: ConversationConfig) => {\n try {\n setStatus(\"connecting\");\n callbacksRef.current.onStatusChange?.({ status: \"connecting\" });\n\n setOverrides(config.overrides || {});\n setCustomLlmExtraBody(config.customLlmExtraBody || null);\n setDynamicVariables(config.dynamicVariables || {});\n\n let conversationToken: string;\n\n if (config.conversationToken) {\n conversationToken = config.conversationToken;\n } else if (config.agentId) {\n console.info(\n \"Getting conversation token for agentId:\",\n config.agentId\n );\n // Use tokenFetchUrl from config first, then from hook parameter, then default\n const urlToUse = config.tokenFetchUrl || tokenFetchUrl;\n conversationToken = await getConversationToken(\n config.agentId,\n urlToUse\n );\n } else {\n throw new Error(\"Either conversationToken or agentId is required\");\n }\n\n const extractedConversationId =\n extractConversationIdFromToken(conversationToken);\n setConversationId(extractedConversationId);\n\n setToken(conversationToken);\n setConnect(true);\n } catch (error) {\n setStatus(\"disconnected\");\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n },\n [\n callbacksRef,\n setStatus,\n setConnect,\n setToken,\n setConversationId,\n tokenFetchUrl,\n ]\n );\n\n const endSession = useCallback(async () => {\n try {\n setConnect(false);\n setToken(\"\");\n setStatus(\"disconnected\");\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onDisconnect?.(\"User ended conversation\");\n } catch (error) {\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n }, [callbacksRef, setConnect, setToken, setStatus]);\n\n return {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n };\n};\n","import { PACKAGE_VERSION } from \"../version\";\n\nexport const extractConversationIdFromToken = (token: string): string => {\n try {\n const tokenPayload = JSON.parse(atob(token.split(\".\")[1]));\n const roomId = tokenPayload.video?.room || \"\";\n\n return roomId.match(/(conv_[a-zA-Z0-9]+)/)?.[0] || \"\";\n } catch (error) {\n console.warn(\"Could not extract conversation ID from token\");\n return \"\";\n }\n};\n\nexport const getConversationToken = async (\n agentId: string,\n tokenFetchUrl?: string\n): Promise<string> => {\n const baseUrl =\n tokenFetchUrl || \"https://api.elevenlabs.io/v1/convai/conversation/token\";\n const response = await fetch(\n `${baseUrl}?agent_id=${agentId}&source=react_native_sdk&version=${PACKAGE_VERSION}`\n );\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(`Failed to get conversation token: ${data.detail.message}`);\n }\n\n if (!data.token) {\n throw new Error(\"No conversation token received from API\");\n }\n\n return data.token;\n};\n","import { useState, useEffect, useCallback } from \"react\";\nimport { AudioSession } from \"@livekit/react-native\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type { ConversationStatus, Callbacks } from \"../types\";\n\nexport const useLiveKitRoom = (\n callbacksRef: { current: Callbacks },\n setStatus: (status: ConversationStatus) => void,\n conversationId: string\n) => {\n const [roomConnected, setRoomConnected] = useState(false);\n const [localParticipant, setLocalParticipant] =\n useState<LocalParticipant | null>(null);\n\n useEffect(() => {\n const start = async () => {\n await AudioSession.startAudioSession();\n };\n\n start();\n return () => {\n AudioSession.stopAudioSession();\n };\n }, []);\n\n const handleParticipantReady = useCallback(\n (participant: LocalParticipant) => {\n setLocalParticipant(participant);\n },\n []\n );\n\n const handleConnected = useCallback(() => {\n setRoomConnected(true);\n setStatus(\"connected\");\n callbacksRef.current.onConnect?.({ conversationId });\n }, [conversationId, callbacksRef, setStatus]);\n\n const handleDisconnected = useCallback(() => {\n setRoomConnected(false);\n setStatus(\"disconnected\");\n setLocalParticipant(null);\n callbacksRef.current.onDisconnect?.(\"disconnected\");\n }, [callbacksRef, setStatus]);\n\n const handleError = useCallback(\n (error: Error) => {\n console.error(\"LiveKit error:\", error);\n callbacksRef.current.onError?.(error.message, undefined);\n },\n [callbacksRef]\n );\n\n return {\n roomConnected,\n localParticipant,\n handleParticipantReady,\n handleConnected,\n handleDisconnected,\n handleError,\n };\n};\n","import { useCallback } from \"react\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type { ConversationStatus, Callbacks } from \"../types\";\n\nexport const useMessageSending = (\n status: ConversationStatus,\n localParticipant: LocalParticipant | null,\n callbacksRef: { current: Callbacks }\n) => {\n const sendMessage = useCallback(\n async (message: unknown) => {\n if (status !== \"connected\" || !localParticipant) {\n console.warn(\n \"Cannot send message: room not connected or no local participant\"\n );\n return;\n }\n try {\n const encoder = new TextEncoder();\n const data = encoder.encode(JSON.stringify(message));\n\n await localParticipant.publishData(data, { reliable: true });\n } catch (error) {\n console.error(\"Failed to send message via WebRTC:\", error);\n console.error(\"Error details:\", error);\n callbacksRef.current.onError?.(error as string);\n }\n },\n [status, localParticipant, callbacksRef]\n );\n\n return { sendMessage };\n};\n","import type { ConversationConfig, InitiationClientDataEvent } from \"../types\";\nimport { PACKAGE_VERSION } from \"../version\";\n\nexport function constructOverrides(\n config: ConversationConfig\n): InitiationClientDataEvent {\n const overridesEvent: InitiationClientDataEvent = {\n type: \"conversation_initiation_client_data\",\n };\n\n if (config.overrides) {\n overridesEvent.conversation_config_override = {\n agent: {\n prompt: config.overrides.agent?.prompt,\n first_message: config.overrides.agent?.firstMessage,\n language: config.overrides.agent?.language,\n },\n tts: {\n voice_id: config.overrides.tts?.voiceId,\n },\n conversation: {\n text_only: config.overrides.conversation?.textOnly,\n },\n source_info: {\n source: \"react_native_sdk\",\n version: config.overrides?.client?.version || PACKAGE_VERSION,\n },\n };\n }\n\n if (config.customLlmExtraBody) {\n overridesEvent.custom_llm_extra_body = config.customLlmExtraBody;\n }\n\n if (config.dynamicVariables) {\n overridesEvent.dynamic_variables = config.dynamicVariables;\n }\n\n if (config.userId) {\n overridesEvent.user_id = config.userId;\n }\n\n return overridesEvent;\n}\n"],"names":["PACKAGE_VERSION","MessageHandler","onReady","isConnected","callbacks","sendMessage","clientTools","updateCurrentEventId","localParticipant","useLocalParticipant","agentResponseCountRef","React","useRef","useEffect","useDataChannel","msg","_msg$from","_msg$from2","decoder","TextDecoder","message","JSON","parse","decode","payload","type","_msg$from3","onMessage","source","from","isAgent","onModeChange","mode","isSpeaking","eventId","current","event_id","ping_event","async","Object","prototype","hasOwnProperty","call","clientToolCall","client_tool_call","tool_name","_await$_clientTools$c","result","parameters","formattedResult","stringify","String","tool_call_id","is_error","e","onError","clientToolName","onUnhandledClientToolCall","errorMessage","handleClientToolCall","onDebug","LiveKitRoomWrapper","children","serverUrl","token","connect","onConnected","onDisconnected","roomConnected","onParticipantReady","createElement","LiveKitRoom","audio","video","options","adaptiveStream","pixelDensity","ElevenLabsContext","createContext","useConversation","context","useContext","Error","tokenFetchUrl","_objectWithoutPropertiesLoose","_excluded","setServerUrl","setTokenFetchUrl","setClientTools","setCallbacks","conversation","ElevenLabsProvider","registerGlobals","setToken","useState","setConnect","status","setStatus","undefined","conversationId","setConversationId","setIsSpeaking","canSendFeedback","setCanSendFeedback","currentEventIdRef","lastFeedbackEventIdRef","clientToolsRef","callbacksRef","setCallbacksBase","useConversationCallbacks","useCallback","wrappedCallbacks","_extends","event","startSession","endSession","overrides","customLlmExtraBody","dynamicVariables","useConversationSession","setOverrides","setCustomLlmExtraBody","setDynamicVariables","conversationToken","onStatusChange","config","agentId","console","info","urlToUse","baseUrl","response","fetch","data","json","ok","detail","getConversationToken","extractedConversationId","_tokenPayload$video","_roomId$match","atob","split","room","match","error","warn","extractConversationIdFromToken","onDisconnect","handleParticipantReady","handleConnected","handleDisconnected","handleError","useLiveKitRoom","setRoomConnected","setLocalParticipant","AudioSession","startAudioSession","start","stopAudioSession","participant","onConnect","handleConnectedWithFeedback","onCanSendFeedbackChange","handleDisconnectedWithFeedback","useMessageSending","TextEncoder","encode","publishData","reliable","updateCanSendFeedback","newCanSendFeedback","sendFeedback","like","score","volume","handleParticipantReadyWithOverrides","overridesEvent","_config$overrides$age","_config$overrides$age2","_config$overrides$age3","_config$overrides$tts","_config$overrides$con","_config$overrides","conversation_config_override","agent","prompt","first_message","firstMessage","language","tts","voice_id","voiceId","text_only","textOnly","source_info","version","client","custom_llm_extra_body","dynamic_variables","userId","user_id","constructOverrides","getId","sendContextualUpdate","text","sendUserMessage","sendUserActivity","tools","Provider","value"],"mappings":"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"}
1
+ {"version":3,"file":"lib.modern.js","sources":["../src/version.ts","../src/components/MessageHandler.tsx","../src/components/LiveKitRoomWrapper.tsx","../src/ElevenLabsProvider.tsx","../src/utils/constants.ts","../src/hooks/useConversationCallbacks.ts","../src/hooks/useConversationSession.ts","../src/utils/tokenUtils.ts","../src/hooks/useLiveKitRoom.ts","../src/hooks/useMessageSending.ts","../src/utils/overrides.ts"],"sourcesContent":["// This file is auto-generated during build\nexport const PACKAGE_VERSION = \"0.3.0\";\n","import { useEffect } from 'react';\nimport { useLocalParticipant, useDataChannel } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ClientToolsConfig, ClientToolCallEvent, ConversationEvent } from '../types';\nimport React from 'react';\n\ninterface MessageHandlerProps {\n onReady: (participant: LocalParticipant) => void;\n isConnected: boolean;\n callbacks: Callbacks;\n sendMessage: (message: unknown) => void;\n clientTools?: ClientToolsConfig['clientTools'];\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport function isValidEvent(event: any): event is ConversationEvent {\n return !!event.type;\n}\n\nexport const MessageHandler = ({\n onReady,\n isConnected,\n callbacks,\n sendMessage,\n clientTools = {},\n updateCurrentEventId\n}: MessageHandlerProps) => {\n const { localParticipant } = useLocalParticipant();\n\n // Track agent response count for synthetic event IDs (WebRTC mode)\n const agentResponseCountRef = React.useRef(1);\n\n useEffect(() => {\n if (isConnected && localParticipant) {\n onReady(localParticipant);\n }\n }, [isConnected, localParticipant, onReady]);\n\n const handleClientToolCall = async (clientToolCall: ClientToolCallEvent) => {\n if (\n Object.prototype.hasOwnProperty.call(\n clientTools,\n clientToolCall.client_tool_call.tool_name\n )\n ) {\n try {\n const result =\n (await clientTools[clientToolCall.client_tool_call.tool_name](\n clientToolCall.client_tool_call.parameters\n )) ?? \"Client tool execution successful.\"; // default client-tool call response\n\n // The API expects result to be a string, so we need to convert it if it's not already a string\n const formattedResult =\n typeof result === \"object\" ? JSON.stringify(result) : String(result);\n\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: formattedResult,\n is_error: false,\n });\n } catch (e) {\n const errorMessage = `Client tool execution failed with following error: ${(e as Error)?.message}`;\n callbacks.onError?.(errorMessage, {\n clientToolName: clientToolCall.client_tool_call.tool_name,\n });\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: `Client tool execution failed: ${(e as Error)?.message}`,\n is_error: true,\n });\n }\n } else {\n if (callbacks.onUnhandledClientToolCall) {\n callbacks.onUnhandledClientToolCall(clientToolCall);\n return;\n }\n\n const errorMessage = `Client tool with name ${clientToolCall.client_tool_call.tool_name} is not defined on client`;\n callbacks.onError?.(errorMessage, {\n clientToolName: clientToolCall.client_tool_call.tool_name,\n });\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: errorMessage,\n is_error: true,\n });\n }\n };\n\n const _ = useDataChannel((msg) => {\n const decoder = new TextDecoder();\n const message = JSON.parse(decoder.decode(msg.payload));\n\n if (!isValidEvent(message)) {\n callbacks.onDebug?.({\n type: \"invalid_event\",\n message,\n });\n return;\n }\n\n callbacks.onMessage?.({\n message,\n source: msg.from?.isAgent ? 'ai' : 'user',\n });\n\n if (msg.from?.isAgent) {\n callbacks.onModeChange?.({\n mode: msg.from?.isSpeaking ? 'speaking' : 'listening'\n });\n\n // Track agent responses for feedback (WebRTC mode needs synthetic event IDs)\n if (message.type === \"agent_response\" && updateCurrentEventId) {\n const eventId = agentResponseCountRef.current++;\n updateCurrentEventId(eventId);\n }\n }\n\n switch (message.type) {\n case \"ping\":\n sendMessage({\n type: \"pong\",\n event_id: message.ping_event.event_id,\n });\n break;\n case \"client_tool_call\":\n handleClientToolCall(message);\n break;\n default:\n callbacks.onDebug?.(message);\n break;\n }\n });\n\n return null;\n};","import React from 'react';\nimport { LiveKitRoom } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ClientToolsConfig } from '../types';\nimport { MessageHandler } from './MessageHandler';\n\ninterface LiveKitRoomWrapperProps {\n children: React.ReactNode;\n serverUrl: string;\n token: string;\n connect: boolean;\n onConnected: () => void;\n onDisconnected: () => void;\n onError: (error: Error) => void;\n roomConnected: boolean;\n callbacks: Callbacks;\n onParticipantReady: (participant: LocalParticipant) => void;\n sendMessage: (message: unknown) => void;\n clientTools: ClientToolsConfig['clientTools'];\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport const LiveKitRoomWrapper = ({\n children,\n serverUrl,\n token,\n connect,\n onConnected,\n onDisconnected,\n onError,\n roomConnected,\n callbacks,\n onParticipantReady,\n sendMessage,\n clientTools,\n updateCurrentEventId,\n}: LiveKitRoomWrapperProps) => {\n return (\n <LiveKitRoom\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n audio={true}\n video={false}\n options={{\n adaptiveStream: { pixelDensity: 'screen' },\n }}\n onConnected={onConnected}\n onDisconnected={onDisconnected}\n onError={onError}\n >\n <MessageHandler\n onReady={onParticipantReady}\n isConnected={roomConnected}\n callbacks={callbacks}\n sendMessage={sendMessage}\n clientTools={clientTools}\n updateCurrentEventId={updateCurrentEventId}\n />\n {children}\n </LiveKitRoom>\n );\n};","import React from 'react';\nimport { createContext, useContext, useState } from 'react';\nimport { registerGlobals } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ConversationConfig, ConversationStatus, ClientToolsConfig } from './types';\nimport { constructOverrides } from './utils/overrides';\nimport { DEFAULT_SERVER_URL } from './utils/constants';\nimport { useConversationCallbacks } from './hooks/useConversationCallbacks';\nimport { useConversationSession } from './hooks/useConversationSession';\nimport { useLiveKitRoom } from './hooks/useLiveKitRoom';\nimport { useMessageSending } from './hooks/useMessageSending';\nimport { LiveKitRoomWrapper } from './components/LiveKitRoomWrapper';\n\ninterface ConversationOptions extends Callbacks, Partial<ClientToolsConfig> {\n serverUrl?: string;\n tokenFetchUrl?: string;\n}\n\nexport interface Conversation {\n startSession: (config: ConversationConfig) => Promise<void>;\n endSession: () => Promise<void>;\n status: ConversationStatus;\n isSpeaking: boolean;\n // TODO: Implement setVolume when LiveKit React Native supports it\n // setVolume: (volume: number) => void;\n canSendFeedback: boolean;\n getId: () => string;\n sendFeedback: (like: boolean) => void;\n sendContextualUpdate: (text: string) => void;\n sendUserMessage: (text: string) => void;\n sendUserActivity: () => void;\n setMicMuted: (muted: boolean) => void;\n}\n\ninterface ElevenLabsContextType {\n conversation: Conversation;\n callbacksRef: { current: Callbacks };\n serverUrl: string;\n tokenFetchUrl?: string;\n clientTools: ClientToolsConfig['clientTools'];\n setCallbacks: (callbacks: Callbacks) => void;\n setServerUrl: (url: string) => void;\n setTokenFetchUrl: (url: string) => void;\n setClientTools: (tools: ClientToolsConfig['clientTools']) => void;\n}\n\nconst ElevenLabsContext = createContext<ElevenLabsContextType | null>(null);\n\nexport const useConversation = (options: ConversationOptions = {}): Conversation => {\n const context = useContext(ElevenLabsContext);\n if (!context) {\n throw new Error('useConversation must be used within ElevenLabsProvider');\n }\n\n const { serverUrl, tokenFetchUrl, clientTools, ...callbacks } = options;\n\n React.useEffect(() => {\n if (serverUrl) {\n context.setServerUrl(serverUrl);\n }\n }, [context, serverUrl]);\n\n React.useEffect(() => {\n if (tokenFetchUrl) {\n context.setTokenFetchUrl(tokenFetchUrl);\n }\n }, [context, tokenFetchUrl]);\n\n if (clientTools) {\n context.setClientTools(clientTools);\n }\n\n context.setCallbacks(callbacks);\n\n return context.conversation;\n};\n\ninterface ElevenLabsProviderProps {\n children: React.ReactNode;\n}\n\nexport const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children }) => {\n // Initialize globals on mount\n registerGlobals();\n\n // State management\n const [token, setToken] = useState('');\n const [connect, setConnect] = useState(false);\n const [status, setStatus] = useState<ConversationStatus>('disconnected');\n const [serverUrl, setServerUrl] = useState(DEFAULT_SERVER_URL);\n const [tokenFetchUrl, setTokenFetchUrl] = useState<string | undefined>(undefined);\n const [conversationId, setConversationId] = useState<string>('');\n const [isSpeaking, setIsSpeaking] = useState(false);\n const [canSendFeedback, setCanSendFeedback] = useState(false);\n\n // Feedback state tracking\n const currentEventIdRef = React.useRef(1);\n const lastFeedbackEventIdRef = React.useRef(1);\n\n // Use ref for clientTools to avoid re-renders (like callbacks)\n const clientToolsRef = React.useRef<ClientToolsConfig['clientTools']>({});\n\n // Custom hooks\n const { callbacksRef, setCallbacks: setCallbacksBase } = useConversationCallbacks();\n\n // Enhanced setCallbacks that wraps onModeChange to update isSpeaking state\n const setCallbacks = React.useCallback((callbacks: Callbacks) => {\n const wrappedCallbacks = {\n ...callbacks,\n onModeChange: (event: { mode: 'speaking' | 'listening' }) => {\n setIsSpeaking(event.mode === 'speaking');\n callbacks.onModeChange?.(event);\n }\n };\n setCallbacksBase(wrappedCallbacks);\n }, [setCallbacksBase]);\n\n const {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n } = useConversationSession(callbacksRef, setStatus, setConnect, setToken, setConversationId, tokenFetchUrl);\n\n const {\n roomConnected,\n localParticipant,\n handleParticipantReady,\n handleConnected,\n handleDisconnected,\n handleError,\n } = useLiveKitRoom(callbacksRef, setStatus, conversationId);\n\n // Enhanced connection handler to initialize feedback state\n const handleConnectedWithFeedback = React.useCallback(() => {\n // Reset feedback state when connecting\n currentEventIdRef.current = 1;\n lastFeedbackEventIdRef.current = 1;\n setCanSendFeedback(false);\n callbacksRef.current.onCanSendFeedbackChange?.({ canSendFeedback: false });\n\n handleConnected();\n }, [handleConnected, callbacksRef]);\n\n // Enhanced disconnection handler to reset feedback state\n const handleDisconnectedWithFeedback = React.useCallback(() => {\n setCanSendFeedback(false);\n handleDisconnected();\n }, [handleDisconnected]);\n\n const { sendMessage } = useMessageSending(status, localParticipant, callbacksRef);\n\n const updateCanSendFeedback = React.useCallback(() => {\n const newCanSendFeedback = currentEventIdRef.current !== lastFeedbackEventIdRef.current;\n\n if (canSendFeedback !== newCanSendFeedback) {\n setCanSendFeedback(newCanSendFeedback);\n callbacksRef.current.onCanSendFeedbackChange?.({ canSendFeedback: newCanSendFeedback });\n }\n }, [canSendFeedback, callbacksRef]);\n\n const sendFeedback = React.useCallback((like: boolean) => {\n if (!canSendFeedback) {\n console.warn(\n lastFeedbackEventIdRef.current === 0\n ? \"Cannot send feedback: the conversation has not started yet.\"\n : \"Cannot send feedback: feedback has already been sent for the current response.\"\n );\n return;\n }\n\n const feedbackMessage = {\n type: \"feedback\",\n score: like ? \"like\" : \"dislike\",\n event_id: currentEventIdRef.current,\n };\n\n sendMessage(feedbackMessage);\n lastFeedbackEventIdRef.current = currentEventIdRef.current;\n updateCanSendFeedback();\n }, [canSendFeedback, sendMessage, updateCanSendFeedback]);\n\n // setVolume placeholder (to be implemented when LiveKit supports it)\n const setVolume = React.useCallback((volume: number) => {\n console.warn('setVolume is not yet implemented in React Native SDK');\n }, []);\n\n const getId = () => conversationId;\n\n const setMicMuted = React.useCallback((muted: boolean) => {\n if (localParticipant) {\n localParticipant.setMicrophoneEnabled(!muted);\n }\n }, [localParticipant]);\n\n // Update current event ID for feedback tracking\n const updateCurrentEventId = React.useCallback((eventId: number) => {\n currentEventIdRef.current = eventId;\n updateCanSendFeedback();\n }, [updateCanSendFeedback]);\n\n // Handle participant ready with overrides\n const handleParticipantReadyWithOverrides = React.useCallback((participant: LocalParticipant) => {\n handleParticipantReady(participant);\n\n if (localParticipant) {\n const overridesEvent = constructOverrides({\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n });\n sendMessage(overridesEvent);\n }\n }, [handleParticipantReady, localParticipant, overrides, customLlmExtraBody, dynamicVariables, userId, sendMessage]);\n\n const conversation: Conversation = {\n startSession,\n endSession,\n status,\n isSpeaking,\n // setVolume,\n canSendFeedback,\n getId,\n setMicMuted,\n sendFeedback,\n sendContextualUpdate: (text: string) => {\n sendMessage({\n type: \"contextual_update\",\n text,\n });\n },\n sendUserMessage: (text: string) => {\n sendMessage({\n type: \"user_message\",\n text,\n });\n },\n sendUserActivity: () => {\n sendMessage({\n type: \"user_activity\",\n });\n },\n };\n\n // Create setClientTools function that only updates ref\n const setClientTools = React.useCallback((tools: ClientToolsConfig['clientTools']) => {\n clientToolsRef.current = tools;\n }, []);\n\n const contextValue: ElevenLabsContextType = {\n conversation,\n callbacksRef,\n serverUrl,\n tokenFetchUrl,\n clientTools: clientToolsRef.current,\n setCallbacks,\n setServerUrl,\n setTokenFetchUrl: setTokenFetchUrl,\n setClientTools,\n };\n\n return (\n <ElevenLabsContext.Provider value={contextValue}>\n <LiveKitRoomWrapper\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n onConnected={handleConnectedWithFeedback}\n onDisconnected={handleDisconnectedWithFeedback}\n onError={handleError}\n roomConnected={roomConnected}\n callbacks={callbacksRef.current}\n onParticipantReady={handleParticipantReadyWithOverrides}\n sendMessage={sendMessage}\n clientTools={clientToolsRef.current}\n updateCurrentEventId={updateCurrentEventId}\n >\n {children}\n </LiveKitRoomWrapper>\n </ElevenLabsContext.Provider>\n );\n};","export const DEFAULT_SERVER_URL = \"wss://livekit.rtc.elevenlabs.io\";\n","import { useRef, useCallback } from \"react\";\nimport type { Callbacks } from \"../types\";\n\nexport const useConversationCallbacks = () => {\n const callbacksRef = useRef<Callbacks>({});\n\n const setCallbacks = useCallback((callbacks: Callbacks) => {\n callbacksRef.current = callbacks;\n }, []);\n\n return {\n callbacksRef,\n setCallbacks,\n };\n};\n","import { useState, useCallback } from \"react\";\nimport type {\n ConversationConfig,\n ConversationStatus,\n Callbacks,\n} from \"../types\";\nimport {\n getConversationToken,\n extractConversationIdFromToken,\n} from \"../utils/tokenUtils\";\n\nexport const useConversationSession = (\n callbacksRef: { current: Callbacks },\n setStatus: (status: ConversationStatus) => void,\n setConnect: (connect: boolean) => void,\n setToken: (token: string) => void,\n setConversationId: (conversationId: string) => void,\n tokenFetchUrl?: string\n) => {\n const [overrides, setOverrides] = useState<ConversationConfig[\"overrides\"]>(\n {}\n );\n const [customLlmExtraBody, setCustomLlmExtraBody] =\n useState<ConversationConfig[\"customLlmExtraBody\"]>(null);\n const [dynamicVariables, setDynamicVariables] = useState<\n ConversationConfig[\"dynamicVariables\"]\n >({});\n const [userId, setUserId] = useState<ConversationConfig[\"userId\"]>(undefined);\n\n const startSession = useCallback(\n async (config: ConversationConfig) => {\n try {\n setStatus(\"connecting\");\n callbacksRef.current.onStatusChange?.({ status: \"connecting\" });\n\n setOverrides(config.overrides || {});\n setCustomLlmExtraBody(config.customLlmExtraBody || null);\n setDynamicVariables(config.dynamicVariables || {});\n setUserId(config.userId);\n\n let conversationToken: string;\n\n if (config.conversationToken) {\n conversationToken = config.conversationToken;\n } else if (config.agentId) {\n console.info(\n \"Getting conversation token for agentId:\",\n config.agentId\n );\n // Use tokenFetchUrl from config first, then from hook parameter, then default\n const urlToUse = config.tokenFetchUrl || tokenFetchUrl;\n conversationToken = await getConversationToken(\n config.agentId,\n urlToUse\n );\n } else {\n throw new Error(\"Either conversationToken or agentId is required\");\n }\n\n const extractedConversationId =\n extractConversationIdFromToken(conversationToken);\n setConversationId(extractedConversationId);\n\n setToken(conversationToken);\n setConnect(true);\n } catch (error) {\n setStatus(\"disconnected\");\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n },\n [\n callbacksRef,\n setStatus,\n setConnect,\n setToken,\n setConversationId,\n tokenFetchUrl,\n ]\n );\n\n const endSession = useCallback(async () => {\n try {\n setConnect(false);\n setToken(\"\");\n setStatus(\"disconnected\");\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onDisconnect?.(\"User ended conversation\");\n } catch (error) {\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n }, [callbacksRef, setConnect, setToken, setStatus]);\n\n return {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n };\n};\n","import { PACKAGE_VERSION } from \"../version\";\n\nexport const extractConversationIdFromToken = (token: string): string => {\n try {\n const tokenPayload = JSON.parse(atob(token.split(\".\")[1]));\n const roomId = tokenPayload.video?.room || \"\";\n\n return roomId.match(/(conv_[a-zA-Z0-9]+)/)?.[0] || \"\";\n } catch (error) {\n console.warn(\"Could not extract conversation ID from token\");\n return \"\";\n }\n};\n\nexport const getConversationToken = async (\n agentId: string,\n tokenFetchUrl?: string\n): Promise<string> => {\n const baseUrl =\n tokenFetchUrl || \"https://api.elevenlabs.io/v1/convai/conversation/token\";\n const response = await fetch(\n `${baseUrl}?agent_id=${agentId}&source=react_native_sdk&version=${PACKAGE_VERSION}`\n );\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(`Failed to get conversation token: ${data.detail.message}`);\n }\n\n if (!data.token) {\n throw new Error(\"No conversation token received from API\");\n }\n\n return data.token;\n};\n","import { useState, useEffect, useCallback } from \"react\";\nimport { AudioSession } from \"@livekit/react-native\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type { ConversationStatus, Callbacks } from \"../types\";\n\nexport const useLiveKitRoom = (\n callbacksRef: { current: Callbacks },\n setStatus: (status: ConversationStatus) => void,\n conversationId: string\n) => {\n const [roomConnected, setRoomConnected] = useState(false);\n const [localParticipant, setLocalParticipant] =\n useState<LocalParticipant | null>(null);\n\n useEffect(() => {\n const start = async () => {\n await AudioSession.startAudioSession();\n };\n\n start();\n return () => {\n AudioSession.stopAudioSession();\n };\n }, []);\n\n const handleParticipantReady = useCallback(\n (participant: LocalParticipant) => {\n setLocalParticipant(participant);\n },\n []\n );\n\n const handleConnected = useCallback(() => {\n setRoomConnected(true);\n setStatus(\"connected\");\n callbacksRef.current.onConnect?.({ conversationId });\n }, [conversationId, callbacksRef, setStatus]);\n\n const handleDisconnected = useCallback(() => {\n setRoomConnected(false);\n setStatus(\"disconnected\");\n setLocalParticipant(null);\n callbacksRef.current.onDisconnect?.(\"disconnected\");\n }, [callbacksRef, setStatus]);\n\n const handleError = useCallback(\n (error: Error) => {\n console.error(\"LiveKit error:\", error);\n callbacksRef.current.onError?.(error.message, undefined);\n },\n [callbacksRef]\n );\n\n return {\n roomConnected,\n localParticipant,\n handleParticipantReady,\n handleConnected,\n handleDisconnected,\n handleError,\n };\n};\n","import { useCallback } from \"react\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type { ConversationStatus, Callbacks } from \"../types\";\n\nexport const useMessageSending = (\n status: ConversationStatus,\n localParticipant: LocalParticipant | null,\n callbacksRef: { current: Callbacks }\n) => {\n const sendMessage = useCallback(\n async (message: unknown) => {\n if (status !== \"connected\" || !localParticipant) {\n console.warn(\n \"Cannot send message: room not connected or no local participant\"\n );\n return;\n }\n try {\n const encoder = new TextEncoder();\n const data = encoder.encode(JSON.stringify(message));\n\n await localParticipant.publishData(data, { reliable: true });\n } catch (error) {\n console.error(\"Failed to send message via WebRTC:\", error);\n console.error(\"Error details:\", error);\n callbacksRef.current.onError?.(error as string);\n }\n },\n [status, localParticipant, callbacksRef]\n );\n\n return { sendMessage };\n};\n","import type { ConversationConfig, InitiationClientDataEvent } from \"../types\";\nimport { PACKAGE_VERSION } from \"../version\";\n\nexport function constructOverrides(\n config: ConversationConfig\n): InitiationClientDataEvent {\n const overridesEvent: InitiationClientDataEvent = {\n type: \"conversation_initiation_client_data\",\n };\n\n if (config.overrides) {\n overridesEvent.conversation_config_override = {\n agent: {\n prompt: config.overrides.agent?.prompt,\n first_message: config.overrides.agent?.firstMessage,\n language: config.overrides.agent?.language,\n },\n tts: {\n voice_id: config.overrides.tts?.voiceId,\n },\n conversation: {\n text_only: config.overrides.conversation?.textOnly,\n },\n source_info: {\n source: \"react_native_sdk\",\n version: config.overrides?.client?.version || PACKAGE_VERSION,\n },\n };\n }\n\n if (config.customLlmExtraBody) {\n overridesEvent.custom_llm_extra_body = config.customLlmExtraBody;\n }\n\n if (config.dynamicVariables) {\n overridesEvent.dynamic_variables = config.dynamicVariables;\n }\n\n if (config.userId) {\n overridesEvent.user_id = String(config.userId);\n }\n\n return overridesEvent;\n}\n"],"names":["PACKAGE_VERSION","MessageHandler","onReady","isConnected","callbacks","sendMessage","clientTools","updateCurrentEventId","localParticipant","useLocalParticipant","agentResponseCountRef","React","useRef","useEffect","useDataChannel","msg","_msg$from","_msg$from2","decoder","TextDecoder","message","JSON","parse","decode","payload","type","_msg$from3","onMessage","source","from","isAgent","onModeChange","mode","isSpeaking","eventId","current","event_id","ping_event","async","Object","prototype","hasOwnProperty","call","clientToolCall","client_tool_call","tool_name","_await$_clientTools$c","result","parameters","formattedResult","stringify","String","tool_call_id","is_error","e","onError","clientToolName","onUnhandledClientToolCall","errorMessage","handleClientToolCall","onDebug","LiveKitRoomWrapper","children","serverUrl","token","connect","onConnected","onDisconnected","roomConnected","onParticipantReady","createElement","LiveKitRoom","audio","video","options","adaptiveStream","pixelDensity","_excluded","ElevenLabsContext","createContext","useConversation","context","useContext","Error","tokenFetchUrl","_objectWithoutPropertiesLoose","setServerUrl","setTokenFetchUrl","setClientTools","setCallbacks","conversation","ElevenLabsProvider","registerGlobals","setToken","useState","setConnect","status","setStatus","undefined","conversationId","setConversationId","setIsSpeaking","canSendFeedback","setCanSendFeedback","currentEventIdRef","lastFeedbackEventIdRef","clientToolsRef","callbacksRef","setCallbacksBase","useConversationCallbacks","useCallback","wrappedCallbacks","_extends","event","startSession","endSession","overrides","customLlmExtraBody","dynamicVariables","userId","useConversationSession","setOverrides","setCustomLlmExtraBody","setDynamicVariables","setUserId","conversationToken","onStatusChange","config","agentId","console","info","urlToUse","baseUrl","response","fetch","data","json","ok","detail","getConversationToken","extractedConversationId","_tokenPayload$video","_roomId$match","atob","split","room","match","error","warn","extractConversationIdFromToken","onDisconnect","handleParticipantReady","handleConnected","handleDisconnected","handleError","useLiveKitRoom","setRoomConnected","setLocalParticipant","AudioSession","startAudioSession","start","stopAudioSession","participant","onConnect","handleConnectedWithFeedback","onCanSendFeedbackChange","handleDisconnectedWithFeedback","useMessageSending","TextEncoder","encode","publishData","reliable","updateCanSendFeedback","newCanSendFeedback","sendFeedback","like","score","volume","setMicMuted","muted","setMicrophoneEnabled","handleParticipantReadyWithOverrides","overridesEvent","_config$overrides$age","_config$overrides$age2","_config$overrides$age3","_config$overrides$tts","_config$overrides$con","_config$overrides","conversation_config_override","agent","prompt","first_message","firstMessage","language","tts","voice_id","voiceId","text_only","textOnly","source_info","version","client","custom_llm_extra_body","dynamic_variables","user_id","constructOverrides","getId","sendContextualUpdate","text","sendUserMessage","sendUserActivity","tools","Provider","value"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import e,{useRef as n,useCallback as t,useState as r,useEffect as o,useContext as c,createContext as a}from"react";import{AudioSession as l,useLocalParticipant as i,useDataChannel as s,LiveKitRoom as u,registerGlobals as d}from"@livekit/react-native";function v(){return v=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)({}).hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},v.apply(null,arguments)}var f="0.2.1",m=function(n){var t=n.onReady,r=n.isConnected,c=n.callbacks,a=n.sendMessage,l=n.clientTools,u=void 0===l?{}:l,d=n.updateCurrentEventId,v=i().localParticipant,f=e.useRef(1);return o(function(){r&&v&&t(v)},[r,v,t]),s(function(e){var n,t,r=new TextDecoder,o=JSON.parse(r.decode(e.payload));if(o.type){var l;if(null==c.onMessage||c.onMessage({message:o,source:null!=(n=e.from)&&n.isAgent?"ai":"user"}),null!=(t=e.from)&&t.isAgent&&(null==c.onModeChange||c.onModeChange({mode:null!=(l=e.from)&&l.isSpeaking?"speaking":"listening"}),"agent_response"===o.type&&d)){var i=f.current++;d(i)}switch(o.type){case"ping":a({type:"pong",event_id:o.ping_event.event_id});break;case"client_tool_call":!function(e){try{return Promise.resolve(function(){if(Object.prototype.hasOwnProperty.call(u,e.client_tool_call.tool_name)){var n=function(n,t){try{var r=Promise.resolve(u[e.client_tool_call.tool_name](e.client_tool_call.parameters)).then(function(n){var t="object"==typeof n?JSON.stringify(n):String(n);a({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:t,is_error:!1})})}catch(e){return t(e)}return r&&r.then?r.then(void 0,t):r}(0,function(n){null==c.onError||c.onError("Client tool execution failed with following error: "+(null==n?void 0:n.message),{clientToolName:e.client_tool_call.tool_name}),a({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:"Client tool execution failed: "+(null==n?void 0:n.message),is_error:!0})});if(n&&n.then)return n.then(function(){})}else{if(c.onUnhandledClientToolCall)return void c.onUnhandledClientToolCall(e);var t="Client tool with name "+e.client_tool_call.tool_name+" is not defined on client";null==c.onError||c.onError(t,{clientToolName:e.client_tool_call.tool_name}),a({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:t,is_error:!0})}}())}catch(e){return Promise.reject(e)}}(o);break;default:null==c.onDebug||c.onDebug(o)}}else null==c.onDebug||c.onDebug({type:"invalid_event",message:o})}),null},h=function(n){var t=n.children;/*#__PURE__*/return e.createElement(u,{serverUrl:n.serverUrl,token:n.token,connect:n.connect,audio:!0,video:!1,options:{adaptiveStream:{pixelDensity:"screen"}},onConnected:n.onConnected,onDisconnected:n.onDisconnected,onError:n.onError},/*#__PURE__*/e.createElement(m,{onReady:n.onParticipantReady,isConnected:n.roomConnected,callbacks:n.callbacks,sendMessage:n.sendMessage,clientTools:n.clientTools,updateCurrentEventId:n.updateCurrentEventId}),t)},g=["serverUrl","tokenFetchUrl","clientTools"],_=/*#__PURE__*/a(null),p=function(n){void 0===n&&(n={});var t=c(_);if(!t)throw new Error("useConversation must be used within ElevenLabsProvider");var r=n.serverUrl,o=n.tokenFetchUrl,a=n.clientTools,l=function(e,n){if(null==e)return{};var t={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(-1!==n.indexOf(r))continue;t[r]=e[r]}return t}(n,g);return e.useEffect(function(){r&&t.setServerUrl(r)},[t,r]),e.useEffect(function(){o&&t.setTokenFetchUrl(o)},[t,o]),a&&t.setClientTools(a),t.setCallbacks(l),t.conversation},C=function(c){var a=c.children;d();var i=r(""),s=i[0],u=i[1],m=r(!1),g=m[0],p=m[1],C=r("disconnected"),k=C[0],y=C[1],b=r("wss://livekit.rtc.elevenlabs.io"),E=b[0],S=b[1],P=r(void 0),w=P[0],x=P[1],T=r(""),U=T[0],D=T[1],F=r(!1),I=F[0],M=F[1],R=r(!1),O=R[0],j=R[1],L=e.useRef(1),N=e.useRef(1),A=e.useRef({}),V=function(){var e=n({}),r=t(function(n){e.current=n},[]);return{callbacksRef:e,setCallbacks:r}}(),B=V.callbacksRef,J=V.setCallbacks,K=e.useCallback(function(e){var n=v({},e,{onModeChange:function(n){M("speaking"===n.mode),null==e.onModeChange||e.onModeChange(n)}});J(n)},[J]),q=function(e,n,o,c,a,l){var i=r({}),s=i[0],u=i[1],d=r(null),v=d[0],m=d[1],h=r({}),g=h[0],_=h[1];return{startSession:t(function(t){try{return Promise.resolve(function(r,i){try{var s=function(){function r(e){var n=function(e){try{var n,t;return(null==(t=((null==(n=JSON.parse(atob(e.split(".")[1])).video)?void 0:n.room)||"").match(/(conv_[a-zA-Z0-9]+)/))?void 0:t[0])||""}catch(e){return console.warn("Could not extract conversation ID from token"),""}}(i);a(n),c(i),o(!0)}var i;n("connecting"),null==e.current.onStatusChange||e.current.onStatusChange({status:"connecting"}),u(t.overrides||{}),m(t.customLlmExtraBody||null),_(t.dynamicVariables||{});var s=function(){if(!t.conversationToken)return function(){if(t.agentId)return console.info("Getting conversation token for agentId:",t.agentId),Promise.resolve(function(e,n){try{return Promise.resolve(fetch((n||"https://api.elevenlabs.io/v1/convai/conversation/token")+"?agent_id="+e+"&source=react_native_sdk&version="+f)).then(function(e){return Promise.resolve(e.json()).then(function(n){if(!e.ok)throw new Error("Failed to get conversation token: "+n.detail.message);if(!n.token)throw new Error("No conversation token received from API");return n.token})})}catch(e){return Promise.reject(e)}}(t.agentId,t.tokenFetchUrl||l)).then(function(e){i=e});throw new Error("Either conversationToken or agentId is required")}();i=t.conversationToken}();return s&&s.then?s.then(r):r()}()}catch(e){return i(e)}return s&&s.then?s.then(void 0,i):s}(0,function(t){throw n("disconnected"),null==e.current.onStatusChange||e.current.onStatusChange({status:"disconnected"}),null==e.current.onError||e.current.onError(t),t}))}catch(e){return Promise.reject(e)}},[e,n,o,c,a,l]),endSession:t(function(){try{try{o(!1),c(""),n("disconnected"),null==e.current.onStatusChange||e.current.onStatusChange({status:"disconnected"}),null==e.current.onDisconnect||e.current.onDisconnect("User ended conversation")}catch(n){throw null==e.current.onError||e.current.onError(n),n}return Promise.resolve()}catch(e){return Promise.reject(e)}},[e,o,c,n]),overrides:s,customLlmExtraBody:v,dynamicVariables:g}}(B,y,p,u,D,w),z=q.startSession,G=q.endSession,W=q.overrides,Z=q.customLlmExtraBody,H=q.dynamicVariables,Q=function(e,n,c){var a=r(!1),i=a[0],s=a[1],u=r(null),d=u[0],v=u[1];return o(function(){return function(){try{return Promise.resolve(l.startAudioSession()).then(function(){})}catch(e){return Promise.reject(e)}}(),function(){l.stopAudioSession()}},[]),{roomConnected:i,localParticipant:d,handleParticipantReady:t(function(e){v(e)},[]),handleConnected:t(function(){s(!0),n("connected"),null==e.current.onConnect||e.current.onConnect({conversationId:c})},[c,e,n]),handleDisconnected:t(function(){s(!1),n("disconnected"),v(null),null==e.current.onDisconnect||e.current.onDisconnect("disconnected")},[e,n]),handleError:t(function(n){console.error("LiveKit error:",n),null==e.current.onError||e.current.onError(n.message,void 0)},[e])}}(B,y,U),X=Q.roomConnected,Y=Q.localParticipant,$=Q.handleParticipantReady,ee=Q.handleConnected,ne=Q.handleDisconnected,te=Q.handleError,re=e.useCallback(function(){L.current=1,N.current=1,j(!1),null==B.current.onCanSendFeedbackChange||B.current.onCanSendFeedbackChange({canSendFeedback:!1}),ee()},[ee,B]),oe=e.useCallback(function(){j(!1),ne()},[ne]),ce=function(e,n,r){return{sendMessage:t(function(t){try{if("connected"!==e||!n)return console.warn("Cannot send message: room not connected or no local participant"),Promise.resolve();var o=function(e,r){try{var o=(c=(new TextEncoder).encode(JSON.stringify(t)),Promise.resolve(n.publishData(c,{reliable:!0})).then(function(){}))}catch(e){return r(e)}var c;return o&&o.then?o.then(void 0,r):o}(0,function(e){console.error("Failed to send message via WebRTC:",e),console.error("Error details:",e),null==r.current.onError||r.current.onError(e)});return Promise.resolve(o&&o.then?o.then(function(){}):void 0)}catch(e){return Promise.reject(e)}},[e,n,r])}}(k,Y,B),ae=ce.sendMessage,le=e.useCallback(function(){var e=L.current!==N.current;O!==e&&(j(e),null==B.current.onCanSendFeedbackChange||B.current.onCanSendFeedbackChange({canSendFeedback:e}))},[O,B]),ie=e.useCallback(function(e){O?(ae({type:"feedback",score:e?"like":"dislike",event_id:L.current}),N.current=L.current,le()):console.warn(0===N.current?"Cannot send feedback: the conversation has not started yet.":"Cannot send feedback: feedback has already been sent for the current response.")},[O,ae,le]);e.useCallback(function(e){console.warn("setVolume is not yet implemented in React Native SDK")},[]);var se=e.useCallback(function(e){L.current=e,le()},[le]),ue=e.useCallback(function(e){if($(e),Y){var n=function(e){var n,t,r,o,c,a,l={type:"conversation_initiation_client_data"};return e.overrides&&(l.conversation_config_override={agent:{prompt:null==(n=e.overrides.agent)?void 0:n.prompt,first_message:null==(t=e.overrides.agent)?void 0:t.firstMessage,language:null==(r=e.overrides.agent)?void 0:r.language},tts:{voice_id:null==(o=e.overrides.tts)?void 0:o.voiceId},conversation:{text_only:null==(c=e.overrides.conversation)?void 0:c.textOnly},source_info:{source:"react_native_sdk",version:(null==(a=e.overrides)||null==(a=a.client)?void 0:a.version)||f}}),e.customLlmExtraBody&&(l.custom_llm_extra_body=e.customLlmExtraBody),e.dynamicVariables&&(l.dynamic_variables=e.dynamicVariables),e.userId&&(l.user_id=e.userId),l}({overrides:W,customLlmExtraBody:Z,dynamicVariables:H});ae(n)}},[$,Y,W,Z,H,ae]),de={startSession:z,endSession:G,status:k,isSpeaking:I,canSendFeedback:O,getId:function(){return U},sendFeedback:ie,sendContextualUpdate:function(e){ae({type:"contextual_update",text:e})},sendUserMessage:function(e){ae({type:"user_message",text:e})},sendUserActivity:function(){ae({type:"user_activity"})}},ve=e.useCallback(function(e){A.current=e},[]);/*#__PURE__*/return e.createElement(_.Provider,{value:{conversation:de,callbacksRef:B,serverUrl:E,tokenFetchUrl:w,clientTools:A.current,setCallbacks:K,setServerUrl:S,setTokenFetchUrl:x,setClientTools:ve}},/*#__PURE__*/e.createElement(h,{serverUrl:E,token:s,connect:g,onConnected:re,onDisconnected:oe,onError:te,roomConnected:X,callbacks:B.current,onParticipantReady:ue,sendMessage:ae,clientTools:A.current,updateCurrentEventId:se},a))};export{C as ElevenLabsProvider,p as useConversation};
1
+ import e,{useRef as n,useCallback as t,useState as r,useEffect as o,useContext as c,createContext as a}from"react";import{AudioSession as i,useLocalParticipant as l,useDataChannel as s,LiveKitRoom as u,registerGlobals as d}from"@livekit/react-native";function v(){return v=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)({}).hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},v.apply(null,arguments)}var f="0.3.0",h=function(n){var t=n.onReady,r=n.isConnected,c=n.callbacks,a=n.sendMessage,i=n.clientTools,u=void 0===i?{}:i,d=n.updateCurrentEventId,v=l().localParticipant,f=e.useRef(1);return o(function(){r&&v&&t(v)},[r,v,t]),s(function(e){var n,t,r=new TextDecoder,o=JSON.parse(r.decode(e.payload));if(o.type){var i;if(null==c.onMessage||c.onMessage({message:o,source:null!=(n=e.from)&&n.isAgent?"ai":"user"}),null!=(t=e.from)&&t.isAgent&&(null==c.onModeChange||c.onModeChange({mode:null!=(i=e.from)&&i.isSpeaking?"speaking":"listening"}),"agent_response"===o.type&&d)){var l=f.current++;d(l)}switch(o.type){case"ping":a({type:"pong",event_id:o.ping_event.event_id});break;case"client_tool_call":!function(e){try{return Promise.resolve(function(){if(Object.prototype.hasOwnProperty.call(u,e.client_tool_call.tool_name)){var n=function(n,t){try{var r=Promise.resolve(u[e.client_tool_call.tool_name](e.client_tool_call.parameters)).then(function(n){var t="object"==typeof n?JSON.stringify(n):String(n);a({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:t,is_error:!1})})}catch(e){return t(e)}return r&&r.then?r.then(void 0,t):r}(0,function(n){null==c.onError||c.onError("Client tool execution failed with following error: "+(null==n?void 0:n.message),{clientToolName:e.client_tool_call.tool_name}),a({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:"Client tool execution failed: "+(null==n?void 0:n.message),is_error:!0})});if(n&&n.then)return n.then(function(){})}else{if(c.onUnhandledClientToolCall)return void c.onUnhandledClientToolCall(e);var t="Client tool with name "+e.client_tool_call.tool_name+" is not defined on client";null==c.onError||c.onError(t,{clientToolName:e.client_tool_call.tool_name}),a({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:t,is_error:!0})}}())}catch(e){return Promise.reject(e)}}(o);break;default:null==c.onDebug||c.onDebug(o)}}else null==c.onDebug||c.onDebug({type:"invalid_event",message:o})}),null},m=function(n){var t=n.children;/*#__PURE__*/return e.createElement(u,{serverUrl:n.serverUrl,token:n.token,connect:n.connect,audio:!0,video:!1,options:{adaptiveStream:{pixelDensity:"screen"}},onConnected:n.onConnected,onDisconnected:n.onDisconnected,onError:n.onError},/*#__PURE__*/e.createElement(h,{onReady:n.onParticipantReady,isConnected:n.roomConnected,callbacks:n.callbacks,sendMessage:n.sendMessage,clientTools:n.clientTools,updateCurrentEventId:n.updateCurrentEventId}),t)},g=["serverUrl","tokenFetchUrl","clientTools"],_=/*#__PURE__*/a(null),p=function(n){void 0===n&&(n={});var t=c(_);if(!t)throw new Error("useConversation must be used within ElevenLabsProvider");var r=n.serverUrl,o=n.tokenFetchUrl,a=n.clientTools,i=function(e,n){if(null==e)return{};var t={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(-1!==n.indexOf(r))continue;t[r]=e[r]}return t}(n,g);return e.useEffect(function(){r&&t.setServerUrl(r)},[t,r]),e.useEffect(function(){o&&t.setTokenFetchUrl(o)},[t,o]),a&&t.setClientTools(a),t.setCallbacks(i),t.conversation},C=function(c){var a=c.children;d();var l=r(""),s=l[0],u=l[1],h=r(!1),g=h[0],p=h[1],C=r("disconnected"),k=C[0],b=C[1],y=r("wss://livekit.rtc.elevenlabs.io"),E=y[0],S=y[1],P=r(void 0),w=P[0],x=P[1],T=r(""),I=T[0],U=T[1],D=r(!1),M=D[0],F=D[1],R=r(!1),O=R[0],j=R[1],L=e.useRef(1),N=e.useRef(1),A=e.useRef({}),V=function(){var e=n({}),r=t(function(n){e.current=n},[]);return{callbacksRef:e,setCallbacks:r}}(),B=V.callbacksRef,J=V.setCallbacks,K=e.useCallback(function(e){var n=v({},e,{onModeChange:function(n){F("speaking"===n.mode),null==e.onModeChange||e.onModeChange(n)}});J(n)},[J]),q=function(e,n,o,c,a,i){var l=r({}),s=l[0],u=l[1],d=r(null),v=d[0],h=d[1],m=r({}),g=m[0],_=m[1],p=r(void 0),C=p[0],k=p[1];return{startSession:t(function(t){try{return Promise.resolve(function(r,l){try{var s=function(){function r(e){var n=function(e){try{var n,t;return(null==(t=((null==(n=JSON.parse(atob(e.split(".")[1])).video)?void 0:n.room)||"").match(/(conv_[a-zA-Z0-9]+)/))?void 0:t[0])||""}catch(e){return console.warn("Could not extract conversation ID from token"),""}}(l);a(n),c(l),o(!0)}var l;n("connecting"),null==e.current.onStatusChange||e.current.onStatusChange({status:"connecting"}),u(t.overrides||{}),h(t.customLlmExtraBody||null),_(t.dynamicVariables||{}),k(t.userId);var s=function(){if(!t.conversationToken)return function(){if(t.agentId)return console.info("Getting conversation token for agentId:",t.agentId),Promise.resolve(function(e,n){try{return Promise.resolve(fetch((n||"https://api.elevenlabs.io/v1/convai/conversation/token")+"?agent_id="+e+"&source=react_native_sdk&version="+f)).then(function(e){return Promise.resolve(e.json()).then(function(n){if(!e.ok)throw new Error("Failed to get conversation token: "+n.detail.message);if(!n.token)throw new Error("No conversation token received from API");return n.token})})}catch(e){return Promise.reject(e)}}(t.agentId,t.tokenFetchUrl||i)).then(function(e){l=e});throw new Error("Either conversationToken or agentId is required")}();l=t.conversationToken}();return s&&s.then?s.then(r):r()}()}catch(e){return l(e)}return s&&s.then?s.then(void 0,l):s}(0,function(t){throw n("disconnected"),null==e.current.onStatusChange||e.current.onStatusChange({status:"disconnected"}),null==e.current.onError||e.current.onError(t),t}))}catch(e){return Promise.reject(e)}},[e,n,o,c,a,i]),endSession:t(function(){try{try{o(!1),c(""),n("disconnected"),null==e.current.onStatusChange||e.current.onStatusChange({status:"disconnected"}),null==e.current.onDisconnect||e.current.onDisconnect("User ended conversation")}catch(n){throw null==e.current.onError||e.current.onError(n),n}return Promise.resolve()}catch(e){return Promise.reject(e)}},[e,o,c,n]),overrides:s,customLlmExtraBody:v,dynamicVariables:g,userId:C}}(B,b,p,u,U,w),z=q.startSession,G=q.endSession,W=q.overrides,Z=q.customLlmExtraBody,H=q.dynamicVariables,Q=q.userId,X=function(e,n,c){var a=r(!1),l=a[0],s=a[1],u=r(null),d=u[0],v=u[1];return o(function(){return function(){try{return Promise.resolve(i.startAudioSession()).then(function(){})}catch(e){return Promise.reject(e)}}(),function(){i.stopAudioSession()}},[]),{roomConnected:l,localParticipant:d,handleParticipantReady:t(function(e){v(e)},[]),handleConnected:t(function(){s(!0),n("connected"),null==e.current.onConnect||e.current.onConnect({conversationId:c})},[c,e,n]),handleDisconnected:t(function(){s(!1),n("disconnected"),v(null),null==e.current.onDisconnect||e.current.onDisconnect("disconnected")},[e,n]),handleError:t(function(n){console.error("LiveKit error:",n),null==e.current.onError||e.current.onError(n.message,void 0)},[e])}}(B,b,I),Y=X.roomConnected,$=X.localParticipant,ee=X.handleParticipantReady,ne=X.handleConnected,te=X.handleDisconnected,re=X.handleError,oe=e.useCallback(function(){L.current=1,N.current=1,j(!1),null==B.current.onCanSendFeedbackChange||B.current.onCanSendFeedbackChange({canSendFeedback:!1}),ne()},[ne,B]),ce=e.useCallback(function(){j(!1),te()},[te]),ae=function(e,n,r){return{sendMessage:t(function(t){try{if("connected"!==e||!n)return console.warn("Cannot send message: room not connected or no local participant"),Promise.resolve();var o=function(e,r){try{var o=(c=(new TextEncoder).encode(JSON.stringify(t)),Promise.resolve(n.publishData(c,{reliable:!0})).then(function(){}))}catch(e){return r(e)}var c;return o&&o.then?o.then(void 0,r):o}(0,function(e){console.error("Failed to send message via WebRTC:",e),console.error("Error details:",e),null==r.current.onError||r.current.onError(e)});return Promise.resolve(o&&o.then?o.then(function(){}):void 0)}catch(e){return Promise.reject(e)}},[e,n,r])}}(k,$,B),ie=ae.sendMessage,le=e.useCallback(function(){var e=L.current!==N.current;O!==e&&(j(e),null==B.current.onCanSendFeedbackChange||B.current.onCanSendFeedbackChange({canSendFeedback:e}))},[O,B]),se=e.useCallback(function(e){O?(ie({type:"feedback",score:e?"like":"dislike",event_id:L.current}),N.current=L.current,le()):console.warn(0===N.current?"Cannot send feedback: the conversation has not started yet.":"Cannot send feedback: feedback has already been sent for the current response.")},[O,ie,le]);e.useCallback(function(e){console.warn("setVolume is not yet implemented in React Native SDK")},[]);var ue=e.useCallback(function(e){$&&$.setMicrophoneEnabled(!e)},[$]),de=e.useCallback(function(e){L.current=e,le()},[le]),ve=e.useCallback(function(e){if(ee(e),$){var n=function(e){var n,t,r,o,c,a,i={type:"conversation_initiation_client_data"};return e.overrides&&(i.conversation_config_override={agent:{prompt:null==(n=e.overrides.agent)?void 0:n.prompt,first_message:null==(t=e.overrides.agent)?void 0:t.firstMessage,language:null==(r=e.overrides.agent)?void 0:r.language},tts:{voice_id:null==(o=e.overrides.tts)?void 0:o.voiceId},conversation:{text_only:null==(c=e.overrides.conversation)?void 0:c.textOnly},source_info:{source:"react_native_sdk",version:(null==(a=e.overrides)||null==(a=a.client)?void 0:a.version)||f}}),e.customLlmExtraBody&&(i.custom_llm_extra_body=e.customLlmExtraBody),e.dynamicVariables&&(i.dynamic_variables=e.dynamicVariables),e.userId&&(i.user_id=String(e.userId)),i}({overrides:W,customLlmExtraBody:Z,dynamicVariables:H,userId:Q});ie(n)}},[ee,$,W,Z,H,Q,ie]),fe={startSession:z,endSession:G,status:k,isSpeaking:M,canSendFeedback:O,getId:function(){return I},setMicMuted:ue,sendFeedback:se,sendContextualUpdate:function(e){ie({type:"contextual_update",text:e})},sendUserMessage:function(e){ie({type:"user_message",text:e})},sendUserActivity:function(){ie({type:"user_activity"})}},he=e.useCallback(function(e){A.current=e},[]);/*#__PURE__*/return e.createElement(_.Provider,{value:{conversation:fe,callbacksRef:B,serverUrl:E,tokenFetchUrl:w,clientTools:A.current,setCallbacks:K,setServerUrl:S,setTokenFetchUrl:x,setClientTools:he}},/*#__PURE__*/e.createElement(m,{serverUrl:E,token:s,connect:g,onConnected:oe,onDisconnected:ce,onError:re,roomConnected:Y,callbacks:B.current,onParticipantReady:ve,sendMessage:ie,clientTools:A.current,updateCurrentEventId:de},a))};export{C as ElevenLabsProvider,p as useConversation};
2
2
  //# sourceMappingURL=lib.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lib.module.js","sources":["../src/version.ts","../src/components/MessageHandler.tsx","../src/components/LiveKitRoomWrapper.tsx","../src/ElevenLabsProvider.tsx","../src/utils/constants.ts","../src/hooks/useConversationCallbacks.ts","../src/hooks/useConversationSession.ts","../src/utils/tokenUtils.ts","../src/hooks/useLiveKitRoom.ts","../src/hooks/useMessageSending.ts","../src/utils/overrides.ts"],"sourcesContent":["// This file is auto-generated during build\nexport const PACKAGE_VERSION = \"0.2.1\";\n","import { useEffect } from 'react';\nimport { useLocalParticipant, useDataChannel } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ClientToolsConfig, ClientToolCallEvent, ConversationEvent } from '../types';\nimport React from 'react';\n\ninterface MessageHandlerProps {\n onReady: (participant: LocalParticipant) => void;\n isConnected: boolean;\n callbacks: Callbacks;\n sendMessage: (message: unknown) => void;\n clientTools?: ClientToolsConfig['clientTools'];\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport function isValidEvent(event: any): event is ConversationEvent {\n return !!event.type;\n}\n\nexport const MessageHandler = ({\n onReady,\n isConnected,\n callbacks,\n sendMessage,\n clientTools = {},\n updateCurrentEventId\n}: MessageHandlerProps) => {\n const { localParticipant } = useLocalParticipant();\n\n // Track agent response count for synthetic event IDs (WebRTC mode)\n const agentResponseCountRef = React.useRef(1);\n\n useEffect(() => {\n if (isConnected && localParticipant) {\n onReady(localParticipant);\n }\n }, [isConnected, localParticipant, onReady]);\n\n const handleClientToolCall = async (clientToolCall: ClientToolCallEvent) => {\n if (\n Object.prototype.hasOwnProperty.call(\n clientTools,\n clientToolCall.client_tool_call.tool_name\n )\n ) {\n try {\n const result =\n (await clientTools[clientToolCall.client_tool_call.tool_name](\n clientToolCall.client_tool_call.parameters\n )) ?? \"Client tool execution successful.\"; // default client-tool call response\n\n // The API expects result to be a string, so we need to convert it if it's not already a string\n const formattedResult =\n typeof result === \"object\" ? JSON.stringify(result) : String(result);\n\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: formattedResult,\n is_error: false,\n });\n } catch (e) {\n const errorMessage = `Client tool execution failed with following error: ${(e as Error)?.message}`;\n callbacks.onError?.(errorMessage, {\n clientToolName: clientToolCall.client_tool_call.tool_name,\n });\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: `Client tool execution failed: ${(e as Error)?.message}`,\n is_error: true,\n });\n }\n } else {\n if (callbacks.onUnhandledClientToolCall) {\n callbacks.onUnhandledClientToolCall(clientToolCall);\n return;\n }\n\n const errorMessage = `Client tool with name ${clientToolCall.client_tool_call.tool_name} is not defined on client`;\n callbacks.onError?.(errorMessage, {\n clientToolName: clientToolCall.client_tool_call.tool_name,\n });\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: errorMessage,\n is_error: true,\n });\n }\n };\n\n const _ = useDataChannel((msg) => {\n const decoder = new TextDecoder();\n const message = JSON.parse(decoder.decode(msg.payload));\n\n if (!isValidEvent(message)) {\n callbacks.onDebug?.({\n type: \"invalid_event\",\n message,\n });\n return;\n }\n\n callbacks.onMessage?.({\n message,\n source: msg.from?.isAgent ? 'ai' : 'user',\n });\n\n if (msg.from?.isAgent) {\n callbacks.onModeChange?.({\n mode: msg.from?.isSpeaking ? 'speaking' : 'listening'\n });\n\n // Track agent responses for feedback (WebRTC mode needs synthetic event IDs)\n if (message.type === \"agent_response\" && updateCurrentEventId) {\n const eventId = agentResponseCountRef.current++;\n updateCurrentEventId(eventId);\n }\n }\n\n switch (message.type) {\n case \"ping\":\n sendMessage({\n type: \"pong\",\n event_id: message.ping_event.event_id,\n });\n break;\n case \"client_tool_call\":\n handleClientToolCall(message);\n break;\n default:\n callbacks.onDebug?.(message);\n break;\n }\n });\n\n return null;\n};","import React from 'react';\nimport { LiveKitRoom } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ClientToolsConfig } from '../types';\nimport { MessageHandler } from './MessageHandler';\n\ninterface LiveKitRoomWrapperProps {\n children: React.ReactNode;\n serverUrl: string;\n token: string;\n connect: boolean;\n onConnected: () => void;\n onDisconnected: () => void;\n onError: (error: Error) => void;\n roomConnected: boolean;\n callbacks: Callbacks;\n onParticipantReady: (participant: LocalParticipant) => void;\n sendMessage: (message: unknown) => void;\n clientTools: ClientToolsConfig['clientTools'];\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport const LiveKitRoomWrapper = ({\n children,\n serverUrl,\n token,\n connect,\n onConnected,\n onDisconnected,\n onError,\n roomConnected,\n callbacks,\n onParticipantReady,\n sendMessage,\n clientTools,\n updateCurrentEventId,\n}: LiveKitRoomWrapperProps) => {\n return (\n <LiveKitRoom\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n audio={true}\n video={false}\n options={{\n adaptiveStream: { pixelDensity: 'screen' },\n }}\n onConnected={onConnected}\n onDisconnected={onDisconnected}\n onError={onError}\n >\n <MessageHandler\n onReady={onParticipantReady}\n isConnected={roomConnected}\n callbacks={callbacks}\n sendMessage={sendMessage}\n clientTools={clientTools}\n updateCurrentEventId={updateCurrentEventId}\n />\n {children}\n </LiveKitRoom>\n );\n};","import React from 'react';\nimport { createContext, useContext, useState } from 'react';\nimport { registerGlobals } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ConversationConfig, ConversationStatus, ClientToolsConfig } from './types';\nimport { constructOverrides } from './utils/overrides';\nimport { DEFAULT_SERVER_URL } from './utils/constants';\nimport { useConversationCallbacks } from './hooks/useConversationCallbacks';\nimport { useConversationSession } from './hooks/useConversationSession';\nimport { useLiveKitRoom } from './hooks/useLiveKitRoom';\nimport { useMessageSending } from './hooks/useMessageSending';\nimport { LiveKitRoomWrapper } from './components/LiveKitRoomWrapper';\n\ninterface ConversationOptions extends Callbacks, Partial<ClientToolsConfig> {\n serverUrl?: string;\n tokenFetchUrl?: string;\n}\n\nexport interface Conversation {\n startSession: (config: ConversationConfig) => Promise<void>;\n endSession: () => Promise<void>;\n status: ConversationStatus;\n isSpeaking: boolean;\n // TODO: Implement setVolume when LiveKit React Native supports it\n // setVolume: (volume: number) => void;\n canSendFeedback: boolean;\n getId: () => string;\n sendFeedback: (like: boolean) => void;\n sendContextualUpdate: (text: string) => void;\n sendUserMessage: (text: string) => void;\n sendUserActivity: () => void;\n}\n\ninterface ElevenLabsContextType {\n conversation: Conversation;\n callbacksRef: { current: Callbacks };\n serverUrl: string;\n tokenFetchUrl?: string;\n clientTools: ClientToolsConfig['clientTools'];\n setCallbacks: (callbacks: Callbacks) => void;\n setServerUrl: (url: string) => void;\n setTokenFetchUrl: (url: string) => void;\n setClientTools: (tools: ClientToolsConfig['clientTools']) => void;\n}\n\nconst ElevenLabsContext = createContext<ElevenLabsContextType | null>(null);\n\nexport const useConversation = (options: ConversationOptions = {}): Conversation => {\n const context = useContext(ElevenLabsContext);\n if (!context) {\n throw new Error('useConversation must be used within ElevenLabsProvider');\n }\n\n const { serverUrl, tokenFetchUrl, clientTools, ...callbacks } = options;\n\n React.useEffect(() => {\n if (serverUrl) {\n context.setServerUrl(serverUrl);\n }\n }, [context, serverUrl]);\n\n React.useEffect(() => {\n if (tokenFetchUrl) {\n context.setTokenFetchUrl(tokenFetchUrl);\n }\n }, [context, tokenFetchUrl]);\n\n if (clientTools) {\n context.setClientTools(clientTools);\n }\n\n context.setCallbacks(callbacks);\n\n return context.conversation;\n};\n\ninterface ElevenLabsProviderProps {\n children: React.ReactNode;\n}\n\nexport const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children }) => {\n // Initialize globals on mount\n registerGlobals();\n\n // State management\n const [token, setToken] = useState('');\n const [connect, setConnect] = useState(false);\n const [status, setStatus] = useState<ConversationStatus>('disconnected');\n const [serverUrl, setServerUrl] = useState(DEFAULT_SERVER_URL);\n const [tokenFetchUrl, setTokenFetchUrl] = useState<string | undefined>(undefined);\n const [conversationId, setConversationId] = useState<string>('');\n const [isSpeaking, setIsSpeaking] = useState(false);\n const [canSendFeedback, setCanSendFeedback] = useState(false);\n\n // Feedback state tracking\n const currentEventIdRef = React.useRef(1);\n const lastFeedbackEventIdRef = React.useRef(1);\n\n // Use ref for clientTools to avoid re-renders (like callbacks)\n const clientToolsRef = React.useRef<ClientToolsConfig['clientTools']>({});\n\n // Custom hooks\n const { callbacksRef, setCallbacks: setCallbacksBase } = useConversationCallbacks();\n\n // Enhanced setCallbacks that wraps onModeChange to update isSpeaking state\n const setCallbacks = React.useCallback((callbacks: Callbacks) => {\n const wrappedCallbacks = {\n ...callbacks,\n onModeChange: (event: { mode: 'speaking' | 'listening' }) => {\n setIsSpeaking(event.mode === 'speaking');\n callbacks.onModeChange?.(event);\n }\n };\n setCallbacksBase(wrappedCallbacks);\n }, [setCallbacksBase]);\n\n const {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n } = useConversationSession(callbacksRef, setStatus, setConnect, setToken, setConversationId, tokenFetchUrl);\n\n const {\n roomConnected,\n localParticipant,\n handleParticipantReady,\n handleConnected,\n handleDisconnected,\n handleError,\n } = useLiveKitRoom(callbacksRef, setStatus, conversationId);\n\n // Enhanced connection handler to initialize feedback state\n const handleConnectedWithFeedback = React.useCallback(() => {\n // Reset feedback state when connecting\n currentEventIdRef.current = 1;\n lastFeedbackEventIdRef.current = 1;\n setCanSendFeedback(false);\n callbacksRef.current.onCanSendFeedbackChange?.({ canSendFeedback: false });\n\n handleConnected();\n }, [handleConnected, callbacksRef]);\n\n // Enhanced disconnection handler to reset feedback state\n const handleDisconnectedWithFeedback = React.useCallback(() => {\n setCanSendFeedback(false);\n handleDisconnected();\n }, [handleDisconnected]);\n\n const { sendMessage } = useMessageSending(status, localParticipant, callbacksRef);\n\n const updateCanSendFeedback = React.useCallback(() => {\n const newCanSendFeedback = currentEventIdRef.current !== lastFeedbackEventIdRef.current;\n\n if (canSendFeedback !== newCanSendFeedback) {\n setCanSendFeedback(newCanSendFeedback);\n callbacksRef.current.onCanSendFeedbackChange?.({ canSendFeedback: newCanSendFeedback });\n }\n }, [canSendFeedback, callbacksRef]);\n\n const sendFeedback = React.useCallback((like: boolean) => {\n if (!canSendFeedback) {\n console.warn(\n lastFeedbackEventIdRef.current === 0\n ? \"Cannot send feedback: the conversation has not started yet.\"\n : \"Cannot send feedback: feedback has already been sent for the current response.\"\n );\n return;\n }\n\n const feedbackMessage = {\n type: \"feedback\",\n score: like ? \"like\" : \"dislike\",\n event_id: currentEventIdRef.current,\n };\n\n sendMessage(feedbackMessage);\n lastFeedbackEventIdRef.current = currentEventIdRef.current;\n updateCanSendFeedback();\n }, [canSendFeedback, sendMessage, updateCanSendFeedback]);\n\n // setVolume placeholder (to be implemented when LiveKit supports it)\n const setVolume = React.useCallback((volume: number) => {\n console.warn('setVolume is not yet implemented in React Native SDK');\n }, []);\n\n const getId = () => conversationId;\n\n // Update current event ID for feedback tracking\n const updateCurrentEventId = React.useCallback((eventId: number) => {\n currentEventIdRef.current = eventId;\n updateCanSendFeedback();\n }, [updateCanSendFeedback]);\n\n // Handle participant ready with overrides\n const handleParticipantReadyWithOverrides = React.useCallback((participant: LocalParticipant) => {\n handleParticipantReady(participant);\n\n if (localParticipant) {\n const overridesEvent = constructOverrides({\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n });\n sendMessage(overridesEvent);\n }\n }, [handleParticipantReady, localParticipant, overrides, customLlmExtraBody, dynamicVariables, sendMessage]);\n\n const conversation: Conversation = {\n startSession,\n endSession,\n status,\n isSpeaking,\n // setVolume,\n canSendFeedback,\n getId,\n sendFeedback,\n sendContextualUpdate: (text: string) => {\n sendMessage({\n type: \"contextual_update\",\n text,\n });\n },\n sendUserMessage: (text: string) => {\n sendMessage({\n type: \"user_message\",\n text,\n });\n },\n sendUserActivity: () => {\n sendMessage({\n type: \"user_activity\",\n });\n },\n };\n\n // Create setClientTools function that only updates ref\n const setClientTools = React.useCallback((tools: ClientToolsConfig['clientTools']) => {\n clientToolsRef.current = tools;\n }, []);\n\n const contextValue: ElevenLabsContextType = {\n conversation,\n callbacksRef,\n serverUrl,\n tokenFetchUrl,\n clientTools: clientToolsRef.current,\n setCallbacks,\n setServerUrl,\n setTokenFetchUrl: setTokenFetchUrl,\n setClientTools,\n };\n\n return (\n <ElevenLabsContext.Provider value={contextValue}>\n <LiveKitRoomWrapper\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n onConnected={handleConnectedWithFeedback}\n onDisconnected={handleDisconnectedWithFeedback}\n onError={handleError}\n roomConnected={roomConnected}\n callbacks={callbacksRef.current}\n onParticipantReady={handleParticipantReadyWithOverrides}\n sendMessage={sendMessage}\n clientTools={clientToolsRef.current}\n updateCurrentEventId={updateCurrentEventId}\n >\n {children}\n </LiveKitRoomWrapper>\n </ElevenLabsContext.Provider>\n );\n};","export const DEFAULT_SERVER_URL = \"wss://livekit.rtc.elevenlabs.io\";\n","import { useRef, useCallback } from \"react\";\nimport type { Callbacks } from \"../types\";\n\nexport const useConversationCallbacks = () => {\n const callbacksRef = useRef<Callbacks>({});\n\n const setCallbacks = useCallback((callbacks: Callbacks) => {\n callbacksRef.current = callbacks;\n }, []);\n\n return {\n callbacksRef,\n setCallbacks,\n };\n};\n","import { useState, useCallback } from \"react\";\nimport type {\n ConversationConfig,\n ConversationStatus,\n Callbacks,\n} from \"../types\";\nimport {\n getConversationToken,\n extractConversationIdFromToken,\n} from \"../utils/tokenUtils\";\n\nexport const useConversationSession = (\n callbacksRef: { current: Callbacks },\n setStatus: (status: ConversationStatus) => void,\n setConnect: (connect: boolean) => void,\n setToken: (token: string) => void,\n setConversationId: (conversationId: string) => void,\n tokenFetchUrl?: string\n) => {\n const [overrides, setOverrides] = useState<ConversationConfig[\"overrides\"]>(\n {}\n );\n const [customLlmExtraBody, setCustomLlmExtraBody] =\n useState<ConversationConfig[\"customLlmExtraBody\"]>(null);\n const [dynamicVariables, setDynamicVariables] = useState<\n ConversationConfig[\"dynamicVariables\"]\n >({});\n\n const startSession = useCallback(\n async (config: ConversationConfig) => {\n try {\n setStatus(\"connecting\");\n callbacksRef.current.onStatusChange?.({ status: \"connecting\" });\n\n setOverrides(config.overrides || {});\n setCustomLlmExtraBody(config.customLlmExtraBody || null);\n setDynamicVariables(config.dynamicVariables || {});\n\n let conversationToken: string;\n\n if (config.conversationToken) {\n conversationToken = config.conversationToken;\n } else if (config.agentId) {\n console.info(\n \"Getting conversation token for agentId:\",\n config.agentId\n );\n // Use tokenFetchUrl from config first, then from hook parameter, then default\n const urlToUse = config.tokenFetchUrl || tokenFetchUrl;\n conversationToken = await getConversationToken(\n config.agentId,\n urlToUse\n );\n } else {\n throw new Error(\"Either conversationToken or agentId is required\");\n }\n\n const extractedConversationId =\n extractConversationIdFromToken(conversationToken);\n setConversationId(extractedConversationId);\n\n setToken(conversationToken);\n setConnect(true);\n } catch (error) {\n setStatus(\"disconnected\");\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n },\n [\n callbacksRef,\n setStatus,\n setConnect,\n setToken,\n setConversationId,\n tokenFetchUrl,\n ]\n );\n\n const endSession = useCallback(async () => {\n try {\n setConnect(false);\n setToken(\"\");\n setStatus(\"disconnected\");\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onDisconnect?.(\"User ended conversation\");\n } catch (error) {\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n }, [callbacksRef, setConnect, setToken, setStatus]);\n\n return {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n };\n};\n","import { PACKAGE_VERSION } from \"../version\";\n\nexport const extractConversationIdFromToken = (token: string): string => {\n try {\n const tokenPayload = JSON.parse(atob(token.split(\".\")[1]));\n const roomId = tokenPayload.video?.room || \"\";\n\n return roomId.match(/(conv_[a-zA-Z0-9]+)/)?.[0] || \"\";\n } catch (error) {\n console.warn(\"Could not extract conversation ID from token\");\n return \"\";\n }\n};\n\nexport const getConversationToken = async (\n agentId: string,\n tokenFetchUrl?: string\n): Promise<string> => {\n const baseUrl =\n tokenFetchUrl || \"https://api.elevenlabs.io/v1/convai/conversation/token\";\n const response = await fetch(\n `${baseUrl}?agent_id=${agentId}&source=react_native_sdk&version=${PACKAGE_VERSION}`\n );\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(`Failed to get conversation token: ${data.detail.message}`);\n }\n\n if (!data.token) {\n throw new Error(\"No conversation token received from API\");\n }\n\n return data.token;\n};\n","import { useState, useEffect, useCallback } from \"react\";\nimport { AudioSession } from \"@livekit/react-native\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type { ConversationStatus, Callbacks } from \"../types\";\n\nexport const useLiveKitRoom = (\n callbacksRef: { current: Callbacks },\n setStatus: (status: ConversationStatus) => void,\n conversationId: string\n) => {\n const [roomConnected, setRoomConnected] = useState(false);\n const [localParticipant, setLocalParticipant] =\n useState<LocalParticipant | null>(null);\n\n useEffect(() => {\n const start = async () => {\n await AudioSession.startAudioSession();\n };\n\n start();\n return () => {\n AudioSession.stopAudioSession();\n };\n }, []);\n\n const handleParticipantReady = useCallback(\n (participant: LocalParticipant) => {\n setLocalParticipant(participant);\n },\n []\n );\n\n const handleConnected = useCallback(() => {\n setRoomConnected(true);\n setStatus(\"connected\");\n callbacksRef.current.onConnect?.({ conversationId });\n }, [conversationId, callbacksRef, setStatus]);\n\n const handleDisconnected = useCallback(() => {\n setRoomConnected(false);\n setStatus(\"disconnected\");\n setLocalParticipant(null);\n callbacksRef.current.onDisconnect?.(\"disconnected\");\n }, [callbacksRef, setStatus]);\n\n const handleError = useCallback(\n (error: Error) => {\n console.error(\"LiveKit error:\", error);\n callbacksRef.current.onError?.(error.message, undefined);\n },\n [callbacksRef]\n );\n\n return {\n roomConnected,\n localParticipant,\n handleParticipantReady,\n handleConnected,\n handleDisconnected,\n handleError,\n };\n};\n","import { useCallback } from \"react\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type { ConversationStatus, Callbacks } from \"../types\";\n\nexport const useMessageSending = (\n status: ConversationStatus,\n localParticipant: LocalParticipant | null,\n callbacksRef: { current: Callbacks }\n) => {\n const sendMessage = useCallback(\n async (message: unknown) => {\n if (status !== \"connected\" || !localParticipant) {\n console.warn(\n \"Cannot send message: room not connected or no local participant\"\n );\n return;\n }\n try {\n const encoder = new TextEncoder();\n const data = encoder.encode(JSON.stringify(message));\n\n await localParticipant.publishData(data, { reliable: true });\n } catch (error) {\n console.error(\"Failed to send message via WebRTC:\", error);\n console.error(\"Error details:\", error);\n callbacksRef.current.onError?.(error as string);\n }\n },\n [status, localParticipant, callbacksRef]\n );\n\n return { sendMessage };\n};\n","import type { ConversationConfig, InitiationClientDataEvent } from \"../types\";\nimport { PACKAGE_VERSION } from \"../version\";\n\nexport function constructOverrides(\n config: ConversationConfig\n): InitiationClientDataEvent {\n const overridesEvent: InitiationClientDataEvent = {\n type: \"conversation_initiation_client_data\",\n };\n\n if (config.overrides) {\n overridesEvent.conversation_config_override = {\n agent: {\n prompt: config.overrides.agent?.prompt,\n first_message: config.overrides.agent?.firstMessage,\n language: config.overrides.agent?.language,\n },\n tts: {\n voice_id: config.overrides.tts?.voiceId,\n },\n conversation: {\n text_only: config.overrides.conversation?.textOnly,\n },\n source_info: {\n source: \"react_native_sdk\",\n version: config.overrides?.client?.version || PACKAGE_VERSION,\n },\n };\n }\n\n if (config.customLlmExtraBody) {\n overridesEvent.custom_llm_extra_body = config.customLlmExtraBody;\n }\n\n if (config.dynamicVariables) {\n overridesEvent.dynamic_variables = config.dynamicVariables;\n }\n\n if (config.userId) {\n overridesEvent.user_id = config.userId;\n }\n\n return overridesEvent;\n}\n"],"names":["PACKAGE_VERSION","MessageHandler","_ref","onReady","isConnected","callbacks","sendMessage","_ref$clientTools","clientTools","updateCurrentEventId","localParticipant","useLocalParticipant","agentResponseCountRef","React","useRef","useEffect","useDataChannel","msg","_msg$from","_msg$from2","decoder","TextDecoder","message","JSON","parse","decode","payload","type","_msg$from3","onMessage","source","from","isAgent","onModeChange","mode","isSpeaking","eventId","current","event_id","ping_event","clientToolCall","Promise","resolve","Object","prototype","hasOwnProperty","call","client_tool_call","tool_name","_temp","parameters","then","result","formattedResult","stringify","String","tool_call_id","is_error","_catch","e","onError","clientToolName","onUnhandledClientToolCall","errorMessage","reject","handleClientToolCall","onDebug","LiveKitRoomWrapper","children","createElement","LiveKitRoom","serverUrl","token","connect","audio","video","options","adaptiveStream","pixelDensity","onConnected","onDisconnected","onParticipantReady","roomConnected","_excluded","ElevenLabsContext","createContext","useConversation","context","useContext","Error","tokenFetchUrl","_objectWithoutPropertiesLoose","setServerUrl","setTokenFetchUrl","setClientTools","setCallbacks","conversation","ElevenLabsProvider","registerGlobals","_useState","useState","setToken","_useState2","setConnect","_useState3","status","setStatus","_useState4","_useState5","undefined","_useState6","conversationId","setConversationId","_useState7","setIsSpeaking","_useState8","canSendFeedback","setCanSendFeedback","currentEventIdRef","lastFeedbackEventIdRef","clientToolsRef","_useConversationCallb","callbacksRef","useCallback","useConversationCallbacks","setCallbacksBase","wrappedCallbacks","_extends","event","_useConversationSessi","overrides","setOverrides","customLlmExtraBody","setCustomLlmExtraBody","dynamicVariables","setDynamicVariables","startSession","config","_temp2","_result2","extractedConversationId","_tokenPayload$video","_roomId$match","atob","split","room","match","error","console","warn","extractConversationIdFromToken","conversationToken","onStatusChange","agentId","info","fetch","response","json","data","ok","detail","getConversationToken","_getConversationToken","endSession","onDisconnect","useConversationSession","_useLiveKitRoom","setRoomConnected","setLocalParticipant","AudioSession","startAudioSession","start","stopAudioSession","handleParticipantReady","participant","handleConnected","onConnect","handleDisconnected","handleError","useLiveKitRoom","handleConnectedWithFeedback","onCanSendFeedbackChange","handleDisconnectedWithFeedback","_useMessageSending","TextEncoder","encode","publishData","reliable","useMessageSending","updateCanSendFeedback","newCanSendFeedback","sendFeedback","like","score","volume","handleParticipantReadyWithOverrides","overridesEvent","_config$overrides$age","_config$overrides$age2","_config$overrides$age3","_config$overrides$tts","_config$overrides$con","_config$overrides","conversation_config_override","agent","prompt","first_message","firstMessage","language","tts","voice_id","voiceId","text_only","textOnly","source_info","version","client","custom_llm_extra_body","dynamic_variables","userId","user_id","constructOverrides","getId","sendContextualUpdate","text","sendUserMessage","sendUserActivity","tools","Provider","value"],"mappings":"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"}
1
+ {"version":3,"file":"lib.module.js","sources":["../src/version.ts","../src/components/MessageHandler.tsx","../src/components/LiveKitRoomWrapper.tsx","../src/ElevenLabsProvider.tsx","../src/utils/constants.ts","../src/hooks/useConversationCallbacks.ts","../src/hooks/useConversationSession.ts","../src/utils/tokenUtils.ts","../src/hooks/useLiveKitRoom.ts","../src/hooks/useMessageSending.ts","../src/utils/overrides.ts"],"sourcesContent":["// This file is auto-generated during build\nexport const PACKAGE_VERSION = \"0.3.0\";\n","import { useEffect } from 'react';\nimport { useLocalParticipant, useDataChannel } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ClientToolsConfig, ClientToolCallEvent, ConversationEvent } from '../types';\nimport React from 'react';\n\ninterface MessageHandlerProps {\n onReady: (participant: LocalParticipant) => void;\n isConnected: boolean;\n callbacks: Callbacks;\n sendMessage: (message: unknown) => void;\n clientTools?: ClientToolsConfig['clientTools'];\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport function isValidEvent(event: any): event is ConversationEvent {\n return !!event.type;\n}\n\nexport const MessageHandler = ({\n onReady,\n isConnected,\n callbacks,\n sendMessage,\n clientTools = {},\n updateCurrentEventId\n}: MessageHandlerProps) => {\n const { localParticipant } = useLocalParticipant();\n\n // Track agent response count for synthetic event IDs (WebRTC mode)\n const agentResponseCountRef = React.useRef(1);\n\n useEffect(() => {\n if (isConnected && localParticipant) {\n onReady(localParticipant);\n }\n }, [isConnected, localParticipant, onReady]);\n\n const handleClientToolCall = async (clientToolCall: ClientToolCallEvent) => {\n if (\n Object.prototype.hasOwnProperty.call(\n clientTools,\n clientToolCall.client_tool_call.tool_name\n )\n ) {\n try {\n const result =\n (await clientTools[clientToolCall.client_tool_call.tool_name](\n clientToolCall.client_tool_call.parameters\n )) ?? \"Client tool execution successful.\"; // default client-tool call response\n\n // The API expects result to be a string, so we need to convert it if it's not already a string\n const formattedResult =\n typeof result === \"object\" ? JSON.stringify(result) : String(result);\n\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: formattedResult,\n is_error: false,\n });\n } catch (e) {\n const errorMessage = `Client tool execution failed with following error: ${(e as Error)?.message}`;\n callbacks.onError?.(errorMessage, {\n clientToolName: clientToolCall.client_tool_call.tool_name,\n });\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: `Client tool execution failed: ${(e as Error)?.message}`,\n is_error: true,\n });\n }\n } else {\n if (callbacks.onUnhandledClientToolCall) {\n callbacks.onUnhandledClientToolCall(clientToolCall);\n return;\n }\n\n const errorMessage = `Client tool with name ${clientToolCall.client_tool_call.tool_name} is not defined on client`;\n callbacks.onError?.(errorMessage, {\n clientToolName: clientToolCall.client_tool_call.tool_name,\n });\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: errorMessage,\n is_error: true,\n });\n }\n };\n\n const _ = useDataChannel((msg) => {\n const decoder = new TextDecoder();\n const message = JSON.parse(decoder.decode(msg.payload));\n\n if (!isValidEvent(message)) {\n callbacks.onDebug?.({\n type: \"invalid_event\",\n message,\n });\n return;\n }\n\n callbacks.onMessage?.({\n message,\n source: msg.from?.isAgent ? 'ai' : 'user',\n });\n\n if (msg.from?.isAgent) {\n callbacks.onModeChange?.({\n mode: msg.from?.isSpeaking ? 'speaking' : 'listening'\n });\n\n // Track agent responses for feedback (WebRTC mode needs synthetic event IDs)\n if (message.type === \"agent_response\" && updateCurrentEventId) {\n const eventId = agentResponseCountRef.current++;\n updateCurrentEventId(eventId);\n }\n }\n\n switch (message.type) {\n case \"ping\":\n sendMessage({\n type: \"pong\",\n event_id: message.ping_event.event_id,\n });\n break;\n case \"client_tool_call\":\n handleClientToolCall(message);\n break;\n default:\n callbacks.onDebug?.(message);\n break;\n }\n });\n\n return null;\n};","import React from 'react';\nimport { LiveKitRoom } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ClientToolsConfig } from '../types';\nimport { MessageHandler } from './MessageHandler';\n\ninterface LiveKitRoomWrapperProps {\n children: React.ReactNode;\n serverUrl: string;\n token: string;\n connect: boolean;\n onConnected: () => void;\n onDisconnected: () => void;\n onError: (error: Error) => void;\n roomConnected: boolean;\n callbacks: Callbacks;\n onParticipantReady: (participant: LocalParticipant) => void;\n sendMessage: (message: unknown) => void;\n clientTools: ClientToolsConfig['clientTools'];\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport const LiveKitRoomWrapper = ({\n children,\n serverUrl,\n token,\n connect,\n onConnected,\n onDisconnected,\n onError,\n roomConnected,\n callbacks,\n onParticipantReady,\n sendMessage,\n clientTools,\n updateCurrentEventId,\n}: LiveKitRoomWrapperProps) => {\n return (\n <LiveKitRoom\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n audio={true}\n video={false}\n options={{\n adaptiveStream: { pixelDensity: 'screen' },\n }}\n onConnected={onConnected}\n onDisconnected={onDisconnected}\n onError={onError}\n >\n <MessageHandler\n onReady={onParticipantReady}\n isConnected={roomConnected}\n callbacks={callbacks}\n sendMessage={sendMessage}\n clientTools={clientTools}\n updateCurrentEventId={updateCurrentEventId}\n />\n {children}\n </LiveKitRoom>\n );\n};","import React from 'react';\nimport { createContext, useContext, useState } from 'react';\nimport { registerGlobals } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ConversationConfig, ConversationStatus, ClientToolsConfig } from './types';\nimport { constructOverrides } from './utils/overrides';\nimport { DEFAULT_SERVER_URL } from './utils/constants';\nimport { useConversationCallbacks } from './hooks/useConversationCallbacks';\nimport { useConversationSession } from './hooks/useConversationSession';\nimport { useLiveKitRoom } from './hooks/useLiveKitRoom';\nimport { useMessageSending } from './hooks/useMessageSending';\nimport { LiveKitRoomWrapper } from './components/LiveKitRoomWrapper';\n\ninterface ConversationOptions extends Callbacks, Partial<ClientToolsConfig> {\n serverUrl?: string;\n tokenFetchUrl?: string;\n}\n\nexport interface Conversation {\n startSession: (config: ConversationConfig) => Promise<void>;\n endSession: () => Promise<void>;\n status: ConversationStatus;\n isSpeaking: boolean;\n // TODO: Implement setVolume when LiveKit React Native supports it\n // setVolume: (volume: number) => void;\n canSendFeedback: boolean;\n getId: () => string;\n sendFeedback: (like: boolean) => void;\n sendContextualUpdate: (text: string) => void;\n sendUserMessage: (text: string) => void;\n sendUserActivity: () => void;\n setMicMuted: (muted: boolean) => void;\n}\n\ninterface ElevenLabsContextType {\n conversation: Conversation;\n callbacksRef: { current: Callbacks };\n serverUrl: string;\n tokenFetchUrl?: string;\n clientTools: ClientToolsConfig['clientTools'];\n setCallbacks: (callbacks: Callbacks) => void;\n setServerUrl: (url: string) => void;\n setTokenFetchUrl: (url: string) => void;\n setClientTools: (tools: ClientToolsConfig['clientTools']) => void;\n}\n\nconst ElevenLabsContext = createContext<ElevenLabsContextType | null>(null);\n\nexport const useConversation = (options: ConversationOptions = {}): Conversation => {\n const context = useContext(ElevenLabsContext);\n if (!context) {\n throw new Error('useConversation must be used within ElevenLabsProvider');\n }\n\n const { serverUrl, tokenFetchUrl, clientTools, ...callbacks } = options;\n\n React.useEffect(() => {\n if (serverUrl) {\n context.setServerUrl(serverUrl);\n }\n }, [context, serverUrl]);\n\n React.useEffect(() => {\n if (tokenFetchUrl) {\n context.setTokenFetchUrl(tokenFetchUrl);\n }\n }, [context, tokenFetchUrl]);\n\n if (clientTools) {\n context.setClientTools(clientTools);\n }\n\n context.setCallbacks(callbacks);\n\n return context.conversation;\n};\n\ninterface ElevenLabsProviderProps {\n children: React.ReactNode;\n}\n\nexport const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children }) => {\n // Initialize globals on mount\n registerGlobals();\n\n // State management\n const [token, setToken] = useState('');\n const [connect, setConnect] = useState(false);\n const [status, setStatus] = useState<ConversationStatus>('disconnected');\n const [serverUrl, setServerUrl] = useState(DEFAULT_SERVER_URL);\n const [tokenFetchUrl, setTokenFetchUrl] = useState<string | undefined>(undefined);\n const [conversationId, setConversationId] = useState<string>('');\n const [isSpeaking, setIsSpeaking] = useState(false);\n const [canSendFeedback, setCanSendFeedback] = useState(false);\n\n // Feedback state tracking\n const currentEventIdRef = React.useRef(1);\n const lastFeedbackEventIdRef = React.useRef(1);\n\n // Use ref for clientTools to avoid re-renders (like callbacks)\n const clientToolsRef = React.useRef<ClientToolsConfig['clientTools']>({});\n\n // Custom hooks\n const { callbacksRef, setCallbacks: setCallbacksBase } = useConversationCallbacks();\n\n // Enhanced setCallbacks that wraps onModeChange to update isSpeaking state\n const setCallbacks = React.useCallback((callbacks: Callbacks) => {\n const wrappedCallbacks = {\n ...callbacks,\n onModeChange: (event: { mode: 'speaking' | 'listening' }) => {\n setIsSpeaking(event.mode === 'speaking');\n callbacks.onModeChange?.(event);\n }\n };\n setCallbacksBase(wrappedCallbacks);\n }, [setCallbacksBase]);\n\n const {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n } = useConversationSession(callbacksRef, setStatus, setConnect, setToken, setConversationId, tokenFetchUrl);\n\n const {\n roomConnected,\n localParticipant,\n handleParticipantReady,\n handleConnected,\n handleDisconnected,\n handleError,\n } = useLiveKitRoom(callbacksRef, setStatus, conversationId);\n\n // Enhanced connection handler to initialize feedback state\n const handleConnectedWithFeedback = React.useCallback(() => {\n // Reset feedback state when connecting\n currentEventIdRef.current = 1;\n lastFeedbackEventIdRef.current = 1;\n setCanSendFeedback(false);\n callbacksRef.current.onCanSendFeedbackChange?.({ canSendFeedback: false });\n\n handleConnected();\n }, [handleConnected, callbacksRef]);\n\n // Enhanced disconnection handler to reset feedback state\n const handleDisconnectedWithFeedback = React.useCallback(() => {\n setCanSendFeedback(false);\n handleDisconnected();\n }, [handleDisconnected]);\n\n const { sendMessage } = useMessageSending(status, localParticipant, callbacksRef);\n\n const updateCanSendFeedback = React.useCallback(() => {\n const newCanSendFeedback = currentEventIdRef.current !== lastFeedbackEventIdRef.current;\n\n if (canSendFeedback !== newCanSendFeedback) {\n setCanSendFeedback(newCanSendFeedback);\n callbacksRef.current.onCanSendFeedbackChange?.({ canSendFeedback: newCanSendFeedback });\n }\n }, [canSendFeedback, callbacksRef]);\n\n const sendFeedback = React.useCallback((like: boolean) => {\n if (!canSendFeedback) {\n console.warn(\n lastFeedbackEventIdRef.current === 0\n ? \"Cannot send feedback: the conversation has not started yet.\"\n : \"Cannot send feedback: feedback has already been sent for the current response.\"\n );\n return;\n }\n\n const feedbackMessage = {\n type: \"feedback\",\n score: like ? \"like\" : \"dislike\",\n event_id: currentEventIdRef.current,\n };\n\n sendMessage(feedbackMessage);\n lastFeedbackEventIdRef.current = currentEventIdRef.current;\n updateCanSendFeedback();\n }, [canSendFeedback, sendMessage, updateCanSendFeedback]);\n\n // setVolume placeholder (to be implemented when LiveKit supports it)\n const setVolume = React.useCallback((volume: number) => {\n console.warn('setVolume is not yet implemented in React Native SDK');\n }, []);\n\n const getId = () => conversationId;\n\n const setMicMuted = React.useCallback((muted: boolean) => {\n if (localParticipant) {\n localParticipant.setMicrophoneEnabled(!muted);\n }\n }, [localParticipant]);\n\n // Update current event ID for feedback tracking\n const updateCurrentEventId = React.useCallback((eventId: number) => {\n currentEventIdRef.current = eventId;\n updateCanSendFeedback();\n }, [updateCanSendFeedback]);\n\n // Handle participant ready with overrides\n const handleParticipantReadyWithOverrides = React.useCallback((participant: LocalParticipant) => {\n handleParticipantReady(participant);\n\n if (localParticipant) {\n const overridesEvent = constructOverrides({\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n });\n sendMessage(overridesEvent);\n }\n }, [handleParticipantReady, localParticipant, overrides, customLlmExtraBody, dynamicVariables, userId, sendMessage]);\n\n const conversation: Conversation = {\n startSession,\n endSession,\n status,\n isSpeaking,\n // setVolume,\n canSendFeedback,\n getId,\n setMicMuted,\n sendFeedback,\n sendContextualUpdate: (text: string) => {\n sendMessage({\n type: \"contextual_update\",\n text,\n });\n },\n sendUserMessage: (text: string) => {\n sendMessage({\n type: \"user_message\",\n text,\n });\n },\n sendUserActivity: () => {\n sendMessage({\n type: \"user_activity\",\n });\n },\n };\n\n // Create setClientTools function that only updates ref\n const setClientTools = React.useCallback((tools: ClientToolsConfig['clientTools']) => {\n clientToolsRef.current = tools;\n }, []);\n\n const contextValue: ElevenLabsContextType = {\n conversation,\n callbacksRef,\n serverUrl,\n tokenFetchUrl,\n clientTools: clientToolsRef.current,\n setCallbacks,\n setServerUrl,\n setTokenFetchUrl: setTokenFetchUrl,\n setClientTools,\n };\n\n return (\n <ElevenLabsContext.Provider value={contextValue}>\n <LiveKitRoomWrapper\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n onConnected={handleConnectedWithFeedback}\n onDisconnected={handleDisconnectedWithFeedback}\n onError={handleError}\n roomConnected={roomConnected}\n callbacks={callbacksRef.current}\n onParticipantReady={handleParticipantReadyWithOverrides}\n sendMessage={sendMessage}\n clientTools={clientToolsRef.current}\n updateCurrentEventId={updateCurrentEventId}\n >\n {children}\n </LiveKitRoomWrapper>\n </ElevenLabsContext.Provider>\n );\n};","export const DEFAULT_SERVER_URL = \"wss://livekit.rtc.elevenlabs.io\";\n","import { useRef, useCallback } from \"react\";\nimport type { Callbacks } from \"../types\";\n\nexport const useConversationCallbacks = () => {\n const callbacksRef = useRef<Callbacks>({});\n\n const setCallbacks = useCallback((callbacks: Callbacks) => {\n callbacksRef.current = callbacks;\n }, []);\n\n return {\n callbacksRef,\n setCallbacks,\n };\n};\n","import { useState, useCallback } from \"react\";\nimport type {\n ConversationConfig,\n ConversationStatus,\n Callbacks,\n} from \"../types\";\nimport {\n getConversationToken,\n extractConversationIdFromToken,\n} from \"../utils/tokenUtils\";\n\nexport const useConversationSession = (\n callbacksRef: { current: Callbacks },\n setStatus: (status: ConversationStatus) => void,\n setConnect: (connect: boolean) => void,\n setToken: (token: string) => void,\n setConversationId: (conversationId: string) => void,\n tokenFetchUrl?: string\n) => {\n const [overrides, setOverrides] = useState<ConversationConfig[\"overrides\"]>(\n {}\n );\n const [customLlmExtraBody, setCustomLlmExtraBody] =\n useState<ConversationConfig[\"customLlmExtraBody\"]>(null);\n const [dynamicVariables, setDynamicVariables] = useState<\n ConversationConfig[\"dynamicVariables\"]\n >({});\n const [userId, setUserId] = useState<ConversationConfig[\"userId\"]>(undefined);\n\n const startSession = useCallback(\n async (config: ConversationConfig) => {\n try {\n setStatus(\"connecting\");\n callbacksRef.current.onStatusChange?.({ status: \"connecting\" });\n\n setOverrides(config.overrides || {});\n setCustomLlmExtraBody(config.customLlmExtraBody || null);\n setDynamicVariables(config.dynamicVariables || {});\n setUserId(config.userId);\n\n let conversationToken: string;\n\n if (config.conversationToken) {\n conversationToken = config.conversationToken;\n } else if (config.agentId) {\n console.info(\n \"Getting conversation token for agentId:\",\n config.agentId\n );\n // Use tokenFetchUrl from config first, then from hook parameter, then default\n const urlToUse = config.tokenFetchUrl || tokenFetchUrl;\n conversationToken = await getConversationToken(\n config.agentId,\n urlToUse\n );\n } else {\n throw new Error(\"Either conversationToken or agentId is required\");\n }\n\n const extractedConversationId =\n extractConversationIdFromToken(conversationToken);\n setConversationId(extractedConversationId);\n\n setToken(conversationToken);\n setConnect(true);\n } catch (error) {\n setStatus(\"disconnected\");\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n },\n [\n callbacksRef,\n setStatus,\n setConnect,\n setToken,\n setConversationId,\n tokenFetchUrl,\n ]\n );\n\n const endSession = useCallback(async () => {\n try {\n setConnect(false);\n setToken(\"\");\n setStatus(\"disconnected\");\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onDisconnect?.(\"User ended conversation\");\n } catch (error) {\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n }, [callbacksRef, setConnect, setToken, setStatus]);\n\n return {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n };\n};\n","import { PACKAGE_VERSION } from \"../version\";\n\nexport const extractConversationIdFromToken = (token: string): string => {\n try {\n const tokenPayload = JSON.parse(atob(token.split(\".\")[1]));\n const roomId = tokenPayload.video?.room || \"\";\n\n return roomId.match(/(conv_[a-zA-Z0-9]+)/)?.[0] || \"\";\n } catch (error) {\n console.warn(\"Could not extract conversation ID from token\");\n return \"\";\n }\n};\n\nexport const getConversationToken = async (\n agentId: string,\n tokenFetchUrl?: string\n): Promise<string> => {\n const baseUrl =\n tokenFetchUrl || \"https://api.elevenlabs.io/v1/convai/conversation/token\";\n const response = await fetch(\n `${baseUrl}?agent_id=${agentId}&source=react_native_sdk&version=${PACKAGE_VERSION}`\n );\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(`Failed to get conversation token: ${data.detail.message}`);\n }\n\n if (!data.token) {\n throw new Error(\"No conversation token received from API\");\n }\n\n return data.token;\n};\n","import { useState, useEffect, useCallback } from \"react\";\nimport { AudioSession } from \"@livekit/react-native\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type { ConversationStatus, Callbacks } from \"../types\";\n\nexport const useLiveKitRoom = (\n callbacksRef: { current: Callbacks },\n setStatus: (status: ConversationStatus) => void,\n conversationId: string\n) => {\n const [roomConnected, setRoomConnected] = useState(false);\n const [localParticipant, setLocalParticipant] =\n useState<LocalParticipant | null>(null);\n\n useEffect(() => {\n const start = async () => {\n await AudioSession.startAudioSession();\n };\n\n start();\n return () => {\n AudioSession.stopAudioSession();\n };\n }, []);\n\n const handleParticipantReady = useCallback(\n (participant: LocalParticipant) => {\n setLocalParticipant(participant);\n },\n []\n );\n\n const handleConnected = useCallback(() => {\n setRoomConnected(true);\n setStatus(\"connected\");\n callbacksRef.current.onConnect?.({ conversationId });\n }, [conversationId, callbacksRef, setStatus]);\n\n const handleDisconnected = useCallback(() => {\n setRoomConnected(false);\n setStatus(\"disconnected\");\n setLocalParticipant(null);\n callbacksRef.current.onDisconnect?.(\"disconnected\");\n }, [callbacksRef, setStatus]);\n\n const handleError = useCallback(\n (error: Error) => {\n console.error(\"LiveKit error:\", error);\n callbacksRef.current.onError?.(error.message, undefined);\n },\n [callbacksRef]\n );\n\n return {\n roomConnected,\n localParticipant,\n handleParticipantReady,\n handleConnected,\n handleDisconnected,\n handleError,\n };\n};\n","import { useCallback } from \"react\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type { ConversationStatus, Callbacks } from \"../types\";\n\nexport const useMessageSending = (\n status: ConversationStatus,\n localParticipant: LocalParticipant | null,\n callbacksRef: { current: Callbacks }\n) => {\n const sendMessage = useCallback(\n async (message: unknown) => {\n if (status !== \"connected\" || !localParticipant) {\n console.warn(\n \"Cannot send message: room not connected or no local participant\"\n );\n return;\n }\n try {\n const encoder = new TextEncoder();\n const data = encoder.encode(JSON.stringify(message));\n\n await localParticipant.publishData(data, { reliable: true });\n } catch (error) {\n console.error(\"Failed to send message via WebRTC:\", error);\n console.error(\"Error details:\", error);\n callbacksRef.current.onError?.(error as string);\n }\n },\n [status, localParticipant, callbacksRef]\n );\n\n return { sendMessage };\n};\n","import type { ConversationConfig, InitiationClientDataEvent } from \"../types\";\nimport { PACKAGE_VERSION } from \"../version\";\n\nexport function constructOverrides(\n config: ConversationConfig\n): InitiationClientDataEvent {\n const overridesEvent: InitiationClientDataEvent = {\n type: \"conversation_initiation_client_data\",\n };\n\n if (config.overrides) {\n overridesEvent.conversation_config_override = {\n agent: {\n prompt: config.overrides.agent?.prompt,\n first_message: config.overrides.agent?.firstMessage,\n language: config.overrides.agent?.language,\n },\n tts: {\n voice_id: config.overrides.tts?.voiceId,\n },\n conversation: {\n text_only: config.overrides.conversation?.textOnly,\n },\n source_info: {\n source: \"react_native_sdk\",\n version: config.overrides?.client?.version || PACKAGE_VERSION,\n },\n };\n }\n\n if (config.customLlmExtraBody) {\n overridesEvent.custom_llm_extra_body = config.customLlmExtraBody;\n }\n\n if (config.dynamicVariables) {\n overridesEvent.dynamic_variables = config.dynamicVariables;\n }\n\n if (config.userId) {\n overridesEvent.user_id = String(config.userId);\n }\n\n return overridesEvent;\n}\n"],"names":["PACKAGE_VERSION","MessageHandler","_ref","onReady","isConnected","callbacks","sendMessage","_ref$clientTools","clientTools","updateCurrentEventId","localParticipant","useLocalParticipant","agentResponseCountRef","React","useRef","useEffect","useDataChannel","msg","_msg$from","_msg$from2","decoder","TextDecoder","message","JSON","parse","decode","payload","type","_msg$from3","onMessage","source","from","isAgent","onModeChange","mode","isSpeaking","eventId","current","event_id","ping_event","clientToolCall","Promise","resolve","Object","prototype","hasOwnProperty","call","client_tool_call","tool_name","_temp","parameters","then","result","formattedResult","stringify","String","tool_call_id","is_error","_catch","e","onError","clientToolName","onUnhandledClientToolCall","errorMessage","reject","handleClientToolCall","onDebug","LiveKitRoomWrapper","children","createElement","LiveKitRoom","serverUrl","token","connect","audio","video","options","adaptiveStream","pixelDensity","onConnected","onDisconnected","onParticipantReady","roomConnected","_excluded","ElevenLabsContext","createContext","useConversation","context","useContext","Error","tokenFetchUrl","_objectWithoutPropertiesLoose","setServerUrl","setTokenFetchUrl","setClientTools","setCallbacks","conversation","ElevenLabsProvider","registerGlobals","_useState","useState","setToken","_useState2","setConnect","_useState3","status","setStatus","_useState4","_useState5","undefined","_useState6","conversationId","setConversationId","_useState7","setIsSpeaking","_useState8","canSendFeedback","setCanSendFeedback","currentEventIdRef","lastFeedbackEventIdRef","clientToolsRef","_useConversationCallb","callbacksRef","useCallback","useConversationCallbacks","setCallbacksBase","wrappedCallbacks","_extends","event","_useConversationSessi","overrides","setOverrides","customLlmExtraBody","setCustomLlmExtraBody","dynamicVariables","setDynamicVariables","userId","setUserId","startSession","config","_temp2","_result2","extractedConversationId","_tokenPayload$video","_roomId$match","atob","split","room","match","error","console","warn","extractConversationIdFromToken","conversationToken","onStatusChange","agentId","info","fetch","response","json","data","ok","detail","getConversationToken","_getConversationToken","endSession","onDisconnect","useConversationSession","_useLiveKitRoom","setRoomConnected","setLocalParticipant","AudioSession","startAudioSession","start","stopAudioSession","handleParticipantReady","participant","handleConnected","onConnect","handleDisconnected","handleError","useLiveKitRoom","handleConnectedWithFeedback","onCanSendFeedbackChange","handleDisconnectedWithFeedback","_useMessageSending","TextEncoder","encode","publishData","reliable","useMessageSending","updateCanSendFeedback","newCanSendFeedback","sendFeedback","like","score","volume","setMicMuted","muted","setMicrophoneEnabled","handleParticipantReadyWithOverrides","overridesEvent","_config$overrides$age","_config$overrides$age2","_config$overrides$age3","_config$overrides$tts","_config$overrides$con","_config$overrides","conversation_config_override","agent","prompt","first_message","firstMessage","language","tts","voice_id","voiceId","text_only","textOnly","source_info","version","client","custom_llm_extra_body","dynamic_variables","user_id","constructOverrides","getId","sendContextualUpdate","text","sendUserMessage","sendUserActivity","tools","Provider","value"],"mappings":"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"}
package/dist/lib.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("react"),require("@livekit/react-native")):"function"==typeof define&&define.amd?define(["exports","react","@livekit/react-native"],n):n((e||self).reactNative={},e.react,e.reactNative)}(this,function(e,n,t){function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=/*#__PURE__*/r(n);function a(){return a=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)({}).hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},a.apply(null,arguments)}var c="0.2.1",l=function(e){var r=e.onReady,a=e.isConnected,c=e.callbacks,l=e.sendMessage,i=e.clientTools,s=void 0===i?{}:i,u=e.updateCurrentEventId,d=t.useLocalParticipant().localParticipant,f=o.default.useRef(1);return n.useEffect(function(){a&&d&&r(d)},[a,d,r]),t.useDataChannel(function(e){var n,t,r=new TextDecoder,o=JSON.parse(r.decode(e.payload));if(o.type){var a;if(null==c.onMessage||c.onMessage({message:o,source:null!=(n=e.from)&&n.isAgent?"ai":"user"}),null!=(t=e.from)&&t.isAgent&&(null==c.onModeChange||c.onModeChange({mode:null!=(a=e.from)&&a.isSpeaking?"speaking":"listening"}),"agent_response"===o.type&&u)){var i=f.current++;u(i)}switch(o.type){case"ping":l({type:"pong",event_id:o.ping_event.event_id});break;case"client_tool_call":!function(e){try{return Promise.resolve(function(){if(Object.prototype.hasOwnProperty.call(s,e.client_tool_call.tool_name)){var n=function(n,t){try{var r=Promise.resolve(s[e.client_tool_call.tool_name](e.client_tool_call.parameters)).then(function(n){var t="object"==typeof n?JSON.stringify(n):String(n);l({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:t,is_error:!1})})}catch(e){return t(e)}return r&&r.then?r.then(void 0,t):r}(0,function(n){null==c.onError||c.onError("Client tool execution failed with following error: "+(null==n?void 0:n.message),{clientToolName:e.client_tool_call.tool_name}),l({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:"Client tool execution failed: "+(null==n?void 0:n.message),is_error:!0})});if(n&&n.then)return n.then(function(){})}else{if(c.onUnhandledClientToolCall)return void c.onUnhandledClientToolCall(e);var t="Client tool with name "+e.client_tool_call.tool_name+" is not defined on client";null==c.onError||c.onError(t,{clientToolName:e.client_tool_call.tool_name}),l({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:t,is_error:!0})}}())}catch(e){return Promise.reject(e)}}(o);break;default:null==c.onDebug||c.onDebug(o)}}else null==c.onDebug||c.onDebug({type:"invalid_event",message:o})}),null},i=function(e){var n=e.children;/*#__PURE__*/return o.default.createElement(t.LiveKitRoom,{serverUrl:e.serverUrl,token:e.token,connect:e.connect,audio:!0,video:!1,options:{adaptiveStream:{pixelDensity:"screen"}},onConnected:e.onConnected,onDisconnected:e.onDisconnected,onError:e.onError},/*#__PURE__*/o.default.createElement(l,{onReady:e.onParticipantReady,isConnected:e.roomConnected,callbacks:e.callbacks,sendMessage:e.sendMessage,clientTools:e.clientTools,updateCurrentEventId:e.updateCurrentEventId}),n)},s=["serverUrl","tokenFetchUrl","clientTools"],u=/*#__PURE__*/n.createContext(null);e.ElevenLabsProvider=function(e){var r=e.children;t.registerGlobals();var l=n.useState(""),s=l[0],d=l[1],f=n.useState(!1),v=f[0],h=f[1],m=n.useState("disconnected"),g=m[0],C=m[1],_=n.useState("wss://livekit.rtc.elevenlabs.io"),b=_[0],k=_[1],p=n.useState(void 0),y=p[0],S=p[1],E=n.useState(""),P=E[0],w=E[1],x=n.useState(!1),T=x[0],U=x[1],D=n.useState(!1),R=D[0],F=D[1],I=o.default.useRef(1),M=o.default.useRef(1),j=o.default.useRef({}),O=function(){var e=n.useRef({}),t=n.useCallback(function(n){e.current=n},[]);return{callbacksRef:e,setCallbacks:t}}(),L=O.callbacksRef,N=O.setCallbacks,A=o.default.useCallback(function(e){var n=a({},e,{onModeChange:function(n){U("speaking"===n.mode),null==e.onModeChange||e.onModeChange(n)}});N(n)},[N]),V=function(e,t,r,o,a,l){var i=n.useState({}),s=i[0],u=i[1],d=n.useState(null),f=d[0],v=d[1],h=n.useState({}),m=h[0],g=h[1];return{startSession:n.useCallback(function(n){try{return Promise.resolve(function(i,s){try{var d=function(){function i(e){var n=function(e){try{var n,t;return(null==(t=((null==(n=JSON.parse(atob(e.split(".")[1])).video)?void 0:n.room)||"").match(/(conv_[a-zA-Z0-9]+)/))?void 0:t[0])||""}catch(e){return console.warn("Could not extract conversation ID from token"),""}}(s);a(n),o(s),r(!0)}var s;t("connecting"),null==e.current.onStatusChange||e.current.onStatusChange({status:"connecting"}),u(n.overrides||{}),v(n.customLlmExtraBody||null),g(n.dynamicVariables||{});var d=function(){if(!n.conversationToken)return function(){if(n.agentId)return console.info("Getting conversation token for agentId:",n.agentId),Promise.resolve(function(e,n){try{return Promise.resolve(fetch((n||"https://api.elevenlabs.io/v1/convai/conversation/token")+"?agent_id="+e+"&source=react_native_sdk&version="+c)).then(function(e){return Promise.resolve(e.json()).then(function(n){if(!e.ok)throw new Error("Failed to get conversation token: "+n.detail.message);if(!n.token)throw new Error("No conversation token received from API");return n.token})})}catch(e){return Promise.reject(e)}}(n.agentId,n.tokenFetchUrl||l)).then(function(e){s=e});throw new Error("Either conversationToken or agentId is required")}();s=n.conversationToken}();return d&&d.then?d.then(i):i()}()}catch(e){return s(e)}return d&&d.then?d.then(void 0,s):d}(0,function(n){throw t("disconnected"),null==e.current.onStatusChange||e.current.onStatusChange({status:"disconnected"}),null==e.current.onError||e.current.onError(n),n}))}catch(e){return Promise.reject(e)}},[e,t,r,o,a,l]),endSession:n.useCallback(function(){try{try{r(!1),o(""),t("disconnected"),null==e.current.onStatusChange||e.current.onStatusChange({status:"disconnected"}),null==e.current.onDisconnect||e.current.onDisconnect("User ended conversation")}catch(n){throw null==e.current.onError||e.current.onError(n),n}return Promise.resolve()}catch(e){return Promise.reject(e)}},[e,r,o,t]),overrides:s,customLlmExtraBody:f,dynamicVariables:m}}(L,C,h,d,w,y),B=V.startSession,J=V.endSession,q=V.overrides,K=V.customLlmExtraBody,G=V.dynamicVariables,z=function(e,r,o){var a=n.useState(!1),c=a[0],l=a[1],i=n.useState(null),s=i[0],u=i[1];return n.useEffect(function(){return function(){try{return Promise.resolve(t.AudioSession.startAudioSession()).then(function(){})}catch(e){return Promise.reject(e)}}(),function(){t.AudioSession.stopAudioSession()}},[]),{roomConnected:c,localParticipant:s,handleParticipantReady:n.useCallback(function(e){u(e)},[]),handleConnected:n.useCallback(function(){l(!0),r("connected"),null==e.current.onConnect||e.current.onConnect({conversationId:o})},[o,e,r]),handleDisconnected:n.useCallback(function(){l(!1),r("disconnected"),u(null),null==e.current.onDisconnect||e.current.onDisconnect("disconnected")},[e,r]),handleError:n.useCallback(function(n){console.error("LiveKit error:",n),null==e.current.onError||e.current.onError(n.message,void 0)},[e])}}(L,C,P),W=z.roomConnected,Z=z.localParticipant,H=z.handleParticipantReady,Q=z.handleConnected,X=z.handleDisconnected,Y=z.handleError,$=o.default.useCallback(function(){I.current=1,M.current=1,F(!1),null==L.current.onCanSendFeedbackChange||L.current.onCanSendFeedbackChange({canSendFeedback:!1}),Q()},[Q,L]),ee=o.default.useCallback(function(){F(!1),X()},[X]),ne=function(e,t,r){return{sendMessage:n.useCallback(function(n){try{if("connected"!==e||!t)return console.warn("Cannot send message: room not connected or no local participant"),Promise.resolve();var o=function(e,r){try{var o=(a=(new TextEncoder).encode(JSON.stringify(n)),Promise.resolve(t.publishData(a,{reliable:!0})).then(function(){}))}catch(e){return r(e)}var a;return o&&o.then?o.then(void 0,r):o}(0,function(e){console.error("Failed to send message via WebRTC:",e),console.error("Error details:",e),null==r.current.onError||r.current.onError(e)});return Promise.resolve(o&&o.then?o.then(function(){}):void 0)}catch(e){return Promise.reject(e)}},[e,t,r])}}(g,Z,L),te=ne.sendMessage,re=o.default.useCallback(function(){var e=I.current!==M.current;R!==e&&(F(e),null==L.current.onCanSendFeedbackChange||L.current.onCanSendFeedbackChange({canSendFeedback:e}))},[R,L]),oe=o.default.useCallback(function(e){R?(te({type:"feedback",score:e?"like":"dislike",event_id:I.current}),M.current=I.current,re()):console.warn(0===M.current?"Cannot send feedback: the conversation has not started yet.":"Cannot send feedback: feedback has already been sent for the current response.")},[R,te,re]);o.default.useCallback(function(e){console.warn("setVolume is not yet implemented in React Native SDK")},[]);var ae=o.default.useCallback(function(e){I.current=e,re()},[re]),ce=o.default.useCallback(function(e){if(H(e),Z){var n=function(e){var n,t,r,o,a,l,i={type:"conversation_initiation_client_data"};return e.overrides&&(i.conversation_config_override={agent:{prompt:null==(n=e.overrides.agent)?void 0:n.prompt,first_message:null==(t=e.overrides.agent)?void 0:t.firstMessage,language:null==(r=e.overrides.agent)?void 0:r.language},tts:{voice_id:null==(o=e.overrides.tts)?void 0:o.voiceId},conversation:{text_only:null==(a=e.overrides.conversation)?void 0:a.textOnly},source_info:{source:"react_native_sdk",version:(null==(l=e.overrides)||null==(l=l.client)?void 0:l.version)||c}}),e.customLlmExtraBody&&(i.custom_llm_extra_body=e.customLlmExtraBody),e.dynamicVariables&&(i.dynamic_variables=e.dynamicVariables),e.userId&&(i.user_id=e.userId),i}({overrides:q,customLlmExtraBody:K,dynamicVariables:G});te(n)}},[H,Z,q,K,G,te]),le={startSession:B,endSession:J,status:g,isSpeaking:T,canSendFeedback:R,getId:function(){return P},sendFeedback:oe,sendContextualUpdate:function(e){te({type:"contextual_update",text:e})},sendUserMessage:function(e){te({type:"user_message",text:e})},sendUserActivity:function(){te({type:"user_activity"})}},ie=o.default.useCallback(function(e){j.current=e},[]);/*#__PURE__*/return o.default.createElement(u.Provider,{value:{conversation:le,callbacksRef:L,serverUrl:b,tokenFetchUrl:y,clientTools:j.current,setCallbacks:A,setServerUrl:k,setTokenFetchUrl:S,setClientTools:ie}},/*#__PURE__*/o.default.createElement(i,{serverUrl:b,token:s,connect:v,onConnected:$,onDisconnected:ee,onError:Y,roomConnected:W,callbacks:L.current,onParticipantReady:ce,sendMessage:te,clientTools:j.current,updateCurrentEventId:ae},r))},e.useConversation=function(e){void 0===e&&(e={});var t=n.useContext(u);if(!t)throw new Error("useConversation must be used within ElevenLabsProvider");var r=e.serverUrl,a=e.tokenFetchUrl,c=e.clientTools,l=function(e,n){if(null==e)return{};var t={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(-1!==n.indexOf(r))continue;t[r]=e[r]}return t}(e,s);return o.default.useEffect(function(){r&&t.setServerUrl(r)},[t,r]),o.default.useEffect(function(){a&&t.setTokenFetchUrl(a)},[t,a]),c&&t.setClientTools(c),t.setCallbacks(l),t.conversation}});
1
+ !function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("react"),require("@livekit/react-native")):"function"==typeof define&&define.amd?define(["exports","react","@livekit/react-native"],n):n((e||self).reactNative={},e.react,e.reactNative)}(this,function(e,n,t){function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=/*#__PURE__*/r(n);function a(){return a=Object.assign?Object.assign.bind():function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var r in t)({}).hasOwnProperty.call(t,r)&&(e[r]=t[r])}return e},a.apply(null,arguments)}var c="0.3.0",l=function(e){var r=e.onReady,a=e.isConnected,c=e.callbacks,l=e.sendMessage,i=e.clientTools,s=void 0===i?{}:i,u=e.updateCurrentEventId,d=t.useLocalParticipant().localParticipant,f=o.default.useRef(1);return n.useEffect(function(){a&&d&&r(d)},[a,d,r]),t.useDataChannel(function(e){var n,t,r=new TextDecoder,o=JSON.parse(r.decode(e.payload));if(o.type){var a;if(null==c.onMessage||c.onMessage({message:o,source:null!=(n=e.from)&&n.isAgent?"ai":"user"}),null!=(t=e.from)&&t.isAgent&&(null==c.onModeChange||c.onModeChange({mode:null!=(a=e.from)&&a.isSpeaking?"speaking":"listening"}),"agent_response"===o.type&&u)){var i=f.current++;u(i)}switch(o.type){case"ping":l({type:"pong",event_id:o.ping_event.event_id});break;case"client_tool_call":!function(e){try{return Promise.resolve(function(){if(Object.prototype.hasOwnProperty.call(s,e.client_tool_call.tool_name)){var n=function(n,t){try{var r=Promise.resolve(s[e.client_tool_call.tool_name](e.client_tool_call.parameters)).then(function(n){var t="object"==typeof n?JSON.stringify(n):String(n);l({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:t,is_error:!1})})}catch(e){return t(e)}return r&&r.then?r.then(void 0,t):r}(0,function(n){null==c.onError||c.onError("Client tool execution failed with following error: "+(null==n?void 0:n.message),{clientToolName:e.client_tool_call.tool_name}),l({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:"Client tool execution failed: "+(null==n?void 0:n.message),is_error:!0})});if(n&&n.then)return n.then(function(){})}else{if(c.onUnhandledClientToolCall)return void c.onUnhandledClientToolCall(e);var t="Client tool with name "+e.client_tool_call.tool_name+" is not defined on client";null==c.onError||c.onError(t,{clientToolName:e.client_tool_call.tool_name}),l({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:t,is_error:!0})}}())}catch(e){return Promise.reject(e)}}(o);break;default:null==c.onDebug||c.onDebug(o)}}else null==c.onDebug||c.onDebug({type:"invalid_event",message:o})}),null},i=function(e){var n=e.children;/*#__PURE__*/return o.default.createElement(t.LiveKitRoom,{serverUrl:e.serverUrl,token:e.token,connect:e.connect,audio:!0,video:!1,options:{adaptiveStream:{pixelDensity:"screen"}},onConnected:e.onConnected,onDisconnected:e.onDisconnected,onError:e.onError},/*#__PURE__*/o.default.createElement(l,{onReady:e.onParticipantReady,isConnected:e.roomConnected,callbacks:e.callbacks,sendMessage:e.sendMessage,clientTools:e.clientTools,updateCurrentEventId:e.updateCurrentEventId}),n)},s=["serverUrl","tokenFetchUrl","clientTools"],u=/*#__PURE__*/n.createContext(null);e.ElevenLabsProvider=function(e){var r=e.children;t.registerGlobals();var l=n.useState(""),s=l[0],d=l[1],f=n.useState(!1),v=f[0],h=f[1],m=n.useState("disconnected"),g=m[0],C=m[1],b=n.useState("wss://livekit.rtc.elevenlabs.io"),_=b[0],k=b[1],p=n.useState(void 0),y=p[0],S=p[1],E=n.useState(""),P=E[0],w=E[1],x=n.useState(!1),T=x[0],I=x[1],U=n.useState(!1),D=U[0],M=U[1],R=o.default.useRef(1),F=o.default.useRef(1),j=o.default.useRef({}),O=function(){var e=n.useRef({}),t=n.useCallback(function(n){e.current=n},[]);return{callbacksRef:e,setCallbacks:t}}(),L=O.callbacksRef,N=O.setCallbacks,A=o.default.useCallback(function(e){var n=a({},e,{onModeChange:function(n){I("speaking"===n.mode),null==e.onModeChange||e.onModeChange(n)}});N(n)},[N]),V=function(e,t,r,o,a,l){var i=n.useState({}),s=i[0],u=i[1],d=n.useState(null),f=d[0],v=d[1],h=n.useState({}),m=h[0],g=h[1],C=n.useState(void 0),b=C[0],_=C[1];return{startSession:n.useCallback(function(n){try{return Promise.resolve(function(i,s){try{var d=function(){function i(e){var n=function(e){try{var n,t;return(null==(t=((null==(n=JSON.parse(atob(e.split(".")[1])).video)?void 0:n.room)||"").match(/(conv_[a-zA-Z0-9]+)/))?void 0:t[0])||""}catch(e){return console.warn("Could not extract conversation ID from token"),""}}(s);a(n),o(s),r(!0)}var s;t("connecting"),null==e.current.onStatusChange||e.current.onStatusChange({status:"connecting"}),u(n.overrides||{}),v(n.customLlmExtraBody||null),g(n.dynamicVariables||{}),_(n.userId);var d=function(){if(!n.conversationToken)return function(){if(n.agentId)return console.info("Getting conversation token for agentId:",n.agentId),Promise.resolve(function(e,n){try{return Promise.resolve(fetch((n||"https://api.elevenlabs.io/v1/convai/conversation/token")+"?agent_id="+e+"&source=react_native_sdk&version="+c)).then(function(e){return Promise.resolve(e.json()).then(function(n){if(!e.ok)throw new Error("Failed to get conversation token: "+n.detail.message);if(!n.token)throw new Error("No conversation token received from API");return n.token})})}catch(e){return Promise.reject(e)}}(n.agentId,n.tokenFetchUrl||l)).then(function(e){s=e});throw new Error("Either conversationToken or agentId is required")}();s=n.conversationToken}();return d&&d.then?d.then(i):i()}()}catch(e){return s(e)}return d&&d.then?d.then(void 0,s):d}(0,function(n){throw t("disconnected"),null==e.current.onStatusChange||e.current.onStatusChange({status:"disconnected"}),null==e.current.onError||e.current.onError(n),n}))}catch(e){return Promise.reject(e)}},[e,t,r,o,a,l]),endSession:n.useCallback(function(){try{try{r(!1),o(""),t("disconnected"),null==e.current.onStatusChange||e.current.onStatusChange({status:"disconnected"}),null==e.current.onDisconnect||e.current.onDisconnect("User ended conversation")}catch(n){throw null==e.current.onError||e.current.onError(n),n}return Promise.resolve()}catch(e){return Promise.reject(e)}},[e,r,o,t]),overrides:s,customLlmExtraBody:f,dynamicVariables:m,userId:b}}(L,C,h,d,w,y),B=V.startSession,J=V.endSession,q=V.overrides,K=V.customLlmExtraBody,G=V.dynamicVariables,z=V.userId,W=function(e,r,o){var a=n.useState(!1),c=a[0],l=a[1],i=n.useState(null),s=i[0],u=i[1];return n.useEffect(function(){return function(){try{return Promise.resolve(t.AudioSession.startAudioSession()).then(function(){})}catch(e){return Promise.reject(e)}}(),function(){t.AudioSession.stopAudioSession()}},[]),{roomConnected:c,localParticipant:s,handleParticipantReady:n.useCallback(function(e){u(e)},[]),handleConnected:n.useCallback(function(){l(!0),r("connected"),null==e.current.onConnect||e.current.onConnect({conversationId:o})},[o,e,r]),handleDisconnected:n.useCallback(function(){l(!1),r("disconnected"),u(null),null==e.current.onDisconnect||e.current.onDisconnect("disconnected")},[e,r]),handleError:n.useCallback(function(n){console.error("LiveKit error:",n),null==e.current.onError||e.current.onError(n.message,void 0)},[e])}}(L,C,P),Z=W.roomConnected,H=W.localParticipant,Q=W.handleParticipantReady,X=W.handleConnected,Y=W.handleDisconnected,$=W.handleError,ee=o.default.useCallback(function(){R.current=1,F.current=1,M(!1),null==L.current.onCanSendFeedbackChange||L.current.onCanSendFeedbackChange({canSendFeedback:!1}),X()},[X,L]),ne=o.default.useCallback(function(){M(!1),Y()},[Y]),te=function(e,t,r){return{sendMessage:n.useCallback(function(n){try{if("connected"!==e||!t)return console.warn("Cannot send message: room not connected or no local participant"),Promise.resolve();var o=function(e,r){try{var o=(a=(new TextEncoder).encode(JSON.stringify(n)),Promise.resolve(t.publishData(a,{reliable:!0})).then(function(){}))}catch(e){return r(e)}var a;return o&&o.then?o.then(void 0,r):o}(0,function(e){console.error("Failed to send message via WebRTC:",e),console.error("Error details:",e),null==r.current.onError||r.current.onError(e)});return Promise.resolve(o&&o.then?o.then(function(){}):void 0)}catch(e){return Promise.reject(e)}},[e,t,r])}}(g,H,L),re=te.sendMessage,oe=o.default.useCallback(function(){var e=R.current!==F.current;D!==e&&(M(e),null==L.current.onCanSendFeedbackChange||L.current.onCanSendFeedbackChange({canSendFeedback:e}))},[D,L]),ae=o.default.useCallback(function(e){D?(re({type:"feedback",score:e?"like":"dislike",event_id:R.current}),F.current=R.current,oe()):console.warn(0===F.current?"Cannot send feedback: the conversation has not started yet.":"Cannot send feedback: feedback has already been sent for the current response.")},[D,re,oe]);o.default.useCallback(function(e){console.warn("setVolume is not yet implemented in React Native SDK")},[]);var ce=o.default.useCallback(function(e){H&&H.setMicrophoneEnabled(!e)},[H]),le=o.default.useCallback(function(e){R.current=e,oe()},[oe]),ie=o.default.useCallback(function(e){if(Q(e),H){var n=function(e){var n,t,r,o,a,l,i={type:"conversation_initiation_client_data"};return e.overrides&&(i.conversation_config_override={agent:{prompt:null==(n=e.overrides.agent)?void 0:n.prompt,first_message:null==(t=e.overrides.agent)?void 0:t.firstMessage,language:null==(r=e.overrides.agent)?void 0:r.language},tts:{voice_id:null==(o=e.overrides.tts)?void 0:o.voiceId},conversation:{text_only:null==(a=e.overrides.conversation)?void 0:a.textOnly},source_info:{source:"react_native_sdk",version:(null==(l=e.overrides)||null==(l=l.client)?void 0:l.version)||c}}),e.customLlmExtraBody&&(i.custom_llm_extra_body=e.customLlmExtraBody),e.dynamicVariables&&(i.dynamic_variables=e.dynamicVariables),e.userId&&(i.user_id=String(e.userId)),i}({overrides:q,customLlmExtraBody:K,dynamicVariables:G,userId:z});re(n)}},[Q,H,q,K,G,z,re]),se={startSession:B,endSession:J,status:g,isSpeaking:T,canSendFeedback:D,getId:function(){return P},setMicMuted:ce,sendFeedback:ae,sendContextualUpdate:function(e){re({type:"contextual_update",text:e})},sendUserMessage:function(e){re({type:"user_message",text:e})},sendUserActivity:function(){re({type:"user_activity"})}},ue=o.default.useCallback(function(e){j.current=e},[]);/*#__PURE__*/return o.default.createElement(u.Provider,{value:{conversation:se,callbacksRef:L,serverUrl:_,tokenFetchUrl:y,clientTools:j.current,setCallbacks:A,setServerUrl:k,setTokenFetchUrl:S,setClientTools:ue}},/*#__PURE__*/o.default.createElement(i,{serverUrl:_,token:s,connect:v,onConnected:ee,onDisconnected:ne,onError:$,roomConnected:Z,callbacks:L.current,onParticipantReady:ie,sendMessage:re,clientTools:j.current,updateCurrentEventId:le},r))},e.useConversation=function(e){void 0===e&&(e={});var t=n.useContext(u);if(!t)throw new Error("useConversation must be used within ElevenLabsProvider");var r=e.serverUrl,a=e.tokenFetchUrl,c=e.clientTools,l=function(e,n){if(null==e)return{};var t={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(-1!==n.indexOf(r))continue;t[r]=e[r]}return t}(e,s);return o.default.useEffect(function(){r&&t.setServerUrl(r)},[t,r]),o.default.useEffect(function(){a&&t.setTokenFetchUrl(a)},[t,a]),c&&t.setClientTools(c),t.setCallbacks(l),t.conversation}});
2
2
  //# sourceMappingURL=lib.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lib.umd.js","sources":["../src/version.ts","../src/components/MessageHandler.tsx","../src/components/LiveKitRoomWrapper.tsx","../src/ElevenLabsProvider.tsx","../src/utils/constants.ts","../src/hooks/useConversationCallbacks.ts","../src/hooks/useConversationSession.ts","../src/utils/tokenUtils.ts","../src/hooks/useLiveKitRoom.ts","../src/hooks/useMessageSending.ts","../src/utils/overrides.ts"],"sourcesContent":["// This file is auto-generated during build\nexport const PACKAGE_VERSION = \"0.2.1\";\n","import { useEffect } from 'react';\nimport { useLocalParticipant, useDataChannel } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ClientToolsConfig, ClientToolCallEvent, ConversationEvent } from '../types';\nimport React from 'react';\n\ninterface MessageHandlerProps {\n onReady: (participant: LocalParticipant) => void;\n isConnected: boolean;\n callbacks: Callbacks;\n sendMessage: (message: unknown) => void;\n clientTools?: ClientToolsConfig['clientTools'];\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport function isValidEvent(event: any): event is ConversationEvent {\n return !!event.type;\n}\n\nexport const MessageHandler = ({\n onReady,\n isConnected,\n callbacks,\n sendMessage,\n clientTools = {},\n updateCurrentEventId\n}: MessageHandlerProps) => {\n const { localParticipant } = useLocalParticipant();\n\n // Track agent response count for synthetic event IDs (WebRTC mode)\n const agentResponseCountRef = React.useRef(1);\n\n useEffect(() => {\n if (isConnected && localParticipant) {\n onReady(localParticipant);\n }\n }, [isConnected, localParticipant, onReady]);\n\n const handleClientToolCall = async (clientToolCall: ClientToolCallEvent) => {\n if (\n Object.prototype.hasOwnProperty.call(\n clientTools,\n clientToolCall.client_tool_call.tool_name\n )\n ) {\n try {\n const result =\n (await clientTools[clientToolCall.client_tool_call.tool_name](\n clientToolCall.client_tool_call.parameters\n )) ?? \"Client tool execution successful.\"; // default client-tool call response\n\n // The API expects result to be a string, so we need to convert it if it's not already a string\n const formattedResult =\n typeof result === \"object\" ? JSON.stringify(result) : String(result);\n\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: formattedResult,\n is_error: false,\n });\n } catch (e) {\n const errorMessage = `Client tool execution failed with following error: ${(e as Error)?.message}`;\n callbacks.onError?.(errorMessage, {\n clientToolName: clientToolCall.client_tool_call.tool_name,\n });\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: `Client tool execution failed: ${(e as Error)?.message}`,\n is_error: true,\n });\n }\n } else {\n if (callbacks.onUnhandledClientToolCall) {\n callbacks.onUnhandledClientToolCall(clientToolCall);\n return;\n }\n\n const errorMessage = `Client tool with name ${clientToolCall.client_tool_call.tool_name} is not defined on client`;\n callbacks.onError?.(errorMessage, {\n clientToolName: clientToolCall.client_tool_call.tool_name,\n });\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: errorMessage,\n is_error: true,\n });\n }\n };\n\n const _ = useDataChannel((msg) => {\n const decoder = new TextDecoder();\n const message = JSON.parse(decoder.decode(msg.payload));\n\n if (!isValidEvent(message)) {\n callbacks.onDebug?.({\n type: \"invalid_event\",\n message,\n });\n return;\n }\n\n callbacks.onMessage?.({\n message,\n source: msg.from?.isAgent ? 'ai' : 'user',\n });\n\n if (msg.from?.isAgent) {\n callbacks.onModeChange?.({\n mode: msg.from?.isSpeaking ? 'speaking' : 'listening'\n });\n\n // Track agent responses for feedback (WebRTC mode needs synthetic event IDs)\n if (message.type === \"agent_response\" && updateCurrentEventId) {\n const eventId = agentResponseCountRef.current++;\n updateCurrentEventId(eventId);\n }\n }\n\n switch (message.type) {\n case \"ping\":\n sendMessage({\n type: \"pong\",\n event_id: message.ping_event.event_id,\n });\n break;\n case \"client_tool_call\":\n handleClientToolCall(message);\n break;\n default:\n callbacks.onDebug?.(message);\n break;\n }\n });\n\n return null;\n};","import React from 'react';\nimport { LiveKitRoom } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ClientToolsConfig } from '../types';\nimport { MessageHandler } from './MessageHandler';\n\ninterface LiveKitRoomWrapperProps {\n children: React.ReactNode;\n serverUrl: string;\n token: string;\n connect: boolean;\n onConnected: () => void;\n onDisconnected: () => void;\n onError: (error: Error) => void;\n roomConnected: boolean;\n callbacks: Callbacks;\n onParticipantReady: (participant: LocalParticipant) => void;\n sendMessage: (message: unknown) => void;\n clientTools: ClientToolsConfig['clientTools'];\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport const LiveKitRoomWrapper = ({\n children,\n serverUrl,\n token,\n connect,\n onConnected,\n onDisconnected,\n onError,\n roomConnected,\n callbacks,\n onParticipantReady,\n sendMessage,\n clientTools,\n updateCurrentEventId,\n}: LiveKitRoomWrapperProps) => {\n return (\n <LiveKitRoom\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n audio={true}\n video={false}\n options={{\n adaptiveStream: { pixelDensity: 'screen' },\n }}\n onConnected={onConnected}\n onDisconnected={onDisconnected}\n onError={onError}\n >\n <MessageHandler\n onReady={onParticipantReady}\n isConnected={roomConnected}\n callbacks={callbacks}\n sendMessage={sendMessage}\n clientTools={clientTools}\n updateCurrentEventId={updateCurrentEventId}\n />\n {children}\n </LiveKitRoom>\n );\n};","import React from 'react';\nimport { createContext, useContext, useState } from 'react';\nimport { registerGlobals } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ConversationConfig, ConversationStatus, ClientToolsConfig } from './types';\nimport { constructOverrides } from './utils/overrides';\nimport { DEFAULT_SERVER_URL } from './utils/constants';\nimport { useConversationCallbacks } from './hooks/useConversationCallbacks';\nimport { useConversationSession } from './hooks/useConversationSession';\nimport { useLiveKitRoom } from './hooks/useLiveKitRoom';\nimport { useMessageSending } from './hooks/useMessageSending';\nimport { LiveKitRoomWrapper } from './components/LiveKitRoomWrapper';\n\ninterface ConversationOptions extends Callbacks, Partial<ClientToolsConfig> {\n serverUrl?: string;\n tokenFetchUrl?: string;\n}\n\nexport interface Conversation {\n startSession: (config: ConversationConfig) => Promise<void>;\n endSession: () => Promise<void>;\n status: ConversationStatus;\n isSpeaking: boolean;\n // TODO: Implement setVolume when LiveKit React Native supports it\n // setVolume: (volume: number) => void;\n canSendFeedback: boolean;\n getId: () => string;\n sendFeedback: (like: boolean) => void;\n sendContextualUpdate: (text: string) => void;\n sendUserMessage: (text: string) => void;\n sendUserActivity: () => void;\n}\n\ninterface ElevenLabsContextType {\n conversation: Conversation;\n callbacksRef: { current: Callbacks };\n serverUrl: string;\n tokenFetchUrl?: string;\n clientTools: ClientToolsConfig['clientTools'];\n setCallbacks: (callbacks: Callbacks) => void;\n setServerUrl: (url: string) => void;\n setTokenFetchUrl: (url: string) => void;\n setClientTools: (tools: ClientToolsConfig['clientTools']) => void;\n}\n\nconst ElevenLabsContext = createContext<ElevenLabsContextType | null>(null);\n\nexport const useConversation = (options: ConversationOptions = {}): Conversation => {\n const context = useContext(ElevenLabsContext);\n if (!context) {\n throw new Error('useConversation must be used within ElevenLabsProvider');\n }\n\n const { serverUrl, tokenFetchUrl, clientTools, ...callbacks } = options;\n\n React.useEffect(() => {\n if (serverUrl) {\n context.setServerUrl(serverUrl);\n }\n }, [context, serverUrl]);\n\n React.useEffect(() => {\n if (tokenFetchUrl) {\n context.setTokenFetchUrl(tokenFetchUrl);\n }\n }, [context, tokenFetchUrl]);\n\n if (clientTools) {\n context.setClientTools(clientTools);\n }\n\n context.setCallbacks(callbacks);\n\n return context.conversation;\n};\n\ninterface ElevenLabsProviderProps {\n children: React.ReactNode;\n}\n\nexport const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children }) => {\n // Initialize globals on mount\n registerGlobals();\n\n // State management\n const [token, setToken] = useState('');\n const [connect, setConnect] = useState(false);\n const [status, setStatus] = useState<ConversationStatus>('disconnected');\n const [serverUrl, setServerUrl] = useState(DEFAULT_SERVER_URL);\n const [tokenFetchUrl, setTokenFetchUrl] = useState<string | undefined>(undefined);\n const [conversationId, setConversationId] = useState<string>('');\n const [isSpeaking, setIsSpeaking] = useState(false);\n const [canSendFeedback, setCanSendFeedback] = useState(false);\n\n // Feedback state tracking\n const currentEventIdRef = React.useRef(1);\n const lastFeedbackEventIdRef = React.useRef(1);\n\n // Use ref for clientTools to avoid re-renders (like callbacks)\n const clientToolsRef = React.useRef<ClientToolsConfig['clientTools']>({});\n\n // Custom hooks\n const { callbacksRef, setCallbacks: setCallbacksBase } = useConversationCallbacks();\n\n // Enhanced setCallbacks that wraps onModeChange to update isSpeaking state\n const setCallbacks = React.useCallback((callbacks: Callbacks) => {\n const wrappedCallbacks = {\n ...callbacks,\n onModeChange: (event: { mode: 'speaking' | 'listening' }) => {\n setIsSpeaking(event.mode === 'speaking');\n callbacks.onModeChange?.(event);\n }\n };\n setCallbacksBase(wrappedCallbacks);\n }, [setCallbacksBase]);\n\n const {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n } = useConversationSession(callbacksRef, setStatus, setConnect, setToken, setConversationId, tokenFetchUrl);\n\n const {\n roomConnected,\n localParticipant,\n handleParticipantReady,\n handleConnected,\n handleDisconnected,\n handleError,\n } = useLiveKitRoom(callbacksRef, setStatus, conversationId);\n\n // Enhanced connection handler to initialize feedback state\n const handleConnectedWithFeedback = React.useCallback(() => {\n // Reset feedback state when connecting\n currentEventIdRef.current = 1;\n lastFeedbackEventIdRef.current = 1;\n setCanSendFeedback(false);\n callbacksRef.current.onCanSendFeedbackChange?.({ canSendFeedback: false });\n\n handleConnected();\n }, [handleConnected, callbacksRef]);\n\n // Enhanced disconnection handler to reset feedback state\n const handleDisconnectedWithFeedback = React.useCallback(() => {\n setCanSendFeedback(false);\n handleDisconnected();\n }, [handleDisconnected]);\n\n const { sendMessage } = useMessageSending(status, localParticipant, callbacksRef);\n\n const updateCanSendFeedback = React.useCallback(() => {\n const newCanSendFeedback = currentEventIdRef.current !== lastFeedbackEventIdRef.current;\n\n if (canSendFeedback !== newCanSendFeedback) {\n setCanSendFeedback(newCanSendFeedback);\n callbacksRef.current.onCanSendFeedbackChange?.({ canSendFeedback: newCanSendFeedback });\n }\n }, [canSendFeedback, callbacksRef]);\n\n const sendFeedback = React.useCallback((like: boolean) => {\n if (!canSendFeedback) {\n console.warn(\n lastFeedbackEventIdRef.current === 0\n ? \"Cannot send feedback: the conversation has not started yet.\"\n : \"Cannot send feedback: feedback has already been sent for the current response.\"\n );\n return;\n }\n\n const feedbackMessage = {\n type: \"feedback\",\n score: like ? \"like\" : \"dislike\",\n event_id: currentEventIdRef.current,\n };\n\n sendMessage(feedbackMessage);\n lastFeedbackEventIdRef.current = currentEventIdRef.current;\n updateCanSendFeedback();\n }, [canSendFeedback, sendMessage, updateCanSendFeedback]);\n\n // setVolume placeholder (to be implemented when LiveKit supports it)\n const setVolume = React.useCallback((volume: number) => {\n console.warn('setVolume is not yet implemented in React Native SDK');\n }, []);\n\n const getId = () => conversationId;\n\n // Update current event ID for feedback tracking\n const updateCurrentEventId = React.useCallback((eventId: number) => {\n currentEventIdRef.current = eventId;\n updateCanSendFeedback();\n }, [updateCanSendFeedback]);\n\n // Handle participant ready with overrides\n const handleParticipantReadyWithOverrides = React.useCallback((participant: LocalParticipant) => {\n handleParticipantReady(participant);\n\n if (localParticipant) {\n const overridesEvent = constructOverrides({\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n });\n sendMessage(overridesEvent);\n }\n }, [handleParticipantReady, localParticipant, overrides, customLlmExtraBody, dynamicVariables, sendMessage]);\n\n const conversation: Conversation = {\n startSession,\n endSession,\n status,\n isSpeaking,\n // setVolume,\n canSendFeedback,\n getId,\n sendFeedback,\n sendContextualUpdate: (text: string) => {\n sendMessage({\n type: \"contextual_update\",\n text,\n });\n },\n sendUserMessage: (text: string) => {\n sendMessage({\n type: \"user_message\",\n text,\n });\n },\n sendUserActivity: () => {\n sendMessage({\n type: \"user_activity\",\n });\n },\n };\n\n // Create setClientTools function that only updates ref\n const setClientTools = React.useCallback((tools: ClientToolsConfig['clientTools']) => {\n clientToolsRef.current = tools;\n }, []);\n\n const contextValue: ElevenLabsContextType = {\n conversation,\n callbacksRef,\n serverUrl,\n tokenFetchUrl,\n clientTools: clientToolsRef.current,\n setCallbacks,\n setServerUrl,\n setTokenFetchUrl: setTokenFetchUrl,\n setClientTools,\n };\n\n return (\n <ElevenLabsContext.Provider value={contextValue}>\n <LiveKitRoomWrapper\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n onConnected={handleConnectedWithFeedback}\n onDisconnected={handleDisconnectedWithFeedback}\n onError={handleError}\n roomConnected={roomConnected}\n callbacks={callbacksRef.current}\n onParticipantReady={handleParticipantReadyWithOverrides}\n sendMessage={sendMessage}\n clientTools={clientToolsRef.current}\n updateCurrentEventId={updateCurrentEventId}\n >\n {children}\n </LiveKitRoomWrapper>\n </ElevenLabsContext.Provider>\n );\n};","export const DEFAULT_SERVER_URL = \"wss://livekit.rtc.elevenlabs.io\";\n","import { useRef, useCallback } from \"react\";\nimport type { Callbacks } from \"../types\";\n\nexport const useConversationCallbacks = () => {\n const callbacksRef = useRef<Callbacks>({});\n\n const setCallbacks = useCallback((callbacks: Callbacks) => {\n callbacksRef.current = callbacks;\n }, []);\n\n return {\n callbacksRef,\n setCallbacks,\n };\n};\n","import { useState, useCallback } from \"react\";\nimport type {\n ConversationConfig,\n ConversationStatus,\n Callbacks,\n} from \"../types\";\nimport {\n getConversationToken,\n extractConversationIdFromToken,\n} from \"../utils/tokenUtils\";\n\nexport const useConversationSession = (\n callbacksRef: { current: Callbacks },\n setStatus: (status: ConversationStatus) => void,\n setConnect: (connect: boolean) => void,\n setToken: (token: string) => void,\n setConversationId: (conversationId: string) => void,\n tokenFetchUrl?: string\n) => {\n const [overrides, setOverrides] = useState<ConversationConfig[\"overrides\"]>(\n {}\n );\n const [customLlmExtraBody, setCustomLlmExtraBody] =\n useState<ConversationConfig[\"customLlmExtraBody\"]>(null);\n const [dynamicVariables, setDynamicVariables] = useState<\n ConversationConfig[\"dynamicVariables\"]\n >({});\n\n const startSession = useCallback(\n async (config: ConversationConfig) => {\n try {\n setStatus(\"connecting\");\n callbacksRef.current.onStatusChange?.({ status: \"connecting\" });\n\n setOverrides(config.overrides || {});\n setCustomLlmExtraBody(config.customLlmExtraBody || null);\n setDynamicVariables(config.dynamicVariables || {});\n\n let conversationToken: string;\n\n if (config.conversationToken) {\n conversationToken = config.conversationToken;\n } else if (config.agentId) {\n console.info(\n \"Getting conversation token for agentId:\",\n config.agentId\n );\n // Use tokenFetchUrl from config first, then from hook parameter, then default\n const urlToUse = config.tokenFetchUrl || tokenFetchUrl;\n conversationToken = await getConversationToken(\n config.agentId,\n urlToUse\n );\n } else {\n throw new Error(\"Either conversationToken or agentId is required\");\n }\n\n const extractedConversationId =\n extractConversationIdFromToken(conversationToken);\n setConversationId(extractedConversationId);\n\n setToken(conversationToken);\n setConnect(true);\n } catch (error) {\n setStatus(\"disconnected\");\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n },\n [\n callbacksRef,\n setStatus,\n setConnect,\n setToken,\n setConversationId,\n tokenFetchUrl,\n ]\n );\n\n const endSession = useCallback(async () => {\n try {\n setConnect(false);\n setToken(\"\");\n setStatus(\"disconnected\");\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onDisconnect?.(\"User ended conversation\");\n } catch (error) {\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n }, [callbacksRef, setConnect, setToken, setStatus]);\n\n return {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n };\n};\n","import { PACKAGE_VERSION } from \"../version\";\n\nexport const extractConversationIdFromToken = (token: string): string => {\n try {\n const tokenPayload = JSON.parse(atob(token.split(\".\")[1]));\n const roomId = tokenPayload.video?.room || \"\";\n\n return roomId.match(/(conv_[a-zA-Z0-9]+)/)?.[0] || \"\";\n } catch (error) {\n console.warn(\"Could not extract conversation ID from token\");\n return \"\";\n }\n};\n\nexport const getConversationToken = async (\n agentId: string,\n tokenFetchUrl?: string\n): Promise<string> => {\n const baseUrl =\n tokenFetchUrl || \"https://api.elevenlabs.io/v1/convai/conversation/token\";\n const response = await fetch(\n `${baseUrl}?agent_id=${agentId}&source=react_native_sdk&version=${PACKAGE_VERSION}`\n );\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(`Failed to get conversation token: ${data.detail.message}`);\n }\n\n if (!data.token) {\n throw new Error(\"No conversation token received from API\");\n }\n\n return data.token;\n};\n","import { useState, useEffect, useCallback } from \"react\";\nimport { AudioSession } from \"@livekit/react-native\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type { ConversationStatus, Callbacks } from \"../types\";\n\nexport const useLiveKitRoom = (\n callbacksRef: { current: Callbacks },\n setStatus: (status: ConversationStatus) => void,\n conversationId: string\n) => {\n const [roomConnected, setRoomConnected] = useState(false);\n const [localParticipant, setLocalParticipant] =\n useState<LocalParticipant | null>(null);\n\n useEffect(() => {\n const start = async () => {\n await AudioSession.startAudioSession();\n };\n\n start();\n return () => {\n AudioSession.stopAudioSession();\n };\n }, []);\n\n const handleParticipantReady = useCallback(\n (participant: LocalParticipant) => {\n setLocalParticipant(participant);\n },\n []\n );\n\n const handleConnected = useCallback(() => {\n setRoomConnected(true);\n setStatus(\"connected\");\n callbacksRef.current.onConnect?.({ conversationId });\n }, [conversationId, callbacksRef, setStatus]);\n\n const handleDisconnected = useCallback(() => {\n setRoomConnected(false);\n setStatus(\"disconnected\");\n setLocalParticipant(null);\n callbacksRef.current.onDisconnect?.(\"disconnected\");\n }, [callbacksRef, setStatus]);\n\n const handleError = useCallback(\n (error: Error) => {\n console.error(\"LiveKit error:\", error);\n callbacksRef.current.onError?.(error.message, undefined);\n },\n [callbacksRef]\n );\n\n return {\n roomConnected,\n localParticipant,\n handleParticipantReady,\n handleConnected,\n handleDisconnected,\n handleError,\n };\n};\n","import { useCallback } from \"react\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type { ConversationStatus, Callbacks } from \"../types\";\n\nexport const useMessageSending = (\n status: ConversationStatus,\n localParticipant: LocalParticipant | null,\n callbacksRef: { current: Callbacks }\n) => {\n const sendMessage = useCallback(\n async (message: unknown) => {\n if (status !== \"connected\" || !localParticipant) {\n console.warn(\n \"Cannot send message: room not connected or no local participant\"\n );\n return;\n }\n try {\n const encoder = new TextEncoder();\n const data = encoder.encode(JSON.stringify(message));\n\n await localParticipant.publishData(data, { reliable: true });\n } catch (error) {\n console.error(\"Failed to send message via WebRTC:\", error);\n console.error(\"Error details:\", error);\n callbacksRef.current.onError?.(error as string);\n }\n },\n [status, localParticipant, callbacksRef]\n );\n\n return { sendMessage };\n};\n","import type { ConversationConfig, InitiationClientDataEvent } from \"../types\";\nimport { PACKAGE_VERSION } from \"../version\";\n\nexport function constructOverrides(\n config: ConversationConfig\n): InitiationClientDataEvent {\n const overridesEvent: InitiationClientDataEvent = {\n type: \"conversation_initiation_client_data\",\n };\n\n if (config.overrides) {\n overridesEvent.conversation_config_override = {\n agent: {\n prompt: config.overrides.agent?.prompt,\n first_message: config.overrides.agent?.firstMessage,\n language: config.overrides.agent?.language,\n },\n tts: {\n voice_id: config.overrides.tts?.voiceId,\n },\n conversation: {\n text_only: config.overrides.conversation?.textOnly,\n },\n source_info: {\n source: \"react_native_sdk\",\n version: config.overrides?.client?.version || PACKAGE_VERSION,\n },\n };\n }\n\n if (config.customLlmExtraBody) {\n overridesEvent.custom_llm_extra_body = config.customLlmExtraBody;\n }\n\n if (config.dynamicVariables) {\n overridesEvent.dynamic_variables = config.dynamicVariables;\n }\n\n if (config.userId) {\n overridesEvent.user_id = config.userId;\n }\n\n return overridesEvent;\n}\n"],"names":["PACKAGE_VERSION","MessageHandler","_ref","onReady","isConnected","callbacks","sendMessage","_ref$clientTools","clientTools","updateCurrentEventId","localParticipant","useLocalParticipant","agentResponseCountRef","React","useRef","useEffect","useDataChannel","msg","_msg$from","_msg$from2","decoder","TextDecoder","message","JSON","parse","decode","payload","type","_msg$from3","onMessage","source","from","isAgent","onModeChange","mode","isSpeaking","eventId","current","event_id","ping_event","clientToolCall","Promise","resolve","Object","prototype","hasOwnProperty","call","client_tool_call","tool_name","_temp","parameters","then","result","formattedResult","stringify","String","tool_call_id","is_error","_catch","e","onError","clientToolName","onUnhandledClientToolCall","errorMessage","reject","handleClientToolCall","onDebug","LiveKitRoomWrapper","children","createElement","LiveKitRoom","serverUrl","token","connect","audio","video","options","adaptiveStream","pixelDensity","onConnected","onDisconnected","onParticipantReady","roomConnected","_excluded","ElevenLabsContext","createContext","registerGlobals","_useState","useState","setToken","_useState2","setConnect","_useState3","status","setStatus","_useState4","setServerUrl","_useState5","undefined","tokenFetchUrl","setTokenFetchUrl","_useState6","conversationId","setConversationId","_useState7","setIsSpeaking","_useState8","canSendFeedback","setCanSendFeedback","currentEventIdRef","lastFeedbackEventIdRef","clientToolsRef","_useConversationCallb","callbacksRef","setCallbacks","useCallback","useConversationCallbacks","setCallbacksBase","wrappedCallbacks","_extends","event","_useConversationSessi","overrides","setOverrides","customLlmExtraBody","setCustomLlmExtraBody","dynamicVariables","setDynamicVariables","startSession","config","_temp2","_result2","extractedConversationId","_tokenPayload$video","_roomId$match","atob","split","room","match","error","console","warn","extractConversationIdFromToken","conversationToken","onStatusChange","agentId","info","fetch","response","json","data","ok","Error","detail","getConversationToken","_getConversationToken","endSession","onDisconnect","useConversationSession","_useLiveKitRoom","setRoomConnected","setLocalParticipant","AudioSession","startAudioSession","start","stopAudioSession","handleParticipantReady","participant","handleConnected","onConnect","handleDisconnected","handleError","useLiveKitRoom","handleConnectedWithFeedback","onCanSendFeedbackChange","handleDisconnectedWithFeedback","_useMessageSending","TextEncoder","encode","publishData","reliable","useMessageSending","updateCanSendFeedback","newCanSendFeedback","sendFeedback","like","score","volume","handleParticipantReadyWithOverrides","overridesEvent","_config$overrides$age","_config$overrides$age2","_config$overrides$age3","_config$overrides$tts","_config$overrides$con","_config$overrides","conversation_config_override","agent","prompt","first_message","firstMessage","language","tts","voice_id","voiceId","conversation","text_only","textOnly","source_info","version","client","custom_llm_extra_body","dynamic_variables","userId","user_id","constructOverrides","getId","sendContextualUpdate","text","sendUserMessage","sendUserActivity","setClientTools","tools","Provider","value","context","useContext","_objectWithoutPropertiesLoose"],"mappings":"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"}
1
+ {"version":3,"file":"lib.umd.js","sources":["../src/version.ts","../src/components/MessageHandler.tsx","../src/components/LiveKitRoomWrapper.tsx","../src/ElevenLabsProvider.tsx","../src/utils/constants.ts","../src/hooks/useConversationCallbacks.ts","../src/hooks/useConversationSession.ts","../src/utils/tokenUtils.ts","../src/hooks/useLiveKitRoom.ts","../src/hooks/useMessageSending.ts","../src/utils/overrides.ts"],"sourcesContent":["// This file is auto-generated during build\nexport const PACKAGE_VERSION = \"0.3.0\";\n","import { useEffect } from 'react';\nimport { useLocalParticipant, useDataChannel } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ClientToolsConfig, ClientToolCallEvent, ConversationEvent } from '../types';\nimport React from 'react';\n\ninterface MessageHandlerProps {\n onReady: (participant: LocalParticipant) => void;\n isConnected: boolean;\n callbacks: Callbacks;\n sendMessage: (message: unknown) => void;\n clientTools?: ClientToolsConfig['clientTools'];\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport function isValidEvent(event: any): event is ConversationEvent {\n return !!event.type;\n}\n\nexport const MessageHandler = ({\n onReady,\n isConnected,\n callbacks,\n sendMessage,\n clientTools = {},\n updateCurrentEventId\n}: MessageHandlerProps) => {\n const { localParticipant } = useLocalParticipant();\n\n // Track agent response count for synthetic event IDs (WebRTC mode)\n const agentResponseCountRef = React.useRef(1);\n\n useEffect(() => {\n if (isConnected && localParticipant) {\n onReady(localParticipant);\n }\n }, [isConnected, localParticipant, onReady]);\n\n const handleClientToolCall = async (clientToolCall: ClientToolCallEvent) => {\n if (\n Object.prototype.hasOwnProperty.call(\n clientTools,\n clientToolCall.client_tool_call.tool_name\n )\n ) {\n try {\n const result =\n (await clientTools[clientToolCall.client_tool_call.tool_name](\n clientToolCall.client_tool_call.parameters\n )) ?? \"Client tool execution successful.\"; // default client-tool call response\n\n // The API expects result to be a string, so we need to convert it if it's not already a string\n const formattedResult =\n typeof result === \"object\" ? JSON.stringify(result) : String(result);\n\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: formattedResult,\n is_error: false,\n });\n } catch (e) {\n const errorMessage = `Client tool execution failed with following error: ${(e as Error)?.message}`;\n callbacks.onError?.(errorMessage, {\n clientToolName: clientToolCall.client_tool_call.tool_name,\n });\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: `Client tool execution failed: ${(e as Error)?.message}`,\n is_error: true,\n });\n }\n } else {\n if (callbacks.onUnhandledClientToolCall) {\n callbacks.onUnhandledClientToolCall(clientToolCall);\n return;\n }\n\n const errorMessage = `Client tool with name ${clientToolCall.client_tool_call.tool_name} is not defined on client`;\n callbacks.onError?.(errorMessage, {\n clientToolName: clientToolCall.client_tool_call.tool_name,\n });\n sendMessage({\n type: \"client_tool_result\",\n tool_call_id: clientToolCall.client_tool_call.tool_call_id,\n result: errorMessage,\n is_error: true,\n });\n }\n };\n\n const _ = useDataChannel((msg) => {\n const decoder = new TextDecoder();\n const message = JSON.parse(decoder.decode(msg.payload));\n\n if (!isValidEvent(message)) {\n callbacks.onDebug?.({\n type: \"invalid_event\",\n message,\n });\n return;\n }\n\n callbacks.onMessage?.({\n message,\n source: msg.from?.isAgent ? 'ai' : 'user',\n });\n\n if (msg.from?.isAgent) {\n callbacks.onModeChange?.({\n mode: msg.from?.isSpeaking ? 'speaking' : 'listening'\n });\n\n // Track agent responses for feedback (WebRTC mode needs synthetic event IDs)\n if (message.type === \"agent_response\" && updateCurrentEventId) {\n const eventId = agentResponseCountRef.current++;\n updateCurrentEventId(eventId);\n }\n }\n\n switch (message.type) {\n case \"ping\":\n sendMessage({\n type: \"pong\",\n event_id: message.ping_event.event_id,\n });\n break;\n case \"client_tool_call\":\n handleClientToolCall(message);\n break;\n default:\n callbacks.onDebug?.(message);\n break;\n }\n });\n\n return null;\n};","import React from 'react';\nimport { LiveKitRoom } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ClientToolsConfig } from '../types';\nimport { MessageHandler } from './MessageHandler';\n\ninterface LiveKitRoomWrapperProps {\n children: React.ReactNode;\n serverUrl: string;\n token: string;\n connect: boolean;\n onConnected: () => void;\n onDisconnected: () => void;\n onError: (error: Error) => void;\n roomConnected: boolean;\n callbacks: Callbacks;\n onParticipantReady: (participant: LocalParticipant) => void;\n sendMessage: (message: unknown) => void;\n clientTools: ClientToolsConfig['clientTools'];\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport const LiveKitRoomWrapper = ({\n children,\n serverUrl,\n token,\n connect,\n onConnected,\n onDisconnected,\n onError,\n roomConnected,\n callbacks,\n onParticipantReady,\n sendMessage,\n clientTools,\n updateCurrentEventId,\n}: LiveKitRoomWrapperProps) => {\n return (\n <LiveKitRoom\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n audio={true}\n video={false}\n options={{\n adaptiveStream: { pixelDensity: 'screen' },\n }}\n onConnected={onConnected}\n onDisconnected={onDisconnected}\n onError={onError}\n >\n <MessageHandler\n onReady={onParticipantReady}\n isConnected={roomConnected}\n callbacks={callbacks}\n sendMessage={sendMessage}\n clientTools={clientTools}\n updateCurrentEventId={updateCurrentEventId}\n />\n {children}\n </LiveKitRoom>\n );\n};","import React from 'react';\nimport { createContext, useContext, useState } from 'react';\nimport { registerGlobals } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ConversationConfig, ConversationStatus, ClientToolsConfig } from './types';\nimport { constructOverrides } from './utils/overrides';\nimport { DEFAULT_SERVER_URL } from './utils/constants';\nimport { useConversationCallbacks } from './hooks/useConversationCallbacks';\nimport { useConversationSession } from './hooks/useConversationSession';\nimport { useLiveKitRoom } from './hooks/useLiveKitRoom';\nimport { useMessageSending } from './hooks/useMessageSending';\nimport { LiveKitRoomWrapper } from './components/LiveKitRoomWrapper';\n\ninterface ConversationOptions extends Callbacks, Partial<ClientToolsConfig> {\n serverUrl?: string;\n tokenFetchUrl?: string;\n}\n\nexport interface Conversation {\n startSession: (config: ConversationConfig) => Promise<void>;\n endSession: () => Promise<void>;\n status: ConversationStatus;\n isSpeaking: boolean;\n // TODO: Implement setVolume when LiveKit React Native supports it\n // setVolume: (volume: number) => void;\n canSendFeedback: boolean;\n getId: () => string;\n sendFeedback: (like: boolean) => void;\n sendContextualUpdate: (text: string) => void;\n sendUserMessage: (text: string) => void;\n sendUserActivity: () => void;\n setMicMuted: (muted: boolean) => void;\n}\n\ninterface ElevenLabsContextType {\n conversation: Conversation;\n callbacksRef: { current: Callbacks };\n serverUrl: string;\n tokenFetchUrl?: string;\n clientTools: ClientToolsConfig['clientTools'];\n setCallbacks: (callbacks: Callbacks) => void;\n setServerUrl: (url: string) => void;\n setTokenFetchUrl: (url: string) => void;\n setClientTools: (tools: ClientToolsConfig['clientTools']) => void;\n}\n\nconst ElevenLabsContext = createContext<ElevenLabsContextType | null>(null);\n\nexport const useConversation = (options: ConversationOptions = {}): Conversation => {\n const context = useContext(ElevenLabsContext);\n if (!context) {\n throw new Error('useConversation must be used within ElevenLabsProvider');\n }\n\n const { serverUrl, tokenFetchUrl, clientTools, ...callbacks } = options;\n\n React.useEffect(() => {\n if (serverUrl) {\n context.setServerUrl(serverUrl);\n }\n }, [context, serverUrl]);\n\n React.useEffect(() => {\n if (tokenFetchUrl) {\n context.setTokenFetchUrl(tokenFetchUrl);\n }\n }, [context, tokenFetchUrl]);\n\n if (clientTools) {\n context.setClientTools(clientTools);\n }\n\n context.setCallbacks(callbacks);\n\n return context.conversation;\n};\n\ninterface ElevenLabsProviderProps {\n children: React.ReactNode;\n}\n\nexport const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children }) => {\n // Initialize globals on mount\n registerGlobals();\n\n // State management\n const [token, setToken] = useState('');\n const [connect, setConnect] = useState(false);\n const [status, setStatus] = useState<ConversationStatus>('disconnected');\n const [serverUrl, setServerUrl] = useState(DEFAULT_SERVER_URL);\n const [tokenFetchUrl, setTokenFetchUrl] = useState<string | undefined>(undefined);\n const [conversationId, setConversationId] = useState<string>('');\n const [isSpeaking, setIsSpeaking] = useState(false);\n const [canSendFeedback, setCanSendFeedback] = useState(false);\n\n // Feedback state tracking\n const currentEventIdRef = React.useRef(1);\n const lastFeedbackEventIdRef = React.useRef(1);\n\n // Use ref for clientTools to avoid re-renders (like callbacks)\n const clientToolsRef = React.useRef<ClientToolsConfig['clientTools']>({});\n\n // Custom hooks\n const { callbacksRef, setCallbacks: setCallbacksBase } = useConversationCallbacks();\n\n // Enhanced setCallbacks that wraps onModeChange to update isSpeaking state\n const setCallbacks = React.useCallback((callbacks: Callbacks) => {\n const wrappedCallbacks = {\n ...callbacks,\n onModeChange: (event: { mode: 'speaking' | 'listening' }) => {\n setIsSpeaking(event.mode === 'speaking');\n callbacks.onModeChange?.(event);\n }\n };\n setCallbacksBase(wrappedCallbacks);\n }, [setCallbacksBase]);\n\n const {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n } = useConversationSession(callbacksRef, setStatus, setConnect, setToken, setConversationId, tokenFetchUrl);\n\n const {\n roomConnected,\n localParticipant,\n handleParticipantReady,\n handleConnected,\n handleDisconnected,\n handleError,\n } = useLiveKitRoom(callbacksRef, setStatus, conversationId);\n\n // Enhanced connection handler to initialize feedback state\n const handleConnectedWithFeedback = React.useCallback(() => {\n // Reset feedback state when connecting\n currentEventIdRef.current = 1;\n lastFeedbackEventIdRef.current = 1;\n setCanSendFeedback(false);\n callbacksRef.current.onCanSendFeedbackChange?.({ canSendFeedback: false });\n\n handleConnected();\n }, [handleConnected, callbacksRef]);\n\n // Enhanced disconnection handler to reset feedback state\n const handleDisconnectedWithFeedback = React.useCallback(() => {\n setCanSendFeedback(false);\n handleDisconnected();\n }, [handleDisconnected]);\n\n const { sendMessage } = useMessageSending(status, localParticipant, callbacksRef);\n\n const updateCanSendFeedback = React.useCallback(() => {\n const newCanSendFeedback = currentEventIdRef.current !== lastFeedbackEventIdRef.current;\n\n if (canSendFeedback !== newCanSendFeedback) {\n setCanSendFeedback(newCanSendFeedback);\n callbacksRef.current.onCanSendFeedbackChange?.({ canSendFeedback: newCanSendFeedback });\n }\n }, [canSendFeedback, callbacksRef]);\n\n const sendFeedback = React.useCallback((like: boolean) => {\n if (!canSendFeedback) {\n console.warn(\n lastFeedbackEventIdRef.current === 0\n ? \"Cannot send feedback: the conversation has not started yet.\"\n : \"Cannot send feedback: feedback has already been sent for the current response.\"\n );\n return;\n }\n\n const feedbackMessage = {\n type: \"feedback\",\n score: like ? \"like\" : \"dislike\",\n event_id: currentEventIdRef.current,\n };\n\n sendMessage(feedbackMessage);\n lastFeedbackEventIdRef.current = currentEventIdRef.current;\n updateCanSendFeedback();\n }, [canSendFeedback, sendMessage, updateCanSendFeedback]);\n\n // setVolume placeholder (to be implemented when LiveKit supports it)\n const setVolume = React.useCallback((volume: number) => {\n console.warn('setVolume is not yet implemented in React Native SDK');\n }, []);\n\n const getId = () => conversationId;\n\n const setMicMuted = React.useCallback((muted: boolean) => {\n if (localParticipant) {\n localParticipant.setMicrophoneEnabled(!muted);\n }\n }, [localParticipant]);\n\n // Update current event ID for feedback tracking\n const updateCurrentEventId = React.useCallback((eventId: number) => {\n currentEventIdRef.current = eventId;\n updateCanSendFeedback();\n }, [updateCanSendFeedback]);\n\n // Handle participant ready with overrides\n const handleParticipantReadyWithOverrides = React.useCallback((participant: LocalParticipant) => {\n handleParticipantReady(participant);\n\n if (localParticipant) {\n const overridesEvent = constructOverrides({\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n });\n sendMessage(overridesEvent);\n }\n }, [handleParticipantReady, localParticipant, overrides, customLlmExtraBody, dynamicVariables, userId, sendMessage]);\n\n const conversation: Conversation = {\n startSession,\n endSession,\n status,\n isSpeaking,\n // setVolume,\n canSendFeedback,\n getId,\n setMicMuted,\n sendFeedback,\n sendContextualUpdate: (text: string) => {\n sendMessage({\n type: \"contextual_update\",\n text,\n });\n },\n sendUserMessage: (text: string) => {\n sendMessage({\n type: \"user_message\",\n text,\n });\n },\n sendUserActivity: () => {\n sendMessage({\n type: \"user_activity\",\n });\n },\n };\n\n // Create setClientTools function that only updates ref\n const setClientTools = React.useCallback((tools: ClientToolsConfig['clientTools']) => {\n clientToolsRef.current = tools;\n }, []);\n\n const contextValue: ElevenLabsContextType = {\n conversation,\n callbacksRef,\n serverUrl,\n tokenFetchUrl,\n clientTools: clientToolsRef.current,\n setCallbacks,\n setServerUrl,\n setTokenFetchUrl: setTokenFetchUrl,\n setClientTools,\n };\n\n return (\n <ElevenLabsContext.Provider value={contextValue}>\n <LiveKitRoomWrapper\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n onConnected={handleConnectedWithFeedback}\n onDisconnected={handleDisconnectedWithFeedback}\n onError={handleError}\n roomConnected={roomConnected}\n callbacks={callbacksRef.current}\n onParticipantReady={handleParticipantReadyWithOverrides}\n sendMessage={sendMessage}\n clientTools={clientToolsRef.current}\n updateCurrentEventId={updateCurrentEventId}\n >\n {children}\n </LiveKitRoomWrapper>\n </ElevenLabsContext.Provider>\n );\n};","export const DEFAULT_SERVER_URL = \"wss://livekit.rtc.elevenlabs.io\";\n","import { useRef, useCallback } from \"react\";\nimport type { Callbacks } from \"../types\";\n\nexport const useConversationCallbacks = () => {\n const callbacksRef = useRef<Callbacks>({});\n\n const setCallbacks = useCallback((callbacks: Callbacks) => {\n callbacksRef.current = callbacks;\n }, []);\n\n return {\n callbacksRef,\n setCallbacks,\n };\n};\n","import { useState, useCallback } from \"react\";\nimport type {\n ConversationConfig,\n ConversationStatus,\n Callbacks,\n} from \"../types\";\nimport {\n getConversationToken,\n extractConversationIdFromToken,\n} from \"../utils/tokenUtils\";\n\nexport const useConversationSession = (\n callbacksRef: { current: Callbacks },\n setStatus: (status: ConversationStatus) => void,\n setConnect: (connect: boolean) => void,\n setToken: (token: string) => void,\n setConversationId: (conversationId: string) => void,\n tokenFetchUrl?: string\n) => {\n const [overrides, setOverrides] = useState<ConversationConfig[\"overrides\"]>(\n {}\n );\n const [customLlmExtraBody, setCustomLlmExtraBody] =\n useState<ConversationConfig[\"customLlmExtraBody\"]>(null);\n const [dynamicVariables, setDynamicVariables] = useState<\n ConversationConfig[\"dynamicVariables\"]\n >({});\n const [userId, setUserId] = useState<ConversationConfig[\"userId\"]>(undefined);\n\n const startSession = useCallback(\n async (config: ConversationConfig) => {\n try {\n setStatus(\"connecting\");\n callbacksRef.current.onStatusChange?.({ status: \"connecting\" });\n\n setOverrides(config.overrides || {});\n setCustomLlmExtraBody(config.customLlmExtraBody || null);\n setDynamicVariables(config.dynamicVariables || {});\n setUserId(config.userId);\n\n let conversationToken: string;\n\n if (config.conversationToken) {\n conversationToken = config.conversationToken;\n } else if (config.agentId) {\n console.info(\n \"Getting conversation token for agentId:\",\n config.agentId\n );\n // Use tokenFetchUrl from config first, then from hook parameter, then default\n const urlToUse = config.tokenFetchUrl || tokenFetchUrl;\n conversationToken = await getConversationToken(\n config.agentId,\n urlToUse\n );\n } else {\n throw new Error(\"Either conversationToken or agentId is required\");\n }\n\n const extractedConversationId =\n extractConversationIdFromToken(conversationToken);\n setConversationId(extractedConversationId);\n\n setToken(conversationToken);\n setConnect(true);\n } catch (error) {\n setStatus(\"disconnected\");\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n },\n [\n callbacksRef,\n setStatus,\n setConnect,\n setToken,\n setConversationId,\n tokenFetchUrl,\n ]\n );\n\n const endSession = useCallback(async () => {\n try {\n setConnect(false);\n setToken(\"\");\n setStatus(\"disconnected\");\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onDisconnect?.(\"User ended conversation\");\n } catch (error) {\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n }, [callbacksRef, setConnect, setToken, setStatus]);\n\n return {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n };\n};\n","import { PACKAGE_VERSION } from \"../version\";\n\nexport const extractConversationIdFromToken = (token: string): string => {\n try {\n const tokenPayload = JSON.parse(atob(token.split(\".\")[1]));\n const roomId = tokenPayload.video?.room || \"\";\n\n return roomId.match(/(conv_[a-zA-Z0-9]+)/)?.[0] || \"\";\n } catch (error) {\n console.warn(\"Could not extract conversation ID from token\");\n return \"\";\n }\n};\n\nexport const getConversationToken = async (\n agentId: string,\n tokenFetchUrl?: string\n): Promise<string> => {\n const baseUrl =\n tokenFetchUrl || \"https://api.elevenlabs.io/v1/convai/conversation/token\";\n const response = await fetch(\n `${baseUrl}?agent_id=${agentId}&source=react_native_sdk&version=${PACKAGE_VERSION}`\n );\n\n const data = await response.json();\n\n if (!response.ok) {\n throw new Error(`Failed to get conversation token: ${data.detail.message}`);\n }\n\n if (!data.token) {\n throw new Error(\"No conversation token received from API\");\n }\n\n return data.token;\n};\n","import { useState, useEffect, useCallback } from \"react\";\nimport { AudioSession } from \"@livekit/react-native\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type { ConversationStatus, Callbacks } from \"../types\";\n\nexport const useLiveKitRoom = (\n callbacksRef: { current: Callbacks },\n setStatus: (status: ConversationStatus) => void,\n conversationId: string\n) => {\n const [roomConnected, setRoomConnected] = useState(false);\n const [localParticipant, setLocalParticipant] =\n useState<LocalParticipant | null>(null);\n\n useEffect(() => {\n const start = async () => {\n await AudioSession.startAudioSession();\n };\n\n start();\n return () => {\n AudioSession.stopAudioSession();\n };\n }, []);\n\n const handleParticipantReady = useCallback(\n (participant: LocalParticipant) => {\n setLocalParticipant(participant);\n },\n []\n );\n\n const handleConnected = useCallback(() => {\n setRoomConnected(true);\n setStatus(\"connected\");\n callbacksRef.current.onConnect?.({ conversationId });\n }, [conversationId, callbacksRef, setStatus]);\n\n const handleDisconnected = useCallback(() => {\n setRoomConnected(false);\n setStatus(\"disconnected\");\n setLocalParticipant(null);\n callbacksRef.current.onDisconnect?.(\"disconnected\");\n }, [callbacksRef, setStatus]);\n\n const handleError = useCallback(\n (error: Error) => {\n console.error(\"LiveKit error:\", error);\n callbacksRef.current.onError?.(error.message, undefined);\n },\n [callbacksRef]\n );\n\n return {\n roomConnected,\n localParticipant,\n handleParticipantReady,\n handleConnected,\n handleDisconnected,\n handleError,\n };\n};\n","import { useCallback } from \"react\";\nimport type { LocalParticipant } from \"livekit-client\";\nimport type { ConversationStatus, Callbacks } from \"../types\";\n\nexport const useMessageSending = (\n status: ConversationStatus,\n localParticipant: LocalParticipant | null,\n callbacksRef: { current: Callbacks }\n) => {\n const sendMessage = useCallback(\n async (message: unknown) => {\n if (status !== \"connected\" || !localParticipant) {\n console.warn(\n \"Cannot send message: room not connected or no local participant\"\n );\n return;\n }\n try {\n const encoder = new TextEncoder();\n const data = encoder.encode(JSON.stringify(message));\n\n await localParticipant.publishData(data, { reliable: true });\n } catch (error) {\n console.error(\"Failed to send message via WebRTC:\", error);\n console.error(\"Error details:\", error);\n callbacksRef.current.onError?.(error as string);\n }\n },\n [status, localParticipant, callbacksRef]\n );\n\n return { sendMessage };\n};\n","import type { ConversationConfig, InitiationClientDataEvent } from \"../types\";\nimport { PACKAGE_VERSION } from \"../version\";\n\nexport function constructOverrides(\n config: ConversationConfig\n): InitiationClientDataEvent {\n const overridesEvent: InitiationClientDataEvent = {\n type: \"conversation_initiation_client_data\",\n };\n\n if (config.overrides) {\n overridesEvent.conversation_config_override = {\n agent: {\n prompt: config.overrides.agent?.prompt,\n first_message: config.overrides.agent?.firstMessage,\n language: config.overrides.agent?.language,\n },\n tts: {\n voice_id: config.overrides.tts?.voiceId,\n },\n conversation: {\n text_only: config.overrides.conversation?.textOnly,\n },\n source_info: {\n source: \"react_native_sdk\",\n version: config.overrides?.client?.version || PACKAGE_VERSION,\n },\n };\n }\n\n if (config.customLlmExtraBody) {\n overridesEvent.custom_llm_extra_body = config.customLlmExtraBody;\n }\n\n if (config.dynamicVariables) {\n overridesEvent.dynamic_variables = config.dynamicVariables;\n }\n\n if (config.userId) {\n overridesEvent.user_id = String(config.userId);\n }\n\n return overridesEvent;\n}\n"],"names":["PACKAGE_VERSION","MessageHandler","_ref","onReady","isConnected","callbacks","sendMessage","_ref$clientTools","clientTools","updateCurrentEventId","localParticipant","useLocalParticipant","agentResponseCountRef","React","useRef","useEffect","useDataChannel","msg","_msg$from","_msg$from2","decoder","TextDecoder","message","JSON","parse","decode","payload","type","_msg$from3","onMessage","source","from","isAgent","onModeChange","mode","isSpeaking","eventId","current","event_id","ping_event","clientToolCall","Promise","resolve","Object","prototype","hasOwnProperty","call","client_tool_call","tool_name","_temp","parameters","then","result","formattedResult","stringify","String","tool_call_id","is_error","_catch","e","onError","clientToolName","onUnhandledClientToolCall","errorMessage","reject","handleClientToolCall","onDebug","LiveKitRoomWrapper","children","createElement","LiveKitRoom","serverUrl","token","connect","audio","video","options","adaptiveStream","pixelDensity","onConnected","onDisconnected","onParticipantReady","roomConnected","_excluded","ElevenLabsContext","createContext","registerGlobals","_useState","useState","setToken","_useState2","setConnect","_useState3","status","setStatus","_useState4","setServerUrl","_useState5","undefined","tokenFetchUrl","setTokenFetchUrl","_useState6","conversationId","setConversationId","_useState7","setIsSpeaking","_useState8","canSendFeedback","setCanSendFeedback","currentEventIdRef","lastFeedbackEventIdRef","clientToolsRef","_useConversationCallb","callbacksRef","setCallbacks","useCallback","useConversationCallbacks","setCallbacksBase","wrappedCallbacks","_extends","event","_useConversationSessi","overrides","setOverrides","customLlmExtraBody","setCustomLlmExtraBody","dynamicVariables","setDynamicVariables","userId","setUserId","startSession","config","_temp2","_result2","extractedConversationId","_tokenPayload$video","_roomId$match","atob","split","room","match","error","console","warn","extractConversationIdFromToken","conversationToken","onStatusChange","agentId","info","fetch","response","json","data","ok","Error","detail","getConversationToken","_getConversationToken","endSession","onDisconnect","useConversationSession","_useLiveKitRoom","setRoomConnected","setLocalParticipant","AudioSession","startAudioSession","start","stopAudioSession","handleParticipantReady","participant","handleConnected","onConnect","handleDisconnected","handleError","useLiveKitRoom","handleConnectedWithFeedback","onCanSendFeedbackChange","handleDisconnectedWithFeedback","_useMessageSending","TextEncoder","encode","publishData","reliable","useMessageSending","updateCanSendFeedback","newCanSendFeedback","sendFeedback","like","score","volume","setMicMuted","muted","setMicrophoneEnabled","handleParticipantReadyWithOverrides","overridesEvent","_config$overrides$age","_config$overrides$age2","_config$overrides$age3","_config$overrides$tts","_config$overrides$con","_config$overrides","conversation_config_override","agent","prompt","first_message","firstMessage","language","tts","voice_id","voiceId","conversation","text_only","textOnly","source_info","version","client","custom_llm_extra_body","dynamic_variables","user_id","constructOverrides","getId","sendContextualUpdate","text","sendUserMessage","sendUserActivity","setClientTools","tools","Provider","value","context","useContext","_objectWithoutPropertiesLoose"],"mappings":"yoBACa,IAAAA,EAAkB,QCkBlBC,EAAiB,SAAHC,OACzBC,EAAOD,EAAPC,QACAC,EAAWF,EAAXE,YACAC,EAASH,EAATG,UACAC,EAAWJ,EAAXI,YAAWC,EAAAL,EACXM,YAAAA,OAAW,IAAAD,EAAG,CAAE,EAAAA,EAChBE,EAAoBP,EAApBO,qBAEQC,EAAqBC,EAAmBA,sBAAxCD,iBAGFE,EAAwBC,EAAAA,QAAMC,OAAO,GA2G3C,OAzGAC,YAAU,WACJX,GAAeM,GACjBP,EAAQO,EAEZ,EAAG,CAACN,EAAaM,EAAkBP,IAwDzBa,EAAcA,eAAC,SAACC,GAAOC,IAAAA,EAAAC,EACzBC,EAAU,IAAIC,YACdC,EAAUC,KAAKC,MAAMJ,EAAQK,OAAOR,EAAIS,UAE9C,GAAkBJ,EAhFLK,KAgFb,CAjFY,IA8FWC,EAAvB,GALmB,MAAnBvB,EAAUwB,WAAVxB,EAAUwB,UAAY,CACpBP,QAAAA,EACAQ,OAAQZ,OAAAA,EAAAD,EAAIc,OAAJb,EAAUc,QAAU,KAAO,gBAGrCb,EAAIF,EAAIc,OAAJZ,EAAUa,gBACZ3B,EAAU4B,cAAV5B,EAAU4B,aAAe,CACvBC,YAAMN,EAAAX,EAAIc,OAAJH,EAAUO,WAAa,WAAa,cAIvB,mBAAjBb,EAAQK,MAA6BlB,GAAsB,CAC7D,IAAM2B,EAAUxB,EAAsByB,UACtC5B,EAAqB2B,EACvB,CAGF,OAAQd,EAAQK,MACd,IAAK,OACHrB,EAAY,CACVqB,KAAM,OACNW,SAAUhB,EAAQiB,WAAWD,WAE/B,MACF,IAAK,oBA1FH,SAA8BE,GAAuC,IAAA,OAAAC,QAAAC,sBAEvEC,OAAOC,UAAUC,eAAeC,KAC9BtC,EACAgC,EAAeO,iBAAiBC,WACjC,CAAA,IAAAC,0BAEGR,QAAAC,QAEOlC,EAAYgC,EAAeO,iBAAiBC,WACjDR,EAAeO,iBAAiBG,aACjCC,KAHGC,SAAAA,GAMN,IAAMC,EACc,iBAAXD,EAAsB7B,KAAK+B,UAAUF,GAAUG,OAAOH,GAE/D9C,EAAY,CACVqB,KAAM,qBACN6B,aAAchB,EAAeO,iBAAiBS,aAC9CJ,OAAQC,EACRI,UAAU,GACT,4DAjBJC,GAkBQC,SAAAA,GAEPtD,MAAAA,EAAUuD,SAAVvD,EAAUuD,QADkED,6DAAAA,SAAAA,EAAarC,SACvD,CAChCuC,eAAgBrB,EAAeO,iBAAiBC,YAElD1C,EAAY,CACVqB,KAAM,qBACN6B,aAAchB,EAAeO,iBAAiBS,aAC9CJ,yCAAqD,MAAXO,OAAW,EAAXA,EAAarC,SACvDmC,UAAU,GAEd,GAACR,GAAAA,GAAAA,EAAAE,KAAA,OAAAF,EAAAE,wBAED,GAAI9C,EAAUyD,0BAEZ,YADAzD,EAAUyD,0BAA0BtB,GAItC,IAAMuB,EAAwCvB,yBAAAA,EAAeO,iBAAiBC,UAAoC,4BAClH3C,MAAAA,EAAUuD,SAAVvD,EAAUuD,QAAUG,EAAc,CAChCF,eAAgBrB,EAAeO,iBAAiBC,YAElD1C,EAAY,CACVqB,KAAM,qBACN6B,aAAchB,EAAeO,iBAAiBS,aAC9CJ,OAAQW,EACRN,UAAU,GACT,KAEP,CAAC,MAAAE,GAAAlB,OAAAA,QAAAuB,OAAAL,EAAA,CAAA,CAuCKM,CAAqB3C,GACrB,MACF,cACEjB,EAAU6D,SAAV7D,EAAU6D,QAAU5C,GA9BxB,MALmB,MAAjBjB,EAAU6D,SAAV7D,EAAU6D,QAAU,CAClBvC,KAAM,gBACNL,QAAAA,GAoCN,OAGF,ECpHa6C,EAAqB,SAAHjE,GAC7B,IAAAkE,EAAQlE,EAARkE,sBAcA,OACEvD,EAAAA,QAACwD,cAAAC,cACC,CAAAC,UAfKrE,EAATqE,UAgBIC,MAfCtE,EAALsE,MAgBIC,QAfGvE,EAAPuE,QAgBIC,OAAO,EACPC,OAAO,EACPC,QAAS,CACPC,eAAgB,CAAEC,aAAc,WAElCC,YApBO7E,EAAX6E,YAqBIC,eApBU9E,EAAd8E,eAqBIpB,QApBG1D,EAAP0D,sBAsBI/C,UAACwD,cAAApE,EACC,CAAAE,QApBYD,EAAlB+E,mBAqBM7E,YAvBOF,EAAbgF,cAwBM7E,UAvBGH,EAATG,UAwBMC,YAtBKJ,EAAXI,YAuBME,YAtBKN,EAAXM,YAuBMC,qBAtBcP,EAApBO,uBAwBK2D,EAGP,EC9DAe,EAAA,CAAA,YAAA,gBAAA,eA8CMC,eAAoBC,gBAA4C,2BAmCD,SAAtCnF,GAAyC,IAAAkE,EAAQlE,EAARkE,SAEtEkB,EAAAA,kBAGA,IAAAC,EAA0BC,EAAQA,SAAC,IAA5BhB,EAAKe,KAAEE,EAAQF,EAAA,GACtBG,EAA8BF,EAAAA,UAAS,GAAhCf,EAAOiB,EAAEC,GAAAA,EAAUD,KAC1BE,EAA4BJ,WAA6B,gBAAlDK,EAAMD,EAAEE,GAAAA,EAASF,EAAA,GACxBG,EAAkCP,EAAQA,SCzFV,mCDyFzBjB,EAASwB,EAAA,GAAEC,EAAYD,EAC9B,GAAAE,EAA0CT,EAAQA,cAAqBU,GAAhEC,EAAaF,EAAEG,GAAAA,EAAgBH,KACtCI,EAA4Cb,EAAAA,SAAiB,IAAtDc,EAAcD,EAAA,GAAEE,EAAiBF,EAAA,GACxCG,EAAoChB,EAAQA,UAAC,GAAtCrD,EAAUqE,EAAA,GAAEC,EAAaD,EAChC,GAAAE,EAA8ClB,EAAAA,UAAS,GAAhDmB,EAAeD,EAAEE,GAAAA,EAAkBF,KAGpCG,EAAoBhG,UAAMC,OAAO,GACjCgG,EAAyBjG,UAAMC,OAAO,GAGtCiG,EAAiBlG,EAAK,QAACC,OAAyC,IAGtEkG,EEpGsC,WACtC,IAAMC,EAAenG,SAAkB,CAAA,GAEjCoG,EAAeC,EAAAA,YAAY,SAAC9G,GAChC4G,EAAa5E,QAAUhC,CACzB,EAAG,IAEH,MAAO,CACL4G,aAAAA,EACAC,aAAAA,EAEJ,CFyF2DE,GAAjDH,EAAYD,EAAZC,aAA4BI,EAAgBL,EAA9BE,aAGhBA,EAAerG,UAAMsG,YAAY,SAAC9G,GACtC,IAAMiH,EAAgBC,EACjBlH,CAAAA,EAAAA,GACH4B,aAAc,SAACuF,GACbf,EAA6B,aAAfe,EAAMtF,MACE,MAAtB7B,EAAU4B,cAAV5B,EAAU4B,aAAeuF,EAC3B,IAEFH,EAAiBC,EACnB,EAAG,CAACD,IAEJI,EG1GoC,SACpCR,EACAnB,EACAH,EACAF,EACAc,EACAJ,GAEA,IAAAZ,EAAkCC,EAAQA,SACxC,IADKkC,EAASnC,EAAA,GAAEoC,EAAYpC,EAG9B,GAAAG,EACEF,EAAQA,SAA2C,MAD9CoC,EAAkBlC,EAAEmC,GAAAA,EAAqBnC,EAAA,GAEhDE,EAAgDJ,EAAAA,SAE9C,CAAA,GAFKsC,EAAgBlC,EAAA,GAAEmC,EAAmBnC,EAG5C,GAAAG,EAA4BP,EAAAA,cAAuCU,GAA5D8B,EAAMjC,EAAEkC,GAAAA,EAASlC,KAoExB,MAAO,CACLmC,aAnEmBf,cAAW,SACvBgB,GAA0B,IAAI,OAAA1F,QAAAC,gCAAA,oBAC/B0F,EAAAC,GA4BF,IAAMC,ECzDgC,SAAC9D,GAC7C,IAAI+D,IAAAA,EAAAC,EAIF,OAAOA,OAAAA,WAFQD,EADMhH,KAAKC,MAAMiH,KAAKjE,EAAMkE,MAAM,KAAK,KAC1B/D,cAAb4D,EAAoBI,OAAQ,IAE7BC,MAAM,6BAAbJ,EAAAA,EAAsC,KAAM,EACrD,CAAE,MAAOK,GAEP,OADAC,QAAQC,KAAK,gDACN,EACT,CACF,CDgDUC,CAA+BC,GACjC1C,EAAkB+B,GAElB7C,EAASwD,GACTtD,GAAW,EAAM,CAxBjB,IAAIsD,EARJnD,EAAU,cACVmB,MAAAA,EAAa5E,QAAQ6G,gBAArBjC,EAAa5E,QAAQ6G,eAAiB,CAAErD,OAAQ,eAEhD8B,EAAaQ,EAAOT,WAAa,IACjCG,EAAsBM,EAAOP,oBAAsB,MACnDG,EAAoBI,EAAOL,kBAAoB,CAAA,GAC/CG,EAAUE,EAAOH,QAEa,IAAA/E,EAAA,WAAA,IAE1BkF,EAAOc,kBAEAd,OAAAA,WAAAA,GAAAA,EAAOgB,QAMuC,OALvDL,QAAQM,KACN,0CACAjB,EAAOgB,SAG8C1G,QAAAC,QCpCpD,SACXyG,EACAhD,GAAsB,IAGsD,OAAA1D,QAAAC,QACrD2G,OADrBlD,GAAiB,0DAEMgD,aAAAA,sCAA2CnJ,IACnEmD,KAAA,SAFKmG,GAAQ7G,OAAAA,QAAAC,QAIK4G,EAASC,QAAMpG,KAAA,SAA5BqG,GAEN,IAAKF,EAASG,GACZ,MAAM,IAAIC,MAAK,qCAAsCF,EAAKG,OAAOrI,SAGnE,IAAKkI,EAAKhF,MACR,MAAM,IAAIkF,MAAM,2CAGlB,OAAOF,EAAKhF,KAAM,EAAA,EACpB,CAAC,MAAAb,UAAAlB,QAAAuB,OAAAL,EAAA,CAAA,CDgBmCiG,CACxBzB,EAAOgB,QAFQhB,EAAOhC,eAAiBA,IAIxChD,KAAA0G,SAAAA,GAHDZ,EAAiBY,CAGf,GAEF,UAAUH,MAAM,kDAAmD,CAZ1DvB,GADTc,EAAoBd,EAAOc,iBAawC,CAhBvC,GAgBuC,OAAAhG,GAAAA,EAAAE,KAAAF,EAAAE,KAAAiF,GAAAA,GASvE,6DAnCmC1E,CAAA,EAmClC,SAAQmF,GAIP,MAHA/C,EAAU,gBACVmB,MAAAA,EAAa5E,QAAQ6G,gBAArBjC,EAAa5E,QAAQ6G,eAAiB,CAAErD,OAAQ,iBACpB,MAA5BoB,EAAa5E,QAAQuB,SAArBqD,EAAa5E,QAAQuB,QAAUiF,GACzBA,CACR,GACF,CAAC,MAAAlF,GAAAlB,OAAAA,QAAAuB,OAAAL,EAAA,CAAA,EACD,CACEsD,EACAnB,EACAH,EACAF,EACAc,EACAJ,IAmBF2D,WAfiB3C,EAAAA,YAAW,WAAA,IAC5B,IACExB,GAAW,GACXF,EAAS,IACTK,EAAU,gBACVmB,MAAAA,EAAa5E,QAAQ6G,gBAArBjC,EAAa5E,QAAQ6G,eAAiB,CAAErD,OAAQ,iBAChDoB,MAAAA,EAAa5E,QAAQ0H,cAArB9C,EAAa5E,QAAQ0H,aAAe,0BACtC,CAAE,MAAOlB,GAEP,MAD4B,MAA5B5B,EAAa5E,QAAQuB,SAArBqD,EAAa5E,QAAQuB,QAAUiF,GACzBA,CACR,CAAC,OAAApG,QAAAC,SACH,CAAC,MAAAiB,GAAA,OAAAlB,QAAAuB,OAAAL,EAAA,CAAA,EAAE,CAACsD,EAActB,EAAYF,EAAUK,IAKtC4B,UAAAA,EACAE,mBAAAA,EACAE,iBAAAA,EACAE,OAAAA,EAEJ,CHqBMgC,CAAuB/C,EAAcnB,EAAWH,EAAYF,EAAUc,EAAmBJ,GAN3F+B,EAAYT,EAAZS,aACA4B,EAAUrC,EAAVqC,WACApC,EAASD,EAATC,UACAE,EAAkBH,EAAlBG,mBACAE,EAAgBL,EAAhBK,iBACAE,EAAMP,EAANO,OAGFiC,EKzH4B,SAC5BhD,EACAnB,EACAQ,GAEA,IAAAf,EAA0CC,EAAQA,UAAC,GAA5CN,EAAaK,EAAA,GAAE2E,EAAgB3E,EACtC,GAAAG,EACEF,EAAAA,SAAkC,MAD7B9E,EAAgBgF,EAAEyE,GAAAA,EAAmBzE,KA0C5C,OAvCA3E,EAAAA,UAAU,WAMR,OALM,WAAK,IAAc0B,OAAAA,QAAAC,QACjB0H,EAAYA,aAACC,qBAAmBlH,KAAA,WAAA,EACxC,CAAC,MAAAQ,GAAAlB,OAAAA,QAAAuB,OAAAL,EAED2G,CAAAA,CAAAA,GACO,WACLF,EAAAA,aAAaG,kBACf,CACF,EAAG,IA8BI,CACLrF,cAAAA,EACAxE,iBAAAA,EACA8J,uBA/B6BrD,EAAWA,YACxC,SAACsD,GACCN,EAAoBM,EACtB,EACA,IA4BAC,gBAzBsBvD,cAAY,WAClC+C,GAAiB,GACjBpE,EAAU,aACoB,MAA9BmB,EAAa5E,QAAQsI,WAArB1D,EAAa5E,QAAQsI,UAAY,CAAErE,eAAAA,GACrC,EAAG,CAACA,EAAgBW,EAAcnB,IAsBhC8E,mBApByBzD,cAAY,WACrC+C,GAAiB,GACjBpE,EAAU,gBACVqE,EAAoB,MACpBlD,MAAAA,EAAa5E,QAAQ0H,cAArB9C,EAAa5E,QAAQ0H,aAAe,eACtC,EAAG,CAAC9C,EAAcnB,IAgBhB+E,YAdkB1D,cAClB,SAAC0B,GACCC,QAAQD,MAAM,iBAAkBA,GAChC5B,MAAAA,EAAa5E,QAAQuB,SAArBqD,EAAa5E,QAAQuB,QAAUiF,EAAMvH,aAAS4E,EAChD,EACA,CAACe,IAWL,CLwEM6D,CAAe7D,EAAcnB,EAAWQ,GAN1CpB,EAAa+E,EAAb/E,cACAxE,EAAgBuJ,EAAhBvJ,iBACA8J,EAAsBP,EAAtBO,uBACAE,EAAeT,EAAfS,gBACAE,EAAkBX,EAAlBW,mBACAC,EAAWZ,EAAXY,YAIIE,GAA8BlK,EAAK,QAACsG,YAAY,WAEpDN,EAAkBxE,QAAU,EAC5ByE,EAAuBzE,QAAU,EACjCuE,GAAmB,GACyB,MAA5CK,EAAa5E,QAAQ2I,yBAArB/D,EAAa5E,QAAQ2I,wBAA0B,CAAErE,iBAAiB,IAElE+D,GACF,EAAG,CAACA,EAAiBzD,IAGfgE,GAAiCpK,EAAK,QAACsG,YAAY,WACvDP,GAAmB,GACnBgE,GACF,EAAG,CAACA,IAEJM,GMpJ+B,SAC/BrF,EACAnF,EACAuG,GAwBA,MAAO,CAAE3G,YAtBW6G,EAAAA,YACX7F,SAAAA,GAAoB,IACzB,GAAe,cAAXuE,IAA2BnF,EAI7B,OAHAoI,QAAQC,KACN,mEAEFtG,QAAAC,UACD,IAAAO,2BAGOuG,GADU,IAAI2B,aACCC,OAAO7J,KAAK+B,UAAUhC,IAAUmB,QAAAC,QAE/ChC,EAAiB2K,YAAY7B,EAAM,CAAE8B,UAAU,KAAOnI,KAAA,WAAA,yBAJ1D,IAEIqG,sCAHP9F,CACG,EAKH,SAAQmF,GACPC,QAAQD,MAAM,qCAAsCA,GACpDC,QAAQD,MAAM,iBAAkBA,SAChC5B,EAAa5E,QAAQuB,SAArBqD,EAAa5E,QAAQuB,QAAUiF,EACjC,GAACpG,OAAAA,QAAAC,QAAAO,GAAAA,EAAAE,KAAAF,EAAAE,KAAA,WAAA,QAAA,EACH,CAAC,MAAAQ,GAAA,OAAAlB,QAAAuB,OAAAL,EAAA,CAAA,EACD,CAACkC,EAAQnF,EAAkBuG,IAI/B,CNwH0BsE,CAAkB1F,EAAQnF,EAAkBuG,GAA5D3G,GAAW4K,GAAX5K,YAEFkL,GAAwB3K,EAAK,QAACsG,YAAY,WAC9C,IAAMsE,EAAqB5E,EAAkBxE,UAAYyE,EAAuBzE,QAE5EsE,IAAoB8E,IACtB7E,EAAmB6E,GACnBxE,MAAAA,EAAa5E,QAAQ2I,yBAArB/D,EAAa5E,QAAQ2I,wBAA0B,CAAErE,gBAAiB8E,IAEtE,EAAG,CAAC9E,EAAiBM,IAEfyE,GAAe7K,EAAK,QAACsG,YAAY,SAACwE,GACjChF,GAeLrG,GANwB,CACtBqB,KAAM,WACNiK,MAAOD,EAAO,OAAS,UACvBrJ,SAAUuE,EAAkBxE,UAI9ByE,EAAuBzE,QAAUwE,EAAkBxE,QACnDmJ,MAhBE1C,QAAQC,KAC6B,IAAnCjC,EAAuBzE,QACnB,8DACA,iFAcV,EAAG,CAACsE,EAAiBrG,GAAakL,KAGhB3K,EAAAA,QAAMsG,YAAY,SAAC0E,GACnC/C,QAAQC,KAAK,uDACf,EAAG,IAEH,IAEM+C,GAAcjL,EAAAA,QAAMsG,YAAY,SAAC4E,GACjCrL,GACFA,EAAiBsL,sBAAsBD,EAE3C,EAAG,CAACrL,IAGED,GAAuBI,EAAAA,QAAMsG,YAAY,SAAC/E,GAC9CyE,EAAkBxE,QAAUD,EAC5BoJ,IACF,EAAG,CAACA,KAGES,GAAsCpL,EAAK,QAACsG,YAAY,SAACsD,GAG7D,GAFAD,EAAuBC,GAEnB/J,EAAkB,CACpB,IAAMwL,EO7MI,SACd/D,GAEA,IAIsBgE,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAJhBN,EAA4C,CAChDvK,KAAM,uCAmCR,OAhCIwG,EAAOT,YACTwE,EAAeO,6BAA+B,CAC5CC,MAAO,CACLC,OAAQR,OAAFA,EAAEhE,EAAOT,UAAUgF,YAAjBP,EAAAA,EAAwBQ,OAChCC,cAAqC,OAAxBR,EAAEjE,EAAOT,UAAUgF,YAAK,EAAtBN,EAAwBS,aACvCC,SAAUT,OAAFA,EAAElE,EAAOT,UAAUgF,YAAjBL,EAAAA,EAAwBS,UAEpCC,IAAK,CACHC,SAAUV,OAAFA,EAAEnE,EAAOT,UAAUqF,UAAjBT,EAAAA,EAAsBW,SAElCC,aAAc,CACZC,iBAASZ,EAAEpE,EAAOT,UAAUwF,qBAAjBX,EAA+Ba,UAE5CC,YAAa,CACXvL,OAAQ,mBACRwL,SAAyBd,OAAhBA,EAAArE,EAAOT,YAAP8E,OAAgBA,EAAhBA,EAAkBe,aAAlBf,EAAAA,EAA0Bc,UAAWtN,KAKhDmI,EAAOP,qBACTsE,EAAesB,sBAAwBrF,EAAOP,oBAG5CO,EAAOL,mBACToE,EAAeuB,kBAAoBtF,EAAOL,kBAGxCK,EAAOH,SACTkE,EAAewB,QAAUnK,OAAO4E,EAAOH,SAGlCkE,CACT,CPqK6ByB,CAAmB,CACxCjG,UAAAA,EACAE,mBAAAA,EACAE,iBAAAA,EACAE,OAAAA,IAEF1H,GAAY4L,EACd,CACF,EAAG,CAAC1B,EAAwB9J,EAAkBgH,EAAWE,EAAoBE,EAAkBE,EAAQ1H,KAEjG4M,GAA6B,CACjChF,aAAAA,EACA4B,WAAAA,EACAjE,OAAAA,EACA1D,WAAAA,EAEAwE,gBAAAA,EACAiH,MApCY,WAAH,OAAStH,CAAc,EAqChCwF,YAAAA,GACAJ,aAAAA,GACAmC,qBAAsB,SAACC,GACrBxN,GAAY,CACVqB,KAAM,oBACNmM,KAAAA,GAEJ,EACAC,gBAAiB,SAACD,GAChBxN,GAAY,CACVqB,KAAM,eACNmM,KAAAA,GAEJ,EACAE,iBAAkB,WAChB1N,GAAY,CACVqB,KAAM,iBAEV,GAIIsM,GAAiBpN,EAAK,QAACsG,YAAY,SAAC+G,GACxCnH,EAAe1E,QAAU6L,CAC3B,EAAG,iBAcH,OACErN,wBAACuE,EAAkB+I,SAAS,CAAAC,MAbc,CAC1ClB,aAAAA,GACAjG,aAAAA,EACA1C,UAAAA,EACA4B,cAAAA,EACA3F,YAAauG,EAAe1E,QAC5B6E,aAAAA,EACAlB,aAAAA,EACAI,iBAAkBA,EAClB6H,eAAAA,kBAKEpN,EAAC,QAAAwD,cAAAF,EACC,CAAAI,UAAWA,EACXC,MAAOA,EACPC,QAASA,EACTM,YAAagG,GACb/F,eAAgBiG,GAChBrH,QAASiH,EACT3F,cAAeA,EACf7E,UAAW4G,EAAa5E,QACxB4C,mBAAoBgH,GACpB3L,YAAaA,GACbE,YAAauG,EAAe1E,QAC5B5B,qBAAsBA,IAErB2D,GAIT,oBA5O+B,SAACQ,QAA+B,IAA/BA,IAAAA,EAA+B,CAAA,GAC7D,IAAMyJ,EAAUC,aAAWlJ,GAC3B,IAAKiJ,EACH,MAAU,IAAA3E,MAAM,0DAGlB,IAAQnF,EAAwDK,EAAxDL,UAAW4B,EAA6CvB,EAA7CuB,cAAe3F,EAA8BoE,EAA9BpE,YAAgBH,6IAASkO,CAAK3J,EAALO,GAoB3D,OAlBAtE,EAAK,QAACE,UAAU,WACVwD,GACF8J,EAAQrI,aAAazB,EAEzB,EAAG,CAAC8J,EAAS9J,IAEb1D,EAAAA,QAAME,UAAU,WACVoF,GACFkI,EAAQjI,iBAAiBD,EAE7B,EAAG,CAACkI,EAASlI,IAET3F,GACF6N,EAAQJ,eAAezN,GAGzB6N,EAAQnH,aAAa7G,GAEdgO,EAAQnB,YACjB"}
package/dist/version.d.ts CHANGED
@@ -1 +1 @@
1
- export declare const PACKAGE_VERSION = "0.2.1";
1
+ export declare const PACKAGE_VERSION = "0.3.0";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elevenlabs/react-native",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "description": "ElevenLabs React Native SDK for Conversational AI",
5
5
  "main": "./dist/lib.js",
6
6
  "module": "./dist/lib.module.js",
@@ -29,6 +29,7 @@ export interface Conversation {
29
29
  sendContextualUpdate: (text: string) => void;
30
30
  sendUserMessage: (text: string) => void;
31
31
  sendUserActivity: () => void;
32
+ setMicMuted: (muted: boolean) => void;
32
33
  }
33
34
 
34
35
  interface ElevenLabsContextType {
@@ -120,6 +121,7 @@ export const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children
120
121
  overrides,
121
122
  customLlmExtraBody,
122
123
  dynamicVariables,
124
+ userId,
123
125
  } = useConversationSession(callbacksRef, setStatus, setConnect, setToken, setConversationId, tokenFetchUrl);
124
126
 
125
127
  const {
@@ -187,6 +189,12 @@ export const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children
187
189
 
188
190
  const getId = () => conversationId;
189
191
 
192
+ const setMicMuted = React.useCallback((muted: boolean) => {
193
+ if (localParticipant) {
194
+ localParticipant.setMicrophoneEnabled(!muted);
195
+ }
196
+ }, [localParticipant]);
197
+
190
198
  // Update current event ID for feedback tracking
191
199
  const updateCurrentEventId = React.useCallback((eventId: number) => {
192
200
  currentEventIdRef.current = eventId;
@@ -202,10 +210,11 @@ export const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children
202
210
  overrides,
203
211
  customLlmExtraBody,
204
212
  dynamicVariables,
213
+ userId,
205
214
  });
206
215
  sendMessage(overridesEvent);
207
216
  }
208
- }, [handleParticipantReady, localParticipant, overrides, customLlmExtraBody, dynamicVariables, sendMessage]);
217
+ }, [handleParticipantReady, localParticipant, overrides, customLlmExtraBody, dynamicVariables, userId, sendMessage]);
209
218
 
210
219
  const conversation: Conversation = {
211
220
  startSession,
@@ -215,6 +224,7 @@ export const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children
215
224
  // setVolume,
216
225
  canSendFeedback,
217
226
  getId,
227
+ setMicMuted,
218
228
  sendFeedback,
219
229
  sendContextualUpdate: (text: string) => {
220
230
  sendMessage({
@@ -25,6 +25,7 @@ export const useConversationSession = (
25
25
  const [dynamicVariables, setDynamicVariables] = useState<
26
26
  ConversationConfig["dynamicVariables"]
27
27
  >({});
28
+ const [userId, setUserId] = useState<ConversationConfig["userId"]>(undefined);
28
29
 
29
30
  const startSession = useCallback(
30
31
  async (config: ConversationConfig) => {
@@ -35,6 +36,7 @@ export const useConversationSession = (
35
36
  setOverrides(config.overrides || {});
36
37
  setCustomLlmExtraBody(config.customLlmExtraBody || null);
37
38
  setDynamicVariables(config.dynamicVariables || {});
39
+ setUserId(config.userId);
38
40
 
39
41
  let conversationToken: string;
40
42
 
@@ -97,5 +99,6 @@ export const useConversationSession = (
97
99
  overrides,
98
100
  customLlmExtraBody,
99
101
  dynamicVariables,
102
+ userId,
100
103
  };
101
104
  };
@@ -37,7 +37,7 @@ export function constructOverrides(
37
37
  }
38
38
 
39
39
  if (config.userId) {
40
- overridesEvent.user_id = config.userId;
40
+ overridesEvent.user_id = String(config.userId);
41
41
  }
42
42
 
43
43
  return overridesEvent;
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  // This file is auto-generated during build
2
- export const PACKAGE_VERSION = "0.2.1";
2
+ export const PACKAGE_VERSION = "0.3.0";