@urun-sh/react 0.2.32 → 0.2.33
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.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client"
|
|
2
|
-
"use strict";var $t=Object.defineProperty;var qn=Object.getOwnPropertyDescriptor;var Fn=Object.getOwnPropertyNames;var Hn=Object.prototype.hasOwnProperty;var Wn=(e,t)=>{for(var r in t)$t(e,r,{get:t[r],enumerable:!0})},Bn=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Fn(t))!Hn.call(e,n)&&n!==r&&$t(e,n,{get:()=>t[n],enumerable:!(o=qn(t,n))||o.enumerable});return e};var $n=e=>Bn($t({},"__esModule",{value:!0}),e);var vo={};Wn(vo,{Audio:()=>nt,Camera:()=>cr,ComponentRenderer:()=>Wr,DEFAULT_CAMERA_CONSTRAINTS:()=>ur,DEFAULT_LOG_CAP:()=>ke,DEFAULT_VOICE_CONSTRAINTS:()=>sr,DocPatchForm:()=>it,Image:()=>nn,ImageFrame:()=>Gr,ImageFrameSchema:()=>Xr,MetricsPanel:()=>Zr,MetricsPanelSchema:()=>Yr,Mic:()=>pn,OPERATOR_CHORD_LABEL:()=>wr,OPERATOR_TOKEN_STORAGE_KEY:()=>xr,ProgressCard:()=>$r,ProgressCardSchema:()=>Br,Session:()=>Qr,StatusBadge:()=>jr,StatusBadgeSchema:()=>Kr,TextStream:()=>zr,TextStreamSchema:()=>Jr,UrunActivationOverlay:()=>Dt,UrunAudio:()=>un,UrunAuthProvider:()=>Kt,UrunCamera:()=>mn,UrunControlSender:()=>Pn,UrunDocPanel:()=>kn,UrunErrorBoundary:()=>_e,UrunEventSpine:()=>Cn,UrunIdleWarning:()=>Mn,UrunJwtProvider:()=>br,UrunProvider:()=>Ar,UrunSessionClock:()=>Rn,UrunSessionEnded:()=>Un,UrunSessionGate:()=>En,UrunSessionStatus:()=>wn,UrunSessionWaking:()=>It,UrunStreamTail:()=>yn,UrunVoice:()=>ln,Video:()=>ht,Voice:()=>ot,authMode:()=>ze,createDocStore:()=>Tt,describeSessionPhase:()=>Ft.describeSessionPhase,formatPayload:()=>He,getUrunAudioContext:()=>tt,isWakingPhase:()=>Ft.isWakingPhase,parseJsonObject:()=>Et,pushCapped:()=>Se,readOperatorToken:()=>jt,registerComponent:()=>Fr,resumeUrunAudioContext:()=>rt,urunPublicEnv:()=>me,useActivation:()=>Lt,useApp:()=>Mr,useChat:()=>Dr,useCompletion:()=>Ir,useConfirmOnLeave:()=>ft,useDocStore:()=>Fe,useImageFrame:()=>tr,useInputPresence:()=>Vr,useMetricsPanel:()=>rr,useOperatorOverride:()=>mt,useProgressCard:()=>Zt,useRequest:()=>_r,useSession:()=>en,useSessionDoc:()=>vn,useSessionEndsAt:()=>lr,useSessionIdle:()=>pr,useSessionPhase:()=>ne,useSessionTrack:()=>fn,useSessionWake:()=>Nt,useStatusBadge:()=>Qt,useStreamMessages:()=>At,useTextStream:()=>er,useUrunAudioLevel:()=>Pt,useUrunAuth:()=>dt,useUrunPrewake:()=>Nn,usesWorkOSAuth:()=>yr});module.exports=$n(vo);var ce=require("react");var hr=require("react"),Je=require("react/jsx-runtime"),_e=class extends hr.Component{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,r){console.error("[urun] Error caught by UrunErrorBoundary:",t,r)}render(){if(this.state.error){let{fallback:t}=this.props;return typeof t=="function"?t(this.state.error):t||(0,Je.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,Je.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,Je.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var vr=require("react"),Ne=(0,vr.createContext)(null);function xe(e){return e&&e.trim()?e.trim():void 0}function me(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return xe(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return xe(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return xe(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return xe(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return xe(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return xe(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return xe(typeof process<"u"?process.env?.[e]:void 0)}}function ze(){let e=me("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||me("VERCEL_ENV")==="production"?"workos":me("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function yr(){return ze()==="workos"}var Ie=require("react"),Pr=require("react/jsx-runtime"),kr=(0,Ie.createContext)(null);function Kt({getAccessToken:e,children:t}){let r=(0,Ie.useMemo)(()=>({getAccessToken:e}),[e]);return(0,Pr.jsx)(kr.Provider,{value:r,children:t})}var br=Kt;function dt(){return(0,Ie.useContext)(kr)}var pt=require("react"),xr="urun.operator_token",Tr=null,Cr="op",wr="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function Er(){return typeof window<"u"}function jt(){return Tr}function Kn(){if(!Er())return null;let e=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash;if(!e)return null;let t=new URLSearchParams(e),r=t.get(Cr);if(!r)return null;Tr=r,t.delete(Cr);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function jn(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function mt(e){let t=(0,pt.useRef)(e);t.current=e,(0,pt.useEffect)(()=>{if(!Er())return;Kn();let r=o=>{if(!jn(o))return;let n=jt();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}var Rr=require("react");function ft(e=!0){(0,Rr.useEffect)(()=>{if(!e||typeof window>"u"||typeof window.addEventListener!="function")return;let t=r=>(r.preventDefault(),r.returnValue="","");return window.addEventListener("beforeunload",t),()=>window.removeEventListener("beforeunload",t)},[e])}var ye=require("react/jsx-runtime"),Jn="/api/urun-token";function zn(e,t){return typeof e=="function"?e(t):e!==void 0?e:(0,ye.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,ye.jsx)("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),(0,ye.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function Ar({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,confirmOnLeave:g=!1,fallback:p,errorFallback:k,children:b}){let h=n===void 0&&t===void 0;if(!h&&(typeof t!="string"||t.trim().length===0))throw new Error("[urun] <UrunProvider> requires a non-empty orgId \u2014 set your org id deployment env var (e.g. NEXT_PUBLIC_SESSION_TENANT_ID) and pass it through the provider (or pass NEITHER orgId NOR jwt to let the provider mint from its tokenEndpoint).");if(!h&&(typeof e!="string"||e.trim().length===0))throw new Error("[urun] <UrunProvider> requires baseUrl when orgId/jwt are passed explicitly (self-mint mode reads it from the token endpoint instead).");let m=r??o;if(h&&(typeof m!="string"||m.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);ft(g);let[P,S]=(0,ce.useState)(),[x,T]=(0,ce.useState)(),[E,v]=(0,ce.useState)(null),[A,V]=(0,ce.useState)(null);mt(H=>V({jwt:H}));let R=dt(),M=me("NEXT_PUBLIC_SESSION_TOKEN")??me("NEXT_PUBLIC_URUN_JWT"),l=ze(),d=A!==null,f=l==="workos"&&!n&&!d&&!h,C=n??(l==="jwt"?M:void 0)??P??x?.token,_=d?A.jwt:C,K=s??me("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),U=f&&!_,y=t??x?.orgId,O=e??x?.gatewayUrl,j=h&&x===void 0,X=h&&x!==void 0&&!O?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,$=E??X,ue=(0,ce.useMemo)(()=>({appId:m,baseUrl:O??"",orgId:y??"",jwt:_,getAccessToken:f?R?.getAccessToken:void 0,authProvider:K,eventsUrl:i,sessionKey:a,releaseOnLeave:c,priority:d?"preempt":void 0}),[m,R,O,K,_,i,y,a,c,f,d]),Z=u??Jn;return(0,ce.useEffect)(()=>{if(!h)return;let H=new AbortController;return v(null),(async()=>{try{let N=await fetch(Z,{method:"POST",signal:H.signal});if(!N.ok)throw new Error(`[urun] token endpoint ${Z} answered ${N.status}`);let W=await N.json(),se=typeof W.token=="string"?W.token:"",de=typeof W.orgId=="string"?W.orgId:"";if(!se||!de)throw new Error(`[urun] token endpoint ${Z} returned no { token, orgId } \u2014 is it createTokenRoute() from @urun-sh/next?`);T({token:se,orgId:de,gatewayUrl:typeof W.gatewayUrl=="string"?W.gatewayUrl:void 0})}catch(N){if(H.signal.aborted)return;v(N instanceof Error?N:new Error(String(N)))}})(),()=>H.abort()},[h,Z]),(0,ce.useEffect)(()=>{if(!f||!R)return;let H=!1,N=R;async function W(){try{let de=await N.getAccessToken();H||S(de??void 0)}catch{H||S(void 0)}}W();let se=window.setInterval(()=>{W()},6e4);return()=>{H=!0,window.clearInterval(se)}},[R,f]),(0,ye.jsx)(_e,{fallback:p,children:$?zn(k,$):U||j?(0,ye.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,ye.jsx)(Ne.Provider,{value:ue,children:b})})}var Q=require("react"),Ur=require("@urun-sh/core");function Xn(e,t){return`${e}:${JSON.stringify(t??{})}`}function Gn(e,t,r){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,fnName:t,args:r??{}})}var Te=new Map;var Jt=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},zt=class{constructor(t,r){this._stream=t;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(t){return this._stream.attach(t)}attachVideo(t){return this._stream.attachVideo(t)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(t){return this._stream.seek(t)}chunks(t){return this._stream.chunks(t)}onSeeked(t){return this._stream.onSeeked(t)}on(t,r){return this._stream.on(t,r)}messages(){return this._stream.messages()}emit(t,r){return this._stream.emit(t,r)}dispose(){this._unsubscribeTrack()}},Xt=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||a.name==="expired"){let u=a.error,c=u?.reason??(a.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else a.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),i=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{i(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new Jt(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new zt(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function Mr(){let e=(0,Q.useContext)(Ne);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=(0,Q.useReducer)(i=>i+1,0),r=(0,Q.useRef)(new Map),o=(0,Q.useRef)(new Map),n=(0,Q.useRef)(null),s=(0,Q.useMemo)(()=>(0,Ur.App)(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority]);return(0,Q.useEffect)(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=Te.get(a);c===u&&o.current.get(a)===u&&(c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null),c.handle.addNotifier(t),c.refCount+=1)}}return()=>{let a=new Map;for(let[u,c]of o.current){let g=Te.get(u);g===c&&(g.handle.removeNotifier(t),g.refCount=Math.max(0,g.refCount-1),a.set(u,g),g.refCount===0&&(g.disposeTimer=setTimeout(()=>{let p=Te.get(u);!p||p.refCount!==0||(Te.delete(u),p.handle.disconnect())},0)))}n.current=a}},[]),(0,Q.useMemo)(()=>{let i=new Map;return new Proxy({},{get(a,u){if(typeof u!="string")return;let c=i.get(u);if(c)return c;let g=p=>{let k=Xn(u,p),b=r.current.get(k);if(b&&!b.disposed)return b;let h=Gn(e,u,p),m=Te.get(h);return m?.handle.disposed&&(m.disposeTimer&&clearTimeout(m.disposeTimer),Te.delete(h),o.current.get(h)===m&&o.current.delete(h),m=void 0),m?m.disposeTimer&&(clearTimeout(m.disposeTimer),m.disposeTimer=null):(m={handle:new Xt(s[u](p),t,e.eventsUrl),refCount:0,disposeTimer:null},Te.set(h,m)),o.current.get(h)!==m&&(o.current.set(h,m),m.handle.addNotifier(t),m.refCount+=1),r.current.set(k,m.handle),m.handle};return i.set(u,g),g}})},[e,s])}var J=require("react");function Le(e){let t=e;if(!t||typeof t.request!="function"||typeof t.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 t}function Yn(e){return e instanceof Error?e:new Error(String(e))}function _r(e,t){let r=(0,J.useMemo)(()=>Le(e),[e]),[o,n]=(0,J.useState)(void 0),[s,i]=(0,J.useState)(null),[a,u]=(0,J.useState)(!1),c=(0,J.useRef)(t);c.current=t;let g=(0,J.useRef)(0),p=(0,J.useRef)(null),k=(0,J.useRef)(!0);(0,J.useEffect)(()=>(k.current=!0,()=>{k.current=!1,p.current?.abort()}),[]);let b=(0,J.useCallback)(async P=>{p.current?.abort();let S=new AbortController;p.current=S;let x=++g.current,T=()=>k.current&&g.current===x;T()&&(u(!0),i(null));try{let E=await r.request(P,{...c.current,signal:S.signal});return T()&&(n(E),u(!1),c.current?.onSuccess?.(E)),E}catch(E){let v=Yn(E);throw T()&&(i(v),u(!1),c.current?.onError?.(v)),v}},[r]),h=(0,J.useCallback)(P=>{b(P).catch(()=>{})},[b]),m=(0,J.useCallback)(()=>{g.current++,p.current?.abort(),p.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:h,mutateAsync:b,data:o,error:s,isPending:a,reset:m}}var G=require("react");function Nr(e){return e instanceof Error?e:new Error(String(e))}var Zn=e=>typeof e=="string"?e:String(e);function Ir(e,t){let r=(0,G.useMemo)(()=>Le(e),[e]),[o,n]=(0,G.useState)(""),[s,i]=(0,G.useState)(!1),[a,u]=(0,G.useState)(null),c=(0,G.useRef)(t);c.current=t;let g=(0,G.useRef)(0),p=(0,G.useRef)(null),k=(0,G.useRef)(!0);(0,G.useEffect)(()=>(k.current=!0,()=>{k.current=!1,p.current?.cancel(),p.current=null}),[]);let b=(0,G.useCallback)(()=>{g.current++,p.current?.cancel(),p.current=null,k.current&&i(!1)},[]),h=(0,G.useCallback)(async m=>{p.current?.cancel();let P=++g.current,S=()=>k.current&&g.current===P,x=c.current,T=x?.parseChunk??Zn,E=x?.buildPayload??(f=>({prompt:f}));S()&&(n(""),u(null),i(!0));let{parseChunk:v,buildPayload:A,onFinish:V,onError:R,...M}=x??{},l="",d;try{d=r.requestStream(E(m),M),p.current=d}catch(f){let C=Nr(f);S()&&(u(C),i(!1),x?.onError?.(C));return}try{for await(let f of d){if(g.current!==P)break;l+=T(f),S()&&n(l)}S()&&(i(!1),x?.onFinish?.(l))}catch(f){let C=Nr(f);S()&&(u(C),i(!1),x?.onError?.(C))}finally{p.current===d&&(p.current=null)}},[r]);return{completion:o,complete:h,stop:b,isStreaming:s,error:a}}var B=require("react");function Lr(e){return e instanceof Error?e:new Error(String(e))}var Qn=e=>typeof e=="string"?e:String(e),Or=0;function Gt(e){return Or+=1,`${e}-${Or}`}function Dr(e,t){let r=(0,B.useMemo)(()=>Le(e),[e]),[o,n]=(0,B.useState)(()=>(t?.initialMessages??[]).map(T=>({id:T.id??Gt("msg"),role:T.role,content:T.content}))),[s,i]=(0,B.useState)(""),[a,u]=(0,B.useState)(!1),[c,g]=(0,B.useState)(null),p=(0,B.useRef)(t);p.current=t;let k=(0,B.useRef)(o);k.current=o;let b=(0,B.useRef)(s);b.current=s;let h=(0,B.useRef)(0),m=(0,B.useRef)(null),P=(0,B.useRef)(!0);(0,B.useEffect)(()=>(P.current=!0,()=>{P.current=!1,m.current?.cancel(),m.current=null}),[]);let S=(0,B.useCallback)(()=>{h.current++,m.current?.cancel(),m.current=null,P.current&&u(!1)},[]),x=(0,B.useCallback)(async T=>{let E=T===void 0,v=(E?b.current:T)??"";if(!v.trim())return;m.current?.cancel();let V=++h.current,R=()=>P.current&&h.current===V,M=p.current,l=M?.parseChunk??Qn,d={id:Gt("msg"),role:"user",content:v},f={id:Gt("msg"),role:"assistant",content:""},C=[...k.current,d].map(N=>({role:N.role,content:N.content})),_=[...k.current,d,f];k.current=_,n(_),E&&i(""),g(null),u(!0);let K=M?.buildPayload??(N=>({messages:N})),{initialMessages:U,parseChunk:y,buildPayload:O,onFinish:j,onError:X,...$}=M??{},ue=N=>{n(W=>W.map(se=>se.id===f.id?{...se,content:N}:se))},Z="",H;try{H=r.requestStream(K(C),$),m.current=H}catch(N){let W=Lr(N);R()&&(g(W),u(!1),M?.onError?.(W));return}try{for await(let N of H){if(h.current!==V)break;Z+=l(N),R()&&ue(Z)}R()&&(u(!1),M?.onFinish?.({...f,content:Z}))}catch(N){let W=Lr(N);R()&&(g(W),u(!1),M?.onError?.(W))}finally{m.current===H&&(m.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:x,stop:S,isStreaming:a,error:c}}var F=require("react"),Oe=require("@urun-sh/core"),Yt=[];function Vr(e,t={}){let{field:r=Oe.INPUT_PRESENCE_FIELD,hz:o=Oe.INPUT_PRESENCE_DEFAULT_HZ}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=(0,F.useMemo)(()=>s?(0,Oe.createInputPresencePublisher)({awareness:{setLocalStateField:(v,A)=>s.setField(v,A)},field:r,hz:o}):null,[s,r,o]),a=(0,F.useRef)(null);a.current=i;let[u,c]=(0,F.useState)(!1),[g,p]=(0,F.useState)(Yt),k=(0,F.useRef)(!1);(0,F.useEffect)(()=>{if(i)return()=>i.dispose()},[i]);let b=(0,F.useCallback)(()=>{let v=a.current;p(v?v.heldKeys():Yt)},[]),h=(0,F.useCallback)(()=>{a.current?.clear(),p(Yt)},[]);(0,F.useEffect)(()=>{if(!n)return;let v=()=>!!n.pointerLockElement,A=()=>{if(v()){k.current=!1,c(!0);return}k.current||(c(!1),h())},V=f=>{v()&&(a.current?.keyDown(f.key),b())},R=f=>{a.current?.keyUp(f.key),b()},M=f=>{v()&&a.current?.movePointer(f.movementX,f.movementY)},l=f=>{v()&&a.current?.setButtons(f.buttons)},d=()=>{h()};return n.addEventListener("pointerlockchange",A),n.addEventListener("keydown",V),n.addEventListener("keyup",R),n.addEventListener("mousemove",M),n.addEventListener("mousedown",l),n.addEventListener("mouseup",l),n.defaultView?.addEventListener("blur",d),()=>{n.removeEventListener("pointerlockchange",A),n.removeEventListener("keydown",V),n.removeEventListener("keyup",R),n.removeEventListener("mousemove",M),n.removeEventListener("mousedown",l),n.removeEventListener("mouseup",l),n.defaultView?.removeEventListener("blur",d)}},[n,h,b]);let m=(0,F.useCallback)(v=>{v.requestPointerLock?.()},[]),P=(0,F.useCallback)(()=>{k.current=!0,c(!0)},[]),S=(0,F.useCallback)(()=>{k.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),h()},[n,h]),x=(0,F.useCallback)(v=>{a.current?.keyDown(v),b()},[b]),T=(0,F.useCallback)(v=>{a.current?.keyUp(v),b()},[b]),E=(0,F.useCallback)((v,A)=>{a.current?.movePointer(v,A)},[]);return{engage:m,engageTouch:P,release:S,engaged:u,heldKeys:g,pressKey:x,releaseKey:T,movePointer:E}}var qr=new Map;function Fr(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);qr.set(e,{component:t,schema:r})}function Hr(e,t){let r=qr.get(e);if(!r)return{error:`Unknown component: "${e}"`};let o=r.schema.safeParse(t);return o.success?{Component:r.component,validatedProps:o.data}:{error:`Validation failed for "${e}": ${o.error.message}`}}var we=require("react/jsx-runtime");function Wr({name:e,props:t,fallback:r}){let o=Hr(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?(0,we.jsx)(we.Fragment,{children:r}):(0,we.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,we.jsx)("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return(0,we.jsx)(n,{...o.validatedProps})}var De=require("zod"),Ee=require("react/jsx-runtime"),Br=De.z.object({step:De.z.number().min(0),total:De.z.number().min(1),label:De.z.string().optional(),variant:De.z.enum(["default","success","error"]).default("default")});function Zt(e){let{step:t,total:r,label:o,variant:n="default"}=e,s=Math.min(t/r*100,100),i=t>=r;return{step:t,total:r,label:o,variant:n,percentage:s,isComplete:i}}function $r(e){let{step:t,total:r,label:o,variant:n,percentage:s}=Zt(e);return(0,Ee.jsxs)("div",{className:"urun-progress-card","data-variant":n,children:[o&&(0,Ee.jsx)("div",{className:"urun-progress-label",children:o}),(0,Ee.jsx)("div",{className:"urun-progress-bar",children:(0,Ee.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,Ee.jsxs)("div",{className:"urun-progress-text",children:[t,"/",r]})]})}var gt=require("zod"),Xe=require("react/jsx-runtime"),Kr=gt.z.object({state:gt.z.enum(["thinking","generating","idle","error"]),message:gt.z.string().optional()}),eo={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Qt(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??eo[t]??t;return{state:t,message:n,isActive:o}}function jr(e){let{state:t,message:r,isActive:o}=Qt(e);return(0,Xe.jsxs)("span",{className:"urun-status-badge","data-state":t,children:[(0,Xe.jsx)("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),(0,Xe.jsx)("span",{className:"urun-status-message",children:r})]})}var Ge=require("react"),St=require("zod"),Ye=require("react/jsx-runtime"),Jr=St.z.object({text:St.z.string(),streaming:St.z.boolean().default(!1)});function er(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function zr(e){let{text:t,streaming:r}=er(e),o=(0,Ge.useRef)(null),n=(0,Ge.useRef)(0);return(0,Ge.useEffect)(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),(0,Ye.jsxs)("div",{className:"urun-text-stream",children:[(0,Ye.jsx)("span",{ref:o,className:"urun-text-content"}),r&&(0,Ye.jsx)("span",{className:"urun-text-cursor"})]})}var Ze=require("zod"),Qe=require("react/jsx-runtime"),Xr=Ze.z.object({src:Ze.z.string().url(),alt:Ze.z.string().optional(),caption:Ze.z.string().optional()});function tr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function Gr(e){let{src:t,alt:r,caption:o}=tr(e);return(0,Qe.jsxs)("figure",{className:"urun-image-frame",children:[(0,Qe.jsx)("img",{className:"urun-image",src:t,alt:r}),o&&(0,Qe.jsx)("figcaption",{className:"urun-image-caption",children:o})]})}var fe=require("zod"),Ve=require("react/jsx-runtime"),Yr=fe.z.object({metrics:fe.z.array(fe.z.object({label:fe.z.string(),value:fe.z.union([fe.z.string(),fe.z.number()]),unit:fe.z.string().optional()}))});function rr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function Zr(e){let{metrics:t}=rr(e);return(0,Ve.jsx)("div",{className:"urun-metrics-panel",children:t.map((r,o)=>(0,Ve.jsxs)("div",{className:"urun-metric-card",children:[(0,Ve.jsx)("div",{className:"urun-metric-label",children:r.label}),(0,Ve.jsx)("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}var et=require("react"),tn=require("react/jsx-runtime"),nr=(0,et.createContext)(null);function Qr({session:e,children:t}){return(0,tn.jsx)(nr.Provider,{value:e,children:t})}function le(){return(0,et.useContext)(nr)}function en(){let e=(0,et.useContext)(nr);if(!e)throw new Error("[urun] useSession() needs a mounted <Session session={...}> ancestor with a non-null session \u2014 create one with useApp() (e.g. app.generate({...})) and pass it to the scope.");return e}var z=require("react");var vt=require("react/jsx-runtime"),to=1e3;function ro(...e){console.debug("[video]",...e)}var ht=(0,z.forwardRef)(function(t,r){let{session:o,stream:n="video",track:s,muted:i=!0,mirror:a=!1,objectFit:u="contain",className:c,style:g,videoClassName:p,placeholder:k,children:b,onTrack:h}=t,m=le(),P=o??m,S=(0,z.useRef)(null),x=(0,z.useRef)(null),[T,E]=(0,z.useState)(!1),v=(0,z.useRef)(h);v.current=h;let A=(0,z.useCallback)(()=>{if(typeof MediaStream>"u")return null;x.current||(x.current=new MediaStream);let d=S.current;return d&&d.srcObject!==x.current&&(d.srcObject=x.current),x.current},[]),V=(0,z.useCallback)(d=>{let f=S.current;if(!f)return;let C=f.play();!C||typeof C.catch!="function"||C.catch(_=>ro(`play() failed (${d})`,_))},[]),R=(0,z.useCallback)(d=>{let f=A();if(f){for(let C of f.getVideoTracks())C!==d&&f.removeTrack(C);if(d&&!f.getVideoTracks().includes(d)){f.addTrack(d);let C=S.current;C&&(C.srcObject=f)}d&&V("track-attach"),E(d!==null),v.current?.(d)}},[A,V]),M=(0,z.useCallback)(d=>{S.current=d,d&&(i&&(d.muted=!0,d.defaultMuted=!0,d.setAttribute("muted","")),d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),A())},[A,i]);(0,z.useImperativeHandle)(r,()=>({get element(){return S.current},get live(){return x.current?x.current.getVideoTracks().length>0:!1}}),[]);let l=s!==void 0;return(0,z.useEffect)(()=>{if(l){R(s??null);return}if(!P)return;let d=P.stream(n),f=()=>{let y=x.current;return y?y.getVideoTracks()[0]??null:null},C=y=>{if(y!==f()&&(R(y),y)){let O=()=>{f()===y&&R(null)};y.addEventListener("ended",O)}},_=d.track;_&&_.readyState==="live"&&C(_);let K=d.on("track",y=>{y&&y.readyState!=="live"||C(y)}),U=setInterval(()=>{let y=d.track;y&&y.readyState==="live"&&C(y)},to);return()=>{K(),clearInterval(U)}},[P,n,l,s,R]),(0,vt.jsxs)("div",{className:c,style:{position:"relative",width:"100%",height:"100%",...g},"data-urun-video":"","data-urun-video-live":T?"true":"false",children:[(0,vt.jsx)("video",{ref:M,className:p,autoPlay:!0,muted:i,playsInline:!0,style:{width:"100%",height:"100%",objectFit:u,...a?{transform:"scaleX(-1)"}:{}}}),T?null:k,b]})});var rn=require("react");var on=require("react/jsx-runtime"),nn=(0,rn.forwardRef)(function(t,r){let{stream:o="image",...n}=t;return(0,on.jsx)(ht,{ref:r,stream:o,...n})});var D=require("react"),an=require("@urun-sh/core");var yt=null;function no(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function tt(){if(yt)return yt;let e=no();return e?(yt=new e,yt):null}function rt(){let e=tt();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var cn=require("react/jsx-runtime"),oo=1e3,sn=200;function or(...e){console.debug("[audio]",...e)}var nt=(0,D.forwardRef)(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:g}=t,p=le(),k=o??p,b=(0,D.useRef)(null),h=(0,D.useRef)(null),m=(0,D.useRef)(null),P=(0,D.useRef)(null),S=(0,D.useRef)(u);S.current=u;let x=(0,D.useRef)(c);x.current=c;let T=(0,D.useCallback)(l=>{m.current!==l&&(m.current=l,x.current?.(l))},[]),E=(0,D.useCallback)(()=>{if(typeof MediaStream>"u")return null;h.current||(h.current=new MediaStream);let l=b.current;return l&&l.srcObject!==h.current&&(l.srcObject=h.current),h.current},[]),v=(0,D.useCallback)(l=>{let d=b.current;if(!d)return;let f=d.play();!f||typeof f.then!="function"||f.then(()=>{d.muted||T(!0)}).catch(C=>{let _=C instanceof Error?C.name:String(C);if(_==="AbortError"){or(`play() aborted (${l}); retrying in ${sn}ms`),P.current&&clearTimeout(P.current),P.current=setTimeout(()=>{P.current=null,v(`${l}:retry`)},sn);return}if(_==="NotAllowedError"){or(`play() blocked pending a user gesture (${l})`),T(!1);return}or(`play() failed (${l})`,C)})},[T]),A=(0,D.useCallback)(l=>{let d=E();if(d){for(let f of d.getAudioTracks())f!==l&&d.removeTrack(f);l&&!d.getAudioTracks().includes(l)&&d.addTrack(l),l&&v("track-attach"),S.current?.(l)}},[E,v]),V=(0,D.useCallback)(()=>{let l=b.current;l&&(E(),l.muted=!1,v("gesture"),rt(),T(!0))},[E,v,T]);(0,D.useImperativeHandle)(r,()=>({unlock:V,get unlocked(){return m.current===!0},get element(){return b.current}}),[V]);let R=(0,D.useCallback)(l=>{b.current=l,l&&(l.setAttribute("playsinline",""),l.setAttribute("webkit-playsinline",""),E()),g?.(l)},[E,g]),M=s!==void 0;return(0,D.useEffect)(()=>{if(M){A(s??null);return}if(!k)return;let l=k.stream(n),d=()=>{let U=h.current;return U?U.getAudioTracks()[0]??null:null},f=U=>{if(U!==d()&&(A(U),U)){let y=()=>{d()===U&&A(null)};U.addEventListener("ended",y)}},C=l.track;C&&C.readyState==="live"&&f(C);let _=l.on("track",U=>{U&&U.readyState!=="live"||f(U)}),K=setInterval(()=>{let U=l.track;U&&U.readyState==="live"&&f(U)},oo);return()=>{_(),clearInterval(K)}},[k,n,M,s,A]),(0,D.useEffect)(()=>(0,an.observePageLifecycle)(()=>{rt(),m.current===!0&&v("foreground")}),[v]),(0,D.useEffect)(()=>()=>{P.current&&clearTimeout(P.current)},[]),(0,cn.jsx)("audio",{ref:R,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),un=nt;var L=require("react"),qe=require("@urun-sh/core");var dn=require("react/jsx-runtime"),sr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function kt(...e){console.debug("[voice]",...e)}var ot=(0,L.forwardRef)(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=sr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:g,onError:p,onMicStream:k,onTrack:b,onUnlockChange:h,capture:m}=t,P=le(),S=o??P,x=(0,L.useRef)(null),T=(0,L.useRef)(null),E=(0,L.useRef)(null),v=(0,L.useRef)([]),A=(0,L.useRef)(!1),V=(0,L.useRef)(g);V.current=g;let R=(0,L.useRef)(p);R.current=p;let M=(0,L.useRef)(k);M.current=k;let l=(0,L.useCallback)(y=>{A.current!==y&&(A.current=y,V.current?.(y))},[]),d=(0,L.useCallback)(()=>{for(let y of v.current)y();v.current=[],E.current?.release(),E.current=null,T.current&&(T.current=null,M.current?.(null))},[]),f=(0,L.useCallback)(async()=>{let y=E.current;if(y){let $=await y.update(i);return T.current=y.stream,M.current?.(y.stream),$}let j=await(m??(0,qe.sharedCaptureController)()).claim("audio",i);E.current=j,v.current=[j.onTrack(($,ue)=>{T.current=ue,M.current?.(ue),A.current&&S?.stream(n).attach($).catch(Z=>kt("mic re-attach after one-capture re-acquire failed",Z))}),j.onLost($=>{E.current=null,v.current=[],T.current=null,M.current?.(null),l(!1),R.current?.($)})],T.current=j.stream,M.current?.(j.stream);let X=j.track;if(!X)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return X},[m,i,S,n,l]),C=(0,L.useCallback)(async()=>{d(),l(!1),await S?.stream(n).detach().catch(()=>{})},[S,n,d,l]),_=(0,L.useCallback)(async()=>{if(!S)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");x.current?.unlock();let y;try{y=await f()}catch(X){d();let $=(0,qe.sessionFailureFromMediaError)(X,S.status);throw R.current?.($),$}S.connect?.();let O;for(let X=1;X<=u;X++)try{await S.whenLive(a!==void 0?{timeout:a}:void 0),await S.stream(n).attach(y),l(!0);return}catch($){O=$,kt(`start attempt ${X}/${u} failed`,$),X<u&&await new Promise(ue=>setTimeout(ue,c))}d(),l(!1);let j=O instanceof Error?O:new Error(String(O??"voice start failed"));throw R.current?.(j),j},[S,n,a,u,c,f,d,l]);(0,L.useImperativeHandle)(r,()=>({start:_,stop:C,unlock:()=>x.current?.unlock(),get active(){return A.current},get micStream(){return T.current},get audio(){return x.current}}),[_,C]);let K=(0,L.useRef)(!1),U=(0,L.useCallback)(async()=>{if(!S||!A.current||K.current)return;let y=T.current?.getAudioTracks()[0]??null;if(y&&y.readyState==="live"){try{await S.stream(n).attach(y)}catch(O){kt("foreground mic re-assert failed (will retry on next pass)",O)}return}K.current=!0;try{let O=await f();await S.stream(n).attach(O)}catch(O){let j=O instanceof Error?O:new Error(String(O));kt("foreground mic re-acquire failed",j),R.current?.(j)}finally{K.current=!1}},[S,n,f]);return(0,L.useEffect)(()=>{let y=()=>{U()};return S&&typeof S.onRecovery=="function"?S.onRecovery(y):(0,qe.observePageLifecycle)(y)},[S,U]),(0,L.useEffect)(()=>d,[d]),s?(0,dn.jsx)(nt,{ref:x,session:S,stream:n,onTrack:b,onUnlockChange:h}):null}),ln=ot;var ie=require("react");var bt=require("react");var ir={level:0,speaking:!1};function Pt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=(0,bt.useState)(ir);return(0,bt.useEffect)(()=>{if(!e){i(ir);return}let a=tt();if(!a||typeof MediaStream>"u")return;let u;e instanceof MediaStream?u=e:(u=new MediaStream,u.addTrack(e));let c,g;try{c=a.createMediaStreamSource(u),g=a.createAnalyser(),g.fftSize=r,c.connect(g)}catch{return}let p=new Uint8Array(g.fftSize),b=setInterval(()=>{g.getByteTimeDomainData(p);let h=0;for(let P=0;P<p.length;P++){let S=(p[P]-128)/128;h+=S*S}let m=Math.sqrt(h/p.length);i(P=>{let S=m>n;return Math.abs(P.level-m)<.005&&P.speaking===S?P:{level:m,speaking:S}})},o);return()=>{clearInterval(b),c.disconnect(),i(ir)}},[e,r,o,n]),s}var ge=require("react/jsx-runtime"),so={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},io={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},pn=(0,ie.forwardRef)(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:u,onActiveChange:c,onError:g,onMicStream:p,capture:k}=t,b=le(),h=o??b,m=(0,ie.useRef)(null),[P,S]=(0,ie.useState)(null),x=(0,ie.useRef)(p);x.current=p;let{level:T,speaking:E}=Pt(a?P:null);return(0,ie.useImperativeHandle)(r,()=>({start:()=>{let v=m.current;return v?v.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>m.current?.stop()??Promise.resolve(),get active(){return m.current?.active??!1},get micStream(){return m.current?.micStream??null}}),[]),(0,ie.useEffect)(()=>{!i||!h||m.current?.start().catch(()=>{})},[i,h]),(0,ge.jsxs)(ge.Fragment,{children:[(0,ge.jsx)(ot,{ref:m,session:h,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...k!==void 0?{capture:k}:{},onActiveChange:c,onError:g,onMicStream:v=>{S(v),x.current?.(v)}}),a?(0,ge.jsx)("span",{className:u,style:so,"data-urun-mic":"","data-urun-mic-active":P?"true":"false","data-urun-mic-speaking":E?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(T*100)/100,children:(0,ge.jsx)("span",{style:io,children:(0,ge.jsx)("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(T*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});var Ct=require("@urun-sh/core"),w=require("react");var re=require("react/jsx-runtime"),ur={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function ar(...e){console.debug("[camera]",...e)}function ao(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function uo(){let e=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof e?.enumerateDevices!="function")return null;try{return(await e.enumerateDevices()).filter(r=>r.kind==="videoinput")}catch{return null}}var cr=(0,w.forwardRef)(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:u,autoStart:c=!0,mirror:g="auto",connectTimeoutMs:p,visible:k=!1,className:b,videoClassName:h,onActiveChange:m,onError:P,onStream:S,onTrack:x,children:T,capture:E,flipControl:v="auto",flipControlClassName:A,onDevices:V}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let R=i?"user":a?"environment":u??"environment",M=le(),l=o??M,d=(0,w.useRef)(null),f=(0,w.useRef)(null),C=(0,w.useRef)(null),_=(0,w.useRef)([]),K=(0,w.useRef)(null),U=(0,w.useRef)(!1),y=(0,w.useRef)(R),[O,j]=(0,w.useState)(R),[X,$]=(0,w.useState)(!1),[ue,Z]=(0,w.useState)(null),[H,N]=(0,w.useState)(!1),[W]=(0,w.useState)(ao),se=(0,w.useRef)(m);se.current=m;let de=(0,w.useRef)(P);de.current=P;let Ht=(0,w.useRef)(S);Ht.current=S;let ut=(0,w.useRef)(x);ut.current=x;let mr=(0,w.useRef)(V);mr.current=V;let ve=(0,w.useCallback)(I=>{U.current!==I&&(U.current=I,$(I),se.current?.(I))},[]);(0,w.useEffect)(()=>{if(!X){Z(null);return}let I=!1,q=()=>{uo().then(te=>{I||(Z(te),te&&mr.current?.(te))})};q();let Y=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof Y?.addEventListener=="function"?(Y.addEventListener("devicechange",q),()=>{I=!0,Y.removeEventListener?.("devicechange",q)}):()=>{I=!0}},[X]);let ct=(0,w.useCallback)(I=>{let q=d.current;q&&(q.muted=!0,q.defaultMuted=!0,q.setAttribute("muted",""),q.setAttribute("playsinline",""),q.setAttribute("webkit-playsinline",""),q.srcObject=I,I&&q.play()?.catch?.(Y=>ar("preview play() failed",Y)))},[]),pe=(0,w.useCallback)(()=>{K.current?.(),K.current=null;for(let I of _.current)I();_.current=[],C.current?.release(),C.current=null,f.current&&(f.current=null,Ht.current?.(null),ut.current?.(null)),ct(null)},[ct]),Wt=(0,w.useCallback)((I,q)=>{K.current?.(),f.current=q,ct(q),Ht.current?.(q);let Y=()=>{f.current===q&&(ar("camera track ended (device removed or permission revoked)"),pe(),ve(!1))};I.addEventListener("ended",Y),K.current=()=>I.removeEventListener("ended",Y)},[ct,pe,ve]),Ue=(0,w.useCallback)(async I=>{if(!l)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let q={...ur,...s,facingMode:I},Y;try{let te=C.current;if(te)Y=await te.update(q);else{let Ke=await(E??(0,Ct.sharedCaptureController)()).claim("video",q);if(C.current=Ke,_.current=[Ke.onTrack((je,Dn)=>{Wt(je,Dn),U.current&&l.stream(n).attachVideo(je).then(()=>ut.current?.(je)).catch(Vn=>ar("camera re-publish after one-capture re-acquire failed",Vn))}),Ke.onLost(je=>{C.current=null,_.current=[],pe(),ve(!1),de.current?.(je)})],!Ke.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});Y=Ke.track}}catch(te){let Me=(0,Ct.sessionFailureFromMediaError)(te,l.status);throw de.current?.(Me),Me}y.current=I,j(I),Wt(Y,C.current?.stream??new MediaStream([Y]));try{l.connect?.(),await l.whenLive(p!==void 0?{timeout:p}:void 0),await l.stream(n).attachVideo(Y)}catch(te){pe(),ve(!1);let Me=te instanceof Error?te:new Error(String(te));throw de.current?.(Me),Me}ut.current?.(Y),ve(!0)},[l,n,s,p,E,Wt,pe,ve]),fr=(0,w.useCallback)(I=>Ue(I?.facingMode??y.current),[Ue]),lt=(0,w.useCallback)(async I=>{U.current&&y.current===I||await Ue(I)},[Ue]),Bt=(0,w.useCallback)(()=>Ue(y.current==="environment"?"user":"environment"),[Ue]),gr=(0,w.useCallback)(async()=>{pe(),ve(!1),await l?.stream(n).detachVideo().catch(()=>{})},[l,n,pe,ve]);(0,w.useImperativeHandle)(r,()=>({start:fr,stop:gr,flip:Bt,setFacingMode:lt,get active(){return U.current},get facingMode(){return y.current},get stream(){return f.current},get element(){return d.current}}),[fr,gr,Bt,lt]);let Sr=(0,w.useRef)(lt);if(Sr.current=lt,(0,w.useEffect)(()=>{!c||!l||Sr.current(R).catch(()=>{})},[c,l,R]),(0,w.useEffect)(()=>pe,[pe]),!k)return null;let In=g==="auto"?O==="user":g,Ln=X&&(v===!0||v==="auto"&&W&&(ue?.length??0)>1),On=()=>{H||(N(!0),Bt().catch(()=>{}).finally(()=>N(!1)))};return(0,re.jsxs)("div",{className:b,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":O,children:[(0,re.jsx)("video",{ref:d,className:h,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...In?{transform:"scaleX(-1)"}:{}}}),Ln?(0,re.jsx)("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:On,disabled:H,className:A,style:A?{opacity:H?.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:H?.6:1},children:(0,re.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,re.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,re.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,re.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,re.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,re.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,T]})}),mn=(0,w.forwardRef)(function({preview:t=!0,...r},o){return(0,re.jsx)(cr,{ref:o,...r,visible:t,autoStart:!1})});var xt=require("react");function fn(e,t){let[r,o]=(0,xt.useState)(null);return(0,xt.useEffect)(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}var hn=require("react");var wt=require("react");var gn=require("zustand/vanilla"),Sn=require("zustand"),co=()=>{};function Tt(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=(0,gn.createStore)(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let c of s)c();s=null}},a=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",c=>n.setState({doc:c})),e.onSynced(()=>n.setState({synced:!0}))]),i):co,u=(c=>(0,Sn.useStore)(n,c));return Object.assign(u,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),u}function Fe(e,t){let r=(0,wt.useMemo)(()=>Tt(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return(0,wt.useEffect)(()=>r.bind(),[r]),r}function vn(e,t,r){let n=Fe(e,t)(r??(a=>a)),s=(0,hn.useCallback)(a=>{e&&t&&e.doc(t).set(a)},[e,t]);if(r)return n;let i=n;return{snapshot:e&&t?i.doc:null,synced:i.synced,set:s}}var Rt=require("react");var ke=200;function Se(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function He(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Et(e){let t=e.trim();if(!t)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(t)}catch(o){return{ok:!1,error:o instanceof Error?o.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 At(e,t,r={}){let o=r.cap??200,[n,s]=(0,Rt.useState)([]);return(0,Rt.useEffect)(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let u=await a.next();if(!i||u.done)break;s(c=>Se(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}var ae=require("react/jsx-runtime");function yn({session:e,name:t,cap:r,className:o}){let n=At(e,t,{cap:r});return(0,ae.jsxs)("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[(0,ae.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,ae.jsx)("code",{children:t}),(0,ae.jsxs)("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),(0,ae.jsx)("div",{className:"urun-stream-tail-log",children:n.length===0?(0,ae.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,ae.jsx)("code",{children:t})," messages\u2026"]}):n.map((s,i)=>(0,ae.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,ae.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",He(s.payload)]},`${s.at}-${i}`))})]})}var st=require("react");var ee=require("react/jsx-runtime");function it({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=(0,st.useState)(""),[i,a]=(0,st.useState)(null),u=(0,st.useCallback)(()=>{let c=Et(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return(0,ee.jsxs)("div",{className:"urun-doc-patch",children:[(0,ee.jsx)("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),(0,ee.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,ee.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?(0,ee.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function kn({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=Fe(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return(0,ee.jsxs)("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[(0,ee.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,ee.jsx)("code",{children:t}),(0,ee.jsx)("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),(0,ee.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?(0,ee.jsx)(it,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}var Ut=require("react");var he=require("react/jsx-runtime");function bn(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function Pn({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=(0,Ut.useState)([]);return(0,Ut.useEffect)(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>Se(u,{at:Date.now(),direction:"in",text:bn(He(a))},r))}):void 0),[e,t,r]),(0,he.jsxs)("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[(0,he.jsx)(it,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>Se(u,{at:Date.now(),direction:"out",text:bn(a)},r))}}),(0,he.jsx)("div",{className:"urun-control-sender-log",children:n.length===0?(0,he.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>(0,he.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,he.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,he.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}var Mt=require("react");var Re=require("react/jsx-runtime");function Cn({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=(0,Mt.useState)([]),a=t.join(","),u=r.join(",");return(0,Mt.useEffect)(()=>{if(i([]),!e)return;let c=(p,k)=>i(b=>Se(b,{at:Date.now(),kind:p,text:k},o)),g=[];g.push(e.onPhase(p=>c("phase",`phase \u2192 ${p.name}`)));for(let p of t){let k=e.stream(p);g.push(k.on("track",b=>c("track",`${p}: ${b?"track arrived":"track ended"}`)))}for(let p of r){let k=e.doc(p);g.push(k.on("change",()=>c("doc",`${p} changed`)))}return()=>g.forEach(p=>p())},[e,a,u,o]),(0,Re.jsx)("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?(0,Re.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((c,g)=>(0,Re.jsxs)("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[(0,Re.jsx)("span",{className:"urun-event-spine-kind",children:c.kind})," ",(0,Re.jsx)("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${g}`))})}var Vt=require("@urun-sh/core");var _t=require("react");function ne(e){let[t,r]=(0,_t.useState)(e?.phase??null);return(0,_t.useEffect)(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}var Tn=require("@urun-sh/core");var We=require("react"),xn=require("@urun-sh/core");function Nt(e){let t=ne(e),r=(0,xn.isWakingPhase)(t?.name),o=(0,We.useRef)(void 0);r?o.current??=Date.now():o.current=void 0;let n=r?t?.wakingSince??o.current:void 0,s=()=>n!==void 0?Math.max(0,Math.floor((Date.now()-n)/1e3)):0,[i,a]=(0,We.useState)(s);return(0,We.useEffect)(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let u=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(u)},[n]),{waking:r,phase:t,state:r?t?.runtime?.state:void 0,reason:r?t?.runtime?.reason:void 0,since:n,seconds:r?i:0}}var be=require("react/jsx-runtime");function It({session:e,render:t,className:r}){let o=Nt(e);return!o.waking||!o.phase?null:(0,be.jsx)("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):(0,be.jsxs)(be.Fragment,{children:[(0,be.jsx)("span",{className:"urun-session-waking-label",children:(0,Tn.describeSessionPhase)(o.phase)})," ",(0,be.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}var Ot=require("react");var Pe=require("react"),lo={event:null,elapsedMs:0};function Lt(e,t){let[r,o]=(0,Pe.useState)(null),n=(0,Pe.useRef)(0);(0,Pe.useEffect)(()=>{if(o(null),!!e?.onActivation)return e.onActivation(a=>{t!==void 0&&a.stream!==t||(n.current=Date.now(),o(a))})},[e,t]);let[s,i]=(0,Pe.useState)(0);return(0,Pe.useEffect)(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,u=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(u());let c=setInterval(()=>i(u()),1e3);return()=>clearInterval(c)},[r]),r?{event:r,elapsedMs:s}:lo}var Be=require("react/jsx-runtime"),po={activating:"starting stream\u2026","still-activating":"model warming up \u2014 this can take a minute","cold-boot":"cold boot \u2014 compiling/loading the model, hang tight",degraded:"taking longer than usual \u2014 still trying"};function mo(e){let[t,r]=(0,Ot.useState)(!1);return(0,Ot.useEffect)(()=>{if(r(!1),!e)return;let o=e;if(typeof o.requestVideoFrameCallback=="function"){let s=o.requestVideoFrameCallback(()=>r(!0));return()=>o.cancelVideoFrameCallback?.(s)}let n=()=>{let s=o.getVideoPlaybackQuality?.();(s?s.totalVideoFrames>0:o.readyState>=2)&&r(!0)};return n(),o.addEventListener("loadeddata",n),o.addEventListener("timeupdate",n),()=>{o.removeEventListener("loadeddata",n),o.removeEventListener("timeupdate",n)}},[e]),t}function Dt({session:e,stream:t,videoElement:r,render:o,className:n}){let s=Lt(e,t),i=mo(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return(0,Be.jsx)("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):(0,Be.jsxs)("div",{className:"urun-activation-overlay-card",children:[(0,Be.jsx)("span",{className:"urun-activation-overlay-copy",children:a.hint??po[u]})," ",(0,Be.jsxs)("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}var oe=require("react/jsx-runtime"),fo={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function wn({session:e,className:t}){let r=ne(e),o=r?.name??"idle",n=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&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return(0,oe.jsxs)("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[(0,oe.jsx)("span",{className:"urun-session-status-dot","data-phase":o}),(0,oe.jsx)("span",{className:"urun-session-status-label",children:fo[o]}),n?(0,oe.jsx)("span",{className:"urun-session-status-detail",children:n}):null]})}function En({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=ne(e);if(s?.name==="live")return(0,oe.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,(0,oe.jsx)(Dt,{session:e})]});let i=r?r(s):(0,oe.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,Vt.isWakingPhase)(s.name)?(0,oe.jsx)(It,{session:e}):s&&s.name!=="idle"?(0,Vt.describeSessionPhase)(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,oe.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?(0,oe.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}var qt=require("react");var An=require("react/jsx-runtime");function lr(e){return ne(e)?.endsAt??null}function go(e){let t=Math.max(0,Math.floor(e/1e3)),r=Math.floor(t/60),o=t%60;return`${String(r).padStart(2,"0")}:${String(o).padStart(2,"0")}`}function Rn({session:e,urgentMs:t=6e4,className:r}){let n=lr(e)?.getTime()??null,[s,i]=(0,qt.useState)(()=>n===null?null:Math.max(0,n-Date.now()));if((0,qt.useEffect)(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),s===null)return null;let a=go(s);return(0,An.jsx)("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<t?"":void 0,"data-expired":s<=0?"":void 0,children:a})}var at=require("react/jsx-runtime"),So=new Set(["expired","ended","error"]);function Un({session:e,onNewSession:t,children:r,className:o}){let n=ne(e);if(!n||!So.has(n.name))return null;let s=r?r(n):(0,at.jsx)("span",{className:"urun-session-ended-copy",children:n.name==="expired"?"Session ended \u2014 start a new session":n.name==="error"?`Session failed${n.error?.reason?` \u2014 ${n.error.reason}`:""}.`:"Session ended."});return(0,at.jsxs)("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?(0,at.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}var Ce=require("react"),Ae=require("react/jsx-runtime");function dr(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;return t.warning!==!0?null:{warning:!0,deadlineEpochS:typeof t.deadline_epoch_s=="number"?t.deadline_epoch_s:null,idleSinceEpochS:typeof t.idle_since_epoch_s=="number"?t.idle_since_epoch_s:null}}function pr(e){let t=(0,Ce.useMemo)(()=>e?e.doc("control"):null,[e]),[r,o]=(0,Ce.useState)(()=>t?dr(t.get("idle")):null);return(0,Ce.useEffect)(()=>{if(!t){o(null);return}return o(dr(t.get("idle"))),t.on("change",()=>o(dr(t.get("idle"))))},[t]),r}function ho(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function Mn({session:e,onStillHere:t,className:r}){let o=pr(e),n=o?.deadlineEpochS??null,[s,i]=(0,Ce.useState)(null);if((0,Ce.useEffect)(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()/1e3));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return(0,Ae.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,Ae.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,Ae.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,Ae.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${ho(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,Ae.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}var $e=require("react"),_n=require("@urun-sh/core");function Nn(e){let t=(0,$e.useContext)(Ne),[r,o]=(0,$e.useState)(null),n=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,u=t?.orgId,c=t?.jwt,g=t?.getAccessToken,p=t?.authProvider;return(0,$e.useEffect)(()=>{if(!a||!u||!n||!s)return;let k=!1,b=()=>{(0,_n.prewake)({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:g,authProvider:p}).then(m=>{k||o(m)}).catch(()=>{})};b();let h=setInterval(b,Math.max(1,i)*1e3);return()=>{k=!0,clearInterval(h)}},[n,s,i,a,u,c,g,p]),r}var Ft=require("@urun-sh/core");0&&(module.exports={Audio,Camera,ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,Image,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,Mic,OPERATOR_CHORD_LABEL,OPERATOR_TOKEN_STORAGE_KEY,ProgressCard,ProgressCardSchema,Session,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunActivationOverlay,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunIdleWarning,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,Video,Voice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,readOperatorToken,registerComponent,resumeUrunAudioContext,urunPublicEnv,useActivation,useApp,useChat,useCompletion,useConfirmOnLeave,useDocStore,useImageFrame,useInputPresence,useMetricsPanel,useOperatorOverride,useProgressCard,useRequest,useSession,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
|
|
2
|
+
"use strict";var Kt=Object.defineProperty;var Fn=Object.getOwnPropertyDescriptor;var Hn=Object.getOwnPropertyNames;var Wn=Object.prototype.hasOwnProperty;var Bn=(e,t)=>{for(var r in t)Kt(e,r,{get:t[r],enumerable:!0})},$n=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Hn(t))!Wn.call(e,n)&&n!==r&&Kt(e,n,{get:()=>t[n],enumerable:!(o=Fn(t,n))||o.enumerable});return e};var Kn=e=>$n(Kt({},"__esModule",{value:!0}),e);var yo={};Bn(yo,{Audio:()=>st,Camera:()=>lr,ComponentRenderer:()=>Br,DEFAULT_CAMERA_CONSTRAINTS:()=>cr,DEFAULT_LOG_CAP:()=>be,DEFAULT_VOICE_CONSTRAINTS:()=>ir,DocPatchForm:()=>ut,Image:()=>on,ImageFrame:()=>Yr,ImageFrameSchema:()=>Gr,MetricsPanel:()=>Qr,MetricsPanelSchema:()=>Zr,Mic:()=>mn,OPERATOR_CHORD_LABEL:()=>wr,OPERATOR_TOKEN_STORAGE_KEY:()=>xr,ProgressCard:()=>Kr,ProgressCardSchema:()=>$r,Session:()=>en,StatusBadge:()=>Jr,StatusBadgeSchema:()=>jr,TextStream:()=>Xr,TextStreamSchema:()=>zr,UrunActivationOverlay:()=>qt,UrunAudio:()=>cn,UrunAuthProvider:()=>jt,UrunCamera:()=>fn,UrunControlSender:()=>Cn,UrunDocPanel:()=>bn,UrunErrorBoundary:()=>Ie,UrunEventSpine:()=>xn,UrunIdleWarning:()=>_n,UrunJwtProvider:()=>br,UrunProvider:()=>Ur,UrunSessionClock:()=>An,UrunSessionEnded:()=>Mn,UrunSessionGate:()=>Rn,UrunSessionStatus:()=>En,UrunSessionWaking:()=>Ot,UrunStreamTail:()=>kn,UrunVoice:()=>dn,Video:()=>yt,Voice:()=>it,authMode:()=>Ge,createDocStore:()=>Et,describeSessionPhase:()=>Wt.describeSessionPhase,formatPayload:()=>Be,getUrunAudioContext:()=>nt,isWakingPhase:()=>Wt.isWakingPhase,parseJsonObject:()=>At,pushCapped:()=>he,readOperatorToken:()=>Jt,registerComponent:()=>Hr,resumeUrunAudioContext:()=>ot,urunPublicEnv:()=>fe,useActivation:()=>Dt,useApp:()=>_r,useChat:()=>Vr,useCompletion:()=>Lr,useConfirmOnLeave:()=>St,useDocStore:()=>We,useImageFrame:()=>rr,useInputPresence:()=>qr,useMetricsPanel:()=>nr,useOperatorOverride:()=>gt,useProgressCard:()=>Qt,useRequest:()=>Nr,useSession:()=>tn,useSessionDoc:()=>yn,useSessionEndsAt:()=>dr,useSessionIdle:()=>mr,useSessionPhase:()=>oe,useSessionTrack:()=>gn,useSessionWake:()=>Lt,useStatusBadge:()=>er,useStreamMessages:()=>Mt,useTextStream:()=>tr,useUrunAudioLevel:()=>xt,useUrunAuth:()=>mt,useUrunPrewake:()=>In,usesWorkOSAuth:()=>yr});module.exports=Kn(yo);var Y=require("react");var hr=require("react"),Xe=require("react/jsx-runtime"),Ie=class extends hr.Component{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,r){console.error("[urun] Error caught by UrunErrorBoundary:",t,r)}render(){if(this.state.error){let{fallback:t}=this.props;return typeof t=="function"?t(this.state.error):t||(0,Xe.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,Xe.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,Xe.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var vr=require("react"),Le=(0,vr.createContext)(null);function Te(e){return e&&e.trim()?e.trim():void 0}function fe(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return Te(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return Te(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return Te(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return Te(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return Te(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return Te(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return Te(typeof process<"u"?process.env?.[e]:void 0)}}function Ge(){let e=fe("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||fe("VERCEL_ENV")==="production"?"workos":fe("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function yr(){return Ge()==="workos"}var Oe=require("react"),Pr=require("react/jsx-runtime"),kr=(0,Oe.createContext)(null);function jt({getAccessToken:e,children:t}){let r=(0,Oe.useMemo)(()=>({getAccessToken:e}),[e]);return(0,Pr.jsx)(kr.Provider,{value:r,children:t})}var br=jt;function mt(){return(0,Oe.useContext)(kr)}var ft=require("react"),xr="urun.operator_token",Tr=null,Cr="op",wr="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function Er(){return typeof window<"u"}function Jt(){return Tr}function jn(){if(!Er())return null;let e=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash;if(!e)return null;let t=new URLSearchParams(e),r=t.get(Cr);if(!r)return null;Tr=r,t.delete(Cr);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function Jn(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function gt(e){let t=(0,ft.useRef)(e);t.current=e,(0,ft.useEffect)(()=>{if(!Er())return;jn();let r=o=>{if(!Jn(o))return;let n=Jt();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}var Rr=require("react");function St(e=!0){(0,Rr.useEffect)(()=>{if(!e||typeof window>"u"||typeof window.addEventListener!="function")return;let t=r=>(r.preventDefault(),r.returnValue="","");return window.addEventListener("beforeunload",t),()=>window.removeEventListener("beforeunload",t)},[e])}var ke=require("react/jsx-runtime"),zn="/api/urun-token";async function Ar(e,t){let r=await fetch(e,{method:"POST",signal:t});if(!r.ok)throw new Error(`[urun] token endpoint ${e} answered ${r.status}`);let o=await r.json(),n=typeof o.token=="string"?o.token:"",s=typeof o.orgId=="string"?o.orgId:"";if(!n||!s)throw new Error(`[urun] token endpoint ${e} returned no { token, orgId } \u2014 is it createTokenRoute() from @urun-sh/next?`);return{token:n,orgId:s,gatewayUrl:typeof o.gatewayUrl=="string"?o.gatewayUrl:void 0}}function Xn(e,t){return typeof e=="function"?e(t):e!==void 0?e:(0,ke.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,ke.jsx)("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),(0,ke.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function Ur({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,confirmOnLeave:g=!1,fallback:d,errorFallback:k,children:P}){let S=n===void 0&&t===void 0;if(!S&&(typeof t!="string"||t.trim().length===0))throw new Error("[urun] <UrunProvider> requires a non-empty orgId \u2014 set your org id deployment env var (e.g. NEXT_PUBLIC_SESSION_TENANT_ID) and pass it through the provider (or pass NEITHER orgId NOR jwt to let the provider mint from its tokenEndpoint).");if(!S&&(typeof e!="string"||e.trim().length===0))throw new Error("[urun] <UrunProvider> requires baseUrl when orgId/jwt are passed explicitly (self-mint mode reads it from the token endpoint instead).");let p=r??o;if(S&&(typeof p!="string"||p.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);St(g);let[C,h]=(0,Y.useState)(),[x,T]=(0,Y.useState)(),[E,v]=(0,Y.useState)(null),A=(0,Y.useRef)(void 0),L=(0,Y.useRef)(null),[U,M]=(0,Y.useState)(null);gt($=>M({jwt:$}));let l=mt(),m=fe("NEXT_PUBLIC_SESSION_TOKEN")??fe("NEXT_PUBLIC_URUN_JWT"),f=Ge(),b=U!==null,_=f==="workos"&&!n&&!b&&!S,z=n??(f==="jwt"?m:void 0)??C??x?.token,R=b?U.jwt:z,y=s??fe("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),D=_&&!R,H=t??x?.orgId,W=e??x?.gatewayUrl,K=S&&x===void 0,le=S&&x!==void 0&&!W?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,ie=E??le,Z=u??zn,B=(0,Y.useCallback)(async $=>$?.forceRefresh?(await(L.current??(L.current=(async()=>{try{let de=await Ar(Z);return A.current=de.token,T(de),de}finally{L.current=null}})()))).token:A.current,[Z]),ae=(0,Y.useMemo)(()=>({appId:p,baseUrl:W??"",orgId:H??"",jwt:R,getAccessToken:_?l?.getAccessToken:S&&!b?B:void 0,authProvider:y,eventsUrl:i,sessionKey:a,releaseOnLeave:c,priority:b?"preempt":void 0}),[p,l,W,y,R,i,H,a,c,_,b,S,B]);return(0,Y.useEffect)(()=>{if(!S)return;let $=new AbortController;return v(null),(async()=>{try{let Q=await Ar(Z,$.signal);A.current=Q.token,T(Q)}catch(Q){if($.signal.aborted)return;v(Q instanceof Error?Q:new Error(String(Q)))}})(),()=>$.abort()},[S,Z]),(0,Y.useEffect)(()=>{if(!_||!l)return;let $=!1,Q=l;async function de(){try{let lt=await Q.getAccessToken();$||h(lt??void 0)}catch{$||h(void 0)}}de();let Me=window.setInterval(()=>{de()},6e4);return()=>{$=!0,window.clearInterval(Me)}},[l,_]),(0,ke.jsx)(Ie,{fallback:d,children:ie?Xn(k,ie):D||K?(0,ke.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,ke.jsx)(Le.Provider,{value:ae,children:P})})}var ee=require("react"),Mr=require("@urun-sh/core");function Gn(e,t){return`${e}:${JSON.stringify(t??{})}`}function Yn(e,t,r){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,fnName:t,args:r??{}})}var we=new Map;var zt=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},Xt=class{constructor(t,r){this._stream=t;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(t){return this._stream.attach(t)}attachVideo(t){return this._stream.attachVideo(t)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(t){return this._stream.seek(t)}chunks(t){return this._stream.chunks(t)}onSeeked(t){return this._stream.onSeeked(t)}on(t,r){return this._stream.on(t,r)}messages(){return this._stream.messages()}emit(t,r){return this._stream.emit(t,r)}dispose(){this._unsubscribeTrack()}},Gt=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||a.name==="expired"){let u=a.error,c=u?.reason??(a.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else a.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),i=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{i(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new zt(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new Xt(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function _r(){let e=(0,ee.useContext)(Le);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=(0,ee.useReducer)(i=>i+1,0),r=(0,ee.useRef)(new Map),o=(0,ee.useRef)(new Map),n=(0,ee.useRef)(null),s=(0,ee.useMemo)(()=>(0,Mr.App)(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority]);return(0,ee.useEffect)(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=we.get(a);c===u&&o.current.get(a)===u&&(c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null),c.handle.addNotifier(t),c.refCount+=1)}}return()=>{let a=new Map;for(let[u,c]of o.current){let g=we.get(u);g===c&&(g.handle.removeNotifier(t),g.refCount=Math.max(0,g.refCount-1),a.set(u,g),g.refCount===0&&(g.disposeTimer=setTimeout(()=>{let d=we.get(u);!d||d.refCount!==0||(we.delete(u),d.handle.disconnect())},0)))}n.current=a}},[]),(0,ee.useMemo)(()=>{let i=new Map;return new Proxy({},{get(a,u){if(typeof u!="string")return;let c=i.get(u);if(c)return c;let g=d=>{let k=Gn(u,d),P=r.current.get(k);if(P&&!P.disposed)return P;let S=Yn(e,u,d),p=we.get(S);return p?.handle.disposed&&(p.disposeTimer&&clearTimeout(p.disposeTimer),we.delete(S),o.current.get(S)===p&&o.current.delete(S),p=void 0),p?p.disposeTimer&&(clearTimeout(p.disposeTimer),p.disposeTimer=null):(p={handle:new Gt(s[u](d),t,e.eventsUrl),refCount:0,disposeTimer:null},we.set(S,p)),o.current.get(S)!==p&&(o.current.set(S,p),p.handle.addNotifier(t),p.refCount+=1),r.current.set(k,p.handle),p.handle};return i.set(u,g),g}})},[e,s])}var j=require("react");function De(e){let t=e;if(!t||typeof t.request!="function"||typeof t.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 t}function Zn(e){return e instanceof Error?e:new Error(String(e))}function Nr(e,t){let r=(0,j.useMemo)(()=>De(e),[e]),[o,n]=(0,j.useState)(void 0),[s,i]=(0,j.useState)(null),[a,u]=(0,j.useState)(!1),c=(0,j.useRef)(t);c.current=t;let g=(0,j.useRef)(0),d=(0,j.useRef)(null),k=(0,j.useRef)(!0);(0,j.useEffect)(()=>(k.current=!0,()=>{k.current=!1,d.current?.abort()}),[]);let P=(0,j.useCallback)(async C=>{d.current?.abort();let h=new AbortController;d.current=h;let x=++g.current,T=()=>k.current&&g.current===x;T()&&(u(!0),i(null));try{let E=await r.request(C,{...c.current,signal:h.signal});return T()&&(n(E),u(!1),c.current?.onSuccess?.(E)),E}catch(E){let v=Zn(E);throw T()&&(i(v),u(!1),c.current?.onError?.(v)),v}},[r]),S=(0,j.useCallback)(C=>{P(C).catch(()=>{})},[P]),p=(0,j.useCallback)(()=>{g.current++,d.current?.abort(),d.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:S,mutateAsync:P,data:o,error:s,isPending:a,reset:p}}var X=require("react");function Ir(e){return e instanceof Error?e:new Error(String(e))}var Qn=e=>typeof e=="string"?e:String(e);function Lr(e,t){let r=(0,X.useMemo)(()=>De(e),[e]),[o,n]=(0,X.useState)(""),[s,i]=(0,X.useState)(!1),[a,u]=(0,X.useState)(null),c=(0,X.useRef)(t);c.current=t;let g=(0,X.useRef)(0),d=(0,X.useRef)(null),k=(0,X.useRef)(!0);(0,X.useEffect)(()=>(k.current=!0,()=>{k.current=!1,d.current?.cancel(),d.current=null}),[]);let P=(0,X.useCallback)(()=>{g.current++,d.current?.cancel(),d.current=null,k.current&&i(!1)},[]),S=(0,X.useCallback)(async p=>{d.current?.cancel();let C=++g.current,h=()=>k.current&&g.current===C,x=c.current,T=x?.parseChunk??Qn,E=x?.buildPayload??(f=>({prompt:f}));h()&&(n(""),u(null),i(!0));let{parseChunk:v,buildPayload:A,onFinish:L,onError:U,...M}=x??{},l="",m;try{m=r.requestStream(E(p),M),d.current=m}catch(f){let b=Ir(f);h()&&(u(b),i(!1),x?.onError?.(b));return}try{for await(let f of m){if(g.current!==C)break;l+=T(f),h()&&n(l)}h()&&(i(!1),x?.onFinish?.(l))}catch(f){let b=Ir(f);h()&&(u(b),i(!1),x?.onError?.(b))}finally{d.current===m&&(d.current=null)}},[r]);return{completion:o,complete:S,stop:P,isStreaming:s,error:a}}var F=require("react");function Or(e){return e instanceof Error?e:new Error(String(e))}var eo=e=>typeof e=="string"?e:String(e),Dr=0;function Yt(e){return Dr+=1,`${e}-${Dr}`}function Vr(e,t){let r=(0,F.useMemo)(()=>De(e),[e]),[o,n]=(0,F.useState)(()=>(t?.initialMessages??[]).map(T=>({id:T.id??Yt("msg"),role:T.role,content:T.content}))),[s,i]=(0,F.useState)(""),[a,u]=(0,F.useState)(!1),[c,g]=(0,F.useState)(null),d=(0,F.useRef)(t);d.current=t;let k=(0,F.useRef)(o);k.current=o;let P=(0,F.useRef)(s);P.current=s;let S=(0,F.useRef)(0),p=(0,F.useRef)(null),C=(0,F.useRef)(!0);(0,F.useEffect)(()=>(C.current=!0,()=>{C.current=!1,p.current?.cancel(),p.current=null}),[]);let h=(0,F.useCallback)(()=>{S.current++,p.current?.cancel(),p.current=null,C.current&&u(!1)},[]),x=(0,F.useCallback)(async T=>{let E=T===void 0,v=(E?P.current:T)??"";if(!v.trim())return;p.current?.cancel();let L=++S.current,U=()=>C.current&&S.current===L,M=d.current,l=M?.parseChunk??eo,m={id:Yt("msg"),role:"user",content:v},f={id:Yt("msg"),role:"assistant",content:""},b=[...k.current,m].map(B=>({role:B.role,content:B.content})),_=[...k.current,m,f];k.current=_,n(_),E&&i(""),g(null),u(!0);let z=M?.buildPayload??(B=>({messages:B})),{initialMessages:R,parseChunk:y,buildPayload:D,onFinish:H,onError:W,...K}=M??{},le=B=>{n(ae=>ae.map($=>$.id===f.id?{...$,content:B}:$))},ie="",Z;try{Z=r.requestStream(z(b),K),p.current=Z}catch(B){let ae=Or(B);U()&&(g(ae),u(!1),M?.onError?.(ae));return}try{for await(let B of Z){if(S.current!==L)break;ie+=l(B),U()&&le(ie)}U()&&(u(!1),M?.onFinish?.({...f,content:ie}))}catch(B){let ae=Or(B);U()&&(g(ae),u(!1),M?.onError?.(ae))}finally{p.current===Z&&(p.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:x,stop:h,isStreaming:a,error:c}}var q=require("react"),Ve=require("@urun-sh/core"),Zt=[];function qr(e,t={}){let{field:r=Ve.INPUT_PRESENCE_FIELD,hz:o=Ve.INPUT_PRESENCE_DEFAULT_HZ}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=(0,q.useMemo)(()=>s?(0,Ve.createInputPresencePublisher)({awareness:{setLocalStateField:(v,A)=>s.setField(v,A)},field:r,hz:o}):null,[s,r,o]),a=(0,q.useRef)(null);a.current=i;let[u,c]=(0,q.useState)(!1),[g,d]=(0,q.useState)(Zt),k=(0,q.useRef)(!1);(0,q.useEffect)(()=>{if(i)return()=>i.dispose()},[i]);let P=(0,q.useCallback)(()=>{let v=a.current;d(v?v.heldKeys():Zt)},[]),S=(0,q.useCallback)(()=>{a.current?.clear(),d(Zt)},[]);(0,q.useEffect)(()=>{if(!n)return;let v=()=>!!n.pointerLockElement,A=()=>{if(v()){k.current=!1,c(!0);return}k.current||(c(!1),S())},L=f=>{v()&&(a.current?.keyDown(f.key),P())},U=f=>{a.current?.keyUp(f.key),P()},M=f=>{v()&&a.current?.movePointer(f.movementX,f.movementY)},l=f=>{v()&&a.current?.setButtons(f.buttons)},m=()=>{S()};return n.addEventListener("pointerlockchange",A),n.addEventListener("keydown",L),n.addEventListener("keyup",U),n.addEventListener("mousemove",M),n.addEventListener("mousedown",l),n.addEventListener("mouseup",l),n.defaultView?.addEventListener("blur",m),()=>{n.removeEventListener("pointerlockchange",A),n.removeEventListener("keydown",L),n.removeEventListener("keyup",U),n.removeEventListener("mousemove",M),n.removeEventListener("mousedown",l),n.removeEventListener("mouseup",l),n.defaultView?.removeEventListener("blur",m)}},[n,S,P]);let p=(0,q.useCallback)(v=>{v.requestPointerLock?.()},[]),C=(0,q.useCallback)(()=>{k.current=!0,c(!0)},[]),h=(0,q.useCallback)(()=>{k.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),S()},[n,S]),x=(0,q.useCallback)(v=>{a.current?.keyDown(v),P()},[P]),T=(0,q.useCallback)(v=>{a.current?.keyUp(v),P()},[P]),E=(0,q.useCallback)((v,A)=>{a.current?.movePointer(v,A)},[]);return{engage:p,engageTouch:C,release:h,engaged:u,heldKeys:g,pressKey:x,releaseKey:T,movePointer:E}}var Fr=new Map;function Hr(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);Fr.set(e,{component:t,schema:r})}function Wr(e,t){let r=Fr.get(e);if(!r)return{error:`Unknown component: "${e}"`};let o=r.schema.safeParse(t);return o.success?{Component:r.component,validatedProps:o.data}:{error:`Validation failed for "${e}": ${o.error.message}`}}var Ee=require("react/jsx-runtime");function Br({name:e,props:t,fallback:r}){let o=Wr(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?(0,Ee.jsx)(Ee.Fragment,{children:r}):(0,Ee.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,Ee.jsx)("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return(0,Ee.jsx)(n,{...o.validatedProps})}var qe=require("zod"),Re=require("react/jsx-runtime"),$r=qe.z.object({step:qe.z.number().min(0),total:qe.z.number().min(1),label:qe.z.string().optional(),variant:qe.z.enum(["default","success","error"]).default("default")});function Qt(e){let{step:t,total:r,label:o,variant:n="default"}=e,s=Math.min(t/r*100,100),i=t>=r;return{step:t,total:r,label:o,variant:n,percentage:s,isComplete:i}}function Kr(e){let{step:t,total:r,label:o,variant:n,percentage:s}=Qt(e);return(0,Re.jsxs)("div",{className:"urun-progress-card","data-variant":n,children:[o&&(0,Re.jsx)("div",{className:"urun-progress-label",children:o}),(0,Re.jsx)("div",{className:"urun-progress-bar",children:(0,Re.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,Re.jsxs)("div",{className:"urun-progress-text",children:[t,"/",r]})]})}var ht=require("zod"),Ye=require("react/jsx-runtime"),jr=ht.z.object({state:ht.z.enum(["thinking","generating","idle","error"]),message:ht.z.string().optional()}),to={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function er(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??to[t]??t;return{state:t,message:n,isActive:o}}function Jr(e){let{state:t,message:r,isActive:o}=er(e);return(0,Ye.jsxs)("span",{className:"urun-status-badge","data-state":t,children:[(0,Ye.jsx)("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),(0,Ye.jsx)("span",{className:"urun-status-message",children:r})]})}var Ze=require("react"),vt=require("zod"),Qe=require("react/jsx-runtime"),zr=vt.z.object({text:vt.z.string(),streaming:vt.z.boolean().default(!1)});function tr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function Xr(e){let{text:t,streaming:r}=tr(e),o=(0,Ze.useRef)(null),n=(0,Ze.useRef)(0);return(0,Ze.useEffect)(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),(0,Qe.jsxs)("div",{className:"urun-text-stream",children:[(0,Qe.jsx)("span",{ref:o,className:"urun-text-content"}),r&&(0,Qe.jsx)("span",{className:"urun-text-cursor"})]})}var et=require("zod"),tt=require("react/jsx-runtime"),Gr=et.z.object({src:et.z.string().url(),alt:et.z.string().optional(),caption:et.z.string().optional()});function rr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function Yr(e){let{src:t,alt:r,caption:o}=rr(e);return(0,tt.jsxs)("figure",{className:"urun-image-frame",children:[(0,tt.jsx)("img",{className:"urun-image",src:t,alt:r}),o&&(0,tt.jsx)("figcaption",{className:"urun-image-caption",children:o})]})}var ge=require("zod"),Fe=require("react/jsx-runtime"),Zr=ge.z.object({metrics:ge.z.array(ge.z.object({label:ge.z.string(),value:ge.z.union([ge.z.string(),ge.z.number()]),unit:ge.z.string().optional()}))});function nr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function Qr(e){let{metrics:t}=nr(e);return(0,Fe.jsx)("div",{className:"urun-metrics-panel",children:t.map((r,o)=>(0,Fe.jsxs)("div",{className:"urun-metric-card",children:[(0,Fe.jsx)("div",{className:"urun-metric-label",children:r.label}),(0,Fe.jsx)("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}var rt=require("react"),rn=require("react/jsx-runtime"),or=(0,rt.createContext)(null);function en({session:e,children:t}){return(0,rn.jsx)(or.Provider,{value:e,children:t})}function pe(){return(0,rt.useContext)(or)}function tn(){let e=(0,rt.useContext)(or);if(!e)throw new Error("[urun] useSession() needs a mounted <Session session={...}> ancestor with a non-null session \u2014 create one with useApp() (e.g. app.generate({...})) and pass it to the scope.");return e}var J=require("react");var kt=require("react/jsx-runtime"),ro=1e3;function no(...e){console.debug("[video]",...e)}var yt=(0,J.forwardRef)(function(t,r){let{session:o,stream:n="video",track:s,muted:i=!0,mirror:a=!1,objectFit:u="contain",className:c,style:g,videoClassName:d,placeholder:k,children:P,onTrack:S}=t,p=pe(),C=o??p,h=(0,J.useRef)(null),x=(0,J.useRef)(null),[T,E]=(0,J.useState)(!1),v=(0,J.useRef)(S);v.current=S;let A=(0,J.useCallback)(()=>{if(typeof MediaStream>"u")return null;x.current||(x.current=new MediaStream);let m=h.current;return m&&m.srcObject!==x.current&&(m.srcObject=x.current),x.current},[]),L=(0,J.useCallback)(m=>{let f=h.current;if(!f)return;let b=f.play();!b||typeof b.catch!="function"||b.catch(_=>no(`play() failed (${m})`,_))},[]),U=(0,J.useCallback)(m=>{let f=A();if(f){for(let b of f.getVideoTracks())b!==m&&f.removeTrack(b);if(m&&!f.getVideoTracks().includes(m)){f.addTrack(m);let b=h.current;b&&(b.srcObject=f)}m&&L("track-attach"),E(m!==null),v.current?.(m)}},[A,L]),M=(0,J.useCallback)(m=>{h.current=m,m&&(i&&(m.muted=!0,m.defaultMuted=!0,m.setAttribute("muted","")),m.setAttribute("playsinline",""),m.setAttribute("webkit-playsinline",""),A())},[A,i]);(0,J.useImperativeHandle)(r,()=>({get element(){return h.current},get live(){return x.current?x.current.getVideoTracks().length>0:!1}}),[]);let l=s!==void 0;return(0,J.useEffect)(()=>{if(l){U(s??null);return}if(!C)return;let m=C.stream(n),f=()=>{let y=x.current;return y?y.getVideoTracks()[0]??null:null},b=y=>{if(y!==f()&&(U(y),y)){let D=()=>{f()===y&&U(null)};y.addEventListener("ended",D)}},_=m.track;_&&_.readyState==="live"&&b(_);let z=m.on("track",y=>{y&&y.readyState!=="live"||b(y)}),R=setInterval(()=>{let y=m.track;y&&y.readyState==="live"&&b(y)},ro);return()=>{z(),clearInterval(R)}},[C,n,l,s,U]),(0,kt.jsxs)("div",{className:c,style:{position:"relative",width:"100%",height:"100%",...g},"data-urun-video":"","data-urun-video-live":T?"true":"false",children:[(0,kt.jsx)("video",{ref:M,className:d,autoPlay:!0,muted:i,playsInline:!0,style:{width:"100%",height:"100%",objectFit:u,...a?{transform:"scaleX(-1)"}:{}}}),T?null:k,P]})});var nn=require("react");var sn=require("react/jsx-runtime"),on=(0,nn.forwardRef)(function(t,r){let{stream:o="image",...n}=t;return(0,sn.jsx)(yt,{ref:r,stream:o,...n})});var O=require("react"),un=require("@urun-sh/core");var bt=null;function oo(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function nt(){if(bt)return bt;let e=oo();return e?(bt=new e,bt):null}function ot(){let e=nt();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var ln=require("react/jsx-runtime"),so=1e3,an=200;function sr(...e){console.debug("[audio]",...e)}var st=(0,O.forwardRef)(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:g}=t,d=pe(),k=o??d,P=(0,O.useRef)(null),S=(0,O.useRef)(null),p=(0,O.useRef)(null),C=(0,O.useRef)(null),h=(0,O.useRef)(u);h.current=u;let x=(0,O.useRef)(c);x.current=c;let T=(0,O.useCallback)(l=>{p.current!==l&&(p.current=l,x.current?.(l))},[]),E=(0,O.useCallback)(()=>{if(typeof MediaStream>"u")return null;S.current||(S.current=new MediaStream);let l=P.current;return l&&l.srcObject!==S.current&&(l.srcObject=S.current),S.current},[]),v=(0,O.useCallback)(l=>{let m=P.current;if(!m)return;let f=m.play();!f||typeof f.then!="function"||f.then(()=>{m.muted||T(!0)}).catch(b=>{let _=b instanceof Error?b.name:String(b);if(_==="AbortError"){sr(`play() aborted (${l}); retrying in ${an}ms`),C.current&&clearTimeout(C.current),C.current=setTimeout(()=>{C.current=null,v(`${l}:retry`)},an);return}if(_==="NotAllowedError"){sr(`play() blocked pending a user gesture (${l})`),T(!1);return}sr(`play() failed (${l})`,b)})},[T]),A=(0,O.useCallback)(l=>{let m=E();if(m){for(let f of m.getAudioTracks())f!==l&&m.removeTrack(f);l&&!m.getAudioTracks().includes(l)&&m.addTrack(l),l&&v("track-attach"),h.current?.(l)}},[E,v]),L=(0,O.useCallback)(()=>{let l=P.current;l&&(E(),l.muted=!1,v("gesture"),ot(),T(!0))},[E,v,T]);(0,O.useImperativeHandle)(r,()=>({unlock:L,get unlocked(){return p.current===!0},get element(){return P.current}}),[L]);let U=(0,O.useCallback)(l=>{P.current=l,l&&(l.setAttribute("playsinline",""),l.setAttribute("webkit-playsinline",""),E()),g?.(l)},[E,g]),M=s!==void 0;return(0,O.useEffect)(()=>{if(M){A(s??null);return}if(!k)return;let l=k.stream(n),m=()=>{let R=S.current;return R?R.getAudioTracks()[0]??null:null},f=R=>{if(R!==m()&&(A(R),R)){let y=()=>{m()===R&&A(null)};R.addEventListener("ended",y)}},b=l.track;b&&b.readyState==="live"&&f(b);let _=l.on("track",R=>{R&&R.readyState!=="live"||f(R)}),z=setInterval(()=>{let R=l.track;R&&R.readyState==="live"&&f(R)},so);return()=>{_(),clearInterval(z)}},[k,n,M,s,A]),(0,O.useEffect)(()=>(0,un.observePageLifecycle)(()=>{ot(),p.current===!0&&v("foreground")}),[v]),(0,O.useEffect)(()=>()=>{C.current&&clearTimeout(C.current)},[]),(0,ln.jsx)("audio",{ref:U,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),cn=st;var I=require("react"),He=require("@urun-sh/core");var pn=require("react/jsx-runtime"),ir={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Pt(...e){console.debug("[voice]",...e)}var it=(0,I.forwardRef)(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=ir,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:g,onError:d,onMicStream:k,onTrack:P,onUnlockChange:S,capture:p}=t,C=pe(),h=o??C,x=(0,I.useRef)(null),T=(0,I.useRef)(null),E=(0,I.useRef)(null),v=(0,I.useRef)([]),A=(0,I.useRef)(!1),L=(0,I.useRef)(g);L.current=g;let U=(0,I.useRef)(d);U.current=d;let M=(0,I.useRef)(k);M.current=k;let l=(0,I.useCallback)(y=>{A.current!==y&&(A.current=y,L.current?.(y))},[]),m=(0,I.useCallback)(()=>{for(let y of v.current)y();v.current=[],E.current?.release(),E.current=null,T.current&&(T.current=null,M.current?.(null))},[]),f=(0,I.useCallback)(async()=>{let y=E.current;if(y){let K=await y.update(i);return T.current=y.stream,M.current?.(y.stream),K}let H=await(p??(0,He.sharedCaptureController)()).claim("audio",i);E.current=H,v.current=[H.onTrack((K,le)=>{T.current=le,M.current?.(le),A.current&&h?.stream(n).attach(K).catch(ie=>Pt("mic re-attach after one-capture re-acquire failed",ie))}),H.onLost(K=>{E.current=null,v.current=[],T.current=null,M.current?.(null),l(!1),U.current?.(K)})],T.current=H.stream,M.current?.(H.stream);let W=H.track;if(!W)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return W},[p,i,h,n,l]),b=(0,I.useCallback)(async()=>{m(),l(!1),await h?.stream(n).detach().catch(()=>{})},[h,n,m,l]),_=(0,I.useCallback)(async()=>{if(!h)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");x.current?.unlock();let y;try{y=await f()}catch(W){m();let K=(0,He.sessionFailureFromMediaError)(W,h.status);throw U.current?.(K),K}h.connect?.();let D;for(let W=1;W<=u;W++)try{await h.whenLive(a!==void 0?{timeout:a}:void 0),await h.stream(n).attach(y),l(!0);return}catch(K){D=K,Pt(`start attempt ${W}/${u} failed`,K),W<u&&await new Promise(le=>setTimeout(le,c))}m(),l(!1);let H=D instanceof Error?D:new Error(String(D??"voice start failed"));throw U.current?.(H),H},[h,n,a,u,c,f,m,l]);(0,I.useImperativeHandle)(r,()=>({start:_,stop:b,unlock:()=>x.current?.unlock(),get active(){return A.current},get micStream(){return T.current},get audio(){return x.current}}),[_,b]);let z=(0,I.useRef)(!1),R=(0,I.useCallback)(async()=>{if(!h||!A.current||z.current)return;let y=T.current?.getAudioTracks()[0]??null;if(y&&y.readyState==="live"){try{await h.stream(n).attach(y)}catch(D){Pt("foreground mic re-assert failed (will retry on next pass)",D)}return}z.current=!0;try{let D=await f();await h.stream(n).attach(D)}catch(D){let H=D instanceof Error?D:new Error(String(D));Pt("foreground mic re-acquire failed",H),U.current?.(H)}finally{z.current=!1}},[h,n,f]);return(0,I.useEffect)(()=>{let y=()=>{R()};return h&&typeof h.onRecovery=="function"?h.onRecovery(y):(0,He.observePageLifecycle)(y)},[h,R]),(0,I.useEffect)(()=>m,[m]),s?(0,pn.jsx)(st,{ref:x,session:h,stream:n,onTrack:P,onUnlockChange:S}):null}),dn=it;var ue=require("react");var Ct=require("react");var ar={level:0,speaking:!1};function xt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=(0,Ct.useState)(ar);return(0,Ct.useEffect)(()=>{if(!e){i(ar);return}let a=nt();if(!a||typeof MediaStream>"u")return;let u;e instanceof MediaStream?u=e:(u=new MediaStream,u.addTrack(e));let c,g;try{c=a.createMediaStreamSource(u),g=a.createAnalyser(),g.fftSize=r,c.connect(g)}catch{return}let d=new Uint8Array(g.fftSize),P=setInterval(()=>{g.getByteTimeDomainData(d);let S=0;for(let C=0;C<d.length;C++){let h=(d[C]-128)/128;S+=h*h}let p=Math.sqrt(S/d.length);i(C=>{let h=p>n;return Math.abs(C.level-p)<.005&&C.speaking===h?C:{level:p,speaking:h}})},o);return()=>{clearInterval(P),c.disconnect(),i(ar)}},[e,r,o,n]),s}var Se=require("react/jsx-runtime"),io={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},ao={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},mn=(0,ue.forwardRef)(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:u,onActiveChange:c,onError:g,onMicStream:d,capture:k}=t,P=pe(),S=o??P,p=(0,ue.useRef)(null),[C,h]=(0,ue.useState)(null),x=(0,ue.useRef)(d);x.current=d;let{level:T,speaking:E}=xt(a?C:null);return(0,ue.useImperativeHandle)(r,()=>({start:()=>{let v=p.current;return v?v.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>p.current?.stop()??Promise.resolve(),get active(){return p.current?.active??!1},get micStream(){return p.current?.micStream??null}}),[]),(0,ue.useEffect)(()=>{!i||!S||p.current?.start().catch(()=>{})},[i,S]),(0,Se.jsxs)(Se.Fragment,{children:[(0,Se.jsx)(it,{ref:p,session:S,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...k!==void 0?{capture:k}:{},onActiveChange:c,onError:g,onMicStream:v=>{h(v),x.current?.(v)}}),a?(0,Se.jsx)("span",{className:u,style:io,"data-urun-mic":"","data-urun-mic-active":C?"true":"false","data-urun-mic-speaking":E?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(T*100)/100,children:(0,Se.jsx)("span",{style:ao,children:(0,Se.jsx)("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(T*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});var Tt=require("@urun-sh/core"),w=require("react");var ne=require("react/jsx-runtime"),cr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function ur(...e){console.debug("[camera]",...e)}function uo(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function co(){let e=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof e?.enumerateDevices!="function")return null;try{return(await e.enumerateDevices()).filter(r=>r.kind==="videoinput")}catch{return null}}var lr=(0,w.forwardRef)(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:u,autoStart:c=!0,mirror:g="auto",connectTimeoutMs:d,visible:k=!1,className:P,videoClassName:S,onActiveChange:p,onError:C,onStream:h,onTrack:x,children:T,capture:E,flipControl:v="auto",flipControlClassName:A,onDevices:L}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let U=i?"user":a?"environment":u??"environment",M=pe(),l=o??M,m=(0,w.useRef)(null),f=(0,w.useRef)(null),b=(0,w.useRef)(null),_=(0,w.useRef)([]),z=(0,w.useRef)(null),R=(0,w.useRef)(!1),y=(0,w.useRef)(U),[D,H]=(0,w.useState)(U),[W,K]=(0,w.useState)(!1),[le,ie]=(0,w.useState)(null),[Z,B]=(0,w.useState)(!1),[ae]=(0,w.useState)(uo),$=(0,w.useRef)(p);$.current=p;let Q=(0,w.useRef)(C);Q.current=C;let de=(0,w.useRef)(h);de.current=h;let Me=(0,w.useRef)(x);Me.current=x;let lt=(0,w.useRef)(L);lt.current=L;let ye=(0,w.useCallback)(N=>{R.current!==N&&(R.current=N,K(N),$.current?.(N))},[]);(0,w.useEffect)(()=>{if(!W){ie(null);return}let N=!1,V=()=>{co().then(re=>{N||(ie(re),re&<.current?.(re))})};V();let G=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof G?.addEventListener=="function"?(G.addEventListener("devicechange",V),()=>{N=!0,G.removeEventListener?.("devicechange",V)}):()=>{N=!0}},[W]);let dt=(0,w.useCallback)(N=>{let V=m.current;V&&(V.muted=!0,V.defaultMuted=!0,V.setAttribute("muted",""),V.setAttribute("playsinline",""),V.setAttribute("webkit-playsinline",""),V.srcObject=N,N&&V.play()?.catch?.(G=>ur("preview play() failed",G)))},[]),me=(0,w.useCallback)(()=>{z.current?.(),z.current=null;for(let N of _.current)N();_.current=[],b.current?.release(),b.current=null,f.current&&(f.current=null,de.current?.(null),Me.current?.(null)),dt(null)},[dt]),Bt=(0,w.useCallback)((N,V)=>{z.current?.(),f.current=V,dt(V),de.current?.(V);let G=()=>{f.current===V&&(ur("camera track ended (device removed or permission revoked)"),me(),ye(!1))};N.addEventListener("ended",G),z.current=()=>N.removeEventListener("ended",G)},[dt,me,ye]),_e=(0,w.useCallback)(async N=>{if(!l)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let V={...cr,...s,facingMode:N},G;try{let re=b.current;if(re)G=await re.update(V);else{let Je=await(E??(0,Tt.sharedCaptureController)()).claim("video",V);if(b.current=Je,_.current=[Je.onTrack((ze,Vn)=>{Bt(ze,Vn),R.current&&l.stream(n).attachVideo(ze).then(()=>Me.current?.(ze)).catch(qn=>ur("camera re-publish after one-capture re-acquire failed",qn))}),Je.onLost(ze=>{b.current=null,_.current=[],me(),ye(!1),Q.current?.(ze)})],!Je.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});G=Je.track}}catch(re){let Ne=(0,Tt.sessionFailureFromMediaError)(re,l.status);throw Q.current?.(Ne),Ne}y.current=N,H(N),Bt(G,b.current?.stream??new MediaStream([G]));try{l.connect?.(),await l.whenLive(d!==void 0?{timeout:d}:void 0),await l.stream(n).attachVideo(G)}catch(re){me(),ye(!1);let Ne=re instanceof Error?re:new Error(String(re));throw Q.current?.(Ne),Ne}Me.current?.(G),ye(!0)},[l,n,s,d,E,Bt,me,ye]),fr=(0,w.useCallback)(N=>_e(N?.facingMode??y.current),[_e]),pt=(0,w.useCallback)(async N=>{R.current&&y.current===N||await _e(N)},[_e]),$t=(0,w.useCallback)(()=>_e(y.current==="environment"?"user":"environment"),[_e]),gr=(0,w.useCallback)(async()=>{me(),ye(!1),await l?.stream(n).detachVideo().catch(()=>{})},[l,n,me,ye]);(0,w.useImperativeHandle)(r,()=>({start:fr,stop:gr,flip:$t,setFacingMode:pt,get active(){return R.current},get facingMode(){return y.current},get stream(){return f.current},get element(){return m.current}}),[fr,gr,$t,pt]);let Sr=(0,w.useRef)(pt);if(Sr.current=pt,(0,w.useEffect)(()=>{!c||!l||Sr.current(U).catch(()=>{})},[c,l,U]),(0,w.useEffect)(()=>me,[me]),!k)return null;let Ln=g==="auto"?D==="user":g,On=W&&(v===!0||v==="auto"&&ae&&(le?.length??0)>1),Dn=()=>{Z||(B(!0),$t().catch(()=>{}).finally(()=>B(!1)))};return(0,ne.jsxs)("div",{className:P,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":D,children:[(0,ne.jsx)("video",{ref:m,className:S,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Ln?{transform:"scaleX(-1)"}:{}}}),On?(0,ne.jsx)("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Dn,disabled:Z,className:A,style:A?{opacity:Z?.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:Z?.6:1},children:(0,ne.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,ne.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,ne.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,ne.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,ne.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,ne.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,T]})}),fn=(0,w.forwardRef)(function({preview:t=!0,...r},o){return(0,ne.jsx)(lr,{ref:o,...r,visible:t,autoStart:!1})});var wt=require("react");function gn(e,t){let[r,o]=(0,wt.useState)(null);return(0,wt.useEffect)(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}var vn=require("react");var Rt=require("react");var Sn=require("zustand/vanilla"),hn=require("zustand"),lo=()=>{};function Et(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=(0,Sn.createStore)(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let c of s)c();s=null}},a=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",c=>n.setState({doc:c})),e.onSynced(()=>n.setState({synced:!0}))]),i):lo,u=(c=>(0,hn.useStore)(n,c));return Object.assign(u,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),u}function We(e,t){let r=(0,Rt.useMemo)(()=>Et(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return(0,Rt.useEffect)(()=>r.bind(),[r]),r}function yn(e,t,r){let n=We(e,t)(r??(a=>a)),s=(0,vn.useCallback)(a=>{e&&t&&e.doc(t).set(a)},[e,t]);if(r)return n;let i=n;return{snapshot:e&&t?i.doc:null,synced:i.synced,set:s}}var Ut=require("react");var be=200;function he(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function Be(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function At(e){let t=e.trim();if(!t)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(t)}catch(o){return{ok:!1,error:o instanceof Error?o.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 Mt(e,t,r={}){let o=r.cap??200,[n,s]=(0,Ut.useState)([]);return(0,Ut.useEffect)(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let u=await a.next();if(!i||u.done)break;s(c=>he(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}var ce=require("react/jsx-runtime");function kn({session:e,name:t,cap:r,className:o}){let n=Mt(e,t,{cap:r});return(0,ce.jsxs)("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[(0,ce.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,ce.jsx)("code",{children:t}),(0,ce.jsxs)("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),(0,ce.jsx)("div",{className:"urun-stream-tail-log",children:n.length===0?(0,ce.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,ce.jsx)("code",{children:t})," messages\u2026"]}):n.map((s,i)=>(0,ce.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,ce.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",Be(s.payload)]},`${s.at}-${i}`))})]})}var at=require("react");var te=require("react/jsx-runtime");function ut({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=(0,at.useState)(""),[i,a]=(0,at.useState)(null),u=(0,at.useCallback)(()=>{let c=At(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return(0,te.jsxs)("div",{className:"urun-doc-patch",children:[(0,te.jsx)("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),(0,te.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,te.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?(0,te.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function bn({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=We(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return(0,te.jsxs)("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[(0,te.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,te.jsx)("code",{children:t}),(0,te.jsx)("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),(0,te.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?(0,te.jsx)(ut,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}var _t=require("react");var ve=require("react/jsx-runtime");function Pn(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function Cn({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=(0,_t.useState)([]);return(0,_t.useEffect)(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>he(u,{at:Date.now(),direction:"in",text:Pn(Be(a))},r))}):void 0),[e,t,r]),(0,ve.jsxs)("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[(0,ve.jsx)(ut,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>he(u,{at:Date.now(),direction:"out",text:Pn(a)},r))}}),(0,ve.jsx)("div",{className:"urun-control-sender-log",children:n.length===0?(0,ve.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>(0,ve.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,ve.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,ve.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}var Nt=require("react");var Ae=require("react/jsx-runtime");function xn({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=(0,Nt.useState)([]),a=t.join(","),u=r.join(",");return(0,Nt.useEffect)(()=>{if(i([]),!e)return;let c=(d,k)=>i(P=>he(P,{at:Date.now(),kind:d,text:k},o)),g=[];g.push(e.onPhase(d=>c("phase",`phase \u2192 ${d.name}`)));for(let d of t){let k=e.stream(d);g.push(k.on("track",P=>c("track",`${d}: ${P?"track arrived":"track ended"}`)))}for(let d of r){let k=e.doc(d);g.push(k.on("change",()=>c("doc",`${d} changed`)))}return()=>g.forEach(d=>d())},[e,a,u,o]),(0,Ae.jsx)("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?(0,Ae.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((c,g)=>(0,Ae.jsxs)("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[(0,Ae.jsx)("span",{className:"urun-event-spine-kind",children:c.kind})," ",(0,Ae.jsx)("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${g}`))})}var Ft=require("@urun-sh/core");var It=require("react");function oe(e){let[t,r]=(0,It.useState)(e?.phase??null);return(0,It.useEffect)(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}var wn=require("@urun-sh/core");var $e=require("react"),Tn=require("@urun-sh/core");function Lt(e){let t=oe(e),r=(0,Tn.isWakingPhase)(t?.name),o=(0,$e.useRef)(void 0);r?o.current??=Date.now():o.current=void 0;let n=r?t?.wakingSince??o.current:void 0,s=()=>n!==void 0?Math.max(0,Math.floor((Date.now()-n)/1e3)):0,[i,a]=(0,$e.useState)(s);return(0,$e.useEffect)(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let u=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(u)},[n]),{waking:r,phase:t,state:r?t?.runtime?.state:void 0,reason:r?t?.runtime?.reason:void 0,since:n,seconds:r?i:0}}var Pe=require("react/jsx-runtime");function Ot({session:e,render:t,className:r}){let o=Lt(e);return!o.waking||!o.phase?null:(0,Pe.jsx)("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):(0,Pe.jsxs)(Pe.Fragment,{children:[(0,Pe.jsx)("span",{className:"urun-session-waking-label",children:(0,wn.describeSessionPhase)(o.phase)})," ",(0,Pe.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}var Vt=require("react");var Ce=require("react"),po={event:null,elapsedMs:0};function Dt(e,t){let[r,o]=(0,Ce.useState)(null),n=(0,Ce.useRef)(0);(0,Ce.useEffect)(()=>{if(o(null),!!e?.onActivation)return e.onActivation(a=>{t!==void 0&&a.stream!==t||(n.current=Date.now(),o(a))})},[e,t]);let[s,i]=(0,Ce.useState)(0);return(0,Ce.useEffect)(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,u=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(u());let c=setInterval(()=>i(u()),1e3);return()=>clearInterval(c)},[r]),r?{event:r,elapsedMs:s}:po}var Ke=require("react/jsx-runtime"),mo={activating:"starting stream\u2026","still-activating":"model warming up \u2014 this can take a minute","cold-boot":"cold boot \u2014 compiling/loading the model, hang tight",degraded:"taking longer than usual \u2014 still trying"};function fo(e){let[t,r]=(0,Vt.useState)(!1);return(0,Vt.useEffect)(()=>{if(r(!1),!e)return;let o=e;if(typeof o.requestVideoFrameCallback=="function"){let s=o.requestVideoFrameCallback(()=>r(!0));return()=>o.cancelVideoFrameCallback?.(s)}let n=()=>{let s=o.getVideoPlaybackQuality?.();(s?s.totalVideoFrames>0:o.readyState>=2)&&r(!0)};return n(),o.addEventListener("loadeddata",n),o.addEventListener("timeupdate",n),()=>{o.removeEventListener("loadeddata",n),o.removeEventListener("timeupdate",n)}},[e]),t}function qt({session:e,stream:t,videoElement:r,render:o,className:n}){let s=Dt(e,t),i=fo(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return(0,Ke.jsx)("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):(0,Ke.jsxs)("div",{className:"urun-activation-overlay-card",children:[(0,Ke.jsx)("span",{className:"urun-activation-overlay-copy",children:a.hint??mo[u]})," ",(0,Ke.jsxs)("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}var se=require("react/jsx-runtime"),go={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function En({session:e,className:t}){let r=oe(e),o=r?.name??"idle",n=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&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return(0,se.jsxs)("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[(0,se.jsx)("span",{className:"urun-session-status-dot","data-phase":o}),(0,se.jsx)("span",{className:"urun-session-status-label",children:go[o]}),n?(0,se.jsx)("span",{className:"urun-session-status-detail",children:n}):null]})}function Rn({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=oe(e);if(s?.name==="live")return(0,se.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,(0,se.jsx)(qt,{session:e})]});let i=r?r(s):(0,se.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,Ft.isWakingPhase)(s.name)?(0,se.jsx)(Ot,{session:e}):s&&s.name!=="idle"?(0,Ft.describeSessionPhase)(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,se.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?(0,se.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}var Ht=require("react");var Un=require("react/jsx-runtime");function dr(e){return oe(e)?.endsAt??null}function So(e){let t=Math.max(0,Math.floor(e/1e3)),r=Math.floor(t/60),o=t%60;return`${String(r).padStart(2,"0")}:${String(o).padStart(2,"0")}`}function An({session:e,urgentMs:t=6e4,className:r}){let n=dr(e)?.getTime()??null,[s,i]=(0,Ht.useState)(()=>n===null?null:Math.max(0,n-Date.now()));if((0,Ht.useEffect)(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),s===null)return null;let a=So(s);return(0,Un.jsx)("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<t?"":void 0,"data-expired":s<=0?"":void 0,children:a})}var ct=require("react/jsx-runtime"),ho=new Set(["expired","ended","error"]);function Mn({session:e,onNewSession:t,children:r,className:o}){let n=oe(e);if(!n||!ho.has(n.name))return null;let s=r?r(n):(0,ct.jsx)("span",{className:"urun-session-ended-copy",children:n.name==="expired"?"Session ended \u2014 start a new session":n.name==="error"?`Session failed${n.error?.reason?` \u2014 ${n.error.reason}`:""}.`:"Session ended."});return(0,ct.jsxs)("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?(0,ct.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}var xe=require("react"),Ue=require("react/jsx-runtime");function pr(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;return t.warning!==!0?null:{warning:!0,deadlineEpochS:typeof t.deadline_epoch_s=="number"?t.deadline_epoch_s:null,idleSinceEpochS:typeof t.idle_since_epoch_s=="number"?t.idle_since_epoch_s:null}}function mr(e){let t=(0,xe.useMemo)(()=>e?e.doc("control"):null,[e]),[r,o]=(0,xe.useState)(()=>t?pr(t.get("idle")):null);return(0,xe.useEffect)(()=>{if(!t){o(null);return}return o(pr(t.get("idle"))),t.on("change",()=>o(pr(t.get("idle"))))},[t]),r}function vo(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function _n({session:e,onStillHere:t,className:r}){let o=mr(e),n=o?.deadlineEpochS??null,[s,i]=(0,xe.useState)(null);if((0,xe.useEffect)(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()/1e3));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return(0,Ue.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,Ue.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,Ue.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,Ue.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${vo(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,Ue.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}var je=require("react"),Nn=require("@urun-sh/core");function In(e){let t=(0,je.useContext)(Le),[r,o]=(0,je.useState)(null),n=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,u=t?.orgId,c=t?.jwt,g=t?.getAccessToken,d=t?.authProvider;return(0,je.useEffect)(()=>{if(!a||!u||!n||!s)return;let k=!1,P=()=>{(0,Nn.prewake)({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:g,authProvider:d}).then(p=>{k||o(p)}).catch(()=>{})};P();let S=setInterval(P,Math.max(1,i)*1e3);return()=>{k=!0,clearInterval(S)}},[n,s,i,a,u,c,g,d]),r}var Wt=require("@urun-sh/core");0&&(module.exports={Audio,Camera,ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,Image,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,Mic,OPERATOR_CHORD_LABEL,OPERATOR_TOKEN_STORAGE_KEY,ProgressCard,ProgressCardSchema,Session,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunActivationOverlay,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunIdleWarning,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,Video,Voice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,readOperatorToken,registerComponent,resumeUrunAudioContext,urunPublicEnv,useActivation,useApp,useChat,useCompletion,useConfirmOnLeave,useDocStore,useImageFrame,useInputPresence,useMetricsPanel,useOperatorOverride,useProgressCard,useRequest,useSession,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 Hr,b as Wr,c as rt}from"./chunk-WF2OBDSX.mjs";import{useEffect as jt,useMemo as en,useState as Ie}from"react";import{Component as Br}from"react";import{jsx as Ft,jsxs as $r}from"react/jsx-runtime";var Pe=class extends Br{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,r){console.error("[urun] Error caught by UrunErrorBoundary:",t,r)}render(){if(this.state.error){let{fallback:t}=this.props;return typeof t=="function"?t(this.state.error):t||$r("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:[Ft("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),Ft("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as jr}from"react";var fe=jr(null);function ae(e){return e&&e.trim()?e.trim():void 0}function re(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return ae(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return ae(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return ae(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return ae(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return ae(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return ae(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return ae(typeof process<"u"?process.env?.[e]:void 0)}}function Ne(){let e=re("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||re("VERCEL_ENV")==="production"?"workos":re("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Kr(){return Ne()==="workos"}import{useEffect as Jr,useRef as zr}from"react";var Xr="urun.operator_token",Wt=null,Ht="op",Gr="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function Bt(){return typeof window<"u"}function $t(){return Wt}function Yr(){if(!Bt())return null;let e=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash;if(!e)return null;let t=new URLSearchParams(e),r=t.get(Ht);if(!r)return null;Wt=r,t.delete(Ht);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function Zr(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function nt(e){let t=zr(e);t.current=e,Jr(()=>{if(!Bt())return;Yr();let r=o=>{if(!Zr(o))return;let n=$t();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}import{useEffect as Qr}from"react";function ot(e=!0){Qr(()=>{if(!e||typeof window>"u"||typeof window.addEventListener!="function")return;let t=r=>(r.preventDefault(),r.returnValue="","");return window.addEventListener("beforeunload",t),()=>window.removeEventListener("beforeunload",t)},[e])}import{jsx as Ce,jsxs as on}from"react/jsx-runtime";var tn="/api/urun-token";function rn(e,t){return typeof e=="function"?e(t):e!==void 0?e:on("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:[Ce("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),Ce("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function nn({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,confirmOnLeave:g=!1,fallback:p,errorFallback:k,children:b}){let h=n===void 0&&t===void 0;if(!h&&(typeof t!="string"||t.trim().length===0))throw new Error("[urun] <UrunProvider> requires a non-empty orgId \u2014 set your org id deployment env var (e.g. NEXT_PUBLIC_SESSION_TENANT_ID) and pass it through the provider (or pass NEITHER orgId NOR jwt to let the provider mint from its tokenEndpoint).");if(!h&&(typeof e!="string"||e.trim().length===0))throw new Error("[urun] <UrunProvider> requires baseUrl when orgId/jwt are passed explicitly (self-mint mode reads it from the token endpoint instead).");let m=r??o;if(h&&(typeof m!="string"||m.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);ot(g);let[P,S]=Ie(),[x,w]=Ie(),[E,v]=Ie(null),[R,L]=Ie(null);nt(D=>L({jwt:D}));let T=rt(),U=re("NEXT_PUBLIC_SESSION_TOKEN")??re("NEXT_PUBLIC_URUN_JWT"),l=Ne(),d=R!==null,f=l==="workos"&&!n&&!d&&!h,C=n??(l==="jwt"?U:void 0)??P??x?.token,M=d?R.jwt:C,F=s??re("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),A=f&&!M,y=t??x?.orgId,I=e??x?.gatewayUrl,H=h&&x===void 0,W=h&&x!==void 0&&!I?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,q=E??W,X=en(()=>({appId:m,baseUrl:I??"",orgId:y??"",jwt:M,getAccessToken:f?T?.getAccessToken:void 0,authProvider:F,eventsUrl:i,sessionKey:a,releaseOnLeave:c,priority:d?"preempt":void 0}),[m,T,I,F,M,i,y,a,c,f,d]),$=u??tn;return jt(()=>{if(!h)return;let D=new AbortController;return v(null),(async()=>{try{let _=await fetch($,{method:"POST",signal:D.signal});if(!_.ok)throw new Error(`[urun] token endpoint ${$} answered ${_.status}`);let V=await _.json(),J=typeof V.token=="string"?V.token:"",Y=typeof V.orgId=="string"?V.orgId:"";if(!J||!Y)throw new Error(`[urun] token endpoint ${$} returned no { token, orgId } \u2014 is it createTokenRoute() from @urun-sh/next?`);w({token:J,orgId:Y,gatewayUrl:typeof V.gatewayUrl=="string"?V.gatewayUrl:void 0})}catch(_){if(D.signal.aborted)return;v(_ instanceof Error?_:new Error(String(_)))}})(),()=>D.abort()},[h,$]),jt(()=>{if(!f||!T)return;let D=!1,_=T;async function V(){try{let Y=await _.getAccessToken();D||S(Y??void 0)}catch{D||S(void 0)}}V();let J=window.setInterval(()=>{V()},6e4);return()=>{D=!0,window.clearInterval(J)}},[T,f]),Ce(Pe,{fallback:p,children:q?rn(k,q):A||H?Ce("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Ce(fe.Provider,{value:X,children:b})})}import{useContext as sn,useEffect as an,useMemo as Kt,useReducer as un,useRef as st}from"react";import{App as cn}from"@urun-sh/core";function ln(e,t){return`${e}:${JSON.stringify(t??{})}`}function dn(e,t,r){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,fnName:t,args:r??{}})}var ue=new Map;var it=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},at=class{constructor(t,r){this._stream=t;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(t){return this._stream.attach(t)}attachVideo(t){return this._stream.attachVideo(t)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(t){return this._stream.seek(t)}chunks(t){return this._stream.chunks(t)}onSeeked(t){return this._stream.onSeeked(t)}on(t,r){return this._stream.on(t,r)}messages(){return this._stream.messages()}emit(t,r){return this._stream.emit(t,r)}dispose(){this._unsubscribeTrack()}},ut=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||a.name==="expired"){let u=a.error,c=u?.reason??(a.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else a.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),i=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{i(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new it(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new at(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function pn(){let e=sn(fe);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=un(i=>i+1,0),r=st(new Map),o=st(new Map),n=st(null),s=Kt(()=>cn(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority]);return an(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=ue.get(a);c===u&&o.current.get(a)===u&&(c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null),c.handle.addNotifier(t),c.refCount+=1)}}return()=>{let a=new Map;for(let[u,c]of o.current){let g=ue.get(u);g===c&&(g.handle.removeNotifier(t),g.refCount=Math.max(0,g.refCount-1),a.set(u,g),g.refCount===0&&(g.disposeTimer=setTimeout(()=>{let p=ue.get(u);!p||p.refCount!==0||(ue.delete(u),p.handle.disconnect())},0)))}n.current=a}},[]),Kt(()=>{let i=new Map;return new Proxy({},{get(a,u){if(typeof u!="string")return;let c=i.get(u);if(c)return c;let g=p=>{let k=ln(u,p),b=r.current.get(k);if(b&&!b.disposed)return b;let h=dn(e,u,p),m=ue.get(h);return m?.handle.disposed&&(m.disposeTimer&&clearTimeout(m.disposeTimer),ue.delete(h),o.current.get(h)===m&&o.current.delete(h),m=void 0),m?m.disposeTimer&&(clearTimeout(m.disposeTimer),m.disposeTimer=null):(m={handle:new ut(s[u](p),t,e.eventsUrl),refCount:0,disposeTimer:null},ue.set(h,m)),o.current.get(h)!==m&&(o.current.set(h,m),m.handle.addNotifier(t),m.refCount+=1),r.current.set(k,m.handle),m.handle};return i.set(u,g),g}})},[e,s])}import{useCallback as ct,useEffect as mn,useMemo as fn,useRef as Le,useState as lt}from"react";function ge(e){let t=e;if(!t||typeof t.request!="function"||typeof t.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 t}function gn(e){return e instanceof Error?e:new Error(String(e))}function Sn(e,t){let r=fn(()=>ge(e),[e]),[o,n]=lt(void 0),[s,i]=lt(null),[a,u]=lt(!1),c=Le(t);c.current=t;let g=Le(0),p=Le(null),k=Le(!0);mn(()=>(k.current=!0,()=>{k.current=!1,p.current?.abort()}),[]);let b=ct(async P=>{p.current?.abort();let S=new AbortController;p.current=S;let x=++g.current,w=()=>k.current&&g.current===x;w()&&(u(!0),i(null));try{let E=await r.request(P,{...c.current,signal:S.signal});return w()&&(n(E),u(!1),c.current?.onSuccess?.(E)),E}catch(E){let v=gn(E);throw w()&&(i(v),u(!1),c.current?.onError?.(v)),v}},[r]),h=ct(P=>{b(P).catch(()=>{})},[b]),m=ct(()=>{g.current++,p.current?.abort(),p.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:h,mutateAsync:b,data:o,error:s,isPending:a,reset:m}}import{useCallback as Jt,useEffect as hn,useMemo as vn,useRef as Oe,useState as dt}from"react";function zt(e){return e instanceof Error?e:new Error(String(e))}var yn=e=>typeof e=="string"?e:String(e);function kn(e,t){let r=vn(()=>ge(e),[e]),[o,n]=dt(""),[s,i]=dt(!1),[a,u]=dt(null),c=Oe(t);c.current=t;let g=Oe(0),p=Oe(null),k=Oe(!0);hn(()=>(k.current=!0,()=>{k.current=!1,p.current?.cancel(),p.current=null}),[]);let b=Jt(()=>{g.current++,p.current?.cancel(),p.current=null,k.current&&i(!1)},[]),h=Jt(async m=>{p.current?.cancel();let P=++g.current,S=()=>k.current&&g.current===P,x=c.current,w=x?.parseChunk??yn,E=x?.buildPayload??(f=>({prompt:f}));S()&&(n(""),u(null),i(!0));let{parseChunk:v,buildPayload:R,onFinish:L,onError:T,...U}=x??{},l="",d;try{d=r.requestStream(E(m),U),p.current=d}catch(f){let C=zt(f);S()&&(u(C),i(!1),x?.onError?.(C));return}try{for await(let f of d){if(g.current!==P)break;l+=w(f),S()&&n(l)}S()&&(i(!1),x?.onFinish?.(l))}catch(f){let C=zt(f);S()&&(u(C),i(!1),x?.onError?.(C))}finally{p.current===d&&(p.current=null)}},[r]);return{completion:o,complete:h,stop:b,isStreaming:s,error:a}}import{useCallback as Xt,useEffect as bn,useMemo as Pn,useRef as Se,useState as De}from"react";function Gt(e){return e instanceof Error?e:new Error(String(e))}var Cn=e=>typeof e=="string"?e:String(e),Yt=0;function pt(e){return Yt+=1,`${e}-${Yt}`}function xn(e,t){let r=Pn(()=>ge(e),[e]),[o,n]=De(()=>(t?.initialMessages??[]).map(w=>({id:w.id??pt("msg"),role:w.role,content:w.content}))),[s,i]=De(""),[a,u]=De(!1),[c,g]=De(null),p=Se(t);p.current=t;let k=Se(o);k.current=o;let b=Se(s);b.current=s;let h=Se(0),m=Se(null),P=Se(!0);bn(()=>(P.current=!0,()=>{P.current=!1,m.current?.cancel(),m.current=null}),[]);let S=Xt(()=>{h.current++,m.current?.cancel(),m.current=null,P.current&&u(!1)},[]),x=Xt(async w=>{let E=w===void 0,v=(E?b.current:w)??"";if(!v.trim())return;m.current?.cancel();let L=++h.current,T=()=>P.current&&h.current===L,U=p.current,l=U?.parseChunk??Cn,d={id:pt("msg"),role:"user",content:v},f={id:pt("msg"),role:"assistant",content:""},C=[...k.current,d].map(_=>({role:_.role,content:_.content})),M=[...k.current,d,f];k.current=M,n(M),E&&i(""),g(null),u(!0);let F=U?.buildPayload??(_=>({messages:_})),{initialMessages:A,parseChunk:y,buildPayload:I,onFinish:H,onError:W,...q}=U??{},X=_=>{n(V=>V.map(J=>J.id===f.id?{...J,content:_}:J))},$="",D;try{D=r.requestStream(F(C),q),m.current=D}catch(_){let V=Gt(_);T()&&(g(V),u(!1),U?.onError?.(V));return}try{for await(let _ of D){if(h.current!==L)break;$+=l(_),T()&&X($)}T()&&(u(!1),U?.onFinish?.({...f,content:$}))}catch(_){let V=Gt(_);T()&&(g(V),u(!1),U?.onError?.(V))}finally{m.current===D&&(m.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:x,stop:S,isStreaming:a,error:c}}import{useCallback as ne,useEffect as Zt,useMemo as wn,useRef as Qt,useState as er}from"react";import{createInputPresencePublisher as En,INPUT_PRESENCE_DEFAULT_HZ as Tn,INPUT_PRESENCE_FIELD as Rn}from"@urun-sh/core";var mt=[];function An(e,t={}){let{field:r=Rn,hz:o=Tn}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=wn(()=>s?En({awareness:{setLocalStateField:(v,R)=>s.setField(v,R)},field:r,hz:o}):null,[s,r,o]),a=Qt(null);a.current=i;let[u,c]=er(!1),[g,p]=er(mt),k=Qt(!1);Zt(()=>{if(i)return()=>i.dispose()},[i]);let b=ne(()=>{let v=a.current;p(v?v.heldKeys():mt)},[]),h=ne(()=>{a.current?.clear(),p(mt)},[]);Zt(()=>{if(!n)return;let v=()=>!!n.pointerLockElement,R=()=>{if(v()){k.current=!1,c(!0);return}k.current||(c(!1),h())},L=f=>{v()&&(a.current?.keyDown(f.key),b())},T=f=>{a.current?.keyUp(f.key),b()},U=f=>{v()&&a.current?.movePointer(f.movementX,f.movementY)},l=f=>{v()&&a.current?.setButtons(f.buttons)},d=()=>{h()};return n.addEventListener("pointerlockchange",R),n.addEventListener("keydown",L),n.addEventListener("keyup",T),n.addEventListener("mousemove",U),n.addEventListener("mousedown",l),n.addEventListener("mouseup",l),n.defaultView?.addEventListener("blur",d),()=>{n.removeEventListener("pointerlockchange",R),n.removeEventListener("keydown",L),n.removeEventListener("keyup",T),n.removeEventListener("mousemove",U),n.removeEventListener("mousedown",l),n.removeEventListener("mouseup",l),n.defaultView?.removeEventListener("blur",d)}},[n,h,b]);let m=ne(v=>{v.requestPointerLock?.()},[]),P=ne(()=>{k.current=!0,c(!0)},[]),S=ne(()=>{k.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),h()},[n,h]),x=ne(v=>{a.current?.keyDown(v),b()},[b]),w=ne(v=>{a.current?.keyUp(v),b()},[b]),E=ne((v,R)=>{a.current?.movePointer(v,R)},[]);return{engage:m,engageTouch:P,release:S,engaged:u,heldKeys:g,pressKey:x,releaseKey:w,movePointer:E}}var tr=new Map;function Un(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);tr.set(e,{component:t,schema:r})}function rr(e,t){let r=tr.get(e);if(!r)return{error:`Unknown component: "${e}"`};let o=r.schema.safeParse(t);return o.success?{Component:r.component,validatedProps:o.data}:{error:`Validation failed for "${e}": ${o.error.message}`}}import{Fragment as _n,jsx as Ve}from"react/jsx-runtime";function Mn({name:e,props:t,fallback:r}){let o=rr(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?Ve(_n,{children:r}):Ve("div",{className:"urun-component-error",role:"alert",children:Ve("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return Ve(n,{...o.validatedProps})}import{z as xe}from"zod";import{jsx as ft,jsxs as nr}from"react/jsx-runtime";var Nn=xe.object({step:xe.number().min(0),total:xe.number().min(1),label:xe.string().optional(),variant:xe.enum(["default","success","error"]).default("default")});function or(e){let{step:t,total:r,label:o,variant:n="default"}=e,s=Math.min(t/r*100,100),i=t>=r;return{step:t,total:r,label:o,variant:n,percentage:s,isComplete:i}}function In(e){let{step:t,total:r,label:o,variant:n,percentage:s}=or(e);return nr("div",{className:"urun-progress-card","data-variant":n,children:[o&&ft("div",{className:"urun-progress-label",children:o}),ft("div",{className:"urun-progress-bar",children:ft("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),nr("div",{className:"urun-progress-text",children:[t,"/",r]})]})}import{z as gt}from"zod";import{jsx as sr,jsxs as Vn}from"react/jsx-runtime";var Ln=gt.object({state:gt.enum(["thinking","generating","idle","error"]),message:gt.string().optional()}),On={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function ir(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??On[t]??t;return{state:t,message:n,isActive:o}}function Dn(e){let{state:t,message:r,isActive:o}=ir(e);return Vn("span",{className:"urun-status-badge","data-state":t,children:[sr("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),sr("span",{className:"urun-status-message",children:r})]})}import{useRef as ar,useEffect as qn}from"react";import{z as St}from"zod";import{jsx as ur,jsxs as Wn}from"react/jsx-runtime";var Fn=St.object({text:St.string(),streaming:St.boolean().default(!1)});function cr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function Hn(e){let{text:t,streaming:r}=cr(e),o=ar(null),n=ar(0);return qn(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),Wn("div",{className:"urun-text-stream",children:[ur("span",{ref:o,className:"urun-text-content"}),r&&ur("span",{className:"urun-text-cursor"})]})}import{z as qe}from"zod";import{jsx as lr,jsxs as jn}from"react/jsx-runtime";var Bn=qe.object({src:qe.string().url(),alt:qe.string().optional(),caption:qe.string().optional()});function dr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function $n(e){let{src:t,alt:r,caption:o}=dr(e);return jn("figure",{className:"urun-image-frame",children:[lr("img",{className:"urun-image",src:t,alt:r}),o&&lr("figcaption",{className:"urun-image-caption",children:o})]})}import{z as oe}from"zod";import{jsx as ht,jsxs as zn}from"react/jsx-runtime";var Kn=oe.object({metrics:oe.array(oe.object({label:oe.string(),value:oe.union([oe.string(),oe.number()]),unit:oe.string().optional()}))});function pr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function Jn(e){let{metrics:t}=pr(e);return ht("div",{className:"urun-metrics-panel",children:t.map((r,o)=>zn("div",{className:"urun-metric-card",children:[ht("div",{className:"urun-metric-label",children:r.label}),ht("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}import{createContext as Xn,useContext as mr}from"react";import{jsx as Zn}from"react/jsx-runtime";var vt=Xn(null);function Gn({session:e,children:t}){return Zn(vt.Provider,{value:e,children:t})}function G(){return mr(vt)}function Yn(){let e=mr(vt);if(!e)throw new Error("[urun] useSession() needs a mounted <Session session={...}> ancestor with a non-null session \u2014 create one with useApp() (e.g. app.generate({...})) and pass it to the scope.");return e}import{forwardRef as Qn,useCallback as Fe,useEffect as eo,useImperativeHandle as to,useRef as yt,useState as ro}from"react";import{jsx as so,jsxs as io}from"react/jsx-runtime";var no=1e3;function oo(...e){console.debug("[video]",...e)}var kt=Qn(function(t,r){let{session:o,stream:n="video",track:s,muted:i=!0,mirror:a=!1,objectFit:u="contain",className:c,style:g,videoClassName:p,placeholder:k,children:b,onTrack:h}=t,m=G(),P=o??m,S=yt(null),x=yt(null),[w,E]=ro(!1),v=yt(h);v.current=h;let R=Fe(()=>{if(typeof MediaStream>"u")return null;x.current||(x.current=new MediaStream);let d=S.current;return d&&d.srcObject!==x.current&&(d.srcObject=x.current),x.current},[]),L=Fe(d=>{let f=S.current;if(!f)return;let C=f.play();!C||typeof C.catch!="function"||C.catch(M=>oo(`play() failed (${d})`,M))},[]),T=Fe(d=>{let f=R();if(f){for(let C of f.getVideoTracks())C!==d&&f.removeTrack(C);if(d&&!f.getVideoTracks().includes(d)){f.addTrack(d);let C=S.current;C&&(C.srcObject=f)}d&&L("track-attach"),E(d!==null),v.current?.(d)}},[R,L]),U=Fe(d=>{S.current=d,d&&(i&&(d.muted=!0,d.defaultMuted=!0,d.setAttribute("muted","")),d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),R())},[R,i]);to(r,()=>({get element(){return S.current},get live(){return x.current?x.current.getVideoTracks().length>0:!1}}),[]);let l=s!==void 0;return eo(()=>{if(l){T(s??null);return}if(!P)return;let d=P.stream(n),f=()=>{let y=x.current;return y?y.getVideoTracks()[0]??null:null},C=y=>{if(y!==f()&&(T(y),y)){let I=()=>{f()===y&&T(null)};y.addEventListener("ended",I)}},M=d.track;M&&M.readyState==="live"&&C(M);let F=d.on("track",y=>{y&&y.readyState!=="live"||C(y)}),A=setInterval(()=>{let y=d.track;y&&y.readyState==="live"&&C(y)},no);return()=>{F(),clearInterval(A)}},[P,n,l,s,T]),io("div",{className:c,style:{position:"relative",width:"100%",height:"100%",...g},"data-urun-video":"","data-urun-video-live":w?"true":"false",children:[so("video",{ref:U,className:p,autoPlay:!0,muted:i,playsInline:!0,style:{width:"100%",height:"100%",objectFit:u,...a?{transform:"scaleX(-1)"}:{}}}),w?null:k,b]})});import{forwardRef as ao}from"react";import{jsx as co}from"react/jsx-runtime";var uo=ao(function(t,r){let{stream:o="image",...n}=t;return co(kt,{ref:r,stream:o,...n})});import{forwardRef as po,useCallback as he,useEffect as bt,useImperativeHandle as mo,useRef as ve}from"react";import{observePageLifecycle as fo}from"@urun-sh/core";var He=null;function lo(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function We(){if(He)return He;let e=lo();return e?(He=new e,He):null}function Be(){let e=We();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{jsx as ho}from"react/jsx-runtime";var go=1e3,fr=200;function Pt(...e){console.debug("[audio]",...e)}var $e=po(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:g}=t,p=G(),k=o??p,b=ve(null),h=ve(null),m=ve(null),P=ve(null),S=ve(u);S.current=u;let x=ve(c);x.current=c;let w=he(l=>{m.current!==l&&(m.current=l,x.current?.(l))},[]),E=he(()=>{if(typeof MediaStream>"u")return null;h.current||(h.current=new MediaStream);let l=b.current;return l&&l.srcObject!==h.current&&(l.srcObject=h.current),h.current},[]),v=he(l=>{let d=b.current;if(!d)return;let f=d.play();!f||typeof f.then!="function"||f.then(()=>{d.muted||w(!0)}).catch(C=>{let M=C instanceof Error?C.name:String(C);if(M==="AbortError"){Pt(`play() aborted (${l}); retrying in ${fr}ms`),P.current&&clearTimeout(P.current),P.current=setTimeout(()=>{P.current=null,v(`${l}:retry`)},fr);return}if(M==="NotAllowedError"){Pt(`play() blocked pending a user gesture (${l})`),w(!1);return}Pt(`play() failed (${l})`,C)})},[w]),R=he(l=>{let d=E();if(d){for(let f of d.getAudioTracks())f!==l&&d.removeTrack(f);l&&!d.getAudioTracks().includes(l)&&d.addTrack(l),l&&v("track-attach"),S.current?.(l)}},[E,v]),L=he(()=>{let l=b.current;l&&(E(),l.muted=!1,v("gesture"),Be(),w(!0))},[E,v,w]);mo(r,()=>({unlock:L,get unlocked(){return m.current===!0},get element(){return b.current}}),[L]);let T=he(l=>{b.current=l,l&&(l.setAttribute("playsinline",""),l.setAttribute("webkit-playsinline",""),E()),g?.(l)},[E,g]),U=s!==void 0;return bt(()=>{if(U){R(s??null);return}if(!k)return;let l=k.stream(n),d=()=>{let A=h.current;return A?A.getAudioTracks()[0]??null:null},f=A=>{if(A!==d()&&(R(A),A)){let y=()=>{d()===A&&R(null)};A.addEventListener("ended",y)}},C=l.track;C&&C.readyState==="live"&&f(C);let M=l.on("track",A=>{A&&A.readyState!=="live"||f(A)}),F=setInterval(()=>{let A=l.track;A&&A.readyState==="live"&&f(A)},go);return()=>{M(),clearInterval(F)}},[k,n,U,s,R]),bt(()=>fo(()=>{Be(),m.current===!0&&v("foreground")}),[v]),bt(()=>()=>{P.current&&clearTimeout(P.current)},[]),ho("audio",{ref:T,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),So=$e;import{forwardRef as vo,useCallback as ye,useEffect as gr,useImperativeHandle as yo,useRef as Q}from"react";import{observePageLifecycle as ko,sessionFailureFromMediaError as bo,sharedCaptureController as Po}from"@urun-sh/core";import{jsx as xo}from"react/jsx-runtime";var Sr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function je(...e){console.debug("[voice]",...e)}var Ke=vo(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=Sr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:g,onError:p,onMicStream:k,onTrack:b,onUnlockChange:h,capture:m}=t,P=G(),S=o??P,x=Q(null),w=Q(null),E=Q(null),v=Q([]),R=Q(!1),L=Q(g);L.current=g;let T=Q(p);T.current=p;let U=Q(k);U.current=k;let l=ye(y=>{R.current!==y&&(R.current=y,L.current?.(y))},[]),d=ye(()=>{for(let y of v.current)y();v.current=[],E.current?.release(),E.current=null,w.current&&(w.current=null,U.current?.(null))},[]),f=ye(async()=>{let y=E.current;if(y){let q=await y.update(i);return w.current=y.stream,U.current?.(y.stream),q}let H=await(m??Po()).claim("audio",i);E.current=H,v.current=[H.onTrack((q,X)=>{w.current=X,U.current?.(X),R.current&&S?.stream(n).attach(q).catch($=>je("mic re-attach after one-capture re-acquire failed",$))}),H.onLost(q=>{E.current=null,v.current=[],w.current=null,U.current?.(null),l(!1),T.current?.(q)})],w.current=H.stream,U.current?.(H.stream);let W=H.track;if(!W)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return W},[m,i,S,n,l]),C=ye(async()=>{d(),l(!1),await S?.stream(n).detach().catch(()=>{})},[S,n,d,l]),M=ye(async()=>{if(!S)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");x.current?.unlock();let y;try{y=await f()}catch(W){d();let q=bo(W,S.status);throw T.current?.(q),q}S.connect?.();let I;for(let W=1;W<=u;W++)try{await S.whenLive(a!==void 0?{timeout:a}:void 0),await S.stream(n).attach(y),l(!0);return}catch(q){I=q,je(`start attempt ${W}/${u} failed`,q),W<u&&await new Promise(X=>setTimeout(X,c))}d(),l(!1);let H=I instanceof Error?I:new Error(String(I??"voice start failed"));throw T.current?.(H),H},[S,n,a,u,c,f,d,l]);yo(r,()=>({start:M,stop:C,unlock:()=>x.current?.unlock(),get active(){return R.current},get micStream(){return w.current},get audio(){return x.current}}),[M,C]);let F=Q(!1),A=ye(async()=>{if(!S||!R.current||F.current)return;let y=w.current?.getAudioTracks()[0]??null;if(y&&y.readyState==="live"){try{await S.stream(n).attach(y)}catch(I){je("foreground mic re-assert failed (will retry on next pass)",I)}return}F.current=!0;try{let I=await f();await S.stream(n).attach(I)}catch(I){let H=I instanceof Error?I:new Error(String(I));je("foreground mic re-acquire failed",H),T.current?.(H)}finally{F.current=!1}},[S,n,f]);return gr(()=>{let y=()=>{A()};return S&&typeof S.onRecovery=="function"?S.onRecovery(y):ko(y)},[S,A]),gr(()=>d,[d]),s?xo($e,{ref:x,session:S,stream:n,onTrack:b,onUnlockChange:h}):null}),Co=Ke;import{forwardRef as To,useEffect as Ro,useImperativeHandle as Ao,useRef as hr,useState as Uo}from"react";import{useEffect as wo,useState as Eo}from"react";var Ct={level:0,speaking:!1};function xt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=Eo(Ct);return wo(()=>{if(!e){i(Ct);return}let a=We();if(!a||typeof MediaStream>"u")return;let u;e instanceof MediaStream?u=e:(u=new MediaStream,u.addTrack(e));let c,g;try{c=a.createMediaStreamSource(u),g=a.createAnalyser(),g.fftSize=r,c.connect(g)}catch{return}let p=new Uint8Array(g.fftSize),b=setInterval(()=>{g.getByteTimeDomainData(p);let h=0;for(let P=0;P<p.length;P++){let S=(p[P]-128)/128;h+=S*S}let m=Math.sqrt(h/p.length);i(P=>{let S=m>n;return Math.abs(P.level-m)<.005&&P.speaking===S?P:{level:m,speaking:S}})},o);return()=>{clearInterval(b),c.disconnect(),i(Ct)}},[e,r,o,n]),s}import{Fragment as Io,jsx as Je,jsxs as Lo}from"react/jsx-runtime";var Mo={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},_o={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},No=To(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:u,onActiveChange:c,onError:g,onMicStream:p,capture:k}=t,b=G(),h=o??b,m=hr(null),[P,S]=Uo(null),x=hr(p);x.current=p;let{level:w,speaking:E}=xt(a?P:null);return Ao(r,()=>({start:()=>{let v=m.current;return v?v.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>m.current?.stop()??Promise.resolve(),get active(){return m.current?.active??!1},get micStream(){return m.current?.micStream??null}}),[]),Ro(()=>{!i||!h||m.current?.start().catch(()=>{})},[i,h]),Lo(Io,{children:[Je(Ke,{ref:m,session:h,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...k!==void 0?{capture:k}:{},onActiveChange:c,onError:g,onMicStream:v=>{S(v),x.current?.(v)}}),a?Je("span",{className:u,style:Mo,"data-urun-mic":"","data-urun-mic-active":P?"true":"false","data-urun-mic-speaking":E?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(w*100)/100,children:Je("span",{style:_o,children:Je("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(w*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});import{sessionFailureFromMediaError as Oo,sharedCaptureController as Do}from"@urun-sh/core";import{forwardRef as yr,useCallback as ee,useEffect as wt,useImperativeHandle as Vo,useRef as j,useState as we}from"react";import{jsx as se,jsxs as vr}from"react/jsx-runtime";var kr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Et(...e){console.debug("[camera]",...e)}function qo(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function Fo(){let e=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof e?.enumerateDevices!="function")return null;try{return(await e.enumerateDevices()).filter(r=>r.kind==="videoinput")}catch{return null}}var br=yr(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:u,autoStart:c=!0,mirror:g="auto",connectTimeoutMs:p,visible:k=!1,className:b,videoClassName:h,onActiveChange:m,onError:P,onStream:S,onTrack:x,children:w,capture:E,flipControl:v="auto",flipControlClassName:R,onDevices:L}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let T=i?"user":a?"environment":u??"environment",U=G(),l=o??U,d=j(null),f=j(null),C=j(null),M=j([]),F=j(null),A=j(!1),y=j(T),[I,H]=we(T),[W,q]=we(!1),[X,$]=we(null),[D,_]=we(!1),[V]=we(qo),J=j(m);J.current=m;let Y=j(P);Y.current=P;let Qe=j(S);Qe.current=S;let Ue=j(x);Ue.current=x;let Ot=j(L);Ot.current=L;let te=ee(N=>{A.current!==N&&(A.current=N,q(N),J.current?.(N))},[]);wt(()=>{if(!W){$(null);return}let N=!1,O=()=>{Fo().then(K=>{N||($(K),K&&Ot.current?.(K))})};O();let B=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof B?.addEventListener=="function"?(B.addEventListener("devicechange",O),()=>{N=!0,B.removeEventListener?.("devicechange",O)}):()=>{N=!0}},[W]);let Me=ee(N=>{let O=d.current;O&&(O.muted=!0,O.defaultMuted=!0,O.setAttribute("muted",""),O.setAttribute("playsinline",""),O.setAttribute("webkit-playsinline",""),O.srcObject=N,N&&O.play()?.catch?.(B=>Et("preview play() failed",B)))},[]),Z=ee(()=>{F.current?.(),F.current=null;for(let N of M.current)N();M.current=[],C.current?.release(),C.current=null,f.current&&(f.current=null,Qe.current?.(null),Ue.current?.(null)),Me(null)},[Me]),et=ee((N,O)=>{F.current?.(),f.current=O,Me(O),Qe.current?.(O);let B=()=>{f.current===O&&(Et("camera track ended (device removed or permission revoked)"),Z(),te(!1))};N.addEventListener("ended",B),F.current=()=>N.removeEventListener("ended",B)},[Me,Z,te]),pe=ee(async N=>{if(!l)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let O={...kr,...s,facingMode:N},B;try{let K=C.current;if(K)B=await K.update(O);else{let ke=await(E??Do()).claim("video",O);if(C.current=ke,M.current=[ke.onTrack((be,qr)=>{et(be,qr),A.current&&l.stream(n).attachVideo(be).then(()=>Ue.current?.(be)).catch(Fr=>Et("camera re-publish after one-capture re-acquire failed",Fr))}),ke.onLost(be=>{C.current=null,M.current=[],Z(),te(!1),Y.current?.(be)})],!ke.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});B=ke.track}}catch(K){let me=Oo(K,l.status);throw Y.current?.(me),me}y.current=N,H(N),et(B,C.current?.stream??new MediaStream([B]));try{l.connect?.(),await l.whenLive(p!==void 0?{timeout:p}:void 0),await l.stream(n).attachVideo(B)}catch(K){Z(),te(!1);let me=K instanceof Error?K:new Error(String(K));throw Y.current?.(me),me}Ue.current?.(B),te(!0)},[l,n,s,p,E,et,Z,te]),Dt=ee(N=>pe(N?.facingMode??y.current),[pe]),_e=ee(async N=>{A.current&&y.current===N||await pe(N)},[pe]),tt=ee(()=>pe(y.current==="environment"?"user":"environment"),[pe]),Vt=ee(async()=>{Z(),te(!1),await l?.stream(n).detachVideo().catch(()=>{})},[l,n,Z,te]);Vo(r,()=>({start:Dt,stop:Vt,flip:tt,setFacingMode:_e,get active(){return A.current},get facingMode(){return y.current},get stream(){return f.current},get element(){return d.current}}),[Dt,Vt,tt,_e]);let qt=j(_e);if(qt.current=_e,wt(()=>{!c||!l||qt.current(T).catch(()=>{})},[c,l,T]),wt(()=>Z,[Z]),!k)return null;let Or=g==="auto"?I==="user":g,Dr=W&&(v===!0||v==="auto"&&V&&(X?.length??0)>1),Vr=()=>{D||(_(!0),tt().catch(()=>{}).finally(()=>_(!1)))};return vr("div",{className:b,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":I,children:[se("video",{ref:d,className:h,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Or?{transform:"scaleX(-1)"}:{}}}),Dr?se("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Vr,disabled:D,className:R,style:R?{opacity:D?.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:D?.6:1},children:vr("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:[se("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),se("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),se("path",{d:"M14.5 10.5v1.6h-1.6"}),se("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),se("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,w]})}),Ho=yr(function({preview:t=!0,...r},o){return se(br,{ref:o,...r,visible:t,autoStart:!1})});import{useEffect as Wo,useState as Bo}from"react";function $o(e,t){let[r,o]=Bo(null);return Wo(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}import{useCallback as Go}from"react";import{useEffect as zo,useMemo as Xo}from"react";import{createStore as jo}from"zustand/vanilla";import{useStore as Ko}from"zustand";var Jo=()=>{};function Tt(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=jo(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let c of s)c();s=null}},a=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",c=>n.setState({doc:c})),e.onSynced(()=>n.setState({synced:!0}))]),i):Jo,u=(c=>Ko(n,c));return Object.assign(u,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),u}function Ee(e,t){let r=Xo(()=>Tt(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return zo(()=>r.bind(),[r]),r}function Yo(e,t,r){let n=Ee(e,t)(r??(a=>a)),s=Go(a=>{e&&t&&e.doc(t).set(a)},[e,t]);if(r)return n;let i=n;return{snapshot:e&&t?i.doc:null,synced:i.synced,set:s}}import{useEffect as Zo,useState as Qo}from"react";var ce=200;function ie(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function Te(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Rt(e){let t=e.trim();if(!t)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(t)}catch(o){return{ok:!1,error:o instanceof Error?o.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 At(e,t,r={}){let o=r.cap??200,[n,s]=Qo([]);return Zo(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let u=await a.next();if(!i||u.done)break;s(c=>ie(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}import{jsx as ze,jsxs as Re}from"react/jsx-runtime";function es({session:e,name:t,cap:r,className:o}){let n=At(e,t,{cap:r});return Re("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[Re("div",{className:"urun-stream-tail-meta",children:[ze("code",{children:t}),Re("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),ze("div",{className:"urun-stream-tail-log",children:n.length===0?Re("span",{className:"urun-stream-tail-empty",children:["Waiting for ",ze("code",{children:t})," messages\u2026"]}):n.map((s,i)=>Re("div",{className:"urun-stream-tail-line",children:[ze("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",Te(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as ts,useState as Pr}from"react";import{jsx as le,jsxs as Xe}from"react/jsx-runtime";function Ge({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=Pr(""),[i,a]=Pr(null),u=ts(()=>{let c=Rt(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return Xe("div",{className:"urun-doc-patch",children:[le("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),Xe("div",{className:"urun-doc-patch-actions",children:[le("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?le("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function rs({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=Ee(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return Xe("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[Xe("div",{className:"urun-doc-panel-meta",children:[le("code",{children:t}),le("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),le("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?le(Ge,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}import{useEffect as ns,useState as os}from"react";import{jsx as Ae,jsxs as xr}from"react/jsx-runtime";function Cr(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function ss({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=os([]);return ns(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>ie(u,{at:Date.now(),direction:"in",text:Cr(Te(a))},r))}):void 0),[e,t,r]),xr("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[Ae(Ge,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>ie(u,{at:Date.now(),direction:"out",text:Cr(a)},r))}}),Ae("div",{className:"urun-control-sender-log",children:n.length===0?Ae("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>xr("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[Ae("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",Ae("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}import{useEffect as is,useState as as}from"react";import{jsx as Ye,jsxs as cs}from"react/jsx-runtime";function us({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=as([]),a=t.join(","),u=r.join(",");return is(()=>{if(i([]),!e)return;let c=(p,k)=>i(b=>ie(b,{at:Date.now(),kind:p,text:k},o)),g=[];g.push(e.onPhase(p=>c("phase",`phase \u2192 ${p.name}`)));for(let p of t){let k=e.stream(p);g.push(k.on("track",b=>c("track",`${p}: ${b?"track arrived":"track ended"}`)))}for(let p of r){let k=e.doc(p);g.push(k.on("change",()=>c("doc",`${p} changed`)))}return()=>g.forEach(p=>p())},[e,a,u,o]),Ye("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?Ye("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,g)=>cs("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[Ye("span",{className:"urun-event-spine-kind",children:c.kind})," ",Ye("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${g}`))})}import{describeSessionPhase as xs,isWakingPhase as ws}from"@urun-sh/core";import{useEffect as ls,useState as ds}from"react";function z(e){let[t,r]=ds(e?.phase??null);return ls(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}import{describeSessionPhase as Ss}from"@urun-sh/core";import{useEffect as ps,useRef as ms,useState as fs}from"react";import{isWakingPhase as gs}from"@urun-sh/core";function Ut(e){let t=z(e),r=gs(t?.name),o=ms(void 0);r?o.current??=Date.now():o.current=void 0;let n=r?t?.wakingSince??o.current:void 0,s=()=>n!==void 0?Math.max(0,Math.floor((Date.now()-n)/1e3)):0,[i,a]=fs(s);return ps(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let u=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(u)},[n]),{waking:r,phase:t,state:r?t?.runtime?.state:void 0,reason:r?t?.runtime?.reason:void 0,since:n,seconds:r?i:0}}import{Fragment as hs,jsx as wr,jsxs as Er}from"react/jsx-runtime";function Mt({session:e,render:t,className:r}){let o=Ut(e);return!o.waking||!o.phase?null:wr("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):Er(hs,{children:[wr("span",{className:"urun-session-waking-label",children:Ss(o.phase)})," ",Er("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}import{useEffect as ks,useState as bs}from"react";import{useEffect as Tr,useRef as vs,useState as Rr}from"react";var ys={event:null,elapsedMs:0};function _t(e,t){let[r,o]=Rr(null),n=vs(0);Tr(()=>{if(o(null),!!e?.onActivation)return e.onActivation(a=>{t!==void 0&&a.stream!==t||(n.current=Date.now(),o(a))})},[e,t]);let[s,i]=Rr(0);return Tr(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,u=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(u());let c=setInterval(()=>i(u()),1e3);return()=>clearInterval(c)},[r]),r?{event:r,elapsedMs:s}:ys}import{jsx as Ar,jsxs as Ur}from"react/jsx-runtime";var Ps={activating:"starting stream\u2026","still-activating":"model warming up \u2014 this can take a minute","cold-boot":"cold boot \u2014 compiling/loading the model, hang tight",degraded:"taking longer than usual \u2014 still trying"};function Cs(e){let[t,r]=bs(!1);return ks(()=>{if(r(!1),!e)return;let o=e;if(typeof o.requestVideoFrameCallback=="function"){let s=o.requestVideoFrameCallback(()=>r(!0));return()=>o.cancelVideoFrameCallback?.(s)}let n=()=>{let s=o.getVideoPlaybackQuality?.();(s?s.totalVideoFrames>0:o.readyState>=2)&&r(!0)};return n(),o.addEventListener("loadeddata",n),o.addEventListener("timeupdate",n),()=>{o.removeEventListener("loadeddata",n),o.removeEventListener("timeupdate",n)}},[e]),t}function Nt({session:e,stream:t,videoElement:r,render:o,className:n}){let s=_t(e,t),i=Cs(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return Ar("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):Ur("div",{className:"urun-activation-overlay-card",children:[Ar("span",{className:"urun-activation-overlay-copy",children:a.hint??Ps[u]})," ",Ur("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}import{jsx as de,jsxs as It}from"react/jsx-runtime";var Es={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function Ts({session:e,className:t}){let r=z(e),o=r?.name??"idle",n=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&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return It("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[de("span",{className:"urun-session-status-dot","data-phase":o}),de("span",{className:"urun-session-status-label",children:Es[o]}),n?de("span",{className:"urun-session-status-detail",children:n}):null]})}function Rs({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=z(e);if(s?.name==="live")return It("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,de(Nt,{session:e})]});let i=r?r(s):de("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&ws(s.name)?de(Mt,{session:e}):s&&s.name!=="idle"?xs(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return It("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?de("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}import{useEffect as As,useState as Us}from"react";import{jsx as Ns}from"react/jsx-runtime";function Mr(e){return z(e)?.endsAt??null}function Ms(e){let t=Math.max(0,Math.floor(e/1e3)),r=Math.floor(t/60),o=t%60;return`${String(r).padStart(2,"0")}:${String(o).padStart(2,"0")}`}function _s({session:e,urgentMs:t=6e4,className:r}){let n=Mr(e)?.getTime()??null,[s,i]=Us(()=>n===null?null:Math.max(0,n-Date.now()));if(As(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),s===null)return null;let a=Ms(s);return Ns("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<t?"":void 0,"data-expired":s<=0?"":void 0,children:a})}import{jsx as _r,jsxs as Os}from"react/jsx-runtime";var Is=new Set(["expired","ended","error"]);function Ls({session:e,onNewSession:t,children:r,className:o}){let n=z(e);if(!n||!Is.has(n.name))return null;let s=r?r(n):_r("span",{className:"urun-session-ended-copy",children:n.name==="expired"?"Session ended \u2014 start a new session":n.name==="error"?`Session failed${n.error?.reason?` \u2014 ${n.error.reason}`:""}.`:"Session ended."});return Os("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?_r("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}import{useEffect as Nr,useMemo as Ds,useState as Ir}from"react";import{jsx as Ze,jsxs as Fs}from"react/jsx-runtime";function Lt(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;return t.warning!==!0?null:{warning:!0,deadlineEpochS:typeof t.deadline_epoch_s=="number"?t.deadline_epoch_s:null,idleSinceEpochS:typeof t.idle_since_epoch_s=="number"?t.idle_since_epoch_s:null}}function Lr(e){let t=Ds(()=>e?e.doc("control"):null,[e]),[r,o]=Ir(()=>t?Lt(t.get("idle")):null);return Nr(()=>{if(!t){o(null);return}return o(Lt(t.get("idle"))),t.on("change",()=>o(Lt(t.get("idle"))))},[t]),r}function Vs(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function qs({session:e,onStillHere:t,className:r}){let o=Lr(e),n=o?.deadlineEpochS??null,[s,i]=Ir(null);if(Nr(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()/1e3));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return Ze("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:Fs("div",{className:"urun-idle-warning-card",children:[Ze("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),Ze("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${Vs(s)} due to inactivity.`:"This session will end soon due to inactivity."}),Ze("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}import{useContext as Hs,useEffect as Ws,useState as Bs}from"react";import{prewake as $s}from"@urun-sh/core";function js(e){let t=Hs(fe),[r,o]=Bs(null),n=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,u=t?.orgId,c=t?.jwt,g=t?.getAccessToken,p=t?.authProvider;return Ws(()=>{if(!a||!u||!n||!s)return;let k=!1,b=()=>{$s({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:g,authProvider:p}).then(m=>{k||o(m)}).catch(()=>{})};b();let h=setInterval(b,Math.max(1,i)*1e3);return()=>{k=!0,clearInterval(h)}},[n,s,i,a,u,c,g,p]),r}import{describeSessionPhase as jc,isWakingPhase as Kc}from"@urun-sh/core";export{$e as Audio,br as Camera,Mn as ComponentRenderer,kr as DEFAULT_CAMERA_CONSTRAINTS,ce as DEFAULT_LOG_CAP,Sr as DEFAULT_VOICE_CONSTRAINTS,Ge as DocPatchForm,uo as Image,$n as ImageFrame,Bn as ImageFrameSchema,Jn as MetricsPanel,Kn as MetricsPanelSchema,No as Mic,Gr as OPERATOR_CHORD_LABEL,Xr as OPERATOR_TOKEN_STORAGE_KEY,In as ProgressCard,Nn as ProgressCardSchema,Gn as Session,Dn as StatusBadge,Ln as StatusBadgeSchema,Hn as TextStream,Fn as TextStreamSchema,Nt as UrunActivationOverlay,So as UrunAudio,Hr as UrunAuthProvider,Ho as UrunCamera,ss as UrunControlSender,rs as UrunDocPanel,Pe as UrunErrorBoundary,us as UrunEventSpine,qs as UrunIdleWarning,Wr as UrunJwtProvider,nn as UrunProvider,_s as UrunSessionClock,Ls as UrunSessionEnded,Rs as UrunSessionGate,Ts as UrunSessionStatus,Mt as UrunSessionWaking,es as UrunStreamTail,Co as UrunVoice,kt as Video,Ke as Voice,Ne as authMode,Tt as createDocStore,jc as describeSessionPhase,Te as formatPayload,We as getUrunAudioContext,Kc as isWakingPhase,Rt as parseJsonObject,ie as pushCapped,$t as readOperatorToken,Un as registerComponent,Be as resumeUrunAudioContext,re as urunPublicEnv,_t as useActivation,pn as useApp,xn as useChat,kn as useCompletion,ot as useConfirmOnLeave,Ee as useDocStore,dr as useImageFrame,An as useInputPresence,pr as useMetricsPanel,nt as useOperatorOverride,or as useProgressCard,Sn as useRequest,Yn as useSession,Yo as useSessionDoc,Mr as useSessionEndsAt,Lr as useSessionIdle,z as useSessionPhase,$o as useSessionTrack,Ut as useSessionWake,ir as useStatusBadge,At as useStreamMessages,cr as useTextStream,xt as useUrunAudioLevel,rt as useUrunAuth,js as useUrunPrewake,Kr as usesWorkOSAuth};
|
|
2
|
+
import{a as Br,b as $r,c as nt}from"./chunk-WF2OBDSX.mjs";import{useCallback as rn,useEffect as jt,useMemo as nn,useRef as Kt,useState as Oe}from"react";import{Component as jr}from"react";import{jsx as Ft,jsxs as Kr}from"react/jsx-runtime";var we=class extends jr{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,r){console.error("[urun] Error caught by UrunErrorBoundary:",t,r)}render(){if(this.state.error){let{fallback:t}=this.props;return typeof t=="function"?t(this.state.error):t||Kr("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:[Ft("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),Ft("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as Jr}from"react";var Se=Jr(null);function ue(e){return e&&e.trim()?e.trim():void 0}function ne(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return ue(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return ue(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return ue(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return ue(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return ue(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return ue(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return ue(typeof process<"u"?process.env?.[e]:void 0)}}function Le(){let e=ne("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||ne("VERCEL_ENV")==="production"?"workos":ne("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function zr(){return Le()==="workos"}import{useEffect as Xr,useRef as Gr}from"react";var Yr="urun.operator_token",Wt=null,Ht="op",Zr="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function Bt(){return typeof window<"u"}function $t(){return Wt}function Qr(){if(!Bt())return null;let e=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash;if(!e)return null;let t=new URLSearchParams(e),r=t.get(Ht);if(!r)return null;Wt=r,t.delete(Ht);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function en(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function ot(e){let t=Gr(e);t.current=e,Xr(()=>{if(!Bt())return;Qr();let r=o=>{if(!en(o))return;let n=$t();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}import{useEffect as tn}from"react";function st(e=!0){tn(()=>{if(!e||typeof window>"u"||typeof window.addEventListener!="function")return;let t=r=>(r.preventDefault(),r.returnValue="","");return window.addEventListener("beforeunload",t),()=>window.removeEventListener("beforeunload",t)},[e])}import{jsx as xe,jsxs as un}from"react/jsx-runtime";var on="/api/urun-token";async function Jt(e,t){let r=await fetch(e,{method:"POST",signal:t});if(!r.ok)throw new Error(`[urun] token endpoint ${e} answered ${r.status}`);let o=await r.json(),n=typeof o.token=="string"?o.token:"",s=typeof o.orgId=="string"?o.orgId:"";if(!n||!s)throw new Error(`[urun] token endpoint ${e} returned no { token, orgId } \u2014 is it createTokenRoute() from @urun-sh/next?`);return{token:n,orgId:s,gatewayUrl:typeof o.gatewayUrl=="string"?o.gatewayUrl:void 0}}function sn(e,t){return typeof e=="function"?e(t):e!==void 0?e:un("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:[xe("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),xe("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function an({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,confirmOnLeave:g=!1,fallback:d,errorFallback:k,children:P}){let S=n===void 0&&t===void 0;if(!S&&(typeof t!="string"||t.trim().length===0))throw new Error("[urun] <UrunProvider> requires a non-empty orgId \u2014 set your org id deployment env var (e.g. NEXT_PUBLIC_SESSION_TENANT_ID) and pass it through the provider (or pass NEITHER orgId NOR jwt to let the provider mint from its tokenEndpoint).");if(!S&&(typeof e!="string"||e.trim().length===0))throw new Error("[urun] <UrunProvider> requires baseUrl when orgId/jwt are passed explicitly (self-mint mode reads it from the token endpoint instead).");let p=r??o;if(S&&(typeof p!="string"||p.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);st(g);let[C,h]=Oe(),[w,x]=Oe(),[T,v]=Oe(null),R=Kt(void 0),N=Kt(null),[A,U]=Oe(null);ot(q=>U({jwt:q}));let l=nt(),m=ne("NEXT_PUBLIC_SESSION_TOKEN")??ne("NEXT_PUBLIC_URUN_JWT"),f=Le(),b=A!==null,M=f==="workos"&&!n&&!b&&!S,H=n??(f==="jwt"?m:void 0)??C??w?.token,E=b?A.jwt:H,y=s??ne("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),I=M&&!E,O=t??w?.orgId,D=e??w?.gatewayUrl,F=S&&w===void 0,G=S&&w!==void 0&&!D?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,J=T??G,B=u??on,V=rn(async q=>q?.forceRefresh?(await(N.current??(N.current=(async()=>{try{let Y=await Jt(B);return R.current=Y.token,x(Y),Y}finally{N.current=null}})()))).token:R.current,[B]),z=nn(()=>({appId:p,baseUrl:D??"",orgId:O??"",jwt:E,getAccessToken:M?l?.getAccessToken:S&&!b?V:void 0,authProvider:y,eventsUrl:i,sessionKey:a,releaseOnLeave:c,priority:b?"preempt":void 0}),[p,l,D,y,E,i,O,a,c,M,b,S,V]);return jt(()=>{if(!S)return;let q=new AbortController;return v(null),(async()=>{try{let $=await Jt(B,q.signal);R.current=$.token,x($)}catch($){if(q.signal.aborted)return;v($ instanceof Error?$:new Error(String($)))}})(),()=>q.abort()},[S,B]),jt(()=>{if(!M||!l)return;let q=!1,$=l;async function Y(){try{let _e=await $.getAccessToken();q||h(_e??void 0)}catch{q||h(void 0)}}Y();let me=window.setInterval(()=>{Y()},6e4);return()=>{q=!0,window.clearInterval(me)}},[l,M]),xe(we,{fallback:d,children:J?sn(k,J):I||F?xe("div",{role:"status","aria-live":"polite",children:"Signing in..."}):xe(Se.Provider,{value:z,children:P})})}import{useContext as cn,useEffect as ln,useMemo as zt,useReducer as dn,useRef as it}from"react";import{App as pn}from"@urun-sh/core";function mn(e,t){return`${e}:${JSON.stringify(t??{})}`}function fn(e,t,r){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,fnName:t,args:r??{}})}var ce=new Map;var at=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},ut=class{constructor(t,r){this._stream=t;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(t){return this._stream.attach(t)}attachVideo(t){return this._stream.attachVideo(t)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(t){return this._stream.seek(t)}chunks(t){return this._stream.chunks(t)}onSeeked(t){return this._stream.onSeeked(t)}on(t,r){return this._stream.on(t,r)}messages(){return this._stream.messages()}emit(t,r){return this._stream.emit(t,r)}dispose(){this._unsubscribeTrack()}},ct=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||a.name==="expired"){let u=a.error,c=u?.reason??(a.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else a.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),i=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{i(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new at(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new ut(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function gn(){let e=cn(Se);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=dn(i=>i+1,0),r=it(new Map),o=it(new Map),n=it(null),s=zt(()=>pn(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority]);return ln(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=ce.get(a);c===u&&o.current.get(a)===u&&(c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null),c.handle.addNotifier(t),c.refCount+=1)}}return()=>{let a=new Map;for(let[u,c]of o.current){let g=ce.get(u);g===c&&(g.handle.removeNotifier(t),g.refCount=Math.max(0,g.refCount-1),a.set(u,g),g.refCount===0&&(g.disposeTimer=setTimeout(()=>{let d=ce.get(u);!d||d.refCount!==0||(ce.delete(u),d.handle.disconnect())},0)))}n.current=a}},[]),zt(()=>{let i=new Map;return new Proxy({},{get(a,u){if(typeof u!="string")return;let c=i.get(u);if(c)return c;let g=d=>{let k=mn(u,d),P=r.current.get(k);if(P&&!P.disposed)return P;let S=fn(e,u,d),p=ce.get(S);return p?.handle.disposed&&(p.disposeTimer&&clearTimeout(p.disposeTimer),ce.delete(S),o.current.get(S)===p&&o.current.delete(S),p=void 0),p?p.disposeTimer&&(clearTimeout(p.disposeTimer),p.disposeTimer=null):(p={handle:new ct(s[u](d),t,e.eventsUrl),refCount:0,disposeTimer:null},ce.set(S,p)),o.current.get(S)!==p&&(o.current.set(S,p),p.handle.addNotifier(t),p.refCount+=1),r.current.set(k,p.handle),p.handle};return i.set(u,g),g}})},[e,s])}import{useCallback as lt,useEffect as Sn,useMemo as hn,useRef as De,useState as dt}from"react";function he(e){let t=e;if(!t||typeof t.request!="function"||typeof t.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 t}function vn(e){return e instanceof Error?e:new Error(String(e))}function yn(e,t){let r=hn(()=>he(e),[e]),[o,n]=dt(void 0),[s,i]=dt(null),[a,u]=dt(!1),c=De(t);c.current=t;let g=De(0),d=De(null),k=De(!0);Sn(()=>(k.current=!0,()=>{k.current=!1,d.current?.abort()}),[]);let P=lt(async C=>{d.current?.abort();let h=new AbortController;d.current=h;let w=++g.current,x=()=>k.current&&g.current===w;x()&&(u(!0),i(null));try{let T=await r.request(C,{...c.current,signal:h.signal});return x()&&(n(T),u(!1),c.current?.onSuccess?.(T)),T}catch(T){let v=vn(T);throw x()&&(i(v),u(!1),c.current?.onError?.(v)),v}},[r]),S=lt(C=>{P(C).catch(()=>{})},[P]),p=lt(()=>{g.current++,d.current?.abort(),d.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:S,mutateAsync:P,data:o,error:s,isPending:a,reset:p}}import{useCallback as Xt,useEffect as kn,useMemo as bn,useRef as Ve,useState as pt}from"react";function Gt(e){return e instanceof Error?e:new Error(String(e))}var Pn=e=>typeof e=="string"?e:String(e);function Cn(e,t){let r=bn(()=>he(e),[e]),[o,n]=pt(""),[s,i]=pt(!1),[a,u]=pt(null),c=Ve(t);c.current=t;let g=Ve(0),d=Ve(null),k=Ve(!0);kn(()=>(k.current=!0,()=>{k.current=!1,d.current?.cancel(),d.current=null}),[]);let P=Xt(()=>{g.current++,d.current?.cancel(),d.current=null,k.current&&i(!1)},[]),S=Xt(async p=>{d.current?.cancel();let C=++g.current,h=()=>k.current&&g.current===C,w=c.current,x=w?.parseChunk??Pn,T=w?.buildPayload??(f=>({prompt:f}));h()&&(n(""),u(null),i(!0));let{parseChunk:v,buildPayload:R,onFinish:N,onError:A,...U}=w??{},l="",m;try{m=r.requestStream(T(p),U),d.current=m}catch(f){let b=Gt(f);h()&&(u(b),i(!1),w?.onError?.(b));return}try{for await(let f of m){if(g.current!==C)break;l+=x(f),h()&&n(l)}h()&&(i(!1),w?.onFinish?.(l))}catch(f){let b=Gt(f);h()&&(u(b),i(!1),w?.onError?.(b))}finally{d.current===m&&(d.current=null)}},[r]);return{completion:o,complete:S,stop:P,isStreaming:s,error:a}}import{useCallback as Yt,useEffect as wn,useMemo as xn,useRef as ve,useState as qe}from"react";function Zt(e){return e instanceof Error?e:new Error(String(e))}var Tn=e=>typeof e=="string"?e:String(e),Qt=0;function mt(e){return Qt+=1,`${e}-${Qt}`}function En(e,t){let r=xn(()=>he(e),[e]),[o,n]=qe(()=>(t?.initialMessages??[]).map(x=>({id:x.id??mt("msg"),role:x.role,content:x.content}))),[s,i]=qe(""),[a,u]=qe(!1),[c,g]=qe(null),d=ve(t);d.current=t;let k=ve(o);k.current=o;let P=ve(s);P.current=s;let S=ve(0),p=ve(null),C=ve(!0);wn(()=>(C.current=!0,()=>{C.current=!1,p.current?.cancel(),p.current=null}),[]);let h=Yt(()=>{S.current++,p.current?.cancel(),p.current=null,C.current&&u(!1)},[]),w=Yt(async x=>{let T=x===void 0,v=(T?P.current:x)??"";if(!v.trim())return;p.current?.cancel();let N=++S.current,A=()=>C.current&&S.current===N,U=d.current,l=U?.parseChunk??Tn,m={id:mt("msg"),role:"user",content:v},f={id:mt("msg"),role:"assistant",content:""},b=[...k.current,m].map(V=>({role:V.role,content:V.content})),M=[...k.current,m,f];k.current=M,n(M),T&&i(""),g(null),u(!0);let H=U?.buildPayload??(V=>({messages:V})),{initialMessages:E,parseChunk:y,buildPayload:I,onFinish:O,onError:D,...F}=U??{},G=V=>{n(z=>z.map(q=>q.id===f.id?{...q,content:V}:q))},J="",B;try{B=r.requestStream(H(b),F),p.current=B}catch(V){let z=Zt(V);A()&&(g(z),u(!1),U?.onError?.(z));return}try{for await(let V of B){if(S.current!==N)break;J+=l(V),A()&&G(J)}A()&&(u(!1),U?.onFinish?.({...f,content:J}))}catch(V){let z=Zt(V);A()&&(g(z),u(!1),U?.onError?.(z))}finally{p.current===B&&(p.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:w,stop:h,isStreaming:a,error:c}}import{useCallback as oe,useEffect as er,useMemo as Rn,useRef as tr,useState as rr}from"react";import{createInputPresencePublisher as An,INPUT_PRESENCE_DEFAULT_HZ as Un,INPUT_PRESENCE_FIELD as Mn}from"@urun-sh/core";var ft=[];function _n(e,t={}){let{field:r=Mn,hz:o=Un}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=Rn(()=>s?An({awareness:{setLocalStateField:(v,R)=>s.setField(v,R)},field:r,hz:o}):null,[s,r,o]),a=tr(null);a.current=i;let[u,c]=rr(!1),[g,d]=rr(ft),k=tr(!1);er(()=>{if(i)return()=>i.dispose()},[i]);let P=oe(()=>{let v=a.current;d(v?v.heldKeys():ft)},[]),S=oe(()=>{a.current?.clear(),d(ft)},[]);er(()=>{if(!n)return;let v=()=>!!n.pointerLockElement,R=()=>{if(v()){k.current=!1,c(!0);return}k.current||(c(!1),S())},N=f=>{v()&&(a.current?.keyDown(f.key),P())},A=f=>{a.current?.keyUp(f.key),P()},U=f=>{v()&&a.current?.movePointer(f.movementX,f.movementY)},l=f=>{v()&&a.current?.setButtons(f.buttons)},m=()=>{S()};return n.addEventListener("pointerlockchange",R),n.addEventListener("keydown",N),n.addEventListener("keyup",A),n.addEventListener("mousemove",U),n.addEventListener("mousedown",l),n.addEventListener("mouseup",l),n.defaultView?.addEventListener("blur",m),()=>{n.removeEventListener("pointerlockchange",R),n.removeEventListener("keydown",N),n.removeEventListener("keyup",A),n.removeEventListener("mousemove",U),n.removeEventListener("mousedown",l),n.removeEventListener("mouseup",l),n.defaultView?.removeEventListener("blur",m)}},[n,S,P]);let p=oe(v=>{v.requestPointerLock?.()},[]),C=oe(()=>{k.current=!0,c(!0)},[]),h=oe(()=>{k.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),S()},[n,S]),w=oe(v=>{a.current?.keyDown(v),P()},[P]),x=oe(v=>{a.current?.keyUp(v),P()},[P]),T=oe((v,R)=>{a.current?.movePointer(v,R)},[]);return{engage:p,engageTouch:C,release:h,engaged:u,heldKeys:g,pressKey:w,releaseKey:x,movePointer:T}}var nr=new Map;function Nn(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);nr.set(e,{component:t,schema:r})}function or(e,t){let r=nr.get(e);if(!r)return{error:`Unknown component: "${e}"`};let o=r.schema.safeParse(t);return o.success?{Component:r.component,validatedProps:o.data}:{error:`Validation failed for "${e}": ${o.error.message}`}}import{Fragment as Ln,jsx as Fe}from"react/jsx-runtime";function In({name:e,props:t,fallback:r}){let o=or(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?Fe(Ln,{children:r}):Fe("div",{className:"urun-component-error",role:"alert",children:Fe("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return Fe(n,{...o.validatedProps})}import{z as Te}from"zod";import{jsx as gt,jsxs as sr}from"react/jsx-runtime";var On=Te.object({step:Te.number().min(0),total:Te.number().min(1),label:Te.string().optional(),variant:Te.enum(["default","success","error"]).default("default")});function ir(e){let{step:t,total:r,label:o,variant:n="default"}=e,s=Math.min(t/r*100,100),i=t>=r;return{step:t,total:r,label:o,variant:n,percentage:s,isComplete:i}}function Dn(e){let{step:t,total:r,label:o,variant:n,percentage:s}=ir(e);return sr("div",{className:"urun-progress-card","data-variant":n,children:[o&>("div",{className:"urun-progress-label",children:o}),gt("div",{className:"urun-progress-bar",children:gt("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),sr("div",{className:"urun-progress-text",children:[t,"/",r]})]})}import{z as St}from"zod";import{jsx as ar,jsxs as Hn}from"react/jsx-runtime";var Vn=St.object({state:St.enum(["thinking","generating","idle","error"]),message:St.string().optional()}),qn={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function ur(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??qn[t]??t;return{state:t,message:n,isActive:o}}function Fn(e){let{state:t,message:r,isActive:o}=ur(e);return Hn("span",{className:"urun-status-badge","data-state":t,children:[ar("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),ar("span",{className:"urun-status-message",children:r})]})}import{useRef as cr,useEffect as Wn}from"react";import{z as ht}from"zod";import{jsx as lr,jsxs as jn}from"react/jsx-runtime";var Bn=ht.object({text:ht.string(),streaming:ht.boolean().default(!1)});function dr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function $n(e){let{text:t,streaming:r}=dr(e),o=cr(null),n=cr(0);return Wn(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),jn("div",{className:"urun-text-stream",children:[lr("span",{ref:o,className:"urun-text-content"}),r&&lr("span",{className:"urun-text-cursor"})]})}import{z as He}from"zod";import{jsx as pr,jsxs as zn}from"react/jsx-runtime";var Kn=He.object({src:He.string().url(),alt:He.string().optional(),caption:He.string().optional()});function mr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function Jn(e){let{src:t,alt:r,caption:o}=mr(e);return zn("figure",{className:"urun-image-frame",children:[pr("img",{className:"urun-image",src:t,alt:r}),o&&pr("figcaption",{className:"urun-image-caption",children:o})]})}import{z as se}from"zod";import{jsx as vt,jsxs as Yn}from"react/jsx-runtime";var Xn=se.object({metrics:se.array(se.object({label:se.string(),value:se.union([se.string(),se.number()]),unit:se.string().optional()}))});function fr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function Gn(e){let{metrics:t}=fr(e);return vt("div",{className:"urun-metrics-panel",children:t.map((r,o)=>Yn("div",{className:"urun-metric-card",children:[vt("div",{className:"urun-metric-label",children:r.label}),vt("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}import{createContext as Zn,useContext as gr}from"react";import{jsx as to}from"react/jsx-runtime";var yt=Zn(null);function Qn({session:e,children:t}){return to(yt.Provider,{value:e,children:t})}function Z(){return gr(yt)}function eo(){let e=gr(yt);if(!e)throw new Error("[urun] useSession() needs a mounted <Session session={...}> ancestor with a non-null session \u2014 create one with useApp() (e.g. app.generate({...})) and pass it to the scope.");return e}import{forwardRef as ro,useCallback as We,useEffect as no,useImperativeHandle as oo,useRef as kt,useState as so}from"react";import{jsx as uo,jsxs as co}from"react/jsx-runtime";var io=1e3;function ao(...e){console.debug("[video]",...e)}var bt=ro(function(t,r){let{session:o,stream:n="video",track:s,muted:i=!0,mirror:a=!1,objectFit:u="contain",className:c,style:g,videoClassName:d,placeholder:k,children:P,onTrack:S}=t,p=Z(),C=o??p,h=kt(null),w=kt(null),[x,T]=so(!1),v=kt(S);v.current=S;let R=We(()=>{if(typeof MediaStream>"u")return null;w.current||(w.current=new MediaStream);let m=h.current;return m&&m.srcObject!==w.current&&(m.srcObject=w.current),w.current},[]),N=We(m=>{let f=h.current;if(!f)return;let b=f.play();!b||typeof b.catch!="function"||b.catch(M=>ao(`play() failed (${m})`,M))},[]),A=We(m=>{let f=R();if(f){for(let b of f.getVideoTracks())b!==m&&f.removeTrack(b);if(m&&!f.getVideoTracks().includes(m)){f.addTrack(m);let b=h.current;b&&(b.srcObject=f)}m&&N("track-attach"),T(m!==null),v.current?.(m)}},[R,N]),U=We(m=>{h.current=m,m&&(i&&(m.muted=!0,m.defaultMuted=!0,m.setAttribute("muted","")),m.setAttribute("playsinline",""),m.setAttribute("webkit-playsinline",""),R())},[R,i]);oo(r,()=>({get element(){return h.current},get live(){return w.current?w.current.getVideoTracks().length>0:!1}}),[]);let l=s!==void 0;return no(()=>{if(l){A(s??null);return}if(!C)return;let m=C.stream(n),f=()=>{let y=w.current;return y?y.getVideoTracks()[0]??null:null},b=y=>{if(y!==f()&&(A(y),y)){let I=()=>{f()===y&&A(null)};y.addEventListener("ended",I)}},M=m.track;M&&M.readyState==="live"&&b(M);let H=m.on("track",y=>{y&&y.readyState!=="live"||b(y)}),E=setInterval(()=>{let y=m.track;y&&y.readyState==="live"&&b(y)},io);return()=>{H(),clearInterval(E)}},[C,n,l,s,A]),co("div",{className:c,style:{position:"relative",width:"100%",height:"100%",...g},"data-urun-video":"","data-urun-video-live":x?"true":"false",children:[uo("video",{ref:U,className:d,autoPlay:!0,muted:i,playsInline:!0,style:{width:"100%",height:"100%",objectFit:u,...a?{transform:"scaleX(-1)"}:{}}}),x?null:k,P]})});import{forwardRef as lo}from"react";import{jsx as mo}from"react/jsx-runtime";var po=lo(function(t,r){let{stream:o="image",...n}=t;return mo(bt,{ref:r,stream:o,...n})});import{forwardRef as go,useCallback as ye,useEffect as Pt,useImperativeHandle as So,useRef as ke}from"react";import{observePageLifecycle as ho}from"@urun-sh/core";var Be=null;function fo(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function $e(){if(Be)return Be;let e=fo();return e?(Be=new e,Be):null}function je(){let e=$e();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{jsx as ko}from"react/jsx-runtime";var vo=1e3,Sr=200;function Ct(...e){console.debug("[audio]",...e)}var Ke=go(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:g}=t,d=Z(),k=o??d,P=ke(null),S=ke(null),p=ke(null),C=ke(null),h=ke(u);h.current=u;let w=ke(c);w.current=c;let x=ye(l=>{p.current!==l&&(p.current=l,w.current?.(l))},[]),T=ye(()=>{if(typeof MediaStream>"u")return null;S.current||(S.current=new MediaStream);let l=P.current;return l&&l.srcObject!==S.current&&(l.srcObject=S.current),S.current},[]),v=ye(l=>{let m=P.current;if(!m)return;let f=m.play();!f||typeof f.then!="function"||f.then(()=>{m.muted||x(!0)}).catch(b=>{let M=b instanceof Error?b.name:String(b);if(M==="AbortError"){Ct(`play() aborted (${l}); retrying in ${Sr}ms`),C.current&&clearTimeout(C.current),C.current=setTimeout(()=>{C.current=null,v(`${l}:retry`)},Sr);return}if(M==="NotAllowedError"){Ct(`play() blocked pending a user gesture (${l})`),x(!1);return}Ct(`play() failed (${l})`,b)})},[x]),R=ye(l=>{let m=T();if(m){for(let f of m.getAudioTracks())f!==l&&m.removeTrack(f);l&&!m.getAudioTracks().includes(l)&&m.addTrack(l),l&&v("track-attach"),h.current?.(l)}},[T,v]),N=ye(()=>{let l=P.current;l&&(T(),l.muted=!1,v("gesture"),je(),x(!0))},[T,v,x]);So(r,()=>({unlock:N,get unlocked(){return p.current===!0},get element(){return P.current}}),[N]);let A=ye(l=>{P.current=l,l&&(l.setAttribute("playsinline",""),l.setAttribute("webkit-playsinline",""),T()),g?.(l)},[T,g]),U=s!==void 0;return Pt(()=>{if(U){R(s??null);return}if(!k)return;let l=k.stream(n),m=()=>{let E=S.current;return E?E.getAudioTracks()[0]??null:null},f=E=>{if(E!==m()&&(R(E),E)){let y=()=>{m()===E&&R(null)};E.addEventListener("ended",y)}},b=l.track;b&&b.readyState==="live"&&f(b);let M=l.on("track",E=>{E&&E.readyState!=="live"||f(E)}),H=setInterval(()=>{let E=l.track;E&&E.readyState==="live"&&f(E)},vo);return()=>{M(),clearInterval(H)}},[k,n,U,s,R]),Pt(()=>ho(()=>{je(),p.current===!0&&v("foreground")}),[v]),Pt(()=>()=>{C.current&&clearTimeout(C.current)},[]),ko("audio",{ref:A,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),yo=Ke;import{forwardRef as bo,useCallback as be,useEffect as hr,useImperativeHandle as Po,useRef as ee}from"react";import{observePageLifecycle as Co,sessionFailureFromMediaError as wo,sharedCaptureController as xo}from"@urun-sh/core";import{jsx as Eo}from"react/jsx-runtime";var vr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Je(...e){console.debug("[voice]",...e)}var ze=bo(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=vr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:g,onError:d,onMicStream:k,onTrack:P,onUnlockChange:S,capture:p}=t,C=Z(),h=o??C,w=ee(null),x=ee(null),T=ee(null),v=ee([]),R=ee(!1),N=ee(g);N.current=g;let A=ee(d);A.current=d;let U=ee(k);U.current=k;let l=be(y=>{R.current!==y&&(R.current=y,N.current?.(y))},[]),m=be(()=>{for(let y of v.current)y();v.current=[],T.current?.release(),T.current=null,x.current&&(x.current=null,U.current?.(null))},[]),f=be(async()=>{let y=T.current;if(y){let F=await y.update(i);return x.current=y.stream,U.current?.(y.stream),F}let O=await(p??xo()).claim("audio",i);T.current=O,v.current=[O.onTrack((F,G)=>{x.current=G,U.current?.(G),R.current&&h?.stream(n).attach(F).catch(J=>Je("mic re-attach after one-capture re-acquire failed",J))}),O.onLost(F=>{T.current=null,v.current=[],x.current=null,U.current?.(null),l(!1),A.current?.(F)})],x.current=O.stream,U.current?.(O.stream);let D=O.track;if(!D)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return D},[p,i,h,n,l]),b=be(async()=>{m(),l(!1),await h?.stream(n).detach().catch(()=>{})},[h,n,m,l]),M=be(async()=>{if(!h)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");w.current?.unlock();let y;try{y=await f()}catch(D){m();let F=wo(D,h.status);throw A.current?.(F),F}h.connect?.();let I;for(let D=1;D<=u;D++)try{await h.whenLive(a!==void 0?{timeout:a}:void 0),await h.stream(n).attach(y),l(!0);return}catch(F){I=F,Je(`start attempt ${D}/${u} failed`,F),D<u&&await new Promise(G=>setTimeout(G,c))}m(),l(!1);let O=I instanceof Error?I:new Error(String(I??"voice start failed"));throw A.current?.(O),O},[h,n,a,u,c,f,m,l]);Po(r,()=>({start:M,stop:b,unlock:()=>w.current?.unlock(),get active(){return R.current},get micStream(){return x.current},get audio(){return w.current}}),[M,b]);let H=ee(!1),E=be(async()=>{if(!h||!R.current||H.current)return;let y=x.current?.getAudioTracks()[0]??null;if(y&&y.readyState==="live"){try{await h.stream(n).attach(y)}catch(I){Je("foreground mic re-assert failed (will retry on next pass)",I)}return}H.current=!0;try{let I=await f();await h.stream(n).attach(I)}catch(I){let O=I instanceof Error?I:new Error(String(I));Je("foreground mic re-acquire failed",O),A.current?.(O)}finally{H.current=!1}},[h,n,f]);return hr(()=>{let y=()=>{E()};return h&&typeof h.onRecovery=="function"?h.onRecovery(y):Co(y)},[h,E]),hr(()=>m,[m]),s?Eo(Ke,{ref:w,session:h,stream:n,onTrack:P,onUnlockChange:S}):null}),To=ze;import{forwardRef as Uo,useEffect as Mo,useImperativeHandle as _o,useRef as yr,useState as No}from"react";import{useEffect as Ro,useState as Ao}from"react";var wt={level:0,speaking:!1};function xt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=Ao(wt);return Ro(()=>{if(!e){i(wt);return}let a=$e();if(!a||typeof MediaStream>"u")return;let u;e instanceof MediaStream?u=e:(u=new MediaStream,u.addTrack(e));let c,g;try{c=a.createMediaStreamSource(u),g=a.createAnalyser(),g.fftSize=r,c.connect(g)}catch{return}let d=new Uint8Array(g.fftSize),P=setInterval(()=>{g.getByteTimeDomainData(d);let S=0;for(let C=0;C<d.length;C++){let h=(d[C]-128)/128;S+=h*h}let p=Math.sqrt(S/d.length);i(C=>{let h=p>n;return Math.abs(C.level-p)<.005&&C.speaking===h?C:{level:p,speaking:h}})},o);return()=>{clearInterval(P),c.disconnect(),i(wt)}},[e,r,o,n]),s}import{Fragment as Do,jsx as Xe,jsxs as Vo}from"react/jsx-runtime";var Io={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},Lo={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},Oo=Uo(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:u,onActiveChange:c,onError:g,onMicStream:d,capture:k}=t,P=Z(),S=o??P,p=yr(null),[C,h]=No(null),w=yr(d);w.current=d;let{level:x,speaking:T}=xt(a?C:null);return _o(r,()=>({start:()=>{let v=p.current;return v?v.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>p.current?.stop()??Promise.resolve(),get active(){return p.current?.active??!1},get micStream(){return p.current?.micStream??null}}),[]),Mo(()=>{!i||!S||p.current?.start().catch(()=>{})},[i,S]),Vo(Do,{children:[Xe(ze,{ref:p,session:S,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...k!==void 0?{capture:k}:{},onActiveChange:c,onError:g,onMicStream:v=>{h(v),w.current?.(v)}}),a?Xe("span",{className:u,style:Io,"data-urun-mic":"","data-urun-mic-active":C?"true":"false","data-urun-mic-speaking":T?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(x*100)/100,children:Xe("span",{style:Lo,children:Xe("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(x*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});import{sessionFailureFromMediaError as qo,sharedCaptureController as Fo}from"@urun-sh/core";import{forwardRef as br,useCallback as te,useEffect as Tt,useImperativeHandle as Ho,useRef as j,useState as Ee}from"react";import{jsx as ie,jsxs as kr}from"react/jsx-runtime";var Pr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Et(...e){console.debug("[camera]",...e)}function Wo(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function Bo(){let e=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof e?.enumerateDevices!="function")return null;try{return(await e.enumerateDevices()).filter(r=>r.kind==="videoinput")}catch{return null}}var Cr=br(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:u,autoStart:c=!0,mirror:g="auto",connectTimeoutMs:d,visible:k=!1,className:P,videoClassName:S,onActiveChange:p,onError:C,onStream:h,onTrack:w,children:x,capture:T,flipControl:v="auto",flipControlClassName:R,onDevices:N}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let A=i?"user":a?"environment":u??"environment",U=Z(),l=o??U,m=j(null),f=j(null),b=j(null),M=j([]),H=j(null),E=j(!1),y=j(A),[I,O]=Ee(A),[D,F]=Ee(!1),[G,J]=Ee(null),[B,V]=Ee(!1),[z]=Ee(Wo),q=j(p);q.current=p;let $=j(C);$.current=C;let Y=j(h);Y.current=h;let me=j(w);me.current=w;let _e=j(N);_e.current=N;let re=te(_=>{E.current!==_&&(E.current=_,F(_),q.current?.(_))},[]);Tt(()=>{if(!D){J(null);return}let _=!1,L=()=>{Bo().then(K=>{_||(J(K),K&&_e.current?.(K))})};L();let W=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof W?.addEventListener=="function"?(W.addEventListener("devicechange",L),()=>{_=!0,W.removeEventListener?.("devicechange",L)}):()=>{_=!0}},[D]);let Ne=te(_=>{let L=m.current;L&&(L.muted=!0,L.defaultMuted=!0,L.setAttribute("muted",""),L.setAttribute("playsinline",""),L.setAttribute("webkit-playsinline",""),L.srcObject=_,_&&L.play()?.catch?.(W=>Et("preview play() failed",W)))},[]),Q=te(()=>{H.current?.(),H.current=null;for(let _ of M.current)_();M.current=[],b.current?.release(),b.current=null,f.current&&(f.current=null,Y.current?.(null),me.current?.(null)),Ne(null)},[Ne]),tt=te((_,L)=>{H.current?.(),f.current=L,Ne(L),Y.current?.(L);let W=()=>{f.current===L&&(Et("camera track ended (device removed or permission revoked)"),Q(),re(!1))};_.addEventListener("ended",W),H.current=()=>_.removeEventListener("ended",W)},[Ne,Q,re]),fe=te(async _=>{if(!l)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let L={...Pr,...s,facingMode:_},W;try{let K=b.current;if(K)W=await K.update(L);else{let Pe=await(T??Fo()).claim("video",L);if(b.current=Pe,M.current=[Pe.onTrack((Ce,Hr)=>{tt(Ce,Hr),E.current&&l.stream(n).attachVideo(Ce).then(()=>me.current?.(Ce)).catch(Wr=>Et("camera re-publish after one-capture re-acquire failed",Wr))}),Pe.onLost(Ce=>{b.current=null,M.current=[],Q(),re(!1),$.current?.(Ce)})],!Pe.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});W=Pe.track}}catch(K){let ge=qo(K,l.status);throw $.current?.(ge),ge}y.current=_,O(_),tt(W,b.current?.stream??new MediaStream([W]));try{l.connect?.(),await l.whenLive(d!==void 0?{timeout:d}:void 0),await l.stream(n).attachVideo(W)}catch(K){Q(),re(!1);let ge=K instanceof Error?K:new Error(String(K));throw $.current?.(ge),ge}me.current?.(W),re(!0)},[l,n,s,d,T,tt,Q,re]),Dt=te(_=>fe(_?.facingMode??y.current),[fe]),Ie=te(async _=>{E.current&&y.current===_||await fe(_)},[fe]),rt=te(()=>fe(y.current==="environment"?"user":"environment"),[fe]),Vt=te(async()=>{Q(),re(!1),await l?.stream(n).detachVideo().catch(()=>{})},[l,n,Q,re]);Ho(r,()=>({start:Dt,stop:Vt,flip:rt,setFacingMode:Ie,get active(){return E.current},get facingMode(){return y.current},get stream(){return f.current},get element(){return m.current}}),[Dt,Vt,rt,Ie]);let qt=j(Ie);if(qt.current=Ie,Tt(()=>{!c||!l||qt.current(A).catch(()=>{})},[c,l,A]),Tt(()=>Q,[Q]),!k)return null;let Vr=g==="auto"?I==="user":g,qr=D&&(v===!0||v==="auto"&&z&&(G?.length??0)>1),Fr=()=>{B||(V(!0),rt().catch(()=>{}).finally(()=>V(!1)))};return kr("div",{className:P,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":I,children:[ie("video",{ref:m,className:S,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Vr?{transform:"scaleX(-1)"}:{}}}),qr?ie("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Fr,disabled:B,className:R,style:R?{opacity:B?.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:B?.6:1},children:kr("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:[ie("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),ie("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),ie("path",{d:"M14.5 10.5v1.6h-1.6"}),ie("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),ie("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,x]})}),$o=br(function({preview:t=!0,...r},o){return ie(Cr,{ref:o,...r,visible:t,autoStart:!1})});import{useEffect as jo,useState as Ko}from"react";function Jo(e,t){let[r,o]=Ko(null);return jo(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}import{useCallback as Qo}from"react";import{useEffect as Yo,useMemo as Zo}from"react";import{createStore as zo}from"zustand/vanilla";import{useStore as Xo}from"zustand";var Go=()=>{};function Rt(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=zo(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let c of s)c();s=null}},a=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",c=>n.setState({doc:c})),e.onSynced(()=>n.setState({synced:!0}))]),i):Go,u=(c=>Xo(n,c));return Object.assign(u,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),u}function Re(e,t){let r=Zo(()=>Rt(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return Yo(()=>r.bind(),[r]),r}function es(e,t,r){let n=Re(e,t)(r??(a=>a)),s=Qo(a=>{e&&t&&e.doc(t).set(a)},[e,t]);if(r)return n;let i=n;return{snapshot:e&&t?i.doc:null,synced:i.synced,set:s}}import{useEffect as ts,useState as rs}from"react";var le=200;function ae(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function Ae(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function At(e){let t=e.trim();if(!t)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(t)}catch(o){return{ok:!1,error:o instanceof Error?o.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 Ut(e,t,r={}){let o=r.cap??200,[n,s]=rs([]);return ts(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let u=await a.next();if(!i||u.done)break;s(c=>ae(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}import{jsx as Ge,jsxs as Ue}from"react/jsx-runtime";function ns({session:e,name:t,cap:r,className:o}){let n=Ut(e,t,{cap:r});return Ue("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[Ue("div",{className:"urun-stream-tail-meta",children:[Ge("code",{children:t}),Ue("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),Ge("div",{className:"urun-stream-tail-log",children:n.length===0?Ue("span",{className:"urun-stream-tail-empty",children:["Waiting for ",Ge("code",{children:t})," messages\u2026"]}):n.map((s,i)=>Ue("div",{className:"urun-stream-tail-line",children:[Ge("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",Ae(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as os,useState as wr}from"react";import{jsx as de,jsxs as Ye}from"react/jsx-runtime";function Ze({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=wr(""),[i,a]=wr(null),u=os(()=>{let c=At(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return Ye("div",{className:"urun-doc-patch",children:[de("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),Ye("div",{className:"urun-doc-patch-actions",children:[de("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?de("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function ss({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=Re(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return Ye("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[Ye("div",{className:"urun-doc-panel-meta",children:[de("code",{children:t}),de("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),de("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?de(Ze,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}import{useEffect as is,useState as as}from"react";import{jsx as Me,jsxs as Tr}from"react/jsx-runtime";function xr(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function us({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=as([]);return is(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>ae(u,{at:Date.now(),direction:"in",text:xr(Ae(a))},r))}):void 0),[e,t,r]),Tr("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[Me(Ze,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>ae(u,{at:Date.now(),direction:"out",text:xr(a)},r))}}),Me("div",{className:"urun-control-sender-log",children:n.length===0?Me("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>Tr("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[Me("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",Me("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}import{useEffect as cs,useState as ls}from"react";import{jsx as Qe,jsxs as ps}from"react/jsx-runtime";function ds({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=ls([]),a=t.join(","),u=r.join(",");return cs(()=>{if(i([]),!e)return;let c=(d,k)=>i(P=>ae(P,{at:Date.now(),kind:d,text:k},o)),g=[];g.push(e.onPhase(d=>c("phase",`phase \u2192 ${d.name}`)));for(let d of t){let k=e.stream(d);g.push(k.on("track",P=>c("track",`${d}: ${P?"track arrived":"track ended"}`)))}for(let d of r){let k=e.doc(d);g.push(k.on("change",()=>c("doc",`${d} changed`)))}return()=>g.forEach(d=>d())},[e,a,u,o]),Qe("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?Qe("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,g)=>ps("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[Qe("span",{className:"urun-event-spine-kind",children:c.kind})," ",Qe("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${g}`))})}import{describeSessionPhase as Es,isWakingPhase as Rs}from"@urun-sh/core";import{useEffect as ms,useState as fs}from"react";function X(e){let[t,r]=fs(e?.phase??null);return ms(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}import{describeSessionPhase as ys}from"@urun-sh/core";import{useEffect as gs,useRef as Ss,useState as hs}from"react";import{isWakingPhase as vs}from"@urun-sh/core";function Mt(e){let t=X(e),r=vs(t?.name),o=Ss(void 0);r?o.current??=Date.now():o.current=void 0;let n=r?t?.wakingSince??o.current:void 0,s=()=>n!==void 0?Math.max(0,Math.floor((Date.now()-n)/1e3)):0,[i,a]=hs(s);return gs(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let u=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(u)},[n]),{waking:r,phase:t,state:r?t?.runtime?.state:void 0,reason:r?t?.runtime?.reason:void 0,since:n,seconds:r?i:0}}import{Fragment as ks,jsx as Er,jsxs as Rr}from"react/jsx-runtime";function _t({session:e,render:t,className:r}){let o=Mt(e);return!o.waking||!o.phase?null:Er("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):Rr(ks,{children:[Er("span",{className:"urun-session-waking-label",children:ys(o.phase)})," ",Rr("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}import{useEffect as Cs,useState as ws}from"react";import{useEffect as Ar,useRef as bs,useState as Ur}from"react";var Ps={event:null,elapsedMs:0};function Nt(e,t){let[r,o]=Ur(null),n=bs(0);Ar(()=>{if(o(null),!!e?.onActivation)return e.onActivation(a=>{t!==void 0&&a.stream!==t||(n.current=Date.now(),o(a))})},[e,t]);let[s,i]=Ur(0);return Ar(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,u=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(u());let c=setInterval(()=>i(u()),1e3);return()=>clearInterval(c)},[r]),r?{event:r,elapsedMs:s}:Ps}import{jsx as Mr,jsxs as _r}from"react/jsx-runtime";var xs={activating:"starting stream\u2026","still-activating":"model warming up \u2014 this can take a minute","cold-boot":"cold boot \u2014 compiling/loading the model, hang tight",degraded:"taking longer than usual \u2014 still trying"};function Ts(e){let[t,r]=ws(!1);return Cs(()=>{if(r(!1),!e)return;let o=e;if(typeof o.requestVideoFrameCallback=="function"){let s=o.requestVideoFrameCallback(()=>r(!0));return()=>o.cancelVideoFrameCallback?.(s)}let n=()=>{let s=o.getVideoPlaybackQuality?.();(s?s.totalVideoFrames>0:o.readyState>=2)&&r(!0)};return n(),o.addEventListener("loadeddata",n),o.addEventListener("timeupdate",n),()=>{o.removeEventListener("loadeddata",n),o.removeEventListener("timeupdate",n)}},[e]),t}function It({session:e,stream:t,videoElement:r,render:o,className:n}){let s=Nt(e,t),i=Ts(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return Mr("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):_r("div",{className:"urun-activation-overlay-card",children:[Mr("span",{className:"urun-activation-overlay-copy",children:a.hint??xs[u]})," ",_r("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}import{jsx as pe,jsxs as Lt}from"react/jsx-runtime";var As={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function Us({session:e,className:t}){let r=X(e),o=r?.name??"idle",n=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&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return Lt("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[pe("span",{className:"urun-session-status-dot","data-phase":o}),pe("span",{className:"urun-session-status-label",children:As[o]}),n?pe("span",{className:"urun-session-status-detail",children:n}):null]})}function Ms({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=X(e);if(s?.name==="live")return Lt("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,pe(It,{session:e})]});let i=r?r(s):pe("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&Rs(s.name)?pe(_t,{session:e}):s&&s.name!=="idle"?Es(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return Lt("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?pe("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}import{useEffect as _s,useState as Ns}from"react";import{jsx as Os}from"react/jsx-runtime";function Nr(e){return X(e)?.endsAt??null}function Is(e){let t=Math.max(0,Math.floor(e/1e3)),r=Math.floor(t/60),o=t%60;return`${String(r).padStart(2,"0")}:${String(o).padStart(2,"0")}`}function Ls({session:e,urgentMs:t=6e4,className:r}){let n=Nr(e)?.getTime()??null,[s,i]=Ns(()=>n===null?null:Math.max(0,n-Date.now()));if(_s(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),s===null)return null;let a=Is(s);return Os("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<t?"":void 0,"data-expired":s<=0?"":void 0,children:a})}import{jsx as Ir,jsxs as qs}from"react/jsx-runtime";var Ds=new Set(["expired","ended","error"]);function Vs({session:e,onNewSession:t,children:r,className:o}){let n=X(e);if(!n||!Ds.has(n.name))return null;let s=r?r(n):Ir("span",{className:"urun-session-ended-copy",children:n.name==="expired"?"Session ended \u2014 start a new session":n.name==="error"?`Session failed${n.error?.reason?` \u2014 ${n.error.reason}`:""}.`:"Session ended."});return qs("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?Ir("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}import{useEffect as Lr,useMemo as Fs,useState as Or}from"react";import{jsx as et,jsxs as Bs}from"react/jsx-runtime";function Ot(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;return t.warning!==!0?null:{warning:!0,deadlineEpochS:typeof t.deadline_epoch_s=="number"?t.deadline_epoch_s:null,idleSinceEpochS:typeof t.idle_since_epoch_s=="number"?t.idle_since_epoch_s:null}}function Dr(e){let t=Fs(()=>e?e.doc("control"):null,[e]),[r,o]=Or(()=>t?Ot(t.get("idle")):null);return Lr(()=>{if(!t){o(null);return}return o(Ot(t.get("idle"))),t.on("change",()=>o(Ot(t.get("idle"))))},[t]),r}function Hs(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function Ws({session:e,onStillHere:t,className:r}){let o=Dr(e),n=o?.deadlineEpochS??null,[s,i]=Or(null);if(Lr(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()/1e3));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return et("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:Bs("div",{className:"urun-idle-warning-card",children:[et("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),et("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${Hs(s)} due to inactivity.`:"This session will end soon due to inactivity."}),et("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}import{useContext as $s,useEffect as js,useState as Ks}from"react";import{prewake as Js}from"@urun-sh/core";function zs(e){let t=$s(Se),[r,o]=Ks(null),n=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,u=t?.orgId,c=t?.jwt,g=t?.getAccessToken,d=t?.authProvider;return js(()=>{if(!a||!u||!n||!s)return;let k=!1,P=()=>{Js({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:g,authProvider:d}).then(p=>{k||o(p)}).catch(()=>{})};P();let S=setInterval(P,Math.max(1,i)*1e3);return()=>{k=!0,clearInterval(S)}},[n,s,i,a,u,c,g,d]),r}import{describeSessionPhase as zc,isWakingPhase as Xc}from"@urun-sh/core";export{Ke as Audio,Cr as Camera,In as ComponentRenderer,Pr as DEFAULT_CAMERA_CONSTRAINTS,le as DEFAULT_LOG_CAP,vr as DEFAULT_VOICE_CONSTRAINTS,Ze as DocPatchForm,po as Image,Jn as ImageFrame,Kn as ImageFrameSchema,Gn as MetricsPanel,Xn as MetricsPanelSchema,Oo as Mic,Zr as OPERATOR_CHORD_LABEL,Yr as OPERATOR_TOKEN_STORAGE_KEY,Dn as ProgressCard,On as ProgressCardSchema,Qn as Session,Fn as StatusBadge,Vn as StatusBadgeSchema,$n as TextStream,Bn as TextStreamSchema,It as UrunActivationOverlay,yo as UrunAudio,Br as UrunAuthProvider,$o as UrunCamera,us as UrunControlSender,ss as UrunDocPanel,we as UrunErrorBoundary,ds as UrunEventSpine,Ws as UrunIdleWarning,$r as UrunJwtProvider,an as UrunProvider,Ls as UrunSessionClock,Vs as UrunSessionEnded,Ms as UrunSessionGate,Us as UrunSessionStatus,_t as UrunSessionWaking,ns as UrunStreamTail,To as UrunVoice,bt as Video,ze as Voice,Le as authMode,Rt as createDocStore,zc as describeSessionPhase,Ae as formatPayload,$e as getUrunAudioContext,Xc as isWakingPhase,At as parseJsonObject,ae as pushCapped,$t as readOperatorToken,Nn as registerComponent,je as resumeUrunAudioContext,ne as urunPublicEnv,Nt as useActivation,gn as useApp,En as useChat,Cn as useCompletion,st as useConfirmOnLeave,Re as useDocStore,mr as useImageFrame,_n as useInputPresence,fr as useMetricsPanel,ot as useOperatorOverride,ir as useProgressCard,yn as useRequest,eo as useSession,es as useSessionDoc,Nr as useSessionEndsAt,Dr as useSessionIdle,X as useSessionPhase,Jo as useSessionTrack,Mt as useSessionWake,ur as useStatusBadge,Ut as useStreamMessages,dr as useTextStream,xt as useUrunAudioLevel,nt as useUrunAuth,zs as useUrunPrewake,zr 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.33",
|
|
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.33",
|
|
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",
|