@elevenlabs/react-native 0.5.9 → 0.5.11
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/.turbo/turbo-build.log +4 -4
- package/.turbo/turbo-check-types.log +1 -1
- package/.turbo/turbo-generate-version.log +1 -1
- package/.turbo/turbo-lint$colon$es.log +2 -2
- package/.turbo/turbo-lint$colon$prettier.log +1 -1
- package/CHANGELOG.md +13 -0
- package/README.md +3 -3
- package/dist/lib.js +1 -1
- package/dist/lib.js.map +1 -1
- package/dist/lib.modern.js +1 -1
- package/dist/lib.modern.js.map +1 -1
- package/dist/lib.module.js +1 -1
- package/dist/lib.module.js.map +1 -1
- package/dist/lib.umd.js +1 -1
- package/dist/lib.umd.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/package.json +2 -2
- package/src/components/LiveKitRoomWrapper.tsx +2 -1
- package/src/version.ts +1 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
|
|
2
|
-
> @elevenlabs/react-native@0.5.
|
|
2
|
+
> @elevenlabs/react-native@0.5.11 build /home/runner/work/packages/packages/packages/react-native
|
|
3
3
|
> BROWSERSLIST_ENV=modern node --run bundle
|
|
4
4
|
|
|
5
5
|
No name was provided for external module '@livekit/react-native' in output.globals – guessing 'reactNative'
|
|
6
6
|
Build "@elevenlabs/react-native" to dist:
|
|
7
7
|
5.09 kB: lib.js.gz
|
|
8
|
-
4.
|
|
8
|
+
4.52 kB: lib.js.br
|
|
9
9
|
4.64 kB: lib.modern.js.gz
|
|
10
|
-
4.
|
|
11
|
-
5.
|
|
10
|
+
4.13 kB: lib.modern.js.br
|
|
11
|
+
5.06 kB: lib.module.js.gz
|
|
12
12
|
4.51 kB: lib.module.js.br
|
|
13
13
|
5.15 kB: lib.umd.js.gz
|
|
14
14
|
4.59 kB: lib.umd.js.br
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
|
|
2
|
-
> @elevenlabs/react-native@0.5.
|
|
2
|
+
> @elevenlabs/react-native@0.5.11 generate-version /home/runner/work/packages/packages/packages/react-native
|
|
3
3
|
> printf "// This file is auto-generated during build\nexport const PACKAGE_VERSION = \"%s\";\n" "$npm_package_version" > src/version.ts
|
|
4
4
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
|
|
2
|
-
> @elevenlabs/react-native@0.5.
|
|
2
|
+
> @elevenlabs/react-native@0.5.11 lint:es /home/runner/work/packages/packages/packages/react-native
|
|
3
3
|
> pnpm exec eslint .
|
|
4
4
|
|
|
5
|
-
(node:
|
|
5
|
+
(node:3168) ESLintEmptyConfigWarning: Running ESLint with an empty config (from /home/runner/work/packages/packages/packages/react-native/eslint.config.cjs). Please double-check that this is what you want. If you want to run ESLint with an empty config, export [{}] to remove this warning.
|
|
6
6
|
(Use `node --trace-warnings ...` to show where the warning was created)
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @elevenlabs/react-native@0.5.
|
|
2
|
+
> @elevenlabs/react-native@0.5.11 lint:prettier /home/runner/work/packages/packages/packages/react-native
|
|
3
3
|
> prettier 'src/**/*.ts' --check
|
|
4
4
|
|
|
5
5
|
Checking formatting...
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @elevenlabs/react-native
|
|
2
2
|
|
|
3
|
+
## 0.5.11
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [3a2d602]
|
|
8
|
+
- @elevenlabs/types@0.6.0
|
|
9
|
+
|
|
10
|
+
## 0.5.10
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- 3a8cc56: Fix establishing text-only conversations. Note: This change also regresses a bug-fix where access to audio input is requested, even for text-only conversations.
|
|
15
|
+
|
|
3
16
|
## 0.5.9
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|

|
|
2
2
|
|
|
3
|
-
#
|
|
3
|
+
# ElevenAgents React Native SDK
|
|
4
4
|
|
|
5
|
-
Build multimodal agents with
|
|
5
|
+
Build multimodal agents with [ElevenAgents](https://elevenlabs.io/docs/eleven-agents/overview).
|
|
6
6
|
|
|
7
|
-
An SDK library for using
|
|
7
|
+
An SDK library for using ElevenAgents. If you're looking for a Node.js library for other audio APIs, please refer to the [ElevenLabs Node.js Library](https://www.npmjs.com/package/@elevenlabs/elevenlabs-js).
|
|
8
8
|
|
|
9
9
|
## Features
|
|
10
10
|
|
package/dist/lib.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var e=require("react"),n=require("@livekit/react-native"),t=require("livekit-client");function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=/*#__PURE__*/r(e);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 s="0.5.9",c=function(r){var a=r.onReady,s=r.isConnected,c=r.callbacks,i=r.sendMessage,l=r.clientTools,u=void 0===l?{}:l,d=r.updateCurrentEventId,v=r.onEndSession,f=n.useLocalParticipant().localParticipant,g=n.useRoomContext(),_=o.default.useRef(1),p=o.default.useRef(v);p.current=v;var b=o.default.useRef(a);b.current=a;var m=o.default.useRef(c);return m.current=c,e.useEffect(function(){var e=function(e){var n;null!=(n=e.identity)&&n.startsWith("agent")&&p.current("agent")};return g.on(t.RoomEvent.ParticipantDisconnected,e),function(){g.off(t.RoomEvent.ParticipantDisconnected,e)}},[g]),e.useEffect(function(){s||(_.current=1)},[s]),e.useEffect(function(){s&&f&&b.current(f)},[s,f]),n.useDataChannel(function(e){var n,t=new TextDecoder,r=JSON.parse(t.decode(e.payload));if("object"==typeof(o=r)&&null!==o&&"type"in o){var o,a,s=function(e){switch(e.type){case"user_transcript":return e.user_transcription_event.user_transcript;case"agent_response":return e.agent_response_event.agent_response;default:return null}}(r);if(null!==s&&(null==m.current.onMessage||m.current.onMessage({message:s,source:"user_transcript"===r.type?"user":"ai",role:"user_transcript"===r.type?"user":"agent"})),null!=(n=e.from)&&n.isAgent&&(null==m.current.onModeChange||m.current.onModeChange({mode:null!=(a=e.from)&&a.isSpeaking?"speaking":"listening"}),"agent_response"===r.type&&d)){var c=_.current++;d(c)}switch(r.type){case"ping":i({type:"pong",event_id:r.ping_event.event_id});break;case"client_tool_call":!function(e){try{return Promise.resolve(function(){if(e.client_tool_call.tool_name in u){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);i({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==m.current.onError||m.current.onError("Client tool execution failed with following error: "+(null==n?void 0:n.message),{clientToolName:e.client_tool_call.tool_name}),i({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(m.current.onUnhandledClientToolCall)return void m.current.onUnhandledClientToolCall(e.client_tool_call);var t="Client tool with name "+e.client_tool_call.tool_name+" is not defined on client";null==m.current.onError||m.current.onError(t,{clientToolName:e.client_tool_call.tool_name}),i({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)}}(r);break;case"audio":var l=r.audio_event;l.audio_base_64&&(null==m.current.onAudio||m.current.onAudio(l.audio_base_64)),l.alignment&&(null==m.current.onAudioAlignment||m.current.onAudioAlignment(l.alignment));break;case"vad_score":null==m.current.onVadScore||m.current.onVadScore({vadScore:r.vad_score_event.vad_score});break;case"interruption":null==m.current.onInterruption||m.current.onInterruption(r.interruption_event);break;case"mcp_tool_call":null==m.current.onMCPToolCall||m.current.onMCPToolCall(r.mcp_tool_call);break;case"mcp_connection_status":null==m.current.onMCPConnectionStatus||m.current.onMCPConnectionStatus(r.mcp_connection_status);break;case"agent_tool_request":null==m.current.onAgentToolRequest||m.current.onAgentToolRequest(r.agent_tool_request);break;case"agent_tool_response":null==m.current.onAgentToolResponse||m.current.onAgentToolResponse(r.agent_tool_response),"end_call"===r.agent_tool_response.tool_name&&p.current("agent");break;case"conversation_initiation_metadata":null==m.current.onConversationMetadata||m.current.onConversationMetadata(r.conversation_initiation_metadata_event);break;case"asr_initiation_metadata":null==m.current.onAsrInitiationMetadata||m.current.onAsrInitiationMetadata(r.asr_initiation_metadata_event);break;case"agent_chat_response_part":null==m.current.onAgentChatResponsePart||m.current.onAgentChatResponsePart(r.text_response_part);break;default:null==m.current.onDebug||m.current.onDebug(r)}}else null==m.current.onDebug||m.current.onDebug({type:"invalid_event",message:r})}),null},i=function(e){var t=e.children,r=e.serverUrl,a=e.token,s=e.connect,i=e.onConnected,l=e.onDisconnected,u=e.onError,d=e.roomConnected,v=e.callbacks,f=e.onParticipantReady,g=e.sendMessage,_=e.clientTools,p=e.updateCurrentEventId,b=e.onEndSession,m=e.audioSessionConfig,C=e.textOnly,h=void 0!==C&&C,k=o.default.useMemo(function(){return!h&&(null==m||!m.allowMixingWithOthers||{audio:{noiseSuppression:!0,echoCancellation:!0},audioSessionConfiguration:{allowMixingWithOthers:!0}})},[m,h]);/*#__PURE__*/return o.default.createElement(n.LiveKitRoom,{serverUrl:r,token:a,connect:s,audio:k,video:!1,options:{adaptiveStream:{pixelDensity:"screen"}},onConnected:i,onDisconnected:l,onError:u},/*#__PURE__*/o.default.createElement(c,{onReady:f,isConnected:d,callbacks:v,sendMessage:g,clientTools:_,updateCurrentEventId:p,onEndSession:b}),t)},l=["serverUrl","tokenFetchUrl","clientTools"],u=/*#__PURE__*/e.createContext(null);exports.ElevenLabsProvider=function(t){var r=t.children,c=t.audioSessionConfig;n.registerGlobals();var l=e.useState(""),d=l[0],v=l[1],f=e.useState(!1),g=f[0],_=f[1],p=e.useState("disconnected"),b=p[0],m=p[1],C=e.useState("wss://livekit.rtc.elevenlabs.io"),h=C[0],k=C[1],y=e.useState(void 0),S=y[0],E=y[1],x=e.useState(""),M=x[0],P=x[1],w=e.useState(!1),R=w[0],T=w[1],U=e.useState(!1),A=U[0],I=U[1],F=o.default.useRef(1),O=o.default.useRef(1),D=o.default.useRef({}),j=function(){var n=e.useRef({}),t=e.useCallback(function(e){n.current=e},[]);return{callbacksRef:n,setCallbacks:t}}(),L=j.callbacksRef,N=j.setCallbacks,V=o.default.useCallback(function(e){var n=a({},e,{onModeChange:function(n){T("speaking"===n.mode),null==e.onModeChange||e.onModeChange(n)}});N(n)},[N]),q=function(n,t,r,o,c,i){var l=e.useState({}),u=l[0],d=l[1],v=e.useState(null),f=v[0],g=v[1],_=e.useState({}),p=_[0],b=_[1],m=e.useState(void 0),C=m[0],h=m[1],k=e.useState(!1),y=k[0],S=k[1],E=e.useCallback(function(e){try{return Promise.resolve(function(l,u){try{var v=function(){var l;function u(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"),""}}(v);c(n),o(v),r(!0)}t("connecting"),null==n.current.onStatusChange||n.current.onStatusChange({status:"connecting"});var v,f=function(e){var n,t,r=(null!=(n=null==(t=e.overrides)?void 0:t.conversation)?n:{}).textOnly,o=e.textOnly;return"boolean"==typeof o?("boolean"==typeof r&&o!==r&&console.warn("Conflicting textOnly options provided: "+o+" via options.textOnly (will be used) and "+r+" via options.overrides.conversation.textOnly (will be ignored)"),o):"boolean"==typeof r?r:void 0}(e);d(a({},e.overrides,{conversation:a({},null==(l=e.overrides)?void 0:l.conversation,{textOnly:f})})),g(e.customLlmExtraBody||null),b(e.dynamicVariables||{}),h(e.userId),S(f);var _=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(function(t,r){try{var o=Promise.resolve(fetch((n||"https://api.elevenlabs.io/v1/convai/conversation/token")+"?agent_id="+e+"&source=react_native_sdk&version="+s)).then(function(e){return Promise.resolve(e.json()).then(function(n){if(!e.ok){if("object"==typeof n.detail&&null!==n.detail&&"string"==typeof n.detail.message)throw new Error(n.detail.message);throw new Error("Missing error details or message")}if(!n.token)throw new Error("No conversation token received from API");return n.token})})}catch(e){return r(e)}return o&&o.then?o.then(void 0,r):o}(0,function(e){throw new Error("Failed to get conversation token: "+(e instanceof Error?e.message:"No message"))}))}catch(e){return Promise.reject(e)}}(e.agentId,e.tokenFetchUrl||i)).then(function(e){v=e});throw new Error("Either conversationToken or agentId is required")}();v=e.conversationToken}();return _&&_.then?_.then(u):u()}()}catch(e){return u(e)}return v&&v.then?v.then(void 0,u):v}(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,c,S,i]);return{startSession:E,endSession:e.useCallback(function(e){void 0===e&&(e="user");try{try{r(!1),o(""),t("disconnected"),d({}),g(null),b({}),h(void 0),c(""),null==n.current.onStatusChange||n.current.onStatusChange({status:"disconnected"}),null==n.current.onDisconnect||n.current.onDisconnect({reason:e})}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,c]),overrides:u,customLlmExtraBody:f,dynamicVariables:p,userId:C,textOnly:y}}(L,m,_,v,P,S),B=q.startSession,J=q.endSession,W=q.overrides,K=q.customLlmExtraBody,G=q.dynamicVariables,z=q.userId,Z=q.textOnly,H=function(t,r,o,a,s){void 0===s&&(s=!1);var c=e.useState(!1),i=c[0],l=c[1],u=e.useState(null),d=u[0],v=u[1],f=e.useRef(!1),g=e.useRef(!1);e.useEffect(function(){o&&(l(!1),v(null),f.current=!1)},[o]),e.useEffect(function(){var e=!s&&!!o;return e&&!g.current?(g.current=!0,n.AudioSession.startAudioSession()):!e&&g.current&&(g.current=!1,n.AudioSession.stopAudioSession()),function(){g.current&&(g.current=!1,n.AudioSession.stopAudioSession())}},[s,o]),e.useEffect(function(){d&&i&&!f.current&&(f.current=!0,null==t.current.onConnect||t.current.onConnect({conversationId:o}))},[d,i,o,t]);var _=e.useCallback(function(e){d||(v(e),r("connected"))},[d,r]),p=e.useCallback(function(){l(!0)},[]),b=e.useCallback(function(){"disconnected"!==a&&(l(!1),r("disconnected"),v(null),f.current=!1,null==t.current.onDisconnect||t.current.onDisconnect({reason:"user"}))},[t,r,a]),m=e.useCallback(function(e){console.error("LiveKit error:",e),null==t.current.onError||t.current.onError(e.message,void 0)},[t]);return{roomConnected:i,localParticipant:d,handleParticipantReady:_,handleConnected:p,handleDisconnected:b,handleError:m}}(L,m,M,b,Z),Q=H.roomConnected,X=H.localParticipant,Y=H.handleParticipantReady,$=H.handleConnected,ee=H.handleDisconnected,ne=H.handleError,te=o.default.useCallback(function(){F.current=1,O.current=1,I(!1),null==L.current.onCanSendFeedbackChange||L.current.onCanSendFeedbackChange({canSendFeedback:!1}),$()},[$,L]),re=o.default.useCallback(function(){I(!1),T(!1),ee()},[ee]),oe=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])}}(b,X,L),ae=oe.sendMessage,se=o.default.useCallback(function(){var e=F.current!==O.current;A!==e&&(I(e),null==L.current.onCanSendFeedbackChange||L.current.onCanSendFeedbackChange({canSendFeedback:e}))},[A,L]),ce=o.default.useCallback(function(e){A?(ae({type:"feedback",score:e?"like":"dislike",event_id:F.current}),O.current=F.current,se()):console.warn(0===O.current?"Cannot send feedback: the conversation has not started yet.":"Cannot send feedback: feedback has already been sent for the current response.")},[A,ae,se]);o.default.useCallback(function(e){console.warn("setVolume is not yet implemented in React Native SDK")},[]);var ie=o.default.useCallback(function(){return M},[M]),le=o.default.useCallback(function(e){X&&X.setMicrophoneEnabled(!e)},[X]),ue=o.default.useCallback(function(e){F.current=e,se()},[se]),de=o.default.useCallback(function(e){Y(e);var n=function(e){var n,t,r,o,a,c,i,l,u,d={type:"conversation_initiation_client_data"};return e.overrides&&(d.conversation_config_override={agent:{prompt:null==(t=e.overrides.agent)?void 0:t.prompt,first_message:null==(r=e.overrides.agent)?void 0:r.firstMessage,language:null==(o=e.overrides.agent)?void 0:o.language},tts:{voice_id:null==(a=e.overrides.tts)?void 0:a.voiceId,speed:null==(c=e.overrides.tts)?void 0:c.speed,stability:null==(i=e.overrides.tts)?void 0:i.stability,similarity_boost:null==(l=e.overrides.tts)?void 0:l.similarityBoost},conversation:{text_only:null==(u=e.overrides.conversation)?void 0:u.textOnly}}),d.source_info={source:"react_native_sdk",version:(null==(n=e.overrides)||null==(n=n.client)?void 0:n.version)||s},e.customLlmExtraBody&&(d.custom_llm_extra_body=e.customLlmExtraBody),e.dynamicVariables&&(d.dynamic_variables=e.dynamicVariables),e.userId&&(d.user_id=String(e.userId)),d}({overrides:W,customLlmExtraBody:K,dynamicVariables:G,userId:z});if(n)try{var t=(new TextEncoder).encode(JSON.stringify(n));e.publishData(t,{reliable:!0})}catch(e){console.error("Failed to send overrides:",e),null==L.current.onError||L.current.onError(e)}},[Y,W,K,G,z,L]),ve=o.default.useCallback(function(e){D.current=e},[]),fe=o.default.useCallback(function(e){ae({type:"contextual_update",text:e})},[ae]),ge=o.default.useCallback(function(e){ae({type:"user_message",text:e})},[ae]),_e=o.default.useCallback(function(){ae({type:"user_activity"})},[ae]),pe=o.default.useRef({startSession:B,endSession:J,status:b,isSpeaking:R,canSendFeedback:A,getId:ie,setMicMuted:le,sendFeedback:ce,sendContextualUpdate:fe,sendUserMessage:ge,sendUserActivity:_e});pe.current={startSession:B,endSession:J,status:b,isSpeaking:R,canSendFeedback:A,getId:ie,setMicMuted:le,sendFeedback:ce,sendContextualUpdate:fe,sendUserMessage:ge,sendUserActivity:_e};var be=o.default.useMemo(function(){return{get startSession(){return pe.current.startSession},get endSession(){return pe.current.endSession},get status(){return pe.current.status},get isSpeaking(){return pe.current.isSpeaking},get canSendFeedback(){return pe.current.canSendFeedback},get getId(){return pe.current.getId},get setMicMuted(){return pe.current.setMicMuted},get sendFeedback(){return pe.current.sendFeedback},get sendContextualUpdate(){return pe.current.sendContextualUpdate},get sendUserMessage(){return pe.current.sendUserMessage},get sendUserActivity(){return pe.current.sendUserActivity}}},[]),me=o.default.useMemo(function(){return{conversation:be,callbacksRef:L,serverUrl:h,tokenFetchUrl:S,clientTools:D.current,setCallbacks:V,setServerUrl:k,setTokenFetchUrl:E,setClientTools:ve}},[be,L,h,S,V,ve]);/*#__PURE__*/return o.default.createElement(u.Provider,{value:me},/*#__PURE__*/o.default.createElement(i,{serverUrl:h,token:d,connect:g,onConnected:te,onDisconnected:re,onError:ne,roomConnected:Q,callbacks:L.current,onParticipantReady:de,sendMessage:ae,clientTools:D.current,updateCurrentEventId:ue,onEndSession:J,audioSessionConfig:c,textOnly:Z},r))},exports.useConversation=function(n){void 0===n&&(n={});var t=e.useContext(u);if(!t)throw new Error("useConversation must be used within ElevenLabsProvider");var r=n.serverUrl,a=n.tokenFetchUrl,s=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,l);return o.default.useEffect(function(){r&&t.setServerUrl(r)},[t,r]),o.default.useEffect(function(){a&&t.setTokenFetchUrl(a)},[t,a]),o.default.useEffect(function(){s&&t.setClientTools(s)},[t,s]),t.setCallbacks(c),t.conversation};
|
|
1
|
+
var e=require("react"),n=require("@livekit/react-native"),t=require("livekit-client");function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var o=/*#__PURE__*/r(e);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 s="0.5.11",c=function(r){var a=r.onReady,s=r.isConnected,c=r.callbacks,i=r.sendMessage,l=r.clientTools,u=void 0===l?{}:l,d=r.updateCurrentEventId,v=r.onEndSession,f=n.useLocalParticipant().localParticipant,g=n.useRoomContext(),_=o.default.useRef(1),p=o.default.useRef(v);p.current=v;var b=o.default.useRef(a);b.current=a;var m=o.default.useRef(c);return m.current=c,e.useEffect(function(){var e=function(e){var n;null!=(n=e.identity)&&n.startsWith("agent")&&p.current("agent")};return g.on(t.RoomEvent.ParticipantDisconnected,e),function(){g.off(t.RoomEvent.ParticipantDisconnected,e)}},[g]),e.useEffect(function(){s||(_.current=1)},[s]),e.useEffect(function(){s&&f&&b.current(f)},[s,f]),n.useDataChannel(function(e){var n,t=new TextDecoder,r=JSON.parse(t.decode(e.payload));if("object"==typeof(o=r)&&null!==o&&"type"in o){var o,a,s=function(e){switch(e.type){case"user_transcript":return e.user_transcription_event.user_transcript;case"agent_response":return e.agent_response_event.agent_response;default:return null}}(r);if(null!==s&&(null==m.current.onMessage||m.current.onMessage({message:s,source:"user_transcript"===r.type?"user":"ai",role:"user_transcript"===r.type?"user":"agent"})),null!=(n=e.from)&&n.isAgent&&(null==m.current.onModeChange||m.current.onModeChange({mode:null!=(a=e.from)&&a.isSpeaking?"speaking":"listening"}),"agent_response"===r.type&&d)){var c=_.current++;d(c)}switch(r.type){case"ping":i({type:"pong",event_id:r.ping_event.event_id});break;case"client_tool_call":!function(e){try{return Promise.resolve(function(){if(e.client_tool_call.tool_name in u){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);i({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==m.current.onError||m.current.onError("Client tool execution failed with following error: "+(null==n?void 0:n.message),{clientToolName:e.client_tool_call.tool_name}),i({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(m.current.onUnhandledClientToolCall)return void m.current.onUnhandledClientToolCall(e.client_tool_call);var t="Client tool with name "+e.client_tool_call.tool_name+" is not defined on client";null==m.current.onError||m.current.onError(t,{clientToolName:e.client_tool_call.tool_name}),i({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)}}(r);break;case"audio":var l=r.audio_event;l.audio_base_64&&(null==m.current.onAudio||m.current.onAudio(l.audio_base_64)),l.alignment&&(null==m.current.onAudioAlignment||m.current.onAudioAlignment(l.alignment));break;case"vad_score":null==m.current.onVadScore||m.current.onVadScore({vadScore:r.vad_score_event.vad_score});break;case"interruption":null==m.current.onInterruption||m.current.onInterruption(r.interruption_event);break;case"mcp_tool_call":null==m.current.onMCPToolCall||m.current.onMCPToolCall(r.mcp_tool_call);break;case"mcp_connection_status":null==m.current.onMCPConnectionStatus||m.current.onMCPConnectionStatus(r.mcp_connection_status);break;case"agent_tool_request":null==m.current.onAgentToolRequest||m.current.onAgentToolRequest(r.agent_tool_request);break;case"agent_tool_response":null==m.current.onAgentToolResponse||m.current.onAgentToolResponse(r.agent_tool_response),"end_call"===r.agent_tool_response.tool_name&&p.current("agent");break;case"conversation_initiation_metadata":null==m.current.onConversationMetadata||m.current.onConversationMetadata(r.conversation_initiation_metadata_event);break;case"asr_initiation_metadata":null==m.current.onAsrInitiationMetadata||m.current.onAsrInitiationMetadata(r.asr_initiation_metadata_event);break;case"agent_chat_response_part":null==m.current.onAgentChatResponsePart||m.current.onAgentChatResponsePart(r.text_response_part);break;default:null==m.current.onDebug||m.current.onDebug(r)}}else null==m.current.onDebug||m.current.onDebug({type:"invalid_event",message:r})}),null},i=function(e){var t=e.children,r=e.serverUrl,a=e.token,s=e.connect,i=e.onConnected,l=e.onDisconnected,u=e.onError,d=e.roomConnected,v=e.callbacks,f=e.onParticipantReady,g=e.sendMessage,_=e.clientTools,p=e.updateCurrentEventId,b=e.onEndSession,m=e.audioSessionConfig,C=e.textOnly,h=void 0!==C&&C,k=o.default.useMemo(function(){return!!h||null==m||!m.allowMixingWithOthers||{audio:{noiseSuppression:!0,echoCancellation:!0},audioSessionConfiguration:{allowMixingWithOthers:!0}}},[m,h]);/*#__PURE__*/return o.default.createElement(n.LiveKitRoom,{serverUrl:r,token:a,connect:s,audio:k,video:!1,options:{adaptiveStream:{pixelDensity:"screen"}},onConnected:i,onDisconnected:l,onError:u},/*#__PURE__*/o.default.createElement(c,{onReady:f,isConnected:d,callbacks:v,sendMessage:g,clientTools:_,updateCurrentEventId:p,onEndSession:b}),t)},l=["serverUrl","tokenFetchUrl","clientTools"],u=/*#__PURE__*/e.createContext(null);exports.ElevenLabsProvider=function(t){var r=t.children,c=t.audioSessionConfig;n.registerGlobals();var l=e.useState(""),d=l[0],v=l[1],f=e.useState(!1),g=f[0],_=f[1],p=e.useState("disconnected"),b=p[0],m=p[1],C=e.useState("wss://livekit.rtc.elevenlabs.io"),h=C[0],k=C[1],y=e.useState(void 0),S=y[0],E=y[1],x=e.useState(""),M=x[0],P=x[1],w=e.useState(!1),R=w[0],T=w[1],U=e.useState(!1),A=U[0],I=U[1],F=o.default.useRef(1),O=o.default.useRef(1),D=o.default.useRef({}),j=function(){var n=e.useRef({}),t=e.useCallback(function(e){n.current=e},[]);return{callbacksRef:n,setCallbacks:t}}(),L=j.callbacksRef,N=j.setCallbacks,V=o.default.useCallback(function(e){var n=a({},e,{onModeChange:function(n){T("speaking"===n.mode),null==e.onModeChange||e.onModeChange(n)}});N(n)},[N]),q=function(n,t,r,o,c,i){var l=e.useState({}),u=l[0],d=l[1],v=e.useState(null),f=v[0],g=v[1],_=e.useState({}),p=_[0],b=_[1],m=e.useState(void 0),C=m[0],h=m[1],k=e.useState(!1),y=k[0],S=k[1],E=e.useCallback(function(e){try{return Promise.resolve(function(l,u){try{var v=function(){var l;function u(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"),""}}(v);c(n),o(v),r(!0)}t("connecting"),null==n.current.onStatusChange||n.current.onStatusChange({status:"connecting"});var v,f=function(e){var n,t,r=(null!=(n=null==(t=e.overrides)?void 0:t.conversation)?n:{}).textOnly,o=e.textOnly;return"boolean"==typeof o?("boolean"==typeof r&&o!==r&&console.warn("Conflicting textOnly options provided: "+o+" via options.textOnly (will be used) and "+r+" via options.overrides.conversation.textOnly (will be ignored)"),o):"boolean"==typeof r?r:void 0}(e);d(a({},e.overrides,{conversation:a({},null==(l=e.overrides)?void 0:l.conversation,{textOnly:f})})),g(e.customLlmExtraBody||null),b(e.dynamicVariables||{}),h(e.userId),S(f);var _=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(function(t,r){try{var o=Promise.resolve(fetch((n||"https://api.elevenlabs.io/v1/convai/conversation/token")+"?agent_id="+e+"&source=react_native_sdk&version="+s)).then(function(e){return Promise.resolve(e.json()).then(function(n){if(!e.ok){if("object"==typeof n.detail&&null!==n.detail&&"string"==typeof n.detail.message)throw new Error(n.detail.message);throw new Error("Missing error details or message")}if(!n.token)throw new Error("No conversation token received from API");return n.token})})}catch(e){return r(e)}return o&&o.then?o.then(void 0,r):o}(0,function(e){throw new Error("Failed to get conversation token: "+(e instanceof Error?e.message:"No message"))}))}catch(e){return Promise.reject(e)}}(e.agentId,e.tokenFetchUrl||i)).then(function(e){v=e});throw new Error("Either conversationToken or agentId is required")}();v=e.conversationToken}();return _&&_.then?_.then(u):u()}()}catch(e){return u(e)}return v&&v.then?v.then(void 0,u):v}(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,c,S,i]);return{startSession:E,endSession:e.useCallback(function(e){void 0===e&&(e="user");try{try{r(!1),o(""),t("disconnected"),d({}),g(null),b({}),h(void 0),c(""),null==n.current.onStatusChange||n.current.onStatusChange({status:"disconnected"}),null==n.current.onDisconnect||n.current.onDisconnect({reason:e})}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,c]),overrides:u,customLlmExtraBody:f,dynamicVariables:p,userId:C,textOnly:y}}(L,m,_,v,P,S),B=q.startSession,J=q.endSession,W=q.overrides,K=q.customLlmExtraBody,G=q.dynamicVariables,z=q.userId,Z=q.textOnly,H=function(t,r,o,a,s){void 0===s&&(s=!1);var c=e.useState(!1),i=c[0],l=c[1],u=e.useState(null),d=u[0],v=u[1],f=e.useRef(!1),g=e.useRef(!1);e.useEffect(function(){o&&(l(!1),v(null),f.current=!1)},[o]),e.useEffect(function(){var e=!s&&!!o;return e&&!g.current?(g.current=!0,n.AudioSession.startAudioSession()):!e&&g.current&&(g.current=!1,n.AudioSession.stopAudioSession()),function(){g.current&&(g.current=!1,n.AudioSession.stopAudioSession())}},[s,o]),e.useEffect(function(){d&&i&&!f.current&&(f.current=!0,null==t.current.onConnect||t.current.onConnect({conversationId:o}))},[d,i,o,t]);var _=e.useCallback(function(e){d||(v(e),r("connected"))},[d,r]),p=e.useCallback(function(){l(!0)},[]),b=e.useCallback(function(){"disconnected"!==a&&(l(!1),r("disconnected"),v(null),f.current=!1,null==t.current.onDisconnect||t.current.onDisconnect({reason:"user"}))},[t,r,a]),m=e.useCallback(function(e){console.error("LiveKit error:",e),null==t.current.onError||t.current.onError(e.message,void 0)},[t]);return{roomConnected:i,localParticipant:d,handleParticipantReady:_,handleConnected:p,handleDisconnected:b,handleError:m}}(L,m,M,b,Z),Q=H.roomConnected,X=H.localParticipant,Y=H.handleParticipantReady,$=H.handleConnected,ee=H.handleDisconnected,ne=H.handleError,te=o.default.useCallback(function(){F.current=1,O.current=1,I(!1),null==L.current.onCanSendFeedbackChange||L.current.onCanSendFeedbackChange({canSendFeedback:!1}),$()},[$,L]),re=o.default.useCallback(function(){I(!1),T(!1),ee()},[ee]),oe=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])}}(b,X,L),ae=oe.sendMessage,se=o.default.useCallback(function(){var e=F.current!==O.current;A!==e&&(I(e),null==L.current.onCanSendFeedbackChange||L.current.onCanSendFeedbackChange({canSendFeedback:e}))},[A,L]),ce=o.default.useCallback(function(e){A?(ae({type:"feedback",score:e?"like":"dislike",event_id:F.current}),O.current=F.current,se()):console.warn(0===O.current?"Cannot send feedback: the conversation has not started yet.":"Cannot send feedback: feedback has already been sent for the current response.")},[A,ae,se]);o.default.useCallback(function(e){console.warn("setVolume is not yet implemented in React Native SDK")},[]);var ie=o.default.useCallback(function(){return M},[M]),le=o.default.useCallback(function(e){X&&X.setMicrophoneEnabled(!e)},[X]),ue=o.default.useCallback(function(e){F.current=e,se()},[se]),de=o.default.useCallback(function(e){Y(e);var n=function(e){var n,t,r,o,a,c,i,l,u,d={type:"conversation_initiation_client_data"};return e.overrides&&(d.conversation_config_override={agent:{prompt:null==(t=e.overrides.agent)?void 0:t.prompt,first_message:null==(r=e.overrides.agent)?void 0:r.firstMessage,language:null==(o=e.overrides.agent)?void 0:o.language},tts:{voice_id:null==(a=e.overrides.tts)?void 0:a.voiceId,speed:null==(c=e.overrides.tts)?void 0:c.speed,stability:null==(i=e.overrides.tts)?void 0:i.stability,similarity_boost:null==(l=e.overrides.tts)?void 0:l.similarityBoost},conversation:{text_only:null==(u=e.overrides.conversation)?void 0:u.textOnly}}),d.source_info={source:"react_native_sdk",version:(null==(n=e.overrides)||null==(n=n.client)?void 0:n.version)||s},e.customLlmExtraBody&&(d.custom_llm_extra_body=e.customLlmExtraBody),e.dynamicVariables&&(d.dynamic_variables=e.dynamicVariables),e.userId&&(d.user_id=String(e.userId)),d}({overrides:W,customLlmExtraBody:K,dynamicVariables:G,userId:z});if(n)try{var t=(new TextEncoder).encode(JSON.stringify(n));e.publishData(t,{reliable:!0})}catch(e){console.error("Failed to send overrides:",e),null==L.current.onError||L.current.onError(e)}},[Y,W,K,G,z,L]),ve=o.default.useCallback(function(e){D.current=e},[]),fe=o.default.useCallback(function(e){ae({type:"contextual_update",text:e})},[ae]),ge=o.default.useCallback(function(e){ae({type:"user_message",text:e})},[ae]),_e=o.default.useCallback(function(){ae({type:"user_activity"})},[ae]),pe=o.default.useRef({startSession:B,endSession:J,status:b,isSpeaking:R,canSendFeedback:A,getId:ie,setMicMuted:le,sendFeedback:ce,sendContextualUpdate:fe,sendUserMessage:ge,sendUserActivity:_e});pe.current={startSession:B,endSession:J,status:b,isSpeaking:R,canSendFeedback:A,getId:ie,setMicMuted:le,sendFeedback:ce,sendContextualUpdate:fe,sendUserMessage:ge,sendUserActivity:_e};var be=o.default.useMemo(function(){return{get startSession(){return pe.current.startSession},get endSession(){return pe.current.endSession},get status(){return pe.current.status},get isSpeaking(){return pe.current.isSpeaking},get canSendFeedback(){return pe.current.canSendFeedback},get getId(){return pe.current.getId},get setMicMuted(){return pe.current.setMicMuted},get sendFeedback(){return pe.current.sendFeedback},get sendContextualUpdate(){return pe.current.sendContextualUpdate},get sendUserMessage(){return pe.current.sendUserMessage},get sendUserActivity(){return pe.current.sendUserActivity}}},[]),me=o.default.useMemo(function(){return{conversation:be,callbacksRef:L,serverUrl:h,tokenFetchUrl:S,clientTools:D.current,setCallbacks:V,setServerUrl:k,setTokenFetchUrl:E,setClientTools:ve}},[be,L,h,S,V,ve]);/*#__PURE__*/return o.default.createElement(u.Provider,{value:me},/*#__PURE__*/o.default.createElement(i,{serverUrl:h,token:d,connect:g,onConnected:te,onDisconnected:re,onError:ne,roomConnected:Q,callbacks:L.current,onParticipantReady:de,sendMessage:ae,clientTools:D.current,updateCurrentEventId:ue,onEndSession:J,audioSessionConfig:c,textOnly:Z},r))},exports.useConversation=function(n){void 0===n&&(n={});var t=e.useContext(u);if(!t)throw new Error("useConversation must be used within ElevenLabsProvider");var r=n.serverUrl,a=n.tokenFetchUrl,s=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,l);return o.default.useEffect(function(){r&&t.setServerUrl(r)},[t,r]),o.default.useEffect(function(){a&&t.setTokenFetchUrl(a)},[t,a]),o.default.useEffect(function(){s&&t.setClientTools(s)},[t,s]),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/utils/text-only.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.5.9\";\n","import { useEffect } from \"react\";\nimport { useLocalParticipant, useDataChannel, useRoomContext } from \"@livekit/react-native\";\nimport { RoomEvent } from \"livekit-client\";\nimport type { LocalParticipant, RemoteParticipant } from \"livekit-client\";\nimport type {\n Callbacks,\n ClientToolsConfig,\n ClientToolCallEvent,\n ConversationEvent,\n AudioEventWithAlignment,\n} 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 onEndSession: (reason: \"user\" | \"agent\") => void;\n clientTools?: ClientToolsConfig[\"clientTools\"];\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport function isValidEvent(event: unknown): event is ConversationEvent {\n return typeof event === \"object\" && event !== null && \"type\" in event;\n}\n\nfunction extractMessageText(event: ConversationEvent): string | null {\n switch (event.type) {\n case \"user_transcript\":\n return event.user_transcription_event.user_transcript;\n case \"agent_response\":\n return event.agent_response_event.agent_response;\n default:\n return null;\n }\n}\n\nexport const MessageHandler = ({\n onReady,\n isConnected,\n callbacks,\n sendMessage,\n clientTools = {},\n updateCurrentEventId,\n onEndSession,\n}: MessageHandlerProps) => {\n const { localParticipant } = useLocalParticipant();\n const room = useRoomContext();\n\n // Track agent response count for synthetic event IDs (WebRTC mode)\n const agentResponseCountRef = React.useRef(1);\n\n // Refs for callbacks to avoid unnecessary effect re-runs\n const onEndSessionRef = React.useRef(onEndSession);\n onEndSessionRef.current = onEndSession;\n const onReadyRef = React.useRef(onReady);\n onReadyRef.current = onReady;\n const callbacksRef = React.useRef(callbacks);\n callbacksRef.current = callbacks;\n\n // Detect agent disconnection\n useEffect(() => {\n const handleParticipantDisconnected = (participant: RemoteParticipant) => {\n if (participant.identity?.startsWith(\"agent\")) {\n onEndSessionRef.current(\"agent\");\n }\n };\n\n room.on(RoomEvent.ParticipantDisconnected, handleParticipantDisconnected);\n\n return () => {\n room.off(RoomEvent.ParticipantDisconnected, handleParticipantDisconnected);\n };\n }, [room]);\n\n // Reset agent response count when connection status changes\n useEffect(() => {\n if (!isConnected) {\n agentResponseCountRef.current = 1;\n }\n }, [isConnected]);\n\n useEffect(() => {\n if (isConnected && localParticipant) {\n onReadyRef.current(localParticipant);\n }\n }, [isConnected, localParticipant]);\n\n const handleClientToolCall = async (clientToolCall: ClientToolCallEvent) => {\n if (clientToolCall.client_tool_call.tool_name in clientTools) {\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 callbacksRef.current.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 (callbacksRef.current.onUnhandledClientToolCall) {\n callbacksRef.current.onUnhandledClientToolCall(clientToolCall.client_tool_call);\n return;\n }\n\n const errorMessage = `Client tool with name ${clientToolCall.client_tool_call.tool_name} is not defined on client`;\n callbacksRef.current.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 callbacksRef.current.onDebug?.({\n type: \"invalid_event\",\n message,\n });\n return;\n }\n\n const messageText = extractMessageText(message);\n if (messageText !== null) {\n callbacksRef.current.onMessage?.({\n message: messageText,\n source: message.type === \"user_transcript\" ? \"user\" : \"ai\",\n role: message.type === \"user_transcript\" ? \"user\" : \"agent\",\n });\n }\n\n if (msg.from?.isAgent) {\n callbacksRef.current.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 case \"audio\": {\n const audioEvent = message.audio_event as AudioEventWithAlignment;\n if (audioEvent.audio_base_64) {\n callbacksRef.current.onAudio?.(audioEvent.audio_base_64);\n }\n if (audioEvent.alignment) {\n callbacksRef.current.onAudioAlignment?.(audioEvent.alignment);\n }\n break;\n }\n case \"vad_score\":\n callbacksRef.current.onVadScore?.({\n vadScore: message.vad_score_event.vad_score,\n });\n break;\n case \"interruption\":\n callbacksRef.current.onInterruption?.(message.interruption_event);\n break;\n case \"mcp_tool_call\":\n callbacksRef.current.onMCPToolCall?.(message.mcp_tool_call);\n break;\n case \"mcp_connection_status\":\n callbacksRef.current.onMCPConnectionStatus?.(message.mcp_connection_status);\n break;\n case \"agent_tool_request\":\n callbacksRef.current.onAgentToolRequest?.(message.agent_tool_request);\n break;\n case \"agent_tool_response\":\n callbacksRef.current.onAgentToolResponse?.(message.agent_tool_response);\n\n if (message.agent_tool_response.tool_name === \"end_call\") {\n // End the call\n onEndSessionRef.current(\"agent\");\n }\n break;\n case \"conversation_initiation_metadata\":\n callbacksRef.current.onConversationMetadata?.(\n message.conversation_initiation_metadata_event\n );\n break;\n case \"asr_initiation_metadata\":\n callbacksRef.current.onAsrInitiationMetadata?.(\n message.asr_initiation_metadata_event\n );\n break;\n case \"agent_chat_response_part\":\n callbacksRef.current.onAgentChatResponsePart?.(message.text_response_part);\n break;\n default:\n callbacksRef.current.onDebug?.(message);\n break;\n }\n });\n\n return null;\n};\n","// @ts-nocheck - pnpm hoisting causes duplicate React type definitions\nimport React from 'react';\nimport { LiveKitRoom } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ClientToolsConfig, AudioSessionConfig } 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 onEndSession: (reason?: \"user\" | \"agent\") => void;\n updateCurrentEventId?: (eventId: number) => void;\n audioSessionConfig?: AudioSessionConfig;\n textOnly?: boolean;\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 onEndSession,\n audioSessionConfig,\n textOnly = false,\n}: LiveKitRoomWrapperProps) => {\n // Configure audio options based on audioSessionConfig\n const audioOptions = React.useMemo(() => {\n if (textOnly) {\n return false;\n }\n\n if (!audioSessionConfig?.allowMixingWithOthers) {\n return true;\n }\n\n // When mixing is enabled, configure audio to allow concurrent playback\n return {\n audio: {\n noiseSuppression: true,\n echoCancellation: true,\n },\n audioSessionConfiguration: {\n allowMixingWithOthers: true,\n },\n };\n }, [audioSessionConfig, textOnly]);\n\n return (\n <LiveKitRoom\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n audio={audioOptions}\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 onEndSession={onEndSession}\n />\n {children as any}\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, AudioSessionConfig } 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: (reason?: \"user\" | \"agent\") => 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 React.useEffect(() => {\n if (clientTools) {\n context.setClientTools(clientTools);\n }\n }, [context, clientTools]);\n\n // Update callbacks - since this only updates a ref, it's safe to call on every render\n // and doesn't cause re-renders of the provider or its consumers\n context.setCallbacks(callbacks);\n\n return context.conversation;\n};\n\ninterface ElevenLabsProviderProps {\n children: React.ReactNode;\n audioSessionConfig?: AudioSessionConfig;\n}\n\nexport const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children, audioSessionConfig }) => {\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 textOnly,\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, status, textOnly);\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 setIsSpeaking(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 = React.useCallback(() => conversationId, [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 const overridesEvent = constructOverrides({\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n });\n\n if (overridesEvent) {\n try {\n const encoder = new TextEncoder();\n const data = encoder.encode(JSON.stringify(overridesEvent));\n participant.publishData(data, { reliable: true });\n } catch (error) {\n console.error(\"Failed to send overrides:\", error);\n callbacksRef.current.onError?.(error as string);\n }\n }\n }, [handleParticipantReady, overrides, customLlmExtraBody, dynamicVariables, userId, callbacksRef]);\n\n // Create setClientTools function that only updates ref\n const setClientTools = React.useCallback((tools: ClientToolsConfig['clientTools']) => {\n clientToolsRef.current = tools;\n }, []);\n\n // Memoize inline callback functions\n const sendContextualUpdate = React.useCallback((text: string) => {\n sendMessage({\n type: \"contextual_update\",\n text,\n });\n }, [sendMessage]);\n\n const sendUserMessage = React.useCallback((text: string) => {\n sendMessage({\n type: \"user_message\",\n text,\n });\n }, [sendMessage]);\n\n const sendUserActivity = React.useCallback(() => {\n sendMessage({\n type: \"user_activity\",\n });\n }, [sendMessage]);\n\n // Store all conversation values/functions in refs for stable access\n const conversationValuesRef = React.useRef({\n startSession,\n endSession,\n status,\n isSpeaking,\n canSendFeedback,\n getId,\n setMicMuted,\n sendFeedback,\n sendContextualUpdate,\n sendUserMessage,\n sendUserActivity,\n });\n\n // Update ref on every render\n conversationValuesRef.current = {\n startSession,\n endSession,\n status,\n isSpeaking,\n canSendFeedback,\n getId,\n setMicMuted,\n sendFeedback,\n sendContextualUpdate,\n sendUserMessage,\n sendUserActivity,\n };\n\n // Create a stable conversation object that never changes reference\n // This prevents infinite loops when conversation is used in useEffect dependencies\n const conversation = React.useMemo<Conversation>(() => ({\n get startSession() { return conversationValuesRef.current.startSession; },\n get endSession() { return conversationValuesRef.current.endSession; },\n get status() { return conversationValuesRef.current.status; },\n get isSpeaking() { return conversationValuesRef.current.isSpeaking; },\n get canSendFeedback() { return conversationValuesRef.current.canSendFeedback; },\n get getId() { return conversationValuesRef.current.getId; },\n get setMicMuted() { return conversationValuesRef.current.setMicMuted; },\n get sendFeedback() { return conversationValuesRef.current.sendFeedback; },\n get sendContextualUpdate() { return conversationValuesRef.current.sendContextualUpdate; },\n get sendUserMessage() { return conversationValuesRef.current.sendUserMessage; },\n get sendUserActivity() { return conversationValuesRef.current.sendUserActivity; },\n }), []); // Empty deps - object is created once and never recreated\n\n // Memoize the context value to prevent unnecessary re-renders of consumers\n const contextValue = React.useMemo<ElevenLabsContextType>(() => ({\n conversation,\n callbacksRef,\n serverUrl,\n tokenFetchUrl,\n clientTools: clientToolsRef.current,\n setCallbacks,\n setServerUrl,\n setTokenFetchUrl,\n setClientTools,\n }), [\n conversation,\n callbacksRef,\n serverUrl,\n tokenFetchUrl,\n setCallbacks,\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 onEndSession={endSession}\n audioSessionConfig={audioSessionConfig}\n textOnly={textOnly}\n >\n {children}\n </LiveKitRoomWrapper>\n </ElevenLabsContext.Provider>\n );\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\";\nimport { isTextOnly } from \"../utils/text-only\";\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 const [textOnly, setTextOnly] =\n useState<ConversationConfig[\"textOnly\"]>(false);\n\n const startSession = useCallback(\n async (config: ConversationConfig) => {\n try {\n setStatus(\"connecting\");\n callbacksRef.current.onStatusChange?.({ status: \"connecting\" });\n\n const textOnly = isTextOnly(config);\n\n setOverrides({\n ...config.overrides,\n conversation: {\n ...config.overrides?.conversation,\n textOnly,\n },\n });\n setCustomLlmExtraBody(config.customLlmExtraBody || null);\n setDynamicVariables(config.dynamicVariables || {});\n setUserId(config.userId);\n setTextOnly(textOnly);\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 setTextOnly,\n tokenFetchUrl,\n ]\n );\n\n const endSession = useCallback(\n async (reason: \"user\" | \"agent\" = \"user\") => {\n try {\n setConnect(false);\n setToken(\"\");\n setStatus(\"disconnected\");\n\n // Reset session configuration state\n setOverrides({});\n setCustomLlmExtraBody(null);\n setDynamicVariables({});\n setUserId(undefined);\n setConversationId(\"\");\n\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onDisconnect?.({ reason });\n } catch (error) {\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n },\n [callbacksRef, setConnect, setToken, setStatus, setConversationId]\n );\n\n return {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n textOnly,\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 try {\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 if (\n typeof data.detail === \"object\" &&\n data.detail !== null &&\n typeof data.detail.message === \"string\"\n ) {\n throw new Error(data.detail.message);\n }\n throw new Error(\"Missing error details or message\");\n }\n\n if (!data.token) {\n throw new Error(\"No conversation token received from API\");\n }\n\n return data.token;\n } catch (error) {\n throw new Error(\n `Failed to get conversation token: ${error instanceof Error ? error.message : \"No message\"}`\n );\n }\n};\n","import { ConversationConfig } from \"../types\";\n\n// Note: This function is copied from the client package (see BaseConversation.ts)\nexport function isTextOnly(options: ConversationConfig): boolean | undefined {\n const { textOnly: textOnlyOverride } = options.overrides?.conversation ?? {};\n const { textOnly } = options;\n if (typeof textOnly === \"boolean\") {\n if (\n typeof textOnlyOverride === \"boolean\" &&\n textOnly !== textOnlyOverride\n ) {\n console.warn(\n `Conflicting textOnly options provided: ${textOnly} via options.textOnly (will be used) and ${textOnlyOverride} via options.overrides.conversation.textOnly (will be ignored)`\n );\n }\n return textOnly;\n } else if (typeof textOnlyOverride === \"boolean\") {\n return textOnlyOverride;\n } else {\n return undefined;\n }\n}\n","import { useState, useEffect, useCallback, useRef } 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 status: ConversationStatus,\n textOnly: boolean = false\n) => {\n const [roomConnected, setRoomConnected] = useState(false);\n const [localParticipant, setLocalParticipant] =\n useState<LocalParticipant | null>(null);\n const hasCalledOnConnectRef = useRef(false);\n const audioSessionActiveRef = useRef(false);\n\n // Reset room state when conversationId changes (new session starting)\n useEffect(() => {\n if (conversationId) {\n setRoomConnected(false);\n setLocalParticipant(null);\n hasCalledOnConnectRef.current = false;\n }\n }, [conversationId]);\n\n useEffect(() => {\n const shouldHaveAudio = !textOnly && !!conversationId;\n\n if (shouldHaveAudio && !audioSessionActiveRef.current) {\n audioSessionActiveRef.current = true;\n AudioSession.startAudioSession();\n } else if (!shouldHaveAudio && audioSessionActiveRef.current) {\n audioSessionActiveRef.current = false;\n AudioSession.stopAudioSession();\n }\n\n return () => {\n if (audioSessionActiveRef.current) {\n audioSessionActiveRef.current = false;\n AudioSession.stopAudioSession();\n }\n };\n }, [textOnly, conversationId]);\n\n // Fire onConnect when both participant and room are fully ready\n useEffect(() => {\n if (localParticipant && roomConnected && !hasCalledOnConnectRef.current) {\n hasCalledOnConnectRef.current = true;\n callbacksRef.current.onConnect?.({ conversationId });\n }\n }, [localParticipant, roomConnected, conversationId, callbacksRef]);\n\n const handleParticipantReady = useCallback(\n (participant: LocalParticipant) => {\n if (localParticipant) {\n return;\n }\n\n setLocalParticipant(participant);\n setStatus(\"connected\");\n },\n [localParticipant, setStatus]\n );\n\n const handleConnected = useCallback(() => {\n setRoomConnected(true);\n }, []);\n\n const handleDisconnected = useCallback(() => {\n // If already disconnected, endSession already handled the disconnect callback\n if (status === \"disconnected\") {\n return;\n }\n\n setRoomConnected(false);\n setStatus(\"disconnected\");\n setLocalParticipant(null);\n hasCalledOnConnectRef.current = false;\n callbacksRef.current.onDisconnect?.({ reason: \"user\" });\n }, [callbacksRef, setStatus, status]);\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 speed: config.overrides.tts?.speed,\n stability: config.overrides.tts?.stability,\n similarity_boost: config.overrides.tts?.similarityBoost,\n },\n conversation: {\n text_only: config.overrides.conversation?.textOnly,\n },\n };\n }\n\n overridesEvent.source_info = {\n source: \"react_native_sdk\",\n version: config.overrides?.client?.version || PACKAGE_VERSION,\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","onEndSession","localParticipant","useLocalParticipant","room","useRoomContext","agentResponseCountRef","React","useRef","onEndSessionRef","current","onReadyRef","callbacksRef","useEffect","handleParticipantDisconnected","participant","_participant$identity","identity","startsWith","on","RoomEvent","ParticipantDisconnected","off","useDataChannel","msg","_msg$from","decoder","TextDecoder","message","JSON","parse","decode","payload","event","_msg$from2","messageText","type","user_transcription_event","user_transcript","agent_response_event","agent_response","extractMessageText","onMessage","source","role","from","isAgent","onModeChange","mode","isSpeaking","eventId","event_id","ping_event","clientToolCall","Promise","resolve","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","audioEvent","audio_event","audio_base_64","onAudio","alignment","onAudioAlignment","onVadScore","vadScore","vad_score_event","vad_score","onInterruption","interruption_event","onMCPToolCall","mcp_tool_call","onMCPConnectionStatus","mcp_connection_status","onAgentToolRequest","agent_tool_request","onAgentToolResponse","agent_tool_response","onConversationMetadata","conversation_initiation_metadata_event","onAsrInitiationMetadata","asr_initiation_metadata_event","onAgentChatResponsePart","text_response_part","onDebug","LiveKitRoomWrapper","children","serverUrl","token","connect","onConnected","onDisconnected","roomConnected","onParticipantReady","audioSessionConfig","_ref$textOnly","textOnly","audioOptions","useMemo","allowMixingWithOthers","audio","noiseSuppression","echoCancellation","audioSessionConfiguration","createElement","LiveKitRoom","video","options","adaptiveStream","pixelDensity","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","setCallbacks","useCallback","useConversationCallbacks","setCallbacksBase","wrappedCallbacks","_extends","_useConversationSessi","overrides","setOverrides","customLlmExtraBody","setCustomLlmExtraBody","dynamicVariables","setDynamicVariables","userId","setUserId","setTextOnly","startSession","config","_config$overrides","_temp2","_result2","extractedConversationId","_tokenPayload$video","_roomId$match","atob","split","match","error","console","warn","extractConversationIdFromToken","conversationToken","onStatusChange","_options$overrides$co","_options$overrides","textOnlyOverride","conversation","isTextOnly","agentId","info","fetch","response","json","data","ok","detail","Error","getConversationToken","_getConversationToken","endSession","reason","onDisconnect","useConversationSession","_useLiveKitRoom","setRoomConnected","setLocalParticipant","hasCalledOnConnectRef","audioSessionActiveRef","shouldHaveAudio","AudioSession","startAudioSession","stopAudioSession","onConnect","handleParticipantReady","handleConnected","handleDisconnected","handleError","useLiveKitRoom","handleConnectedWithFeedback","onCanSendFeedbackChange","handleDisconnectedWithFeedback","_useMessageSending","TextEncoder","encode","publishData","reliable","useMessageSending","updateCanSendFeedback","newCanSendFeedback","sendFeedback","like","score","volume","getId","setMicMuted","muted","setMicrophoneEnabled","handleParticipantReadyWithOverrides","overridesEvent","_config$overrides$age","_config$overrides$age2","_config$overrides$age3","_config$overrides$tts","_config$overrides$tts2","_config$overrides$tts3","_config$overrides$tts4","_config$overrides$con","conversation_config_override","agent","prompt","first_message","firstMessage","language","tts","voice_id","voiceId","speed","stability","similarity_boost","similarityBoost","text_only","source_info","version","client","custom_llm_extra_body","dynamic_variables","user_id","constructOverrides","setClientTools","tools","sendContextualUpdate","text","sendUserMessage","sendUserActivity","conversationValuesRef","contextValue","Provider","value","context","useContext","_objectWithoutPropertiesLoose","_excluded"],"mappings":"8YACa,IAAAA,EAAkB,QCqClBC,EAAiB,SAAHC,GAQD,IAPxBC,EAAOD,EAAPC,QACAC,EAAWF,EAAXE,YACAC,EAASH,EAATG,UACAC,EAAWJ,EAAXI,YAAWC,EAAAL,EACXM,YAAAA,OAAc,IAAHD,EAAG,GAAEA,EAChBE,EAAoBP,EAApBO,qBACAC,EAAYR,EAAZQ,aAEQC,EAAqBC,wBAArBD,iBACFE,EAAOC,EAAAA,iBAGPC,EAAwBC,EAAK,QAACC,OAAO,GAGrCC,EAAkBF,EAAAA,QAAMC,OAAOP,GACrCQ,EAAgBC,QAAUT,EAC1B,IAAMU,EAAaJ,UAAMC,OAAOd,GAChCiB,EAAWD,QAAUhB,EACrB,IAAMkB,EAAeL,EAAK,QAACC,OAAOZ,GAiLlC,OAhLAgB,EAAaF,QAAUd,EAGvBiB,YAAU,WACR,IAAMC,EAAgC,SAACC,GAAkC,IAAAC,EAC/C,OAAxBA,EAAID,EAAYE,WAAZD,EAAsBE,WAAW,UACnCT,EAAgBC,QAAQ,QAE5B,EAIA,OAFAN,EAAKe,GAAGC,EAASA,UAACC,wBAAyBP,GAE/B,WACVV,EAAKkB,IAAIF,EAAAA,UAAUC,wBAAyBP,EAC9C,CACF,EAAG,CAACV,IAGJS,EAAAA,UAAU,WACHlB,IACHW,EAAsBI,QAAU,EAEpC,EAAG,CAACf,IAEJkB,YAAU,WACJlB,GAAeO,GACjBS,EAAWD,QAAQR,EAEvB,EAAG,CAACP,EAAaO,IAmDPqB,EAAcA,eAAC,SAAAC,GAAMC,IAAAA,EACvBC,EAAU,IAAIC,YACdC,EAAUC,KAAKC,MAAMJ,EAAQK,OAAOP,EAAIQ,UAE9C,GAtHsB,iBADGC,EAuHPL,IAtH0B,OAAVK,GAAkB,SAAUA,EAsH9D,CAvHY,IAAaA,EAwIFC,EATjBC,EA3HV,SAA4BF,GAC1B,OAAQA,EAAMG,MACZ,IAAK,kBACH,OAAOH,EAAMI,yBAAyBC,gBACxC,IAAK,iBACH,OAAOL,EAAMM,qBAAqBC,eACpC,QACE,YAEN,CAkHwBC,CAAmBb,GASvC,GARoB,OAAhBO,IAC4B,MAA9BvB,EAAaF,QAAQgC,WAArB9B,EAAaF,QAAQgC,UAAY,CAC/Bd,QAASO,EACTQ,OAAyB,oBAAjBf,EAAQQ,KAA6B,OAAS,KACtDQ,KAAuB,oBAAjBhB,EAAQQ,KAA6B,OAAS,WAIpDX,OAAJA,EAAID,EAAIqB,OAAJpB,EAAUqB,UACqB,MAAjClC,EAAaF,QAAQqC,cAArBnC,EAAaF,QAAQqC,aAAe,CAClCC,KAAMd,OAAAA,EAAAV,EAAIqB,OAAJX,EAAUe,WAAa,WAAa,cAIvB,mBAAjBrB,EAAQQ,MAA6BpC,GAAsB,CAC7D,IAAMkD,EAAU5C,EAAsBI,UACtCV,EAAqBkD,EACvB,CAGF,OAAQtB,EAAQQ,MACd,IAAK,OACHvC,EAAY,CACVuC,KAAM,OACNe,SAAUvB,EAAQwB,WAAWD,WAE/B,MACF,IAAK,oBAzFH,SAA8BE,GAAuC,IAAA,OAAAC,QAAAC,QAAA,WAAA,GACrEF,EAAeG,iBAAiBC,aAAa1D,EAAW2D,CAAAA,IAAAA,0BACtDJ,QAAAC,QAEOxD,EAAYsD,EAAeG,iBAAiBC,WACjDJ,EAAeG,iBAAiBG,aACjCC,KAAA,SAHGC,GAMN,IAAMC,EACc,iBAAXD,EAAsBhC,KAAKkC,UAAUF,GAAUG,OAAOH,GAE/DhE,EAAY,CACVuC,KAAM,qBACN6B,aAAcZ,EAAeG,iBAAiBS,aAC9CJ,OAAQC,EACRI,UAAU,GACT,4DAhBqDC,CAAA,WAiBjDC,GAEPxD,MAAAA,EAAaF,QAAQ2D,SAArBzD,EAAaF,QAAQ2D,QADuDD,6DAAAA,SAAAA,EAAaxC,SAC5C,CAC3C0C,eAAgBjB,EAAeG,iBAAiBC,YAElD5D,EAAY,CACVuC,KAAM,qBACN6B,aAAcZ,EAAeG,iBAAiBS,aAC9CJ,OAAM,kCAAoCO,MAAAA,OAAAA,EAAAA,EAAaxC,SACvDsC,UAAU,GAEd,GAAC,GAAAR,GAAAA,EAAAE,YAAAF,EAAAE,KAAA,WAAA,EAAA,KAAA,CAED,GAAIhD,EAAaF,QAAQ6D,0BAEvB,YADA3D,EAAaF,QAAQ6D,0BAA0BlB,EAAeG,kBAIhE,IAAMgB,EAAwCnB,yBAAAA,EAAeG,iBAAiBC,UAAoC,4BAClH7C,MAAAA,EAAaF,QAAQ2D,SAArBzD,EAAaF,QAAQ2D,QAAUG,EAAc,CAC3CF,eAAgBjB,EAAeG,iBAAiBC,YAElD5D,EAAY,CACVuC,KAAM,qBACN6B,aAAcZ,EAAeG,iBAAiBS,aAC9CJ,OAAQW,EACRN,UAAU,GACT,CAAA,CA7CoE,GA+C3E,CAAC,MAAAE,GAAAd,OAAAA,QAAAmB,OAAAL,EAAA,CAAA,CA2CKM,CAAqB9C,GACrB,MACF,IAAK,QACH,IAAM+C,EAAa/C,EAAQgD,YACvBD,EAAWE,sBACbjE,EAAaF,QAAQoE,SAArBlE,EAAaF,QAAQoE,QAAUH,EAAWE,gBAExCF,EAAWI,YACwB,MAArCnE,EAAaF,QAAQsE,kBAArBpE,EAAaF,QAAQsE,iBAAmBL,EAAWI,YAErD,MAEF,IAAK,YAC4B,MAA/BnE,EAAaF,QAAQuE,YAArBrE,EAAaF,QAAQuE,WAAa,CAChCC,SAAUtD,EAAQuD,gBAAgBC,YAEpC,MACF,IAAK,eACHxE,MAAAA,EAAaF,QAAQ2E,gBAArBzE,EAAaF,QAAQ2E,eAAiBzD,EAAQ0D,oBAC9C,MACF,IAAK,gBACH1E,MAAAA,EAAaF,QAAQ6E,eAArB3E,EAAaF,QAAQ6E,cAAgB3D,EAAQ4D,eAC7C,MACF,IAAK,8BACH5E,EAAaF,QAAQ+E,uBAArB7E,EAAaF,QAAQ+E,sBAAwB7D,EAAQ8D,uBACrD,MACF,IAAK,qBACoC,MAAvC9E,EAAaF,QAAQiF,oBAArB/E,EAAaF,QAAQiF,mBAAqB/D,EAAQgE,oBAClD,MACF,IAAK,sBACqC,MAAxChF,EAAaF,QAAQmF,qBAArBjF,EAAaF,QAAQmF,oBAAsBjE,EAAQkE,qBAEL,aAA1ClE,EAAQkE,oBAAoBrC,WAE9BhD,EAAgBC,QAAQ,SAE1B,MACF,IAAK,mCACwC,MAA3CE,EAAaF,QAAQqF,wBAArBnF,EAAaF,QAAQqF,uBACnBnE,EAAQoE,wCAEV,MACF,IAAK,0BACHpF,MAAAA,EAAaF,QAAQuF,yBAArBrF,EAAaF,QAAQuF,wBACnBrE,EAAQsE,+BAEV,MACF,IAAK,2BACHtF,MAAAA,EAAaF,QAAQyF,yBAArBvF,EAAaF,QAAQyF,wBAA0BvE,EAAQwE,oBACvD,MACF,QACExF,MAAAA,EAAaF,QAAQ2F,SAArBzF,EAAaF,QAAQ2F,QAAUzE,GAlFnC,MAL8B,MAA5BhB,EAAaF,QAAQ2F,SAArBzF,EAAaF,QAAQ2F,QAAU,CAC7BjE,KAAM,gBACNR,QAAAA,GAwFN,OAGF,EClNa0E,EAAqB,SAAH7G,GAiBD,IAhB5B8G,EAAQ9G,EAAR8G,SACAC,EAAS/G,EAAT+G,UACAC,EAAKhH,EAALgH,MACAC,EAAOjH,EAAPiH,QACAC,EAAWlH,EAAXkH,YACAC,EAAcnH,EAAdmH,eACAvC,EAAO5E,EAAP4E,QACAwC,EAAapH,EAAboH,cACAjH,EAASH,EAATG,UACAkH,EAAkBrH,EAAlBqH,mBACAjH,EAAWJ,EAAXI,YACAE,EAAWN,EAAXM,YACAC,EAAoBP,EAApBO,qBACAC,EAAYR,EAAZQ,aACA8G,EAAkBtH,EAAlBsH,mBAAkBC,EAAAvH,EAClBwH,SAAAA,OAAQ,IAAAD,GAAQA,EAGVE,EAAe3G,EAAK,QAAC4G,QAAQ,WACjC,OAAIF,IAImB,MAAlBF,IAAAA,EAAoBK,uBAKlB,CACLC,MAAO,CACLC,kBAAkB,EAClBC,kBAAkB,GAEpBC,0BAA2B,CACzBJ,uBAAuB,IAG7B,EAAG,CAACL,EAAoBE,iBAExB,OACE1G,EAAC,QAAAkH,cAAAC,cACC,CAAAlB,UAAWA,EACXC,MAAOA,EACPC,QAASA,EACTW,MAAOH,EACPS,OAAO,EACPC,QAAS,CACPC,eAAgB,CAAEC,aAAc,WAElCnB,YAAaA,EACbC,eAAgBA,EAChBvC,QAASA,gBAET9D,EAAAA,QAAAkH,cAACjI,EAAc,CACbE,QAASoH,EACTnH,YAAakH,EACbjH,UAAWA,EACXC,YAAaA,EACbE,YAAaA,EACbC,qBAAsBA,EACtBC,aAAcA,IAEfsG,EAGP,gDC9CMwB,eAAoBC,gBAA4C,iCAwCD,SAAtCvI,GAA2E,IAAlC8G,EAAQ9G,EAAR8G,SAAUQ,EAAkBtH,EAAlBsH,mBAEhFkB,oBAGA,IAAAC,EAA0BC,WAAS,IAA5B1B,EAAKyB,KAAEE,EAAQF,EACtB,GAAAG,EAA8BF,EAAQA,UAAC,GAAhCzB,EAAO2B,KAAEC,EAAUD,EAC1B,GAAAE,EAA4BJ,EAAQA,SAAqB,gBAAlDK,EAAMD,KAAEE,EAASF,EAAA,GACxBG,EAAkCP,EAAQA,SC9FV,mCD8FzB3B,EAASkC,KAAEC,EAAYD,EAC9B,GAAAE,EAA0CT,EAAQA,cAAqBU,GAAhEC,EAAaF,KAAEG,EAAgBH,EACtC,GAAAI,EAA4Cb,EAAQA,SAAS,IAAtDc,EAAcD,KAAEE,EAAiBF,EACxC,GAAAG,EAAoChB,EAAAA,UAAS,GAAtClF,EAAUkG,KAAEC,EAAaD,EAAA,GAChCE,EAA8ClB,EAAAA,UAAS,GAAhDmB,EAAeD,EAAEE,GAAAA,EAAkBF,KAGpCG,EAAoBjJ,EAAAA,QAAMC,OAAO,GACjCiJ,EAAyBlJ,EAAAA,QAAMC,OAAO,GAGtCkJ,EAAiBnJ,UAAMC,OAAyC,CAAE,GAGxEmJ,EEzGsC,WACtC,IAAM/I,EAAeJ,SAAkB,CAAA,GAEjCoJ,EAAeC,EAAAA,YAAY,SAACjK,GAChCgB,EAAaF,QAAUd,CACzB,EAAG,IAEH,MAAO,CACLgB,aAAAA,EACAgJ,aAAAA,EAEJ,CF8F2DE,GAAjDlJ,EAAY+I,EAAZ/I,aAA4BmJ,EAAgBJ,EAA9BC,aAGhBA,EAAerJ,EAAK,QAACsJ,YAAY,SAACjK,GACtC,IAAMoK,EAAgBC,EACjBrK,CAAAA,EAAAA,EACHmD,CAAAA,aAAc,SAACd,GACbmH,EAA6B,aAAfnH,EAAMe,MACE,MAAtBpD,EAAUmD,cAAVnD,EAAUmD,aAAed,EAC3B,IAEF8H,EAAiBC,EACnB,EAAG,CAACD,IAEJG,EG9GoC,SACpCtJ,EACA6H,EACAH,EACAF,EACAc,EACAJ,GAEA,IAAAZ,EAAkCC,WAChC,CAAA,GADKgC,EAASjC,EAAEkC,GAAAA,EAAYlC,KAG9BG,EACEF,EAAAA,SAAmD,MAD9CkC,EAAkBhC,EAAEiC,GAAAA,EAAqBjC,KAEhDE,EAAgDJ,EAAQA,SAEtD,IAFKoC,EAAgBhC,KAAEiC,EAAmBjC,EAG5C,GAAAG,EAA4BP,EAAAA,cAAuCU,GAA5D4B,EAAM/B,EAAEgC,GAAAA,EAAShC,EAAA,GACxBE,EACET,EAAQA,UAAiC,GADpClB,EAAQ2B,EAAE+B,GAAAA,EAAW/B,EAAA,GAGtBgC,EAAef,cACZgB,SAAAA,OAA8BvH,OAAAA,QAAAC,gCAAA,eAC/BuH,EAAA,SAAAC,EAAAC,GAqCF,IAAMC,ECrEgC,SAACxE,GAC7C,QAAIyE,EAAAC,EAIF,cAAOA,IAFQD,OAAAA,EADMrJ,KAAKC,MAAMsJ,KAAK3E,EAAM4E,MAAM,KAAK,KAC1B1D,YAAbuD,EAAAA,EAAoB9K,OAAQ,IAE7BkL,MAAM,+BAAbH,EAAsC,KAAM,EACrD,CAAE,MAAOI,GAEP,OADAC,QAAQC,KAAK,gDACN,EACT,CACF,CD4DUC,CAA+BC,GACjCzC,EAAkB+B,GAElB7C,EAASuD,GACTrD,GAAW,EAAM,CAzCjBG,EAAU,cACyB,MAAnC7H,EAAaF,QAAQkL,gBAArBhL,EAAaF,QAAQkL,eAAiB,CAAEpD,OAAQ,eAEhD,IAcImD,EAdE1E,EEnCR,SAAqBW,GAA2B,IAAAiE,EAAAC,EAClCC,GAAoD,OAAtEF,EAAuCC,OAAvCA,EAAuClE,EAAQuC,gBAAR2B,EAAAA,EAAmBE,cAAYH,EAAI,CAAA,GAAlE5E,SACAA,EAAaW,EAAbX,SACR,MAAwB,kBAAbA,GAEqB,kBAArB8E,GACP9E,IAAa8E,GAEbP,QAAQC,KAAI,0CACgCxE,EAAQ,4CAA4C8E,EAAgB,kEAG3G9E,GAC8B,kBAArB8E,EACTA,OAEP,CAEJ,CFiByBE,CAAWpB,GAE5BT,EAAYH,EAAA,CAAA,EACPY,EAAOV,UACV6B,CAAAA,aAAY/B,KACPa,OADOA,EACPD,EAAOV,gBAAPW,EAAAA,EAAkBkB,cACrB/E,SAAAA,OAGJqD,EAAsBO,EAAOR,oBAAsB,MACnDG,EAAoBK,EAAON,kBAAoB,CAAE,GACjDG,EAAUG,EAAOJ,QACjBE,EAAY1D,GAEkB,IAAAvD,iBAE1BmH,EAAOc,kBACoC,OAAA,WAAA,GACpCd,EAAOqB,QAMuC,OALvDV,QAAQW,KACN,0CACAtB,EAAOqB,SAG8C5I,QAAAC,QChDpD,SACX2I,EACApD,GACmB,IAAA,OAAAxF,QAAAC,gCAG2DD,QAAAC,QACrD6I,OADrBtD,GAAiB,0DAEMoD,aAAAA,EAA2C3M,oCAAAA,IACnEqE,KAFKyI,SAAAA,UAAQ/I,QAAAC,QAIK8I,EAASC,QAAM1I,KAAA,SAA5B2I,GAEN,IAAKF,EAASG,GAAI,CAChB,GACyB,iBAAhBD,EAAKE,QACI,OAAhBF,EAAKE,QAC0B,iBAAxBF,EAAKE,OAAO7K,QAEnB,MAAM,IAAI8K,MAAMH,EAAKE,OAAO7K,SAE9B,MAAU,IAAA8K,MAAM,mCAClB,CAEA,IAAKH,EAAK9F,MACR,MAAU,IAAAiG,MAAM,2CAGlB,OAAOH,EAAK9F,KAAM,EACpB,4DA1BmBtC,CACf,WAyBKoH,GACP,UAAUmB,MAC6BnB,sCAAAA,aAAiBmB,MAAQnB,EAAM3J,QAAU,cAElF,GACF,CAAC,MAAAwC,GAAAd,OAAAA,QAAAmB,OAAAL,EAAA,CAAA,CDemCuI,CACxB9B,EAAOqB,QAFQrB,EAAO/B,eAAiBA,IAIxClF,KAAA,SAAAgJ,GAHDjB,EAAiBiB,CAGf,GAEF,UAAUF,MAAM,mDAb6B,GAA7Cf,EAAoBd,EAAOc,4BAawCjI,GAAAA,EAAAE,KAAAF,EAAAE,KAAAmH,GAAAA,GASvE,6DA5CmC5G,CAAA,WA4C1BoH,GAIP,MAHA9C,EAAU,gBACV7H,MAAAA,EAAaF,QAAQkL,gBAArBhL,EAAaF,QAAQkL,eAAiB,CAAEpD,OAAQ,uBAChD5H,EAAaF,QAAQ2D,SAArBzD,EAAaF,QAAQ2D,QAAUkH,GACzBA,CACR,GACF,CAAC,MAAAnH,GAAA,OAAAd,QAAAmB,OAAAL,EACD,CAAA,EAAA,CACExD,EACA6H,EACAH,EACAF,EACAc,EACAyB,EACA7B,IA4BJ,MAAO,CACL8B,aAAAA,EACAiC,WA1BiBhD,EAAWA,qBACrBiD,QAAAA,IAAAA,IAAAA,EAA2B,QAAM,IACtC,IACExE,GAAW,GACXF,EAAS,IACTK,EAAU,gBAGV2B,EAAa,CAAA,GACbE,EAAsB,MACtBE,EAAoB,IACpBE,OAAU7B,GACVK,EAAkB,IAEiB,MAAnCtI,EAAaF,QAAQkL,gBAArBhL,EAAaF,QAAQkL,eAAiB,CAAEpD,OAAQ,uBAChD5H,EAAaF,QAAQqM,cAArBnM,EAAaF,QAAQqM,aAAe,CAAED,OAAAA,GACxC,CAAE,MAAOvB,GAEP,MAD4B,MAA5B3K,EAAaF,QAAQ2D,SAArBzD,EAAaF,QAAQ2D,QAAUkH,GACzBA,CACR,CAAC,OAAAjI,QAAAC,SACH,CAAC,MAAAa,GAAA,OAAAd,QAAAmB,OAAAL,EAAA,CAAA,EACD,CAACxD,EAAc0H,EAAYF,EAAUK,EAAWS,IAMhDiB,UAAAA,EACAE,mBAAAA,EACAE,iBAAAA,EACAE,OAAAA,EACAxD,SAAAA,EAEJ,CHEM+F,CAAuBpM,EAAc6H,EAAWH,EAAYF,EAAUc,EAAmBJ,GAP3F8B,EAAYV,EAAZU,aACAiC,EAAU3C,EAAV2C,WACA1C,EAASD,EAATC,UACAE,EAAkBH,EAAlBG,mBACAE,EAAgBL,EAAhBK,iBACAE,EAAMP,EAANO,OACAxD,EAAQiD,EAARjD,SAGFgG,EM/H4B,SAC5BrM,EACA6H,EACAQ,EACAT,EACAvB,QAAAA,IAAAA,IAAAA,GAAoB,GAEpB,IAAAiB,EAA0CC,EAAAA,UAAS,GAA5CtB,EAAaqB,EAAEgF,GAAAA,EAAgBhF,EAAA,GACtCG,EACEF,EAAQA,SAA0B,MAD7BjI,EAAgBmI,KAAE8E,EAAmB9E,EAAA,GAEtC+E,EAAwB5M,EAAAA,QAAO,GAC/B6M,EAAwB7M,UAAO,GAGrCK,EAASA,UAAC,WACJoI,IACFiE,GAAiB,GACjBC,EAAoB,MACpBC,EAAsB1M,SAAU,EAEpC,EAAG,CAACuI,IAEJpI,EAASA,UAAC,WACR,IAAMyM,GAAmBrG,KAAcgC,EAUvC,OARIqE,IAAoBD,EAAsB3M,SAC5C2M,EAAsB3M,SAAU,EAChC6M,EAAAA,aAAaC,sBACHF,GAAmBD,EAAsB3M,UACnD2M,EAAsB3M,SAAU,EAChC6M,EAAAA,aAAaE,oBAGR,WACDJ,EAAsB3M,UACxB2M,EAAsB3M,SAAU,EAChC6M,EAAYA,aAACE,mBAEjB,CACF,EAAG,CAACxG,EAAUgC,IAGdpI,EAAAA,UAAU,WACJX,GAAoB2G,IAAkBuG,EAAsB1M,UAC9D0M,EAAsB1M,SAAU,EAChCE,MAAAA,EAAaF,QAAQgN,WAArB9M,EAAaF,QAAQgN,UAAY,CAAEzE,eAAAA,IAEvC,EAAG,CAAC/I,EAAkB2G,EAAeoC,EAAgBrI,IAErD,IAAM+M,EAAyB9D,EAAAA,YAC7B,SAAC9I,GACKb,IAIJiN,EAAoBpM,GACpB0H,EAAU,aACZ,EACA,CAACvI,EAAkBuI,IAGfmF,EAAkB/D,EAAAA,YAAY,WAClCqD,GAAiB,EACnB,EAAG,IAEGW,EAAqBhE,EAAAA,YAAY,WAEtB,iBAAXrB,IAIJ0E,GAAiB,GACjBzE,EAAU,gBACV0E,EAAoB,MACpBC,EAAsB1M,SAAU,EACC,MAAjCE,EAAaF,QAAQqM,cAArBnM,EAAaF,QAAQqM,aAAe,CAAED,OAAQ,SAChD,EAAG,CAAClM,EAAc6H,EAAWD,IAEvBsF,EAAcjE,EAAWA,YAC7B,SAAC0B,GACCC,QAAQD,MAAM,iBAAkBA,GACJ,MAA5B3K,EAAaF,QAAQ2D,SAArBzD,EAAaF,QAAQ2D,QAAUkH,EAAM3J,aAASiH,EAChD,EACA,CAACjI,IAGH,MAAO,CACLiG,cAAAA,EACA3G,iBAAAA,EACAyN,uBAAAA,EACAC,gBAAAA,EACAC,mBAAAA,EACAC,YAAAA,EAEJ,CNwCMC,CAAenN,EAAc6H,EAAWQ,EAAgBT,EAAQvB,GANlEJ,EAAaoG,EAAbpG,cACA3G,EAAgB+M,EAAhB/M,iBACAyN,EAAsBV,EAAtBU,uBACAC,EAAeX,EAAfW,gBACAC,GAAkBZ,EAAlBY,mBACAC,GAAWb,EAAXa,YAIIE,GAA8BzN,EAAK,QAACsJ,YAAY,WAEpDL,EAAkB9I,QAAU,EAC5B+I,EAAuB/I,QAAU,EACjC6I,GAAmB,SACnB3I,EAAaF,QAAQuN,yBAArBrN,EAAaF,QAAQuN,wBAA0B,CAAE3E,iBAAiB,IAElEsE,GACF,EAAG,CAACA,EAAiBhN,IAGfsN,GAAiC3N,UAAMsJ,YAAY,WACvDN,GAAmB,GACnBH,GAAc,GACdyE,IACF,EAAG,CAACA,KAEJM,GO3J+B,SAC/B3F,EACAtI,EACAU,GAwBA,MAAO,CAAEf,YAtBWgK,EAAAA,YACXjI,SAAAA,GAAoB,IACzB,GAAe,cAAX4G,IAA2BtI,EAI7B,OAHAsL,QAAQC,KACN,mEAEFnI,QAAAC,UACD,IAAAG,2BAGO6I,GADU,IAAI6B,aACCC,OAAOxM,KAAKkC,UAAUnC,IAAU0B,QAAAC,QAE/CrD,EAAiBoO,YAAY/B,EAAM,CAAEgC,UAAU,KAAO3K,KAAA,WAAA,yBAJ1D,IAEI2I,sCAHPpI,CACG,EAKH,SAAQoH,GACPC,QAAQD,MAAM,qCAAsCA,GACpDC,QAAQD,MAAM,iBAAkBA,SAChC3K,EAAaF,QAAQ2D,SAArBzD,EAAaF,QAAQ2D,QAAUkH,EACjC,GAACjI,OAAAA,QAAAC,QAAAG,GAAAA,EAAAE,KAAAF,EAAAE,KAAA,WAAA,QAAA,EACH,CAAC,MAAAQ,GAAA,OAAAd,QAAAmB,OAAAL,EAAA,CAAA,EACD,CAACoE,EAAQtI,EAAkBU,IAI/B,CP+H0B4N,CAAkBhG,EAAQtI,EAAkBU,GAA5Df,GAAWsO,GAAXtO,YAEF4O,GAAwBlO,EAAK,QAACsJ,YAAY,WAC9C,IAAM6E,EAAqBlF,EAAkB9I,UAAY+I,EAAuB/I,QAE5E4I,IAAoBoF,IACtBnF,EAAmBmF,GACyB,MAA5C9N,EAAaF,QAAQuN,yBAArBrN,EAAaF,QAAQuN,wBAA0B,CAAE3E,gBAAiBoF,IAEtE,EAAG,CAACpF,EAAiB1I,IAEf+N,GAAepO,EAAK,QAACsJ,YAAY,SAAC+E,GACjCtF,GAeLzJ,GANwB,CACtBuC,KAAM,WACNyM,MAAOD,EAAO,OAAS,UACvBzL,SAAUqG,EAAkB9I,UAI9B+I,EAAuB/I,QAAU8I,EAAkB9I,QACnD+N,MAhBEjD,QAAQC,KAC6B,IAAnChC,EAAuB/I,QACnB,8DACA,iFAcV,EAAG,CAAC4I,EAAiBzJ,GAAa4O,KAGhBlO,UAAMsJ,YAAY,SAACiF,GACnCtD,QAAQC,KAAK,uDACf,EAAG,IAEH,IAAMsD,GAAQxO,EAAAA,QAAMsJ,YAAY,WAAA,OAAMZ,CAAc,EAAE,CAACA,IAEjD+F,GAAczO,EAAK,QAACsJ,YAAY,SAACoF,GACjC/O,GACFA,EAAiBgP,sBAAsBD,EAE3C,EAAG,CAAC/O,IAGEF,GAAuBO,EAAK,QAACsJ,YAAY,SAAC3G,GAC9CsG,EAAkB9I,QAAUwC,EAC5BuL,IACF,EAAG,CAACA,KAGEU,GAAsC5O,EAAAA,QAAMsJ,YAAY,SAAC9I,GAC7D4M,EAAuB5M,GAEvB,IAAMqO,EQnNJ,SACJvE,GAA0B,IAAAC,EAMJuE,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAJhBR,EAA4C,CAChDhN,KAAM,uCAuCR,OApCIyI,EAAOV,YACTiF,EAAeS,6BAA+B,CAC5CC,MAAO,CACLC,OAA8B,OAAxBV,EAAExE,EAAOV,UAAU2F,YAAK,EAAtBT,EAAwBU,OAChCC,cAAqC,OAAxBV,EAAEzE,EAAOV,UAAU2F,YAAK,EAAtBR,EAAwBW,aACvCC,SAAgC,OAAxBX,EAAE1E,EAAOV,UAAU2F,YAAK,EAAtBP,EAAwBW,UAEpCC,IAAK,CACHC,SAA8B,OAAtBZ,EAAE3E,EAAOV,UAAUgG,UAAG,EAApBX,EAAsBa,QAChCC,MAA2B,OAAtBb,EAAE5E,EAAOV,UAAUgG,UAAG,EAApBV,EAAsBa,MAC7BC,UAAWb,OAAFA,EAAE7E,EAAOV,UAAUgG,UAAjBT,EAAAA,EAAsBa,UACjCC,iBAAkBb,OAAFA,EAAE9E,EAAOV,UAAUgG,UAAjBR,EAAAA,EAAsBc,iBAE1CzE,aAAc,CACZ0E,UAAWd,OAAFA,EAAE/E,EAAOV,UAAU6B,mBAAjB4D,EAAAA,EAA+B3I,YAKhDmI,EAAeuB,YAAc,CAC3BhO,OAAQ,mBACRiO,SAAyB9F,OAAhBA,EAAAD,EAAOV,YAAPW,OAAgBA,EAAhBA,EAAkB+F,aAAlB/F,EAAAA,EAA0B8F,UAAWrR,GAG5CsL,EAAOR,qBACT+E,EAAe0B,sBAAwBjG,EAAOR,oBAG5CQ,EAAON,mBACT6E,EAAe2B,kBAAoBlG,EAAON,kBAGxCM,EAAOJ,SACT2E,EAAe4B,QAAUhN,OAAO6G,EAAOJ,SAGlC2E,CACT,CRuK2B6B,CAAmB,CACxC9G,UAAAA,EACAE,mBAAAA,EACAE,iBAAAA,EACAE,OAAAA,IAGF,GAAI2E,EACF,IACE,IACM7C,GADU,IAAI6B,aACCC,OAAOxM,KAAKkC,UAAUqL,IAC3CrO,EAAYuN,YAAY/B,EAAM,CAAEgC,UAAU,GAC5C,CAAE,MAAOhD,GACPC,QAAQD,MAAM,4BAA6BA,GAC3C3K,MAAAA,EAAaF,QAAQ2D,SAArBzD,EAAaF,QAAQ2D,QAAUkH,EACjC,CAEJ,EAAG,CAACoC,EAAwBxD,EAAWE,EAAoBE,EAAkBE,EAAQ7J,IAG/EsQ,GAAiB3Q,UAAMsJ,YAAY,SAACsH,GACxCzH,EAAehJ,QAAUyQ,CAC3B,EAAG,IAGGC,GAAuB7Q,EAAAA,QAAMsJ,YAAY,SAACwH,GAC9CxR,GAAY,CACVuC,KAAM,oBACNiP,KAAAA,GAEJ,EAAG,CAACxR,KAEEyR,GAAkB/Q,EAAK,QAACsJ,YAAY,SAACwH,GACzCxR,GAAY,CACVuC,KAAM,eACNiP,KAAAA,GAEJ,EAAG,CAACxR,KAEE0R,GAAmBhR,UAAMsJ,YAAY,WACzChK,GAAY,CACVuC,KAAM,iBAEV,EAAG,CAACvC,KAGE2R,GAAwBjR,EAAAA,QAAMC,OAAO,CACzCoK,aAAAA,EACAiC,WAAAA,EACArE,OAAAA,EACAvF,WAAAA,EACAqG,gBAAAA,EACAyF,MAAAA,GACAC,YAAAA,GACAL,aAAAA,GACAyC,qBAAAA,GACAE,gBAAAA,GACAC,iBAAAA,KAIFC,GAAsB9Q,QAAU,CAC9BkK,aAAAA,EACAiC,WAAAA,EACArE,OAAAA,EACAvF,WAAAA,EACAqG,gBAAAA,EACAyF,MAAAA,GACAC,YAAAA,GACAL,aAAAA,GACAyC,qBAAAA,GACAE,gBAAAA,GACAC,iBAAAA,IAKF,IAAMvF,GAAezL,EAAAA,QAAM4G,QAAsB,iBAAO,CACtD,gBAAIyD,GAAiB,OAAO4G,GAAsB9Q,QAAQkK,YAAc,EACxE,cAAIiC,GAAe,OAAO2E,GAAsB9Q,QAAQmM,UAAY,EACpE,UAAIrE,GAAW,OAAOgJ,GAAsB9Q,QAAQ8H,MAAQ,EAC5D,cAAIvF,GAAe,OAAOuO,GAAsB9Q,QAAQuC,UAAY,EACpE,mBAAIqG,GAAoB,OAAOkI,GAAsB9Q,QAAQ4I,eAAiB,EAC9E,SAAIyF,GAAU,OAAOyC,GAAsB9Q,QAAQqO,KAAO,EAC1D,eAAIC,GAAgB,OAAOwC,GAAsB9Q,QAAQsO,WAAa,EACtE,gBAAIL,GAAiB,OAAO6C,GAAsB9Q,QAAQiO,YAAc,EACxE,wBAAIyC,GAAyB,OAAOI,GAAsB9Q,QAAQ0Q,oBAAsB,EACxF,mBAAIE,GAAoB,OAAOE,GAAsB9Q,QAAQ4Q,eAAiB,EAC9E,oBAAIC,GAAqB,OAAOC,GAAsB9Q,QAAQ6Q,gBAAkB,EACjF,EAAG,IAGEE,GAAelR,EAAK,QAAC4G,QAA+B,iBAAO,CAC/D6E,aAAAA,GACApL,aAAAA,EACA4F,UAAAA,EACAsC,cAAAA,EACA/I,YAAa2J,EAAehJ,QAC5BkJ,aAAAA,EACAjB,aAAAA,EACAI,iBAAAA,EACAmI,eAAAA,GACD,EAAG,CACFlF,GACApL,EACA4F,EACAsC,EACAc,EACAsH,kBAGF,OACE3Q,wBAACwH,EAAkB2J,SAAS,CAAAC,MAAOF,iBACjClR,EAAAA,QAAAkH,cAACnB,EAAkB,CACjBE,UAAWA,EACXC,MAAOA,EACPC,QAASA,EACTC,YAAaqH,GACbpH,eAAgBsH,GAChB7J,QAASyJ,GACTjH,cAAeA,EACfjH,UAAWgB,EAAaF,QACxBoG,mBAAoBqI,GACpBtP,YAAaA,GACbE,YAAa2J,EAAehJ,QAC5BV,qBAAsBA,GACtBC,aAAc4M,EACd9F,mBAAoBA,EACpBE,SAAUA,GAETV,GAIT,0BA5S+B,SAACqB,QAA+B,IAA/BA,IAAAA,EAA+B,CAAA,GAC7D,IAAMgK,EAAUC,EAAUA,WAAC9J,GAC3B,IAAK6J,EACH,MAAM,IAAIlF,MAAM,0DAGlB,IAAQlG,EAAwDoB,EAAxDpB,UAAWsC,EAA6ClB,EAA7CkB,cAAe/I,EAA8B6H,EAA9B7H,YAAgBH,6IAASkS,CAAKlK,EAALmK,GAwB3D,OAtBAxR,UAAMM,UAAU,WACV2F,GACFoL,EAAQjJ,aAAanC,EAEzB,EAAG,CAACoL,EAASpL,IAEbjG,EAAK,QAACM,UAAU,WACViI,GACF8I,EAAQ7I,iBAAiBD,EAE7B,EAAG,CAAC8I,EAAS9I,IAEbvI,EAAK,QAACM,UAAU,WACVd,GACF6R,EAAQV,eAAenR,EAE3B,EAAG,CAAC6R,EAAS7R,IAIb6R,EAAQhI,aAAahK,GAEdgS,EAAQ5F,YACjB"}
|
|
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/utils/text-only.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.5.11\";\n","import { useEffect } from \"react\";\nimport { useLocalParticipant, useDataChannel, useRoomContext } from \"@livekit/react-native\";\nimport { RoomEvent } from \"livekit-client\";\nimport type { LocalParticipant, RemoteParticipant } from \"livekit-client\";\nimport type {\n Callbacks,\n ClientToolsConfig,\n ClientToolCallEvent,\n ConversationEvent,\n AudioEventWithAlignment,\n} 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 onEndSession: (reason: \"user\" | \"agent\") => void;\n clientTools?: ClientToolsConfig[\"clientTools\"];\n updateCurrentEventId?: (eventId: number) => void;\n}\n\nexport function isValidEvent(event: unknown): event is ConversationEvent {\n return typeof event === \"object\" && event !== null && \"type\" in event;\n}\n\nfunction extractMessageText(event: ConversationEvent): string | null {\n switch (event.type) {\n case \"user_transcript\":\n return event.user_transcription_event.user_transcript;\n case \"agent_response\":\n return event.agent_response_event.agent_response;\n default:\n return null;\n }\n}\n\nexport const MessageHandler = ({\n onReady,\n isConnected,\n callbacks,\n sendMessage,\n clientTools = {},\n updateCurrentEventId,\n onEndSession,\n}: MessageHandlerProps) => {\n const { localParticipant } = useLocalParticipant();\n const room = useRoomContext();\n\n // Track agent response count for synthetic event IDs (WebRTC mode)\n const agentResponseCountRef = React.useRef(1);\n\n // Refs for callbacks to avoid unnecessary effect re-runs\n const onEndSessionRef = React.useRef(onEndSession);\n onEndSessionRef.current = onEndSession;\n const onReadyRef = React.useRef(onReady);\n onReadyRef.current = onReady;\n const callbacksRef = React.useRef(callbacks);\n callbacksRef.current = callbacks;\n\n // Detect agent disconnection\n useEffect(() => {\n const handleParticipantDisconnected = (participant: RemoteParticipant) => {\n if (participant.identity?.startsWith(\"agent\")) {\n onEndSessionRef.current(\"agent\");\n }\n };\n\n room.on(RoomEvent.ParticipantDisconnected, handleParticipantDisconnected);\n\n return () => {\n room.off(RoomEvent.ParticipantDisconnected, handleParticipantDisconnected);\n };\n }, [room]);\n\n // Reset agent response count when connection status changes\n useEffect(() => {\n if (!isConnected) {\n agentResponseCountRef.current = 1;\n }\n }, [isConnected]);\n\n useEffect(() => {\n if (isConnected && localParticipant) {\n onReadyRef.current(localParticipant);\n }\n }, [isConnected, localParticipant]);\n\n const handleClientToolCall = async (clientToolCall: ClientToolCallEvent) => {\n if (clientToolCall.client_tool_call.tool_name in clientTools) {\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 callbacksRef.current.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 (callbacksRef.current.onUnhandledClientToolCall) {\n callbacksRef.current.onUnhandledClientToolCall(clientToolCall.client_tool_call);\n return;\n }\n\n const errorMessage = `Client tool with name ${clientToolCall.client_tool_call.tool_name} is not defined on client`;\n callbacksRef.current.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 callbacksRef.current.onDebug?.({\n type: \"invalid_event\",\n message,\n });\n return;\n }\n\n const messageText = extractMessageText(message);\n if (messageText !== null) {\n callbacksRef.current.onMessage?.({\n message: messageText,\n source: message.type === \"user_transcript\" ? \"user\" : \"ai\",\n role: message.type === \"user_transcript\" ? \"user\" : \"agent\",\n });\n }\n\n if (msg.from?.isAgent) {\n callbacksRef.current.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 case \"audio\": {\n const audioEvent = message.audio_event as AudioEventWithAlignment;\n if (audioEvent.audio_base_64) {\n callbacksRef.current.onAudio?.(audioEvent.audio_base_64);\n }\n if (audioEvent.alignment) {\n callbacksRef.current.onAudioAlignment?.(audioEvent.alignment);\n }\n break;\n }\n case \"vad_score\":\n callbacksRef.current.onVadScore?.({\n vadScore: message.vad_score_event.vad_score,\n });\n break;\n case \"interruption\":\n callbacksRef.current.onInterruption?.(message.interruption_event);\n break;\n case \"mcp_tool_call\":\n callbacksRef.current.onMCPToolCall?.(message.mcp_tool_call);\n break;\n case \"mcp_connection_status\":\n callbacksRef.current.onMCPConnectionStatus?.(message.mcp_connection_status);\n break;\n case \"agent_tool_request\":\n callbacksRef.current.onAgentToolRequest?.(message.agent_tool_request);\n break;\n case \"agent_tool_response\":\n callbacksRef.current.onAgentToolResponse?.(message.agent_tool_response);\n\n if (message.agent_tool_response.tool_name === \"end_call\") {\n // End the call\n onEndSessionRef.current(\"agent\");\n }\n break;\n case \"conversation_initiation_metadata\":\n callbacksRef.current.onConversationMetadata?.(\n message.conversation_initiation_metadata_event\n );\n break;\n case \"asr_initiation_metadata\":\n callbacksRef.current.onAsrInitiationMetadata?.(\n message.asr_initiation_metadata_event\n );\n break;\n case \"agent_chat_response_part\":\n callbacksRef.current.onAgentChatResponsePart?.(message.text_response_part);\n break;\n default:\n callbacksRef.current.onDebug?.(message);\n break;\n }\n });\n\n return null;\n};\n","// @ts-nocheck - pnpm hoisting causes duplicate React type definitions\nimport React from 'react';\nimport { LiveKitRoom } from '@livekit/react-native';\nimport type { LocalParticipant } from 'livekit-client';\nimport type { Callbacks, ClientToolsConfig, AudioSessionConfig } 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 onEndSession: (reason?: \"user\" | \"agent\") => void;\n updateCurrentEventId?: (eventId: number) => void;\n audioSessionConfig?: AudioSessionConfig;\n textOnly?: boolean;\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 onEndSession,\n audioSessionConfig,\n textOnly = false,\n}: LiveKitRoomWrapperProps) => {\n // Configure audio options based on audioSessionConfig\n const audioOptions = React.useMemo(() => {\n if (textOnly) {\n // For now, we have to enable an audio session (even for text only conversations) to be able to send messages.\n return true;\n }\n\n if (!audioSessionConfig?.allowMixingWithOthers) {\n return true;\n }\n\n // When mixing is enabled, configure audio to allow concurrent playback\n return {\n audio: {\n noiseSuppression: true,\n echoCancellation: true,\n },\n audioSessionConfiguration: {\n allowMixingWithOthers: true,\n },\n };\n }, [audioSessionConfig, textOnly]);\n\n return (\n <LiveKitRoom\n serverUrl={serverUrl}\n token={token}\n connect={connect}\n audio={audioOptions}\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 onEndSession={onEndSession}\n />\n {children as any}\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, AudioSessionConfig } 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: (reason?: \"user\" | \"agent\") => 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 React.useEffect(() => {\n if (clientTools) {\n context.setClientTools(clientTools);\n }\n }, [context, clientTools]);\n\n // Update callbacks - since this only updates a ref, it's safe to call on every render\n // and doesn't cause re-renders of the provider or its consumers\n context.setCallbacks(callbacks);\n\n return context.conversation;\n};\n\ninterface ElevenLabsProviderProps {\n children: React.ReactNode;\n audioSessionConfig?: AudioSessionConfig;\n}\n\nexport const ElevenLabsProvider: React.FC<ElevenLabsProviderProps> = ({ children, audioSessionConfig }) => {\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 textOnly,\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, status, textOnly);\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 setIsSpeaking(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 = React.useCallback(() => conversationId, [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 const overridesEvent = constructOverrides({\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n });\n\n if (overridesEvent) {\n try {\n const encoder = new TextEncoder();\n const data = encoder.encode(JSON.stringify(overridesEvent));\n participant.publishData(data, { reliable: true });\n } catch (error) {\n console.error(\"Failed to send overrides:\", error);\n callbacksRef.current.onError?.(error as string);\n }\n }\n }, [handleParticipantReady, overrides, customLlmExtraBody, dynamicVariables, userId, callbacksRef]);\n\n // Create setClientTools function that only updates ref\n const setClientTools = React.useCallback((tools: ClientToolsConfig['clientTools']) => {\n clientToolsRef.current = tools;\n }, []);\n\n // Memoize inline callback functions\n const sendContextualUpdate = React.useCallback((text: string) => {\n sendMessage({\n type: \"contextual_update\",\n text,\n });\n }, [sendMessage]);\n\n const sendUserMessage = React.useCallback((text: string) => {\n sendMessage({\n type: \"user_message\",\n text,\n });\n }, [sendMessage]);\n\n const sendUserActivity = React.useCallback(() => {\n sendMessage({\n type: \"user_activity\",\n });\n }, [sendMessage]);\n\n // Store all conversation values/functions in refs for stable access\n const conversationValuesRef = React.useRef({\n startSession,\n endSession,\n status,\n isSpeaking,\n canSendFeedback,\n getId,\n setMicMuted,\n sendFeedback,\n sendContextualUpdate,\n sendUserMessage,\n sendUserActivity,\n });\n\n // Update ref on every render\n conversationValuesRef.current = {\n startSession,\n endSession,\n status,\n isSpeaking,\n canSendFeedback,\n getId,\n setMicMuted,\n sendFeedback,\n sendContextualUpdate,\n sendUserMessage,\n sendUserActivity,\n };\n\n // Create a stable conversation object that never changes reference\n // This prevents infinite loops when conversation is used in useEffect dependencies\n const conversation = React.useMemo<Conversation>(() => ({\n get startSession() { return conversationValuesRef.current.startSession; },\n get endSession() { return conversationValuesRef.current.endSession; },\n get status() { return conversationValuesRef.current.status; },\n get isSpeaking() { return conversationValuesRef.current.isSpeaking; },\n get canSendFeedback() { return conversationValuesRef.current.canSendFeedback; },\n get getId() { return conversationValuesRef.current.getId; },\n get setMicMuted() { return conversationValuesRef.current.setMicMuted; },\n get sendFeedback() { return conversationValuesRef.current.sendFeedback; },\n get sendContextualUpdate() { return conversationValuesRef.current.sendContextualUpdate; },\n get sendUserMessage() { return conversationValuesRef.current.sendUserMessage; },\n get sendUserActivity() { return conversationValuesRef.current.sendUserActivity; },\n }), []); // Empty deps - object is created once and never recreated\n\n // Memoize the context value to prevent unnecessary re-renders of consumers\n const contextValue = React.useMemo<ElevenLabsContextType>(() => ({\n conversation,\n callbacksRef,\n serverUrl,\n tokenFetchUrl,\n clientTools: clientToolsRef.current,\n setCallbacks,\n setServerUrl,\n setTokenFetchUrl,\n setClientTools,\n }), [\n conversation,\n callbacksRef,\n serverUrl,\n tokenFetchUrl,\n setCallbacks,\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 onEndSession={endSession}\n audioSessionConfig={audioSessionConfig}\n textOnly={textOnly}\n >\n {children}\n </LiveKitRoomWrapper>\n </ElevenLabsContext.Provider>\n );\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\";\nimport { isTextOnly } from \"../utils/text-only\";\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 const [textOnly, setTextOnly] =\n useState<ConversationConfig[\"textOnly\"]>(false);\n\n const startSession = useCallback(\n async (config: ConversationConfig) => {\n try {\n setStatus(\"connecting\");\n callbacksRef.current.onStatusChange?.({ status: \"connecting\" });\n\n const textOnly = isTextOnly(config);\n\n setOverrides({\n ...config.overrides,\n conversation: {\n ...config.overrides?.conversation,\n textOnly,\n },\n });\n setCustomLlmExtraBody(config.customLlmExtraBody || null);\n setDynamicVariables(config.dynamicVariables || {});\n setUserId(config.userId);\n setTextOnly(textOnly);\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 setTextOnly,\n tokenFetchUrl,\n ]\n );\n\n const endSession = useCallback(\n async (reason: \"user\" | \"agent\" = \"user\") => {\n try {\n setConnect(false);\n setToken(\"\");\n setStatus(\"disconnected\");\n\n // Reset session configuration state\n setOverrides({});\n setCustomLlmExtraBody(null);\n setDynamicVariables({});\n setUserId(undefined);\n setConversationId(\"\");\n\n callbacksRef.current.onStatusChange?.({ status: \"disconnected\" });\n callbacksRef.current.onDisconnect?.({ reason });\n } catch (error) {\n callbacksRef.current.onError?.(error as string);\n throw error;\n }\n },\n [callbacksRef, setConnect, setToken, setStatus, setConversationId]\n );\n\n return {\n startSession,\n endSession,\n overrides,\n customLlmExtraBody,\n dynamicVariables,\n userId,\n textOnly,\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 try {\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 if (\n typeof data.detail === \"object\" &&\n data.detail !== null &&\n typeof data.detail.message === \"string\"\n ) {\n throw new Error(data.detail.message);\n }\n throw new Error(\"Missing error details or message\");\n }\n\n if (!data.token) {\n throw new Error(\"No conversation token received from API\");\n }\n\n return data.token;\n } catch (error) {\n throw new Error(\n `Failed to get conversation token: ${error instanceof Error ? error.message : \"No message\"}`\n );\n }\n};\n","import { ConversationConfig } from \"../types\";\n\n// Note: This function is copied from the client package (see BaseConversation.ts)\nexport function isTextOnly(options: ConversationConfig): boolean | undefined {\n const { textOnly: textOnlyOverride } = options.overrides?.conversation ?? {};\n const { textOnly } = options;\n if (typeof textOnly === \"boolean\") {\n if (\n typeof textOnlyOverride === \"boolean\" &&\n textOnly !== textOnlyOverride\n ) {\n console.warn(\n `Conflicting textOnly options provided: ${textOnly} via options.textOnly (will be used) and ${textOnlyOverride} via options.overrides.conversation.textOnly (will be ignored)`\n );\n }\n return textOnly;\n } else if (typeof textOnlyOverride === \"boolean\") {\n return textOnlyOverride;\n } else {\n return undefined;\n }\n}\n","import { useState, useEffect, useCallback, useRef } 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 status: ConversationStatus,\n textOnly: boolean = false\n) => {\n const [roomConnected, setRoomConnected] = useState(false);\n const [localParticipant, setLocalParticipant] =\n useState<LocalParticipant | null>(null);\n const hasCalledOnConnectRef = useRef(false);\n const audioSessionActiveRef = useRef(false);\n\n // Reset room state when conversationId changes (new session starting)\n useEffect(() => {\n if (conversationId) {\n setRoomConnected(false);\n setLocalParticipant(null);\n hasCalledOnConnectRef.current = false;\n }\n }, [conversationId]);\n\n useEffect(() => {\n const shouldHaveAudio = !textOnly && !!conversationId;\n\n if (shouldHaveAudio && !audioSessionActiveRef.current) {\n audioSessionActiveRef.current = true;\n AudioSession.startAudioSession();\n } else if (!shouldHaveAudio && audioSessionActiveRef.current) {\n audioSessionActiveRef.current = false;\n AudioSession.stopAudioSession();\n }\n\n return () => {\n if (audioSessionActiveRef.current) {\n audioSessionActiveRef.current = false;\n AudioSession.stopAudioSession();\n }\n };\n }, [textOnly, conversationId]);\n\n // Fire onConnect when both participant and room are fully ready\n useEffect(() => {\n if (localParticipant && roomConnected && !hasCalledOnConnectRef.current) {\n hasCalledOnConnectRef.current = true;\n callbacksRef.current.onConnect?.({ conversationId });\n }\n }, [localParticipant, roomConnected, conversationId, callbacksRef]);\n\n const handleParticipantReady = useCallback(\n (participant: LocalParticipant) => {\n if (localParticipant) {\n return;\n }\n\n setLocalParticipant(participant);\n setStatus(\"connected\");\n },\n [localParticipant, setStatus]\n );\n\n const handleConnected = useCallback(() => {\n setRoomConnected(true);\n }, []);\n\n const handleDisconnected = useCallback(() => {\n // If already disconnected, endSession already handled the disconnect callback\n if (status === \"disconnected\") {\n return;\n }\n\n setRoomConnected(false);\n setStatus(\"disconnected\");\n setLocalParticipant(null);\n hasCalledOnConnectRef.current = false;\n callbacksRef.current.onDisconnect?.({ reason: \"user\" });\n }, [callbacksRef, setStatus, status]);\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 speed: config.overrides.tts?.speed,\n stability: config.overrides.tts?.stability,\n similarity_boost: config.overrides.tts?.similarityBoost,\n },\n conversation: {\n text_only: config.overrides.conversation?.textOnly,\n },\n };\n }\n\n overridesEvent.source_info = {\n source: \"react_native_sdk\",\n version: config.overrides?.client?.version || PACKAGE_VERSION,\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","onEndSession","localParticipant","useLocalParticipant","room","useRoomContext","agentResponseCountRef","React","useRef","onEndSessionRef","current","onReadyRef","callbacksRef","useEffect","handleParticipantDisconnected","participant","_participant$identity","identity","startsWith","on","RoomEvent","ParticipantDisconnected","off","useDataChannel","msg","_msg$from","decoder","TextDecoder","message","JSON","parse","decode","payload","event","_msg$from2","messageText","type","user_transcription_event","user_transcript","agent_response_event","agent_response","extractMessageText","onMessage","source","role","from","isAgent","onModeChange","mode","isSpeaking","eventId","event_id","ping_event","clientToolCall","Promise","resolve","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","audioEvent","audio_event","audio_base_64","onAudio","alignment","onAudioAlignment","onVadScore","vadScore","vad_score_event","vad_score","onInterruption","interruption_event","onMCPToolCall","mcp_tool_call","onMCPConnectionStatus","mcp_connection_status","onAgentToolRequest","agent_tool_request","onAgentToolResponse","agent_tool_response","onConversationMetadata","conversation_initiation_metadata_event","onAsrInitiationMetadata","asr_initiation_metadata_event","onAgentChatResponsePart","text_response_part","onDebug","LiveKitRoomWrapper","children","serverUrl","token","connect","onConnected","onDisconnected","roomConnected","onParticipantReady","audioSessionConfig","_ref$textOnly","textOnly","audioOptions","useMemo","allowMixingWithOthers","audio","noiseSuppression","echoCancellation","audioSessionConfiguration","createElement","LiveKitRoom","video","options","adaptiveStream","pixelDensity","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","setCallbacks","useCallback","useConversationCallbacks","setCallbacksBase","wrappedCallbacks","_extends","_useConversationSessi","overrides","setOverrides","customLlmExtraBody","setCustomLlmExtraBody","dynamicVariables","setDynamicVariables","userId","setUserId","setTextOnly","startSession","config","_config$overrides","_temp2","_result2","extractedConversationId","_tokenPayload$video","_roomId$match","atob","split","match","error","console","warn","extractConversationIdFromToken","conversationToken","onStatusChange","_options$overrides$co","_options$overrides","textOnlyOverride","conversation","isTextOnly","agentId","info","fetch","response","json","data","ok","detail","Error","getConversationToken","_getConversationToken","endSession","reason","onDisconnect","useConversationSession","_useLiveKitRoom","setRoomConnected","setLocalParticipant","hasCalledOnConnectRef","audioSessionActiveRef","shouldHaveAudio","AudioSession","startAudioSession","stopAudioSession","onConnect","handleParticipantReady","handleConnected","handleDisconnected","handleError","useLiveKitRoom","handleConnectedWithFeedback","onCanSendFeedbackChange","handleDisconnectedWithFeedback","_useMessageSending","TextEncoder","encode","publishData","reliable","useMessageSending","updateCanSendFeedback","newCanSendFeedback","sendFeedback","like","score","volume","getId","setMicMuted","muted","setMicrophoneEnabled","handleParticipantReadyWithOverrides","overridesEvent","_config$overrides$age","_config$overrides$age2","_config$overrides$age3","_config$overrides$tts","_config$overrides$tts2","_config$overrides$tts3","_config$overrides$tts4","_config$overrides$con","conversation_config_override","agent","prompt","first_message","firstMessage","language","tts","voice_id","voiceId","speed","stability","similarity_boost","similarityBoost","text_only","source_info","version","client","custom_llm_extra_body","dynamic_variables","user_id","constructOverrides","setClientTools","tools","sendContextualUpdate","text","sendUserMessage","sendUserActivity","conversationValuesRef","contextValue","Provider","value","context","useContext","_objectWithoutPropertiesLoose","_excluded"],"mappings":"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"}
|
package/dist/lib.modern.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import e,{useRef as n,useCallback as t,useState as r,useEffect as o,useContext as s,createContext as a}from"react";import{AudioSession as c,useLocalParticipant as l,useRoomContext as i,useDataChannel as u,LiveKitRoom as d,registerGlobals as v}from"@livekit/react-native";import{RoomEvent as g}from"livekit-client";function _(){return _=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},_.apply(null,arguments)}const p="0.5.9",b=({onReady:n,isConnected:t,callbacks:r,sendMessage:s,clientTools:a={},updateCurrentEventId:c,onEndSession:d})=>{const{localParticipant:v}=l(),_=i(),p=e.useRef(1),b=e.useRef(d);b.current=d;const m=e.useRef(n);m.current=n;const C=e.useRef(r);return C.current=r,o(()=>{const e=e=>{var n;null!=(n=e.identity)&&n.startsWith("agent")&&b.current("agent")};return _.on(g.ParticipantDisconnected,e),()=>{_.off(g.ParticipantDisconnected,e)}},[_]),o(()=>{t||(p.current=1)},[t]),o(()=>{t&&v&&m.current(v)},[t,v]),u(e=>{var n;const t=new TextDecoder,r=JSON.parse(t.decode(e.payload));if("object"!=typeof(o=r)||null===o||!("type"in o))return void(null==C.current.onDebug||C.current.onDebug({type:"invalid_event",message:r}));var o;const l=function(e){switch(e.type){case"user_transcript":return e.user_transcription_event.user_transcript;case"agent_response":return e.agent_response_event.agent_response;default:return null}}(r);var i;if(null!==l&&(null==C.current.onMessage||C.current.onMessage({message:l,source:"user_transcript"===r.type?"user":"ai",role:"user_transcript"===r.type?"user":"agent"})),null!=(n=e.from)&&n.isAgent&&(null==C.current.onModeChange||C.current.onModeChange({mode:null!=(i=e.from)&&i.isSpeaking?"speaking":"listening"}),"agent_response"===r.type&&c)){const e=p.current++;c(e)}switch(r.type){case"ping":s({type:"pong",event_id:r.ping_event.event_id});break;case"client_tool_call":(async e=>{if(e.client_tool_call.tool_name in a)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.",r="object"==typeof t?JSON.stringify(t):String(t);s({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:r,is_error:!1})}catch(n){null==C.current.onError||C.current.onError(`Client tool execution failed with following error: ${null==n?void 0:n.message}`,{clientToolName:e.client_tool_call.tool_name}),s({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(C.current.onUnhandledClientToolCall)return void C.current.onUnhandledClientToolCall(e.client_tool_call);const n=`Client tool with name ${e.client_tool_call.tool_name} is not defined on client`;null==C.current.onError||C.current.onError(n,{clientToolName:e.client_tool_call.tool_name}),s({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:n,is_error:!0})}})(r);break;case"audio":{const e=r.audio_event;e.audio_base_64&&(null==C.current.onAudio||C.current.onAudio(e.audio_base_64)),e.alignment&&(null==C.current.onAudioAlignment||C.current.onAudioAlignment(e.alignment));break}case"vad_score":null==C.current.onVadScore||C.current.onVadScore({vadScore:r.vad_score_event.vad_score});break;case"interruption":null==C.current.onInterruption||C.current.onInterruption(r.interruption_event);break;case"mcp_tool_call":null==C.current.onMCPToolCall||C.current.onMCPToolCall(r.mcp_tool_call);break;case"mcp_connection_status":null==C.current.onMCPConnectionStatus||C.current.onMCPConnectionStatus(r.mcp_connection_status);break;case"agent_tool_request":null==C.current.onAgentToolRequest||C.current.onAgentToolRequest(r.agent_tool_request);break;case"agent_tool_response":null==C.current.onAgentToolResponse||C.current.onAgentToolResponse(r.agent_tool_response),"end_call"===r.agent_tool_response.tool_name&&b.current("agent");break;case"conversation_initiation_metadata":null==C.current.onConversationMetadata||C.current.onConversationMetadata(r.conversation_initiation_metadata_event);break;case"asr_initiation_metadata":null==C.current.onAsrInitiationMetadata||C.current.onAsrInitiationMetadata(r.asr_initiation_metadata_event);break;case"agent_chat_response_part":null==C.current.onAgentChatResponsePart||C.current.onAgentChatResponsePart(r.text_response_part);break;default:null==C.current.onDebug||C.current.onDebug(r)}}),null},m=({children:n,serverUrl:t,token:r,connect:o,onConnected:s,onDisconnected:a,onError:c,roomConnected:l,callbacks:i,onParticipantReady:u,sendMessage:v,clientTools:g,updateCurrentEventId:_,onEndSession:p,audioSessionConfig:m,textOnly:C=!1})=>{const k=e.useMemo(()=>!C&&(null==m||!m.allowMixingWithOthers||{audio:{noiseSuppression:!0,echoCancellation:!0},audioSessionConfiguration:{allowMixingWithOthers:!0}}),[m,C]);/*#__PURE__*/return e.createElement(d,{serverUrl:t,token:r,connect:o,audio:k,video:!1,options:{adaptiveStream:{pixelDensity:"screen"}},onConnected:s,onDisconnected:a,onError:c},/*#__PURE__*/e.createElement(b,{onReady:u,isConnected:l,callbacks:i,sendMessage:v,clientTools:g,updateCurrentEventId:_,onEndSession:p}),n)},C=["serverUrl","tokenFetchUrl","clientTools"],k=/*#__PURE__*/a(null),y=(n={})=>{const t=s(k);if(!t)throw new Error("useConversation must be used within ElevenLabsProvider");const{serverUrl:r,tokenFetchUrl:o,clientTools:a}=n,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,C);return e.useEffect(()=>{r&&t.setServerUrl(r)},[t,r]),e.useEffect(()=>{o&&t.setTokenFetchUrl(o)},[t,o]),e.useEffect(()=>{a&&t.setClientTools(a)},[t,a]),t.setCallbacks(c),t.conversation},f=({children:s,audioSessionConfig:a})=>{v();const[l,i]=r(""),[u,d]=r(!1),[g,b]=r("disconnected"),[C,y]=r("wss://livekit.rtc.elevenlabs.io"),[f,h]=r(void 0),[S,E]=r(""),[M,w]=r(!1),[x,T]=r(!1),U=e.useRef(1),I=e.useRef(1),R=e.useRef({}),{callbacksRef:A,setCallbacks:F}=(()=>{const e=n({}),r=t(n=>{e.current=n},[]);return{callbacksRef:e,setCallbacks:r}})(),O=e.useCallback(e=>{const n=_({},e,{onModeChange:n=>{w("speaking"===n.mode),null==e.onModeChange||e.onModeChange(n)}});F(n)},[F]),{startSession:D,endSession:P,overrides:N,customLlmExtraBody:V,dynamicVariables:$,userId:L,textOnly:B}=((e,n,o,s,a,c)=>{const[l,i]=r({}),[u,d]=r(null),[v,g]=r({}),[b,m]=r(void 0),[C,k]=r(!1),y=t(async t=>{try{var r;n("connecting"),null==e.current.onStatusChange||e.current.onStatusChange({status:"connecting"});const l=function(e){var n,t;const{textOnly:r}=null!=(n=null==(t=e.overrides)?void 0:t.conversation)?n:{},{textOnly:o}=e;return"boolean"==typeof o?("boolean"==typeof r&&o!==r&&console.warn(`Conflicting textOnly options provided: ${o} via options.textOnly (will be used) and ${r} via options.overrides.conversation.textOnly (will be ignored)`),o):"boolean"==typeof r?r:void 0}(t);let u;if(i(_({},t.overrides,{conversation:_({},null==(r=t.overrides)?void 0:r.conversation,{textOnly:l})})),d(t.customLlmExtraBody||null),g(t.dynamicVariables||{}),m(t.userId),k(l),t.conversationToken)u=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;u=await(async(e,n)=>{try{const t=n||"https://api.elevenlabs.io/v1/convai/conversation/token",r=await fetch(`${t}?agent_id=${e}&source=react_native_sdk&version=${p}`),o=await r.json();if(!r.ok){if("object"==typeof o.detail&&null!==o.detail&&"string"==typeof o.detail.message)throw new Error(o.detail.message);throw new Error("Missing error details or message")}if(!o.token)throw new Error("No conversation token received from API");return o.token}catch(e){throw new Error(`Failed to get conversation token: ${e instanceof Error?e.message:"No message"}`)}})(t.agentId,e)}}const v=(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"),""}})(u);a(v),s(u),o(!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,o,s,a,k,c]);return{startSession:y,endSession:t(async(t="user")=>{try{o(!1),s(""),n("disconnected"),i({}),d(null),g({}),m(void 0),a(""),null==e.current.onStatusChange||e.current.onStatusChange({status:"disconnected"}),null==e.current.onDisconnect||e.current.onDisconnect({reason:t})}catch(n){throw null==e.current.onError||e.current.onError(n),n}},[e,o,s,n,a]),overrides:l,customLlmExtraBody:u,dynamicVariables:v,userId:b,textOnly:C}})(A,b,d,i,E,f),{roomConnected:j,localParticipant:q,handleParticipantReady:J,handleConnected:W,handleDisconnected:K,handleError:z}=((e,s,a,l,i=!1)=>{const[u,d]=r(!1),[v,g]=r(null),_=n(!1),p=n(!1);o(()=>{a&&(d(!1),g(null),_.current=!1)},[a]),o(()=>{const e=!i&&!!a;return e&&!p.current?(p.current=!0,c.startAudioSession()):!e&&p.current&&(p.current=!1,c.stopAudioSession()),()=>{p.current&&(p.current=!1,c.stopAudioSession())}},[i,a]),o(()=>{v&&u&&!_.current&&(_.current=!0,null==e.current.onConnect||e.current.onConnect({conversationId:a}))},[v,u,a,e]);const b=t(e=>{v||(g(e),s("connected"))},[v,s]),m=t(()=>{d(!0)},[]),C=t(()=>{"disconnected"!==l&&(d(!1),s("disconnected"),g(null),_.current=!1,null==e.current.onDisconnect||e.current.onDisconnect({reason:"user"}))},[e,s,l]),k=t(n=>{console.error("LiveKit error:",n),null==e.current.onError||e.current.onError(n.message,void 0)},[e]);return{roomConnected:u,localParticipant:v,handleParticipantReady:b,handleConnected:m,handleDisconnected:C,handleError:k}})(A,b,S,g,B),G=e.useCallback(()=>{U.current=1,I.current=1,T(!1),null==A.current.onCanSendFeedbackChange||A.current.onCanSendFeedbackChange({canSendFeedback:!1}),W()},[W,A]),Z=e.useCallback(()=>{T(!1),w(!1),K()},[K]),{sendMessage:H}=((e,n,r)=>({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==r.current.onError||r.current.onError(e)}else console.warn("Cannot send message: room not connected or no local participant")},[e,n,r])}))(g,q,A),Q=e.useCallback(()=>{const e=U.current!==I.current;x!==e&&(T(e),null==A.current.onCanSendFeedbackChange||A.current.onCanSendFeedbackChange({canSendFeedback:e}))},[x,A]),X=e.useCallback(e=>{x?(H({type:"feedback",score:e?"like":"dislike",event_id:U.current}),I.current=U.current,Q()):console.warn(0===I.current?"Cannot send feedback: the conversation has not started yet.":"Cannot send feedback: feedback has already been sent for the current response.")},[x,H,Q]);e.useCallback(e=>{console.warn("setVolume is not yet implemented in React Native SDK")},[]);const Y=e.useCallback(()=>S,[S]),ee=e.useCallback(e=>{q&&q.setMicrophoneEnabled(!e)},[q]),ne=e.useCallback(e=>{U.current=e,Q()},[Q]),te=e.useCallback(e=>{J(e);const n=function(e){var n;const t={type:"conversation_initiation_client_data"};var r,o,s,a,c,l,i,u;return e.overrides&&(t.conversation_config_override={agent:{prompt:null==(r=e.overrides.agent)?void 0:r.prompt,first_message:null==(o=e.overrides.agent)?void 0:o.firstMessage,language:null==(s=e.overrides.agent)?void 0:s.language},tts:{voice_id:null==(a=e.overrides.tts)?void 0:a.voiceId,speed:null==(c=e.overrides.tts)?void 0:c.speed,stability:null==(l=e.overrides.tts)?void 0:l.stability,similarity_boost:null==(i=e.overrides.tts)?void 0:i.similarityBoost},conversation:{text_only:null==(u=e.overrides.conversation)?void 0:u.textOnly}}),t.source_info={source:"react_native_sdk",version:(null==(n=e.overrides)||null==(n=n.client)?void 0:n.version)||p},e.customLlmExtraBody&&(t.custom_llm_extra_body=e.customLlmExtraBody),e.dynamicVariables&&(t.dynamic_variables=e.dynamicVariables),e.userId&&(t.user_id=String(e.userId)),t}({overrides:N,customLlmExtraBody:V,dynamicVariables:$,userId:L});if(n)try{const t=(new TextEncoder).encode(JSON.stringify(n));e.publishData(t,{reliable:!0})}catch(e){console.error("Failed to send overrides:",e),null==A.current.onError||A.current.onError(e)}},[J,N,V,$,L,A]),re=e.useCallback(e=>{R.current=e},[]),oe=e.useCallback(e=>{H({type:"contextual_update",text:e})},[H]),se=e.useCallback(e=>{H({type:"user_message",text:e})},[H]),ae=e.useCallback(()=>{H({type:"user_activity"})},[H]),ce=e.useRef({startSession:D,endSession:P,status:g,isSpeaking:M,canSendFeedback:x,getId:Y,setMicMuted:ee,sendFeedback:X,sendContextualUpdate:oe,sendUserMessage:se,sendUserActivity:ae});ce.current={startSession:D,endSession:P,status:g,isSpeaking:M,canSendFeedback:x,getId:Y,setMicMuted:ee,sendFeedback:X,sendContextualUpdate:oe,sendUserMessage:se,sendUserActivity:ae};const le=e.useMemo(()=>({get startSession(){return ce.current.startSession},get endSession(){return ce.current.endSession},get status(){return ce.current.status},get isSpeaking(){return ce.current.isSpeaking},get canSendFeedback(){return ce.current.canSendFeedback},get getId(){return ce.current.getId},get setMicMuted(){return ce.current.setMicMuted},get sendFeedback(){return ce.current.sendFeedback},get sendContextualUpdate(){return ce.current.sendContextualUpdate},get sendUserMessage(){return ce.current.sendUserMessage},get sendUserActivity(){return ce.current.sendUserActivity}}),[]),ie=e.useMemo(()=>({conversation:le,callbacksRef:A,serverUrl:C,tokenFetchUrl:f,clientTools:R.current,setCallbacks:O,setServerUrl:y,setTokenFetchUrl:h,setClientTools:re}),[le,A,C,f,O,re]);/*#__PURE__*/return e.createElement(k.Provider,{value:ie},/*#__PURE__*/e.createElement(m,{serverUrl:C,token:l,connect:u,onConnected:G,onDisconnected:Z,onError:z,roomConnected:j,callbacks:A.current,onParticipantReady:te,sendMessage:H,clientTools:R.current,updateCurrentEventId:ne,onEndSession:P,audioSessionConfig:a,textOnly:B},s))};export{f as ElevenLabsProvider,y as useConversation};
|
|
1
|
+
import e,{useRef as n,useCallback as t,useState as r,useEffect as o,useContext as s,createContext as a}from"react";import{AudioSession as c,useLocalParticipant as l,useRoomContext as i,useDataChannel as u,LiveKitRoom as d,registerGlobals as v}from"@livekit/react-native";import{RoomEvent as g}from"livekit-client";function _(){return _=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},_.apply(null,arguments)}const p="0.5.11",b=({onReady:n,isConnected:t,callbacks:r,sendMessage:s,clientTools:a={},updateCurrentEventId:c,onEndSession:d})=>{const{localParticipant:v}=l(),_=i(),p=e.useRef(1),b=e.useRef(d);b.current=d;const m=e.useRef(n);m.current=n;const C=e.useRef(r);return C.current=r,o(()=>{const e=e=>{var n;null!=(n=e.identity)&&n.startsWith("agent")&&b.current("agent")};return _.on(g.ParticipantDisconnected,e),()=>{_.off(g.ParticipantDisconnected,e)}},[_]),o(()=>{t||(p.current=1)},[t]),o(()=>{t&&v&&m.current(v)},[t,v]),u(e=>{var n;const t=new TextDecoder,r=JSON.parse(t.decode(e.payload));if("object"!=typeof(o=r)||null===o||!("type"in o))return void(null==C.current.onDebug||C.current.onDebug({type:"invalid_event",message:r}));var o;const l=function(e){switch(e.type){case"user_transcript":return e.user_transcription_event.user_transcript;case"agent_response":return e.agent_response_event.agent_response;default:return null}}(r);var i;if(null!==l&&(null==C.current.onMessage||C.current.onMessage({message:l,source:"user_transcript"===r.type?"user":"ai",role:"user_transcript"===r.type?"user":"agent"})),null!=(n=e.from)&&n.isAgent&&(null==C.current.onModeChange||C.current.onModeChange({mode:null!=(i=e.from)&&i.isSpeaking?"speaking":"listening"}),"agent_response"===r.type&&c)){const e=p.current++;c(e)}switch(r.type){case"ping":s({type:"pong",event_id:r.ping_event.event_id});break;case"client_tool_call":(async e=>{if(e.client_tool_call.tool_name in a)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.",r="object"==typeof t?JSON.stringify(t):String(t);s({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:r,is_error:!1})}catch(n){null==C.current.onError||C.current.onError(`Client tool execution failed with following error: ${null==n?void 0:n.message}`,{clientToolName:e.client_tool_call.tool_name}),s({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(C.current.onUnhandledClientToolCall)return void C.current.onUnhandledClientToolCall(e.client_tool_call);const n=`Client tool with name ${e.client_tool_call.tool_name} is not defined on client`;null==C.current.onError||C.current.onError(n,{clientToolName:e.client_tool_call.tool_name}),s({type:"client_tool_result",tool_call_id:e.client_tool_call.tool_call_id,result:n,is_error:!0})}})(r);break;case"audio":{const e=r.audio_event;e.audio_base_64&&(null==C.current.onAudio||C.current.onAudio(e.audio_base_64)),e.alignment&&(null==C.current.onAudioAlignment||C.current.onAudioAlignment(e.alignment));break}case"vad_score":null==C.current.onVadScore||C.current.onVadScore({vadScore:r.vad_score_event.vad_score});break;case"interruption":null==C.current.onInterruption||C.current.onInterruption(r.interruption_event);break;case"mcp_tool_call":null==C.current.onMCPToolCall||C.current.onMCPToolCall(r.mcp_tool_call);break;case"mcp_connection_status":null==C.current.onMCPConnectionStatus||C.current.onMCPConnectionStatus(r.mcp_connection_status);break;case"agent_tool_request":null==C.current.onAgentToolRequest||C.current.onAgentToolRequest(r.agent_tool_request);break;case"agent_tool_response":null==C.current.onAgentToolResponse||C.current.onAgentToolResponse(r.agent_tool_response),"end_call"===r.agent_tool_response.tool_name&&b.current("agent");break;case"conversation_initiation_metadata":null==C.current.onConversationMetadata||C.current.onConversationMetadata(r.conversation_initiation_metadata_event);break;case"asr_initiation_metadata":null==C.current.onAsrInitiationMetadata||C.current.onAsrInitiationMetadata(r.asr_initiation_metadata_event);break;case"agent_chat_response_part":null==C.current.onAgentChatResponsePart||C.current.onAgentChatResponsePart(r.text_response_part);break;default:null==C.current.onDebug||C.current.onDebug(r)}}),null},m=({children:n,serverUrl:t,token:r,connect:o,onConnected:s,onDisconnected:a,onError:c,roomConnected:l,callbacks:i,onParticipantReady:u,sendMessage:v,clientTools:g,updateCurrentEventId:_,onEndSession:p,audioSessionConfig:m,textOnly:C=!1})=>{const k=e.useMemo(()=>!!C||null==m||!m.allowMixingWithOthers||{audio:{noiseSuppression:!0,echoCancellation:!0},audioSessionConfiguration:{allowMixingWithOthers:!0}},[m,C]);/*#__PURE__*/return e.createElement(d,{serverUrl:t,token:r,connect:o,audio:k,video:!1,options:{adaptiveStream:{pixelDensity:"screen"}},onConnected:s,onDisconnected:a,onError:c},/*#__PURE__*/e.createElement(b,{onReady:u,isConnected:l,callbacks:i,sendMessage:v,clientTools:g,updateCurrentEventId:_,onEndSession:p}),n)},C=["serverUrl","tokenFetchUrl","clientTools"],k=/*#__PURE__*/a(null),y=(n={})=>{const t=s(k);if(!t)throw new Error("useConversation must be used within ElevenLabsProvider");const{serverUrl:r,tokenFetchUrl:o,clientTools:a}=n,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,C);return e.useEffect(()=>{r&&t.setServerUrl(r)},[t,r]),e.useEffect(()=>{o&&t.setTokenFetchUrl(o)},[t,o]),e.useEffect(()=>{a&&t.setClientTools(a)},[t,a]),t.setCallbacks(c),t.conversation},f=({children:s,audioSessionConfig:a})=>{v();const[l,i]=r(""),[u,d]=r(!1),[g,b]=r("disconnected"),[C,y]=r("wss://livekit.rtc.elevenlabs.io"),[f,h]=r(void 0),[S,E]=r(""),[M,w]=r(!1),[x,T]=r(!1),U=e.useRef(1),I=e.useRef(1),R=e.useRef({}),{callbacksRef:A,setCallbacks:F}=(()=>{const e=n({}),r=t(n=>{e.current=n},[]);return{callbacksRef:e,setCallbacks:r}})(),O=e.useCallback(e=>{const n=_({},e,{onModeChange:n=>{w("speaking"===n.mode),null==e.onModeChange||e.onModeChange(n)}});F(n)},[F]),{startSession:D,endSession:P,overrides:N,customLlmExtraBody:V,dynamicVariables:$,userId:L,textOnly:B}=((e,n,o,s,a,c)=>{const[l,i]=r({}),[u,d]=r(null),[v,g]=r({}),[b,m]=r(void 0),[C,k]=r(!1),y=t(async t=>{try{var r;n("connecting"),null==e.current.onStatusChange||e.current.onStatusChange({status:"connecting"});const l=function(e){var n,t;const{textOnly:r}=null!=(n=null==(t=e.overrides)?void 0:t.conversation)?n:{},{textOnly:o}=e;return"boolean"==typeof o?("boolean"==typeof r&&o!==r&&console.warn(`Conflicting textOnly options provided: ${o} via options.textOnly (will be used) and ${r} via options.overrides.conversation.textOnly (will be ignored)`),o):"boolean"==typeof r?r:void 0}(t);let u;if(i(_({},t.overrides,{conversation:_({},null==(r=t.overrides)?void 0:r.conversation,{textOnly:l})})),d(t.customLlmExtraBody||null),g(t.dynamicVariables||{}),m(t.userId),k(l),t.conversationToken)u=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;u=await(async(e,n)=>{try{const t=n||"https://api.elevenlabs.io/v1/convai/conversation/token",r=await fetch(`${t}?agent_id=${e}&source=react_native_sdk&version=${p}`),o=await r.json();if(!r.ok){if("object"==typeof o.detail&&null!==o.detail&&"string"==typeof o.detail.message)throw new Error(o.detail.message);throw new Error("Missing error details or message")}if(!o.token)throw new Error("No conversation token received from API");return o.token}catch(e){throw new Error(`Failed to get conversation token: ${e instanceof Error?e.message:"No message"}`)}})(t.agentId,e)}}const v=(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"),""}})(u);a(v),s(u),o(!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,o,s,a,k,c]);return{startSession:y,endSession:t(async(t="user")=>{try{o(!1),s(""),n("disconnected"),i({}),d(null),g({}),m(void 0),a(""),null==e.current.onStatusChange||e.current.onStatusChange({status:"disconnected"}),null==e.current.onDisconnect||e.current.onDisconnect({reason:t})}catch(n){throw null==e.current.onError||e.current.onError(n),n}},[e,o,s,n,a]),overrides:l,customLlmExtraBody:u,dynamicVariables:v,userId:b,textOnly:C}})(A,b,d,i,E,f),{roomConnected:j,localParticipant:q,handleParticipantReady:J,handleConnected:W,handleDisconnected:K,handleError:z}=((e,s,a,l,i=!1)=>{const[u,d]=r(!1),[v,g]=r(null),_=n(!1),p=n(!1);o(()=>{a&&(d(!1),g(null),_.current=!1)},[a]),o(()=>{const e=!i&&!!a;return e&&!p.current?(p.current=!0,c.startAudioSession()):!e&&p.current&&(p.current=!1,c.stopAudioSession()),()=>{p.current&&(p.current=!1,c.stopAudioSession())}},[i,a]),o(()=>{v&&u&&!_.current&&(_.current=!0,null==e.current.onConnect||e.current.onConnect({conversationId:a}))},[v,u,a,e]);const b=t(e=>{v||(g(e),s("connected"))},[v,s]),m=t(()=>{d(!0)},[]),C=t(()=>{"disconnected"!==l&&(d(!1),s("disconnected"),g(null),_.current=!1,null==e.current.onDisconnect||e.current.onDisconnect({reason:"user"}))},[e,s,l]),k=t(n=>{console.error("LiveKit error:",n),null==e.current.onError||e.current.onError(n.message,void 0)},[e]);return{roomConnected:u,localParticipant:v,handleParticipantReady:b,handleConnected:m,handleDisconnected:C,handleError:k}})(A,b,S,g,B),G=e.useCallback(()=>{U.current=1,I.current=1,T(!1),null==A.current.onCanSendFeedbackChange||A.current.onCanSendFeedbackChange({canSendFeedback:!1}),W()},[W,A]),Z=e.useCallback(()=>{T(!1),w(!1),K()},[K]),{sendMessage:H}=((e,n,r)=>({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==r.current.onError||r.current.onError(e)}else console.warn("Cannot send message: room not connected or no local participant")},[e,n,r])}))(g,q,A),Q=e.useCallback(()=>{const e=U.current!==I.current;x!==e&&(T(e),null==A.current.onCanSendFeedbackChange||A.current.onCanSendFeedbackChange({canSendFeedback:e}))},[x,A]),X=e.useCallback(e=>{x?(H({type:"feedback",score:e?"like":"dislike",event_id:U.current}),I.current=U.current,Q()):console.warn(0===I.current?"Cannot send feedback: the conversation has not started yet.":"Cannot send feedback: feedback has already been sent for the current response.")},[x,H,Q]);e.useCallback(e=>{console.warn("setVolume is not yet implemented in React Native SDK")},[]);const Y=e.useCallback(()=>S,[S]),ee=e.useCallback(e=>{q&&q.setMicrophoneEnabled(!e)},[q]),ne=e.useCallback(e=>{U.current=e,Q()},[Q]),te=e.useCallback(e=>{J(e);const n=function(e){var n;const t={type:"conversation_initiation_client_data"};var r,o,s,a,c,l,i,u;return e.overrides&&(t.conversation_config_override={agent:{prompt:null==(r=e.overrides.agent)?void 0:r.prompt,first_message:null==(o=e.overrides.agent)?void 0:o.firstMessage,language:null==(s=e.overrides.agent)?void 0:s.language},tts:{voice_id:null==(a=e.overrides.tts)?void 0:a.voiceId,speed:null==(c=e.overrides.tts)?void 0:c.speed,stability:null==(l=e.overrides.tts)?void 0:l.stability,similarity_boost:null==(i=e.overrides.tts)?void 0:i.similarityBoost},conversation:{text_only:null==(u=e.overrides.conversation)?void 0:u.textOnly}}),t.source_info={source:"react_native_sdk",version:(null==(n=e.overrides)||null==(n=n.client)?void 0:n.version)||p},e.customLlmExtraBody&&(t.custom_llm_extra_body=e.customLlmExtraBody),e.dynamicVariables&&(t.dynamic_variables=e.dynamicVariables),e.userId&&(t.user_id=String(e.userId)),t}({overrides:N,customLlmExtraBody:V,dynamicVariables:$,userId:L});if(n)try{const t=(new TextEncoder).encode(JSON.stringify(n));e.publishData(t,{reliable:!0})}catch(e){console.error("Failed to send overrides:",e),null==A.current.onError||A.current.onError(e)}},[J,N,V,$,L,A]),re=e.useCallback(e=>{R.current=e},[]),oe=e.useCallback(e=>{H({type:"contextual_update",text:e})},[H]),se=e.useCallback(e=>{H({type:"user_message",text:e})},[H]),ae=e.useCallback(()=>{H({type:"user_activity"})},[H]),ce=e.useRef({startSession:D,endSession:P,status:g,isSpeaking:M,canSendFeedback:x,getId:Y,setMicMuted:ee,sendFeedback:X,sendContextualUpdate:oe,sendUserMessage:se,sendUserActivity:ae});ce.current={startSession:D,endSession:P,status:g,isSpeaking:M,canSendFeedback:x,getId:Y,setMicMuted:ee,sendFeedback:X,sendContextualUpdate:oe,sendUserMessage:se,sendUserActivity:ae};const le=e.useMemo(()=>({get startSession(){return ce.current.startSession},get endSession(){return ce.current.endSession},get status(){return ce.current.status},get isSpeaking(){return ce.current.isSpeaking},get canSendFeedback(){return ce.current.canSendFeedback},get getId(){return ce.current.getId},get setMicMuted(){return ce.current.setMicMuted},get sendFeedback(){return ce.current.sendFeedback},get sendContextualUpdate(){return ce.current.sendContextualUpdate},get sendUserMessage(){return ce.current.sendUserMessage},get sendUserActivity(){return ce.current.sendUserActivity}}),[]),ie=e.useMemo(()=>({conversation:le,callbacksRef:A,serverUrl:C,tokenFetchUrl:f,clientTools:R.current,setCallbacks:O,setServerUrl:y,setTokenFetchUrl:h,setClientTools:re}),[le,A,C,f,O,re]);/*#__PURE__*/return e.createElement(k.Provider,{value:ie},/*#__PURE__*/e.createElement(m,{serverUrl:C,token:l,connect:u,onConnected:G,onDisconnected:Z,onError:z,roomConnected:j,callbacks:A.current,onParticipantReady:te,sendMessage:H,clientTools:R.current,updateCurrentEventId:ne,onEndSession:P,audioSessionConfig:a,textOnly:B},s))};export{f as ElevenLabsProvider,y as useConversation};
|
|
2
2
|
//# sourceMappingURL=lib.modern.js.map
|