@urun-sh/react 0.2.45 → 0.2.47

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 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});
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:()=>Rt,Camera:()=>Cr,ComponentRenderer:()=>cn,DEFAULT_CAMERA_CONSTRAINTS:()=>br,DEFAULT_LOG_CAP:()=>Ie,DEFAULT_VOICE_CONSTRAINTS:()=>vr,DocPatchForm:()=>Tt,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:()=>En,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:()=>xn,Video:()=>qe,Voice:()=>Pt,authMode:()=>pt,createDocStore:()=>qt,describeSessionPhase:()=>tr.describeSessionPhase,formatPayload:()=>ot,getUrunAudioContext:()=>bt,isWakingPhase:()=>tr.isWakingPhase,parseJsonObject:()=>Wt,pushCapped:()=>Ae,readOperatorToken:()=>sr,registerComponent:()=>an,resumeUrunAudioContext:()=>Ct,urunPublicEnv:()=>Te,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:()=>Rr,useSessionIdle:()=>Er,useSessionPhase:()=>fe,useSessionTrack:()=>_n,useSessionWake:()=>Jt,useStatusBadge:()=>mr,useStreamMessages:()=>jt,useTextStream:()=>fr,useUrunAudioLevel:()=>Vt,useUrunAuth:()=>At,useUrunPrewake:()=>Yn,usesWorkOSAuth:()=>Ar});module.exports=so(Oo);var le=require("react");var xr=require("react"),dt=require("react/jsx-runtime"),ze=class extends xr.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 Te(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=Te("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||Te("VERCEL_ENV")==="production"?"workos":Te("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 Ne=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,Ne.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,Ne.jsx)("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),(0,Ne.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:R}){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,le.useState)(),[P,C]=(0,le.useState)(null),w=(0,le.useRef)(void 0),S=(0,le.useRef)(null),[y,x]=(0,le.useState)(null);Mt(j=>x({jwt:j}));let T=At(),O=Te("NEXT_PUBLIC_SESSION_TOKEN")??Te("NEXT_PUBLIC_URUN_JWT"),d=pt(),k=y!==null,b=d==="workos"&&!n&&!k&&!h,_=n??(d==="jwt"?O:void 0)??m?.token,H=k?y.jwt:_,X=s??Te("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),I=b&&!H&&!T?.getAccessToken,N=t??m?.orgId,D=e??m?.gatewayUrl,z=h&&m===void 0,$=h&&m!==void 0&&!D?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,W=I?new Error('[urun] <UrunProvider> resolved authMode()="workos" but no auth context is mounted: there is no <UrunWorkOSProvider> (or <UrunAuthProvider>) ancestor supplying getAccessToken, and no jwt prop was passed, so no session token can be obtained. Note NEXT_PUBLIC_SESSION_TOKEN and NEXT_PUBLIC_URUN_JWT are IGNORED in workos mode, so setting them will not help. Either mount UrunWorkOSProvider from @urun-sh/react/next-workos, or select jwt mode with NEXT_PUBLIC_AUTH_MODE=jwt (or NEXT_PUBLIC_AUTH_ENABLED=false) and supply a token.'):null,ee=P??$??W,ie=u??uo,te=(0,le.useCallback)(async j=>{if(!j?.forceRefresh){let ce=w.current;if(!ce)return ce;let ae=lo(ce);if(ae===null||ae-Date.now()>co)return ce}return(await(S.current??(S.current=(async()=>{try{let ce=await Fr(ie);return w.current=ce.token,f(ce),ce}finally{S.current=null}})()))).token},[ie]),B=(0,le.useMemo)(()=>({appId:p,baseUrl:D??"",orgId:N??"",jwt:H,getAccessToken:b?T?.getAccessToken:h&&!k?te:void 0,authProvider:X,eventsUrl:i,sessionKey:a,releaseOnLeave:c,priority:k?"preempt":void 0}),[p,T,D,X,H,i,N,a,c,b,k,h,te]);return(0,le.useEffect)(()=>{if(!h)return;let j=new AbortController;return C(null),(async()=>{try{let re=await Fr(ie,j.signal);w.current=re.token,f(re)}catch(re){if(j.signal.aborted)return;C(re instanceof Error?re:new Error(String(re)))}})(),()=>j.abort()},[h,ie]),(0,Ne.jsx)(ze,{fallback:l,children:ee?po(v,ee):z?(0,Ne.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,Ne.jsx)(Je.Provider,{value:B,children:R})})}var de=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()})}onConnectionState(t){return this._doc.onConnectionState?this._doc.onConnectionState(r=>{t(r),this._notify()}):(t({connected:!0,consecutiveFailures:0,lastCloseCode:null,lastCloseReason:null}),()=>{})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},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,de.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,de.useReducer)(i=>i+1,0),r=(0,de.useRef)(new Map),o=(0,de.useRef)(new Map),n=(0,de.useRef)(null),s=(0,de.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,de.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,de.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),R=r.current.get(v);if(R&&!R.disposed)return R;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 oe=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,oe.useMemo)(()=>Ge(e),[e]),[o,n]=(0,oe.useState)(void 0),[s,i]=(0,oe.useState)(null),[a,u]=(0,oe.useState)(!1),c=(0,oe.useRef)(t);c.current=t;let g=(0,oe.useRef)(0),l=(0,oe.useRef)(null),v=(0,oe.useRef)(!0);(0,oe.useEffect)(()=>(v.current=!0,()=>{v.current=!1,l.current?.abort()}),[]);let R=(0,oe.useCallback)(async m=>{l.current?.abort();let f=new AbortController;l.current=f;let P=++g.current,C=()=>v.current&&g.current===P;C()&&(u(!0),i(null));try{let w=await r.request(m,{...c.current,signal:f.signal});return C()&&(n(w),u(!1),c.current?.onSuccess?.(w)),w}catch(w){let S=go(w);throw C()&&(i(S),u(!1),c.current?.onError?.(S)),S}},[r]),h=(0,oe.useCallback)(m=>{R(m).catch(()=>{})},[R]),p=(0,oe.useCallback)(()=>{g.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:h,mutateAsync:R,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 R=(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,C=P?.parseChunk??ho,w=P?.buildPayload??(b=>({prompt:b}));f()&&(n(""),u(null),i(!0));let{parseChunk:S,buildPayload:y,onFinish:x,onError:T,...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+=C(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:R,isStreaming:s,error:a}}var Y=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,Y.useMemo)(()=>Ge(e),[e]),[o,n]=(0,Y.useState)(()=>(t?.initialMessages??[]).map(C=>({id:C.id??cr("msg"),role:C.role,content:C.content}))),[s,i]=(0,Y.useState)(""),[a,u]=(0,Y.useState)(!1),[c,g]=(0,Y.useState)(null),l=(0,Y.useRef)(t);l.current=t;let v=(0,Y.useRef)(o);v.current=o;let R=(0,Y.useRef)(s);R.current=s;let h=(0,Y.useRef)(0),p=(0,Y.useRef)(null),m=(0,Y.useRef)(!0);(0,Y.useEffect)(()=>(m.current=!0,()=>{m.current=!1,p.current?.cancel(),p.current=null}),[]);let f=(0,Y.useCallback)(()=>{h.current++,p.current?.cancel(),p.current=null,m.current&&u(!1)},[]),P=(0,Y.useCallback)(async C=>{let w=C===void 0,S=(w?R.current:C)??"";if(!S.trim())return;p.current?.cancel();let x=++h.current,T=()=>m.current&&h.current===x,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(B=>({role:B.role,content:B.content})),H=[...v.current,k,b];v.current=H,n(H),w&&i(""),g(null),u(!0);let X=O?.buildPayload??(B=>({messages:B})),{initialMessages:I,parseChunk:N,buildPayload:D,onFinish:z,onError:$,...W}=O??{},ee=B=>{n(j=>j.map(re=>re.id===b.id?{...re,content:B}:re))},ie="",te;try{te=r.requestStream(X(_),W),p.current=te}catch(B){let j=$r(B);T()&&(g(j),u(!1),O?.onError?.(j));return}try{for await(let B of te){if(h.current!==x)break;ie+=d(B),T()&&ee(ie)}T()&&(u(!1),O?.onFinish?.({...b,content:ie}))}catch(B){let j=$r(B);T()&&(g(j),u(!1),O?.onError?.(j))}finally{p.current===te&&(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 R=(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())},x=b=>{S()&&(a.current?.keyDown(b.key),R())},T=b=>{a.current?.keyUp(b.key),R()},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",x),n.addEventListener("keyup",T),n.addEventListener("mousemove",O),n.addEventListener("mousedown",d),n.addEventListener("mouseup",d),n.defaultView?.addEventListener("blur",k),()=>{n.removeEventListener("pointerlockchange",y),n.removeEventListener("keydown",x),n.removeEventListener("keyup",T),n.removeEventListener("mousemove",O),n.removeEventListener("mousedown",d),n.removeEventListener("mouseup",d),n.defaultView?.removeEventListener("blur",k)}},[n,h,R]);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),R()},[R]),C=(0,G.useCallback)(S=>{a.current?.keyUp(S),R()},[R]),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:C,movePointer:w}}var ue=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:R,poster:h,children:p,onTrack:m,onFirstFrame:f,frameMarker:P,onFrameMarkerReached:C,onFrameMarkerUnsupported:w}=t,S=Re(),y=o??S,x=(0,L.useRef)(null),T=(0,L.useRef)(null),[O,d]=(0,L.useState)(!1),[k,b]=(0,L.useState)(!1),_=(0,L.useRef)(!1),H=(0,L.useRef)(m);H.current=m;let X=(0,L.useRef)(f);X.current=f;let I=(0,L.useRef)(C);I.current=C;let N=(0,L.useRef)(w);N.current=w;let D=(0,L.useRef)(P??null);D.current=P??null;let z=(0,L.useRef)(null),$=(0,L.useRef)(null),W=(0,L.useCallback)((E,q=!1)=>{if(!q&&E===z.current||(z.current=E,$.current?.(),$.current=null,_.current=!1,b(!1),!E))return;let A=x.current;if(!A)return;let Z=D.current,ne=Z?.rtpTimestamp??null,ke=!1,U=()=>{ke||(ke=!0,N.current?.())};Z&&ne==null&&U();let Pe=Z!=null&&ne!=null,Ee=be=>{$.current?.(),$.current=null,_.current=!0,b(!0),X.current?.(),be&&I.current?.()};if(typeof A.requestVideoFrameCallback=="function"){let be=!1,Ke=0,ut=(Tr,rr)=>{if(!be){if(Pe){let wt=rr?.rtpTimestamp;if(typeof wt!="number"){U(),Ee(!1);return}if(!vo(wt,ne)){Ke=A.requestVideoFrameCallback(ut);return}Ee(!0);return}Ee(!1)}};Ke=A.requestVideoFrameCallback(ut),$.current=()=>{be=!0,A.cancelVideoFrameCallback?.(Ke)};return}Pe&&U();let he=()=>{let be=A.getVideoPlaybackQuality?.();(be?be.totalVideoFrames>0:A.readyState>=2&&A.videoWidth>0)&&Ee(!1)};A.addEventListener("loadeddata",he),A.addEventListener("timeupdate",he),A.addEventListener("playing",he),$.current=()=>{A.removeEventListener("loadeddata",he),A.removeEventListener("timeupdate",he),A.removeEventListener("playing",he)},he()},[]);(0,L.useEffect)(()=>()=>{$.current?.(),$.current=null},[]);let ee=P==null?null:`${P.rtpTimestamp??""}|${P.ptsMs??""}`,ie=(0,L.useRef)(ee);(0,L.useEffect)(()=>{if(ie.current===ee||(ie.current=ee,ee==null))return;let E=z.current;E&&W(E,!0)},[ee,W]);let te=(0,L.useCallback)(()=>{if(typeof MediaStream>"u")return null;T.current||(T.current=new MediaStream);let E=x.current;return E&&E.srcObject!==T.current&&(E.srcObject=T.current),T.current},[]),B=(0,L.useCallback)(E=>{let q=x.current;if(!q)return;let A=q.play();!A||typeof A.catch!="function"||A.catch(Z=>yo(`play() failed (${E})`,Z))},[]),j=(0,L.useCallback)(E=>{let q=te();if(q){for(let A of q.getVideoTracks())A!==E&&q.removeTrack(A);if(E&&!q.getVideoTracks().includes(E)){q.addTrack(E);let A=x.current;A&&(A.srcObject=q)}E&&B("track-attach"),d(E!==null),W(E),H.current?.(E)}},[te,B,W]),re=(0,L.useCallback)(E=>{let q=te();if(q){for(let A of q.getAudioTracks())A!==E&&q.removeTrack(A);E&&!q.getAudioTracks().includes(E)&&q.addTrack(E),E&&B("audio-attach")}},[te,B]),ce=(0,L.useCallback)(E=>{x.current=E,E&&(a&&(E.muted=!0,E.defaultMuted=!0,E.setAttribute("muted","")),E.setAttribute("playsinline",""),E.setAttribute("webkit-playsinline",""),te())},[te,a]);(0,L.useImperativeHandle)(r,()=>({get element(){return x.current},get live(){return T.current?T.current.getVideoTracks().length>0:!1},get framed(){return _.current}}),[]);let ae=(0,rn.derivedLegRole)(n)!==void 0;(0,L.useEffect)(()=>{ae&&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.`)},[ae,n]);let Me=i!==void 0;return(0,L.useEffect)(()=>{if(Me){j(i??null);return}if(ae){j(null);return}if(!y)return;let E=en(y,tn(n,"video")),q=()=>{let U=T.current;return U?U.getVideoTracks()[0]??null:null},A=U=>{if(U!==q()&&(j(U),U)){let Pe=()=>{q()===U&&j(null)};U.addEventListener("ended",Pe)}},Z=E.track;Z&&Z.readyState==="live"&&A(Z);let ne=E.on("track",U=>{U&&U.readyState!=="live"||A(U)}),ke=setInterval(()=>{let U=E.track;U&&U.readyState==="live"&&A(U)},Qr);return()=>{ne(),clearInterval(ke)}},[y,n,ae,Me,i,j]),(0,L.useEffect)(()=>{if(Me||!y||s===!1||ae)return;let E=en(y,tn(n,"audio",s)),q=()=>{let U=T.current;return U?U.getAudioTracks()[0]??null:null},A=U=>{if(U!==q()&&(re(U),U)){let Pe=()=>{q()===U&&re(null)};U.addEventListener("ended",Pe)}},Z=E.track;Z&&Z.readyState==="live"&&A(Z);let ne=E.on("track",U=>{U&&U.readyState!=="live"||A(U)}),ke=setInterval(()=>{let U=E.track;U&&U.readyState==="live"&&A(U)},Qr);return()=>{ne(),clearInterval(ke)}},[y,n,ae,s,Me,re]),(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:ce,className:v,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),O?null:R,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,ue.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,ue.useRef)(null),R=(0,ue.useRef)(null),h=(0,ue.useRef)(0),p=(0,ue.useRef)(g);p.current=g;let m=(0,ue.useMemo)(()=>(0,nn.createCameraWarp)(p.current),[]);return(0,ue.useImperativeHandle)(r,()=>({get video(){return v.current},get canvas(){return R.current},warp:m,get lastDrawTs(){return h.current}}),[m]),(0,ue.useEffect)(()=>{if(!i)return;let f=0,P=0,C=null,w=y=>{typeof y.requestVideoFrameCallback=="function"&&(C=y,P=y.requestVideoFrameCallback(function x(){m.frameArrived(),P=y.requestVideoFrameCallback(x)}))},S=y=>{f=requestAnimationFrame(S);let x=R.current,T=v.current?.element??null;if(!x||!T||(T!==C&&(C&&P&&C.cancelVideoFrameCallback?.(P),w(T)),T.readyState<2))return;m.tick(y);let O=typeof devicePixelRatio=="number"?devicePixelRatio:1,d=Math.max(1,Math.round(x.clientWidth*O)),k=Math.max(1,Math.round(x.clientHeight*O));(x.width!==d||x.height!==k)&&(x.width=d,x.height=k);let b=x.getContext("2d");if(!b)return;let _=m.transform(),H=T.videoWidth||d,X=T.videoHeight||k,N=Math.max(d/H,k/X)*(1+a)*_.scale;b.setTransform(N,0,0,N,d/2+_.translateX*d,k/2+_.translateY*k),b.drawImage(T,-H/2,-X/2),h.current=y};return f=requestAnimationFrame(S),()=>{cancelAnimationFrame(f),C&&P&&C.cancelVideoFrameCallback?.(P)}},[i,a,m]),(0,ue.useEffect)(()=>{if(!i||!u||!l)return;let f=()=>!!l.pointerLockElement,P=x=>{f()&&m.keyDown(x.key)},C=x=>m.keyUp(x.key),w=x=>{f()&&m.pointerDelta(x.movementX,x.movementY)},S=()=>{f()||m.clearKeys()},y=()=>m.clearKeys();return l.addEventListener("keydown",P),l.addEventListener("keyup",C),l.addEventListener("mousemove",w),l.addEventListener("pointerlockchange",S),l.defaultView?.addEventListener("blur",y),()=>{l.removeEventListener("keydown",P),l.removeEventListener("keyup",C),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:R,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 xe=require("zod"),Qe=require("react/jsx-runtime"),vn=xe.z.object({metrics:xe.z.array(xe.z.object({label:xe.z.string(),value:xe.z.union([xe.z.string(),xe.z.number()]),unit:xe.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 Cn=require("react/jsx-runtime"),bn=(0,kn.forwardRef)(function(t,r){let{stream:o="image",...n}=t;return(0,Cn.jsx)(qe,{ref:r,stream:o,...n})});var J=require("react"),Pn=require("@urun-sh/core");var Lt=null;function Co(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function bt(){if(Lt)return Lt;let e=Co();return e?(Lt=new e,Lt):null}function Ct(){let e=bt();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var Tn=require("react/jsx-runtime"),Ro=1e3,Rn=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:g}=t,l=Re(),v=o??l,R=(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 C=(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=R.current;return d&&d.srcObject!==h.current&&(d.srcObject=h.current),h.current},[]),S=(0,J.useCallback)(d=>{let k=R.current;if(!k)return;let b=k.play();!b||typeof b.then!="function"||b.then(()=>{k.muted||C(!0)}).catch(_=>{let H=_ instanceof Error?_.name:String(_);if(H==="AbortError"){Sr(`play() aborted (${d}); retrying in ${Rn}ms`),m.current&&clearTimeout(m.current),m.current=setTimeout(()=>{m.current=null,S(`${d}:retry`)},Rn);return}if(H==="NotAllowedError"){Sr(`play() blocked pending a user gesture (${d})`),C(!1);return}Sr(`play() failed (${d})`,_)})},[C]),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]),x=(0,J.useCallback)(()=>{let d=R.current;d&&(w(),d.muted=!1,S("gesture"),Ct(),C(!0))},[w,S,C]);(0,J.useImperativeHandle)(r,()=>({unlock:x,get unlocked(){return p.current===!0},get element(){return R.current}}),[x]);let T=(0,J.useCallback)(d=>{R.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 H=d.on("track",I=>{I&&I.readyState!=="live"||b(I)}),X=setInterval(()=>{let I=d.track;I&&I.readyState==="live"&&b(I)},Ro);return()=>{H(),clearInterval(X)}},[v,n,O,s,y]),(0,J.useEffect)(()=>(0,Pn.observePageLifecycle)(()=>{Ct(),p.current===!0&&S("foreground")}),[S]),(0,J.useEffect)(()=>()=>{m.current&&clearTimeout(m.current)},[]),(0,Tn.jsx)("audio",{ref:T,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),En=Rt;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:R,onUnlockChange:h,capture:p}=t,m=Re(),f=o??m,P=(0,K.useRef)(null),C=(0,K.useRef)(null),w=(0,K.useRef)(null),S=(0,K.useRef)([]),y=(0,K.useRef)(!1),x=(0,K.useRef)(g);x.current=g;let T=(0,K.useRef)(l);T.current=l;let O=(0,K.useRef)(v);O.current=v;let d=(0,K.useCallback)(N=>{y.current!==N&&(y.current=N,x.current?.(N))},[]),k=(0,K.useCallback)(()=>{for(let N of S.current)N();S.current=[],w.current?.release(),w.current=null,C.current&&(C.current=null,O.current?.(null))},[]),b=(0,K.useCallback)(async()=>{let N=w.current;if(N){let W=await N.update(i);return C.current=N.stream,O.current?.(N.stream),W}let z=await(p??(0,et.sharedCaptureController)()).claim("audio",i);w.current=z,S.current=[z.onTrack((W,ee)=>{C.current=ee,O.current?.(ee),y.current&&f?.stream(n).attach(W).catch(ie=>Ot("mic re-attach after one-capture re-acquire failed",ie))}),z.onLost(W=>{w.current=null,S.current=[],C.current=null,O.current?.(null),d(!1),T.current?.(W)})],C.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]),H=(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 W=(0,et.sessionFailureFromMediaError)($,f.status);throw T.current?.(W),W}f.connect?.();let D;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(W){D=W,Ot(`start attempt ${$}/${u} failed`,W),$<u&&await new Promise(ee=>setTimeout(ee,c))}k(),d(!1);let z=D instanceof Error?D:new Error(String(D??"voice start failed"));throw T.current?.(z),z},[f,n,a,u,c,b,k,d]);(0,K.useImperativeHandle)(r,()=>({start:H,stop:_,unlock:()=>P.current?.unlock(),get active(){return y.current},get micStream(){return C.current},get audio(){return P.current}}),[H,_]);let X=(0,K.useRef)(!1),I=(0,K.useCallback)(async()=>{if(!f||!y.current||X.current)return;let N=C.current?.getAudioTracks()[0]??null;if(N&&N.readyState==="live"){try{await f.stream(n).attach(N)}catch(D){Ot("foreground mic re-assert failed (will retry on next pass)",D)}return}X.current=!0;try{let D=await b();await f.stream(n).attach(D)}catch(D){let z=D instanceof Error?D:new Error(String(D));Ot("foreground mic re-acquire failed",z),T.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)(Rt,{ref:P,session:f,stream:n,onTrack:R,onUnlockChange:h}):null}),xn=Pt;var ve=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),R=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(R),c.disconnect(),i(yr)}},[e,r,o,n]),s}var we=require("react/jsx-runtime"),Po={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},Eo={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},An=(0,ve.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,R=Re(),h=o??R,p=(0,ve.useRef)(null),[m,f]=(0,ve.useState)(null),P=(0,ve.useRef)(l);P.current=l;let{level:C,speaking:w}=Vt(a?m:null);return(0,ve.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,ve.useEffect)(()=>{!i||!h||p.current?.start().catch(()=>{})},[i,h]),(0,we.jsxs)(we.Fragment,{children:[(0,we.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,we.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(C*100)/100,children:(0,we.jsx)("span",{style:Eo,children:(0,we.jsx)("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(C*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});var tt=require("@urun-sh/core"),M=require("react");var me=require("react/jsx-runtime"),br={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function kr(...e){console.debug("[camera]",...e)}function To(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function xo(){let e=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof e?.enumerateDevices!="function")return null;try{return(await e.enumerateDevices()).filter(r=>r.kind==="videoinput")}catch{return null}}var Cr=(0,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:R,videoClassName:h,onActiveChange:p,onError:m,onStream:f,onTrack:P,children:C,capture:w,flipControl:S="auto",flipControlClassName:y,onDevices:x}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let T=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),H=(0,M.useRef)([]),X=(0,M.useRef)(null),I=(0,M.useRef)(!1),N=(0,M.useRef)(!1),D=(0,M.useRef)(T),[z,$]=(0,M.useState)(T),[W,ee]=(0,M.useState)(!1),[ie,te]=(0,M.useState)(null),[B,j]=(0,M.useState)(!1),[re]=(0,M.useState)(To),ce=(0,M.useRef)(p);ce.current=p;let ae=(0,M.useRef)(m);ae.current=m;let Me=(0,M.useRef)(f);Me.current=f;let E=(0,M.useRef)(P);E.current=P;let q=(0,M.useRef)(x);q.current=x;let A=(0,M.useCallback)(V=>{I.current!==V&&(I.current=V,ee(V),ce.current?.(V))},[]);(0,M.useEffect)(()=>{if(!W){te(null);return}let V=!1,F=()=>{xo().then(Ce=>{V||(te(Ce),Ce&&q.current?.(Ce))})};F();let Se=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof Se?.addEventListener=="function"?(Se.addEventListener("devicechange",F),()=>{V=!0,Se.removeEventListener?.("devicechange",F)}):()=>{V=!0}},[W]);let Z=(0,M.useCallback)(V=>{let F=k.current;F&&(F.muted=!0,F.defaultMuted=!0,F.setAttribute("muted",""),F.setAttribute("playsinline",""),F.setAttribute("webkit-playsinline",""),F.srcObject=V,V&&F.play()?.catch?.(Se=>kr("preview play() failed",Se)))},[]),ne=(0,M.useCallback)(()=>{N.current=!1,X.current?.(),X.current=null;for(let V of H.current)V();H.current=[],_.current?.release(),_.current=null,b.current&&(b.current=null,Me.current?.(null),E.current?.(null)),Z(null)},[Z]),ke=(0,M.useCallback)((V,F)=>{X.current?.(),b.current=F,Z(F),Me.current?.(F);let Se=()=>{b.current===F&&(kr("camera track ended (device removed or permission revoked)"),ne(),A(!1))};V.addEventListener("ended",Se),X.current=()=>V.removeEventListener("ended",Se)},[Z,ne,A]),U=(0,M.useCallback)(async V=>{let F=n!==!1;if(F&&!d)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let Se={...br,...s,facingMode:V},Ce;try{let _e=_.current;if(_e)Ce=await _e.update(Se);else{let ct=await(w??(0,tt.sharedCaptureController)()).claim("video",Se);if(_.current=ct,H.current=[ct.onTrack((lt,Zn)=>{ke(lt,Zn),I.current&&(!F||!d||d.stream(n).attachVideo(lt).then(()=>E.current?.(lt)).catch(Qn=>kr("camera re-publish after one-capture re-acquire failed",Qn)))}),ct.onLost(lt=>{_.current=null,H.current=[],ne(),A(!1),ae.current?.(lt)})],!ct.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});Ce=ct.track}}catch(_e){let $e=(0,tt.sessionFailureFromMediaError)(_e,d?.status);throw ae.current?.($e),$e}D.current=V,$(V),ke(Ce,_.current?.stream??new MediaStream([Ce]));try{F&&d&&(d.connect?.(),await d.whenLive(l!==void 0?{timeout:l}:void 0),await d.stream(n).attachVideo(Ce)),N.current=F?n:!1}catch(_e){ne(),A(!1);let $e=_e instanceof Error?_e:new Error(String(_e));throw ae.current?.($e),$e}E.current?.(Ce),A(!0)},[d,n,s,l,w,ke,ne,A]),Pe=(0,M.useCallback)(V=>U(V?.facingMode??D.current),[U]),Ee=(0,M.useCallback)(async V=>{let F=N.current===n;I.current&&D.current===V&&F||await U(V)},[U,n]),he=(0,M.useCallback)(()=>U(D.current==="environment"?"user":"environment"),[U]),be=(0,M.useCallback)(async()=>{ne(),A(!1),n!==!1&&await d?.stream(n).detachVideo().catch(()=>{})},[d,n,ne,A]),Ke=(0,M.useCallback)(async V=>{let F=k.current;if(!F)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await(0,tt.captureStillFromVideo)(F,V)},[]);(0,M.useImperativeHandle)(r,()=>({start:Pe,stop:be,flip:he,setFacingMode:Ee,capturePhoto:Ke,get active(){return I.current},get facingMode(){return D.current},get stream(){return b.current},get element(){return k.current}}),[Pe,be,he,Ee,Ke]);let ut=(0,M.useRef)(Ee);if(ut.current=Ee,(0,M.useEffect)(()=>{c&&(n!==!1&&!d||ut.current(T).catch(()=>{}))},[c,d,T,n]),(0,M.useEffect)(()=>ne,[ne]),!v)return null;let Tr=g==="auto"?z==="user":g,rr=W&&(S===!0||S==="auto"&&re&&(ie?.length??0)>1),wt=()=>{B||(j(!0),he().catch(()=>{}).finally(()=>j(!1)))};return(0,me.jsxs)("div",{className:R,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":z,children:[(0,me.jsx)("video",{ref:k,className:h,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Tr?{transform:"scaleX(-1)"}:{}}}),rr?(0,me.jsx)("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:wt,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,me.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,me.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,me.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,me.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,me.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,me.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,C]})}),Un=(0,M.forwardRef)(function({preview:t=!0,...r},o){return(0,me.jsx)(Cr,{ref:o,...r,visible:t,autoStart:!1})});var rt=require("@urun-sh/core"),Q=require("react");function Mn(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=(0,Q.useState)(null),[a,u]=(0,Q.useState)(null),[c,g]=(0,Q.useState)(!1),[l,v]=(0,Q.useState)(null),[R]=(0,Q.useState)(rt.cameraCaptureAvailable),h=(0,Q.useRef)(n);h.current=n;let p=(0,Q.useRef)(null),m=(0,Q.useRef)(0),f=(0,Q.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,Q.useEffect)(()=>()=>{m.current++,p.current&&URL.revokeObjectURL(p.current),p.current=null},[]);let P=(0,Q.useCallback)(async y=>{let x=++m.current;g(!0),v(null);try{let T=await y();if(m.current!==x)return;f(T)}catch(T){if(m.current!==x)return;v((0,rt.referenceImageErrorMessage)(T))}finally{m.current===x&&g(!1)}},[f]),C=(0,Q.useCallback)(y=>P(()=>(0,rt.normalizeReferenceImage)(y,{maxSize:t,type:r,quality:o,source:"file"})),[P,t,r,o]),w=(0,Q.useCallback)(y=>P(()=>y.capturePhoto({maxSize:t,type:r,quality:o})),[P,t,r,o]),S=(0,Q.useCallback)(()=>{m.current++,v(null),g(!1),f(null)},[f]);return{reference:s,previewUrl:a,pick:C,capture:w,clear:S,busy:c,error:l,cameraAvailable:R}}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 Ie=200;function Ae(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=>Ae(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}var ye=require("react/jsx-runtime");function Dn({session:e,name:t,cap:r,className:o}){let n=jt(e,t,{cap:r});return(0,ye.jsxs)("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[(0,ye.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,ye.jsx)("code",{children:t}),(0,ye.jsxs)("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),(0,ye.jsx)("div",{className:"urun-stream-tail-log",children:n.length===0?(0,ye.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,ye.jsx)("code",{children:t})," messages\u2026"]}):n.map((s,i)=>(0,ye.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,ye.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",ot(s.payload)]},`${s.at}-${i}`))})]})}var Et=require("react");var pe=require("react/jsx-runtime");function Tt({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=(0,Et.useState)(""),[i,a]=(0,Et.useState)(null),u=(0,Et.useCallback)(()=>{let c=Wt(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return(0,pe.jsxs)("div",{className:"urun-doc-patch",children:[(0,pe.jsx)("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),(0,pe.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,pe.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?(0,pe.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,pe.jsxs)("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[(0,pe.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,pe.jsx)("code",{children:t}),(0,pe.jsx)("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),(0,pe.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?(0,pe.jsx)(Tt,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}var Kt=require("react");var Ue=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=>Ae(u,{at:Date.now(),direction:"in",text:Fn(ot(a))},r))}):void 0),[e,t,r]),(0,Ue.jsxs)("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[(0,Ue.jsx)(Tt,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>Ae(u,{at:Date.now(),direction:"out",text:Fn(a)},r))}}),(0,Ue.jsx)("div",{className:"urun-control-sender-log",children:n.length===0?(0,Ue.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>(0,Ue.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,Ue.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,Ue.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(R=>Ae(R,{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",R=>c("track",`${l}: ${R?"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 fe(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=fe(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 Le=require("react/jsx-runtime");function Xt({session:e,render:t,className:r}){let o=Jt(e);return!o.waking||!o.phase?null:(0,Le.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,Le.jsxs)(Le.Fragment,{children:[(0,Le.jsx)("span",{className:"urun-session-waking-label",children:(0,Bn.describeSessionPhase)(o.phase)})," ",(0,Le.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}var Yt=require("react");var Oe=require("react"),Ao={event:null,elapsedMs:0};function Gt(e,t){let[r,o]=(0,Oe.useState)(null),n=(0,Oe.useRef)(0);(0,Oe.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,Oe.useState)(0);return(0,Oe.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 ge=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=fe(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,ge.jsxs)("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[(0,ge.jsx)("span",{className:"urun-session-status-dot","data-phase":o}),(0,ge.jsx)("span",{className:"urun-session-status-label",children:_o[o]}),n?(0,ge.jsx)("span",{className:"urun-session-status-detail",children:n}):null]})}function Kn({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=fe(e);if(s?.name==="live")return(0,ge.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,(0,ge.jsx)(Zt,{session:e})]});let i=r?r(s):(0,ge.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,ge.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,ge.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?(0,ge.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 Rr(e){return fe(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=Rr(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 xt=require("react/jsx-runtime"),Io=new Set(["expired","ended","error"]);function Jn({session:e,onNewSession:t,children:r,className:o}){let n=fe(e);if(!n||!Io.has(n.name))return null;let s=r?r(n):(0,xt.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,xt.jsxs)("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?(0,xt.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}var De=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 Er(e){let t=(0,De.useMemo)(()=>e?e.doc("control"):null,[e]),[r,o]=(0,De.useState)(()=>t?Pr(t.get("idle")):null);return(0,De.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=Er(e),n=o?.deadlineEpochS??null,[s,i]=(0,De.useState)(null);if((0,De.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,R=()=>{(0,Gn.prewake)({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:g,authProvider:l}).then(p=>{v||o(p)}).catch(()=>{})};R();let h=setInterval(R,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 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};
2
+ import{a as nn,b as on,c as ht}from"./chunk-WF2OBDSX.mjs";import{useCallback as Sn,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 Te=un(null);function ke(e){return e&&e.trim()?e.trim():void 0}function ge(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=ge("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||ge("VERCEL_ENV")==="production"?"workos":ge("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 St(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 hn}from"react";function vt(e=!0){hn(()=>{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 Pn}from"react/jsx-runtime";var kn="/api/urun-token",bn=1e4;function Cn(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 Rn(e,t){return typeof e=="function"?e(t):e!==void 0?e:Pn("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 En({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:R}){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">.`);vt(g);let[m,f]=yt(),[E,C]=yt(null),x=rr(void 0),S=rr(null),[y,T]=yt(null);St(W=>T({jwt:W}));let w=ht(),I=ge("NEXT_PUBLIC_SESSION_TOKEN")??ge("NEXT_PUBLIC_URUN_JWT"),d=Ge(),k=y!==null,b=d==="workos"&&!n&&!k&&!h,M=n??(d==="jwt"?I:void 0)??m?.token,F=k?y.jwt:M,K=s??ge("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),N=b&&!F&&!w?.getAccessToken,_=t??m?.orgId,L=e??m?.gatewayUrl,j=h&&m===void 0,B=h&&m!==void 0&&!L?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,q=N?new Error('[urun] <UrunProvider> resolved authMode()="workos" but no auth context is mounted: there is no <UrunWorkOSProvider> (or <UrunAuthProvider>) ancestor supplying getAccessToken, and no jwt prop was passed, so no session token can be obtained. Note NEXT_PUBLIC_SESSION_TOKEN and NEXT_PUBLIC_URUN_JWT are IGNORED in workos mode, so setting them will not help. Either mount UrunWorkOSProvider from @urun-sh/react/next-workos, or select jwt mode with NEXT_PUBLIC_AUTH_MODE=jwt (or NEXT_PUBLIC_AUTH_ENABLED=false) and supply a token.'):null,z=E??B??q,Y=u??kn,J=Sn(async W=>{if(!W?.forceRefresh){let ee=x.current;if(!ee)return ee;let Z=Cn(ee);if(Z===null||Z-Date.now()>bn)return ee}return(await(S.current??(S.current=(async()=>{try{let ee=await nr(Y);return x.current=ee.token,f(ee),ee}finally{S.current=null}})()))).token},[Y]),H=yn(()=>({appId:p,baseUrl:L??"",orgId:_??"",jwt:F,getAccessToken:b?w?.getAccessToken:h&&!k?J:void 0,authProvider:K,eventsUrl:i,sessionKey:a,releaseOnLeave:c,priority:k?"preempt":void 0}),[p,w,L,K,F,i,_,a,c,b,k,h,J]);return vn(()=>{if(!h)return;let W=new AbortController;return C(null),(async()=>{try{let X=await nr(Y,W.signal);x.current=X.token,f(X)}catch(X){if(W.signal.aborted)return;C(X instanceof Error?X:new Error(String(X)))}})(),()=>W.abort()},[h,Y]),Fe(Ve,{fallback:l,children:z?Rn(v,z):j?Fe("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Fe(Te.Provider,{value:H,children:R})})}import{useContext as wn,useEffect as Tn,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()})}onConnectionState(t){return this._doc.onConnectionState?this._doc.onConnectionState(r=>{t(r),this._notify()}):(t({connected:!0,consecutiveFailures:0,lastCloseCode:null,lastCloseReason:null}),()=>{})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},Ct=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()}},Rt=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 Ct(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=wn(Te);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 Tn(()=>{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),R=r.current.get(v);if(R&&!R.disposed)return R;let h=Mn(e,u,l),p=be.get(h);return p?.handle.disposed&&(p.disposeTimer&&clearTimeout(p.disposeTimer),be.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 Rt(s[u](l),t,e.eventsUrl),refCount:0,disposeTimer:null},be.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])}import{useCallback as Et,useEffect as Nn,useMemo as In,useRef as Ye,useState as Pt}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]=Pt(void 0),[s,i]=Pt(null),[a,u]=Pt(!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 R=Et(async m=>{l.current?.abort();let f=new AbortController;l.current=f;let E=++g.current,C=()=>v.current&&g.current===E;C()&&(u(!0),i(null));try{let x=await r.request(m,{...c.current,signal:f.signal});return C()&&(n(x),u(!1),c.current?.onSuccess?.(x)),x}catch(x){let S=Ln(x);throw C()&&(i(S),u(!1),c.current?.onError?.(S)),S}},[r]),h=Et(m=>{R(m).catch(()=>{})},[R]),p=Et(()=>{g.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:h,mutateAsync:R,data:o,error:s,isPending:a,reset:p}}import{useCallback as sr,useEffect as Dn,useMemo as Vn,useRef as Ze,useState as wt}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]=wt(""),[s,i]=wt(!1),[a,u]=wt(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 R=sr(()=>{g.current++,l.current?.cancel(),l.current=null,v.current&&i(!1)},[]),h=sr(async p=>{l.current?.cancel();let m=++g.current,f=()=>v.current&&g.current===m,E=c.current,C=E?.parseChunk??Fn,x=E?.buildPayload??(b=>({prompt:b}));f()&&(n(""),u(null),i(!0));let{parseChunk:S,buildPayload:y,onFinish:T,onError:w,...I}=E??{},d="",k;try{k=r.requestStream(x(p),I),l.current=k}catch(b){let M=ir(b);f()&&(u(M),i(!1),E?.onError?.(M));return}try{for await(let b of k){if(g.current!==m)break;d+=C(b),f()&&n(d)}f()&&(i(!1),E?.onFinish?.(d))}catch(b){let M=ir(b);f()&&(u(M),i(!1),E?.onError?.(M))}finally{l.current===k&&(l.current=null)}},[r]);return{completion:o,complete:h,stop:R,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 Tt(e){return cr+=1,`${e}-${cr}`}function jn(e,t){let r=Wn(()=>xe(e),[e]),[o,n]=Qe(()=>(t?.initialMessages??[]).map(C=>({id:C.id??Tt("msg"),role:C.role,content:C.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 R=Ae(s);R.current=s;let h=Ae(0),p=Ae(null),m=Ae(!0);Hn(()=>(m.current=!0,()=>{m.current=!1,p.current?.cancel(),p.current=null}),[]);let f=ar(()=>{h.current++,p.current?.cancel(),p.current=null,m.current&&u(!1)},[]),E=ar(async C=>{let x=C===void 0,S=(x?R.current:C)??"";if(!S.trim())return;p.current?.cancel();let T=++h.current,w=()=>m.current&&h.current===T,I=l.current,d=I?.parseChunk??Bn,k={id:Tt("msg"),role:"user",content:S},b={id:Tt("msg"),role:"assistant",content:""},M=[...v.current,k].map(H=>({role:H.role,content:H.content})),F=[...v.current,k,b];v.current=F,n(F),x&&i(""),g(null),u(!0);let K=I?.buildPayload??(H=>({messages:H})),{initialMessages:N,parseChunk:_,buildPayload:L,onFinish:j,onError:B,...q}=I??{},z=H=>{n(W=>W.map(X=>X.id===b.id?{...X,content:H}:X))},Y="",J;try{J=r.requestStream(K(M),q),p.current=J}catch(H){let W=ur(H);w()&&(g(W),u(!1),I?.onError?.(W));return}try{for await(let H of J){if(h.current!==T)break;Y+=d(H),w()&&z(Y)}w()&&(u(!1),I?.onFinish?.({...b,content:Y}))}catch(H){let W=ur(H);w()&&(g(W),u(!1),I?.onError?.(W))}finally{p.current===J&&(p.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:E,stop:f,isStreaming:a,error:c}}import{useCallback as he,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:(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),[g,l]=pr(xt),v=dr(!1);lr(()=>{if(i)return()=>i.dispose()},[i]);let R=he(()=>{let S=a.current;l(S?S.heldKeys():xt)},[]),h=he(()=>{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),h())},T=b=>{S()&&(a.current?.keyDown(b.key),R())},w=b=>{a.current?.keyUp(b.key),R()},I=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",w),n.addEventListener("mousemove",I),n.addEventListener("mousedown",d),n.addEventListener("mouseup",d),n.defaultView?.addEventListener("blur",k),()=>{n.removeEventListener("pointerlockchange",y),n.removeEventListener("keydown",T),n.removeEventListener("keyup",w),n.removeEventListener("mousemove",I),n.removeEventListener("mousedown",d),n.removeEventListener("mouseup",d),n.defaultView?.removeEventListener("blur",k)}},[n,h,R]);let p=he(S=>{S.requestPointerLock?.()},[]),m=he(()=>{v.current=!0,c(!0)},[]),f=he(()=>{v.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),h()},[n,h]),E=he(S=>{a.current?.keyDown(S),R()},[R]),C=he(S=>{a.current?.keyUp(S),R()},[R]),x=he((S,y)=>{a.current?.movePointer(S,y)},[]);return{engage:p,engageTouch:m,release:f,engaged:u,heldKeys:g,pressKey:E,releaseKey:C,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 ne,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 ue(){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 hr(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 Sr(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:R,poster:h,children:p,onTrack:m,onFirstFrame:f,frameMarker:E,onFrameMarkerReached:C,onFrameMarkerUnsupported:x}=t,S=ue(),y=o??S,T=ne(null),w=ne(null),[I,d]=fr(!1),[k,b]=fr(!1),M=ne(!1),F=ne(m);F.current=m;let K=ne(f);K.current=f;let N=ne(C);N.current=C;let _=ne(x);_.current=x;let L=ne(E??null);L.current=E??null;let j=ne(null),B=ne(null),q=Ue((P,V=!1)=>{if(!V&&P===j.current||(j.current=P,B.current?.(),B.current=null,M.current=!1,b(!1),!P))return;let A=T.current;if(!A)return;let $=L.current,G=$?.rtpTimestamp??null,se=!1,U=()=>{se||(se=!0,_.current?.())};$&&G==null&&U();let le=$!=null&&G!=null,de=ie=>{B.current?.(),B.current=null,M.current=!0,b(!0),K.current?.(),ie&&N.current?.()};if(typeof A.requestVideoFrameCallback=="function"){let ie=!1,Pe=0,Le=(Gt,gt)=>{if(!ie){if(le){let Xe=gt?.rtpTimestamp;if(typeof Xe!="number"){U(),de(!1);return}if(!no(Xe,G)){Pe=A.requestVideoFrameCallback(Le);return}de(!0);return}de(!1)}};Pe=A.requestVideoFrameCallback(Le),B.current=()=>{ie=!0,A.cancelVideoFrameCallback?.(Pe)};return}le&&U();let te=()=>{let ie=A.getVideoPlaybackQuality?.();(ie?ie.totalVideoFrames>0:A.readyState>=2&&A.videoWidth>0)&&de(!1)};A.addEventListener("loadeddata",te),A.addEventListener("timeupdate",te),A.addEventListener("playing",te),B.current=()=>{A.removeEventListener("loadeddata",te),A.removeEventListener("timeupdate",te),A.removeEventListener("playing",te)},te()},[]);qe(()=>()=>{B.current?.(),B.current=null},[]);let z=E==null?null:`${E.rtpTimestamp??""}|${E.ptsMs??""}`,Y=ne(z);qe(()=>{if(Y.current===z||(Y.current=z,z==null))return;let P=j.current;P&&q(P,!0)},[z,q]);let J=Ue(()=>{if(typeof MediaStream>"u")return null;w.current||(w.current=new MediaStream);let P=T.current;return P&&P.srcObject!==w.current&&(P.srcObject=w.current),w.current},[]),H=Ue(P=>{let V=T.current;if(!V)return;let A=V.play();!A||typeof A.catch!="function"||A.catch($=>oo(`play() failed (${P})`,$))},[]),W=Ue(P=>{let V=J();if(V){for(let A of V.getVideoTracks())A!==P&&V.removeTrack(A);if(P&&!V.getVideoTracks().includes(P)){V.addTrack(P);let A=T.current;A&&(A.srcObject=V)}P&&H("track-attach"),d(P!==null),q(P),F.current?.(P)}},[J,H,q]),X=Ue(P=>{let V=J();if(V){for(let A of V.getAudioTracks())A!==P&&V.removeTrack(A);P&&!V.getAudioTracks().includes(P)&&V.addTrack(P),P&&H("audio-attach")}},[J,H]),ee=Ue(P=>{T.current=P,P&&(a&&(P.muted=!0,P.defaultMuted=!0,P.setAttribute("muted","")),P.setAttribute("playsinline",""),P.setAttribute("webkit-playsinline",""),J())},[J,a]);to(r,()=>({get element(){return T.current},get live(){return w.current?w.current.getVideoTracks().length>0:!1},get framed(){return M.current}}),[]);let Z=ro(n)!==void 0;qe(()=>{Z&&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.`)},[Z,n]);let me=i!==void 0;return qe(()=>{if(me){W(i??null);return}if(Z){W(null);return}if(!y)return;let P=hr(y,Sr(n,"video")),V=()=>{let U=w.current;return U?U.getVideoTracks()[0]??null:null},A=U=>{if(U!==V()&&(W(U),U)){let le=()=>{V()===U&&W(null)};U.addEventListener("ended",le)}},$=P.track;$&&$.readyState==="live"&&A($);let G=P.on("track",U=>{U&&U.readyState!=="live"||A(U)}),se=setInterval(()=>{let U=P.track;U&&U.readyState==="live"&&A(U)},gr);return()=>{G(),clearInterval(se)}},[y,n,Z,me,i,W]),qe(()=>{if(me||!y||s===!1||Z)return;let P=hr(y,Sr(n,"audio",s)),V=()=>{let U=w.current;return U?U.getAudioTracks()[0]??null:null},A=U=>{if(U!==V()&&(X(U),U)){let le=()=>{V()===U&&X(null)};U.addEventListener("ended",le)}},$=P.track;$&&$.readyState==="live"&&A($);let G=P.on("track",U=>{U&&U.readyState!=="live"||A(U)}),se=setInterval(()=>{let U=P.track;U&&U.readyState==="live"&&A(U)},gr);return()=>{G(),clearInterval(se)}},[y,n,Z,s,me,X]),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:ee,className:v,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),I?null:R,h===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:h}),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),R=et(null),h=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 R.current},warp:m,get lastDrawTs(){return h.current}}),[m]),yr(()=>{if(!i)return;let f=0,E=0,C=null,x=y=>{typeof y.requestVideoFrameCallback=="function"&&(C=y,E=y.requestVideoFrameCallback(function T(){m.frameArrived(),E=y.requestVideoFrameCallback(T)}))},S=y=>{f=requestAnimationFrame(S);let T=R.current,w=v.current?.element??null;if(!T||!w||(w!==C&&(C&&E&&C.cancelVideoFrameCallback?.(E),x(w)),w.readyState<2))return;m.tick(y);let I=typeof devicePixelRatio=="number"?devicePixelRatio:1,d=Math.max(1,Math.round(T.clientWidth*I)),k=Math.max(1,Math.round(T.clientHeight*I));(T.width!==d||T.height!==k)&&(T.width=d,T.height=k);let b=T.getContext("2d");if(!b)return;let M=m.transform(),F=w.videoWidth||d,K=w.videoHeight||k,_=Math.max(d/F,k/K)*(1+a)*M.scale;b.setTransform(_,0,0,_,d/2+M.translateX*d,k/2+M.translateY*k),b.drawImage(w,-F/2,-K/2),h.current=y};return f=requestAnimationFrame(S),()=>{cancelAnimationFrame(f),C&&E&&C.cancelVideoFrameCallback?.(E)}},[i,a,m]),yr(()=>{if(!i||!u||!l)return;let f=()=>!!l.pointerLockElement,E=T=>{f()&&m.keyDown(T.key)},C=T=>m.keyUp(T.key),x=T=>{f()&&m.pointerDelta(T.movementX,T.movementY)},S=()=>{f()||m.clearKeys()},y=()=>m.clearKeys();return l.addEventListener("keydown",E),l.addEventListener("keyup",C),l.addEventListener("mousemove",x),l.addEventListener("pointerlockchange",S),l.defaultView?.addEventListener("blur",y),()=>{l.removeEventListener("keydown",E),l.removeEventListener("keyup",C),l.removeEventListener("mousemove",x),l.removeEventListener("pointerlockchange",S),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:R,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 Cr(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 ho,jsx as tt}from"react/jsx-runtime";function go({name:e,props:t,fallback:r}){let o=Cr(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?tt(ho,{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 Rr}from"react/jsx-runtime";var So=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 Er(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}=Er(e);return Rr("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}%`}})}),Rr("div",{className:"urun-progress-text",children:[t,"/",r]})]})}import{z as Mt}from"zod";import{jsx as Pr,jsxs as Co}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 wr(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}=wr(e);return Co("span",{className:"urun-status-badge","data-state":t,children:[Pr("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),Pr("span",{className:"urun-status-message",children:r})]})}import{useRef as Tr,useEffect as Ro}from"react";import{z as _t}from"zod";import{jsx as xr,jsxs as wo}from"react/jsx-runtime";var Eo=_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 Po(e){let{text:t,streaming:r}=Ar(e),o=Tr(null),n=Tr(0);return Ro(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),wo("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 To=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=ue(),v=o??l,R=Ne(null),h=Ne(null),p=Ne(null),m=Ne(null),f=Ne(u);f.current=u;let E=Ne(c);E.current=c;let C=_e(d=>{p.current!==d&&(p.current=d,E.current?.(d))},[]),x=_e(()=>{if(typeof MediaStream>"u")return null;h.current||(h.current=new MediaStream);let d=R.current;return d&&d.srcObject!==h.current&&(d.srcObject=h.current),h.current},[]),S=_e(d=>{let k=R.current;if(!k)return;let b=k.play();!b||typeof b.then!="function"||b.then(()=>{k.muted||C(!0)}).catch(M=>{let F=M instanceof Error?M.name:String(M);if(F==="AbortError"){Lt(`play() aborted (${d}); retrying in ${Nr}ms`),m.current&&clearTimeout(m.current),m.current=setTimeout(()=>{m.current=null,S(`${d}:retry`)},Nr);return}if(F==="NotAllowedError"){Lt(`play() blocked pending a user gesture (${d})`),C(!1);return}Lt(`play() failed (${d})`,M)})},[C]),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&&S("track-attach"),f.current?.(d)}},[x,S]),T=_e(()=>{let d=R.current;d&&(x(),d.muted=!1,S("gesture"),st(),C(!0))},[x,S,C]);Vo(r,()=>({unlock:T,get unlocked(){return p.current===!0},get element(){return R.current}}),[T]);let w=_e(d=>{R.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=h.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 F=d.on("track",N=>{N&&N.readyState!=="live"||b(N)}),K=setInterval(()=>{let N=d.track;N&&N.readyState==="live"&&b(N)},qo);return()=>{F(),clearInterval(K)}},[v,n,I,s,y]),It(()=>Fo(()=>{st(),p.current===!0&&S("foreground")}),[S]),It(()=>()=>{m.current&&clearTimeout(m.current)},[]),Wo("audio",{ref:w,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 pe}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:R,onUnlockChange:h,capture:p}=t,m=ue(),f=o??m,E=pe(null),C=pe(null),x=pe(null),S=pe([]),y=pe(!1),T=pe(g);T.current=g;let w=pe(l);w.current=l;let I=pe(v);I.current=v;let d=Ie(_=>{y.current!==_&&(y.current=_,T.current?.(_))},[]),k=Ie(()=>{for(let _ of S.current)_();S.current=[],x.current?.release(),x.current=null,C.current&&(C.current=null,I.current?.(null))},[]),b=Ie(async()=>{let _=x.current;if(_){let q=await _.update(i);return C.current=_.stream,I.current?.(_.stream),q}let j=await(p??zo()).claim("audio",i);x.current=j,S.current=[j.onTrack((q,z)=>{C.current=z,I.current?.(z),y.current&&f?.stream(n).attach(q).catch(Y=>at("mic re-attach after one-capture re-acquire failed",Y))}),j.onLost(q=>{x.current=null,S.current=[],C.current=null,I.current?.(null),d(!1),w.current?.(q)})],C.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]),F=Ie(async()=>{if(!f)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");E.current?.unlock();let _;try{_=await b()}catch(B){k();let q=$o(B,f.status);throw w.current?.(q),q}f.connect?.();let L;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(q){L=q,at(`start attempt ${B}/${u} failed`,q),B<u&&await new Promise(z=>setTimeout(z,c))}k(),d(!1);let j=L instanceof Error?L:new Error(String(L??"voice start failed"));throw w.current?.(j),j},[f,n,a,u,c,b,k,d]);jo(r,()=>({start:F,stop:M,unlock:()=>E.current?.unlock(),get active(){return y.current},get micStream(){return C.current},get audio(){return E.current}}),[F,M]);let K=pe(!1),N=Ie(async()=>{if(!f||!y.current||K.current)return;let _=C.current?.getAudioTracks()[0]??null;if(_&&_.readyState==="live"){try{await f.stream(n).attach(_)}catch(L){at("foreground mic re-assert failed (will retry on next pass)",L)}return}K.current=!0;try{let L=await b();await f.stream(n).attach(L)}catch(L){let j=L instanceof Error?L:new Error(String(L));at("foreground mic re-acquire failed",j),w.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:E,session:f,stream:n,onTrack:R,onUnlockChange:h}):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),R=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(R),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,R=ue(),h=o??R,p=Or(null),[m,f]=ts(null),E=Or(l);E.current=l;let{level:C,speaking:x}=Dt(a?m:null);return es(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}}),[]),Qo(()=>{!i||!h||p.current?.start().catch(()=>{})},[i,h]),is(ss,{children:[ct(ut,{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),E.current?.(S)}}),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(C*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(C*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 ce,useEffect as Vt,useImperativeHandle as ls,useRef as Q,useState as We}from"react";import{jsx as ve,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:R,videoClassName:h,onActiveChange:p,onError:m,onStream:f,onTrack:E,children:C,capture:x,flipControl:S="auto",flipControlClassName:y,onDevices:T}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let w=i?"user":a?"environment":u??"environment",I=ue(),d=o??I,k=Q(null),b=Q(null),M=Q(null),F=Q([]),K=Q(null),N=Q(!1),_=Q(!1),L=Q(w),[j,B]=We(w),[q,z]=We(!1),[Y,J]=We(null),[H,W]=We(!1),[X]=We(ds),ee=Q(p);ee.current=p;let Z=Q(m);Z.current=m;let me=Q(f);me.current=f;let P=Q(E);P.current=E;let V=Q(T);V.current=T;let A=ce(O=>{N.current!==O&&(N.current=O,z(O),ee.current?.(O))},[]);Vt(()=>{if(!q){J(null);return}let O=!1,D=()=>{ps().then(ae=>{O||(J(ae),ae&&V.current?.(ae))})};D();let re=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof re?.addEventListener=="function"?(re.addEventListener("devicechange",D),()=>{O=!0,re.removeEventListener?.("devicechange",D)}):()=>{O=!0}},[q]);let $=ce(O=>{let D=k.current;D&&(D.muted=!0,D.defaultMuted=!0,D.setAttribute("muted",""),D.setAttribute("playsinline",""),D.setAttribute("webkit-playsinline",""),D.srcObject=O,O&&D.play()?.catch?.(re=>Ft("preview play() failed",re)))},[]),G=ce(()=>{_.current=!1,K.current?.(),K.current=null;for(let O of F.current)O();F.current=[],M.current?.release(),M.current=null,b.current&&(b.current=null,me.current?.(null),P.current?.(null)),$(null)},[$]),se=ce((O,D)=>{K.current?.(),b.current=D,$(D),me.current?.(D);let re=()=>{b.current===D&&(Ft("camera track ended (device removed or permission revoked)"),G(),A(!1))};O.addEventListener("ended",re),K.current=()=>O.removeEventListener("ended",re)},[$,G,A]),U=ce(async O=>{let D=n!==!1;if(D&&!d)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let re={...Fr,...s,facingMode:O},ae;try{let fe=M.current;if(fe)ae=await fe.update(re);else{let Oe=await(x??cs()).claim("video",re);if(M.current=Oe,F.current=[Oe.onTrack((De,tn)=>{se(De,tn),N.current&&(!D||!d||d.stream(n).attachVideo(De).then(()=>P.current?.(De)).catch(rn=>Ft("camera re-publish after one-capture re-acquire failed",rn)))}),Oe.onLost(De=>{M.current=null,F.current=[],G(),A(!1),Z.current?.(De)})],!Oe.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});ae=Oe.track}}catch(fe){let we=us(fe,d?.status);throw Z.current?.(we),we}L.current=O,B(O),se(ae,M.current?.stream??new MediaStream([ae]));try{D&&d&&(d.connect?.(),await d.whenLive(l!==void 0?{timeout:l}:void 0),await d.stream(n).attachVideo(ae)),_.current=D?n:!1}catch(fe){G(),A(!1);let we=fe instanceof Error?fe:new Error(String(fe));throw Z.current?.(we),we}P.current?.(ae),A(!0)},[d,n,s,l,x,se,G,A]),le=ce(O=>U(O?.facingMode??L.current),[U]),de=ce(async O=>{let D=_.current===n;N.current&&L.current===O&&D||await U(O)},[U,n]),te=ce(()=>U(L.current==="environment"?"user":"environment"),[U]),ie=ce(async()=>{G(),A(!1),n!==!1&&await d?.stream(n).detachVideo().catch(()=>{})},[d,n,G,A]),Pe=ce(async O=>{let D=k.current;if(!D)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await as(D,O)},[]);ls(r,()=>({start:le,stop:ie,flip:te,setFacingMode:de,capturePhoto:Pe,get active(){return N.current},get facingMode(){return L.current},get stream(){return b.current},get element(){return k.current}}),[le,ie,te,de,Pe]);let Le=Q(de);if(Le.current=de,Vt(()=>{c&&(n!==!1&&!d||Le.current(w).catch(()=>{}))},[c,d,w,n]),Vt(()=>G,[G]),!v)return null;let Gt=g==="auto"?j==="user":g,gt=q&&(S===!0||S==="auto"&&X&&(Y?.length??0)>1),Xe=()=>{H||(W(!0),te().catch(()=>{}).finally(()=>W(!1)))};return Dr("div",{className:R,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":j,children:[ve("video",{ref:k,className:h,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Gt?{transform:"scaleX(-1)"}:{}}}),gt?ve("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Xe,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: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:[ve("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),ve("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),ve("path",{d:"M14.5 10.5v1.6h-1.6"}),ve("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),ve("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,C]})}),ms=Vr(function({preview:t=!0,...r},o){return ve(qr,{ref:o,...r,visible:t,autoStart:!1})});import{cameraCaptureAvailable as fs,normalizeReferenceImage as gs,referenceImageErrorMessage as hs}from"@urun-sh/core";import{useCallback as Be,useEffect as Ss,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),[R]=je(fs),h=qt(n);h.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),h.current?.(y)},[]);Ss(()=>()=>{m.current++,p.current&&URL.revokeObjectURL(p.current),p.current=null},[]);let E=Be(async y=>{let T=++m.current;g(!0),v(null);try{let w=await y();if(m.current!==T)return;f(w)}catch(w){if(m.current!==T)return;v(hs(w))}finally{m.current===T&&g(!1)}},[f]),C=Be(y=>E(()=>gs(y,{maxSize:t,type:r,quality:o,source:"file"})),[E,t,r,o]),x=Be(y=>E(()=>y.capturePhoto({maxSize:t,type:r,quality:o})),[E,t,r,o]),S=Be(()=>{m.current++,v(null),g(!1),f(null)},[f]);return{reference:s,previewUrl:a,pick:C,capture:x,clear:S,busy:c,error:l,cameraAvailable:R}}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 Ts}from"react";import{useEffect as Ps,useMemo as ws}from"react";import{createStore as Cs}from"zustand/vanilla";import{useStore as Rs}from"zustand";var Es=()=>{};function Ht(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=Cs(()=>({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):Es,u=(c=>Rs(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=ws(()=>Ht(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return Ps(()=>r.bind(),[r]),r}function xs(e,t,r){let n=Ke(e,t)(r??(a=>a)),s=Ts(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 Ce=200;function ye(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=>ye(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 Re,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:[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 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:[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 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=>ye(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=>ye(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(R=>ye(R,{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",R=>c("track",`${l}: ${R?"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 oe(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=oe(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 Ee,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=oe(e),o=r?.name??"idle",n=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return Jt("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[Ee("span",{className:"urun-session-status-dot","data-phase":o}),Ee("span",{className:"urun-session-status-label",children:ni[o]}),n?Ee("span",{className:"urun-session-status-detail",children:n}):null]})}function si({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=oe(e);if(s?.name==="live")return Jt("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,Ee(zt,{session:e})]});let i=r?r(s):Ee("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&ri(s.name)?Ee(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?Ee("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 oe(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=oe(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 Si}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 hi({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:Si("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 Ci(e){let t=vi(Te),[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,R=()=>{bi({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:g,authProvider:l}).then(p=>{v||o(p)}).catch(()=>{})};R();let h=setInterval(R,Math.max(1,i)*1e3);return()=>{v=!0,clearInterval(h)}},[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,Ce as DEFAULT_LOG_CAP,Lr as DEFAULT_VOICE_CONSTRAINTS,pt as DocPatchForm,Io as Image,xo as ImageFrame,To 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,So as ProgressCardSchema,po as ReprojectedVideo,Yn as Session,bo as StatusBadge,yo as StatusBadgeSchema,Po as TextStream,Eo 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,hi as UrunIdleWarning,on as UrunJwtProvider,En 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,ye as pushCapped,tr as readOperatorToken,fo as registerComponent,st as resumeUrunAudioContext,ge 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,St as useOperatorOverride,Er as useProgressCard,vs as useReferenceImage,On as useRequest,Zn as useSession,xs as useSessionDoc,Gr as useSessionEndsAt,en as useSessionIdle,oe as useSessionPhase,bs as useSessionTrack,jt as useSessionWake,wr as useStatusBadge,Bt as useStreamMessages,Ar as useTextStream,Dt as useUrunAudioLevel,ht as useUrunAuth,Ci 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.45",
3
+ "version": "0.2.47",
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.45",
56
+ "@urun-sh/core": "^0.2.47",
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",