"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6562],{36562:function(e,t,n){n.d(t,{ie:function(){return b},AW:function(){return E}});var a=n(52322),i=n(2784),r=n(44460),c=n(71126),o=n(22094),l=n(67324),u=n(27232);let s=e=>new Promise(t=>{setTimeout(t,e)});async function*d(){let e=1;for(;;){let t=Math.round(100*Math.random());yield s(e+t),e*=2}}var v=n(83973),f=n(25706),p=n(29318),m=n(90834),_=n(65952),h=n(92262),y=n(67771),S=n(98614),C=n(15584);let g=(0,i.createContext)({isVoiceEnabled:!1,enableVoice:()=>null,disableVoice:()=>null,overrideVoice:()=>null,isCharacterMaybeSpeaking:!1,isCharacterSpeaking:!1,expectCharacterSpeech:()=>null,abortCharacterSpeech:()=>null,client:null,onRequestVoice:()=>null,hasVoice:!1}),k=d();function b(e){let{children:t,authToken:n,characterId:s,chatId:d,candidateId:b,onRequestVoice:E,disableActivityMonitor:I}=e,{t:T}=(0,S.$G)(),V="".concat(s).concat(d),[F,w]=(0,i.useState)(!1),[x,O]=(0,i.useState)(!1),[M,N]=(0,i.useState)(!1),{voiceOverride:H}=(0,u.uO)(null!=s?s:void 0),{mutate:A}=(0,y.wo)(),{mutate:R}=(0,y.et)(),{character:D}=(0,h.XS)(null!=s?s:void 0),{onConversationActivity:U}=(0,u.wO)(I),B=p.R.getInstance();(0,l.s)();let K=(0,i.useMemo)(()=>new MediaStream,[]),P=(0,i.useMemo)(()=>AudioContext?new AudioContext:null,[]),[Q,q]=(0,i.useState)({}),z=(0,i.useCallback)(e=>{f.sF.value=e},[]),L=(0,i.useCallback)((e,t,n)=>{s&&(f.sF.value=!!e,s&&e&&B.updateSession(s,e).catch(t=>{(0,c.H)("Failed to update voice session",{error:t,type:c.NI.Voice,extra:{characterId:s,voiceId:e}})}),r.iN.settingChanged({setting:"voice_override",referrer:t,character_id:s,value:e,searchQuery:n}),e?A({characterExternalId:s,voiceId:e},{onError:t=>{(0,c.H)("Failed to update voice override",{error:t,type:c.NI.Voice,extra:{characterId:s,voiceId:e}})}}):R({characterExternalId:s},{onError:e=>{(0,c.H)("Failed to delete voice override",{error:e,type:c.NI.Voice,extra:{characterId:s}})}}))},[s,A,R,B]),{hasVoice:W,voiceId:$,voiceQuery:j}=(0,i.useMemo)(()=>{var e;if(!s)return{hasVoice:!1};let t=null==D?void 0:D.participant__name,n=null==D?void 0:D.default_voice_id,a=null!==(e=null==H?void 0:H.voice_id)&&void 0!==e?e:n;return{hasVoice:!!t||!!a,voiceId:a,voiceQuery:t}},[s,null==D?void 0:D.participant__name,null==D?void 0:D.default_voice_id,H]),G=(0,i.useCallback)(()=>{d&&s&&b&&F&&B.abortCharacterVoice(d,s,b).then(()=>{O(!1),N(!1)}).catch(c.H)},[b,s,d,B,F]),J=(0,i.useCallback)(()=>{W?(z(!0),w(!0)):E()},[E,z,W]),X=(0,i.useCallback)(()=>{z(!1),w(!1),G()},[G,z]),Z=(0,i.useCallback)(()=>{O(F),F&&K&&P&&((0,_.KQ)(K),P.resume())},[P,F,K]),Y=(0,C.BF)(f.sF);(0,i.useEffect)(()=>{w(Y&&W)},[W,H,Y]),(0,i.useEffect)(()=>O(M),[M]),(0,i.useEffect)(()=>{if(F&&K&&P)return(0,v.g)(K,P,()=>{N(!0)},()=>{N(!1)},m.vx.OneWayVoice)},[P,F,K]),(0,i.useEffect)(()=>{if(x&&!M){let e=setTimeout(()=>{M||O(!1)},m.$J);return()=>clearTimeout(e)}},[x,M]),(0,i.useEffect)(()=>{(0,_.HH)()||q({})},[x]),(0,i.useEffect)(()=>{if(!s||!d||!F||(0,_.HH)())return;let e=async()=>{O(!1),await (0,_.SW)()},t=2,a=null,i=async()=>{if(!F||!K||!W)return;let r=(a=new AbortController).signal;r.addEventListener("abort",e);try{let{isConnectionClosed:t}=await (0,_.IR)(s,d,$,j,n,K,r);U(),(0,o.K)(T("Voice.enabled")),Z(),await t,await e(),N(!1)}catch(n){if(r.aborted)return;await k.next(),t>0?(t--,await i()):((0,o.K)(T("Voice.error")),(0,c.H)("RTC connection error",{error:n,extra:{character_id:s,chat_id:d,voice_id:$},type:c.NI.Voice}),await e(),N(!1),w(!1))}};return i(),()=>{null==a||a.abort()}},[s,d,n,F,V,K,Q,U,T,$,j,W,Z]);let ee=(0,i.useMemo)(()=>({enableVoice:J,disableVoice:X,overrideVoice:L,expectCharacterSpeech:Z,abortCharacterSpeech:G,isVoiceEnabled:F,isCharacterMaybeSpeaking:x,isCharacterSpeaking:M,client:B,onRequestVoice:E,hasVoice:W,voiceId:$,voiceQuery:j}),[G,B,X,J,Z,x,M,F,L,E,W,$,j]);return(0,a.jsx)(g.Provider,{value:ee,children:t})}let E=()=>(0,i.useContext)(g)},67324:function(e,t,n){let a;n.d(t,{D:function(){return E},s:function(){return k}});var i=n(44460),r=n(71126),c=n(22094),o=n(566),l=n(7649),u=n(32845),s=n(46718),d=n(25706),v=n(29318),f=n(65952),p=n(47969),m=n(39905),_=n(19191),h=n(92526),y=n(16575),S=n(2784),C=n(98614),g=n(15584);let k=()=>{var e;let{user:t,token:n}=(0,o.a)(),a=null==t?void 0:null===(e=t.user)||void 0===e?void 0:e.id;(0,S.useEffect)(()=>{a&&v.R.getInstance().setUserId(a)},[a]),(0,S.useEffect)(()=>{n&&v.R.getInstance().setAuthToken(n)},[n])},b=e=>{let[t,n]=(0,S.useState)(!1),[a,i]=(0,S.useState)(!1),[c,o]=(0,S.useState)(p.aB.Unmuted),l=(0,S.useCallback)((e,t)=>{"system"===e?n(e=>null!=t?t:!e):i(e=>null!=t?t:!e)},[]);return(0,S.useEffect)(()=>{let n=async()=>{let n=t||a,i=e.localParticipant.getTrackPublication(y.fQ.Source.Microphone);if(i)try{let e;i.isMuted!==n&&await (n?i.mute():i.unmute()),e=i.isMuted?a?p.aB.UserMuted:p.aB.SystemMuted:p.aB.Unmuted,o(e)}catch(e){(0,r.H)("Error muting microphone",{error:e,extra:{systemMuteRequested:t,userMuteRequested:a}})}};try{n()}catch(e){(0,r.H)("Error handling mute",{error:e,type:r.NI.Voice})}},[t,a,e]),{muteMicrophone:l,microphoneMuteStatus:c}},E=(e,t,n)=>{let{characterId:o}=(0,l.AU)(),{stopCharacterSpeaking:k}=(0,u.c9)(),E=(0,g.BF)(d.OO),[I]=(0,S.useState)(()=>new y.du),[T,V]=(0,g.zb)(p.Fe.unconnected),[F,w]=(0,S.useState)(p.Td.Initializing),[x,O]=(0,S.useState)(!1),{muteMicrophone:M,microphoneMuteStatus:N}=b(I),{t:H}=(0,C.$G)(),{mutate:A}=(0,_.pC)(),R=(0,g.BF)(d.yc);(0,S.useEffect)(()=>{I.prepareConnection(h.Rz.LIVEKIT_URL).catch(e=>{(0,r.H)("Error preparing rtc connection",{error:e,type:r.NI.Voice})})},[I]);let D=(0,S.useCallback)(()=>{(0,c.K)(s.ZP.t("Voice.voice-error"),void 0,"destructive")},[]),U=(0,S.useRef)(null),B=(0,S.useCallback)((e,t)=>{T.value!==e&&(i.iN.voiceRtcConnectionStatusChange({referrer:"MultimediaConnectionHook",connection_status:e,...null!=t?t:{}}),d.UU.value=e,T.value=e)},[T]);(0,S.useEffect)(()=>{let e=null;return T.value===p.Fe.connected&&(null==E?void 0:E.status)==="requested"&&(e=setTimeout(()=>{(0,r.H)("Voice playback request timed out",{type:r.NI.Voice}),k(),d.OO.value={status:"done",timestamp:Date.now()}},h.Rz.VOICE_MAX_DURATION_FOR_REQUESTED_STATE_MS)),()=>{e&&clearTimeout(e)}},[k,T,E]);let K=(0,S.useCallback)(async e=>{e?B(p.Fe.failed):T.value===p.Fe.connecting||T.value===p.Fe.disconnecting?B(p.Fe.disconnecting):B(p.Fe.unconnected),await I.disconnect(),U.current&&clearTimeout(U.current),d.OO.value={status:"done",timestamp:Date.now()}},[B,T,I]),P=(0,S.useCallback)(()=>{U.current&&clearTimeout(U.current),U.current=setTimeout(()=>{e.value=!1,(0,c.K)(s.ZP.t("Voice.voice-inactivity")),i.iN.voiceRtcConnectionStatusChange({referrer:"MultimediaConnectionHook",connection_status:"inactivity_timeout"})},h.Rz.VOICE_INACTIVITY_TIMEOUT_MS)},[e]);(0,S.useEffect)(()=>{T.value===p.Fe.connected&&R>0&&P()},[P,T,R]);let Q=(0,S.useCallback)(e=>{if(e)try{w(e)}catch(e){(0,r.H)("Error updating turn state",{error:e,type:r.NI.Voice})}},[]),q=(0,S.useCallback)(async i=>{let{chatId:l,voiceId:u,voiceQuery:s,callArgs:d}=i,_=!!d;try{if(T.value===p.Fe.connecting){(0,m.BS)("already  connecting");return}if(T.value===p.Fe.connected){(0,m.BS)("already  connected");return}if(T.value===p.Fe.disconnecting){(0,m.BS)("in the process of disconnecting");return}let e={room_id:l,two_way:_,character_id:o,voice_id:u,voice_query:s};B(p.Fe.connecting,e);let i=u?{[o]:u}:{},r=u?{}:{[o]:s};a=Date.now();let S=await v.R.getInstance().joinOrCreateSession(l,i,r,void 0,_,null==d?void 0:d.userAuthToken,null==d?void 0:d.username);v.R.getInstance().setCurrentSession(null==S?void 0:S.session);let C=S.lkUrl,g=S.lkToken;if(I.on(y.TQ.TrackSubscribed,e=>{e&&t&&(t.addTrack(e.mediaStreamTrack),(0,f.KQ)(t))}),await I.connect(C,g,{autoSubscribe:!0}),P(),(0,c.K)(H("Voice.voice-on")),B(p.Fe.connected,{...e,connection_time_ms:a?Date.now()-a:void 0,rtc_type:"livekit"}),_){var h;await I.localParticipant.setMicrophoneEnabled(!0,{noiseSuppression:!0,echoCancellation:!0});let e=null===(h=I.localParticipant.getTrackPublication(y.fQ.Source.Microphone))||void 0===h?void 0:h.track;n&&e&&(null==n||n.addTrack(null==e?void 0:e.mediaStreamTrack))}}catch(t){e.value=!1,T.value===p.Fe.disconnecting?(K(!1),B(p.Fe.unconnected)):(K(!0),t instanceof Error&&(null==t?void 0:t.name)==="NotAllowedError"?((0,c.K)(H("Voice.microphone-error"),1e4,"destructive",H("Voice.you-probably-havent-granted-microphone-permissions")),(0,r.H)("Microphone permissions not granted",{error:t,type:r.NI.Voice,extra:{two_way:_}})):(D(),(0,r.H)("RTC connection error",{error:t,type:r.NI.Voice,extra:{two_way:_}})))}},[T.value,o,B,I,P,H,n,t,e,K,D]),z=(0,S.useCallback)((t,n)=>{e.value=!1,D(),(0,r.H)("livekit disconnect error",{error:t,type:r.NI.Voice,extra:{...n,room_name:I.name,rtc_connection_status:T.value}})},[D,e,I,T]);return(0,S.useEffect)(()=>(I.localParticipant.on(y.dd.IsSpeakingChanged,e=>{O(e)}),I.on(y.TQ.Disconnected,e=>{if(T.value===p.Fe.disconnecting){B(p.Fe.unconnected);return}e===y.W4.CLIENT_INITIATED?B(p.Fe.unconnected):z(e)}).on(y.TQ.DataReceived,e=>{let t=new TextDecoder().decode(e);try{let e=JSON.parse(t);"speechStarted"===e.event?(d.OO.value={status:"playing",timestamp:Date.now()},e.candidateId&&(d.q9.value=e.candidateId),P()):"speechEnded"===e.event?d.OO.value={status:"done",timestamp:Date.now()}:"TurnState"===e.event?e.state&&Q(e.state):"ParticipantDisconnected"===e.event&&z("participant disconnected",{extra:{participant_id:e.participantId,source:"data_event"}})}catch(e){(0,r.H)("Failed to parse livekit room event",{error:e,type:r.NI.Voice})}}).on(y.TQ.TrackSubscriptionFailed,(e,t,n)=>{D(),(0,r.H)("livekit track subscription failed",{error:n,type:r.NI.Voice})}).on(y.TQ.ParticipantDisconnected,e=>{z("participant disconnected",{extra:{participant_id:e.identity,source:"participant_disconnected_event"}})}),()=>{I.removeAllListeners()}),[K,P,I,B,A,D,z,Q,T]),{mconnect:(0,S.useCallback)(t=>{let{chatId:n,voiceId:a,voiceQuery:i,callArgs:r}=t;e.value&&o&&q({chatId:n,voiceId:a,voiceQuery:i,characterId:o,callArgs:r})},[e.value,o,q]),mdisconnect:K,muteMicrophone:M,microphoneMuteStatus:N,rtcConnectionStatus:V,voiceCallTurnStatus:F,isUserSpeaking:x}}},32845:function(e,t,n){n.d(t,{E$:function(){return k},c9:function(){return g}});var a=n(44460),i=n(71126),r=n(22094),c=n(7649),o=n(27232),l=n(25706),u=n(29318),s=n(47969),d=n(48461),v=n(71031),f=n(2236),p=n(5813);n(92262);var m=n(67771),_=n(2784),h=n(98614),y=n(15584);let S=(e,t)=>e===s.Fe.connected&&((null==t?void 0:t.status)==="requested"||(null==t?void 0:t.status)==="playing"),C=()=>{var e;let{character:t,characterId:n}=(0,c.AU)(),{voiceOverride:a}=(0,o.uO)(n);if(!t)return{hasVoice:!1};let i=t.default_voice_id,r=null!==(e=null==a?void 0:a.voice_id)&&void 0!==e?e:i,l=t.participant__name;return{hasVoice:!!r||!!l,voiceId:r,voiceQuery:l}},g=()=>{let{character:e}=(0,c.AU)(),t=(0,y.BF)(l.UU),n=(0,y.BF)(l.OO),{hasVoice:r}=C(),o=(0,_.useCallback)(async()=>{let t=S(l.UU.value,l.OO.value),n=l.jN.value,c=l.q9.value;if(r&&t){if(!n||!e||!c){(0,i.H)("failed to stop character speaking - invalid params",{extra:{chatId:n,characterId:null==e?void 0:e.external_id,lastCandidateId:c,isCharacterSpeaking:t}});return}a.iN.voiceStopCharcterSpeaking({referrer:"voices_hook",character_id:null==e?void 0:e.external_id,chat_id:n,last_candidate_id:c}),await u.R.getInstance().abortCharacterVoice(n,null==e?void 0:e.external_id,c)}},[e,r]);return{isCharacterSpeaking:S(t,n),stopCharacterSpeaking:o}},k=()=>{let{t:e}=(0,h.$G)(),{character:t}=(0,c.AU)(),[n,a]=(0,_.useState)(),{mutate:u}=(0,m.et)(),{hasVoice:s,voiceQuery:y,voiceId:S}=C(),g=null==t?void 0:t.external_id,{voiceOverride:k}=(0,o.uO)(g);(0,_.useEffect)(()=>{t&&!t.external_id&&(0,i.H)("Character has no external_id",{extra:{character:t}})},[t]);let{subscribe:b}=(0,f.m)(),{isLoading:E,error:I}=(0,m.Kl)(S,!1),T=!!S&&E;return(0,_.useEffect)(()=>{(0,v.i$)(null==I?void 0:I.response)&&g&&S&&(null==k?void 0:k.voice_id)===S&&((0,r.K)(e("Calls.voice-unavailable")),u({characterExternalId:g},{onError:e=>{(0,r.A)(),(0,i.H)("Failed to delete voice override",{error:e,type:i.NI.Voice,extra:{characterId:g,voiceId:S}})}}))},[g,u,k,I,S,e]),(0,_.useEffect)(()=>{if(!g||!t)return;let{unsubscribe:e}=b(g,(e,t,n)=>{let i=null==n?void 0:n.chat_id;a(i),i!==d.z4&&(l.jN.value=i)},p.Em.Neo,{character:t});return e},[b,g,t]),{voiceId:I?void 0:S,voiceQuery:y,hasVoice:s,chatId:n,isVoiceLoading:T}}},83973:function(e,t,n){n.d(t,{g:function(){return i},s:function(){return c}});var a=n(90834);let i=function(e,t,n,i,r){let c,l,u,s,d=arguments.length>5&&void 0!==arguments[5]?arguments[5]:a.Fd,v=!0,f=!1,p=!1,m=null,_=()=>{c=t.createMediaStreamSource(e),s=t.createAnalyser(),c.connect(s),s.fftSize=32,u=s.frequencyBinCount,l=new Float32Array(u)},h=()=>{if(!v)return;s.getFloatTimeDomainData(l),p&&o(r,l);let e=!1;for(let t=0;t<u;t++)if(Math.abs(l[t])>.1){e=!0;break}f!==e&&(f=e,null!=m&&clearTimeout(m),m=setTimeout(()=>{m=null,p!==f&&v&&(p=f,f?n():i())},f?0:d)),requestAnimationFrame(h)},y=()=>e.getAudioTracks().length>0;if(!y()){let t=()=>{y()&&(_(),h())};return e.addEventListener("addtrack",t),()=>{v=!1,e.removeEventListener("addtrack",t)}}return _(),h(),()=>{t.close(),v=!1}},r={},c=(e,t)=>(r[e]||(r[e]=[]),r[e].push(t),()=>{r[e]=r[e].filter(e=>e!==t),0===r[e].length&&delete r[e]}),o=(e,t)=>{if(r[e])for(let n of r[e])n(t)}},90834:function(e,t,n){var a,i;n.d(t,{$J:function(){return c},Fd:function(){return r},vx:function(){return a}});let r=3e3,c=5e3;(i=a||(a={})).OneWayVoice="OneWayVoice",i.VoiceCallsMediaStream="VoiceCallsMediaStream",i.VoiceCallsMicrophoneStream="VoiceCallsMicrophoneStream"},48461:function(e,t,n){n.d(t,{Gd:function(){return l},bW:function(){return c},nx:function(){return o},z4:function(){return r}});var a=n(5813),i=n(54504);let r="creator_attribution",c=e=>({author:{author_id:e.external_id,is_human:!1,name:e.name,avatar_url:e.avatar_file_name},candidates:[],create_time:new Date().toISOString(),last_update_time:new Date().toISOString(),primary_candidate_id:r,state:"STATE_OK",turn_key:{chat_id:r,turn_id:r},clientSystemMessage:{message:e.title,payload:e.user__username,messageType:i.lo.creator_attribution}}),o=(e,t)=>{var n;if(0===e.length)return null;let a=t[e[0].turn_key.turn_id];return(null===(n=e[0].candidates)||void 0===n?void 0:n.length)>(null!=a?a:0)?e[0].candidates[null!=a?a:0]:null},l=(e,t)=>!e.author.is_human&&[a.vF,a.gn].includes(t.candidate_id)}}]);