@urun-sh/react 0.2.41 → 0.2.43

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 nr=Object.defineProperty;var Yn=Object.getOwnPropertyDescriptor;var Zn=Object.getOwnPropertyNames;var Qn=Object.prototype.hasOwnProperty;var eo=(e,t)=>{for(var r in t)nr(e,r,{get:t[r],enumerable:!0})},to=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Zn(t))!Qn.call(e,n)&&n!==r&&nr(e,n,{get:()=>t[n],enumerable:!(o=Yn(t,n))||o.enumerable});return e};var ro=e=>to(nr({},"__esModule",{value:!0}),e);var No={};eo(No,{Audio:()=>Rt,Camera:()=>Rr,ComponentRenderer:()=>on,DEFAULT_CAMERA_CONSTRAINTS:()=>br,DEFAULT_LOG_CAP:()=>_e,DEFAULT_VOICE_CONSTRAINTS:()=>vr,DocPatchForm:()=>xt,Image:()=>Sn,ImageFrame:()=>mn,ImageFrameSchema:()=>pn,MetricsPanel:()=>gn,MetricsPanelSchema:()=>fn,Mic:()=>xn,OPERATOR_CHORD_LABEL:()=>Lr,OPERATOR_TOKEN_STORAGE_KEY:()=>Nr,ProgressCard:()=>an,ProgressCardSchema:()=>sn,ReprojectedVideo:()=>en,Session:()=>Xr,StatusBadge:()=>cn,StatusBadgeSchema:()=>un,TextStream:()=>dn,TextStreamSchema:()=>ln,UrunActivationOverlay:()=>Yt,UrunAudio:()=>bn,UrunAuthProvider:()=>or,UrunCamera:()=>En,UrunControlSender:()=>On,UrunDocPanel:()=>In,UrunErrorBoundary:()=>$e,UrunEventSpine:()=>Dn,UrunIdleWarning:()=>Kn,UrunJwtProvider:()=>Ur,UrunProvider:()=>Fr,UrunSessionClock:()=>Wn,UrunSessionEnded:()=>jn,UrunSessionGate:()=>Hn,UrunSessionStatus:()=>qn,UrunSessionWaking:()=>Jt,UrunStreamTail:()=>Nn,UrunVoice:()=>Cn,Video:()=>Fe,Voice:()=>Ct,authMode:()=>dt,createDocStore:()=>Ft,describeSessionPhase:()=>er.describeSessionPhase,formatPayload:()=>nt,getUrunAudioContext:()=>kt,isWakingPhase:()=>er.isWakingPhase,parseJsonObject:()=>Ht,pushCapped:()=>Te,readOperatorToken:()=>sr,registerComponent:()=>rn,resumeUrunAudioContext:()=>bt,urunPublicEnv:()=>xe,useActivation:()=>Xt,useApp:()=>Hr,useChat:()=>zr,useCompletion:()=>jr,useConfirmOnLeave:()=>Mt,useDocStore:()=>rt,useImageFrame:()=>gr,useInputPresence:()=>Jr,useMetricsPanel:()=>hr,useOperatorOverride:()=>Ut,useProgressCard:()=>pr,useReferenceImage:()=>wn,useRequest:()=>Wr,useSession:()=>Gr,useSessionDoc:()=>_n,useSessionEndsAt:()=>Cr,useSessionIdle:()=>xr,useSessionPhase:()=>Se,useSessionTrack:()=>Tn,useSessionWake:()=>zt,useStatusBadge:()=>mr,useStreamMessages:()=>Bt,useTextStream:()=>fr,useUrunAudioLevel:()=>Dt,useUrunAuth:()=>Tt,useUrunPrewake:()=>zn,usesWorkOSAuth:()=>Tr});module.exports=ro(No);var ae=require("react");var Er=require("react"),lt=require("react/jsx-runtime"),$e=class extends Er.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,lt.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,lt.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,lt.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var wr=require("react"),ze=(0,wr.createContext)(null);function De(e){return e&&e.trim()?e.trim():void 0}function xe(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return De(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return De(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return De(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return De(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return De(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return De(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return De(typeof process<"u"?process.env?.[e]:void 0)}}function dt(){let e=xe("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||xe("VERCEL_ENV")==="production"?"workos":xe("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Tr(){return dt()==="workos"}var Je=require("react"),Mr=require("react/jsx-runtime"),Ar=(0,Je.createContext)(null);function or({getAccessToken:e,children:t}){let r=(0,Je.useMemo)(()=>({getAccessToken:e}),[e]);return(0,Mr.jsx)(Ar.Provider,{value:r,children:t})}var Ur=or;function Tt(){return(0,Je.useContext)(Ar)}var At=require("react"),Nr="urun.operator_token",Ir=null,_r="op",Lr="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function Or(){return typeof window<"u"}function sr(){return Ir}function no(){if(!Or())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(_r);if(!r)return null;Ir=r,t.delete(_r);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function oo(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function Ut(e){let t=(0,At.useRef)(e);t.current=e,(0,At.useEffect)(()=>{if(!Or())return;no();let r=o=>{if(!oo(o))return;let n=sr();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}var Dr=require("react");function Mt(e=!0){(0,Dr.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 Me=require("react/jsx-runtime"),so="/api/urun-token",io=1e4;function ao(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 Vr(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 uo(e,t){return typeof e=="function"?e(t):e!==void 0?e:(0,Me.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,Me.jsx)("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),(0,Me.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function Fr({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,confirmOnLeave:f=!1,fallback:l,errorFallback:v,children:P}){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 p=r??o;if(g&&(typeof p!="string"||p.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);Mt(f);let[h,m]=(0,ae.useState)(),[k,b]=(0,ae.useState)(),[T,S]=(0,ae.useState)(null),y=(0,ae.useRef)(void 0),E=(0,ae.useRef)(null),[w,L]=(0,ae.useState)(null);Ut(X=>L({jwt:X}));let d=Tt(),x=xe("NEXT_PUBLIC_SESSION_TOKEN")??xe("NEXT_PUBLIC_URUN_JWT"),R=dt(),M=w!==null,V=R==="workos"&&!n&&!M&&!g,Y=n??(R==="jwt"?x:void 0)??h??k?.token,I=M?w.jwt:Y,N=s??xe("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),H=V&&!I,$=t??k?.orgId,W=e??k?.gatewayUrl,j=g&&k===void 0,oe=g&&k!==void 0&&!W?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,le=T??oe,Q=u??so,B=(0,ae.useCallback)(async X=>{if(!X?.forceRefresh){let G=y.current;if(!G)return G;let C=ao(G);if(C===null||C-Date.now()>io)return G}return(await(E.current??(E.current=(async()=>{try{let G=await Vr(Q);return y.current=G.token,b(G),G}finally{E.current=null}})()))).token},[Q]),re=(0,ae.useMemo)(()=>({appId:p,baseUrl:W??"",orgId:$??"",jwt:I,getAccessToken:V?d?.getAccessToken:g&&!M?B:void 0,authProvider:N,eventsUrl:i,sessionKey:a,releaseOnLeave:c,priority:M?"preempt":void 0}),[p,d,W,N,I,i,$,a,c,V,M,g,B]);return(0,ae.useEffect)(()=>{if(!g)return;let X=new AbortController;return S(null),(async()=>{try{let ue=await Vr(Q,X.signal);y.current=ue.token,b(ue)}catch(ue){if(X.signal.aborted)return;S(ue instanceof Error?ue:new Error(String(ue)))}})(),()=>X.abort()},[g,Q]),(0,ae.useEffect)(()=>{if(!V||!d)return;let X=!1,ue=d;async function G(){try{let D=await ue.getAccessToken();X||m(D??void 0)}catch{X||m(void 0)}}G();let C=window.setInterval(()=>{G()},6e4);return()=>{X=!0,window.clearInterval(C)}},[d,V]),(0,Me.jsx)($e,{fallback:l,children:le?uo(v,le):H||j?(0,Me.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,Me.jsx)(ze.Provider,{value:re,children:P})})}var pe=require("react"),qr=require("@urun-sh/core");function co(e,t){return`${e}:${JSON.stringify(t??{})}`}function lo(e,t,r){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,fnName:t,args:r??{}})}var Ve=new Map;var ir=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},ar=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()}},ur=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||a.name==="expired"){let u=a.error,c=u?.reason??(a.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else a.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),i=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{i(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new ir(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new ar(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function Hr(){let e=(0,pe.useContext)(ze);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=(0,pe.useReducer)(i=>i+1,0),r=(0,pe.useRef)(new Map),o=(0,pe.useRef)(new Map),n=(0,pe.useRef)(null),s=(0,pe.useMemo)(()=>(0,qr.App)(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority]);return(0,pe.useEffect)(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=Ve.get(a);c===u&&o.current.get(a)===u&&(c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null),c.handle.addNotifier(t),c.refCount+=1)}}return()=>{let a=new Map;for(let[u,c]of o.current){let f=Ve.get(u);f===c&&(f.handle.removeNotifier(t),f.refCount=Math.max(0,f.refCount-1),a.set(u,f),f.refCount===0&&(f.disposeTimer=setTimeout(()=>{let l=Ve.get(u);!l||l.refCount!==0||(Ve.delete(u),l.handle.disconnect())},0)))}n.current=a}},[]),(0,pe.useMemo)(()=>{let i=new Map;return new Proxy({},{get(a,u){if(typeof u!="string")return;let c=i.get(u);if(c)return c;let f=l=>{let v=co(u,l),P=r.current.get(v);if(P&&!P.disposed)return P;let g=lo(e,u,l),p=Ve.get(g);return p?.handle.disposed&&(p.disposeTimer&&clearTimeout(p.disposeTimer),Ve.delete(g),o.current.get(g)===p&&o.current.delete(g),p=void 0),p?p.disposeTimer&&(clearTimeout(p.disposeTimer),p.disposeTimer=null):(p={handle:new ur(s[u](l),t,e.eventsUrl),refCount:0,disposeTimer:null},Ve.set(g,p)),o.current.get(g)!==p&&(o.current.set(g,p),p.handle.addNotifier(t),p.refCount+=1),r.current.set(v,p.handle),p.handle};return i.set(u,f),f}})},[e,s])}var ne=require("react");function Xe(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 po(e){return e instanceof Error?e:new Error(String(e))}function Wr(e,t){let r=(0,ne.useMemo)(()=>Xe(e),[e]),[o,n]=(0,ne.useState)(void 0),[s,i]=(0,ne.useState)(null),[a,u]=(0,ne.useState)(!1),c=(0,ne.useRef)(t);c.current=t;let f=(0,ne.useRef)(0),l=(0,ne.useRef)(null),v=(0,ne.useRef)(!0);(0,ne.useEffect)(()=>(v.current=!0,()=>{v.current=!1,l.current?.abort()}),[]);let P=(0,ne.useCallback)(async h=>{l.current?.abort();let m=new AbortController;l.current=m;let k=++f.current,b=()=>v.current&&f.current===k;b()&&(u(!0),i(null));try{let T=await r.request(h,{...c.current,signal:m.signal});return b()&&(n(T),u(!1),c.current?.onSuccess?.(T)),T}catch(T){let S=po(T);throw b()&&(i(S),u(!1),c.current?.onError?.(S)),S}},[r]),g=(0,ne.useCallback)(h=>{P(h).catch(()=>{})},[P]),p=(0,ne.useCallback)(()=>{f.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:g,mutateAsync:P,data:o,error:s,isPending:a,reset:p}}var ie=require("react");function Br(e){return e instanceof Error?e:new Error(String(e))}var mo=e=>typeof e=="string"?e:String(e);function jr(e,t){let r=(0,ie.useMemo)(()=>Xe(e),[e]),[o,n]=(0,ie.useState)(""),[s,i]=(0,ie.useState)(!1),[a,u]=(0,ie.useState)(null),c=(0,ie.useRef)(t);c.current=t;let f=(0,ie.useRef)(0),l=(0,ie.useRef)(null),v=(0,ie.useRef)(!0);(0,ie.useEffect)(()=>(v.current=!0,()=>{v.current=!1,l.current?.cancel(),l.current=null}),[]);let P=(0,ie.useCallback)(()=>{f.current++,l.current?.cancel(),l.current=null,v.current&&i(!1)},[]),g=(0,ie.useCallback)(async p=>{l.current?.cancel();let h=++f.current,m=()=>v.current&&f.current===h,k=c.current,b=k?.parseChunk??mo,T=k?.buildPayload??(R=>({prompt:R}));m()&&(n(""),u(null),i(!0));let{parseChunk:S,buildPayload:y,onFinish:E,onError:w,...L}=k??{},d="",x;try{x=r.requestStream(T(p),L),l.current=x}catch(R){let M=Br(R);m()&&(u(M),i(!1),k?.onError?.(M));return}try{for await(let R of x){if(f.current!==h)break;d+=b(R),m()&&n(d)}m()&&(i(!1),k?.onFinish?.(d))}catch(R){let M=Br(R);m()&&(u(M),i(!1),k?.onError?.(M))}finally{l.current===x&&(l.current=null)}},[r]);return{completion:o,complete:g,stop:P,isStreaming:s,error:a}}var ee=require("react");function Kr(e){return e instanceof Error?e:new Error(String(e))}var fo=e=>typeof e=="string"?e:String(e),$r=0;function cr(e){return $r+=1,`${e}-${$r}`}function zr(e,t){let r=(0,ee.useMemo)(()=>Xe(e),[e]),[o,n]=(0,ee.useState)(()=>(t?.initialMessages??[]).map(b=>({id:b.id??cr("msg"),role:b.role,content:b.content}))),[s,i]=(0,ee.useState)(""),[a,u]=(0,ee.useState)(!1),[c,f]=(0,ee.useState)(null),l=(0,ee.useRef)(t);l.current=t;let v=(0,ee.useRef)(o);v.current=o;let P=(0,ee.useRef)(s);P.current=s;let g=(0,ee.useRef)(0),p=(0,ee.useRef)(null),h=(0,ee.useRef)(!0);(0,ee.useEffect)(()=>(h.current=!0,()=>{h.current=!1,p.current?.cancel(),p.current=null}),[]);let m=(0,ee.useCallback)(()=>{g.current++,p.current?.cancel(),p.current=null,h.current&&u(!1)},[]),k=(0,ee.useCallback)(async b=>{let T=b===void 0,S=(T?P.current:b)??"";if(!S.trim())return;p.current?.cancel();let E=++g.current,w=()=>h.current&&g.current===E,L=l.current,d=L?.parseChunk??fo,x={id:cr("msg"),role:"user",content:S},R={id:cr("msg"),role:"assistant",content:""},M=[...v.current,x].map(B=>({role:B.role,content:B.content})),V=[...v.current,x,R];v.current=V,n(V),T&&i(""),f(null),u(!0);let Y=L?.buildPayload??(B=>({messages:B})),{initialMessages:I,parseChunk:N,buildPayload:H,onFinish:$,onError:W,...j}=L??{},oe=B=>{n(re=>re.map(X=>X.id===R.id?{...X,content:B}:X))},le="",Q;try{Q=r.requestStream(Y(M),j),p.current=Q}catch(B){let re=Kr(B);w()&&(f(re),u(!1),L?.onError?.(re));return}try{for await(let B of Q){if(g.current!==E)break;le+=d(B),w()&&oe(le)}w()&&(u(!1),L?.onFinish?.({...R,content:le}))}catch(B){let re=Kr(B);w()&&(f(re),u(!1),L?.onError?.(re))}finally{p.current===Q&&(p.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:k,stop:m,isStreaming:a,error:c}}var Z=require("react"),Ge=require("@urun-sh/core"),lr=[];function Jr(e,t={}){let{field:r=Ge.INPUT_PRESENCE_FIELD,hz:o=Ge.INPUT_PRESENCE_DEFAULT_HZ}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=(0,Z.useMemo)(()=>s?(0,Ge.createInputPresencePublisher)({awareness:{setLocalStateField:(S,y)=>s.setField(S,y)},field:r,hz:o}):null,[s,r,o]),a=(0,Z.useRef)(null);a.current=i;let[u,c]=(0,Z.useState)(!1),[f,l]=(0,Z.useState)(lr),v=(0,Z.useRef)(!1);(0,Z.useEffect)(()=>{if(i)return()=>i.dispose()},[i]);let P=(0,Z.useCallback)(()=>{let S=a.current;l(S?S.heldKeys():lr)},[]),g=(0,Z.useCallback)(()=>{a.current?.clear(),l(lr)},[]);(0,Z.useEffect)(()=>{if(!n)return;let S=()=>!!n.pointerLockElement,y=()=>{if(S()){v.current=!1,c(!0);return}v.current||(c(!1),g())},E=R=>{S()&&(a.current?.keyDown(R.key),P())},w=R=>{a.current?.keyUp(R.key),P()},L=R=>{S()&&a.current?.movePointer(R.movementX,R.movementY)},d=R=>{S()&&a.current?.setButtons(R.buttons)},x=()=>{g()};return n.addEventListener("pointerlockchange",y),n.addEventListener("keydown",E),n.addEventListener("keyup",w),n.addEventListener("mousemove",L),n.addEventListener("mousedown",d),n.addEventListener("mouseup",d),n.defaultView?.addEventListener("blur",x),()=>{n.removeEventListener("pointerlockchange",y),n.removeEventListener("keydown",E),n.removeEventListener("keyup",w),n.removeEventListener("mousemove",L),n.removeEventListener("mousedown",d),n.removeEventListener("mouseup",d),n.defaultView?.removeEventListener("blur",x)}},[n,g,P]);let p=(0,Z.useCallback)(S=>{S.requestPointerLock?.()},[]),h=(0,Z.useCallback)(()=>{v.current=!0,c(!0)},[]),m=(0,Z.useCallback)(()=>{v.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),g()},[n,g]),k=(0,Z.useCallback)(S=>{a.current?.keyDown(S),P()},[P]),b=(0,Z.useCallback)(S=>{a.current?.keyUp(S),P()},[P]),T=(0,Z.useCallback)((S,y)=>{a.current?.movePointer(S,y)},[]);return{engage:p,engageTouch:h,release:m,engaged:u,heldKeys:f,pressKey:k,releaseKey:b,movePointer:T}}var ce=require("react"),Qr=require("@urun-sh/core");var O=require("react");var pt=require("react"),Yr=require("react/jsx-runtime"),dr=(0,pt.createContext)(null);function Xr({session:e,children:t}){return(0,Yr.jsx)(dr.Provider,{value:e,children:t})}function Pe(){return(0,pt.useContext)(dr)}function Gr(){let e=(0,pt.useContext)(dr);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 mt=require("react/jsx-runtime");function go(e,t){return e-t>>>0<2147483648}var Zr=1e3;function ho(...e){console.debug("[video]",...e)}var Fe=(0,O.forwardRef)(function(t,r){let{session:o,stream:n="video",audioStream:s="audio",track:i,muted:a=!0,mirror:u=!1,objectFit:c="contain",className:f,style:l,videoClassName:v,placeholder:P,poster:g,children:p,onTrack:h,onFirstFrame:m,frameMarker:k,onFrameMarkerReached:b,onFrameMarkerUnsupported:T}=t,S=Pe(),y=o??S,E=(0,O.useRef)(null),w=(0,O.useRef)(null),[L,d]=(0,O.useState)(!1),[x,R]=(0,O.useState)(!1),M=(0,O.useRef)(!1),V=(0,O.useRef)(h);V.current=h;let Y=(0,O.useRef)(m);Y.current=m;let I=(0,O.useRef)(b);I.current=b;let N=(0,O.useRef)(T);N.current=T;let H=(0,O.useRef)(k??null);H.current=k??null;let $=(0,O.useRef)(null),W=(0,O.useRef)(null),j=(0,O.useCallback)((C,D=!1)=>{if(!D&&C===$.current||($.current=C,W.current?.(),W.current=null,M.current=!1,R(!1),!C))return;let _=E.current;if(!_)return;let z=H.current,fe=z?.rtpTimestamp??null,se=!1,A=()=>{se||(se=!0,N.current?.())};z&&fe==null&&A();let de=z!=null&&fe!=null,Oe=ye=>{W.current?.(),W.current=null,M.current=!0,R(!0),Y.current?.(),ye&&I.current?.()};if(typeof _.requestVideoFrameCallback=="function"){let ye=!1,je=0,at=(tr,rr)=>{if(!ye){if(de){let wt=rr?.rtpTimestamp;if(typeof wt!="number"){A(),Oe(!1);return}if(!go(wt,fe)){je=_.requestVideoFrameCallback(at);return}Oe(!0);return}Oe(!1)}};je=_.requestVideoFrameCallback(at),W.current=()=>{ye=!0,_.cancelVideoFrameCallback?.(je)};return}de&&A();let ge=()=>{let ye=_.getVideoPlaybackQuality?.();(ye?ye.totalVideoFrames>0:_.readyState>=2&&_.videoWidth>0)&&Oe(!1)};_.addEventListener("loadeddata",ge),_.addEventListener("timeupdate",ge),_.addEventListener("playing",ge),W.current=()=>{_.removeEventListener("loadeddata",ge),_.removeEventListener("timeupdate",ge),_.removeEventListener("playing",ge)},ge()},[]);(0,O.useEffect)(()=>()=>{W.current?.(),W.current=null},[]);let oe=k==null?null:`${k.rtpTimestamp??""}|${k.ptsMs??""}`,le=(0,O.useRef)(oe);(0,O.useEffect)(()=>{if(le.current===oe||(le.current=oe,oe==null))return;let C=$.current;C&&j(C,!0)},[oe,j]);let Q=(0,O.useCallback)(()=>{if(typeof MediaStream>"u")return null;w.current||(w.current=new MediaStream);let C=E.current;return C&&C.srcObject!==w.current&&(C.srcObject=w.current),w.current},[]),B=(0,O.useCallback)(C=>{let D=E.current;if(!D)return;let _=D.play();!_||typeof _.catch!="function"||_.catch(z=>ho(`play() failed (${C})`,z))},[]),re=(0,O.useCallback)(C=>{let D=Q();if(D){for(let _ of D.getVideoTracks())_!==C&&D.removeTrack(_);if(C&&!D.getVideoTracks().includes(C)){D.addTrack(C);let _=E.current;_&&(_.srcObject=D)}C&&B("track-attach"),d(C!==null),j(C),V.current?.(C)}},[Q,B,j]),X=(0,O.useCallback)(C=>{let D=Q();if(D){for(let _ of D.getAudioTracks())_!==C&&D.removeTrack(_);C&&!D.getAudioTracks().includes(C)&&D.addTrack(C),C&&B("audio-attach")}},[Q,B]),ue=(0,O.useCallback)(C=>{E.current=C,C&&(a&&(C.muted=!0,C.defaultMuted=!0,C.setAttribute("muted","")),C.setAttribute("playsinline",""),C.setAttribute("webkit-playsinline",""),Q())},[Q,a]);(0,O.useImperativeHandle)(r,()=>({get element(){return E.current},get live(){return w.current?w.current.getVideoTracks().length>0:!1},get framed(){return M.current}}),[]);let G=i!==void 0;return(0,O.useEffect)(()=>{if(G){re(i??null);return}if(!y)return;let C=y.stream(n),D=()=>{let A=w.current;return A?A.getVideoTracks()[0]??null:null},_=A=>{if(A!==D()&&(re(A),A)){let de=()=>{D()===A&&re(null)};A.addEventListener("ended",de)}},z=C.track;z&&z.readyState==="live"&&_(z);let fe=C.on("track",A=>{A&&A.readyState!=="live"||_(A)}),se=setInterval(()=>{let A=C.track;A&&A.readyState==="live"&&_(A)},Zr);return()=>{fe(),clearInterval(se)}},[y,n,G,i,re]),(0,O.useEffect)(()=>{if(G||!y||s===!1)return;let C=y.stream(s),D=()=>{let A=w.current;return A?A.getAudioTracks()[0]??null:null},_=A=>{if(A!==D()&&(X(A),A)){let de=()=>{D()===A&&X(null)};A.addEventListener("ended",de)}},z=C.track;z&&z.readyState==="live"&&_(z);let fe=C.on("track",A=>{A&&A.readyState!=="live"||_(A)}),se=setInterval(()=>{let A=C.track;A&&A.readyState==="live"&&_(A)},Zr);return()=>{fe(),clearInterval(se)}},[y,s,G,X]),(0,mt.jsxs)("div",{className:f,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":L?"true":"false","data-urun-video-framed":x?"true":"false",children:[(0,mt.jsx)("video",{ref:ue,className:v,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),L?null:P,g===void 0?null:(0,mt.jsx)("div",{"data-urun-video-poster":"","aria-hidden":x||void 0,style:{position:"absolute",inset:0,...x?{opacity:0,pointerEvents:"none"}:null},children:g}),p]})});var ft=require("react/jsx-runtime"),So={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},en=(0,ce.forwardRef)(function(t,r){let{warp:o,children:n,...s}=t,{enabled:i=!0,overscan:a=.08,captureInput:u=!0,documentTarget:c,...f}=o??{},l=c!==void 0?c:typeof document<"u"?document:null,v=(0,ce.useRef)(null),P=(0,ce.useRef)(null),g=(0,ce.useRef)(0),p=(0,ce.useRef)(f);p.current=f;let h=(0,ce.useMemo)(()=>(0,Qr.createCameraWarp)(p.current),[]);return(0,ce.useImperativeHandle)(r,()=>({get video(){return v.current},get canvas(){return P.current},warp:h,get lastDrawTs(){return g.current}}),[h]),(0,ce.useEffect)(()=>{if(!i)return;let m=0,k=0,b=null,T=y=>{typeof y.requestVideoFrameCallback=="function"&&(b=y,k=y.requestVideoFrameCallback(function E(){h.frameArrived(),k=y.requestVideoFrameCallback(E)}))},S=y=>{m=requestAnimationFrame(S);let E=P.current,w=v.current?.element??null;if(!E||!w||(w!==b&&(b&&k&&b.cancelVideoFrameCallback?.(k),T(w)),w.readyState<2))return;h.tick(y);let L=typeof devicePixelRatio=="number"?devicePixelRatio:1,d=Math.max(1,Math.round(E.clientWidth*L)),x=Math.max(1,Math.round(E.clientHeight*L));(E.width!==d||E.height!==x)&&(E.width=d,E.height=x);let R=E.getContext("2d");if(!R)return;let M=h.transform(),V=w.videoWidth||d,Y=w.videoHeight||x,N=Math.max(d/V,x/Y)*(1+a)*M.scale;R.setTransform(N,0,0,N,d/2+M.translateX*d,x/2+M.translateY*x),R.drawImage(w,-V/2,-Y/2),g.current=y};return m=requestAnimationFrame(S),()=>{cancelAnimationFrame(m),b&&k&&b.cancelVideoFrameCallback?.(k)}},[i,a,h]),(0,ce.useEffect)(()=>{if(!i||!u||!l)return;let m=()=>!!l.pointerLockElement,k=E=>{m()&&h.keyDown(E.key)},b=E=>h.keyUp(E.key),T=E=>{m()&&h.pointerDelta(E.movementX,E.movementY)},S=()=>{m()||h.clearKeys()},y=()=>h.clearKeys();return l.addEventListener("keydown",k),l.addEventListener("keyup",b),l.addEventListener("mousemove",T),l.addEventListener("pointerlockchange",S),l.defaultView?.addEventListener("blur",y),()=>{l.removeEventListener("keydown",k),l.removeEventListener("keyup",b),l.removeEventListener("mousemove",T),l.removeEventListener("pointerlockchange",S),l.defaultView?.removeEventListener("blur",y)}},[i,u,l,h]),i?(0,ft.jsxs)(Fe,{ref:v,...s,videoClassName:s.videoClassName,style:{...s.style},children:[(0,ft.jsx)("canvas",{ref:P,style:So,"data-urun-warp":""}),n]}):(0,ft.jsx)(Fe,{ref:v,...s,children:n})});var tn=new Map;function rn(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);tn.set(e,{component:t,schema:r})}function nn(e,t){let r=tn.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 qe=require("react/jsx-runtime");function on({name:e,props:t,fallback:r}){let o=nn(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?(0,qe.jsx)(qe.Fragment,{children:r}):(0,qe.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,qe.jsx)("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return(0,qe.jsx)(n,{...o.validatedProps})}var Ye=require("zod"),He=require("react/jsx-runtime"),sn=Ye.z.object({step:Ye.z.number().min(0),total:Ye.z.number().min(1),label:Ye.z.string().optional(),variant:Ye.z.enum(["default","success","error"]).default("default")});function pr(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 an(e){let{step:t,total:r,label:o,variant:n,percentage:s}=pr(e);return(0,He.jsxs)("div",{className:"urun-progress-card","data-variant":n,children:[o&&(0,He.jsx)("div",{className:"urun-progress-label",children:o}),(0,He.jsx)("div",{className:"urun-progress-bar",children:(0,He.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,He.jsxs)("div",{className:"urun-progress-text",children:[t,"/",r]})]})}var _t=require("zod"),gt=require("react/jsx-runtime"),un=_t.z.object({state:_t.z.enum(["thinking","generating","idle","error"]),message:_t.z.string().optional()}),vo={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function mr(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??vo[t]??t;return{state:t,message:n,isActive:o}}function cn(e){let{state:t,message:r,isActive:o}=mr(e);return(0,gt.jsxs)("span",{className:"urun-status-badge","data-state":t,children:[(0,gt.jsx)("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),(0,gt.jsx)("span",{className:"urun-status-message",children:r})]})}var ht=require("react"),Nt=require("zod"),St=require("react/jsx-runtime"),ln=Nt.z.object({text:Nt.z.string(),streaming:Nt.z.boolean().default(!1)});function fr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function dn(e){let{text:t,streaming:r}=fr(e),o=(0,ht.useRef)(null),n=(0,ht.useRef)(0);return(0,ht.useEffect)(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),(0,St.jsxs)("div",{className:"urun-text-stream",children:[(0,St.jsx)("span",{ref:o,className:"urun-text-content"}),r&&(0,St.jsx)("span",{className:"urun-text-cursor"})]})}var vt=require("zod"),yt=require("react/jsx-runtime"),pn=vt.z.object({src:vt.z.string().url(),alt:vt.z.string().optional(),caption:vt.z.string().optional()});function gr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function mn(e){let{src:t,alt:r,caption:o}=gr(e);return(0,yt.jsxs)("figure",{className:"urun-image-frame",children:[(0,yt.jsx)("img",{className:"urun-image",src:t,alt:r}),o&&(0,yt.jsx)("figcaption",{className:"urun-image-caption",children:o})]})}var Ee=require("zod"),Ze=require("react/jsx-runtime"),fn=Ee.z.object({metrics:Ee.z.array(Ee.z.object({label:Ee.z.string(),value:Ee.z.union([Ee.z.string(),Ee.z.number()]),unit:Ee.z.string().optional()}))});function hr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function gn(e){let{metrics:t}=hr(e);return(0,Ze.jsx)("div",{className:"urun-metrics-panel",children:t.map((r,o)=>(0,Ze.jsxs)("div",{className:"urun-metric-card",children:[(0,Ze.jsx)("div",{className:"urun-metric-label",children:r.label}),(0,Ze.jsx)("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}var hn=require("react");var vn=require("react/jsx-runtime"),Sn=(0,hn.forwardRef)(function(t,r){let{stream:o="image",...n}=t;return(0,vn.jsx)(Fe,{ref:r,stream:o,...n})});var J=require("react"),kn=require("@urun-sh/core");var It=null;function yo(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function kt(){if(It)return It;let e=yo();return e?(It=new e,It):null}function bt(){let e=kt();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var Rn=require("react/jsx-runtime"),ko=1e3,yn=200;function Sr(...e){console.debug("[audio]",...e)}var Rt=(0,J.forwardRef)(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:f}=t,l=Pe(),v=o??l,P=(0,J.useRef)(null),g=(0,J.useRef)(null),p=(0,J.useRef)(null),h=(0,J.useRef)(null),m=(0,J.useRef)(u);m.current=u;let k=(0,J.useRef)(c);k.current=c;let b=(0,J.useCallback)(d=>{p.current!==d&&(p.current=d,k.current?.(d))},[]),T=(0,J.useCallback)(()=>{if(typeof MediaStream>"u")return null;g.current||(g.current=new MediaStream);let d=P.current;return d&&d.srcObject!==g.current&&(d.srcObject=g.current),g.current},[]),S=(0,J.useCallback)(d=>{let x=P.current;if(!x)return;let R=x.play();!R||typeof R.then!="function"||R.then(()=>{x.muted||b(!0)}).catch(M=>{let V=M instanceof Error?M.name:String(M);if(V==="AbortError"){Sr(`play() aborted (${d}); retrying in ${yn}ms`),h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{h.current=null,S(`${d}:retry`)},yn);return}if(V==="NotAllowedError"){Sr(`play() blocked pending a user gesture (${d})`),b(!1);return}Sr(`play() failed (${d})`,M)})},[b]),y=(0,J.useCallback)(d=>{let x=T();if(x){for(let R of x.getAudioTracks())R!==d&&x.removeTrack(R);d&&!x.getAudioTracks().includes(d)&&x.addTrack(d),d&&S("track-attach"),m.current?.(d)}},[T,S]),E=(0,J.useCallback)(()=>{let d=P.current;d&&(T(),d.muted=!1,S("gesture"),bt(),b(!0))},[T,S,b]);(0,J.useImperativeHandle)(r,()=>({unlock:E,get unlocked(){return p.current===!0},get element(){return P.current}}),[E]);let w=(0,J.useCallback)(d=>{P.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),T()),f?.(d)},[T,f]),L=s!==void 0;return(0,J.useEffect)(()=>{if(L){y(s??null);return}if(!v)return;let d=v.stream(n),x=()=>{let I=g.current;return I?I.getAudioTracks()[0]??null:null},R=I=>{if(I!==x()&&(y(I),I)){let N=()=>{x()===I&&y(null)};I.addEventListener("ended",N)}},M=d.track;M&&M.readyState==="live"&&R(M);let V=d.on("track",I=>{I&&I.readyState!=="live"||R(I)}),Y=setInterval(()=>{let I=d.track;I&&I.readyState==="live"&&R(I)},ko);return()=>{V(),clearInterval(Y)}},[v,n,L,s,y]),(0,J.useEffect)(()=>(0,kn.observePageLifecycle)(()=>{bt(),p.current===!0&&S("foreground")}),[S]),(0,J.useEffect)(()=>()=>{h.current&&clearTimeout(h.current)},[]),(0,Rn.jsx)("audio",{ref:w,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),bn=Rt;var K=require("react"),Qe=require("@urun-sh/core");var Pn=require("react/jsx-runtime"),vr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Lt(...e){console.debug("[voice]",...e)}var Ct=(0,K.forwardRef)(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=vr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:f,onError:l,onMicStream:v,onTrack:P,onUnlockChange:g,capture:p}=t,h=Pe(),m=o??h,k=(0,K.useRef)(null),b=(0,K.useRef)(null),T=(0,K.useRef)(null),S=(0,K.useRef)([]),y=(0,K.useRef)(!1),E=(0,K.useRef)(f);E.current=f;let w=(0,K.useRef)(l);w.current=l;let L=(0,K.useRef)(v);L.current=v;let d=(0,K.useCallback)(N=>{y.current!==N&&(y.current=N,E.current?.(N))},[]),x=(0,K.useCallback)(()=>{for(let N of S.current)N();S.current=[],T.current?.release(),T.current=null,b.current&&(b.current=null,L.current?.(null))},[]),R=(0,K.useCallback)(async()=>{let N=T.current;if(N){let j=await N.update(i);return b.current=N.stream,L.current?.(N.stream),j}let $=await(p??(0,Qe.sharedCaptureController)()).claim("audio",i);T.current=$,S.current=[$.onTrack((j,oe)=>{b.current=oe,L.current?.(oe),y.current&&m?.stream(n).attach(j).catch(le=>Lt("mic re-attach after one-capture re-acquire failed",le))}),$.onLost(j=>{T.current=null,S.current=[],b.current=null,L.current?.(null),d(!1),w.current?.(j)})],b.current=$.stream,L.current?.($.stream);let W=$.track;if(!W)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return W},[p,i,m,n,d]),M=(0,K.useCallback)(async()=>{x(),d(!1),await m?.stream(n).detach().catch(()=>{})},[m,n,x,d]),V=(0,K.useCallback)(async()=>{if(!m)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");k.current?.unlock();let N;try{N=await R()}catch(W){x();let j=(0,Qe.sessionFailureFromMediaError)(W,m.status);throw w.current?.(j),j}m.connect?.();let H;for(let W=1;W<=u;W++)try{await m.whenLive(a!==void 0?{timeout:a}:void 0),await m.stream(n).attach(N),d(!0);return}catch(j){H=j,Lt(`start attempt ${W}/${u} failed`,j),W<u&&await new Promise(oe=>setTimeout(oe,c))}x(),d(!1);let $=H instanceof Error?H:new Error(String(H??"voice start failed"));throw w.current?.($),$},[m,n,a,u,c,R,x,d]);(0,K.useImperativeHandle)(r,()=>({start:V,stop:M,unlock:()=>k.current?.unlock(),get active(){return y.current},get micStream(){return b.current},get audio(){return k.current}}),[V,M]);let Y=(0,K.useRef)(!1),I=(0,K.useCallback)(async()=>{if(!m||!y.current||Y.current)return;let N=b.current?.getAudioTracks()[0]??null;if(N&&N.readyState==="live"){try{await m.stream(n).attach(N)}catch(H){Lt("foreground mic re-assert failed (will retry on next pass)",H)}return}Y.current=!0;try{let H=await R();await m.stream(n).attach(H)}catch(H){let $=H instanceof Error?H:new Error(String(H));Lt("foreground mic re-acquire failed",$),w.current?.($)}finally{Y.current=!1}},[m,n,R]);return(0,K.useEffect)(()=>{let N=()=>{I()};return m&&typeof m.onRecovery=="function"?m.onRecovery(N):(0,Qe.observePageLifecycle)(N)},[m,I]),(0,K.useEffect)(()=>x,[x]),s?(0,Pn.jsx)(Rt,{ref:k,session:m,stream:n,onTrack:P,onUnlockChange:g}):null}),Cn=Ct;var be=require("react");var Ot=require("react");var yr={level:0,speaking:!1};function Dt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=(0,Ot.useState)(yr);return(0,Ot.useEffect)(()=>{if(!e){i(yr);return}let a=kt();if(!a||typeof MediaStream>"u")return;let u;e instanceof MediaStream?u=e:(u=new MediaStream,u.addTrack(e));let c,f;try{c=a.createMediaStreamSource(u),f=a.createAnalyser(),f.fftSize=r,c.connect(f)}catch{return}let l=new Uint8Array(f.fftSize),P=setInterval(()=>{f.getByteTimeDomainData(l);let g=0;for(let h=0;h<l.length;h++){let m=(l[h]-128)/128;g+=m*m}let p=Math.sqrt(g/l.length);i(h=>{let m=p>n;return Math.abs(h.level-p)<.005&&h.speaking===m?h:{level:p,speaking:m}})},o);return()=>{clearInterval(P),c.disconnect(),i(yr)}},[e,r,o,n]),s}var we=require("react/jsx-runtime"),bo={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},Ro={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},xn=(0,be.forwardRef)(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:u,onActiveChange:c,onError:f,onMicStream:l,capture:v}=t,P=Pe(),g=o??P,p=(0,be.useRef)(null),[h,m]=(0,be.useState)(null),k=(0,be.useRef)(l);k.current=l;let{level:b,speaking:T}=Dt(a?h:null);return(0,be.useImperativeHandle)(r,()=>({start:()=>{let S=p.current;return S?S.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>p.current?.stop()??Promise.resolve(),get active(){return p.current?.active??!1},get micStream(){return p.current?.micStream??null}}),[]),(0,be.useEffect)(()=>{!i||!g||p.current?.start().catch(()=>{})},[i,g]),(0,we.jsxs)(we.Fragment,{children:[(0,we.jsx)(Ct,{ref:p,session:g,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...v!==void 0?{capture:v}:{},onActiveChange:c,onError:f,onMicStream:S=>{m(S),k.current?.(S)}}),a?(0,we.jsx)("span",{className:u,style:bo,"data-urun-mic":"","data-urun-mic-active":h?"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(b*100)/100,children:(0,we.jsx)("span",{style:Ro,children:(0,we.jsx)("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(b*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});var et=require("@urun-sh/core"),U=require("react");var he=require("react/jsx-runtime"),br={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function kr(...e){console.debug("[camera]",...e)}function Co(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function Po(){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 Rr=(0,U.forwardRef)(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:u,autoStart:c=!0,mirror:f="auto",connectTimeoutMs:l,visible:v=!1,className:P,videoClassName:g,onActiveChange:p,onError:h,onStream:m,onTrack:k,children:b,capture:T,flipControl:S="auto",flipControlClassName:y,onDevices:E}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let w=i?"user":a?"environment":u??"environment",L=Pe(),d=o??L,x=(0,U.useRef)(null),R=(0,U.useRef)(null),M=(0,U.useRef)(null),V=(0,U.useRef)([]),Y=(0,U.useRef)(null),I=(0,U.useRef)(!1),N=(0,U.useRef)(!1),H=(0,U.useRef)(w),[$,W]=(0,U.useState)(w),[j,oe]=(0,U.useState)(!1),[le,Q]=(0,U.useState)(null),[B,re]=(0,U.useState)(!1),[X]=(0,U.useState)(Co),ue=(0,U.useRef)(p);ue.current=p;let G=(0,U.useRef)(h);G.current=h;let C=(0,U.useRef)(m);C.current=m;let D=(0,U.useRef)(k);D.current=k;let _=(0,U.useRef)(E);_.current=E;let z=(0,U.useCallback)(F=>{I.current!==F&&(I.current=F,oe(F),ue.current?.(F))},[]);(0,U.useEffect)(()=>{if(!j){Q(null);return}let F=!1,q=()=>{Po().then(Ce=>{F||(Q(Ce),Ce&&_.current?.(Ce))})};q();let ke=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof ke?.addEventListener=="function"?(ke.addEventListener("devicechange",q),()=>{F=!0,ke.removeEventListener?.("devicechange",q)}):()=>{F=!0}},[j]);let fe=(0,U.useCallback)(F=>{let q=x.current;q&&(q.muted=!0,q.defaultMuted=!0,q.setAttribute("muted",""),q.setAttribute("playsinline",""),q.setAttribute("webkit-playsinline",""),q.srcObject=F,F&&q.play()?.catch?.(ke=>kr("preview play() failed",ke)))},[]),se=(0,U.useCallback)(()=>{N.current=!1,Y.current?.(),Y.current=null;for(let F of V.current)F();V.current=[],M.current?.release(),M.current=null,R.current&&(R.current=null,C.current?.(null),D.current?.(null)),fe(null)},[fe]),A=(0,U.useCallback)((F,q)=>{Y.current?.(),R.current=q,fe(q),C.current?.(q);let ke=()=>{R.current===q&&(kr("camera track ended (device removed or permission revoked)"),se(),z(!1))};F.addEventListener("ended",ke),Y.current=()=>F.removeEventListener("ended",ke)},[fe,se,z]),de=(0,U.useCallback)(async F=>{let q=n!==!1;if(q&&!d)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let ke={...br,...s,facingMode:F},Ce;try{let Ue=M.current;if(Ue)Ce=await Ue.update(ke);else{let ut=await(T??(0,et.sharedCaptureController)()).claim("video",ke);if(M.current=ut,V.current=[ut.onTrack((ct,Xn)=>{A(ct,Xn),I.current&&(!q||!d||d.stream(n).attachVideo(ct).then(()=>D.current?.(ct)).catch(Gn=>kr("camera re-publish after one-capture re-acquire failed",Gn)))}),ut.onLost(ct=>{M.current=null,V.current=[],se(),z(!1),G.current?.(ct)})],!ut.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});Ce=ut.track}}catch(Ue){let Ke=(0,et.sessionFailureFromMediaError)(Ue,d?.status);throw G.current?.(Ke),Ke}H.current=F,W(F),A(Ce,M.current?.stream??new MediaStream([Ce]));try{q&&d&&(d.connect?.(),await d.whenLive(l!==void 0?{timeout:l}:void 0),await d.stream(n).attachVideo(Ce)),N.current=q?n:!1}catch(Ue){se(),z(!1);let Ke=Ue instanceof Error?Ue:new Error(String(Ue));throw G.current?.(Ke),Ke}D.current?.(Ce),z(!0)},[d,n,s,l,T,A,se,z]),Oe=(0,U.useCallback)(F=>de(F?.facingMode??H.current),[de]),ge=(0,U.useCallback)(async F=>{let q=N.current===n;I.current&&H.current===F&&q||await de(F)},[de,n]),ye=(0,U.useCallback)(()=>de(H.current==="environment"?"user":"environment"),[de]),je=(0,U.useCallback)(async()=>{se(),z(!1),n!==!1&&await d?.stream(n).detachVideo().catch(()=>{})},[d,n,se,z]),at=(0,U.useCallback)(async F=>{let q=x.current;if(!q)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await(0,et.captureStillFromVideo)(q,F)},[]);(0,U.useImperativeHandle)(r,()=>({start:Oe,stop:je,flip:ye,setFacingMode:ge,capturePhoto:at,get active(){return I.current},get facingMode(){return H.current},get stream(){return R.current},get element(){return x.current}}),[Oe,je,ye,ge,at]);let tr=(0,U.useRef)(ge);if(tr.current=ge,(0,U.useEffect)(()=>{c&&(n!==!1&&!d||tr.current(w).catch(()=>{}))},[c,d,w,n]),(0,U.useEffect)(()=>se,[se]),!v)return null;let rr=f==="auto"?$==="user":f,wt=j&&(S===!0||S==="auto"&&X&&(le?.length??0)>1),Jn=()=>{B||(re(!0),ye().catch(()=>{}).finally(()=>re(!1)))};return(0,he.jsxs)("div",{className:P,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":$,children:[(0,he.jsx)("video",{ref:x,className:g,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...rr?{transform:"scaleX(-1)"}:{}}}),wt?(0,he.jsx)("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Jn,disabled:B,className:y,style:y?{opacity:B?.6:void 0}:{position:"absolute",right:16,bottom:"calc(env(safe-area-inset-bottom, 0px) + 16px)",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",width:44,height:44,borderRadius:9999,border:"1px solid rgba(255,255,255,0.25)",background:"rgba(0,0,0,0.5)",color:"#fff",cursor:"pointer",opacity:B?.6:1},children:(0,he.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,he.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,he.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,he.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,he.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,he.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,b]})}),En=(0,U.forwardRef)(function({preview:t=!0,...r},o){return(0,he.jsx)(Rr,{ref:o,...r,visible:t,autoStart:!1})});var tt=require("@urun-sh/core"),te=require("react");function wn(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=(0,te.useState)(null),[a,u]=(0,te.useState)(null),[c,f]=(0,te.useState)(!1),[l,v]=(0,te.useState)(null),[P]=(0,te.useState)(tt.cameraCaptureAvailable),g=(0,te.useRef)(n);g.current=n;let p=(0,te.useRef)(null),h=(0,te.useRef)(0),m=(0,te.useCallback)(y=>{p.current&&URL.revokeObjectURL(p.current),p.current=y?URL.createObjectURL(new Blob([y.bytes],{type:y.type})):null,u(p.current),i(y),g.current?.(y)},[]);(0,te.useEffect)(()=>()=>{h.current++,p.current&&URL.revokeObjectURL(p.current),p.current=null},[]);let k=(0,te.useCallback)(async y=>{let E=++h.current;f(!0),v(null);try{let w=await y();if(h.current!==E)return;m(w)}catch(w){if(h.current!==E)return;v((0,tt.referenceImageErrorMessage)(w))}finally{h.current===E&&f(!1)}},[m]),b=(0,te.useCallback)(y=>k(()=>(0,tt.normalizeReferenceImage)(y,{maxSize:t,type:r,quality:o,source:"file"})),[k,t,r,o]),T=(0,te.useCallback)(y=>k(()=>y.capturePhoto({maxSize:t,type:r,quality:o})),[k,t,r,o]),S=(0,te.useCallback)(()=>{h.current++,v(null),f(!1),m(null)},[m]);return{reference:s,previewUrl:a,pick:b,capture:T,clear:S,busy:c,error:l,cameraAvailable:P}}var Vt=require("react");function Tn(e,t){let[r,o]=(0,Vt.useState)(null);return(0,Vt.useEffect)(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}var Mn=require("react");var qt=require("react");var An=require("zustand/vanilla"),Un=require("zustand"),xo=()=>{};function Ft(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=(0,An.createStore)(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let c of s)c();s=null}},a=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",c=>n.setState({doc:c})),e.onSynced(()=>n.setState({synced:!0}))]),i):xo,u=(c=>(0,Un.useStore)(n,c));return Object.assign(u,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),u}function rt(e,t){let r=(0,qt.useMemo)(()=>Ft(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return(0,qt.useEffect)(()=>r.bind(),[r]),r}function _n(e,t,r){let n=rt(e,t)(r??(a=>a)),s=(0,Mn.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 Wt=require("react");var _e=200;function Te(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function nt(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Ht(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 Bt(e,t,r={}){let o=r.cap??200,[n,s]=(0,Wt.useState)([]);return(0,Wt.useEffect)(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let u=await a.next();if(!i||u.done)break;s(c=>Te(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}var Re=require("react/jsx-runtime");function Nn({session:e,name:t,cap:r,className:o}){let n=Bt(e,t,{cap:r});return(0,Re.jsxs)("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[(0,Re.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,Re.jsx)("code",{children:t}),(0,Re.jsxs)("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),(0,Re.jsx)("div",{className:"urun-stream-tail-log",children:n.length===0?(0,Re.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,Re.jsx)("code",{children:t})," messages\u2026"]}):n.map((s,i)=>(0,Re.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,Re.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",nt(s.payload)]},`${s.at}-${i}`))})]})}var Pt=require("react");var me=require("react/jsx-runtime");function xt({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=(0,Pt.useState)(""),[i,a]=(0,Pt.useState)(null),u=(0,Pt.useCallback)(()=>{let c=Ht(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return(0,me.jsxs)("div",{className:"urun-doc-patch",children:[(0,me.jsx)("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),(0,me.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,me.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?(0,me.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function In({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=rt(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return(0,me.jsxs)("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[(0,me.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,me.jsx)("code",{children:t}),(0,me.jsx)("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),(0,me.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?(0,me.jsx)(xt,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}var jt=require("react");var Ae=require("react/jsx-runtime");function Ln(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function On({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=(0,jt.useState)([]);return(0,jt.useEffect)(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>Te(u,{at:Date.now(),direction:"in",text:Ln(nt(a))},r))}):void 0),[e,t,r]),(0,Ae.jsxs)("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[(0,Ae.jsx)(xt,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>Te(u,{at:Date.now(),direction:"out",text:Ln(a)},r))}}),(0,Ae.jsx)("div",{className:"urun-control-sender-log",children:n.length===0?(0,Ae.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>(0,Ae.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,Ae.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,Ae.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}var Kt=require("react");var We=require("react/jsx-runtime");function Dn({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=(0,Kt.useState)([]),a=t.join(","),u=r.join(",");return(0,Kt.useEffect)(()=>{if(i([]),!e)return;let c=(l,v)=>i(P=>Te(P,{at:Date.now(),kind:l,text:v},o)),f=[];f.push(e.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of t){let v=e.stream(l);f.push(v.on("track",P=>c("track",`${l}: ${P?"track arrived":"track ended"}`)))}for(let l of r){let v=e.doc(l);f.push(v.on("change",()=>c("doc",`${l} changed`)))}return()=>f.forEach(l=>l())},[e,a,u,o]),(0,We.jsx)("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?(0,We.jsx)("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,f)=>(0,We.jsxs)("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[(0,We.jsx)("span",{className:"urun-event-spine-kind",children:c.kind})," ",(0,We.jsx)("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${f}`))})}var Zt=require("@urun-sh/core");var $t=require("react");function Se(e){let[t,r]=(0,$t.useState)(e?.phase??null);return(0,$t.useEffect)(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}var Fn=require("@urun-sh/core");var ot=require("react"),Vn=require("@urun-sh/core");function zt(e){let t=Se(e),r=(0,Vn.isWakingPhase)(t?.name),o=(0,ot.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,ot.useState)(s);return(0,ot.useEffect)(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let u=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(u)},[n]),{waking:r,phase:t,state:r?t?.runtime?.state:void 0,reason:r?t?.runtime?.reason:void 0,since:n,seconds:r?i:0}}var Ne=require("react/jsx-runtime");function Jt({session:e,render:t,className:r}){let o=zt(e);return!o.waking||!o.phase?null:(0,Ne.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,Ne.jsxs)(Ne.Fragment,{children:[(0,Ne.jsx)("span",{className:"urun-session-waking-label",children:(0,Fn.describeSessionPhase)(o.phase)})," ",(0,Ne.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}var Gt=require("react");var Ie=require("react"),Eo={event:null,elapsedMs:0};function Xt(e,t){let[r,o]=(0,Ie.useState)(null),n=(0,Ie.useRef)(0);(0,Ie.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,Ie.useState)(0);return(0,Ie.useEffect)(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,u=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(u());let c=setInterval(()=>i(u()),1e3);return()=>clearInterval(c)},[r]),r?{event:r,elapsedMs:s}:Eo}var st=require("react/jsx-runtime"),wo={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 To(e){let[t,r]=(0,Gt.useState)(!1);return(0,Gt.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 Yt({session:e,stream:t,videoElement:r,render:o,className:n}){let s=Xt(e,t),i=To(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return(0,st.jsx)("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,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??wo[u]})," ",(0,st.jsxs)("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}var ve=require("react/jsx-runtime"),Ao={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function qn({session:e,className:t}){let r=Se(e),o=r?.name??"idle",n=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return(0,ve.jsxs)("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[(0,ve.jsx)("span",{className:"urun-session-status-dot","data-phase":o}),(0,ve.jsx)("span",{className:"urun-session-status-label",children:Ao[o]}),n?(0,ve.jsx)("span",{className:"urun-session-status-detail",children:n}):null]})}function Hn({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=Se(e);if(s?.name==="live")return(0,ve.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,(0,ve.jsx)(Yt,{session:e})]});let i=r?r(s):(0,ve.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,Zt.isWakingPhase)(s.name)?(0,ve.jsx)(Jt,{session:e}):s&&s.name!=="idle"?(0,Zt.describeSessionPhase)(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,ve.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?(0,ve.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}var Qt=require("react");var Bn=require("react/jsx-runtime");function Cr(e){return Se(e)?.endsAt??null}function Uo(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 Wn({session:e,urgentMs:t=6e4,className:r}){let n=Cr(e)?.getTime()??null,[s,i]=(0,Qt.useState)(()=>n===null?null:Math.max(0,n-Date.now()));if((0,Qt.useEffect)(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),s===null)return null;let a=Uo(s);return(0,Bn.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 Et=require("react/jsx-runtime"),Mo=new Set(["expired","ended","error"]);function jn({session:e,onNewSession:t,children:r,className:o}){let n=Se(e);if(!n||!Mo.has(n.name))return null;let s=r?r(n):(0,Et.jsx)("span",{className:"urun-session-ended-copy",children:n.name==="expired"?"Session ended \u2014 start a new session":n.name==="error"?`Session failed${n.error?.reason?` \u2014 ${n.error.reason}`:""}.`:"Session ended."});return(0,Et.jsxs)("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?(0,Et.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}var Le=require("react"),Be=require("react/jsx-runtime");function Pr(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;return t.warning!==!0?null:{warning:!0,deadlineEpochS:typeof t.deadline_epoch_s=="number"?t.deadline_epoch_s:null,idleSinceEpochS:typeof t.idle_since_epoch_s=="number"?t.idle_since_epoch_s:null}}function xr(e){let t=(0,Le.useMemo)(()=>e?e.doc("control"):null,[e]),[r,o]=(0,Le.useState)(()=>t?Pr(t.get("idle")):null);return(0,Le.useEffect)(()=>{if(!t){o(null);return}return o(Pr(t.get("idle"))),t.on("change",()=>o(Pr(t.get("idle"))))},[t]),r}function _o(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function Kn({session:e,onStillHere:t,className:r}){let o=xr(e),n=o?.deadlineEpochS??null,[s,i]=(0,Le.useState)(null);if((0,Le.useEffect)(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()/1e3));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return(0,Be.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,Be.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,Be.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,Be.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${_o(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,Be.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}var it=require("react"),$n=require("@urun-sh/core");function zn(e){let t=(0,it.useContext)(ze),[r,o]=(0,it.useState)(null),n=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,u=t?.orgId,c=t?.jwt,f=t?.getAccessToken,l=t?.authProvider;return(0,it.useEffect)(()=>{if(!a||!u||!n||!s)return;let v=!1,P=()=>{(0,$n.prewake)({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:f,authProvider:l}).then(p=>{v||o(p)}).catch(()=>{})};P();let g=setInterval(P,Math.max(1,i)*1e3);return()=>{v=!0,clearInterval(g)}},[n,s,i,a,u,c,f,l]),r}var er=require("@urun-sh/core");0&&(module.exports={Audio,Camera,ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,Image,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,Mic,OPERATOR_CHORD_LABEL,OPERATOR_TOKEN_STORAGE_KEY,ProgressCard,ProgressCardSchema,ReprojectedVideo,Session,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunActivationOverlay,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunIdleWarning,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,Video,Voice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,readOperatorToken,registerComponent,resumeUrunAudioContext,urunPublicEnv,useActivation,useApp,useChat,useCompletion,useConfirmOnLeave,useDocStore,useImageFrame,useInputPresence,useMetricsPanel,useOperatorOverride,useProgressCard,useReferenceImage,useRequest,useSession,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
2
+ "use strict";var nr=Object.defineProperty;var eo=Object.getOwnPropertyDescriptor;var to=Object.getOwnPropertyNames;var ro=Object.prototype.hasOwnProperty;var no=(e,t)=>{for(var r in t)nr(e,r,{get:t[r],enumerable:!0})},oo=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of to(t))!ro.call(e,n)&&n!==r&&nr(e,n,{get:()=>t[n],enumerable:!(o=eo(t,n))||o.enumerable});return e};var so=e=>oo(nr({},"__esModule",{value:!0}),e);var Oo={};no(Oo,{Audio:()=>Ct,Camera:()=>Rr,ComponentRenderer:()=>cn,DEFAULT_CAMERA_CONSTRAINTS:()=>br,DEFAULT_LOG_CAP:()=>Ne,DEFAULT_VOICE_CONSTRAINTS:()=>vr,DocPatchForm:()=>Et,Image:()=>bn,ImageFrame:()=>Sn,ImageFrameSchema:()=>hn,MetricsPanel:()=>yn,MetricsPanelSchema:()=>vn,Mic:()=>An,OPERATOR_CHORD_LABEL:()=>Or,OPERATOR_TOKEN_STORAGE_KEY:()=>Ir,ProgressCard:()=>dn,ProgressCardSchema:()=>ln,ReprojectedVideo:()=>on,Session:()=>Gr,StatusBadge:()=>mn,StatusBadgeSchema:()=>pn,TextStream:()=>gn,TextStreamSchema:()=>fn,UrunActivationOverlay:()=>Zt,UrunAudio:()=>xn,UrunAuthProvider:()=>or,UrunCamera:()=>Un,UrunControlSender:()=>qn,UrunDocPanel:()=>Vn,UrunErrorBoundary:()=>ze,UrunEventSpine:()=>Hn,UrunIdleWarning:()=>Xn,UrunJwtProvider:()=>Mr,UrunProvider:()=>qr,UrunSessionClock:()=>$n,UrunSessionEnded:()=>Jn,UrunSessionGate:()=>Kn,UrunSessionStatus:()=>jn,UrunSessionWaking:()=>Xt,UrunStreamTail:()=>Dn,UrunVoice:()=>Tn,Video:()=>qe,Voice:()=>Pt,authMode:()=>pt,createDocStore:()=>qt,describeSessionPhase:()=>tr.describeSessionPhase,formatPayload:()=>ot,getUrunAudioContext:()=>bt,isWakingPhase:()=>tr.isWakingPhase,parseJsonObject:()=>Wt,pushCapped:()=>we,readOperatorToken:()=>sr,registerComponent:()=>an,resumeUrunAudioContext:()=>Rt,urunPublicEnv:()=>xe,useActivation:()=>Gt,useApp:()=>Wr,useChat:()=>Jr,useCompletion:()=>Kr,useConfirmOnLeave:()=>_t,useDocStore:()=>nt,useImageFrame:()=>gr,useInputPresence:()=>Xr,useMetricsPanel:()=>hr,useOperatorOverride:()=>Mt,useProgressCard:()=>pr,useReferenceImage:()=>Mn,useRequest:()=>Br,useSession:()=>Yr,useSessionDoc:()=>On,useSessionEndsAt:()=>Cr,useSessionIdle:()=>xr,useSessionPhase:()=>pe,useSessionTrack:()=>_n,useSessionWake:()=>Jt,useStatusBadge:()=>mr,useStreamMessages:()=>jt,useTextStream:()=>fr,useUrunAudioLevel:()=>Vt,useUrunAuth:()=>At,useUrunPrewake:()=>Yn,usesWorkOSAuth:()=>Ar});module.exports=so(Oo);var ue=require("react");var Tr=require("react"),dt=require("react/jsx-runtime"),ze=class extends Tr.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,dt.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,dt.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,dt.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var wr=require("react"),Je=(0,wr.createContext)(null);function Ve(e){return e&&e.trim()?e.trim():void 0}function xe(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return Ve(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return Ve(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return Ve(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return Ve(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return Ve(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return Ve(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return Ve(typeof process<"u"?process.env?.[e]:void 0)}}function pt(){let e=xe("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||xe("VERCEL_ENV")==="production"?"workos":xe("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Ar(){return pt()==="workos"}var Xe=require("react"),_r=require("react/jsx-runtime"),Ur=(0,Xe.createContext)(null);function or({getAccessToken:e,children:t}){let r=(0,Xe.useMemo)(()=>({getAccessToken:e}),[e]);return(0,_r.jsx)(Ur.Provider,{value:r,children:t})}var Mr=or;function At(){return(0,Xe.useContext)(Ur)}var Ut=require("react"),Ir="urun.operator_token",Lr=null,Nr="op",Or="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function Dr(){return typeof window<"u"}function sr(){return Lr}function io(){if(!Dr())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(Nr);if(!r)return null;Lr=r,t.delete(Nr);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function ao(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function Mt(e){let t=(0,Ut.useRef)(e);t.current=e,(0,Ut.useEffect)(()=>{if(!Dr())return;io();let r=o=>{if(!ao(o))return;let n=sr();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}var Vr=require("react");function _t(e=!0){(0,Vr.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 _e=require("react/jsx-runtime"),uo="/api/urun-token",co=1e4;function lo(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 Fr(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 po(e,t){return typeof e=="function"?e(t):e!==void 0?e:(0,_e.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,_e.jsx)("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),(0,_e.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function qr({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,confirmOnLeave:g=!1,fallback:l,errorFallback:v,children:C}){let h=n===void 0&&t===void 0;if(!h&&(typeof t!="string"||t.trim().length===0))throw new Error("[urun] <UrunProvider> requires a non-empty orgId \u2014 set your org id deployment env var (e.g. NEXT_PUBLIC_SESSION_TENANT_ID) and pass it through the provider (or pass NEITHER orgId NOR jwt to let the provider mint from its tokenEndpoint).");if(!h&&(typeof e!="string"||e.trim().length===0))throw new Error("[urun] <UrunProvider> requires baseUrl when orgId/jwt are passed explicitly (self-mint mode reads it from the token endpoint instead).");let p=r??o;if(h&&(typeof p!="string"||p.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);_t(g);let[m,f]=(0,ue.useState)(),[P,R]=(0,ue.useState)(null),w=(0,ue.useRef)(void 0),S=(0,ue.useRef)(null),[y,T]=(0,ue.useState)(null);Mt(D=>T({jwt:D}));let E=At(),O=xe("NEXT_PUBLIC_SESSION_TOKEN")??xe("NEXT_PUBLIC_URUN_JWT"),d=pt(),k=y!==null,b=d==="workos"&&!n&&!k&&!h,_=n??(d==="jwt"?O:void 0)??m?.token,W=k?y.jwt:_,X=s??xe("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),I=b&&!W&&!E?.getAccessToken,N=t??m?.orgId,V=e??m?.gatewayUrl,z=h&&m===void 0,$=h&&m!==void 0&&!V?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,B=P??$,Y=u??uo,ae=(0,ue.useCallback)(async D=>{if(!D?.forceRefresh){let Q=w.current;if(!Q)return Q;let De=lo(Q);if(De===null||De-Date.now()>co)return Q}return(await(S.current??(S.current=(async()=>{try{let Q=await Fr(Y);return w.current=Q.token,f(Q),Q}finally{S.current=null}})()))).token},[Y]),oe=(0,ue.useMemo)(()=>({appId:p,baseUrl:V??"",orgId:N??"",jwt:W,getAccessToken:b?E?.getAccessToken:h&&!k?ae:void 0,authProvider:X,eventsUrl:i,sessionKey:a,releaseOnLeave:c,priority:k?"preempt":void 0}),[p,E,V,X,W,i,N,a,c,b,k,h,ae]);return(0,ue.useEffect)(()=>{if(!h)return;let D=new AbortController;return R(null),(async()=>{try{let j=await Fr(Y,D.signal);w.current=j.token,f(j)}catch(j){if(D.signal.aborted)return;R(j instanceof Error?j:new Error(String(j)))}})(),()=>D.abort()},[h,Y]),(0,_e.jsx)(ze,{fallback:l,children:B?po(v,B):I||z?(0,_e.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,_e.jsx)(Je.Provider,{value:oe,children:C})})}var ce=require("react"),Hr=require("@urun-sh/core");function mo(e,t){return`${e}:${JSON.stringify(t??{})}`}function fo(e,t,r){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,fnName:t,args:r??{}})}var Fe=new Map;var ir=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},ar=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()}},ur=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||a.name==="expired"){let u=a.error,c=u?.reason??(a.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else a.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),i=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{i(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new ir(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new ar(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function Wr(){let e=(0,ce.useContext)(Je);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=(0,ce.useReducer)(i=>i+1,0),r=(0,ce.useRef)(new Map),o=(0,ce.useRef)(new Map),n=(0,ce.useRef)(null),s=(0,ce.useMemo)(()=>(0,Hr.App)(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority]);return(0,ce.useEffect)(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=Fe.get(a);c===u&&o.current.get(a)===u&&(c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null),c.handle.addNotifier(t),c.refCount+=1)}}return()=>{let a=new Map;for(let[u,c]of o.current){let g=Fe.get(u);g===c&&(g.handle.removeNotifier(t),g.refCount=Math.max(0,g.refCount-1),a.set(u,g),g.refCount===0&&(g.disposeTimer=setTimeout(()=>{let l=Fe.get(u);!l||l.refCount!==0||(Fe.delete(u),l.handle.disconnect())},0)))}n.current=a}},[]),(0,ce.useMemo)(()=>{let i=new Map;return new Proxy({},{get(a,u){if(typeof u!="string")return;let c=i.get(u);if(c)return c;let g=l=>{let v=mo(u,l),C=r.current.get(v);if(C&&!C.disposed)return C;let h=fo(e,u,l),p=Fe.get(h);return p?.handle.disposed&&(p.disposeTimer&&clearTimeout(p.disposeTimer),Fe.delete(h),o.current.get(h)===p&&o.current.delete(h),p=void 0),p?p.disposeTimer&&(clearTimeout(p.disposeTimer),p.disposeTimer=null):(p={handle:new ur(s[u](l),t,e.eventsUrl),refCount:0,disposeTimer:null},Fe.set(h,p)),o.current.get(h)!==p&&(o.current.set(h,p),p.handle.addNotifier(t),p.refCount+=1),r.current.set(v,p.handle),p.handle};return i.set(u,g),g}})},[e,s])}var ne=require("react");function Ge(e){let t=e;if(!t||typeof t.request!="function"||typeof t.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return t}function go(e){return e instanceof Error?e:new Error(String(e))}function Br(e,t){let r=(0,ne.useMemo)(()=>Ge(e),[e]),[o,n]=(0,ne.useState)(void 0),[s,i]=(0,ne.useState)(null),[a,u]=(0,ne.useState)(!1),c=(0,ne.useRef)(t);c.current=t;let g=(0,ne.useRef)(0),l=(0,ne.useRef)(null),v=(0,ne.useRef)(!0);(0,ne.useEffect)(()=>(v.current=!0,()=>{v.current=!1,l.current?.abort()}),[]);let C=(0,ne.useCallback)(async m=>{l.current?.abort();let f=new AbortController;l.current=f;let P=++g.current,R=()=>v.current&&g.current===P;R()&&(u(!0),i(null));try{let w=await r.request(m,{...c.current,signal:f.signal});return R()&&(n(w),u(!1),c.current?.onSuccess?.(w)),w}catch(w){let S=go(w);throw R()&&(i(S),u(!1),c.current?.onError?.(S)),S}},[r]),h=(0,ne.useCallback)(m=>{C(m).catch(()=>{})},[C]),p=(0,ne.useCallback)(()=>{g.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:h,mutateAsync:C,data:o,error:s,isPending:a,reset:p}}var se=require("react");function jr(e){return e instanceof Error?e:new Error(String(e))}var ho=e=>typeof e=="string"?e:String(e);function Kr(e,t){let r=(0,se.useMemo)(()=>Ge(e),[e]),[o,n]=(0,se.useState)(""),[s,i]=(0,se.useState)(!1),[a,u]=(0,se.useState)(null),c=(0,se.useRef)(t);c.current=t;let g=(0,se.useRef)(0),l=(0,se.useRef)(null),v=(0,se.useRef)(!0);(0,se.useEffect)(()=>(v.current=!0,()=>{v.current=!1,l.current?.cancel(),l.current=null}),[]);let C=(0,se.useCallback)(()=>{g.current++,l.current?.cancel(),l.current=null,v.current&&i(!1)},[]),h=(0,se.useCallback)(async p=>{l.current?.cancel();let m=++g.current,f=()=>v.current&&g.current===m,P=c.current,R=P?.parseChunk??ho,w=P?.buildPayload??(b=>({prompt:b}));f()&&(n(""),u(null),i(!0));let{parseChunk:S,buildPayload:y,onFinish:T,onError:E,...O}=P??{},d="",k;try{k=r.requestStream(w(p),O),l.current=k}catch(b){let _=jr(b);f()&&(u(_),i(!1),P?.onError?.(_));return}try{for await(let b of k){if(g.current!==m)break;d+=R(b),f()&&n(d)}f()&&(i(!1),P?.onFinish?.(d))}catch(b){let _=jr(b);f()&&(u(_),i(!1),P?.onError?.(_))}finally{l.current===k&&(l.current=null)}},[r]);return{completion:o,complete:h,stop:C,isStreaming:s,error:a}}var Z=require("react");function $r(e){return e instanceof Error?e:new Error(String(e))}var So=e=>typeof e=="string"?e:String(e),zr=0;function cr(e){return zr+=1,`${e}-${zr}`}function Jr(e,t){let r=(0,Z.useMemo)(()=>Ge(e),[e]),[o,n]=(0,Z.useState)(()=>(t?.initialMessages??[]).map(R=>({id:R.id??cr("msg"),role:R.role,content:R.content}))),[s,i]=(0,Z.useState)(""),[a,u]=(0,Z.useState)(!1),[c,g]=(0,Z.useState)(null),l=(0,Z.useRef)(t);l.current=t;let v=(0,Z.useRef)(o);v.current=o;let C=(0,Z.useRef)(s);C.current=s;let h=(0,Z.useRef)(0),p=(0,Z.useRef)(null),m=(0,Z.useRef)(!0);(0,Z.useEffect)(()=>(m.current=!0,()=>{m.current=!1,p.current?.cancel(),p.current=null}),[]);let f=(0,Z.useCallback)(()=>{h.current++,p.current?.cancel(),p.current=null,m.current&&u(!1)},[]),P=(0,Z.useCallback)(async R=>{let w=R===void 0,S=(w?C.current:R)??"";if(!S.trim())return;p.current?.cancel();let T=++h.current,E=()=>m.current&&h.current===T,O=l.current,d=O?.parseChunk??So,k={id:cr("msg"),role:"user",content:S},b={id:cr("msg"),role:"assistant",content:""},_=[...v.current,k].map(D=>({role:D.role,content:D.content})),W=[...v.current,k,b];v.current=W,n(W),w&&i(""),g(null),u(!0);let X=O?.buildPayload??(D=>({messages:D})),{initialMessages:I,parseChunk:N,buildPayload:V,onFinish:z,onError:$,...B}=O??{},Y=D=>{n(j=>j.map(Q=>Q.id===b.id?{...Q,content:D}:Q))},ae="",oe;try{oe=r.requestStream(X(_),B),p.current=oe}catch(D){let j=$r(D);E()&&(g(j),u(!1),O?.onError?.(j));return}try{for await(let D of oe){if(h.current!==T)break;ae+=d(D),E()&&Y(ae)}E()&&(u(!1),O?.onFinish?.({...b,content:ae}))}catch(D){let j=$r(D);E()&&(g(j),u(!1),O?.onError?.(j))}finally{p.current===oe&&(p.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:P,stop:f,isStreaming:a,error:c}}var G=require("react"),Ye=require("@urun-sh/core"),lr=[];function Xr(e,t={}){let{field:r=Ye.INPUT_PRESENCE_FIELD,hz:o=Ye.INPUT_PRESENCE_DEFAULT_HZ}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=(0,G.useMemo)(()=>s?(0,Ye.createInputPresencePublisher)({awareness:{setLocalStateField:(S,y)=>s.setField(S,y)},field:r,hz:o}):null,[s,r,o]),a=(0,G.useRef)(null);a.current=i;let[u,c]=(0,G.useState)(!1),[g,l]=(0,G.useState)(lr),v=(0,G.useRef)(!1);(0,G.useEffect)(()=>{if(i)return()=>i.dispose()},[i]);let C=(0,G.useCallback)(()=>{let S=a.current;l(S?S.heldKeys():lr)},[]),h=(0,G.useCallback)(()=>{a.current?.clear(),l(lr)},[]);(0,G.useEffect)(()=>{if(!n)return;let S=()=>!!n.pointerLockElement,y=()=>{if(S()){v.current=!1,c(!0);return}v.current||(c(!1),h())},T=b=>{S()&&(a.current?.keyDown(b.key),C())},E=b=>{a.current?.keyUp(b.key),C()},O=b=>{S()&&a.current?.movePointer(b.movementX,b.movementY)},d=b=>{S()&&a.current?.setButtons(b.buttons)},k=()=>{h()};return n.addEventListener("pointerlockchange",y),n.addEventListener("keydown",T),n.addEventListener("keyup",E),n.addEventListener("mousemove",O),n.addEventListener("mousedown",d),n.addEventListener("mouseup",d),n.defaultView?.addEventListener("blur",k),()=>{n.removeEventListener("pointerlockchange",y),n.removeEventListener("keydown",T),n.removeEventListener("keyup",E),n.removeEventListener("mousemove",O),n.removeEventListener("mousedown",d),n.removeEventListener("mouseup",d),n.defaultView?.removeEventListener("blur",k)}},[n,h,C]);let p=(0,G.useCallback)(S=>{S.requestPointerLock?.()},[]),m=(0,G.useCallback)(()=>{v.current=!0,c(!0)},[]),f=(0,G.useCallback)(()=>{v.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),h()},[n,h]),P=(0,G.useCallback)(S=>{a.current?.keyDown(S),C()},[C]),R=(0,G.useCallback)(S=>{a.current?.keyUp(S),C()},[C]),w=(0,G.useCallback)((S,y)=>{a.current?.movePointer(S,y)},[]);return{engage:p,engageTouch:m,release:f,engaged:u,heldKeys:g,pressKey:P,releaseKey:R,movePointer:w}}var ie=require("react"),nn=require("@urun-sh/core");var L=require("react"),rn=require("@urun-sh/core");var mt=require("react"),Zr=require("react/jsx-runtime"),dr=(0,mt.createContext)(null);function Gr({session:e,children:t}){return(0,Zr.jsx)(dr.Provider,{value:e,children:t})}function Re(){return(0,mt.useContext)(dr)}function Yr(){let e=(0,mt.useContext)(dr);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 ft=require("react/jsx-runtime");function vo(e,t){return e-t>>>0<2147483648}var Qr=1e3;function yo(...e){console.debug("[video]",...e)}function en(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(u=>u.on("track",()=>i(n())));return()=>{for(let u of a)u()}}}}function tn(e,t,r){return r?[r,t]:[e,t]}var qe=(0,L.forwardRef)(function(t,r){let{session:o,stream:n="video",audioStream:s="audio",track:i,muted:a=!0,mirror:u=!1,objectFit:c="contain",className:g,style:l,videoClassName:v,placeholder:C,poster:h,children:p,onTrack:m,onFirstFrame:f,frameMarker:P,onFrameMarkerReached:R,onFrameMarkerUnsupported:w}=t,S=Re(),y=o??S,T=(0,L.useRef)(null),E=(0,L.useRef)(null),[O,d]=(0,L.useState)(!1),[k,b]=(0,L.useState)(!1),_=(0,L.useRef)(!1),W=(0,L.useRef)(m);W.current=m;let X=(0,L.useRef)(f);X.current=f;let I=(0,L.useRef)(R);I.current=R;let N=(0,L.useRef)(w);N.current=w;let V=(0,L.useRef)(P??null);V.current=P??null;let z=(0,L.useRef)(null),$=(0,L.useRef)(null),B=(0,L.useCallback)((x,H=!1)=>{if(!H&&x===z.current||(z.current=x,$.current?.(),$.current=null,_.current=!1,b(!1),!x))return;let A=T.current;if(!A)return;let ee=V.current,re=ee?.rtpTimestamp??null,ye=!1,U=()=>{ye||(ye=!0,N.current?.())};ee&&re==null&&U();let Ce=ee!=null&&re!=null,Pe=ke=>{$.current?.(),$.current=null,_.current=!0,b(!0),X.current?.(),ke&&I.current?.()};if(typeof A.requestVideoFrameCallback=="function"){let ke=!1,Ke=0,ut=(Er,rr)=>{if(!ke){if(Ce){let wt=rr?.rtpTimestamp;if(typeof wt!="number"){U(),Pe(!1);return}if(!vo(wt,re)){Ke=A.requestVideoFrameCallback(ut);return}Pe(!0);return}Pe(!1)}};Ke=A.requestVideoFrameCallback(ut),$.current=()=>{ke=!0,A.cancelVideoFrameCallback?.(Ke)};return}Ce&&U();let ge=()=>{let ke=A.getVideoPlaybackQuality?.();(ke?ke.totalVideoFrames>0:A.readyState>=2&&A.videoWidth>0)&&Pe(!1)};A.addEventListener("loadeddata",ge),A.addEventListener("timeupdate",ge),A.addEventListener("playing",ge),$.current=()=>{A.removeEventListener("loadeddata",ge),A.removeEventListener("timeupdate",ge),A.removeEventListener("playing",ge)},ge()},[]);(0,L.useEffect)(()=>()=>{$.current?.(),$.current=null},[]);let Y=P==null?null:`${P.rtpTimestamp??""}|${P.ptsMs??""}`,ae=(0,L.useRef)(Y);(0,L.useEffect)(()=>{if(ae.current===Y||(ae.current=Y,Y==null))return;let x=z.current;x&&B(x,!0)},[Y,B]);let oe=(0,L.useCallback)(()=>{if(typeof MediaStream>"u")return null;E.current||(E.current=new MediaStream);let x=T.current;return x&&x.srcObject!==E.current&&(x.srcObject=E.current),E.current},[]),D=(0,L.useCallback)(x=>{let H=T.current;if(!H)return;let A=H.play();!A||typeof A.catch!="function"||A.catch(ee=>yo(`play() failed (${x})`,ee))},[]),j=(0,L.useCallback)(x=>{let H=oe();if(H){for(let A of H.getVideoTracks())A!==x&&H.removeTrack(A);if(x&&!H.getVideoTracks().includes(x)){H.addTrack(x);let A=T.current;A&&(A.srcObject=H)}x&&D("track-attach"),d(x!==null),B(x),W.current?.(x)}},[oe,D,B]),Q=(0,L.useCallback)(x=>{let H=oe();if(H){for(let A of H.getAudioTracks())A!==x&&H.removeTrack(A);x&&!H.getAudioTracks().includes(x)&&H.addTrack(x),x&&D("audio-attach")}},[oe,D]),De=(0,L.useCallback)(x=>{T.current=x,x&&(a&&(x.muted=!0,x.defaultMuted=!0,x.setAttribute("muted","")),x.setAttribute("playsinline",""),x.setAttribute("webkit-playsinline",""),oe())},[oe,a]);(0,L.useImperativeHandle)(r,()=>({get element(){return T.current},get live(){return E.current?E.current.getVideoTracks().length>0:!1},get framed(){return _.current}}),[]);let fe=(0,rn.derivedLegRole)(n)!==void 0;(0,L.useEffect)(()=>{fe&&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.`)},[fe,n]);let Ue=i!==void 0;return(0,L.useEffect)(()=>{if(Ue){j(i??null);return}if(fe){j(null);return}if(!y)return;let x=en(y,tn(n,"video")),H=()=>{let U=E.current;return U?U.getVideoTracks()[0]??null:null},A=U=>{if(U!==H()&&(j(U),U)){let Ce=()=>{H()===U&&j(null)};U.addEventListener("ended",Ce)}},ee=x.track;ee&&ee.readyState==="live"&&A(ee);let re=x.on("track",U=>{U&&U.readyState!=="live"||A(U)}),ye=setInterval(()=>{let U=x.track;U&&U.readyState==="live"&&A(U)},Qr);return()=>{re(),clearInterval(ye)}},[y,n,fe,Ue,i,j]),(0,L.useEffect)(()=>{if(Ue||!y||s===!1||fe)return;let x=en(y,tn(n,"audio",s)),H=()=>{let U=E.current;return U?U.getAudioTracks()[0]??null:null},A=U=>{if(U!==H()&&(Q(U),U)){let Ce=()=>{H()===U&&Q(null)};U.addEventListener("ended",Ce)}},ee=x.track;ee&&ee.readyState==="live"&&A(ee);let re=x.on("track",U=>{U&&U.readyState!=="live"||A(U)}),ye=setInterval(()=>{let U=x.track;U&&U.readyState==="live"&&A(U)},Qr);return()=>{re(),clearInterval(ye)}},[y,n,fe,s,Ue,Q]),(0,ft.jsxs)("div",{className:g,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":O?"true":"false","data-urun-video-framed":k?"true":"false",children:[(0,ft.jsx)("video",{ref:De,className:v,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),O?null:C,h===void 0?null:(0,ft.jsx)("div",{"data-urun-video-poster":"","aria-hidden":k||void 0,style:{position:"absolute",inset:0,...k?{opacity:0,pointerEvents:"none"}:null},children:h}),p]})});var gt=require("react/jsx-runtime"),ko={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},on=(0,ie.forwardRef)(function(t,r){let{warp:o,children:n,...s}=t,{enabled:i=!0,overscan:a=.08,captureInput:u=!0,documentTarget:c,...g}=o??{},l=c!==void 0?c:typeof document<"u"?document:null,v=(0,ie.useRef)(null),C=(0,ie.useRef)(null),h=(0,ie.useRef)(0),p=(0,ie.useRef)(g);p.current=g;let m=(0,ie.useMemo)(()=>(0,nn.createCameraWarp)(p.current),[]);return(0,ie.useImperativeHandle)(r,()=>({get video(){return v.current},get canvas(){return C.current},warp:m,get lastDrawTs(){return h.current}}),[m]),(0,ie.useEffect)(()=>{if(!i)return;let f=0,P=0,R=null,w=y=>{typeof y.requestVideoFrameCallback=="function"&&(R=y,P=y.requestVideoFrameCallback(function T(){m.frameArrived(),P=y.requestVideoFrameCallback(T)}))},S=y=>{f=requestAnimationFrame(S);let T=C.current,E=v.current?.element??null;if(!T||!E||(E!==R&&(R&&P&&R.cancelVideoFrameCallback?.(P),w(E)),E.readyState<2))return;m.tick(y);let O=typeof devicePixelRatio=="number"?devicePixelRatio:1,d=Math.max(1,Math.round(T.clientWidth*O)),k=Math.max(1,Math.round(T.clientHeight*O));(T.width!==d||T.height!==k)&&(T.width=d,T.height=k);let b=T.getContext("2d");if(!b)return;let _=m.transform(),W=E.videoWidth||d,X=E.videoHeight||k,N=Math.max(d/W,k/X)*(1+a)*_.scale;b.setTransform(N,0,0,N,d/2+_.translateX*d,k/2+_.translateY*k),b.drawImage(E,-W/2,-X/2),h.current=y};return f=requestAnimationFrame(S),()=>{cancelAnimationFrame(f),R&&P&&R.cancelVideoFrameCallback?.(P)}},[i,a,m]),(0,ie.useEffect)(()=>{if(!i||!u||!l)return;let f=()=>!!l.pointerLockElement,P=T=>{f()&&m.keyDown(T.key)},R=T=>m.keyUp(T.key),w=T=>{f()&&m.pointerDelta(T.movementX,T.movementY)},S=()=>{f()||m.clearKeys()},y=()=>m.clearKeys();return l.addEventListener("keydown",P),l.addEventListener("keyup",R),l.addEventListener("mousemove",w),l.addEventListener("pointerlockchange",S),l.defaultView?.addEventListener("blur",y),()=>{l.removeEventListener("keydown",P),l.removeEventListener("keyup",R),l.removeEventListener("mousemove",w),l.removeEventListener("pointerlockchange",S),l.defaultView?.removeEventListener("blur",y)}},[i,u,l,m]),i?(0,gt.jsxs)(qe,{ref:v,...s,videoClassName:s.videoClassName,style:{...s.style},children:[(0,gt.jsx)("canvas",{ref:C,style:ko,"data-urun-warp":""}),n]}):(0,gt.jsx)(qe,{ref:v,...s,children:n})});var sn=new Map;function an(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);sn.set(e,{component:t,schema:r})}function un(e,t){let r=sn.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 He=require("react/jsx-runtime");function cn({name:e,props:t,fallback:r}){let o=un(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?(0,He.jsx)(He.Fragment,{children:r}):(0,He.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,He.jsx)("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return(0,He.jsx)(n,{...o.validatedProps})}var Ze=require("zod"),We=require("react/jsx-runtime"),ln=Ze.z.object({step:Ze.z.number().min(0),total:Ze.z.number().min(1),label:Ze.z.string().optional(),variant:Ze.z.enum(["default","success","error"]).default("default")});function pr(e){let{step:t,total:r,label:o,variant:n="default"}=e,s=Math.min(t/r*100,100),i=t>=r;return{step:t,total:r,label:o,variant:n,percentage:s,isComplete:i}}function dn(e){let{step:t,total:r,label:o,variant:n,percentage:s}=pr(e);return(0,We.jsxs)("div",{className:"urun-progress-card","data-variant":n,children:[o&&(0,We.jsx)("div",{className:"urun-progress-label",children:o}),(0,We.jsx)("div",{className:"urun-progress-bar",children:(0,We.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,We.jsxs)("div",{className:"urun-progress-text",children:[t,"/",r]})]})}var Nt=require("zod"),ht=require("react/jsx-runtime"),pn=Nt.z.object({state:Nt.z.enum(["thinking","generating","idle","error"]),message:Nt.z.string().optional()}),bo={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function mr(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 mn(e){let{state:t,message:r,isActive:o}=mr(e);return(0,ht.jsxs)("span",{className:"urun-status-badge","data-state":t,children:[(0,ht.jsx)("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),(0,ht.jsx)("span",{className:"urun-status-message",children:r})]})}var St=require("react"),It=require("zod"),vt=require("react/jsx-runtime"),fn=It.z.object({text:It.z.string(),streaming:It.z.boolean().default(!1)});function fr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function gn(e){let{text:t,streaming:r}=fr(e),o=(0,St.useRef)(null),n=(0,St.useRef)(0);return(0,St.useEffect)(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),(0,vt.jsxs)("div",{className:"urun-text-stream",children:[(0,vt.jsx)("span",{ref:o,className:"urun-text-content"}),r&&(0,vt.jsx)("span",{className:"urun-text-cursor"})]})}var yt=require("zod"),kt=require("react/jsx-runtime"),hn=yt.z.object({src:yt.z.string().url(),alt:yt.z.string().optional(),caption:yt.z.string().optional()});function gr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function Sn(e){let{src:t,alt:r,caption:o}=gr(e);return(0,kt.jsxs)("figure",{className:"urun-image-frame",children:[(0,kt.jsx)("img",{className:"urun-image",src:t,alt:r}),o&&(0,kt.jsx)("figcaption",{className:"urun-image-caption",children:o})]})}var Ee=require("zod"),Qe=require("react/jsx-runtime"),vn=Ee.z.object({metrics:Ee.z.array(Ee.z.object({label:Ee.z.string(),value:Ee.z.union([Ee.z.string(),Ee.z.number()]),unit:Ee.z.string().optional()}))});function hr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function yn(e){let{metrics:t}=hr(e);return(0,Qe.jsx)("div",{className:"urun-metrics-panel",children:t.map((r,o)=>(0,Qe.jsxs)("div",{className:"urun-metric-card",children:[(0,Qe.jsx)("div",{className:"urun-metric-label",children:r.label}),(0,Qe.jsx)("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}var kn=require("react");var Rn=require("react/jsx-runtime"),bn=(0,kn.forwardRef)(function(t,r){let{stream:o="image",...n}=t;return(0,Rn.jsx)(qe,{ref:r,stream:o,...n})});var J=require("react"),Pn=require("@urun-sh/core");var Lt=null;function Ro(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function bt(){if(Lt)return Lt;let e=Ro();return e?(Lt=new e,Lt):null}function Rt(){let e=bt();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var En=require("react/jsx-runtime"),Co=1e3,Cn=200;function Sr(...e){console.debug("[audio]",...e)}var Ct=(0,J.forwardRef)(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:g}=t,l=Re(),v=o??l,C=(0,J.useRef)(null),h=(0,J.useRef)(null),p=(0,J.useRef)(null),m=(0,J.useRef)(null),f=(0,J.useRef)(u);f.current=u;let P=(0,J.useRef)(c);P.current=c;let R=(0,J.useCallback)(d=>{p.current!==d&&(p.current=d,P.current?.(d))},[]),w=(0,J.useCallback)(()=>{if(typeof MediaStream>"u")return null;h.current||(h.current=new MediaStream);let d=C.current;return d&&d.srcObject!==h.current&&(d.srcObject=h.current),h.current},[]),S=(0,J.useCallback)(d=>{let k=C.current;if(!k)return;let b=k.play();!b||typeof b.then!="function"||b.then(()=>{k.muted||R(!0)}).catch(_=>{let W=_ instanceof Error?_.name:String(_);if(W==="AbortError"){Sr(`play() aborted (${d}); retrying in ${Cn}ms`),m.current&&clearTimeout(m.current),m.current=setTimeout(()=>{m.current=null,S(`${d}:retry`)},Cn);return}if(W==="NotAllowedError"){Sr(`play() blocked pending a user gesture (${d})`),R(!1);return}Sr(`play() failed (${d})`,_)})},[R]),y=(0,J.useCallback)(d=>{let k=w();if(k){for(let b of k.getAudioTracks())b!==d&&k.removeTrack(b);d&&!k.getAudioTracks().includes(d)&&k.addTrack(d),d&&S("track-attach"),f.current?.(d)}},[w,S]),T=(0,J.useCallback)(()=>{let d=C.current;d&&(w(),d.muted=!1,S("gesture"),Rt(),R(!0))},[w,S,R]);(0,J.useImperativeHandle)(r,()=>({unlock:T,get unlocked(){return p.current===!0},get element(){return C.current}}),[T]);let E=(0,J.useCallback)(d=>{C.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),w()),g?.(d)},[w,g]),O=s!==void 0;return(0,J.useEffect)(()=>{if(O){y(s??null);return}if(!v)return;let d=v.stream(n),k=()=>{let I=h.current;return I?I.getAudioTracks()[0]??null:null},b=I=>{if(I!==k()&&(y(I),I)){let N=()=>{k()===I&&y(null)};I.addEventListener("ended",N)}},_=d.track;_&&_.readyState==="live"&&b(_);let W=d.on("track",I=>{I&&I.readyState!=="live"||b(I)}),X=setInterval(()=>{let I=d.track;I&&I.readyState==="live"&&b(I)},Co);return()=>{W(),clearInterval(X)}},[v,n,O,s,y]),(0,J.useEffect)(()=>(0,Pn.observePageLifecycle)(()=>{Rt(),p.current===!0&&S("foreground")}),[S]),(0,J.useEffect)(()=>()=>{m.current&&clearTimeout(m.current)},[]),(0,En.jsx)("audio",{ref:E,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),xn=Ct;var K=require("react"),et=require("@urun-sh/core");var wn=require("react/jsx-runtime"),vr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Ot(...e){console.debug("[voice]",...e)}var Pt=(0,K.forwardRef)(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=vr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:g,onError:l,onMicStream:v,onTrack:C,onUnlockChange:h,capture:p}=t,m=Re(),f=o??m,P=(0,K.useRef)(null),R=(0,K.useRef)(null),w=(0,K.useRef)(null),S=(0,K.useRef)([]),y=(0,K.useRef)(!1),T=(0,K.useRef)(g);T.current=g;let E=(0,K.useRef)(l);E.current=l;let O=(0,K.useRef)(v);O.current=v;let d=(0,K.useCallback)(N=>{y.current!==N&&(y.current=N,T.current?.(N))},[]),k=(0,K.useCallback)(()=>{for(let N of S.current)N();S.current=[],w.current?.release(),w.current=null,R.current&&(R.current=null,O.current?.(null))},[]),b=(0,K.useCallback)(async()=>{let N=w.current;if(N){let B=await N.update(i);return R.current=N.stream,O.current?.(N.stream),B}let z=await(p??(0,et.sharedCaptureController)()).claim("audio",i);w.current=z,S.current=[z.onTrack((B,Y)=>{R.current=Y,O.current?.(Y),y.current&&f?.stream(n).attach(B).catch(ae=>Ot("mic re-attach after one-capture re-acquire failed",ae))}),z.onLost(B=>{w.current=null,S.current=[],R.current=null,O.current?.(null),d(!1),E.current?.(B)})],R.current=z.stream,O.current?.(z.stream);let $=z.track;if(!$)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return $},[p,i,f,n,d]),_=(0,K.useCallback)(async()=>{k(),d(!1),await f?.stream(n).detach().catch(()=>{})},[f,n,k,d]),W=(0,K.useCallback)(async()=>{if(!f)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");P.current?.unlock();let N;try{N=await b()}catch($){k();let B=(0,et.sessionFailureFromMediaError)($,f.status);throw E.current?.(B),B}f.connect?.();let V;for(let $=1;$<=u;$++)try{await f.whenLive(a!==void 0?{timeout:a}:void 0),await f.stream(n).attach(N),d(!0);return}catch(B){V=B,Ot(`start attempt ${$}/${u} failed`,B),$<u&&await new Promise(Y=>setTimeout(Y,c))}k(),d(!1);let z=V instanceof Error?V:new Error(String(V??"voice start failed"));throw E.current?.(z),z},[f,n,a,u,c,b,k,d]);(0,K.useImperativeHandle)(r,()=>({start:W,stop:_,unlock:()=>P.current?.unlock(),get active(){return y.current},get micStream(){return R.current},get audio(){return P.current}}),[W,_]);let X=(0,K.useRef)(!1),I=(0,K.useCallback)(async()=>{if(!f||!y.current||X.current)return;let N=R.current?.getAudioTracks()[0]??null;if(N&&N.readyState==="live"){try{await f.stream(n).attach(N)}catch(V){Ot("foreground mic re-assert failed (will retry on next pass)",V)}return}X.current=!0;try{let V=await b();await f.stream(n).attach(V)}catch(V){let z=V instanceof Error?V:new Error(String(V));Ot("foreground mic re-acquire failed",z),E.current?.(z)}finally{X.current=!1}},[f,n,b]);return(0,K.useEffect)(()=>{let N=()=>{I()};return f&&typeof f.onRecovery=="function"?f.onRecovery(N):(0,et.observePageLifecycle)(N)},[f,I]),(0,K.useEffect)(()=>k,[k]),s?(0,wn.jsx)(Ct,{ref:P,session:f,stream:n,onTrack:C,onUnlockChange:h}):null}),Tn=Pt;var Se=require("react");var Dt=require("react");var yr={level:0,speaking:!1};function Vt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=(0,Dt.useState)(yr);return(0,Dt.useEffect)(()=>{if(!e){i(yr);return}let a=bt();if(!a||typeof MediaStream>"u")return;let u;e instanceof MediaStream?u=e:(u=new MediaStream,u.addTrack(e));let c,g;try{c=a.createMediaStreamSource(u),g=a.createAnalyser(),g.fftSize=r,c.connect(g)}catch{return}let l=new Uint8Array(g.fftSize),C=setInterval(()=>{g.getByteTimeDomainData(l);let h=0;for(let m=0;m<l.length;m++){let f=(l[m]-128)/128;h+=f*f}let p=Math.sqrt(h/l.length);i(m=>{let f=p>n;return Math.abs(m.level-p)<.005&&m.speaking===f?m:{level:p,speaking:f}})},o);return()=>{clearInterval(C),c.disconnect(),i(yr)}},[e,r,o,n]),s}var Te=require("react/jsx-runtime"),Po={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},xo={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},An=(0,Se.forwardRef)(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:u,onActiveChange:c,onError:g,onMicStream:l,capture:v}=t,C=Re(),h=o??C,p=(0,Se.useRef)(null),[m,f]=(0,Se.useState)(null),P=(0,Se.useRef)(l);P.current=l;let{level:R,speaking:w}=Vt(a?m:null);return(0,Se.useImperativeHandle)(r,()=>({start:()=>{let S=p.current;return S?S.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>p.current?.stop()??Promise.resolve(),get active(){return p.current?.active??!1},get micStream(){return p.current?.micStream??null}}),[]),(0,Se.useEffect)(()=>{!i||!h||p.current?.start().catch(()=>{})},[i,h]),(0,Te.jsxs)(Te.Fragment,{children:[(0,Te.jsx)(Pt,{ref:p,session:h,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...v!==void 0?{capture:v}:{},onActiveChange:c,onError:g,onMicStream:S=>{f(S),P.current?.(S)}}),a?(0,Te.jsx)("span",{className:u,style:Po,"data-urun-mic":"","data-urun-mic-active":m?"true":"false","data-urun-mic-speaking":w?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(R*100)/100,children:(0,Te.jsx)("span",{style:xo,children:(0,Te.jsx)("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(R*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});var tt=require("@urun-sh/core"),M=require("react");var de=require("react/jsx-runtime"),br={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function kr(...e){console.debug("[camera]",...e)}function Eo(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function To(){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 Rr=(0,M.forwardRef)(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:u,autoStart:c=!0,mirror:g="auto",connectTimeoutMs:l,visible:v=!1,className:C,videoClassName:h,onActiveChange:p,onError:m,onStream:f,onTrack:P,children:R,capture:w,flipControl:S="auto",flipControlClassName:y,onDevices:T}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let E=i?"user":a?"environment":u??"environment",O=Re(),d=o??O,k=(0,M.useRef)(null),b=(0,M.useRef)(null),_=(0,M.useRef)(null),W=(0,M.useRef)([]),X=(0,M.useRef)(null),I=(0,M.useRef)(!1),N=(0,M.useRef)(!1),V=(0,M.useRef)(E),[z,$]=(0,M.useState)(E),[B,Y]=(0,M.useState)(!1),[ae,oe]=(0,M.useState)(null),[D,j]=(0,M.useState)(!1),[Q]=(0,M.useState)(Eo),De=(0,M.useRef)(p);De.current=p;let fe=(0,M.useRef)(m);fe.current=m;let Ue=(0,M.useRef)(f);Ue.current=f;let x=(0,M.useRef)(P);x.current=P;let H=(0,M.useRef)(T);H.current=T;let A=(0,M.useCallback)(F=>{I.current!==F&&(I.current=F,Y(F),De.current?.(F))},[]);(0,M.useEffect)(()=>{if(!B){oe(null);return}let F=!1,q=()=>{To().then(be=>{F||(oe(be),be&&H.current?.(be))})};q();let he=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof he?.addEventListener=="function"?(he.addEventListener("devicechange",q),()=>{F=!0,he.removeEventListener?.("devicechange",q)}):()=>{F=!0}},[B]);let ee=(0,M.useCallback)(F=>{let q=k.current;q&&(q.muted=!0,q.defaultMuted=!0,q.setAttribute("muted",""),q.setAttribute("playsinline",""),q.setAttribute("webkit-playsinline",""),q.srcObject=F,F&&q.play()?.catch?.(he=>kr("preview play() failed",he)))},[]),re=(0,M.useCallback)(()=>{N.current=!1,X.current?.(),X.current=null;for(let F of W.current)F();W.current=[],_.current?.release(),_.current=null,b.current&&(b.current=null,Ue.current?.(null),x.current?.(null)),ee(null)},[ee]),ye=(0,M.useCallback)((F,q)=>{X.current?.(),b.current=q,ee(q),Ue.current?.(q);let he=()=>{b.current===q&&(kr("camera track ended (device removed or permission revoked)"),re(),A(!1))};F.addEventListener("ended",he),X.current=()=>F.removeEventListener("ended",he)},[ee,re,A]),U=(0,M.useCallback)(async F=>{let q=n!==!1;if(q&&!d)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let he={...br,...s,facingMode:F},be;try{let Me=_.current;if(Me)be=await Me.update(he);else{let ct=await(w??(0,tt.sharedCaptureController)()).claim("video",he);if(_.current=ct,W.current=[ct.onTrack((lt,Zn)=>{ye(lt,Zn),I.current&&(!q||!d||d.stream(n).attachVideo(lt).then(()=>x.current?.(lt)).catch(Qn=>kr("camera re-publish after one-capture re-acquire failed",Qn)))}),ct.onLost(lt=>{_.current=null,W.current=[],re(),A(!1),fe.current?.(lt)})],!ct.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});be=ct.track}}catch(Me){let $e=(0,tt.sessionFailureFromMediaError)(Me,d?.status);throw fe.current?.($e),$e}V.current=F,$(F),ye(be,_.current?.stream??new MediaStream([be]));try{q&&d&&(d.connect?.(),await d.whenLive(l!==void 0?{timeout:l}:void 0),await d.stream(n).attachVideo(be)),N.current=q?n:!1}catch(Me){re(),A(!1);let $e=Me instanceof Error?Me:new Error(String(Me));throw fe.current?.($e),$e}x.current?.(be),A(!0)},[d,n,s,l,w,ye,re,A]),Ce=(0,M.useCallback)(F=>U(F?.facingMode??V.current),[U]),Pe=(0,M.useCallback)(async F=>{let q=N.current===n;I.current&&V.current===F&&q||await U(F)},[U,n]),ge=(0,M.useCallback)(()=>U(V.current==="environment"?"user":"environment"),[U]),ke=(0,M.useCallback)(async()=>{re(),A(!1),n!==!1&&await d?.stream(n).detachVideo().catch(()=>{})},[d,n,re,A]),Ke=(0,M.useCallback)(async F=>{let q=k.current;if(!q)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await(0,tt.captureStillFromVideo)(q,F)},[]);(0,M.useImperativeHandle)(r,()=>({start:Ce,stop:ke,flip:ge,setFacingMode:Pe,capturePhoto:Ke,get active(){return I.current},get facingMode(){return V.current},get stream(){return b.current},get element(){return k.current}}),[Ce,ke,ge,Pe,Ke]);let ut=(0,M.useRef)(Pe);if(ut.current=Pe,(0,M.useEffect)(()=>{c&&(n!==!1&&!d||ut.current(E).catch(()=>{}))},[c,d,E,n]),(0,M.useEffect)(()=>re,[re]),!v)return null;let Er=g==="auto"?z==="user":g,rr=B&&(S===!0||S==="auto"&&Q&&(ae?.length??0)>1),wt=()=>{D||(j(!0),ge().catch(()=>{}).finally(()=>j(!1)))};return(0,de.jsxs)("div",{className:C,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":z,children:[(0,de.jsx)("video",{ref:k,className:h,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Er?{transform:"scaleX(-1)"}:{}}}),rr?(0,de.jsx)("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:wt,disabled:D,className:y,style:y?{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,de.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,de.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,de.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,de.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,de.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,de.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,R]})}),Un=(0,M.forwardRef)(function({preview:t=!0,...r},o){return(0,de.jsx)(Rr,{ref:o,...r,visible:t,autoStart:!1})});var rt=require("@urun-sh/core"),te=require("react");function Mn(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=(0,te.useState)(null),[a,u]=(0,te.useState)(null),[c,g]=(0,te.useState)(!1),[l,v]=(0,te.useState)(null),[C]=(0,te.useState)(rt.cameraCaptureAvailable),h=(0,te.useRef)(n);h.current=n;let p=(0,te.useRef)(null),m=(0,te.useRef)(0),f=(0,te.useCallback)(y=>{p.current&&URL.revokeObjectURL(p.current),p.current=y?URL.createObjectURL(new Blob([y.bytes],{type:y.type})):null,u(p.current),i(y),h.current?.(y)},[]);(0,te.useEffect)(()=>()=>{m.current++,p.current&&URL.revokeObjectURL(p.current),p.current=null},[]);let P=(0,te.useCallback)(async y=>{let T=++m.current;g(!0),v(null);try{let E=await y();if(m.current!==T)return;f(E)}catch(E){if(m.current!==T)return;v((0,rt.referenceImageErrorMessage)(E))}finally{m.current===T&&g(!1)}},[f]),R=(0,te.useCallback)(y=>P(()=>(0,rt.normalizeReferenceImage)(y,{maxSize:t,type:r,quality:o,source:"file"})),[P,t,r,o]),w=(0,te.useCallback)(y=>P(()=>y.capturePhoto({maxSize:t,type:r,quality:o})),[P,t,r,o]),S=(0,te.useCallback)(()=>{m.current++,v(null),g(!1),f(null)},[f]);return{reference:s,previewUrl:a,pick:R,capture:w,clear:S,busy:c,error:l,cameraAvailable:C}}var Ft=require("react");function _n(e,t){let[r,o]=(0,Ft.useState)(null);return(0,Ft.useEffect)(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}var Ln=require("react");var Ht=require("react");var Nn=require("zustand/vanilla"),In=require("zustand"),wo=()=>{};function qt(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=(0,Nn.createStore)(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let c of s)c();s=null}},a=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",c=>n.setState({doc:c})),e.onSynced(()=>n.setState({synced:!0}))]),i):wo,u=(c=>(0,In.useStore)(n,c));return Object.assign(u,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),u}function nt(e,t){let r=(0,Ht.useMemo)(()=>qt(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return(0,Ht.useEffect)(()=>r.bind(),[r]),r}function On(e,t,r){let n=nt(e,t)(r??(a=>a)),s=(0,Ln.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 Bt=require("react");var Ne=200;function we(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function ot(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Wt(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 jt(e,t,r={}){let o=r.cap??200,[n,s]=(0,Bt.useState)([]);return(0,Bt.useEffect)(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let u=await a.next();if(!i||u.done)break;s(c=>we(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}var ve=require("react/jsx-runtime");function Dn({session:e,name:t,cap:r,className:o}){let n=jt(e,t,{cap:r});return(0,ve.jsxs)("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[(0,ve.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,ve.jsx)("code",{children:t}),(0,ve.jsxs)("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),(0,ve.jsx)("div",{className:"urun-stream-tail-log",children:n.length===0?(0,ve.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,ve.jsx)("code",{children:t})," messages\u2026"]}):n.map((s,i)=>(0,ve.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,ve.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",ot(s.payload)]},`${s.at}-${i}`))})]})}var xt=require("react");var le=require("react/jsx-runtime");function Et({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=(0,xt.useState)(""),[i,a]=(0,xt.useState)(null),u=(0,xt.useCallback)(()=>{let c=Wt(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return(0,le.jsxs)("div",{className:"urun-doc-patch",children:[(0,le.jsx)("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),(0,le.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,le.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?(0,le.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Vn({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=nt(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return(0,le.jsxs)("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[(0,le.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,le.jsx)("code",{children:t}),(0,le.jsx)("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),(0,le.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?(0,le.jsx)(Et,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}var Kt=require("react");var Ae=require("react/jsx-runtime");function Fn(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function qn({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=(0,Kt.useState)([]);return(0,Kt.useEffect)(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>we(u,{at:Date.now(),direction:"in",text:Fn(ot(a))},r))}):void 0),[e,t,r]),(0,Ae.jsxs)("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[(0,Ae.jsx)(Et,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>we(u,{at:Date.now(),direction:"out",text:Fn(a)},r))}}),(0,Ae.jsx)("div",{className:"urun-control-sender-log",children:n.length===0?(0,Ae.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>(0,Ae.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,Ae.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,Ae.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}var $t=require("react");var Be=require("react/jsx-runtime");function Hn({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=(0,$t.useState)([]),a=t.join(","),u=r.join(",");return(0,$t.useEffect)(()=>{if(i([]),!e)return;let c=(l,v)=>i(C=>we(C,{at:Date.now(),kind:l,text:v},o)),g=[];g.push(e.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of t){let v=e.stream(l);g.push(v.on("track",C=>c("track",`${l}: ${C?"track arrived":"track ended"}`)))}for(let l of r){let v=e.doc(l);g.push(v.on("change",()=>c("doc",`${l} changed`)))}return()=>g.forEach(l=>l())},[e,a,u,o]),(0,Be.jsx)("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?(0,Be.jsx)("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,g)=>(0,Be.jsxs)("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[(0,Be.jsx)("span",{className:"urun-event-spine-kind",children:c.kind})," ",(0,Be.jsx)("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${g}`))})}var Qt=require("@urun-sh/core");var zt=require("react");function pe(e){let[t,r]=(0,zt.useState)(e?.phase??null);return(0,zt.useEffect)(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}var Bn=require("@urun-sh/core");var st=require("react"),Wn=require("@urun-sh/core");function Jt(e){let t=pe(e),r=(0,Wn.isWakingPhase)(t?.name),o=(0,st.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,st.useState)(s);return(0,st.useEffect)(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let u=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(u)},[n]),{waking:r,phase:t,state:r?t?.runtime?.state:void 0,reason:r?t?.runtime?.reason:void 0,since:n,seconds:r?i:0}}var Ie=require("react/jsx-runtime");function Xt({session:e,render:t,className:r}){let o=Jt(e);return!o.waking||!o.phase?null:(0,Ie.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,Ie.jsxs)(Ie.Fragment,{children:[(0,Ie.jsx)("span",{className:"urun-session-waking-label",children:(0,Bn.describeSessionPhase)(o.phase)})," ",(0,Ie.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}var Yt=require("react");var Le=require("react"),Ao={event:null,elapsedMs:0};function Gt(e,t){let[r,o]=(0,Le.useState)(null),n=(0,Le.useRef)(0);(0,Le.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,Le.useState)(0);return(0,Le.useEffect)(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,u=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(u());let c=setInterval(()=>i(u()),1e3);return()=>clearInterval(c)},[r]),r?{event:r,elapsedMs:s}:Ao}var it=require("react/jsx-runtime"),Uo={activating:"starting stream\u2026","still-activating":"model warming up \u2014 this can take a minute","cold-boot":"cold boot \u2014 compiling/loading the model, hang tight",degraded:"taking longer than usual \u2014 still trying"};function Mo(e){let[t,r]=(0,Yt.useState)(!1);return(0,Yt.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 Zt({session:e,stream:t,videoElement:r,render:o,className:n}){let s=Gt(e,t),i=Mo(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return(0,it.jsx)("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):(0,it.jsxs)("div",{className:"urun-activation-overlay-card",children:[(0,it.jsx)("span",{className:"urun-activation-overlay-copy",children:a.hint??Uo[u]})," ",(0,it.jsxs)("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}var me=require("react/jsx-runtime"),_o={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function jn({session:e,className:t}){let r=pe(e),o=r?.name??"idle",n=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return(0,me.jsxs)("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[(0,me.jsx)("span",{className:"urun-session-status-dot","data-phase":o}),(0,me.jsx)("span",{className:"urun-session-status-label",children:_o[o]}),n?(0,me.jsx)("span",{className:"urun-session-status-detail",children:n}):null]})}function Kn({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=pe(e);if(s?.name==="live")return(0,me.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,(0,me.jsx)(Zt,{session:e})]});let i=r?r(s):(0,me.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,Qt.isWakingPhase)(s.name)?(0,me.jsx)(Xt,{session:e}):s&&s.name!=="idle"?(0,Qt.describeSessionPhase)(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,me.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?(0,me.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}var er=require("react");var zn=require("react/jsx-runtime");function Cr(e){return pe(e)?.endsAt??null}function No(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 $n({session:e,urgentMs:t=6e4,className:r}){let n=Cr(e)?.getTime()??null,[s,i]=(0,er.useState)(()=>n===null?null:Math.max(0,n-Date.now()));if((0,er.useEffect)(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),s===null)return null;let a=No(s);return(0,zn.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 Tt=require("react/jsx-runtime"),Io=new Set(["expired","ended","error"]);function Jn({session:e,onNewSession:t,children:r,className:o}){let n=pe(e);if(!n||!Io.has(n.name))return null;let s=r?r(n):(0,Tt.jsx)("span",{className:"urun-session-ended-copy",children:n.name==="expired"?"Session ended \u2014 start a new session":n.name==="error"?`Session failed${n.error?.reason?` \u2014 ${n.error.reason}`:""}.`:"Session ended."});return(0,Tt.jsxs)("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?(0,Tt.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}var Oe=require("react"),je=require("react/jsx-runtime");function Pr(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;return t.warning!==!0?null:{warning:!0,deadlineEpochS:typeof t.deadline_epoch_s=="number"?t.deadline_epoch_s:null,idleSinceEpochS:typeof t.idle_since_epoch_s=="number"?t.idle_since_epoch_s:null}}function xr(e){let t=(0,Oe.useMemo)(()=>e?e.doc("control"):null,[e]),[r,o]=(0,Oe.useState)(()=>t?Pr(t.get("idle")):null);return(0,Oe.useEffect)(()=>{if(!t){o(null);return}return o(Pr(t.get("idle"))),t.on("change",()=>o(Pr(t.get("idle"))))},[t]),r}function Lo(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function Xn({session:e,onStillHere:t,className:r}){let o=xr(e),n=o?.deadlineEpochS??null,[s,i]=(0,Oe.useState)(null);if((0,Oe.useEffect)(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()/1e3));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return(0,je.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,je.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,je.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,je.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${Lo(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,je.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}var at=require("react"),Gn=require("@urun-sh/core");function Yn(e){let t=(0,at.useContext)(Je),[r,o]=(0,at.useState)(null),n=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,u=t?.orgId,c=t?.jwt,g=t?.getAccessToken,l=t?.authProvider;return(0,at.useEffect)(()=>{if(!a||!u||!n||!s)return;let v=!1,C=()=>{(0,Gn.prewake)({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:g,authProvider:l}).then(p=>{v||o(p)}).catch(()=>{})};C();let h=setInterval(C,Math.max(1,i)*1e3);return()=>{v=!0,clearInterval(h)}},[n,s,i,a,u,c,g,l]),r}var tr=require("@urun-sh/core");0&&(module.exports={Audio,Camera,ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,Image,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,Mic,OPERATOR_CHORD_LABEL,OPERATOR_TOKEN_STORAGE_KEY,ProgressCard,ProgressCardSchema,ReprojectedVideo,Session,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunActivationOverlay,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunIdleWarning,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,Video,Voice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,readOperatorToken,registerComponent,resumeUrunAudioContext,urunPublicEnv,useActivation,useApp,useChat,useCompletion,useConfirmOnLeave,useDocStore,useImageFrame,useInputPresence,useMetricsPanel,useOperatorOverride,useProgressCard,useReferenceImage,useRequest,useSession,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client"
2
- import{a as rn,b as nn,c as St}from"./chunk-WF2OBDSX.mjs";import{useCallback as hn,useEffect as tr,useMemo as Sn,useRef as rr,useState as Xe}from"react";import{Component as on}from"react";import{jsx as Gt,jsxs as sn}from"react/jsx-runtime";var De=class extends on{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||sn("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:[Gt("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),Gt("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as an}from"react";var we=an(null);function ye(e){return e&&e.trim()?e.trim():void 0}function me(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return ye(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return ye(typeof process<"u"?process.env?.[e]:void 0)}}function Je(){let e=me("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||me("VERCEL_ENV")==="production"?"workos":me("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function un(){return Je()==="workos"}import{useEffect as cn,useRef as ln}from"react";var dn="urun.operator_token",Zt=null,Yt="op",pn="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function Qt(){return typeof window<"u"}function er(){return Zt}function mn(){if(!Qt())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(Yt);if(!r)return null;Zt=r,t.delete(Yt);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function fn(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function vt(e){let t=ln(e);t.current=e,cn(()=>{if(!Qt())return;mn();let r=o=>{if(!fn(o))return;let n=er();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}import{useEffect as gn}from"react";function yt(e=!0){gn(()=>{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 Cn}from"react/jsx-runtime";var vn="/api/urun-token",yn=1e4;function kn(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 nr(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 bn(e,t){return typeof e=="function"?e(t):e!==void 0?e:Cn("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 Rn({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,confirmOnLeave:f=!1,fallback:l,errorFallback:v,children:P}){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 p=r??o;if(g&&(typeof p!="string"||p.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);yt(f);let[h,m]=Xe(),[k,b]=Xe(),[x,S]=Xe(null),y=rr(void 0),w=rr(null),[T,I]=Xe(null);vt(K=>I({jwt:K}));let d=St(),E=me("NEXT_PUBLIC_SESSION_TOKEN")??me("NEXT_PUBLIC_URUN_JWT"),R=Je(),U=T!==null,O=R==="workos"&&!n&&!U&&!g,z=n??(R==="jwt"?E:void 0)??h??k?.token,N=U?T.jwt:z,_=s??me("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),F=O&&!N,B=t??k?.orgId,q=e??k?.gatewayUrl,W=g&&k===void 0,G=g&&k!==void 0&&!q?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,ee=x??G,J=u??vn,H=hn(async K=>{if(!K?.forceRefresh){let $=y.current;if(!$)return $;let C=kn($);if(C===null||C-Date.now()>yn)return $}return(await(w.current??(w.current=(async()=>{try{let $=await nr(J);return y.current=$.token,b($),$}finally{w.current=null}})()))).token},[J]),X=Sn(()=>({appId:p,baseUrl:q??"",orgId:B??"",jwt:N,getAccessToken:O?d?.getAccessToken:g&&!U?H:void 0,authProvider:_,eventsUrl:i,sessionKey:a,releaseOnLeave:c,priority:U?"preempt":void 0}),[p,d,q,_,N,i,B,a,c,O,U,g,H]);return tr(()=>{if(!g)return;let K=new AbortController;return S(null),(async()=>{try{let Z=await nr(J,K.signal);y.current=Z.token,b(Z)}catch(Z){if(K.signal.aborted)return;S(Z instanceof Error?Z:new Error(String(Z)))}})(),()=>K.abort()},[g,J]),tr(()=>{if(!O||!d)return;let K=!1,Z=d;async function $(){try{let L=await Z.getAccessToken();K||m(L??void 0)}catch{K||m(void 0)}}$();let C=window.setInterval(()=>{$()},6e4);return()=>{K=!0,window.clearInterval(C)}},[d,O]),Ve(De,{fallback:l,children:ee?bn(v,ee):F||W?Ve("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Ve(we.Provider,{value:X,children:P})})}import{useContext as Pn,useEffect as En,useMemo as or,useReducer as wn,useRef as kt}from"react";import{App as Tn}from"@urun-sh/core";function xn(e,t){return`${e}:${JSON.stringify(t??{})}`}function An(e,t,r){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,fnName:t,args:r??{}})}var ke=new Map;var bt=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},Rt=class{constructor(t,r){this._stream=t;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(t){return this._stream.attach(t)}attachVideo(t){return this._stream.attachVideo(t)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(t){return this._stream.seek(t)}chunks(t){return this._stream.chunks(t)}onSeeked(t){return this._stream.onSeeked(t)}on(t,r){return this._stream.on(t,r)}messages(){return this._stream.messages()}emit(t,r){return this._stream.emit(t,r)}dispose(){this._unsubscribeTrack()}},Ct=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||a.name==="expired"){let u=a.error,c=u?.reason??(a.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else a.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),i=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{i(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new bt(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new Rt(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function Un(){let e=Pn(we);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=wn(i=>i+1,0),r=kt(new Map),o=kt(new Map),n=kt(null),s=or(()=>Tn(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority]);return En(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=ke.get(a);c===u&&o.current.get(a)===u&&(c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null),c.handle.addNotifier(t),c.refCount+=1)}}return()=>{let a=new Map;for(let[u,c]of o.current){let f=ke.get(u);f===c&&(f.handle.removeNotifier(t),f.refCount=Math.max(0,f.refCount-1),a.set(u,f),f.refCount===0&&(f.disposeTimer=setTimeout(()=>{let l=ke.get(u);!l||l.refCount!==0||(ke.delete(u),l.handle.disconnect())},0)))}n.current=a}},[]),or(()=>{let i=new Map;return new Proxy({},{get(a,u){if(typeof u!="string")return;let c=i.get(u);if(c)return c;let f=l=>{let v=xn(u,l),P=r.current.get(v);if(P&&!P.disposed)return P;let g=An(e,u,l),p=ke.get(g);return p?.handle.disposed&&(p.disposeTimer&&clearTimeout(p.disposeTimer),ke.delete(g),o.current.get(g)===p&&o.current.delete(g),p=void 0),p?p.disposeTimer&&(clearTimeout(p.disposeTimer),p.disposeTimer=null):(p={handle:new Ct(s[u](l),t,e.eventsUrl),refCount:0,disposeTimer:null},ke.set(g,p)),o.current.get(g)!==p&&(o.current.set(g,p),p.handle.addNotifier(t),p.refCount+=1),r.current.set(v,p.handle),p.handle};return i.set(u,f),f}})},[e,s])}import{useCallback as Pt,useEffect as Mn,useMemo as _n,useRef as Ge,useState as Et}from"react";function Te(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 Nn(e){return e instanceof Error?e:new Error(String(e))}function In(e,t){let r=_n(()=>Te(e),[e]),[o,n]=Et(void 0),[s,i]=Et(null),[a,u]=Et(!1),c=Ge(t);c.current=t;let f=Ge(0),l=Ge(null),v=Ge(!0);Mn(()=>(v.current=!0,()=>{v.current=!1,l.current?.abort()}),[]);let P=Pt(async h=>{l.current?.abort();let m=new AbortController;l.current=m;let k=++f.current,b=()=>v.current&&f.current===k;b()&&(u(!0),i(null));try{let x=await r.request(h,{...c.current,signal:m.signal});return b()&&(n(x),u(!1),c.current?.onSuccess?.(x)),x}catch(x){let S=Nn(x);throw b()&&(i(S),u(!1),c.current?.onError?.(S)),S}},[r]),g=Pt(h=>{P(h).catch(()=>{})},[P]),p=Pt(()=>{f.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:g,mutateAsync:P,data:o,error:s,isPending:a,reset:p}}import{useCallback as sr,useEffect as Ln,useMemo as On,useRef as Ye,useState as wt}from"react";function ir(e){return e instanceof Error?e:new Error(String(e))}var Dn=e=>typeof e=="string"?e:String(e);function Vn(e,t){let r=On(()=>Te(e),[e]),[o,n]=wt(""),[s,i]=wt(!1),[a,u]=wt(null),c=Ye(t);c.current=t;let f=Ye(0),l=Ye(null),v=Ye(!0);Ln(()=>(v.current=!0,()=>{v.current=!1,l.current?.cancel(),l.current=null}),[]);let P=sr(()=>{f.current++,l.current?.cancel(),l.current=null,v.current&&i(!1)},[]),g=sr(async p=>{l.current?.cancel();let h=++f.current,m=()=>v.current&&f.current===h,k=c.current,b=k?.parseChunk??Dn,x=k?.buildPayload??(R=>({prompt:R}));m()&&(n(""),u(null),i(!0));let{parseChunk:S,buildPayload:y,onFinish:w,onError:T,...I}=k??{},d="",E;try{E=r.requestStream(x(p),I),l.current=E}catch(R){let U=ir(R);m()&&(u(U),i(!1),k?.onError?.(U));return}try{for await(let R of E){if(f.current!==h)break;d+=b(R),m()&&n(d)}m()&&(i(!1),k?.onFinish?.(d))}catch(R){let U=ir(R);m()&&(u(U),i(!1),k?.onError?.(U))}finally{l.current===E&&(l.current=null)}},[r]);return{completion:o,complete:g,stop:P,isStreaming:s,error:a}}import{useCallback as ar,useEffect as Fn,useMemo as qn,useRef as xe,useState as Ze}from"react";function ur(e){return e instanceof Error?e:new Error(String(e))}var Hn=e=>typeof e=="string"?e:String(e),cr=0;function Tt(e){return cr+=1,`${e}-${cr}`}function Wn(e,t){let r=qn(()=>Te(e),[e]),[o,n]=Ze(()=>(t?.initialMessages??[]).map(b=>({id:b.id??Tt("msg"),role:b.role,content:b.content}))),[s,i]=Ze(""),[a,u]=Ze(!1),[c,f]=Ze(null),l=xe(t);l.current=t;let v=xe(o);v.current=o;let P=xe(s);P.current=s;let g=xe(0),p=xe(null),h=xe(!0);Fn(()=>(h.current=!0,()=>{h.current=!1,p.current?.cancel(),p.current=null}),[]);let m=ar(()=>{g.current++,p.current?.cancel(),p.current=null,h.current&&u(!1)},[]),k=ar(async b=>{let x=b===void 0,S=(x?P.current:b)??"";if(!S.trim())return;p.current?.cancel();let w=++g.current,T=()=>h.current&&g.current===w,I=l.current,d=I?.parseChunk??Hn,E={id:Tt("msg"),role:"user",content:S},R={id:Tt("msg"),role:"assistant",content:""},U=[...v.current,E].map(H=>({role:H.role,content:H.content})),O=[...v.current,E,R];v.current=O,n(O),x&&i(""),f(null),u(!0);let z=I?.buildPayload??(H=>({messages:H})),{initialMessages:N,parseChunk:_,buildPayload:F,onFinish:B,onError:q,...W}=I??{},G=H=>{n(X=>X.map(K=>K.id===R.id?{...K,content:H}:K))},ee="",J;try{J=r.requestStream(z(U),W),p.current=J}catch(H){let X=ur(H);T()&&(f(X),u(!1),I?.onError?.(X));return}try{for await(let H of J){if(g.current!==w)break;ee+=d(H),T()&&G(ee)}T()&&(u(!1),I?.onFinish?.({...R,content:ee}))}catch(H){let X=ur(H);T()&&(f(X),u(!1),I?.onError?.(X))}finally{p.current===J&&(p.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:k,stop:m,isStreaming:a,error:c}}import{useCallback as fe,useEffect as lr,useMemo as Bn,useRef as dr,useState as pr}from"react";import{createInputPresencePublisher as jn,INPUT_PRESENCE_DEFAULT_HZ as Kn,INPUT_PRESENCE_FIELD as $n}from"@urun-sh/core";var xt=[];function zn(e,t={}){let{field:r=$n,hz:o=Kn}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=Bn(()=>s?jn({awareness:{setLocalStateField:(S,y)=>s.setField(S,y)},field:r,hz:o}):null,[s,r,o]),a=dr(null);a.current=i;let[u,c]=pr(!1),[f,l]=pr(xt),v=dr(!1);lr(()=>{if(i)return()=>i.dispose()},[i]);let P=fe(()=>{let S=a.current;l(S?S.heldKeys():xt)},[]),g=fe(()=>{a.current?.clear(),l(xt)},[]);lr(()=>{if(!n)return;let S=()=>!!n.pointerLockElement,y=()=>{if(S()){v.current=!1,c(!0);return}v.current||(c(!1),g())},w=R=>{S()&&(a.current?.keyDown(R.key),P())},T=R=>{a.current?.keyUp(R.key),P()},I=R=>{S()&&a.current?.movePointer(R.movementX,R.movementY)},d=R=>{S()&&a.current?.setButtons(R.buttons)},E=()=>{g()};return n.addEventListener("pointerlockchange",y),n.addEventListener("keydown",w),n.addEventListener("keyup",T),n.addEventListener("mousemove",I),n.addEventListener("mousedown",d),n.addEventListener("mouseup",d),n.defaultView?.addEventListener("blur",E),()=>{n.removeEventListener("pointerlockchange",y),n.removeEventListener("keydown",w),n.removeEventListener("keyup",T),n.removeEventListener("mousemove",I),n.removeEventListener("mousedown",d),n.removeEventListener("mouseup",d),n.defaultView?.removeEventListener("blur",E)}},[n,g,P]);let p=fe(S=>{S.requestPointerLock?.()},[]),h=fe(()=>{v.current=!0,c(!0)},[]),m=fe(()=>{v.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),g()},[n,g]),k=fe(S=>{a.current?.keyDown(S),P()},[P]),b=fe(S=>{a.current?.keyUp(S),P()},[P]),x=fe((S,y)=>{a.current?.movePointer(S,y)},[]);return{engage:p,engageTouch:h,release:m,engaged:u,heldKeys:f,pressKey:k,releaseKey:b,movePointer:x}}import{forwardRef as no,useEffect as Sr,useImperativeHandle as oo,useMemo as so,useRef as et}from"react";import{createCameraWarp as io}from"@urun-sh/core";import{forwardRef as Zn,useCallback as Ae,useEffect as Qe,useImperativeHandle as Qn,useRef as ie,useState as fr}from"react";import{createContext as Jn,useContext as mr}from"react";import{jsx as Yn}from"react/jsx-runtime";var At=Jn(null);function Xn({session:e,children:t}){return Yn(At.Provider,{value:e,children:t})}function ce(){return mr(At)}function Gn(){let e=mr(At);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 hr,jsxs as ro}from"react/jsx-runtime";function eo(e,t){return e-t>>>0<2147483648}var gr=1e3;function to(...e){console.debug("[video]",...e)}var Ue=Zn(function(t,r){let{session:o,stream:n="video",audioStream:s="audio",track:i,muted:a=!0,mirror:u=!1,objectFit:c="contain",className:f,style:l,videoClassName:v,placeholder:P,poster:g,children:p,onTrack:h,onFirstFrame:m,frameMarker:k,onFrameMarkerReached:b,onFrameMarkerUnsupported:x}=t,S=ce(),y=o??S,w=ie(null),T=ie(null),[I,d]=fr(!1),[E,R]=fr(!1),U=ie(!1),O=ie(h);O.current=h;let z=ie(m);z.current=m;let N=ie(b);N.current=b;let _=ie(x);_.current=x;let F=ie(k??null);F.current=k??null;let B=ie(null),q=ie(null),W=Ae((C,L=!1)=>{if(!L&&C===B.current||(B.current=C,q.current?.(),q.current=null,U.current=!1,R(!1),!C))return;let M=w.current;if(!M)return;let j=F.current,re=j?.rtpTimestamp??null,Y=!1,A=()=>{Y||(Y=!0,_.current?.())};j&&re==null&&A();let te=j!=null&&re!=null,ve=oe=>{q.current?.(),q.current=null,U.current=!0,R(!0),z.current?.(),oe&&N.current?.()};if(typeof M.requestVideoFrameCallback=="function"){let oe=!1,Pe=0,Ie=(gt,ht)=>{if(!oe){if(te){let ze=ht?.rtpTimestamp;if(typeof ze!="number"){A(),ve(!1);return}if(!eo(ze,re)){Pe=M.requestVideoFrameCallback(Ie);return}ve(!0);return}ve(!1)}};Pe=M.requestVideoFrameCallback(Ie),q.current=()=>{oe=!0,M.cancelVideoFrameCallback?.(Pe)};return}te&&A();let ne=()=>{let oe=M.getVideoPlaybackQuality?.();(oe?oe.totalVideoFrames>0:M.readyState>=2&&M.videoWidth>0)&&ve(!1)};M.addEventListener("loadeddata",ne),M.addEventListener("timeupdate",ne),M.addEventListener("playing",ne),q.current=()=>{M.removeEventListener("loadeddata",ne),M.removeEventListener("timeupdate",ne),M.removeEventListener("playing",ne)},ne()},[]);Qe(()=>()=>{q.current?.(),q.current=null},[]);let G=k==null?null:`${k.rtpTimestamp??""}|${k.ptsMs??""}`,ee=ie(G);Qe(()=>{if(ee.current===G||(ee.current=G,G==null))return;let C=B.current;C&&W(C,!0)},[G,W]);let J=Ae(()=>{if(typeof MediaStream>"u")return null;T.current||(T.current=new MediaStream);let C=w.current;return C&&C.srcObject!==T.current&&(C.srcObject=T.current),T.current},[]),H=Ae(C=>{let L=w.current;if(!L)return;let M=L.play();!M||typeof M.catch!="function"||M.catch(j=>to(`play() failed (${C})`,j))},[]),X=Ae(C=>{let L=J();if(L){for(let M of L.getVideoTracks())M!==C&&L.removeTrack(M);if(C&&!L.getVideoTracks().includes(C)){L.addTrack(C);let M=w.current;M&&(M.srcObject=L)}C&&H("track-attach"),d(C!==null),W(C),O.current?.(C)}},[J,H,W]),K=Ae(C=>{let L=J();if(L){for(let M of L.getAudioTracks())M!==C&&L.removeTrack(M);C&&!L.getAudioTracks().includes(C)&&L.addTrack(C),C&&H("audio-attach")}},[J,H]),Z=Ae(C=>{w.current=C,C&&(a&&(C.muted=!0,C.defaultMuted=!0,C.setAttribute("muted","")),C.setAttribute("playsinline",""),C.setAttribute("webkit-playsinline",""),J())},[J,a]);Qn(r,()=>({get element(){return w.current},get live(){return T.current?T.current.getVideoTracks().length>0:!1},get framed(){return U.current}}),[]);let $=i!==void 0;return Qe(()=>{if($){X(i??null);return}if(!y)return;let C=y.stream(n),L=()=>{let A=T.current;return A?A.getVideoTracks()[0]??null:null},M=A=>{if(A!==L()&&(X(A),A)){let te=()=>{L()===A&&X(null)};A.addEventListener("ended",te)}},j=C.track;j&&j.readyState==="live"&&M(j);let re=C.on("track",A=>{A&&A.readyState!=="live"||M(A)}),Y=setInterval(()=>{let A=C.track;A&&A.readyState==="live"&&M(A)},gr);return()=>{re(),clearInterval(Y)}},[y,n,$,i,X]),Qe(()=>{if($||!y||s===!1)return;let C=y.stream(s),L=()=>{let A=T.current;return A?A.getAudioTracks()[0]??null:null},M=A=>{if(A!==L()&&(K(A),A)){let te=()=>{L()===A&&K(null)};A.addEventListener("ended",te)}},j=C.track;j&&j.readyState==="live"&&M(j);let re=C.on("track",A=>{A&&A.readyState!=="live"||M(A)}),Y=setInterval(()=>{let A=C.track;A&&A.readyState==="live"&&M(A)},gr);return()=>{re(),clearInterval(Y)}},[y,s,$,K]),ro("div",{className:f,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":I?"true":"false","data-urun-video-framed":E?"true":"false",children:[hr("video",{ref:Z,className:v,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),I?null:P,g===void 0?null:hr("div",{"data-urun-video-poster":"","aria-hidden":E||void 0,style:{position:"absolute",inset:0,...E?{opacity:0,pointerEvents:"none"}:null},children:g}),p]})});import{jsx as vr,jsxs as co}from"react/jsx-runtime";var ao={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},uo=no(function(t,r){let{warp:o,children:n,...s}=t,{enabled:i=!0,overscan:a=.08,captureInput:u=!0,documentTarget:c,...f}=o??{},l=c!==void 0?c:typeof document<"u"?document:null,v=et(null),P=et(null),g=et(0),p=et(f);p.current=f;let h=so(()=>io(p.current),[]);return oo(r,()=>({get video(){return v.current},get canvas(){return P.current},warp:h,get lastDrawTs(){return g.current}}),[h]),Sr(()=>{if(!i)return;let m=0,k=0,b=null,x=y=>{typeof y.requestVideoFrameCallback=="function"&&(b=y,k=y.requestVideoFrameCallback(function w(){h.frameArrived(),k=y.requestVideoFrameCallback(w)}))},S=y=>{m=requestAnimationFrame(S);let w=P.current,T=v.current?.element??null;if(!w||!T||(T!==b&&(b&&k&&b.cancelVideoFrameCallback?.(k),x(T)),T.readyState<2))return;h.tick(y);let I=typeof devicePixelRatio=="number"?devicePixelRatio:1,d=Math.max(1,Math.round(w.clientWidth*I)),E=Math.max(1,Math.round(w.clientHeight*I));(w.width!==d||w.height!==E)&&(w.width=d,w.height=E);let R=w.getContext("2d");if(!R)return;let U=h.transform(),O=T.videoWidth||d,z=T.videoHeight||E,_=Math.max(d/O,E/z)*(1+a)*U.scale;R.setTransform(_,0,0,_,d/2+U.translateX*d,E/2+U.translateY*E),R.drawImage(T,-O/2,-z/2),g.current=y};return m=requestAnimationFrame(S),()=>{cancelAnimationFrame(m),b&&k&&b.cancelVideoFrameCallback?.(k)}},[i,a,h]),Sr(()=>{if(!i||!u||!l)return;let m=()=>!!l.pointerLockElement,k=w=>{m()&&h.keyDown(w.key)},b=w=>h.keyUp(w.key),x=w=>{m()&&h.pointerDelta(w.movementX,w.movementY)},S=()=>{m()||h.clearKeys()},y=()=>h.clearKeys();return l.addEventListener("keydown",k),l.addEventListener("keyup",b),l.addEventListener("mousemove",x),l.addEventListener("pointerlockchange",S),l.defaultView?.addEventListener("blur",y),()=>{l.removeEventListener("keydown",k),l.removeEventListener("keyup",b),l.removeEventListener("mousemove",x),l.removeEventListener("pointerlockchange",S),l.defaultView?.removeEventListener("blur",y)}},[i,u,l,h]),i?co(Ue,{ref:v,...s,videoClassName:s.videoClassName,style:{...s.style},children:[vr("canvas",{ref:P,style:ao,"data-urun-warp":""}),n]}):vr(Ue,{ref:v,...s,children:n})});var yr=new Map;function lo(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);yr.set(e,{component:t,schema:r})}function kr(e,t){let r=yr.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 mo,jsx as tt}from"react/jsx-runtime";function po({name:e,props:t,fallback:r}){let o=kr(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?tt(mo,{children:r}):tt("div",{className:"urun-component-error",role:"alert",children:tt("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return tt(n,{...o.validatedProps})}import{z as Fe}from"zod";import{jsx as Ut,jsxs as br}from"react/jsx-runtime";var fo=Fe.object({step:Fe.number().min(0),total:Fe.number().min(1),label:Fe.string().optional(),variant:Fe.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 go(e){let{step:t,total:r,label:o,variant:n,percentage:s}=Rr(e);return br("div",{className:"urun-progress-card","data-variant":n,children:[o&&Ut("div",{className:"urun-progress-label",children:o}),Ut("div",{className:"urun-progress-bar",children:Ut("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),br("div",{className:"urun-progress-text",children:[t,"/",r]})]})}import{z as Mt}from"zod";import{jsx as Cr,jsxs as yo}from"react/jsx-runtime";var ho=Mt.object({state:Mt.enum(["thinking","generating","idle","error"]),message:Mt.string().optional()}),So={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Pr(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??So[t]??t;return{state:t,message:n,isActive:o}}function vo(e){let{state:t,message:r,isActive:o}=Pr(e);return yo("span",{className:"urun-status-badge","data-state":t,children:[Cr("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),Cr("span",{className:"urun-status-message",children:r})]})}import{useRef as Er,useEffect as ko}from"react";import{z as _t}from"zod";import{jsx as wr,jsxs as Co}from"react/jsx-runtime";var bo=_t.object({text:_t.string(),streaming:_t.boolean().default(!1)});function Tr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function Ro(e){let{text:t,streaming:r}=Tr(e),o=Er(null),n=Er(0);return ko(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),Co("div",{className:"urun-text-stream",children:[wr("span",{ref:o,className:"urun-text-content"}),r&&wr("span",{className:"urun-text-cursor"})]})}import{z as rt}from"zod";import{jsx as xr,jsxs as wo}from"react/jsx-runtime";var Po=rt.object({src:rt.string().url(),alt:rt.string().optional(),caption:rt.string().optional()});function Ar(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function Eo(e){let{src:t,alt:r,caption:o}=Ar(e);return wo("figure",{className:"urun-image-frame",children:[xr("img",{className:"urun-image",src:t,alt:r}),o&&xr("figcaption",{className:"urun-image-caption",children:o})]})}import{z as ge}from"zod";import{jsx as Nt,jsxs as Ao}from"react/jsx-runtime";var To=ge.object({metrics:ge.array(ge.object({label:ge.string(),value:ge.union([ge.string(),ge.number()]),unit:ge.string().optional()}))});function Ur(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function xo(e){let{metrics:t}=Ur(e);return Nt("div",{className:"urun-metrics-panel",children:t.map((r,o)=>Ao("div",{className:"urun-metric-card",children:[Nt("div",{className:"urun-metric-label",children:r.label}),Nt("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}import{forwardRef as Uo}from"react";import{jsx as _o}from"react/jsx-runtime";var Mo=Uo(function(t,r){let{stream:o="image",...n}=t;return _o(Ue,{ref:r,stream:o,...n})});import{forwardRef as Io,useCallback as Me,useEffect as It,useImperativeHandle as Lo,useRef as _e}from"react";import{observePageLifecycle as Oo}from"@urun-sh/core";var nt=null;function No(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function ot(){if(nt)return nt;let e=No();return e?(nt=new e,nt):null}function st(){let e=ot();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{jsx as Fo}from"react/jsx-runtime";var Do=1e3,Mr=200;function Lt(...e){console.debug("[audio]",...e)}var it=Io(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:f}=t,l=ce(),v=o??l,P=_e(null),g=_e(null),p=_e(null),h=_e(null),m=_e(u);m.current=u;let k=_e(c);k.current=c;let b=Me(d=>{p.current!==d&&(p.current=d,k.current?.(d))},[]),x=Me(()=>{if(typeof MediaStream>"u")return null;g.current||(g.current=new MediaStream);let d=P.current;return d&&d.srcObject!==g.current&&(d.srcObject=g.current),g.current},[]),S=Me(d=>{let E=P.current;if(!E)return;let R=E.play();!R||typeof R.then!="function"||R.then(()=>{E.muted||b(!0)}).catch(U=>{let O=U instanceof Error?U.name:String(U);if(O==="AbortError"){Lt(`play() aborted (${d}); retrying in ${Mr}ms`),h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{h.current=null,S(`${d}:retry`)},Mr);return}if(O==="NotAllowedError"){Lt(`play() blocked pending a user gesture (${d})`),b(!1);return}Lt(`play() failed (${d})`,U)})},[b]),y=Me(d=>{let E=x();if(E){for(let R of E.getAudioTracks())R!==d&&E.removeTrack(R);d&&!E.getAudioTracks().includes(d)&&E.addTrack(d),d&&S("track-attach"),m.current?.(d)}},[x,S]),w=Me(()=>{let d=P.current;d&&(x(),d.muted=!1,S("gesture"),st(),b(!0))},[x,S,b]);Lo(r,()=>({unlock:w,get unlocked(){return p.current===!0},get element(){return P.current}}),[w]);let T=Me(d=>{P.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),x()),f?.(d)},[x,f]),I=s!==void 0;return It(()=>{if(I){y(s??null);return}if(!v)return;let d=v.stream(n),E=()=>{let N=g.current;return N?N.getAudioTracks()[0]??null:null},R=N=>{if(N!==E()&&(y(N),N)){let _=()=>{E()===N&&y(null)};N.addEventListener("ended",_)}},U=d.track;U&&U.readyState==="live"&&R(U);let O=d.on("track",N=>{N&&N.readyState!=="live"||R(N)}),z=setInterval(()=>{let N=d.track;N&&N.readyState==="live"&&R(N)},Do);return()=>{O(),clearInterval(z)}},[v,n,I,s,y]),It(()=>Oo(()=>{st(),p.current===!0&&S("foreground")}),[S]),It(()=>()=>{h.current&&clearTimeout(h.current)},[]),Fo("audio",{ref:T,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),Vo=it;import{forwardRef as qo,useCallback as Ne,useEffect as _r,useImperativeHandle as Ho,useRef as de}from"react";import{observePageLifecycle as Wo,sessionFailureFromMediaError as Bo,sharedCaptureController as jo}from"@urun-sh/core";import{jsx as $o}from"react/jsx-runtime";var Nr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function at(...e){console.debug("[voice]",...e)}var ut=qo(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=Nr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:f,onError:l,onMicStream:v,onTrack:P,onUnlockChange:g,capture:p}=t,h=ce(),m=o??h,k=de(null),b=de(null),x=de(null),S=de([]),y=de(!1),w=de(f);w.current=f;let T=de(l);T.current=l;let I=de(v);I.current=v;let d=Ne(_=>{y.current!==_&&(y.current=_,w.current?.(_))},[]),E=Ne(()=>{for(let _ of S.current)_();S.current=[],x.current?.release(),x.current=null,b.current&&(b.current=null,I.current?.(null))},[]),R=Ne(async()=>{let _=x.current;if(_){let W=await _.update(i);return b.current=_.stream,I.current?.(_.stream),W}let B=await(p??jo()).claim("audio",i);x.current=B,S.current=[B.onTrack((W,G)=>{b.current=G,I.current?.(G),y.current&&m?.stream(n).attach(W).catch(ee=>at("mic re-attach after one-capture re-acquire failed",ee))}),B.onLost(W=>{x.current=null,S.current=[],b.current=null,I.current?.(null),d(!1),T.current?.(W)})],b.current=B.stream,I.current?.(B.stream);let q=B.track;if(!q)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return q},[p,i,m,n,d]),U=Ne(async()=>{E(),d(!1),await m?.stream(n).detach().catch(()=>{})},[m,n,E,d]),O=Ne(async()=>{if(!m)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");k.current?.unlock();let _;try{_=await R()}catch(q){E();let W=Bo(q,m.status);throw T.current?.(W),W}m.connect?.();let F;for(let q=1;q<=u;q++)try{await m.whenLive(a!==void 0?{timeout:a}:void 0),await m.stream(n).attach(_),d(!0);return}catch(W){F=W,at(`start attempt ${q}/${u} failed`,W),q<u&&await new Promise(G=>setTimeout(G,c))}E(),d(!1);let B=F instanceof Error?F:new Error(String(F??"voice start failed"));throw T.current?.(B),B},[m,n,a,u,c,R,E,d]);Ho(r,()=>({start:O,stop:U,unlock:()=>k.current?.unlock(),get active(){return y.current},get micStream(){return b.current},get audio(){return k.current}}),[O,U]);let z=de(!1),N=Ne(async()=>{if(!m||!y.current||z.current)return;let _=b.current?.getAudioTracks()[0]??null;if(_&&_.readyState==="live"){try{await m.stream(n).attach(_)}catch(F){at("foreground mic re-assert failed (will retry on next pass)",F)}return}z.current=!0;try{let F=await R();await m.stream(n).attach(F)}catch(F){let B=F instanceof Error?F:new Error(String(F));at("foreground mic re-acquire failed",B),T.current?.(B)}finally{z.current=!1}},[m,n,R]);return _r(()=>{let _=()=>{N()};return m&&typeof m.onRecovery=="function"?m.onRecovery(_):Wo(_)},[m,N]),_r(()=>E,[E]),s?$o(it,{ref:k,session:m,stream:n,onTrack:P,onUnlockChange:g}):null}),Ko=ut;import{forwardRef as Xo,useEffect as Go,useImperativeHandle as Yo,useRef as Ir,useState as Zo}from"react";import{useEffect as zo,useState as Jo}from"react";var Ot={level:0,speaking:!1};function Dt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=Jo(Ot);return zo(()=>{if(!e){i(Ot);return}let a=ot();if(!a||typeof MediaStream>"u")return;let u;e instanceof MediaStream?u=e:(u=new MediaStream,u.addTrack(e));let c,f;try{c=a.createMediaStreamSource(u),f=a.createAnalyser(),f.fftSize=r,c.connect(f)}catch{return}let l=new Uint8Array(f.fftSize),P=setInterval(()=>{f.getByteTimeDomainData(l);let g=0;for(let h=0;h<l.length;h++){let m=(l[h]-128)/128;g+=m*m}let p=Math.sqrt(g/l.length);i(h=>{let m=p>n;return Math.abs(h.level-p)<.005&&h.speaking===m?h:{level:p,speaking:m}})},o);return()=>{clearInterval(P),c.disconnect(),i(Ot)}},[e,r,o,n]),s}import{Fragment as rs,jsx as ct,jsxs as ns}from"react/jsx-runtime";var Qo={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},es={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},ts=Xo(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:u,onActiveChange:c,onError:f,onMicStream:l,capture:v}=t,P=ce(),g=o??P,p=Ir(null),[h,m]=Zo(null),k=Ir(l);k.current=l;let{level:b,speaking:x}=Dt(a?h:null);return Yo(r,()=>({start:()=>{let S=p.current;return S?S.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>p.current?.stop()??Promise.resolve(),get active(){return p.current?.active??!1},get micStream(){return p.current?.micStream??null}}),[]),Go(()=>{!i||!g||p.current?.start().catch(()=>{})},[i,g]),ns(rs,{children:[ct(ut,{ref:p,session:g,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...v!==void 0?{capture:v}:{},onActiveChange:c,onError:f,onMicStream:S=>{m(S),k.current?.(S)}}),a?ct("span",{className:u,style:Qo,"data-urun-mic":"","data-urun-mic-active":h?"true":"false","data-urun-mic-speaking":x?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(b*100)/100,children:ct("span",{style:es,children:ct("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(b*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});import{captureStillFromVideo as os,sessionFailureFromMediaError as ss,sharedCaptureController as is}from"@urun-sh/core";import{forwardRef as Or,useCallback as le,useEffect as Vt,useImperativeHandle as as,useRef as Q,useState as qe}from"react";import{jsx as he,jsxs as Lr}from"react/jsx-runtime";var Dr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Ft(...e){console.debug("[camera]",...e)}function us(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function cs(){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=Or(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:u,autoStart:c=!0,mirror:f="auto",connectTimeoutMs:l,visible:v=!1,className:P,videoClassName:g,onActiveChange:p,onError:h,onStream:m,onTrack:k,children:b,capture:x,flipControl:S="auto",flipControlClassName:y,onDevices:w}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let T=i?"user":a?"environment":u??"environment",I=ce(),d=o??I,E=Q(null),R=Q(null),U=Q(null),O=Q([]),z=Q(null),N=Q(!1),_=Q(!1),F=Q(T),[B,q]=qe(T),[W,G]=qe(!1),[ee,J]=qe(null),[H,X]=qe(!1),[K]=qe(us),Z=Q(p);Z.current=p;let $=Q(h);$.current=h;let C=Q(m);C.current=m;let L=Q(k);L.current=k;let M=Q(w);M.current=w;let j=le(D=>{N.current!==D&&(N.current=D,G(D),Z.current?.(D))},[]);Vt(()=>{if(!W){J(null);return}let D=!1,V=()=>{cs().then(ue=>{D||(J(ue),ue&&M.current?.(ue))})};V();let se=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof se?.addEventListener=="function"?(se.addEventListener("devicechange",V),()=>{D=!0,se.removeEventListener?.("devicechange",V)}):()=>{D=!0}},[W]);let re=le(D=>{let V=E.current;V&&(V.muted=!0,V.defaultMuted=!0,V.setAttribute("muted",""),V.setAttribute("playsinline",""),V.setAttribute("webkit-playsinline",""),V.srcObject=D,D&&V.play()?.catch?.(se=>Ft("preview play() failed",se)))},[]),Y=le(()=>{_.current=!1,z.current?.(),z.current=null;for(let D of O.current)D();O.current=[],U.current?.release(),U.current=null,R.current&&(R.current=null,C.current?.(null),L.current?.(null)),re(null)},[re]),A=le((D,V)=>{z.current?.(),R.current=V,re(V),C.current?.(V);let se=()=>{R.current===V&&(Ft("camera track ended (device removed or permission revoked)"),Y(),j(!1))};D.addEventListener("ended",se),z.current=()=>D.removeEventListener("ended",se)},[re,Y,j]),te=le(async D=>{let V=n!==!1;if(V&&!d)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let se={...Dr,...s,facingMode:D},ue;try{let pe=U.current;if(pe)ue=await pe.update(se);else{let Le=await(x??is()).claim("video",se);if(U.current=Le,O.current=[Le.onTrack((Oe,en)=>{A(Oe,en),N.current&&(!V||!d||d.stream(n).attachVideo(Oe).then(()=>L.current?.(Oe)).catch(tn=>Ft("camera re-publish after one-capture re-acquire failed",tn)))}),Le.onLost(Oe=>{U.current=null,O.current=[],Y(),j(!1),$.current?.(Oe)})],!Le.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});ue=Le.track}}catch(pe){let Ee=ss(pe,d?.status);throw $.current?.(Ee),Ee}F.current=D,q(D),A(ue,U.current?.stream??new MediaStream([ue]));try{V&&d&&(d.connect?.(),await d.whenLive(l!==void 0?{timeout:l}:void 0),await d.stream(n).attachVideo(ue)),_.current=V?n:!1}catch(pe){Y(),j(!1);let Ee=pe instanceof Error?pe:new Error(String(pe));throw $.current?.(Ee),Ee}L.current?.(ue),j(!0)},[d,n,s,l,x,A,Y,j]),ve=le(D=>te(D?.facingMode??F.current),[te]),ne=le(async D=>{let V=_.current===n;N.current&&F.current===D&&V||await te(D)},[te,n]),oe=le(()=>te(F.current==="environment"?"user":"environment"),[te]),Pe=le(async()=>{Y(),j(!1),n!==!1&&await d?.stream(n).detachVideo().catch(()=>{})},[d,n,Y,j]),Ie=le(async D=>{let V=E.current;if(!V)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await os(V,D)},[]);as(r,()=>({start:ve,stop:Pe,flip:oe,setFacingMode:ne,capturePhoto:Ie,get active(){return N.current},get facingMode(){return F.current},get stream(){return R.current},get element(){return E.current}}),[ve,Pe,oe,ne,Ie]);let gt=Q(ne);if(gt.current=ne,Vt(()=>{c&&(n!==!1&&!d||gt.current(T).catch(()=>{}))},[c,d,T,n]),Vt(()=>Y,[Y]),!v)return null;let ht=f==="auto"?B==="user":f,ze=W&&(S===!0||S==="auto"&&K&&(ee?.length??0)>1),Qr=()=>{H||(X(!0),oe().catch(()=>{}).finally(()=>X(!1)))};return Lr("div",{className:P,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":B,children:[he("video",{ref:E,className:g,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...ht?{transform:"scaleX(-1)"}:{}}}),ze?he("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Qr,disabled:H,className:y,style:y?{opacity:H?.6:void 0}:{position:"absolute",right:16,bottom:"calc(env(safe-area-inset-bottom, 0px) + 16px)",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",width:44,height:44,borderRadius:9999,border:"1px solid rgba(255,255,255,0.25)",background:"rgba(0,0,0,0.5)",color:"#fff",cursor:"pointer",opacity:H?.6:1},children:Lr("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:[he("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),he("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),he("path",{d:"M14.5 10.5v1.6h-1.6"}),he("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),he("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,b]})}),ls=Or(function({preview:t=!0,...r},o){return he(Vr,{ref:o,...r,visible:t,autoStart:!1})});import{cameraCaptureAvailable as ds,normalizeReferenceImage as ps,referenceImageErrorMessage as ms}from"@urun-sh/core";import{useCallback as He,useEffect as fs,useRef as qt,useState as We}from"react";function gs(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=We(null),[a,u]=We(null),[c,f]=We(!1),[l,v]=We(null),[P]=We(ds),g=qt(n);g.current=n;let p=qt(null),h=qt(0),m=He(y=>{p.current&&URL.revokeObjectURL(p.current),p.current=y?URL.createObjectURL(new Blob([y.bytes],{type:y.type})):null,u(p.current),i(y),g.current?.(y)},[]);fs(()=>()=>{h.current++,p.current&&URL.revokeObjectURL(p.current),p.current=null},[]);let k=He(async y=>{let w=++h.current;f(!0),v(null);try{let T=await y();if(h.current!==w)return;m(T)}catch(T){if(h.current!==w)return;v(ms(T))}finally{h.current===w&&f(!1)}},[m]),b=He(y=>k(()=>ps(y,{maxSize:t,type:r,quality:o,source:"file"})),[k,t,r,o]),x=He(y=>k(()=>y.capturePhoto({maxSize:t,type:r,quality:o})),[k,t,r,o]),S=He(()=>{h.current++,v(null),f(!1),m(null)},[m]);return{reference:s,previewUrl:a,pick:b,capture:x,clear:S,busy:c,error:l,cameraAvailable:P}}import{useEffect as hs,useState as Ss}from"react";function vs(e,t){let[r,o]=Ss(null);return hs(()=>{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 Ps}from"react";import{useEffect as Rs,useMemo as Cs}from"react";import{createStore as ys}from"zustand/vanilla";import{useStore as ks}from"zustand";var bs=()=>{};function Ht(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=ys(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let c of s)c();s=null}},a=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",c=>n.setState({doc:c})),e.onSynced(()=>n.setState({synced:!0}))]),i):bs,u=(c=>ks(n,c));return Object.assign(u,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),u}function Be(e,t){let r=Cs(()=>Ht(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return Rs(()=>r.bind(),[r]),r}function Es(e,t,r){let n=Be(e,t)(r??(a=>a)),s=Ps(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 ws,useState as Ts}from"react";var be=200;function Se(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function je(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Wt(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 Bt(e,t,r={}){let o=r.cap??200,[n,s]=Ts([]);return ws(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let u=await a.next();if(!i||u.done)break;s(c=>Se(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}import{jsx as lt,jsxs as Ke}from"react/jsx-runtime";function xs({session:e,name:t,cap:r,className:o}){let n=Bt(e,t,{cap:r});return Ke("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[Ke("div",{className:"urun-stream-tail-meta",children:[lt("code",{children:t}),Ke("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),lt("div",{className:"urun-stream-tail-log",children:n.length===0?Ke("span",{className:"urun-stream-tail-empty",children:["Waiting for ",lt("code",{children:t})," messages\u2026"]}):n.map((s,i)=>Ke("div",{className:"urun-stream-tail-line",children:[lt("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",je(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as As,useState as Fr}from"react";import{jsx as Re,jsxs as dt}from"react/jsx-runtime";function pt({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=Fr(""),[i,a]=Fr(null),u=As(()=>{let c=Wt(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return dt("div",{className:"urun-doc-patch",children:[Re("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),dt("div",{className:"urun-doc-patch-actions",children:[Re("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?Re("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Us({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=Be(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return dt("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[dt("div",{className:"urun-doc-panel-meta",children:[Re("code",{children:t}),Re("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),Re("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?Re(pt,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}import{useEffect as Ms,useState as _s}from"react";import{jsx as $e,jsxs as Hr}from"react/jsx-runtime";function qr(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function Ns({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=_s([]);return Ms(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>Se(u,{at:Date.now(),direction:"in",text:qr(je(a))},r))}):void 0),[e,t,r]),Hr("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[$e(pt,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>Se(u,{at:Date.now(),direction:"out",text:qr(a)},r))}}),$e("div",{className:"urun-control-sender-log",children:n.length===0?$e("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>Hr("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[$e("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",$e("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}import{useEffect as Is,useState as Ls}from"react";import{jsx as mt,jsxs as Ds}from"react/jsx-runtime";function Os({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=Ls([]),a=t.join(","),u=r.join(",");return Is(()=>{if(i([]),!e)return;let c=(l,v)=>i(P=>Se(P,{at:Date.now(),kind:l,text:v},o)),f=[];f.push(e.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of t){let v=e.stream(l);f.push(v.on("track",P=>c("track",`${l}: ${P?"track arrived":"track ended"}`)))}for(let l of r){let v=e.doc(l);f.push(v.on("change",()=>c("doc",`${l} changed`)))}return()=>f.forEach(l=>l())},[e,a,u,o]),mt("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?mt("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,f)=>Ds("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[mt("span",{className:"urun-event-spine-kind",children:c.kind})," ",mt("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${f}`))})}import{describeSessionPhase as Zs,isWakingPhase as Qs}from"@urun-sh/core";import{useEffect as Vs,useState as Fs}from"react";function ae(e){let[t,r]=Fs(e?.phase??null);return Vs(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}import{describeSessionPhase as js}from"@urun-sh/core";import{useEffect as qs,useRef as Hs,useState as Ws}from"react";import{isWakingPhase as Bs}from"@urun-sh/core";function jt(e){let t=ae(e),r=Bs(t?.name),o=Hs(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]=Ws(s);return qs(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let u=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(u)},[n]),{waking:r,phase:t,state:r?t?.runtime?.state:void 0,reason:r?t?.runtime?.reason:void 0,since:n,seconds:r?i:0}}import{Fragment as Ks,jsx as Wr,jsxs as Br}from"react/jsx-runtime";function Kt({session:e,render:t,className:r}){let o=jt(e);return!o.waking||!o.phase?null:Wr("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):Br(Ks,{children:[Wr("span",{className:"urun-session-waking-label",children:js(o.phase)})," ",Br("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}import{useEffect as Js,useState as Xs}from"react";import{useEffect as jr,useRef as $s,useState as Kr}from"react";var zs={event:null,elapsedMs:0};function $t(e,t){let[r,o]=Kr(null),n=$s(0);jr(()=>{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]=Kr(0);return jr(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,u=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(u());let c=setInterval(()=>i(u()),1e3);return()=>clearInterval(c)},[r]),r?{event:r,elapsedMs:s}:zs}import{jsx as $r,jsxs as zr}from"react/jsx-runtime";var 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 Ys(e){let[t,r]=Xs(!1);return Js(()=>{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 zt({session:e,stream:t,videoElement:r,render:o,className:n}){let s=$t(e,t),i=Ys(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return $r("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):zr("div",{className:"urun-activation-overlay-card",children:[$r("span",{className:"urun-activation-overlay-copy",children:a.hint??Gs[u]})," ",zr("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}import{jsx as Ce,jsxs as Jt}from"react/jsx-runtime";var ei={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function ti({session:e,className:t}){let r=ae(e),o=r?.name??"idle",n=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return Jt("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[Ce("span",{className:"urun-session-status-dot","data-phase":o}),Ce("span",{className:"urun-session-status-label",children:ei[o]}),n?Ce("span",{className:"urun-session-status-detail",children:n}):null]})}function ri({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=ae(e);if(s?.name==="live")return Jt("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,Ce(zt,{session:e})]});let i=r?r(s):Ce("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&Qs(s.name)?Ce(Kt,{session:e}):s&&s.name!=="idle"?Zs(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return Jt("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?Ce("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}import{useEffect as ni,useState as oi}from"react";import{jsx as ai}from"react/jsx-runtime";function Jr(e){return ae(e)?.endsAt??null}function si(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 ii({session:e,urgentMs:t=6e4,className:r}){let n=Jr(e)?.getTime()??null,[s,i]=oi(()=>n===null?null:Math.max(0,n-Date.now()));if(ni(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),s===null)return null;let a=si(s);return ai("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<t?"":void 0,"data-expired":s<=0?"":void 0,children:a})}import{jsx as Xr,jsxs as li}from"react/jsx-runtime";var ui=new Set(["expired","ended","error"]);function ci({session:e,onNewSession:t,children:r,className:o}){let n=ae(e);if(!n||!ui.has(n.name))return null;let s=r?r(n):Xr("span",{className:"urun-session-ended-copy",children:n.name==="expired"?"Session ended \u2014 start a new session":n.name==="error"?`Session failed${n.error?.reason?` \u2014 ${n.error.reason}`:""}.`:"Session ended."});return li("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?Xr("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}import{useEffect as Gr,useMemo as di,useState as Yr}from"react";import{jsx as ft,jsxs as fi}from"react/jsx-runtime";function Xt(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 Zr(e){let t=di(()=>e?e.doc("control"):null,[e]),[r,o]=Yr(()=>t?Xt(t.get("idle")):null);return Gr(()=>{if(!t){o(null);return}return o(Xt(t.get("idle"))),t.on("change",()=>o(Xt(t.get("idle"))))},[t]),r}function pi(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function mi({session:e,onStillHere:t,className:r}){let o=Zr(e),n=o?.deadlineEpochS??null,[s,i]=Yr(null);if(Gr(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()/1e3));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return ft("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:fi("div",{className:"urun-idle-warning-card",children:[ft("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),ft("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${pi(s)} due to inactivity.`:"This session will end soon due to inactivity."}),ft("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}import{useContext as gi,useEffect as hi,useState as Si}from"react";import{prewake as vi}from"@urun-sh/core";function yi(e){let t=gi(we),[r,o]=Si(null),n=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,u=t?.orgId,c=t?.jwt,f=t?.getAccessToken,l=t?.authProvider;return hi(()=>{if(!a||!u||!n||!s)return;let v=!1,P=()=>{vi({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:f,authProvider:l}).then(p=>{v||o(p)}).catch(()=>{})};P();let g=setInterval(P,Math.max(1,i)*1e3);return()=>{v=!0,clearInterval(g)}},[n,s,i,a,u,c,f,l]),r}import{describeSessionPhase as Al,isWakingPhase as Ul}from"@urun-sh/core";export{it as Audio,Vr as Camera,po as ComponentRenderer,Dr as DEFAULT_CAMERA_CONSTRAINTS,be as DEFAULT_LOG_CAP,Nr as DEFAULT_VOICE_CONSTRAINTS,pt as DocPatchForm,Mo as Image,Eo as ImageFrame,Po as ImageFrameSchema,xo as MetricsPanel,To as MetricsPanelSchema,ts as Mic,pn as OPERATOR_CHORD_LABEL,dn as OPERATOR_TOKEN_STORAGE_KEY,go as ProgressCard,fo as ProgressCardSchema,uo as ReprojectedVideo,Xn as Session,vo as StatusBadge,ho as StatusBadgeSchema,Ro as TextStream,bo as TextStreamSchema,zt as UrunActivationOverlay,Vo as UrunAudio,rn as UrunAuthProvider,ls as UrunCamera,Ns as UrunControlSender,Us as UrunDocPanel,De as UrunErrorBoundary,Os as UrunEventSpine,mi as UrunIdleWarning,nn as UrunJwtProvider,Rn as UrunProvider,ii as UrunSessionClock,ci as UrunSessionEnded,ri as UrunSessionGate,ti as UrunSessionStatus,Kt as UrunSessionWaking,xs as UrunStreamTail,Ko as UrunVoice,Ue as Video,ut as Voice,Je as authMode,Ht as createDocStore,Al as describeSessionPhase,je as formatPayload,ot as getUrunAudioContext,Ul as isWakingPhase,Wt as parseJsonObject,Se as pushCapped,er as readOperatorToken,lo as registerComponent,st as resumeUrunAudioContext,me as urunPublicEnv,$t as useActivation,Un as useApp,Wn as useChat,Vn as useCompletion,yt as useConfirmOnLeave,Be as useDocStore,Ar as useImageFrame,zn as useInputPresence,Ur as useMetricsPanel,vt as useOperatorOverride,Rr as useProgressCard,gs as useReferenceImage,In as useRequest,Gn as useSession,Es as useSessionDoc,Jr as useSessionEndsAt,Zr as useSessionIdle,ae as useSessionPhase,vs as useSessionTrack,jt as useSessionWake,Pr as useStatusBadge,Bt as useStreamMessages,Tr as useTextStream,Dt as useUrunAudioLevel,St as useUrunAuth,yi as useUrunPrewake,un as usesWorkOSAuth};
2
+ import{a as nn,b as on,c as St}from"./chunk-WF2OBDSX.mjs";import{useCallback as hn,useEffect as vn,useMemo as yn,useRef as rr,useState as yt}from"react";import{Component as sn}from"react";import{jsx as Yt,jsxs as an}from"react/jsx-runtime";var Ve=class extends sn{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:[Yt("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),Yt("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as un}from"react";var we=un(null);function ke(e){return e&&e.trim()?e.trim():void 0}function fe(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return ke(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return ke(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return ke(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return ke(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return ke(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return ke(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return ke(typeof process<"u"?process.env?.[e]:void 0)}}function Ge(){let e=fe("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||fe("VERCEL_ENV")==="production"?"workos":fe("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function cn(){return Ge()==="workos"}import{useEffect as ln,useRef as dn}from"react";var pn="urun.operator_token",Qt=null,Zt="op",mn="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function er(){return typeof window<"u"}function tr(){return Qt}function fn(){if(!er())return null;let e=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash;if(!e)return null;let t=new URLSearchParams(e),r=t.get(Zt);if(!r)return null;Qt=r,t.delete(Zt);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function gn(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function ht(e){let t=dn(e);t.current=e,ln(()=>{if(!er())return;fn();let r=o=>{if(!gn(o))return;let n=tr();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}import{useEffect as Sn}from"react";function vt(e=!0){Sn(()=>{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 Fe,jsxs as En}from"react/jsx-runtime";var kn="/api/urun-token",bn=1e4;function Rn(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 nr(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 Cn(e,t){return typeof e=="function"?e(t):e!==void 0?e:En("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:[Fe("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),Fe("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function Pn({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,confirmOnLeave:g=!1,fallback:l,errorFallback:v,children:C}){let S=n===void 0&&t===void 0;if(!S&&(typeof t!="string"||t.trim().length===0))throw new Error("[urun] <UrunProvider> requires a non-empty orgId \u2014 set your org id deployment env var (e.g. NEXT_PUBLIC_SESSION_TENANT_ID) and pass it through the provider (or pass NEITHER orgId NOR jwt to let the provider mint from its tokenEndpoint).");if(!S&&(typeof e!="string"||e.trim().length===0))throw new Error("[urun] <UrunProvider> requires baseUrl when orgId/jwt are passed explicitly (self-mint mode reads it from the token endpoint instead).");let p=r??o;if(S&&(typeof p!="string"||p.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);vt(g);let[m,f]=yt(),[P,R]=yt(null),x=rr(void 0),h=rr(null),[y,w]=yt(null);ht(L=>w({jwt:L}));let T=St(),I=fe("NEXT_PUBLIC_SESSION_TOKEN")??fe("NEXT_PUBLIC_URUN_JWT"),d=Ge(),k=y!==null,b=d==="workos"&&!n&&!k&&!S,M=n??(d==="jwt"?I:void 0)??m?.token,q=k?y.jwt:M,K=s??fe("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),N=b&&!q&&!T?.getAccessToken,_=t??m?.orgId,O=e??m?.gatewayUrl,j=S&&m===void 0,B=S&&m!==void 0&&!O?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,H=P??B,$=u??kn,Z=hn(async L=>{if(!L?.forceRefresh){let z=x.current;if(!z)return z;let ye=Rn(z);if(ye===null||ye-Date.now()>bn)return z}return(await(h.current??(h.current=(async()=>{try{let z=await nr($);return x.current=z.token,f(z),z}finally{h.current=null}})()))).token},[$]),G=yn(()=>({appId:p,baseUrl:O??"",orgId:_??"",jwt:q,getAccessToken:b?T?.getAccessToken:S&&!k?Z:void 0,authProvider:K,eventsUrl:i,sessionKey:a,releaseOnLeave:c,priority:k?"preempt":void 0}),[p,T,O,K,q,i,_,a,c,b,k,S,Z]);return vn(()=>{if(!S)return;let L=new AbortController;return R(null),(async()=>{try{let W=await nr($,L.signal);x.current=W.token,f(W)}catch(W){if(L.signal.aborted)return;R(W instanceof Error?W:new Error(String(W)))}})(),()=>L.abort()},[S,$]),Fe(Ve,{fallback:l,children:H?Cn(v,H):N||j?Fe("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Fe(we.Provider,{value:G,children:C})})}import{useContext as Tn,useEffect as wn,useMemo as or,useReducer as xn,useRef as kt}from"react";import{App as An}from"@urun-sh/core";function Un(e,t){return`${e}:${JSON.stringify(t??{})}`}function Mn(e,t,r){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,fnName:t,args:r??{}})}var be=new Map;var bt=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},Rt=class{constructor(t,r){this._stream=t;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(t){return this._stream.attach(t)}attachVideo(t){return this._stream.attachVideo(t)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(t){return this._stream.seek(t)}chunks(t){return this._stream.chunks(t)}onSeeked(t){return this._stream.onSeeked(t)}on(t,r){return this._stream.on(t,r)}messages(){return this._stream.messages()}emit(t,r){return this._stream.emit(t,r)}dispose(){this._unsubscribeTrack()}},Ct=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||a.name==="expired"){let u=a.error,c=u?.reason??(a.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else a.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),i=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{i(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new bt(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new Rt(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function _n(){let e=Tn(we);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=xn(i=>i+1,0),r=kt(new Map),o=kt(new Map),n=kt(null),s=or(()=>An(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority]);return wn(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=be.get(a);c===u&&o.current.get(a)===u&&(c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null),c.handle.addNotifier(t),c.refCount+=1)}}return()=>{let a=new Map;for(let[u,c]of o.current){let g=be.get(u);g===c&&(g.handle.removeNotifier(t),g.refCount=Math.max(0,g.refCount-1),a.set(u,g),g.refCount===0&&(g.disposeTimer=setTimeout(()=>{let l=be.get(u);!l||l.refCount!==0||(be.delete(u),l.handle.disconnect())},0)))}n.current=a}},[]),or(()=>{let i=new Map;return new Proxy({},{get(a,u){if(typeof u!="string")return;let c=i.get(u);if(c)return c;let g=l=>{let v=Un(u,l),C=r.current.get(v);if(C&&!C.disposed)return C;let S=Mn(e,u,l),p=be.get(S);return p?.handle.disposed&&(p.disposeTimer&&clearTimeout(p.disposeTimer),be.delete(S),o.current.get(S)===p&&o.current.delete(S),p=void 0),p?p.disposeTimer&&(clearTimeout(p.disposeTimer),p.disposeTimer=null):(p={handle:new Ct(s[u](l),t,e.eventsUrl),refCount:0,disposeTimer:null},be.set(S,p)),o.current.get(S)!==p&&(o.current.set(S,p),p.handle.addNotifier(t),p.refCount+=1),r.current.set(v,p.handle),p.handle};return i.set(u,g),g}})},[e,s])}import{useCallback as Pt,useEffect as Nn,useMemo as In,useRef as Ye,useState as Et}from"react";function xe(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 Ln(e){return e instanceof Error?e:new Error(String(e))}function On(e,t){let r=In(()=>xe(e),[e]),[o,n]=Et(void 0),[s,i]=Et(null),[a,u]=Et(!1),c=Ye(t);c.current=t;let g=Ye(0),l=Ye(null),v=Ye(!0);Nn(()=>(v.current=!0,()=>{v.current=!1,l.current?.abort()}),[]);let C=Pt(async m=>{l.current?.abort();let f=new AbortController;l.current=f;let P=++g.current,R=()=>v.current&&g.current===P;R()&&(u(!0),i(null));try{let x=await r.request(m,{...c.current,signal:f.signal});return R()&&(n(x),u(!1),c.current?.onSuccess?.(x)),x}catch(x){let h=Ln(x);throw R()&&(i(h),u(!1),c.current?.onError?.(h)),h}},[r]),S=Pt(m=>{C(m).catch(()=>{})},[C]),p=Pt(()=>{g.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:S,mutateAsync:C,data:o,error:s,isPending:a,reset:p}}import{useCallback as sr,useEffect as Dn,useMemo as Vn,useRef as Ze,useState as Tt}from"react";function ir(e){return e instanceof Error?e:new Error(String(e))}var Fn=e=>typeof e=="string"?e:String(e);function qn(e,t){let r=Vn(()=>xe(e),[e]),[o,n]=Tt(""),[s,i]=Tt(!1),[a,u]=Tt(null),c=Ze(t);c.current=t;let g=Ze(0),l=Ze(null),v=Ze(!0);Dn(()=>(v.current=!0,()=>{v.current=!1,l.current?.cancel(),l.current=null}),[]);let C=sr(()=>{g.current++,l.current?.cancel(),l.current=null,v.current&&i(!1)},[]),S=sr(async p=>{l.current?.cancel();let m=++g.current,f=()=>v.current&&g.current===m,P=c.current,R=P?.parseChunk??Fn,x=P?.buildPayload??(b=>({prompt:b}));f()&&(n(""),u(null),i(!0));let{parseChunk:h,buildPayload:y,onFinish:w,onError:T,...I}=P??{},d="",k;try{k=r.requestStream(x(p),I),l.current=k}catch(b){let M=ir(b);f()&&(u(M),i(!1),P?.onError?.(M));return}try{for await(let b of k){if(g.current!==m)break;d+=R(b),f()&&n(d)}f()&&(i(!1),P?.onFinish?.(d))}catch(b){let M=ir(b);f()&&(u(M),i(!1),P?.onError?.(M))}finally{l.current===k&&(l.current=null)}},[r]);return{completion:o,complete:S,stop:C,isStreaming:s,error:a}}import{useCallback as ar,useEffect as Hn,useMemo as Wn,useRef as Ae,useState as Qe}from"react";function ur(e){return e instanceof Error?e:new Error(String(e))}var Bn=e=>typeof e=="string"?e:String(e),cr=0;function wt(e){return cr+=1,`${e}-${cr}`}function jn(e,t){let r=Wn(()=>xe(e),[e]),[o,n]=Qe(()=>(t?.initialMessages??[]).map(R=>({id:R.id??wt("msg"),role:R.role,content:R.content}))),[s,i]=Qe(""),[a,u]=Qe(!1),[c,g]=Qe(null),l=Ae(t);l.current=t;let v=Ae(o);v.current=o;let C=Ae(s);C.current=s;let S=Ae(0),p=Ae(null),m=Ae(!0);Hn(()=>(m.current=!0,()=>{m.current=!1,p.current?.cancel(),p.current=null}),[]);let f=ar(()=>{S.current++,p.current?.cancel(),p.current=null,m.current&&u(!1)},[]),P=ar(async R=>{let x=R===void 0,h=(x?C.current:R)??"";if(!h.trim())return;p.current?.cancel();let w=++S.current,T=()=>m.current&&S.current===w,I=l.current,d=I?.parseChunk??Bn,k={id:wt("msg"),role:"user",content:h},b={id:wt("msg"),role:"assistant",content:""},M=[...v.current,k].map(L=>({role:L.role,content:L.content})),q=[...v.current,k,b];v.current=q,n(q),x&&i(""),g(null),u(!0);let K=I?.buildPayload??(L=>({messages:L})),{initialMessages:N,parseChunk:_,buildPayload:O,onFinish:j,onError:B,...H}=I??{},$=L=>{n(W=>W.map(z=>z.id===b.id?{...z,content:L}:z))},Z="",G;try{G=r.requestStream(K(M),H),p.current=G}catch(L){let W=ur(L);T()&&(g(W),u(!1),I?.onError?.(W));return}try{for await(let L of G){if(S.current!==w)break;Z+=d(L),T()&&$(Z)}T()&&(u(!1),I?.onFinish?.({...b,content:Z}))}catch(L){let W=ur(L);T()&&(g(W),u(!1),I?.onError?.(W))}finally{p.current===G&&(p.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:P,stop:f,isStreaming:a,error:c}}import{useCallback as ge,useEffect as lr,useMemo as Kn,useRef as dr,useState as pr}from"react";import{createInputPresencePublisher as $n,INPUT_PRESENCE_DEFAULT_HZ as zn,INPUT_PRESENCE_FIELD as Jn}from"@urun-sh/core";var xt=[];function Xn(e,t={}){let{field:r=Jn,hz:o=zn}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=Kn(()=>s?$n({awareness:{setLocalStateField:(h,y)=>s.setField(h,y)},field:r,hz:o}):null,[s,r,o]),a=dr(null);a.current=i;let[u,c]=pr(!1),[g,l]=pr(xt),v=dr(!1);lr(()=>{if(i)return()=>i.dispose()},[i]);let C=ge(()=>{let h=a.current;l(h?h.heldKeys():xt)},[]),S=ge(()=>{a.current?.clear(),l(xt)},[]);lr(()=>{if(!n)return;let h=()=>!!n.pointerLockElement,y=()=>{if(h()){v.current=!1,c(!0);return}v.current||(c(!1),S())},w=b=>{h()&&(a.current?.keyDown(b.key),C())},T=b=>{a.current?.keyUp(b.key),C()},I=b=>{h()&&a.current?.movePointer(b.movementX,b.movementY)},d=b=>{h()&&a.current?.setButtons(b.buttons)},k=()=>{S()};return n.addEventListener("pointerlockchange",y),n.addEventListener("keydown",w),n.addEventListener("keyup",T),n.addEventListener("mousemove",I),n.addEventListener("mousedown",d),n.addEventListener("mouseup",d),n.defaultView?.addEventListener("blur",k),()=>{n.removeEventListener("pointerlockchange",y),n.removeEventListener("keydown",w),n.removeEventListener("keyup",T),n.removeEventListener("mousemove",I),n.removeEventListener("mousedown",d),n.removeEventListener("mouseup",d),n.defaultView?.removeEventListener("blur",k)}},[n,S,C]);let p=ge(h=>{h.requestPointerLock?.()},[]),m=ge(()=>{v.current=!0,c(!0)},[]),f=ge(()=>{v.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),S()},[n,S]),P=ge(h=>{a.current?.keyDown(h),C()},[C]),R=ge(h=>{a.current?.keyUp(h),C()},[C]),x=ge((h,y)=>{a.current?.movePointer(h,y)},[]);return{engage:p,engageTouch:m,release:f,engaged:u,heldKeys:g,pressKey:P,releaseKey:R,movePointer:x}}import{forwardRef as io,useEffect as yr,useImperativeHandle as ao,useMemo as uo,useRef as et}from"react";import{createCameraWarp as co}from"@urun-sh/core";import{forwardRef as eo,useCallback as Ue,useEffect as qe,useImperativeHandle as to,useRef as re,useState as fr}from"react";import{derivedLegRole as ro}from"@urun-sh/core";import{createContext as Gn,useContext as mr}from"react";import{jsx as Qn}from"react/jsx-runtime";var At=Gn(null);function Yn({session:e,children:t}){return Qn(At.Provider,{value:e,children:t})}function ae(){return mr(At)}function Zn(){let e=mr(At);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 vr,jsxs as so}from"react/jsx-runtime";function no(e,t){return e-t>>>0<2147483648}var gr=1e3;function oo(...e){console.debug("[video]",...e)}function Sr(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(u=>u.on("track",()=>i(n())));return()=>{for(let u of a)u()}}}}function hr(e,t,r){return r?[r,t]:[e,t]}var Me=eo(function(t,r){let{session:o,stream:n="video",audioStream:s="audio",track:i,muted:a=!0,mirror:u=!1,objectFit:c="contain",className:g,style:l,videoClassName:v,placeholder:C,poster:S,children:p,onTrack:m,onFirstFrame:f,frameMarker:P,onFrameMarkerReached:R,onFrameMarkerUnsupported:x}=t,h=ae(),y=o??h,w=re(null),T=re(null),[I,d]=fr(!1),[k,b]=fr(!1),M=re(!1),q=re(m);q.current=m;let K=re(f);K.current=f;let N=re(R);N.current=R;let _=re(x);_.current=x;let O=re(P??null);O.current=P??null;let j=re(null),B=re(null),H=Ue((E,F=!1)=>{if(!F&&E===j.current||(j.current=E,B.current?.(),B.current=null,M.current=!1,b(!1),!E))return;let A=w.current;if(!A)return;let J=O.current,X=J?.rtpTimestamp??null,oe=!1,U=()=>{oe||(oe=!0,_.current?.())};J&&X==null&&U();let ce=J!=null&&X!=null,le=se=>{B.current?.(),B.current=null,M.current=!0,b(!0),K.current?.(),se&&N.current?.()};if(typeof A.requestVideoFrameCallback=="function"){let se=!1,Ee=0,Le=(Gt,gt)=>{if(!se){if(ce){let Xe=gt?.rtpTimestamp;if(typeof Xe!="number"){U(),le(!1);return}if(!no(Xe,X)){Ee=A.requestVideoFrameCallback(Le);return}le(!0);return}le(!1)}};Ee=A.requestVideoFrameCallback(Le),B.current=()=>{se=!0,A.cancelVideoFrameCallback?.(Ee)};return}ce&&U();let ee=()=>{let se=A.getVideoPlaybackQuality?.();(se?se.totalVideoFrames>0:A.readyState>=2&&A.videoWidth>0)&&le(!1)};A.addEventListener("loadeddata",ee),A.addEventListener("timeupdate",ee),A.addEventListener("playing",ee),B.current=()=>{A.removeEventListener("loadeddata",ee),A.removeEventListener("timeupdate",ee),A.removeEventListener("playing",ee)},ee()},[]);qe(()=>()=>{B.current?.(),B.current=null},[]);let $=P==null?null:`${P.rtpTimestamp??""}|${P.ptsMs??""}`,Z=re($);qe(()=>{if(Z.current===$||(Z.current=$,$==null))return;let E=j.current;E&&H(E,!0)},[$,H]);let G=Ue(()=>{if(typeof MediaStream>"u")return null;T.current||(T.current=new MediaStream);let E=w.current;return E&&E.srcObject!==T.current&&(E.srcObject=T.current),T.current},[]),L=Ue(E=>{let F=w.current;if(!F)return;let A=F.play();!A||typeof A.catch!="function"||A.catch(J=>oo(`play() failed (${E})`,J))},[]),W=Ue(E=>{let F=G();if(F){for(let A of F.getVideoTracks())A!==E&&F.removeTrack(A);if(E&&!F.getVideoTracks().includes(E)){F.addTrack(E);let A=w.current;A&&(A.srcObject=F)}E&&L("track-attach"),d(E!==null),H(E),q.current?.(E)}},[G,L,H]),z=Ue(E=>{let F=G();if(F){for(let A of F.getAudioTracks())A!==E&&F.removeTrack(A);E&&!F.getAudioTracks().includes(E)&&F.addTrack(E),E&&L("audio-attach")}},[G,L]),ye=Ue(E=>{w.current=E,E&&(a&&(E.muted=!0,E.defaultMuted=!0,E.setAttribute("muted","")),E.setAttribute("playsinline",""),E.setAttribute("webkit-playsinline",""),G())},[G,a]);to(r,()=>({get element(){return w.current},get live(){return T.current?T.current.getVideoTracks().length>0:!1},get framed(){return M.current}}),[]);let Q=ro(n)!==void 0;qe(()=>{Q&&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.`)},[Q,n]);let pe=i!==void 0;return qe(()=>{if(pe){W(i??null);return}if(Q){W(null);return}if(!y)return;let E=Sr(y,hr(n,"video")),F=()=>{let U=T.current;return U?U.getVideoTracks()[0]??null:null},A=U=>{if(U!==F()&&(W(U),U)){let ce=()=>{F()===U&&W(null)};U.addEventListener("ended",ce)}},J=E.track;J&&J.readyState==="live"&&A(J);let X=E.on("track",U=>{U&&U.readyState!=="live"||A(U)}),oe=setInterval(()=>{let U=E.track;U&&U.readyState==="live"&&A(U)},gr);return()=>{X(),clearInterval(oe)}},[y,n,Q,pe,i,W]),qe(()=>{if(pe||!y||s===!1||Q)return;let E=Sr(y,hr(n,"audio",s)),F=()=>{let U=T.current;return U?U.getAudioTracks()[0]??null:null},A=U=>{if(U!==F()&&(z(U),U)){let ce=()=>{F()===U&&z(null)};U.addEventListener("ended",ce)}},J=E.track;J&&J.readyState==="live"&&A(J);let X=E.on("track",U=>{U&&U.readyState!=="live"||A(U)}),oe=setInterval(()=>{let U=E.track;U&&U.readyState==="live"&&A(U)},gr);return()=>{X(),clearInterval(oe)}},[y,n,Q,s,pe,z]),so("div",{className:g,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":I?"true":"false","data-urun-video-framed":k?"true":"false",children:[vr("video",{ref:ye,className:v,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),I?null:C,S===void 0?null:vr("div",{"data-urun-video-poster":"","aria-hidden":k||void 0,style:{position:"absolute",inset:0,...k?{opacity:0,pointerEvents:"none"}:null},children:S}),p]})});import{jsx as kr,jsxs as mo}from"react/jsx-runtime";var lo={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},po=io(function(t,r){let{warp:o,children:n,...s}=t,{enabled:i=!0,overscan:a=.08,captureInput:u=!0,documentTarget:c,...g}=o??{},l=c!==void 0?c:typeof document<"u"?document:null,v=et(null),C=et(null),S=et(0),p=et(g);p.current=g;let m=uo(()=>co(p.current),[]);return ao(r,()=>({get video(){return v.current},get canvas(){return C.current},warp:m,get lastDrawTs(){return S.current}}),[m]),yr(()=>{if(!i)return;let f=0,P=0,R=null,x=y=>{typeof y.requestVideoFrameCallback=="function"&&(R=y,P=y.requestVideoFrameCallback(function w(){m.frameArrived(),P=y.requestVideoFrameCallback(w)}))},h=y=>{f=requestAnimationFrame(h);let w=C.current,T=v.current?.element??null;if(!w||!T||(T!==R&&(R&&P&&R.cancelVideoFrameCallback?.(P),x(T)),T.readyState<2))return;m.tick(y);let I=typeof devicePixelRatio=="number"?devicePixelRatio:1,d=Math.max(1,Math.round(w.clientWidth*I)),k=Math.max(1,Math.round(w.clientHeight*I));(w.width!==d||w.height!==k)&&(w.width=d,w.height=k);let b=w.getContext("2d");if(!b)return;let M=m.transform(),q=T.videoWidth||d,K=T.videoHeight||k,_=Math.max(d/q,k/K)*(1+a)*M.scale;b.setTransform(_,0,0,_,d/2+M.translateX*d,k/2+M.translateY*k),b.drawImage(T,-q/2,-K/2),S.current=y};return f=requestAnimationFrame(h),()=>{cancelAnimationFrame(f),R&&P&&R.cancelVideoFrameCallback?.(P)}},[i,a,m]),yr(()=>{if(!i||!u||!l)return;let f=()=>!!l.pointerLockElement,P=w=>{f()&&m.keyDown(w.key)},R=w=>m.keyUp(w.key),x=w=>{f()&&m.pointerDelta(w.movementX,w.movementY)},h=()=>{f()||m.clearKeys()},y=()=>m.clearKeys();return l.addEventListener("keydown",P),l.addEventListener("keyup",R),l.addEventListener("mousemove",x),l.addEventListener("pointerlockchange",h),l.defaultView?.addEventListener("blur",y),()=>{l.removeEventListener("keydown",P),l.removeEventListener("keyup",R),l.removeEventListener("mousemove",x),l.removeEventListener("pointerlockchange",h),l.defaultView?.removeEventListener("blur",y)}},[i,u,l,m]),i?mo(Me,{ref:v,...s,videoClassName:s.videoClassName,style:{...s.style},children:[kr("canvas",{ref:C,style:lo,"data-urun-warp":""}),n]}):kr(Me,{ref:v,...s,children:n})});var br=new Map;function fo(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);br.set(e,{component:t,schema:r})}function Rr(e,t){let r=br.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 So,jsx as tt}from"react/jsx-runtime";function go({name:e,props:t,fallback:r}){let o=Rr(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?tt(So,{children:r}):tt("div",{className:"urun-component-error",role:"alert",children:tt("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return tt(n,{...o.validatedProps})}import{z as He}from"zod";import{jsx as Ut,jsxs as Cr}from"react/jsx-runtime";var ho=He.object({step:He.number().min(0),total:He.number().min(1),label:He.string().optional(),variant:He.enum(["default","success","error"]).default("default")});function Pr(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 vo(e){let{step:t,total:r,label:o,variant:n,percentage:s}=Pr(e);return Cr("div",{className:"urun-progress-card","data-variant":n,children:[o&&Ut("div",{className:"urun-progress-label",children:o}),Ut("div",{className:"urun-progress-bar",children:Ut("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),Cr("div",{className:"urun-progress-text",children:[t,"/",r]})]})}import{z as Mt}from"zod";import{jsx as Er,jsxs as Ro}from"react/jsx-runtime";var yo=Mt.object({state:Mt.enum(["thinking","generating","idle","error"]),message:Mt.string().optional()}),ko={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Tr(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??ko[t]??t;return{state:t,message:n,isActive:o}}function bo(e){let{state:t,message:r,isActive:o}=Tr(e);return Ro("span",{className:"urun-status-badge","data-state":t,children:[Er("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),Er("span",{className:"urun-status-message",children:r})]})}import{useRef as wr,useEffect as Co}from"react";import{z as _t}from"zod";import{jsx as xr,jsxs as To}from"react/jsx-runtime";var Po=_t.object({text:_t.string(),streaming:_t.boolean().default(!1)});function Ar(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function Eo(e){let{text:t,streaming:r}=Ar(e),o=wr(null),n=wr(0);return Co(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),To("div",{className:"urun-text-stream",children:[xr("span",{ref:o,className:"urun-text-content"}),r&&xr("span",{className:"urun-text-cursor"})]})}import{z as rt}from"zod";import{jsx as Ur,jsxs as Ao}from"react/jsx-runtime";var wo=rt.object({src:rt.string().url(),alt:rt.string().optional(),caption:rt.string().optional()});function Mr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function xo(e){let{src:t,alt:r,caption:o}=Mr(e);return Ao("figure",{className:"urun-image-frame",children:[Ur("img",{className:"urun-image",src:t,alt:r}),o&&Ur("figcaption",{className:"urun-image-caption",children:o})]})}import{z as Se}from"zod";import{jsx as Nt,jsxs as _o}from"react/jsx-runtime";var Uo=Se.object({metrics:Se.array(Se.object({label:Se.string(),value:Se.union([Se.string(),Se.number()]),unit:Se.string().optional()}))});function _r(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function Mo(e){let{metrics:t}=_r(e);return Nt("div",{className:"urun-metrics-panel",children:t.map((r,o)=>_o("div",{className:"urun-metric-card",children:[Nt("div",{className:"urun-metric-label",children:r.label}),Nt("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}import{forwardRef as No}from"react";import{jsx as Lo}from"react/jsx-runtime";var Io=No(function(t,r){let{stream:o="image",...n}=t;return Lo(Me,{ref:r,stream:o,...n})});import{forwardRef as Do,useCallback as _e,useEffect as It,useImperativeHandle as Vo,useRef as Ne}from"react";import{observePageLifecycle as Fo}from"@urun-sh/core";var nt=null;function Oo(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function ot(){if(nt)return nt;let e=Oo();return e?(nt=new e,nt):null}function st(){let e=ot();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{jsx as Wo}from"react/jsx-runtime";var qo=1e3,Nr=200;function Lt(...e){console.debug("[audio]",...e)}var it=Do(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:g}=t,l=ae(),v=o??l,C=Ne(null),S=Ne(null),p=Ne(null),m=Ne(null),f=Ne(u);f.current=u;let P=Ne(c);P.current=c;let R=_e(d=>{p.current!==d&&(p.current=d,P.current?.(d))},[]),x=_e(()=>{if(typeof MediaStream>"u")return null;S.current||(S.current=new MediaStream);let d=C.current;return d&&d.srcObject!==S.current&&(d.srcObject=S.current),S.current},[]),h=_e(d=>{let k=C.current;if(!k)return;let b=k.play();!b||typeof b.then!="function"||b.then(()=>{k.muted||R(!0)}).catch(M=>{let q=M instanceof Error?M.name:String(M);if(q==="AbortError"){Lt(`play() aborted (${d}); retrying in ${Nr}ms`),m.current&&clearTimeout(m.current),m.current=setTimeout(()=>{m.current=null,h(`${d}:retry`)},Nr);return}if(q==="NotAllowedError"){Lt(`play() blocked pending a user gesture (${d})`),R(!1);return}Lt(`play() failed (${d})`,M)})},[R]),y=_e(d=>{let k=x();if(k){for(let b of k.getAudioTracks())b!==d&&k.removeTrack(b);d&&!k.getAudioTracks().includes(d)&&k.addTrack(d),d&&h("track-attach"),f.current?.(d)}},[x,h]),w=_e(()=>{let d=C.current;d&&(x(),d.muted=!1,h("gesture"),st(),R(!0))},[x,h,R]);Vo(r,()=>({unlock:w,get unlocked(){return p.current===!0},get element(){return C.current}}),[w]);let T=_e(d=>{C.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),x()),g?.(d)},[x,g]),I=s!==void 0;return It(()=>{if(I){y(s??null);return}if(!v)return;let d=v.stream(n),k=()=>{let N=S.current;return N?N.getAudioTracks()[0]??null:null},b=N=>{if(N!==k()&&(y(N),N)){let _=()=>{k()===N&&y(null)};N.addEventListener("ended",_)}},M=d.track;M&&M.readyState==="live"&&b(M);let q=d.on("track",N=>{N&&N.readyState!=="live"||b(N)}),K=setInterval(()=>{let N=d.track;N&&N.readyState==="live"&&b(N)},qo);return()=>{q(),clearInterval(K)}},[v,n,I,s,y]),It(()=>Fo(()=>{st(),p.current===!0&&h("foreground")}),[h]),It(()=>()=>{m.current&&clearTimeout(m.current)},[]),Wo("audio",{ref:T,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),Ho=it;import{forwardRef as Bo,useCallback as Ie,useEffect as Ir,useImperativeHandle as jo,useRef as de}from"react";import{observePageLifecycle as Ko,sessionFailureFromMediaError as $o,sharedCaptureController as zo}from"@urun-sh/core";import{jsx as Xo}from"react/jsx-runtime";var Lr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function at(...e){console.debug("[voice]",...e)}var ut=Bo(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=Lr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:g,onError:l,onMicStream:v,onTrack:C,onUnlockChange:S,capture:p}=t,m=ae(),f=o??m,P=de(null),R=de(null),x=de(null),h=de([]),y=de(!1),w=de(g);w.current=g;let T=de(l);T.current=l;let I=de(v);I.current=v;let d=Ie(_=>{y.current!==_&&(y.current=_,w.current?.(_))},[]),k=Ie(()=>{for(let _ of h.current)_();h.current=[],x.current?.release(),x.current=null,R.current&&(R.current=null,I.current?.(null))},[]),b=Ie(async()=>{let _=x.current;if(_){let H=await _.update(i);return R.current=_.stream,I.current?.(_.stream),H}let j=await(p??zo()).claim("audio",i);x.current=j,h.current=[j.onTrack((H,$)=>{R.current=$,I.current?.($),y.current&&f?.stream(n).attach(H).catch(Z=>at("mic re-attach after one-capture re-acquire failed",Z))}),j.onLost(H=>{x.current=null,h.current=[],R.current=null,I.current?.(null),d(!1),T.current?.(H)})],R.current=j.stream,I.current?.(j.stream);let B=j.track;if(!B)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return B},[p,i,f,n,d]),M=Ie(async()=>{k(),d(!1),await f?.stream(n).detach().catch(()=>{})},[f,n,k,d]),q=Ie(async()=>{if(!f)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");P.current?.unlock();let _;try{_=await b()}catch(B){k();let H=$o(B,f.status);throw T.current?.(H),H}f.connect?.();let O;for(let B=1;B<=u;B++)try{await f.whenLive(a!==void 0?{timeout:a}:void 0),await f.stream(n).attach(_),d(!0);return}catch(H){O=H,at(`start attempt ${B}/${u} failed`,H),B<u&&await new Promise($=>setTimeout($,c))}k(),d(!1);let j=O instanceof Error?O:new Error(String(O??"voice start failed"));throw T.current?.(j),j},[f,n,a,u,c,b,k,d]);jo(r,()=>({start:q,stop:M,unlock:()=>P.current?.unlock(),get active(){return y.current},get micStream(){return R.current},get audio(){return P.current}}),[q,M]);let K=de(!1),N=Ie(async()=>{if(!f||!y.current||K.current)return;let _=R.current?.getAudioTracks()[0]??null;if(_&&_.readyState==="live"){try{await f.stream(n).attach(_)}catch(O){at("foreground mic re-assert failed (will retry on next pass)",O)}return}K.current=!0;try{let O=await b();await f.stream(n).attach(O)}catch(O){let j=O instanceof Error?O:new Error(String(O));at("foreground mic re-acquire failed",j),T.current?.(j)}finally{K.current=!1}},[f,n,b]);return Ir(()=>{let _=()=>{N()};return f&&typeof f.onRecovery=="function"?f.onRecovery(_):Ko(_)},[f,N]),Ir(()=>k,[k]),s?Xo(it,{ref:P,session:f,stream:n,onTrack:C,onUnlockChange:S}):null}),Jo=ut;import{forwardRef as Zo,useEffect as Qo,useImperativeHandle as es,useRef as Or,useState as ts}from"react";import{useEffect as Go,useState as Yo}from"react";var Ot={level:0,speaking:!1};function Dt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=Yo(Ot);return Go(()=>{if(!e){i(Ot);return}let a=ot();if(!a||typeof MediaStream>"u")return;let u;e instanceof MediaStream?u=e:(u=new MediaStream,u.addTrack(e));let c,g;try{c=a.createMediaStreamSource(u),g=a.createAnalyser(),g.fftSize=r,c.connect(g)}catch{return}let l=new Uint8Array(g.fftSize),C=setInterval(()=>{g.getByteTimeDomainData(l);let S=0;for(let m=0;m<l.length;m++){let f=(l[m]-128)/128;S+=f*f}let p=Math.sqrt(S/l.length);i(m=>{let f=p>n;return Math.abs(m.level-p)<.005&&m.speaking===f?m:{level:p,speaking:f}})},o);return()=>{clearInterval(C),c.disconnect(),i(Ot)}},[e,r,o,n]),s}import{Fragment as ss,jsx as ct,jsxs as is}from"react/jsx-runtime";var rs={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},ns={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},os=Zo(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:u,onActiveChange:c,onError:g,onMicStream:l,capture:v}=t,C=ae(),S=o??C,p=Or(null),[m,f]=ts(null),P=Or(l);P.current=l;let{level:R,speaking:x}=Dt(a?m:null);return es(r,()=>({start:()=>{let h=p.current;return h?h.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>p.current?.stop()??Promise.resolve(),get active(){return p.current?.active??!1},get micStream(){return p.current?.micStream??null}}),[]),Qo(()=>{!i||!S||p.current?.start().catch(()=>{})},[i,S]),is(ss,{children:[ct(ut,{ref:p,session:S,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...v!==void 0?{capture:v}:{},onActiveChange:c,onError:g,onMicStream:h=>{f(h),P.current?.(h)}}),a?ct("span",{className:u,style:rs,"data-urun-mic":"","data-urun-mic-active":m?"true":"false","data-urun-mic-speaking":x?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(R*100)/100,children:ct("span",{style:ns,children:ct("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(R*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});import{captureStillFromVideo as as,sessionFailureFromMediaError as us,sharedCaptureController as cs}from"@urun-sh/core";import{forwardRef as Vr,useCallback as ue,useEffect as Vt,useImperativeHandle as ls,useRef as Y,useState as We}from"react";import{jsx as he,jsxs as Dr}from"react/jsx-runtime";var Fr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Ft(...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 qr=Vr(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:u,autoStart:c=!0,mirror:g="auto",connectTimeoutMs:l,visible:v=!1,className:C,videoClassName:S,onActiveChange:p,onError:m,onStream:f,onTrack:P,children:R,capture:x,flipControl:h="auto",flipControlClassName:y,onDevices:w}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let T=i?"user":a?"environment":u??"environment",I=ae(),d=o??I,k=Y(null),b=Y(null),M=Y(null),q=Y([]),K=Y(null),N=Y(!1),_=Y(!1),O=Y(T),[j,B]=We(T),[H,$]=We(!1),[Z,G]=We(null),[L,W]=We(!1),[z]=We(ds),ye=Y(p);ye.current=p;let Q=Y(m);Q.current=m;let pe=Y(f);pe.current=f;let E=Y(P);E.current=P;let F=Y(w);F.current=w;let A=ue(D=>{N.current!==D&&(N.current=D,$(D),ye.current?.(D))},[]);Vt(()=>{if(!H){G(null);return}let D=!1,V=()=>{ps().then(ie=>{D||(G(ie),ie&&F.current?.(ie))})};V();let te=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof te?.addEventListener=="function"?(te.addEventListener("devicechange",V),()=>{D=!0,te.removeEventListener?.("devicechange",V)}):()=>{D=!0}},[H]);let J=ue(D=>{let V=k.current;V&&(V.muted=!0,V.defaultMuted=!0,V.setAttribute("muted",""),V.setAttribute("playsinline",""),V.setAttribute("webkit-playsinline",""),V.srcObject=D,D&&V.play()?.catch?.(te=>Ft("preview play() failed",te)))},[]),X=ue(()=>{_.current=!1,K.current?.(),K.current=null;for(let D of q.current)D();q.current=[],M.current?.release(),M.current=null,b.current&&(b.current=null,pe.current?.(null),E.current?.(null)),J(null)},[J]),oe=ue((D,V)=>{K.current?.(),b.current=V,J(V),pe.current?.(V);let te=()=>{b.current===V&&(Ft("camera track ended (device removed or permission revoked)"),X(),A(!1))};D.addEventListener("ended",te),K.current=()=>D.removeEventListener("ended",te)},[J,X,A]),U=ue(async D=>{let V=n!==!1;if(V&&!d)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let te={...Fr,...s,facingMode:D},ie;try{let me=M.current;if(me)ie=await me.update(te);else{let Oe=await(x??cs()).claim("video",te);if(M.current=Oe,q.current=[Oe.onTrack((De,tn)=>{oe(De,tn),N.current&&(!V||!d||d.stream(n).attachVideo(De).then(()=>E.current?.(De)).catch(rn=>Ft("camera re-publish after one-capture re-acquire failed",rn)))}),Oe.onLost(De=>{M.current=null,q.current=[],X(),A(!1),Q.current?.(De)})],!Oe.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});ie=Oe.track}}catch(me){let Te=us(me,d?.status);throw Q.current?.(Te),Te}O.current=D,B(D),oe(ie,M.current?.stream??new MediaStream([ie]));try{V&&d&&(d.connect?.(),await d.whenLive(l!==void 0?{timeout:l}:void 0),await d.stream(n).attachVideo(ie)),_.current=V?n:!1}catch(me){X(),A(!1);let Te=me instanceof Error?me:new Error(String(me));throw Q.current?.(Te),Te}E.current?.(ie),A(!0)},[d,n,s,l,x,oe,X,A]),ce=ue(D=>U(D?.facingMode??O.current),[U]),le=ue(async D=>{let V=_.current===n;N.current&&O.current===D&&V||await U(D)},[U,n]),ee=ue(()=>U(O.current==="environment"?"user":"environment"),[U]),se=ue(async()=>{X(),A(!1),n!==!1&&await d?.stream(n).detachVideo().catch(()=>{})},[d,n,X,A]),Ee=ue(async D=>{let V=k.current;if(!V)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await as(V,D)},[]);ls(r,()=>({start:ce,stop:se,flip:ee,setFacingMode:le,capturePhoto:Ee,get active(){return N.current},get facingMode(){return O.current},get stream(){return b.current},get element(){return k.current}}),[ce,se,ee,le,Ee]);let Le=Y(le);if(Le.current=le,Vt(()=>{c&&(n!==!1&&!d||Le.current(T).catch(()=>{}))},[c,d,T,n]),Vt(()=>X,[X]),!v)return null;let Gt=g==="auto"?j==="user":g,gt=H&&(h===!0||h==="auto"&&z&&(Z?.length??0)>1),Xe=()=>{L||(W(!0),ee().catch(()=>{}).finally(()=>W(!1)))};return Dr("div",{className:C,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":j,children:[he("video",{ref:k,className:S,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Gt?{transform:"scaleX(-1)"}:{}}}),gt?he("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Xe,disabled:L,className:y,style:y?{opacity:L?.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:L?.6:1},children:Dr("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:[he("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),he("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),he("path",{d:"M14.5 10.5v1.6h-1.6"}),he("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),he("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,R]})}),ms=Vr(function({preview:t=!0,...r},o){return he(qr,{ref:o,...r,visible:t,autoStart:!1})});import{cameraCaptureAvailable as fs,normalizeReferenceImage as gs,referenceImageErrorMessage as Ss}from"@urun-sh/core";import{useCallback as Be,useEffect as hs,useRef as qt,useState as je}from"react";function vs(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=je(null),[a,u]=je(null),[c,g]=je(!1),[l,v]=je(null),[C]=je(fs),S=qt(n);S.current=n;let p=qt(null),m=qt(0),f=Be(y=>{p.current&&URL.revokeObjectURL(p.current),p.current=y?URL.createObjectURL(new Blob([y.bytes],{type:y.type})):null,u(p.current),i(y),S.current?.(y)},[]);hs(()=>()=>{m.current++,p.current&&URL.revokeObjectURL(p.current),p.current=null},[]);let P=Be(async y=>{let w=++m.current;g(!0),v(null);try{let T=await y();if(m.current!==w)return;f(T)}catch(T){if(m.current!==w)return;v(Ss(T))}finally{m.current===w&&g(!1)}},[f]),R=Be(y=>P(()=>gs(y,{maxSize:t,type:r,quality:o,source:"file"})),[P,t,r,o]),x=Be(y=>P(()=>y.capturePhoto({maxSize:t,type:r,quality:o})),[P,t,r,o]),h=Be(()=>{m.current++,v(null),g(!1),f(null)},[f]);return{reference:s,previewUrl:a,pick:R,capture:x,clear:h,busy:c,error:l,cameraAvailable:C}}import{useEffect as ys,useState as ks}from"react";function bs(e,t){let[r,o]=ks(null);return ys(()=>{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 ws}from"react";import{useEffect as Es,useMemo as Ts}from"react";import{createStore as Rs}from"zustand/vanilla";import{useStore as Cs}from"zustand";var Ps=()=>{};function Ht(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=Rs(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let c of s)c();s=null}},a=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",c=>n.setState({doc:c})),e.onSynced(()=>n.setState({synced:!0}))]),i):Ps,u=(c=>Cs(n,c));return Object.assign(u,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),u}function Ke(e,t){let r=Ts(()=>Ht(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return Es(()=>r.bind(),[r]),r}function xs(e,t,r){let n=Ke(e,t)(r??(a=>a)),s=ws(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 As,useState as Us}from"react";var Re=200;function ve(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function $e(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Wt(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 Bt(e,t,r={}){let o=r.cap??200,[n,s]=Us([]);return As(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let u=await a.next();if(!i||u.done)break;s(c=>ve(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}import{jsx as lt,jsxs as ze}from"react/jsx-runtime";function Ms({session:e,name:t,cap:r,className:o}){let n=Bt(e,t,{cap:r});return ze("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[ze("div",{className:"urun-stream-tail-meta",children:[lt("code",{children:t}),ze("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),lt("div",{className:"urun-stream-tail-log",children:n.length===0?ze("span",{className:"urun-stream-tail-empty",children:["Waiting for ",lt("code",{children:t})," messages\u2026"]}):n.map((s,i)=>ze("div",{className:"urun-stream-tail-line",children:[lt("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",$e(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as _s,useState as Hr}from"react";import{jsx as Ce,jsxs as dt}from"react/jsx-runtime";function pt({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=Hr(""),[i,a]=Hr(null),u=_s(()=>{let c=Wt(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return dt("div",{className:"urun-doc-patch",children:[Ce("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),dt("div",{className:"urun-doc-patch-actions",children:[Ce("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?Ce("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Ns({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=Ke(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return dt("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[dt("div",{className:"urun-doc-panel-meta",children:[Ce("code",{children:t}),Ce("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),Ce("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?Ce(pt,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}import{useEffect as Is,useState as Ls}from"react";import{jsx as Je,jsxs as Br}from"react/jsx-runtime";function Wr(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function Os({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=Ls([]);return Is(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>ve(u,{at:Date.now(),direction:"in",text:Wr($e(a))},r))}):void 0),[e,t,r]),Br("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[Je(pt,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>ve(u,{at:Date.now(),direction:"out",text:Wr(a)},r))}}),Je("div",{className:"urun-control-sender-log",children:n.length===0?Je("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>Br("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[Je("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",Je("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}import{useEffect as Ds,useState as Vs}from"react";import{jsx as mt,jsxs as qs}from"react/jsx-runtime";function Fs({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=Vs([]),a=t.join(","),u=r.join(",");return Ds(()=>{if(i([]),!e)return;let c=(l,v)=>i(C=>ve(C,{at:Date.now(),kind:l,text:v},o)),g=[];g.push(e.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of t){let v=e.stream(l);g.push(v.on("track",C=>c("track",`${l}: ${C?"track arrived":"track ended"}`)))}for(let l of r){let v=e.doc(l);g.push(v.on("change",()=>c("doc",`${l} changed`)))}return()=>g.forEach(l=>l())},[e,a,u,o]),mt("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?mt("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,g)=>qs("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[mt("span",{className:"urun-event-spine-kind",children:c.kind})," ",mt("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${g}`))})}import{describeSessionPhase as ti,isWakingPhase as ri}from"@urun-sh/core";import{useEffect as Hs,useState as Ws}from"react";function ne(e){let[t,r]=Ws(e?.phase??null);return Hs(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}import{describeSessionPhase as zs}from"@urun-sh/core";import{useEffect as Bs,useRef as js,useState as Ks}from"react";import{isWakingPhase as $s}from"@urun-sh/core";function jt(e){let t=ne(e),r=$s(t?.name),o=js(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]=Ks(s);return Bs(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let u=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(u)},[n]),{waking:r,phase:t,state:r?t?.runtime?.state:void 0,reason:r?t?.runtime?.reason:void 0,since:n,seconds:r?i:0}}import{Fragment as Js,jsx as jr,jsxs as Kr}from"react/jsx-runtime";function Kt({session:e,render:t,className:r}){let o=jt(e);return!o.waking||!o.phase?null:jr("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):Kr(Js,{children:[jr("span",{className:"urun-session-waking-label",children:zs(o.phase)})," ",Kr("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}import{useEffect as Ys,useState as Zs}from"react";import{useEffect as $r,useRef as Xs,useState as zr}from"react";var Gs={event:null,elapsedMs:0};function $t(e,t){let[r,o]=zr(null),n=Xs(0);$r(()=>{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]=zr(0);return $r(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,u=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(u());let c=setInterval(()=>i(u()),1e3);return()=>clearInterval(c)},[r]),r?{event:r,elapsedMs:s}:Gs}import{jsx as Jr,jsxs as Xr}from"react/jsx-runtime";var Qs={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 ei(e){let[t,r]=Zs(!1);return Ys(()=>{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 zt({session:e,stream:t,videoElement:r,render:o,className:n}){let s=$t(e,t),i=ei(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return Jr("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):Xr("div",{className:"urun-activation-overlay-card",children:[Jr("span",{className:"urun-activation-overlay-copy",children:a.hint??Qs[u]})," ",Xr("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}import{jsx as Pe,jsxs as Jt}from"react/jsx-runtime";var ni={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function oi({session:e,className:t}){let r=ne(e),o=r?.name??"idle",n=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return Jt("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[Pe("span",{className:"urun-session-status-dot","data-phase":o}),Pe("span",{className:"urun-session-status-label",children:ni[o]}),n?Pe("span",{className:"urun-session-status-detail",children:n}):null]})}function si({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=ne(e);if(s?.name==="live")return Jt("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,Pe(zt,{session:e})]});let i=r?r(s):Pe("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&ri(s.name)?Pe(Kt,{session:e}):s&&s.name!=="idle"?ti(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return Jt("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?Pe("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}import{useEffect as ii,useState as ai}from"react";import{jsx as li}from"react/jsx-runtime";function Gr(e){return ne(e)?.endsAt??null}function ui(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 ci({session:e,urgentMs:t=6e4,className:r}){let n=Gr(e)?.getTime()??null,[s,i]=ai(()=>n===null?null:Math.max(0,n-Date.now()));if(ii(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),s===null)return null;let a=ui(s);return li("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<t?"":void 0,"data-expired":s<=0?"":void 0,children:a})}import{jsx as Yr,jsxs as mi}from"react/jsx-runtime";var di=new Set(["expired","ended","error"]);function pi({session:e,onNewSession:t,children:r,className:o}){let n=ne(e);if(!n||!di.has(n.name))return null;let s=r?r(n):Yr("span",{className:"urun-session-ended-copy",children:n.name==="expired"?"Session ended \u2014 start a new session":n.name==="error"?`Session failed${n.error?.reason?` \u2014 ${n.error.reason}`:""}.`:"Session ended."});return mi("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?Yr("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}import{useEffect as Zr,useMemo as fi,useState as Qr}from"react";import{jsx as ft,jsxs as hi}from"react/jsx-runtime";function Xt(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 en(e){let t=fi(()=>e?e.doc("control"):null,[e]),[r,o]=Qr(()=>t?Xt(t.get("idle")):null);return Zr(()=>{if(!t){o(null);return}return o(Xt(t.get("idle"))),t.on("change",()=>o(Xt(t.get("idle"))))},[t]),r}function gi(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function Si({session:e,onStillHere:t,className:r}){let o=en(e),n=o?.deadlineEpochS??null,[s,i]=Qr(null);if(Zr(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()/1e3));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return ft("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:hi("div",{className:"urun-idle-warning-card",children:[ft("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),ft("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${gi(s)} due to inactivity.`:"This session will end soon due to inactivity."}),ft("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}import{useContext as vi,useEffect as yi,useState as ki}from"react";import{prewake as bi}from"@urun-sh/core";function Ri(e){let t=vi(we),[r,o]=ki(null),n=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,u=t?.orgId,c=t?.jwt,g=t?.getAccessToken,l=t?.authProvider;return yi(()=>{if(!a||!u||!n||!s)return;let v=!1,C=()=>{bi({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:g,authProvider:l}).then(p=>{v||o(p)}).catch(()=>{})};C();let S=setInterval(C,Math.max(1,i)*1e3);return()=>{v=!0,clearInterval(S)}},[n,s,i,a,u,c,g,l]),r}import{describeSessionPhase as Nl,isWakingPhase as Il}from"@urun-sh/core";export{it as Audio,qr as Camera,go as ComponentRenderer,Fr as DEFAULT_CAMERA_CONSTRAINTS,Re as DEFAULT_LOG_CAP,Lr as DEFAULT_VOICE_CONSTRAINTS,pt as DocPatchForm,Io as Image,xo as ImageFrame,wo as ImageFrameSchema,Mo as MetricsPanel,Uo as MetricsPanelSchema,os as Mic,mn as OPERATOR_CHORD_LABEL,pn as OPERATOR_TOKEN_STORAGE_KEY,vo as ProgressCard,ho as ProgressCardSchema,po as ReprojectedVideo,Yn as Session,bo as StatusBadge,yo as StatusBadgeSchema,Eo as TextStream,Po as TextStreamSchema,zt as UrunActivationOverlay,Ho as UrunAudio,nn as UrunAuthProvider,ms as UrunCamera,Os as UrunControlSender,Ns as UrunDocPanel,Ve as UrunErrorBoundary,Fs as UrunEventSpine,Si as UrunIdleWarning,on as UrunJwtProvider,Pn as UrunProvider,ci as UrunSessionClock,pi as UrunSessionEnded,si as UrunSessionGate,oi as UrunSessionStatus,Kt as UrunSessionWaking,Ms as UrunStreamTail,Jo as UrunVoice,Me as Video,ut as Voice,Ge as authMode,Ht as createDocStore,Nl as describeSessionPhase,$e as formatPayload,ot as getUrunAudioContext,Il as isWakingPhase,Wt as parseJsonObject,ve as pushCapped,tr as readOperatorToken,fo as registerComponent,st as resumeUrunAudioContext,fe as urunPublicEnv,$t as useActivation,_n as useApp,jn as useChat,qn as useCompletion,vt as useConfirmOnLeave,Ke as useDocStore,Mr as useImageFrame,Xn as useInputPresence,_r as useMetricsPanel,ht as useOperatorOverride,Pr as useProgressCard,vs as useReferenceImage,On as useRequest,Zn as useSession,xs as useSessionDoc,Gr as useSessionEndsAt,en as useSessionIdle,ne as useSessionPhase,bs as useSessionTrack,jt as useSessionWake,Tr as useStatusBadge,Bt as useStreamMessages,Ar as useTextStream,Dt as useUrunAudioLevel,St as useUrunAuth,Ri as useUrunPrewake,cn as usesWorkOSAuth};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@urun-sh/react",
3
- "version": "0.2.41",
3
+ "version": "0.2.43",
4
4
  "description": "React bindings for the urun TypeScript SDK",
5
5
  "repository": {
6
6
  "type": "git",
@@ -53,7 +53,7 @@
53
53
  "dev": "tsup --watch"
54
54
  },
55
55
  "peerDependencies": {
56
- "@urun-sh/core": "^0.2.41",
56
+ "@urun-sh/core": "^0.2.43",
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",