@urun-sh/react 0.6.16 → 0.6.18

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 CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client"
2
- "use strict";var gr=Object.defineProperty;var Ao=Object.getOwnPropertyDescriptor;var Mo=Object.getOwnPropertyNames;var _o=Object.prototype.hasOwnProperty;var No=(e,t)=>{for(var r in t)gr(e,r,{get:t[r],enumerable:!0})},Io=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Mo(t))!_o.call(e,n)&&n!==r&&gr(e,n,{get:()=>t[n],enumerable:!(o=Ao(t,n))||o.enumerable});return e};var Oo=e=>Io(gr({},"__esModule",{value:!0}),e);var vs={};No(vs,{Audio:()=>Nt,Camera:()=>Vr,ComponentRenderer:()=>An,CreditsClient:()=>Xe.CreditsClient,CreditsError:()=>Xe.CreditsError,CreditsUnauthorizedError:()=>Xe.CreditsUnauthorizedError,DEFAULT_CAMERA_CONSTRAINTS:()=>Dr,DEFAULT_LOG_CAP:()=>je,DEFAULT_SMOOTH_CHARS_PER_FRAME:()=>Ar,DEFAULT_SMOOTH_THRESHOLD:()=>Mr,DEFAULT_VOICE_CONSTRAINTS:()=>Ir,DocPatchForm:()=>Lt,Image:()=>Gn,ImageFrame:()=>Vn,ImageFrameSchema:()=>Dn,MetricsPanel:()=>qn,MetricsPanelSchema:()=>Fn,Mic:()=>eo,OPERATOR_CHORD_LABEL:()=>Zr,OPERATOR_TOKEN_STORAGE_KEY:()=>Jr,ProgressCard:()=>_n,ProgressCardSchema:()=>Mn,ReprojectedVideo:()=>xn,Session:()=>hn,StatusBadge:()=>In,StatusBadgeSchema:()=>Nn,Text:()=>jn,TextStream:()=>Ln,TextStreamError:()=>lt,TextStreamSchema:()=>On,UrunActivationOverlay:()=>ur,UrunAudio:()=>Jn,UrunAuthProvider:()=>Ct,UrunCamera:()=>to,UrunControlSender:()=>mo,UrunCreditsGate:()=>Ro,UrunDocPanel:()=>lo,UrunErrorBoundary:()=>ot,UrunEventSpine:()=>fo,UrunIdleWarning:()=>Co,UrunJwtProvider:()=>Gr,UrunProvider:()=>nn,UrunSessionClock:()=>yo,UrunSessionEnded:()=>To,UrunSessionGate:()=>vo,UrunSessionPaused:()=>qr,UrunSessionStatus:()=>ho,UrunSessionWaking:()=>sr,UrunStreamTail:()=>co,UrunVoice:()=>Zn,Video:()=>Ye,Voice:()=>It,authMode:()=>Tt,createCreditsClient:()=>Xe.createCreditsClient,createDocStore:()=>zt,describeSessionPhase:()=>fr.describeSessionPhase,formatPayload:()=>ft,getUrunAudioContext:()=>Rt,isWakingPhase:()=>fr.isWakingPhase,parseJsonObject:()=>Zt,pushCapped:()=>Ve,readOperatorToken:()=>Sr,registerComponent:()=>wn,resumeUrunAudioContext:()=>Je,textDelta:()=>Ur,urunPublicEnv:()=>Pe,useActivation:()=>ir,useApp:()=>an,useChat:()=>gn,useCompletion:()=>pn,useConfirmOnLeave:()=>qt,useCredits:()=>dr,useDocStore:()=>mt,useGenerationTick:()=>uo,useImageFrame:()=>Er,useInputPresence:()=>Sn,useMetricsPanel:()=>wr,useOperatorOverride:()=>Ft,useProgressCard:()=>Rr,useReferenceImage:()=>ro,useRequest:()=>ln,useSession:()=>vn,useSessionDirectory:()=>cn,useSessionDoc:()=>ao,useSessionEndsAt:()=>Fr,useSessionIdle:()=>Wr,useSessionPhase:()=>Te,useSessionStats:()=>Eo,useSessionTrack:()=>no,useSessionWake:()=>or,useStatusBadge:()=>Pr,useStreamMessages:()=>er,useText:()=>_r,useTextMeter:()=>Bn,useTextStream:()=>xr,useUrunAudioLevel:()=>Gt,useUrunAuth:()=>Dt,useUrunPrewake:()=>xo,usesWorkOSAuth:()=>Kr});module.exports=Oo(vs);var ce=require("react");var Br=require("react"),bt=require("react/jsx-runtime"),ot=class extends Br.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,bt.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,bt.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,bt.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var jr=require("react"),He=(0,jr.createContext)(null);function Ne(e){return e&&e.trim()?e.trim():void 0}function Pe(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"NEXT_PUBLIC_URUN_TOKEN_URL":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_TOKEN_URL:void 0);case"NEXT_PUBLIC_URUN_EVENTS_URL":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_EVENTS_URL:void 0);case"VERCEL_ENV":return Ne(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return Ne(typeof process<"u"?process.env?.[e]:void 0)}}function Tt(){let e=Pe("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||Pe("VERCEL_ENV")==="production"?"workos":Pe("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Kr(){return Tt()==="workos"}var st=require("react"),Xr=require("react/jsx-runtime"),$r=(0,st.createContext)(null);function Ct({getAccessToken:e,children:t}){let r=(0,st.useMemo)(()=>({getAccessToken:e}),[e]);return(0,Xr.jsx)($r.Provider,{value:r,children:t})}var Gr=Ct;function Dt(){return(0,st.useContext)($r)}var Vt=require("react"),Jr="urun.operator_token",Yr=null,zr="op",Zr="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function Qr(){return typeof window<"u"}function Sr(){return Yr}function Lo(){if(!Qr())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(zr);if(!r)return null;Yr=r,t.delete(zr);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function Do(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function Ft(e){let t=(0,Vt.useRef)(e);t.current=e,(0,Vt.useEffect)(()=>{if(!Qr())return;Lo();let r=o=>{if(!Do(o))return;let n=Sr();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}var en=require("react");function qt(e=!0){(0,en.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 Ie=require("react/jsx-runtime"),Vo="/api/urun-token",Fo=1e4;function qo(e){let t=e.split(".")[1];if(!t)return null;try{let r=t.replace(/-/g,"+").replace(/_/g,"/"),o=r.padEnd(r.length+(4-r.length%4)%4,"="),s=JSON.parse(atob(o)).exp;return typeof s=="number"&&Number.isFinite(s)?s*1e3:null}catch{return null}}async function tn(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 rn(e,t){if(t===void 0)return;let r;try{r=new URL(t).hostname}catch{throw new Error(`[urun] ${e} is not a valid URL: ${t}`)}if(!(r==="127.0.0.1"||r==="localhost"||r==="::1"||r==="[::1]"))throw new Error(`[urun] ${e} must point at a loopback endpoint \u2014 the CLI launcher (urun dev/demo) is this variable's only legitimate producer and it must never be set on a deployed site. Refusing ${t}.`);return t}function hr(e){let t=e===void 0?void 0:JSON.stringify(e);return(0,ce.useMemo)(()=>e,[t])}function Ho(e,t){return typeof e=="function"?e(t):e!==void 0?e:(0,Ie.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,Ie.jsx)("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),(0,Ie.jsx)("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:c,releaseOnLeave:u,allowWebTransport:m,allowWebRtcFallback:l,audioPlayout:g,videoPlayout:h,sessionStats:w,confirmOnLeave:v=!1,fallback:d,errorFallback:b,children:f}){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 T=r??o;if(S&&(typeof T!="string"||T.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);qt(v);let[p,C]=(0,ce.useState)(),[P,U]=(0,ce.useState)(null),A=(0,ce.useRef)(void 0),x=(0,ce.useRef)(null),[N,E]=(0,ce.useState)(null);Ft(M=>E({jwt:M}));let F=Dt(),Y=Pe("NEXT_PUBLIC_SESSION_TOKEN")??Pe("NEXT_PUBLIC_URUN_JWT"),z=Tt(),Z=N!==null,y=z==="workos"&&!n&&!Z&&!S,H=n??(z==="jwt"?Y:void 0)??p?.token,W=Z?N.jwt:H,ee=s??Pe("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),R=y&&!W&&!F?.getAccessToken,L=t??p?.orgId,_=e??p?.gatewayUrl,j=S&&p===void 0,D=S&&p!==void 0&&!_?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=R?new Error('[urun] <UrunProvider> resolved authMode()="workos" but no auth context is mounted: there is no <UrunWorkOSProvider> (or <UrunAuthProvider>) ancestor supplying getAccessToken, and no jwt prop was passed, so no session token can be obtained. Note NEXT_PUBLIC_SESSION_TOKEN and NEXT_PUBLIC_URUN_JWT are IGNORED in workos mode, so setting them will not help. Either mount UrunWorkOSProvider from @urun-sh/react/next-workos, or select jwt mode with NEXT_PUBLIC_AUTH_MODE=jwt (or NEXT_PUBLIC_AUTH_ENABLED=false) and supply a token.'):null,me=P??D??Q,ae=rn("NEXT_PUBLIC_URUN_TOKEN_URL",Pe("NEXT_PUBLIC_URUN_TOKEN_URL"))??c??Vo,le=rn("NEXT_PUBLIC_URUN_EVENTS_URL",Pe("NEXT_PUBLIC_URUN_EVENTS_URL"))??i,we=(0,ce.useCallback)(async M=>{if(!M?.forceRefresh){let te=A.current;if(!te)return te;let ve=qo(te);if(ve===null||ve-Date.now()>Fo)return te}return(await(x.current??(x.current=(async()=>{try{let te=await tn(ae);return A.current=te.token,C(te),te}finally{x.current=null}})()))).token},[ae]),he=(0,ce.useCallback)(async()=>W,[W]),qe=typeof W=="string"&&W.trim().length>0,fe=y?F?.getAccessToken:S&&!Z?we:qe?he:void 0,de=hr(g),se=hr(h),k=hr(w),q=(0,ce.useMemo)(()=>({appId:T,baseUrl:_??"",orgId:L??"",jwt:W,getAccessToken:y?F?.getAccessToken:S&&!Z?we:void 0,authProvider:ee,eventsUrl:le,sessionKey:a,releaseOnLeave:u,allowWebTransport:m,allowWebRtcFallback:l,audioPlayout:de,videoPlayout:se,sessionStats:k,priority:Z?"preempt":void 0}),[T,F,_,ee,W,le,L,a,u,m,l,de,se,k,y,Z,S,we]);return(0,ce.useEffect)(()=>{if(!S)return;let M=new AbortController;return U(null),(async()=>{try{let $=await tn(ae,M.signal);A.current=$.token,C($)}catch($){if(M.signal.aborted)return;U($ instanceof Error?$:new Error(String($)))}})(),()=>M.abort()},[S,ae]),(0,Ie.jsx)(ot,{fallback:d,children:me?Ho(b,me):j?(0,Ie.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,Ie.jsx)(He.Provider,{value:q,children:fe?(0,Ie.jsx)(Ct,{getAccessToken:fe,children:f}):f})})}var ge=require("react"),on=require("@urun-sh/core");function sn(e){return e?.sessionId?{sessionId:e.sessionId}:e?.label?{label:e.label}:{}}function Wo(e,t,r){let o=sn(r),n=r?.activity??"auto";return`${e}:${JSON.stringify(t??{})}:${o.sessionId??""}:${o.label??""}:${n}`}function Bo(e,t,r,o){let n=sn(o);return JSON.stringify({sessionId:n.sessionId,label:n.label,appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,activity:o?.activity??"auto",fnName:t,args:r??{}})}var ze=new Map;var vr=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()})}onConnectionState(t){return this._doc.onConnectionState?this._doc.onConnectionState(r=>{t(r),this._notify()}):(t({connected:!0,consecutiveFailures:0,lastCloseCode:null,lastCloseReason:null}),()=>{})}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()}},yr=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()}},kr=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"){let c=a.error,u=c?.reason??`session ${this._session.id} entered the error phase`;n({level:"error",kind:"phase-error",message:u,detail:{sessionId:this._session.id,code:c?.code,kind:c?.kind,httpStatus:c?.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 region(){return this._session.region}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}onStats(t){return this._session.onStats?this._session.onStats(t):()=>{}}watchDownlinkStall(t={}){return this._session.watchDownlinkStall?this._session.watchDownlinkStall(t):()=>{}}on(t,r){return this._session.on(t,r)}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()}activity(){this._session.activity?this._session.activity():this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new vr(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new yr(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}async cancel(){let t=await this._session.cancel();return this._disposeHandle(),t}detach(){this._disposeHandle(),this._session.detach()}disconnect(){this.detach()}_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 an(){let e=(0,ge.useContext)(He);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=(0,ge.useReducer)(i=>i+1,0),r=(0,ge.useRef)(new Map),o=(0,ge.useRef)(new Map),n=(0,ge.useRef)(null),s=(0,ge.useMemo)(()=>(0,on.App)(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,allowWebTransport:e.allowWebTransport,allowWebRtcFallback:e.allowWebRtcFallback,priority:e.priority,audioPlayout:e.audioPlayout,videoPlayout:e.videoPlayout,sessionStats:e.sessionStats}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.allowWebTransport,e.allowWebRtcFallback,e.priority,e.audioPlayout,e.videoPlayout,e.sessionStats]);return(0,ge.useEffect)(()=>{let i=n.current;if(i){n.current=null;for(let[a,c]of i){let u=ze.get(a);u===c&&o.current.get(a)===c&&(u.disposeTimer&&(clearTimeout(u.disposeTimer),u.disposeTimer=null),u.handle.addNotifier(t),u.refCount+=1)}}return()=>{let a=new Map;for(let[c,u]of o.current){let m=ze.get(c);m===u&&(m.handle.removeNotifier(t),m.refCount=Math.max(0,m.refCount-1),a.set(c,m),m.refCount===0&&(m.disposeTimer=setTimeout(()=>{let l=ze.get(c);!l||l.refCount!==0||(ze.delete(c),l.handle.disconnect())},0)))}n.current=a}},[]),(0,ge.useMemo)(()=>{let i=new Map;return new Proxy({},{get(a,c){if(typeof c!="string")return;let u=i.get(c);if(u)return u;let m=(l,g)=>{let h=Wo(c,l,g),w=r.current.get(h);if(w&&!w.disposed)return w;let v=Bo(e,c,l,g),d=ze.get(v);return d?.handle.disposed&&(d.disposeTimer&&clearTimeout(d.disposeTimer),ze.delete(v),o.current.get(v)===d&&o.current.delete(v),d=void 0),d?d.disposeTimer&&(clearTimeout(d.disposeTimer),d.disposeTimer=null):(d={handle:new kr(s[c](l,g),t,e.eventsUrl),refCount:0,disposeTimer:null},ze.set(v,d)),o.current.get(v)!==d&&(o.current.set(v,d),d.handle.addNotifier(t),d.refCount+=1),r.current.set(h,d.handle),d.handle};return i.set(c,m),m}})},[e,s])}var Ht=require("react"),un=require("@urun-sh/core");function cn(){let e=(0,Ht.useContext)(He);if(!e)throw new Error("useSessionDirectory must be used within <UrunProvider>");if(!e.appId)throw new Error('useSessionDirectory requires <UrunProvider appId="...">');let{appId:t,baseUrl:r,orgId:o,jwt:n,getAccessToken:s,authProvider:i}=e;return(0,Ht.useMemo)(()=>(0,un.sessionDirectory)(t,{baseUrl:r,orgId:o,jwt:n,getAccessToken:s,authProvider:i}),[t,r,o,n,s,i])}var ie=require("react");function it(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 jo(e){return e instanceof Error?e:new Error(String(e))}function ln(e,t){let r=(0,ie.useMemo)(()=>it(e),[e]),[o,n]=(0,ie.useState)(void 0),[s,i]=(0,ie.useState)(null),[a,c]=(0,ie.useState)(!1),u=(0,ie.useRef)(t);u.current=t;let m=(0,ie.useRef)(0),l=(0,ie.useRef)(null),g=(0,ie.useRef)(!0);(0,ie.useEffect)(()=>(g.current=!0,()=>{g.current=!1,l.current?.abort()}),[]);let h=(0,ie.useCallback)(async d=>{l.current?.abort();let b=new AbortController;l.current=b;let f=++m.current,S=()=>g.current&&m.current===f;S()&&(c(!0),i(null));try{let T=await r.request(d,{...u.current,signal:b.signal});return S()&&(n(T),c(!1),u.current?.onSuccess?.(T)),T}catch(T){let p=jo(T);throw S()&&(i(p),c(!1),u.current?.onError?.(p)),p}},[r]),w=(0,ie.useCallback)(d=>{h(d).catch(()=>{})},[h]),v=(0,ie.useCallback)(()=>{m.current++,l.current?.abort(),l.current=null,n(void 0),i(null),c(!1)},[]);return{mutate:w,mutateAsync:h,data:o,error:s,isPending:a,reset:v}}var ue=require("react");function dn(e){return e instanceof Error?e:new Error(String(e))}var Ko=e=>typeof e=="string"?e:String(e);function pn(e,t){let r=(0,ue.useMemo)(()=>it(e),[e]),[o,n]=(0,ue.useState)(""),[s,i]=(0,ue.useState)(!1),[a,c]=(0,ue.useState)(null),u=(0,ue.useRef)(t);u.current=t;let m=(0,ue.useRef)(0),l=(0,ue.useRef)(null),g=(0,ue.useRef)(!0);(0,ue.useEffect)(()=>(g.current=!0,()=>{g.current=!1,l.current?.cancel(),l.current=null}),[]);let h=(0,ue.useCallback)(()=>{m.current++,l.current?.cancel(),l.current=null,g.current&&i(!1)},[]),w=(0,ue.useCallback)(async v=>{l.current?.cancel();let d=++m.current,b=()=>g.current&&m.current===d,f=u.current,S=f?.parseChunk??Ko,T=f?.buildPayload??(E=>({prompt:E}));b()&&(n(""),c(null),i(!0));let{parseChunk:p,buildPayload:C,onFinish:P,onError:U,...A}=f??{},x="",N;try{N=r.requestStream(T(v),A),l.current=N}catch(E){let F=dn(E);b()&&(c(F),i(!1),f?.onError?.(F));return}try{for await(let E of N){if(m.current!==d)break;x+=S(E),b()&&n(x)}b()&&(i(!1),f?.onFinish?.(x))}catch(E){let F=dn(E);b()&&(c(F),i(!1),f?.onError?.(F))}finally{l.current===N&&(l.current=null)}},[r]);return{completion:o,complete:w,stop:h,isStreaming:s,error:a}}var ne=require("react");function mn(e){return e instanceof Error?e:new Error(String(e))}var $o=e=>typeof e=="string"?e:String(e),fn=0;function br(e){return fn+=1,`${e}-${fn}`}function gn(e,t){let r=(0,ne.useMemo)(()=>it(e),[e]),[o,n]=(0,ne.useState)(()=>(t?.initialMessages??[]).map(S=>({id:S.id??br("msg"),role:S.role,content:S.content}))),[s,i]=(0,ne.useState)(""),[a,c]=(0,ne.useState)(!1),[u,m]=(0,ne.useState)(null),l=(0,ne.useRef)(t);l.current=t;let g=(0,ne.useRef)(o);g.current=o;let h=(0,ne.useRef)(s);h.current=s;let w=(0,ne.useRef)(0),v=(0,ne.useRef)(null),d=(0,ne.useRef)(!0);(0,ne.useEffect)(()=>(d.current=!0,()=>{d.current=!1,v.current?.cancel(),v.current=null}),[]);let b=(0,ne.useCallback)(()=>{w.current++,v.current?.cancel(),v.current=null,d.current&&c(!1)},[]),f=(0,ne.useCallback)(async S=>{let T=S===void 0,p=(T?h.current:S)??"";if(!p.trim())return;v.current?.cancel();let P=++w.current,U=()=>d.current&&w.current===P,A=l.current,x=A?.parseChunk??$o,N={id:br("msg"),role:"user",content:p},E={id:br("msg"),role:"assistant",content:""},F=[...g.current,N].map(D=>({role:D.role,content:D.content})),Y=[...g.current,N,E];g.current=Y,n(Y),T&&i(""),m(null),c(!0);let z=A?.buildPayload??(D=>({messages:D})),{initialMessages:Z,parseChunk:y,buildPayload:H,onFinish:W,onError:ee,...R}=A??{},L=D=>{n(Q=>Q.map(me=>me.id===E.id?{...me,content:D}:me))},_="",j;try{j=r.requestStream(z(F),R),v.current=j}catch(D){let Q=mn(D);U()&&(m(Q),c(!1),A?.onError?.(Q));return}try{for await(let D of j){if(w.current!==P)break;_+=x(D),U()&&L(_)}U()&&(c(!1),A?.onFinish?.({...E,content:_}))}catch(D){let Q=mn(D);U()&&(m(Q),c(!1),A?.onError?.(Q))}finally{v.current===j&&(v.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:f,stop:b,isStreaming:a,error:u}}var re=require("react"),at=require("@urun-sh/core"),Tr=[];function Sn(e,t={}){let{field:r=at.INPUT_PRESENCE_FIELD,hz:o=at.INPUT_PRESENCE_DEFAULT_HZ}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=(0,re.useMemo)(()=>s?(0,at.createInputPresencePublisher)({awareness:{setLocalStateField:(p,C)=>s.setField(p,C)},field:r,hz:o}):null,[s,r,o]),a=(0,re.useRef)(null);a.current=i;let[c,u]=(0,re.useState)(!1),[m,l]=(0,re.useState)(Tr),g=(0,re.useRef)(!1);(0,re.useEffect)(()=>{if(i)return()=>i.dispose()},[i]);let h=(0,re.useCallback)(()=>{let p=a.current;l(p?p.heldKeys():Tr)},[]),w=(0,re.useCallback)(()=>{a.current?.clear(),l(Tr)},[]);(0,re.useEffect)(()=>{if(!n)return;let p=()=>!!n.pointerLockElement,C=()=>{if(p()){g.current=!1,u(!0);return}g.current||(u(!1),w())},P=E=>{p()&&(a.current?.keyDown(E.key),h())},U=E=>{a.current?.keyUp(E.key),h()},A=E=>{p()&&a.current?.movePointer(E.movementX,E.movementY)},x=E=>{p()&&a.current?.setButtons(E.buttons)},N=()=>{w()};return n.addEventListener("pointerlockchange",C),n.addEventListener("keydown",P),n.addEventListener("keyup",U),n.addEventListener("mousemove",A),n.addEventListener("mousedown",x),n.addEventListener("mouseup",x),n.defaultView?.addEventListener("blur",N),()=>{n.removeEventListener("pointerlockchange",C),n.removeEventListener("keydown",P),n.removeEventListener("keyup",U),n.removeEventListener("mousemove",A),n.removeEventListener("mousedown",x),n.removeEventListener("mouseup",x),n.defaultView?.removeEventListener("blur",N)}},[n,w,h]);let v=(0,re.useCallback)(p=>{p.requestPointerLock?.()},[]),d=(0,re.useCallback)(()=>{g.current=!0,u(!0)},[]),b=(0,re.useCallback)(()=>{g.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),u(!1),w()},[n,w]),f=(0,re.useCallback)(p=>{a.current?.keyDown(p),h()},[h]),S=(0,re.useCallback)(p=>{a.current?.keyUp(p),h()},[h]),T=(0,re.useCallback)((p,C)=>{a.current?.movePointer(p,C)},[]);return{engage:v,engageTouch:d,release:b,engaged:c,heldKeys:m,pressKey:f,releaseKey:S,movePointer:T}}var pe=require("react"),Pn=require("@urun-sh/core");var V=require("react"),Rn=require("@urun-sh/core");var Wt=null;function Go(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function Rt(){if(Wt)return Wt;let e=Go();return e?(Wt=new e,Wt):null}function Je(){let e=Rt();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var Pt=require("react"),yn=require("react/jsx-runtime"),Cr=(0,Pt.createContext)(null);function hn({session:e,children:t}){return(0,yn.jsx)(Cr.Provider,{value:e,children:t})}function Ue(){return(0,Pt.useContext)(Cr)}function vn(){let e=(0,Pt.useContext)(Cr);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 xt=require("react/jsx-runtime");function Xo(e,t){return e-t>>>0<2147483648}var kn=1e3;function bn(...e){console.debug("[video]",...e)}function Tn(e,t){let r=new Set,o=t.filter(s=>r.has(s)?!1:(r.add(s),!0)).map(s=>e.stream(s)),n=()=>{for(let s of o){let i=s.track;if(i&&i.readyState==="live")return i}return null};return{get track(){return n()},on(s,i){let a=o.map(c=>c.on("track",()=>i(n())));return()=>{for(let c of a)c()}}}}function Cn(e,t,r){return r?[r,t]:[e,t]}var Ye=(0,V.forwardRef)(function(t,r){let{session:o,stream:n="video",audioStream:s="audio",track:i,muted:a=!0,mirror:c=!1,objectFit:u="contain",className:m,style:l,videoClassName:g,placeholder:h,poster:w,children:v,onTrack:d,onFirstFrame:b,frameMarker:f,onFrameMarkerReached:S,onFrameMarkerUnsupported:T,onUnlockChange:p}=t,C=Ue(),P=o??C,U=(0,V.useRef)(null),A=(0,V.useRef)(null),[x,N]=(0,V.useState)(!1),[E,F]=(0,V.useState)(!1),Y=(0,V.useRef)(!1),z=(0,V.useRef)(null),Z=(0,V.useRef)(d);Z.current=d;let y=(0,V.useRef)(p);y.current=p;let H=(0,V.useRef)(b);H.current=b;let W=(0,V.useRef)(S);W.current=S;let ee=(0,V.useRef)(T);ee.current=T;let R=(0,V.useRef)(f??null);R.current=f??null;let L=(0,V.useCallback)(k=>{z.current!==k&&(z.current=k,y.current?.(k))},[]),_=(0,V.useRef)(null),j=(0,V.useRef)(null),D=(0,V.useCallback)((k,q=!1)=>{if(!q&&k===_.current||(_.current=k,j.current?.(),j.current=null,Y.current=!1,F(!1),!k))return;let M=U.current;if(!M)return;let $=R.current,te=$?.rtpTimestamp??null,ve=!1,O=()=>{ve||(ve=!0,ee.current?.())};$&&te==null&&O();let Ae=$!=null&&te!=null,rt=_e=>{j.current?.(),j.current=null,Y.current=!0,F(!0),H.current?.(),_e&&W.current?.()};if(typeof M.requestVideoFrameCallback=="function"){let _e=!1,B=0,K=(ye,ke)=>{if(!_e){if(Ae){let Re=ke?.rtpTimestamp;if(typeof Re!="number"){O(),rt(!1);return}if(!Xo(Re,te)){B=M.requestVideoFrameCallback(K);return}rt(!0);return}rt(!1)}};B=M.requestVideoFrameCallback(K),j.current=()=>{_e=!0,M.cancelVideoFrameCallback?.(B)};return}Ae&&O();let Me=()=>{let _e=M.getVideoPlaybackQuality?.();(_e?_e.totalVideoFrames>0:M.readyState>=2&&M.videoWidth>0)&&rt(!1)};M.addEventListener("loadeddata",Me),M.addEventListener("timeupdate",Me),M.addEventListener("playing",Me),j.current=()=>{M.removeEventListener("loadeddata",Me),M.removeEventListener("timeupdate",Me),M.removeEventListener("playing",Me)},Me()},[]);(0,V.useEffect)(()=>()=>{j.current?.(),j.current=null},[]);let Q=f==null?null:`${f.rtpTimestamp??""}|${f.ptsMs??""}`,me=(0,V.useRef)(Q);(0,V.useEffect)(()=>{if(me.current===Q||(me.current=Q,Q==null))return;let k=_.current;k&&D(k,!0)},[Q,D]);let ae=(0,V.useCallback)(()=>{if(typeof MediaStream>"u")return null;A.current||(A.current=new MediaStream);let k=U.current;return k&&k.srcObject!==A.current&&(k.srcObject=A.current),A.current},[]),le=(0,V.useCallback)(k=>{let q=U.current;if(!q)return;let M=q.play();!M||typeof M.then!="function"||M.then(()=>{q.muted||L(!0)}).catch($=>{if(($ instanceof Error?$.name:String($))==="NotAllowedError"&&!q.muted){bn(`play() blocked pending a user gesture (${k})`),L(!1);return}bn(`play() failed (${k})`,$)})},[L]),we=(0,V.useCallback)(()=>{let k=U.current;k&&(ae(),!k.muted&&(le("gesture"),Je(),L(!0)))},[ae,le,L]),he=(0,V.useCallback)(k=>{let q=ae();if(q){for(let M of q.getVideoTracks())M!==k&&q.removeTrack(M);if(k&&!q.getVideoTracks().includes(k)){q.addTrack(k);let M=U.current;M&&(M.srcObject=q)}k&&le("track-attach"),N(k!==null),D(k),Z.current?.(k)}},[ae,le,D]),qe=(0,V.useCallback)(k=>{let q=ae();if(q){for(let M of q.getAudioTracks())M!==k&&q.removeTrack(M);k&&!q.getAudioTracks().includes(k)&&q.addTrack(k),k&&le("audio-attach")}},[ae,le]),fe=(0,V.useCallback)(k=>{U.current=k,k&&(a?(k.muted=!0,k.defaultMuted=!0,k.setAttribute("muted",""),z.current=null):(k.muted=!1,k.defaultMuted=!1,k.removeAttribute("muted")),k.setAttribute("playsinline",""),k.setAttribute("webkit-playsinline",""),ae())},[ae,a]);(0,V.useImperativeHandle)(r,()=>({get element(){return U.current},get live(){return A.current?A.current.getVideoTracks().length>0:!1},get framed(){return Y.current},unlock:we,get unlocked(){return z.current===!0}}),[we]);let de=(0,Rn.derivedLegRole)(n)!==void 0;(0,V.useEffect)(()=>{de&&console.error(`[video] stream=${JSON.stringify(n)} is an INTERNAL A/V leg name, not a consumable stream \u2014 address the PARENT (e.g. "${n.slice(0,n.lastIndexOf("--"))}") instead. Rendering empty.`)},[de,n]);let se=i!==void 0;return(0,V.useEffect)(()=>{if(se){he(i??null);return}if(de){he(null);return}if(!P)return;let k=Tn(P,Cn(n,"video")),q=()=>{let O=A.current;return O?O.getVideoTracks()[0]??null:null},M=O=>{if(O!==q()&&(he(O),O)){let Ae=()=>{q()===O&&he(null)};O.addEventListener("ended",Ae)}},$=k.track;$&&$.readyState==="live"&&M($);let te=k.on("track",O=>{O&&O.readyState!=="live"||M(O)}),ve=setInterval(()=>{let O=k.track;O&&O.readyState==="live"&&M(O)},kn);return()=>{te(),clearInterval(ve)}},[P,n,de,se,i,he]),(0,V.useEffect)(()=>{if(se||!P||s===!1||de)return;let k=Tn(P,Cn(n,"audio",s)),q=()=>{let O=A.current;return O?O.getAudioTracks()[0]??null:null},M=O=>{if(O!==q()&&(qe(O),O)){let Ae=()=>{q()===O&&qe(null)};O.addEventListener("ended",Ae)}},$=k.track;$&&$.readyState==="live"&&M($);let te=k.on("track",O=>{O&&O.readyState!=="live"||M(O)}),ve=setInterval(()=>{let O=k.track;O&&O.readyState==="live"&&M(O)},kn);return()=>{te(),clearInterval(ve)}},[P,n,de,s,se,qe]),(0,xt.jsxs)("div",{className:m,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":x?"true":"false","data-urun-video-framed":E?"true":"false",children:[(0,xt.jsx)("video",{ref:fe,className:g,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:u,...c?{transform:"scaleX(-1)"}:{}}}),x?null:h,w===void 0?null:(0,xt.jsx)("div",{"data-urun-video-poster":"","aria-hidden":E||void 0,style:{position:"absolute",inset:0,...E?{opacity:0,pointerEvents:"none"}:null},children:w}),v]})});var Et=require("react/jsx-runtime"),zo={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},xn=(0,pe.forwardRef)(function(t,r){let{warp:o,children:n,...s}=t,{enabled:i=!0,overscan:a=.08,captureInput:c=!0,documentTarget:u,...m}=o??{},l=u!==void 0?u:typeof document<"u"?document:null,g=(0,pe.useRef)(null),h=(0,pe.useRef)(null),w=(0,pe.useRef)(0),v=(0,pe.useRef)(m);v.current=m;let d=(0,pe.useMemo)(()=>(0,Pn.createCameraWarp)(v.current),[]);return(0,pe.useImperativeHandle)(r,()=>({get video(){return g.current},get canvas(){return h.current},warp:d,get lastDrawTs(){return w.current}}),[d]),(0,pe.useEffect)(()=>{if(!i)return;let b=0,f=0,S=null,T=C=>{typeof C.requestVideoFrameCallback=="function"&&(S=C,f=C.requestVideoFrameCallback(function P(){d.frameArrived(),f=C.requestVideoFrameCallback(P)}))},p=C=>{b=requestAnimationFrame(p);let P=h.current,U=g.current?.element??null;if(!P||!U||(U!==S&&(S&&f&&S.cancelVideoFrameCallback?.(f),T(U)),U.readyState<2))return;d.tick(C);let A=typeof devicePixelRatio=="number"?devicePixelRatio:1,x=Math.max(1,Math.round(P.clientWidth*A)),N=Math.max(1,Math.round(P.clientHeight*A));(P.width!==x||P.height!==N)&&(P.width=x,P.height=N);let E=P.getContext("2d");if(!E)return;let F=d.transform(),Y=U.videoWidth||x,z=U.videoHeight||N,y=Math.max(x/Y,N/z)*(1+a)*F.scale;E.setTransform(y,0,0,y,x/2+F.translateX*x,N/2+F.translateY*N),E.drawImage(U,-Y/2,-z/2),w.current=C};return b=requestAnimationFrame(p),()=>{cancelAnimationFrame(b),S&&f&&S.cancelVideoFrameCallback?.(f)}},[i,a,d]),(0,pe.useEffect)(()=>{if(!i||!c||!l)return;let b=()=>!!l.pointerLockElement,f=P=>{b()&&d.keyDown(P.key)},S=P=>d.keyUp(P.key),T=P=>{b()&&d.pointerDelta(P.movementX,P.movementY)},p=()=>{b()||d.clearKeys()},C=()=>d.clearKeys();return l.addEventListener("keydown",f),l.addEventListener("keyup",S),l.addEventListener("mousemove",T),l.addEventListener("pointerlockchange",p),l.defaultView?.addEventListener("blur",C),()=>{l.removeEventListener("keydown",f),l.removeEventListener("keyup",S),l.removeEventListener("mousemove",T),l.removeEventListener("pointerlockchange",p),l.defaultView?.removeEventListener("blur",C)}},[i,c,l,d]),i?(0,Et.jsxs)(Ye,{ref:g,...s,videoClassName:s.videoClassName,style:{...s.style},children:[(0,Et.jsx)("canvas",{ref:h,style:zo,"data-urun-warp":""}),n]}):(0,Et.jsx)(Ye,{ref:g,...s,children:n})});var En=new Map;function wn(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);En.set(e,{component:t,schema:r})}function Un(e,t){let r=En.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 Ze=require("react/jsx-runtime");function An({name:e,props:t,fallback:r}){let o=Un(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?(0,Ze.jsx)(Ze.Fragment,{children:r}):(0,Ze.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,Ze.jsx)("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return(0,Ze.jsx)(n,{...o.validatedProps})}var ut=require("zod"),Qe=require("react/jsx-runtime"),Mn=ut.z.object({step:ut.z.number().min(0),total:ut.z.number().min(1),label:ut.z.string().optional(),variant:ut.z.enum(["default","success","error"]).default("default")});function Rr(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 _n(e){let{step:t,total:r,label:o,variant:n,percentage:s}=Rr(e);return(0,Qe.jsxs)("div",{className:"urun-progress-card","data-variant":n,children:[o&&(0,Qe.jsx)("div",{className:"urun-progress-label",children:o}),(0,Qe.jsx)("div",{className:"urun-progress-bar",children:(0,Qe.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,Qe.jsxs)("div",{className:"urun-progress-text",children:[t,"/",r]})]})}var Bt=require("zod"),wt=require("react/jsx-runtime"),Nn=Bt.z.object({state:Bt.z.enum(["thinking","generating","idle","error"]),message:Bt.z.string().optional()}),Jo={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Pr(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??Jo[t]??t;return{state:t,message:n,isActive:o}}function In(e){let{state:t,message:r,isActive:o}=Pr(e);return(0,wt.jsxs)("span",{className:"urun-status-badge","data-state":t,children:[(0,wt.jsx)("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),(0,wt.jsx)("span",{className:"urun-status-message",children:r})]})}var Ut=require("react"),jt=require("zod"),At=require("react/jsx-runtime"),On=jt.z.object({text:jt.z.string(),streaming:jt.z.boolean().default(!1)});function xr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function Ln(e){let{text:t,streaming:r}=xr(e),o=(0,Ut.useRef)(null),n=(0,Ut.useRef)(0);return(0,Ut.useEffect)(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),(0,At.jsxs)("div",{className:"urun-text-stream",children:[(0,At.jsx)("span",{ref:o,className:"urun-text-content"}),r&&(0,At.jsx)("span",{className:"urun-text-cursor"})]})}var Mt=require("zod"),_t=require("react/jsx-runtime"),Dn=Mt.z.object({src:Mt.z.string().url(),alt:Mt.z.string().optional(),caption:Mt.z.string().optional()});function Er(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function Vn(e){let{src:t,alt:r,caption:o}=Er(e);return(0,_t.jsxs)("figure",{className:"urun-image-frame",children:[(0,_t.jsx)("img",{className:"urun-image",src:t,alt:r}),o&&(0,_t.jsx)("figcaption",{className:"urun-image-caption",children:o})]})}var Oe=require("zod"),ct=require("react/jsx-runtime"),Fn=Oe.z.object({metrics:Oe.z.array(Oe.z.object({label:Oe.z.string(),value:Oe.z.union([Oe.z.string(),Oe.z.number()]),unit:Oe.z.string().optional()}))});function wr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function qn(e){let{metrics:t}=wr(e);return(0,ct.jsx)("div",{className:"urun-metrics-panel",children:t.map((r,o)=>(0,ct.jsxs)("div",{className:"urun-metric-card",children:[(0,ct.jsx)("div",{className:"urun-metric-label",children:r.label}),(0,ct.jsx)("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}var J=require("react"),Kn=require("react/jsx-runtime");function We(e){return e&&typeof e=="object"?e:null}function Ur(e){if(typeof e=="string")return e;let t=We(e);return t&&t.t==="delta"&&typeof t.delta=="string"?t.delta:""}function Yo(e){if(typeof e=="string")return"delta";let t=We(e);return t?t.t==="delta"?"delta":t.t==="response"?"done":t.t==="error"?"error":"ignore":"ignore"}function Zo(...e){for(let t of e)if(typeof t=="string"&&t)return t;return""}function Qo(e){let t=We(e),r=t?.body;return Zo(r,We(We(r)?.error)?.message,We(r)?.error,We(r)?.message,We(t?.error)?.message,t?.error,t?.message)||"stream reported an error"}var lt=class extends Error{name="TextStreamError"},es=4,Ar=3,Mr=240,Hn=typeof performance<"u"&&typeof performance.now=="function"?()=>performance.now():()=>Date.now();function Wn(){return{chars:0,tokens:0,tokensPerSecond:0,elapsedMs:0,done:!1}}function ts(e){e.chars=0,e.tokens=0,e.tokensPerSecond=0,e.elapsedMs=0,e.done=!1}function _r(e){let{session:t,stream:r}=e,o=(0,J.useRef)(e);(0,J.useEffect)(()=>{o.current=e});let n=(0,J.useRef)(null),s=(0,J.useRef)(()=>{}),i=(0,J.useRef)(null),a=(0,J.useRef)(""),c=(0,J.useRef)(""),u=(0,J.useRef)(null),m=(0,J.useRef)(!1),l=(0,J.useRef)(!1),g=(0,J.useRef)(!1),h=(0,J.useRef)(null),w=(0,J.useRef)(Wn()),v=(0,J.useCallback)(S=>{if(n.current=S,!S){i.current=null;return}let T=i.current;if(T&&T.parentNode===S)return;let p=S.ownerDocument.createTextNode(c.current);S.appendChild(p),i.current=p,a.current.length>0&&s.current()},[]),d=(0,J.useCallback)(()=>{u.current=null;let S=i.current,T=a.current;if(T.length>0){let A=o.current,x=A.smoothCharsPerFrame??Ar,N=A.smoothThreshold??Mr,E=A.smooth&&T.length<=N?T.slice(0,x):T;a.current=T.slice(E.length),c.current+=E,S?.appendData(E)}let p=w.current,C=c.current.length,P=h.current===null?0:Math.max(0,Hn()-h.current),U=Math.round(C/es);if(p.chars=C,p.tokens=U,p.elapsedMs=P,p.tokensPerSecond=P>0?U*1e3/P:0,a.current.length>0){b(),o.current.onMeter?.(p);return}if(!m.current&&!g.current){g.current=!0,p.done=!0,o.current.onMeter?.(p),l.current||o.current.onDone?.(c.current);return}o.current.onMeter?.(p)},[]),b=(0,J.useCallback)(()=>{u.current===null&&(u.current=globalThis.requestAnimationFrame(()=>d()))},[d]);s.current=b,(0,J.useEffect)(()=>{if(!t)return;if(typeof globalThis.requestAnimationFrame!="function")throw new Error("[urun] Text requires requestAnimationFrame. Render it in a browser (or a DOM test environment).");a.current="",c.current="",l.current=!1,g.current=!1,h.current=null,m.current=!0,ts(w.current),i.current&&(i.current.data="");let S=!1,T=null;return(async()=>{try{for(T=t.stream(r).messages()[Symbol.asyncIterator]();;){let C=await T.next();if(S)return;if(C.done)break;let P=C.value,U=Yo(P);if(U==="error")throw new lt(Qo(P));if(U==="done")break;if(U==="ignore")continue;let A=Ur(P);A&&(h.current===null&&(h.current=Hn()),a.current+=A,b())}if(S)return;T.return?.(void 0),m.current=!1,b()}catch(p){if(S)return;T?.return?.(void 0),l.current=!0,m.current=!1,o.current.onError?.(p instanceof Error?p:new lt(String(p))),b()}})(),()=>{S=!0,m.current=!1,T?.return?.(void 0),u.current!==null&&(globalThis.cancelAnimationFrame?.(u.current),u.current=null)}},[t,r,b]);let f=(0,J.useCallback)(()=>c.current,[]);return{ref:v,meterRef:w,getText:f}}function Bn(e,t=250){let[r,o]=(0,J.useState)(Wn);return(0,J.useEffect)(()=>{let n=setInterval(()=>{let s=e.current;o(i=>i.chars===s.chars&&i.done===s.done?i:{...s})},t);return()=>clearInterval(n)},[e,t]),r}function jn(e){let{className:t,style:r,...o}=e,{ref:n}=_r(o);return(0,Kn.jsx)("span",{ref:n,className:t,style:r})}var $n=require("react");var Xn=require("react/jsx-runtime"),Gn=(0,$n.forwardRef)(function(t,r){let{stream:o="image",...n}=t;return(0,Xn.jsx)(Ye,{ref:r,stream:o,...n})});var G=require("react"),zn=require("@urun-sh/core");var Yn=require("react/jsx-runtime"),rs=1e3,ns=1e3;function Nr(...e){console.debug("[audio]",...e)}var Nt=(0,G.forwardRef)(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:c,onUnlockChange:u,onAudioElement:m}=t,l=Ue(),g=o??l,h=(0,G.useRef)(null),w=(0,G.useRef)(null),v=(0,G.useRef)(null),d=(0,G.useRef)(null),b=(0,G.useRef)(null),f=(0,G.useRef)(0),S=(0,G.useRef)(c);S.current=c;let T=(0,G.useRef)(u);T.current=u;let p=(0,G.useCallback)(y=>{v.current!==y&&(v.current=y,T.current?.(y))},[]),C=(0,G.useCallback)(()=>{if(typeof MediaStream>"u")return null;w.current||(w.current=new MediaStream);let y=h.current;return y&&y.srcObject!==w.current&&(y.srcObject=w.current),w.current},[]),P=(0,G.useCallback)(()=>{f.current=0,b.current!==null&&cancelAnimationFrame(b.current),b.current=null,d.current!==null&&clearTimeout(d.current),d.current=null},[]),U=(0,G.useCallback)(y=>{b.current=null,d.current=null,C(),N.current(`${y}:retry`)},[C]),A=(0,G.useCallback)(y=>{if(!h.current||b.current!==null||d.current!==null)return;let W=w.current;if(!(!!W&&W.getAudioTracks().some(L=>L.readyState==="live"))){P();return}let R=f.current;if(f.current=R+1,R===0&&typeof requestAnimationFrame=="function"){b.current=requestAnimationFrame(()=>U(y));return}d.current=setTimeout(()=>U(y),ns)},[P,U]),x=(0,G.useCallback)(y=>{let H=h.current;if(!H)return;let W=H.play();!W||typeof W.then!="function"||W.then(()=>{H.muted||p(!0),P()}).catch(ee=>{let R=ee instanceof Error?ee.name:String(ee);if(R==="AbortError"){Nr(`play() aborted (${y}); retrying on the ladder`),A(`${y}:abort`);return}if(R==="NotAllowedError"){Nr(`play() blocked pending a user gesture (${y})`),p(!1),A(`${y}:blocked`);return}Nr(`play() failed (${y})`,ee)})},[p]),N=(0,G.useRef)(()=>{});N.current=x;let E=(0,G.useCallback)(y=>{let H=C();if(H){for(let W of H.getAudioTracks())W!==y&&H.removeTrack(W);y&&!H.getAudioTracks().includes(y)&&H.addTrack(y),y&&x("track-attach"),S.current?.(y)}},[C,x]),F=(0,G.useCallback)(()=>{let y=h.current;y&&(C(),y.muted=!1,x("gesture"),Je(),p(!0))},[C,x,p]);(0,G.useImperativeHandle)(r,()=>({unlock:F,get unlocked(){return v.current===!0},get element(){return h.current}}),[F]);let Y=(0,G.useCallback)(()=>{A("pause-event")},[A]),z=(0,G.useCallback)(y=>{let H=h.current;H&&H!==y&&H.removeEventListener("pause",Y),h.current=y,y&&(y.setAttribute("playsinline",""),y.setAttribute("webkit-playsinline",""),C(),y.addEventListener("pause",Y)),m?.(y)},[C,m,Y]),Z=s!==void 0;return(0,G.useEffect)(()=>{if(Z){E(s??null);return}if(!g)return;let y=g.stream(n),H=()=>{let _=w.current;return _?_.getAudioTracks()[0]??null:null},W=_=>{if(_!==H()&&(E(_),_)){let j=()=>{H()===_&&E(null)};_.addEventListener("ended",j)}},ee=y.track;ee&&ee.readyState==="live"&&W(ee);let R=y.on("track",_=>{_&&_.readyState!=="live"||W(_)}),L=setInterval(()=>{let _=y.track;_&&_.readyState==="live"&&W(_)},rs);return()=>{R(),clearInterval(L)}},[g,n,Z,s,E]),(0,G.useEffect)(()=>(0,zn.observePageLifecycle)(()=>{Je(),v.current===!0&&x("foreground")}),[x]),(0,G.useEffect)(()=>()=>{d.current&&clearTimeout(d.current),b.current!==null&&cancelAnimationFrame(b.current),b.current=null},[]),(0,Yn.jsx)("audio",{ref:z,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),Jn=Nt;var X=require("react"),Be=require("@urun-sh/core");var Qn=require("react/jsx-runtime"),Ir={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Kt(...e){console.debug("[voice]",...e)}function os(e){return e instanceof Be.SessionFailedError&&e.kind==="create-failed"&&(e.status.error?.code==="client_release"||e.status.error?.httpStatus===410)}var It=(0,X.forwardRef)(function(t,r){let{session:o,stream:n="audio",playback:s=!0,autoStart:i=!s,constraints:a=Ir,connectTimeoutMs:c,attempts:u=3,retryDelayMs:m=1500,onActiveChange:l,onError:g,onMicStream:h,onTrack:w,onUnlockChange:v,capture:d}=t,b=Ue(),f=o??b,S=(0,X.useRef)(null),T=(0,X.useRef)(null),p=(0,X.useRef)(null),C=(0,X.useRef)([]),P=(0,X.useRef)(!1),U=(0,X.useRef)(l);U.current=l;let A=(0,X.useRef)(g);A.current=g;let x=(0,X.useRef)(h);x.current=h;let N=(0,X.useCallback)(R=>{P.current!==R&&(P.current=R,U.current?.(R))},[]),E=(0,X.useCallback)(()=>{for(let R of C.current)R();C.current=[],p.current?.release(),p.current=null,T.current&&(T.current=null,x.current?.(null))},[]),F=(0,X.useCallback)(async()=>{let R=p.current;if(R){let D=await R.update(a);return T.current=R.stream,x.current?.(R.stream),D}let _=await(d??(0,Be.sharedCaptureController)()).claim("audio",a);p.current=_,C.current=[_.onTrack((D,Q)=>{T.current=Q,x.current?.(Q),P.current&&f?.stream(n).attach(D).catch(me=>Kt("mic re-attach after one-capture re-acquire failed",me))}),_.onLost(D=>{p.current=null,C.current=[],T.current=null,x.current?.(null),N(!1),A.current?.(D)})],T.current=_.stream,x.current?.(_.stream);let j=_.track;if(!j)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return j},[d,a,f,n,N]),Y=(0,X.useCallback)(async()=>{E(),N(!1),await f?.stream(n).detach().catch(()=>{})},[f,n,E,N]),z=(0,X.useCallback)(async()=>{if(!f)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");S.current?.unlock();let R;try{R=await F()}catch(j){E();let D=(0,Be.sessionFailureFromMediaError)(j,f.status);throw A.current?.(D),D}f.connect?.();let L;for(let j=1;j<=u;j++)try{await f.whenLive(c!==void 0?{timeout:c}:void 0),await f.stream(n).attach(R),N(!0);return}catch(D){if(L=D,Kt(`start attempt ${j}/${u} failed`,D),os(D))break;j<u&&await new Promise(Q=>setTimeout(Q,m))}E(),N(!1);let _=L instanceof Error?L:new Error(String(L??"voice start failed"));throw A.current?.(_),_},[f,n,c,u,m,F,E,N]);(0,X.useImperativeHandle)(r,()=>({start:z,stop:Y,unlock:()=>S.current?.unlock(),get active(){return P.current},get micStream(){return T.current},get audio(){return S.current}}),[z,Y]);let Z=(0,X.useRef)(z);Z.current=z;let y=(0,X.useRef)(null),H=(0,X.useCallback)((R,L)=>{R.promise.then(()=>{L&&(E(),N(!1)),R.session.stream(R.streamName).detach().catch(()=>{})})},[E,N]);(0,X.useEffect)(()=>{if(!i||!f)return;let R=y.current;R&&(R.session!==f||R.streamName!==n)&&(R.disposeTimer&&clearTimeout(R.disposeTimer),H(R,!1),R=null),R?R.disposeTimer&&(clearTimeout(R.disposeTimer),R.disposeTimer=null):(R={session:f,streamName:n,promise:Z.current().catch(()=>{}),refCount:0,disposeTimer:null},y.current=R),R.refCount+=1;let L=R;return()=>{L.refCount-=1,!(L.refCount>0)&&(L.disposeTimer=setTimeout(()=>{y.current===L&&(y.current=null),H(L,!0)},0))}},[i,f,n,H]);let W=(0,X.useRef)(!1),ee=(0,X.useCallback)(async()=>{if(!f||!P.current||W.current)return;let R=T.current?.getAudioTracks()[0]??null;if(R&&R.readyState==="live"){try{await f.stream(n).attach(R)}catch(L){Kt("foreground mic re-assert failed (will retry on next pass)",L)}return}W.current=!0;try{let L=await F();await f.stream(n).attach(L)}catch(L){let _=L instanceof Error?L:new Error(String(L));Kt("foreground mic re-acquire failed",_),A.current?.(_)}finally{W.current=!1}},[f,n,F]);return(0,X.useEffect)(()=>{let R=()=>{ee()};return f&&typeof f.onRecovery=="function"?f.onRecovery(R):(0,Be.observePageLifecycle)(R)},[f,ee]),(0,X.useEffect)(()=>E,[E]),s?(0,Qn.jsx)(Nt,{ref:S,session:f,stream:n,onTrack:w,onUnlockChange:v}):null}),Zn=It;var De=require("react");var $t=require("react");var Or={level:0,speaking:!1};function Gt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=(0,$t.useState)(Or);return(0,$t.useEffect)(()=>{if(!e){i(Or);return}let a=Rt();if(!a||typeof MediaStream>"u")return;let c;e instanceof MediaStream?c=e:(c=new MediaStream,c.addTrack(e));let u,m;try{u=a.createMediaStreamSource(c),m=a.createAnalyser(),m.fftSize=r,u.connect(m)}catch{return}let l=new Uint8Array(m.fftSize),h=setInterval(()=>{m.getByteTimeDomainData(l);let w=0;for(let d=0;d<l.length;d++){let b=(l[d]-128)/128;w+=b*b}let v=Math.sqrt(w/l.length);i(d=>{let b=v>n;return Math.abs(d.level-v)<.005&&d.speaking===b?d:{level:v,speaking:b}})},o);return()=>{clearInterval(h),u.disconnect(),i(Or)}},[e,r,o,n]),s}var Le=require("react/jsx-runtime"),ss={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},is={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},eo=(0,De.forwardRef)(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:c,onActiveChange:u,onError:m,onMicStream:l,capture:g}=t,h=Ue(),w=o??h,v=(0,De.useRef)(null),[d,b]=(0,De.useState)(null),f=(0,De.useRef)(l);f.current=l;let{level:S,speaking:T}=Gt(a?d:null);return(0,De.useImperativeHandle)(r,()=>({start:()=>{let p=v.current;return p?p.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>v.current?.stop()??Promise.resolve(),get active(){return v.current?.active??!1},get micStream(){return v.current?.micStream??null}}),[]),(0,Le.jsxs)(Le.Fragment,{children:[(0,Le.jsx)(It,{ref:v,session:w,stream:n,playback:!1,autoStart:i,...s!==void 0?{constraints:s}:{},...g!==void 0?{capture:g}:{},onActiveChange:u,onError:m,onMicStream:p=>{b(p),f.current?.(p)}}),a?(0,Le.jsx)("span",{className:c,style:ss,"data-urun-mic":"","data-urun-mic-active":d?"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(S*100)/100,children:(0,Le.jsx)("span",{style:is,children:(0,Le.jsx)("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(S*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});var dt=require("@urun-sh/core"),I=require("react");var be=require("react/jsx-runtime"),Dr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Lr(...e){console.debug("[camera]",...e)}function as(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function us(){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 Vr=(0,I.forwardRef)(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:c,autoStart:u=!0,mirror:m="auto",connectTimeoutMs:l,visible:g=!1,className:h,videoClassName:w,onActiveChange:v,onError:d,onStream:b,onTrack:f,children:S,capture:T,flipControl:p="auto",flipControlClassName:C,onDevices:P}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let U=i?"user":a?"environment":c??"environment",A=Ue(),x=o??A,N=(0,I.useRef)(null),E=(0,I.useRef)(null),F=(0,I.useRef)(null),Y=(0,I.useRef)([]),z=(0,I.useRef)(null),Z=(0,I.useRef)(!1),y=(0,I.useRef)(!1),H=(0,I.useRef)(U),[W,ee]=(0,I.useState)(U),[R,L]=(0,I.useState)(!1),[_,j]=(0,I.useState)(null),[D,Q]=(0,I.useState)(!1),[me]=(0,I.useState)(as),ae=(0,I.useRef)(v);ae.current=v;let le=(0,I.useRef)(d);le.current=d;let we=(0,I.useRef)(b);we.current=b;let he=(0,I.useRef)(f);he.current=f;let qe=(0,I.useRef)(P);qe.current=P;let fe=(0,I.useCallback)(B=>{Z.current!==B&&(Z.current=B,L(B),ae.current?.(B))},[]);(0,I.useEffect)(()=>{if(!R){j(null);return}let B=!1,K=()=>{us().then(ke=>{B||(j(ke),ke&&qe.current?.(ke))})};K();let ye=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof ye?.addEventListener=="function"?(ye.addEventListener("devicechange",K),()=>{B=!0,ye.removeEventListener?.("devicechange",K)}):()=>{B=!0}},[R]);let de=(0,I.useCallback)(B=>{let K=N.current;K&&(K.muted=!0,K.defaultMuted=!0,K.setAttribute("muted",""),K.setAttribute("playsinline",""),K.setAttribute("webkit-playsinline",""),K.srcObject=B,B&&K.play()?.catch?.(ye=>Lr("preview play() failed",ye)))},[]),se=(0,I.useCallback)(()=>{y.current=!1,z.current?.(),z.current=null;for(let B of Y.current)B();Y.current=[],F.current?.release(),F.current=null,E.current&&(E.current=null,we.current?.(null),he.current?.(null)),de(null)},[de]),k=(0,I.useCallback)((B,K)=>{z.current?.(),E.current=K,de(K),we.current?.(K);let ye=()=>{E.current===K&&(Lr("camera track ended (device removed or permission revoked)"),se(),fe(!1))};B.addEventListener("ended",ye),z.current=()=>B.removeEventListener("ended",ye)},[de,se,fe]),q=(0,I.useCallback)(async B=>{let K=n!==!1;if(K&&!x)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let ye={...Dr,...s,facingMode:B},ke;try{let Re=F.current;if(Re)ke=await Re.update(ye);else{let yt=await(T??(0,dt.sharedCaptureController)()).claim("video",ye);if(F.current=yt,Y.current=[yt.onTrack((kt,wo)=>{k(kt,wo),Z.current&&(!K||!x||x.stream(n).attachVideo(kt).then(()=>he.current?.(kt)).catch(Uo=>Lr("camera re-publish after one-capture re-acquire failed",Uo)))}),yt.onLost(kt=>{F.current=null,Y.current=[],se(),fe(!1),le.current?.(kt)})],!yt.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});ke=yt.track}}catch(Re){let nt=(0,dt.sessionFailureFromMediaError)(Re,x?.status);throw le.current?.(nt),nt}H.current=B,ee(B),k(ke,F.current?.stream??new MediaStream([ke]));try{K&&x&&(x.connect?.(),await x.whenLive(l!==void 0?{timeout:l}:void 0),await x.stream(n).attachVideo(ke)),y.current=K?n:!1}catch(Re){se(),fe(!1);let nt=Re instanceof Error?Re:new Error(String(Re));throw le.current?.(nt),nt}he.current?.(ke),fe(!0)},[x,n,s,l,T,k,se,fe]),M=(0,I.useCallback)(B=>q(B?.facingMode??H.current),[q]),$=(0,I.useCallback)(async B=>{let K=y.current===n;Z.current&&H.current===B&&K||await q(B)},[q,n]),te=(0,I.useCallback)(()=>q(H.current==="environment"?"user":"environment"),[q]),ve=(0,I.useCallback)(async()=>{se(),fe(!1),n!==!1&&await x?.stream(n).detachVideo().catch(()=>{})},[x,n,se,fe]),O=(0,I.useCallback)(async B=>{let K=N.current;if(!K)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await(0,dt.captureStillFromVideo)(K,B)},[]);(0,I.useImperativeHandle)(r,()=>({start:M,stop:ve,flip:te,setFacingMode:$,capturePhoto:O,get active(){return Z.current},get facingMode(){return H.current},get stream(){return E.current},get element(){return N.current}}),[M,ve,te,$,O]);let Ae=(0,I.useRef)($);if(Ae.current=$,(0,I.useEffect)(()=>{u&&(n!==!1&&!x||Ae.current(U).catch(()=>{}))},[u,x,U,n]),(0,I.useEffect)(()=>se,[se]),!g)return null;let rt=m==="auto"?W==="user":m,Me=R&&(p===!0||p==="auto"&&me&&(_?.length??0)>1),_e=()=>{D||(Q(!0),te().catch(()=>{}).finally(()=>Q(!1)))};return(0,be.jsxs)("div",{className:h,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":W,children:[(0,be.jsx)("video",{ref:N,className:w,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...rt?{transform:"scaleX(-1)"}:{}}}),Me?(0,be.jsx)("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:_e,disabled:D,className:C,style:C?{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:(0,be.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,be.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,be.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,be.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,be.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,be.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,S]})}),to=(0,I.forwardRef)(function({preview:t=!0,...r},o){return(0,be.jsx)(Vr,{ref:o,...r,visible:t,autoStart:!1})});var pt=require("@urun-sh/core"),oe=require("react");function ro(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=(0,oe.useState)(null),[a,c]=(0,oe.useState)(null),[u,m]=(0,oe.useState)(!1),[l,g]=(0,oe.useState)(null),[h]=(0,oe.useState)(pt.cameraCaptureAvailable),w=(0,oe.useRef)(n);w.current=n;let v=(0,oe.useRef)(null),d=(0,oe.useRef)(0),b=(0,oe.useCallback)(C=>{v.current&&URL.revokeObjectURL(v.current),v.current=C?URL.createObjectURL(new Blob([C.bytes],{type:C.type})):null,c(v.current),i(C),w.current?.(C)},[]);(0,oe.useEffect)(()=>()=>{d.current++,v.current&&URL.revokeObjectURL(v.current),v.current=null},[]);let f=(0,oe.useCallback)(async C=>{let P=++d.current;m(!0),g(null);try{let U=await C();if(d.current!==P)return;b(U)}catch(U){if(d.current!==P)return;g((0,pt.referenceImageErrorMessage)(U))}finally{d.current===P&&m(!1)}},[b]),S=(0,oe.useCallback)(C=>f(()=>(0,pt.normalizeReferenceImage)(C,{maxSize:t,type:r,quality:o,source:"file"})),[f,t,r,o]),T=(0,oe.useCallback)(C=>f(()=>C.capturePhoto({maxSize:t,type:r,quality:o})),[f,t,r,o]),p=(0,oe.useCallback)(()=>{d.current++,g(null),m(!1),b(null)},[b]);return{reference:s,previewUrl:a,pick:S,capture:T,clear:p,busy:u,error:l,cameraAvailable:h}}var Xt=require("react");function no(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 io=require("react");var Jt=require("react");var oo=require("zustand/vanilla"),so=require("zustand"),cs=()=>{};function zt(e,t={}){let r=u=>{e?.set(u)},o=()=>e?e.get()??{}:{},n=(0,oo.createStore)(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let u of s)u();s=null}},a=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",u=>n.setState({doc:u})),e.onSynced(()=>n.setState({synced:!0}))]),i):cs,c=(u=>(0,so.useStore)(n,u));return Object.assign(c,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),c}function mt(e,t){let r=(0,Jt.useMemo)(()=>zt(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return(0,Jt.useEffect)(()=>r.bind(),[r]),r}function ao(e,t,r){let n=mt(e,t)(r??(a=>a)),s=(0,io.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 Yt=require("react");function uo(e){let[t,r]=(0,Yt.useState)(null);return(0,Yt.useEffect)(()=>{if(r(null),!!e)return e.on("generationTick",r)},[e]),t}var Qt=require("react");var je=200;function Ve(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function ft(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Zt(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 er(e,t,r={}){let o=r.cap??200,[n,s]=(0,Qt.useState)([]);return(0,Qt.useEffect)(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let c=await a.next();if(!i||c.done)break;s(u=>Ve(u,{at:Date.now(),payload:c.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}var xe=require("react/jsx-runtime");function co({session:e,name:t,cap:r,className:o}){let n=er(e,t,{cap:r});return(0,xe.jsxs)("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[(0,xe.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,xe.jsx)("code",{children:t}),(0,xe.jsxs)("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),(0,xe.jsx)("div",{className:"urun-stream-tail-log",children:n.length===0?(0,xe.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,xe.jsx)("code",{children:t})," messages\u2026"]}):n.map((s,i)=>(0,xe.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,xe.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",ft(s.payload)]},`${s.at}-${i}`))})]})}var Ot=require("react");var Se=require("react/jsx-runtime");function Lt({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=(0,Ot.useState)(""),[i,a]=(0,Ot.useState)(null),c=(0,Ot.useCallback)(()=>{let u=Zt(n);if(!u.ok){a(u.error);return}a(null),o(u.value,n.trim()),s("")},[n,o]);return(0,Se.jsxs)("div",{className:"urun-doc-patch",children:[(0,Se.jsx)("textarea",{className:"urun-doc-patch-input",value:n,onChange:u=>s(u.target.value),placeholder:e,rows:3}),(0,Se.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,Se.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:c,children:t}),i?(0,Se.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function lo({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=mt(e,t),i=s(u=>u.doc),a=s(u=>u.synced),c=s(u=>u.set);return(0,Se.jsxs)("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[(0,Se.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,Se.jsx)("code",{children:t}),(0,Se.jsx)("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),(0,Se.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?(0,Se.jsx)(Lt,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:u=>c(u)}):null]})}var tr=require("react");var Fe=require("react/jsx-runtime");function po(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function mo({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=(0,tr.useState)([]);return(0,tr.useEffect)(()=>(s([]),e?e.doc(t).on("change",a=>{s(c=>Ve(c,{at:Date.now(),direction:"in",text:po(ft(a))},r))}):void 0),[e,t,r]),(0,Fe.jsxs)("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[(0,Fe.jsx)(Lt,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(c=>Ve(c,{at:Date.now(),direction:"out",text:po(a)},r))}}),(0,Fe.jsx)("div",{className:"urun-control-sender-log",children:n.length===0?(0,Fe.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>(0,Fe.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,Fe.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,Fe.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}var rr=require("react");var et=require("react/jsx-runtime");function fo({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=(0,rr.useState)([]),a=t.join(","),c=r.join(",");return(0,rr.useEffect)(()=>{if(i([]),!e)return;let u=(l,g)=>i(h=>Ve(h,{at:Date.now(),kind:l,text:g},o)),m=[];m.push(e.onPhase(l=>u("phase",`phase \u2192 ${l.name}`)));for(let l of t){let g=e.stream(l);m.push(g.on("track",h=>u("track",`${l}: ${h?"track arrived":"track ended"}`)))}for(let l of r){let g=e.doc(l);m.push(g.on("change",()=>u("doc",`${l} changed`)))}return()=>m.forEach(l=>l())},[e,a,c,o]),(0,et.jsx)("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?(0,et.jsx)("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((u,m)=>(0,et.jsxs)("div",{className:"urun-event-spine-line","data-kind":u.kind,children:[(0,et.jsx)("span",{className:"urun-event-spine-kind",children:u.kind})," ",(0,et.jsx)("span",{className:"urun-event-spine-time",children:new Date(u.at).toLocaleTimeString()})," ",u.text]},`${u.at}-${m}`))})}var cr=require("@urun-sh/core");var nr=require("react");function Te(e){let[t,r]=(0,nr.useState)(e?.phase??null);return(0,nr.useEffect)(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}var So=require("@urun-sh/core");var gt=require("react"),go=require("@urun-sh/core");function or(e){let t=Te(e),r=(0,go.isWakingPhase)(t?.name),o=(0,gt.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,gt.useState)(s);return(0,gt.useEffect)(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let c=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(c)},[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 Ke=require("react/jsx-runtime");function sr({session:e,render:t,className:r}){let o=or(e);return!o.waking||!o.phase?null:(0,Ke.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,Ke.jsxs)(Ke.Fragment,{children:[(0,Ke.jsx)("span",{className:"urun-session-waking-label",children:(0,So.describeSessionPhase)(o.phase)})," ",(0,Ke.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}var ar=require("react");var $e=require("react"),ls={event:null,elapsedMs:0};function ir(e,t){let[r,o]=(0,$e.useState)(null),n=(0,$e.useRef)(0);(0,$e.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,$e.useState)(0);return(0,$e.useEffect)(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,c=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(c());let u=setInterval(()=>i(c()),1e3);return()=>clearInterval(u)},[r]),r?{event:r,elapsedMs:s}:ls}var St=require("react/jsx-runtime"),ds={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 ps(e){let[t,r]=(0,ar.useState)(!1);return(0,ar.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 ur({session:e,stream:t,videoElement:r,render:o,className:n}){let s=ir(e,t),i=ps(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let c=a.state;return(0,St.jsx)("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":c,role:"status","aria-live":"polite",children:o?o(s):(0,St.jsxs)("div",{className:"urun-activation-overlay-card",children:[(0,St.jsx)("span",{className:"urun-activation-overlay-copy",children:a.hint??ds[c]})," ",(0,St.jsxs)("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}var Ce=require("react/jsx-runtime"),ms={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",waiting_for_capacity:"waiting for GPU capacity",connecting:"connecting",live:"live",paused:"paused",error:"error",unknown:"unrecognized state"};function ho({session:e,className:t}){let r=Te(e),o=r?.name??"idle",n=(r?.name==="queued"||r?.name==="waiting_for_capacity")&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:r?.name==="error"&&r.error?r.error.reason:r?.reason?r.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return(0,Ce.jsxs)("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[(0,Ce.jsx)("span",{className:"urun-session-status-dot","data-phase":o}),(0,Ce.jsx)("span",{className:"urun-session-status-label",children:ms[o]}),n?(0,Ce.jsx)("span",{className:"urun-session-status-detail",children:n}):null]})}function vo({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=Te(e);if(s?.name==="live")return(0,Ce.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,(0,Ce.jsx)(ur,{session:e})]});let i=r?r(s):(0,Ce.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s&&(0,cr.isWakingPhase)(s.name)?(0,Ce.jsx)(sr,{session:e}):s&&s.name!=="idle"?(0,cr.describeSessionPhase)(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="paused");return(0,Ce.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?(0,Ce.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}var lr=require("react");var ko=require("react/jsx-runtime");function Fr(e){return Te(e)?.endsAt??null}function fs(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 yo({session:e,urgentMs:t=6e4,className:r}){let n=Fr(e)?.getTime()??null,[s,i]=(0,lr.useState)(()=>n===null?null:Math.max(0,n-Date.now()));if((0,lr.useEffect)(()=>{if(n===null){i(null);return}let c=()=>i(Math.max(0,n-Date.now()));c();let u=setInterval(c,1e3);return()=>clearInterval(u)},[n]),s===null)return null;let a=fs(s);return(0,ko.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 bo=require("@urun-sh/core");var ht=require("react/jsx-runtime"),gs=new Set(["paused","error"]);function qr({session:e,onResume:t,onNewSession:r,children:o,className:n}){let s=Te(e);if(!s||!gs.has(s.name))return null;let i=o?o(s):(0,ht.jsx)("span",{className:"urun-session-paused-copy",children:(0,bo.describeSessionPhase)(s)});return(0,ht.jsxs)("div",{className:["urun-session-paused",n].filter(Boolean).join(" "),"data-phase":s.name,children:[i,t?(0,ht.jsx)("button",{type:"button",className:"urun-session-paused-resume",onClick:t,children:"Resume"}):null,r?(0,ht.jsx)("button",{type:"button",className:"urun-session-paused-new",onClick:r,children:"New session"}):null]})}var To=qr;var Ge=require("react"),tt=require("react/jsx-runtime");function Hr(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 Wr(e){let t=(0,Ge.useMemo)(()=>e?e.doc("control"):null,[e]),[r,o]=(0,Ge.useState)(()=>t?Hr(t.get("idle")):null);return(0,Ge.useEffect)(()=>{if(!t){o(null);return}return o(Hr(t.get("idle"))),t.on("change",()=>o(Hr(t.get("idle"))))},[t]),r}function Ss(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function Co({session:e,onStillHere:t,className:r}){let o=Wr(e),n=o?.deadlineEpochS??null,[s,i]=(0,Ge.useState)(null);if((0,Ge.useEffect)(()=>{if(n===null){i(null);return}let c=()=>i(Math.max(0,n-Date.now()/1e3));c();let u=setInterval(c,1e3);return()=>clearInterval(u)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return(0,tt.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,tt.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,tt.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,tt.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${Ss(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,tt.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}var Ee=require("react");function hs(e){return e?e.activated&&!e.exempt&&e.available_credits<=0:!1}function dr(e,t={}){let{refreshIntervalMs:r}=t,[o,n]=(0,Ee.useState)(null),[s,i]=(0,Ee.useState)(e!==null),[a,c]=(0,Ee.useState)(null),u=(0,Ee.useRef)(e),m=(0,Ee.useCallback)(async g=>{i(!0);try{let h=await g.getBalance();if(u.current!==g)return;n(h),c(null)}catch(h){if(u.current!==g)return;c(h instanceof Error?h:new Error(String(h)))}finally{u.current===g&&i(!1)}},[]);(0,Ee.useEffect)(()=>{if(u.current=e,n(null),c(null),!e){i(!1);return}if(m(e),r!==void 0&&r>0){let g=setInterval(()=>{m(e)},r);return()=>{clearInterval(g),u.current===e&&(u.current=null)}}return()=>{u.current===e&&(u.current=null)}},[e,r,m]);let l=(0,Ee.useCallback)(async()=>{let g=u.current;g&&await m(g)},[m]);return{balance:o,isExhausted:hs(o),loading:s,error:a,refresh:l}}var pr=require("react/jsx-runtime");function Ro({client:e,children:t,fallback:r,className:o}){let{balance:n,isExhausted:s}=dr(e),i=["urun-credits-gate",o].filter(Boolean).join(" ");if(!s)return(0,pr.jsx)("div",{className:i,children:t});let a=r?r(n):(0,pr.jsx)("span",{className:"urun-credits-gate-fallback",children:"Out of credits \u2014 add credits to keep running sessions."});return(0,pr.jsx)("div",{className:i,children:a})}var Xe=require("@urun-sh/core");var vt=require("react"),Po=require("@urun-sh/core");function xo(e){let t=(0,vt.useContext)(He),[r,o]=(0,vt.useState)(null),n=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,c=t?.orgId,u=t?.jwt,m=t?.getAccessToken,l=t?.authProvider;return(0,vt.useEffect)(()=>{if(!a||!c||!n||!s)return;let g=!1,h=()=>{(0,Po.prewake)({baseUrl:a,app:n,functionName:s,orgId:c,jwt:u,getAccessToken:m,authProvider:l}).then(v=>{g||o(v)}).catch(()=>{})};h();let w=setInterval(h,Math.max(1,i)*1e3);return()=>{g=!0,clearInterval(w)}},[n,s,i,a,c,u,m,l]),r}var mr=require("react");function Eo(e){let[t,r]=(0,mr.useState)(null);return(0,mr.useEffect)(()=>{if(r(null),!!e?.onStats)return e.onStats(r)},[e]),t}var fr=require("@urun-sh/core");0&&(module.exports={Audio,Camera,ComponentRenderer,CreditsClient,CreditsError,CreditsUnauthorizedError,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_SMOOTH_CHARS_PER_FRAME,DEFAULT_SMOOTH_THRESHOLD,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,Image,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,Mic,OPERATOR_CHORD_LABEL,OPERATOR_TOKEN_STORAGE_KEY,ProgressCard,ProgressCardSchema,ReprojectedVideo,Session,StatusBadge,StatusBadgeSchema,Text,TextStream,TextStreamError,TextStreamSchema,UrunActivationOverlay,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunCreditsGate,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunIdleWarning,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionPaused,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,Video,Voice,authMode,createCreditsClient,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,readOperatorToken,registerComponent,resumeUrunAudioContext,textDelta,urunPublicEnv,useActivation,useApp,useChat,useCompletion,useConfirmOnLeave,useCredits,useDocStore,useGenerationTick,useImageFrame,useInputPresence,useMetricsPanel,useOperatorOverride,useProgressCard,useReferenceImage,useRequest,useSession,useSessionDirectory,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionStats,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useText,useTextMeter,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
2
+ "use strict";var gr=Object.defineProperty;var No=Object.getOwnPropertyDescriptor;var Io=Object.getOwnPropertyNames;var Oo=Object.prototype.hasOwnProperty;var Lo=(e,t)=>{for(var r in t)gr(e,r,{get:t[r],enumerable:!0})},Do=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Io(t))!Oo.call(e,n)&&n!==r&&gr(e,n,{get:()=>t[n],enumerable:!(o=No(t,n))||o.enumerable});return e};var Vo=e=>Do(gr({},"__esModule",{value:!0}),e);var Ts={};Lo(Ts,{Audio:()=>Nt,Camera:()=>Vr,ComponentRenderer:()=>Nn,CreditsClient:()=>Xe.CreditsClient,CreditsError:()=>Xe.CreditsError,CreditsUnauthorizedError:()=>Xe.CreditsUnauthorizedError,DEFAULT_CAMERA_CONSTRAINTS:()=>Dr,DEFAULT_LOG_CAP:()=>je,DEFAULT_SMOOTH_CHARS_PER_FRAME:()=>Ar,DEFAULT_SMOOTH_THRESHOLD:()=>Mr,DEFAULT_VOICE_CONSTRAINTS:()=>Ir,DocPatchForm:()=>Lt,Image:()=>Jn,ImageFrame:()=>Hn,ImageFrameSchema:()=>qn,MetricsPanel:()=>Bn,MetricsPanelSchema:()=>Wn,Mic:()=>no,OPERATOR_CHORD_LABEL:()=>Zr,OPERATOR_TOKEN_STORAGE_KEY:()=>Jr,ProgressCard:()=>On,ProgressCardSchema:()=>In,ReprojectedVideo:()=>Un,Session:()=>kn,StatusBadge:()=>Dn,StatusBadgeSchema:()=>Ln,Text:()=>Gn,TextStream:()=>Fn,TextStreamError:()=>lt,TextStreamSchema:()=>Vn,UrunActivationOverlay:()=>ur,UrunAudio:()=>Qn,UrunAuthProvider:()=>Ct,UrunCamera:()=>oo,UrunControlSender:()=>So,UrunCreditsGate:()=>Eo,UrunDocPanel:()=>fo,UrunErrorBoundary:()=>ot,UrunEventSpine:()=>ho,UrunIdleWarning:()=>xo,UrunJwtProvider:()=>Gr,UrunProvider:()=>an,UrunSessionClock:()=>To,UrunSessionEnded:()=>Po,UrunSessionGate:()=>bo,UrunSessionPaused:()=>qr,UrunSessionStatus:()=>ko,UrunSessionWaking:()=>sr,UrunStreamTail:()=>mo,UrunVoice:()=>to,Video:()=>Ye,Voice:()=>It,authMode:()=>Tt,createCreditsClient:()=>Xe.createCreditsClient,createDocStore:()=>zt,describeSessionPhase:()=>fr.describeSessionPhase,formatPayload:()=>ft,getUrunAudioContext:()=>Rt,isWakingPhase:()=>fr.isWakingPhase,parseJsonObject:()=>Zt,pushCapped:()=>Ve,readOperatorToken:()=>Sr,registerComponent:()=>Mn,resumeUrunAudioContext:()=>Je,textDelta:()=>Ur,urunPublicEnv:()=>Pe,useActivation:()=>ir,useApp:()=>ln,useChat:()=>vn,useCompletion:()=>gn,useConfirmOnLeave:()=>qt,useCredits:()=>dr,useDocStore:()=>mt,useGenerationTick:()=>po,useImageFrame:()=>Er,useInputPresence:()=>yn,useMetricsPanel:()=>wr,useOperatorOverride:()=>Ft,useProgressCard:()=>Rr,useReferenceImage:()=>so,useRequest:()=>mn,useSession:()=>bn,useSessionDirectory:()=>pn,useSessionDoc:()=>lo,useSessionEndsAt:()=>Fr,useSessionIdle:()=>Wr,useSessionPhase:()=>Te,useSessionStats:()=>Ao,useSessionTrack:()=>io,useSessionWake:()=>or,useStatusBadge:()=>Pr,useStreamMessages:()=>er,useText:()=>_r,useTextMeter:()=>$n,useTextStream:()=>xr,useUrunAudioLevel:()=>Gt,useUrunAuth:()=>Dt,useUrunPrewake:()=>Uo,usesWorkOSAuth:()=>Kr});module.exports=Vo(Ts);var ce=require("react"),sn=require("@urun-sh/core/internal");var Br=require("react"),bt=require("react/jsx-runtime"),ot=class extends Br.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,bt.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,bt.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,bt.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var jr=require("react"),He=(0,jr.createContext)(null);function Ne(e){return e&&e.trim()?e.trim():void 0}function Pe(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"NEXT_PUBLIC_URUN_TOKEN_URL":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_TOKEN_URL:void 0);case"NEXT_PUBLIC_URUN_EVENTS_URL":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_EVENTS_URL:void 0);case"VERCEL_ENV":return Ne(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return Ne(typeof process<"u"?process.env?.[e]:void 0)}}function Tt(){let e=Pe("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||Pe("VERCEL_ENV")==="production"?"workos":Pe("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Kr(){return Tt()==="workos"}var st=require("react"),Xr=require("react/jsx-runtime"),$r=(0,st.createContext)(null);function Ct({getAccessToken:e,children:t}){let r=(0,st.useMemo)(()=>({getAccessToken:e}),[e]);return(0,Xr.jsx)($r.Provider,{value:r,children:t})}var Gr=Ct;function Dt(){return(0,st.useContext)($r)}var Vt=require("react"),Jr="urun.operator_token",Yr=null,zr="op",Zr="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function Qr(){return typeof window<"u"}function Sr(){return Yr}function Fo(){if(!Qr())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(zr);if(!r)return null;Yr=r,t.delete(zr);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function qo(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function Ft(e){let t=(0,Vt.useRef)(e);t.current=e,(0,Vt.useEffect)(()=>{if(!Qr())return;Fo();let r=o=>{if(!qo(o))return;let n=Sr();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}var en=require("react");function qt(e=!0){(0,en.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 Ie=require("react/jsx-runtime"),Ho="/api/urun-token",Wo=1e4;function Bo(e){let t=e.split(".")[1];if(!t)return null;try{let r=t.replace(/-/g,"+").replace(/_/g,"/"),o=r.padEnd(r.length+(4-r.length%4)%4,"="),s=JSON.parse(atob(o)).exp;return typeof s=="number"&&Number.isFinite(s)?s*1e3:null}catch{return null}}var tn=3,jo=new Set([502,503,504]);function rn(e){return new Promise(t=>setTimeout(t,(0,sn.computeBackoffDelay)(e)))}async function nn(e,t){for(let r=0;;r++){let o;try{o=await fetch(e,{method:"POST",signal:t})}catch(a){if(t?.aborted||r>=tn-1)throw a;await rn(r);continue}if(!o.ok){let a=new Error(`[urun] token endpoint ${e} answered ${o.status}`);if(!jo.has(o.status)||r>=tn-1)throw a;await rn(r);continue}let n=await o.json(),s=typeof n.token=="string"?n.token:"",i=typeof n.orgId=="string"?n.orgId:"";if(!s||!i)throw new Error(`[urun] token endpoint ${e} returned no { token, orgId } \u2014 is it createTokenRoute() from @urun-sh/next?`);return{token:s,orgId:i,gatewayUrl:typeof n.gatewayUrl=="string"?n.gatewayUrl:void 0}}}function on(e,t){if(t===void 0)return;let r;try{r=new URL(t).hostname}catch{throw new Error(`[urun] ${e} is not a valid URL: ${t}`)}if(!(r==="127.0.0.1"||r==="localhost"||r==="::1"||r==="[::1]"))throw new Error(`[urun] ${e} must point at a loopback endpoint \u2014 the CLI launcher (urun dev/demo) is this variable's only legitimate producer and it must never be set on a deployed site. Refusing ${t}.`);return t}function hr(e){let t=e===void 0?void 0:JSON.stringify(e);return(0,ce.useMemo)(()=>e,[t])}function Ko(e,t){return typeof e=="function"?e(t):e!==void 0?e:(0,Ie.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,Ie.jsx)("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),(0,Ie.jsx)("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:c,releaseOnLeave:u,allowWebTransport:m,allowWebRtcFallback:l,audioPlayout:g,videoPlayout:h,sessionStats:w,confirmOnLeave:v=!1,fallback:d,errorFallback:b,children:f}){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 T=r??o;if(S&&(typeof T!="string"||T.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);qt(v);let[p,C]=(0,ce.useState)(),[P,U]=(0,ce.useState)(null),A=(0,ce.useRef)(void 0),x=(0,ce.useRef)(null),[N,E]=(0,ce.useState)(null);Ft(M=>E({jwt:M}));let F=Dt(),Y=Pe("NEXT_PUBLIC_SESSION_TOKEN")??Pe("NEXT_PUBLIC_URUN_JWT"),z=Tt(),Z=N!==null,y=z==="workos"&&!n&&!Z&&!S,H=n??(z==="jwt"?Y:void 0)??p?.token,W=Z?N.jwt:H,ee=s??Pe("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),R=y&&!W&&!F?.getAccessToken,L=t??p?.orgId,_=e??p?.gatewayUrl,j=S&&p===void 0,D=S&&p!==void 0&&!_?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=R?new Error('[urun] <UrunProvider> resolved authMode()="workos" but no auth context is mounted: there is no <UrunWorkOSProvider> (or <UrunAuthProvider>) ancestor supplying getAccessToken, and no jwt prop was passed, so no session token can be obtained. Note NEXT_PUBLIC_SESSION_TOKEN and NEXT_PUBLIC_URUN_JWT are IGNORED in workos mode, so setting them will not help. Either mount UrunWorkOSProvider from @urun-sh/react/next-workos, or select jwt mode with NEXT_PUBLIC_AUTH_MODE=jwt (or NEXT_PUBLIC_AUTH_ENABLED=false) and supply a token.'):null,me=P??D??Q,ae=on("NEXT_PUBLIC_URUN_TOKEN_URL",Pe("NEXT_PUBLIC_URUN_TOKEN_URL"))??c??Ho,le=on("NEXT_PUBLIC_URUN_EVENTS_URL",Pe("NEXT_PUBLIC_URUN_EVENTS_URL"))??i,we=(0,ce.useCallback)(async M=>{if(!M?.forceRefresh){let te=A.current;if(!te)return te;let ve=Bo(te);if(ve===null||ve-Date.now()>Wo)return te}return(await(x.current??(x.current=(async()=>{try{let te=await nn(ae);return A.current=te.token,C(te),te}finally{x.current=null}})()))).token},[ae]),he=(0,ce.useCallback)(async()=>W,[W]),qe=typeof W=="string"&&W.trim().length>0,fe=y?F?.getAccessToken:S&&!Z?we:qe?he:void 0,de=hr(g),se=hr(h),k=hr(w),q=(0,ce.useMemo)(()=>({appId:T,baseUrl:_??"",orgId:L??"",jwt:W,getAccessToken:y?F?.getAccessToken:S&&!Z?we:void 0,authProvider:ee,eventsUrl:le,sessionKey:a,releaseOnLeave:u,allowWebTransport:m,allowWebRtcFallback:l,audioPlayout:de,videoPlayout:se,sessionStats:k,priority:Z?"preempt":void 0}),[T,F,_,ee,W,le,L,a,u,m,l,de,se,k,y,Z,S,we]);return(0,ce.useEffect)(()=>{if(!S)return;let M=new AbortController;return U(null),(async()=>{try{let $=await nn(ae,M.signal);A.current=$.token,C($)}catch($){if(M.signal.aborted)return;U($ instanceof Error?$:new Error(String($)))}})(),()=>M.abort()},[S,ae]),(0,Ie.jsx)(ot,{fallback:d,children:me?Ko(b,me):j?(0,Ie.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,Ie.jsx)(He.Provider,{value:q,children:fe?(0,Ie.jsx)(Ct,{getAccessToken:fe,children:f}):f})})}var ge=require("react"),un=require("@urun-sh/core");function cn(e){return e?.sessionId?{sessionId:e.sessionId}:e?.label?{label:e.label}:{}}function $o(e,t,r){let o=cn(r),n=r?.activity??"auto";return`${e}:${JSON.stringify(t??{})}:${o.sessionId??""}:${o.label??""}:${n}`}function Go(e,t,r,o){let n=cn(o);return JSON.stringify({sessionId:n.sessionId,label:n.label,appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,activity:o?.activity??"auto",fnName:t,args:r??{}})}var ze=new Map;var vr=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()})}onConnectionState(t){return this._doc.onConnectionState?this._doc.onConnectionState(r=>{t(r),this._notify()}):(t({connected:!0,consecutiveFailures:0,lastCloseCode:null,lastCloseReason:null}),()=>{})}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()}},yr=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()}},kr=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"){let c=a.error,u=c?.reason??`session ${this._session.id} entered the error phase`;n({level:"error",kind:"phase-error",message:u,detail:{sessionId:this._session.id,code:c?.code,kind:c?.kind,httpStatus:c?.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 region(){return this._session.region}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}onStats(t){return this._session.onStats?this._session.onStats(t):()=>{}}watchDownlinkStall(t={}){return this._session.watchDownlinkStall?this._session.watchDownlinkStall(t):()=>{}}on(t,r){return this._session.on(t,r)}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()}activity(){this._session.activity?this._session.activity():this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new vr(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new yr(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}async cancel(){let t=await this._session.cancel();return this._disposeHandle(),t}detach(){this._disposeHandle(),this._session.detach()}disconnect(){this.detach()}_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 ln(){let e=(0,ge.useContext)(He);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=(0,ge.useReducer)(i=>i+1,0),r=(0,ge.useRef)(new Map),o=(0,ge.useRef)(new Map),n=(0,ge.useRef)(null),s=(0,ge.useMemo)(()=>(0,un.App)(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,allowWebTransport:e.allowWebTransport,allowWebRtcFallback:e.allowWebRtcFallback,priority:e.priority,audioPlayout:e.audioPlayout,videoPlayout:e.videoPlayout,sessionStats:e.sessionStats}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.allowWebTransport,e.allowWebRtcFallback,e.priority,e.audioPlayout,e.videoPlayout,e.sessionStats]);return(0,ge.useEffect)(()=>{let i=n.current;if(i){n.current=null;for(let[a,c]of i){let u=ze.get(a);u===c&&o.current.get(a)===c&&(u.disposeTimer&&(clearTimeout(u.disposeTimer),u.disposeTimer=null),u.handle.addNotifier(t),u.refCount+=1)}}return()=>{let a=new Map;for(let[c,u]of o.current){let m=ze.get(c);m===u&&(m.handle.removeNotifier(t),m.refCount=Math.max(0,m.refCount-1),a.set(c,m),m.refCount===0&&(m.disposeTimer=setTimeout(()=>{let l=ze.get(c);!l||l.refCount!==0||(ze.delete(c),l.handle.disconnect())},0)))}n.current=a}},[]),(0,ge.useMemo)(()=>{let i=new Map;return new Proxy({},{get(a,c){if(typeof c!="string")return;let u=i.get(c);if(u)return u;let m=(l,g)=>{let h=$o(c,l,g),w=r.current.get(h);if(w&&!w.disposed)return w;let v=Go(e,c,l,g),d=ze.get(v);return d?.handle.disposed&&(d.disposeTimer&&clearTimeout(d.disposeTimer),ze.delete(v),o.current.get(v)===d&&o.current.delete(v),d=void 0),d?d.disposeTimer&&(clearTimeout(d.disposeTimer),d.disposeTimer=null):(d={handle:new kr(s[c](l,g),t,e.eventsUrl),refCount:0,disposeTimer:null},ze.set(v,d)),o.current.get(v)!==d&&(o.current.set(v,d),d.handle.addNotifier(t),d.refCount+=1),r.current.set(h,d.handle),d.handle};return i.set(c,m),m}})},[e,s])}var Ht=require("react"),dn=require("@urun-sh/core");function pn(){let e=(0,Ht.useContext)(He);if(!e)throw new Error("useSessionDirectory must be used within <UrunProvider>");if(!e.appId)throw new Error('useSessionDirectory requires <UrunProvider appId="...">');let{appId:t,baseUrl:r,orgId:o,jwt:n,getAccessToken:s,authProvider:i}=e;return(0,Ht.useMemo)(()=>(0,dn.sessionDirectory)(t,{baseUrl:r,orgId:o,jwt:n,getAccessToken:s,authProvider:i}),[t,r,o,n,s,i])}var ie=require("react");function it(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 Xo(e){return e instanceof Error?e:new Error(String(e))}function mn(e,t){let r=(0,ie.useMemo)(()=>it(e),[e]),[o,n]=(0,ie.useState)(void 0),[s,i]=(0,ie.useState)(null),[a,c]=(0,ie.useState)(!1),u=(0,ie.useRef)(t);u.current=t;let m=(0,ie.useRef)(0),l=(0,ie.useRef)(null),g=(0,ie.useRef)(!0);(0,ie.useEffect)(()=>(g.current=!0,()=>{g.current=!1,l.current?.abort()}),[]);let h=(0,ie.useCallback)(async d=>{l.current?.abort();let b=new AbortController;l.current=b;let f=++m.current,S=()=>g.current&&m.current===f;S()&&(c(!0),i(null));try{let T=await r.request(d,{...u.current,signal:b.signal});return S()&&(n(T),c(!1),u.current?.onSuccess?.(T)),T}catch(T){let p=Xo(T);throw S()&&(i(p),c(!1),u.current?.onError?.(p)),p}},[r]),w=(0,ie.useCallback)(d=>{h(d).catch(()=>{})},[h]),v=(0,ie.useCallback)(()=>{m.current++,l.current?.abort(),l.current=null,n(void 0),i(null),c(!1)},[]);return{mutate:w,mutateAsync:h,data:o,error:s,isPending:a,reset:v}}var ue=require("react");function fn(e){return e instanceof Error?e:new Error(String(e))}var zo=e=>typeof e=="string"?e:String(e);function gn(e,t){let r=(0,ue.useMemo)(()=>it(e),[e]),[o,n]=(0,ue.useState)(""),[s,i]=(0,ue.useState)(!1),[a,c]=(0,ue.useState)(null),u=(0,ue.useRef)(t);u.current=t;let m=(0,ue.useRef)(0),l=(0,ue.useRef)(null),g=(0,ue.useRef)(!0);(0,ue.useEffect)(()=>(g.current=!0,()=>{g.current=!1,l.current?.cancel(),l.current=null}),[]);let h=(0,ue.useCallback)(()=>{m.current++,l.current?.cancel(),l.current=null,g.current&&i(!1)},[]),w=(0,ue.useCallback)(async v=>{l.current?.cancel();let d=++m.current,b=()=>g.current&&m.current===d,f=u.current,S=f?.parseChunk??zo,T=f?.buildPayload??(E=>({prompt:E}));b()&&(n(""),c(null),i(!0));let{parseChunk:p,buildPayload:C,onFinish:P,onError:U,...A}=f??{},x="",N;try{N=r.requestStream(T(v),A),l.current=N}catch(E){let F=fn(E);b()&&(c(F),i(!1),f?.onError?.(F));return}try{for await(let E of N){if(m.current!==d)break;x+=S(E),b()&&n(x)}b()&&(i(!1),f?.onFinish?.(x))}catch(E){let F=fn(E);b()&&(c(F),i(!1),f?.onError?.(F))}finally{l.current===N&&(l.current=null)}},[r]);return{completion:o,complete:w,stop:h,isStreaming:s,error:a}}var ne=require("react");function Sn(e){return e instanceof Error?e:new Error(String(e))}var Jo=e=>typeof e=="string"?e:String(e),hn=0;function br(e){return hn+=1,`${e}-${hn}`}function vn(e,t){let r=(0,ne.useMemo)(()=>it(e),[e]),[o,n]=(0,ne.useState)(()=>(t?.initialMessages??[]).map(S=>({id:S.id??br("msg"),role:S.role,content:S.content}))),[s,i]=(0,ne.useState)(""),[a,c]=(0,ne.useState)(!1),[u,m]=(0,ne.useState)(null),l=(0,ne.useRef)(t);l.current=t;let g=(0,ne.useRef)(o);g.current=o;let h=(0,ne.useRef)(s);h.current=s;let w=(0,ne.useRef)(0),v=(0,ne.useRef)(null),d=(0,ne.useRef)(!0);(0,ne.useEffect)(()=>(d.current=!0,()=>{d.current=!1,v.current?.cancel(),v.current=null}),[]);let b=(0,ne.useCallback)(()=>{w.current++,v.current?.cancel(),v.current=null,d.current&&c(!1)},[]),f=(0,ne.useCallback)(async S=>{let T=S===void 0,p=(T?h.current:S)??"";if(!p.trim())return;v.current?.cancel();let P=++w.current,U=()=>d.current&&w.current===P,A=l.current,x=A?.parseChunk??Jo,N={id:br("msg"),role:"user",content:p},E={id:br("msg"),role:"assistant",content:""},F=[...g.current,N].map(D=>({role:D.role,content:D.content})),Y=[...g.current,N,E];g.current=Y,n(Y),T&&i(""),m(null),c(!0);let z=A?.buildPayload??(D=>({messages:D})),{initialMessages:Z,parseChunk:y,buildPayload:H,onFinish:W,onError:ee,...R}=A??{},L=D=>{n(Q=>Q.map(me=>me.id===E.id?{...me,content:D}:me))},_="",j;try{j=r.requestStream(z(F),R),v.current=j}catch(D){let Q=Sn(D);U()&&(m(Q),c(!1),A?.onError?.(Q));return}try{for await(let D of j){if(w.current!==P)break;_+=x(D),U()&&L(_)}U()&&(c(!1),A?.onFinish?.({...E,content:_}))}catch(D){let Q=Sn(D);U()&&(m(Q),c(!1),A?.onError?.(Q))}finally{v.current===j&&(v.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:f,stop:b,isStreaming:a,error:u}}var re=require("react"),at=require("@urun-sh/core"),Tr=[];function yn(e,t={}){let{field:r=at.INPUT_PRESENCE_FIELD,hz:o=at.INPUT_PRESENCE_DEFAULT_HZ}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=(0,re.useMemo)(()=>s?(0,at.createInputPresencePublisher)({awareness:{setLocalStateField:(p,C)=>s.setField(p,C)},field:r,hz:o}):null,[s,r,o]),a=(0,re.useRef)(null);a.current=i;let[c,u]=(0,re.useState)(!1),[m,l]=(0,re.useState)(Tr),g=(0,re.useRef)(!1);(0,re.useEffect)(()=>{if(i)return()=>i.dispose()},[i]);let h=(0,re.useCallback)(()=>{let p=a.current;l(p?p.heldKeys():Tr)},[]),w=(0,re.useCallback)(()=>{a.current?.clear(),l(Tr)},[]);(0,re.useEffect)(()=>{if(!n)return;let p=()=>!!n.pointerLockElement,C=()=>{if(p()){g.current=!1,u(!0);return}g.current||(u(!1),w())},P=E=>{p()&&(a.current?.keyDown(E.key),h())},U=E=>{a.current?.keyUp(E.key),h()},A=E=>{p()&&a.current?.movePointer(E.movementX,E.movementY)},x=E=>{p()&&a.current?.setButtons(E.buttons)},N=()=>{w()};return n.addEventListener("pointerlockchange",C),n.addEventListener("keydown",P),n.addEventListener("keyup",U),n.addEventListener("mousemove",A),n.addEventListener("mousedown",x),n.addEventListener("mouseup",x),n.defaultView?.addEventListener("blur",N),()=>{n.removeEventListener("pointerlockchange",C),n.removeEventListener("keydown",P),n.removeEventListener("keyup",U),n.removeEventListener("mousemove",A),n.removeEventListener("mousedown",x),n.removeEventListener("mouseup",x),n.defaultView?.removeEventListener("blur",N)}},[n,w,h]);let v=(0,re.useCallback)(p=>{p.requestPointerLock?.()},[]),d=(0,re.useCallback)(()=>{g.current=!0,u(!0)},[]),b=(0,re.useCallback)(()=>{g.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),u(!1),w()},[n,w]),f=(0,re.useCallback)(p=>{a.current?.keyDown(p),h()},[h]),S=(0,re.useCallback)(p=>{a.current?.keyUp(p),h()},[h]),T=(0,re.useCallback)((p,C)=>{a.current?.movePointer(p,C)},[]);return{engage:v,engageTouch:d,release:b,engaged:c,heldKeys:m,pressKey:f,releaseKey:S,movePointer:T}}var pe=require("react"),wn=require("@urun-sh/core");var V=require("react"),En=require("@urun-sh/core");var Wt=null;function Yo(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function Rt(){if(Wt)return Wt;let e=Yo();return e?(Wt=new e,Wt):null}function Je(){let e=Rt();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var Pt=require("react"),Tn=require("react/jsx-runtime"),Cr=(0,Pt.createContext)(null);function kn({session:e,children:t}){return(0,Tn.jsx)(Cr.Provider,{value:e,children:t})}function Ue(){return(0,Pt.useContext)(Cr)}function bn(){let e=(0,Pt.useContext)(Cr);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 xt=require("react/jsx-runtime");function Zo(e,t){return e-t>>>0<2147483648}var Cn=1e3;function Rn(...e){console.debug("[video]",...e)}function Pn(e,t){let r=new Set,o=t.filter(s=>r.has(s)?!1:(r.add(s),!0)).map(s=>e.stream(s)),n=()=>{for(let s of o){let i=s.track;if(i&&i.readyState==="live")return i}return null};return{get track(){return n()},on(s,i){let a=o.map(c=>c.on("track",()=>i(n())));return()=>{for(let c of a)c()}}}}function xn(e,t,r){return r?[r,t]:[e,t]}var Ye=(0,V.forwardRef)(function(t,r){let{session:o,stream:n="video",audioStream:s="audio",track:i,muted:a=!0,mirror:c=!1,objectFit:u="contain",className:m,style:l,videoClassName:g,placeholder:h,poster:w,children:v,onTrack:d,onFirstFrame:b,frameMarker:f,onFrameMarkerReached:S,onFrameMarkerUnsupported:T,onUnlockChange:p}=t,C=Ue(),P=o??C,U=(0,V.useRef)(null),A=(0,V.useRef)(null),[x,N]=(0,V.useState)(!1),[E,F]=(0,V.useState)(!1),Y=(0,V.useRef)(!1),z=(0,V.useRef)(null),Z=(0,V.useRef)(d);Z.current=d;let y=(0,V.useRef)(p);y.current=p;let H=(0,V.useRef)(b);H.current=b;let W=(0,V.useRef)(S);W.current=S;let ee=(0,V.useRef)(T);ee.current=T;let R=(0,V.useRef)(f??null);R.current=f??null;let L=(0,V.useCallback)(k=>{z.current!==k&&(z.current=k,y.current?.(k))},[]),_=(0,V.useRef)(null),j=(0,V.useRef)(null),D=(0,V.useCallback)((k,q=!1)=>{if(!q&&k===_.current||(_.current=k,j.current?.(),j.current=null,Y.current=!1,F(!1),!k))return;let M=U.current;if(!M)return;let $=R.current,te=$?.rtpTimestamp??null,ve=!1,O=()=>{ve||(ve=!0,ee.current?.())};$&&te==null&&O();let Ae=$!=null&&te!=null,rt=_e=>{j.current?.(),j.current=null,Y.current=!0,F(!0),H.current?.(),_e&&W.current?.()};if(typeof M.requestVideoFrameCallback=="function"){let _e=!1,B=0,K=(ye,ke)=>{if(!_e){if(Ae){let Re=ke?.rtpTimestamp;if(typeof Re!="number"){O(),rt(!1);return}if(!Zo(Re,te)){B=M.requestVideoFrameCallback(K);return}rt(!0);return}rt(!1)}};B=M.requestVideoFrameCallback(K),j.current=()=>{_e=!0,M.cancelVideoFrameCallback?.(B)};return}Ae&&O();let Me=()=>{let _e=M.getVideoPlaybackQuality?.();(_e?_e.totalVideoFrames>0:M.readyState>=2&&M.videoWidth>0)&&rt(!1)};M.addEventListener("loadeddata",Me),M.addEventListener("timeupdate",Me),M.addEventListener("playing",Me),j.current=()=>{M.removeEventListener("loadeddata",Me),M.removeEventListener("timeupdate",Me),M.removeEventListener("playing",Me)},Me()},[]);(0,V.useEffect)(()=>()=>{j.current?.(),j.current=null},[]);let Q=f==null?null:`${f.rtpTimestamp??""}|${f.ptsMs??""}`,me=(0,V.useRef)(Q);(0,V.useEffect)(()=>{if(me.current===Q||(me.current=Q,Q==null))return;let k=_.current;k&&D(k,!0)},[Q,D]);let ae=(0,V.useCallback)(()=>{if(typeof MediaStream>"u")return null;A.current||(A.current=new MediaStream);let k=U.current;return k&&k.srcObject!==A.current&&(k.srcObject=A.current),A.current},[]),le=(0,V.useCallback)(k=>{let q=U.current;if(!q)return;let M=q.play();!M||typeof M.then!="function"||M.then(()=>{q.muted||L(!0)}).catch($=>{if(($ instanceof Error?$.name:String($))==="NotAllowedError"&&!q.muted){Rn(`play() blocked pending a user gesture (${k})`),L(!1);return}Rn(`play() failed (${k})`,$)})},[L]),we=(0,V.useCallback)(()=>{let k=U.current;k&&(ae(),!k.muted&&(le("gesture"),Je(),L(!0)))},[ae,le,L]),he=(0,V.useCallback)(k=>{let q=ae();if(q){for(let M of q.getVideoTracks())M!==k&&q.removeTrack(M);if(k&&!q.getVideoTracks().includes(k)){q.addTrack(k);let M=U.current;M&&(M.srcObject=q)}k&&le("track-attach"),N(k!==null),D(k),Z.current?.(k)}},[ae,le,D]),qe=(0,V.useCallback)(k=>{let q=ae();if(q){for(let M of q.getAudioTracks())M!==k&&q.removeTrack(M);k&&!q.getAudioTracks().includes(k)&&q.addTrack(k),k&&le("audio-attach")}},[ae,le]),fe=(0,V.useCallback)(k=>{U.current=k,k&&(a?(k.muted=!0,k.defaultMuted=!0,k.setAttribute("muted",""),z.current=null):(k.muted=!1,k.defaultMuted=!1,k.removeAttribute("muted")),k.setAttribute("playsinline",""),k.setAttribute("webkit-playsinline",""),ae())},[ae,a]);(0,V.useImperativeHandle)(r,()=>({get element(){return U.current},get live(){return A.current?A.current.getVideoTracks().length>0:!1},get framed(){return Y.current},unlock:we,get unlocked(){return z.current===!0}}),[we]);let de=(0,En.derivedLegRole)(n)!==void 0;(0,V.useEffect)(()=>{de&&console.error(`[video] stream=${JSON.stringify(n)} is an INTERNAL A/V leg name, not a consumable stream \u2014 address the PARENT (e.g. "${n.slice(0,n.lastIndexOf("--"))}") instead. Rendering empty.`)},[de,n]);let se=i!==void 0;return(0,V.useEffect)(()=>{if(se){he(i??null);return}if(de){he(null);return}if(!P)return;let k=Pn(P,xn(n,"video")),q=()=>{let O=A.current;return O?O.getVideoTracks()[0]??null:null},M=O=>{if(O!==q()&&(he(O),O)){let Ae=()=>{q()===O&&he(null)};O.addEventListener("ended",Ae)}},$=k.track;$&&$.readyState==="live"&&M($);let te=k.on("track",O=>{O&&O.readyState!=="live"||M(O)}),ve=setInterval(()=>{let O=k.track;O&&O.readyState==="live"&&M(O)},Cn);return()=>{te(),clearInterval(ve)}},[P,n,de,se,i,he]),(0,V.useEffect)(()=>{if(se||!P||s===!1||de)return;let k=Pn(P,xn(n,"audio",s)),q=()=>{let O=A.current;return O?O.getAudioTracks()[0]??null:null},M=O=>{if(O!==q()&&(qe(O),O)){let Ae=()=>{q()===O&&qe(null)};O.addEventListener("ended",Ae)}},$=k.track;$&&$.readyState==="live"&&M($);let te=k.on("track",O=>{O&&O.readyState!=="live"||M(O)}),ve=setInterval(()=>{let O=k.track;O&&O.readyState==="live"&&M(O)},Cn);return()=>{te(),clearInterval(ve)}},[P,n,de,s,se,qe]),(0,xt.jsxs)("div",{className:m,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":x?"true":"false","data-urun-video-framed":E?"true":"false",children:[(0,xt.jsx)("video",{ref:fe,className:g,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:u,...c?{transform:"scaleX(-1)"}:{}}}),x?null:h,w===void 0?null:(0,xt.jsx)("div",{"data-urun-video-poster":"","aria-hidden":E||void 0,style:{position:"absolute",inset:0,...E?{opacity:0,pointerEvents:"none"}:null},children:w}),v]})});var Et=require("react/jsx-runtime"),Qo={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},Un=(0,pe.forwardRef)(function(t,r){let{warp:o,children:n,...s}=t,{enabled:i=!0,overscan:a=.08,captureInput:c=!0,documentTarget:u,...m}=o??{},l=u!==void 0?u:typeof document<"u"?document:null,g=(0,pe.useRef)(null),h=(0,pe.useRef)(null),w=(0,pe.useRef)(0),v=(0,pe.useRef)(m);v.current=m;let d=(0,pe.useMemo)(()=>(0,wn.createCameraWarp)(v.current),[]);return(0,pe.useImperativeHandle)(r,()=>({get video(){return g.current},get canvas(){return h.current},warp:d,get lastDrawTs(){return w.current}}),[d]),(0,pe.useEffect)(()=>{if(!i)return;let b=0,f=0,S=null,T=C=>{typeof C.requestVideoFrameCallback=="function"&&(S=C,f=C.requestVideoFrameCallback(function P(){d.frameArrived(),f=C.requestVideoFrameCallback(P)}))},p=C=>{b=requestAnimationFrame(p);let P=h.current,U=g.current?.element??null;if(!P||!U||(U!==S&&(S&&f&&S.cancelVideoFrameCallback?.(f),T(U)),U.readyState<2))return;d.tick(C);let A=typeof devicePixelRatio=="number"?devicePixelRatio:1,x=Math.max(1,Math.round(P.clientWidth*A)),N=Math.max(1,Math.round(P.clientHeight*A));(P.width!==x||P.height!==N)&&(P.width=x,P.height=N);let E=P.getContext("2d");if(!E)return;let F=d.transform(),Y=U.videoWidth||x,z=U.videoHeight||N,y=Math.max(x/Y,N/z)*(1+a)*F.scale;E.setTransform(y,0,0,y,x/2+F.translateX*x,N/2+F.translateY*N),E.drawImage(U,-Y/2,-z/2),w.current=C};return b=requestAnimationFrame(p),()=>{cancelAnimationFrame(b),S&&f&&S.cancelVideoFrameCallback?.(f)}},[i,a,d]),(0,pe.useEffect)(()=>{if(!i||!c||!l)return;let b=()=>!!l.pointerLockElement,f=P=>{b()&&d.keyDown(P.key)},S=P=>d.keyUp(P.key),T=P=>{b()&&d.pointerDelta(P.movementX,P.movementY)},p=()=>{b()||d.clearKeys()},C=()=>d.clearKeys();return l.addEventListener("keydown",f),l.addEventListener("keyup",S),l.addEventListener("mousemove",T),l.addEventListener("pointerlockchange",p),l.defaultView?.addEventListener("blur",C),()=>{l.removeEventListener("keydown",f),l.removeEventListener("keyup",S),l.removeEventListener("mousemove",T),l.removeEventListener("pointerlockchange",p),l.defaultView?.removeEventListener("blur",C)}},[i,c,l,d]),i?(0,Et.jsxs)(Ye,{ref:g,...s,videoClassName:s.videoClassName,style:{...s.style},children:[(0,Et.jsx)("canvas",{ref:h,style:Qo,"data-urun-warp":""}),n]}):(0,Et.jsx)(Ye,{ref:g,...s,children:n})});var An=new Map;function Mn(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);An.set(e,{component:t,schema:r})}function _n(e,t){let r=An.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 Ze=require("react/jsx-runtime");function Nn({name:e,props:t,fallback:r}){let o=_n(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?(0,Ze.jsx)(Ze.Fragment,{children:r}):(0,Ze.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,Ze.jsx)("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return(0,Ze.jsx)(n,{...o.validatedProps})}var ut=require("zod"),Qe=require("react/jsx-runtime"),In=ut.z.object({step:ut.z.number().min(0),total:ut.z.number().min(1),label:ut.z.string().optional(),variant:ut.z.enum(["default","success","error"]).default("default")});function Rr(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 On(e){let{step:t,total:r,label:o,variant:n,percentage:s}=Rr(e);return(0,Qe.jsxs)("div",{className:"urun-progress-card","data-variant":n,children:[o&&(0,Qe.jsx)("div",{className:"urun-progress-label",children:o}),(0,Qe.jsx)("div",{className:"urun-progress-bar",children:(0,Qe.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,Qe.jsxs)("div",{className:"urun-progress-text",children:[t,"/",r]})]})}var Bt=require("zod"),wt=require("react/jsx-runtime"),Ln=Bt.z.object({state:Bt.z.enum(["thinking","generating","idle","error"]),message:Bt.z.string().optional()}),es={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Pr(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??es[t]??t;return{state:t,message:n,isActive:o}}function Dn(e){let{state:t,message:r,isActive:o}=Pr(e);return(0,wt.jsxs)("span",{className:"urun-status-badge","data-state":t,children:[(0,wt.jsx)("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),(0,wt.jsx)("span",{className:"urun-status-message",children:r})]})}var Ut=require("react"),jt=require("zod"),At=require("react/jsx-runtime"),Vn=jt.z.object({text:jt.z.string(),streaming:jt.z.boolean().default(!1)});function xr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function Fn(e){let{text:t,streaming:r}=xr(e),o=(0,Ut.useRef)(null),n=(0,Ut.useRef)(0);return(0,Ut.useEffect)(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),(0,At.jsxs)("div",{className:"urun-text-stream",children:[(0,At.jsx)("span",{ref:o,className:"urun-text-content"}),r&&(0,At.jsx)("span",{className:"urun-text-cursor"})]})}var Mt=require("zod"),_t=require("react/jsx-runtime"),qn=Mt.z.object({src:Mt.z.string().url(),alt:Mt.z.string().optional(),caption:Mt.z.string().optional()});function Er(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function Hn(e){let{src:t,alt:r,caption:o}=Er(e);return(0,_t.jsxs)("figure",{className:"urun-image-frame",children:[(0,_t.jsx)("img",{className:"urun-image",src:t,alt:r}),o&&(0,_t.jsx)("figcaption",{className:"urun-image-caption",children:o})]})}var Oe=require("zod"),ct=require("react/jsx-runtime"),Wn=Oe.z.object({metrics:Oe.z.array(Oe.z.object({label:Oe.z.string(),value:Oe.z.union([Oe.z.string(),Oe.z.number()]),unit:Oe.z.string().optional()}))});function wr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function Bn(e){let{metrics:t}=wr(e);return(0,ct.jsx)("div",{className:"urun-metrics-panel",children:t.map((r,o)=>(0,ct.jsxs)("div",{className:"urun-metric-card",children:[(0,ct.jsx)("div",{className:"urun-metric-label",children:r.label}),(0,ct.jsx)("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}var J=require("react"),Xn=require("react/jsx-runtime");function We(e){return e&&typeof e=="object"?e:null}function Ur(e){if(typeof e=="string")return e;let t=We(e);return t&&t.t==="delta"&&typeof t.delta=="string"?t.delta:""}function ts(e){if(typeof e=="string")return"delta";let t=We(e);return t?t.t==="delta"?"delta":t.t==="response"?"done":t.t==="error"?"error":"ignore":"ignore"}function rs(...e){for(let t of e)if(typeof t=="string"&&t)return t;return""}function ns(e){let t=We(e),r=t?.body;return rs(r,We(We(r)?.error)?.message,We(r)?.error,We(r)?.message,We(t?.error)?.message,t?.error,t?.message)||"stream reported an error"}var lt=class extends Error{name="TextStreamError"},os=4,Ar=3,Mr=240,jn=typeof performance<"u"&&typeof performance.now=="function"?()=>performance.now():()=>Date.now();function Kn(){return{chars:0,tokens:0,tokensPerSecond:0,elapsedMs:0,done:!1}}function ss(e){e.chars=0,e.tokens=0,e.tokensPerSecond=0,e.elapsedMs=0,e.done=!1}function _r(e){let{session:t,stream:r}=e,o=(0,J.useRef)(e);(0,J.useEffect)(()=>{o.current=e});let n=(0,J.useRef)(null),s=(0,J.useRef)(()=>{}),i=(0,J.useRef)(null),a=(0,J.useRef)(""),c=(0,J.useRef)(""),u=(0,J.useRef)(null),m=(0,J.useRef)(!1),l=(0,J.useRef)(!1),g=(0,J.useRef)(!1),h=(0,J.useRef)(null),w=(0,J.useRef)(Kn()),v=(0,J.useCallback)(S=>{if(n.current=S,!S){i.current=null;return}let T=i.current;if(T&&T.parentNode===S)return;let p=S.ownerDocument.createTextNode(c.current);S.appendChild(p),i.current=p,a.current.length>0&&s.current()},[]),d=(0,J.useCallback)(()=>{u.current=null;let S=i.current,T=a.current;if(T.length>0){let A=o.current,x=A.smoothCharsPerFrame??Ar,N=A.smoothThreshold??Mr,E=A.smooth&&T.length<=N?T.slice(0,x):T;a.current=T.slice(E.length),c.current+=E,S?.appendData(E)}let p=w.current,C=c.current.length,P=h.current===null?0:Math.max(0,jn()-h.current),U=Math.round(C/os);if(p.chars=C,p.tokens=U,p.elapsedMs=P,p.tokensPerSecond=P>0?U*1e3/P:0,a.current.length>0){b(),o.current.onMeter?.(p);return}if(!m.current&&!g.current){g.current=!0,p.done=!0,o.current.onMeter?.(p),l.current||o.current.onDone?.(c.current);return}o.current.onMeter?.(p)},[]),b=(0,J.useCallback)(()=>{u.current===null&&(u.current=globalThis.requestAnimationFrame(()=>d()))},[d]);s.current=b,(0,J.useEffect)(()=>{if(!t)return;if(typeof globalThis.requestAnimationFrame!="function")throw new Error("[urun] Text requires requestAnimationFrame. Render it in a browser (or a DOM test environment).");a.current="",c.current="",l.current=!1,g.current=!1,h.current=null,m.current=!0,ss(w.current),i.current&&(i.current.data="");let S=!1,T=null;return(async()=>{try{for(T=t.stream(r).messages()[Symbol.asyncIterator]();;){let C=await T.next();if(S)return;if(C.done)break;let P=C.value,U=ts(P);if(U==="error")throw new lt(ns(P));if(U==="done")break;if(U==="ignore")continue;let A=Ur(P);A&&(h.current===null&&(h.current=jn()),a.current+=A,b())}if(S)return;T.return?.(void 0),m.current=!1,b()}catch(p){if(S)return;T?.return?.(void 0),l.current=!0,m.current=!1,o.current.onError?.(p instanceof Error?p:new lt(String(p))),b()}})(),()=>{S=!0,m.current=!1,T?.return?.(void 0),u.current!==null&&(globalThis.cancelAnimationFrame?.(u.current),u.current=null)}},[t,r,b]);let f=(0,J.useCallback)(()=>c.current,[]);return{ref:v,meterRef:w,getText:f}}function $n(e,t=250){let[r,o]=(0,J.useState)(Kn);return(0,J.useEffect)(()=>{let n=setInterval(()=>{let s=e.current;o(i=>i.chars===s.chars&&i.done===s.done?i:{...s})},t);return()=>clearInterval(n)},[e,t]),r}function Gn(e){let{className:t,style:r,...o}=e,{ref:n}=_r(o);return(0,Xn.jsx)("span",{ref:n,className:t,style:r})}var zn=require("react");var Yn=require("react/jsx-runtime"),Jn=(0,zn.forwardRef)(function(t,r){let{stream:o="image",...n}=t;return(0,Yn.jsx)(Ye,{ref:r,stream:o,...n})});var G=require("react"),Zn=require("@urun-sh/core");var eo=require("react/jsx-runtime"),is=1e3,as=1e3;function Nr(...e){console.debug("[audio]",...e)}var Nt=(0,G.forwardRef)(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:c,onUnlockChange:u,onAudioElement:m}=t,l=Ue(),g=o??l,h=(0,G.useRef)(null),w=(0,G.useRef)(null),v=(0,G.useRef)(null),d=(0,G.useRef)(null),b=(0,G.useRef)(null),f=(0,G.useRef)(0),S=(0,G.useRef)(c);S.current=c;let T=(0,G.useRef)(u);T.current=u;let p=(0,G.useCallback)(y=>{v.current!==y&&(v.current=y,T.current?.(y))},[]),C=(0,G.useCallback)(()=>{if(typeof MediaStream>"u")return null;w.current||(w.current=new MediaStream);let y=h.current;return y&&y.srcObject!==w.current&&(y.srcObject=w.current),w.current},[]),P=(0,G.useCallback)(()=>{f.current=0,b.current!==null&&cancelAnimationFrame(b.current),b.current=null,d.current!==null&&clearTimeout(d.current),d.current=null},[]),U=(0,G.useCallback)(y=>{b.current=null,d.current=null,C(),N.current(`${y}:retry`)},[C]),A=(0,G.useCallback)(y=>{if(!h.current||b.current!==null||d.current!==null)return;let W=w.current;if(!(!!W&&W.getAudioTracks().some(L=>L.readyState==="live"))){P();return}let R=f.current;if(f.current=R+1,R===0&&typeof requestAnimationFrame=="function"){b.current=requestAnimationFrame(()=>U(y));return}d.current=setTimeout(()=>U(y),as)},[P,U]),x=(0,G.useCallback)(y=>{let H=h.current;if(!H)return;let W=H.play();!W||typeof W.then!="function"||W.then(()=>{H.muted||p(!0),P()}).catch(ee=>{let R=ee instanceof Error?ee.name:String(ee);if(R==="AbortError"){Nr(`play() aborted (${y}); retrying on the ladder`),A(`${y}:abort`);return}if(R==="NotAllowedError"){Nr(`play() blocked pending a user gesture (${y})`),p(!1),A(`${y}:blocked`);return}Nr(`play() failed (${y})`,ee)})},[p]),N=(0,G.useRef)(()=>{});N.current=x;let E=(0,G.useCallback)(y=>{let H=C();if(H){for(let W of H.getAudioTracks())W!==y&&H.removeTrack(W);y&&!H.getAudioTracks().includes(y)&&H.addTrack(y),y&&x("track-attach"),S.current?.(y)}},[C,x]),F=(0,G.useCallback)(()=>{let y=h.current;y&&(C(),y.muted=!1,x("gesture"),Je(),p(!0))},[C,x,p]);(0,G.useImperativeHandle)(r,()=>({unlock:F,get unlocked(){return v.current===!0},get element(){return h.current}}),[F]);let Y=(0,G.useCallback)(()=>{A("pause-event")},[A]),z=(0,G.useCallback)(y=>{let H=h.current;H&&H!==y&&H.removeEventListener("pause",Y),h.current=y,y&&(y.setAttribute("playsinline",""),y.setAttribute("webkit-playsinline",""),C(),y.addEventListener("pause",Y)),m?.(y)},[C,m,Y]),Z=s!==void 0;return(0,G.useEffect)(()=>{if(Z){E(s??null);return}if(!g)return;let y=g.stream(n),H=()=>{let _=w.current;return _?_.getAudioTracks()[0]??null:null},W=_=>{if(_!==H()&&(E(_),_)){let j=()=>{H()===_&&E(null)};_.addEventListener("ended",j)}},ee=y.track;ee&&ee.readyState==="live"&&W(ee);let R=y.on("track",_=>{_&&_.readyState!=="live"||W(_)}),L=setInterval(()=>{let _=y.track;_&&_.readyState==="live"&&W(_)},is);return()=>{R(),clearInterval(L)}},[g,n,Z,s,E]),(0,G.useEffect)(()=>(0,Zn.observePageLifecycle)(()=>{Je(),v.current===!0&&x("foreground")}),[x]),(0,G.useEffect)(()=>()=>{d.current&&clearTimeout(d.current),b.current!==null&&cancelAnimationFrame(b.current),b.current=null},[]),(0,eo.jsx)("audio",{ref:z,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),Qn=Nt;var X=require("react"),Be=require("@urun-sh/core");var ro=require("react/jsx-runtime"),Ir={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Kt(...e){console.debug("[voice]",...e)}function us(e){return e instanceof Be.SessionFailedError&&e.kind==="create-failed"&&(e.status.error?.code==="client_release"||e.status.error?.httpStatus===410)}var It=(0,X.forwardRef)(function(t,r){let{session:o,stream:n="audio",playback:s=!0,autoStart:i=!s,constraints:a=Ir,connectTimeoutMs:c,attempts:u=3,retryDelayMs:m=1500,onActiveChange:l,onError:g,onMicStream:h,onTrack:w,onUnlockChange:v,capture:d}=t,b=Ue(),f=o??b,S=(0,X.useRef)(null),T=(0,X.useRef)(null),p=(0,X.useRef)(null),C=(0,X.useRef)([]),P=(0,X.useRef)(!1),U=(0,X.useRef)(l);U.current=l;let A=(0,X.useRef)(g);A.current=g;let x=(0,X.useRef)(h);x.current=h;let N=(0,X.useCallback)(R=>{P.current!==R&&(P.current=R,U.current?.(R))},[]),E=(0,X.useCallback)(()=>{for(let R of C.current)R();C.current=[],p.current?.release(),p.current=null,T.current&&(T.current=null,x.current?.(null))},[]),F=(0,X.useCallback)(async()=>{let R=p.current;if(R){let D=await R.update(a);return T.current=R.stream,x.current?.(R.stream),D}let _=await(d??(0,Be.sharedCaptureController)()).claim("audio",a);p.current=_,C.current=[_.onTrack((D,Q)=>{T.current=Q,x.current?.(Q),P.current&&f?.stream(n).attach(D).catch(me=>Kt("mic re-attach after one-capture re-acquire failed",me))}),_.onLost(D=>{p.current=null,C.current=[],T.current=null,x.current?.(null),N(!1),A.current?.(D)})],T.current=_.stream,x.current?.(_.stream);let j=_.track;if(!j)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return j},[d,a,f,n,N]),Y=(0,X.useCallback)(async()=>{E(),N(!1),await f?.stream(n).detach().catch(()=>{})},[f,n,E,N]),z=(0,X.useCallback)(async()=>{if(!f)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");S.current?.unlock();let R;try{R=await F()}catch(j){E();let D=(0,Be.sessionFailureFromMediaError)(j,f.status);throw A.current?.(D),D}f.connect?.();let L;for(let j=1;j<=u;j++)try{await f.whenLive(c!==void 0?{timeout:c}:void 0),await f.stream(n).attach(R),N(!0);return}catch(D){if(L=D,Kt(`start attempt ${j}/${u} failed`,D),us(D))break;j<u&&await new Promise(Q=>setTimeout(Q,m))}E(),N(!1);let _=L instanceof Error?L:new Error(String(L??"voice start failed"));throw A.current?.(_),_},[f,n,c,u,m,F,E,N]);(0,X.useImperativeHandle)(r,()=>({start:z,stop:Y,unlock:()=>S.current?.unlock(),get active(){return P.current},get micStream(){return T.current},get audio(){return S.current}}),[z,Y]);let Z=(0,X.useRef)(z);Z.current=z;let y=(0,X.useRef)(null),H=(0,X.useCallback)((R,L)=>{R.promise.then(()=>{L&&(E(),N(!1)),R.session.stream(R.streamName).detach().catch(()=>{})})},[E,N]);(0,X.useEffect)(()=>{if(!i||!f)return;let R=y.current;R&&(R.session!==f||R.streamName!==n)&&(R.disposeTimer&&clearTimeout(R.disposeTimer),H(R,!1),R=null),R?R.disposeTimer&&(clearTimeout(R.disposeTimer),R.disposeTimer=null):(R={session:f,streamName:n,promise:Z.current().catch(()=>{}),refCount:0,disposeTimer:null},y.current=R),R.refCount+=1;let L=R;return()=>{L.refCount-=1,!(L.refCount>0)&&(L.disposeTimer=setTimeout(()=>{y.current===L&&(y.current=null),H(L,!0)},0))}},[i,f,n,H]);let W=(0,X.useRef)(!1),ee=(0,X.useCallback)(async()=>{if(!f||!P.current||W.current)return;let R=T.current?.getAudioTracks()[0]??null;if(R&&R.readyState==="live"){try{await f.stream(n).attach(R)}catch(L){Kt("foreground mic re-assert failed (will retry on next pass)",L)}return}W.current=!0;try{let L=await F();await f.stream(n).attach(L)}catch(L){let _=L instanceof Error?L:new Error(String(L));Kt("foreground mic re-acquire failed",_),A.current?.(_)}finally{W.current=!1}},[f,n,F]);return(0,X.useEffect)(()=>{let R=()=>{ee()};return f&&typeof f.onRecovery=="function"?f.onRecovery(R):(0,Be.observePageLifecycle)(R)},[f,ee]),(0,X.useEffect)(()=>E,[E]),s?(0,ro.jsx)(Nt,{ref:S,session:f,stream:n,onTrack:w,onUnlockChange:v}):null}),to=It;var De=require("react");var $t=require("react");var Or={level:0,speaking:!1};function Gt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=(0,$t.useState)(Or);return(0,$t.useEffect)(()=>{if(!e){i(Or);return}let a=Rt();if(!a||typeof MediaStream>"u")return;let c;e instanceof MediaStream?c=e:(c=new MediaStream,c.addTrack(e));let u,m;try{u=a.createMediaStreamSource(c),m=a.createAnalyser(),m.fftSize=r,u.connect(m)}catch{return}let l=new Uint8Array(m.fftSize),h=setInterval(()=>{m.getByteTimeDomainData(l);let w=0;for(let d=0;d<l.length;d++){let b=(l[d]-128)/128;w+=b*b}let v=Math.sqrt(w/l.length);i(d=>{let b=v>n;return Math.abs(d.level-v)<.005&&d.speaking===b?d:{level:v,speaking:b}})},o);return()=>{clearInterval(h),u.disconnect(),i(Or)}},[e,r,o,n]),s}var Le=require("react/jsx-runtime"),cs={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},ls={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},no=(0,De.forwardRef)(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:c,onActiveChange:u,onError:m,onMicStream:l,capture:g}=t,h=Ue(),w=o??h,v=(0,De.useRef)(null),[d,b]=(0,De.useState)(null),f=(0,De.useRef)(l);f.current=l;let{level:S,speaking:T}=Gt(a?d:null);return(0,De.useImperativeHandle)(r,()=>({start:()=>{let p=v.current;return p?p.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>v.current?.stop()??Promise.resolve(),get active(){return v.current?.active??!1},get micStream(){return v.current?.micStream??null}}),[]),(0,Le.jsxs)(Le.Fragment,{children:[(0,Le.jsx)(It,{ref:v,session:w,stream:n,playback:!1,autoStart:i,...s!==void 0?{constraints:s}:{},...g!==void 0?{capture:g}:{},onActiveChange:u,onError:m,onMicStream:p=>{b(p),f.current?.(p)}}),a?(0,Le.jsx)("span",{className:c,style:cs,"data-urun-mic":"","data-urun-mic-active":d?"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(S*100)/100,children:(0,Le.jsx)("span",{style:ls,children:(0,Le.jsx)("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(S*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});var dt=require("@urun-sh/core"),I=require("react");var be=require("react/jsx-runtime"),Dr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Lr(...e){console.debug("[camera]",...e)}function ds(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function ps(){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 Vr=(0,I.forwardRef)(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:c,autoStart:u=!0,mirror:m="auto",connectTimeoutMs:l,visible:g=!1,className:h,videoClassName:w,onActiveChange:v,onError:d,onStream:b,onTrack:f,children:S,capture:T,flipControl:p="auto",flipControlClassName:C,onDevices:P}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let U=i?"user":a?"environment":c??"environment",A=Ue(),x=o??A,N=(0,I.useRef)(null),E=(0,I.useRef)(null),F=(0,I.useRef)(null),Y=(0,I.useRef)([]),z=(0,I.useRef)(null),Z=(0,I.useRef)(!1),y=(0,I.useRef)(!1),H=(0,I.useRef)(U),[W,ee]=(0,I.useState)(U),[R,L]=(0,I.useState)(!1),[_,j]=(0,I.useState)(null),[D,Q]=(0,I.useState)(!1),[me]=(0,I.useState)(ds),ae=(0,I.useRef)(v);ae.current=v;let le=(0,I.useRef)(d);le.current=d;let we=(0,I.useRef)(b);we.current=b;let he=(0,I.useRef)(f);he.current=f;let qe=(0,I.useRef)(P);qe.current=P;let fe=(0,I.useCallback)(B=>{Z.current!==B&&(Z.current=B,L(B),ae.current?.(B))},[]);(0,I.useEffect)(()=>{if(!R){j(null);return}let B=!1,K=()=>{ps().then(ke=>{B||(j(ke),ke&&qe.current?.(ke))})};K();let ye=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof ye?.addEventListener=="function"?(ye.addEventListener("devicechange",K),()=>{B=!0,ye.removeEventListener?.("devicechange",K)}):()=>{B=!0}},[R]);let de=(0,I.useCallback)(B=>{let K=N.current;K&&(K.muted=!0,K.defaultMuted=!0,K.setAttribute("muted",""),K.setAttribute("playsinline",""),K.setAttribute("webkit-playsinline",""),K.srcObject=B,B&&K.play()?.catch?.(ye=>Lr("preview play() failed",ye)))},[]),se=(0,I.useCallback)(()=>{y.current=!1,z.current?.(),z.current=null;for(let B of Y.current)B();Y.current=[],F.current?.release(),F.current=null,E.current&&(E.current=null,we.current?.(null),he.current?.(null)),de(null)},[de]),k=(0,I.useCallback)((B,K)=>{z.current?.(),E.current=K,de(K),we.current?.(K);let ye=()=>{E.current===K&&(Lr("camera track ended (device removed or permission revoked)"),se(),fe(!1))};B.addEventListener("ended",ye),z.current=()=>B.removeEventListener("ended",ye)},[de,se,fe]),q=(0,I.useCallback)(async B=>{let K=n!==!1;if(K&&!x)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let ye={...Dr,...s,facingMode:B},ke;try{let Re=F.current;if(Re)ke=await Re.update(ye);else{let yt=await(T??(0,dt.sharedCaptureController)()).claim("video",ye);if(F.current=yt,Y.current=[yt.onTrack((kt,Mo)=>{k(kt,Mo),Z.current&&(!K||!x||x.stream(n).attachVideo(kt).then(()=>he.current?.(kt)).catch(_o=>Lr("camera re-publish after one-capture re-acquire failed",_o)))}),yt.onLost(kt=>{F.current=null,Y.current=[],se(),fe(!1),le.current?.(kt)})],!yt.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});ke=yt.track}}catch(Re){let nt=(0,dt.sessionFailureFromMediaError)(Re,x?.status);throw le.current?.(nt),nt}H.current=B,ee(B),k(ke,F.current?.stream??new MediaStream([ke]));try{K&&x&&(x.connect?.(),await x.whenLive(l!==void 0?{timeout:l}:void 0),await x.stream(n).attachVideo(ke)),y.current=K?n:!1}catch(Re){se(),fe(!1);let nt=Re instanceof Error?Re:new Error(String(Re));throw le.current?.(nt),nt}he.current?.(ke),fe(!0)},[x,n,s,l,T,k,se,fe]),M=(0,I.useCallback)(B=>q(B?.facingMode??H.current),[q]),$=(0,I.useCallback)(async B=>{let K=y.current===n;Z.current&&H.current===B&&K||await q(B)},[q,n]),te=(0,I.useCallback)(()=>q(H.current==="environment"?"user":"environment"),[q]),ve=(0,I.useCallback)(async()=>{se(),fe(!1),n!==!1&&await x?.stream(n).detachVideo().catch(()=>{})},[x,n,se,fe]),O=(0,I.useCallback)(async B=>{let K=N.current;if(!K)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await(0,dt.captureStillFromVideo)(K,B)},[]);(0,I.useImperativeHandle)(r,()=>({start:M,stop:ve,flip:te,setFacingMode:$,capturePhoto:O,get active(){return Z.current},get facingMode(){return H.current},get stream(){return E.current},get element(){return N.current}}),[M,ve,te,$,O]);let Ae=(0,I.useRef)($);if(Ae.current=$,(0,I.useEffect)(()=>{u&&(n!==!1&&!x||Ae.current(U).catch(()=>{}))},[u,x,U,n]),(0,I.useEffect)(()=>se,[se]),!g)return null;let rt=m==="auto"?W==="user":m,Me=R&&(p===!0||p==="auto"&&me&&(_?.length??0)>1),_e=()=>{D||(Q(!0),te().catch(()=>{}).finally(()=>Q(!1)))};return(0,be.jsxs)("div",{className:h,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":W,children:[(0,be.jsx)("video",{ref:N,className:w,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...rt?{transform:"scaleX(-1)"}:{}}}),Me?(0,be.jsx)("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:_e,disabled:D,className:C,style:C?{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:(0,be.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,be.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,be.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,be.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,be.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,be.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,S]})}),oo=(0,I.forwardRef)(function({preview:t=!0,...r},o){return(0,be.jsx)(Vr,{ref:o,...r,visible:t,autoStart:!1})});var pt=require("@urun-sh/core"),oe=require("react");function so(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=(0,oe.useState)(null),[a,c]=(0,oe.useState)(null),[u,m]=(0,oe.useState)(!1),[l,g]=(0,oe.useState)(null),[h]=(0,oe.useState)(pt.cameraCaptureAvailable),w=(0,oe.useRef)(n);w.current=n;let v=(0,oe.useRef)(null),d=(0,oe.useRef)(0),b=(0,oe.useCallback)(C=>{v.current&&URL.revokeObjectURL(v.current),v.current=C?URL.createObjectURL(new Blob([C.bytes],{type:C.type})):null,c(v.current),i(C),w.current?.(C)},[]);(0,oe.useEffect)(()=>()=>{d.current++,v.current&&URL.revokeObjectURL(v.current),v.current=null},[]);let f=(0,oe.useCallback)(async C=>{let P=++d.current;m(!0),g(null);try{let U=await C();if(d.current!==P)return;b(U)}catch(U){if(d.current!==P)return;g((0,pt.referenceImageErrorMessage)(U))}finally{d.current===P&&m(!1)}},[b]),S=(0,oe.useCallback)(C=>f(()=>(0,pt.normalizeReferenceImage)(C,{maxSize:t,type:r,quality:o,source:"file"})),[f,t,r,o]),T=(0,oe.useCallback)(C=>f(()=>C.capturePhoto({maxSize:t,type:r,quality:o})),[f,t,r,o]),p=(0,oe.useCallback)(()=>{d.current++,g(null),m(!1),b(null)},[b]);return{reference:s,previewUrl:a,pick:S,capture:T,clear:p,busy:u,error:l,cameraAvailable:h}}var Xt=require("react");function io(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 co=require("react");var Jt=require("react");var ao=require("zustand/vanilla"),uo=require("zustand"),ms=()=>{};function zt(e,t={}){let r=u=>{e?.set(u)},o=()=>e?e.get()??{}:{},n=(0,ao.createStore)(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let u of s)u();s=null}},a=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",u=>n.setState({doc:u})),e.onSynced(()=>n.setState({synced:!0}))]),i):ms,c=(u=>(0,uo.useStore)(n,u));return Object.assign(c,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),c}function mt(e,t){let r=(0,Jt.useMemo)(()=>zt(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return(0,Jt.useEffect)(()=>r.bind(),[r]),r}function lo(e,t,r){let n=mt(e,t)(r??(a=>a)),s=(0,co.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 Yt=require("react");function po(e){let[t,r]=(0,Yt.useState)(null);return(0,Yt.useEffect)(()=>{if(r(null),!!e)return e.on("generationTick",r)},[e]),t}var Qt=require("react");var je=200;function Ve(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function ft(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Zt(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 er(e,t,r={}){let o=r.cap??200,[n,s]=(0,Qt.useState)([]);return(0,Qt.useEffect)(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let c=await a.next();if(!i||c.done)break;s(u=>Ve(u,{at:Date.now(),payload:c.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}var xe=require("react/jsx-runtime");function mo({session:e,name:t,cap:r,className:o}){let n=er(e,t,{cap:r});return(0,xe.jsxs)("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[(0,xe.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,xe.jsx)("code",{children:t}),(0,xe.jsxs)("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),(0,xe.jsx)("div",{className:"urun-stream-tail-log",children:n.length===0?(0,xe.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,xe.jsx)("code",{children:t})," messages\u2026"]}):n.map((s,i)=>(0,xe.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,xe.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",ft(s.payload)]},`${s.at}-${i}`))})]})}var Ot=require("react");var Se=require("react/jsx-runtime");function Lt({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=(0,Ot.useState)(""),[i,a]=(0,Ot.useState)(null),c=(0,Ot.useCallback)(()=>{let u=Zt(n);if(!u.ok){a(u.error);return}a(null),o(u.value,n.trim()),s("")},[n,o]);return(0,Se.jsxs)("div",{className:"urun-doc-patch",children:[(0,Se.jsx)("textarea",{className:"urun-doc-patch-input",value:n,onChange:u=>s(u.target.value),placeholder:e,rows:3}),(0,Se.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,Se.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:c,children:t}),i?(0,Se.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function fo({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=mt(e,t),i=s(u=>u.doc),a=s(u=>u.synced),c=s(u=>u.set);return(0,Se.jsxs)("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[(0,Se.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,Se.jsx)("code",{children:t}),(0,Se.jsx)("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),(0,Se.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?(0,Se.jsx)(Lt,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:u=>c(u)}):null]})}var tr=require("react");var Fe=require("react/jsx-runtime");function go(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function So({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=(0,tr.useState)([]);return(0,tr.useEffect)(()=>(s([]),e?e.doc(t).on("change",a=>{s(c=>Ve(c,{at:Date.now(),direction:"in",text:go(ft(a))},r))}):void 0),[e,t,r]),(0,Fe.jsxs)("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[(0,Fe.jsx)(Lt,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(c=>Ve(c,{at:Date.now(),direction:"out",text:go(a)},r))}}),(0,Fe.jsx)("div",{className:"urun-control-sender-log",children:n.length===0?(0,Fe.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>(0,Fe.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,Fe.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,Fe.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}var rr=require("react");var et=require("react/jsx-runtime");function ho({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=(0,rr.useState)([]),a=t.join(","),c=r.join(",");return(0,rr.useEffect)(()=>{if(i([]),!e)return;let u=(l,g)=>i(h=>Ve(h,{at:Date.now(),kind:l,text:g},o)),m=[];m.push(e.onPhase(l=>u("phase",`phase \u2192 ${l.name}`)));for(let l of t){let g=e.stream(l);m.push(g.on("track",h=>u("track",`${l}: ${h?"track arrived":"track ended"}`)))}for(let l of r){let g=e.doc(l);m.push(g.on("change",()=>u("doc",`${l} changed`)))}return()=>m.forEach(l=>l())},[e,a,c,o]),(0,et.jsx)("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?(0,et.jsx)("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((u,m)=>(0,et.jsxs)("div",{className:"urun-event-spine-line","data-kind":u.kind,children:[(0,et.jsx)("span",{className:"urun-event-spine-kind",children:u.kind})," ",(0,et.jsx)("span",{className:"urun-event-spine-time",children:new Date(u.at).toLocaleTimeString()})," ",u.text]},`${u.at}-${m}`))})}var cr=require("@urun-sh/core");var nr=require("react");function Te(e){let[t,r]=(0,nr.useState)(e?.phase??null);return(0,nr.useEffect)(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}var yo=require("@urun-sh/core");var gt=require("react"),vo=require("@urun-sh/core");function or(e){let t=Te(e),r=(0,vo.isWakingPhase)(t?.name),o=(0,gt.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,gt.useState)(s);return(0,gt.useEffect)(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let c=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(c)},[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 Ke=require("react/jsx-runtime");function sr({session:e,render:t,className:r}){let o=or(e);return!o.waking||!o.phase?null:(0,Ke.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,Ke.jsxs)(Ke.Fragment,{children:[(0,Ke.jsx)("span",{className:"urun-session-waking-label",children:(0,yo.describeSessionPhase)(o.phase)})," ",(0,Ke.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}var ar=require("react");var $e=require("react"),fs={event:null,elapsedMs:0};function ir(e,t){let[r,o]=(0,$e.useState)(null),n=(0,$e.useRef)(0);(0,$e.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,$e.useState)(0);return(0,$e.useEffect)(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,c=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(c());let u=setInterval(()=>i(c()),1e3);return()=>clearInterval(u)},[r]),r?{event:r,elapsedMs:s}:fs}var St=require("react/jsx-runtime"),gs={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 Ss(e){let[t,r]=(0,ar.useState)(!1);return(0,ar.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 ur({session:e,stream:t,videoElement:r,render:o,className:n}){let s=ir(e,t),i=Ss(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let c=a.state;return(0,St.jsx)("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":c,role:"status","aria-live":"polite",children:o?o(s):(0,St.jsxs)("div",{className:"urun-activation-overlay-card",children:[(0,St.jsx)("span",{className:"urun-activation-overlay-copy",children:a.hint??gs[c]})," ",(0,St.jsxs)("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}var Ce=require("react/jsx-runtime"),hs={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",waiting_for_capacity:"waiting for GPU capacity",connecting:"connecting",live:"live",paused:"paused",error:"error",unknown:"unrecognized state"};function ko({session:e,className:t}){let r=Te(e),o=r?.name??"idle",n=(r?.name==="queued"||r?.name==="waiting_for_capacity")&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:r?.name==="error"&&r.error?r.error.reason:r?.reason?r.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return(0,Ce.jsxs)("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[(0,Ce.jsx)("span",{className:"urun-session-status-dot","data-phase":o}),(0,Ce.jsx)("span",{className:"urun-session-status-label",children:hs[o]}),n?(0,Ce.jsx)("span",{className:"urun-session-status-detail",children:n}):null]})}function bo({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=Te(e);if(s?.name==="live")return(0,Ce.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,(0,Ce.jsx)(ur,{session:e})]});let i=r?r(s):(0,Ce.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s&&(0,cr.isWakingPhase)(s.name)?(0,Ce.jsx)(sr,{session:e}):s&&s.name!=="idle"?(0,cr.describeSessionPhase)(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="paused");return(0,Ce.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?(0,Ce.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}var lr=require("react");var Co=require("react/jsx-runtime");function Fr(e){return Te(e)?.endsAt??null}function vs(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 To({session:e,urgentMs:t=6e4,className:r}){let n=Fr(e)?.getTime()??null,[s,i]=(0,lr.useState)(()=>n===null?null:Math.max(0,n-Date.now()));if((0,lr.useEffect)(()=>{if(n===null){i(null);return}let c=()=>i(Math.max(0,n-Date.now()));c();let u=setInterval(c,1e3);return()=>clearInterval(u)},[n]),s===null)return null;let a=vs(s);return(0,Co.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 Ro=require("@urun-sh/core");var ht=require("react/jsx-runtime"),ys=new Set(["paused","error"]);function qr({session:e,onResume:t,onNewSession:r,children:o,className:n}){let s=Te(e);if(!s||!ys.has(s.name))return null;let i=o?o(s):(0,ht.jsx)("span",{className:"urun-session-paused-copy",children:(0,Ro.describeSessionPhase)(s)});return(0,ht.jsxs)("div",{className:["urun-session-paused",n].filter(Boolean).join(" "),"data-phase":s.name,children:[i,t?(0,ht.jsx)("button",{type:"button",className:"urun-session-paused-resume",onClick:t,children:"Resume"}):null,r?(0,ht.jsx)("button",{type:"button",className:"urun-session-paused-new",onClick:r,children:"New session"}):null]})}var Po=qr;var Ge=require("react"),tt=require("react/jsx-runtime");function Hr(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 Wr(e){let t=(0,Ge.useMemo)(()=>e?e.doc("control"):null,[e]),[r,o]=(0,Ge.useState)(()=>t?Hr(t.get("idle")):null);return(0,Ge.useEffect)(()=>{if(!t){o(null);return}return o(Hr(t.get("idle"))),t.on("change",()=>o(Hr(t.get("idle"))))},[t]),r}function ks(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function xo({session:e,onStillHere:t,className:r}){let o=Wr(e),n=o?.deadlineEpochS??null,[s,i]=(0,Ge.useState)(null);if((0,Ge.useEffect)(()=>{if(n===null){i(null);return}let c=()=>i(Math.max(0,n-Date.now()/1e3));c();let u=setInterval(c,1e3);return()=>clearInterval(u)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return(0,tt.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,tt.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,tt.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,tt.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${ks(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,tt.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}var Ee=require("react");function bs(e){return e?e.activated&&!e.exempt&&e.available_credits<=0:!1}function dr(e,t={}){let{refreshIntervalMs:r}=t,[o,n]=(0,Ee.useState)(null),[s,i]=(0,Ee.useState)(e!==null),[a,c]=(0,Ee.useState)(null),u=(0,Ee.useRef)(e),m=(0,Ee.useCallback)(async g=>{i(!0);try{let h=await g.getBalance();if(u.current!==g)return;n(h),c(null)}catch(h){if(u.current!==g)return;c(h instanceof Error?h:new Error(String(h)))}finally{u.current===g&&i(!1)}},[]);(0,Ee.useEffect)(()=>{if(u.current=e,n(null),c(null),!e){i(!1);return}if(m(e),r!==void 0&&r>0){let g=setInterval(()=>{m(e)},r);return()=>{clearInterval(g),u.current===e&&(u.current=null)}}return()=>{u.current===e&&(u.current=null)}},[e,r,m]);let l=(0,Ee.useCallback)(async()=>{let g=u.current;g&&await m(g)},[m]);return{balance:o,isExhausted:bs(o),loading:s,error:a,refresh:l}}var pr=require("react/jsx-runtime");function Eo({client:e,children:t,fallback:r,className:o}){let{balance:n,isExhausted:s}=dr(e),i=["urun-credits-gate",o].filter(Boolean).join(" ");if(!s)return(0,pr.jsx)("div",{className:i,children:t});let a=r?r(n):(0,pr.jsx)("span",{className:"urun-credits-gate-fallback",children:"Out of credits \u2014 add credits to keep running sessions."});return(0,pr.jsx)("div",{className:i,children:a})}var Xe=require("@urun-sh/core");var vt=require("react"),wo=require("@urun-sh/core");function Uo(e){let t=(0,vt.useContext)(He),[r,o]=(0,vt.useState)(null),n=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,c=t?.orgId,u=t?.jwt,m=t?.getAccessToken,l=t?.authProvider;return(0,vt.useEffect)(()=>{if(!a||!c||!n||!s)return;let g=!1,h=()=>{(0,wo.prewake)({baseUrl:a,app:n,functionName:s,orgId:c,jwt:u,getAccessToken:m,authProvider:l}).then(v=>{g||o(v)}).catch(()=>{})};h();let w=setInterval(h,Math.max(1,i)*1e3);return()=>{g=!0,clearInterval(w)}},[n,s,i,a,c,u,m,l]),r}var mr=require("react");function Ao(e){let[t,r]=(0,mr.useState)(null);return(0,mr.useEffect)(()=>{if(r(null),!!e?.onStats)return e.onStats(r)},[e]),t}var fr=require("@urun-sh/core");0&&(module.exports={Audio,Camera,ComponentRenderer,CreditsClient,CreditsError,CreditsUnauthorizedError,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_SMOOTH_CHARS_PER_FRAME,DEFAULT_SMOOTH_THRESHOLD,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,Image,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,Mic,OPERATOR_CHORD_LABEL,OPERATOR_TOKEN_STORAGE_KEY,ProgressCard,ProgressCardSchema,ReprojectedVideo,Session,StatusBadge,StatusBadgeSchema,Text,TextStream,TextStreamError,TextStreamSchema,UrunActivationOverlay,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunCreditsGate,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunIdleWarning,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionPaused,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,Video,Voice,authMode,createCreditsClient,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,readOperatorToken,registerComponent,resumeUrunAudioContext,textDelta,urunPublicEnv,useActivation,useApp,useChat,useCompletion,useConfirmOnLeave,useCredits,useDocStore,useGenerationTick,useImageFrame,useInputPresence,useMetricsPanel,useOperatorOverride,useProgressCard,useReferenceImage,useRequest,useSession,useSessionDirectory,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionStats,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useText,useTextMeter,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client"
2
- import{a as bt,b as En,c as Tt}from"./chunk-WF2OBDSX.mjs";import{useCallback as fr,useEffect as Vn,useMemo as vr,useRef as gr,useState as Pt}from"react";import{Component as xn}from"react";import{jsx as cr,jsxs as wn}from"react/jsx-runtime";var Ke=class extends xn{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||wn("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:[cr("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),cr("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as Un}from"react";var Re=Un(null);function be(e){return e&&e.trim()?e.trim():void 0}function fe(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return be(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return be(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return be(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return be(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return be(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"NEXT_PUBLIC_URUN_TOKEN_URL":return be(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_TOKEN_URL:void 0);case"NEXT_PUBLIC_URUN_EVENTS_URL":return be(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_EVENTS_URL:void 0);case"VERCEL_ENV":return be(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return be(typeof process<"u"?process.env?.[e]:void 0)}}function rt(){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 An(){return rt()==="workos"}import{useEffect as Mn,useRef as _n}from"react";var Nn="urun.operator_token",dr=null,lr="op",In="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function pr(){return typeof window<"u"}function mr(){return dr}function Ln(){if(!pr())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(lr);if(!r)return null;dr=r,t.delete(lr);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function On(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function Ct(e){let t=_n(e);t.current=e,Mn(()=>{if(!pr())return;Ln();let r=o=>{if(!On(o))return;let n=mr();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}import{useEffect as Dn}from"react";function Rt(e=!0){Dn(()=>{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 Ve,jsxs as jn}from"react/jsx-runtime";var Fn="/api/urun-token",qn=1e4;function Hn(e){let t=e.split(".")[1];if(!t)return null;try{let r=t.replace(/-/g,"+").replace(/_/g,"/"),o=r.padEnd(r.length+(4-r.length%4)%4,"="),s=JSON.parse(atob(o)).exp;return typeof s=="number"&&Number.isFinite(s)?s*1e3:null}catch{return null}}async function Sr(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 hr(e,t){if(t===void 0)return;let r;try{r=new URL(t).hostname}catch{throw new Error(`[urun] ${e} is not a valid URL: ${t}`)}if(!(r==="127.0.0.1"||r==="localhost"||r==="::1"||r==="[::1]"))throw new Error(`[urun] ${e} must point at a loopback endpoint \u2014 the CLI launcher (urun dev/demo) is this variable's only legitimate producer and it must never be set on a deployed site. Refusing ${t}.`);return t}function Et(e){let t=e===void 0?void 0:JSON.stringify(e);return vr(()=>e,[t])}function Wn(e,t){return typeof e=="function"?e(t):e!==void 0?e:jn("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:[Ve("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),Ve("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function Bn({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:c,releaseOnLeave:u,allowWebTransport:m,allowWebRtcFallback:l,audioPlayout:g,videoPlayout:h,sessionStats:w,confirmOnLeave:v=!1,fallback:d,errorFallback:b,children:f}){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 T=r??o;if(S&&(typeof T!="string"||T.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);Rt(v);let[p,C]=Pt(),[P,U]=Pt(null),A=gr(void 0),E=gr(null),[N,x]=Pt(null);Ct(M=>x({jwt:M}));let D=Tt(),$=fe("NEXT_PUBLIC_SESSION_TOKEN")??fe("NEXT_PUBLIC_URUN_JWT"),K=rt(),G=N!==null,y=K==="workos"&&!n&&!G&&!S,F=n??(K==="jwt"?$:void 0)??p?.token,q=G?N.jwt:F,z=s??fe("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),R=y&&!q&&!D?.getAccessToken,L=t??p?.orgId,_=e??p?.gatewayUrl,W=S&&p===void 0,O=S&&p!==void 0&&!_?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,X=R?new Error('[urun] <UrunProvider> resolved authMode()="workos" but no auth context is mounted: there is no <UrunWorkOSProvider> (or <UrunAuthProvider>) ancestor supplying getAccessToken, and no jwt prop was passed, so no session token can be obtained. Note NEXT_PUBLIC_SESSION_TOKEN and NEXT_PUBLIC_URUN_JWT are IGNORED in workos mode, so setting them will not help. Either mount UrunWorkOSProvider from @urun-sh/react/next-workos, or select jwt mode with NEXT_PUBLIC_AUTH_MODE=jwt (or NEXT_PUBLIC_AUTH_ENABLED=false) and supply a token.'):null,re=P??O??X,Z=hr("NEXT_PUBLIC_URUN_TOKEN_URL",fe("NEXT_PUBLIC_URUN_TOKEN_URL"))??c??Fn,Q=hr("NEXT_PUBLIC_URUN_EVENTS_URL",fe("NEXT_PUBLIC_URUN_EVENTS_URL"))??i,me=fr(async M=>{if(!M?.forceRefresh){let J=A.current;if(!J)return J;let ie=Hn(J);if(ie===null||ie-Date.now()>qn)return J}return(await(E.current??(E.current=(async()=>{try{let J=await Sr(Z);return A.current=J.token,C(J),J}finally{E.current=null}})()))).token},[Z]),se=fr(async()=>q,[q]),Ce=typeof q=="string"&&q.trim().length>0,ne=y?D?.getAccessToken:S&&!G?me:Ce?se:void 0,ee=Et(g),Y=Et(h),k=Et(w),V=vr(()=>({appId:T,baseUrl:_??"",orgId:L??"",jwt:q,getAccessToken:y?D?.getAccessToken:S&&!G?me:void 0,authProvider:z,eventsUrl:Q,sessionKey:a,releaseOnLeave:u,allowWebTransport:m,allowWebRtcFallback:l,audioPlayout:ee,videoPlayout:Y,sessionStats:k,priority:G?"preempt":void 0}),[T,D,_,z,q,Q,L,a,u,m,l,ee,Y,k,y,G,S,me]);return Vn(()=>{if(!S)return;let M=new AbortController;return U(null),(async()=>{try{let j=await Sr(Z,M.signal);A.current=j.token,C(j)}catch(j){if(M.signal.aborted)return;U(j instanceof Error?j:new Error(String(j)))}})(),()=>M.abort()},[S,Z]),Ve(Ke,{fallback:d,children:re?Wn(b,re):W?Ve("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Ve(Re.Provider,{value:V,children:ne?Ve(bt,{getAccessToken:ne,children:f}):f})})}import{useContext as Kn,useEffect as $n,useMemo as yr,useReducer as Gn,useRef as xt}from"react";import{App as Xn}from"@urun-sh/core";function kr(e){return e?.sessionId?{sessionId:e.sessionId}:e?.label?{label:e.label}:{}}function zn(e,t,r){let o=kr(r),n=r?.activity??"auto";return`${e}:${JSON.stringify(t??{})}:${o.sessionId??""}:${o.label??""}:${n}`}function Jn(e,t,r,o){let n=kr(o);return JSON.stringify({sessionId:n.sessionId,label:n.label,appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,activity:o?.activity??"auto",fnName:t,args:r??{}})}var Me=new Map;var wt=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()})}onConnectionState(t){return this._doc.onConnectionState?this._doc.onConnectionState(r=>{t(r),this._notify()}):(t({connected:!0,consecutiveFailures:0,lastCloseCode:null,lastCloseReason:null}),()=>{})}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()}},At=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"){let c=a.error,u=c?.reason??`session ${this._session.id} entered the error phase`;n({level:"error",kind:"phase-error",message:u,detail:{sessionId:this._session.id,code:c?.code,kind:c?.kind,httpStatus:c?.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 region(){return this._session.region}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}onStats(t){return this._session.onStats?this._session.onStats(t):()=>{}}watchDownlinkStall(t={}){return this._session.watchDownlinkStall?this._session.watchDownlinkStall(t):()=>{}}on(t,r){return this._session.on(t,r)}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()}activity(){this._session.activity?this._session.activity():this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new wt(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}async cancel(){let t=await this._session.cancel();return this._disposeHandle(),t}detach(){this._disposeHandle(),this._session.detach()}disconnect(){this.detach()}_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 Yn(){let e=Kn(Re);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=Gn(i=>i+1,0),r=xt(new Map),o=xt(new Map),n=xt(null),s=yr(()=>Xn(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,allowWebTransport:e.allowWebTransport,allowWebRtcFallback:e.allowWebRtcFallback,priority:e.priority,audioPlayout:e.audioPlayout,videoPlayout:e.videoPlayout,sessionStats:e.sessionStats}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.allowWebTransport,e.allowWebRtcFallback,e.priority,e.audioPlayout,e.videoPlayout,e.sessionStats]);return $n(()=>{let i=n.current;if(i){n.current=null;for(let[a,c]of i){let u=Me.get(a);u===c&&o.current.get(a)===c&&(u.disposeTimer&&(clearTimeout(u.disposeTimer),u.disposeTimer=null),u.handle.addNotifier(t),u.refCount+=1)}}return()=>{let a=new Map;for(let[c,u]of o.current){let m=Me.get(c);m===u&&(m.handle.removeNotifier(t),m.refCount=Math.max(0,m.refCount-1),a.set(c,m),m.refCount===0&&(m.disposeTimer=setTimeout(()=>{let l=Me.get(c);!l||l.refCount!==0||(Me.delete(c),l.handle.disconnect())},0)))}n.current=a}},[]),yr(()=>{let i=new Map;return new Proxy({},{get(a,c){if(typeof c!="string")return;let u=i.get(c);if(u)return u;let m=(l,g)=>{let h=zn(c,l,g),w=r.current.get(h);if(w&&!w.disposed)return w;let v=Jn(e,c,l,g),d=Me.get(v);return d?.handle.disposed&&(d.disposeTimer&&clearTimeout(d.disposeTimer),Me.delete(v),o.current.get(v)===d&&o.current.delete(v),d=void 0),d?d.disposeTimer&&(clearTimeout(d.disposeTimer),d.disposeTimer=null):(d={handle:new At(s[c](l,g),t,e.eventsUrl),refCount:0,disposeTimer:null},Me.set(v,d)),o.current.get(v)!==d&&(o.current.set(v,d),d.handle.addNotifier(t),d.refCount+=1),r.current.set(h,d.handle),d.handle};return i.set(c,m),m}})},[e,s])}import{useContext as Zn,useMemo as Qn}from"react";import{sessionDirectory as eo}from"@urun-sh/core";function to(){let e=Zn(Re);if(!e)throw new Error("useSessionDirectory must be used within <UrunProvider>");if(!e.appId)throw new Error('useSessionDirectory requires <UrunProvider appId="...">');let{appId:t,baseUrl:r,orgId:o,jwt:n,getAccessToken:s,authProvider:i}=e;return Qn(()=>eo(t,{baseUrl:r,orgId:o,jwt:n,getAccessToken:s,authProvider:i}),[t,r,o,n,s,i])}import{useCallback as Mt,useEffect as ro,useMemo as no,useRef as nt,useState as _t}from"react";function Fe(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 oo(e){return e instanceof Error?e:new Error(String(e))}function so(e,t){let r=no(()=>Fe(e),[e]),[o,n]=_t(void 0),[s,i]=_t(null),[a,c]=_t(!1),u=nt(t);u.current=t;let m=nt(0),l=nt(null),g=nt(!0);ro(()=>(g.current=!0,()=>{g.current=!1,l.current?.abort()}),[]);let h=Mt(async d=>{l.current?.abort();let b=new AbortController;l.current=b;let f=++m.current,S=()=>g.current&&m.current===f;S()&&(c(!0),i(null));try{let T=await r.request(d,{...u.current,signal:b.signal});return S()&&(n(T),c(!1),u.current?.onSuccess?.(T)),T}catch(T){let p=oo(T);throw S()&&(i(p),c(!1),u.current?.onError?.(p)),p}},[r]),w=Mt(d=>{h(d).catch(()=>{})},[h]),v=Mt(()=>{m.current++,l.current?.abort(),l.current=null,n(void 0),i(null),c(!1)},[]);return{mutate:w,mutateAsync:h,data:o,error:s,isPending:a,reset:v}}import{useCallback as br,useEffect as io,useMemo as ao,useRef as ot,useState as Nt}from"react";function Tr(e){return e instanceof Error?e:new Error(String(e))}var uo=e=>typeof e=="string"?e:String(e);function co(e,t){let r=ao(()=>Fe(e),[e]),[o,n]=Nt(""),[s,i]=Nt(!1),[a,c]=Nt(null),u=ot(t);u.current=t;let m=ot(0),l=ot(null),g=ot(!0);io(()=>(g.current=!0,()=>{g.current=!1,l.current?.cancel(),l.current=null}),[]);let h=br(()=>{m.current++,l.current?.cancel(),l.current=null,g.current&&i(!1)},[]),w=br(async v=>{l.current?.cancel();let d=++m.current,b=()=>g.current&&m.current===d,f=u.current,S=f?.parseChunk??uo,T=f?.buildPayload??(x=>({prompt:x}));b()&&(n(""),c(null),i(!0));let{parseChunk:p,buildPayload:C,onFinish:P,onError:U,...A}=f??{},E="",N;try{N=r.requestStream(T(v),A),l.current=N}catch(x){let D=Tr(x);b()&&(c(D),i(!1),f?.onError?.(D));return}try{for await(let x of N){if(m.current!==d)break;E+=S(x),b()&&n(E)}b()&&(i(!1),f?.onFinish?.(E))}catch(x){let D=Tr(x);b()&&(c(D),i(!1),f?.onError?.(D))}finally{l.current===N&&(l.current=null)}},[r]);return{completion:o,complete:w,stop:h,isStreaming:s,error:a}}import{useCallback as Cr,useEffect as lo,useMemo as po,useRef as qe,useState as st}from"react";function Rr(e){return e instanceof Error?e:new Error(String(e))}var mo=e=>typeof e=="string"?e:String(e),Pr=0;function It(e){return Pr+=1,`${e}-${Pr}`}function fo(e,t){let r=po(()=>Fe(e),[e]),[o,n]=st(()=>(t?.initialMessages??[]).map(S=>({id:S.id??It("msg"),role:S.role,content:S.content}))),[s,i]=st(""),[a,c]=st(!1),[u,m]=st(null),l=qe(t);l.current=t;let g=qe(o);g.current=o;let h=qe(s);h.current=s;let w=qe(0),v=qe(null),d=qe(!0);lo(()=>(d.current=!0,()=>{d.current=!1,v.current?.cancel(),v.current=null}),[]);let b=Cr(()=>{w.current++,v.current?.cancel(),v.current=null,d.current&&c(!1)},[]),f=Cr(async S=>{let T=S===void 0,p=(T?h.current:S)??"";if(!p.trim())return;v.current?.cancel();let P=++w.current,U=()=>d.current&&w.current===P,A=l.current,E=A?.parseChunk??mo,N={id:It("msg"),role:"user",content:p},x={id:It("msg"),role:"assistant",content:""},D=[...g.current,N].map(O=>({role:O.role,content:O.content})),$=[...g.current,N,x];g.current=$,n($),T&&i(""),m(null),c(!0);let K=A?.buildPayload??(O=>({messages:O})),{initialMessages:G,parseChunk:y,buildPayload:F,onFinish:q,onError:z,...R}=A??{},L=O=>{n(X=>X.map(re=>re.id===x.id?{...re,content:O}:re))},_="",W;try{W=r.requestStream(K(D),R),v.current=W}catch(O){let X=Rr(O);U()&&(m(X),c(!1),A?.onError?.(X));return}try{for await(let O of W){if(w.current!==P)break;_+=E(O),U()&&L(_)}U()&&(c(!1),A?.onFinish?.({...x,content:_}))}catch(O){let X=Rr(O);U()&&(m(X),c(!1),A?.onError?.(X))}finally{v.current===W&&(v.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:f,stop:b,isStreaming:a,error:u}}import{useCallback as Pe,useEffect as Er,useMemo as go,useRef as xr,useState as wr}from"react";import{createInputPresencePublisher as So,INPUT_PRESENCE_DEFAULT_HZ as ho,INPUT_PRESENCE_FIELD as vo}from"@urun-sh/core";var Lt=[];function yo(e,t={}){let{field:r=vo,hz:o=ho}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=go(()=>s?So({awareness:{setLocalStateField:(p,C)=>s.setField(p,C)},field:r,hz:o}):null,[s,r,o]),a=xr(null);a.current=i;let[c,u]=wr(!1),[m,l]=wr(Lt),g=xr(!1);Er(()=>{if(i)return()=>i.dispose()},[i]);let h=Pe(()=>{let p=a.current;l(p?p.heldKeys():Lt)},[]),w=Pe(()=>{a.current?.clear(),l(Lt)},[]);Er(()=>{if(!n)return;let p=()=>!!n.pointerLockElement,C=()=>{if(p()){g.current=!1,u(!0);return}g.current||(u(!1),w())},P=x=>{p()&&(a.current?.keyDown(x.key),h())},U=x=>{a.current?.keyUp(x.key),h()},A=x=>{p()&&a.current?.movePointer(x.movementX,x.movementY)},E=x=>{p()&&a.current?.setButtons(x.buttons)},N=()=>{w()};return n.addEventListener("pointerlockchange",C),n.addEventListener("keydown",P),n.addEventListener("keyup",U),n.addEventListener("mousemove",A),n.addEventListener("mousedown",E),n.addEventListener("mouseup",E),n.defaultView?.addEventListener("blur",N),()=>{n.removeEventListener("pointerlockchange",C),n.removeEventListener("keydown",P),n.removeEventListener("keyup",U),n.removeEventListener("mousemove",A),n.removeEventListener("mousedown",E),n.removeEventListener("mouseup",E),n.defaultView?.removeEventListener("blur",N)}},[n,w,h]);let v=Pe(p=>{p.requestPointerLock?.()},[]),d=Pe(()=>{g.current=!0,u(!0)},[]),b=Pe(()=>{g.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),u(!1),w()},[n,w]),f=Pe(p=>{a.current?.keyDown(p),h()},[h]),S=Pe(p=>{a.current?.keyUp(p),h()},[h]),T=Pe((p,C)=>{a.current?.movePointer(p,C)},[]);return{engage:v,engageTouch:d,release:b,engaged:c,heldKeys:m,pressKey:f,releaseKey:S,movePointer:T}}import{forwardRef as Ao,useEffect as Or,useImperativeHandle as Mo,useMemo as _o,useRef as ut}from"react";import{createCameraWarp as No}from"@urun-sh/core";import{forwardRef as Po,useCallback as Ee,useEffect as $e,useImperativeHandle as Eo,useRef as oe,useState as Ar}from"react";import{derivedLegRole as xo}from"@urun-sh/core";var it=null;function ko(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function at(){if(it)return it;let e=ko();return e?(it=new e,it):null}function He(){let e=at();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{createContext as bo,useContext as Ur}from"react";import{jsx as Ro}from"react/jsx-runtime";var Ot=bo(null);function To({session:e,children:t}){return Ro(Ot.Provider,{value:e,children:t})}function ge(){return Ur(Ot)}function Co(){let e=Ur(Ot);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{jsx as Lr,jsxs as Uo}from"react/jsx-runtime";function wo(e,t){return e-t>>>0<2147483648}var Mr=1e3;function _r(...e){console.debug("[video]",...e)}function Nr(e,t){let r=new Set,o=t.filter(s=>r.has(s)?!1:(r.add(s),!0)).map(s=>e.stream(s)),n=()=>{for(let s of o){let i=s.track;if(i&&i.readyState==="live")return i}return null};return{get track(){return n()},on(s,i){let a=o.map(c=>c.on("track",()=>i(n())));return()=>{for(let c of a)c()}}}}function Ir(e,t,r){return r?[r,t]:[e,t]}var We=Po(function(t,r){let{session:o,stream:n="video",audioStream:s="audio",track:i,muted:a=!0,mirror:c=!1,objectFit:u="contain",className:m,style:l,videoClassName:g,placeholder:h,poster:w,children:v,onTrack:d,onFirstFrame:b,frameMarker:f,onFrameMarkerReached:S,onFrameMarkerUnsupported:T,onUnlockChange:p}=t,C=ge(),P=o??C,U=oe(null),A=oe(null),[E,N]=Ar(!1),[x,D]=Ar(!1),$=oe(!1),K=oe(null),G=oe(d);G.current=d;let y=oe(p);y.current=p;let F=oe(b);F.current=b;let q=oe(S);q.current=S;let z=oe(T);z.current=T;let R=oe(f??null);R.current=f??null;let L=Ee(k=>{K.current!==k&&(K.current=k,y.current?.(k))},[]),_=oe(null),W=oe(null),O=Ee((k,V=!1)=>{if(!V&&k===_.current||(_.current=k,W.current?.(),W.current=null,$.current=!1,D(!1),!k))return;let M=U.current;if(!M)return;let j=R.current,J=j?.rtpTimestamp??null,ie=!1,I=()=>{ie||(ie=!0,z.current?.())};j&&J==null&&I();let ve=j!=null&&J!=null,Oe=ke=>{W.current?.(),W.current=null,$.current=!0,D(!0),F.current?.(),ke&&q.current?.()};if(typeof M.requestVideoFrameCallback=="function"){let ke=!1,H=0,B=(ae,ue)=>{if(!ke){if(ve){let le=ue?.rtpTimestamp;if(typeof le!="number"){I(),Oe(!1);return}if(!wo(le,J)){H=M.requestVideoFrameCallback(B);return}Oe(!0);return}Oe(!1)}};H=M.requestVideoFrameCallback(B),W.current=()=>{ke=!0,M.cancelVideoFrameCallback?.(H)};return}ve&&I();let ye=()=>{let ke=M.getVideoPlaybackQuality?.();(ke?ke.totalVideoFrames>0:M.readyState>=2&&M.videoWidth>0)&&Oe(!1)};M.addEventListener("loadeddata",ye),M.addEventListener("timeupdate",ye),M.addEventListener("playing",ye),W.current=()=>{M.removeEventListener("loadeddata",ye),M.removeEventListener("timeupdate",ye),M.removeEventListener("playing",ye)},ye()},[]);$e(()=>()=>{W.current?.(),W.current=null},[]);let X=f==null?null:`${f.rtpTimestamp??""}|${f.ptsMs??""}`,re=oe(X);$e(()=>{if(re.current===X||(re.current=X,X==null))return;let k=_.current;k&&O(k,!0)},[X,O]);let Z=Ee(()=>{if(typeof MediaStream>"u")return null;A.current||(A.current=new MediaStream);let k=U.current;return k&&k.srcObject!==A.current&&(k.srcObject=A.current),A.current},[]),Q=Ee(k=>{let V=U.current;if(!V)return;let M=V.play();!M||typeof M.then!="function"||M.then(()=>{V.muted||L(!0)}).catch(j=>{if((j instanceof Error?j.name:String(j))==="NotAllowedError"&&!V.muted){_r(`play() blocked pending a user gesture (${k})`),L(!1);return}_r(`play() failed (${k})`,j)})},[L]),me=Ee(()=>{let k=U.current;k&&(Z(),!k.muted&&(Q("gesture"),He(),L(!0)))},[Z,Q,L]),se=Ee(k=>{let V=Z();if(V){for(let M of V.getVideoTracks())M!==k&&V.removeTrack(M);if(k&&!V.getVideoTracks().includes(k)){V.addTrack(k);let M=U.current;M&&(M.srcObject=V)}k&&Q("track-attach"),N(k!==null),O(k),G.current?.(k)}},[Z,Q,O]),Ce=Ee(k=>{let V=Z();if(V){for(let M of V.getAudioTracks())M!==k&&V.removeTrack(M);k&&!V.getAudioTracks().includes(k)&&V.addTrack(k),k&&Q("audio-attach")}},[Z,Q]),ne=Ee(k=>{U.current=k,k&&(a?(k.muted=!0,k.defaultMuted=!0,k.setAttribute("muted",""),K.current=null):(k.muted=!1,k.defaultMuted=!1,k.removeAttribute("muted")),k.setAttribute("playsinline",""),k.setAttribute("webkit-playsinline",""),Z())},[Z,a]);Eo(r,()=>({get element(){return U.current},get live(){return A.current?A.current.getVideoTracks().length>0:!1},get framed(){return $.current},unlock:me,get unlocked(){return K.current===!0}}),[me]);let ee=xo(n)!==void 0;$e(()=>{ee&&console.error(`[video] stream=${JSON.stringify(n)} is an INTERNAL A/V leg name, not a consumable stream \u2014 address the PARENT (e.g. "${n.slice(0,n.lastIndexOf("--"))}") instead. Rendering empty.`)},[ee,n]);let Y=i!==void 0;return $e(()=>{if(Y){se(i??null);return}if(ee){se(null);return}if(!P)return;let k=Nr(P,Ir(n,"video")),V=()=>{let I=A.current;return I?I.getVideoTracks()[0]??null:null},M=I=>{if(I!==V()&&(se(I),I)){let ve=()=>{V()===I&&se(null)};I.addEventListener("ended",ve)}},j=k.track;j&&j.readyState==="live"&&M(j);let J=k.on("track",I=>{I&&I.readyState!=="live"||M(I)}),ie=setInterval(()=>{let I=k.track;I&&I.readyState==="live"&&M(I)},Mr);return()=>{J(),clearInterval(ie)}},[P,n,ee,Y,i,se]),$e(()=>{if(Y||!P||s===!1||ee)return;let k=Nr(P,Ir(n,"audio",s)),V=()=>{let I=A.current;return I?I.getAudioTracks()[0]??null:null},M=I=>{if(I!==V()&&(Ce(I),I)){let ve=()=>{V()===I&&Ce(null)};I.addEventListener("ended",ve)}},j=k.track;j&&j.readyState==="live"&&M(j);let J=k.on("track",I=>{I&&I.readyState!=="live"||M(I)}),ie=setInterval(()=>{let I=k.track;I&&I.readyState==="live"&&M(I)},Mr);return()=>{J(),clearInterval(ie)}},[P,n,ee,s,Y,Ce]),Uo("div",{className:m,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":E?"true":"false","data-urun-video-framed":x?"true":"false",children:[Lr("video",{ref:ne,className:g,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:u,...c?{transform:"scaleX(-1)"}:{}}}),E?null:h,w===void 0?null:Lr("div",{"data-urun-video-poster":"","aria-hidden":x||void 0,style:{position:"absolute",inset:0,...x?{opacity:0,pointerEvents:"none"}:null},children:w}),v]})});import{jsx as Dr,jsxs as Oo}from"react/jsx-runtime";var Io={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},Lo=Ao(function(t,r){let{warp:o,children:n,...s}=t,{enabled:i=!0,overscan:a=.08,captureInput:c=!0,documentTarget:u,...m}=o??{},l=u!==void 0?u:typeof document<"u"?document:null,g=ut(null),h=ut(null),w=ut(0),v=ut(m);v.current=m;let d=_o(()=>No(v.current),[]);return Mo(r,()=>({get video(){return g.current},get canvas(){return h.current},warp:d,get lastDrawTs(){return w.current}}),[d]),Or(()=>{if(!i)return;let b=0,f=0,S=null,T=C=>{typeof C.requestVideoFrameCallback=="function"&&(S=C,f=C.requestVideoFrameCallback(function P(){d.frameArrived(),f=C.requestVideoFrameCallback(P)}))},p=C=>{b=requestAnimationFrame(p);let P=h.current,U=g.current?.element??null;if(!P||!U||(U!==S&&(S&&f&&S.cancelVideoFrameCallback?.(f),T(U)),U.readyState<2))return;d.tick(C);let A=typeof devicePixelRatio=="number"?devicePixelRatio:1,E=Math.max(1,Math.round(P.clientWidth*A)),N=Math.max(1,Math.round(P.clientHeight*A));(P.width!==E||P.height!==N)&&(P.width=E,P.height=N);let x=P.getContext("2d");if(!x)return;let D=d.transform(),$=U.videoWidth||E,K=U.videoHeight||N,y=Math.max(E/$,N/K)*(1+a)*D.scale;x.setTransform(y,0,0,y,E/2+D.translateX*E,N/2+D.translateY*N),x.drawImage(U,-$/2,-K/2),w.current=C};return b=requestAnimationFrame(p),()=>{cancelAnimationFrame(b),S&&f&&S.cancelVideoFrameCallback?.(f)}},[i,a,d]),Or(()=>{if(!i||!c||!l)return;let b=()=>!!l.pointerLockElement,f=P=>{b()&&d.keyDown(P.key)},S=P=>d.keyUp(P.key),T=P=>{b()&&d.pointerDelta(P.movementX,P.movementY)},p=()=>{b()||d.clearKeys()},C=()=>d.clearKeys();return l.addEventListener("keydown",f),l.addEventListener("keyup",S),l.addEventListener("mousemove",T),l.addEventListener("pointerlockchange",p),l.defaultView?.addEventListener("blur",C),()=>{l.removeEventListener("keydown",f),l.removeEventListener("keyup",S),l.removeEventListener("mousemove",T),l.removeEventListener("pointerlockchange",p),l.defaultView?.removeEventListener("blur",C)}},[i,c,l,d]),i?Oo(We,{ref:g,...s,videoClassName:s.videoClassName,style:{...s.style},children:[Dr("canvas",{ref:h,style:Io,"data-urun-warp":""}),n]}):Dr(We,{ref:g,...s,children:n})});var Vr=new Map;function Do(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);Vr.set(e,{component:t,schema:r})}function Fr(e,t){let r=Vr.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 Fo,jsx as ct}from"react/jsx-runtime";function Vo({name:e,props:t,fallback:r}){let o=Fr(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?ct(Fo,{children:r}):ct("div",{className:"urun-component-error",role:"alert",children:ct("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return ct(n,{...o.validatedProps})}import{z as Ge}from"zod";import{jsx as Dt,jsxs as qr}from"react/jsx-runtime";var qo=Ge.object({step:Ge.number().min(0),total:Ge.number().min(1),label:Ge.string().optional(),variant:Ge.enum(["default","success","error"]).default("default")});function Hr(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 Ho(e){let{step:t,total:r,label:o,variant:n,percentage:s}=Hr(e);return qr("div",{className:"urun-progress-card","data-variant":n,children:[o&&Dt("div",{className:"urun-progress-label",children:o}),Dt("div",{className:"urun-progress-bar",children:Dt("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),qr("div",{className:"urun-progress-text",children:[t,"/",r]})]})}import{z as Vt}from"zod";import{jsx as Wr,jsxs as Ko}from"react/jsx-runtime";var Wo=Vt.object({state:Vt.enum(["thinking","generating","idle","error"]),message:Vt.string().optional()}),Bo={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Br(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??Bo[t]??t;return{state:t,message:n,isActive:o}}function jo(e){let{state:t,message:r,isActive:o}=Br(e);return Ko("span",{className:"urun-status-badge","data-state":t,children:[Wr("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),Wr("span",{className:"urun-status-message",children:r})]})}import{useRef as jr,useEffect as $o}from"react";import{z as Ft}from"zod";import{jsx as Kr,jsxs as zo}from"react/jsx-runtime";var Go=Ft.object({text:Ft.string(),streaming:Ft.boolean().default(!1)});function $r(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function Xo(e){let{text:t,streaming:r}=$r(e),o=jr(null),n=jr(0);return $o(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),zo("div",{className:"urun-text-stream",children:[Kr("span",{ref:o,className:"urun-text-content"}),r&&Kr("span",{className:"urun-text-cursor"})]})}import{z as lt}from"zod";import{jsx as Gr,jsxs as Zo}from"react/jsx-runtime";var Jo=lt.object({src:lt.string().url(),alt:lt.string().optional(),caption:lt.string().optional()});function Xr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function Yo(e){let{src:t,alt:r,caption:o}=Xr(e);return Zo("figure",{className:"urun-image-frame",children:[Gr("img",{className:"urun-image",src:t,alt:r}),o&&Gr("figcaption",{className:"urun-image-caption",children:o})]})}import{z as xe}from"zod";import{jsx as qt,jsxs as ts}from"react/jsx-runtime";var Qo=xe.object({metrics:xe.array(xe.object({label:xe.string(),value:xe.union([xe.string(),xe.number()]),unit:xe.string().optional()}))});function zr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function es(e){let{metrics:t}=zr(e);return qt("div",{className:"urun-metrics-panel",children:t.map((r,o)=>ts("div",{className:"urun-metric-card",children:[qt("div",{className:"urun-metric-label",children:r.label}),qt("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}import{useCallback as dt,useEffect as Ht,useRef as ce,useState as rs}from"react";import{jsx as ls}from"react/jsx-runtime";function we(e){return e&&typeof e=="object"?e:null}function Yr(e){if(typeof e=="string")return e;let t=we(e);return t&&t.t==="delta"&&typeof t.delta=="string"?t.delta:""}function ns(e){if(typeof e=="string")return"delta";let t=we(e);return t?t.t==="delta"?"delta":t.t==="response"?"done":t.t==="error"?"error":"ignore":"ignore"}function os(...e){for(let t of e)if(typeof t=="string"&&t)return t;return""}function ss(e){let t=we(e),r=t?.body;return os(r,we(we(r)?.error)?.message,we(r)?.error,we(r)?.message,we(t?.error)?.message,t?.error,t?.message)||"stream reported an error"}var Xe=class extends Error{name="TextStreamError"},is=4,Zr=3,Qr=240,Jr=typeof performance<"u"&&typeof performance.now=="function"?()=>performance.now():()=>Date.now();function en(){return{chars:0,tokens:0,tokensPerSecond:0,elapsedMs:0,done:!1}}function as(e){e.chars=0,e.tokens=0,e.tokensPerSecond=0,e.elapsedMs=0,e.done=!1}function tn(e){let{session:t,stream:r}=e,o=ce(e);Ht(()=>{o.current=e});let n=ce(null),s=ce(()=>{}),i=ce(null),a=ce(""),c=ce(""),u=ce(null),m=ce(!1),l=ce(!1),g=ce(!1),h=ce(null),w=ce(en()),v=dt(S=>{if(n.current=S,!S){i.current=null;return}let T=i.current;if(T&&T.parentNode===S)return;let p=S.ownerDocument.createTextNode(c.current);S.appendChild(p),i.current=p,a.current.length>0&&s.current()},[]),d=dt(()=>{u.current=null;let S=i.current,T=a.current;if(T.length>0){let A=o.current,E=A.smoothCharsPerFrame??Zr,N=A.smoothThreshold??Qr,x=A.smooth&&T.length<=N?T.slice(0,E):T;a.current=T.slice(x.length),c.current+=x,S?.appendData(x)}let p=w.current,C=c.current.length,P=h.current===null?0:Math.max(0,Jr()-h.current),U=Math.round(C/is);if(p.chars=C,p.tokens=U,p.elapsedMs=P,p.tokensPerSecond=P>0?U*1e3/P:0,a.current.length>0){b(),o.current.onMeter?.(p);return}if(!m.current&&!g.current){g.current=!0,p.done=!0,o.current.onMeter?.(p),l.current||o.current.onDone?.(c.current);return}o.current.onMeter?.(p)},[]),b=dt(()=>{u.current===null&&(u.current=globalThis.requestAnimationFrame(()=>d()))},[d]);s.current=b,Ht(()=>{if(!t)return;if(typeof globalThis.requestAnimationFrame!="function")throw new Error("[urun] Text requires requestAnimationFrame. Render it in a browser (or a DOM test environment).");a.current="",c.current="",l.current=!1,g.current=!1,h.current=null,m.current=!0,as(w.current),i.current&&(i.current.data="");let S=!1,T=null;return(async()=>{try{for(T=t.stream(r).messages()[Symbol.asyncIterator]();;){let C=await T.next();if(S)return;if(C.done)break;let P=C.value,U=ns(P);if(U==="error")throw new Xe(ss(P));if(U==="done")break;if(U==="ignore")continue;let A=Yr(P);A&&(h.current===null&&(h.current=Jr()),a.current+=A,b())}if(S)return;T.return?.(void 0),m.current=!1,b()}catch(p){if(S)return;T?.return?.(void 0),l.current=!0,m.current=!1,o.current.onError?.(p instanceof Error?p:new Xe(String(p))),b()}})(),()=>{S=!0,m.current=!1,T?.return?.(void 0),u.current!==null&&(globalThis.cancelAnimationFrame?.(u.current),u.current=null)}},[t,r,b]);let f=dt(()=>c.current,[]);return{ref:v,meterRef:w,getText:f}}function us(e,t=250){let[r,o]=rs(en);return Ht(()=>{let n=setInterval(()=>{let s=e.current;o(i=>i.chars===s.chars&&i.done===s.done?i:{...s})},t);return()=>clearInterval(n)},[e,t]),r}function cs(e){let{className:t,style:r,...o}=e,{ref:n}=tn(o);return ls("span",{ref:n,className:t,style:r})}import{forwardRef as ds}from"react";import{jsx as ms}from"react/jsx-runtime";var ps=ds(function(t,r){let{stream:o="image",...n}=t;return ms(We,{ref:r,stream:o,...n})});import{forwardRef as fs,useCallback as Se,useEffect as Wt,useImperativeHandle as gs,useRef as Te}from"react";import{observePageLifecycle as Ss}from"@urun-sh/core";import{jsx as ks}from"react/jsx-runtime";var hs=1e3,vs=1e3;function Bt(...e){console.debug("[audio]",...e)}var pt=fs(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:c,onUnlockChange:u,onAudioElement:m}=t,l=ge(),g=o??l,h=Te(null),w=Te(null),v=Te(null),d=Te(null),b=Te(null),f=Te(0),S=Te(c);S.current=c;let T=Te(u);T.current=u;let p=Se(y=>{v.current!==y&&(v.current=y,T.current?.(y))},[]),C=Se(()=>{if(typeof MediaStream>"u")return null;w.current||(w.current=new MediaStream);let y=h.current;return y&&y.srcObject!==w.current&&(y.srcObject=w.current),w.current},[]),P=Se(()=>{f.current=0,b.current!==null&&cancelAnimationFrame(b.current),b.current=null,d.current!==null&&clearTimeout(d.current),d.current=null},[]),U=Se(y=>{b.current=null,d.current=null,C(),N.current(`${y}:retry`)},[C]),A=Se(y=>{if(!h.current||b.current!==null||d.current!==null)return;let q=w.current;if(!(!!q&&q.getAudioTracks().some(L=>L.readyState==="live"))){P();return}let R=f.current;if(f.current=R+1,R===0&&typeof requestAnimationFrame=="function"){b.current=requestAnimationFrame(()=>U(y));return}d.current=setTimeout(()=>U(y),vs)},[P,U]),E=Se(y=>{let F=h.current;if(!F)return;let q=F.play();!q||typeof q.then!="function"||q.then(()=>{F.muted||p(!0),P()}).catch(z=>{let R=z instanceof Error?z.name:String(z);if(R==="AbortError"){Bt(`play() aborted (${y}); retrying on the ladder`),A(`${y}:abort`);return}if(R==="NotAllowedError"){Bt(`play() blocked pending a user gesture (${y})`),p(!1),A(`${y}:blocked`);return}Bt(`play() failed (${y})`,z)})},[p]),N=Te(()=>{});N.current=E;let x=Se(y=>{let F=C();if(F){for(let q of F.getAudioTracks())q!==y&&F.removeTrack(q);y&&!F.getAudioTracks().includes(y)&&F.addTrack(y),y&&E("track-attach"),S.current?.(y)}},[C,E]),D=Se(()=>{let y=h.current;y&&(C(),y.muted=!1,E("gesture"),He(),p(!0))},[C,E,p]);gs(r,()=>({unlock:D,get unlocked(){return v.current===!0},get element(){return h.current}}),[D]);let $=Se(()=>{A("pause-event")},[A]),K=Se(y=>{let F=h.current;F&&F!==y&&F.removeEventListener("pause",$),h.current=y,y&&(y.setAttribute("playsinline",""),y.setAttribute("webkit-playsinline",""),C(),y.addEventListener("pause",$)),m?.(y)},[C,m,$]),G=s!==void 0;return Wt(()=>{if(G){x(s??null);return}if(!g)return;let y=g.stream(n),F=()=>{let _=w.current;return _?_.getAudioTracks()[0]??null:null},q=_=>{if(_!==F()&&(x(_),_)){let W=()=>{F()===_&&x(null)};_.addEventListener("ended",W)}},z=y.track;z&&z.readyState==="live"&&q(z);let R=y.on("track",_=>{_&&_.readyState!=="live"||q(_)}),L=setInterval(()=>{let _=y.track;_&&_.readyState==="live"&&q(_)},hs);return()=>{R(),clearInterval(L)}},[g,n,G,s,x]),Wt(()=>Ss(()=>{He(),v.current===!0&&E("foreground")}),[E]),Wt(()=>()=>{d.current&&clearTimeout(d.current),b.current!==null&&cancelAnimationFrame(b.current),b.current=null},[]),ks("audio",{ref:K,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),ys=pt;import{forwardRef as bs,useCallback as _e,useEffect as jt,useImperativeHandle as Ts,useRef as de}from"react";import{observePageLifecycle as Cs,SessionFailedError as Rs,sessionFailureFromMediaError as Ps,sharedCaptureController as Es}from"@urun-sh/core";import{jsx as Us}from"react/jsx-runtime";var rn={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function mt(...e){console.debug("[voice]",...e)}function xs(e){return e instanceof Rs&&e.kind==="create-failed"&&(e.status.error?.code==="client_release"||e.status.error?.httpStatus===410)}var ft=bs(function(t,r){let{session:o,stream:n="audio",playback:s=!0,autoStart:i=!s,constraints:a=rn,connectTimeoutMs:c,attempts:u=3,retryDelayMs:m=1500,onActiveChange:l,onError:g,onMicStream:h,onTrack:w,onUnlockChange:v,capture:d}=t,b=ge(),f=o??b,S=de(null),T=de(null),p=de(null),C=de([]),P=de(!1),U=de(l);U.current=l;let A=de(g);A.current=g;let E=de(h);E.current=h;let N=_e(R=>{P.current!==R&&(P.current=R,U.current?.(R))},[]),x=_e(()=>{for(let R of C.current)R();C.current=[],p.current?.release(),p.current=null,T.current&&(T.current=null,E.current?.(null))},[]),D=_e(async()=>{let R=p.current;if(R){let O=await R.update(a);return T.current=R.stream,E.current?.(R.stream),O}let _=await(d??Es()).claim("audio",a);p.current=_,C.current=[_.onTrack((O,X)=>{T.current=X,E.current?.(X),P.current&&f?.stream(n).attach(O).catch(re=>mt("mic re-attach after one-capture re-acquire failed",re))}),_.onLost(O=>{p.current=null,C.current=[],T.current=null,E.current?.(null),N(!1),A.current?.(O)})],T.current=_.stream,E.current?.(_.stream);let W=_.track;if(!W)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return W},[d,a,f,n,N]),$=_e(async()=>{x(),N(!1),await f?.stream(n).detach().catch(()=>{})},[f,n,x,N]),K=_e(async()=>{if(!f)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");S.current?.unlock();let R;try{R=await D()}catch(W){x();let O=Ps(W,f.status);throw A.current?.(O),O}f.connect?.();let L;for(let W=1;W<=u;W++)try{await f.whenLive(c!==void 0?{timeout:c}:void 0),await f.stream(n).attach(R),N(!0);return}catch(O){if(L=O,mt(`start attempt ${W}/${u} failed`,O),xs(O))break;W<u&&await new Promise(X=>setTimeout(X,m))}x(),N(!1);let _=L instanceof Error?L:new Error(String(L??"voice start failed"));throw A.current?.(_),_},[f,n,c,u,m,D,x,N]);Ts(r,()=>({start:K,stop:$,unlock:()=>S.current?.unlock(),get active(){return P.current},get micStream(){return T.current},get audio(){return S.current}}),[K,$]);let G=de(K);G.current=K;let y=de(null),F=_e((R,L)=>{R.promise.then(()=>{L&&(x(),N(!1)),R.session.stream(R.streamName).detach().catch(()=>{})})},[x,N]);jt(()=>{if(!i||!f)return;let R=y.current;R&&(R.session!==f||R.streamName!==n)&&(R.disposeTimer&&clearTimeout(R.disposeTimer),F(R,!1),R=null),R?R.disposeTimer&&(clearTimeout(R.disposeTimer),R.disposeTimer=null):(R={session:f,streamName:n,promise:G.current().catch(()=>{}),refCount:0,disposeTimer:null},y.current=R),R.refCount+=1;let L=R;return()=>{L.refCount-=1,!(L.refCount>0)&&(L.disposeTimer=setTimeout(()=>{y.current===L&&(y.current=null),F(L,!0)},0))}},[i,f,n,F]);let q=de(!1),z=_e(async()=>{if(!f||!P.current||q.current)return;let R=T.current?.getAudioTracks()[0]??null;if(R&&R.readyState==="live"){try{await f.stream(n).attach(R)}catch(L){mt("foreground mic re-assert failed (will retry on next pass)",L)}return}q.current=!0;try{let L=await D();await f.stream(n).attach(L)}catch(L){let _=L instanceof Error?L:new Error(String(L));mt("foreground mic re-acquire failed",_),A.current?.(_)}finally{q.current=!1}},[f,n,D]);return jt(()=>{let R=()=>{z()};return f&&typeof f.onRecovery=="function"?f.onRecovery(R):Cs(R)},[f,z]),jt(()=>x,[x]),s?Us(pt,{ref:S,session:f,stream:n,onTrack:w,onUnlockChange:v}):null}),ws=ft;import{forwardRef as _s,useImperativeHandle as Ns,useRef as nn,useState as Is}from"react";import{useEffect as As,useState as Ms}from"react";var Kt={level:0,speaking:!1};function $t(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=Ms(Kt);return As(()=>{if(!e){i(Kt);return}let a=at();if(!a||typeof MediaStream>"u")return;let c;e instanceof MediaStream?c=e:(c=new MediaStream,c.addTrack(e));let u,m;try{u=a.createMediaStreamSource(c),m=a.createAnalyser(),m.fftSize=r,u.connect(m)}catch{return}let l=new Uint8Array(m.fftSize),h=setInterval(()=>{m.getByteTimeDomainData(l);let w=0;for(let d=0;d<l.length;d++){let b=(l[d]-128)/128;w+=b*b}let v=Math.sqrt(w/l.length);i(d=>{let b=v>n;return Math.abs(d.level-v)<.005&&d.speaking===b?d:{level:v,speaking:b}})},o);return()=>{clearInterval(h),u.disconnect(),i(Kt)}},[e,r,o,n]),s}import{Fragment as Vs,jsx as gt,jsxs as Fs}from"react/jsx-runtime";var Ls={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},Os={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},Ds=_s(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:c,onActiveChange:u,onError:m,onMicStream:l,capture:g}=t,h=ge(),w=o??h,v=nn(null),[d,b]=Is(null),f=nn(l);f.current=l;let{level:S,speaking:T}=$t(a?d:null);return Ns(r,()=>({start:()=>{let p=v.current;return p?p.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>v.current?.stop()??Promise.resolve(),get active(){return v.current?.active??!1},get micStream(){return v.current?.micStream??null}}),[]),Fs(Vs,{children:[gt(ft,{ref:v,session:w,stream:n,playback:!1,autoStart:i,...s!==void 0?{constraints:s}:{},...g!==void 0?{capture:g}:{},onActiveChange:u,onError:m,onMicStream:p=>{b(p),f.current?.(p)}}),a?gt("span",{className:c,style:Ls,"data-urun-mic":"","data-urun-mic-active":d?"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(S*100)/100,children:gt("span",{style:Os,children:gt("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(S*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});import{captureStillFromVideo as qs,sessionFailureFromMediaError as Hs,sharedCaptureController as Ws}from"@urun-sh/core";import{forwardRef as sn,useCallback as he,useEffect as Gt,useImperativeHandle as Bs,useRef as te,useState as ze}from"react";import{jsx as Ue,jsxs as on}from"react/jsx-runtime";var an={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Xt(...e){console.debug("[camera]",...e)}function js(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function Ks(){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 un=sn(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:c,autoStart:u=!0,mirror:m="auto",connectTimeoutMs:l,visible:g=!1,className:h,videoClassName:w,onActiveChange:v,onError:d,onStream:b,onTrack:f,children:S,capture:T,flipControl:p="auto",flipControlClassName:C,onDevices:P}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let U=i?"user":a?"environment":c??"environment",A=ge(),E=o??A,N=te(null),x=te(null),D=te(null),$=te([]),K=te(null),G=te(!1),y=te(!1),F=te(U),[q,z]=ze(U),[R,L]=ze(!1),[_,W]=ze(null),[O,X]=ze(!1),[re]=ze(js),Z=te(v);Z.current=v;let Q=te(d);Q.current=d;let me=te(b);me.current=b;let se=te(f);se.current=f;let Ce=te(P);Ce.current=P;let ne=he(H=>{G.current!==H&&(G.current=H,L(H),Z.current?.(H))},[]);Gt(()=>{if(!R){W(null);return}let H=!1,B=()=>{Ks().then(ue=>{H||(W(ue),ue&&Ce.current?.(ue))})};B();let ae=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof ae?.addEventListener=="function"?(ae.addEventListener("devicechange",B),()=>{H=!0,ae.removeEventListener?.("devicechange",B)}):()=>{H=!0}},[R]);let ee=he(H=>{let B=N.current;B&&(B.muted=!0,B.defaultMuted=!0,B.setAttribute("muted",""),B.setAttribute("playsinline",""),B.setAttribute("webkit-playsinline",""),B.srcObject=H,H&&B.play()?.catch?.(ae=>Xt("preview play() failed",ae)))},[]),Y=he(()=>{y.current=!1,K.current?.(),K.current=null;for(let H of $.current)H();$.current=[],D.current?.release(),D.current=null,x.current&&(x.current=null,me.current?.(null),se.current?.(null)),ee(null)},[ee]),k=he((H,B)=>{K.current?.(),x.current=B,ee(B),me.current?.(B);let ae=()=>{x.current===B&&(Xt("camera track ended (device removed or permission revoked)"),Y(),ne(!1))};H.addEventListener("ended",ae),K.current=()=>H.removeEventListener("ended",ae)},[ee,Y,ne]),V=he(async H=>{let B=n!==!1;if(B&&!E)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let ae={...an,...s,facingMode:H},ue;try{let le=D.current;if(le)ue=await le.update(ae);else{let Be=await(T??Ws()).claim("video",ae);if(D.current=Be,$.current=[Be.onTrack((je,Rn)=>{k(je,Rn),G.current&&(!B||!E||E.stream(n).attachVideo(je).then(()=>se.current?.(je)).catch(Pn=>Xt("camera re-publish after one-capture re-acquire failed",Pn)))}),Be.onLost(je=>{D.current=null,$.current=[],Y(),ne(!1),Q.current?.(je)})],!Be.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});ue=Be.track}}catch(le){let De=Hs(le,E?.status);throw Q.current?.(De),De}F.current=H,z(H),k(ue,D.current?.stream??new MediaStream([ue]));try{B&&E&&(E.connect?.(),await E.whenLive(l!==void 0?{timeout:l}:void 0),await E.stream(n).attachVideo(ue)),y.current=B?n:!1}catch(le){Y(),ne(!1);let De=le instanceof Error?le:new Error(String(le));throw Q.current?.(De),De}se.current?.(ue),ne(!0)},[E,n,s,l,T,k,Y,ne]),M=he(H=>V(H?.facingMode??F.current),[V]),j=he(async H=>{let B=y.current===n;G.current&&F.current===H&&B||await V(H)},[V,n]),J=he(()=>V(F.current==="environment"?"user":"environment"),[V]),ie=he(async()=>{Y(),ne(!1),n!==!1&&await E?.stream(n).detachVideo().catch(()=>{})},[E,n,Y,ne]),I=he(async H=>{let B=N.current;if(!B)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await qs(B,H)},[]);Bs(r,()=>({start:M,stop:ie,flip:J,setFacingMode:j,capturePhoto:I,get active(){return G.current},get facingMode(){return F.current},get stream(){return x.current},get element(){return N.current}}),[M,ie,J,j,I]);let ve=te(j);if(ve.current=j,Gt(()=>{u&&(n!==!1&&!E||ve.current(U).catch(()=>{}))},[u,E,U,n]),Gt(()=>Y,[Y]),!g)return null;let Oe=m==="auto"?q==="user":m,ye=R&&(p===!0||p==="auto"&&re&&(_?.length??0)>1),ke=()=>{O||(X(!0),J().catch(()=>{}).finally(()=>X(!1)))};return on("div",{className:h,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":q,children:[Ue("video",{ref:N,className:w,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Oe?{transform:"scaleX(-1)"}:{}}}),ye?Ue("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:ke,disabled:O,className:C,style:C?{opacity:O?.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:O?.6:1},children:on("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:[Ue("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),Ue("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),Ue("path",{d:"M14.5 10.5v1.6h-1.6"}),Ue("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),Ue("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,S]})}),$s=sn(function({preview:t=!0,...r},o){return Ue(un,{ref:o,...r,visible:t,autoStart:!1})});import{cameraCaptureAvailable as Gs,normalizeReferenceImage as Xs,referenceImageErrorMessage as zs}from"@urun-sh/core";import{useCallback as Je,useEffect as Js,useRef as zt,useState as Ye}from"react";function Ys(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=Ye(null),[a,c]=Ye(null),[u,m]=Ye(!1),[l,g]=Ye(null),[h]=Ye(Gs),w=zt(n);w.current=n;let v=zt(null),d=zt(0),b=Je(C=>{v.current&&URL.revokeObjectURL(v.current),v.current=C?URL.createObjectURL(new Blob([C.bytes],{type:C.type})):null,c(v.current),i(C),w.current?.(C)},[]);Js(()=>()=>{d.current++,v.current&&URL.revokeObjectURL(v.current),v.current=null},[]);let f=Je(async C=>{let P=++d.current;m(!0),g(null);try{let U=await C();if(d.current!==P)return;b(U)}catch(U){if(d.current!==P)return;g(zs(U))}finally{d.current===P&&m(!1)}},[b]),S=Je(C=>f(()=>Xs(C,{maxSize:t,type:r,quality:o,source:"file"})),[f,t,r,o]),T=Je(C=>f(()=>C.capturePhoto({maxSize:t,type:r,quality:o})),[f,t,r,o]),p=Je(()=>{d.current++,g(null),m(!1),b(null)},[b]);return{reference:s,previewUrl:a,pick:S,capture:T,clear:p,busy:u,error:l,cameraAvailable:h}}import{useEffect as Zs,useState as Qs}from"react";function ei(e,t){let[r,o]=Qs(null);return Zs(()=>{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 ii}from"react";import{useEffect as oi,useMemo as si}from"react";import{createStore as ti}from"zustand/vanilla";import{useStore as ri}from"zustand";var ni=()=>{};function Jt(e,t={}){let r=u=>{e?.set(u)},o=()=>e?e.get()??{}:{},n=ti(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let u of s)u();s=null}},a=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",u=>n.setState({doc:u})),e.onSynced(()=>n.setState({synced:!0}))]),i):ni,c=(u=>ri(n,u));return Object.assign(c,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),c}function Ze(e,t){let r=si(()=>Jt(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return oi(()=>r.bind(),[r]),r}function ai(e,t,r){let n=Ze(e,t)(r??(a=>a)),s=ii(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 ui,useState as ci}from"react";function li(e){let[t,r]=ci(null);return ui(()=>{if(r(null),!!e)return e.on("generationTick",r)},[e]),t}import{useEffect as di,useState as pi}from"react";var Ne=200;function Ae(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function Qe(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Yt(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 Zt(e,t,r={}){let o=r.cap??200,[n,s]=pi([]);return di(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let c=await a.next();if(!i||c.done)break;s(u=>Ae(u,{at:Date.now(),payload:c.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}import{jsx as St,jsxs as et}from"react/jsx-runtime";function mi({session:e,name:t,cap:r,className:o}){let n=Zt(e,t,{cap:r});return et("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[et("div",{className:"urun-stream-tail-meta",children:[St("code",{children:t}),et("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),St("div",{className:"urun-stream-tail-log",children:n.length===0?et("span",{className:"urun-stream-tail-empty",children:["Waiting for ",St("code",{children:t})," messages\u2026"]}):n.map((s,i)=>et("div",{className:"urun-stream-tail-line",children:[St("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",Qe(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as fi,useState as cn}from"react";import{jsx as Ie,jsxs as ht}from"react/jsx-runtime";function vt({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=cn(""),[i,a]=cn(null),c=fi(()=>{let u=Yt(n);if(!u.ok){a(u.error);return}a(null),o(u.value,n.trim()),s("")},[n,o]);return ht("div",{className:"urun-doc-patch",children:[Ie("textarea",{className:"urun-doc-patch-input",value:n,onChange:u=>s(u.target.value),placeholder:e,rows:3}),ht("div",{className:"urun-doc-patch-actions",children:[Ie("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:c,children:t}),i?Ie("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function gi({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=Ze(e,t),i=s(u=>u.doc),a=s(u=>u.synced),c=s(u=>u.set);return ht("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[ht("div",{className:"urun-doc-panel-meta",children:[Ie("code",{children:t}),Ie("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),Ie("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?Ie(vt,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:u=>c(u)}):null]})}import{useEffect as Si,useState as hi}from"react";import{jsx as tt,jsxs as dn}from"react/jsx-runtime";function ln(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function vi({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=hi([]);return Si(()=>(s([]),e?e.doc(t).on("change",a=>{s(c=>Ae(c,{at:Date.now(),direction:"in",text:ln(Qe(a))},r))}):void 0),[e,t,r]),dn("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[tt(vt,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(c=>Ae(c,{at:Date.now(),direction:"out",text:ln(a)},r))}}),tt("div",{className:"urun-control-sender-log",children:n.length===0?tt("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>dn("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[tt("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",tt("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}import{useEffect as yi,useState as ki}from"react";import{jsx as yt,jsxs as Ti}from"react/jsx-runtime";function bi({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=ki([]),a=t.join(","),c=r.join(",");return yi(()=>{if(i([]),!e)return;let u=(l,g)=>i(h=>Ae(h,{at:Date.now(),kind:l,text:g},o)),m=[];m.push(e.onPhase(l=>u("phase",`phase \u2192 ${l.name}`)));for(let l of t){let g=e.stream(l);m.push(g.on("track",h=>u("track",`${l}: ${h?"track arrived":"track ended"}`)))}for(let l of r){let g=e.doc(l);m.push(g.on("change",()=>u("doc",`${l} changed`)))}return()=>m.forEach(l=>l())},[e,a,c,o]),yt("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?yt("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((u,m)=>Ti("div",{className:"urun-event-spine-line","data-kind":u.kind,children:[yt("span",{className:"urun-event-spine-kind",children:u.kind})," ",yt("span",{className:"urun-event-spine-time",children:new Date(u.at).toLocaleTimeString()})," ",u.text]},`${u.at}-${m}`))})}import{describeSessionPhase as Di,isWakingPhase as Vi}from"@urun-sh/core";import{useEffect as Ci,useState as Ri}from"react";function pe(e){let[t,r]=Ri(e?.phase??null);return Ci(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}import{describeSessionPhase as Ui}from"@urun-sh/core";import{useEffect as Pi,useRef as Ei,useState as xi}from"react";import{isWakingPhase as wi}from"@urun-sh/core";function Qt(e){let t=pe(e),r=wi(t?.name),o=Ei(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]=xi(s);return Pi(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let c=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(c)},[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 Ai,jsx as pn,jsxs as mn}from"react/jsx-runtime";function er({session:e,render:t,className:r}){let o=Qt(e);return!o.waking||!o.phase?null:pn("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):mn(Ai,{children:[pn("span",{className:"urun-session-waking-label",children:Ui(o.phase)})," ",mn("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}import{useEffect as Ni,useState as Ii}from"react";import{useEffect as fn,useRef as Mi,useState as gn}from"react";var _i={event:null,elapsedMs:0};function tr(e,t){let[r,o]=gn(null),n=Mi(0);fn(()=>{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]=gn(0);return fn(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,c=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(c());let u=setInterval(()=>i(c()),1e3);return()=>clearInterval(u)},[r]),r?{event:r,elapsedMs:s}:_i}import{jsx as Sn,jsxs as hn}from"react/jsx-runtime";var Li={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 Oi(e){let[t,r]=Ii(!1);return Ni(()=>{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 rr({session:e,stream:t,videoElement:r,render:o,className:n}){let s=tr(e,t),i=Oi(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let c=a.state;return Sn("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":c,role:"status","aria-live":"polite",children:o?o(s):hn("div",{className:"urun-activation-overlay-card",children:[Sn("span",{className:"urun-activation-overlay-copy",children:a.hint??Li[c]})," ",hn("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}import{jsx as Le,jsxs as nr}from"react/jsx-runtime";var Fi={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",waiting_for_capacity:"waiting for GPU capacity",connecting:"connecting",live:"live",paused:"paused",error:"error",unknown:"unrecognized state"};function qi({session:e,className:t}){let r=pe(e),o=r?.name??"idle",n=(r?.name==="queued"||r?.name==="waiting_for_capacity")&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:r?.name==="error"&&r.error?r.error.reason:r?.reason?r.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return nr("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[Le("span",{className:"urun-session-status-dot","data-phase":o}),Le("span",{className:"urun-session-status-label",children:Fi[o]}),n?Le("span",{className:"urun-session-status-detail",children:n}):null]})}function Hi({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=pe(e);if(s?.name==="live")return nr("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,Le(rr,{session:e})]});let i=r?r(s):Le("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s&&Vi(s.name)?Le(er,{session:e}):s&&s.name!=="idle"?Di(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="paused");return nr("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?Le("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}import{useEffect as Wi,useState as Bi}from"react";import{jsx as $i}from"react/jsx-runtime";function vn(e){return pe(e)?.endsAt??null}function ji(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 Ki({session:e,urgentMs:t=6e4,className:r}){let n=vn(e)?.getTime()??null,[s,i]=Bi(()=>n===null?null:Math.max(0,n-Date.now()));if(Wi(()=>{if(n===null){i(null);return}let c=()=>i(Math.max(0,n-Date.now()));c();let u=setInterval(c,1e3);return()=>clearInterval(u)},[n]),s===null)return null;let a=ji(s);return $i("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{describeSessionPhase as Gi}from"@urun-sh/core";import{jsx as or,jsxs as Ji}from"react/jsx-runtime";var Xi=new Set(["paused","error"]);function yn({session:e,onResume:t,onNewSession:r,children:o,className:n}){let s=pe(e);if(!s||!Xi.has(s.name))return null;let i=o?o(s):or("span",{className:"urun-session-paused-copy",children:Gi(s)});return Ji("div",{className:["urun-session-paused",n].filter(Boolean).join(" "),"data-phase":s.name,children:[i,t?or("button",{type:"button",className:"urun-session-paused-resume",onClick:t,children:"Resume"}):null,r?or("button",{type:"button",className:"urun-session-paused-new",onClick:r,children:"New session"}):null]})}var zi=yn;import{useEffect as kn,useMemo as Yi,useState as bn}from"react";import{jsx as kt,jsxs as ea}from"react/jsx-runtime";function sr(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 Tn(e){let t=Yi(()=>e?e.doc("control"):null,[e]),[r,o]=bn(()=>t?sr(t.get("idle")):null);return kn(()=>{if(!t){o(null);return}return o(sr(t.get("idle"))),t.on("change",()=>o(sr(t.get("idle"))))},[t]),r}function Zi(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function Qi({session:e,onStillHere:t,className:r}){let o=Tn(e),n=o?.deadlineEpochS??null,[s,i]=bn(null);if(kn(()=>{if(n===null){i(null);return}let c=()=>i(Math.max(0,n-Date.now()/1e3));c();let u=setInterval(c,1e3);return()=>clearInterval(u)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return kt("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:ea("div",{className:"urun-idle-warning-card",children:[kt("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),kt("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${Zi(s)} due to inactivity.`:"This session will end soon due to inactivity."}),kt("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}import{useCallback as Cn,useEffect as ta,useRef as ra,useState as ir}from"react";function na(e){return e?e.activated&&!e.exempt&&e.available_credits<=0:!1}function ar(e,t={}){let{refreshIntervalMs:r}=t,[o,n]=ir(null),[s,i]=ir(e!==null),[a,c]=ir(null),u=ra(e),m=Cn(async g=>{i(!0);try{let h=await g.getBalance();if(u.current!==g)return;n(h),c(null)}catch(h){if(u.current!==g)return;c(h instanceof Error?h:new Error(String(h)))}finally{u.current===g&&i(!1)}},[]);ta(()=>{if(u.current=e,n(null),c(null),!e){i(!1);return}if(m(e),r!==void 0&&r>0){let g=setInterval(()=>{m(e)},r);return()=>{clearInterval(g),u.current===e&&(u.current=null)}}return()=>{u.current===e&&(u.current=null)}},[e,r,m]);let l=Cn(async()=>{let g=u.current;g&&await m(g)},[m]);return{balance:o,isExhausted:na(o),loading:s,error:a,refresh:l}}import{jsx as ur}from"react/jsx-runtime";function oa({client:e,children:t,fallback:r,className:o}){let{balance:n,isExhausted:s}=ar(e),i=["urun-credits-gate",o].filter(Boolean).join(" ");if(!s)return ur("div",{className:i,children:t});let a=r?r(n):ur("span",{className:"urun-credits-gate-fallback",children:"Out of credits \u2014 add credits to keep running sessions."});return ur("div",{className:i,children:a})}import{CreditsClient as Wd,createCreditsClient as Bd,CreditsError as jd,CreditsUnauthorizedError as Kd}from"@urun-sh/core";import{useContext as sa,useEffect as ia,useState as aa}from"react";import{prewake as ua}from"@urun-sh/core";function ca(e){let t=sa(Re),[r,o]=aa(null),n=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,c=t?.orgId,u=t?.jwt,m=t?.getAccessToken,l=t?.authProvider;return ia(()=>{if(!a||!c||!n||!s)return;let g=!1,h=()=>{ua({baseUrl:a,app:n,functionName:s,orgId:c,jwt:u,getAccessToken:m,authProvider:l}).then(v=>{g||o(v)}).catch(()=>{})};h();let w=setInterval(h,Math.max(1,i)*1e3);return()=>{g=!0,clearInterval(w)}},[n,s,i,a,c,u,m,l]),r}import{useEffect as la,useState as da}from"react";function pa(e){let[t,r]=da(null);return la(()=>{if(r(null),!!e?.onStats)return e.onStats(r)},[e]),t}import{describeSessionPhase as Qd,isWakingPhase as ep}from"@urun-sh/core";export{pt as Audio,un as Camera,Vo as ComponentRenderer,Wd as CreditsClient,jd as CreditsError,Kd as CreditsUnauthorizedError,an as DEFAULT_CAMERA_CONSTRAINTS,Ne as DEFAULT_LOG_CAP,Zr as DEFAULT_SMOOTH_CHARS_PER_FRAME,Qr as DEFAULT_SMOOTH_THRESHOLD,rn as DEFAULT_VOICE_CONSTRAINTS,vt as DocPatchForm,ps as Image,Yo as ImageFrame,Jo as ImageFrameSchema,es as MetricsPanel,Qo as MetricsPanelSchema,Ds as Mic,In as OPERATOR_CHORD_LABEL,Nn as OPERATOR_TOKEN_STORAGE_KEY,Ho as ProgressCard,qo as ProgressCardSchema,Lo as ReprojectedVideo,To as Session,jo as StatusBadge,Wo as StatusBadgeSchema,cs as Text,Xo as TextStream,Xe as TextStreamError,Go as TextStreamSchema,rr as UrunActivationOverlay,ys as UrunAudio,bt as UrunAuthProvider,$s as UrunCamera,vi as UrunControlSender,oa as UrunCreditsGate,gi as UrunDocPanel,Ke as UrunErrorBoundary,bi as UrunEventSpine,Qi as UrunIdleWarning,En as UrunJwtProvider,Bn as UrunProvider,Ki as UrunSessionClock,zi as UrunSessionEnded,Hi as UrunSessionGate,yn as UrunSessionPaused,qi as UrunSessionStatus,er as UrunSessionWaking,mi as UrunStreamTail,ws as UrunVoice,We as Video,ft as Voice,rt as authMode,Bd as createCreditsClient,Jt as createDocStore,Qd as describeSessionPhase,Qe as formatPayload,at as getUrunAudioContext,ep as isWakingPhase,Yt as parseJsonObject,Ae as pushCapped,mr as readOperatorToken,Do as registerComponent,He as resumeUrunAudioContext,Yr as textDelta,fe as urunPublicEnv,tr as useActivation,Yn as useApp,fo as useChat,co as useCompletion,Rt as useConfirmOnLeave,ar as useCredits,Ze as useDocStore,li as useGenerationTick,Xr as useImageFrame,yo as useInputPresence,zr as useMetricsPanel,Ct as useOperatorOverride,Hr as useProgressCard,Ys as useReferenceImage,so as useRequest,Co as useSession,to as useSessionDirectory,ai as useSessionDoc,vn as useSessionEndsAt,Tn as useSessionIdle,pe as useSessionPhase,pa as useSessionStats,ei as useSessionTrack,Qt as useSessionWake,Br as useStatusBadge,Zt as useStreamMessages,tn as useText,us as useTextMeter,$r as useTextStream,$t as useUrunAudioLevel,Tt as useUrunAuth,ca as useUrunPrewake,An as usesWorkOSAuth};
2
+ import{a as bt,b as wn,c as Tt}from"./chunk-WF2OBDSX.mjs";import{useCallback as fr,useEffect as qn,useMemo as kr,useRef as Sr,useState as Pt}from"react";import{computeBackoffDelay as Hn}from"@urun-sh/core/internal";import{Component as Un}from"react";import{jsx as cr,jsxs as An}from"react/jsx-runtime";var Ke=class extends Un{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||An("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:[cr("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),cr("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as Mn}from"react";var Ce=Mn(null);function be(e){return e&&e.trim()?e.trim():void 0}function fe(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return be(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return be(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return be(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return be(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return be(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"NEXT_PUBLIC_URUN_TOKEN_URL":return be(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_TOKEN_URL:void 0);case"NEXT_PUBLIC_URUN_EVENTS_URL":return be(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_EVENTS_URL:void 0);case"VERCEL_ENV":return be(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return be(typeof process<"u"?process.env?.[e]:void 0)}}function rt(){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 _n(){return rt()==="workos"}import{useEffect as Nn,useRef as In}from"react";var Ln="urun.operator_token",dr=null,lr="op",On="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function pr(){return typeof window<"u"}function mr(){return dr}function Dn(){if(!pr())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(lr);if(!r)return null;dr=r,t.delete(lr);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function Vn(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function Rt(e){let t=In(e);t.current=e,Nn(()=>{if(!pr())return;Dn();let r=o=>{if(!Vn(o))return;let n=mr();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}import{useEffect as Fn}from"react";function Ct(e=!0){Fn(()=>{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 Ve,jsxs as Xn}from"react/jsx-runtime";var Wn="/api/urun-token",Bn=1e4;function jn(e){let t=e.split(".")[1];if(!t)return null;try{let r=t.replace(/-/g,"+").replace(/_/g,"/"),o=r.padEnd(r.length+(4-r.length%4)%4,"="),s=JSON.parse(atob(o)).exp;return typeof s=="number"&&Number.isFinite(s)?s*1e3:null}catch{return null}}var gr=3,Kn=new Set([502,503,504]);function hr(e){return new Promise(t=>setTimeout(t,Hn(e)))}async function vr(e,t){for(let r=0;;r++){let o;try{o=await fetch(e,{method:"POST",signal:t})}catch(a){if(t?.aborted||r>=gr-1)throw a;await hr(r);continue}if(!o.ok){let a=new Error(`[urun] token endpoint ${e} answered ${o.status}`);if(!Kn.has(o.status)||r>=gr-1)throw a;await hr(r);continue}let n=await o.json(),s=typeof n.token=="string"?n.token:"",i=typeof n.orgId=="string"?n.orgId:"";if(!s||!i)throw new Error(`[urun] token endpoint ${e} returned no { token, orgId } \u2014 is it createTokenRoute() from @urun-sh/next?`);return{token:s,orgId:i,gatewayUrl:typeof n.gatewayUrl=="string"?n.gatewayUrl:void 0}}}function yr(e,t){if(t===void 0)return;let r;try{r=new URL(t).hostname}catch{throw new Error(`[urun] ${e} is not a valid URL: ${t}`)}if(!(r==="127.0.0.1"||r==="localhost"||r==="::1"||r==="[::1]"))throw new Error(`[urun] ${e} must point at a loopback endpoint \u2014 the CLI launcher (urun dev/demo) is this variable's only legitimate producer and it must never be set on a deployed site. Refusing ${t}.`);return t}function Et(e){let t=e===void 0?void 0:JSON.stringify(e);return kr(()=>e,[t])}function $n(e,t){return typeof e=="function"?e(t):e!==void 0?e:Xn("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[Ve("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),Ve("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function Gn({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:c,releaseOnLeave:u,allowWebTransport:m,allowWebRtcFallback:l,audioPlayout:S,videoPlayout:h,sessionStats:w,confirmOnLeave:v=!1,fallback:d,errorFallback:b,children:f}){let g=n===void 0&&t===void 0;if(!g&&(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(!g&&(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 T=r??o;if(g&&(typeof T!="string"||T.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);Ct(v);let[p,R]=Pt(),[P,U]=Pt(null),A=Sr(void 0),E=Sr(null),[N,x]=Pt(null);Rt(M=>x({jwt:M}));let D=Tt(),$=fe("NEXT_PUBLIC_SESSION_TOKEN")??fe("NEXT_PUBLIC_URUN_JWT"),K=rt(),G=N!==null,y=K==="workos"&&!n&&!G&&!g,F=n??(K==="jwt"?$:void 0)??p?.token,q=G?N.jwt:F,z=s??fe("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),C=y&&!q&&!D?.getAccessToken,L=t??p?.orgId,_=e??p?.gatewayUrl,W=g&&p===void 0,O=g&&p!==void 0&&!_?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,X=C?new Error('[urun] <UrunProvider> resolved authMode()="workos" but no auth context is mounted: there is no <UrunWorkOSProvider> (or <UrunAuthProvider>) ancestor supplying getAccessToken, and no jwt prop was passed, so no session token can be obtained. Note NEXT_PUBLIC_SESSION_TOKEN and NEXT_PUBLIC_URUN_JWT are IGNORED in workos mode, so setting them will not help. Either mount UrunWorkOSProvider from @urun-sh/react/next-workos, or select jwt mode with NEXT_PUBLIC_AUTH_MODE=jwt (or NEXT_PUBLIC_AUTH_ENABLED=false) and supply a token.'):null,re=P??O??X,Z=yr("NEXT_PUBLIC_URUN_TOKEN_URL",fe("NEXT_PUBLIC_URUN_TOKEN_URL"))??c??Wn,Q=yr("NEXT_PUBLIC_URUN_EVENTS_URL",fe("NEXT_PUBLIC_URUN_EVENTS_URL"))??i,me=fr(async M=>{if(!M?.forceRefresh){let J=A.current;if(!J)return J;let ie=jn(J);if(ie===null||ie-Date.now()>Bn)return J}return(await(E.current??(E.current=(async()=>{try{let J=await vr(Z);return A.current=J.token,R(J),J}finally{E.current=null}})()))).token},[Z]),se=fr(async()=>q,[q]),Re=typeof q=="string"&&q.trim().length>0,ne=y?D?.getAccessToken:g&&!G?me:Re?se:void 0,ee=Et(S),Y=Et(h),k=Et(w),V=kr(()=>({appId:T,baseUrl:_??"",orgId:L??"",jwt:q,getAccessToken:y?D?.getAccessToken:g&&!G?me:void 0,authProvider:z,eventsUrl:Q,sessionKey:a,releaseOnLeave:u,allowWebTransport:m,allowWebRtcFallback:l,audioPlayout:ee,videoPlayout:Y,sessionStats:k,priority:G?"preempt":void 0}),[T,D,_,z,q,Q,L,a,u,m,l,ee,Y,k,y,G,g,me]);return qn(()=>{if(!g)return;let M=new AbortController;return U(null),(async()=>{try{let j=await vr(Z,M.signal);A.current=j.token,R(j)}catch(j){if(M.signal.aborted)return;U(j instanceof Error?j:new Error(String(j)))}})(),()=>M.abort()},[g,Z]),Ve(Ke,{fallback:d,children:re?$n(b,re):W?Ve("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Ve(Ce.Provider,{value:V,children:ne?Ve(bt,{getAccessToken:ne,children:f}):f})})}import{useContext as zn,useEffect as Jn,useMemo as br,useReducer as Yn,useRef as xt}from"react";import{App as Zn}from"@urun-sh/core";function Tr(e){return e?.sessionId?{sessionId:e.sessionId}:e?.label?{label:e.label}:{}}function Qn(e,t,r){let o=Tr(r),n=r?.activity??"auto";return`${e}:${JSON.stringify(t??{})}:${o.sessionId??""}:${o.label??""}:${n}`}function eo(e,t,r,o){let n=Tr(o);return JSON.stringify({sessionId:n.sessionId,label:n.label,appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,activity:o?.activity??"auto",fnName:t,args:r??{}})}var Me=new Map;var wt=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()})}onConnectionState(t){return this._doc.onConnectionState?this._doc.onConnectionState(r=>{t(r),this._notify()}):(t({connected:!0,consecutiveFailures:0,lastCloseCode:null,lastCloseReason:null}),()=>{})}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()}},At=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"){let c=a.error,u=c?.reason??`session ${this._session.id} entered the error phase`;n({level:"error",kind:"phase-error",message:u,detail:{sessionId:this._session.id,code:c?.code,kind:c?.kind,httpStatus:c?.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 region(){return this._session.region}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}onStats(t){return this._session.onStats?this._session.onStats(t):()=>{}}watchDownlinkStall(t={}){return this._session.watchDownlinkStall?this._session.watchDownlinkStall(t):()=>{}}on(t,r){return this._session.on(t,r)}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()}activity(){this._session.activity?this._session.activity():this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new wt(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}async cancel(){let t=await this._session.cancel();return this._disposeHandle(),t}detach(){this._disposeHandle(),this._session.detach()}disconnect(){this.detach()}_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 to(){let e=zn(Ce);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=Yn(i=>i+1,0),r=xt(new Map),o=xt(new Map),n=xt(null),s=br(()=>Zn(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,allowWebTransport:e.allowWebTransport,allowWebRtcFallback:e.allowWebRtcFallback,priority:e.priority,audioPlayout:e.audioPlayout,videoPlayout:e.videoPlayout,sessionStats:e.sessionStats}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.allowWebTransport,e.allowWebRtcFallback,e.priority,e.audioPlayout,e.videoPlayout,e.sessionStats]);return Jn(()=>{let i=n.current;if(i){n.current=null;for(let[a,c]of i){let u=Me.get(a);u===c&&o.current.get(a)===c&&(u.disposeTimer&&(clearTimeout(u.disposeTimer),u.disposeTimer=null),u.handle.addNotifier(t),u.refCount+=1)}}return()=>{let a=new Map;for(let[c,u]of o.current){let m=Me.get(c);m===u&&(m.handle.removeNotifier(t),m.refCount=Math.max(0,m.refCount-1),a.set(c,m),m.refCount===0&&(m.disposeTimer=setTimeout(()=>{let l=Me.get(c);!l||l.refCount!==0||(Me.delete(c),l.handle.disconnect())},0)))}n.current=a}},[]),br(()=>{let i=new Map;return new Proxy({},{get(a,c){if(typeof c!="string")return;let u=i.get(c);if(u)return u;let m=(l,S)=>{let h=Qn(c,l,S),w=r.current.get(h);if(w&&!w.disposed)return w;let v=eo(e,c,l,S),d=Me.get(v);return d?.handle.disposed&&(d.disposeTimer&&clearTimeout(d.disposeTimer),Me.delete(v),o.current.get(v)===d&&o.current.delete(v),d=void 0),d?d.disposeTimer&&(clearTimeout(d.disposeTimer),d.disposeTimer=null):(d={handle:new At(s[c](l,S),t,e.eventsUrl),refCount:0,disposeTimer:null},Me.set(v,d)),o.current.get(v)!==d&&(o.current.set(v,d),d.handle.addNotifier(t),d.refCount+=1),r.current.set(h,d.handle),d.handle};return i.set(c,m),m}})},[e,s])}import{useContext as ro,useMemo as no}from"react";import{sessionDirectory as oo}from"@urun-sh/core";function so(){let e=ro(Ce);if(!e)throw new Error("useSessionDirectory must be used within <UrunProvider>");if(!e.appId)throw new Error('useSessionDirectory requires <UrunProvider appId="...">');let{appId:t,baseUrl:r,orgId:o,jwt:n,getAccessToken:s,authProvider:i}=e;return no(()=>oo(t,{baseUrl:r,orgId:o,jwt:n,getAccessToken:s,authProvider:i}),[t,r,o,n,s,i])}import{useCallback as Mt,useEffect as io,useMemo as ao,useRef as nt,useState as _t}from"react";function Fe(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 uo(e){return e instanceof Error?e:new Error(String(e))}function co(e,t){let r=ao(()=>Fe(e),[e]),[o,n]=_t(void 0),[s,i]=_t(null),[a,c]=_t(!1),u=nt(t);u.current=t;let m=nt(0),l=nt(null),S=nt(!0);io(()=>(S.current=!0,()=>{S.current=!1,l.current?.abort()}),[]);let h=Mt(async d=>{l.current?.abort();let b=new AbortController;l.current=b;let f=++m.current,g=()=>S.current&&m.current===f;g()&&(c(!0),i(null));try{let T=await r.request(d,{...u.current,signal:b.signal});return g()&&(n(T),c(!1),u.current?.onSuccess?.(T)),T}catch(T){let p=uo(T);throw g()&&(i(p),c(!1),u.current?.onError?.(p)),p}},[r]),w=Mt(d=>{h(d).catch(()=>{})},[h]),v=Mt(()=>{m.current++,l.current?.abort(),l.current=null,n(void 0),i(null),c(!1)},[]);return{mutate:w,mutateAsync:h,data:o,error:s,isPending:a,reset:v}}import{useCallback as Rr,useEffect as lo,useMemo as po,useRef as ot,useState as Nt}from"react";function Cr(e){return e instanceof Error?e:new Error(String(e))}var mo=e=>typeof e=="string"?e:String(e);function fo(e,t){let r=po(()=>Fe(e),[e]),[o,n]=Nt(""),[s,i]=Nt(!1),[a,c]=Nt(null),u=ot(t);u.current=t;let m=ot(0),l=ot(null),S=ot(!0);lo(()=>(S.current=!0,()=>{S.current=!1,l.current?.cancel(),l.current=null}),[]);let h=Rr(()=>{m.current++,l.current?.cancel(),l.current=null,S.current&&i(!1)},[]),w=Rr(async v=>{l.current?.cancel();let d=++m.current,b=()=>S.current&&m.current===d,f=u.current,g=f?.parseChunk??mo,T=f?.buildPayload??(x=>({prompt:x}));b()&&(n(""),c(null),i(!0));let{parseChunk:p,buildPayload:R,onFinish:P,onError:U,...A}=f??{},E="",N;try{N=r.requestStream(T(v),A),l.current=N}catch(x){let D=Cr(x);b()&&(c(D),i(!1),f?.onError?.(D));return}try{for await(let x of N){if(m.current!==d)break;E+=g(x),b()&&n(E)}b()&&(i(!1),f?.onFinish?.(E))}catch(x){let D=Cr(x);b()&&(c(D),i(!1),f?.onError?.(D))}finally{l.current===N&&(l.current=null)}},[r]);return{completion:o,complete:w,stop:h,isStreaming:s,error:a}}import{useCallback as Pr,useEffect as So,useMemo as go,useRef as qe,useState as st}from"react";function Er(e){return e instanceof Error?e:new Error(String(e))}var ho=e=>typeof e=="string"?e:String(e),xr=0;function It(e){return xr+=1,`${e}-${xr}`}function vo(e,t){let r=go(()=>Fe(e),[e]),[o,n]=st(()=>(t?.initialMessages??[]).map(g=>({id:g.id??It("msg"),role:g.role,content:g.content}))),[s,i]=st(""),[a,c]=st(!1),[u,m]=st(null),l=qe(t);l.current=t;let S=qe(o);S.current=o;let h=qe(s);h.current=s;let w=qe(0),v=qe(null),d=qe(!0);So(()=>(d.current=!0,()=>{d.current=!1,v.current?.cancel(),v.current=null}),[]);let b=Pr(()=>{w.current++,v.current?.cancel(),v.current=null,d.current&&c(!1)},[]),f=Pr(async g=>{let T=g===void 0,p=(T?h.current:g)??"";if(!p.trim())return;v.current?.cancel();let P=++w.current,U=()=>d.current&&w.current===P,A=l.current,E=A?.parseChunk??ho,N={id:It("msg"),role:"user",content:p},x={id:It("msg"),role:"assistant",content:""},D=[...S.current,N].map(O=>({role:O.role,content:O.content})),$=[...S.current,N,x];S.current=$,n($),T&&i(""),m(null),c(!0);let K=A?.buildPayload??(O=>({messages:O})),{initialMessages:G,parseChunk:y,buildPayload:F,onFinish:q,onError:z,...C}=A??{},L=O=>{n(X=>X.map(re=>re.id===x.id?{...re,content:O}:re))},_="",W;try{W=r.requestStream(K(D),C),v.current=W}catch(O){let X=Er(O);U()&&(m(X),c(!1),A?.onError?.(X));return}try{for await(let O of W){if(w.current!==P)break;_+=E(O),U()&&L(_)}U()&&(c(!1),A?.onFinish?.({...x,content:_}))}catch(O){let X=Er(O);U()&&(m(X),c(!1),A?.onError?.(X))}finally{v.current===W&&(v.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:f,stop:b,isStreaming:a,error:u}}import{useCallback as Pe,useEffect as wr,useMemo as yo,useRef as Ur,useState as Ar}from"react";import{createInputPresencePublisher as ko,INPUT_PRESENCE_DEFAULT_HZ as bo,INPUT_PRESENCE_FIELD as To}from"@urun-sh/core";var Lt=[];function Ro(e,t={}){let{field:r=To,hz:o=bo}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=yo(()=>s?ko({awareness:{setLocalStateField:(p,R)=>s.setField(p,R)},field:r,hz:o}):null,[s,r,o]),a=Ur(null);a.current=i;let[c,u]=Ar(!1),[m,l]=Ar(Lt),S=Ur(!1);wr(()=>{if(i)return()=>i.dispose()},[i]);let h=Pe(()=>{let p=a.current;l(p?p.heldKeys():Lt)},[]),w=Pe(()=>{a.current?.clear(),l(Lt)},[]);wr(()=>{if(!n)return;let p=()=>!!n.pointerLockElement,R=()=>{if(p()){S.current=!1,u(!0);return}S.current||(u(!1),w())},P=x=>{p()&&(a.current?.keyDown(x.key),h())},U=x=>{a.current?.keyUp(x.key),h()},A=x=>{p()&&a.current?.movePointer(x.movementX,x.movementY)},E=x=>{p()&&a.current?.setButtons(x.buttons)},N=()=>{w()};return n.addEventListener("pointerlockchange",R),n.addEventListener("keydown",P),n.addEventListener("keyup",U),n.addEventListener("mousemove",A),n.addEventListener("mousedown",E),n.addEventListener("mouseup",E),n.defaultView?.addEventListener("blur",N),()=>{n.removeEventListener("pointerlockchange",R),n.removeEventListener("keydown",P),n.removeEventListener("keyup",U),n.removeEventListener("mousemove",A),n.removeEventListener("mousedown",E),n.removeEventListener("mouseup",E),n.defaultView?.removeEventListener("blur",N)}},[n,w,h]);let v=Pe(p=>{p.requestPointerLock?.()},[]),d=Pe(()=>{S.current=!0,u(!0)},[]),b=Pe(()=>{S.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),u(!1),w()},[n,w]),f=Pe(p=>{a.current?.keyDown(p),h()},[h]),g=Pe(p=>{a.current?.keyUp(p),h()},[h]),T=Pe((p,R)=>{a.current?.movePointer(p,R)},[]);return{engage:v,engageTouch:d,release:b,engaged:c,heldKeys:m,pressKey:f,releaseKey:g,movePointer:T}}import{forwardRef as Io,useEffect as Vr,useImperativeHandle as Lo,useMemo as Oo,useRef as ut}from"react";import{createCameraWarp as Do}from"@urun-sh/core";import{forwardRef as Uo,useCallback as Ee,useEffect as $e,useImperativeHandle as Ao,useRef as oe,useState as _r}from"react";import{derivedLegRole as Mo}from"@urun-sh/core";var it=null;function Co(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function at(){if(it)return it;let e=Co();return e?(it=new e,it):null}function He(){let e=at();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{createContext as Po,useContext as Mr}from"react";import{jsx as wo}from"react/jsx-runtime";var Ot=Po(null);function Eo({session:e,children:t}){return wo(Ot.Provider,{value:e,children:t})}function Se(){return Mr(Ot)}function xo(){let e=Mr(Ot);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{jsx as Dr,jsxs as No}from"react/jsx-runtime";function _o(e,t){return e-t>>>0<2147483648}var Nr=1e3;function Ir(...e){console.debug("[video]",...e)}function Lr(e,t){let r=new Set,o=t.filter(s=>r.has(s)?!1:(r.add(s),!0)).map(s=>e.stream(s)),n=()=>{for(let s of o){let i=s.track;if(i&&i.readyState==="live")return i}return null};return{get track(){return n()},on(s,i){let a=o.map(c=>c.on("track",()=>i(n())));return()=>{for(let c of a)c()}}}}function Or(e,t,r){return r?[r,t]:[e,t]}var We=Uo(function(t,r){let{session:o,stream:n="video",audioStream:s="audio",track:i,muted:a=!0,mirror:c=!1,objectFit:u="contain",className:m,style:l,videoClassName:S,placeholder:h,poster:w,children:v,onTrack:d,onFirstFrame:b,frameMarker:f,onFrameMarkerReached:g,onFrameMarkerUnsupported:T,onUnlockChange:p}=t,R=Se(),P=o??R,U=oe(null),A=oe(null),[E,N]=_r(!1),[x,D]=_r(!1),$=oe(!1),K=oe(null),G=oe(d);G.current=d;let y=oe(p);y.current=p;let F=oe(b);F.current=b;let q=oe(g);q.current=g;let z=oe(T);z.current=T;let C=oe(f??null);C.current=f??null;let L=Ee(k=>{K.current!==k&&(K.current=k,y.current?.(k))},[]),_=oe(null),W=oe(null),O=Ee((k,V=!1)=>{if(!V&&k===_.current||(_.current=k,W.current?.(),W.current=null,$.current=!1,D(!1),!k))return;let M=U.current;if(!M)return;let j=C.current,J=j?.rtpTimestamp??null,ie=!1,I=()=>{ie||(ie=!0,z.current?.())};j&&J==null&&I();let ve=j!=null&&J!=null,Oe=ke=>{W.current?.(),W.current=null,$.current=!0,D(!0),F.current?.(),ke&&q.current?.()};if(typeof M.requestVideoFrameCallback=="function"){let ke=!1,H=0,B=(ae,ue)=>{if(!ke){if(ve){let le=ue?.rtpTimestamp;if(typeof le!="number"){I(),Oe(!1);return}if(!_o(le,J)){H=M.requestVideoFrameCallback(B);return}Oe(!0);return}Oe(!1)}};H=M.requestVideoFrameCallback(B),W.current=()=>{ke=!0,M.cancelVideoFrameCallback?.(H)};return}ve&&I();let ye=()=>{let ke=M.getVideoPlaybackQuality?.();(ke?ke.totalVideoFrames>0:M.readyState>=2&&M.videoWidth>0)&&Oe(!1)};M.addEventListener("loadeddata",ye),M.addEventListener("timeupdate",ye),M.addEventListener("playing",ye),W.current=()=>{M.removeEventListener("loadeddata",ye),M.removeEventListener("timeupdate",ye),M.removeEventListener("playing",ye)},ye()},[]);$e(()=>()=>{W.current?.(),W.current=null},[]);let X=f==null?null:`${f.rtpTimestamp??""}|${f.ptsMs??""}`,re=oe(X);$e(()=>{if(re.current===X||(re.current=X,X==null))return;let k=_.current;k&&O(k,!0)},[X,O]);let Z=Ee(()=>{if(typeof MediaStream>"u")return null;A.current||(A.current=new MediaStream);let k=U.current;return k&&k.srcObject!==A.current&&(k.srcObject=A.current),A.current},[]),Q=Ee(k=>{let V=U.current;if(!V)return;let M=V.play();!M||typeof M.then!="function"||M.then(()=>{V.muted||L(!0)}).catch(j=>{if((j instanceof Error?j.name:String(j))==="NotAllowedError"&&!V.muted){Ir(`play() blocked pending a user gesture (${k})`),L(!1);return}Ir(`play() failed (${k})`,j)})},[L]),me=Ee(()=>{let k=U.current;k&&(Z(),!k.muted&&(Q("gesture"),He(),L(!0)))},[Z,Q,L]),se=Ee(k=>{let V=Z();if(V){for(let M of V.getVideoTracks())M!==k&&V.removeTrack(M);if(k&&!V.getVideoTracks().includes(k)){V.addTrack(k);let M=U.current;M&&(M.srcObject=V)}k&&Q("track-attach"),N(k!==null),O(k),G.current?.(k)}},[Z,Q,O]),Re=Ee(k=>{let V=Z();if(V){for(let M of V.getAudioTracks())M!==k&&V.removeTrack(M);k&&!V.getAudioTracks().includes(k)&&V.addTrack(k),k&&Q("audio-attach")}},[Z,Q]),ne=Ee(k=>{U.current=k,k&&(a?(k.muted=!0,k.defaultMuted=!0,k.setAttribute("muted",""),K.current=null):(k.muted=!1,k.defaultMuted=!1,k.removeAttribute("muted")),k.setAttribute("playsinline",""),k.setAttribute("webkit-playsinline",""),Z())},[Z,a]);Ao(r,()=>({get element(){return U.current},get live(){return A.current?A.current.getVideoTracks().length>0:!1},get framed(){return $.current},unlock:me,get unlocked(){return K.current===!0}}),[me]);let ee=Mo(n)!==void 0;$e(()=>{ee&&console.error(`[video] stream=${JSON.stringify(n)} is an INTERNAL A/V leg name, not a consumable stream \u2014 address the PARENT (e.g. "${n.slice(0,n.lastIndexOf("--"))}") instead. Rendering empty.`)},[ee,n]);let Y=i!==void 0;return $e(()=>{if(Y){se(i??null);return}if(ee){se(null);return}if(!P)return;let k=Lr(P,Or(n,"video")),V=()=>{let I=A.current;return I?I.getVideoTracks()[0]??null:null},M=I=>{if(I!==V()&&(se(I),I)){let ve=()=>{V()===I&&se(null)};I.addEventListener("ended",ve)}},j=k.track;j&&j.readyState==="live"&&M(j);let J=k.on("track",I=>{I&&I.readyState!=="live"||M(I)}),ie=setInterval(()=>{let I=k.track;I&&I.readyState==="live"&&M(I)},Nr);return()=>{J(),clearInterval(ie)}},[P,n,ee,Y,i,se]),$e(()=>{if(Y||!P||s===!1||ee)return;let k=Lr(P,Or(n,"audio",s)),V=()=>{let I=A.current;return I?I.getAudioTracks()[0]??null:null},M=I=>{if(I!==V()&&(Re(I),I)){let ve=()=>{V()===I&&Re(null)};I.addEventListener("ended",ve)}},j=k.track;j&&j.readyState==="live"&&M(j);let J=k.on("track",I=>{I&&I.readyState!=="live"||M(I)}),ie=setInterval(()=>{let I=k.track;I&&I.readyState==="live"&&M(I)},Nr);return()=>{J(),clearInterval(ie)}},[P,n,ee,s,Y,Re]),No("div",{className:m,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":E?"true":"false","data-urun-video-framed":x?"true":"false",children:[Dr("video",{ref:ne,className:S,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:u,...c?{transform:"scaleX(-1)"}:{}}}),E?null:h,w===void 0?null:Dr("div",{"data-urun-video-poster":"","aria-hidden":x||void 0,style:{position:"absolute",inset:0,...x?{opacity:0,pointerEvents:"none"}:null},children:w}),v]})});import{jsx as Fr,jsxs as qo}from"react/jsx-runtime";var Vo={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},Fo=Io(function(t,r){let{warp:o,children:n,...s}=t,{enabled:i=!0,overscan:a=.08,captureInput:c=!0,documentTarget:u,...m}=o??{},l=u!==void 0?u:typeof document<"u"?document:null,S=ut(null),h=ut(null),w=ut(0),v=ut(m);v.current=m;let d=Oo(()=>Do(v.current),[]);return Lo(r,()=>({get video(){return S.current},get canvas(){return h.current},warp:d,get lastDrawTs(){return w.current}}),[d]),Vr(()=>{if(!i)return;let b=0,f=0,g=null,T=R=>{typeof R.requestVideoFrameCallback=="function"&&(g=R,f=R.requestVideoFrameCallback(function P(){d.frameArrived(),f=R.requestVideoFrameCallback(P)}))},p=R=>{b=requestAnimationFrame(p);let P=h.current,U=S.current?.element??null;if(!P||!U||(U!==g&&(g&&f&&g.cancelVideoFrameCallback?.(f),T(U)),U.readyState<2))return;d.tick(R);let A=typeof devicePixelRatio=="number"?devicePixelRatio:1,E=Math.max(1,Math.round(P.clientWidth*A)),N=Math.max(1,Math.round(P.clientHeight*A));(P.width!==E||P.height!==N)&&(P.width=E,P.height=N);let x=P.getContext("2d");if(!x)return;let D=d.transform(),$=U.videoWidth||E,K=U.videoHeight||N,y=Math.max(E/$,N/K)*(1+a)*D.scale;x.setTransform(y,0,0,y,E/2+D.translateX*E,N/2+D.translateY*N),x.drawImage(U,-$/2,-K/2),w.current=R};return b=requestAnimationFrame(p),()=>{cancelAnimationFrame(b),g&&f&&g.cancelVideoFrameCallback?.(f)}},[i,a,d]),Vr(()=>{if(!i||!c||!l)return;let b=()=>!!l.pointerLockElement,f=P=>{b()&&d.keyDown(P.key)},g=P=>d.keyUp(P.key),T=P=>{b()&&d.pointerDelta(P.movementX,P.movementY)},p=()=>{b()||d.clearKeys()},R=()=>d.clearKeys();return l.addEventListener("keydown",f),l.addEventListener("keyup",g),l.addEventListener("mousemove",T),l.addEventListener("pointerlockchange",p),l.defaultView?.addEventListener("blur",R),()=>{l.removeEventListener("keydown",f),l.removeEventListener("keyup",g),l.removeEventListener("mousemove",T),l.removeEventListener("pointerlockchange",p),l.defaultView?.removeEventListener("blur",R)}},[i,c,l,d]),i?qo(We,{ref:S,...s,videoClassName:s.videoClassName,style:{...s.style},children:[Fr("canvas",{ref:h,style:Vo,"data-urun-warp":""}),n]}):Fr(We,{ref:S,...s,children:n})});var qr=new Map;function Ho(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}`}}import{Fragment as Bo,jsx as ct}from"react/jsx-runtime";function Wo({name:e,props:t,fallback:r}){let o=Hr(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?ct(Bo,{children:r}):ct("div",{className:"urun-component-error",role:"alert",children:ct("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return ct(n,{...o.validatedProps})}import{z as Ge}from"zod";import{jsx as Dt,jsxs as Wr}from"react/jsx-runtime";var jo=Ge.object({step:Ge.number().min(0),total:Ge.number().min(1),label:Ge.string().optional(),variant:Ge.enum(["default","success","error"]).default("default")});function Br(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 Ko(e){let{step:t,total:r,label:o,variant:n,percentage:s}=Br(e);return Wr("div",{className:"urun-progress-card","data-variant":n,children:[o&&Dt("div",{className:"urun-progress-label",children:o}),Dt("div",{className:"urun-progress-bar",children:Dt("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),Wr("div",{className:"urun-progress-text",children:[t,"/",r]})]})}import{z as Vt}from"zod";import{jsx as jr,jsxs as zo}from"react/jsx-runtime";var $o=Vt.object({state:Vt.enum(["thinking","generating","idle","error"]),message:Vt.string().optional()}),Go={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Kr(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??Go[t]??t;return{state:t,message:n,isActive:o}}function Xo(e){let{state:t,message:r,isActive:o}=Kr(e);return zo("span",{className:"urun-status-badge","data-state":t,children:[jr("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),jr("span",{className:"urun-status-message",children:r})]})}import{useRef as $r,useEffect as Jo}from"react";import{z as Ft}from"zod";import{jsx as Gr,jsxs as Qo}from"react/jsx-runtime";var Yo=Ft.object({text:Ft.string(),streaming:Ft.boolean().default(!1)});function Xr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function Zo(e){let{text:t,streaming:r}=Xr(e),o=$r(null),n=$r(0);return Jo(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),Qo("div",{className:"urun-text-stream",children:[Gr("span",{ref:o,className:"urun-text-content"}),r&&Gr("span",{className:"urun-text-cursor"})]})}import{z as lt}from"zod";import{jsx as zr,jsxs as rs}from"react/jsx-runtime";var es=lt.object({src:lt.string().url(),alt:lt.string().optional(),caption:lt.string().optional()});function Jr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function ts(e){let{src:t,alt:r,caption:o}=Jr(e);return rs("figure",{className:"urun-image-frame",children:[zr("img",{className:"urun-image",src:t,alt:r}),o&&zr("figcaption",{className:"urun-image-caption",children:o})]})}import{z as xe}from"zod";import{jsx as qt,jsxs as ss}from"react/jsx-runtime";var ns=xe.object({metrics:xe.array(xe.object({label:xe.string(),value:xe.union([xe.string(),xe.number()]),unit:xe.string().optional()}))});function Yr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function os(e){let{metrics:t}=Yr(e);return qt("div",{className:"urun-metrics-panel",children:t.map((r,o)=>ss("div",{className:"urun-metric-card",children:[qt("div",{className:"urun-metric-label",children:r.label}),qt("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}import{useCallback as dt,useEffect as Ht,useRef as ce,useState as is}from"react";import{jsx as fs}from"react/jsx-runtime";function we(e){return e&&typeof e=="object"?e:null}function Qr(e){if(typeof e=="string")return e;let t=we(e);return t&&t.t==="delta"&&typeof t.delta=="string"?t.delta:""}function as(e){if(typeof e=="string")return"delta";let t=we(e);return t?t.t==="delta"?"delta":t.t==="response"?"done":t.t==="error"?"error":"ignore":"ignore"}function us(...e){for(let t of e)if(typeof t=="string"&&t)return t;return""}function cs(e){let t=we(e),r=t?.body;return us(r,we(we(r)?.error)?.message,we(r)?.error,we(r)?.message,we(t?.error)?.message,t?.error,t?.message)||"stream reported an error"}var Xe=class extends Error{name="TextStreamError"},ls=4,en=3,tn=240,Zr=typeof performance<"u"&&typeof performance.now=="function"?()=>performance.now():()=>Date.now();function rn(){return{chars:0,tokens:0,tokensPerSecond:0,elapsedMs:0,done:!1}}function ds(e){e.chars=0,e.tokens=0,e.tokensPerSecond=0,e.elapsedMs=0,e.done=!1}function nn(e){let{session:t,stream:r}=e,o=ce(e);Ht(()=>{o.current=e});let n=ce(null),s=ce(()=>{}),i=ce(null),a=ce(""),c=ce(""),u=ce(null),m=ce(!1),l=ce(!1),S=ce(!1),h=ce(null),w=ce(rn()),v=dt(g=>{if(n.current=g,!g){i.current=null;return}let T=i.current;if(T&&T.parentNode===g)return;let p=g.ownerDocument.createTextNode(c.current);g.appendChild(p),i.current=p,a.current.length>0&&s.current()},[]),d=dt(()=>{u.current=null;let g=i.current,T=a.current;if(T.length>0){let A=o.current,E=A.smoothCharsPerFrame??en,N=A.smoothThreshold??tn,x=A.smooth&&T.length<=N?T.slice(0,E):T;a.current=T.slice(x.length),c.current+=x,g?.appendData(x)}let p=w.current,R=c.current.length,P=h.current===null?0:Math.max(0,Zr()-h.current),U=Math.round(R/ls);if(p.chars=R,p.tokens=U,p.elapsedMs=P,p.tokensPerSecond=P>0?U*1e3/P:0,a.current.length>0){b(),o.current.onMeter?.(p);return}if(!m.current&&!S.current){S.current=!0,p.done=!0,o.current.onMeter?.(p),l.current||o.current.onDone?.(c.current);return}o.current.onMeter?.(p)},[]),b=dt(()=>{u.current===null&&(u.current=globalThis.requestAnimationFrame(()=>d()))},[d]);s.current=b,Ht(()=>{if(!t)return;if(typeof globalThis.requestAnimationFrame!="function")throw new Error("[urun] Text requires requestAnimationFrame. Render it in a browser (or a DOM test environment).");a.current="",c.current="",l.current=!1,S.current=!1,h.current=null,m.current=!0,ds(w.current),i.current&&(i.current.data="");let g=!1,T=null;return(async()=>{try{for(T=t.stream(r).messages()[Symbol.asyncIterator]();;){let R=await T.next();if(g)return;if(R.done)break;let P=R.value,U=as(P);if(U==="error")throw new Xe(cs(P));if(U==="done")break;if(U==="ignore")continue;let A=Qr(P);A&&(h.current===null&&(h.current=Zr()),a.current+=A,b())}if(g)return;T.return?.(void 0),m.current=!1,b()}catch(p){if(g)return;T?.return?.(void 0),l.current=!0,m.current=!1,o.current.onError?.(p instanceof Error?p:new Xe(String(p))),b()}})(),()=>{g=!0,m.current=!1,T?.return?.(void 0),u.current!==null&&(globalThis.cancelAnimationFrame?.(u.current),u.current=null)}},[t,r,b]);let f=dt(()=>c.current,[]);return{ref:v,meterRef:w,getText:f}}function ps(e,t=250){let[r,o]=is(rn);return Ht(()=>{let n=setInterval(()=>{let s=e.current;o(i=>i.chars===s.chars&&i.done===s.done?i:{...s})},t);return()=>clearInterval(n)},[e,t]),r}function ms(e){let{className:t,style:r,...o}=e,{ref:n}=nn(o);return fs("span",{ref:n,className:t,style:r})}import{forwardRef as Ss}from"react";import{jsx as hs}from"react/jsx-runtime";var gs=Ss(function(t,r){let{stream:o="image",...n}=t;return hs(We,{ref:r,stream:o,...n})});import{forwardRef as vs,useCallback as ge,useEffect as Wt,useImperativeHandle as ys,useRef as Te}from"react";import{observePageLifecycle as ks}from"@urun-sh/core";import{jsx as Cs}from"react/jsx-runtime";var bs=1e3,Ts=1e3;function Bt(...e){console.debug("[audio]",...e)}var pt=vs(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:c,onUnlockChange:u,onAudioElement:m}=t,l=Se(),S=o??l,h=Te(null),w=Te(null),v=Te(null),d=Te(null),b=Te(null),f=Te(0),g=Te(c);g.current=c;let T=Te(u);T.current=u;let p=ge(y=>{v.current!==y&&(v.current=y,T.current?.(y))},[]),R=ge(()=>{if(typeof MediaStream>"u")return null;w.current||(w.current=new MediaStream);let y=h.current;return y&&y.srcObject!==w.current&&(y.srcObject=w.current),w.current},[]),P=ge(()=>{f.current=0,b.current!==null&&cancelAnimationFrame(b.current),b.current=null,d.current!==null&&clearTimeout(d.current),d.current=null},[]),U=ge(y=>{b.current=null,d.current=null,R(),N.current(`${y}:retry`)},[R]),A=ge(y=>{if(!h.current||b.current!==null||d.current!==null)return;let q=w.current;if(!(!!q&&q.getAudioTracks().some(L=>L.readyState==="live"))){P();return}let C=f.current;if(f.current=C+1,C===0&&typeof requestAnimationFrame=="function"){b.current=requestAnimationFrame(()=>U(y));return}d.current=setTimeout(()=>U(y),Ts)},[P,U]),E=ge(y=>{let F=h.current;if(!F)return;let q=F.play();!q||typeof q.then!="function"||q.then(()=>{F.muted||p(!0),P()}).catch(z=>{let C=z instanceof Error?z.name:String(z);if(C==="AbortError"){Bt(`play() aborted (${y}); retrying on the ladder`),A(`${y}:abort`);return}if(C==="NotAllowedError"){Bt(`play() blocked pending a user gesture (${y})`),p(!1),A(`${y}:blocked`);return}Bt(`play() failed (${y})`,z)})},[p]),N=Te(()=>{});N.current=E;let x=ge(y=>{let F=R();if(F){for(let q of F.getAudioTracks())q!==y&&F.removeTrack(q);y&&!F.getAudioTracks().includes(y)&&F.addTrack(y),y&&E("track-attach"),g.current?.(y)}},[R,E]),D=ge(()=>{let y=h.current;y&&(R(),y.muted=!1,E("gesture"),He(),p(!0))},[R,E,p]);ys(r,()=>({unlock:D,get unlocked(){return v.current===!0},get element(){return h.current}}),[D]);let $=ge(()=>{A("pause-event")},[A]),K=ge(y=>{let F=h.current;F&&F!==y&&F.removeEventListener("pause",$),h.current=y,y&&(y.setAttribute("playsinline",""),y.setAttribute("webkit-playsinline",""),R(),y.addEventListener("pause",$)),m?.(y)},[R,m,$]),G=s!==void 0;return Wt(()=>{if(G){x(s??null);return}if(!S)return;let y=S.stream(n),F=()=>{let _=w.current;return _?_.getAudioTracks()[0]??null:null},q=_=>{if(_!==F()&&(x(_),_)){let W=()=>{F()===_&&x(null)};_.addEventListener("ended",W)}},z=y.track;z&&z.readyState==="live"&&q(z);let C=y.on("track",_=>{_&&_.readyState!=="live"||q(_)}),L=setInterval(()=>{let _=y.track;_&&_.readyState==="live"&&q(_)},bs);return()=>{C(),clearInterval(L)}},[S,n,G,s,x]),Wt(()=>ks(()=>{He(),v.current===!0&&E("foreground")}),[E]),Wt(()=>()=>{d.current&&clearTimeout(d.current),b.current!==null&&cancelAnimationFrame(b.current),b.current=null},[]),Cs("audio",{ref:K,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),Rs=pt;import{forwardRef as Ps,useCallback as _e,useEffect as jt,useImperativeHandle as Es,useRef as de}from"react";import{observePageLifecycle as xs,SessionFailedError as ws,sessionFailureFromMediaError as Us,sharedCaptureController as As}from"@urun-sh/core";import{jsx as Ns}from"react/jsx-runtime";var on={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function mt(...e){console.debug("[voice]",...e)}function Ms(e){return e instanceof ws&&e.kind==="create-failed"&&(e.status.error?.code==="client_release"||e.status.error?.httpStatus===410)}var ft=Ps(function(t,r){let{session:o,stream:n="audio",playback:s=!0,autoStart:i=!s,constraints:a=on,connectTimeoutMs:c,attempts:u=3,retryDelayMs:m=1500,onActiveChange:l,onError:S,onMicStream:h,onTrack:w,onUnlockChange:v,capture:d}=t,b=Se(),f=o??b,g=de(null),T=de(null),p=de(null),R=de([]),P=de(!1),U=de(l);U.current=l;let A=de(S);A.current=S;let E=de(h);E.current=h;let N=_e(C=>{P.current!==C&&(P.current=C,U.current?.(C))},[]),x=_e(()=>{for(let C of R.current)C();R.current=[],p.current?.release(),p.current=null,T.current&&(T.current=null,E.current?.(null))},[]),D=_e(async()=>{let C=p.current;if(C){let O=await C.update(a);return T.current=C.stream,E.current?.(C.stream),O}let _=await(d??As()).claim("audio",a);p.current=_,R.current=[_.onTrack((O,X)=>{T.current=X,E.current?.(X),P.current&&f?.stream(n).attach(O).catch(re=>mt("mic re-attach after one-capture re-acquire failed",re))}),_.onLost(O=>{p.current=null,R.current=[],T.current=null,E.current?.(null),N(!1),A.current?.(O)})],T.current=_.stream,E.current?.(_.stream);let W=_.track;if(!W)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return W},[d,a,f,n,N]),$=_e(async()=>{x(),N(!1),await f?.stream(n).detach().catch(()=>{})},[f,n,x,N]),K=_e(async()=>{if(!f)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");g.current?.unlock();let C;try{C=await D()}catch(W){x();let O=Us(W,f.status);throw A.current?.(O),O}f.connect?.();let L;for(let W=1;W<=u;W++)try{await f.whenLive(c!==void 0?{timeout:c}:void 0),await f.stream(n).attach(C),N(!0);return}catch(O){if(L=O,mt(`start attempt ${W}/${u} failed`,O),Ms(O))break;W<u&&await new Promise(X=>setTimeout(X,m))}x(),N(!1);let _=L instanceof Error?L:new Error(String(L??"voice start failed"));throw A.current?.(_),_},[f,n,c,u,m,D,x,N]);Es(r,()=>({start:K,stop:$,unlock:()=>g.current?.unlock(),get active(){return P.current},get micStream(){return T.current},get audio(){return g.current}}),[K,$]);let G=de(K);G.current=K;let y=de(null),F=_e((C,L)=>{C.promise.then(()=>{L&&(x(),N(!1)),C.session.stream(C.streamName).detach().catch(()=>{})})},[x,N]);jt(()=>{if(!i||!f)return;let C=y.current;C&&(C.session!==f||C.streamName!==n)&&(C.disposeTimer&&clearTimeout(C.disposeTimer),F(C,!1),C=null),C?C.disposeTimer&&(clearTimeout(C.disposeTimer),C.disposeTimer=null):(C={session:f,streamName:n,promise:G.current().catch(()=>{}),refCount:0,disposeTimer:null},y.current=C),C.refCount+=1;let L=C;return()=>{L.refCount-=1,!(L.refCount>0)&&(L.disposeTimer=setTimeout(()=>{y.current===L&&(y.current=null),F(L,!0)},0))}},[i,f,n,F]);let q=de(!1),z=_e(async()=>{if(!f||!P.current||q.current)return;let C=T.current?.getAudioTracks()[0]??null;if(C&&C.readyState==="live"){try{await f.stream(n).attach(C)}catch(L){mt("foreground mic re-assert failed (will retry on next pass)",L)}return}q.current=!0;try{let L=await D();await f.stream(n).attach(L)}catch(L){let _=L instanceof Error?L:new Error(String(L));mt("foreground mic re-acquire failed",_),A.current?.(_)}finally{q.current=!1}},[f,n,D]);return jt(()=>{let C=()=>{z()};return f&&typeof f.onRecovery=="function"?f.onRecovery(C):xs(C)},[f,z]),jt(()=>x,[x]),s?Ns(pt,{ref:g,session:f,stream:n,onTrack:w,onUnlockChange:v}):null}),_s=ft;import{forwardRef as Os,useImperativeHandle as Ds,useRef as sn,useState as Vs}from"react";import{useEffect as Is,useState as Ls}from"react";var Kt={level:0,speaking:!1};function $t(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=Ls(Kt);return Is(()=>{if(!e){i(Kt);return}let a=at();if(!a||typeof MediaStream>"u")return;let c;e instanceof MediaStream?c=e:(c=new MediaStream,c.addTrack(e));let u,m;try{u=a.createMediaStreamSource(c),m=a.createAnalyser(),m.fftSize=r,u.connect(m)}catch{return}let l=new Uint8Array(m.fftSize),h=setInterval(()=>{m.getByteTimeDomainData(l);let w=0;for(let d=0;d<l.length;d++){let b=(l[d]-128)/128;w+=b*b}let v=Math.sqrt(w/l.length);i(d=>{let b=v>n;return Math.abs(d.level-v)<.005&&d.speaking===b?d:{level:v,speaking:b}})},o);return()=>{clearInterval(h),u.disconnect(),i(Kt)}},[e,r,o,n]),s}import{Fragment as Ws,jsx as St,jsxs as Bs}from"react/jsx-runtime";var Fs={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},qs={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},Hs=Os(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:c,onActiveChange:u,onError:m,onMicStream:l,capture:S}=t,h=Se(),w=o??h,v=sn(null),[d,b]=Vs(null),f=sn(l);f.current=l;let{level:g,speaking:T}=$t(a?d:null);return Ds(r,()=>({start:()=>{let p=v.current;return p?p.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>v.current?.stop()??Promise.resolve(),get active(){return v.current?.active??!1},get micStream(){return v.current?.micStream??null}}),[]),Bs(Ws,{children:[St(ft,{ref:v,session:w,stream:n,playback:!1,autoStart:i,...s!==void 0?{constraints:s}:{},...S!==void 0?{capture:S}:{},onActiveChange:u,onError:m,onMicStream:p=>{b(p),f.current?.(p)}}),a?St("span",{className:c,style:Fs,"data-urun-mic":"","data-urun-mic-active":d?"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(g*100)/100,children:St("span",{style:qs,children:St("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(g*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});import{captureStillFromVideo as js,sessionFailureFromMediaError as Ks,sharedCaptureController as $s}from"@urun-sh/core";import{forwardRef as un,useCallback as he,useEffect as Gt,useImperativeHandle as Gs,useRef as te,useState as ze}from"react";import{jsx as Ue,jsxs as an}from"react/jsx-runtime";var cn={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Xt(...e){console.debug("[camera]",...e)}function Xs(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function zs(){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 ln=un(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:c,autoStart:u=!0,mirror:m="auto",connectTimeoutMs:l,visible:S=!1,className:h,videoClassName:w,onActiveChange:v,onError:d,onStream:b,onTrack:f,children:g,capture:T,flipControl:p="auto",flipControlClassName:R,onDevices:P}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let U=i?"user":a?"environment":c??"environment",A=Se(),E=o??A,N=te(null),x=te(null),D=te(null),$=te([]),K=te(null),G=te(!1),y=te(!1),F=te(U),[q,z]=ze(U),[C,L]=ze(!1),[_,W]=ze(null),[O,X]=ze(!1),[re]=ze(Xs),Z=te(v);Z.current=v;let Q=te(d);Q.current=d;let me=te(b);me.current=b;let se=te(f);se.current=f;let Re=te(P);Re.current=P;let ne=he(H=>{G.current!==H&&(G.current=H,L(H),Z.current?.(H))},[]);Gt(()=>{if(!C){W(null);return}let H=!1,B=()=>{zs().then(ue=>{H||(W(ue),ue&&Re.current?.(ue))})};B();let ae=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof ae?.addEventListener=="function"?(ae.addEventListener("devicechange",B),()=>{H=!0,ae.removeEventListener?.("devicechange",B)}):()=>{H=!0}},[C]);let ee=he(H=>{let B=N.current;B&&(B.muted=!0,B.defaultMuted=!0,B.setAttribute("muted",""),B.setAttribute("playsinline",""),B.setAttribute("webkit-playsinline",""),B.srcObject=H,H&&B.play()?.catch?.(ae=>Xt("preview play() failed",ae)))},[]),Y=he(()=>{y.current=!1,K.current?.(),K.current=null;for(let H of $.current)H();$.current=[],D.current?.release(),D.current=null,x.current&&(x.current=null,me.current?.(null),se.current?.(null)),ee(null)},[ee]),k=he((H,B)=>{K.current?.(),x.current=B,ee(B),me.current?.(B);let ae=()=>{x.current===B&&(Xt("camera track ended (device removed or permission revoked)"),Y(),ne(!1))};H.addEventListener("ended",ae),K.current=()=>H.removeEventListener("ended",ae)},[ee,Y,ne]),V=he(async H=>{let B=n!==!1;if(B&&!E)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let ae={...cn,...s,facingMode:H},ue;try{let le=D.current;if(le)ue=await le.update(ae);else{let Be=await(T??$s()).claim("video",ae);if(D.current=Be,$.current=[Be.onTrack((je,En)=>{k(je,En),G.current&&(!B||!E||E.stream(n).attachVideo(je).then(()=>se.current?.(je)).catch(xn=>Xt("camera re-publish after one-capture re-acquire failed",xn)))}),Be.onLost(je=>{D.current=null,$.current=[],Y(),ne(!1),Q.current?.(je)})],!Be.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});ue=Be.track}}catch(le){let De=Ks(le,E?.status);throw Q.current?.(De),De}F.current=H,z(H),k(ue,D.current?.stream??new MediaStream([ue]));try{B&&E&&(E.connect?.(),await E.whenLive(l!==void 0?{timeout:l}:void 0),await E.stream(n).attachVideo(ue)),y.current=B?n:!1}catch(le){Y(),ne(!1);let De=le instanceof Error?le:new Error(String(le));throw Q.current?.(De),De}se.current?.(ue),ne(!0)},[E,n,s,l,T,k,Y,ne]),M=he(H=>V(H?.facingMode??F.current),[V]),j=he(async H=>{let B=y.current===n;G.current&&F.current===H&&B||await V(H)},[V,n]),J=he(()=>V(F.current==="environment"?"user":"environment"),[V]),ie=he(async()=>{Y(),ne(!1),n!==!1&&await E?.stream(n).detachVideo().catch(()=>{})},[E,n,Y,ne]),I=he(async H=>{let B=N.current;if(!B)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await js(B,H)},[]);Gs(r,()=>({start:M,stop:ie,flip:J,setFacingMode:j,capturePhoto:I,get active(){return G.current},get facingMode(){return F.current},get stream(){return x.current},get element(){return N.current}}),[M,ie,J,j,I]);let ve=te(j);if(ve.current=j,Gt(()=>{u&&(n!==!1&&!E||ve.current(U).catch(()=>{}))},[u,E,U,n]),Gt(()=>Y,[Y]),!S)return null;let Oe=m==="auto"?q==="user":m,ye=C&&(p===!0||p==="auto"&&re&&(_?.length??0)>1),ke=()=>{O||(X(!0),J().catch(()=>{}).finally(()=>X(!1)))};return an("div",{className:h,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":q,children:[Ue("video",{ref:N,className:w,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Oe?{transform:"scaleX(-1)"}:{}}}),ye?Ue("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:ke,disabled:O,className:R,style:R?{opacity:O?.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:O?.6:1},children:an("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:[Ue("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),Ue("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),Ue("path",{d:"M14.5 10.5v1.6h-1.6"}),Ue("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),Ue("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,g]})}),Js=un(function({preview:t=!0,...r},o){return Ue(ln,{ref:o,...r,visible:t,autoStart:!1})});import{cameraCaptureAvailable as Ys,normalizeReferenceImage as Zs,referenceImageErrorMessage as Qs}from"@urun-sh/core";import{useCallback as Je,useEffect as ei,useRef as zt,useState as Ye}from"react";function ti(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=Ye(null),[a,c]=Ye(null),[u,m]=Ye(!1),[l,S]=Ye(null),[h]=Ye(Ys),w=zt(n);w.current=n;let v=zt(null),d=zt(0),b=Je(R=>{v.current&&URL.revokeObjectURL(v.current),v.current=R?URL.createObjectURL(new Blob([R.bytes],{type:R.type})):null,c(v.current),i(R),w.current?.(R)},[]);ei(()=>()=>{d.current++,v.current&&URL.revokeObjectURL(v.current),v.current=null},[]);let f=Je(async R=>{let P=++d.current;m(!0),S(null);try{let U=await R();if(d.current!==P)return;b(U)}catch(U){if(d.current!==P)return;S(Qs(U))}finally{d.current===P&&m(!1)}},[b]),g=Je(R=>f(()=>Zs(R,{maxSize:t,type:r,quality:o,source:"file"})),[f,t,r,o]),T=Je(R=>f(()=>R.capturePhoto({maxSize:t,type:r,quality:o})),[f,t,r,o]),p=Je(()=>{d.current++,S(null),m(!1),b(null)},[b]);return{reference:s,previewUrl:a,pick:g,capture:T,clear:p,busy:u,error:l,cameraAvailable:h}}import{useEffect as ri,useState as ni}from"react";function oi(e,t){let[r,o]=ni(null);return ri(()=>{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 li}from"react";import{useEffect as ui,useMemo as ci}from"react";import{createStore as si}from"zustand/vanilla";import{useStore as ii}from"zustand";var ai=()=>{};function Jt(e,t={}){let r=u=>{e?.set(u)},o=()=>e?e.get()??{}:{},n=si(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let u of s)u();s=null}},a=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",u=>n.setState({doc:u})),e.onSynced(()=>n.setState({synced:!0}))]),i):ai,c=(u=>ii(n,u));return Object.assign(c,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),c}function Ze(e,t){let r=ci(()=>Jt(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return ui(()=>r.bind(),[r]),r}function di(e,t,r){let n=Ze(e,t)(r??(a=>a)),s=li(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 pi,useState as mi}from"react";function fi(e){let[t,r]=mi(null);return pi(()=>{if(r(null),!!e)return e.on("generationTick",r)},[e]),t}import{useEffect as Si,useState as gi}from"react";var Ne=200;function Ae(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function Qe(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Yt(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 Zt(e,t,r={}){let o=r.cap??200,[n,s]=gi([]);return Si(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let c=await a.next();if(!i||c.done)break;s(u=>Ae(u,{at:Date.now(),payload:c.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}import{jsx as gt,jsxs as et}from"react/jsx-runtime";function hi({session:e,name:t,cap:r,className:o}){let n=Zt(e,t,{cap:r});return et("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[et("div",{className:"urun-stream-tail-meta",children:[gt("code",{children:t}),et("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),gt("div",{className:"urun-stream-tail-log",children:n.length===0?et("span",{className:"urun-stream-tail-empty",children:["Waiting for ",gt("code",{children:t})," messages\u2026"]}):n.map((s,i)=>et("div",{className:"urun-stream-tail-line",children:[gt("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",Qe(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as vi,useState as dn}from"react";import{jsx as Ie,jsxs as ht}from"react/jsx-runtime";function vt({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=dn(""),[i,a]=dn(null),c=vi(()=>{let u=Yt(n);if(!u.ok){a(u.error);return}a(null),o(u.value,n.trim()),s("")},[n,o]);return ht("div",{className:"urun-doc-patch",children:[Ie("textarea",{className:"urun-doc-patch-input",value:n,onChange:u=>s(u.target.value),placeholder:e,rows:3}),ht("div",{className:"urun-doc-patch-actions",children:[Ie("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:c,children:t}),i?Ie("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function yi({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=Ze(e,t),i=s(u=>u.doc),a=s(u=>u.synced),c=s(u=>u.set);return ht("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[ht("div",{className:"urun-doc-panel-meta",children:[Ie("code",{children:t}),Ie("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),Ie("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?Ie(vt,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:u=>c(u)}):null]})}import{useEffect as ki,useState as bi}from"react";import{jsx as tt,jsxs as mn}from"react/jsx-runtime";function pn(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function Ti({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=bi([]);return ki(()=>(s([]),e?e.doc(t).on("change",a=>{s(c=>Ae(c,{at:Date.now(),direction:"in",text:pn(Qe(a))},r))}):void 0),[e,t,r]),mn("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[tt(vt,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(c=>Ae(c,{at:Date.now(),direction:"out",text:pn(a)},r))}}),tt("div",{className:"urun-control-sender-log",children:n.length===0?tt("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>mn("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[tt("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",tt("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}import{useEffect as Ri,useState as Ci}from"react";import{jsx as yt,jsxs as Ei}from"react/jsx-runtime";function Pi({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=Ci([]),a=t.join(","),c=r.join(",");return Ri(()=>{if(i([]),!e)return;let u=(l,S)=>i(h=>Ae(h,{at:Date.now(),kind:l,text:S},o)),m=[];m.push(e.onPhase(l=>u("phase",`phase \u2192 ${l.name}`)));for(let l of t){let S=e.stream(l);m.push(S.on("track",h=>u("track",`${l}: ${h?"track arrived":"track ended"}`)))}for(let l of r){let S=e.doc(l);m.push(S.on("change",()=>u("doc",`${l} changed`)))}return()=>m.forEach(l=>l())},[e,a,c,o]),yt("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?yt("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((u,m)=>Ei("div",{className:"urun-event-spine-line","data-kind":u.kind,children:[yt("span",{className:"urun-event-spine-kind",children:u.kind})," ",yt("span",{className:"urun-event-spine-time",children:new Date(u.at).toLocaleTimeString()})," ",u.text]},`${u.at}-${m}`))})}import{describeSessionPhase as Hi,isWakingPhase as Wi}from"@urun-sh/core";import{useEffect as xi,useState as wi}from"react";function pe(e){let[t,r]=wi(e?.phase??null);return xi(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}import{describeSessionPhase as Ni}from"@urun-sh/core";import{useEffect as Ui,useRef as Ai,useState as Mi}from"react";import{isWakingPhase as _i}from"@urun-sh/core";function Qt(e){let t=pe(e),r=_i(t?.name),o=Ai(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]=Mi(s);return Ui(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let c=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(c)},[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 Ii,jsx as fn,jsxs as Sn}from"react/jsx-runtime";function er({session:e,render:t,className:r}){let o=Qt(e);return!o.waking||!o.phase?null:fn("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):Sn(Ii,{children:[fn("span",{className:"urun-session-waking-label",children:Ni(o.phase)})," ",Sn("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}import{useEffect as Di,useState as Vi}from"react";import{useEffect as gn,useRef as Li,useState as hn}from"react";var Oi={event:null,elapsedMs:0};function tr(e,t){let[r,o]=hn(null),n=Li(0);gn(()=>{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]=hn(0);return gn(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,c=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(c());let u=setInterval(()=>i(c()),1e3);return()=>clearInterval(u)},[r]),r?{event:r,elapsedMs:s}:Oi}import{jsx as vn,jsxs as yn}from"react/jsx-runtime";var Fi={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 qi(e){let[t,r]=Vi(!1);return Di(()=>{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 rr({session:e,stream:t,videoElement:r,render:o,className:n}){let s=tr(e,t),i=qi(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let c=a.state;return vn("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":c,role:"status","aria-live":"polite",children:o?o(s):yn("div",{className:"urun-activation-overlay-card",children:[vn("span",{className:"urun-activation-overlay-copy",children:a.hint??Fi[c]})," ",yn("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}import{jsx as Le,jsxs as nr}from"react/jsx-runtime";var Bi={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",waiting_for_capacity:"waiting for GPU capacity",connecting:"connecting",live:"live",paused:"paused",error:"error",unknown:"unrecognized state"};function ji({session:e,className:t}){let r=pe(e),o=r?.name??"idle",n=(r?.name==="queued"||r?.name==="waiting_for_capacity")&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:r?.name==="error"&&r.error?r.error.reason:r?.reason?r.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return nr("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[Le("span",{className:"urun-session-status-dot","data-phase":o}),Le("span",{className:"urun-session-status-label",children:Bi[o]}),n?Le("span",{className:"urun-session-status-detail",children:n}):null]})}function Ki({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=pe(e);if(s?.name==="live")return nr("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,Le(rr,{session:e})]});let i=r?r(s):Le("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s&&Wi(s.name)?Le(er,{session:e}):s&&s.name!=="idle"?Hi(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="paused");return nr("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?Le("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}import{useEffect as $i,useState as Gi}from"react";import{jsx as Ji}from"react/jsx-runtime";function kn(e){return pe(e)?.endsAt??null}function Xi(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 zi({session:e,urgentMs:t=6e4,className:r}){let n=kn(e)?.getTime()??null,[s,i]=Gi(()=>n===null?null:Math.max(0,n-Date.now()));if($i(()=>{if(n===null){i(null);return}let c=()=>i(Math.max(0,n-Date.now()));c();let u=setInterval(c,1e3);return()=>clearInterval(u)},[n]),s===null)return null;let a=Xi(s);return Ji("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{describeSessionPhase as Yi}from"@urun-sh/core";import{jsx as or,jsxs as ea}from"react/jsx-runtime";var Zi=new Set(["paused","error"]);function bn({session:e,onResume:t,onNewSession:r,children:o,className:n}){let s=pe(e);if(!s||!Zi.has(s.name))return null;let i=o?o(s):or("span",{className:"urun-session-paused-copy",children:Yi(s)});return ea("div",{className:["urun-session-paused",n].filter(Boolean).join(" "),"data-phase":s.name,children:[i,t?or("button",{type:"button",className:"urun-session-paused-resume",onClick:t,children:"Resume"}):null,r?or("button",{type:"button",className:"urun-session-paused-new",onClick:r,children:"New session"}):null]})}var Qi=bn;import{useEffect as Tn,useMemo as ta,useState as Rn}from"react";import{jsx as kt,jsxs as oa}from"react/jsx-runtime";function sr(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 Cn(e){let t=ta(()=>e?e.doc("control"):null,[e]),[r,o]=Rn(()=>t?sr(t.get("idle")):null);return Tn(()=>{if(!t){o(null);return}return o(sr(t.get("idle"))),t.on("change",()=>o(sr(t.get("idle"))))},[t]),r}function ra(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function na({session:e,onStillHere:t,className:r}){let o=Cn(e),n=o?.deadlineEpochS??null,[s,i]=Rn(null);if(Tn(()=>{if(n===null){i(null);return}let c=()=>i(Math.max(0,n-Date.now()/1e3));c();let u=setInterval(c,1e3);return()=>clearInterval(u)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return kt("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:oa("div",{className:"urun-idle-warning-card",children:[kt("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),kt("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${ra(s)} due to inactivity.`:"This session will end soon due to inactivity."}),kt("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}import{useCallback as Pn,useEffect as sa,useRef as ia,useState as ir}from"react";function aa(e){return e?e.activated&&!e.exempt&&e.available_credits<=0:!1}function ar(e,t={}){let{refreshIntervalMs:r}=t,[o,n]=ir(null),[s,i]=ir(e!==null),[a,c]=ir(null),u=ia(e),m=Pn(async S=>{i(!0);try{let h=await S.getBalance();if(u.current!==S)return;n(h),c(null)}catch(h){if(u.current!==S)return;c(h instanceof Error?h:new Error(String(h)))}finally{u.current===S&&i(!1)}},[]);sa(()=>{if(u.current=e,n(null),c(null),!e){i(!1);return}if(m(e),r!==void 0&&r>0){let S=setInterval(()=>{m(e)},r);return()=>{clearInterval(S),u.current===e&&(u.current=null)}}return()=>{u.current===e&&(u.current=null)}},[e,r,m]);let l=Pn(async()=>{let S=u.current;S&&await m(S)},[m]);return{balance:o,isExhausted:aa(o),loading:s,error:a,refresh:l}}import{jsx as ur}from"react/jsx-runtime";function ua({client:e,children:t,fallback:r,className:o}){let{balance:n,isExhausted:s}=ar(e),i=["urun-credits-gate",o].filter(Boolean).join(" ");if(!s)return ur("div",{className:i,children:t});let a=r?r(n):ur("span",{className:"urun-credits-gate-fallback",children:"Out of credits \u2014 add credits to keep running sessions."});return ur("div",{className:i,children:a})}import{CreditsClient as Gd,createCreditsClient as Xd,CreditsError as zd,CreditsUnauthorizedError as Jd}from"@urun-sh/core";import{useContext as ca,useEffect as la,useState as da}from"react";import{prewake as pa}from"@urun-sh/core";function ma(e){let t=ca(Ce),[r,o]=da(null),n=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,c=t?.orgId,u=t?.jwt,m=t?.getAccessToken,l=t?.authProvider;return la(()=>{if(!a||!c||!n||!s)return;let S=!1,h=()=>{pa({baseUrl:a,app:n,functionName:s,orgId:c,jwt:u,getAccessToken:m,authProvider:l}).then(v=>{S||o(v)}).catch(()=>{})};h();let w=setInterval(h,Math.max(1,i)*1e3);return()=>{S=!0,clearInterval(w)}},[n,s,i,a,c,u,m,l]),r}import{useEffect as fa,useState as Sa}from"react";function ga(e){let[t,r]=Sa(null);return fa(()=>{if(r(null),!!e?.onStats)return e.onStats(r)},[e]),t}import{describeSessionPhase as op,isWakingPhase as sp}from"@urun-sh/core";export{pt as Audio,ln as Camera,Wo as ComponentRenderer,Gd as CreditsClient,zd as CreditsError,Jd as CreditsUnauthorizedError,cn as DEFAULT_CAMERA_CONSTRAINTS,Ne as DEFAULT_LOG_CAP,en as DEFAULT_SMOOTH_CHARS_PER_FRAME,tn as DEFAULT_SMOOTH_THRESHOLD,on as DEFAULT_VOICE_CONSTRAINTS,vt as DocPatchForm,gs as Image,ts as ImageFrame,es as ImageFrameSchema,os as MetricsPanel,ns as MetricsPanelSchema,Hs as Mic,On as OPERATOR_CHORD_LABEL,Ln as OPERATOR_TOKEN_STORAGE_KEY,Ko as ProgressCard,jo as ProgressCardSchema,Fo as ReprojectedVideo,Eo as Session,Xo as StatusBadge,$o as StatusBadgeSchema,ms as Text,Zo as TextStream,Xe as TextStreamError,Yo as TextStreamSchema,rr as UrunActivationOverlay,Rs as UrunAudio,bt as UrunAuthProvider,Js as UrunCamera,Ti as UrunControlSender,ua as UrunCreditsGate,yi as UrunDocPanel,Ke as UrunErrorBoundary,Pi as UrunEventSpine,na as UrunIdleWarning,wn as UrunJwtProvider,Gn as UrunProvider,zi as UrunSessionClock,Qi as UrunSessionEnded,Ki as UrunSessionGate,bn as UrunSessionPaused,ji as UrunSessionStatus,er as UrunSessionWaking,hi as UrunStreamTail,_s as UrunVoice,We as Video,ft as Voice,rt as authMode,Xd as createCreditsClient,Jt as createDocStore,op as describeSessionPhase,Qe as formatPayload,at as getUrunAudioContext,sp as isWakingPhase,Yt as parseJsonObject,Ae as pushCapped,mr as readOperatorToken,Ho as registerComponent,He as resumeUrunAudioContext,Qr as textDelta,fe as urunPublicEnv,tr as useActivation,to as useApp,vo as useChat,fo as useCompletion,Ct as useConfirmOnLeave,ar as useCredits,Ze as useDocStore,fi as useGenerationTick,Jr as useImageFrame,Ro as useInputPresence,Yr as useMetricsPanel,Rt as useOperatorOverride,Br as useProgressCard,ti as useReferenceImage,co as useRequest,xo as useSession,so as useSessionDirectory,di as useSessionDoc,kn as useSessionEndsAt,Cn as useSessionIdle,pe as useSessionPhase,ga as useSessionStats,oi as useSessionTrack,Qt as useSessionWake,Kr as useStatusBadge,Zt as useStreamMessages,nn as useText,ps as useTextMeter,Xr as useTextStream,$t as useUrunAudioLevel,Tt as useUrunAuth,ma as useUrunPrewake,_n as usesWorkOSAuth};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@urun-sh/react",
3
- "version": "0.6.16",
3
+ "version": "0.6.18",
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.6.16",
56
+ "@urun-sh/core": "^0.6.18",
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",