@crestapps/ai-chat-ui 2.0.0-preview.162 → 2.0.0-preview.163

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.
@@ -1,2 +1,2 @@
1
- !function(e,t){"use strict";function n(e,t){var n=t.micDb,a="number"==typeof t.assistantDb?t.assistantDb:-100,o=t.nowMs,i=t.mode||{},r=null===e.lastMs?0:Math.max(0,Math.min(50,o-e.lastMs));e.lastMs=o,a>-50&&(e.assistantUntil=o+400);var c=o<e.assistantUntil;if(a>e.assistantPeakDb?e.assistantPeakDb=a:e.assistantPeakDb=Math.max(-100,e.assistantPeakDb-.02*r),n<=-95){if(null===e.floorDb)return e.open=!1,e}else null===e.floorDb&&(e.floorDb=Math.min(n,-50));if(n<e.floorDb)e.floorDb+=(n-e.floorDb)*Math.min(1,.0075*r);else if(!c){var l=null!==e.openSince&&o-e.openSince>1e4,s=e.open&&!l?1e-4:56e-5;e.floorDb+=(n-e.floorDb)*Math.min(1,s*r)}if(e.floorDb<-75&&(e.floorDb=-75),c&&!e.open&&a>-50&&!i.pushToTalk){var u=n-e.assistantPeakDb;if(null===e.echoReturnDb)e.echoReturnDb=u;else{var d=e.echoLearnedMs<1e3,f=u>e.echoReturnDb?d?.02:.0012:6e-4;e.echoReturnDb+=(u-e.echoReturnDb)*Math.min(1,f*r)}e.echoLearnedMs+=r}var m,p,v=null===e.echoReturnDb?-100:e.assistantPeakDb+e.echoReturnDb;c?(m=Math.max(e.floorDb+12,v+8,-45),p=Math.max(e.floorDb+3,v+3)):(m=e.floorDb+9,p=e.floorDb+3);var h=i.speechHangoverMs||2e3;n>m?c&&!e.open?(null===e.aboveSince&&(e.aboveSince=o),o-e.aboveSince>=250&&(e.speakUntil=o+h)):e.speakUntil=o+h:(e.aboveSince=null,e.open&&n>p&&(e.speakUntil=Math.max(e.speakUntil,o+250)));var b=o<e.speakUntil;return!c&&e.wasAssistantSpeaking&&(e.listenGraceUntil=o+1500),e.wasAssistantSpeaking=c,e.assistantSpeaking=c,i.pushToTalk?e.open=!!i.pttActive:i.bargeIn?e.open=b:e.open=!c&&(b||o<e.listenGraceUntil),e.open&&null===e.openSince?e.openSince=o:e.open||(e.openSince=null),e}function a(){return{floorDb:null,lastMs:null,speakUntil:0,assistantUntil:0,assistantPeakDb:-100,echoReturnDb:null,echoLearnedMs:0,aboveSince:null,listenGraceUntil:0,wasAssistantSpeaking:!1,assistantSpeaking:!1,open:!1,openSince:null}}function o(e){if(!e||!e.length)return-100;for(var t=0,n=0;n<e.length;n++)t+=e[n]*e[n];var a=Math.sqrt(t/e.length);return a>1e-7?20*Math.log10(a):-100}var i=["var decide = "+n.toString()+";","var newState = "+a.toString()+";","var rmsDb = "+o.toString()+";","class CoreAiMicGateProcessor extends AudioWorkletProcessor {"," constructor(options) {"," super();"," var o = (options && options.processorOptions) || {};"," this.delay = new Float32Array(Math.max(1, Math.round(sampleRate * (o.lookaheadMs || 80) / 1000)));"," this.delayPos = 0;"," this.gain = 0;"," this.mode = o.mode || {};"," this.state = newState();"," this.lastPost = 0;"," this.port.onmessage = function (e) { this.mode = e.data || {}; }.bind(this);"," }"," process(inputs, outputs) {"," var mic = (inputs[0] && inputs[0][0]) || null;"," var assistant = (inputs[1] && inputs[1][0]) || null;"," var out = (outputs[0] && outputs[0][0]) || null;"," if (!out) { return true; }"," var micDb = rmsDb(mic);"," decide(this.state, { micDb: micDb, assistantDb: rmsDb(assistant), nowMs: currentTime * 1000, mode: this.mode });"," var target = this.state.open ? 1 : 0;"," var step = 1 / (sampleRate * 0.01);"," var delay = this.delay;"," var pos = this.delayPos;"," var len = delay.length;"," for (var i = 0; i < out.length; i++) {"," var delayed = delay[pos];"," delay[pos] = mic ? mic[i] : 0;"," pos = (pos + 1) % len;"," if (this.gain < target) { this.gain = Math.min(target, this.gain + step); }"," else if (this.gain > target) { this.gain = Math.max(target, this.gain - step); }"," out[i] = delayed * this.gain;"," }"," this.delayPos = pos;"," if (currentTime * 1000 - this.lastPost > 100) {"," this.lastPost = currentTime * 1000;"," this.port.postMessage({ micDb: micDb, floorDb: this.state.floorDb, echoReturnDb: this.state.echoReturnDb, open: this.state.open, assistantSpeaking: this.state.assistantSpeaking });"," }"," return true;"," }","}",'registerProcessor("coreai-mic-gate", CoreAiMicGateProcessor);'].join("\n");function r(t,n){var a=t&&t.getAudioTracks&&t.getAudioTracks()[0]||null,o={ctx:null,node:null,micSource:null,remoteSource:null,dest:null,timer:0,level:null,fallback:null,track:a,stopped:!1},r={track:a,usingWorklet:!1,getLevel:function(){return o.level},setMode:function(e){if(n=e||n,o.node&&o.node.port)try{o.node.port.postMessage(n)}catch(e){}o.fallback&&(o.fallback.mode=n)},attachAssistantStream:function(e){c(o,e)},stop:function(){if(o.stopped=!0,o.timer){try{e.clearInterval(o.timer)}catch(e){}o.timer=0}if(o.node){try{o.node.port.onmessage=null,o.node.disconnect()}catch(e){}o.node=null}if(o.micSource){try{o.micSource.disconnect()}catch(e){}o.micSource=null}if(o.remoteSource){try{o.remoteSource.disconnect()}catch(e){}o.remoteSource=null}if(o.dest){try{o.dest.disconnect()}catch(e){}o.dest=null}if(o.ctx){try{o.ctx.close()}catch(e){}o.ctx=null}o.fallback=null}},s=e.AudioContext||e.webkitAudioContext;if(!s||!a)return Promise.resolve(r);try{o.ctx=new s,"suspended"===o.ctx.state&&"function"==typeof o.ctx.resume&&o.ctx.resume().catch(function(){})}catch(e){return o.ctx=null,Promise.resolve(r)}var u=null;if(o.ctx.audioWorklet&&"function"==typeof o.ctx.audioWorklet.addModule)try{u=URL.createObjectURL(new Blob([i],{type:"application/javascript"}))}catch(e){u=null}return u?o.ctx.audioWorklet.addModule(u).then(function(){try{URL.revokeObjectURL(u)}catch(e){}if(o.stopped)return r;var i=new AudioWorkletNode(o.ctx,"coreai-mic-gate",{numberOfInputs:2,numberOfOutputs:1,outputChannelCount:[1],processorOptions:{lookaheadMs:80,mode:n}});return o.node=i,i.port.onmessage=function(t){o.level=t.data||null,e.CoreAIRealtime.lastGateLevel=o.level},o.micSource=o.ctx.createMediaStreamSource(t),o.micSource.connect(i,0,0),o.dest=o.ctx.createMediaStreamDestination(),i.connect(o.dest),o.pendingRemoteStream&&c(o,o.pendingRemoteStream),r.track=o.dest.stream.getAudioTracks()[0]||a,r.usingWorklet=!0,r}).catch(function(i){try{URL.revokeObjectURL(u)}catch(e){}return e.console&&console.warn&&console.warn("The realtime microphone gate worklet could not be loaded; using the simpler gate.",i),r.track=l(o,t,a,n),r}):(r.track=l(o,t,a,n),Promise.resolve(r))}function c(e,t){if(e.pendingRemoteStream=t||null,e.ctx&&t&&!e.stopped)try{if(e.remoteSource)try{e.remoteSource.disconnect()}catch(e){}var n=e.ctx.createMediaStreamSource(t);if(e.remoteSource=n,e.node)return void n.connect(e.node,0,1);if(e.fallback){var a=e.ctx.createAnalyser();a.fftSize=2048,n.connect(a),e.fallback.remoteAnalyser=a,e.fallback.remoteData=new Float32Array(a.fftSize)}}catch(e){}}function l(t,a,i,r){try{var l=t.ctx,s=l.createMediaStreamSource(a);t.micSource=s;var u=l.createAnalyser();u.fftSize=2048,s.connect(u);var d=l.createGain();d.gain.value=0,s.connect(d);var f=l.createMediaStreamDestination();t.dest=f,d.connect(f);var m={mode:r,remoteAnalyser:null,remoteData:null};t.fallback=m,t.pendingRemoteStream&&c(t,t.pendingRemoteStream);var p=new Float32Array(u.fftSize),v={floorDb:null,lastMs:null,speakUntil:0,assistantUntil:0,assistantPeakDb:-100,echoReturnDb:null,echoLearnedMs:0,aboveSince:null,listenGraceUntil:0,wasAssistantSpeaking:!1,assistantSpeaking:!1,open:!1,openSince:null};return t.timer=e.setInterval(function(){u.getFloatTimeDomainData(p);var a=o(p),i=-100;m.remoteAnalyser&&m.remoteData&&(m.remoteAnalyser.getFloatTimeDomainData(m.remoteData),i=o(m.remoteData));var r=e.performance&&performance.now?performance.now():Date.now();n(v,{micDb:a,assistantDb:i,nowMs:r,mode:m.mode||{}}),t.level={micDb:a,floorDb:v.floorDb,open:v.open,assistantSpeaking:v.assistantSpeaking};var c=v.open?1:0;try{d.gain.setTargetAtTime(c,l.currentTime,.015)}catch(e){d.gain.value=c}},20),f.stream.getAudioTracks()[0]||i}catch(e){return i}}function s(e,t){if(e&&"function"==typeof e.setSinkId)if(t)try{e.setSinkId(t).catch(function(){})}catch(e){}else navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices&&navigator.mediaDevices.enumerateDevices().then(function(t){var n=t.filter(function(e){return"audiooutput"===e.kind});if(n.length){for(var a="",o=0;o<n.length;o++)if("communications"===n[o].deviceId){a="communications";break}if(!a){for(var i=null,r=0;r<n.length;r++)if("default"===n[r].deviceId){i=n[r];break}if(i&&i.groupId)for(var c=0;c<n.length;c++)if("default"!==n[c].deviceId&&"communications"!==n[c].deviceId&&n[c].groupId===i.groupId){a=n[c].deviceId;break}}if(a)try{e.setSinkId(a).catch(function(){})}catch(e){}}}).catch(function(){})}function u(t,n){if(t&&"function"==typeof t.play){var a=t.play();a&&"function"==typeof a.catch&&a.catch(function(t){"function"==typeof n&&n(t),e.console&&console.warn&&console.warn("The browser blocked realtime audio playback. Interact with the page to enable audio.",t)})}}e.CoreAIRealtime={attach:function(n){var a=(n=n||{}).connection,o=n.selectors||{},i=n.voiceName||"",c=(n.capableDeployments||[]).map(function(e){return(e||"").toLowerCase()}),l=!!n.realtimeEnabled,d=function(){},f=n.onActivate||d,m=n.onDeactivate||d,p=n.onEnterRealtimeMode||d,v=n.onUserTurnPending||d,h=n.onUserTurnDropped||d,b=n.strings||{};function g(e,t){return"string"==typeof b[e]?b[e]:t}var y=n.ensureConnected||function(){return Promise.resolve(!0)},k=n.sendStart||d,S=n.getVoiceName||null,D=n.sendStartWebRtc||null,M=!0===n.webRtcEnabled&&"function"==typeof e.RTCPeerConnection&&!!D,T=Array.isArray(n.webRtcIceServers)&&n.webRtcIceServers.length?n.webRtcIceServers:null,I=[{urls:"stun:stun.l.google.com:19302"}],E=n.onStateChange||d,w="idle";function x(e){var n=o[e];return n?t.querySelector(n):null}var A=!1,C=!1,R=null,L=null,j=null,P=null,B=null,U=null,O=null,N=null,G=null,F=null,H=0,W=[],q=!1,z=null,_=null,V=!1,J=!1,Y=[],K=!1,Q=null,X=!1,Z="coreai.realtime.webrtcBlocked",$=!1,ee=null,te=null,ne=!0,ae=!1,oe=!1,ie=!1,re=null,ce=null,le=null,se=null,ue=1,de="",fe="",me="",pe=!1;function ve(){var t={bargeIn:!0,pushToTalk:!1,volume:1,micDeviceId:"",outputDeviceId:"",language:"",version:0};try{var n=e.localStorage.getItem("coreai.realtime.audioPrefs");if(n){var a=JSON.parse(n);"boolean"==typeof a.bargeIn&&(t.bargeIn=a.bargeIn),"boolean"==typeof a.pushToTalk&&(t.pushToTalk=a.pushToTalk),"number"==typeof a.volume&&isFinite(a.volume)&&(t.volume=Math.min(1,Math.max(0,a.volume))),"string"==typeof a.micDeviceId&&(t.micDeviceId=a.micDeviceId),"string"==typeof a.outputDeviceId&&(t.outputDeviceId=a.outputDeviceId),"string"==typeof a.language&&(t.language=a.language),"number"==typeof a.version&&(t.version=a.version)}}catch(e){}return function(e){if(3===e.version)return e;return e.version=3,e.bargeIn=!0,e.pushToTalk=!1,he(e),e}(t)}function he(t){try{e.localStorage.setItem("coreai.realtime.audioPrefs",JSON.stringify(t))}catch(e){}}function be(e){ne=!1!==e.bargeIn,ae=!!e.pushToTalk,ue="number"==typeof e.volume?e.volume:1,de=e.micDeviceId||"",fe=e.outputDeviceId||"",me=e.language||"",Oe(),F&&(F.gain.value=ue),_&&(_.volume=Math.max(0,Math.min(1,ue)))}function ge(e){if(!e||!e.tagName)return!1;var t=e.tagName.toLowerCase();return"input"===t||"textarea"===t||"select"===t||!0===e.isContentEditable}function ye(){ie||(ie=!0,oe=!1,re=function(e){!ae||ge(e.target)||"Space"!==e.code&&" "!==e.key||(e.preventDefault(),e.repeat||ke(!0))},ce=function(e){!ae||ge(e.target)||"Space"!==e.code&&" "!==e.key||(e.preventDefault(),ke(!1))},t.addEventListener("keydown",re,!0),t.addEventListener("keyup",ce,!0))}function ke(e){oe=e,Oe(),le&&(le.classList.toggle("btn-danger",e),le.classList.toggle("btn-outline-primary",!e),le.innerHTML=e?'<i class="bi bi-mic-fill me-1"></i> Listening…':'<i class="bi bi-mic me-1"></i> Hold to talk')}function Se(){var n=x("realtimeButton");if(n&&!se){var a=e.matchMedia&&e.matchMedia("(pointer: coarse)").matches,o=t.createElement("div");o.className="text-center mt-2";var i=t.createElement("button");i.type="button",i.className="btn btn-outline-primary btn-sm",i.innerHTML='<i class="bi bi-mic me-1"></i> Hold to talk';var r=t.createElement("div");r.className="form-text mt-1 mb-0",r.innerHTML=a?"Push-to-talk is on — press and hold the button to speak.":"Push-to-talk is on — hold <kbd>Space</kbd> or this button to speak.",o.appendChild(i),o.appendChild(r);var c=n.parentElement;c&&c.parentElement?c.parentElement.appendChild(o):n.insertAdjacentElement("afterend",o),le=i,se=o,i.addEventListener("pointerdown",function(e){e.preventDefault(),ke(!0)}),i.addEventListener("pointerup",function(){ke(!1)}),i.addEventListener("pointerleave",function(){ke(!1)}),i.addEventListener("pointercancel",function(){ke(!1)}),ke(!1)}}function De(n,a){if(a)if(e.DOMPurify&&"function"==typeof e.DOMPurify.sanitize)n.replaceChildren(e.DOMPurify.sanitize(a,{RETURN_DOM_FRAGMENT:!0}));else{var o=a.replace(/<[^>]*>/g," ").replace(/\s+/g," ").trim();n.replaceChildren(t.createTextNode(o))}}function Me(){var e=x("realtimeButton");e&&(A?(e.classList.add("active","btn-primary"),e.classList.remove("btn-dark","btn-outline-dark","btn-outline-secondary"),e.title=e.getAttribute("data-end-title")||"End Conversation",De(e,e.getAttribute("data-end-html"))):(e.classList.remove("active","btn-primary","btn-dark","btn-outline-secondary"),e.classList.add("btn-outline-dark"),e.blur(),e.title=e.getAttribute("data-start-title")||"Start speaking",De(e,e.getAttribute("data-start-html"))))}function Te(e){l=e;var n=x("realtimeButton"),a=x("micButton"),o=x("conversationButton"),i=x("input"),r=x("sendButton"),c=t.getElementById("realtime-audio-settings");e?(p(),i&&(i.hidden=!0),r&&(r.hidden=!0),a&&(a.hidden=!0),o&&(o.hidden=!0),n&&(n.hidden=!1),c&&(c.hidden=!1)):(A&&We(),n&&(n.hidden=!0),c&&(c.hidden=!0),function(){if(!L)return;try{L.remove()}catch(e){}L=null}(),Ae(),i&&(i.hidden=!1),r&&(r.hidden=!1),a&&(a.hidden=!1),o&&(o.hidden=!1)),Me()}var Ie={"requesting-mic":g("requestingMic","Waiting for microphone access…"),connecting:g("connecting","Connecting…"),listening:g("listening","Listening"),"playback-blocked":g("playbackBlocked","Audio is blocked by the browser — click the page to enable it.")};function Ee(e,t){if(w!==e){w=e;var n=Ie[e];n?xe(n,!1):"idle"===e&&Ae();try{E({state:e,transport:q?"webrtc":"websocket",detail:t||null})}catch(e){}}}function we(t){R=t,We(),Ee("ended",t),e.console&&console.info&&console.info("The realtime voice session ended ("+t+")."),"idle"===t?xe(g("endedIdle","Voice paused after a period of silence."),!0):"disconnected"===t?xe(g("endedDisconnected","Voice session ended — the connection dropped."),!0):"error"===t?xe(g("endedError","Voice session ended unexpectedly."),!0):"device_lost"===t&&xe(g("endedDeviceLost","Voice session ended — the microphone was disconnected."),!0)}function xe(e,n){var a=x("realtimeButton");if(a){if(!j){(j=t.createElement("div")).className="form-text mt-2 mb-0 text-center",j.setAttribute("role","status"),j.setAttribute("aria-live","polite");var o=a.parentElement;o&&o.parentElement?o.parentElement.appendChild(j):a.insertAdjacentElement("afterend",j)}if(j.replaceChildren(),j.appendChild(t.createTextNode(e)),n){var i=t.createElement("button");i.type="button",i.className="btn btn-link btn-sm p-0 ms-2 align-baseline",i.textContent=g("resume","Resume"),i.addEventListener("click",function(){Ae(),Re()}),j.appendChild(i)}}}function Ae(){if(j){try{j.remove()}catch(e){}j=null}}function Ce(){if(!L){var e=x("realtimeButton");if(e){var n=t.createElement("div");n.className="form-text mt-2 mb-0 text-center",n.setAttribute("role","status"),n.textContent=g("compatibilityMode","Using compatibility audio mode. Echo cancellation may be weaker — headphones are recommended.");var a=e.parentElement;a&&a.parentElement?a.parentElement.appendChild(n):e.insertAdjacentElement("afterend",n),L=n}}}function Re(){l&&!A&&a&&(be(ve()),X=!1,R=null,Ae(),!C&&a&&(C=!0,a.on("ReceiveRealtimeEvent",function(e,t,n){A&&("session_ready"===t?Ee("listening"):"session_ended"===t?we(n||"completed"):"speech_started"===t?ne&&ze():"playback_flush"===t?ze():"user_turn_pending"===t?v(n):"user_turn_dropped"===t&&h(n))}),a.on("ReceiveError",function(){A&&(!q||K||X?we("error"):He("server reported an error before the peer connected"))}),"function"==typeof a.onclose&&a.onclose(function(){A&&we("disconnected")}),"function"==typeof a.onreconnecting&&a.onreconnecting(function(){A&&we("disconnected")})),Ee("requesting-mic"),!M||function(){try{return"1"===e.sessionStorage.getItem(Z)}catch(e){return!1}}()?Le():function(){var n={echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};de&&(n.deviceId={exact:de});navigator.mediaDevices.getUserMedia({audio:n}).then(function(n){y().then(function(){return T?Promise.resolve(T):a&&"function"==typeof a.invoke?a.invoke("GetRealtimeIceServers").then(function(e){return Array.isArray(e)&&e.length?e:I}).catch(function(t){return e.console&&console.warn&&console.warn("Could not resolve the realtime ICE servers; using the default STUN server.",t),I}):Promise.resolve(I)}).then(function(e){P=n,A=!0,q=!0,f(),Me(),Ee("connecting"),J=!1,Y=[],K=!1;var o=new RTCPeerConnection({iceServers:e});z=o,ye();var r=x("realtimeButton");if(r)try{r.blur()}catch(e){}ae&&Se();var c=t.createElement("audio");c.autoplay=!0,c.style.display="none",c.volume=Math.max(0,Math.min(1,null!=ue?ue:1)),t.body.appendChild(c),_=c,s(c,fe),o.ontrack=function(e){try{e.receiver&&"jitterBufferTarget"in e.receiver&&(e.receiver.jitterBufferTarget=150)}catch(e){}var t;e.streams&&e.streams[0]&&(c.srcObject=e.streams[0],function(e){u(e,function(){Ee("playback-blocked")})}(c),t=e.streams[0],te=t||null,ee&&t&&ee.attachAssistantStream(t))},$=!1,o.onicecandidate=function(e){if(e.candidate){e.candidate.candidate&&-1!==e.candidate.candidate.indexOf(" relay ")&&($=!0);try{a.send("AddRealtimeIceCandidate",e.candidate.candidate,e.candidate.sdpMid||"",e.candidate.sdpMLineIndex||0)}catch(e){}}else $||K||!Q||(clearTimeout(Q),Q=setTimeout(function(){!K&&A&&He("no relay candidate and no direct connection")},5e3))},o.onconnectionstatechange=function(){"connected"===o.connectionState?Pe():"failed"===o.connectionState?K?A&&We():He("connection failed"):"closed"===o.connectionState&&A&&K&&We()},o.oniceconnectionstatechange=function(){var e=o.iceConnectionState;"connected"===e||"completed"===e?Pe():"failed"!==e||K||He("ICE failed")},function(){if(V)return;V=!0,a.on("ReceiveRealtimeAnswer",function(e){z&&z.setRemoteDescription({type:"answer",sdp:e}).then(function(){J=!0;var e=Y;Y=[],e.forEach(function(e){try{z.addIceCandidate(e).catch(function(){})}catch(e){}})}).catch(function(e){console.error("Failed to apply the WebRTC answer.",e)})}),a.on("ReceiveRealtimeIceCandidate",function(e,t,n){if(z&&e){var a={candidate:e,sdpMid:t,sdpMLineIndex:n};if(J)try{z.addIceCandidate(a).catch(function(){})}catch(e){}else Y.push(a)}})}(),Q=setTimeout(function(){!K&&A&&He("connection timed out")},8e3),Ne(n).then(function(e){return z!==o?null:(e&&o.addTrack(e,n),o.createOffer())}).then(function(e){return e&&z===o?o.setLocalDescription(e).then(function(){return e}):null}).then(function(e){if(e){var t=me||null,n=S&&S()||i||"";D(e.sdp,n,t,null,null,ne)}}).catch(function(e){console.error("Failed to create the WebRTC offer; falling back to WebSocket.",e),He("offer failed")})}).catch(function(e){n.getTracks().forEach(function(e){e.stop()}),A=!1,q=!1,m(),Me(),console.error("The realtime WebRTC conversation could not start because the chat connection is not available.",e)})}).catch(function(e){console.error("Microphone access denied:",e),A=!1,q=!1,m(),Me()})}())}function Le(){M&&Ce(),ye();var t=x("realtimeButton");if(t)try{t.blur()}catch(e){}var n={channelCount:1,echoCancellation:{ideal:!0},noiseSuppression:!0,autoGainControl:!0,echoCancellationType:{ideal:"system"},voiceIsolation:{ideal:!0}};de&&(n.deviceId={exact:de}),navigator.mediaDevices.getUserMedia({audio:n}).then(function(t){y().then(function(){P=t,A=!0,f(),Me(),Ee("connecting");var n=e.AudioContext||e.webkitAudioContext;"suspended"===(B=new n({sampleRate:24e3})).state&&"function"==typeof B.resume&&B.resume().catch(function(t){Ee("playback-blocked"),e.console&&console.warn&&console.warn("The browser blocked realtime audio playback. Interact with the page to enable audio.",t)}),H=0,W=[],(F=B.createGain()).gain.value=null!=ue?ue:1,F.connect(B.destination),U=new e.signalR.Subject;var a=B,o=B.createScriptProcessor(4096,1,1);O=o;var r=B.createMediaStreamDestination();F.connect(r),Ne(t).then(function(e){if(A&&B===a&&e){var t=new MediaStream([e]),n=B.createMediaStreamSource(t);N=n,n.connect(o),ee&&ee.attachAssistantStream(r.stream)}}),o.onaudioprocess=function(e){var t,n=e.inputBuffer.getChannelData(0);t=ae?!oe:!ne&&B&&B.currentTime<H+.5;var a=new Int16Array(n.length);if(!t)for(var o=0;o<n.length;o++){var i=Math.max(-1,Math.min(1,n[o]));a[o]=i<0?32768*i:32767*i}for(var r=new Uint8Array(a.buffer),c="",l=0;l<r.length;l++)c+=String.fromCharCode(r[l]);try{U.next(btoa(c))}catch(e){}};var c=B.createGain();c.gain.value=0,G=c,o.connect(c),c.connect(B.destination);var l=me||null,s=S&&S()||i||"";k(U,s,l,null,null,ne),ae&&Se()}).catch(function(e){t.getTracks().forEach(function(e){e.stop()}),A=!1,m(),Me(),console.error("The realtime conversation could not start because the chat connection is not available.",e)})}).catch(function(e){console.error("Microphone access denied:",e),A=!1,m(),Me()})}function je(){if(Ge(),z){try{z.close()}catch(e){}z=null}if(_){try{_.srcObject=null,_.remove()}catch(e){}_=null}q=!1}function Pe(){K||(K=!0,Q&&(clearTimeout(Q),Q=null))}var Be=2e3;function Ue(){return{pushToTalk:!!ae,pttActive:!!oe,bargeIn:!!ne,speechHangoverMs:Be}}function Oe(){ee&&ee.setMode(Ue())}function Ne(e){Ge();var t=e&&e.getAudioTracks()[0]||null;return r(e,Ue()).then(function(e){return ee=e,te&&e.attachAssistantStream(te),e.track||t})}function Ge(){if(ee){try{ee.stop()}catch(e){}ee=null}te=null}function Fe(){s(_,fe)}function He(t){if(!X){X=!0,Q&&(clearTimeout(Q),Q=null),e.console&&console.warn&&console.warn("Realtime WebRTC transport unavailable ("+t+"); falling back to the WebSocket transport."),function(){try{e.sessionStorage.setItem(Z,"1")}catch(e){}}(),Ce();try{P&&P.getTracks().forEach(function(e){e.stop()})}catch(e){}P=null,je(),q=!1,A=!1,Le()}}function We(){if(A)if(Q&&(clearTimeout(Q),Q=null),A=!1,m(),Me(),function(){if(ie){ie=!1,oe=!1;try{t.removeEventListener("keydown",re,!0)}catch(e){}try{t.removeEventListener("keyup",ce,!0)}catch(e){}}}(),function(){if(le=null,se){try{se.remove()}catch(e){}se=null}}(),R||Ee("idle"),q){je();try{P&&P.getTracks().forEach(function(e){e.stop()})}catch(e){}P=null}else{try{U&&U.complete()}catch(e){}U=null,Ge();try{O&&(O.disconnect(),O.onaudioprocess=null)}catch(e){}try{N&&N.disconnect()}catch(e){}try{G&&G.disconnect()}catch(e){}try{F&&F.disconnect()}catch(e){}try{P&&P.getTracks().forEach(function(e){e.stop()})}catch(e){}O=null,N=null,G=null,F=null,P=null,ze();try{B&&B.close()}catch(e){}B=null}}function qe(){A?We():Re()}function ze(){W.forEach(function(e){try{e.stop()}catch(e){}}),W=[],B&&(H=B.currentTime)}function _e(e){return!!e&&-1!==c.indexOf(e.toLowerCase())}var Ve=x("realtimeButton");Ve&&(Ve.addEventListener("click",function(e){e&&0===e.detail&&A||qe()}),function(){var n=x("realtimeButton");if(n&&!pe){pe=!0;var o=ve();be(o);var i=t.createElement("span");i.id="realtime-audio-settings",i.style.position="relative",i.style.display="inline-flex";var r=t.createElement("button");r.type="button",r.className="btn btn-outline-secondary",r.title=g("settingsTitle","Voice settings"),r.setAttribute("aria-label",g("settingsTitle","Voice settings")),r.innerHTML='<i class="bi bi-gear"></i>';var c='<option value=""'+(""===o.language?" selected":"")+">"+g("languageAuto","Automatic")+"</option>"+[["en","English"],["es","Spanish"],["fr","French"],["de","German"],["it","Italian"],["pt","Portuguese"],["nl","Dutch"],["zh","Chinese"],["ja","Japanese"],["ko","Korean"],["ar","Arabic"],["hi","Hindi"],["ru","Russian"]].map(function(e){return'<option value="'+e[0]+'"'+(o.language===e[0]?" selected":"")+">"+e[1]+"</option>"}).join(""),l=t.createElement("div");l.className="card shadow-sm",l.style.cssText="position:absolute;bottom:calc(100% + 6px);right:0;z-index:1080;width:290px;max-height:70vh;overflow:auto;display:none;",l.innerHTML='<div class="card-body p-3"><div class="fw-semibold mb-2" style="font-size:0.85rem;">'+g("settingsTitle","Voice settings")+'</div><label class="form-label mb-1 d-block" style="font-size:0.8rem;">'+g("microphone","Microphone")+'</label><select class="form-select form-select-sm js-mic mb-2"><option value="">'+g("defaultMicrophone","Default microphone")+'</option></select><label class="form-label mb-1 d-block" style="font-size:0.8rem;">'+g("speaker","Speaker")+'</label><select class="form-select form-select-sm js-out mb-1"><option value="">'+g("automatic","Automatic")+'</option></select><button type="button" class="btn btn-outline-secondary btn-sm mb-2 js-pick-out" style="display:none;">'+g("chooseSpeaker","Choose speaker…")+'</button><div class="form-text mb-2 js-out-help">'+g("speakerHelp","Automatic uses the device your system uses for calls. If you cannot hear the assistant, pick the speakers you are actually listening to.")+'</div><label class="form-label mb-1 d-block" style="font-size:0.8rem;">'+g("assistantVolume","Assistant volume")+': <strong class="js-vol-val">'+Math.round(100*o.volume)+'</strong>%</label><input type="range" class="form-range js-vol mb-2" min="0" max="100" step="5" value="'+Math.round(100*o.volume)+'"><label class="form-label mb-1 d-block" style="font-size:0.8rem;">'+g("language","Language")+'</label><select class="form-select form-select-sm js-lang mb-2">'+c+'</select><div class="form-check form-switch mb-1"><input class="form-check-input js-barge" type="checkbox" id="realtime-setting-barge"'+(o.bargeIn?" checked":"")+'><label class="form-check-label" for="realtime-setting-barge">'+g("allowInterruptions","Allow interruptions")+'</label></div><div class="form-text mb-2">'+g("allowInterruptionsHelp","Talk over the assistant to interrupt it. Turn this off if the assistant keeps hearing itself through your speakers.")+'</div><div class="form-check form-switch mb-1"><input class="form-check-input js-ptt" type="checkbox" id="realtime-setting-ptt"'+(o.pushToTalk?" checked":"")+'><label class="form-check-label" for="realtime-setting-ptt">'+g("pushToTalk","Push-to-talk")+'</label></div><div class="form-text">'+g("pushToTalkHelp","Hold <kbd>Space</kbd> (or the button) to talk. For very noisy places.")+"</div></div>",i.appendChild(r),i.appendChild(l),n.insertAdjacentElement("afterend",i);var s=l.querySelector(".js-barge"),u=l.querySelector(".js-ptt"),d=l.querySelector(".js-vol"),f=l.querySelector(".js-vol-val"),m=l.querySelector(".js-mic"),p=l.querySelector(".js-out"),v=l.querySelector(".js-pick-out"),h=l.querySelector(".js-lang");y(),navigator.mediaDevices&&"function"==typeof navigator.mediaDevices.addEventListener&&navigator.mediaDevices.addEventListener("devicechange",function(){y(),A&&de&&navigator.mediaDevices.enumerateDevices().then(function(e){e.some(function(e){return"audioinput"===e.kind&&e.deviceId===de})||we("device_lost")}).catch(function(){})}),r.addEventListener("click",function(n){n.stopPropagation();var a="none"===l.style.display;a&&(l.style.display="block",function(){l.style.right="0px",l.style.left="auto";var n=l.getBoundingClientRect();n.left<8&&(l.style.right=n.left-8+"px");for(var a=r.getBoundingClientRect(),o=8,i=l.parentElement?l.parentElement.parentElement:null;i&&i!==t.body&&i!==t.documentElement;){var c=e.getComputedStyle(i);if("auto"===c.overflowY||"scroll"===c.overflowY||"hidden"===c.overflowY||"fixed"===c.position){o=Math.max(o,i.getBoundingClientRect().top);break}i=i.parentElement}l.style.maxHeight=Math.max(160,a.top-o-10)+"px"}(),y()),l.style.display=a?"block":"none"}),l.addEventListener("click",function(e){e.stopPropagation()}),t.addEventListener("click",function(){l.style.display="none"}),s.addEventListener("change",b),u.addEventListener("change",b),d.addEventListener("input",function(){f.textContent=d.value,b()}),m.addEventListener("change",b),h.addEventListener("change",b),p.addEventListener("change",function(){b(),Fe()}),navigator.mediaDevices&&"function"==typeof navigator.mediaDevices.selectAudioOutput&&(v.style.display="",v.addEventListener("click",function(){navigator.mediaDevices.selectAudioOutput().then(function(e){if(e&&e.deviceId){var n=t.createElement("option");n.value=e.deviceId,n.textContent=e.label||g("selectedSpeaker","Selected speaker"),p.appendChild(n),p.value=e.deviceId,b(),Fe()}}).catch(function(){})}))}function b(){var e={bargeIn:s.checked,pushToTalk:u.checked,volume:(parseInt(d.value,10)||0)/100,micDeviceId:m.value||"",outputDeviceId:p.value||"",language:h.value||"",version:3};be(e),he(e),function(){if(A&&a&&"function"==typeof a.send)try{a.send("UpdateRealtimeSettings",ne,null,null)}catch(e){}}()}function y(){navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices&&navigator.mediaDevices.enumerateDevices().then(function(e){var t=['<option value="">'+g("defaultMicrophone","Default microphone")+"</option>"];e.filter(function(e){return"audioinput"===e.kind}).forEach(function(e,n){var a=e.label||g("microphone","Microphone")+" "+(n+1);t.push('<option value="'+e.deviceId+'"'+(e.deviceId===de?" selected":"")+">"+a.replace(/</g,"")+"</option>")}),m.innerHTML=t.join("");var n=e.filter(function(e){return"audiooutput"===e.kind&&e.deviceId&&"communications"!==e.deviceId&&"default"!==e.deviceId});if(n.length){var a=['<option value="">'+g("automatic","Automatic")+"</option>"];n.forEach(function(e,t){var n=e.label||g("speaker","Speaker")+" "+(t+1);a.push('<option value="'+e.deviceId+'"'+(e.deviceId===fe?" selected":"")+">"+n.replace(/</g,"")+"</option>")}),p.innerHTML=a.join("")}}).catch(function(){})}}());var Je=x("deploymentSelect");Je&&Je.addEventListener("change",function(){Te(_e(Je.value))}),Te(l||Je&&_e(Je.value));var Ye={toggle:qe,start:Re,stop:We,applyMode:Te,isRealtimeDeployment:_e,receivePcm:function(e){if(B&&e&&!(e.length<2)){for(var t=B,n=Math.floor(e.length/2),a=new Int16Array(e.buffer,e.byteOffset,n),o=new Float32Array(n),i=0;i<n;i++)o[i]=a[i]/32768;var r=t.createBuffer(1,n,t.sampleRate);r.copyToChannel(o,0);var c=t.createBufferSource();c.buffer=r,c.connect(F||t.destination);var l=t.currentTime;H<l&&(H=l),c.start(H),H+=r.duration,W.push(c),c.onended=function(){W=W.filter(function(e){return e!==c})}}},isActive:function(){return A},getState:function(){return w},getGateLevel:function(){return ee?ee.getLevel():null},getTransportStats:function(){return z&&"function"==typeof z.getStats?z.getStats().then(function(e){var t={transport:"webrtc",inbound:null,codec:null,sinkId:_&&"string"==typeof _.sinkId?_.sinkId:null,jitterBufferTargetMs:function(){try{var e=z.getReceivers().filter(function(e){return e.track&&"audio"===e.track.kind})[0];return e&&"jitterBufferTarget"in e?e.jitterBufferTarget:null}catch(e){return null}}()};return e.forEach(function(n){if("inbound-rtp"===n.type&&"audio"===n.kind&&(t.inbound={packetsReceived:n.packetsReceived,packetsLost:n.packetsLost,packetsDiscarded:n.packetsDiscarded,jitterMs:"number"==typeof n.jitter?Math.round(1e3*n.jitter):null,jitterBufferDelayMs:"number"==typeof n.jitterBufferDelay&&n.jitterBufferEmittedCount?Math.round(n.jitterBufferDelay/n.jitterBufferEmittedCount*1e3):null,totalSamplesReceived:n.totalSamplesReceived,concealedSamples:n.concealedSamples,concealmentEvents:n.concealmentEvents,silentConcealedSamples:n.silentConcealedSamples,insertedSamplesForDeceleration:n.insertedSamplesForDeceleration,removedSamplesForAcceleration:n.removedSamplesForAcceleration,audioLevel:n.audioLevel},n.codecId)){var a=e.get(n.codecId);a&&(t.codec={mimeType:a.mimeType,clockRate:a.clockRate,channels:a.channels,sdpFmtpLine:a.sdpFmtpLine})}}),t}).catch(function(){return null}):Promise.resolve(null)}};return e.CoreAIRealtime.activeController=Ye,Ye},createMicGate:r,decideGate:n,createGateState:a,rmsDb:o,routeOutputToPreferredDevice:s,ensurePlayback:u}}(window,document);
1
+ !function(e,t){"use strict";function n(e,t){var n=t.micDb,a="number"==typeof t.assistantDb?t.assistantDb:-100,o=t.nowMs,i=t.mode||{},r=null===e.lastMs?0:Math.max(0,Math.min(50,o-e.lastMs));e.lastMs=o,a>-50&&(e.assistantUntil=o+400);var c=o<e.assistantUntil;if(a>e.assistantPeakDb?e.assistantPeakDb=a:e.assistantPeakDb=Math.max(-100,e.assistantPeakDb-.02*r),n<=-95){if(null===e.floorDb)return e.open=!1,e}else null===e.floorDb&&(e.floorDb=Math.min(n,-50));if(n<e.floorDb)e.floorDb+=(n-e.floorDb)*Math.min(1,.0075*r);else if(!c){var l=null!==e.openSince&&o-e.openSince>1e4,s=e.open&&!l?1e-4:56e-5;e.floorDb+=(n-e.floorDb)*Math.min(1,s*r)}if(e.floorDb<-75&&(e.floorDb=-75),c&&!e.open&&a>-50&&!i.pushToTalk){var u=n-e.assistantPeakDb;if(null===e.echoReturnDb)e.echoReturnDb=u;else{var d=e.echoLearnedMs<1e3,f=u>e.echoReturnDb?d?.02:.0012:6e-4;e.echoReturnDb+=(u-e.echoReturnDb)*Math.min(1,f*r)}e.echoLearnedMs+=r}var p,m,v=null===e.echoReturnDb?-100:e.assistantPeakDb+e.echoReturnDb;c?(p=Math.max(e.floorDb+12,v+8,-45),m=Math.max(e.floorDb+3,v+3)):(p=e.floorDb+9,m=e.floorDb+3);var h=i.speechHangoverMs||2e3;n>p?c&&!e.open?(null===e.aboveSince&&(e.aboveSince=o),o-e.aboveSince>=250&&(e.speakUntil=o+h)):e.speakUntil=o+h:(e.aboveSince=null,e.open&&n>m&&(e.speakUntil=Math.max(e.speakUntil,o+250)));var b=o<e.speakUntil;return!c&&e.wasAssistantSpeaking&&(e.listenGraceUntil=o+1500),e.wasAssistantSpeaking=c,e.assistantSpeaking=c,i.pushToTalk?e.open=!!i.pttActive:i.bargeIn?e.open=b:e.open=!c&&(b||o<e.listenGraceUntil),e.open&&null===e.openSince?e.openSince=o:e.open||(e.openSince=null),e}function a(){return{floorDb:null,lastMs:null,speakUntil:0,assistantUntil:0,assistantPeakDb:-100,echoReturnDb:null,echoLearnedMs:0,aboveSince:null,listenGraceUntil:0,wasAssistantSpeaking:!1,assistantSpeaking:!1,open:!1,openSince:null}}function o(e){if(!e||!e.length)return-100;for(var t=0,n=0;n<e.length;n++)t+=e[n]*e[n];var a=Math.sqrt(t/e.length);return a>1e-7?20*Math.log10(a):-100}var i=["var decide = "+n.toString()+";","var newState = "+a.toString()+";","var rmsDb = "+o.toString()+";","class CoreAiMicGateProcessor extends AudioWorkletProcessor {"," constructor(options) {"," super();"," var o = (options && options.processorOptions) || {};"," this.delay = new Float32Array(Math.max(1, Math.round(sampleRate * (o.lookaheadMs || 80) / 1000)));"," this.delayPos = 0;"," this.gain = 0;"," this.mode = o.mode || {};"," this.state = newState();"," this.lastPost = 0;"," this.port.onmessage = function (e) { this.mode = e.data || {}; }.bind(this);"," }"," process(inputs, outputs) {"," var mic = (inputs[0] && inputs[0][0]) || null;"," var assistant = (inputs[1] && inputs[1][0]) || null;"," var out = (outputs[0] && outputs[0][0]) || null;"," if (!out) { return true; }"," var micDb = rmsDb(mic);"," decide(this.state, { micDb: micDb, assistantDb: rmsDb(assistant), nowMs: currentTime * 1000, mode: this.mode });"," var target = this.state.open ? 1 : 0;"," var step = 1 / (sampleRate * 0.01);"," var delay = this.delay;"," var pos = this.delayPos;"," var len = delay.length;"," for (var i = 0; i < out.length; i++) {"," var delayed = delay[pos];"," delay[pos] = mic ? mic[i] : 0;"," pos = (pos + 1) % len;"," if (this.gain < target) { this.gain = Math.min(target, this.gain + step); }"," else if (this.gain > target) { this.gain = Math.max(target, this.gain - step); }"," out[i] = delayed * this.gain;"," }"," this.delayPos = pos;"," if (currentTime * 1000 - this.lastPost > 100) {"," this.lastPost = currentTime * 1000;"," this.port.postMessage({ micDb: micDb, floorDb: this.state.floorDb, echoReturnDb: this.state.echoReturnDb, open: this.state.open, assistantSpeaking: this.state.assistantSpeaking });"," }"," return true;"," }","}",'registerProcessor("coreai-mic-gate", CoreAiMicGateProcessor);'].join("\n");function r(t,n){var a=t&&t.getAudioTracks&&t.getAudioTracks()[0]||null,o={ctx:null,node:null,micSource:null,remoteSource:null,dest:null,timer:0,level:null,fallback:null,track:a,stopped:!1},r={track:a,usingWorklet:!1,getLevel:function(){return o.level},setMode:function(e){if(n=e||n,o.node&&o.node.port)try{o.node.port.postMessage(n)}catch(e){}o.fallback&&(o.fallback.mode=n)},attachAssistantStream:function(e){c(o,e)},stop:function(){if(o.stopped=!0,o.timer){try{e.clearInterval(o.timer)}catch(e){}o.timer=0}if(o.node){try{o.node.port.onmessage=null,o.node.disconnect()}catch(e){}o.node=null}if(o.micSource){try{o.micSource.disconnect()}catch(e){}o.micSource=null}if(o.remoteSource){try{o.remoteSource.disconnect()}catch(e){}o.remoteSource=null}if(o.dest){try{o.dest.disconnect()}catch(e){}o.dest=null}if(o.ctx){try{o.ctx.close()}catch(e){}o.ctx=null}o.fallback=null}},s=e.AudioContext||e.webkitAudioContext;if(!s||!a)return Promise.resolve(r);try{o.ctx=new s,"suspended"===o.ctx.state&&"function"==typeof o.ctx.resume&&o.ctx.resume().catch(function(){})}catch(e){return o.ctx=null,Promise.resolve(r)}var u=null;if(o.ctx.audioWorklet&&"function"==typeof o.ctx.audioWorklet.addModule)try{u=URL.createObjectURL(new Blob([i],{type:"application/javascript"}))}catch(e){u=null}return u?o.ctx.audioWorklet.addModule(u).then(function(){try{URL.revokeObjectURL(u)}catch(e){}if(o.stopped)return r;var i=new AudioWorkletNode(o.ctx,"coreai-mic-gate",{numberOfInputs:2,numberOfOutputs:1,outputChannelCount:[1],processorOptions:{lookaheadMs:80,mode:n}});return o.node=i,i.port.onmessage=function(t){o.level=t.data||null,e.CoreAIRealtime.lastGateLevel=o.level},o.micSource=o.ctx.createMediaStreamSource(t),o.micSource.connect(i,0,0),o.dest=o.ctx.createMediaStreamDestination(),i.connect(o.dest),o.pendingRemoteStream&&c(o,o.pendingRemoteStream),r.track=o.dest.stream.getAudioTracks()[0]||a,r.usingWorklet=!0,r}).catch(function(i){try{URL.revokeObjectURL(u)}catch(e){}return e.console&&console.warn&&console.warn("The realtime microphone gate worklet could not be loaded; using the simpler gate.",i),r.track=l(o,t,a,n),r}):(r.track=l(o,t,a,n),Promise.resolve(r))}function c(e,t){if(e.pendingRemoteStream=t||null,e.ctx&&t&&!e.stopped)try{if(e.remoteSource)try{e.remoteSource.disconnect()}catch(e){}var n=e.ctx.createMediaStreamSource(t);if(e.remoteSource=n,e.node)return void n.connect(e.node,0,1);if(e.fallback){var a=e.ctx.createAnalyser();a.fftSize=2048,n.connect(a),e.fallback.remoteAnalyser=a,e.fallback.remoteData=new Float32Array(a.fftSize)}}catch(e){}}function l(t,a,i,r){try{var l=t.ctx,s=l.createMediaStreamSource(a);t.micSource=s;var u=l.createAnalyser();u.fftSize=2048,s.connect(u);var d=l.createGain();d.gain.value=0,s.connect(d);var f=l.createMediaStreamDestination();t.dest=f,d.connect(f);var p={mode:r,remoteAnalyser:null,remoteData:null};t.fallback=p,t.pendingRemoteStream&&c(t,t.pendingRemoteStream);var m=new Float32Array(u.fftSize),v={floorDb:null,lastMs:null,speakUntil:0,assistantUntil:0,assistantPeakDb:-100,echoReturnDb:null,echoLearnedMs:0,aboveSince:null,listenGraceUntil:0,wasAssistantSpeaking:!1,assistantSpeaking:!1,open:!1,openSince:null};return t.timer=e.setInterval(function(){u.getFloatTimeDomainData(m);var a=o(m),i=-100;p.remoteAnalyser&&p.remoteData&&(p.remoteAnalyser.getFloatTimeDomainData(p.remoteData),i=o(p.remoteData));var r=e.performance&&performance.now?performance.now():Date.now();n(v,{micDb:a,assistantDb:i,nowMs:r,mode:p.mode||{}}),t.level={micDb:a,floorDb:v.floorDb,open:v.open,assistantSpeaking:v.assistantSpeaking};var c=v.open?1:0;try{d.gain.setTargetAtTime(c,l.currentTime,.015)}catch(e){d.gain.value=c}},20),f.stream.getAudioTracks()[0]||i}catch(e){return i}}function s(e,t){if(e&&"function"==typeof e.setSinkId)if(t)try{e.setSinkId(t).catch(function(){})}catch(e){}else navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices&&navigator.mediaDevices.enumerateDevices().then(function(t){var n=t.filter(function(e){return"audiooutput"===e.kind});if(n.length){for(var a="",o=0;o<n.length;o++)if("communications"===n[o].deviceId){a="communications";break}if(!a){for(var i=null,r=0;r<n.length;r++)if("default"===n[r].deviceId){i=n[r];break}if(i&&i.groupId)for(var c=0;c<n.length;c++)if("default"!==n[c].deviceId&&"communications"!==n[c].deviceId&&n[c].groupId===i.groupId){a=n[c].deviceId;break}}if(a)try{e.setSinkId(a).catch(function(){})}catch(e){}}}).catch(function(){})}function u(t,n){if(t&&"function"==typeof t.play){var a=t.play();a&&"function"==typeof a.catch&&a.catch(function(t){"function"==typeof n&&n(t),e.console&&console.warn&&console.warn("The browser blocked realtime audio playback. Interact with the page to enable audio.",t)})}}e.CoreAIRealtime={attach:function(n){var a=(n=n||{}).connection,o=n.selectors||{},i=n.voiceName||"",c=(n.capableDeployments||[]).map(function(e){return(e||"").toLowerCase()}),l=!!n.realtimeEnabled,d=function(){},f=n.onActivate||d,p=n.onDeactivate||d,m=n.onEnterRealtimeMode||d,v=n.onUserTurnPending||d,h=n.onUserTurnDropped||d,b=n.strings||{};function g(e,t){return"string"==typeof b[e]?b[e]:t}var y=n.ensureConnected||function(){return Promise.resolve(!0)},k=n.sendStart||d,S=n.getVoiceName||null,D=n.sendStartWebRtc||null,M=!0===n.webRtcEnabled&&"function"==typeof e.RTCPeerConnection&&!!D,T=Array.isArray(n.webRtcIceServers)&&n.webRtcIceServers.length?n.webRtcIceServers:null,I=[{urls:"stun:stun.l.google.com:19302"}],E=n.onStateChange||d,w="idle";function x(e){var n=o[e];return n?t.querySelector(n):null}var A=!1,C=!1,R=null,L=null,j=null,P=null,B=null,U=null,O=null,N=null,G=null,F=null,H=0,W=[],q=!1,z=null,_=null,V=!1,J=!1,Y=[],K=!1,Q=null,X=!1,Z="coreai.realtime.webrtcBlocked",$=!1,ee=null,te=null,ne=!0,ae=!1,oe=!1,ie=!1,re=null,ce=null,le=null,se=null,ue=1,de="",fe="",pe="",me=!1;function ve(){var t={bargeIn:!0,pushToTalk:!1,volume:1,micDeviceId:"",outputDeviceId:"",language:"",version:0};try{var n=e.localStorage.getItem("coreai.realtime.audioPrefs");if(n){var a=JSON.parse(n);"boolean"==typeof a.bargeIn&&(t.bargeIn=a.bargeIn),"boolean"==typeof a.pushToTalk&&(t.pushToTalk=a.pushToTalk),"number"==typeof a.volume&&isFinite(a.volume)&&(t.volume=Math.min(1,Math.max(0,a.volume))),"string"==typeof a.micDeviceId&&(t.micDeviceId=a.micDeviceId),"string"==typeof a.outputDeviceId&&(t.outputDeviceId=a.outputDeviceId),"string"==typeof a.language&&(t.language=a.language),"number"==typeof a.version&&(t.version=a.version)}}catch(e){}return function(e){if(3===e.version)return e;return e.version=3,e.bargeIn=!0,e.pushToTalk=!1,he(e),e}(t)}function he(t){try{e.localStorage.setItem("coreai.realtime.audioPrefs",JSON.stringify(t))}catch(e){}}function be(e){ne=!1!==e.bargeIn,ae=!!e.pushToTalk,ue="number"==typeof e.volume?e.volume:1,de=e.micDeviceId||"",fe=e.outputDeviceId||"",pe=e.language||"",Oe(),F&&(F.gain.value=ue),_&&(_.volume=Math.max(0,Math.min(1,ue)))}function ge(e){if(!e||!e.tagName)return!1;var t=e.tagName.toLowerCase();return"input"===t||"textarea"===t||"select"===t||!0===e.isContentEditable}function ye(){ie||(ie=!0,oe=!1,re=function(e){!ae||ge(e.target)||"Space"!==e.code&&" "!==e.key||(e.preventDefault(),e.repeat||ke(!0))},ce=function(e){!ae||ge(e.target)||"Space"!==e.code&&" "!==e.key||(e.preventDefault(),ke(!1))},t.addEventListener("keydown",re,!0),t.addEventListener("keyup",ce,!0))}function ke(e){oe=e,Oe(),le&&(le.classList.toggle("btn-danger",e),le.classList.toggle("btn-outline-primary",!e),le.innerHTML=e?'<i class="fa-solid fa-microphone me-1"></i> Listening…':'<i class="fa-solid fa-microphone me-1"></i> Hold to talk')}function Se(){var n=x("realtimeButton");if(n&&!se){var a=e.matchMedia&&e.matchMedia("(pointer: coarse)").matches,o=t.createElement("div");o.className="text-center mt-2";var i=t.createElement("button");i.type="button",i.className="btn btn-outline-primary btn-sm",i.innerHTML='<i class="fa-solid fa-microphone me-1"></i> Hold to talk';var r=t.createElement("div");r.className="form-text mt-1 mb-0",r.innerHTML=a?"Push-to-talk is on — press and hold the button to speak.":"Push-to-talk is on — hold <kbd>Space</kbd> or this button to speak.",o.appendChild(i),o.appendChild(r);var c=n.parentElement;c&&c.parentElement?c.parentElement.appendChild(o):n.insertAdjacentElement("afterend",o),le=i,se=o,i.addEventListener("pointerdown",function(e){e.preventDefault(),ke(!0)}),i.addEventListener("pointerup",function(){ke(!1)}),i.addEventListener("pointerleave",function(){ke(!1)}),i.addEventListener("pointercancel",function(){ke(!1)}),ke(!1)}}function De(n,a){if(a)if(e.DOMPurify&&"function"==typeof e.DOMPurify.sanitize)n.replaceChildren(e.DOMPurify.sanitize(a,{RETURN_DOM_FRAGMENT:!0}));else{var o=a.replace(/<[^>]*>/g," ").replace(/\s+/g," ").trim();n.replaceChildren(t.createTextNode(o))}}function Me(){var e=x("realtimeButton");e&&(A?(e.classList.add("active","btn-primary"),e.classList.remove("btn-dark","btn-outline-dark","btn-outline-secondary"),e.title=e.getAttribute("data-end-title")||"End Conversation",De(e,e.getAttribute("data-end-html"))):(e.classList.remove("active","btn-primary","btn-dark","btn-outline-secondary"),e.classList.add("btn-outline-dark"),e.blur(),e.title=e.getAttribute("data-start-title")||"Start speaking",De(e,e.getAttribute("data-start-html"))))}function Te(e){l=e;var n=x("realtimeButton"),a=x("micButton"),o=x("conversationButton"),i=x("input"),r=x("sendButton"),c=t.getElementById("realtime-audio-settings");e?(m(),i&&(i.hidden=!0),r&&(r.hidden=!0),a&&(a.hidden=!0),o&&(o.hidden=!0),n&&(n.hidden=!1),c&&(c.hidden=!1)):(A&&We(),n&&(n.hidden=!0),c&&(c.hidden=!0),function(){if(!L)return;try{L.remove()}catch(e){}L=null}(),Ae(),i&&(i.hidden=!1),r&&(r.hidden=!1),a&&(a.hidden=!1),o&&(o.hidden=!1)),Me()}var Ie={"requesting-mic":g("requestingMic","Waiting for microphone access…"),connecting:g("connecting","Connecting…"),listening:g("listening","Listening"),"playback-blocked":g("playbackBlocked","Audio is blocked by the browser — click the page to enable it.")};function Ee(e,t){if(w!==e){w=e;var n=Ie[e];n?xe(n,!1):"idle"===e&&Ae();try{E({state:e,transport:q?"webrtc":"websocket",detail:t||null})}catch(e){}}}function we(t){R=t,We(),Ee("ended",t),e.console&&console.info&&console.info("The realtime voice session ended ("+t+")."),"idle"===t?xe(g("endedIdle","Voice paused after a period of silence."),!0):"disconnected"===t?xe(g("endedDisconnected","Voice session ended — the connection dropped."),!0):"error"===t?xe(g("endedError","Voice session ended unexpectedly."),!0):"device_lost"===t&&xe(g("endedDeviceLost","Voice session ended — the microphone was disconnected."),!0)}function xe(e,n){var a=x("realtimeButton");if(a){if(!j){(j=t.createElement("div")).className="form-text mt-2 mb-0 text-center",j.setAttribute("role","status"),j.setAttribute("aria-live","polite");var o=a.parentElement;o&&o.parentElement?o.parentElement.appendChild(j):a.insertAdjacentElement("afterend",j)}if(j.replaceChildren(),j.appendChild(t.createTextNode(e)),n){var i=t.createElement("button");i.type="button",i.className="btn btn-link btn-sm p-0 ms-2 align-baseline",i.textContent=g("resume","Resume"),i.addEventListener("click",function(){Ae(),Re()}),j.appendChild(i)}}}function Ae(){if(j){try{j.remove()}catch(e){}j=null}}function Ce(){if(!L){var e=x("realtimeButton");if(e){var n=t.createElement("div");n.className="form-text mt-2 mb-0 text-center",n.setAttribute("role","status"),n.textContent=g("compatibilityMode","Using compatibility audio mode. Echo cancellation may be weaker — headphones are recommended.");var a=e.parentElement;a&&a.parentElement?a.parentElement.appendChild(n):e.insertAdjacentElement("afterend",n),L=n}}}function Re(){l&&!A&&a&&(be(ve()),X=!1,R=null,Ae(),!C&&a&&(C=!0,a.on("ReceiveRealtimeEvent",function(e,t,n){A&&("session_ready"===t?Ee("listening"):"session_ended"===t?we(n||"completed"):"speech_started"===t?ne&&ze():"playback_flush"===t?ze():"user_turn_pending"===t?v(n):"user_turn_dropped"===t&&h(n))}),a.on("ReceiveError",function(){A&&(!q||K||X?we("error"):He("server reported an error before the peer connected"))}),"function"==typeof a.onclose&&a.onclose(function(){A&&we("disconnected")}),"function"==typeof a.onreconnecting&&a.onreconnecting(function(){A&&we("disconnected")})),Ee("requesting-mic"),!M||function(){try{return"1"===e.sessionStorage.getItem(Z)}catch(e){return!1}}()?Le():function(){var n={echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};de&&(n.deviceId={exact:de});navigator.mediaDevices.getUserMedia({audio:n}).then(function(n){y().then(function(){return T?Promise.resolve(T):a&&"function"==typeof a.invoke?a.invoke("GetRealtimeIceServers").then(function(e){return Array.isArray(e)&&e.length?e:I}).catch(function(t){return e.console&&console.warn&&console.warn("Could not resolve the realtime ICE servers; using the default STUN server.",t),I}):Promise.resolve(I)}).then(function(e){P=n,A=!0,q=!0,f(),Me(),Ee("connecting"),J=!1,Y=[],K=!1;var o=new RTCPeerConnection({iceServers:e});z=o,ye();var r=x("realtimeButton");if(r)try{r.blur()}catch(e){}ae&&Se();var c=t.createElement("audio");c.autoplay=!0,c.style.display="none",c.volume=Math.max(0,Math.min(1,null!=ue?ue:1)),t.body.appendChild(c),_=c,s(c,fe),o.ontrack=function(e){try{e.receiver&&"jitterBufferTarget"in e.receiver&&(e.receiver.jitterBufferTarget=150)}catch(e){}var t;e.streams&&e.streams[0]&&(c.srcObject=e.streams[0],function(e){u(e,function(){Ee("playback-blocked")})}(c),t=e.streams[0],te=t||null,ee&&t&&ee.attachAssistantStream(t))},$=!1,o.onicecandidate=function(e){if(e.candidate){e.candidate.candidate&&-1!==e.candidate.candidate.indexOf(" relay ")&&($=!0);try{a.send("AddRealtimeIceCandidate",e.candidate.candidate,e.candidate.sdpMid||"",e.candidate.sdpMLineIndex||0)}catch(e){}}else $||K||!Q||(clearTimeout(Q),Q=setTimeout(function(){!K&&A&&He("no relay candidate and no direct connection")},5e3))},o.onconnectionstatechange=function(){"connected"===o.connectionState?Pe():"failed"===o.connectionState?K?A&&We():He("connection failed"):"closed"===o.connectionState&&A&&K&&We()},o.oniceconnectionstatechange=function(){var e=o.iceConnectionState;"connected"===e||"completed"===e?Pe():"failed"!==e||K||He("ICE failed")},function(){if(V)return;V=!0,a.on("ReceiveRealtimeAnswer",function(e){z&&z.setRemoteDescription({type:"answer",sdp:e}).then(function(){J=!0;var e=Y;Y=[],e.forEach(function(e){try{z.addIceCandidate(e).catch(function(){})}catch(e){}})}).catch(function(e){console.error("Failed to apply the WebRTC answer.",e)})}),a.on("ReceiveRealtimeIceCandidate",function(e,t,n){if(z&&e){var a={candidate:e,sdpMid:t,sdpMLineIndex:n};if(J)try{z.addIceCandidate(a).catch(function(){})}catch(e){}else Y.push(a)}})}(),Q=setTimeout(function(){!K&&A&&He("connection timed out")},8e3),Ne(n).then(function(e){return z!==o?null:(e&&o.addTrack(e,n),o.createOffer())}).then(function(e){return e&&z===o?o.setLocalDescription(e).then(function(){return e}):null}).then(function(e){if(e){var t=pe||null,n=S&&S()||i||"";D(e.sdp,n,t,null,null,ne)}}).catch(function(e){console.error("Failed to create the WebRTC offer; falling back to WebSocket.",e),He("offer failed")})}).catch(function(e){n.getTracks().forEach(function(e){e.stop()}),A=!1,q=!1,p(),Me(),console.error("The realtime WebRTC conversation could not start because the chat connection is not available.",e)})}).catch(function(e){console.error("Microphone access denied:",e),A=!1,q=!1,p(),Me()})}())}function Le(){M&&Ce(),ye();var t=x("realtimeButton");if(t)try{t.blur()}catch(e){}var n={channelCount:1,echoCancellation:{ideal:!0},noiseSuppression:!0,autoGainControl:!0,echoCancellationType:{ideal:"system"},voiceIsolation:{ideal:!0}};de&&(n.deviceId={exact:de}),navigator.mediaDevices.getUserMedia({audio:n}).then(function(t){y().then(function(){P=t,A=!0,f(),Me(),Ee("connecting");var n=e.AudioContext||e.webkitAudioContext;"suspended"===(B=new n({sampleRate:24e3})).state&&"function"==typeof B.resume&&B.resume().catch(function(t){Ee("playback-blocked"),e.console&&console.warn&&console.warn("The browser blocked realtime audio playback. Interact with the page to enable audio.",t)}),H=0,W=[],(F=B.createGain()).gain.value=null!=ue?ue:1,F.connect(B.destination),U=new e.signalR.Subject;var a=B,o=B.createScriptProcessor(4096,1,1);O=o;var r=B.createMediaStreamDestination();F.connect(r),Ne(t).then(function(e){if(A&&B===a&&e){var t=new MediaStream([e]),n=B.createMediaStreamSource(t);N=n,n.connect(o),ee&&ee.attachAssistantStream(r.stream)}}),o.onaudioprocess=function(e){var t,n=e.inputBuffer.getChannelData(0);t=ae?!oe:!ne&&B&&B.currentTime<H+.5;var a=new Int16Array(n.length);if(!t)for(var o=0;o<n.length;o++){var i=Math.max(-1,Math.min(1,n[o]));a[o]=i<0?32768*i:32767*i}for(var r=new Uint8Array(a.buffer),c="",l=0;l<r.length;l++)c+=String.fromCharCode(r[l]);try{U.next(btoa(c))}catch(e){}};var c=B.createGain();c.gain.value=0,G=c,o.connect(c),c.connect(B.destination);var l=pe||null,s=S&&S()||i||"";k(U,s,l,null,null,ne),ae&&Se()}).catch(function(e){t.getTracks().forEach(function(e){e.stop()}),A=!1,p(),Me(),console.error("The realtime conversation could not start because the chat connection is not available.",e)})}).catch(function(e){console.error("Microphone access denied:",e),A=!1,p(),Me()})}function je(){if(Ge(),z){try{z.close()}catch(e){}z=null}if(_){try{_.srcObject=null,_.remove()}catch(e){}_=null}q=!1}function Pe(){K||(K=!0,Q&&(clearTimeout(Q),Q=null))}var Be=2e3;function Ue(){return{pushToTalk:!!ae,pttActive:!!oe,bargeIn:!!ne,speechHangoverMs:Be}}function Oe(){ee&&ee.setMode(Ue())}function Ne(e){Ge();var t=e&&e.getAudioTracks()[0]||null;return r(e,Ue()).then(function(e){return ee=e,te&&e.attachAssistantStream(te),e.track||t})}function Ge(){if(ee){try{ee.stop()}catch(e){}ee=null}te=null}function Fe(){s(_,fe)}function He(t){if(!X){X=!0,Q&&(clearTimeout(Q),Q=null),e.console&&console.warn&&console.warn("Realtime WebRTC transport unavailable ("+t+"); falling back to the WebSocket transport."),function(){try{e.sessionStorage.setItem(Z,"1")}catch(e){}}(),Ce();try{P&&P.getTracks().forEach(function(e){e.stop()})}catch(e){}P=null,je(),q=!1,A=!1,Le()}}function We(){if(A)if(Q&&(clearTimeout(Q),Q=null),A=!1,p(),Me(),function(){if(ie){ie=!1,oe=!1;try{t.removeEventListener("keydown",re,!0)}catch(e){}try{t.removeEventListener("keyup",ce,!0)}catch(e){}}}(),function(){if(le=null,se){try{se.remove()}catch(e){}se=null}}(),R||Ee("idle"),q){je();try{P&&P.getTracks().forEach(function(e){e.stop()})}catch(e){}P=null}else{try{U&&U.complete()}catch(e){}U=null,Ge();try{O&&(O.disconnect(),O.onaudioprocess=null)}catch(e){}try{N&&N.disconnect()}catch(e){}try{G&&G.disconnect()}catch(e){}try{F&&F.disconnect()}catch(e){}try{P&&P.getTracks().forEach(function(e){e.stop()})}catch(e){}O=null,N=null,G=null,F=null,P=null,ze();try{B&&B.close()}catch(e){}B=null}}function qe(){A?We():Re()}function ze(){W.forEach(function(e){try{e.stop()}catch(e){}}),W=[],B&&(H=B.currentTime)}function _e(e){return!!e&&-1!==c.indexOf(e.toLowerCase())}var Ve=x("realtimeButton");Ve&&(Ve.addEventListener("click",function(e){e&&0===e.detail&&A||qe()}),function(){var n=x("realtimeButton");if(n&&!me){me=!0;var o=ve();be(o);var i=t.createElement("span");i.id="realtime-audio-settings",i.style.position="relative",i.style.display="inline-flex";var r=t.createElement("button");r.type="button",r.className="btn btn-outline-secondary",r.title=g("settingsTitle","Voice settings"),r.setAttribute("aria-label",g("settingsTitle","Voice settings")),r.innerHTML='<i class="fa-solid fa-gear"></i>';var c='<option value=""'+(""===o.language?" selected":"")+">"+g("languageAuto","Automatic")+"</option>"+[["en","English"],["es","Spanish"],["fr","French"],["de","German"],["it","Italian"],["pt","Portuguese"],["nl","Dutch"],["zh","Chinese"],["ja","Japanese"],["ko","Korean"],["ar","Arabic"],["hi","Hindi"],["ru","Russian"]].map(function(e){return'<option value="'+e[0]+'"'+(o.language===e[0]?" selected":"")+">"+e[1]+"</option>"}).join(""),l=t.createElement("div");l.className="card shadow-sm",l.style.cssText="position:absolute;bottom:calc(100% + 6px);right:0;z-index:1080;width:290px;max-height:70vh;overflow:auto;display:none;",l.innerHTML='<div class="card-body p-3"><div class="fw-semibold mb-2" style="font-size:0.85rem;">'+g("settingsTitle","Voice settings")+'</div><label class="form-label mb-1 d-block" style="font-size:0.8rem;">'+g("microphone","Microphone")+'</label><select class="form-select form-select-sm js-mic mb-2"><option value="">'+g("defaultMicrophone","Default microphone")+'</option></select><label class="form-label mb-1 d-block" style="font-size:0.8rem;">'+g("speaker","Speaker")+'</label><select class="form-select form-select-sm js-out mb-1"><option value="">'+g("automatic","Automatic")+'</option></select><button type="button" class="btn btn-outline-secondary btn-sm mb-2 js-pick-out" style="display:none;">'+g("chooseSpeaker","Choose speaker…")+'</button><div class="form-text mb-2 js-out-help">'+g("speakerHelp","Automatic uses the device your system uses for calls. If you cannot hear the assistant, pick the speakers you are actually listening to.")+'</div><label class="form-label mb-1 d-block" style="font-size:0.8rem;">'+g("assistantVolume","Assistant volume")+': <strong class="js-vol-val">'+Math.round(100*o.volume)+'</strong>%</label><input type="range" class="form-range js-vol mb-2" min="0" max="100" step="5" value="'+Math.round(100*o.volume)+'"><label class="form-label mb-1 d-block" style="font-size:0.8rem;">'+g("language","Language")+'</label><select class="form-select form-select-sm js-lang mb-2">'+c+'</select><div class="form-check form-switch mb-1"><input class="form-check-input js-barge" type="checkbox" id="realtime-setting-barge"'+(o.bargeIn?" checked":"")+'><label class="form-check-label" for="realtime-setting-barge">'+g("allowInterruptions","Allow interruptions")+'</label></div><div class="form-text mb-2">'+g("allowInterruptionsHelp","Talk over the assistant to interrupt it. Turn this off if the assistant keeps hearing itself through your speakers.")+'</div><div class="form-check form-switch mb-1"><input class="form-check-input js-ptt" type="checkbox" id="realtime-setting-ptt"'+(o.pushToTalk?" checked":"")+'><label class="form-check-label" for="realtime-setting-ptt">'+g("pushToTalk","Push-to-talk")+'</label></div><div class="form-text">'+g("pushToTalkHelp","Hold <kbd>Space</kbd> (or the button) to talk. For very noisy places.")+"</div></div>",i.appendChild(r),i.appendChild(l),n.insertAdjacentElement("afterend",i);var s=l.querySelector(".js-barge"),u=l.querySelector(".js-ptt"),d=l.querySelector(".js-vol"),f=l.querySelector(".js-vol-val"),p=l.querySelector(".js-mic"),m=l.querySelector(".js-out"),v=l.querySelector(".js-pick-out"),h=l.querySelector(".js-lang");y(),navigator.mediaDevices&&"function"==typeof navigator.mediaDevices.addEventListener&&navigator.mediaDevices.addEventListener("devicechange",function(){y(),A&&de&&navigator.mediaDevices.enumerateDevices().then(function(e){e.some(function(e){return"audioinput"===e.kind&&e.deviceId===de})||we("device_lost")}).catch(function(){})}),r.addEventListener("click",function(n){n.stopPropagation();var a="none"===l.style.display;a&&(l.style.display="block",function(){l.style.right="0px",l.style.left="auto";var n=l.getBoundingClientRect();n.left<8&&(l.style.right=n.left-8+"px");for(var a=r.getBoundingClientRect(),o=8,i=l.parentElement?l.parentElement.parentElement:null;i&&i!==t.body&&i!==t.documentElement;){var c=e.getComputedStyle(i);if("auto"===c.overflowY||"scroll"===c.overflowY||"hidden"===c.overflowY||"fixed"===c.position){o=Math.max(o,i.getBoundingClientRect().top);break}i=i.parentElement}l.style.maxHeight=Math.max(160,a.top-o-10)+"px"}(),y()),l.style.display=a?"block":"none"}),l.addEventListener("click",function(e){e.stopPropagation()}),t.addEventListener("click",function(){l.style.display="none"}),s.addEventListener("change",b),u.addEventListener("change",b),d.addEventListener("input",function(){f.textContent=d.value,b()}),p.addEventListener("change",b),h.addEventListener("change",b),m.addEventListener("change",function(){b(),Fe()}),navigator.mediaDevices&&"function"==typeof navigator.mediaDevices.selectAudioOutput&&(v.style.display="",v.addEventListener("click",function(){navigator.mediaDevices.selectAudioOutput().then(function(e){if(e&&e.deviceId){var n=t.createElement("option");n.value=e.deviceId,n.textContent=e.label||g("selectedSpeaker","Selected speaker"),m.appendChild(n),m.value=e.deviceId,b(),Fe()}}).catch(function(){})}))}function b(){var e={bargeIn:s.checked,pushToTalk:u.checked,volume:(parseInt(d.value,10)||0)/100,micDeviceId:p.value||"",outputDeviceId:m.value||"",language:h.value||"",version:3};be(e),he(e),function(){if(A&&a&&"function"==typeof a.send)try{a.send("UpdateRealtimeSettings",ne,null,null)}catch(e){}}()}function y(){navigator.mediaDevices&&navigator.mediaDevices.enumerateDevices&&navigator.mediaDevices.enumerateDevices().then(function(e){var t=['<option value="">'+g("defaultMicrophone","Default microphone")+"</option>"];e.filter(function(e){return"audioinput"===e.kind}).forEach(function(e,n){var a=e.label||g("microphone","Microphone")+" "+(n+1);t.push('<option value="'+e.deviceId+'"'+(e.deviceId===de?" selected":"")+">"+a.replace(/</g,"")+"</option>")}),p.innerHTML=t.join("");var n=e.filter(function(e){return"audiooutput"===e.kind&&e.deviceId&&"communications"!==e.deviceId&&"default"!==e.deviceId});if(n.length){var a=['<option value="">'+g("automatic","Automatic")+"</option>"];n.forEach(function(e,t){var n=e.label||g("speaker","Speaker")+" "+(t+1);a.push('<option value="'+e.deviceId+'"'+(e.deviceId===fe?" selected":"")+">"+n.replace(/</g,"")+"</option>")}),m.innerHTML=a.join("")}}).catch(function(){})}}());var Je=x("deploymentSelect");Je&&Je.addEventListener("change",function(){Te(_e(Je.value))}),Te(l||Je&&_e(Je.value));var Ye={toggle:qe,start:Re,stop:We,applyMode:Te,isRealtimeDeployment:_e,receivePcm:function(e){if(B&&e&&!(e.length<2)){for(var t=B,n=Math.floor(e.length/2),a=new Int16Array(e.buffer,e.byteOffset,n),o=new Float32Array(n),i=0;i<n;i++)o[i]=a[i]/32768;var r=t.createBuffer(1,n,t.sampleRate);r.copyToChannel(o,0);var c=t.createBufferSource();c.buffer=r,c.connect(F||t.destination);var l=t.currentTime;H<l&&(H=l),c.start(H),H+=r.duration,W.push(c),c.onended=function(){W=W.filter(function(e){return e!==c})}}},isActive:function(){return A},getState:function(){return w},getGateLevel:function(){return ee?ee.getLevel():null},getTransportStats:function(){return z&&"function"==typeof z.getStats?z.getStats().then(function(e){var t={transport:"webrtc",inbound:null,codec:null,sinkId:_&&"string"==typeof _.sinkId?_.sinkId:null,jitterBufferTargetMs:function(){try{var e=z.getReceivers().filter(function(e){return e.track&&"audio"===e.track.kind})[0];return e&&"jitterBufferTarget"in e?e.jitterBufferTarget:null}catch(e){return null}}()};return e.forEach(function(n){if("inbound-rtp"===n.type&&"audio"===n.kind&&(t.inbound={packetsReceived:n.packetsReceived,packetsLost:n.packetsLost,packetsDiscarded:n.packetsDiscarded,jitterMs:"number"==typeof n.jitter?Math.round(1e3*n.jitter):null,jitterBufferDelayMs:"number"==typeof n.jitterBufferDelay&&n.jitterBufferEmittedCount?Math.round(n.jitterBufferDelay/n.jitterBufferEmittedCount*1e3):null,totalSamplesReceived:n.totalSamplesReceived,concealedSamples:n.concealedSamples,concealmentEvents:n.concealmentEvents,silentConcealedSamples:n.silentConcealedSamples,insertedSamplesForDeceleration:n.insertedSamplesForDeceleration,removedSamplesForAcceleration:n.removedSamplesForAcceleration,audioLevel:n.audioLevel},n.codecId)){var a=e.get(n.codecId);a&&(t.codec={mimeType:a.mimeType,clockRate:a.clockRate,channels:a.channels,sdpFmtpLine:a.sdpFmtpLine})}}),t}).catch(function(){return null}):Promise.resolve(null)}};return e.CoreAIRealtime.activeController=Ye,Ye},createMicGate:r,decideGate:n,createGateState:a,rmsDb:o,routeOutputToPreferredDevice:s,ensurePlayback:u}}(window,document);
2
2
  //# sourceMappingURL=realtime-audio.min.js.map