@applica-software-guru/persona-sdk 0.1.44-preview8 → 0.1.44

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,15 +1,10 @@
1
- "use strict";var ie=Object.defineProperty;var ce=(r,t,e)=>t in r?ie(r,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[t]=e;var i=(r,t,e)=>ce(r,typeof t!="symbol"?t+"":t,e);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const y=require("react"),te=require("@assistant-ui/react");var ne={exports:{}},O={},se;function le(){if(se)return O;se=1;/**
1
+ "use strict";var U=Object.defineProperty;var q=(i,t,e)=>t in i?U(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var a=(i,t,e)=>q(i,typeof t!="symbol"?t+"":t,e);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const d=require("react"),$=require("@assistant-ui/react");var N={exports:{}},m={};/**
2
2
  * @license React
3
- * react-jsx-runtime.development.js
3
+ * react-jsx-runtime.production.js
4
4
  *
5
5
  * Copyright (c) Meta Platforms, Inc. and affiliates.
6
6
  *
7
7
  * This source code is licensed under the MIT license found in the
8
8
  * LICENSE file in the root directory of this source tree.
9
- */return function(){function r(s){if(s==null)return null;if(typeof s=="function")return s.$$typeof===j?null:s.displayName||s.name||null;if(typeof s=="string")return s;switch(s){case k:return"Fragment";case W:return"Profiler";case $:return"StrictMode";case S:return"Suspense";case C:return"SuspenseList";case v:return"Activity"}if(typeof s=="object")switch(typeof s.tag=="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),s.$$typeof){case I:return"Portal";case z:return(s.displayName||"Context")+".Provider";case D:return(s._context.displayName||"Context")+".Consumer";case u:var a=s.render;return s=s.displayName,s||(s=a.displayName||a.name||"",s=s!==""?"ForwardRef("+s+")":"ForwardRef"),s;case x:return a=s.displayName||null,a!==null?a:r(s.type)||"Memo";case p:a=s._payload,s=s._init;try{return r(s(a))}catch{}}return null}function t(s){return""+s}function e(s){try{t(s);var a=!1}catch{a=!0}if(a){a=console;var l=a.error,m=typeof Symbol=="function"&&Symbol.toStringTag&&s[Symbol.toStringTag]||s.constructor.name||"Object";return l.call(a,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",m),t(s)}}function n(s){if(s===k)return"<>";if(typeof s=="object"&&s!==null&&s.$$typeof===p)return"<...>";try{var a=r(s);return a?"<"+a+">":"<...>"}catch{return"<...>"}}function o(){var s=A.A;return s===null?null:s.getOwner()}function c(){return Error("react-stack-top-frame")}function d(s){if(G.call(s,"key")){var a=Object.getOwnPropertyDescriptor(s,"key").get;if(a&&a.isReactWarning)return!1}return s.key!==void 0}function b(s,a){function l(){X||(X=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",a))}l.isReactWarning=!0,Object.defineProperty(s,"key",{get:l,configurable:!0})}function h(){var s=r(this.type);return H[s]||(H[s]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),s=this.props.ref,s!==void 0?s:null}function f(s,a,l,m,E,P,F,U){return l=P.ref,s={$$typeof:_,type:s,key:a,props:P,_owner:E},(l!==void 0?l:null)!==null?Object.defineProperty(s,"ref",{enumerable:!1,get:h}):Object.defineProperty(s,"ref",{enumerable:!1,value:null}),s._store={},Object.defineProperty(s._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(s,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(s,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:F}),Object.defineProperty(s,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:U}),Object.freeze&&(Object.freeze(s.props),Object.freeze(s)),s}function w(s,a,l,m,E,P,F,U){var g=a.children;if(g!==void 0)if(m)if(ae(g)){for(m=0;m<g.length;m++)N(g[m]);Object.freeze&&Object.freeze(g)}else console.error("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else N(g);if(G.call(a,"key")){g=r(s);var T=Object.keys(a).filter(function(oe){return oe!=="key"});m=0<T.length?"{key: someKey, "+T.join(": ..., ")+": ...}":"{key: someKey}",ee[g+m]||(T=0<T.length?"{"+T.join(": ..., ")+": ...}":"{}",console.error(`A props object containing a "key" prop is being spread into JSX:
10
- let props = %s;
11
- <%s {...props} />
12
- React keys must be passed directly to JSX without using spread:
13
- let props = %s;
14
- <%s key={someKey} {...props} />`,m,g,T,g),ee[g+m]=!0)}if(g=null,l!==void 0&&(e(l),g=""+l),d(a)&&(e(a.key),g=""+a.key),"key"in a){l={};for(var Y in a)Y!=="key"&&(l[Y]=a[Y])}else l=a;return g&&b(l,typeof s=="function"?s.displayName||s.name||"Unknown":s),f(s,g,P,E,o(),l,F,U)}function N(s){typeof s=="object"&&s!==null&&s.$$typeof===_&&s._store&&(s._store.validated=1)}var R=y,_=Symbol.for("react.transitional.element"),I=Symbol.for("react.portal"),k=Symbol.for("react.fragment"),$=Symbol.for("react.strict_mode"),W=Symbol.for("react.profiler"),D=Symbol.for("react.consumer"),z=Symbol.for("react.context"),u=Symbol.for("react.forward_ref"),S=Symbol.for("react.suspense"),C=Symbol.for("react.suspense_list"),x=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),v=Symbol.for("react.activity"),j=Symbol.for("react.client.reference"),A=R.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,G=Object.prototype.hasOwnProperty,ae=Array.isArray,L=console.createTask?console.createTask:function(){return null};R={"react-stack-bottom-frame":function(s){return s()}};var X,H={},Z=R["react-stack-bottom-frame"].bind(R,c)(),Q=L(n(c)),ee={};O.Fragment=k,O.jsx=function(s,a,l,m,E){var P=1e4>A.recentlyCreatedOwnerStacks++;return w(s,a,l,!1,m,E,P?Error("react-stack-top-frame"):Z,P?L(n(s)):Q)},O.jsxs=function(s,a,l,m,E){var P=1e4>A.recentlyCreatedOwnerStacks++;return w(s,a,l,!0,m,E,P?Error("react-stack-top-frame"):Z,P?L(n(s)):Q)}}(),O}ne.exports=le();var K=ne.exports;function ue(r){return r.filter(t=>{var e;return t.finishReason==="stop"?t.text!==null&&((e=t.text)==null?void 0:e.trim())!=="":!0})}function de(r){const t=[];let e=null;for(const n of r)n.type==="reasoning"?(e!=null&&(t.push(e),e=null),t.push(n)):n.functionCalls?(e&&t.push(e),t.push(n),e=null):n.functionResponse?t[t.length-1]={...t[t.length-1],functionResponse:n.functionResponse}:e&&n.protocol===e.protocol&&(e.role===n.role||n.finishReason==="stop")?e.text+=n.text:(e&&t.push(e),e={...n});return e&&t.push(e),ue(t)}function he(r){var t;return r.role==="function"?{id:r.id,role:"assistant",status:(r==null?void 0:r.functionResponse)===null?{type:"running"}:{type:"complete",reason:"stop"},content:((t=r.functionCalls)==null?void 0:t.map(e=>{var n;return{type:"tool-call",toolName:e.name,toolCallId:e.id,args:e.args,result:(n=r.functionResponse)==null?void 0:n.result}}))??[]}:{id:r.id,role:r.role,content:r.type==="reasoning"?[{type:"reasoning",text:r.text}]:[{type:"text",text:r.text}]}}class M{constructor(){i(this,"statusChangeCallbacks",[]);i(this,"messageCallbacks",[])}addStatusChangeListener(t){this.statusChangeCallbacks.push(t)}addMessageListener(t){this.messageCallbacks.push(t)}async syncSession(t){this.session=t}async notifyMessage(t){this.messageCallbacks.forEach(e=>e(t))}async notifyMessages(t){t.forEach(e=>{this.messageCallbacks.forEach(n=>n(e))})}async setSession(t){this.session=t}async setStatus(t){const e=this.status!==t;this.status=t,e&&this.statusChangeCallbacks.forEach(n=>n(t))}clearListeners(){this.statusChangeCallbacks=[],this.messageCallbacks=[]}}class q extends M{constructor(e){super();i(this,"status");i(this,"autostart");i(this,"session");i(this,"config");i(this,"notify",!0);this.config=e,this.status="disconnected",this.autostart=!0}getName(){return"rest"}getPriority(){return 0}async connect(e){return this.setStatus("connected"),e}async disconnect(){this.setStatus("disconnected"),this.session=null}async syncSession(e){this.session=e}async send(e){const{apiUrl:n,apiKey:o,agentId:c}=this.config,d=this.session??"new",b=e,f=await(await fetch(`${n}/agents/${c}/sessions/${d}/messages`,{body:JSON.stringify({userMessage:b}),method:"POST",headers:{"Content-Type":"application/json","x-fox-apikey":o,"x-persona-apikey":o}})).json();this.notifyMessages(f.response.messages)}}class J extends M{constructor(e){super();i(this,"status");i(this,"autostart");i(this,"session");i(this,"config");i(this,"webSocket");this.config=e,this.status="disconnected",this.autostart=!0,this.session=null,this.webSocket=null}getName(){return"websocket"}getPriority(){return 1}async syncSession(e){var n;(n=this.config.logger)==null||n.debug("Syncing session with WebSocket protocol:",e),this.session=e,this.webSocket&&this.status==="connected"&&(this.disconnect(),this.connect(e))}connect(e){var b;if(this.webSocket!==null&&this.status==="connected")return Promise.resolve(this.session);const n=e||this.session||"new";(b=this.config.logger)==null||b.debug("Connecting to WebSocket with sessionId:",n);const o=encodeURIComponent(this.config.apiKey),c=this.config.agentId,d=`${this.config.webSocketUrl}?sessionCode=${n}&agentId=${c}&apiKey=${o}`;return this.setStatus("connecting"),this.webSocket=new WebSocket(d),this.webSocket.addEventListener("open",()=>{this.setStatus("connected")}),this.webSocket.addEventListener("message",h=>{const f=JSON.parse(h.data);if(f.type!=="message")return;const w=f.payload;this.notifyMessage(w!=null&&w.thought?{role:"assistant",type:"reasoning",text:w.thought}:w)}),this.webSocket.addEventListener("close",()=>{var h;this.setStatus("disconnected"),this.webSocket=null,(h=this.config.logger)==null||h.warn("WebSocket connection closed")}),this.webSocket.addEventListener("error",h=>{var f;this.setStatus("disconnected"),this.webSocket=null,(f=this.config.logger)==null||f.error("WebSocket error",h)}),Promise.resolve(n)}disconnect(){var e;return(e=this.config.logger)==null||e.debug("Disconnecting WebSocket"),this.webSocket&&this.status==="connected"&&(this.webSocket.close(),this.setStatus("disconnected"),this.webSocket=null),Promise.resolve()}send(e){return this.webSocket&&this.status==="connected"?(this.webSocket.send(JSON.stringify({type:"request",payload:e})),Promise.resolve()):Promise.reject(new Error("WebSocket is not connected"))}}class fe{constructor(t){i(this,"config");i(this,"pc",null);i(this,"ws",null);i(this,"localStream",null);i(this,"remoteStream",new MediaStream);i(this,"audioCtx",null);i(this,"localAnalyser",null);i(this,"remoteAnalyser",null);i(this,"analyzerFrame",null);i(this,"dataChannel",null);i(this,"isConnected",!1);i(this,"visualizerCallbacks",[]);i(this,"messageCallbacks",[]);this.config=t}async connect(t){var e;if(!this.isConnected){this.isConnected=!0;try{this.localStream=await navigator.mediaDevices.getUserMedia({audio:!0})}catch(n){(e=this.config.logger)==null||e.error("Error accessing microphone:",n);return}this.pc=new RTCPeerConnection({iceServers:this.config.iceServers||[{urls:"stun:34.38.108.251:3478"},{urls:"turn:34.38.108.251:3478",username:"webrtc",credential:"webrtc"}]}),this.localStream.getTracks().forEach(n=>{this.pc.addTrack(n,this.localStream)}),this.pc.ontrack=n=>{n.streams[0].getTracks().forEach(c=>{this.remoteStream.addTrack(c)}),this.audioCtx||this._startAnalyzers();const o=new Audio;o.srcObject=this.remoteStream,o.play().catch(c=>{var d;(d=this.config.logger)==null||d.error("Error playing remote audio:",c)})},this.pc.onicecandidate=n=>{var o;n.candidate&&((o=this.ws)==null?void 0:o.readyState)===WebSocket.OPEN&&this.ws.send(JSON.stringify({type:"CANDIDATE",src:"client",payload:{candidate:n.candidate}}))},this.pc.ondatachannel=n=>{const o=n.channel;o.onmessage=c=>{this.messageCallbacks.forEach(d=>{d(c)})}},this.ws=new WebSocket(this.config.webrtcUrl||"wss://persona.applica.guru/api/webrtc"),this.ws.onopen=async()=>{var d,b;const n=await this.pc.createOffer();await this.pc.setLocalDescription(n);const o={agentId:this.config.agentId,sessionCode:t};(d=this.config.logger)==null||d.debug("Opening connection to WebRTC server: ",o);const c={type:"OFFER",src:((b=crypto.randomUUID)==null?void 0:b.call(crypto))||"client_"+Date.now(),payload:{sdp:{sdp:n.sdp,type:n.type},connectionId:(Date.now()%1e6).toString(),metadata:o}};this.ws.send(JSON.stringify(c))},this.ws.onmessage=async n=>{var c;const o=JSON.parse(n.data);if(o.type==="ANSWER")await this.pc.setRemoteDescription(new RTCSessionDescription(o.payload.sdp));else if(o.type==="CANDIDATE")try{await this.pc.addIceCandidate(new RTCIceCandidate(o.payload.candidate))}catch(d){(c=this.config.logger)==null||c.error("Error adding ICE candidate:",d)}},this.ws.onclose=()=>{this._stopAnalyzers()}}}async disconnect(){var t;this.isConnected&&(this.isConnected=!1,((t=this.ws)==null?void 0:t.readyState)===WebSocket.OPEN&&this.ws.close(),this.pc&&this.pc.close(),this.localStream&&this.localStream.getTracks().forEach(e=>e.stop()),this.remoteStream=new MediaStream,this.audioCtx&&(await this.audioCtx.close(),this.audioCtx=null),this._stopAnalyzers())}addVisualizerCallback(t){this.visualizerCallbacks.push(t)}addMessageCallback(t){this.messageCallbacks.push(t)}createDataChannel(t="messages"){this.pc&&(this.dataChannel=this.pc.createDataChannel(t),this.dataChannel.onopen=()=>{var e;return(e=this.config.logger)==null?void 0:e.info("Data channel opened")},this.dataChannel.onmessage=e=>{this.messageCallbacks.forEach(n=>{n(e)})})}sendMessage(t){var e,n;if(!this.dataChannel){(e=this.config.logger)==null||e.warn("Data channel is not open, cannot send message");return}this.dataChannel.send(t),(n=this.config.logger)==null||n.info("Sent message:",t)}_startAnalyzers(){if(!this.localStream||!this.remoteStream||this.visualizerCallbacks.length===0)return;this.audioCtx=new(window.AudioContext||window.webkitAudioContext);const t=this.audioCtx.createMediaStreamSource(this.localStream),e=this.audioCtx.createMediaStreamSource(this.remoteStream);this.localAnalyser=this.audioCtx.createAnalyser(),this.remoteAnalyser=this.audioCtx.createAnalyser(),this.localAnalyser.fftSize=256,this.remoteAnalyser.fftSize=256,t.connect(this.localAnalyser),e.connect(this.remoteAnalyser);const n=()=>{if(!this.localAnalyser||!this.remoteAnalyser||this.visualizerCallbacks.length===0)return;const o=new Uint8Array(this.localAnalyser.frequencyBinCount),c=new Uint8Array(this.remoteAnalyser.frequencyBinCount);this.localAnalyser.getByteFrequencyData(o),this.remoteAnalyser.getByteFrequencyData(c);const d=o.reduce((h,f)=>h+f,0)/o.length,b=c.reduce((h,f)=>h+f,0)/c.length;this.visualizerCallbacks.length>0&&this.visualizerCallbacks.forEach(h=>{h({localAmplitude:d,remoteAmplitude:b})}),this.analyzerFrame=requestAnimationFrame(n)};this.analyzerFrame=requestAnimationFrame(n)}_stopAnalyzers(){this.analyzerFrame&&(cancelAnimationFrame(this.analyzerFrame),this.analyzerFrame=null),this.localAnalyser=null,this.remoteAnalyser=null}}class B extends M{constructor(e){super();i(this,"status");i(this,"session");i(this,"autostart");i(this,"config");i(this,"webRTCClient");this.config=e,this.status="disconnected",this.session=null,this.autostart=(e==null?void 0:e.autostart)??!1,this.webRTCClient=new fe(e),this.webRTCClient.addMessageCallback(n=>{var c;(c=e.logger)==null||c.debug("Received data message:",n.data);const o=JSON.parse(n.data);o.type==="message"&&this.notifyMessage(o.payload)})}getName(){return"webrtc"}getPriority(){return 10}async syncSession(e){super.syncSession(e),this.status==="connected"&&(await this.disconnect(),await this.connect(e))}async connect(e){var n;return this.status==="connected"?Promise.resolve(this.session):(this.session=e||this.session||"new",this.setStatus("connecting"),(n=this.config.logger)==null||n.debug("Connecting to WebRTC with sessionId:",this.session),await this.webRTCClient.connect(this.session),this.setStatus("connected"),await this.webRTCClient.createDataChannel(),this.session)}async disconnect(){var e,n,o;if(this.status==="disconnected")return(e=this.config.logger)==null||e.warn("Already disconnected"),Promise.resolve();await this.webRTCClient.disconnect(),this.setStatus("disconnected"),(o=(n=this.config)==null?void 0:n.logger)==null||o.debug("Disconnected from WebRTC")}send(e){return this.status!=="connected"?Promise.reject(new Error("Not connected")):(this.webRTCClient.sendMessage(e),Promise.resolve())}}const V=y.createContext(void 0);function me({dev:r=!1,protocols:t,logger:e,children:n,session:o="new",...c}){const[d,b]=y.useState(!1),[h,f]=y.useState([]),[w,N]=y.useState(o),[R,_]=y.useState(new Map),I=y.useRef(!1),k=y.useMemo(()=>{if(Array.isArray(t))return t;if(typeof t=="object"&&t!==null){const u=r?"localhost:8000":"persona.applica.guru/api",S=r?"http":"https",C=r?"ws":"wss";return Object.keys(t).map(p=>{switch(p){case"rest":const v=t[p];return v===!0?new q({apiUrl:`${S}://${u}`,apiKey:c.apiKey,agentId:c.agentId,logger:e}):new q(v);case"webrtc":const j=t[p];return j===!0?new B({webrtcUrl:`${C}://${u}/webrtc`,apiKey:c.apiKey,agentId:c.agentId,logger:e}):new B(j);case"websocket":const A=t[p];return A===!0?new J({webSocketUrl:`${C}://${u}/websocket`,apiKey:c.apiKey,agentId:c.agentId,logger:e}):new J(A);default:throw new Error(`Unknown protocol: ${p}`)}})}throw new Error("Invalid protocols configuration")},[]);y.useEffect(()=>{I.current||(I.current=!0,e==null||e.debug("Initializing protocols: ",k.map(u=>u.getName())),k.forEach(u=>{u.setSession(w),u.clearListeners(),u.addStatusChangeListener(S=>{e==null||e.debug(`${u.getName()} has notified new status: ${S}`),R.set(u.getName(),S),_(new Map(R))}),u.addMessageListener(S=>{f(C=>de([...C,{...S,protocol:u.getName()}]))}),u.autostart&&u.status==="disconnected"&&(e==null||e.debug(`Connecting to protocol: ${u.getName()}`),u.connect(w))}))},[w,k,e,R]);const $=async u=>{var x;if(((x=u.content[0])==null?void 0:x.type)!=="text")throw new Error("Only text messages are supported");const S=u.content[0].text;f(p=>[...p,{role:"user",type:"text",text:S}]),b(!0);const C=k.sort((p,v)=>v.getPriority()-p.getPriority()).find(p=>p.status==="connected");await(C==null?void 0:C.send(S)),b(!1)},W=y.useCallback(()=>(b(!1),f([]),N("new"),Promise.resolve()),[]),D=y.useCallback(()=>Promise.resolve(),[]),z=te.useExternalStoreRuntime({isRunning:d,messages:h,convertMessage:he,onNew:$,onCancel:W,onReload:D});return K.jsx(V.Provider,{value:{protocols:k,protocolsStatus:R},children:K.jsx(te.AssistantRuntimeProvider,{runtime:z,children:n})})}function ge({children:r,...t}){return K.jsx(me,{...t,children:r})}function be(){const r=y.useContext(V);if(!r)throw new Error("usePersonaRuntime must be used within a PersonaRuntimeProvider");return r}function re(r){const t=y.useContext(V);if(!t)throw new Error("usePersonaRuntimeProtocol must be used within a PersonaRuntimeProvider");const e=t.protocols.find(o=>o.getName()===r);if(!e)return null;const n=t.protocolsStatus.get(e.getName());return{...e,connect:e.connect.bind(e),disconnect:e.disconnect.bind(e),send:e.send.bind(e),setSession:e.setSession.bind(e),addStatusChangeListener:e.addStatusChangeListener.bind(e),addMessageListener:e.addMessageListener.bind(e),getName:e.getName.bind(e),getPriority:e.getPriority.bind(e),status:n||e.status}}function pe(){return re("webrtc")}class ye{constructor(){i(this,"prefix","[Persona]")}log(t,...e){console.log(`${this.prefix} - ${t}`,...e)}info(t,...e){console.info(`${this.prefix} - ${t}`,...e)}warn(t,...e){console.warn(`${this.prefix} - ${t}`,...e)}error(t,...e){console.error(`${this.prefix} - ${t}`,...e)}debug(t,...e){console.debug(`${this.prefix} - ${t}`,...e)}}exports.PersonaConsoleLogger=ye;exports.PersonaProtocolBase=M;exports.PersonaRESTProtocol=q;exports.PersonaRuntimeProvider=ge;exports.PersonaWebRTCProtocol=B;exports.PersonaWebSocketProtocol=J;exports.usePersonaRuntime=be;exports.usePersonaRuntimeProtocol=re;exports.usePersonaRuntimeWebRTCProtocol=pe;
9
+ */var I;function J(){if(I)return m;I=1;var i=Symbol.for("react.transitional.element"),t=Symbol.for("react.fragment");function e(s,n,o){var r=null;if(o!==void 0&&(r=""+o),n.key!==void 0&&(r=""+n.key),"key"in n){o={};for(var l in n)l!=="key"&&(o[l]=n[l])}else o=n;return n=o.ref,{$$typeof:i,type:s,key:r,ref:n!==void 0?n:null,props:o}}return m.Fragment=t,m.jsx=e,m.jsxs=e,m}N.exports=J();var k=N.exports;function B(i){return i.filter(t=>{var e;return t.finishReason==="stop"?t.text!==null&&((e=t.text)==null?void 0:e.trim())!=="":!0})}function _(i){const t=[];let e=null;for(const s of i)s.type==="reasoning"?(e!=null&&(t.push(e),e=null),t.push(s)):s.functionCalls?(e&&t.push(e),t.push(s),e=null):s.functionResponse?t[t.length-1]={...t[t.length-1],functionResponse:s.functionResponse}:e&&s.protocol===e.protocol&&(e.role===s.role||s.finishReason==="stop")?e.text+=s.text:(e&&t.push(e),e={...s});return e&&t.push(e),B(t)}function K(i){var t;return i.role==="function"?{id:i.id,role:"assistant",status:(i==null?void 0:i.functionResponse)===null?{type:"running"}:{type:"complete",reason:"stop"},content:((t=i.functionCalls)==null?void 0:t.map(e=>{var s;return{type:"tool-call",toolName:e.name,toolCallId:e.id,args:e.args,result:(s=i.functionResponse)==null?void 0:s.result}}))??[]}:{id:i.id,role:i.role,content:i.type==="reasoning"?[{type:"reasoning",text:i.text}]:[{type:"text",text:i.text}]}}class S{constructor(){a(this,"statusChangeCallbacks",[]);a(this,"messageCallbacks",[])}addStatusChangeListener(t){this.statusChangeCallbacks.push(t)}addMessageListener(t){this.messageCallbacks.push(t)}async syncSession(t){this.session=t}async notifyMessage(t){this.messageCallbacks.forEach(e=>e(t))}async notifyMessages(t){t.forEach(e=>{this.messageCallbacks.forEach(s=>s(e))})}async setSession(t){this.session=t}async setStatus(t){const e=this.status!==t;this.status=t,e&&this.statusChangeCallbacks.forEach(s=>s(t))}clearListeners(){this.statusChangeCallbacks=[],this.messageCallbacks=[]}}class R extends S{constructor(e){super();a(this,"status");a(this,"autostart");a(this,"session");a(this,"config");a(this,"notify",!0);this.config=e,this.status="disconnected",this.autostart=!0}getName(){return"rest"}getPriority(){return 0}async connect(e){return this.setStatus("connected"),e}async disconnect(){this.setStatus("disconnected"),this.session=null}async syncSession(e){this.session=e}async send(e){const{apiUrl:s,apiKey:n,agentId:o}=this.config,r=this.session??"new",l=e,h=await(await fetch(`${s}/agents/${o}/sessions/${r}/messages`,{body:JSON.stringify({userMessage:l}),method:"POST",headers:{"Content-Type":"application/json","x-fox-apikey":n,"x-persona-apikey":n}})).json();this.notifyMessages(h.response.messages)}}class x extends S{constructor(e){super();a(this,"status");a(this,"autostart");a(this,"session");a(this,"config");a(this,"webSocket");this.config=e,this.status="disconnected",this.autostart=!0,this.session=null,this.webSocket=null}getName(){return"websocket"}getPriority(){return 1}async syncSession(e){var s;(s=this.config.logger)==null||s.debug("Syncing session with WebSocket protocol:",e),this.session=e,this.webSocket&&this.status==="connected"&&(this.disconnect(),this.connect(e))}connect(e){var l;if(this.webSocket!==null&&this.status==="connected")return Promise.resolve(this.session);const s=e||this.session||"new";(l=this.config.logger)==null||l.debug("Connecting to WebSocket with sessionId:",s);const n=encodeURIComponent(this.config.apiKey),o=this.config.agentId,r=`${this.config.webSocketUrl}?sessionCode=${s}&agentId=${o}&apiKey=${n}`;return this.setStatus("connecting"),this.webSocket=new WebSocket(r),this.webSocket.addEventListener("open",()=>{this.setStatus("connected")}),this.webSocket.addEventListener("message",u=>{const h=JSON.parse(u.data);if(h.type!=="message")return;const p=h.payload;this.notifyMessage(p!=null&&p.thought?{role:"assistant",type:"reasoning",text:p.thought}:p)}),this.webSocket.addEventListener("close",()=>{var u;this.setStatus("disconnected"),this.webSocket=null,(u=this.config.logger)==null||u.warn("WebSocket connection closed")}),this.webSocket.addEventListener("error",u=>{var h;this.setStatus("disconnected"),this.webSocket=null,(h=this.config.logger)==null||h.error("WebSocket error",u)}),Promise.resolve(s)}disconnect(){var e;return(e=this.config.logger)==null||e.debug("Disconnecting WebSocket"),this.webSocket&&this.status==="connected"&&(this.webSocket.close(),this.setStatus("disconnected"),this.webSocket=null),Promise.resolve()}send(e){return this.webSocket&&this.status==="connected"?(this.webSocket.send(JSON.stringify({type:"request",payload:e})),Promise.resolve()):Promise.reject(new Error("WebSocket is not connected"))}}class Y{constructor(t){a(this,"config");a(this,"pc",null);a(this,"ws",null);a(this,"localStream",null);a(this,"remoteStream",new MediaStream);a(this,"audioCtx",null);a(this,"localAnalyser",null);a(this,"remoteAnalyser",null);a(this,"analyzerFrame",null);a(this,"dataChannel",null);a(this,"isConnected",!1);a(this,"visualizerCallbacks",[]);a(this,"messageCallbacks",[]);this.config=t}async connect(t){var e;if(!this.isConnected){this.isConnected=!0;try{this.localStream=await navigator.mediaDevices.getUserMedia({audio:!0})}catch(s){(e=this.config.logger)==null||e.error("Error accessing microphone:",s);return}this.pc=new RTCPeerConnection({iceServers:this.config.iceServers||[{urls:"stun:34.38.108.251:3478"},{urls:"turn:34.38.108.251:3478",username:"webrtc",credential:"webrtc"}]}),this.localStream.getTracks().forEach(s=>{this.pc.addTrack(s,this.localStream)}),this.pc.ontrack=s=>{s.streams[0].getTracks().forEach(o=>{this.remoteStream.addTrack(o)}),this.audioCtx||this._startAnalyzers();const n=new Audio;n.srcObject=this.remoteStream,n.play().catch(o=>{var r;(r=this.config.logger)==null||r.error("Error playing remote audio:",o)})},this.pc.onicecandidate=s=>{var n;s.candidate&&((n=this.ws)==null?void 0:n.readyState)===WebSocket.OPEN&&this.ws.send(JSON.stringify({type:"CANDIDATE",src:"client",payload:{candidate:s.candidate}}))},this.pc.ondatachannel=s=>{const n=s.channel;n.onmessage=o=>{this.messageCallbacks.forEach(r=>{r(o)})}},this.ws=new WebSocket(this.config.webrtcUrl||"wss://persona.applica.guru/api/webrtc"),this.ws.onopen=async()=>{var r,l;const s=await this.pc.createOffer();await this.pc.setLocalDescription(s);const n={agentId:this.config.agentId,sessionCode:t};(r=this.config.logger)==null||r.debug("Opening connection to WebRTC server: ",n);const o={type:"OFFER",src:((l=crypto.randomUUID)==null?void 0:l.call(crypto))||"client_"+Date.now(),payload:{sdp:{sdp:s.sdp,type:s.type},connectionId:(Date.now()%1e6).toString(),metadata:n}};this.ws.send(JSON.stringify(o))},this.ws.onmessage=async s=>{var o;const n=JSON.parse(s.data);if(n.type==="ANSWER")await this.pc.setRemoteDescription(new RTCSessionDescription(n.payload.sdp));else if(n.type==="CANDIDATE")try{await this.pc.addIceCandidate(new RTCIceCandidate(n.payload.candidate))}catch(r){(o=this.config.logger)==null||o.error("Error adding ICE candidate:",r)}},this.ws.onclose=()=>{this._stopAnalyzers()}}}async disconnect(){var t;this.isConnected&&(this.isConnected=!1,((t=this.ws)==null?void 0:t.readyState)===WebSocket.OPEN&&this.ws.close(),this.pc&&this.pc.close(),this.localStream&&this.localStream.getTracks().forEach(e=>e.stop()),this.remoteStream=new MediaStream,this.audioCtx&&(await this.audioCtx.close(),this.audioCtx=null),this._stopAnalyzers())}addVisualizerCallback(t){this.visualizerCallbacks.push(t)}addMessageCallback(t){this.messageCallbacks.push(t)}createDataChannel(t="messages"){this.pc&&(this.dataChannel=this.pc.createDataChannel(t),this.dataChannel.onopen=()=>{var e;return(e=this.config.logger)==null?void 0:e.info("Data channel opened")},this.dataChannel.onmessage=e=>{this.messageCallbacks.forEach(s=>{s(e)})})}sendMessage(t){var e,s;if(!this.dataChannel){(e=this.config.logger)==null||e.warn("Data channel is not open, cannot send message");return}this.dataChannel.send(t),(s=this.config.logger)==null||s.info("Sent message:",t)}_startAnalyzers(){if(!this.localStream||!this.remoteStream||this.visualizerCallbacks.length===0)return;this.audioCtx=new(window.AudioContext||window.webkitAudioContext);const t=this.audioCtx.createMediaStreamSource(this.localStream),e=this.audioCtx.createMediaStreamSource(this.remoteStream);this.localAnalyser=this.audioCtx.createAnalyser(),this.remoteAnalyser=this.audioCtx.createAnalyser(),this.localAnalyser.fftSize=256,this.remoteAnalyser.fftSize=256,t.connect(this.localAnalyser),e.connect(this.remoteAnalyser);const s=()=>{if(!this.localAnalyser||!this.remoteAnalyser||this.visualizerCallbacks.length===0)return;const n=new Uint8Array(this.localAnalyser.frequencyBinCount),o=new Uint8Array(this.remoteAnalyser.frequencyBinCount);this.localAnalyser.getByteFrequencyData(n),this.remoteAnalyser.getByteFrequencyData(o);const r=n.reduce((u,h)=>u+h,0)/n.length,l=o.reduce((u,h)=>u+h,0)/o.length;this.visualizerCallbacks.length>0&&this.visualizerCallbacks.forEach(u=>{u({localAmplitude:r,remoteAmplitude:l})}),this.analyzerFrame=requestAnimationFrame(s)};this.analyzerFrame=requestAnimationFrame(s)}_stopAnalyzers(){this.analyzerFrame&&(cancelAnimationFrame(this.analyzerFrame),this.analyzerFrame=null),this.localAnalyser=null,this.remoteAnalyser=null}}class A extends S{constructor(e){super();a(this,"status");a(this,"session");a(this,"autostart");a(this,"config");a(this,"webRTCClient");this.config=e,this.status="disconnected",this.session=null,this.autostart=(e==null?void 0:e.autostart)??!1,this.webRTCClient=new Y(e),this.webRTCClient.addMessageCallback(s=>{var o;(o=e.logger)==null||o.debug("Received data message:",s.data);const n=JSON.parse(s.data);n.type==="message"&&this.notifyMessage(n.payload)})}getName(){return"webrtc"}getPriority(){return 10}async syncSession(e){super.syncSession(e),this.status==="connected"&&(await this.disconnect(),await this.connect(e))}async connect(e){var s;return this.status==="connected"?Promise.resolve(this.session):(this.session=e||this.session||"new",this.setStatus("connecting"),(s=this.config.logger)==null||s.debug("Connecting to WebRTC with sessionId:",this.session),await this.webRTCClient.connect(this.session),this.setStatus("connected"),await this.webRTCClient.createDataChannel(),this.session)}async disconnect(){var e,s,n;if(this.status==="disconnected")return(e=this.config.logger)==null||e.warn("Already disconnected"),Promise.resolve();await this.webRTCClient.disconnect(),this.setStatus("disconnected"),(n=(s=this.config)==null?void 0:s.logger)==null||n.debug("Disconnected from WebRTC")}send(e){return this.status!=="connected"?Promise.reject(new Error("Not connected")):(this.webRTCClient.sendMessage(e),Promise.resolve())}}const E=d.createContext(void 0);function G({dev:i=!1,protocols:t,logger:e,children:s,session:n="new",...o}){const[r,l]=d.useState(!1),[u,h]=d.useState([]),[p,z]=d.useState(n),[b,D]=d.useState(new Map),v=d.useRef(!1),w=d.useMemo(()=>{if(Array.isArray(t))return t;if(typeof t=="object"&&t!==null){const c=i?"localhost:8000":"persona.applica.guru/api",g=i?"http":"https",y=i?"ws":"wss";return Object.keys(t).map(f=>{switch(f){case"rest":const C=t[f];return C===!0?new R({apiUrl:`${g}://${c}`,apiKey:o.apiKey,agentId:o.agentId,logger:e}):new R(C);case"webrtc":const T=t[f];return T===!0?new A({webrtcUrl:`${y}://${c}/webrtc`,apiKey:o.apiKey,agentId:o.agentId,logger:e}):new A(T);case"websocket":const M=t[f];return M===!0?new x({webSocketUrl:`${y}://${c}/websocket`,apiKey:o.apiKey,agentId:o.agentId,logger:e}):new x(M);default:throw new Error(`Unknown protocol: ${f}`)}})}throw new Error("Invalid protocols configuration")},[]);d.useEffect(()=>{v.current||(v.current=!0,e==null||e.debug("Initializing protocols: ",w.map(c=>c.getName())),w.forEach(c=>{c.setSession(p),c.clearListeners(),c.addStatusChangeListener(g=>{e==null||e.debug(`${c.getName()} has notified new status: ${g}`),b.set(c.getName(),g),D(new Map(b))}),c.addMessageListener(g=>{h(y=>_([...y,{...g,protocol:c.getName()}]))}),c.autostart&&c.status==="disconnected"&&(e==null||e.debug(`Connecting to protocol: ${c.getName()}`),c.connect(p))}))},[p,w,e,b]);const L=async c=>{var P;if(((P=c.content[0])==null?void 0:P.type)!=="text")throw new Error("Only text messages are supported");const g=c.content[0].text;h(f=>[...f,{role:"user",type:"text",text:g}]),l(!0);const y=w.sort((f,C)=>C.getPriority()-f.getPriority()).find(f=>f.status==="connected");await(y==null?void 0:y.send(g)),l(!1)},O=d.useCallback(()=>(l(!1),h([]),z("new"),Promise.resolve()),[]),j=d.useCallback(()=>Promise.resolve(),[]),F=$.useExternalStoreRuntime({isRunning:r,messages:u,convertMessage:K,onNew:L,onCancel:O,onReload:j});return k.jsx(E.Provider,{value:{protocols:w,protocolsStatus:b},children:k.jsx($.AssistantRuntimeProvider,{runtime:F,children:s})})}function V({children:i,...t}){return k.jsx(G,{...t,children:i})}function H(){const i=d.useContext(E);if(!i)throw new Error("usePersonaRuntime must be used within a PersonaRuntimeProvider");return i}function W(i){const t=d.useContext(E);if(!t)throw new Error("usePersonaRuntimeProtocol must be used within a PersonaRuntimeProvider");const e=t.protocols.find(n=>n.getName()===i);if(!e)return null;const s=t.protocolsStatus.get(e.getName());return{...e,connect:e.connect.bind(e),disconnect:e.disconnect.bind(e),send:e.send.bind(e),setSession:e.setSession.bind(e),addStatusChangeListener:e.addStatusChangeListener.bind(e),addMessageListener:e.addMessageListener.bind(e),getName:e.getName.bind(e),getPriority:e.getPriority.bind(e),status:s||e.status}}function Q(){return W("webrtc")}class X{constructor(){a(this,"prefix","[Persona]")}log(t,...e){console.log(`${this.prefix} - ${t}`,...e)}info(t,...e){console.info(`${this.prefix} - ${t}`,...e)}warn(t,...e){console.warn(`${this.prefix} - ${t}`,...e)}error(t,...e){console.error(`${this.prefix} - ${t}`,...e)}debug(t,...e){console.debug(`${this.prefix} - ${t}`,...e)}}exports.PersonaConsoleLogger=X;exports.PersonaProtocolBase=S;exports.PersonaRESTProtocol=R;exports.PersonaRuntimeProvider=V;exports.PersonaWebRTCProtocol=A;exports.PersonaWebSocketProtocol=x;exports.usePersonaRuntime=H;exports.usePersonaRuntimeProtocol=W;exports.usePersonaRuntimeWebRTCProtocol=Q;
15
10
  //# sourceMappingURL=bundle.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.cjs.js","sources":["../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../src/messages.ts","../src/protocol/base.ts","../src/protocol/rest.ts","../src/protocol/websocket.ts","../src/protocol/webrtc.ts","../src/runtime.tsx","../src/logging.ts"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return (type.displayName || \"Context\") + \".Provider\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(\n type,\n key,\n self,\n source,\n owner,\n props,\n debugStack,\n debugTask\n ) {\n self = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== self ? self : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n source,\n self,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n self,\n source,\n getOwner(),\n maybeKey,\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_ELEMENT_TYPE &&\n node._store &&\n (node._store.validated = 1);\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\");\n Symbol.for(\"react.provider\");\n var REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n \"react-stack-bottom-frame\": function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React[\"react-stack-bottom-frame\"].bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey, source, self) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n source,\n self,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey, source, self) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n source,\n self,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import { PersonaMessage } from './types';\nimport { ThreadMessageLike } from '@assistant-ui/react';\n\nfunction removeEmptyMessages(messages: PersonaMessage[]): PersonaMessage[] {\n return messages.filter((message) => {\n if (message.finishReason === 'stop') {\n return message.text !== null && message.text?.trim() !== '';\n }\n return true;\n });\n}\nfunction parseMessages(messages: PersonaMessage[]): PersonaMessage[] {\n const outputMessages: PersonaMessage[] = [];\n let currentMessage: PersonaMessage | null = null;\n\n for (const message of messages) {\n if (message.type === 'reasoning') {\n if (currentMessage != null) {\n outputMessages.push(currentMessage);\n currentMessage = null;\n }\n outputMessages.push(message);\n } else if (message.functionCalls) {\n if (currentMessage) {\n outputMessages.push(currentMessage);\n }\n outputMessages.push(message);\n currentMessage = null;\n } else if (message.functionResponse) {\n outputMessages[outputMessages.length - 1] = {\n ...outputMessages[outputMessages.length - 1],\n functionResponse: message.functionResponse,\n };\n } else if (\n currentMessage &&\n message.protocol === currentMessage.protocol &&\n (currentMessage.role === message.role || message.finishReason === 'stop')\n ) {\n currentMessage.text += message.text;\n } else {\n if (currentMessage) {\n outputMessages.push(currentMessage);\n }\n currentMessage = {\n ...message,\n };\n }\n }\n\n if (currentMessage) {\n outputMessages.push(currentMessage);\n }\n return removeEmptyMessages(outputMessages);\n}\n\nfunction convertMessage(message: PersonaMessage): ThreadMessageLike {\n if (message.role === 'function') {\n return {\n id: message.id!,\n role: 'assistant',\n status: message?.functionResponse === null ? { type: 'running' } : { type: 'complete', reason: 'stop' },\n content:\n message.functionCalls?.map((call) => ({\n type: 'tool-call',\n toolName: call.name,\n toolCallId: call.id,\n args: call.args,\n result: message.functionResponse?.result,\n })) ?? [],\n };\n }\n return {\n id: message.id!,\n role: message.role,\n content: message.type === 'reasoning' ? [{ type: 'reasoning', text: message.text }] : [{ type: 'text', text: message.text }],\n };\n}\n\nexport { parseMessages, convertMessage, removeEmptyMessages };\n","import { Message, MessageListenerCallback, PersonaMessage, PersonaProtocol, ProtocolStatus, Session, StatusChangeCallback } from '../types';\n\nabstract class PersonaProtocolBase implements PersonaProtocol {\n abstract status: ProtocolStatus;\n abstract session: Session;\n abstract autostart: boolean;\n\n private statusChangeCallbacks: StatusChangeCallback[] = [];\n private messageCallbacks: MessageListenerCallback[] = [];\n\n public addStatusChangeListener(callback: StatusChangeCallback) {\n this.statusChangeCallbacks.push(callback);\n }\n\n public addMessageListener(callback: MessageListenerCallback) {\n this.messageCallbacks.push(callback);\n }\n public async syncSession(session: Session): Promise<void> {\n this.session = session;\n }\n\n public async notifyMessage(message: PersonaMessage): Promise<void> {\n this.messageCallbacks.forEach((callback) => callback(message));\n }\n public async notifyMessages(messages: PersonaMessage[]): Promise<void> {\n messages.forEach((message) => {\n this.messageCallbacks.forEach((callback) => callback(message));\n });\n }\n\n public async setSession(session: Session): Promise<void> {\n this.session = session;\n }\n public async setStatus(status: ProtocolStatus): Promise<void> {\n const notify = this.status !== status;\n this.status = status;\n if (!notify) {\n return;\n }\n this.statusChangeCallbacks.forEach((callback) => callback(status));\n }\n\n public clearListeners(): void {\n this.statusChangeCallbacks = [];\n this.messageCallbacks = [];\n }\n\n abstract getName(): string;\n abstract getPriority(): number;\n abstract connect(session?: Session): Promise<Session>;\n abstract disconnect(): Promise<void>;\n abstract send(message: Message): Promise<void>;\n}\n\nexport { PersonaProtocolBase };\n","'use strict';\n'use client';\nimport { PersonaProtocolBase } from './base';\nimport { Message, PersonaResponse, Session, ProtocolStatus, PersonaProtocolBaseConfig } from '../types';\n\ntype PersonaRESTProtocolConfig = PersonaProtocolBaseConfig & {\n apiUrl: string;\n};\n\nclass PersonaRESTProtocol extends PersonaProtocolBase {\n status: ProtocolStatus;\n autostart: boolean;\n session: Session;\n config: PersonaRESTProtocolConfig;\n notify: boolean = true;\n\n constructor(config: PersonaRESTProtocolConfig) {\n super();\n this.config = config;\n this.status = 'disconnected';\n this.autostart = true;\n }\n\n public getName(): string {\n return 'rest';\n }\n\n public getPriority(): number {\n return 0;\n }\n\n public async connect(session: Session): Promise<Session> {\n this.setStatus('connected');\n return session;\n }\n\n public async disconnect(): Promise<void> {\n this.setStatus('disconnected');\n this.session = null;\n }\n\n public async syncSession(session: Session): Promise<void> {\n this.session = session;\n }\n\n public async send(message: Message): Promise<void> {\n const { apiUrl, apiKey, agentId } = this.config;\n const sessionId = this.session ?? 'new';\n const input = message;\n\n const response = await fetch(`${apiUrl}/agents/${agentId}/sessions/${sessionId}/messages`, {\n body: JSON.stringify({ userMessage: input }),\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-fox-apikey': apiKey,\n 'x-persona-apikey': apiKey,\n },\n });\n const personaResponse = (await response.json()) as PersonaResponse;\n this.notifyMessages(personaResponse.response.messages);\n }\n}\n\nexport { PersonaRESTProtocol };\nexport type { PersonaRESTProtocolConfig };\n","'use strict';\n'use client';\nimport { Message, PersonaMessage, PersonaProtocolBaseConfig, ProtocolStatus, Session } from '../types';\nimport { PersonaProtocolBase } from './base';\n\ntype PersonaWebSocketProtocolConfig = PersonaProtocolBaseConfig & {\n webSocketUrl: string;\n};\n\nclass PersonaWebSocketProtocol extends PersonaProtocolBase {\n status: ProtocolStatus;\n autostart: boolean;\n session: Session;\n config: PersonaWebSocketProtocolConfig;\n webSocket: WebSocket | null;\n\n constructor(config: PersonaWebSocketProtocolConfig) {\n super();\n this.config = config;\n this.status = 'disconnected';\n this.autostart = true;\n this.session = null;\n this.webSocket = null;\n }\n\n public getName(): string {\n return 'websocket';\n }\n\n public getPriority(): number {\n return 1;\n }\n\n public async syncSession(session: Session): Promise<void> {\n this.config.logger?.debug('Syncing session with WebSocket protocol:', session);\n this.session = session;\n if (this.webSocket && this.status === 'connected') {\n this.disconnect();\n this.connect(session);\n }\n }\n\n public connect(session?: Session): Promise<Session> {\n if (this.webSocket !== null && this.status === 'connected') {\n return Promise.resolve(this.session);\n }\n\n const sid = session || this.session || 'new';\n\n this.config.logger?.debug('Connecting to WebSocket with sessionId:', sid);\n\n const apiKey = encodeURIComponent(this.config.apiKey);\n const agentId = this.config.agentId;\n const webSocketUrl = `${this.config.webSocketUrl}?sessionCode=${sid}&agentId=${agentId}&apiKey=${apiKey}`;\n this.setStatus('connecting');\n this.webSocket = new WebSocket(webSocketUrl);\n this.webSocket.addEventListener('open', () => {\n this.setStatus('connected');\n });\n this.webSocket.addEventListener('message', (event) => {\n const data = JSON.parse(event.data) as { type: 'message' | unknown; payload: PersonaMessage | unknown };\n\n if (data.type !== 'message') {\n return;\n }\n const message = data.payload as PersonaMessage & { thought?: string };\n\n this.notifyMessage(message?.thought ? { role: 'assistant', type: 'reasoning', text: message.thought } : message);\n });\n this.webSocket.addEventListener('close', () => {\n this.setStatus('disconnected');\n this.webSocket = null;\n this.config.logger?.warn('WebSocket connection closed');\n });\n\n this.webSocket.addEventListener('error', (error) => {\n this.setStatus('disconnected');\n this.webSocket = null;\n this.config.logger?.error('WebSocket error', error);\n\n // TODO: Implement reconnection logic\n });\n\n return Promise.resolve(sid);\n }\n\n public disconnect(): Promise<void> {\n this.config.logger?.debug('Disconnecting WebSocket');\n if (this.webSocket && this.status === 'connected') {\n this.webSocket.close();\n this.setStatus('disconnected');\n this.webSocket = null;\n }\n return Promise.resolve();\n }\n\n public send(message: Message): Promise<void> {\n if (this.webSocket && this.status === 'connected') {\n this.webSocket.send(JSON.stringify({ type: 'request', payload: message }));\n return Promise.resolve();\n } else {\n return Promise.reject(new Error('WebSocket is not connected'));\n }\n }\n}\n\nexport { PersonaWebSocketProtocol };\nexport type { PersonaWebSocketProtocolConfig };\n","'use strict';\n'use client';\nimport { PersonaProtocolBase } from './base';\nimport { Message, PersonaMessage, PersonaProtocolBaseConfig, ProtocolStatus, Session } from '../types';\n\ntype AudioAnalysisData = {\n localAmplitude: number;\n remoteAmplitude: number;\n};\n\ntype AudioVisualizerCallback = (data: AudioAnalysisData) => void;\n\ntype PersonaWebRTCMessageCallback = (data: MessageEvent) => void;\n\ntype PersonaWebRTCConfig = PersonaProtocolBaseConfig & {\n webrtcUrl: string;\n iceServers?: RTCIceServer[];\n};\n\nclass PersonaWebRTCClient {\n private config: PersonaWebRTCConfig;\n private pc: RTCPeerConnection | null = null;\n private ws: WebSocket | null = null;\n private localStream: MediaStream | null = null;\n private remoteStream: MediaStream = new MediaStream();\n private audioCtx: AudioContext | null = null;\n\n private localAnalyser: AnalyserNode | null = null;\n private remoteAnalyser: AnalyserNode | null = null;\n private analyzerFrame: number | null = null;\n private dataChannel: RTCDataChannel | null = null;\n\n private isConnected: boolean = false;\n private visualizerCallbacks: AudioVisualizerCallback[] = [];\n private messageCallbacks: PersonaWebRTCMessageCallback[] = [];\n\n constructor(config: PersonaWebRTCConfig) {\n this.config = config;\n }\n\n public async connect(session: Session): Promise<Session> {\n if (this.isConnected) return;\n\n this.isConnected = true;\n\n try {\n this.localStream = await navigator.mediaDevices.getUserMedia({ audio: true });\n } catch (err) {\n this.config.logger?.error('Error accessing microphone:', err);\n return;\n }\n\n this.pc = new RTCPeerConnection({\n iceServers: this.config.iceServers || [\n {\n urls: 'stun:34.38.108.251:3478',\n },\n {\n urls: 'turn:34.38.108.251:3478',\n username: 'webrtc',\n credential: 'webrtc',\n },\n ],\n });\n\n this.localStream.getTracks().forEach((track) => {\n this.pc!.addTrack(track, this.localStream!);\n });\n\n this.pc.ontrack = (event) => {\n event.streams[0].getTracks().forEach((track) => {\n this.remoteStream.addTrack(track);\n });\n\n if (!this.audioCtx) {\n this._startAnalyzers();\n }\n\n const remoteAudio = new Audio();\n remoteAudio.srcObject = this.remoteStream;\n remoteAudio.play().catch((e) => {\n this.config.logger?.error('Error playing remote audio:', e);\n });\n };\n\n this.pc.onicecandidate = (event) => {\n if (event.candidate && this.ws?.readyState === WebSocket.OPEN) {\n this.ws.send(\n JSON.stringify({\n type: 'CANDIDATE',\n src: 'client',\n payload: { candidate: event.candidate },\n }),\n );\n }\n };\n\n this.pc.ondatachannel = (event) => {\n const channel = event.channel;\n channel.onmessage = (msg) => {\n this.messageCallbacks.forEach((callback) => {\n callback(msg);\n });\n };\n };\n\n this.ws = new WebSocket(this.config.webrtcUrl || 'wss://persona.applica.guru/api/webrtc');\n this.ws.onopen = async () => {\n const offer = await this.pc!.createOffer();\n await this.pc!.setLocalDescription(offer);\n\n const metadata = {\n agentId: this.config.agentId,\n sessionCode: session as string,\n };\n this.config.logger?.debug('Opening connection to WebRTC server: ', metadata);\n\n const offerMessage = {\n type: 'OFFER',\n src: crypto.randomUUID?.() || 'client_' + Date.now(),\n payload: {\n sdp: {\n sdp: offer.sdp,\n type: offer.type,\n },\n connectionId: (Date.now() % 1000000).toString(),\n metadata,\n },\n };\n\n this.ws!.send(JSON.stringify(offerMessage));\n };\n\n this.ws.onmessage = async (event) => {\n const data = JSON.parse(event.data);\n if (data.type === 'ANSWER') {\n await this.pc!.setRemoteDescription(new RTCSessionDescription(data.payload.sdp));\n } else if (data.type === 'CANDIDATE') {\n try {\n await this.pc!.addIceCandidate(new RTCIceCandidate(data.payload.candidate));\n } catch (err) {\n this.config.logger?.error('Error adding ICE candidate:', err);\n }\n }\n };\n\n this.ws.onclose = () => {\n this._stopAnalyzers();\n };\n }\n\n public async disconnect(): Promise<void> {\n if (!this.isConnected) return;\n\n this.isConnected = false;\n\n if (this.ws?.readyState === WebSocket.OPEN) this.ws.close();\n if (this.pc) this.pc.close();\n if (this.localStream) {\n this.localStream.getTracks().forEach((track) => track.stop());\n }\n\n this.remoteStream = new MediaStream();\n if (this.audioCtx) {\n await this.audioCtx.close();\n this.audioCtx = null;\n }\n\n this._stopAnalyzers();\n }\n\n public addVisualizerCallback(callback: AudioVisualizerCallback): void {\n this.visualizerCallbacks.push(callback);\n }\n public addMessageCallback(callback: PersonaWebRTCMessageCallback): void {\n this.messageCallbacks.push(callback);\n }\n\n public createDataChannel(label = 'messages'): void {\n if (!this.pc) return;\n this.dataChannel = this.pc.createDataChannel(label);\n this.dataChannel.onopen = () => this.config.logger?.info('Data channel opened');\n this.dataChannel.onmessage = (msg: MessageEvent) => {\n this.messageCallbacks.forEach((callback) => {\n callback(msg);\n });\n };\n }\n\n public sendMessage(message: string): void {\n if (!this.dataChannel) {\n this.config.logger?.warn('Data channel is not open, cannot send message');\n return;\n }\n\n this.dataChannel.send(message);\n this.config.logger?.info('Sent message:', message);\n }\n\n private _startAnalyzers(): void {\n if (!this.localStream || !this.remoteStream || this.visualizerCallbacks.length === 0) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.audioCtx = new (window.AudioContext || (window as any).webkitAudioContext)();\n\n const localSource = this.audioCtx.createMediaStreamSource(this.localStream);\n const remoteSource = this.audioCtx.createMediaStreamSource(this.remoteStream);\n\n this.localAnalyser = this.audioCtx.createAnalyser();\n this.remoteAnalyser = this.audioCtx.createAnalyser();\n this.localAnalyser.fftSize = 256;\n this.remoteAnalyser.fftSize = 256;\n\n localSource.connect(this.localAnalyser);\n remoteSource.connect(this.remoteAnalyser);\n\n const loop = () => {\n if (!this.localAnalyser || !this.remoteAnalyser || this.visualizerCallbacks.length === 0) {\n return;\n }\n\n const localArray = new Uint8Array(this.localAnalyser.frequencyBinCount);\n const remoteArray = new Uint8Array(this.remoteAnalyser.frequencyBinCount);\n\n this.localAnalyser.getByteFrequencyData(localArray);\n this.remoteAnalyser.getByteFrequencyData(remoteArray);\n\n const localAmp = localArray.reduce((a, b) => a + b, 0) / localArray.length;\n const remoteAmp = remoteArray.reduce((a, b) => a + b, 0) / remoteArray.length;\n\n if (this.visualizerCallbacks.length > 0) {\n this.visualizerCallbacks.forEach((callback) => {\n callback({\n localAmplitude: localAmp,\n remoteAmplitude: remoteAmp,\n });\n });\n }\n\n this.analyzerFrame = requestAnimationFrame(loop);\n };\n\n this.analyzerFrame = requestAnimationFrame(loop);\n }\n\n private _stopAnalyzers(): void {\n if (this.analyzerFrame) {\n cancelAnimationFrame(this.analyzerFrame);\n this.analyzerFrame = null;\n }\n this.localAnalyser = null;\n this.remoteAnalyser = null;\n }\n}\n\ntype PersonaWebRTCProtocolConfig = PersonaWebRTCConfig & {\n autostart?: boolean;\n};\n\nclass PersonaWebRTCProtocol extends PersonaProtocolBase {\n status: ProtocolStatus;\n session: Session;\n autostart: boolean;\n config: PersonaWebRTCProtocolConfig;\n webRTCClient: PersonaWebRTCClient;\n\n constructor(config: PersonaWebRTCProtocolConfig) {\n super();\n this.config = config;\n this.status = 'disconnected';\n this.session = null;\n this.autostart = config?.autostart ?? false;\n this.webRTCClient = new PersonaWebRTCClient(config);\n this.webRTCClient.addMessageCallback((msg: MessageEvent) => {\n config.logger?.debug('Received data message:', msg.data);\n const data = JSON.parse(msg.data) as { type: 'message' | unknown; payload: PersonaMessage | unknown };\n if (data.type === 'message') {\n this.notifyMessage(data.payload as PersonaMessage);\n }\n });\n }\n\n public getName(): string {\n return 'webrtc';\n }\n public getPriority(): number {\n return 10;\n }\n\n public async syncSession(session: Session): Promise<void> {\n super.syncSession(session);\n if (this.status === 'connected') {\n await this.disconnect();\n await this.connect(session);\n }\n }\n\n public async connect(session?: Session): Promise<Session> {\n if (this.status === 'connected') {\n return Promise.resolve(this.session);\n }\n this.session = session || this.session || 'new';\n this.setStatus('connecting');\n\n this.config.logger?.debug('Connecting to WebRTC with sessionId:', this.session);\n await this.webRTCClient.connect(this.session);\n this.setStatus('connected');\n\n await this.webRTCClient.createDataChannel();\n\n return this.session;\n }\n\n public async disconnect(): Promise<void> {\n if (this.status === 'disconnected') {\n this.config.logger?.warn('Already disconnected');\n return Promise.resolve();\n }\n\n await this.webRTCClient.disconnect();\n\n this.setStatus('disconnected');\n this.config?.logger?.debug('Disconnected from WebRTC');\n }\n\n public send(message: Message): Promise<void> {\n if (this.status !== 'connected') {\n return Promise.reject(new Error('Not connected'));\n }\n\n this.webRTCClient.sendMessage(message as string);\n return Promise.resolve();\n }\n}\n\nexport { PersonaWebRTCProtocol };\nexport type { PersonaWebRTCProtocolConfig, AudioVisualizerCallback, AudioAnalysisData };\n","'use strict';\n'use client';\n\nimport { useState, useEffect, useCallback, PropsWithChildren, createContext, useContext, useMemo, useRef } from 'react';\nimport { useExternalStoreRuntime, AppendMessage, AssistantRuntimeProvider } from '@assistant-ui/react';\nimport {\n PersonaConfig,\n PersonaMessage,\n PersonaProtocol,\n PersonaProtocolBaseConfig,\n PersonaResponse,\n ProtocolStatus,\n Session,\n} from './types';\nimport { parseMessages, convertMessage } from './messages';\nimport {\n PersonaRESTProtocol,\n PersonaRESTProtocolConfig,\n PersonaWebRTCProtocol,\n PersonaWebRTCProtocolConfig,\n PersonaWebSocketProtocol,\n PersonaWebSocketProtocolConfig,\n} from './protocol';\n\ntype PersonaRuntimeContextType = {\n protocols: PersonaProtocol[];\n protocolsStatus: Map<string, ProtocolStatus>;\n};\n\nconst PersonaRuntimeContext = createContext<PersonaRuntimeContextType | undefined>(undefined);\n\nfunction PersonaRuntimeProviderInner({\n dev = false,\n protocols: _protocols,\n logger,\n children,\n session: defaultSession = 'new',\n ...config\n}: Readonly<PersonaConfig>) {\n const [isRunning, setIsRunning] = useState(false);\n const [messages, setMessages] = useState<PersonaMessage[]>([]);\n const [session, setSession] = useState<Session>(defaultSession);\n const [protocolsStatus, setProtocolsStatus] = useState<Map<string, ProtocolStatus>>(new Map());\n const didMount = useRef(false);\n\n const protocols = useMemo<PersonaProtocol[]>(() => {\n if (Array.isArray(_protocols)) {\n return _protocols;\n }\n\n if (typeof _protocols === 'object' && _protocols !== null) {\n const baseEndpoint = dev ? 'localhost:8000' : 'persona.applica.guru/api';\n const baseEndpointProtocol = dev ? 'http' : 'https';\n const baseWebSocketProtocol = dev ? 'ws' : 'wss';\n const availableProtocols = Object.keys(_protocols).map((key) => {\n switch (key) {\n case 'rest':\n const restConfig: PersonaProtocolBaseConfig | true | undefined = _protocols[key];\n if (restConfig === true) {\n return new PersonaRESTProtocol({\n apiUrl: `${baseEndpointProtocol}://${baseEndpoint}`,\n apiKey: config.apiKey,\n agentId: config.agentId,\n logger,\n });\n }\n return new PersonaRESTProtocol(restConfig as PersonaRESTProtocolConfig);\n case 'webrtc':\n const webrtcConfig: PersonaProtocolBaseConfig | true | undefined = _protocols[key];\n if (webrtcConfig === true) {\n return new PersonaWebRTCProtocol({\n webrtcUrl: `${baseWebSocketProtocol}://${baseEndpoint}/webrtc`,\n apiKey: config.apiKey,\n agentId: config.agentId,\n logger,\n });\n }\n return new PersonaWebRTCProtocol(webrtcConfig as PersonaWebRTCProtocolConfig);\n case 'websocket':\n const websocketConfig: PersonaProtocolBaseConfig | true | undefined = _protocols[key];\n if (websocketConfig === true) {\n return new PersonaWebSocketProtocol({\n webSocketUrl: `${baseWebSocketProtocol}://${baseEndpoint}/websocket`,\n apiKey: config.apiKey,\n agentId: config.agentId,\n logger,\n });\n }\n return new PersonaWebSocketProtocol(websocketConfig as PersonaWebSocketProtocolConfig);\n default:\n throw new Error(`Unknown protocol: ${key}`);\n }\n });\n return availableProtocols;\n }\n throw new Error('Invalid protocols configuration');\n }, []);\n\n useEffect(() => {\n if (didMount.current) return;\n\n didMount.current = true;\n logger?.debug(\n 'Initializing protocols: ',\n protocols.map((protocol) => protocol.getName()),\n );\n protocols.forEach((protocol) => {\n protocol.setSession(session);\n protocol.clearListeners();\n protocol.addStatusChangeListener((status: ProtocolStatus) => {\n logger?.debug(`${protocol.getName()} has notified new status: ${status}`);\n protocolsStatus.set(protocol.getName(), status);\n setProtocolsStatus(new Map(protocolsStatus));\n });\n protocol.addMessageListener((message: PersonaMessage) => {\n setMessages((currentConversation) => parseMessages([...currentConversation, ...[{ ...message, protocol: protocol.getName() }]]));\n });\n if (protocol.autostart && protocol.status === 'disconnected') {\n logger?.debug(`Connecting to protocol: ${protocol.getName()}`);\n protocol.connect(session);\n }\n });\n }, [session, protocols, logger, protocolsStatus]);\n\n const onNew = async (message: AppendMessage) => {\n if (message.content[0]?.type !== 'text') throw new Error('Only text messages are supported');\n\n const input = message.content[0].text;\n setMessages((currentConversation) => [...currentConversation, { role: 'user', type: 'text', text: input }]);\n setIsRunning(true);\n\n const protocol = protocols.sort((a, b) => b.getPriority() - a.getPriority()).find((protocol) => protocol.status === 'connected');\n\n await protocol?.send(input);\n\n setIsRunning(false);\n };\n\n const onCancel = useCallback(() => {\n setIsRunning(false);\n setMessages([]);\n setSession('new');\n return Promise.resolve();\n }, []);\n\n const onReload = useCallback(() => {\n return Promise.resolve();\n }, []);\n\n const runtime = useExternalStoreRuntime({\n isRunning,\n messages,\n convertMessage,\n onNew,\n onCancel,\n onReload,\n });\n\n return (\n <PersonaRuntimeContext.Provider value={{ protocols, protocolsStatus }}>\n <AssistantRuntimeProvider runtime={runtime}>{children}</AssistantRuntimeProvider>\n </PersonaRuntimeContext.Provider>\n );\n}\n\nfunction PersonaRuntimeProvider({ children, ...config }: PropsWithChildren<PersonaConfig>) {\n return <PersonaRuntimeProviderInner {...config}>{children}</PersonaRuntimeProviderInner>;\n}\n\nfunction usePersonaRuntime(): PersonaRuntimeContextType {\n const context = useContext(PersonaRuntimeContext);\n if (!context) {\n throw new Error('usePersonaRuntime must be used within a PersonaRuntimeProvider');\n }\n return context;\n}\n\n/**\n * Retrieves a specific protocol instance from the PersonaRuntimeContext.\n *\n * @param protocol - The name of the protocol to use.\n * @returns {PersonaProtocol | null} - The protocol instance or null if not found.\n * @throws {Error} - If the hook is used outside of a PersonaRuntimeProvider.\n */\nfunction usePersonaRuntimeProtocol(protocol: string): PersonaProtocol | null {\n const context = useContext(PersonaRuntimeContext);\n if (!context) {\n throw new Error('usePersonaRuntimeProtocol must be used within a PersonaRuntimeProvider');\n }\n\n const protocolInstance = context.protocols.find((p) => p.getName() === protocol);\n if (!protocolInstance) {\n return null;\n }\n\n const status = context.protocolsStatus.get(protocolInstance.getName());\n\n return {\n ...protocolInstance,\n connect: protocolInstance.connect.bind(protocolInstance),\n disconnect: protocolInstance.disconnect.bind(protocolInstance),\n send: protocolInstance.send.bind(protocolInstance),\n setSession: protocolInstance.setSession.bind(protocolInstance),\n addStatusChangeListener: protocolInstance.addStatusChangeListener.bind(protocolInstance),\n addMessageListener: protocolInstance.addMessageListener.bind(protocolInstance),\n getName: protocolInstance.getName.bind(protocolInstance),\n getPriority: protocolInstance.getPriority.bind(protocolInstance),\n status: status || protocolInstance.status,\n };\n}\n\nfunction usePersonaRuntimeWebRTCProtocol(): PersonaWebRTCProtocol | null {\n return usePersonaRuntimeProtocol('webrtc') as PersonaWebRTCProtocol;\n}\n\nexport { PersonaRuntimeProvider, usePersonaRuntime, usePersonaRuntimeProtocol, usePersonaRuntimeWebRTCProtocol };\nexport type { PersonaMessage, PersonaResponse };\n","interface PersonaLogger {\n log: (message: string, ...args: unknown[]) => void;\n info: (message: string, ...args: unknown[]) => void;\n warn: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n debug: (message: string, ...args: unknown[]) => void;\n}\n\nclass PersonaConsoleLogger implements PersonaLogger {\n prefix = '[Persona]';\n\n log(message: string, ...args: unknown[]) {\n console.log(`${this.prefix} - ${message}`, ...args);\n }\n\n info(message: string, ...args: unknown[]) {\n console.info(`${this.prefix} - ${message}`, ...args);\n }\n\n warn(message: string, ...args: unknown[]) {\n console.warn(`${this.prefix} - ${message}`, ...args);\n }\n\n error(message: string, ...args: unknown[]) {\n console.error(`${this.prefix} - ${message}`, ...args);\n }\n\n debug(message: string, ...args: unknown[]) {\n console.debug(`${this.prefix} - ${message}`, ...args);\n }\n}\n\nexport { PersonaConsoleLogger };\nexport type { PersonaLogger };\n"],"names":["getComponentNameFromType","type","REACT_CLIENT_REFERENCE","REACT_FRAGMENT_TYPE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","value","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","name","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","config","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","key","self","source","owner","debugStack","debugTask","REACT_ELEMENT_TYPE","jsxDEVImpl","maybeKey","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","propName","node","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","removeEmptyMessages","messages","message","_a","parseMessages","outputMessages","currentMessage","convertMessage","call","PersonaProtocolBase","__publicField","callback","session","status","notify","PersonaRESTProtocol","apiUrl","apiKey","agentId","sessionId","input","personaResponse","PersonaWebSocketProtocol","sid","webSocketUrl","event","data","error","PersonaWebRTCClient","err","track","remoteAudio","e","channel","msg","offer","metadata","offerMessage","_b","label","localSource","remoteSource","loop","localArray","remoteArray","localAmp","a","b","remoteAmp","PersonaWebRTCProtocol","_c","PersonaRuntimeContext","createContext","PersonaRuntimeProviderInner","dev","_protocols","logger","defaultSession","isRunning","setIsRunning","useState","setMessages","setSession","protocolsStatus","setProtocolsStatus","didMount","useRef","protocols","useMemo","baseEndpoint","baseEndpointProtocol","baseWebSocketProtocol","restConfig","webrtcConfig","websocketConfig","useEffect","protocol","currentConversation","onNew","onCancel","useCallback","onReload","runtime","useExternalStoreRuntime","jsx","AssistantRuntimeProvider","PersonaRuntimeProvider","usePersonaRuntime","context","useContext","usePersonaRuntimeProtocol","protocolInstance","p","usePersonaRuntimeWebRTCProtocol","PersonaConsoleLogger","args"],"mappings":"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","x_google_ignoreList":[0,1]}
1
+ {"version":3,"file":"bundle.cjs.js","sources":["../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/jsx-runtime.js","../src/messages.ts","../src/protocol/base.ts","../src/protocol/rest.ts","../src/protocol/websocket.ts","../src/protocol/webrtc.ts","../src/runtime.tsx","../src/logging.ts"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import { PersonaMessage } from './types';\nimport { ThreadMessageLike } from '@assistant-ui/react';\n\nfunction removeEmptyMessages(messages: PersonaMessage[]): PersonaMessage[] {\n return messages.filter((message) => {\n if (message.finishReason === 'stop') {\n return message.text !== null && message.text?.trim() !== '';\n }\n return true;\n });\n}\nfunction parseMessages(messages: PersonaMessage[]): PersonaMessage[] {\n const outputMessages: PersonaMessage[] = [];\n let currentMessage: PersonaMessage | null = null;\n\n for (const message of messages) {\n if (message.type === 'reasoning') {\n if (currentMessage != null) {\n outputMessages.push(currentMessage);\n currentMessage = null;\n }\n outputMessages.push(message);\n } else if (message.functionCalls) {\n if (currentMessage) {\n outputMessages.push(currentMessage);\n }\n outputMessages.push(message);\n currentMessage = null;\n } else if (message.functionResponse) {\n outputMessages[outputMessages.length - 1] = {\n ...outputMessages[outputMessages.length - 1],\n functionResponse: message.functionResponse,\n };\n } else if (\n currentMessage &&\n message.protocol === currentMessage.protocol &&\n (currentMessage.role === message.role || message.finishReason === 'stop')\n ) {\n currentMessage.text += message.text;\n } else {\n if (currentMessage) {\n outputMessages.push(currentMessage);\n }\n currentMessage = {\n ...message,\n };\n }\n }\n\n if (currentMessage) {\n outputMessages.push(currentMessage);\n }\n return removeEmptyMessages(outputMessages);\n}\n\nfunction convertMessage(message: PersonaMessage): ThreadMessageLike {\n if (message.role === 'function') {\n return {\n id: message.id!,\n role: 'assistant',\n status: message?.functionResponse === null ? { type: 'running' } : { type: 'complete', reason: 'stop' },\n content:\n message.functionCalls?.map((call) => ({\n type: 'tool-call',\n toolName: call.name,\n toolCallId: call.id,\n args: call.args,\n result: message.functionResponse?.result,\n })) ?? [],\n };\n }\n return {\n id: message.id!,\n role: message.role,\n content: message.type === 'reasoning' ? [{ type: 'reasoning', text: message.text }] : [{ type: 'text', text: message.text }],\n };\n}\n\nexport { parseMessages, convertMessage, removeEmptyMessages };\n","import { Message, MessageListenerCallback, PersonaMessage, PersonaProtocol, ProtocolStatus, Session, StatusChangeCallback } from '../types';\n\nabstract class PersonaProtocolBase implements PersonaProtocol {\n abstract status: ProtocolStatus;\n abstract session: Session;\n abstract autostart: boolean;\n\n private statusChangeCallbacks: StatusChangeCallback[] = [];\n private messageCallbacks: MessageListenerCallback[] = [];\n\n public addStatusChangeListener(callback: StatusChangeCallback) {\n this.statusChangeCallbacks.push(callback);\n }\n\n public addMessageListener(callback: MessageListenerCallback) {\n this.messageCallbacks.push(callback);\n }\n public async syncSession(session: Session): Promise<void> {\n this.session = session;\n }\n\n public async notifyMessage(message: PersonaMessage): Promise<void> {\n this.messageCallbacks.forEach((callback) => callback(message));\n }\n public async notifyMessages(messages: PersonaMessage[]): Promise<void> {\n messages.forEach((message) => {\n this.messageCallbacks.forEach((callback) => callback(message));\n });\n }\n\n public async setSession(session: Session): Promise<void> {\n this.session = session;\n }\n public async setStatus(status: ProtocolStatus): Promise<void> {\n const notify = this.status !== status;\n this.status = status;\n if (!notify) {\n return;\n }\n this.statusChangeCallbacks.forEach((callback) => callback(status));\n }\n\n public clearListeners(): void {\n this.statusChangeCallbacks = [];\n this.messageCallbacks = [];\n }\n\n abstract getName(): string;\n abstract getPriority(): number;\n abstract connect(session?: Session): Promise<Session>;\n abstract disconnect(): Promise<void>;\n abstract send(message: Message): Promise<void>;\n}\n\nexport { PersonaProtocolBase };\n","import { PersonaProtocolBase } from './base';\nimport { Message, PersonaResponse, Session, ProtocolStatus, PersonaProtocolBaseConfig } from '../types';\n\ntype PersonaRESTProtocolConfig = PersonaProtocolBaseConfig & {\n apiUrl: string;\n};\n\nclass PersonaRESTProtocol extends PersonaProtocolBase {\n status: ProtocolStatus;\n autostart: boolean;\n session: Session;\n config: PersonaRESTProtocolConfig;\n notify: boolean = true;\n\n constructor(config: PersonaRESTProtocolConfig) {\n super();\n this.config = config;\n this.status = 'disconnected';\n this.autostart = true;\n }\n\n public getName(): string {\n return 'rest';\n }\n\n public getPriority(): number {\n return 0;\n }\n\n public async connect(session: Session): Promise<Session> {\n this.setStatus('connected');\n return session;\n }\n\n public async disconnect(): Promise<void> {\n this.setStatus('disconnected');\n this.session = null;\n }\n\n public async syncSession(session: Session): Promise<void> {\n this.session = session;\n }\n\n public async send(message: Message): Promise<void> {\n const { apiUrl, apiKey, agentId } = this.config;\n const sessionId = this.session ?? 'new';\n const input = message;\n\n const response = await fetch(`${apiUrl}/agents/${agentId}/sessions/${sessionId}/messages`, {\n body: JSON.stringify({ userMessage: input }),\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-fox-apikey': apiKey,\n 'x-persona-apikey': apiKey,\n },\n });\n const personaResponse = (await response.json()) as PersonaResponse;\n this.notifyMessages(personaResponse.response.messages);\n }\n}\n\nexport { PersonaRESTProtocol };\nexport type { PersonaRESTProtocolConfig };\n","import { Message, PersonaMessage, PersonaProtocolBaseConfig, ProtocolStatus, Session } from '../types';\nimport { PersonaProtocolBase } from './base';\n\ntype PersonaWebSocketProtocolConfig = PersonaProtocolBaseConfig & {\n webSocketUrl: string;\n};\n\nclass PersonaWebSocketProtocol extends PersonaProtocolBase {\n status: ProtocolStatus;\n autostart: boolean;\n session: Session;\n config: PersonaWebSocketProtocolConfig;\n webSocket: WebSocket | null;\n\n constructor(config: PersonaWebSocketProtocolConfig) {\n super();\n this.config = config;\n this.status = 'disconnected';\n this.autostart = true;\n this.session = null;\n this.webSocket = null;\n }\n\n public getName(): string {\n return 'websocket';\n }\n\n public getPriority(): number {\n return 1;\n }\n\n public async syncSession(session: Session): Promise<void> {\n this.config.logger?.debug('Syncing session with WebSocket protocol:', session);\n this.session = session;\n if (this.webSocket && this.status === 'connected') {\n this.disconnect();\n this.connect(session);\n }\n }\n\n public connect(session?: Session): Promise<Session> {\n if (this.webSocket !== null && this.status === 'connected') {\n return Promise.resolve(this.session);\n }\n\n const sid = session || this.session || 'new';\n\n this.config.logger?.debug('Connecting to WebSocket with sessionId:', sid);\n\n const apiKey = encodeURIComponent(this.config.apiKey);\n const agentId = this.config.agentId;\n const webSocketUrl = `${this.config.webSocketUrl}?sessionCode=${sid}&agentId=${agentId}&apiKey=${apiKey}`;\n this.setStatus('connecting');\n this.webSocket = new WebSocket(webSocketUrl);\n this.webSocket.addEventListener('open', () => {\n this.setStatus('connected');\n });\n this.webSocket.addEventListener('message', (event) => {\n const data = JSON.parse(event.data) as { type: 'message' | unknown; payload: PersonaMessage | unknown };\n\n if (data.type !== 'message') {\n return;\n }\n const message = data.payload as PersonaMessage & { thought?: string };\n\n this.notifyMessage(message?.thought ? { role: 'assistant', type: 'reasoning', text: message.thought } : message);\n });\n this.webSocket.addEventListener('close', () => {\n this.setStatus('disconnected');\n this.webSocket = null;\n this.config.logger?.warn('WebSocket connection closed');\n });\n\n this.webSocket.addEventListener('error', (error) => {\n this.setStatus('disconnected');\n this.webSocket = null;\n this.config.logger?.error('WebSocket error', error);\n\n // TODO: Implement reconnection logic\n });\n\n return Promise.resolve(sid);\n }\n\n public disconnect(): Promise<void> {\n this.config.logger?.debug('Disconnecting WebSocket');\n if (this.webSocket && this.status === 'connected') {\n this.webSocket.close();\n this.setStatus('disconnected');\n this.webSocket = null;\n }\n return Promise.resolve();\n }\n\n public send(message: Message): Promise<void> {\n if (this.webSocket && this.status === 'connected') {\n this.webSocket.send(JSON.stringify({ type: 'request', payload: message }));\n return Promise.resolve();\n } else {\n return Promise.reject(new Error('WebSocket is not connected'));\n }\n }\n}\n\nexport { PersonaWebSocketProtocol };\nexport type { PersonaWebSocketProtocolConfig };\n","import { PersonaProtocolBase } from './base';\nimport { Message, PersonaMessage, PersonaProtocolBaseConfig, ProtocolStatus, Session } from '../types';\n\ntype AudioAnalysisData = {\n localAmplitude: number;\n remoteAmplitude: number;\n};\n\ntype AudioVisualizerCallback = (data: AudioAnalysisData) => void;\n\ntype PersonaWebRTCMessageCallback = (data: MessageEvent) => void;\n\ntype PersonaWebRTCConfig = PersonaProtocolBaseConfig & {\n webrtcUrl: string;\n iceServers?: RTCIceServer[];\n};\n\nclass PersonaWebRTCClient {\n private config: PersonaWebRTCConfig;\n private pc: RTCPeerConnection | null = null;\n private ws: WebSocket | null = null;\n private localStream: MediaStream | null = null;\n private remoteStream: MediaStream = new MediaStream();\n private audioCtx: AudioContext | null = null;\n\n private localAnalyser: AnalyserNode | null = null;\n private remoteAnalyser: AnalyserNode | null = null;\n private analyzerFrame: number | null = null;\n private dataChannel: RTCDataChannel | null = null;\n\n private isConnected: boolean = false;\n private visualizerCallbacks: AudioVisualizerCallback[] = [];\n private messageCallbacks: PersonaWebRTCMessageCallback[] = [];\n\n constructor(config: PersonaWebRTCConfig) {\n this.config = config;\n }\n\n public async connect(session: Session): Promise<Session> {\n if (this.isConnected) return;\n\n this.isConnected = true;\n\n try {\n this.localStream = await navigator.mediaDevices.getUserMedia({ audio: true });\n } catch (err) {\n this.config.logger?.error('Error accessing microphone:', err);\n return;\n }\n\n this.pc = new RTCPeerConnection({\n iceServers: this.config.iceServers || [\n {\n urls: 'stun:34.38.108.251:3478',\n },\n {\n urls: 'turn:34.38.108.251:3478',\n username: 'webrtc',\n credential: 'webrtc',\n },\n ],\n });\n\n this.localStream.getTracks().forEach((track) => {\n this.pc!.addTrack(track, this.localStream!);\n });\n\n this.pc.ontrack = (event) => {\n event.streams[0].getTracks().forEach((track) => {\n this.remoteStream.addTrack(track);\n });\n\n if (!this.audioCtx) {\n this._startAnalyzers();\n }\n\n const remoteAudio = new Audio();\n remoteAudio.srcObject = this.remoteStream;\n remoteAudio.play().catch((e) => {\n this.config.logger?.error('Error playing remote audio:', e);\n });\n };\n\n this.pc.onicecandidate = (event) => {\n if (event.candidate && this.ws?.readyState === WebSocket.OPEN) {\n this.ws.send(\n JSON.stringify({\n type: 'CANDIDATE',\n src: 'client',\n payload: { candidate: event.candidate },\n }),\n );\n }\n };\n\n this.pc.ondatachannel = (event) => {\n const channel = event.channel;\n channel.onmessage = (msg) => {\n this.messageCallbacks.forEach((callback) => {\n callback(msg);\n });\n };\n };\n\n this.ws = new WebSocket(this.config.webrtcUrl || 'wss://persona.applica.guru/api/webrtc');\n this.ws.onopen = async () => {\n const offer = await this.pc!.createOffer();\n await this.pc!.setLocalDescription(offer);\n\n const metadata = {\n agentId: this.config.agentId,\n sessionCode: session as string,\n };\n this.config.logger?.debug('Opening connection to WebRTC server: ', metadata);\n\n const offerMessage = {\n type: 'OFFER',\n src: crypto.randomUUID?.() || 'client_' + Date.now(),\n payload: {\n sdp: {\n sdp: offer.sdp,\n type: offer.type,\n },\n connectionId: (Date.now() % 1000000).toString(),\n metadata,\n },\n };\n\n this.ws!.send(JSON.stringify(offerMessage));\n };\n\n this.ws.onmessage = async (event) => {\n const data = JSON.parse(event.data);\n if (data.type === 'ANSWER') {\n await this.pc!.setRemoteDescription(new RTCSessionDescription(data.payload.sdp));\n } else if (data.type === 'CANDIDATE') {\n try {\n await this.pc!.addIceCandidate(new RTCIceCandidate(data.payload.candidate));\n } catch (err) {\n this.config.logger?.error('Error adding ICE candidate:', err);\n }\n }\n };\n\n this.ws.onclose = () => {\n this._stopAnalyzers();\n };\n }\n\n public async disconnect(): Promise<void> {\n if (!this.isConnected) return;\n\n this.isConnected = false;\n\n if (this.ws?.readyState === WebSocket.OPEN) this.ws.close();\n if (this.pc) this.pc.close();\n if (this.localStream) {\n this.localStream.getTracks().forEach((track) => track.stop());\n }\n\n this.remoteStream = new MediaStream();\n if (this.audioCtx) {\n await this.audioCtx.close();\n this.audioCtx = null;\n }\n\n this._stopAnalyzers();\n }\n\n public addVisualizerCallback(callback: AudioVisualizerCallback): void {\n this.visualizerCallbacks.push(callback);\n }\n public addMessageCallback(callback: PersonaWebRTCMessageCallback): void {\n this.messageCallbacks.push(callback);\n }\n\n public createDataChannel(label = 'messages'): void {\n if (!this.pc) return;\n this.dataChannel = this.pc.createDataChannel(label);\n this.dataChannel.onopen = () => this.config.logger?.info('Data channel opened');\n this.dataChannel.onmessage = (msg: MessageEvent) => {\n this.messageCallbacks.forEach((callback) => {\n callback(msg);\n });\n };\n }\n\n public sendMessage(message: string): void {\n if (!this.dataChannel) {\n this.config.logger?.warn('Data channel is not open, cannot send message');\n return;\n }\n\n this.dataChannel.send(message);\n this.config.logger?.info('Sent message:', message);\n }\n\n private _startAnalyzers(): void {\n if (!this.localStream || !this.remoteStream || this.visualizerCallbacks.length === 0) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.audioCtx = new (window.AudioContext || (window as any).webkitAudioContext)();\n\n const localSource = this.audioCtx.createMediaStreamSource(this.localStream);\n const remoteSource = this.audioCtx.createMediaStreamSource(this.remoteStream);\n\n this.localAnalyser = this.audioCtx.createAnalyser();\n this.remoteAnalyser = this.audioCtx.createAnalyser();\n this.localAnalyser.fftSize = 256;\n this.remoteAnalyser.fftSize = 256;\n\n localSource.connect(this.localAnalyser);\n remoteSource.connect(this.remoteAnalyser);\n\n const loop = () => {\n if (!this.localAnalyser || !this.remoteAnalyser || this.visualizerCallbacks.length === 0) {\n return;\n }\n\n const localArray = new Uint8Array(this.localAnalyser.frequencyBinCount);\n const remoteArray = new Uint8Array(this.remoteAnalyser.frequencyBinCount);\n\n this.localAnalyser.getByteFrequencyData(localArray);\n this.remoteAnalyser.getByteFrequencyData(remoteArray);\n\n const localAmp = localArray.reduce((a, b) => a + b, 0) / localArray.length;\n const remoteAmp = remoteArray.reduce((a, b) => a + b, 0) / remoteArray.length;\n\n if (this.visualizerCallbacks.length > 0) {\n this.visualizerCallbacks.forEach((callback) => {\n callback({\n localAmplitude: localAmp,\n remoteAmplitude: remoteAmp,\n });\n });\n }\n\n this.analyzerFrame = requestAnimationFrame(loop);\n };\n\n this.analyzerFrame = requestAnimationFrame(loop);\n }\n\n private _stopAnalyzers(): void {\n if (this.analyzerFrame) {\n cancelAnimationFrame(this.analyzerFrame);\n this.analyzerFrame = null;\n }\n this.localAnalyser = null;\n this.remoteAnalyser = null;\n }\n}\n\ntype PersonaWebRTCProtocolConfig = PersonaWebRTCConfig & {\n autostart?: boolean;\n};\n\nclass PersonaWebRTCProtocol extends PersonaProtocolBase {\n status: ProtocolStatus;\n session: Session;\n autostart: boolean;\n config: PersonaWebRTCProtocolConfig;\n webRTCClient: PersonaWebRTCClient;\n\n constructor(config: PersonaWebRTCProtocolConfig) {\n super();\n this.config = config;\n this.status = 'disconnected';\n this.session = null;\n this.autostart = config?.autostart ?? false;\n this.webRTCClient = new PersonaWebRTCClient(config);\n this.webRTCClient.addMessageCallback((msg: MessageEvent) => {\n config.logger?.debug('Received data message:', msg.data);\n const data = JSON.parse(msg.data) as { type: 'message' | unknown; payload: PersonaMessage | unknown };\n if (data.type === 'message') {\n this.notifyMessage(data.payload as PersonaMessage);\n }\n });\n }\n\n public getName(): string {\n return 'webrtc';\n }\n public getPriority(): number {\n return 10;\n }\n\n public async syncSession(session: Session): Promise<void> {\n super.syncSession(session);\n if (this.status === 'connected') {\n await this.disconnect();\n await this.connect(session);\n }\n }\n\n public async connect(session?: Session): Promise<Session> {\n if (this.status === 'connected') {\n return Promise.resolve(this.session);\n }\n this.session = session || this.session || 'new';\n this.setStatus('connecting');\n\n this.config.logger?.debug('Connecting to WebRTC with sessionId:', this.session);\n await this.webRTCClient.connect(this.session);\n this.setStatus('connected');\n\n await this.webRTCClient.createDataChannel();\n\n return this.session;\n }\n\n public async disconnect(): Promise<void> {\n if (this.status === 'disconnected') {\n this.config.logger?.warn('Already disconnected');\n return Promise.resolve();\n }\n\n await this.webRTCClient.disconnect();\n\n this.setStatus('disconnected');\n this.config?.logger?.debug('Disconnected from WebRTC');\n }\n\n public send(message: Message): Promise<void> {\n if (this.status !== 'connected') {\n return Promise.reject(new Error('Not connected'));\n }\n\n this.webRTCClient.sendMessage(message as string);\n return Promise.resolve();\n }\n}\n\nexport { PersonaWebRTCProtocol };\nexport type { PersonaWebRTCProtocolConfig, AudioVisualizerCallback, AudioAnalysisData };\n","import { useState, useEffect, useCallback, PropsWithChildren, createContext, useContext, useMemo, useRef } from 'react';\nimport { useExternalStoreRuntime, AppendMessage, AssistantRuntimeProvider } from '@assistant-ui/react';\nimport {\n PersonaConfig,\n PersonaMessage,\n PersonaProtocol,\n PersonaProtocolBaseConfig,\n PersonaResponse,\n ProtocolStatus,\n Session,\n} from './types';\nimport { parseMessages, convertMessage } from './messages';\nimport {\n PersonaRESTProtocol,\n PersonaRESTProtocolConfig,\n PersonaWebRTCProtocol,\n PersonaWebRTCProtocolConfig,\n PersonaWebSocketProtocol,\n PersonaWebSocketProtocolConfig,\n} from './protocol';\n\ntype PersonaRuntimeContextType = {\n protocols: PersonaProtocol[];\n protocolsStatus: Map<string, ProtocolStatus>;\n};\n\nconst PersonaRuntimeContext = createContext<PersonaRuntimeContextType | undefined>(undefined);\n\nfunction PersonaRuntimeProviderInner({\n dev = false,\n protocols: _protocols,\n logger,\n children,\n session: defaultSession = 'new',\n ...config\n}: Readonly<PersonaConfig>) {\n const [isRunning, setIsRunning] = useState(false);\n const [messages, setMessages] = useState<PersonaMessage[]>([]);\n const [session, setSession] = useState<Session>(defaultSession);\n const [protocolsStatus, setProtocolsStatus] = useState<Map<string, ProtocolStatus>>(new Map());\n const didMount = useRef(false);\n\n const protocols = useMemo<PersonaProtocol[]>(() => {\n if (Array.isArray(_protocols)) {\n return _protocols;\n }\n\n if (typeof _protocols === 'object' && _protocols !== null) {\n const baseEndpoint = dev ? 'localhost:8000' : 'persona.applica.guru/api';\n const baseEndpointProtocol = dev ? 'http' : 'https';\n const baseWebSocketProtocol = dev ? 'ws' : 'wss';\n const availableProtocols = Object.keys(_protocols).map((key) => {\n switch (key) {\n case 'rest':\n const restConfig: PersonaProtocolBaseConfig | true | undefined = _protocols[key];\n if (restConfig === true) {\n return new PersonaRESTProtocol({\n apiUrl: `${baseEndpointProtocol}://${baseEndpoint}`,\n apiKey: config.apiKey,\n agentId: config.agentId,\n logger,\n });\n }\n return new PersonaRESTProtocol(restConfig as PersonaRESTProtocolConfig);\n case 'webrtc':\n const webrtcConfig: PersonaProtocolBaseConfig | true | undefined = _protocols[key];\n if (webrtcConfig === true) {\n return new PersonaWebRTCProtocol({\n webrtcUrl: `${baseWebSocketProtocol}://${baseEndpoint}/webrtc`,\n apiKey: config.apiKey,\n agentId: config.agentId,\n logger,\n });\n }\n return new PersonaWebRTCProtocol(webrtcConfig as PersonaWebRTCProtocolConfig);\n case 'websocket':\n const websocketConfig: PersonaProtocolBaseConfig | true | undefined = _protocols[key];\n if (websocketConfig === true) {\n return new PersonaWebSocketProtocol({\n webSocketUrl: `${baseWebSocketProtocol}://${baseEndpoint}/websocket`,\n apiKey: config.apiKey,\n agentId: config.agentId,\n logger,\n });\n }\n return new PersonaWebSocketProtocol(websocketConfig as PersonaWebSocketProtocolConfig);\n default:\n throw new Error(`Unknown protocol: ${key}`);\n }\n });\n return availableProtocols;\n }\n throw new Error('Invalid protocols configuration');\n }, []);\n\n useEffect(() => {\n if (didMount.current) return;\n\n didMount.current = true;\n logger?.debug(\n 'Initializing protocols: ',\n protocols.map((protocol) => protocol.getName()),\n );\n protocols.forEach((protocol) => {\n protocol.setSession(session);\n protocol.clearListeners();\n protocol.addStatusChangeListener((status: ProtocolStatus) => {\n logger?.debug(`${protocol.getName()} has notified new status: ${status}`);\n protocolsStatus.set(protocol.getName(), status);\n setProtocolsStatus(new Map(protocolsStatus));\n });\n protocol.addMessageListener((message: PersonaMessage) => {\n setMessages((currentConversation) => parseMessages([...currentConversation, ...[{ ...message, protocol: protocol.getName() }]]));\n });\n if (protocol.autostart && protocol.status === 'disconnected') {\n logger?.debug(`Connecting to protocol: ${protocol.getName()}`);\n protocol.connect(session);\n }\n });\n }, [session, protocols, logger, protocolsStatus]);\n\n const onNew = async (message: AppendMessage) => {\n if (message.content[0]?.type !== 'text') throw new Error('Only text messages are supported');\n\n const input = message.content[0].text;\n setMessages((currentConversation) => [...currentConversation, { role: 'user', type: 'text', text: input }]);\n setIsRunning(true);\n\n const protocol = protocols.sort((a, b) => b.getPriority() - a.getPriority()).find((protocol) => protocol.status === 'connected');\n\n await protocol?.send(input);\n\n setIsRunning(false);\n };\n\n const onCancel = useCallback(() => {\n setIsRunning(false);\n setMessages([]);\n setSession('new');\n return Promise.resolve();\n }, []);\n\n const onReload = useCallback(() => {\n return Promise.resolve();\n }, []);\n\n const runtime = useExternalStoreRuntime({\n isRunning,\n messages,\n convertMessage,\n onNew,\n onCancel,\n onReload,\n });\n\n return (\n <PersonaRuntimeContext.Provider value={{ protocols, protocolsStatus }}>\n <AssistantRuntimeProvider runtime={runtime}>{children}</AssistantRuntimeProvider>\n </PersonaRuntimeContext.Provider>\n );\n}\n\nfunction PersonaRuntimeProvider({ children, ...config }: PropsWithChildren<PersonaConfig>) {\n return <PersonaRuntimeProviderInner {...config}>{children}</PersonaRuntimeProviderInner>;\n}\n\nfunction usePersonaRuntime(): PersonaRuntimeContextType {\n const context = useContext(PersonaRuntimeContext);\n if (!context) {\n throw new Error('usePersonaRuntime must be used within a PersonaRuntimeProvider');\n }\n return context;\n}\n\n/**\n * Retrieves a specific protocol instance from the PersonaRuntimeContext.\n *\n * @param protocol - The name of the protocol to use.\n * @returns {PersonaProtocol | null} - The protocol instance or null if not found.\n * @throws {Error} - If the hook is used outside of a PersonaRuntimeProvider.\n */\nfunction usePersonaRuntimeProtocol(protocol: string): PersonaProtocol | null {\n const context = useContext(PersonaRuntimeContext);\n if (!context) {\n throw new Error('usePersonaRuntimeProtocol must be used within a PersonaRuntimeProvider');\n }\n\n const protocolInstance = context.protocols.find((p) => p.getName() === protocol);\n if (!protocolInstance) {\n return null;\n }\n\n const status = context.protocolsStatus.get(protocolInstance.getName());\n\n return {\n ...protocolInstance,\n connect: protocolInstance.connect.bind(protocolInstance),\n disconnect: protocolInstance.disconnect.bind(protocolInstance),\n send: protocolInstance.send.bind(protocolInstance),\n setSession: protocolInstance.setSession.bind(protocolInstance),\n addStatusChangeListener: protocolInstance.addStatusChangeListener.bind(protocolInstance),\n addMessageListener: protocolInstance.addMessageListener.bind(protocolInstance),\n getName: protocolInstance.getName.bind(protocolInstance),\n getPriority: protocolInstance.getPriority.bind(protocolInstance),\n status: status || protocolInstance.status,\n };\n}\n\nfunction usePersonaRuntimeWebRTCProtocol(): PersonaWebRTCProtocol | null {\n return usePersonaRuntimeProtocol('webrtc') as PersonaWebRTCProtocol;\n}\n\nexport { PersonaRuntimeProvider, usePersonaRuntime, usePersonaRuntimeProtocol, usePersonaRuntimeWebRTCProtocol };\nexport type { PersonaMessage, PersonaResponse };\n","interface PersonaLogger {\n log: (message: string, ...args: unknown[]) => void;\n info: (message: string, ...args: unknown[]) => void;\n warn: (message: string, ...args: unknown[]) => void;\n error: (message: string, ...args: unknown[]) => void;\n debug: (message: string, ...args: unknown[]) => void;\n}\n\nclass PersonaConsoleLogger implements PersonaLogger {\n prefix = '[Persona]';\n\n log(message: string, ...args: unknown[]) {\n console.log(`${this.prefix} - ${message}`, ...args);\n }\n\n info(message: string, ...args: unknown[]) {\n console.info(`${this.prefix} - ${message}`, ...args);\n }\n\n warn(message: string, ...args: unknown[]) {\n console.warn(`${this.prefix} - ${message}`, ...args);\n }\n\n error(message: string, ...args: unknown[]) {\n console.error(`${this.prefix} - ${message}`, ...args);\n }\n\n debug(message: string, ...args: unknown[]) {\n console.debug(`${this.prefix} - ${message}`, ...args);\n }\n}\n\nexport { PersonaConsoleLogger };\nexport type { PersonaLogger };\n"],"names":["REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","reactJsxRuntime_production","jsxRuntimeModule","require$$0","removeEmptyMessages","messages","message","_a","parseMessages","outputMessages","currentMessage","convertMessage","call","PersonaProtocolBase","__publicField","callback","session","status","notify","PersonaRESTProtocol","apiUrl","apiKey","agentId","sessionId","input","personaResponse","PersonaWebSocketProtocol","sid","webSocketUrl","event","data","error","PersonaWebRTCClient","err","track","remoteAudio","e","channel","msg","offer","metadata","offerMessage","_b","label","localSource","remoteSource","loop","localArray","remoteArray","localAmp","a","b","remoteAmp","PersonaWebRTCProtocol","_c","PersonaRuntimeContext","createContext","PersonaRuntimeProviderInner","dev","_protocols","logger","children","defaultSession","isRunning","setIsRunning","useState","setMessages","setSession","protocolsStatus","setProtocolsStatus","didMount","useRef","protocols","useMemo","baseEndpoint","baseEndpointProtocol","baseWebSocketProtocol","restConfig","webrtcConfig","websocketConfig","useEffect","protocol","currentConversation","onNew","onCancel","useCallback","onReload","runtime","useExternalStoreRuntime","jsx","AssistantRuntimeProvider","PersonaRuntimeProvider","usePersonaRuntime","context","useContext","usePersonaRuntimeProtocol","protocolInstance","p","usePersonaRuntimeWebRTCProtocol","PersonaConsoleLogger","args"],"mappings":"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","x_google_ignoreList":[0,1]}