@urun-sh/react 0.2.13 → 0.2.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client"
|
|
2
|
-
"use strict";var gn=Object.defineProperty;var Fr=Object.getOwnPropertyDescriptor;var Br=Object.getOwnPropertyNames;var Vr=Object.prototype.hasOwnProperty;var Hr=(n,e)=>{for(var r in e)gn(n,r,{get:e[r],enumerable:!0})},$r=(n,e,r,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Br(e))!Vr.call(n,o)&&o!==r&&gn(n,o,{get:()=>e[o],enumerable:!(t=Fr(e,o))||t.enumerable});return n};var jr=n=>$r(gn({},"__esModule",{value:!0}),n);var st={};Hr(st,{ComponentRenderer:()=>er,DEFAULT_CAMERA_CONSTRAINTS:()=>An,DEFAULT_LOG_CAP:()=>re,DEFAULT_VOICE_CONSTRAINTS:()=>wn,DocPatchForm:()=>Fe,ImageFrame:()=>ur,ImageFrameSchema:()=>ar,MetricsPanel:()=>lr,MetricsPanelSchema:()=>cr,ProgressCard:()=>rr,ProgressCardSchema:()=>nr,StatusBadge:()=>or,StatusBadgeSchema:()=>tr,TextStream:()=>ir,TextStreamSchema:()=>sr,UrunAudio:()=>Xe,UrunAuthProvider:()=>Sn,UrunCamera:()=>Sr,UrunControlSender:()=>Ur,UrunDocPanel:()=>Pr,UrunErrorBoundary:()=>pe,UrunEventSpine:()=>Rr,UrunIdleWarning:()=>Lr,UrunJwtProvider:()=>Wn,UrunProvider:()=>Bn,UrunSessionClock:()=>Mr,UrunSessionEnded:()=>Ir,UrunSessionGate:()=>_r,UrunSessionStatus:()=>Ar,UrunSessionWaking:()=>dn,UrunStreamTail:()=>Tr,UrunVoice:()=>fr,authMode:()=>_e,createDocStore:()=>nn,describeSessionPhase:()=>fn.describeSessionPhase,formatPayload:()=>Te,getUrunAudioContext:()=>Oe,isWakingPhase:()=>fn.isWakingPhase,parseJsonObject:()=>tn,pushCapped:()=>Q,registerComponent:()=>Yn,resumeUrunAudioContext:()=>qe,urunPublicEnv:()=>Z,useApp:()=>Hn,useChat:()=>Xn,useCompletion:()=>Kn,useDocStore:()=>Ce,useImageFrame:()=>xn,useInputPresence:()=>Gn,useMetricsPanel:()=>Un,useProgressCard:()=>Cn,useRequest:()=>$n,useSessionDoc:()=>Cr,useSessionEndsAt:()=>Mn,useSessionIdle:()=>In,useSessionPhase:()=>z,useSessionTrack:()=>vr,useSessionWake:()=>ln,useStatusBadge:()=>Tn,useStreamMessages:()=>sn,useTextStream:()=>Pn,useUrunAudioLevel:()=>hr,useUrunAuth:()=>$e,useUrunPrewake:()=>Or,usesWorkOSAuth:()=>On});module.exports=jr(st);var ge=require("react");var Ln=require("react"),Ae=require("react/jsx-runtime"),pe=class extends Ln.Component{constructor(e){super(e),this.state={error:null}}static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,r){console.error("[urun] Error caught by UrunErrorBoundary:",e,r)}render(){if(this.state.error){let{fallback:e}=this.props;return typeof e=="function"?e(this.state.error):e||(0,Ae.jsxs)("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[(0,Ae.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,Ae.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var Dn=require("react"),me=(0,Dn.createContext)(null);function se(n){return n&&n.trim()?n.trim():void 0}function Z(n){switch(n){case"NEXT_PUBLIC_AUTH_MODE":return se(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return se(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return se(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return se(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return se(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return se(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return se(typeof process<"u"?process.env?.[n]:void 0)}}function _e(){let n=Z("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return n==="jwt"||n==="customer-jwt"||n==="test-jwt"?"jwt":n==="workos"||Z("VERCEL_ENV")==="production"?"workos":Z("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function On(){return _e()==="workos"}var fe=require("react"),Fn=require("react/jsx-runtime"),qn=(0,fe.createContext)(null);function Sn({getAccessToken:n,children:e}){let r=(0,fe.useMemo)(()=>({getAccessToken:n}),[n]);return(0,Fn.jsx)(qn.Provider,{value:r,children:e})}var Wn=Sn;function $e(){return(0,fe.useContext)(qn)}var je=require("react/jsx-runtime");function Bn({baseUrl:n,orgId:e,appId:r,jwt:t,authProvider:o,fallback:s,children:i}){let[a,l]=(0,ge.useState)(),u=$e(),p=Z("NEXT_PUBLIC_SESSION_TOKEN")??Z("NEXT_PUBLIC_URUN_JWT"),c=_e(),m=c==="workos"&&!t,S=t??(c==="jwt"?p:void 0)??a,k=o??Z("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),C=m&&!S,h=(0,ge.useMemo)(()=>({appId:r,baseUrl:n,orgId:e,jwt:S,getAccessToken:m?u?.getAccessToken:void 0,authProvider:k}),[r,u,n,k,S,e,m]);return(0,ge.useEffect)(()=>{if(!m||!u)return;let v=!1,x=u;async function y(){try{let g=await x.getAccessToken();v||l(g??void 0)}catch{v||l(void 0)}}y();let R=window.setInterval(()=>{y()},6e4);return()=>{v=!0,window.clearInterval(R)}},[u,m]),(0,je.jsx)(pe,{fallback:s,children:C?(0,je.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,je.jsx)(me.Provider,{value:h,children:i})})}var J=require("react"),Vn=require("@urun-sh/core");function Kr(n,e){return`${n}:${JSON.stringify(e??{})}`}function Jr(n,e,r){return JSON.stringify({appId:n.appId,baseUrl:n.baseUrl,orgId:n.orgId,jwt:n.jwt,authProvider:n.authProvider,fnName:e,args:r??{}})}var Se=new Map;var hn=class{constructor(e,r){this._doc=e;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(e,r){return this._doc.get(e,r)}set(e){this._doc.set(e),this._notify()}on(e,r){return this._doc.on(e,t=>r(t))}get synced(){return this._doc.synced}onSynced(e){return this._doc.onSynced(()=>{e(),this._notify()})}text(e){let r=this._doc.text(e),t=this._notify;return{append(o){r.append(o),t()},toString:()=>r.toString(),get length(){return r.length},on:(o,s)=>r.on(o,i=>{s(i),t()})}}dispose(){this._unsubscribeChange()}},vn=class{constructor(e,r){this._stream=e;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(e){return this._stream.attach(e)}attachVideo(e){return this._stream.attachVideo(e)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(e){return this._stream.seek(e)}chunks(e){return this._stream.chunks(e)}onSeeked(e){return this._stream.onSeeked(e)}on(e,r){return this._stream.on(e,r)}messages(){return this._stream.messages()}emit(e,r){return this._stream.emit(e,r)}dispose(){this._unsubscribeTrack()}},yn=class{constructor(e,r){this._session=e;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll())}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}addNotifier(e){this._notifiers.add(e)}removeNotifier(e){this._notifiers.delete(e)}_notifyAll(){for(let e of this._notifiers)e()}get id(){return this._session.id}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(e){return this._session.onPhase(e)}whenLive(e){return this._session.whenLive(e)}recover(){this._session.recover()}onRecovery(e){return this._session.onRecovery(e)}request(e,r){return this._session.request(e,r)}requestStream(e,r){return this._session.requestStream(e,r)}complete(e,r){return this._session.complete(e,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(e){let r=this._docs.get(e);return r||(r=new hn(this._session.doc(e),()=>this._notifyAll()),this._docs.set(e,r)),r}stream(e){let r=this._streams.get(e);return r||(r=new vn(this._session.stream(e),()=>this._notifyAll()),this._streams.set(e,r)),r}disconnect(){this._disposed=!0;for(let e of this._docs.values())e.dispose();for(let e of this._streams.values())e.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._session.disconnect(),this._notifyAll(),this._notifiers.clear()}};function Hn(){let n=(0,J.useContext)(me);if(!n)throw new Error("useApp must be used within <UrunProvider>");if(!n.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,e]=(0,J.useReducer)(s=>s+1,0),r=(0,J.useRef)(new Map),t=(0,J.useRef)(new Map),o=(0,J.useMemo)(()=>(0,Vn.App)(n.appId,{baseUrl:n.baseUrl,orgId:n.orgId,jwt:n.jwt,getAccessToken:n.getAccessToken,authProvider:n.authProvider}),[n.appId,n.baseUrl,n.orgId,n.jwt,n.getAccessToken,n.authProvider]);return(0,J.useEffect)(()=>()=>{for(let[s,i]of t.current){let a=Se.get(s);a===i&&(a.handle.removeNotifier(e),a.refCount=Math.max(0,a.refCount-1),a.refCount===0&&(a.disposeTimer=setTimeout(()=>{let l=Se.get(s);!l||l.refCount!==0||(Se.delete(s),l.handle.disconnect())},0)))}t.current.clear(),r.current.clear()},[]),(0,J.useMemo)(()=>new Proxy({},{get(s,i){if(typeof i=="string")return a=>{let l=Kr(i,a),u=r.current.get(l);if(u&&!u.disposed)return u;let p=Jr(n,i,a),c=Se.get(p);return c?.handle.disposed&&(c.disposeTimer&&clearTimeout(c.disposeTimer),Se.delete(p),t.current.get(p)===c&&t.current.delete(p),c=void 0),c?c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null):(c={handle:new yn(o[i](a),e),refCount:0,disposeTimer:null},Se.set(p,c)),t.current.get(p)!==c&&(t.current.set(p,c),c.handle.addNotifier(e),c.refCount+=1),r.current.set(l,c.handle),c.handle}}}),[n,o])}var F=require("react");function he(n){let e=n;if(!e||typeof e.request!="function"||typeof e.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return e}function zr(n){return n instanceof Error?n:new Error(String(n))}function $n(n,e){let r=(0,F.useMemo)(()=>he(n),[n]),[t,o]=(0,F.useState)(void 0),[s,i]=(0,F.useState)(null),[a,l]=(0,F.useState)(!1),u=(0,F.useRef)(e);u.current=e;let p=(0,F.useRef)(0),c=(0,F.useRef)(null),m=(0,F.useRef)(!0);(0,F.useEffect)(()=>(m.current=!0,()=>{m.current=!1,c.current?.abort()}),[]);let S=(0,F.useCallback)(async h=>{c.current?.abort();let v=new AbortController;c.current=v;let x=++p.current,y=()=>m.current&&p.current===x;y()&&(l(!0),i(null));try{let R=await r.request(h,{...u.current,signal:v.signal});return y()&&(o(R),l(!1),u.current?.onSuccess?.(R)),R}catch(R){let g=zr(R);throw y()&&(i(g),l(!1),u.current?.onError?.(g)),g}},[r]),k=(0,F.useCallback)(h=>{S(h).catch(()=>{})},[S]),C=(0,F.useCallback)(()=>{p.current++,c.current?.abort(),c.current=null,o(void 0),i(null),l(!1)},[]);return{mutate:k,mutateAsync:S,data:t,error:s,isPending:a,reset:C}}var H=require("react");function jn(n){return n instanceof Error?n:new Error(String(n))}var Xr=n=>typeof n=="string"?n:String(n);function Kn(n,e){let r=(0,H.useMemo)(()=>he(n),[n]),[t,o]=(0,H.useState)(""),[s,i]=(0,H.useState)(!1),[a,l]=(0,H.useState)(null),u=(0,H.useRef)(e);u.current=e;let p=(0,H.useRef)(0),c=(0,H.useRef)(null),m=(0,H.useRef)(!0);(0,H.useEffect)(()=>(m.current=!0,()=>{m.current=!1,c.current?.cancel(),c.current=null}),[]);let S=(0,H.useCallback)(()=>{p.current++,c.current?.cancel(),c.current=null,m.current&&i(!1)},[]),k=(0,H.useCallback)(async C=>{c.current?.cancel();let h=++p.current,v=()=>m.current&&p.current===h,x=u.current,y=x?.parseChunk??Xr,R=x?.buildPayload??(b=>({prompt:b}));v()&&(o(""),l(null),i(!0));let{parseChunk:g,buildPayload:N,onFinish:M,onError:d,...P}=x??{},w="",A;try{A=r.requestStream(R(C),P),c.current=A}catch(b){let B=jn(b);v()&&(l(B),i(!1),x?.onError?.(B));return}try{for await(let b of A){if(p.current!==h)break;w+=y(b),v()&&o(w)}v()&&(i(!1),x?.onFinish?.(w))}catch(b){let B=jn(b);v()&&(l(B),i(!1),x?.onError?.(B))}finally{c.current===A&&(c.current=null)}},[r]);return{completion:t,complete:k,stop:S,isStreaming:s,error:a}}var q=require("react");function Jn(n){return n instanceof Error?n:new Error(String(n))}var Gr=n=>typeof n=="string"?n:String(n),zn=0;function kn(n){return zn+=1,`${n}-${zn}`}function Xn(n,e){let r=(0,q.useMemo)(()=>he(n),[n]),[t,o]=(0,q.useState)(()=>(e?.initialMessages??[]).map(y=>({id:y.id??kn("msg"),role:y.role,content:y.content}))),[s,i]=(0,q.useState)(""),[a,l]=(0,q.useState)(!1),[u,p]=(0,q.useState)(null),c=(0,q.useRef)(e);c.current=e;let m=(0,q.useRef)(t);m.current=t;let S=(0,q.useRef)(s);S.current=s;let k=(0,q.useRef)(0),C=(0,q.useRef)(null),h=(0,q.useRef)(!0);(0,q.useEffect)(()=>(h.current=!0,()=>{h.current=!1,C.current?.cancel(),C.current=null}),[]);let v=(0,q.useCallback)(()=>{k.current++,C.current?.cancel(),C.current=null,h.current&&l(!1)},[]),x=(0,q.useCallback)(async y=>{let R=y===void 0,g=(R?S.current:y)??"";if(!g.trim())return;C.current?.cancel();let M=++k.current,d=()=>h.current&&k.current===M,P=c.current,w=P?.parseChunk??Gr,A={id:kn("msg"),role:"user",content:g},b={id:kn("msg"),role:"assistant",content:""},B=[...m.current,A].map(T=>({role:T.role,content:T.content})),f=[...m.current,A,b];m.current=f,o(f),R&&i(""),p(null),l(!0);let E=P?.buildPayload??(T=>({messages:T})),{initialMessages:W,parseChunk:L,buildPayload:V,onFinish:K,onError:Ue,...Ve}=P??{},He=T=>{o(D=>D.map($=>$.id===b.id?{...$,content:T}:$))},le="",Re;try{Re=r.requestStream(E(B),Ve),C.current=Re}catch(T){let D=Jn(T);d()&&(p(D),l(!1),P?.onError?.(D));return}try{for await(let T of Re){if(k.current!==M)break;le+=w(T),d()&&He(le)}d()&&(l(!1),P?.onFinish?.({...b,content:le}))}catch(T){let D=Jn(T);d()&&(p(D),l(!1),P?.onError?.(D))}finally{C.current===Re&&(C.current=null)}},[r]);return{messages:t,input:s,setInput:i,sendMessage:x,stop:v,isStreaming:a,error:u}}var O=require("react"),ve=require("@urun-sh/core"),bn=[];function Gn(n,e={}){let{field:r=ve.INPUT_PRESENCE_FIELD,hz:t=ve.INPUT_PRESENCE_DEFAULT_HZ}=e,o=e.documentTarget!==void 0?e.documentTarget:typeof document<"u"?document:null,s=n?.presence??null,i=(0,O.useMemo)(()=>s?(0,ve.createInputPresencePublisher)({awareness:{setLocalStateField:(g,N)=>s.setField(g,N)},field:r,hz:t}):null,[s,r,t]),a=(0,O.useRef)(null);a.current=i;let[l,u]=(0,O.useState)(!1),[p,c]=(0,O.useState)(bn),m=(0,O.useRef)(!1);(0,O.useEffect)(()=>{if(i)return()=>i.dispose()},[i]);let S=(0,O.useCallback)(()=>{let g=a.current;c(g?g.heldKeys():bn)},[]),k=(0,O.useCallback)(()=>{a.current?.clear(),c(bn)},[]);(0,O.useEffect)(()=>{if(!o)return;let g=()=>!!o.pointerLockElement,N=()=>{if(g()){m.current=!1,u(!0);return}m.current||(u(!1),k())},M=b=>{g()&&(a.current?.keyDown(b.key),S())},d=b=>{a.current?.keyUp(b.key),S()},P=b=>{g()&&a.current?.movePointer(b.movementX,b.movementY)},w=b=>{g()&&a.current?.setButtons(b.buttons)},A=()=>{k()};return o.addEventListener("pointerlockchange",N),o.addEventListener("keydown",M),o.addEventListener("keyup",d),o.addEventListener("mousemove",P),o.addEventListener("mousedown",w),o.addEventListener("mouseup",w),o.defaultView?.addEventListener("blur",A),()=>{o.removeEventListener("pointerlockchange",N),o.removeEventListener("keydown",M),o.removeEventListener("keyup",d),o.removeEventListener("mousemove",P),o.removeEventListener("mousedown",w),o.removeEventListener("mouseup",w),o.defaultView?.removeEventListener("blur",A)}},[o,k,S]);let C=(0,O.useCallback)(g=>{g.requestPointerLock?.()},[]),h=(0,O.useCallback)(()=>{m.current=!0,u(!0)},[]),v=(0,O.useCallback)(()=>{m.current=!1,o?.pointerLockElement&&o.exitPointerLock?.(),u(!1),k()},[o,k]),x=(0,O.useCallback)(g=>{a.current?.keyDown(g),S()},[S]),y=(0,O.useCallback)(g=>{a.current?.keyUp(g),S()},[S]),R=(0,O.useCallback)((g,N)=>{a.current?.movePointer(g,N)},[]);return{engage:C,engageTouch:h,release:v,engaged:l,heldKeys:p,pressKey:x,releaseKey:y,movePointer:R}}var Zn=new Map;function Yn(n,e,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${n}"): schema must be a valid Zod schema`);Zn.set(n,{component:e,schema:r})}function Qn(n,e){let r=Zn.get(n);if(!r)return{error:`Unknown component: "${n}"`};let t=r.schema.safeParse(e);return t.success?{Component:r.component,validatedProps:t.data}:{error:`Validation failed for "${n}": ${t.error.message}`}}var ie=require("react/jsx-runtime");function er({name:n,props:e,fallback:r}){let t=Qn(n,e);if(t.error)return console.warn(`[urun] ComponentRenderer: ${t.error}`),r?(0,ie.jsx)(ie.Fragment,{children:r}):(0,ie.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,ie.jsx)("span",{className:"urun-component-error-text",children:t.error})});let o=t.Component;return(0,ie.jsx)(o,{...t.validatedProps})}var ye=require("zod"),ae=require("react/jsx-runtime"),nr=ye.z.object({step:ye.z.number().min(0),total:ye.z.number().min(1),label:ye.z.string().optional(),variant:ye.z.enum(["default","success","error"]).default("default")});function Cn(n){let{step:e,total:r,label:t,variant:o="default"}=n,s=Math.min(e/r*100,100),i=e>=r;return{step:e,total:r,label:t,variant:o,percentage:s,isComplete:i}}function rr(n){let{step:e,total:r,label:t,variant:o,percentage:s}=Cn(n);return(0,ae.jsxs)("div",{className:"urun-progress-card","data-variant":o,children:[t&&(0,ae.jsx)("div",{className:"urun-progress-label",children:t}),(0,ae.jsx)("div",{className:"urun-progress-bar",children:(0,ae.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,ae.jsxs)("div",{className:"urun-progress-text",children:[e,"/",r]})]})}var Ke=require("zod"),Me=require("react/jsx-runtime"),tr=Ke.z.object({state:Ke.z.enum(["thinking","generating","idle","error"]),message:Ke.z.string().optional()}),Zr={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Tn(n){let{state:e,message:r}=n,t=e==="thinking"||e==="generating",o=r??Zr[e]??e;return{state:e,message:o,isActive:t}}function or(n){let{state:e,message:r,isActive:t}=Tn(n);return(0,Me.jsxs)("span",{className:"urun-status-badge","data-state":e,children:[(0,Me.jsx)("span",{className:`urun-status-indicator${t?" urun-status-pulse":""}`}),(0,Me.jsx)("span",{className:"urun-status-message",children:r})]})}var Ne=require("react"),Je=require("zod"),Ie=require("react/jsx-runtime"),sr=Je.z.object({text:Je.z.string(),streaming:Je.z.boolean().default(!1)});function Pn(n){let{text:e,streaming:r=!1}=n,t=e.length===0;return{text:e,streaming:r,isEmpty:t}}function ir(n){let{text:e,streaming:r}=Pn(n),t=(0,Ne.useRef)(null),o=(0,Ne.useRef)(0);return(0,Ne.useEffect)(()=>{let s=t.current;s&&e.length!==o.current&&(s.textContent=e,o.current=e.length)},[e]),(0,Ie.jsxs)("div",{className:"urun-text-stream",children:[(0,Ie.jsx)("span",{ref:t,className:"urun-text-content"}),r&&(0,Ie.jsx)("span",{className:"urun-text-cursor"})]})}var Le=require("zod"),De=require("react/jsx-runtime"),ar=Le.z.object({src:Le.z.string().url(),alt:Le.z.string().optional(),caption:Le.z.string().optional()});function xn(n){let{src:e,alt:r,caption:t}=n;return{src:e,alt:r??"",caption:t}}function ur(n){let{src:e,alt:r,caption:t}=xn(n);return(0,De.jsxs)("figure",{className:"urun-image-frame",children:[(0,De.jsx)("img",{className:"urun-image",src:e,alt:r}),t&&(0,De.jsx)("figcaption",{className:"urun-image-caption",children:t})]})}var Y=require("zod"),ke=require("react/jsx-runtime"),cr=Y.z.object({metrics:Y.z.array(Y.z.object({label:Y.z.string(),value:Y.z.union([Y.z.string(),Y.z.number()]),unit:Y.z.string().optional()}))});function Un(n){return{metrics:n.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function lr(n){let{metrics:e}=Un(n);return(0,ke.jsx)("div",{className:"urun-metrics-panel",children:e.map((r,t)=>(0,ke.jsxs)("div",{className:"urun-metric-card",children:[(0,ke.jsx)("div",{className:"urun-metric-label",children:r.label}),(0,ke.jsx)("div",{className:"urun-metric-value",children:r.displayValue})]},t))})}var I=require("react"),pr=require("@urun-sh/core");var ze=null;function Yr(){if(typeof window>"u")return null;let n=window;return n.AudioContext??n.webkitAudioContext??null}function Oe(){if(ze)return ze;let n=Yr();return n?(ze=new n,ze):null}function qe(){let n=Oe();n&&n.state==="suspended"&&n.resume().catch(()=>{})}var mr=require("react/jsx-runtime"),Qr=1e3,dr=200;function Rn(...n){console.debug("[urun-audio]",...n)}var Xe=(0,I.forwardRef)(function(e,r){let{session:t,stream:o="audio",track:s,controls:i=!1,className:a,onTrack:l,onUnlockChange:u,onAudioElement:p}=e,c=(0,I.useRef)(null),m=(0,I.useRef)(null),S=(0,I.useRef)(null),k=(0,I.useRef)(null),C=(0,I.useRef)(l);C.current=l;let h=(0,I.useRef)(u);h.current=u;let v=(0,I.useCallback)(d=>{S.current!==d&&(S.current=d,h.current?.(d))},[]),x=(0,I.useCallback)(()=>{if(typeof MediaStream>"u")return null;m.current||(m.current=new MediaStream);let d=c.current;return d&&d.srcObject!==m.current&&(d.srcObject=m.current),m.current},[]),y=(0,I.useCallback)(d=>{let P=c.current;if(!P)return;let w=P.play();!w||typeof w.then!="function"||w.then(()=>{P.muted||v(!0)}).catch(A=>{let b=A instanceof Error?A.name:String(A);if(b==="AbortError"){Rn(`play() aborted (${d}); retrying in ${dr}ms`),k.current&&clearTimeout(k.current),k.current=setTimeout(()=>{k.current=null,y(`${d}:retry`)},dr);return}if(b==="NotAllowedError"){Rn(`play() blocked pending a user gesture (${d})`),v(!1);return}Rn(`play() failed (${d})`,A)})},[v]),R=(0,I.useCallback)(d=>{let P=x();if(P){for(let w of P.getAudioTracks())w!==d&&P.removeTrack(w);d&&!P.getAudioTracks().includes(d)&&P.addTrack(d),d&&y("track-attach"),C.current?.(d)}},[x,y]),g=(0,I.useCallback)(()=>{let d=c.current;d&&(x(),d.muted=!1,y("gesture"),qe(),v(!0))},[x,y,v]);(0,I.useImperativeHandle)(r,()=>({unlock:g,get unlocked(){return S.current===!0},get element(){return c.current}}),[g]);let N=(0,I.useCallback)(d=>{c.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),x()),p?.(d)},[x,p]),M=s!==void 0;return(0,I.useEffect)(()=>{if(M){R(s??null);return}if(!t)return;let d=t.stream(o),P=()=>{let f=m.current;return f?f.getAudioTracks()[0]??null:null},w=f=>{if(f!==P()&&(R(f),f)){let E=()=>{P()===f&&R(null)};f.addEventListener("ended",E)}},A=d.track;A&&A.readyState==="live"&&w(A);let b=d.on("track",f=>{f&&f.readyState!=="live"||w(f)}),B=setInterval(()=>{let f=d.track;f&&f.readyState==="live"&&w(f)},Qr);return()=>{b(),clearInterval(B)}},[t,o,M,s,R]),(0,I.useEffect)(()=>(0,pr.observePageLifecycle)(()=>{qe(),S.current===!0&&y("foreground")}),[y]),(0,I.useEffect)(()=>()=>{k.current&&clearTimeout(k.current)},[]),(0,mr.jsx)("audio",{ref:N,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})});var _=require("react"),be=require("@urun-sh/core");var gr=require("react/jsx-runtime"),wn={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Ge(...n){console.debug("[urun-voice]",...n)}var fr=(0,_.forwardRef)(function(e,r){let{session:t,stream:o="audio",constraints:s=wn,connectTimeoutMs:i,attempts:a=3,retryDelayMs:l=1500,onActiveChange:u,onError:p,onMicStream:c,onTrack:m,onUnlockChange:S,capture:k}=e,C=(0,_.useRef)(null),h=(0,_.useRef)(null),v=(0,_.useRef)(null),x=(0,_.useRef)([]),y=(0,_.useRef)(!1),R=(0,_.useRef)(u);R.current=u;let g=(0,_.useRef)(p);g.current=p;let N=(0,_.useRef)(c);N.current=c;let M=(0,_.useCallback)(f=>{y.current!==f&&(y.current=f,R.current?.(f))},[]),d=(0,_.useCallback)(()=>{for(let f of x.current)f();x.current=[],v.current?.release(),v.current=null,h.current&&(h.current=null,N.current?.(null))},[]),P=(0,_.useCallback)(async()=>{let f=v.current;if(f){let V=await f.update(s);return h.current=f.stream,N.current?.(f.stream),V}let W=await(k??(0,be.sharedCaptureController)()).claim("audio",s);v.current=W,x.current=[W.onTrack((V,K)=>{h.current=K,N.current?.(K),y.current&&t.stream(o).attach(V).catch(Ue=>Ge("mic re-attach after one-capture re-acquire failed",Ue))}),W.onLost(V=>{v.current=null,x.current=[],h.current=null,N.current?.(null),M(!1),g.current?.(V)})],h.current=W.stream,N.current?.(W.stream);let L=W.track;if(!L)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return L},[k,s,t,o,M]),w=(0,_.useCallback)(async()=>{d(),M(!1),await t.stream(o).detach().catch(()=>{})},[t,o,d,M]),A=(0,_.useCallback)(async()=>{C.current?.unlock();let f;try{f=await P()}catch(L){d();let V=(0,be.sessionFailureFromMediaError)(L,t.status);throw g.current?.(V),V}t.connect?.();let E;for(let L=1;L<=a;L++)try{await t.whenLive(i!==void 0?{timeout:i}:void 0),await t.stream(o).attach(f),M(!0);return}catch(V){E=V,Ge(`start attempt ${L}/${a} failed`,V),L<a&&await new Promise(K=>setTimeout(K,l))}d(),M(!1);let W=E instanceof Error?E:new Error(String(E??"voice start failed"));throw g.current?.(W),W},[t,o,i,a,l,P,d,M]);(0,_.useImperativeHandle)(r,()=>({start:A,stop:w,unlock:()=>C.current?.unlock(),get active(){return y.current},get micStream(){return h.current},get audio(){return C.current}}),[A,w]);let b=(0,_.useRef)(!1),B=(0,_.useCallback)(async()=>{if(!y.current||b.current)return;let f=h.current?.getAudioTracks()[0]??null;if(f&&f.readyState==="live"){try{await t.stream(o).attach(f)}catch(E){Ge("foreground mic re-assert failed (will retry on next pass)",E)}return}b.current=!0;try{let E=await P();await t.stream(o).attach(E)}catch(E){let W=E instanceof Error?E:new Error(String(E));Ge("foreground mic re-acquire failed",W),g.current?.(W)}finally{b.current=!1}},[t,o,P]);return(0,_.useEffect)(()=>{let f=()=>{B()};return typeof t.onRecovery=="function"?t.onRecovery(f):(0,be.observePageLifecycle)(f)},[t,B]),(0,_.useEffect)(()=>d,[d]),(0,gr.jsx)(Xe,{ref:C,session:t,stream:o,onTrack:m,onUnlockChange:S})});var Ze=require("@urun-sh/core"),U=require("react"),Ye=require("react/jsx-runtime"),An={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function En(...n){console.debug("[urun-camera]",...n)}var Sr=(0,U.forwardRef)(function(e,r){let{session:t,stream:o="video",constraints:s,facingMode:i="environment",mirror:a="auto",connectTimeoutMs:l,preview:u=!0,className:p,videoClassName:c,onActiveChange:m,onError:S,onStream:k,onTrack:C,children:h,capture:v}=e,x=(0,U.useRef)(null),y=(0,U.useRef)(null),R=(0,U.useRef)(null),g=(0,U.useRef)([]),N=(0,U.useRef)(null),M=(0,U.useRef)(!1),d=(0,U.useRef)(i),[P,w]=(0,U.useState)(i),A=(0,U.useRef)(m);A.current=m;let b=(0,U.useRef)(S);b.current=S;let B=(0,U.useRef)(k);B.current=k;let f=(0,U.useRef)(C);f.current=C;let E=(0,U.useCallback)(T=>{M.current!==T&&(M.current=T,A.current?.(T))},[]),W=(0,U.useCallback)(T=>{let D=x.current;D&&(D.muted=!0,D.srcObject=T,T&&D.play()?.catch?.($=>En("preview play() failed",$)))},[]),L=(0,U.useCallback)(()=>{N.current?.(),N.current=null;for(let T of g.current)T();g.current=[],R.current?.release(),R.current=null,y.current&&(y.current=null,B.current?.(null),f.current?.(null)),W(null)},[W]),V=(0,U.useCallback)((T,D)=>{N.current?.(),y.current=D,W(D),B.current?.(D);let $=()=>{y.current===D&&(En("camera track ended (device removed or permission revoked)"),L(),E(!1))};T.addEventListener("ended",$),N.current=()=>T.removeEventListener("ended",$)},[W,L,E]),K=(0,U.useCallback)(async T=>{let D={...An,...s,facingMode:T},$;try{let ne=R.current;if(ne)$=await ne.update(D);else{let we=await(v??(0,Ze.sharedCaptureController)()).claim("video",D);if(R.current=we,g.current=[we.onTrack((Ee,qr)=>{V(Ee,qr),M.current&&t.stream(o).attachVideo(Ee).then(()=>f.current?.(Ee)).catch(Wr=>En("camera re-publish after one-capture re-acquire failed",Wr))}),we.onLost(Ee=>{R.current=null,g.current=[],L(),E(!1),b.current?.(Ee)})],!we.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});$=we.track}}catch(ne){let de=(0,Ze.sessionFailureFromMediaError)(ne,t.status);throw b.current?.(de),de}d.current=T,w(T),V($,R.current?.stream??new MediaStream([$]));try{t.connect?.(),await t.whenLive(l!==void 0?{timeout:l}:void 0),await t.stream(o).attachVideo($)}catch(ne){L(),E(!1);let de=ne instanceof Error?ne:new Error(String(ne));throw b.current?.(de),de}f.current?.($),E(!0)},[t,o,s,l,v,V,L,E]),Ue=(0,U.useCallback)(T=>K(T?.facingMode??d.current),[K]),Ve=(0,U.useCallback)(async T=>{M.current&&d.current===T||await K(T)},[K]),He=(0,U.useCallback)(()=>K(d.current==="environment"?"user":"environment"),[K]),le=(0,U.useCallback)(async()=>{L(),E(!1),await t.stream(o).detachVideo().catch(()=>{})},[t,o,L,E]);return(0,U.useImperativeHandle)(r,()=>({start:Ue,stop:le,flip:He,setFacingMode:Ve,get active(){return M.current},get facingMode(){return d.current},get stream(){return y.current},get element(){return x.current}}),[Ue,le,He,Ve]),(0,U.useEffect)(()=>L,[L]),u?(0,Ye.jsxs)("div",{className:p,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":P,children:[(0,Ye.jsx)("video",{ref:x,className:c,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...(a==="auto"?P==="user":a)?{transform:"scaleX(-1)"}:{}}}),h]}):null});var Qe=require("react");var _n={level:0,speaking:!1};function hr(n,e={}){let{fftSize:r=512,intervalMs:t=100,speakingThreshold:o=.02}=e,[s,i]=(0,Qe.useState)(_n);return(0,Qe.useEffect)(()=>{if(!n){i(_n);return}let a=Oe();if(!a||typeof MediaStream>"u")return;let l;n instanceof MediaStream?l=n:(l=new MediaStream,l.addTrack(n));let u,p;try{u=a.createMediaStreamSource(l),p=a.createAnalyser(),p.fftSize=r,u.connect(p)}catch{return}let c=new Uint8Array(p.fftSize),S=setInterval(()=>{p.getByteTimeDomainData(c);let k=0;for(let h=0;h<c.length;h++){let v=(c[h]-128)/128;k+=v*v}let C=Math.sqrt(k/c.length);i(h=>{let v=C>o;return Math.abs(h.level-C)<.005&&h.speaking===v?h:{level:C,speaking:v}})},t);return()=>{clearInterval(S),u.disconnect(),i(_n)}},[n,r,t,o]),s}var en=require("react");function vr(n,e){let[r,t]=(0,en.useState)(null);return(0,en.useEffect)(()=>{if(!n||!e){t(null);return}let o=n.stream(e);return t(o.track),o.on("track",t)},[n,e]),r}var br=require("react");var rn=require("react");var yr=require("zustand/vanilla"),kr=require("zustand"),et=()=>{};function nn(n,e={}){let r=u=>{n?.set(u)},t=()=>n?n.get()??{}:{},o=(0,yr.createStore)(()=>({doc:t(),synced:n?n.synced:!1,set:r})),s=null,i=()=>{if(s){for(let u of s)u();s=null}},a=()=>n?(s||(o.setState({doc:t(),synced:n.synced}),s=[n.on("change",u=>o.setState({doc:u})),n.onSynced(()=>o.setState({synced:!0}))]),i):et,l=(u=>(0,kr.useStore)(o,u));return Object.assign(l,{getState:o.getState,getInitialState:o.getInitialState,subscribe:o.subscribe,set:r,bind:a,unbind:i}),e.bind!==!1&&a(),l}function Ce(n,e){let r=(0,rn.useMemo)(()=>nn(n&&e?n.doc(e):null,{bind:!1}),[n,e]);return(0,rn.useEffect)(()=>r.bind(),[r]),r}function Cr(n,e,r){let o=Ce(n,e)(r??(a=>a)),s=(0,br.useCallback)(a=>{n&&e&&n.doc(e).set(a)},[n,e]);if(r)return o;let i=o;return{snapshot:n&&e?i.doc:null,synced:i.synced,set:s}}var on=require("react");var re=200;function Q(n,e,r=200){let t=[...n,e];return t.length>r?t.slice(t.length-r):t}function Te(n){if(typeof n=="string")return n;try{return JSON.stringify(n)}catch{return String(n)}}function tn(n){let e=n.trim();if(!e)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(e)}catch(t){return{ok:!1,error:t instanceof Error?t.message:"Invalid JSON."}}return r===null||typeof r!="object"||Array.isArray(r)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:r}}function sn(n,e,r={}){let t=r.cap??200,[o,s]=(0,on.useState)([]);return(0,on.useEffect)(()=>{if(s([]),!n||!e)return;let i=!0,a=n.stream(e).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let l=await a.next();if(!i||l.done)break;s(u=>Q(u,{at:Date.now(),payload:l.value},t))}})(),()=>{i=!1,a.return?.()}},[n,e,t]),o}var X=require("react/jsx-runtime");function Tr({session:n,name:e,cap:r,className:t}){let o=sn(n,e,{cap:r});return(0,X.jsxs)("div",{className:["urun-stream-tail",t].filter(Boolean).join(" "),children:[(0,X.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,X.jsx)("code",{children:e}),(0,X.jsxs)("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),(0,X.jsx)("div",{className:"urun-stream-tail-log",children:o.length===0?(0,X.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,X.jsx)("code",{children:e})," messages\u2026"]}):o.map((s,i)=>(0,X.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,X.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",Te(s.payload)]},`${s.at}-${i}`))})]})}var We=require("react");var j=require("react/jsx-runtime");function Fe({placeholder:n,buttonLabel:e,disabled:r,onApply:t}){let[o,s]=(0,We.useState)(""),[i,a]=(0,We.useState)(null),l=(0,We.useCallback)(()=>{let u=tn(o);if(!u.ok){a(u.error);return}a(null),t(u.value,o.trim()),s("")},[o,t]);return(0,j.jsxs)("div",{className:"urun-doc-patch",children:[(0,j.jsx)("textarea",{className:"urun-doc-patch-input",value:o,onChange:u=>s(u.target.value),placeholder:n,rows:3}),(0,j.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,j.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!o.trim(),onClick:l,children:e}),i?(0,j.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Pr({session:n,docKey:e,editable:r=!0,patchPlaceholder:t='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=Ce(n,e),i=s(u=>u.doc),a=s(u=>u.synced),l=s(u=>u.set);return(0,j.jsxs)("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[(0,j.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,j.jsx)("code",{children:e}),(0,j.jsx)("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),(0,j.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?(0,j.jsx)(Fe,{placeholder:t,buttonLabel:"Apply patch",disabled:!n,onApply:u=>l(u)}):null]})}var an=require("react");var ee=require("react/jsx-runtime");function xr(n,e=600){return n.length>e?`${n.slice(0,e)}\u2026`:n}function Ur({session:n,docKey:e="control",cap:r=200,className:t}){let[o,s]=(0,an.useState)([]);return(0,an.useEffect)(()=>(s([]),n?n.doc(e).on("change",a=>{s(l=>Q(l,{at:Date.now(),direction:"in",text:xr(Te(a))},r))}):void 0),[n,e,r]),(0,ee.jsxs)("div",{className:["urun-control-sender",t].filter(Boolean).join(" "),children:[(0,ee.jsx)(Fe,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${e}`,disabled:!n,onApply:(i,a)=>{n?.doc(e).set(i),s(l=>Q(l,{at:Date.now(),direction:"out",text:xr(a)},r))}}),(0,ee.jsx)("div",{className:"urun-control-sender-log",children:o.length===0?(0,ee.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((i,a)=>(0,ee.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,ee.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,ee.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}var un=require("react");var ue=require("react/jsx-runtime");function Rr({session:n,trackNames:e=["video","audio"],docKeys:r=["control"],cap:t=200,className:o}){let[s,i]=(0,un.useState)([]),a=e.join(","),l=r.join(",");return(0,un.useEffect)(()=>{if(i([]),!n)return;let u=(c,m)=>i(S=>Q(S,{at:Date.now(),kind:c,text:m},t)),p=[];p.push(n.onPhase(c=>u("phase",`phase \u2192 ${c.name}`)));for(let c of e){let m=n.stream(c);p.push(m.on("track",S=>u("track",`${c}: ${S?"track arrived":"track ended"}`)))}for(let c of r){let m=n.doc(c);p.push(m.on("change",()=>u("doc",`${c} changed`)))}return()=>p.forEach(c=>c())},[n,a,l,t]),(0,ue.jsx)("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:s.length===0?(0,ue.jsx)("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((u,p)=>(0,ue.jsxs)("div",{className:"urun-event-spine-line","data-kind":u.kind,children:[(0,ue.jsx)("span",{className:"urun-event-spine-kind",children:u.kind})," ",(0,ue.jsx)("span",{className:"urun-event-spine-time",children:new Date(u.at).toLocaleTimeString()})," ",u.text]},`${u.at}-${p}`))})}var pn=require("@urun-sh/core");var cn=require("react");function z(n){let[e,r]=(0,cn.useState)(n?.phase??null);return(0,cn.useEffect)(()=>{if(!n){r(null);return}return n.onPhase(r)},[n]),e}var Er=require("@urun-sh/core");var Pe=require("react"),wr=require("@urun-sh/core");function ln(n){let e=z(n),r=(0,wr.isWakingPhase)(e?.name),t=(0,Pe.useRef)(void 0);r?t.current??=Date.now():t.current=void 0;let o=r?e?.wakingSince??t.current:void 0,s=()=>o!==void 0?Math.max(0,Math.floor((Date.now()-o)/1e3)):0,[i,a]=(0,Pe.useState)(s);return(0,Pe.useEffect)(()=>{if(o===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-o)/1e3)));let l=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-o)/1e3)))},1e3);return()=>clearInterval(l)},[o]),{waking:r,phase:e,state:r?e?.runtime?.state:void 0,reason:r?e?.runtime?.reason:void 0,since:o,seconds:r?i:0}}var te=require("react/jsx-runtime");function dn({session:n,render:e,className:r}){let t=ln(n);return!t.waking||!t.phase?null:(0,te.jsx)("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":t.phase.name,"data-runtime-state":t.state,children:e?e(t):(0,te.jsxs)(te.Fragment,{children:[(0,te.jsx)("span",{className:"urun-session-waking-label",children:(0,Er.describeSessionPhase)(t.phase)})," ",(0,te.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",t.seconds,"s)"]})]})})}var G=require("react/jsx-runtime"),nt={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function Ar({session:n,className:e}){let r=z(n),t=r?.name??"idle",o=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime?.reason??null;return(0,G.jsxs)("span",{className:["urun-session-status",e].filter(Boolean).join(" "),"data-phase":t,children:[(0,G.jsx)("span",{className:"urun-session-status-dot","data-phase":t}),(0,G.jsx)("span",{className:"urun-session-status-label",children:nt[t]}),o?(0,G.jsx)("span",{className:"urun-session-status-detail",children:o}):null]})}function _r({session:n,children:e,fallback:r,onStartOver:t,className:o}){let s=z(n);if(s?.name==="live")return(0,G.jsx)("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:e});let i=r?r(s):(0,G.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,pn.isWakingPhase)(s.name)?(0,G.jsx)(dn,{session:n}):s&&s.name!=="idle"?(0,pn.describeSessionPhase)(s):"Waiting for a live session\u2026"}),a=t!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,G.jsxs)("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:[i,a?(0,G.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:t,children:"Start over"}):null]})}var mn=require("react");var Nr=require("react/jsx-runtime");function Mn(n){return z(n)?.endsAt??null}function rt(n){let e=Math.max(0,Math.floor(n/1e3)),r=Math.floor(e/60),t=e%60;return`${String(r).padStart(2,"0")}:${String(t).padStart(2,"0")}`}function Mr({session:n,urgentMs:e=6e4,className:r}){let o=Mn(n)?.getTime()??null,[s,i]=(0,mn.useState)(()=>o===null?null:Math.max(0,o-Date.now()));if((0,mn.useEffect)(()=>{if(o===null){i(null);return}let l=()=>i(Math.max(0,o-Date.now()));l();let u=setInterval(l,1e3);return()=>clearInterval(u)},[o]),s===null)return null;let a=rt(s);return(0,Nr.jsx)("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<e?"":void 0,"data-expired":s<=0?"":void 0,children:a})}var Be=require("react/jsx-runtime"),tt=new Set(["expired","ended","error"]);function Ir({session:n,onNewSession:e,children:r,className:t}){let o=z(n);if(!o||!tt.has(o.name))return null;let s=r?r(o):(0,Be.jsx)("span",{className:"urun-session-ended-copy",children:o.name==="expired"?"Session ended \u2014 start a new session":o.name==="error"?`Session failed${o.error?.reason?` \u2014 ${o.error.reason}`:""}.`:"Session ended."});return(0,Be.jsxs)("div",{className:["urun-session-ended",t].filter(Boolean).join(" "),"data-phase":o.name,children:[s,e?(0,Be.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:e,children:"New session"}):null]})}var oe=require("react"),ce=require("react/jsx-runtime");function Nn(n){if(!n||typeof n!="object"||Array.isArray(n))return null;let e=n;return e.warning!==!0?null:{warning:!0,deadlineEpochS:typeof e.deadline_epoch_s=="number"?e.deadline_epoch_s:null,idleSinceEpochS:typeof e.idle_since_epoch_s=="number"?e.idle_since_epoch_s:null}}function In(n){let e=(0,oe.useMemo)(()=>n?n.doc("control"):null,[n]),[r,t]=(0,oe.useState)(()=>e?Nn(e.get("idle")):null);return(0,oe.useEffect)(()=>{if(!e){t(null);return}return t(Nn(e.get("idle"))),e.on("change",()=>t(Nn(e.get("idle"))))},[e]),r}function ot(n){let e=Math.max(0,Math.floor(n));return`${Math.floor(e/60)}:${String(e%60).padStart(2,"0")}`}function Lr({session:n,onStillHere:e,className:r}){let t=In(n),o=t?.deadlineEpochS??null,[s,i]=(0,oe.useState)(null);if((0,oe.useEffect)(()=>{if(o===null){i(null);return}let l=()=>i(Math.max(0,o-Date.now()/1e3));l();let u=setInterval(l,1e3);return()=>clearInterval(u)},[o]),!t||!n)return null;let a=()=>{n.touch?.(),e?.()};return(0,ce.jsx)("div",{className:["urun-idle-warning",r].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:(0,ce.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,ce.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,ce.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${ot(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,ce.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}var xe=require("react"),Dr=require("@urun-sh/core");function Or(n){let e=(0,xe.useContext)(me),[r,t]=(0,xe.useState)(null),o=n.app??e?.appId,s=n.function,i=n.intervalS??60,a=e?.baseUrl,l=e?.orgId,u=e?.jwt,p=e?.getAccessToken,c=e?.authProvider;return(0,xe.useEffect)(()=>{if(!a||!l||!o||!s)return;let m=!1,S=()=>{(0,Dr.prewake)({baseUrl:a,app:o,functionName:s,orgId:l,jwt:u,getAccessToken:p,authProvider:c}).then(C=>{m||t(C)}).catch(()=>{})};S();let k=setInterval(S,Math.max(1,i)*1e3);return()=>{m=!0,clearInterval(k)}},[o,s,i,a,l,u,p,c]),r}var fn=require("@urun-sh/core");0&&(module.exports={ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,ProgressCard,ProgressCardSchema,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunIdleWarning,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,registerComponent,resumeUrunAudioContext,urunPublicEnv,useApp,useChat,useCompletion,useDocStore,useImageFrame,useInputPresence,useMetricsPanel,useProgressCard,useRequest,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
|
|
2
|
+
"use strict";var Cn=Object.defineProperty;var Qt=Object.getOwnPropertyDescriptor;var er=Object.getOwnPropertyNames;var nr=Object.prototype.hasOwnProperty;var tr=(n,e)=>{for(var t in e)Cn(n,t,{get:e[t],enumerable:!0})},rr=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of er(e))!nr.call(n,o)&&o!==t&&Cn(n,o,{get:()=>e[o],enumerable:!(r=Qt(e,o))||r.enumerable});return n};var or=n=>rr(Cn({},"__esModule",{value:!0}),n);var kr={};tr(kr,{ComponentRenderer:()=>lt,DEFAULT_CAMERA_CONSTRAINTS:()=>On,DEFAULT_LOG_CAP:()=>ue,DEFAULT_VOICE_CONSTRAINTS:()=>Dn,DocPatchForm:()=>Ke,ImageFrame:()=>vt,ImageFrameSchema:()=>St,MetricsPanel:()=>kt,MetricsPanelSchema:()=>yt,ProgressCard:()=>pt,ProgressCardSchema:()=>dt,StatusBadge:()=>ft,StatusBadgeSchema:()=>mt,TextStream:()=>ht,TextStreamSchema:()=>gt,UrunAudio:()=>nn,UrunAuthProvider:()=>Pn,UrunCamera:()=>Ut,UrunControlSender:()=>Lt,UrunDocPanel:()=>It,UrunErrorBoundary:()=>ke,UrunEventSpine:()=>Ot,UrunIdleWarning:()=>jt,UrunJwtProvider:()=>Xn,UrunProvider:()=>Zn,UrunSessionClock:()=>Vt,UrunSessionEnded:()=>$t,UrunSessionGate:()=>Bt,UrunSessionStatus:()=>Ft,UrunSessionWaking:()=>hn,UrunStreamTail:()=>Nt,UrunVoice:()=>Tt,authMode:()=>Oe,createDocStore:()=>an,describeSessionPhase:()=>yn.describeSessionPhase,formatPayload:()=>Me,getUrunAudioContext:()=>He,isWakingPhase:()=>yn.isWakingPhase,parseJsonObject:()=>cn,pushCapped:()=>oe,registerComponent:()=>ut,resumeUrunAudioContext:()=>$e,urunPublicEnv:()=>te,useApp:()=>Qn,useChat:()=>st,useCompletion:()=>tt,useDocStore:()=>Ae,useImageFrame:()=>_n,useInputPresence:()=>it,useMetricsPanel:()=>Nn,useProgressCard:()=>En,useRequest:()=>et,useSessionDoc:()=>_t,useSessionEndsAt:()=>Wn,useSessionIdle:()=>Bn,useSessionPhase:()=>G,useSessionTrack:()=>wt,useSessionWake:()=>gn,useStatusBadge:()=>An,useStreamMessages:()=>dn,useTextStream:()=>Mn,useUrunAudioLevel:()=>Rt,useUrunAuth:()=>Ge,useUrunPrewake:()=>Jt,usesWorkOSAuth:()=>Jn});module.exports=or(kr);var Pe=require("react");var jn=require("react"),Le=require("react/jsx-runtime"),ke=class extends jn.Component{constructor(e){super(e),this.state={error:null}}static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,t){console.error("[urun] Error caught by UrunErrorBoundary:",e,t)}render(){if(this.state.error){let{fallback:e}=this.props;return typeof e=="function"?e(this.state.error):e||(0,Le.jsxs)("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[(0,Le.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,Le.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var Kn=require("react"),be=(0,Kn.createContext)(null);function pe(n){return n&&n.trim()?n.trim():void 0}function te(n){switch(n){case"NEXT_PUBLIC_AUTH_MODE":return pe(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return pe(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return pe(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return pe(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return pe(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return pe(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return pe(typeof process<"u"?process.env?.[n]:void 0)}}function Oe(){let n=te("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return n==="jwt"||n==="customer-jwt"||n==="test-jwt"?"jwt":n==="workos"||te("VERCEL_ENV")==="production"?"workos":te("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Jn(){return Oe()==="workos"}var Ce=require("react"),Gn=require("react/jsx-runtime"),zn=(0,Ce.createContext)(null);function Pn({getAccessToken:n,children:e}){let t=(0,Ce.useMemo)(()=>({getAccessToken:n}),[n]);return(0,Gn.jsx)(zn.Provider,{value:t,children:e})}var Xn=Pn;function Ge(){return(0,Ce.useContext)(zn)}var Ze=require("react/jsx-runtime");function Zn({baseUrl:n,orgId:e,appId:t,jwt:r,authProvider:o,fallback:s,children:i}){let[a,l]=(0,Pe.useState)(),u=Ge(),p=te("NEXT_PUBLIC_SESSION_TOKEN")??te("NEXT_PUBLIC_URUN_JWT"),c=Oe(),m=c==="workos"&&!r,h=r??(c==="jwt"?p:void 0)??a,k=o??te("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),P=m&&!h,S=(0,Pe.useMemo)(()=>({appId:t,baseUrl:n,orgId:e,jwt:h,getAccessToken:m?u?.getAccessToken:void 0,authProvider:k}),[t,u,n,k,h,e,m]);return(0,Pe.useEffect)(()=>{if(!m||!u)return;let v=!1,U=u;async function b(){try{let g=await U.getAccessToken();v||l(g??void 0)}catch{v||l(void 0)}}b();let w=window.setInterval(()=>{b()},6e4);return()=>{v=!0,window.clearInterval(w)}},[u,m]),(0,Ze.jsx)(ke,{fallback:s,children:P?(0,Ze.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,Ze.jsx)(be.Provider,{value:S,children:i})})}var X=require("react"),Yn=require("@urun-sh/core");function sr(n,e){return`${n}:${JSON.stringify(e??{})}`}function ir(n,e,t){return JSON.stringify({appId:n.appId,baseUrl:n.baseUrl,orgId:n.orgId,jwt:n.jwt,authProvider:n.authProvider,fnName:e,args:t??{}})}var Te=new Map;var Tn=class{constructor(e,t){this._doc=e;this._notify=t;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(e,t){return this._doc.get(e,t)}set(e){this._doc.set(e),this._notify()}on(e,t){return this._doc.on(e,r=>t(r))}get synced(){return this._doc.synced}onSynced(e){return this._doc.onSynced(()=>{e(),this._notify()})}text(e){let t=this._doc.text(e),r=this._notify;return{append(o){t.append(o),r()},toString:()=>t.toString(),get length(){return t.length},on:(o,s)=>t.on(o,i=>{s(i),r()})}}dispose(){this._unsubscribeChange()}},xn=class{constructor(e,t){this._stream=e;this._notify=t;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(e){return this._stream.attach(e)}attachVideo(e){return this._stream.attachVideo(e)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(e){return this._stream.seek(e)}chunks(e){return this._stream.chunks(e)}onSeeked(e){return this._stream.onSeeked(e)}on(e,t){return this._stream.on(e,t)}messages(){return this._stream.messages()}emit(e,t){return this._stream.emit(e,t)}dispose(){this._unsubscribeTrack()}},Un=class{constructor(e,t){this._session=e;this._notifiers.add(t),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll())}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}addNotifier(e){this._notifiers.add(e)}removeNotifier(e){this._notifiers.delete(e)}_notifyAll(){for(let e of this._notifiers)e()}get id(){return this._session.id}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(e){return this._session.onPhase(e)}whenLive(e){return this._session.whenLive(e)}recover(){this._session.recover()}onRecovery(e){return this._session.onRecovery(e)}request(e,t){return this._session.request(e,t)}requestStream(e,t){return this._session.requestStream(e,t)}complete(e,t){return this._session.complete(e,t)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(e){let t=this._docs.get(e);return t||(t=new Tn(this._session.doc(e),()=>this._notifyAll()),this._docs.set(e,t)),t}stream(e){let t=this._streams.get(e);return t||(t=new xn(this._session.stream(e),()=>this._notifyAll()),this._streams.set(e,t)),t}disconnect(){this._disposed=!0;for(let e of this._docs.values())e.dispose();for(let e of this._streams.values())e.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._session.disconnect(),this._notifyAll(),this._notifiers.clear()}};function Qn(){let n=(0,X.useContext)(be);if(!n)throw new Error("useApp must be used within <UrunProvider>");if(!n.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,e]=(0,X.useReducer)(s=>s+1,0),t=(0,X.useRef)(new Map),r=(0,X.useRef)(new Map),o=(0,X.useMemo)(()=>(0,Yn.App)(n.appId,{baseUrl:n.baseUrl,orgId:n.orgId,jwt:n.jwt,getAccessToken:n.getAccessToken,authProvider:n.authProvider}),[n.appId,n.baseUrl,n.orgId,n.jwt,n.getAccessToken,n.authProvider]);return(0,X.useEffect)(()=>()=>{for(let[s,i]of r.current){let a=Te.get(s);a===i&&(a.handle.removeNotifier(e),a.refCount=Math.max(0,a.refCount-1),a.refCount===0&&(a.disposeTimer=setTimeout(()=>{let l=Te.get(s);!l||l.refCount!==0||(Te.delete(s),l.handle.disconnect())},0)))}r.current.clear(),t.current.clear()},[]),(0,X.useMemo)(()=>new Proxy({},{get(s,i){if(typeof i=="string")return a=>{let l=sr(i,a),u=t.current.get(l);if(u&&!u.disposed)return u;let p=ir(n,i,a),c=Te.get(p);return c?.handle.disposed&&(c.disposeTimer&&clearTimeout(c.disposeTimer),Te.delete(p),r.current.get(p)===c&&r.current.delete(p),c=void 0),c?c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null):(c={handle:new Un(o[i](a),e),refCount:0,disposeTimer:null},Te.set(p,c)),r.current.get(p)!==c&&(r.current.set(p,c),c.handle.addNotifier(e),c.refCount+=1),t.current.set(l,c.handle),c.handle}}}),[n,o])}var W=require("react");function xe(n){let e=n;if(!e||typeof e.request!="function"||typeof e.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return e}function ar(n){return n instanceof Error?n:new Error(String(n))}function et(n,e){let t=(0,W.useMemo)(()=>xe(n),[n]),[r,o]=(0,W.useState)(void 0),[s,i]=(0,W.useState)(null),[a,l]=(0,W.useState)(!1),u=(0,W.useRef)(e);u.current=e;let p=(0,W.useRef)(0),c=(0,W.useRef)(null),m=(0,W.useRef)(!0);(0,W.useEffect)(()=>(m.current=!0,()=>{m.current=!1,c.current?.abort()}),[]);let h=(0,W.useCallback)(async S=>{c.current?.abort();let v=new AbortController;c.current=v;let U=++p.current,b=()=>m.current&&p.current===U;b()&&(l(!0),i(null));try{let w=await t.request(S,{...u.current,signal:v.signal});return b()&&(o(w),l(!1),u.current?.onSuccess?.(w)),w}catch(w){let g=ar(w);throw b()&&(i(g),l(!1),u.current?.onError?.(g)),g}},[t]),k=(0,W.useCallback)(S=>{h(S).catch(()=>{})},[h]),P=(0,W.useCallback)(()=>{p.current++,c.current?.abort(),c.current=null,o(void 0),i(null),l(!1)},[]);return{mutate:k,mutateAsync:h,data:r,error:s,isPending:a,reset:P}}var B=require("react");function nt(n){return n instanceof Error?n:new Error(String(n))}var ur=n=>typeof n=="string"?n:String(n);function tt(n,e){let t=(0,B.useMemo)(()=>xe(n),[n]),[r,o]=(0,B.useState)(""),[s,i]=(0,B.useState)(!1),[a,l]=(0,B.useState)(null),u=(0,B.useRef)(e);u.current=e;let p=(0,B.useRef)(0),c=(0,B.useRef)(null),m=(0,B.useRef)(!0);(0,B.useEffect)(()=>(m.current=!0,()=>{m.current=!1,c.current?.cancel(),c.current=null}),[]);let h=(0,B.useCallback)(()=>{p.current++,c.current?.cancel(),c.current=null,m.current&&i(!1)},[]),k=(0,B.useCallback)(async P=>{c.current?.cancel();let S=++p.current,v=()=>m.current&&p.current===S,U=u.current,b=U?.parseChunk??ur,w=U?.buildPayload??(T=>({prompt:T}));v()&&(o(""),l(null),i(!0));let{parseChunk:g,buildPayload:_,onFinish:A,onError:d,...C}=U??{},x="",R;try{R=t.requestStream(w(P),C),c.current=R}catch(T){let j=nt(T);v()&&(l(j),i(!1),U?.onError?.(j));return}try{for await(let T of R){if(p.current!==S)break;x+=b(T),v()&&o(x)}v()&&(i(!1),U?.onFinish?.(x))}catch(T){let j=nt(T);v()&&(l(j),i(!1),U?.onError?.(j))}finally{c.current===R&&(c.current=null)}},[t]);return{completion:r,complete:k,stop:h,isStreaming:s,error:a}}var O=require("react");function rt(n){return n instanceof Error?n:new Error(String(n))}var cr=n=>typeof n=="string"?n:String(n),ot=0;function Rn(n){return ot+=1,`${n}-${ot}`}function st(n,e){let t=(0,O.useMemo)(()=>xe(n),[n]),[r,o]=(0,O.useState)(()=>(e?.initialMessages??[]).map(b=>({id:b.id??Rn("msg"),role:b.role,content:b.content}))),[s,i]=(0,O.useState)(""),[a,l]=(0,O.useState)(!1),[u,p]=(0,O.useState)(null),c=(0,O.useRef)(e);c.current=e;let m=(0,O.useRef)(r);m.current=r;let h=(0,O.useRef)(s);h.current=s;let k=(0,O.useRef)(0),P=(0,O.useRef)(null),S=(0,O.useRef)(!0);(0,O.useEffect)(()=>(S.current=!0,()=>{S.current=!1,P.current?.cancel(),P.current=null}),[]);let v=(0,O.useCallback)(()=>{k.current++,P.current?.cancel(),P.current=null,S.current&&l(!1)},[]),U=(0,O.useCallback)(async b=>{let w=b===void 0,g=(w?h.current:b)??"";if(!g.trim())return;P.current?.cancel();let A=++k.current,d=()=>S.current&&k.current===A,C=c.current,x=C?.parseChunk??cr,R={id:Rn("msg"),role:"user",content:g},T={id:Rn("msg"),role:"assistant",content:""},j=[...m.current,R].map(H=>({role:H.role,content:H.content})),f=[...m.current,R,T];m.current=f,o(f),w&&i(""),p(null),l(!0);let L=C?.buildPayload??(H=>({messages:H})),{initialMessages:V,parseChunk:K,buildPayload:q,onFinish:ie,onError:ze,...Xe}=C??{},Se=H=>{o(F=>F.map(ae=>ae.id===T.id?{...ae,content:H}:ae))},de="",ee;try{ee=t.requestStream(L(j),Xe),P.current=ee}catch(H){let F=rt(H);d()&&(p(F),l(!1),C?.onError?.(F));return}try{for await(let H of ee){if(k.current!==A)break;de+=x(H),d()&&Se(de)}d()&&(l(!1),C?.onFinish?.({...T,content:de}))}catch(H){let F=rt(H);d()&&(p(F),l(!1),C?.onError?.(F))}finally{P.current===ee&&(P.current=null)}},[t]);return{messages:r,input:s,setInput:i,sendMessage:U,stop:v,isStreaming:a,error:u}}var D=require("react"),Ue=require("@urun-sh/core"),wn=[];function it(n,e={}){let{field:t=Ue.INPUT_PRESENCE_FIELD,hz:r=Ue.INPUT_PRESENCE_DEFAULT_HZ}=e,o=e.documentTarget!==void 0?e.documentTarget:typeof document<"u"?document:null,s=n?.presence??null,i=(0,D.useMemo)(()=>s?(0,Ue.createInputPresencePublisher)({awareness:{setLocalStateField:(g,_)=>s.setField(g,_)},field:t,hz:r}):null,[s,t,r]),a=(0,D.useRef)(null);a.current=i;let[l,u]=(0,D.useState)(!1),[p,c]=(0,D.useState)(wn),m=(0,D.useRef)(!1);(0,D.useEffect)(()=>{if(i)return()=>i.dispose()},[i]);let h=(0,D.useCallback)(()=>{let g=a.current;c(g?g.heldKeys():wn)},[]),k=(0,D.useCallback)(()=>{a.current?.clear(),c(wn)},[]);(0,D.useEffect)(()=>{if(!o)return;let g=()=>!!o.pointerLockElement,_=()=>{if(g()){m.current=!1,u(!0);return}m.current||(u(!1),k())},A=T=>{g()&&(a.current?.keyDown(T.key),h())},d=T=>{a.current?.keyUp(T.key),h()},C=T=>{g()&&a.current?.movePointer(T.movementX,T.movementY)},x=T=>{g()&&a.current?.setButtons(T.buttons)},R=()=>{k()};return o.addEventListener("pointerlockchange",_),o.addEventListener("keydown",A),o.addEventListener("keyup",d),o.addEventListener("mousemove",C),o.addEventListener("mousedown",x),o.addEventListener("mouseup",x),o.defaultView?.addEventListener("blur",R),()=>{o.removeEventListener("pointerlockchange",_),o.removeEventListener("keydown",A),o.removeEventListener("keyup",d),o.removeEventListener("mousemove",C),o.removeEventListener("mousedown",x),o.removeEventListener("mouseup",x),o.defaultView?.removeEventListener("blur",R)}},[o,k,h]);let P=(0,D.useCallback)(g=>{g.requestPointerLock?.()},[]),S=(0,D.useCallback)(()=>{m.current=!0,u(!0)},[]),v=(0,D.useCallback)(()=>{m.current=!1,o?.pointerLockElement&&o.exitPointerLock?.(),u(!1),k()},[o,k]),U=(0,D.useCallback)(g=>{a.current?.keyDown(g),h()},[h]),b=(0,D.useCallback)(g=>{a.current?.keyUp(g),h()},[h]),w=(0,D.useCallback)((g,_)=>{a.current?.movePointer(g,_)},[]);return{engage:P,engageTouch:S,release:v,engaged:l,heldKeys:p,pressKey:U,releaseKey:b,movePointer:w}}var at=new Map;function ut(n,e,t){if(!t||typeof t.safeParse!="function")throw new Error(`registerComponent("${n}"): schema must be a valid Zod schema`);at.set(n,{component:e,schema:t})}function ct(n,e){let t=at.get(n);if(!t)return{error:`Unknown component: "${n}"`};let r=t.schema.safeParse(e);return r.success?{Component:t.component,validatedProps:r.data}:{error:`Validation failed for "${n}": ${r.error.message}`}}var me=require("react/jsx-runtime");function lt({name:n,props:e,fallback:t}){let r=ct(n,e);if(r.error)return console.warn(`[urun] ComponentRenderer: ${r.error}`),t?(0,me.jsx)(me.Fragment,{children:t}):(0,me.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,me.jsx)("span",{className:"urun-component-error-text",children:r.error})});let o=r.Component;return(0,me.jsx)(o,{...r.validatedProps})}var Re=require("zod"),fe=require("react/jsx-runtime"),dt=Re.z.object({step:Re.z.number().min(0),total:Re.z.number().min(1),label:Re.z.string().optional(),variant:Re.z.enum(["default","success","error"]).default("default")});function En(n){let{step:e,total:t,label:r,variant:o="default"}=n,s=Math.min(e/t*100,100),i=e>=t;return{step:e,total:t,label:r,variant:o,percentage:s,isComplete:i}}function pt(n){let{step:e,total:t,label:r,variant:o,percentage:s}=En(n);return(0,fe.jsxs)("div",{className:"urun-progress-card","data-variant":o,children:[r&&(0,fe.jsx)("div",{className:"urun-progress-label",children:r}),(0,fe.jsx)("div",{className:"urun-progress-bar",children:(0,fe.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,fe.jsxs)("div",{className:"urun-progress-text",children:[e,"/",t]})]})}var Ye=require("zod"),qe=require("react/jsx-runtime"),mt=Ye.z.object({state:Ye.z.enum(["thinking","generating","idle","error"]),message:Ye.z.string().optional()}),lr={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function An(n){let{state:e,message:t}=n,r=e==="thinking"||e==="generating",o=t??lr[e]??e;return{state:e,message:o,isActive:r}}function ft(n){let{state:e,message:t,isActive:r}=An(n);return(0,qe.jsxs)("span",{className:"urun-status-badge","data-state":e,children:[(0,qe.jsx)("span",{className:`urun-status-indicator${r?" urun-status-pulse":""}`}),(0,qe.jsx)("span",{className:"urun-status-message",children:t})]})}var We=require("react"),Qe=require("zod"),Fe=require("react/jsx-runtime"),gt=Qe.z.object({text:Qe.z.string(),streaming:Qe.z.boolean().default(!1)});function Mn(n){let{text:e,streaming:t=!1}=n,r=e.length===0;return{text:e,streaming:t,isEmpty:r}}function ht(n){let{text:e,streaming:t}=Mn(n),r=(0,We.useRef)(null),o=(0,We.useRef)(0);return(0,We.useEffect)(()=>{let s=r.current;s&&e.length!==o.current&&(s.textContent=e,o.current=e.length)},[e]),(0,Fe.jsxs)("div",{className:"urun-text-stream",children:[(0,Fe.jsx)("span",{ref:r,className:"urun-text-content"}),t&&(0,Fe.jsx)("span",{className:"urun-text-cursor"})]})}var Be=require("zod"),Ve=require("react/jsx-runtime"),St=Be.z.object({src:Be.z.string().url(),alt:Be.z.string().optional(),caption:Be.z.string().optional()});function _n(n){let{src:e,alt:t,caption:r}=n;return{src:e,alt:t??"",caption:r}}function vt(n){let{src:e,alt:t,caption:r}=_n(n);return(0,Ve.jsxs)("figure",{className:"urun-image-frame",children:[(0,Ve.jsx)("img",{className:"urun-image",src:e,alt:t}),r&&(0,Ve.jsx)("figcaption",{className:"urun-image-caption",children:r})]})}var re=require("zod"),we=require("react/jsx-runtime"),yt=re.z.object({metrics:re.z.array(re.z.object({label:re.z.string(),value:re.z.union([re.z.string(),re.z.number()]),unit:re.z.string().optional()}))});function Nn(n){return{metrics:n.metrics.map(t=>({...t,displayValue:t.unit?`${t.value} ${t.unit}`:String(t.value)}))}}function kt(n){let{metrics:e}=Nn(n);return(0,we.jsx)("div",{className:"urun-metrics-panel",children:e.map((t,r)=>(0,we.jsxs)("div",{className:"urun-metric-card",children:[(0,we.jsx)("div",{className:"urun-metric-label",children:t.label}),(0,we.jsx)("div",{className:"urun-metric-value",children:t.displayValue})]},r))})}var N=require("react"),Ct=require("@urun-sh/core");var en=null;function dr(){if(typeof window>"u")return null;let n=window;return n.AudioContext??n.webkitAudioContext??null}function He(){if(en)return en;let n=dr();return n?(en=new n,en):null}function $e(){let n=He();n&&n.state==="suspended"&&n.resume().catch(()=>{})}var Pt=require("react/jsx-runtime"),pr=1e3,bt=200;function In(...n){console.debug("[urun-audio]",...n)}var nn=(0,N.forwardRef)(function(e,t){let{session:r,stream:o="audio",track:s,controls:i=!1,className:a,onTrack:l,onUnlockChange:u,onAudioElement:p}=e,c=(0,N.useRef)(null),m=(0,N.useRef)(null),h=(0,N.useRef)(null),k=(0,N.useRef)(null),P=(0,N.useRef)(l);P.current=l;let S=(0,N.useRef)(u);S.current=u;let v=(0,N.useCallback)(d=>{h.current!==d&&(h.current=d,S.current?.(d))},[]),U=(0,N.useCallback)(()=>{if(typeof MediaStream>"u")return null;m.current||(m.current=new MediaStream);let d=c.current;return d&&d.srcObject!==m.current&&(d.srcObject=m.current),m.current},[]),b=(0,N.useCallback)(d=>{let C=c.current;if(!C)return;let x=C.play();!x||typeof x.then!="function"||x.then(()=>{C.muted||v(!0)}).catch(R=>{let T=R instanceof Error?R.name:String(R);if(T==="AbortError"){In(`play() aborted (${d}); retrying in ${bt}ms`),k.current&&clearTimeout(k.current),k.current=setTimeout(()=>{k.current=null,b(`${d}:retry`)},bt);return}if(T==="NotAllowedError"){In(`play() blocked pending a user gesture (${d})`),v(!1);return}In(`play() failed (${d})`,R)})},[v]),w=(0,N.useCallback)(d=>{let C=U();if(C){for(let x of C.getAudioTracks())x!==d&&C.removeTrack(x);d&&!C.getAudioTracks().includes(d)&&C.addTrack(d),d&&b("track-attach"),P.current?.(d)}},[U,b]),g=(0,N.useCallback)(()=>{let d=c.current;d&&(U(),d.muted=!1,b("gesture"),$e(),v(!0))},[U,b,v]);(0,N.useImperativeHandle)(t,()=>({unlock:g,get unlocked(){return h.current===!0},get element(){return c.current}}),[g]);let _=(0,N.useCallback)(d=>{c.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),U()),p?.(d)},[U,p]),A=s!==void 0;return(0,N.useEffect)(()=>{if(A){w(s??null);return}if(!r)return;let d=r.stream(o),C=()=>{let f=m.current;return f?f.getAudioTracks()[0]??null:null},x=f=>{if(f!==C()&&(w(f),f)){let L=()=>{C()===f&&w(null)};f.addEventListener("ended",L)}},R=d.track;R&&R.readyState==="live"&&x(R);let T=d.on("track",f=>{f&&f.readyState!=="live"||x(f)}),j=setInterval(()=>{let f=d.track;f&&f.readyState==="live"&&x(f)},pr);return()=>{T(),clearInterval(j)}},[r,o,A,s,w]),(0,N.useEffect)(()=>(0,Ct.observePageLifecycle)(()=>{$e(),h.current===!0&&b("foreground")}),[b]),(0,N.useEffect)(()=>()=>{k.current&&clearTimeout(k.current)},[]),(0,Pt.jsx)("audio",{ref:_,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})});var M=require("react"),Ee=require("@urun-sh/core");var xt=require("react/jsx-runtime"),Dn={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function tn(...n){console.debug("[urun-voice]",...n)}var Tt=(0,M.forwardRef)(function(e,t){let{session:r,stream:o="audio",constraints:s=Dn,connectTimeoutMs:i,attempts:a=3,retryDelayMs:l=1500,onActiveChange:u,onError:p,onMicStream:c,onTrack:m,onUnlockChange:h,capture:k}=e,P=(0,M.useRef)(null),S=(0,M.useRef)(null),v=(0,M.useRef)(null),U=(0,M.useRef)([]),b=(0,M.useRef)(!1),w=(0,M.useRef)(u);w.current=u;let g=(0,M.useRef)(p);g.current=p;let _=(0,M.useRef)(c);_.current=c;let A=(0,M.useCallback)(f=>{b.current!==f&&(b.current=f,w.current?.(f))},[]),d=(0,M.useCallback)(()=>{for(let f of U.current)f();U.current=[],v.current?.release(),v.current=null,S.current&&(S.current=null,_.current?.(null))},[]),C=(0,M.useCallback)(async()=>{let f=v.current;if(f){let q=await f.update(s);return S.current=f.stream,_.current?.(f.stream),q}let V=await(k??(0,Ee.sharedCaptureController)()).claim("audio",s);v.current=V,U.current=[V.onTrack((q,ie)=>{S.current=ie,_.current?.(ie),b.current&&r.stream(o).attach(q).catch(ze=>tn("mic re-attach after one-capture re-acquire failed",ze))}),V.onLost(q=>{v.current=null,U.current=[],S.current=null,_.current?.(null),A(!1),g.current?.(q)})],S.current=V.stream,_.current?.(V.stream);let K=V.track;if(!K)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return K},[k,s,r,o,A]),x=(0,M.useCallback)(async()=>{d(),A(!1),await r.stream(o).detach().catch(()=>{})},[r,o,d,A]),R=(0,M.useCallback)(async()=>{P.current?.unlock();let f;try{f=await C()}catch(K){d();let q=(0,Ee.sessionFailureFromMediaError)(K,r.status);throw g.current?.(q),q}r.connect?.();let L;for(let K=1;K<=a;K++)try{await r.whenLive(i!==void 0?{timeout:i}:void 0),await r.stream(o).attach(f),A(!0);return}catch(q){L=q,tn(`start attempt ${K}/${a} failed`,q),K<a&&await new Promise(ie=>setTimeout(ie,l))}d(),A(!1);let V=L instanceof Error?L:new Error(String(L??"voice start failed"));throw g.current?.(V),V},[r,o,i,a,l,C,d,A]);(0,M.useImperativeHandle)(t,()=>({start:R,stop:x,unlock:()=>P.current?.unlock(),get active(){return b.current},get micStream(){return S.current},get audio(){return P.current}}),[R,x]);let T=(0,M.useRef)(!1),j=(0,M.useCallback)(async()=>{if(!b.current||T.current)return;let f=S.current?.getAudioTracks()[0]??null;if(f&&f.readyState==="live"){try{await r.stream(o).attach(f)}catch(L){tn("foreground mic re-assert failed (will retry on next pass)",L)}return}T.current=!0;try{let L=await C();await r.stream(o).attach(L)}catch(L){let V=L instanceof Error?L:new Error(String(L));tn("foreground mic re-acquire failed",V),g.current?.(V)}finally{T.current=!1}},[r,o,C]);return(0,M.useEffect)(()=>{let f=()=>{j()};return typeof r.onRecovery=="function"?r.onRecovery(f):(0,Ee.observePageLifecycle)(f)},[r,j]),(0,M.useEffect)(()=>d,[d]),(0,xt.jsx)(nn,{ref:P,session:r,stream:o,onTrack:m,onUnlockChange:h})});var rn=require("@urun-sh/core"),y=require("react"),Z=require("react/jsx-runtime"),On={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Ln(...n){console.debug("[urun-camera]",...n)}function mr(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function fr(){let n=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof n?.enumerateDevices!="function")return null;try{return(await n.enumerateDevices()).filter(t=>t.kind==="videoinput")}catch{return null}}var Ut=(0,y.forwardRef)(function(e,t){let{session:r,stream:o="video",constraints:s,facingMode:i="environment",mirror:a="auto",connectTimeoutMs:l,preview:u=!0,className:p,videoClassName:c,onActiveChange:m,onError:h,onStream:k,onTrack:P,children:S,capture:v,flipControl:U="auto",flipControlClassName:b,onDevices:w}=e,g=(0,y.useRef)(null),_=(0,y.useRef)(null),A=(0,y.useRef)(null),d=(0,y.useRef)([]),C=(0,y.useRef)(null),x=(0,y.useRef)(!1),R=(0,y.useRef)(i),[T,j]=(0,y.useState)(i),[f,L]=(0,y.useState)(!1),[V,K]=(0,y.useState)(null),[q,ie]=(0,y.useState)(!1),[ze]=(0,y.useState)(mr),Xe=(0,y.useRef)(m);Xe.current=m;let Se=(0,y.useRef)(h);Se.current=h;let de=(0,y.useRef)(k);de.current=k;let ee=(0,y.useRef)(P);ee.current=P;let H=(0,y.useRef)(w);H.current=w;let F=(0,y.useCallback)(E=>{x.current!==E&&(x.current=E,L(E),Xe.current?.(E))},[]);(0,y.useEffect)(()=>{if(!f){K(null);return}let E=!1,I=()=>{fr().then(z=>{E||(K(z),z&&H.current?.(z))})};I();let $=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof $?.addEventListener=="function"?($.addEventListener("devicechange",I),()=>{E=!0,$.removeEventListener?.("devicechange",I)}):()=>{E=!0}},[f]);let ae=(0,y.useCallback)(E=>{let I=g.current;I&&(I.muted=!0,I.defaultMuted=!0,I.setAttribute("muted",""),I.setAttribute("playsinline",""),I.setAttribute("webkit-playsinline",""),I.srcObject=E,E&&I.play()?.catch?.($=>Ln("preview play() failed",$)))},[]),ne=(0,y.useCallback)(()=>{C.current?.(),C.current=null;for(let E of d.current)E();d.current=[],A.current?.release(),A.current=null,_.current&&(_.current=null,de.current?.(null),ee.current?.(null)),ae(null)},[ae]),kn=(0,y.useCallback)((E,I)=>{C.current?.(),_.current=I,ae(I),de.current?.(I);let $=()=>{_.current===I&&(Ln("camera track ended (device removed or permission revoked)"),ne(),F(!1))};E.addEventListener("ended",$),C.current=()=>E.removeEventListener("ended",$)},[ae,ne,F]),ve=(0,y.useCallback)(async E=>{let I={...On,...s,facingMode:E},$;try{let z=A.current;if(z)$=await z.update(I);else{let Ie=await(v??(0,rn.sharedCaptureController)()).claim("video",I);if(A.current=Ie,d.current=[Ie.onTrack((De,Zt)=>{kn(De,Zt),x.current&&r.stream(o).attachVideo(De).then(()=>ee.current?.(De)).catch(Yt=>Ln("camera re-publish after one-capture re-acquire failed",Yt))}),Ie.onLost(De=>{A.current=null,d.current=[],ne(),F(!1),Se.current?.(De)})],!Ie.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});$=Ie.track}}catch(z){let ye=(0,rn.sessionFailureFromMediaError)(z,r.status);throw Se.current?.(ye),ye}R.current=E,j(E),kn($,A.current?.stream??new MediaStream([$]));try{r.connect?.(),await r.whenLive(l!==void 0?{timeout:l}:void 0),await r.stream(o).attachVideo($)}catch(z){ne(),F(!1);let ye=z instanceof Error?z:new Error(String(z));throw Se.current?.(ye),ye}ee.current?.($),F(!0)},[r,o,s,l,v,kn,ne,F]),Vn=(0,y.useCallback)(E=>ve(E?.facingMode??R.current),[ve]),Hn=(0,y.useCallback)(async E=>{x.current&&R.current===E||await ve(E)},[ve]),bn=(0,y.useCallback)(()=>ve(R.current==="environment"?"user":"environment"),[ve]),$n=(0,y.useCallback)(async()=>{ne(),F(!1),await r.stream(o).detachVideo().catch(()=>{})},[r,o,ne,F]);if((0,y.useImperativeHandle)(t,()=>({start:Vn,stop:$n,flip:bn,setFacingMode:Hn,get active(){return x.current},get facingMode(){return R.current},get stream(){return _.current},get element(){return g.current}}),[Vn,$n,bn,Hn]),(0,y.useEffect)(()=>ne,[ne]),!u)return null;let zt=a==="auto"?T==="user":a,Xt=f&&(U===!0||U==="auto"&&ze&&(V?.length??0)>1),Gt=()=>{q||(ie(!0),bn().catch(()=>{}).finally(()=>ie(!1)))};return(0,Z.jsxs)("div",{className:p,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":T,children:[(0,Z.jsx)("video",{ref:g,className:c,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...zt?{transform:"scaleX(-1)"}:{}}}),Xt?(0,Z.jsx)("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Gt,disabled:q,className:b,style:b?{opacity:q?.6:void 0}:{position:"absolute",right:16,bottom:"calc(env(safe-area-inset-bottom, 0px) + 16px)",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",width:44,height:44,borderRadius:9999,border:"1px solid rgba(255,255,255,0.25)",background:"rgba(0,0,0,0.5)",color:"#fff",cursor:"pointer",opacity:q?.6:1},children:(0,Z.jsxs)("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",style:{width:20,height:20},"aria-hidden":!0,children:[(0,Z.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,Z.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,Z.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,Z.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,Z.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,S]})});var on=require("react");var qn={level:0,speaking:!1};function Rt(n,e={}){let{fftSize:t=512,intervalMs:r=100,speakingThreshold:o=.02}=e,[s,i]=(0,on.useState)(qn);return(0,on.useEffect)(()=>{if(!n){i(qn);return}let a=He();if(!a||typeof MediaStream>"u")return;let l;n instanceof MediaStream?l=n:(l=new MediaStream,l.addTrack(n));let u,p;try{u=a.createMediaStreamSource(l),p=a.createAnalyser(),p.fftSize=t,u.connect(p)}catch{return}let c=new Uint8Array(p.fftSize),h=setInterval(()=>{p.getByteTimeDomainData(c);let k=0;for(let S=0;S<c.length;S++){let v=(c[S]-128)/128;k+=v*v}let P=Math.sqrt(k/c.length);i(S=>{let v=P>o;return Math.abs(S.level-P)<.005&&S.speaking===v?S:{level:P,speaking:v}})},r);return()=>{clearInterval(h),u.disconnect(),i(qn)}},[n,t,r,o]),s}var sn=require("react");function wt(n,e){let[t,r]=(0,sn.useState)(null);return(0,sn.useEffect)(()=>{if(!n||!e){r(null);return}let o=n.stream(e);return r(o.track),o.on("track",r)},[n,e]),t}var Mt=require("react");var un=require("react");var Et=require("zustand/vanilla"),At=require("zustand"),gr=()=>{};function an(n,e={}){let t=u=>{n?.set(u)},r=()=>n?n.get()??{}:{},o=(0,Et.createStore)(()=>({doc:r(),synced:n?n.synced:!1,set:t})),s=null,i=()=>{if(s){for(let u of s)u();s=null}},a=()=>n?(s||(o.setState({doc:r(),synced:n.synced}),s=[n.on("change",u=>o.setState({doc:u})),n.onSynced(()=>o.setState({synced:!0}))]),i):gr,l=(u=>(0,At.useStore)(o,u));return Object.assign(l,{getState:o.getState,getInitialState:o.getInitialState,subscribe:o.subscribe,set:t,bind:a,unbind:i}),e.bind!==!1&&a(),l}function Ae(n,e){let t=(0,un.useMemo)(()=>an(n&&e?n.doc(e):null,{bind:!1}),[n,e]);return(0,un.useEffect)(()=>t.bind(),[t]),t}function _t(n,e,t){let o=Ae(n,e)(t??(a=>a)),s=(0,Mt.useCallback)(a=>{n&&e&&n.doc(e).set(a)},[n,e]);if(t)return o;let i=o;return{snapshot:n&&e?i.doc:null,synced:i.synced,set:s}}var ln=require("react");var ue=200;function oe(n,e,t=200){let r=[...n,e];return r.length>t?r.slice(r.length-t):r}function Me(n){if(typeof n=="string")return n;try{return JSON.stringify(n)}catch{return String(n)}}function cn(n){let e=n.trim();if(!e)return{ok:!1,error:"Enter a JSON object."};let t;try{t=JSON.parse(e)}catch(r){return{ok:!1,error:r instanceof Error?r.message:"Invalid JSON."}}return t===null||typeof t!="object"||Array.isArray(t)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:t}}function dn(n,e,t={}){let r=t.cap??200,[o,s]=(0,ln.useState)([]);return(0,ln.useEffect)(()=>{if(s([]),!n||!e)return;let i=!0,a=n.stream(e).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let l=await a.next();if(!i||l.done)break;s(u=>oe(u,{at:Date.now(),payload:l.value},r))}})(),()=>{i=!1,a.return?.()}},[n,e,r]),o}var Y=require("react/jsx-runtime");function Nt({session:n,name:e,cap:t,className:r}){let o=dn(n,e,{cap:t});return(0,Y.jsxs)("div",{className:["urun-stream-tail",r].filter(Boolean).join(" "),children:[(0,Y.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,Y.jsx)("code",{children:e}),(0,Y.jsxs)("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),(0,Y.jsx)("div",{className:"urun-stream-tail-log",children:o.length===0?(0,Y.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,Y.jsx)("code",{children:e})," messages\u2026"]}):o.map((s,i)=>(0,Y.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,Y.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",Me(s.payload)]},`${s.at}-${i}`))})]})}var je=require("react");var J=require("react/jsx-runtime");function Ke({placeholder:n,buttonLabel:e,disabled:t,onApply:r}){let[o,s]=(0,je.useState)(""),[i,a]=(0,je.useState)(null),l=(0,je.useCallback)(()=>{let u=cn(o);if(!u.ok){a(u.error);return}a(null),r(u.value,o.trim()),s("")},[o,r]);return(0,J.jsxs)("div",{className:"urun-doc-patch",children:[(0,J.jsx)("textarea",{className:"urun-doc-patch-input",value:o,onChange:u=>s(u.target.value),placeholder:n,rows:3}),(0,J.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,J.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:t||!o.trim(),onClick:l,children:e}),i?(0,J.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function It({session:n,docKey:e,editable:t=!0,patchPlaceholder:r='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=Ae(n,e),i=s(u=>u.doc),a=s(u=>u.synced),l=s(u=>u.set);return(0,J.jsxs)("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[(0,J.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,J.jsx)("code",{children:e}),(0,J.jsx)("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),(0,J.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),t?(0,J.jsx)(Ke,{placeholder:r,buttonLabel:"Apply patch",disabled:!n,onApply:u=>l(u)}):null]})}var pn=require("react");var se=require("react/jsx-runtime");function Dt(n,e=600){return n.length>e?`${n.slice(0,e)}\u2026`:n}function Lt({session:n,docKey:e="control",cap:t=200,className:r}){let[o,s]=(0,pn.useState)([]);return(0,pn.useEffect)(()=>(s([]),n?n.doc(e).on("change",a=>{s(l=>oe(l,{at:Date.now(),direction:"in",text:Dt(Me(a))},t))}):void 0),[n,e,t]),(0,se.jsxs)("div",{className:["urun-control-sender",r].filter(Boolean).join(" "),children:[(0,se.jsx)(Ke,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${e}`,disabled:!n,onApply:(i,a)=>{n?.doc(e).set(i),s(l=>oe(l,{at:Date.now(),direction:"out",text:Dt(a)},t))}}),(0,se.jsx)("div",{className:"urun-control-sender-log",children:o.length===0?(0,se.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((i,a)=>(0,se.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,se.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,se.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}var mn=require("react");var ge=require("react/jsx-runtime");function Ot({session:n,trackNames:e=["video","audio"],docKeys:t=["control"],cap:r=200,className:o}){let[s,i]=(0,mn.useState)([]),a=e.join(","),l=t.join(",");return(0,mn.useEffect)(()=>{if(i([]),!n)return;let u=(c,m)=>i(h=>oe(h,{at:Date.now(),kind:c,text:m},r)),p=[];p.push(n.onPhase(c=>u("phase",`phase \u2192 ${c.name}`)));for(let c of e){let m=n.stream(c);p.push(m.on("track",h=>u("track",`${c}: ${h?"track arrived":"track ended"}`)))}for(let c of t){let m=n.doc(c);p.push(m.on("change",()=>u("doc",`${c} changed`)))}return()=>p.forEach(c=>c())},[n,a,l,r]),(0,ge.jsx)("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:s.length===0?(0,ge.jsx)("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((u,p)=>(0,ge.jsxs)("div",{className:"urun-event-spine-line","data-kind":u.kind,children:[(0,ge.jsx)("span",{className:"urun-event-spine-kind",children:u.kind})," ",(0,ge.jsx)("span",{className:"urun-event-spine-time",children:new Date(u.at).toLocaleTimeString()})," ",u.text]},`${u.at}-${p}`))})}var Sn=require("@urun-sh/core");var fn=require("react");function G(n){let[e,t]=(0,fn.useState)(n?.phase??null);return(0,fn.useEffect)(()=>{if(!n){t(null);return}return n.onPhase(t)},[n]),e}var Wt=require("@urun-sh/core");var _e=require("react"),qt=require("@urun-sh/core");function gn(n){let e=G(n),t=(0,qt.isWakingPhase)(e?.name),r=(0,_e.useRef)(void 0);t?r.current??=Date.now():r.current=void 0;let o=t?e?.wakingSince??r.current:void 0,s=()=>o!==void 0?Math.max(0,Math.floor((Date.now()-o)/1e3)):0,[i,a]=(0,_e.useState)(s);return(0,_e.useEffect)(()=>{if(o===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-o)/1e3)));let l=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-o)/1e3)))},1e3);return()=>clearInterval(l)},[o]),{waking:t,phase:e,state:t?e?.runtime?.state:void 0,reason:t?e?.runtime?.reason:void 0,since:o,seconds:t?i:0}}var ce=require("react/jsx-runtime");function hn({session:n,render:e,className:t}){let r=gn(n);return!r.waking||!r.phase?null:(0,ce.jsx)("span",{className:["urun-session-waking",t].filter(Boolean).join(" "),"data-phase":r.phase.name,"data-runtime-state":r.state,children:e?e(r):(0,ce.jsxs)(ce.Fragment,{children:[(0,ce.jsx)("span",{className:"urun-session-waking-label",children:(0,Wt.describeSessionPhase)(r.phase)})," ",(0,ce.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",r.seconds,"s)"]})]})})}var Q=require("react/jsx-runtime"),hr={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function Ft({session:n,className:e}){let t=G(n),r=t?.name??"idle",o=t?.name==="queued"&&t.queue?`pos ${t.queue.position} / depth ${t.queue.depth}`:(t?.name==="error"||t?.name==="expired")&&t.error?t.error.reason:t?.runtime?.reason??null;return(0,Q.jsxs)("span",{className:["urun-session-status",e].filter(Boolean).join(" "),"data-phase":r,children:[(0,Q.jsx)("span",{className:"urun-session-status-dot","data-phase":r}),(0,Q.jsx)("span",{className:"urun-session-status-label",children:hr[r]}),o?(0,Q.jsx)("span",{className:"urun-session-status-detail",children:o}):null]})}function Bt({session:n,children:e,fallback:t,onStartOver:r,className:o}){let s=G(n);if(s?.name==="live")return(0,Q.jsx)("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:e});let i=t?t(s):(0,Q.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,Sn.isWakingPhase)(s.name)?(0,Q.jsx)(hn,{session:n}):s&&s.name!=="idle"?(0,Sn.describeSessionPhase)(s):"Waiting for a live session\u2026"}),a=r!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,Q.jsxs)("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:[i,a?(0,Q.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:r,children:"Start over"}):null]})}var vn=require("react");var Ht=require("react/jsx-runtime");function Wn(n){return G(n)?.endsAt??null}function Sr(n){let e=Math.max(0,Math.floor(n/1e3)),t=Math.floor(e/60),r=e%60;return`${String(t).padStart(2,"0")}:${String(r).padStart(2,"0")}`}function Vt({session:n,urgentMs:e=6e4,className:t}){let o=Wn(n)?.getTime()??null,[s,i]=(0,vn.useState)(()=>o===null?null:Math.max(0,o-Date.now()));if((0,vn.useEffect)(()=>{if(o===null){i(null);return}let l=()=>i(Math.max(0,o-Date.now()));l();let u=setInterval(l,1e3);return()=>clearInterval(u)},[o]),s===null)return null;let a=Sr(s);return(0,Ht.jsx)("span",{className:["urun-session-clock",t].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<e?"":void 0,"data-expired":s<=0?"":void 0,children:a})}var Je=require("react/jsx-runtime"),vr=new Set(["expired","ended","error"]);function $t({session:n,onNewSession:e,children:t,className:r}){let o=G(n);if(!o||!vr.has(o.name))return null;let s=t?t(o):(0,Je.jsx)("span",{className:"urun-session-ended-copy",children:o.name==="expired"?"Session ended \u2014 start a new session":o.name==="error"?`Session failed${o.error?.reason?` \u2014 ${o.error.reason}`:""}.`:"Session ended."});return(0,Je.jsxs)("div",{className:["urun-session-ended",r].filter(Boolean).join(" "),"data-phase":o.name,children:[s,e?(0,Je.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:e,children:"New session"}):null]})}var le=require("react"),he=require("react/jsx-runtime");function Fn(n){if(!n||typeof n!="object"||Array.isArray(n))return null;let e=n;return e.warning!==!0?null:{warning:!0,deadlineEpochS:typeof e.deadline_epoch_s=="number"?e.deadline_epoch_s:null,idleSinceEpochS:typeof e.idle_since_epoch_s=="number"?e.idle_since_epoch_s:null}}function Bn(n){let e=(0,le.useMemo)(()=>n?n.doc("control"):null,[n]),[t,r]=(0,le.useState)(()=>e?Fn(e.get("idle")):null);return(0,le.useEffect)(()=>{if(!e){r(null);return}return r(Fn(e.get("idle"))),e.on("change",()=>r(Fn(e.get("idle"))))},[e]),t}function yr(n){let e=Math.max(0,Math.floor(n));return`${Math.floor(e/60)}:${String(e%60).padStart(2,"0")}`}function jt({session:n,onStillHere:e,className:t}){let r=Bn(n),o=r?.deadlineEpochS??null,[s,i]=(0,le.useState)(null);if((0,le.useEffect)(()=>{if(o===null){i(null);return}let l=()=>i(Math.max(0,o-Date.now()/1e3));l();let u=setInterval(l,1e3);return()=>clearInterval(u)},[o]),!r||!n)return null;let a=()=>{n.touch?.(),e?.()};return(0,he.jsx)("div",{className:["urun-idle-warning",t].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:(0,he.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,he.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,he.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${yr(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,he.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}var Ne=require("react"),Kt=require("@urun-sh/core");function Jt(n){let e=(0,Ne.useContext)(be),[t,r]=(0,Ne.useState)(null),o=n.app??e?.appId,s=n.function,i=n.intervalS??60,a=e?.baseUrl,l=e?.orgId,u=e?.jwt,p=e?.getAccessToken,c=e?.authProvider;return(0,Ne.useEffect)(()=>{if(!a||!l||!o||!s)return;let m=!1,h=()=>{(0,Kt.prewake)({baseUrl:a,app:o,functionName:s,orgId:l,jwt:u,getAccessToken:p,authProvider:c}).then(P=>{m||r(P)}).catch(()=>{})};h();let k=setInterval(h,Math.max(1,i)*1e3);return()=>{m=!0,clearInterval(k)}},[o,s,i,a,l,u,p,c]),t}var yn=require("@urun-sh/core");0&&(module.exports={ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,ProgressCard,ProgressCardSchema,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunIdleWarning,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,registerComponent,resumeUrunAudioContext,urunPublicEnv,useApp,useChat,useCompletion,useDocStore,useImageFrame,useInputPresence,useMetricsPanel,useProgressCard,useRequest,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client"
|
|
2
|
-
import{a as Kn,b as Jn,c as Ie}from"./chunk-WF2OBDSX.mjs";import{useEffect as Yn,useMemo as Qn,useState as er}from"react";import{Component as zn}from"react";import{jsx as sn,jsxs as Xn}from"react/jsx-runtime";var de=class extends zn{constructor(e){super(e),this.state={error:null}}static getDerivedStateFromError(e){return{error:e}}componentDidCatch(e,r){console.error("[urun] Error caught by UrunErrorBoundary:",e,r)}render(){if(this.state.error){let{fallback:e}=this.props;return typeof e=="function"?e(this.state.error):e||Xn("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[sn("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),sn("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as Gn}from"react";var ee=Gn(null);function z(n){return n&&n.trim()?n.trim():void 0}function $(n){switch(n){case"NEXT_PUBLIC_AUTH_MODE":return z(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return z(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return z(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return z(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return z(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return z(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return z(typeof process<"u"?process.env?.[n]:void 0)}}function ye(){let n=$("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return n==="jwt"||n==="customer-jwt"||n==="test-jwt"?"jwt":n==="workos"||$("VERCEL_ENV")==="production"?"workos":$("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Zn(){return ye()==="workos"}import{jsx as Le}from"react/jsx-runtime";function nr({baseUrl:n,orgId:e,appId:r,jwt:t,authProvider:o,fallback:s,children:i}){let[a,l]=er(),u=Ie(),p=$("NEXT_PUBLIC_SESSION_TOKEN")??$("NEXT_PUBLIC_URUN_JWT"),c=ye(),m=c==="workos"&&!t,S=t??(c==="jwt"?p:void 0)??a,k=o??$("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),C=m&&!S,h=Qn(()=>({appId:r,baseUrl:n,orgId:e,jwt:S,getAccessToken:m?u?.getAccessToken:void 0,authProvider:k}),[r,u,n,k,S,e,m]);return Yn(()=>{if(!m||!u)return;let v=!1,x=u;async function y(){try{let g=await x.getAccessToken();v||l(g??void 0)}catch{v||l(void 0)}}y();let R=window.setInterval(()=>{y()},6e4);return()=>{v=!0,window.clearInterval(R)}},[u,m]),Le(de,{fallback:s,children:C?Le("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Le(ee.Provider,{value:h,children:i})})}import{useContext as rr,useEffect as tr,useMemo as an,useReducer as or,useRef as un}from"react";import{App as sr}from"@urun-sh/core";function ir(n,e){return`${n}:${JSON.stringify(e??{})}`}function ar(n,e,r){return JSON.stringify({appId:n.appId,baseUrl:n.baseUrl,orgId:n.orgId,jwt:n.jwt,authProvider:n.authProvider,fnName:e,args:r??{}})}var ne=new Map;var De=class{constructor(e,r){this._doc=e;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(e,r){return this._doc.get(e,r)}set(e){this._doc.set(e),this._notify()}on(e,r){return this._doc.on(e,t=>r(t))}get synced(){return this._doc.synced}onSynced(e){return this._doc.onSynced(()=>{e(),this._notify()})}text(e){let r=this._doc.text(e),t=this._notify;return{append(o){r.append(o),t()},toString:()=>r.toString(),get length(){return r.length},on:(o,s)=>r.on(o,i=>{s(i),t()})}}dispose(){this._unsubscribeChange()}},Oe=class{constructor(e,r){this._stream=e;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(e){return this._stream.attach(e)}attachVideo(e){return this._stream.attachVideo(e)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(e){return this._stream.seek(e)}chunks(e){return this._stream.chunks(e)}onSeeked(e){return this._stream.onSeeked(e)}on(e,r){return this._stream.on(e,r)}messages(){return this._stream.messages()}emit(e,r){return this._stream.emit(e,r)}dispose(){this._unsubscribeTrack()}},qe=class{constructor(e,r){this._session=e;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll())}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}addNotifier(e){this._notifiers.add(e)}removeNotifier(e){this._notifiers.delete(e)}_notifyAll(){for(let e of this._notifiers)e()}get id(){return this._session.id}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(e){return this._session.onPhase(e)}whenLive(e){return this._session.whenLive(e)}recover(){this._session.recover()}onRecovery(e){return this._session.onRecovery(e)}request(e,r){return this._session.request(e,r)}requestStream(e,r){return this._session.requestStream(e,r)}complete(e,r){return this._session.complete(e,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(e){let r=this._docs.get(e);return r||(r=new De(this._session.doc(e),()=>this._notifyAll()),this._docs.set(e,r)),r}stream(e){let r=this._streams.get(e);return r||(r=new Oe(this._session.stream(e),()=>this._notifyAll()),this._streams.set(e,r)),r}disconnect(){this._disposed=!0;for(let e of this._docs.values())e.dispose();for(let e of this._streams.values())e.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._session.disconnect(),this._notifyAll(),this._notifiers.clear()}};function ur(){let n=rr(ee);if(!n)throw new Error("useApp must be used within <UrunProvider>");if(!n.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,e]=or(s=>s+1,0),r=un(new Map),t=un(new Map),o=an(()=>sr(n.appId,{baseUrl:n.baseUrl,orgId:n.orgId,jwt:n.jwt,getAccessToken:n.getAccessToken,authProvider:n.authProvider}),[n.appId,n.baseUrl,n.orgId,n.jwt,n.getAccessToken,n.authProvider]);return tr(()=>()=>{for(let[s,i]of t.current){let a=ne.get(s);a===i&&(a.handle.removeNotifier(e),a.refCount=Math.max(0,a.refCount-1),a.refCount===0&&(a.disposeTimer=setTimeout(()=>{let l=ne.get(s);!l||l.refCount!==0||(ne.delete(s),l.handle.disconnect())},0)))}t.current.clear(),r.current.clear()},[]),an(()=>new Proxy({},{get(s,i){if(typeof i=="string")return a=>{let l=ir(i,a),u=r.current.get(l);if(u&&!u.disposed)return u;let p=ar(n,i,a),c=ne.get(p);return c?.handle.disposed&&(c.disposeTimer&&clearTimeout(c.disposeTimer),ne.delete(p),t.current.get(p)===c&&t.current.delete(p),c=void 0),c?c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null):(c={handle:new qe(o[i](a),e),refCount:0,disposeTimer:null},ne.set(p,c)),t.current.get(p)!==c&&(t.current.set(p,c),c.handle.addNotifier(e),c.refCount+=1),r.current.set(l,c.handle),c.handle}}}),[n,o])}import{useCallback as We,useEffect as cr,useMemo as lr,useRef as ke,useState as Fe}from"react";function re(n){let e=n;if(!e||typeof e.request!="function"||typeof e.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return e}function dr(n){return n instanceof Error?n:new Error(String(n))}function pr(n,e){let r=lr(()=>re(n),[n]),[t,o]=Fe(void 0),[s,i]=Fe(null),[a,l]=Fe(!1),u=ke(e);u.current=e;let p=ke(0),c=ke(null),m=ke(!0);cr(()=>(m.current=!0,()=>{m.current=!1,c.current?.abort()}),[]);let S=We(async h=>{c.current?.abort();let v=new AbortController;c.current=v;let x=++p.current,y=()=>m.current&&p.current===x;y()&&(l(!0),i(null));try{let R=await r.request(h,{...u.current,signal:v.signal});return y()&&(o(R),l(!1),u.current?.onSuccess?.(R)),R}catch(R){let g=dr(R);throw y()&&(i(g),l(!1),u.current?.onError?.(g)),g}},[r]),k=We(h=>{S(h).catch(()=>{})},[S]),C=We(()=>{p.current++,c.current?.abort(),c.current=null,o(void 0),i(null),l(!1)},[]);return{mutate:k,mutateAsync:S,data:t,error:s,isPending:a,reset:C}}import{useCallback as cn,useEffect as mr,useMemo as fr,useRef as be,useState as Be}from"react";function ln(n){return n instanceof Error?n:new Error(String(n))}var gr=n=>typeof n=="string"?n:String(n);function Sr(n,e){let r=fr(()=>re(n),[n]),[t,o]=Be(""),[s,i]=Be(!1),[a,l]=Be(null),u=be(e);u.current=e;let p=be(0),c=be(null),m=be(!0);mr(()=>(m.current=!0,()=>{m.current=!1,c.current?.cancel(),c.current=null}),[]);let S=cn(()=>{p.current++,c.current?.cancel(),c.current=null,m.current&&i(!1)},[]),k=cn(async C=>{c.current?.cancel();let h=++p.current,v=()=>m.current&&p.current===h,x=u.current,y=x?.parseChunk??gr,R=x?.buildPayload??(b=>({prompt:b}));v()&&(o(""),l(null),i(!0));let{parseChunk:g,buildPayload:_,onFinish:A,onError:d,...P}=x??{},U="",E;try{E=r.requestStream(R(C),P),c.current=E}catch(b){let L=ln(b);v()&&(l(L),i(!1),x?.onError?.(L));return}try{for await(let b of E){if(p.current!==h)break;U+=y(b),v()&&o(U)}v()&&(i(!1),x?.onFinish?.(U))}catch(b){let L=ln(b);v()&&(l(L),i(!1),x?.onError?.(L))}finally{c.current===E&&(c.current=null)}},[r]);return{completion:t,complete:k,stop:S,isStreaming:s,error:a}}import{useCallback as dn,useEffect as hr,useMemo as vr,useRef as te,useState as Ce}from"react";function pn(n){return n instanceof Error?n:new Error(String(n))}var yr=n=>typeof n=="string"?n:String(n),mn=0;function Ve(n){return mn+=1,`${n}-${mn}`}function kr(n,e){let r=vr(()=>re(n),[n]),[t,o]=Ce(()=>(e?.initialMessages??[]).map(y=>({id:y.id??Ve("msg"),role:y.role,content:y.content}))),[s,i]=Ce(""),[a,l]=Ce(!1),[u,p]=Ce(null),c=te(e);c.current=e;let m=te(t);m.current=t;let S=te(s);S.current=s;let k=te(0),C=te(null),h=te(!0);hr(()=>(h.current=!0,()=>{h.current=!1,C.current?.cancel(),C.current=null}),[]);let v=dn(()=>{k.current++,C.current?.cancel(),C.current=null,h.current&&l(!1)},[]),x=dn(async y=>{let R=y===void 0,g=(R?S.current:y)??"";if(!g.trim())return;C.current?.cancel();let A=++k.current,d=()=>h.current&&k.current===A,P=c.current,U=P?.parseChunk??yr,E={id:Ve("msg"),role:"user",content:g},b={id:Ve("msg"),role:"assistant",content:""},L=[...m.current,E].map(T=>({role:T.role,content:T.content})),f=[...m.current,E,b];m.current=f,o(f),R&&i(""),p(null),l(!0);let w=P?.buildPayload??(T=>({messages:T})),{initialMessages:I,parseChunk:M,buildPayload:D,onFinish:q,onError:ae,...he}=P??{},ve=T=>{o(N=>N.map(O=>O.id===b.id?{...O,content:T}:O))},Y="",ue;try{ue=r.requestStream(w(L),he),C.current=ue}catch(T){let N=pn(T);d()&&(p(N),l(!1),P?.onError?.(N));return}try{for await(let T of ue){if(k.current!==A)break;Y+=U(T),d()&&ve(Y)}d()&&(l(!1),P?.onFinish?.({...b,content:Y}))}catch(T){let N=pn(T);d()&&(p(N),l(!1),P?.onError?.(N))}finally{C.current===ue&&(C.current=null)}},[r]);return{messages:t,input:s,setInput:i,sendMessage:x,stop:v,isStreaming:a,error:u}}import{useCallback as j,useEffect as fn,useMemo as br,useRef as gn,useState as Sn}from"react";import{createInputPresencePublisher as Cr,INPUT_PRESENCE_DEFAULT_HZ as Tr,INPUT_PRESENCE_FIELD as Pr}from"@urun-sh/core";var He=[];function xr(n,e={}){let{field:r=Pr,hz:t=Tr}=e,o=e.documentTarget!==void 0?e.documentTarget:typeof document<"u"?document:null,s=n?.presence??null,i=br(()=>s?Cr({awareness:{setLocalStateField:(g,_)=>s.setField(g,_)},field:r,hz:t}):null,[s,r,t]),a=gn(null);a.current=i;let[l,u]=Sn(!1),[p,c]=Sn(He),m=gn(!1);fn(()=>{if(i)return()=>i.dispose()},[i]);let S=j(()=>{let g=a.current;c(g?g.heldKeys():He)},[]),k=j(()=>{a.current?.clear(),c(He)},[]);fn(()=>{if(!o)return;let g=()=>!!o.pointerLockElement,_=()=>{if(g()){m.current=!1,u(!0);return}m.current||(u(!1),k())},A=b=>{g()&&(a.current?.keyDown(b.key),S())},d=b=>{a.current?.keyUp(b.key),S()},P=b=>{g()&&a.current?.movePointer(b.movementX,b.movementY)},U=b=>{g()&&a.current?.setButtons(b.buttons)},E=()=>{k()};return o.addEventListener("pointerlockchange",_),o.addEventListener("keydown",A),o.addEventListener("keyup",d),o.addEventListener("mousemove",P),o.addEventListener("mousedown",U),o.addEventListener("mouseup",U),o.defaultView?.addEventListener("blur",E),()=>{o.removeEventListener("pointerlockchange",_),o.removeEventListener("keydown",A),o.removeEventListener("keyup",d),o.removeEventListener("mousemove",P),o.removeEventListener("mousedown",U),o.removeEventListener("mouseup",U),o.defaultView?.removeEventListener("blur",E)}},[o,k,S]);let C=j(g=>{g.requestPointerLock?.()},[]),h=j(()=>{m.current=!0,u(!0)},[]),v=j(()=>{m.current=!1,o?.pointerLockElement&&o.exitPointerLock?.(),u(!1),k()},[o,k]),x=j(g=>{a.current?.keyDown(g),S()},[S]),y=j(g=>{a.current?.keyUp(g),S()},[S]),R=j((g,_)=>{a.current?.movePointer(g,_)},[]);return{engage:C,engageTouch:h,release:v,engaged:l,heldKeys:p,pressKey:x,releaseKey:y,movePointer:R}}var hn=new Map;function Rr(n,e,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${n}"): schema must be a valid Zod schema`);hn.set(n,{component:e,schema:r})}function vn(n,e){let r=hn.get(n);if(!r)return{error:`Unknown component: "${n}"`};let t=r.schema.safeParse(e);return t.success?{Component:r.component,validatedProps:t.data}:{error:`Validation failed for "${n}": ${t.error.message}`}}import{Fragment as wr,jsx as Te}from"react/jsx-runtime";function Ur({name:n,props:e,fallback:r}){let t=vn(n,e);if(t.error)return console.warn(`[urun] ComponentRenderer: ${t.error}`),r?Te(wr,{children:r}):Te("div",{className:"urun-component-error",role:"alert",children:Te("span",{className:"urun-component-error-text",children:t.error})});let o=t.Component;return Te(o,{...t.validatedProps})}import{z as pe}from"zod";import{jsx as $e,jsxs as yn}from"react/jsx-runtime";var Er=pe.object({step:pe.number().min(0),total:pe.number().min(1),label:pe.string().optional(),variant:pe.enum(["default","success","error"]).default("default")});function kn(n){let{step:e,total:r,label:t,variant:o="default"}=n,s=Math.min(e/r*100,100),i=e>=r;return{step:e,total:r,label:t,variant:o,percentage:s,isComplete:i}}function Ar(n){let{step:e,total:r,label:t,variant:o,percentage:s}=kn(n);return yn("div",{className:"urun-progress-card","data-variant":o,children:[t&&$e("div",{className:"urun-progress-label",children:t}),$e("div",{className:"urun-progress-bar",children:$e("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),yn("div",{className:"urun-progress-text",children:[e,"/",r]})]})}import{z as je}from"zod";import{jsx as bn,jsxs as Ir}from"react/jsx-runtime";var _r=je.object({state:je.enum(["thinking","generating","idle","error"]),message:je.string().optional()}),Mr={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Cn(n){let{state:e,message:r}=n,t=e==="thinking"||e==="generating",o=r??Mr[e]??e;return{state:e,message:o,isActive:t}}function Nr(n){let{state:e,message:r,isActive:t}=Cn(n);return Ir("span",{className:"urun-status-badge","data-state":e,children:[bn("span",{className:`urun-status-indicator${t?" urun-status-pulse":""}`}),bn("span",{className:"urun-status-message",children:r})]})}import{useRef as Tn,useEffect as Lr}from"react";import{z as Ke}from"zod";import{jsx as Pn,jsxs as qr}from"react/jsx-runtime";var Dr=Ke.object({text:Ke.string(),streaming:Ke.boolean().default(!1)});function xn(n){let{text:e,streaming:r=!1}=n,t=e.length===0;return{text:e,streaming:r,isEmpty:t}}function Or(n){let{text:e,streaming:r}=xn(n),t=Tn(null),o=Tn(0);return Lr(()=>{let s=t.current;s&&e.length!==o.current&&(s.textContent=e,o.current=e.length)},[e]),qr("div",{className:"urun-text-stream",children:[Pn("span",{ref:t,className:"urun-text-content"}),r&&Pn("span",{className:"urun-text-cursor"})]})}import{z as Pe}from"zod";import{jsx as Rn,jsxs as Br}from"react/jsx-runtime";var Wr=Pe.object({src:Pe.string().url(),alt:Pe.string().optional(),caption:Pe.string().optional()});function Un(n){let{src:e,alt:r,caption:t}=n;return{src:e,alt:r??"",caption:t}}function Fr(n){let{src:e,alt:r,caption:t}=Un(n);return Br("figure",{className:"urun-image-frame",children:[Rn("img",{className:"urun-image",src:e,alt:r}),t&&Rn("figcaption",{className:"urun-image-caption",children:t})]})}import{z as K}from"zod";import{jsx as Je,jsxs as $r}from"react/jsx-runtime";var Vr=K.object({metrics:K.array(K.object({label:K.string(),value:K.union([K.string(),K.number()]),unit:K.string().optional()}))});function wn(n){return{metrics:n.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function Hr(n){let{metrics:e}=wn(n);return Je("div",{className:"urun-metrics-panel",children:e.map((r,t)=>$r("div",{className:"urun-metric-card",children:[Je("div",{className:"urun-metric-label",children:r.label}),Je("div",{className:"urun-metric-value",children:r.displayValue})]},t))})}import{forwardRef as Kr,useCallback as oe,useEffect as ze,useImperativeHandle as Jr,useRef as se}from"react";import{observePageLifecycle as zr}from"@urun-sh/core";var xe=null;function jr(){if(typeof window>"u")return null;let n=window;return n.AudioContext??n.webkitAudioContext??null}function Re(){if(xe)return xe;let n=jr();return n?(xe=new n,xe):null}function Ue(){let n=Re();n&&n.state==="suspended"&&n.resume().catch(()=>{})}import{jsx as Gr}from"react/jsx-runtime";var Xr=1e3,En=200;function Xe(...n){console.debug("[urun-audio]",...n)}var Ge=Kr(function(e,r){let{session:t,stream:o="audio",track:s,controls:i=!1,className:a,onTrack:l,onUnlockChange:u,onAudioElement:p}=e,c=se(null),m=se(null),S=se(null),k=se(null),C=se(l);C.current=l;let h=se(u);h.current=u;let v=oe(d=>{S.current!==d&&(S.current=d,h.current?.(d))},[]),x=oe(()=>{if(typeof MediaStream>"u")return null;m.current||(m.current=new MediaStream);let d=c.current;return d&&d.srcObject!==m.current&&(d.srcObject=m.current),m.current},[]),y=oe(d=>{let P=c.current;if(!P)return;let U=P.play();!U||typeof U.then!="function"||U.then(()=>{P.muted||v(!0)}).catch(E=>{let b=E instanceof Error?E.name:String(E);if(b==="AbortError"){Xe(`play() aborted (${d}); retrying in ${En}ms`),k.current&&clearTimeout(k.current),k.current=setTimeout(()=>{k.current=null,y(`${d}:retry`)},En);return}if(b==="NotAllowedError"){Xe(`play() blocked pending a user gesture (${d})`),v(!1);return}Xe(`play() failed (${d})`,E)})},[v]),R=oe(d=>{let P=x();if(P){for(let U of P.getAudioTracks())U!==d&&P.removeTrack(U);d&&!P.getAudioTracks().includes(d)&&P.addTrack(d),d&&y("track-attach"),C.current?.(d)}},[x,y]),g=oe(()=>{let d=c.current;d&&(x(),d.muted=!1,y("gesture"),Ue(),v(!0))},[x,y,v]);Jr(r,()=>({unlock:g,get unlocked(){return S.current===!0},get element(){return c.current}}),[g]);let _=oe(d=>{c.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),x()),p?.(d)},[x,p]),A=s!==void 0;return ze(()=>{if(A){R(s??null);return}if(!t)return;let d=t.stream(o),P=()=>{let f=m.current;return f?f.getAudioTracks()[0]??null:null},U=f=>{if(f!==P()&&(R(f),f)){let w=()=>{P()===f&&R(null)};f.addEventListener("ended",w)}},E=d.track;E&&E.readyState==="live"&&U(E);let b=d.on("track",f=>{f&&f.readyState!=="live"||U(f)}),L=setInterval(()=>{let f=d.track;f&&f.readyState==="live"&&U(f)},Xr);return()=>{b(),clearInterval(L)}},[t,o,A,s,R]),ze(()=>zr(()=>{Ue(),S.current===!0&&y("foreground")}),[y]),ze(()=>()=>{k.current&&clearTimeout(k.current)},[]),Gr("audio",{ref:_,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})});import{forwardRef as Zr,useCallback as ie,useEffect as An,useImperativeHandle as Yr,useRef as B}from"react";import{observePageLifecycle as Qr,sessionFailureFromMediaError as et,sharedCaptureController as nt}from"@urun-sh/core";import{jsx as tt}from"react/jsx-runtime";var _n={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function we(...n){console.debug("[urun-voice]",...n)}var rt=Zr(function(e,r){let{session:t,stream:o="audio",constraints:s=_n,connectTimeoutMs:i,attempts:a=3,retryDelayMs:l=1500,onActiveChange:u,onError:p,onMicStream:c,onTrack:m,onUnlockChange:S,capture:k}=e,C=B(null),h=B(null),v=B(null),x=B([]),y=B(!1),R=B(u);R.current=u;let g=B(p);g.current=p;let _=B(c);_.current=c;let A=ie(f=>{y.current!==f&&(y.current=f,R.current?.(f))},[]),d=ie(()=>{for(let f of x.current)f();x.current=[],v.current?.release(),v.current=null,h.current&&(h.current=null,_.current?.(null))},[]),P=ie(async()=>{let f=v.current;if(f){let D=await f.update(s);return h.current=f.stream,_.current?.(f.stream),D}let I=await(k??nt()).claim("audio",s);v.current=I,x.current=[I.onTrack((D,q)=>{h.current=q,_.current?.(q),y.current&&t.stream(o).attach(D).catch(ae=>we("mic re-attach after one-capture re-acquire failed",ae))}),I.onLost(D=>{v.current=null,x.current=[],h.current=null,_.current?.(null),A(!1),g.current?.(D)})],h.current=I.stream,_.current?.(I.stream);let M=I.track;if(!M)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return M},[k,s,t,o,A]),U=ie(async()=>{d(),A(!1),await t.stream(o).detach().catch(()=>{})},[t,o,d,A]),E=ie(async()=>{C.current?.unlock();let f;try{f=await P()}catch(M){d();let D=et(M,t.status);throw g.current?.(D),D}t.connect?.();let w;for(let M=1;M<=a;M++)try{await t.whenLive(i!==void 0?{timeout:i}:void 0),await t.stream(o).attach(f),A(!0);return}catch(D){w=D,we(`start attempt ${M}/${a} failed`,D),M<a&&await new Promise(q=>setTimeout(q,l))}d(),A(!1);let I=w instanceof Error?w:new Error(String(w??"voice start failed"));throw g.current?.(I),I},[t,o,i,a,l,P,d,A]);Yr(r,()=>({start:E,stop:U,unlock:()=>C.current?.unlock(),get active(){return y.current},get micStream(){return h.current},get audio(){return C.current}}),[E,U]);let b=B(!1),L=ie(async()=>{if(!y.current||b.current)return;let f=h.current?.getAudioTracks()[0]??null;if(f&&f.readyState==="live"){try{await t.stream(o).attach(f)}catch(w){we("foreground mic re-assert failed (will retry on next pass)",w)}return}b.current=!0;try{let w=await P();await t.stream(o).attach(w)}catch(w){let I=w instanceof Error?w:new Error(String(w));we("foreground mic re-acquire failed",I),g.current?.(I)}finally{b.current=!1}},[t,o,P]);return An(()=>{let f=()=>{L()};return typeof t.onRecovery=="function"?t.onRecovery(f):Qr(f)},[t,L]),An(()=>d,[d]),tt(Ge,{ref:C,session:t,stream:o,onTrack:m,onUnlockChange:S})});import{sessionFailureFromMediaError as ot,sharedCaptureController as st}from"@urun-sh/core";import{forwardRef as it,useCallback as V,useEffect as at,useImperativeHandle as ut,useRef as W,useState as ct}from"react";import{jsx as dt,jsxs as pt}from"react/jsx-runtime";var Mn={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Ze(...n){console.debug("[urun-camera]",...n)}var lt=it(function(e,r){let{session:t,stream:o="video",constraints:s,facingMode:i="environment",mirror:a="auto",connectTimeoutMs:l,preview:u=!0,className:p,videoClassName:c,onActiveChange:m,onError:S,onStream:k,onTrack:C,children:h,capture:v}=e,x=W(null),y=W(null),R=W(null),g=W([]),_=W(null),A=W(!1),d=W(i),[P,U]=ct(i),E=W(m);E.current=m;let b=W(S);b.current=S;let L=W(k);L.current=k;let f=W(C);f.current=C;let w=V(T=>{A.current!==T&&(A.current=T,E.current?.(T))},[]),I=V(T=>{let N=x.current;N&&(N.muted=!0,N.srcObject=T,T&&N.play()?.catch?.(O=>Ze("preview play() failed",O)))},[]),M=V(()=>{_.current?.(),_.current=null;for(let T of g.current)T();g.current=[],R.current?.release(),R.current=null,y.current&&(y.current=null,L.current?.(null),f.current?.(null)),I(null)},[I]),D=V((T,N)=>{_.current?.(),y.current=N,I(N),L.current?.(N);let O=()=>{y.current===N&&(Ze("camera track ended (device removed or permission revoked)"),M(),w(!1))};T.addEventListener("ended",O),_.current=()=>T.removeEventListener("ended",O)},[I,M,w]),q=V(async T=>{let N={...Mn,...s,facingMode:T},O;try{let H=R.current;if(H)O=await H.update(N);else{let ce=await(v??st()).claim("video",N);if(R.current=ce,g.current=[ce.onTrack((le,$n)=>{D(le,$n),A.current&&t.stream(o).attachVideo(le).then(()=>f.current?.(le)).catch(jn=>Ze("camera re-publish after one-capture re-acquire failed",jn))}),ce.onLost(le=>{R.current=null,g.current=[],M(),w(!1),b.current?.(le)})],!ce.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});O=ce.track}}catch(H){let Q=ot(H,t.status);throw b.current?.(Q),Q}d.current=T,U(T),D(O,R.current?.stream??new MediaStream([O]));try{t.connect?.(),await t.whenLive(l!==void 0?{timeout:l}:void 0),await t.stream(o).attachVideo(O)}catch(H){M(),w(!1);let Q=H instanceof Error?H:new Error(String(H));throw b.current?.(Q),Q}f.current?.(O),w(!0)},[t,o,s,l,v,D,M,w]),ae=V(T=>q(T?.facingMode??d.current),[q]),he=V(async T=>{A.current&&d.current===T||await q(T)},[q]),ve=V(()=>q(d.current==="environment"?"user":"environment"),[q]),Y=V(async()=>{M(),w(!1),await t.stream(o).detachVideo().catch(()=>{})},[t,o,M,w]);return ut(r,()=>({start:ae,stop:Y,flip:ve,setFacingMode:he,get active(){return A.current},get facingMode(){return d.current},get stream(){return y.current},get element(){return x.current}}),[ae,Y,ve,he]),at(()=>M,[M]),u?pt("div",{className:p,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":P,children:[dt("video",{ref:x,className:c,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...(a==="auto"?P==="user":a)?{transform:"scaleX(-1)"}:{}}}),h]}):null});import{useEffect as mt,useState as ft}from"react";var Ye={level:0,speaking:!1};function gt(n,e={}){let{fftSize:r=512,intervalMs:t=100,speakingThreshold:o=.02}=e,[s,i]=ft(Ye);return mt(()=>{if(!n){i(Ye);return}let a=Re();if(!a||typeof MediaStream>"u")return;let l;n instanceof MediaStream?l=n:(l=new MediaStream,l.addTrack(n));let u,p;try{u=a.createMediaStreamSource(l),p=a.createAnalyser(),p.fftSize=r,u.connect(p)}catch{return}let c=new Uint8Array(p.fftSize),S=setInterval(()=>{p.getByteTimeDomainData(c);let k=0;for(let h=0;h<c.length;h++){let v=(c[h]-128)/128;k+=v*v}let C=Math.sqrt(k/c.length);i(h=>{let v=C>o;return Math.abs(h.level-C)<.005&&h.speaking===v?h:{level:C,speaking:v}})},t);return()=>{clearInterval(S),u.disconnect(),i(Ye)}},[n,r,t,o]),s}import{useEffect as St,useState as ht}from"react";function vt(n,e){let[r,t]=ht(null);return St(()=>{if(!n||!e){t(null);return}let o=n.stream(e);return t(o.track),o.on("track",t)},[n,e]),r}import{useCallback as Pt}from"react";import{useEffect as Ct,useMemo as Tt}from"react";import{createStore as yt}from"zustand/vanilla";import{useStore as kt}from"zustand";var bt=()=>{};function Qe(n,e={}){let r=u=>{n?.set(u)},t=()=>n?n.get()??{}:{},o=yt(()=>({doc:t(),synced:n?n.synced:!1,set:r})),s=null,i=()=>{if(s){for(let u of s)u();s=null}},a=()=>n?(s||(o.setState({doc:t(),synced:n.synced}),s=[n.on("change",u=>o.setState({doc:u})),n.onSynced(()=>o.setState({synced:!0}))]),i):bt,l=(u=>kt(o,u));return Object.assign(l,{getState:o.getState,getInitialState:o.getInitialState,subscribe:o.subscribe,set:r,bind:a,unbind:i}),e.bind!==!1&&a(),l}function me(n,e){let r=Tt(()=>Qe(n&&e?n.doc(e):null,{bind:!1}),[n,e]);return Ct(()=>r.bind(),[r]),r}function xt(n,e,r){let o=me(n,e)(r??(a=>a)),s=Pt(a=>{n&&e&&n.doc(e).set(a)},[n,e]);if(r)return o;let i=o;return{snapshot:n&&e?i.doc:null,synced:i.synced,set:s}}import{useEffect as Rt,useState as Ut}from"react";var X=200;function J(n,e,r=200){let t=[...n,e];return t.length>r?t.slice(t.length-r):t}function fe(n){if(typeof n=="string")return n;try{return JSON.stringify(n)}catch{return String(n)}}function en(n){let e=n.trim();if(!e)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(e)}catch(t){return{ok:!1,error:t instanceof Error?t.message:"Invalid JSON."}}return r===null||typeof r!="object"||Array.isArray(r)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:r}}function nn(n,e,r={}){let t=r.cap??200,[o,s]=Ut([]);return Rt(()=>{if(s([]),!n||!e)return;let i=!0,a=n.stream(e).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let l=await a.next();if(!i||l.done)break;s(u=>J(u,{at:Date.now(),payload:l.value},t))}})(),()=>{i=!1,a.return?.()}},[n,e,t]),o}import{jsx as Ee,jsxs as ge}from"react/jsx-runtime";function wt({session:n,name:e,cap:r,className:t}){let o=nn(n,e,{cap:r});return ge("div",{className:["urun-stream-tail",t].filter(Boolean).join(" "),children:[ge("div",{className:"urun-stream-tail-meta",children:[Ee("code",{children:e}),ge("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),Ee("div",{className:"urun-stream-tail-log",children:o.length===0?ge("span",{className:"urun-stream-tail-empty",children:["Waiting for ",Ee("code",{children:e})," messages\u2026"]}):o.map((s,i)=>ge("div",{className:"urun-stream-tail-line",children:[Ee("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",fe(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as Et,useState as Nn}from"react";import{jsx as G,jsxs as Ae}from"react/jsx-runtime";function _e({placeholder:n,buttonLabel:e,disabled:r,onApply:t}){let[o,s]=Nn(""),[i,a]=Nn(null),l=Et(()=>{let u=en(o);if(!u.ok){a(u.error);return}a(null),t(u.value,o.trim()),s("")},[o,t]);return Ae("div",{className:"urun-doc-patch",children:[G("textarea",{className:"urun-doc-patch-input",value:o,onChange:u=>s(u.target.value),placeholder:n,rows:3}),Ae("div",{className:"urun-doc-patch-actions",children:[G("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!o.trim(),onClick:l,children:e}),i?G("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function At({session:n,docKey:e,editable:r=!0,patchPlaceholder:t='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=me(n,e),i=s(u=>u.doc),a=s(u=>u.synced),l=s(u=>u.set);return Ae("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[Ae("div",{className:"urun-doc-panel-meta",children:[G("code",{children:e}),G("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),G("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?G(_e,{placeholder:t,buttonLabel:"Apply patch",disabled:!n,onApply:u=>l(u)}):null]})}import{useEffect as _t,useState as Mt}from"react";import{jsx as Se,jsxs as Ln}from"react/jsx-runtime";function In(n,e=600){return n.length>e?`${n.slice(0,e)}\u2026`:n}function Nt({session:n,docKey:e="control",cap:r=200,className:t}){let[o,s]=Mt([]);return _t(()=>(s([]),n?n.doc(e).on("change",a=>{s(l=>J(l,{at:Date.now(),direction:"in",text:In(fe(a))},r))}):void 0),[n,e,r]),Ln("div",{className:["urun-control-sender",t].filter(Boolean).join(" "),children:[Se(_e,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${e}`,disabled:!n,onApply:(i,a)=>{n?.doc(e).set(i),s(l=>J(l,{at:Date.now(),direction:"out",text:In(a)},r))}}),Se("div",{className:"urun-control-sender-log",children:o.length===0?Se("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((i,a)=>Ln("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[Se("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",Se("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}import{useEffect as It,useState as Lt}from"react";import{jsx as Me,jsxs as Ot}from"react/jsx-runtime";function Dt({session:n,trackNames:e=["video","audio"],docKeys:r=["control"],cap:t=200,className:o}){let[s,i]=Lt([]),a=e.join(","),l=r.join(",");return It(()=>{if(i([]),!n)return;let u=(c,m)=>i(S=>J(S,{at:Date.now(),kind:c,text:m},t)),p=[];p.push(n.onPhase(c=>u("phase",`phase \u2192 ${c.name}`)));for(let c of e){let m=n.stream(c);p.push(m.on("track",S=>u("track",`${c}: ${S?"track arrived":"track ended"}`)))}for(let c of r){let m=n.doc(c);p.push(m.on("change",()=>u("doc",`${c} changed`)))}return()=>p.forEach(c=>c())},[n,a,l,t]),Me("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:s.length===0?Me("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((u,p)=>Ot("div",{className:"urun-event-spine-line","data-kind":u.kind,children:[Me("span",{className:"urun-event-spine-kind",children:u.kind})," ",Me("span",{className:"urun-event-spine-time",children:new Date(u.at).toLocaleTimeString()})," ",u.text]},`${u.at}-${p}`))})}import{describeSessionPhase as Kt,isWakingPhase as Jt}from"@urun-sh/core";import{useEffect as qt,useState as Wt}from"react";function F(n){let[e,r]=Wt(n?.phase??null);return qt(()=>{if(!n){r(null);return}return n.onPhase(r)},[n]),e}import{describeSessionPhase as $t}from"@urun-sh/core";import{useEffect as Ft,useRef as Bt,useState as Vt}from"react";import{isWakingPhase as Ht}from"@urun-sh/core";function rn(n){let e=F(n),r=Ht(e?.name),t=Bt(void 0);r?t.current??=Date.now():t.current=void 0;let o=r?e?.wakingSince??t.current:void 0,s=()=>o!==void 0?Math.max(0,Math.floor((Date.now()-o)/1e3)):0,[i,a]=Vt(s);return Ft(()=>{if(o===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-o)/1e3)));let l=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-o)/1e3)))},1e3);return()=>clearInterval(l)},[o]),{waking:r,phase:e,state:r?e?.runtime?.state:void 0,reason:r?e?.runtime?.reason:void 0,since:o,seconds:r?i:0}}import{Fragment as jt,jsx as Dn,jsxs as On}from"react/jsx-runtime";function tn({session:n,render:e,className:r}){let t=rn(n);return!t.waking||!t.phase?null:Dn("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":t.phase.name,"data-runtime-state":t.state,children:e?e(t):On(jt,{children:[Dn("span",{className:"urun-session-waking-label",children:$t(t.phase)})," ",On("span",{className:"urun-session-waking-elapsed",children:["(",t.seconds,"s)"]})]})})}import{jsx as Z,jsxs as qn}from"react/jsx-runtime";var zt={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function Xt({session:n,className:e}){let r=F(n),t=r?.name??"idle",o=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime?.reason??null;return qn("span",{className:["urun-session-status",e].filter(Boolean).join(" "),"data-phase":t,children:[Z("span",{className:"urun-session-status-dot","data-phase":t}),Z("span",{className:"urun-session-status-label",children:zt[t]}),o?Z("span",{className:"urun-session-status-detail",children:o}):null]})}function Gt({session:n,children:e,fallback:r,onStartOver:t,className:o}){let s=F(n);if(s?.name==="live")return Z("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:e});let i=r?r(s):Z("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&Jt(s.name)?Z(tn,{session:n}):s&&s.name!=="idle"?Kt(s):"Waiting for a live session\u2026"}),a=t!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return qn("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:[i,a?Z("button",{type:"button",className:"urun-session-gate-start-over",onClick:t,children:"Start over"}):null]})}import{useEffect as Zt,useState as Yt}from"react";import{jsx as no}from"react/jsx-runtime";function Wn(n){return F(n)?.endsAt??null}function Qt(n){let e=Math.max(0,Math.floor(n/1e3)),r=Math.floor(e/60),t=e%60;return`${String(r).padStart(2,"0")}:${String(t).padStart(2,"0")}`}function eo({session:n,urgentMs:e=6e4,className:r}){let o=Wn(n)?.getTime()??null,[s,i]=Yt(()=>o===null?null:Math.max(0,o-Date.now()));if(Zt(()=>{if(o===null){i(null);return}let l=()=>i(Math.max(0,o-Date.now()));l();let u=setInterval(l,1e3);return()=>clearInterval(u)},[o]),s===null)return null;let a=Qt(s);return no("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<e?"":void 0,"data-expired":s<=0?"":void 0,children:a})}import{jsx as Fn,jsxs as oo}from"react/jsx-runtime";var ro=new Set(["expired","ended","error"]);function to({session:n,onNewSession:e,children:r,className:t}){let o=F(n);if(!o||!ro.has(o.name))return null;let s=r?r(o):Fn("span",{className:"urun-session-ended-copy",children:o.name==="expired"?"Session ended \u2014 start a new session":o.name==="error"?`Session failed${o.error?.reason?` \u2014 ${o.error.reason}`:""}.`:"Session ended."});return oo("div",{className:["urun-session-ended",t].filter(Boolean).join(" "),"data-phase":o.name,children:[s,e?Fn("button",{type:"button",className:"urun-session-ended-new",onClick:e,children:"New session"}):null]})}import{useEffect as Bn,useMemo as so,useState as Vn}from"react";import{jsx as Ne,jsxs as uo}from"react/jsx-runtime";function on(n){if(!n||typeof n!="object"||Array.isArray(n))return null;let e=n;return e.warning!==!0?null:{warning:!0,deadlineEpochS:typeof e.deadline_epoch_s=="number"?e.deadline_epoch_s:null,idleSinceEpochS:typeof e.idle_since_epoch_s=="number"?e.idle_since_epoch_s:null}}function Hn(n){let e=so(()=>n?n.doc("control"):null,[n]),[r,t]=Vn(()=>e?on(e.get("idle")):null);return Bn(()=>{if(!e){t(null);return}return t(on(e.get("idle"))),e.on("change",()=>t(on(e.get("idle"))))},[e]),r}function io(n){let e=Math.max(0,Math.floor(n));return`${Math.floor(e/60)}:${String(e%60).padStart(2,"0")}`}function ao({session:n,onStillHere:e,className:r}){let t=Hn(n),o=t?.deadlineEpochS??null,[s,i]=Vn(null);if(Bn(()=>{if(o===null){i(null);return}let l=()=>i(Math.max(0,o-Date.now()/1e3));l();let u=setInterval(l,1e3);return()=>clearInterval(u)},[o]),!t||!n)return null;let a=()=>{n.touch?.(),e?.()};return Ne("div",{className:["urun-idle-warning",r].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:uo("div",{className:"urun-idle-warning-card",children:[Ne("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),Ne("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${io(s)} due to inactivity.`:"This session will end soon due to inactivity."}),Ne("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}import{useContext as co,useEffect as lo,useState as po}from"react";import{prewake as mo}from"@urun-sh/core";function fo(n){let e=co(ee),[r,t]=po(null),o=n.app??e?.appId,s=n.function,i=n.intervalS??60,a=e?.baseUrl,l=e?.orgId,u=e?.jwt,p=e?.getAccessToken,c=e?.authProvider;return lo(()=>{if(!a||!l||!o||!s)return;let m=!1,S=()=>{mo({baseUrl:a,app:o,functionName:s,orgId:l,jwt:u,getAccessToken:p,authProvider:c}).then(C=>{m||t(C)}).catch(()=>{})};S();let k=setInterval(S,Math.max(1,i)*1e3);return()=>{m=!0,clearInterval(k)}},[o,s,i,a,l,u,p,c]),r}import{describeSessionPhase as Pa,isWakingPhase as xa}from"@urun-sh/core";export{Ur as ComponentRenderer,Mn as DEFAULT_CAMERA_CONSTRAINTS,X as DEFAULT_LOG_CAP,_n as DEFAULT_VOICE_CONSTRAINTS,_e as DocPatchForm,Fr as ImageFrame,Wr as ImageFrameSchema,Hr as MetricsPanel,Vr as MetricsPanelSchema,Ar as ProgressCard,Er as ProgressCardSchema,Nr as StatusBadge,_r as StatusBadgeSchema,Or as TextStream,Dr as TextStreamSchema,Ge as UrunAudio,Kn as UrunAuthProvider,lt as UrunCamera,Nt as UrunControlSender,At as UrunDocPanel,de as UrunErrorBoundary,Dt as UrunEventSpine,ao as UrunIdleWarning,Jn as UrunJwtProvider,nr as UrunProvider,eo as UrunSessionClock,to as UrunSessionEnded,Gt as UrunSessionGate,Xt as UrunSessionStatus,tn as UrunSessionWaking,wt as UrunStreamTail,rt as UrunVoice,ye as authMode,Qe as createDocStore,Pa as describeSessionPhase,fe as formatPayload,Re as getUrunAudioContext,xa as isWakingPhase,en as parseJsonObject,J as pushCapped,Rr as registerComponent,Ue as resumeUrunAudioContext,$ as urunPublicEnv,ur as useApp,kr as useChat,Sr as useCompletion,me as useDocStore,Un as useImageFrame,xr as useInputPresence,wn as useMetricsPanel,kn as useProgressCard,pr as useRequest,xt as useSessionDoc,Wn as useSessionEndsAt,Hn as useSessionIdle,F as useSessionPhase,vt as useSessionTrack,rn as useSessionWake,Cn as useStatusBadge,nn as useStreamMessages,xn as useTextStream,gt as useUrunAudioLevel,Ie as useUrunAuth,fo as useUrunPrewake,Zn as usesWorkOSAuth};
|
|
2
|
+
import{a as ct,b as lt,c as He}from"./chunk-WF2OBDSX.mjs";import{useEffect as gt,useMemo as ht,useState as St}from"react";import{Component as dt}from"react";import{jsx as vn,jsxs as pt}from"react/jsx-runtime";var Se=class extends dt{constructor(n){super(n),this.state={error:null}}static getDerivedStateFromError(n){return{error:n}}componentDidCatch(n,t){console.error("[urun] Error caught by UrunErrorBoundary:",n,t)}render(){if(this.state.error){let{fallback:n}=this.props;return typeof n=="function"?n(this.state.error):n||pt("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[vn("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),vn("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as mt}from"react";var ue=mt(null);function ee(e){return e&&e.trim()?e.trim():void 0}function X(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return ee(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return ee(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return ee(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return ee(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return ee(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return ee(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return ee(typeof process<"u"?process.env?.[e]:void 0)}}function Re(){let e=X("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||X("VERCEL_ENV")==="production"?"workos":X("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function ft(){return Re()==="workos"}import{jsx as $e}from"react/jsx-runtime";function vt({baseUrl:e,orgId:n,appId:t,jwt:r,authProvider:o,fallback:s,children:i}){let[a,l]=St(),u=He(),p=X("NEXT_PUBLIC_SESSION_TOKEN")??X("NEXT_PUBLIC_URUN_JWT"),c=Re(),m=c==="workos"&&!r,h=r??(c==="jwt"?p:void 0)??a,y=o??X("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),C=m&&!h,S=ht(()=>({appId:t,baseUrl:e,orgId:n,jwt:h,getAccessToken:m?u?.getAccessToken:void 0,authProvider:y}),[t,u,e,y,h,n,m]);return gt(()=>{if(!m||!u)return;let v=!1,x=u;async function k(){try{let g=await x.getAccessToken();v||l(g??void 0)}catch{v||l(void 0)}}k();let U=window.setInterval(()=>{k()},6e4);return()=>{v=!0,window.clearInterval(U)}},[u,m]),$e(Se,{fallback:s,children:C?$e("div",{role:"status","aria-live":"polite",children:"Signing in..."}):$e(ue.Provider,{value:S,children:i})})}import{useContext as yt,useEffect as kt,useMemo as yn,useReducer as bt,useRef as kn}from"react";import{App as Ct}from"@urun-sh/core";function Tt(e,n){return`${e}:${JSON.stringify(n??{})}`}function Pt(e,n,t){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,fnName:n,args:t??{}})}var ce=new Map;var je=class{constructor(n,t){this._doc=n;this._notify=t;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(n,t){return this._doc.get(n,t)}set(n){this._doc.set(n),this._notify()}on(n,t){return this._doc.on(n,r=>t(r))}get synced(){return this._doc.synced}onSynced(n){return this._doc.onSynced(()=>{n(),this._notify()})}text(n){let t=this._doc.text(n),r=this._notify;return{append(o){t.append(o),r()},toString:()=>t.toString(),get length(){return t.length},on:(o,s)=>t.on(o,i=>{s(i),r()})}}dispose(){this._unsubscribeChange()}},Ke=class{constructor(n,t){this._stream=n;this._notify=t;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(n){return this._stream.attach(n)}attachVideo(n){return this._stream.attachVideo(n)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(n){return this._stream.seek(n)}chunks(n){return this._stream.chunks(n)}onSeeked(n){return this._stream.onSeeked(n)}on(n,t){return this._stream.on(n,t)}messages(){return this._stream.messages()}emit(n,t){return this._stream.emit(n,t)}dispose(){this._unsubscribeTrack()}},Je=class{constructor(n,t){this._session=n;this._notifiers.add(t),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll())}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}addNotifier(n){this._notifiers.add(n)}removeNotifier(n){this._notifiers.delete(n)}_notifyAll(){for(let n of this._notifiers)n()}get id(){return this._session.id}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(n){return this._session.onPhase(n)}whenLive(n){return this._session.whenLive(n)}recover(){this._session.recover()}onRecovery(n){return this._session.onRecovery(n)}request(n,t){return this._session.request(n,t)}requestStream(n,t){return this._session.requestStream(n,t)}complete(n,t){return this._session.complete(n,t)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(n){let t=this._docs.get(n);return t||(t=new je(this._session.doc(n),()=>this._notifyAll()),this._docs.set(n,t)),t}stream(n){let t=this._streams.get(n);return t||(t=new Ke(this._session.stream(n),()=>this._notifyAll()),this._streams.set(n,t)),t}disconnect(){this._disposed=!0;for(let n of this._docs.values())n.dispose();for(let n of this._streams.values())n.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._session.disconnect(),this._notifyAll(),this._notifiers.clear()}};function xt(){let e=yt(ue);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,n]=bt(s=>s+1,0),t=kn(new Map),r=kn(new Map),o=yn(()=>Ct(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider]);return kt(()=>()=>{for(let[s,i]of r.current){let a=ce.get(s);a===i&&(a.handle.removeNotifier(n),a.refCount=Math.max(0,a.refCount-1),a.refCount===0&&(a.disposeTimer=setTimeout(()=>{let l=ce.get(s);!l||l.refCount!==0||(ce.delete(s),l.handle.disconnect())},0)))}r.current.clear(),t.current.clear()},[]),yn(()=>new Proxy({},{get(s,i){if(typeof i=="string")return a=>{let l=Tt(i,a),u=t.current.get(l);if(u&&!u.disposed)return u;let p=Pt(e,i,a),c=ce.get(p);return c?.handle.disposed&&(c.disposeTimer&&clearTimeout(c.disposeTimer),ce.delete(p),r.current.get(p)===c&&r.current.delete(p),c=void 0),c?c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null):(c={handle:new Je(o[i](a),n),refCount:0,disposeTimer:null},ce.set(p,c)),r.current.get(p)!==c&&(r.current.set(p,c),c.handle.addNotifier(n),c.refCount+=1),t.current.set(l,c.handle),c.handle}}}),[e,o])}import{useCallback as ze,useEffect as Rt,useMemo as Ut,useRef as Ue,useState as Xe}from"react";function le(e){let n=e;if(!n||typeof n.request!="function"||typeof n.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return n}function wt(e){return e instanceof Error?e:new Error(String(e))}function Et(e,n){let t=Ut(()=>le(e),[e]),[r,o]=Xe(void 0),[s,i]=Xe(null),[a,l]=Xe(!1),u=Ue(n);u.current=n;let p=Ue(0),c=Ue(null),m=Ue(!0);Rt(()=>(m.current=!0,()=>{m.current=!1,c.current?.abort()}),[]);let h=ze(async S=>{c.current?.abort();let v=new AbortController;c.current=v;let x=++p.current,k=()=>m.current&&p.current===x;k()&&(l(!0),i(null));try{let U=await t.request(S,{...u.current,signal:v.signal});return k()&&(o(U),l(!1),u.current?.onSuccess?.(U)),U}catch(U){let g=wt(U);throw k()&&(i(g),l(!1),u.current?.onError?.(g)),g}},[t]),y=ze(S=>{h(S).catch(()=>{})},[h]),C=ze(()=>{p.current++,c.current?.abort(),c.current=null,o(void 0),i(null),l(!1)},[]);return{mutate:y,mutateAsync:h,data:r,error:s,isPending:a,reset:C}}import{useCallback as bn,useEffect as At,useMemo as Mt,useRef as we,useState as Ge}from"react";function Cn(e){return e instanceof Error?e:new Error(String(e))}var _t=e=>typeof e=="string"?e:String(e);function Nt(e,n){let t=Mt(()=>le(e),[e]),[r,o]=Ge(""),[s,i]=Ge(!1),[a,l]=Ge(null),u=we(n);u.current=n;let p=we(0),c=we(null),m=we(!0);At(()=>(m.current=!0,()=>{m.current=!1,c.current?.cancel(),c.current=null}),[]);let h=bn(()=>{p.current++,c.current?.cancel(),c.current=null,m.current&&i(!1)},[]),y=bn(async C=>{c.current?.cancel();let S=++p.current,v=()=>m.current&&p.current===S,x=u.current,k=x?.parseChunk??_t,U=x?.buildPayload??(T=>({prompt:T}));v()&&(o(""),l(null),i(!0));let{parseChunk:g,buildPayload:A,onFinish:E,onError:d,...b}=x??{},P="",R;try{R=t.requestStream(U(C),b),c.current=R}catch(T){let q=Cn(T);v()&&(l(q),i(!1),x?.onError?.(q));return}try{for await(let T of R){if(p.current!==S)break;P+=k(T),v()&&o(P)}v()&&(i(!1),x?.onFinish?.(P))}catch(T){let q=Cn(T);v()&&(l(q),i(!1),x?.onError?.(q))}finally{c.current===R&&(c.current=null)}},[t]);return{completion:r,complete:y,stop:h,isStreaming:s,error:a}}import{useCallback as Tn,useEffect as It,useMemo as Dt,useRef as de,useState as Ee}from"react";function Pn(e){return e instanceof Error?e:new Error(String(e))}var Lt=e=>typeof e=="string"?e:String(e),xn=0;function Ze(e){return xn+=1,`${e}-${xn}`}function Ot(e,n){let t=Dt(()=>le(e),[e]),[r,o]=Ee(()=>(n?.initialMessages??[]).map(k=>({id:k.id??Ze("msg"),role:k.role,content:k.content}))),[s,i]=Ee(""),[a,l]=Ee(!1),[u,p]=Ee(null),c=de(n);c.current=n;let m=de(r);m.current=r;let h=de(s);h.current=s;let y=de(0),C=de(null),S=de(!0);It(()=>(S.current=!0,()=>{S.current=!1,C.current?.cancel(),C.current=null}),[]);let v=Tn(()=>{y.current++,C.current?.cancel(),C.current=null,S.current&&l(!1)},[]),x=Tn(async k=>{let U=k===void 0,g=(U?h.current:k)??"";if(!g.trim())return;C.current?.cancel();let E=++y.current,d=()=>S.current&&y.current===E,b=c.current,P=b?.parseChunk??Lt,R={id:Ze("msg"),role:"user",content:g},T={id:Ze("msg"),role:"assistant",content:""},q=[...m.current,R].map(L=>({role:L.role,content:L.content})),f=[...m.current,R,T];m.current=f,o(f),U&&i(""),p(null),l(!0);let _=b?.buildPayload??(L=>({messages:L})),{initialMessages:D,parseChunk:W,buildPayload:N,onFinish:J,onError:Pe,...xe}=b??{},se=L=>{o(I=>I.map(z=>z.id===T.id?{...z,content:L}:z))},Q="",H;try{H=t.requestStream(_(q),xe),C.current=H}catch(L){let I=Pn(L);d()&&(p(I),l(!1),b?.onError?.(I));return}try{for await(let L of H){if(y.current!==E)break;Q+=P(L),d()&&se(Q)}d()&&(l(!1),b?.onFinish?.({...T,content:Q}))}catch(L){let I=Pn(L);d()&&(p(I),l(!1),b?.onError?.(I))}finally{C.current===H&&(C.current=null)}},[t]);return{messages:r,input:s,setInput:i,sendMessage:x,stop:v,isStreaming:a,error:u}}import{useCallback as G,useEffect as Rn,useMemo as qt,useRef as Un,useState as wn}from"react";import{createInputPresencePublisher as Wt,INPUT_PRESENCE_DEFAULT_HZ as Ft,INPUT_PRESENCE_FIELD as Bt}from"@urun-sh/core";var Ye=[];function Vt(e,n={}){let{field:t=Bt,hz:r=Ft}=n,o=n.documentTarget!==void 0?n.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=qt(()=>s?Wt({awareness:{setLocalStateField:(g,A)=>s.setField(g,A)},field:t,hz:r}):null,[s,t,r]),a=Un(null);a.current=i;let[l,u]=wn(!1),[p,c]=wn(Ye),m=Un(!1);Rn(()=>{if(i)return()=>i.dispose()},[i]);let h=G(()=>{let g=a.current;c(g?g.heldKeys():Ye)},[]),y=G(()=>{a.current?.clear(),c(Ye)},[]);Rn(()=>{if(!o)return;let g=()=>!!o.pointerLockElement,A=()=>{if(g()){m.current=!1,u(!0);return}m.current||(u(!1),y())},E=T=>{g()&&(a.current?.keyDown(T.key),h())},d=T=>{a.current?.keyUp(T.key),h()},b=T=>{g()&&a.current?.movePointer(T.movementX,T.movementY)},P=T=>{g()&&a.current?.setButtons(T.buttons)},R=()=>{y()};return o.addEventListener("pointerlockchange",A),o.addEventListener("keydown",E),o.addEventListener("keyup",d),o.addEventListener("mousemove",b),o.addEventListener("mousedown",P),o.addEventListener("mouseup",P),o.defaultView?.addEventListener("blur",R),()=>{o.removeEventListener("pointerlockchange",A),o.removeEventListener("keydown",E),o.removeEventListener("keyup",d),o.removeEventListener("mousemove",b),o.removeEventListener("mousedown",P),o.removeEventListener("mouseup",P),o.defaultView?.removeEventListener("blur",R)}},[o,y,h]);let C=G(g=>{g.requestPointerLock?.()},[]),S=G(()=>{m.current=!0,u(!0)},[]),v=G(()=>{m.current=!1,o?.pointerLockElement&&o.exitPointerLock?.(),u(!1),y()},[o,y]),x=G(g=>{a.current?.keyDown(g),h()},[h]),k=G(g=>{a.current?.keyUp(g),h()},[h]),U=G((g,A)=>{a.current?.movePointer(g,A)},[]);return{engage:C,engageTouch:S,release:v,engaged:l,heldKeys:p,pressKey:x,releaseKey:k,movePointer:U}}var En=new Map;function Ht(e,n,t){if(!t||typeof t.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);En.set(e,{component:n,schema:t})}function An(e,n){let t=En.get(e);if(!t)return{error:`Unknown component: "${e}"`};let r=t.schema.safeParse(n);return r.success?{Component:t.component,validatedProps:r.data}:{error:`Validation failed for "${e}": ${r.error.message}`}}import{Fragment as jt,jsx as Ae}from"react/jsx-runtime";function $t({name:e,props:n,fallback:t}){let r=An(e,n);if(r.error)return console.warn(`[urun] ComponentRenderer: ${r.error}`),t?Ae(jt,{children:t}):Ae("div",{className:"urun-component-error",role:"alert",children:Ae("span",{className:"urun-component-error-text",children:r.error})});let o=r.Component;return Ae(o,{...r.validatedProps})}import{z as ve}from"zod";import{jsx as Qe,jsxs as Mn}from"react/jsx-runtime";var Kt=ve.object({step:ve.number().min(0),total:ve.number().min(1),label:ve.string().optional(),variant:ve.enum(["default","success","error"]).default("default")});function _n(e){let{step:n,total:t,label:r,variant:o="default"}=e,s=Math.min(n/t*100,100),i=n>=t;return{step:n,total:t,label:r,variant:o,percentage:s,isComplete:i}}function Jt(e){let{step:n,total:t,label:r,variant:o,percentage:s}=_n(e);return Mn("div",{className:"urun-progress-card","data-variant":o,children:[r&&Qe("div",{className:"urun-progress-label",children:r}),Qe("div",{className:"urun-progress-bar",children:Qe("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),Mn("div",{className:"urun-progress-text",children:[n,"/",t]})]})}import{z as en}from"zod";import{jsx as Nn,jsxs as Zt}from"react/jsx-runtime";var zt=en.object({state:en.enum(["thinking","generating","idle","error"]),message:en.string().optional()}),Xt={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function In(e){let{state:n,message:t}=e,r=n==="thinking"||n==="generating",o=t??Xt[n]??n;return{state:n,message:o,isActive:r}}function Gt(e){let{state:n,message:t,isActive:r}=In(e);return Zt("span",{className:"urun-status-badge","data-state":n,children:[Nn("span",{className:`urun-status-indicator${r?" urun-status-pulse":""}`}),Nn("span",{className:"urun-status-message",children:t})]})}import{useRef as Dn,useEffect as Yt}from"react";import{z as nn}from"zod";import{jsx as Ln,jsxs as nr}from"react/jsx-runtime";var Qt=nn.object({text:nn.string(),streaming:nn.boolean().default(!1)});function On(e){let{text:n,streaming:t=!1}=e,r=n.length===0;return{text:n,streaming:t,isEmpty:r}}function er(e){let{text:n,streaming:t}=On(e),r=Dn(null),o=Dn(0);return Yt(()=>{let s=r.current;s&&n.length!==o.current&&(s.textContent=n,o.current=n.length)},[n]),nr("div",{className:"urun-text-stream",children:[Ln("span",{ref:r,className:"urun-text-content"}),t&&Ln("span",{className:"urun-text-cursor"})]})}import{z as Me}from"zod";import{jsx as qn,jsxs as or}from"react/jsx-runtime";var tr=Me.object({src:Me.string().url(),alt:Me.string().optional(),caption:Me.string().optional()});function Wn(e){let{src:n,alt:t,caption:r}=e;return{src:n,alt:t??"",caption:r}}function rr(e){let{src:n,alt:t,caption:r}=Wn(e);return or("figure",{className:"urun-image-frame",children:[qn("img",{className:"urun-image",src:n,alt:t}),r&&qn("figcaption",{className:"urun-image-caption",children:r})]})}import{z as Z}from"zod";import{jsx as tn,jsxs as ar}from"react/jsx-runtime";var sr=Z.object({metrics:Z.array(Z.object({label:Z.string(),value:Z.union([Z.string(),Z.number()]),unit:Z.string().optional()}))});function Fn(e){return{metrics:e.metrics.map(t=>({...t,displayValue:t.unit?`${t.value} ${t.unit}`:String(t.value)}))}}function ir(e){let{metrics:n}=Fn(e);return tn("div",{className:"urun-metrics-panel",children:n.map((t,r)=>ar("div",{className:"urun-metric-card",children:[tn("div",{className:"urun-metric-label",children:t.label}),tn("div",{className:"urun-metric-value",children:t.displayValue})]},r))})}import{forwardRef as cr,useCallback as pe,useEffect as rn,useImperativeHandle as lr,useRef as me}from"react";import{observePageLifecycle as dr}from"@urun-sh/core";var _e=null;function ur(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function Ne(){if(_e)return _e;let e=ur();return e?(_e=new e,_e):null}function Ie(){let e=Ne();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{jsx as mr}from"react/jsx-runtime";var pr=1e3,Bn=200;function on(...e){console.debug("[urun-audio]",...e)}var sn=cr(function(n,t){let{session:r,stream:o="audio",track:s,controls:i=!1,className:a,onTrack:l,onUnlockChange:u,onAudioElement:p}=n,c=me(null),m=me(null),h=me(null),y=me(null),C=me(l);C.current=l;let S=me(u);S.current=u;let v=pe(d=>{h.current!==d&&(h.current=d,S.current?.(d))},[]),x=pe(()=>{if(typeof MediaStream>"u")return null;m.current||(m.current=new MediaStream);let d=c.current;return d&&d.srcObject!==m.current&&(d.srcObject=m.current),m.current},[]),k=pe(d=>{let b=c.current;if(!b)return;let P=b.play();!P||typeof P.then!="function"||P.then(()=>{b.muted||v(!0)}).catch(R=>{let T=R instanceof Error?R.name:String(R);if(T==="AbortError"){on(`play() aborted (${d}); retrying in ${Bn}ms`),y.current&&clearTimeout(y.current),y.current=setTimeout(()=>{y.current=null,k(`${d}:retry`)},Bn);return}if(T==="NotAllowedError"){on(`play() blocked pending a user gesture (${d})`),v(!1);return}on(`play() failed (${d})`,R)})},[v]),U=pe(d=>{let b=x();if(b){for(let P of b.getAudioTracks())P!==d&&b.removeTrack(P);d&&!b.getAudioTracks().includes(d)&&b.addTrack(d),d&&k("track-attach"),C.current?.(d)}},[x,k]),g=pe(()=>{let d=c.current;d&&(x(),d.muted=!1,k("gesture"),Ie(),v(!0))},[x,k,v]);lr(t,()=>({unlock:g,get unlocked(){return h.current===!0},get element(){return c.current}}),[g]);let A=pe(d=>{c.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),x()),p?.(d)},[x,p]),E=s!==void 0;return rn(()=>{if(E){U(s??null);return}if(!r)return;let d=r.stream(o),b=()=>{let f=m.current;return f?f.getAudioTracks()[0]??null:null},P=f=>{if(f!==b()&&(U(f),f)){let _=()=>{b()===f&&U(null)};f.addEventListener("ended",_)}},R=d.track;R&&R.readyState==="live"&&P(R);let T=d.on("track",f=>{f&&f.readyState!=="live"||P(f)}),q=setInterval(()=>{let f=d.track;f&&f.readyState==="live"&&P(f)},pr);return()=>{T(),clearInterval(q)}},[r,o,E,s,U]),rn(()=>dr(()=>{Ie(),h.current===!0&&k("foreground")}),[k]),rn(()=>()=>{y.current&&clearTimeout(y.current)},[]),mr("audio",{ref:A,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})});import{forwardRef as fr,useCallback as fe,useEffect as Vn,useImperativeHandle as gr,useRef as j}from"react";import{observePageLifecycle as hr,sessionFailureFromMediaError as Sr,sharedCaptureController as vr}from"@urun-sh/core";import{jsx as kr}from"react/jsx-runtime";var Hn={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function De(...e){console.debug("[urun-voice]",...e)}var yr=fr(function(n,t){let{session:r,stream:o="audio",constraints:s=Hn,connectTimeoutMs:i,attempts:a=3,retryDelayMs:l=1500,onActiveChange:u,onError:p,onMicStream:c,onTrack:m,onUnlockChange:h,capture:y}=n,C=j(null),S=j(null),v=j(null),x=j([]),k=j(!1),U=j(u);U.current=u;let g=j(p);g.current=p;let A=j(c);A.current=c;let E=fe(f=>{k.current!==f&&(k.current=f,U.current?.(f))},[]),d=fe(()=>{for(let f of x.current)f();x.current=[],v.current?.release(),v.current=null,S.current&&(S.current=null,A.current?.(null))},[]),b=fe(async()=>{let f=v.current;if(f){let N=await f.update(s);return S.current=f.stream,A.current?.(f.stream),N}let D=await(y??vr()).claim("audio",s);v.current=D,x.current=[D.onTrack((N,J)=>{S.current=J,A.current?.(J),k.current&&r.stream(o).attach(N).catch(Pe=>De("mic re-attach after one-capture re-acquire failed",Pe))}),D.onLost(N=>{v.current=null,x.current=[],S.current=null,A.current?.(null),E(!1),g.current?.(N)})],S.current=D.stream,A.current?.(D.stream);let W=D.track;if(!W)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return W},[y,s,r,o,E]),P=fe(async()=>{d(),E(!1),await r.stream(o).detach().catch(()=>{})},[r,o,d,E]),R=fe(async()=>{C.current?.unlock();let f;try{f=await b()}catch(W){d();let N=Sr(W,r.status);throw g.current?.(N),N}r.connect?.();let _;for(let W=1;W<=a;W++)try{await r.whenLive(i!==void 0?{timeout:i}:void 0),await r.stream(o).attach(f),E(!0);return}catch(N){_=N,De(`start attempt ${W}/${a} failed`,N),W<a&&await new Promise(J=>setTimeout(J,l))}d(),E(!1);let D=_ instanceof Error?_:new Error(String(_??"voice start failed"));throw g.current?.(D),D},[r,o,i,a,l,b,d,E]);gr(t,()=>({start:R,stop:P,unlock:()=>C.current?.unlock(),get active(){return k.current},get micStream(){return S.current},get audio(){return C.current}}),[R,P]);let T=j(!1),q=fe(async()=>{if(!k.current||T.current)return;let f=S.current?.getAudioTracks()[0]??null;if(f&&f.readyState==="live"){try{await r.stream(o).attach(f)}catch(_){De("foreground mic re-assert failed (will retry on next pass)",_)}return}T.current=!0;try{let _=await b();await r.stream(o).attach(_)}catch(_){let D=_ instanceof Error?_:new Error(String(_));De("foreground mic re-acquire failed",D),g.current?.(D)}finally{T.current=!1}},[r,o,b]);return Vn(()=>{let f=()=>{q()};return typeof r.onRecovery=="function"?r.onRecovery(f):hr(f)},[r,q]),Vn(()=>d,[d]),kr(sn,{ref:C,session:r,stream:o,onTrack:m,onUnlockChange:h})});import{sessionFailureFromMediaError as br,sharedCaptureController as Cr}from"@urun-sh/core";import{forwardRef as Tr,useCallback as K,useEffect as $n,useImperativeHandle as Pr,useRef as B,useState as ye}from"react";import{jsx as ne,jsxs as jn}from"react/jsx-runtime";var Kn={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function an(...e){console.debug("[urun-camera]",...e)}function xr(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function Rr(){let e=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof e?.enumerateDevices!="function")return null;try{return(await e.enumerateDevices()).filter(t=>t.kind==="videoinput")}catch{return null}}var Ur=Tr(function(n,t){let{session:r,stream:o="video",constraints:s,facingMode:i="environment",mirror:a="auto",connectTimeoutMs:l,preview:u=!0,className:p,videoClassName:c,onActiveChange:m,onError:h,onStream:y,onTrack:C,children:S,capture:v,flipControl:x="auto",flipControlClassName:k,onDevices:U}=n,g=B(null),A=B(null),E=B(null),d=B([]),b=B(null),P=B(!1),R=B(i),[T,q]=ye(i),[f,_]=ye(!1),[D,W]=ye(null),[N,J]=ye(!1),[Pe]=ye(xr),xe=B(m);xe.current=m;let se=B(h);se.current=h;let Q=B(y);Q.current=y;let H=B(C);H.current=C;let L=B(U);L.current=U;let I=K(w=>{P.current!==w&&(P.current=w,_(w),xe.current?.(w))},[]);$n(()=>{if(!f){W(null);return}let w=!1,M=()=>{Rr().then(F=>{w||(W(F),F&&L.current?.(F))})};M();let O=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof O?.addEventListener=="function"?(O.addEventListener("devicechange",M),()=>{w=!0,O.removeEventListener?.("devicechange",M)}):()=>{w=!0}},[f]);let z=K(w=>{let M=g.current;M&&(M.muted=!0,M.defaultMuted=!0,M.setAttribute("muted",""),M.setAttribute("playsinline",""),M.setAttribute("webkit-playsinline",""),M.srcObject=w,w&&M.play()?.catch?.(O=>an("preview play() failed",O)))},[]),$=K(()=>{b.current?.(),b.current=null;for(let w of d.current)w();d.current=[],E.current?.release(),E.current=null,A.current&&(A.current=null,Q.current?.(null),H.current?.(null)),z(null)},[z]),Be=K((w,M)=>{b.current?.(),A.current=M,z(M),Q.current?.(M);let O=()=>{A.current===M&&(an("camera track ended (device removed or permission revoked)"),$(),I(!1))};w.addEventListener("ended",O),b.current=()=>w.removeEventListener("ended",O)},[z,$,I]),ie=K(async w=>{let M={...Kn,...s,facingMode:w},O;try{let F=E.current;if(F)O=await F.update(M);else{let ge=await(v??Cr()).claim("video",M);if(E.current=ge,d.current=[ge.onTrack((he,at)=>{Be(he,at),P.current&&r.stream(o).attachVideo(he).then(()=>H.current?.(he)).catch(ut=>an("camera re-publish after one-capture re-acquire failed",ut))}),ge.onLost(he=>{E.current=null,d.current=[],$(),I(!1),se.current?.(he)})],!ge.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});O=ge.track}}catch(F){let ae=br(F,r.status);throw se.current?.(ae),ae}R.current=w,q(w),Be(O,E.current?.stream??new MediaStream([O]));try{r.connect?.(),await r.whenLive(l!==void 0?{timeout:l}:void 0),await r.stream(o).attachVideo(O)}catch(F){$(),I(!1);let ae=F instanceof Error?F:new Error(String(F));throw se.current?.(ae),ae}H.current?.(O),I(!0)},[r,o,s,l,v,Be,$,I]),gn=K(w=>ie(w?.facingMode??R.current),[ie]),hn=K(async w=>{P.current&&R.current===w||await ie(w)},[ie]),Ve=K(()=>ie(R.current==="environment"?"user":"environment"),[ie]),Sn=K(async()=>{$(),I(!1),await r.stream(o).detachVideo().catch(()=>{})},[r,o,$,I]);if(Pr(t,()=>({start:gn,stop:Sn,flip:Ve,setFacingMode:hn,get active(){return P.current},get facingMode(){return R.current},get stream(){return A.current},get element(){return g.current}}),[gn,Sn,Ve,hn]),$n(()=>$,[$]),!u)return null;let ot=a==="auto"?T==="user":a,st=f&&(x===!0||x==="auto"&&Pe&&(D?.length??0)>1),it=()=>{N||(J(!0),Ve().catch(()=>{}).finally(()=>J(!1)))};return jn("div",{className:p,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":T,children:[ne("video",{ref:g,className:c,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...ot?{transform:"scaleX(-1)"}:{}}}),st?ne("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:it,disabled:N,className:k,style:k?{opacity:N?.6:void 0}:{position:"absolute",right:16,bottom:"calc(env(safe-area-inset-bottom, 0px) + 16px)",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",width:44,height:44,borderRadius:9999,border:"1px solid rgba(255,255,255,0.25)",background:"rgba(0,0,0,0.5)",color:"#fff",cursor:"pointer",opacity:N?.6:1},children:jn("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",style:{width:20,height:20},"aria-hidden":!0,children:[ne("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),ne("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),ne("path",{d:"M14.5 10.5v1.6h-1.6"}),ne("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),ne("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,S]})});import{useEffect as wr,useState as Er}from"react";var un={level:0,speaking:!1};function Ar(e,n={}){let{fftSize:t=512,intervalMs:r=100,speakingThreshold:o=.02}=n,[s,i]=Er(un);return wr(()=>{if(!e){i(un);return}let a=Ne();if(!a||typeof MediaStream>"u")return;let l;e instanceof MediaStream?l=e:(l=new MediaStream,l.addTrack(e));let u,p;try{u=a.createMediaStreamSource(l),p=a.createAnalyser(),p.fftSize=t,u.connect(p)}catch{return}let c=new Uint8Array(p.fftSize),h=setInterval(()=>{p.getByteTimeDomainData(c);let y=0;for(let S=0;S<c.length;S++){let v=(c[S]-128)/128;y+=v*v}let C=Math.sqrt(y/c.length);i(S=>{let v=C>o;return Math.abs(S.level-C)<.005&&S.speaking===v?S:{level:C,speaking:v}})},r);return()=>{clearInterval(h),u.disconnect(),i(un)}},[e,t,r,o]),s}import{useEffect as Mr,useState as _r}from"react";function Nr(e,n){let[t,r]=_r(null);return Mr(()=>{if(!e||!n){r(null);return}let o=e.stream(n);return r(o.track),o.on("track",r)},[e,n]),t}import{useCallback as Wr}from"react";import{useEffect as Or,useMemo as qr}from"react";import{createStore as Ir}from"zustand/vanilla";import{useStore as Dr}from"zustand";var Lr=()=>{};function cn(e,n={}){let t=u=>{e?.set(u)},r=()=>e?e.get()??{}:{},o=Ir(()=>({doc:r(),synced:e?e.synced:!1,set:t})),s=null,i=()=>{if(s){for(let u of s)u();s=null}},a=()=>e?(s||(o.setState({doc:r(),synced:e.synced}),s=[e.on("change",u=>o.setState({doc:u})),e.onSynced(()=>o.setState({synced:!0}))]),i):Lr,l=(u=>Dr(o,u));return Object.assign(l,{getState:o.getState,getInitialState:o.getInitialState,subscribe:o.subscribe,set:t,bind:a,unbind:i}),n.bind!==!1&&a(),l}function ke(e,n){let t=qr(()=>cn(e&&n?e.doc(n):null,{bind:!1}),[e,n]);return Or(()=>t.bind(),[t]),t}function Fr(e,n,t){let o=ke(e,n)(t??(a=>a)),s=Wr(a=>{e&&n&&e.doc(n).set(a)},[e,n]);if(t)return o;let i=o;return{snapshot:e&&n?i.doc:null,synced:i.synced,set:s}}import{useEffect as Br,useState as Vr}from"react";var te=200;function Y(e,n,t=200){let r=[...e,n];return r.length>t?r.slice(r.length-t):r}function be(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function ln(e){let n=e.trim();if(!n)return{ok:!1,error:"Enter a JSON object."};let t;try{t=JSON.parse(n)}catch(r){return{ok:!1,error:r instanceof Error?r.message:"Invalid JSON."}}return t===null||typeof t!="object"||Array.isArray(t)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:t}}function dn(e,n,t={}){let r=t.cap??200,[o,s]=Vr([]);return Br(()=>{if(s([]),!e||!n)return;let i=!0,a=e.stream(n).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let l=await a.next();if(!i||l.done)break;s(u=>Y(u,{at:Date.now(),payload:l.value},r))}})(),()=>{i=!1,a.return?.()}},[e,n,r]),o}import{jsx as Le,jsxs as Ce}from"react/jsx-runtime";function Hr({session:e,name:n,cap:t,className:r}){let o=dn(e,n,{cap:t});return Ce("div",{className:["urun-stream-tail",r].filter(Boolean).join(" "),children:[Ce("div",{className:"urun-stream-tail-meta",children:[Le("code",{children:n}),Ce("span",{className:"urun-stream-tail-count",children:[o.length," messages"]})]}),Le("div",{className:"urun-stream-tail-log",children:o.length===0?Ce("span",{className:"urun-stream-tail-empty",children:["Waiting for ",Le("code",{children:n})," messages\u2026"]}):o.map((s,i)=>Ce("div",{className:"urun-stream-tail-line",children:[Le("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",be(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as $r,useState as Jn}from"react";import{jsx as re,jsxs as Oe}from"react/jsx-runtime";function qe({placeholder:e,buttonLabel:n,disabled:t,onApply:r}){let[o,s]=Jn(""),[i,a]=Jn(null),l=$r(()=>{let u=ln(o);if(!u.ok){a(u.error);return}a(null),r(u.value,o.trim()),s("")},[o,r]);return Oe("div",{className:"urun-doc-patch",children:[re("textarea",{className:"urun-doc-patch-input",value:o,onChange:u=>s(u.target.value),placeholder:e,rows:3}),Oe("div",{className:"urun-doc-patch-actions",children:[re("button",{type:"button",className:"urun-doc-patch-button",disabled:t||!o.trim(),onClick:l,children:n}),i?re("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function jr({session:e,docKey:n,editable:t=!0,patchPlaceholder:r='{"desired": {"prompt": {"text": "a sunset"}}}',className:o}){let s=ke(e,n),i=s(u=>u.doc),a=s(u=>u.synced),l=s(u=>u.set);return Oe("div",{className:["urun-doc-panel",o].filter(Boolean).join(" "),children:[Oe("div",{className:"urun-doc-panel-meta",children:[re("code",{children:n}),re("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),re("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),t?re(qe,{placeholder:r,buttonLabel:"Apply patch",disabled:!e,onApply:u=>l(u)}):null]})}import{useEffect as Kr,useState as Jr}from"react";import{jsx as Te,jsxs as Xn}from"react/jsx-runtime";function zn(e,n=600){return e.length>n?`${e.slice(0,n)}\u2026`:e}function zr({session:e,docKey:n="control",cap:t=200,className:r}){let[o,s]=Jr([]);return Kr(()=>(s([]),e?e.doc(n).on("change",a=>{s(l=>Y(l,{at:Date.now(),direction:"in",text:zn(be(a))},t))}):void 0),[e,n,t]),Xn("div",{className:["urun-control-sender",r].filter(Boolean).join(" "),children:[Te(qe,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${n}`,disabled:!e,onApply:(i,a)=>{e?.doc(n).set(i),s(l=>Y(l,{at:Date.now(),direction:"out",text:zn(a)},t))}}),Te("div",{className:"urun-control-sender-log",children:o.length===0?Te("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...o].reverse().map((i,a)=>Xn("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[Te("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",Te("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}import{useEffect as Xr,useState as Gr}from"react";import{jsx as We,jsxs as Yr}from"react/jsx-runtime";function Zr({session:e,trackNames:n=["video","audio"],docKeys:t=["control"],cap:r=200,className:o}){let[s,i]=Gr([]),a=n.join(","),l=t.join(",");return Xr(()=>{if(i([]),!e)return;let u=(c,m)=>i(h=>Y(h,{at:Date.now(),kind:c,text:m},r)),p=[];p.push(e.onPhase(c=>u("phase",`phase \u2192 ${c.name}`)));for(let c of n){let m=e.stream(c);p.push(m.on("track",h=>u("track",`${c}: ${h?"track arrived":"track ended"}`)))}for(let c of t){let m=e.doc(c);p.push(m.on("change",()=>u("doc",`${c} changed`)))}return()=>p.forEach(c=>c())},[e,a,l,r]),We("div",{className:["urun-event-spine",o].filter(Boolean).join(" "),children:s.length===0?We("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((u,p)=>Yr("div",{className:"urun-event-spine-line","data-kind":u.kind,children:[We("span",{className:"urun-event-spine-kind",children:u.kind})," ",We("span",{className:"urun-event-spine-time",children:new Date(u.at).toLocaleTimeString()})," ",u.text]},`${u.at}-${p}`))})}import{describeSessionPhase as ao,isWakingPhase as uo}from"@urun-sh/core";import{useEffect as Qr,useState as eo}from"react";function V(e){let[n,t]=eo(e?.phase??null);return Qr(()=>{if(!e){t(null);return}return e.onPhase(t)},[e]),n}import{describeSessionPhase as so}from"@urun-sh/core";import{useEffect as no,useRef as to,useState as ro}from"react";import{isWakingPhase as oo}from"@urun-sh/core";function pn(e){let n=V(e),t=oo(n?.name),r=to(void 0);t?r.current??=Date.now():r.current=void 0;let o=t?n?.wakingSince??r.current:void 0,s=()=>o!==void 0?Math.max(0,Math.floor((Date.now()-o)/1e3)):0,[i,a]=ro(s);return no(()=>{if(o===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-o)/1e3)));let l=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-o)/1e3)))},1e3);return()=>clearInterval(l)},[o]),{waking:t,phase:n,state:t?n?.runtime?.state:void 0,reason:t?n?.runtime?.reason:void 0,since:o,seconds:t?i:0}}import{Fragment as io,jsx as Gn,jsxs as Zn}from"react/jsx-runtime";function mn({session:e,render:n,className:t}){let r=pn(e);return!r.waking||!r.phase?null:Gn("span",{className:["urun-session-waking",t].filter(Boolean).join(" "),"data-phase":r.phase.name,"data-runtime-state":r.state,children:n?n(r):Zn(io,{children:[Gn("span",{className:"urun-session-waking-label",children:so(r.phase)})," ",Zn("span",{className:"urun-session-waking-elapsed",children:["(",r.seconds,"s)"]})]})})}import{jsx as oe,jsxs as Yn}from"react/jsx-runtime";var co={idle:"idle",queued:"queued",unavailable:"unavailable",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function lo({session:e,className:n}){let t=V(e),r=t?.name??"idle",o=t?.name==="queued"&&t.queue?`pos ${t.queue.position} / depth ${t.queue.depth}`:(t?.name==="error"||t?.name==="expired")&&t.error?t.error.reason:t?.runtime?.reason??null;return Yn("span",{className:["urun-session-status",n].filter(Boolean).join(" "),"data-phase":r,children:[oe("span",{className:"urun-session-status-dot","data-phase":r}),oe("span",{className:"urun-session-status-label",children:co[r]}),o?oe("span",{className:"urun-session-status-detail",children:o}):null]})}function po({session:e,children:n,fallback:t,onStartOver:r,className:o}){let s=V(e);if(s?.name==="live")return oe("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:n});let i=t?t(s):oe("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&uo(s.name)?oe(mn,{session:e}):s&&s.name!=="idle"?ao(s):"Waiting for a live session\u2026"}),a=r!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return Yn("div",{className:["urun-session-gate",o].filter(Boolean).join(" "),children:[i,a?oe("button",{type:"button",className:"urun-session-gate-start-over",onClick:r,children:"Start over"}):null]})}import{useEffect as mo,useState as fo}from"react";import{jsx as So}from"react/jsx-runtime";function Qn(e){return V(e)?.endsAt??null}function go(e){let n=Math.max(0,Math.floor(e/1e3)),t=Math.floor(n/60),r=n%60;return`${String(t).padStart(2,"0")}:${String(r).padStart(2,"0")}`}function ho({session:e,urgentMs:n=6e4,className:t}){let o=Qn(e)?.getTime()??null,[s,i]=fo(()=>o===null?null:Math.max(0,o-Date.now()));if(mo(()=>{if(o===null){i(null);return}let l=()=>i(Math.max(0,o-Date.now()));l();let u=setInterval(l,1e3);return()=>clearInterval(u)},[o]),s===null)return null;let a=go(s);return So("span",{className:["urun-session-clock",t].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<n?"":void 0,"data-expired":s<=0?"":void 0,children:a})}import{jsx as et,jsxs as ko}from"react/jsx-runtime";var vo=new Set(["expired","ended","error"]);function yo({session:e,onNewSession:n,children:t,className:r}){let o=V(e);if(!o||!vo.has(o.name))return null;let s=t?t(o):et("span",{className:"urun-session-ended-copy",children:o.name==="expired"?"Session ended \u2014 start a new session":o.name==="error"?`Session failed${o.error?.reason?` \u2014 ${o.error.reason}`:""}.`:"Session ended."});return ko("div",{className:["urun-session-ended",r].filter(Boolean).join(" "),"data-phase":o.name,children:[s,n?et("button",{type:"button",className:"urun-session-ended-new",onClick:n,children:"New session"}):null]})}import{useEffect as nt,useMemo as bo,useState as tt}from"react";import{jsx as Fe,jsxs as Po}from"react/jsx-runtime";function fn(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let n=e;return n.warning!==!0?null:{warning:!0,deadlineEpochS:typeof n.deadline_epoch_s=="number"?n.deadline_epoch_s:null,idleSinceEpochS:typeof n.idle_since_epoch_s=="number"?n.idle_since_epoch_s:null}}function rt(e){let n=bo(()=>e?e.doc("control"):null,[e]),[t,r]=tt(()=>n?fn(n.get("idle")):null);return nt(()=>{if(!n){r(null);return}return r(fn(n.get("idle"))),n.on("change",()=>r(fn(n.get("idle"))))},[n]),t}function Co(e){let n=Math.max(0,Math.floor(e));return`${Math.floor(n/60)}:${String(n%60).padStart(2,"0")}`}function To({session:e,onStillHere:n,className:t}){let r=rt(e),o=r?.deadlineEpochS??null,[s,i]=tt(null);if(nt(()=>{if(o===null){i(null);return}let l=()=>i(Math.max(0,o-Date.now()/1e3));l();let u=setInterval(l,1e3);return()=>clearInterval(u)},[o]),!r||!e)return null;let a=()=>{e.touch?.(),n?.()};return Fe("div",{className:["urun-idle-warning",t].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:Po("div",{className:"urun-idle-warning-card",children:[Fe("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),Fe("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${Co(s)} due to inactivity.`:"This session will end soon due to inactivity."}),Fe("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}import{useContext as xo,useEffect as Ro,useState as Uo}from"react";import{prewake as wo}from"@urun-sh/core";function Eo(e){let n=xo(ue),[t,r]=Uo(null),o=e.app??n?.appId,s=e.function,i=e.intervalS??60,a=n?.baseUrl,l=n?.orgId,u=n?.jwt,p=n?.getAccessToken,c=n?.authProvider;return Ro(()=>{if(!a||!l||!o||!s)return;let m=!1,h=()=>{wo({baseUrl:a,app:o,functionName:s,orgId:l,jwt:u,getAccessToken:p,authProvider:c}).then(C=>{m||r(C)}).catch(()=>{})};h();let y=setInterval(h,Math.max(1,i)*1e3);return()=>{m=!0,clearInterval(y)}},[o,s,i,a,l,u,p,c]),t}import{describeSessionPhase as Wa,isWakingPhase as Fa}from"@urun-sh/core";export{$t as ComponentRenderer,Kn as DEFAULT_CAMERA_CONSTRAINTS,te as DEFAULT_LOG_CAP,Hn as DEFAULT_VOICE_CONSTRAINTS,qe as DocPatchForm,rr as ImageFrame,tr as ImageFrameSchema,ir as MetricsPanel,sr as MetricsPanelSchema,Jt as ProgressCard,Kt as ProgressCardSchema,Gt as StatusBadge,zt as StatusBadgeSchema,er as TextStream,Qt as TextStreamSchema,sn as UrunAudio,ct as UrunAuthProvider,Ur as UrunCamera,zr as UrunControlSender,jr as UrunDocPanel,Se as UrunErrorBoundary,Zr as UrunEventSpine,To as UrunIdleWarning,lt as UrunJwtProvider,vt as UrunProvider,ho as UrunSessionClock,yo as UrunSessionEnded,po as UrunSessionGate,lo as UrunSessionStatus,mn as UrunSessionWaking,Hr as UrunStreamTail,yr as UrunVoice,Re as authMode,cn as createDocStore,Wa as describeSessionPhase,be as formatPayload,Ne as getUrunAudioContext,Fa as isWakingPhase,ln as parseJsonObject,Y as pushCapped,Ht as registerComponent,Ie as resumeUrunAudioContext,X as urunPublicEnv,xt as useApp,Ot as useChat,Nt as useCompletion,ke as useDocStore,Wn as useImageFrame,Vt as useInputPresence,Fn as useMetricsPanel,_n as useProgressCard,Et as useRequest,Fr as useSessionDoc,Qn as useSessionEndsAt,rt as useSessionIdle,V as useSessionPhase,Nr as useSessionTrack,pn as useSessionWake,In as useStatusBadge,dn as useStreamMessages,On as useTextStream,Ar as useUrunAudioLevel,He as useUrunAuth,Eo as useUrunPrewake,ft as usesWorkOSAuth};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@urun-sh/react",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.14",
|
|
4
4
|
"description": "React bindings for the urun TypeScript SDK",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"dev": "tsup --watch"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|
|
56
|
-
"@urun-sh/core": "^0.2.
|
|
56
|
+
"@urun-sh/core": "^0.2.14",
|
|
57
57
|
"@workos-inc/authkit-nextjs": "^3.0.0",
|
|
58
58
|
"@workos-inc/authkit-react": "^0.15.0 || ^0.16.0",
|
|
59
59
|
"next": "^15.0.0 || ^16.0.0",
|