@urun-sh/react 0.2.40 → 0.2.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client"
|
|
2
|
-
"use strict";var nr=Object.defineProperty;var Yn=Object.getOwnPropertyDescriptor;var Zn=Object.getOwnPropertyNames;var Qn=Object.prototype.hasOwnProperty;var eo=(e,t)=>{for(var r in t)nr(e,r,{get:t[r],enumerable:!0})},to=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Zn(t))!Qn.call(e,n)&&n!==r&&nr(e,n,{get:()=>t[n],enumerable:!(o=Yn(t,n))||o.enumerable});return e};var ro=e=>to(nr({},"__esModule",{value:!0}),e);var No={};eo(No,{Audio:()=>Rt,Camera:()=>Rr,ComponentRenderer:()=>on,DEFAULT_CAMERA_CONSTRAINTS:()=>br,DEFAULT_LOG_CAP:()=>_e,DEFAULT_VOICE_CONSTRAINTS:()=>vr,DocPatchForm:()=>xt,Image:()=>Sn,ImageFrame:()=>mn,ImageFrameSchema:()=>pn,MetricsPanel:()=>gn,MetricsPanelSchema:()=>fn,Mic:()=>xn,OPERATOR_CHORD_LABEL:()=>Lr,OPERATOR_TOKEN_STORAGE_KEY:()=>Nr,ProgressCard:()=>an,ProgressCardSchema:()=>sn,ReprojectedVideo:()=>en,Session:()=>Xr,StatusBadge:()=>cn,StatusBadgeSchema:()=>un,TextStream:()=>dn,TextStreamSchema:()=>ln,UrunActivationOverlay:()=>Yt,UrunAudio:()=>bn,UrunAuthProvider:()=>or,UrunCamera:()=>En,UrunControlSender:()=>On,UrunDocPanel:()=>In,UrunErrorBoundary:()=>$e,UrunEventSpine:()=>Dn,UrunIdleWarning:()=>Kn,UrunJwtProvider:()=>Ur,UrunProvider:()=>Fr,UrunSessionClock:()=>Wn,UrunSessionEnded:()=>jn,UrunSessionGate:()=>Hn,UrunSessionStatus:()=>qn,UrunSessionWaking:()=>Jt,UrunStreamTail:()=>Nn,UrunVoice:()=>Cn,Video:()=>Fe,Voice:()=>Ct,authMode:()=>dt,createDocStore:()=>Ft,describeSessionPhase:()=>er.describeSessionPhase,formatPayload:()=>nt,getUrunAudioContext:()=>kt,isWakingPhase:()=>er.isWakingPhase,parseJsonObject:()=>Ht,pushCapped:()=>Te,readOperatorToken:()=>sr,registerComponent:()=>rn,resumeUrunAudioContext:()=>bt,urunPublicEnv:()=>xe,useActivation:()=>Xt,useApp:()=>Hr,useChat:()=>zr,useCompletion:()=>jr,useConfirmOnLeave:()=>Mt,useDocStore:()=>rt,useImageFrame:()=>gr,useInputPresence:()=>Jr,useMetricsPanel:()=>hr,useOperatorOverride:()=>Ut,useProgressCard:()=>pr,useReferenceImage:()=>wn,useRequest:()=>Wr,useSession:()=>Gr,useSessionDoc:()=>_n,useSessionEndsAt:()=>Cr,useSessionIdle:()=>xr,useSessionPhase:()=>Se,useSessionTrack:()=>Tn,useSessionWake:()=>zt,useStatusBadge:()=>mr,useStreamMessages:()=>Bt,useTextStream:()=>fr,useUrunAudioLevel:()=>Dt,useUrunAuth:()=>Tt,useUrunPrewake:()=>zn,usesWorkOSAuth:()=>Tr});module.exports=ro(No);var ae=require("react");var Er=require("react"),lt=require("react/jsx-runtime"),$e=class extends Er.Component{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,r){console.error("[urun] Error caught by UrunErrorBoundary:",t,r)}render(){if(this.state.error){let{fallback:t}=this.props;return typeof t=="function"?t(this.state.error):t||(0,lt.jsxs)("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[(0,lt.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,lt.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var wr=require("react"),ze=(0,wr.createContext)(null);function De(e){return e&&e.trim()?e.trim():void 0}function xe(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return De(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return De(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return De(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return De(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return De(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return De(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return De(typeof process<"u"?process.env?.[e]:void 0)}}function dt(){let e=xe("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||xe("VERCEL_ENV")==="production"?"workos":xe("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Tr(){return dt()==="workos"}var Je=require("react"),Mr=require("react/jsx-runtime"),Ar=(0,Je.createContext)(null);function or({getAccessToken:e,children:t}){let r=(0,Je.useMemo)(()=>({getAccessToken:e}),[e]);return(0,Mr.jsx)(Ar.Provider,{value:r,children:t})}var Ur=or;function Tt(){return(0,Je.useContext)(Ar)}var At=require("react"),Nr="urun.operator_token",Ir=null,_r="op",Lr="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function Or(){return typeof window<"u"}function sr(){return Ir}function no(){if(!Or())return null;let e=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash;if(!e)return null;let t=new URLSearchParams(e),r=t.get(_r);if(!r)return null;Ir=r,t.delete(_r);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function oo(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function Ut(e){let t=(0,At.useRef)(e);t.current=e,(0,At.useEffect)(()=>{if(!Or())return;no();let r=o=>{if(!oo(o))return;let n=sr();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}var Dr=require("react");function Mt(e=!0){(0,Dr.useEffect)(()=>{if(!e||typeof window>"u"||typeof window.addEventListener!="function")return;let t=r=>(r.preventDefault(),r.returnValue="","");return window.addEventListener("beforeunload",t),()=>window.removeEventListener("beforeunload",t)},[e])}var Me=require("react/jsx-runtime"),so="/api/urun-token",io=1e4;function ao(e){let t=e.split(".")[1];if(!t)return null;try{let r=t.replace(/-/g,"+").replace(/_/g,"/"),o=r.padEnd(r.length+(4-r.length%4)%4,"="),s=JSON.parse(atob(o)).exp;return typeof s=="number"&&Number.isFinite(s)?s*1e3:null}catch{return null}}async function Vr(e,t){let r=await fetch(e,{method:"POST",signal:t});if(!r.ok)throw new Error(`[urun] token endpoint ${e} answered ${r.status}`);let o=await r.json(),n=typeof o.token=="string"?o.token:"",s=typeof o.orgId=="string"?o.orgId:"";if(!n||!s)throw new Error(`[urun] token endpoint ${e} returned no { token, orgId } \u2014 is it createTokenRoute() from @urun-sh/next?`);return{token:n,orgId:s,gatewayUrl:typeof o.gatewayUrl=="string"?o.gatewayUrl:void 0}}function uo(e,t){return typeof e=="function"?e(t):e!==void 0?e:(0,Me.jsxs)("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[(0,Me.jsx)("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),(0,Me.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function Fr({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,confirmOnLeave:f=!1,fallback:l,errorFallback:v,children:P}){let g=n===void 0&&t===void 0;if(!g&&(typeof t!="string"||t.trim().length===0))throw new Error("[urun] <UrunProvider> requires a non-empty orgId \u2014 set your org id deployment env var (e.g. NEXT_PUBLIC_SESSION_TENANT_ID) and pass it through the provider (or pass NEITHER orgId NOR jwt to let the provider mint from its tokenEndpoint).");if(!g&&(typeof e!="string"||e.trim().length===0))throw new Error("[urun] <UrunProvider> requires baseUrl when orgId/jwt are passed explicitly (self-mint mode reads it from the token endpoint instead).");let p=r??o;if(g&&(typeof p!="string"||p.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);Mt(f);let[h,m]=(0,ae.useState)(),[k,b]=(0,ae.useState)(),[T,S]=(0,ae.useState)(null),y=(0,ae.useRef)(void 0),E=(0,ae.useRef)(null),[w,L]=(0,ae.useState)(null);Ut(X=>L({jwt:X}));let d=Tt(),x=xe("NEXT_PUBLIC_SESSION_TOKEN")??xe("NEXT_PUBLIC_URUN_JWT"),R=dt(),M=w!==null,V=R==="workos"&&!n&&!M&&!g,Y=n??(R==="jwt"?x:void 0)??h??k?.token,I=M?w.jwt:Y,N=s??xe("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),H=V&&!I,$=t??k?.orgId,W=e??k?.gatewayUrl,j=g&&k===void 0,oe=g&&k!==void 0&&!W?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,le=T??oe,Q=u??so,B=(0,ae.useCallback)(async X=>{if(!X?.forceRefresh){let G=y.current;if(!G)return G;let C=ao(G);if(C===null||C-Date.now()>io)return G}return(await(E.current??(E.current=(async()=>{try{let G=await Vr(Q);return y.current=G.token,b(G),G}finally{E.current=null}})()))).token},[Q]),re=(0,ae.useMemo)(()=>({appId:p,baseUrl:W??"",orgId:$??"",jwt:I,getAccessToken:V?d?.getAccessToken:g&&!M?B:void 0,authProvider:N,eventsUrl:i,sessionKey:a,releaseOnLeave:c,priority:M?"preempt":void 0}),[p,d,W,N,I,i,$,a,c,V,M,g,B]);return(0,ae.useEffect)(()=>{if(!g)return;let X=new AbortController;return S(null),(async()=>{try{let ue=await Vr(Q,X.signal);y.current=ue.token,b(ue)}catch(ue){if(X.signal.aborted)return;S(ue instanceof Error?ue:new Error(String(ue)))}})(),()=>X.abort()},[g,Q]),(0,ae.useEffect)(()=>{if(!V||!d)return;let X=!1,ue=d;async function G(){try{let D=await ue.getAccessToken();X||m(D??void 0)}catch{X||m(void 0)}}G();let C=window.setInterval(()=>{G()},6e4);return()=>{X=!0,window.clearInterval(C)}},[d,V]),(0,Me.jsx)($e,{fallback:l,children:le?uo(v,le):H||j?(0,Me.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,Me.jsx)(ze.Provider,{value:re,children:P})})}var pe=require("react"),qr=require("@urun-sh/core");function co(e,t){return`${e}:${JSON.stringify(t??{})}`}function lo(e,t,r){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,fnName:t,args:r??{}})}var Ve=new Map;var ir=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},ar=class{constructor(t,r){this._stream=t;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(t){return this._stream.attach(t)}attachVideo(t){return this._stream.attachVideo(t)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(t){return this._stream.seek(t)}chunks(t){return this._stream.chunks(t)}onSeeked(t){return this._stream.onSeeked(t)}on(t,r){return this._stream.on(t,r)}messages(){return this._stream.messages()}emit(t,r){return this._stream.emit(t,r)}dispose(){this._unsubscribeTrack()}},ur=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||a.name==="expired"){let u=a.error,c=u?.reason??(a.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else a.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),i=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{i(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new ir(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new ar(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function Hr(){let e=(0,pe.useContext)(ze);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=(0,pe.useReducer)(i=>i+1,0),r=(0,pe.useRef)(new Map),o=(0,pe.useRef)(new Map),n=(0,pe.useRef)(null),s=(0,pe.useMemo)(()=>(0,qr.App)(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority]);return(0,pe.useEffect)(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=Ve.get(a);c===u&&o.current.get(a)===u&&(c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null),c.handle.addNotifier(t),c.refCount+=1)}}return()=>{let a=new Map;for(let[u,c]of o.current){let f=Ve.get(u);f===c&&(f.handle.removeNotifier(t),f.refCount=Math.max(0,f.refCount-1),a.set(u,f),f.refCount===0&&(f.disposeTimer=setTimeout(()=>{let l=Ve.get(u);!l||l.refCount!==0||(Ve.delete(u),l.handle.disconnect())},0)))}n.current=a}},[]),(0,pe.useMemo)(()=>{let i=new Map;return new Proxy({},{get(a,u){if(typeof u!="string")return;let c=i.get(u);if(c)return c;let f=l=>{let v=co(u,l),P=r.current.get(v);if(P&&!P.disposed)return P;let g=lo(e,u,l),p=Ve.get(g);return p?.handle.disposed&&(p.disposeTimer&&clearTimeout(p.disposeTimer),Ve.delete(g),o.current.get(g)===p&&o.current.delete(g),p=void 0),p?p.disposeTimer&&(clearTimeout(p.disposeTimer),p.disposeTimer=null):(p={handle:new ur(s[u](l),t,e.eventsUrl),refCount:0,disposeTimer:null},Ve.set(g,p)),o.current.get(g)!==p&&(o.current.set(g,p),p.handle.addNotifier(t),p.refCount+=1),r.current.set(v,p.handle),p.handle};return i.set(u,f),f}})},[e,s])}var ne=require("react");function Xe(e){let t=e;if(!t||typeof t.request!="function"||typeof t.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return t}function po(e){return e instanceof Error?e:new Error(String(e))}function Wr(e,t){let r=(0,ne.useMemo)(()=>Xe(e),[e]),[o,n]=(0,ne.useState)(void 0),[s,i]=(0,ne.useState)(null),[a,u]=(0,ne.useState)(!1),c=(0,ne.useRef)(t);c.current=t;let f=(0,ne.useRef)(0),l=(0,ne.useRef)(null),v=(0,ne.useRef)(!0);(0,ne.useEffect)(()=>(v.current=!0,()=>{v.current=!1,l.current?.abort()}),[]);let P=(0,ne.useCallback)(async h=>{l.current?.abort();let m=new AbortController;l.current=m;let k=++f.current,b=()=>v.current&&f.current===k;b()&&(u(!0),i(null));try{let T=await r.request(h,{...c.current,signal:m.signal});return b()&&(n(T),u(!1),c.current?.onSuccess?.(T)),T}catch(T){let S=po(T);throw b()&&(i(S),u(!1),c.current?.onError?.(S)),S}},[r]),g=(0,ne.useCallback)(h=>{P(h).catch(()=>{})},[P]),p=(0,ne.useCallback)(()=>{f.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:g,mutateAsync:P,data:o,error:s,isPending:a,reset:p}}var ie=require("react");function Br(e){return e instanceof Error?e:new Error(String(e))}var mo=e=>typeof e=="string"?e:String(e);function jr(e,t){let r=(0,ie.useMemo)(()=>Xe(e),[e]),[o,n]=(0,ie.useState)(""),[s,i]=(0,ie.useState)(!1),[a,u]=(0,ie.useState)(null),c=(0,ie.useRef)(t);c.current=t;let f=(0,ie.useRef)(0),l=(0,ie.useRef)(null),v=(0,ie.useRef)(!0);(0,ie.useEffect)(()=>(v.current=!0,()=>{v.current=!1,l.current?.cancel(),l.current=null}),[]);let P=(0,ie.useCallback)(()=>{f.current++,l.current?.cancel(),l.current=null,v.current&&i(!1)},[]),g=(0,ie.useCallback)(async p=>{l.current?.cancel();let h=++f.current,m=()=>v.current&&f.current===h,k=c.current,b=k?.parseChunk??mo,T=k?.buildPayload??(R=>({prompt:R}));m()&&(n(""),u(null),i(!0));let{parseChunk:S,buildPayload:y,onFinish:E,onError:w,...L}=k??{},d="",x;try{x=r.requestStream(T(p),L),l.current=x}catch(R){let M=Br(R);m()&&(u(M),i(!1),k?.onError?.(M));return}try{for await(let R of x){if(f.current!==h)break;d+=b(R),m()&&n(d)}m()&&(i(!1),k?.onFinish?.(d))}catch(R){let M=Br(R);m()&&(u(M),i(!1),k?.onError?.(M))}finally{l.current===x&&(l.current=null)}},[r]);return{completion:o,complete:g,stop:P,isStreaming:s,error:a}}var ee=require("react");function Kr(e){return e instanceof Error?e:new Error(String(e))}var fo=e=>typeof e=="string"?e:String(e),$r=0;function cr(e){return $r+=1,`${e}-${$r}`}function zr(e,t){let r=(0,ee.useMemo)(()=>Xe(e),[e]),[o,n]=(0,ee.useState)(()=>(t?.initialMessages??[]).map(b=>({id:b.id??cr("msg"),role:b.role,content:b.content}))),[s,i]=(0,ee.useState)(""),[a,u]=(0,ee.useState)(!1),[c,f]=(0,ee.useState)(null),l=(0,ee.useRef)(t);l.current=t;let v=(0,ee.useRef)(o);v.current=o;let P=(0,ee.useRef)(s);P.current=s;let g=(0,ee.useRef)(0),p=(0,ee.useRef)(null),h=(0,ee.useRef)(!0);(0,ee.useEffect)(()=>(h.current=!0,()=>{h.current=!1,p.current?.cancel(),p.current=null}),[]);let m=(0,ee.useCallback)(()=>{g.current++,p.current?.cancel(),p.current=null,h.current&&u(!1)},[]),k=(0,ee.useCallback)(async b=>{let T=b===void 0,S=(T?P.current:b)??"";if(!S.trim())return;p.current?.cancel();let E=++g.current,w=()=>h.current&&g.current===E,L=l.current,d=L?.parseChunk??fo,x={id:cr("msg"),role:"user",content:S},R={id:cr("msg"),role:"assistant",content:""},M=[...v.current,x].map(B=>({role:B.role,content:B.content})),V=[...v.current,x,R];v.current=V,n(V),T&&i(""),f(null),u(!0);let Y=L?.buildPayload??(B=>({messages:B})),{initialMessages:I,parseChunk:N,buildPayload:H,onFinish:$,onError:W,...j}=L??{},oe=B=>{n(re=>re.map(X=>X.id===R.id?{...X,content:B}:X))},le="",Q;try{Q=r.requestStream(Y(M),j),p.current=Q}catch(B){let re=Kr(B);w()&&(f(re),u(!1),L?.onError?.(re));return}try{for await(let B of Q){if(g.current!==E)break;le+=d(B),w()&&oe(le)}w()&&(u(!1),L?.onFinish?.({...R,content:le}))}catch(B){let re=Kr(B);w()&&(f(re),u(!1),L?.onError?.(re))}finally{p.current===Q&&(p.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:k,stop:m,isStreaming:a,error:c}}var Z=require("react"),Ge=require("@urun-sh/core"),lr=[];function Jr(e,t={}){let{field:r=Ge.INPUT_PRESENCE_FIELD,hz:o=Ge.INPUT_PRESENCE_DEFAULT_HZ}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=(0,Z.useMemo)(()=>s?(0,Ge.createInputPresencePublisher)({awareness:{setLocalStateField:(S,y)=>s.setField(S,y)},field:r,hz:o}):null,[s,r,o]),a=(0,Z.useRef)(null);a.current=i;let[u,c]=(0,Z.useState)(!1),[f,l]=(0,Z.useState)(lr),v=(0,Z.useRef)(!1);(0,Z.useEffect)(()=>{if(i)return()=>i.dispose()},[i]);let P=(0,Z.useCallback)(()=>{let S=a.current;l(S?S.heldKeys():lr)},[]),g=(0,Z.useCallback)(()=>{a.current?.clear(),l(lr)},[]);(0,Z.useEffect)(()=>{if(!n)return;let S=()=>!!n.pointerLockElement,y=()=>{if(S()){v.current=!1,c(!0);return}v.current||(c(!1),g())},E=R=>{S()&&(a.current?.keyDown(R.key),P())},w=R=>{a.current?.keyUp(R.key),P()},L=R=>{S()&&a.current?.movePointer(R.movementX,R.movementY)},d=R=>{S()&&a.current?.setButtons(R.buttons)},x=()=>{g()};return n.addEventListener("pointerlockchange",y),n.addEventListener("keydown",E),n.addEventListener("keyup",w),n.addEventListener("mousemove",L),n.addEventListener("mousedown",d),n.addEventListener("mouseup",d),n.defaultView?.addEventListener("blur",x),()=>{n.removeEventListener("pointerlockchange",y),n.removeEventListener("keydown",E),n.removeEventListener("keyup",w),n.removeEventListener("mousemove",L),n.removeEventListener("mousedown",d),n.removeEventListener("mouseup",d),n.defaultView?.removeEventListener("blur",x)}},[n,g,P]);let p=(0,Z.useCallback)(S=>{S.requestPointerLock?.()},[]),h=(0,Z.useCallback)(()=>{v.current=!0,c(!0)},[]),m=(0,Z.useCallback)(()=>{v.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),g()},[n,g]),k=(0,Z.useCallback)(S=>{a.current?.keyDown(S),P()},[P]),b=(0,Z.useCallback)(S=>{a.current?.keyUp(S),P()},[P]),T=(0,Z.useCallback)((S,y)=>{a.current?.movePointer(S,y)},[]);return{engage:p,engageTouch:h,release:m,engaged:u,heldKeys:f,pressKey:k,releaseKey:b,movePointer:T}}var ce=require("react"),Qr=require("@urun-sh/core");var O=require("react");var pt=require("react"),Yr=require("react/jsx-runtime"),dr=(0,pt.createContext)(null);function Xr({session:e,children:t}){return(0,Yr.jsx)(dr.Provider,{value:e,children:t})}function Pe(){return(0,pt.useContext)(dr)}function Gr(){let e=(0,pt.useContext)(dr);if(!e)throw new Error("[urun] useSession() needs a mounted <Session session={...}> ancestor with a non-null session \u2014 create one with useApp() (e.g. app.generate({...})) and pass it to the scope.");return e}var mt=require("react/jsx-runtime");function go(e,t){return e-t>>>0<2147483648}var Zr=1e3;function ho(...e){console.debug("[video]",...e)}var Fe=(0,O.forwardRef)(function(t,r){let{session:o,stream:n="video",audioStream:s="audio",track:i,muted:a=!0,mirror:u=!1,objectFit:c="contain",className:f,style:l,videoClassName:v,placeholder:P,poster:g,children:p,onTrack:h,onFirstFrame:m,frameMarker:k,onFrameMarkerReached:b,onFrameMarkerUnsupported:T}=t,S=Pe(),y=o??S,E=(0,O.useRef)(null),w=(0,O.useRef)(null),[L,d]=(0,O.useState)(!1),[x,R]=(0,O.useState)(!1),M=(0,O.useRef)(!1),V=(0,O.useRef)(h);V.current=h;let Y=(0,O.useRef)(m);Y.current=m;let I=(0,O.useRef)(b);I.current=b;let N=(0,O.useRef)(T);N.current=T;let H=(0,O.useRef)(k??null);H.current=k??null;let $=(0,O.useRef)(null),W=(0,O.useRef)(null),j=(0,O.useCallback)((C,D=!1)=>{if(!D&&C===$.current||($.current=C,W.current?.(),W.current=null,M.current=!1,R(!1),!C))return;let _=E.current;if(!_)return;let z=H.current,fe=z?.rtpTimestamp??null,se=!1,A=()=>{se||(se=!0,N.current?.())};z&&fe==null&&A();let de=z!=null&&fe!=null,Oe=ye=>{W.current?.(),W.current=null,M.current=!0,R(!0),Y.current?.(),ye&&I.current?.()};if(typeof _.requestVideoFrameCallback=="function"){let ye=!1,je=0,at=(tr,rr)=>{if(!ye){if(de){let wt=rr?.rtpTimestamp;if(typeof wt!="number"){A(),Oe(!1);return}if(!go(wt,fe)){je=_.requestVideoFrameCallback(at);return}Oe(!0);return}Oe(!1)}};je=_.requestVideoFrameCallback(at),W.current=()=>{ye=!0,_.cancelVideoFrameCallback?.(je)};return}de&&A();let ge=()=>{let ye=_.getVideoPlaybackQuality?.();(ye?ye.totalVideoFrames>0:_.readyState>=2&&_.videoWidth>0)&&Oe(!1)};_.addEventListener("loadeddata",ge),_.addEventListener("timeupdate",ge),_.addEventListener("playing",ge),W.current=()=>{_.removeEventListener("loadeddata",ge),_.removeEventListener("timeupdate",ge),_.removeEventListener("playing",ge)},ge()},[]);(0,O.useEffect)(()=>()=>{W.current?.(),W.current=null},[]);let oe=k==null?null:`${k.rtpTimestamp??""}|${k.ptsMs??""}`,le=(0,O.useRef)(oe);(0,O.useEffect)(()=>{if(le.current===oe||(le.current=oe,oe==null))return;let C=$.current;C&&j(C,!0)},[oe,j]);let Q=(0,O.useCallback)(()=>{if(typeof MediaStream>"u")return null;w.current||(w.current=new MediaStream);let C=E.current;return C&&C.srcObject!==w.current&&(C.srcObject=w.current),w.current},[]),B=(0,O.useCallback)(C=>{let D=E.current;if(!D)return;let _=D.play();!_||typeof _.catch!="function"||_.catch(z=>ho(`play() failed (${C})`,z))},[]),re=(0,O.useCallback)(C=>{let D=Q();if(D){for(let _ of D.getVideoTracks())_!==C&&D.removeTrack(_);if(C&&!D.getVideoTracks().includes(C)){D.addTrack(C);let _=E.current;_&&(_.srcObject=D)}C&&B("track-attach"),d(C!==null),j(C),V.current?.(C)}},[Q,B,j]),X=(0,O.useCallback)(C=>{let D=Q();if(D){for(let _ of D.getAudioTracks())_!==C&&D.removeTrack(_);C&&!D.getAudioTracks().includes(C)&&D.addTrack(C),C&&B("audio-attach")}},[Q,B]),ue=(0,O.useCallback)(C=>{E.current=C,C&&(a&&(C.muted=!0,C.defaultMuted=!0,C.setAttribute("muted","")),C.setAttribute("playsinline",""),C.setAttribute("webkit-playsinline",""),Q())},[Q,a]);(0,O.useImperativeHandle)(r,()=>({get element(){return E.current},get live(){return w.current?w.current.getVideoTracks().length>0:!1},get framed(){return M.current}}),[]);let G=i!==void 0;return(0,O.useEffect)(()=>{if(G){re(i??null);return}if(!y)return;let C=y.stream(n),D=()=>{let A=w.current;return A?A.getVideoTracks()[0]??null:null},_=A=>{if(A!==D()&&(re(A),A)){let de=()=>{D()===A&&re(null)};A.addEventListener("ended",de)}},z=C.track;z&&z.readyState==="live"&&_(z);let fe=C.on("track",A=>{A&&A.readyState!=="live"||_(A)}),se=setInterval(()=>{let A=C.track;A&&A.readyState==="live"&&_(A)},Zr);return()=>{fe(),clearInterval(se)}},[y,n,G,i,re]),(0,O.useEffect)(()=>{if(G||!y||s===!1)return;let C=y.stream(s),D=()=>{let A=w.current;return A?A.getAudioTracks()[0]??null:null},_=A=>{if(A!==D()&&(X(A),A)){let de=()=>{D()===A&&X(null)};A.addEventListener("ended",de)}},z=C.track;z&&z.readyState==="live"&&_(z);let fe=C.on("track",A=>{A&&A.readyState!=="live"||_(A)}),se=setInterval(()=>{let A=C.track;A&&A.readyState==="live"&&_(A)},Zr);return()=>{fe(),clearInterval(se)}},[y,s,G,X]),(0,mt.jsxs)("div",{className:f,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":L?"true":"false","data-urun-video-framed":x?"true":"false",children:[(0,mt.jsx)("video",{ref:ue,className:v,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),L?null:P,g===void 0?null:(0,mt.jsx)("div",{"data-urun-video-poster":"","aria-hidden":x||void 0,style:{position:"absolute",inset:0,...x?{opacity:0,pointerEvents:"none"}:null},children:g}),p]})});var ft=require("react/jsx-runtime"),So={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},en=(0,ce.forwardRef)(function(t,r){let{warp:o,children:n,...s}=t,{enabled:i=!0,overscan:a=.08,captureInput:u=!0,documentTarget:c,...f}=o??{},l=c!==void 0?c:typeof document<"u"?document:null,v=(0,ce.useRef)(null),P=(0,ce.useRef)(null),g=(0,ce.useRef)(0),p=(0,ce.useRef)(f);p.current=f;let h=(0,ce.useMemo)(()=>(0,Qr.createCameraWarp)(p.current),[]);return(0,ce.useImperativeHandle)(r,()=>({get video(){return v.current},get canvas(){return P.current},warp:h,get lastDrawTs(){return g.current}}),[h]),(0,ce.useEffect)(()=>{if(!i)return;let m=0,k=0,b=null,T=y=>{typeof y.requestVideoFrameCallback=="function"&&(b=y,k=y.requestVideoFrameCallback(function E(){h.frameArrived(),k=y.requestVideoFrameCallback(E)}))},S=y=>{m=requestAnimationFrame(S);let E=P.current,w=v.current?.element??null;if(!E||!w||(w!==b&&(b&&k&&b.cancelVideoFrameCallback?.(k),T(w)),w.readyState<2))return;h.tick(y);let L=typeof devicePixelRatio=="number"?devicePixelRatio:1,d=Math.max(1,Math.round(E.clientWidth*L)),x=Math.max(1,Math.round(E.clientHeight*L));(E.width!==d||E.height!==x)&&(E.width=d,E.height=x);let R=E.getContext("2d");if(!R)return;let M=h.transform(),V=w.videoWidth||d,Y=w.videoHeight||x,N=Math.max(d/V,x/Y)*(1+a)*M.scale;R.setTransform(N,0,0,N,d/2+M.translateX*d,x/2+M.translateY*x),R.drawImage(w,-V/2,-Y/2),g.current=y};return m=requestAnimationFrame(S),()=>{cancelAnimationFrame(m),b&&k&&b.cancelVideoFrameCallback?.(k)}},[i,a,h]),(0,ce.useEffect)(()=>{if(!i||!u||!l)return;let m=()=>!!l.pointerLockElement,k=E=>{m()&&h.keyDown(E.key)},b=E=>h.keyUp(E.key),T=E=>{m()&&h.pointerDelta(E.movementX,E.movementY)},S=()=>{m()||h.clearKeys()},y=()=>h.clearKeys();return l.addEventListener("keydown",k),l.addEventListener("keyup",b),l.addEventListener("mousemove",T),l.addEventListener("pointerlockchange",S),l.defaultView?.addEventListener("blur",y),()=>{l.removeEventListener("keydown",k),l.removeEventListener("keyup",b),l.removeEventListener("mousemove",T),l.removeEventListener("pointerlockchange",S),l.defaultView?.removeEventListener("blur",y)}},[i,u,l,h]),i?(0,ft.jsxs)(Fe,{ref:v,...s,videoClassName:s.videoClassName,style:{...s.style},children:[(0,ft.jsx)("canvas",{ref:P,style:So,"data-urun-warp":""}),n]}):(0,ft.jsx)(Fe,{ref:v,...s,children:n})});var tn=new Map;function rn(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);tn.set(e,{component:t,schema:r})}function nn(e,t){let r=tn.get(e);if(!r)return{error:`Unknown component: "${e}"`};let o=r.schema.safeParse(t);return o.success?{Component:r.component,validatedProps:o.data}:{error:`Validation failed for "${e}": ${o.error.message}`}}var qe=require("react/jsx-runtime");function on({name:e,props:t,fallback:r}){let o=nn(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?(0,qe.jsx)(qe.Fragment,{children:r}):(0,qe.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,qe.jsx)("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return(0,qe.jsx)(n,{...o.validatedProps})}var Ye=require("zod"),He=require("react/jsx-runtime"),sn=Ye.z.object({step:Ye.z.number().min(0),total:Ye.z.number().min(1),label:Ye.z.string().optional(),variant:Ye.z.enum(["default","success","error"]).default("default")});function pr(e){let{step:t,total:r,label:o,variant:n="default"}=e,s=Math.min(t/r*100,100),i=t>=r;return{step:t,total:r,label:o,variant:n,percentage:s,isComplete:i}}function an(e){let{step:t,total:r,label:o,variant:n,percentage:s}=pr(e);return(0,He.jsxs)("div",{className:"urun-progress-card","data-variant":n,children:[o&&(0,He.jsx)("div",{className:"urun-progress-label",children:o}),(0,He.jsx)("div",{className:"urun-progress-bar",children:(0,He.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,He.jsxs)("div",{className:"urun-progress-text",children:[t,"/",r]})]})}var _t=require("zod"),gt=require("react/jsx-runtime"),un=_t.z.object({state:_t.z.enum(["thinking","generating","idle","error"]),message:_t.z.string().optional()}),vo={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function mr(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??vo[t]??t;return{state:t,message:n,isActive:o}}function cn(e){let{state:t,message:r,isActive:o}=mr(e);return(0,gt.jsxs)("span",{className:"urun-status-badge","data-state":t,children:[(0,gt.jsx)("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),(0,gt.jsx)("span",{className:"urun-status-message",children:r})]})}var ht=require("react"),Nt=require("zod"),St=require("react/jsx-runtime"),ln=Nt.z.object({text:Nt.z.string(),streaming:Nt.z.boolean().default(!1)});function fr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function dn(e){let{text:t,streaming:r}=fr(e),o=(0,ht.useRef)(null),n=(0,ht.useRef)(0);return(0,ht.useEffect)(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),(0,St.jsxs)("div",{className:"urun-text-stream",children:[(0,St.jsx)("span",{ref:o,className:"urun-text-content"}),r&&(0,St.jsx)("span",{className:"urun-text-cursor"})]})}var vt=require("zod"),yt=require("react/jsx-runtime"),pn=vt.z.object({src:vt.z.string().url(),alt:vt.z.string().optional(),caption:vt.z.string().optional()});function gr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function mn(e){let{src:t,alt:r,caption:o}=gr(e);return(0,yt.jsxs)("figure",{className:"urun-image-frame",children:[(0,yt.jsx)("img",{className:"urun-image",src:t,alt:r}),o&&(0,yt.jsx)("figcaption",{className:"urun-image-caption",children:o})]})}var Ee=require("zod"),Ze=require("react/jsx-runtime"),fn=Ee.z.object({metrics:Ee.z.array(Ee.z.object({label:Ee.z.string(),value:Ee.z.union([Ee.z.string(),Ee.z.number()]),unit:Ee.z.string().optional()}))});function hr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function gn(e){let{metrics:t}=hr(e);return(0,Ze.jsx)("div",{className:"urun-metrics-panel",children:t.map((r,o)=>(0,Ze.jsxs)("div",{className:"urun-metric-card",children:[(0,Ze.jsx)("div",{className:"urun-metric-label",children:r.label}),(0,Ze.jsx)("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}var hn=require("react");var vn=require("react/jsx-runtime"),Sn=(0,hn.forwardRef)(function(t,r){let{stream:o="image",...n}=t;return(0,vn.jsx)(Fe,{ref:r,stream:o,...n})});var J=require("react"),kn=require("@urun-sh/core");var It=null;function yo(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function kt(){if(It)return It;let e=yo();return e?(It=new e,It):null}function bt(){let e=kt();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var Rn=require("react/jsx-runtime"),ko=1e3,yn=200;function Sr(...e){console.debug("[audio]",...e)}var Rt=(0,J.forwardRef)(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:f}=t,l=Pe(),v=o??l,P=(0,J.useRef)(null),g=(0,J.useRef)(null),p=(0,J.useRef)(null),h=(0,J.useRef)(null),m=(0,J.useRef)(u);m.current=u;let k=(0,J.useRef)(c);k.current=c;let b=(0,J.useCallback)(d=>{p.current!==d&&(p.current=d,k.current?.(d))},[]),T=(0,J.useCallback)(()=>{if(typeof MediaStream>"u")return null;g.current||(g.current=new MediaStream);let d=P.current;return d&&d.srcObject!==g.current&&(d.srcObject=g.current),g.current},[]),S=(0,J.useCallback)(d=>{let x=P.current;if(!x)return;let R=x.play();!R||typeof R.then!="function"||R.then(()=>{x.muted||b(!0)}).catch(M=>{let V=M instanceof Error?M.name:String(M);if(V==="AbortError"){Sr(`play() aborted (${d}); retrying in ${yn}ms`),h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{h.current=null,S(`${d}:retry`)},yn);return}if(V==="NotAllowedError"){Sr(`play() blocked pending a user gesture (${d})`),b(!1);return}Sr(`play() failed (${d})`,M)})},[b]),y=(0,J.useCallback)(d=>{let x=T();if(x){for(let R of x.getAudioTracks())R!==d&&x.removeTrack(R);d&&!x.getAudioTracks().includes(d)&&x.addTrack(d),d&&S("track-attach"),m.current?.(d)}},[T,S]),E=(0,J.useCallback)(()=>{let d=P.current;d&&(T(),d.muted=!1,S("gesture"),bt(),b(!0))},[T,S,b]);(0,J.useImperativeHandle)(r,()=>({unlock:E,get unlocked(){return p.current===!0},get element(){return P.current}}),[E]);let w=(0,J.useCallback)(d=>{P.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),T()),f?.(d)},[T,f]),L=s!==void 0;return(0,J.useEffect)(()=>{if(L){y(s??null);return}if(!v)return;let d=v.stream(n),x=()=>{let I=g.current;return I?I.getAudioTracks()[0]??null:null},R=I=>{if(I!==x()&&(y(I),I)){let N=()=>{x()===I&&y(null)};I.addEventListener("ended",N)}},M=d.track;M&&M.readyState==="live"&&R(M);let V=d.on("track",I=>{I&&I.readyState!=="live"||R(I)}),Y=setInterval(()=>{let I=d.track;I&&I.readyState==="live"&&R(I)},ko);return()=>{V(),clearInterval(Y)}},[v,n,L,s,y]),(0,J.useEffect)(()=>(0,kn.observePageLifecycle)(()=>{bt(),p.current===!0&&S("foreground")}),[S]),(0,J.useEffect)(()=>()=>{h.current&&clearTimeout(h.current)},[]),(0,Rn.jsx)("audio",{ref:w,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),bn=Rt;var K=require("react"),Qe=require("@urun-sh/core");var Pn=require("react/jsx-runtime"),vr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Lt(...e){console.debug("[voice]",...e)}var Ct=(0,K.forwardRef)(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=vr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:f,onError:l,onMicStream:v,onTrack:P,onUnlockChange:g,capture:p}=t,h=Pe(),m=o??h,k=(0,K.useRef)(null),b=(0,K.useRef)(null),T=(0,K.useRef)(null),S=(0,K.useRef)([]),y=(0,K.useRef)(!1),E=(0,K.useRef)(f);E.current=f;let w=(0,K.useRef)(l);w.current=l;let L=(0,K.useRef)(v);L.current=v;let d=(0,K.useCallback)(N=>{y.current!==N&&(y.current=N,E.current?.(N))},[]),x=(0,K.useCallback)(()=>{for(let N of S.current)N();S.current=[],T.current?.release(),T.current=null,b.current&&(b.current=null,L.current?.(null))},[]),R=(0,K.useCallback)(async()=>{let N=T.current;if(N){let j=await N.update(i);return b.current=N.stream,L.current?.(N.stream),j}let $=await(p??(0,Qe.sharedCaptureController)()).claim("audio",i);T.current=$,S.current=[$.onTrack((j,oe)=>{b.current=oe,L.current?.(oe),y.current&&m?.stream(n).attach(j).catch(le=>Lt("mic re-attach after one-capture re-acquire failed",le))}),$.onLost(j=>{T.current=null,S.current=[],b.current=null,L.current?.(null),d(!1),w.current?.(j)})],b.current=$.stream,L.current?.($.stream);let W=$.track;if(!W)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return W},[p,i,m,n,d]),M=(0,K.useCallback)(async()=>{x(),d(!1),await m?.stream(n).detach().catch(()=>{})},[m,n,x,d]),V=(0,K.useCallback)(async()=>{if(!m)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");k.current?.unlock();let N;try{N=await R()}catch(W){x();let j=(0,Qe.sessionFailureFromMediaError)(W,m.status);throw w.current?.(j),j}m.connect?.();let H;for(let W=1;W<=u;W++)try{await m.whenLive(a!==void 0?{timeout:a}:void 0),await m.stream(n).attach(N),d(!0);return}catch(j){H=j,Lt(`start attempt ${W}/${u} failed`,j),W<u&&await new Promise(oe=>setTimeout(oe,c))}x(),d(!1);let $=H instanceof Error?H:new Error(String(H??"voice start failed"));throw w.current?.($),$},[m,n,a,u,c,R,x,d]);(0,K.useImperativeHandle)(r,()=>({start:V,stop:M,unlock:()=>k.current?.unlock(),get active(){return y.current},get micStream(){return b.current},get audio(){return k.current}}),[V,M]);let Y=(0,K.useRef)(!1),I=(0,K.useCallback)(async()=>{if(!m||!y.current||Y.current)return;let N=b.current?.getAudioTracks()[0]??null;if(N&&N.readyState==="live"){try{await m.stream(n).attach(N)}catch(H){Lt("foreground mic re-assert failed (will retry on next pass)",H)}return}Y.current=!0;try{let H=await R();await m.stream(n).attach(H)}catch(H){let $=H instanceof Error?H:new Error(String(H));Lt("foreground mic re-acquire failed",$),w.current?.($)}finally{Y.current=!1}},[m,n,R]);return(0,K.useEffect)(()=>{let N=()=>{I()};return m&&typeof m.onRecovery=="function"?m.onRecovery(N):(0,Qe.observePageLifecycle)(N)},[m,I]),(0,K.useEffect)(()=>x,[x]),s?(0,Pn.jsx)(Rt,{ref:k,session:m,stream:n,onTrack:P,onUnlockChange:g}):null}),Cn=Ct;var be=require("react");var Ot=require("react");var yr={level:0,speaking:!1};function Dt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=(0,Ot.useState)(yr);return(0,Ot.useEffect)(()=>{if(!e){i(yr);return}let a=kt();if(!a||typeof MediaStream>"u")return;let u;e instanceof MediaStream?u=e:(u=new MediaStream,u.addTrack(e));let c,f;try{c=a.createMediaStreamSource(u),f=a.createAnalyser(),f.fftSize=r,c.connect(f)}catch{return}let l=new Uint8Array(f.fftSize),P=setInterval(()=>{f.getByteTimeDomainData(l);let g=0;for(let h=0;h<l.length;h++){let m=(l[h]-128)/128;g+=m*m}let p=Math.sqrt(g/l.length);i(h=>{let m=p>n;return Math.abs(h.level-p)<.005&&h.speaking===m?h:{level:p,speaking:m}})},o);return()=>{clearInterval(P),c.disconnect(),i(yr)}},[e,r,o,n]),s}var we=require("react/jsx-runtime"),bo={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},Ro={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},xn=(0,be.forwardRef)(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:u,onActiveChange:c,onError:f,onMicStream:l,capture:v}=t,P=Pe(),g=o??P,p=(0,be.useRef)(null),[h,m]=(0,be.useState)(null),k=(0,be.useRef)(l);k.current=l;let{level:b,speaking:T}=Dt(a?h:null);return(0,be.useImperativeHandle)(r,()=>({start:()=>{let S=p.current;return S?S.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>p.current?.stop()??Promise.resolve(),get active(){return p.current?.active??!1},get micStream(){return p.current?.micStream??null}}),[]),(0,be.useEffect)(()=>{!i||!g||p.current?.start().catch(()=>{})},[i,g]),(0,we.jsxs)(we.Fragment,{children:[(0,we.jsx)(Ct,{ref:p,session:g,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...v!==void 0?{capture:v}:{},onActiveChange:c,onError:f,onMicStream:S=>{m(S),k.current?.(S)}}),a?(0,we.jsx)("span",{className:u,style:bo,"data-urun-mic":"","data-urun-mic-active":h?"true":"false","data-urun-mic-speaking":T?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(b*100)/100,children:(0,we.jsx)("span",{style:Ro,children:(0,we.jsx)("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(b*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});var et=require("@urun-sh/core"),U=require("react");var he=require("react/jsx-runtime"),br={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function kr(...e){console.debug("[camera]",...e)}function Co(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function Po(){let e=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof e?.enumerateDevices!="function")return null;try{return(await e.enumerateDevices()).filter(r=>r.kind==="videoinput")}catch{return null}}var Rr=(0,U.forwardRef)(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:u,autoStart:c=!0,mirror:f="auto",connectTimeoutMs:l,visible:v=!1,className:P,videoClassName:g,onActiveChange:p,onError:h,onStream:m,onTrack:k,children:b,capture:T,flipControl:S="auto",flipControlClassName:y,onDevices:E}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let w=i?"user":a?"environment":u??"environment",L=Pe(),d=o??L,x=(0,U.useRef)(null),R=(0,U.useRef)(null),M=(0,U.useRef)(null),V=(0,U.useRef)([]),Y=(0,U.useRef)(null),I=(0,U.useRef)(!1),N=(0,U.useRef)(!1),H=(0,U.useRef)(w),[$,W]=(0,U.useState)(w),[j,oe]=(0,U.useState)(!1),[le,Q]=(0,U.useState)(null),[B,re]=(0,U.useState)(!1),[X]=(0,U.useState)(Co),ue=(0,U.useRef)(p);ue.current=p;let G=(0,U.useRef)(h);G.current=h;let C=(0,U.useRef)(m);C.current=m;let D=(0,U.useRef)(k);D.current=k;let _=(0,U.useRef)(E);_.current=E;let z=(0,U.useCallback)(F=>{I.current!==F&&(I.current=F,oe(F),ue.current?.(F))},[]);(0,U.useEffect)(()=>{if(!j){Q(null);return}let F=!1,q=()=>{Po().then(Ce=>{F||(Q(Ce),Ce&&_.current?.(Ce))})};q();let ke=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof ke?.addEventListener=="function"?(ke.addEventListener("devicechange",q),()=>{F=!0,ke.removeEventListener?.("devicechange",q)}):()=>{F=!0}},[j]);let fe=(0,U.useCallback)(F=>{let q=x.current;q&&(q.muted=!0,q.defaultMuted=!0,q.setAttribute("muted",""),q.setAttribute("playsinline",""),q.setAttribute("webkit-playsinline",""),q.srcObject=F,F&&q.play()?.catch?.(ke=>kr("preview play() failed",ke)))},[]),se=(0,U.useCallback)(()=>{N.current=!1,Y.current?.(),Y.current=null;for(let F of V.current)F();V.current=[],M.current?.release(),M.current=null,R.current&&(R.current=null,C.current?.(null),D.current?.(null)),fe(null)},[fe]),A=(0,U.useCallback)((F,q)=>{Y.current?.(),R.current=q,fe(q),C.current?.(q);let ke=()=>{R.current===q&&(kr("camera track ended (device removed or permission revoked)"),se(),z(!1))};F.addEventListener("ended",ke),Y.current=()=>F.removeEventListener("ended",ke)},[fe,se,z]),de=(0,U.useCallback)(async F=>{let q=n!==!1;if(q&&!d)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let ke={...br,...s,facingMode:F},Ce;try{let Ue=M.current;if(Ue)Ce=await Ue.update(ke);else{let ut=await(T??(0,et.sharedCaptureController)()).claim("video",ke);if(M.current=ut,V.current=[ut.onTrack((ct,Xn)=>{A(ct,Xn),I.current&&(!q||!d||d.stream(n).attachVideo(ct).then(()=>D.current?.(ct)).catch(Gn=>kr("camera re-publish after one-capture re-acquire failed",Gn)))}),ut.onLost(ct=>{M.current=null,V.current=[],se(),z(!1),G.current?.(ct)})],!ut.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});Ce=ut.track}}catch(Ue){let Ke=(0,et.sessionFailureFromMediaError)(Ue,d?.status);throw G.current?.(Ke),Ke}H.current=F,W(F),A(Ce,M.current?.stream??new MediaStream([Ce]));try{q&&d&&(d.connect?.(),await d.whenLive(l!==void 0?{timeout:l}:void 0),await d.stream(n).attachVideo(Ce)),N.current=q?n:!1}catch(Ue){se(),z(!1);let Ke=Ue instanceof Error?Ue:new Error(String(Ue));throw G.current?.(Ke),Ke}D.current?.(Ce),z(!0)},[d,n,s,l,T,A,se,z]),Oe=(0,U.useCallback)(F=>de(F?.facingMode??H.current),[de]),ge=(0,U.useCallback)(async F=>{let q=N.current===n;I.current&&H.current===F&&q||await de(F)},[de,n]),ye=(0,U.useCallback)(()=>de(H.current==="environment"?"user":"environment"),[de]),je=(0,U.useCallback)(async()=>{se(),z(!1),n!==!1&&await d?.stream(n).detachVideo().catch(()=>{})},[d,n,se,z]),at=(0,U.useCallback)(async F=>{let q=x.current;if(!q)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await(0,et.captureStillFromVideo)(q,F)},[]);(0,U.useImperativeHandle)(r,()=>({start:Oe,stop:je,flip:ye,setFacingMode:ge,capturePhoto:at,get active(){return I.current},get facingMode(){return H.current},get stream(){return R.current},get element(){return x.current}}),[Oe,je,ye,ge,at]);let tr=(0,U.useRef)(ge);if(tr.current=ge,(0,U.useEffect)(()=>{c&&(n!==!1&&!d||tr.current(w).catch(()=>{}))},[c,d,w,n]),(0,U.useEffect)(()=>se,[se]),!v)return null;let rr=f==="auto"?$==="user":f,wt=j&&(S===!0||S==="auto"&&X&&(le?.length??0)>1),Jn=()=>{B||(re(!0),ye().catch(()=>{}).finally(()=>re(!1)))};return(0,he.jsxs)("div",{className:P,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":$,children:[(0,he.jsx)("video",{ref:x,className:g,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...rr?{transform:"scaleX(-1)"}:{}}}),wt?(0,he.jsx)("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Jn,disabled:B,className:y,style:y?{opacity:B?.6:void 0}:{position:"absolute",right:16,bottom:"calc(env(safe-area-inset-bottom, 0px) + 16px)",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",width:44,height:44,borderRadius:9999,border:"1px solid rgba(255,255,255,0.25)",background:"rgba(0,0,0,0.5)",color:"#fff",cursor:"pointer",opacity:B?.6:1},children:(0,he.jsxs)("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",style:{width:20,height:20},"aria-hidden":!0,children:[(0,he.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,he.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,he.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,he.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,he.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,b]})}),En=(0,U.forwardRef)(function({preview:t=!0,...r},o){return(0,he.jsx)(Rr,{ref:o,...r,visible:t,autoStart:!1})});var tt=require("@urun-sh/core"),te=require("react");function wn(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=(0,te.useState)(null),[a,u]=(0,te.useState)(null),[c,f]=(0,te.useState)(!1),[l,v]=(0,te.useState)(null),[P]=(0,te.useState)(tt.cameraCaptureAvailable),g=(0,te.useRef)(n);g.current=n;let p=(0,te.useRef)(null),h=(0,te.useRef)(0),m=(0,te.useCallback)(y=>{p.current&&URL.revokeObjectURL(p.current),p.current=y?URL.createObjectURL(new Blob([y.bytes],{type:y.type})):null,u(p.current),i(y),g.current?.(y)},[]);(0,te.useEffect)(()=>()=>{h.current++,p.current&&URL.revokeObjectURL(p.current),p.current=null},[]);let k=(0,te.useCallback)(async y=>{let E=++h.current;f(!0),v(null);try{let w=await y();if(h.current!==E)return;m(w)}catch(w){if(h.current!==E)return;v((0,tt.referenceImageErrorMessage)(w))}finally{h.current===E&&f(!1)}},[m]),b=(0,te.useCallback)(y=>k(()=>(0,tt.normalizeReferenceImage)(y,{maxSize:t,type:r,quality:o,source:"file"})),[k,t,r,o]),T=(0,te.useCallback)(y=>k(()=>y.capturePhoto({maxSize:t,type:r,quality:o})),[k,t,r,o]),S=(0,te.useCallback)(()=>{h.current++,v(null),f(!1),m(null)},[m]);return{reference:s,previewUrl:a,pick:b,capture:T,clear:S,busy:c,error:l,cameraAvailable:P}}var Vt=require("react");function Tn(e,t){let[r,o]=(0,Vt.useState)(null);return(0,Vt.useEffect)(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}var Mn=require("react");var qt=require("react");var An=require("zustand/vanilla"),Un=require("zustand"),xo=()=>{};function Ft(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=(0,An.createStore)(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let c of s)c();s=null}},a=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",c=>n.setState({doc:c})),e.onSynced(()=>n.setState({synced:!0}))]),i):xo,u=(c=>(0,Un.useStore)(n,c));return Object.assign(u,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),u}function rt(e,t){let r=(0,qt.useMemo)(()=>Ft(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return(0,qt.useEffect)(()=>r.bind(),[r]),r}function _n(e,t,r){let n=rt(e,t)(r??(a=>a)),s=(0,Mn.useCallback)(a=>{e&&t&&e.doc(t).set(a)},[e,t]);if(r)return n;let i=n;return{snapshot:e&&t?i.doc:null,synced:i.synced,set:s}}var Wt=require("react");var _e=200;function Te(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function nt(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Ht(e){let t=e.trim();if(!t)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(t)}catch(o){return{ok:!1,error:o instanceof Error?o.message:"Invalid JSON."}}return r===null||typeof r!="object"||Array.isArray(r)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:r}}function Bt(e,t,r={}){let o=r.cap??200,[n,s]=(0,Wt.useState)([]);return(0,Wt.useEffect)(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let u=await a.next();if(!i||u.done)break;s(c=>Te(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}var Re=require("react/jsx-runtime");function Nn({session:e,name:t,cap:r,className:o}){let n=Bt(e,t,{cap:r});return(0,Re.jsxs)("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[(0,Re.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,Re.jsx)("code",{children:t}),(0,Re.jsxs)("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),(0,Re.jsx)("div",{className:"urun-stream-tail-log",children:n.length===0?(0,Re.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,Re.jsx)("code",{children:t})," messages\u2026"]}):n.map((s,i)=>(0,Re.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,Re.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",nt(s.payload)]},`${s.at}-${i}`))})]})}var Pt=require("react");var me=require("react/jsx-runtime");function xt({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=(0,Pt.useState)(""),[i,a]=(0,Pt.useState)(null),u=(0,Pt.useCallback)(()=>{let c=Ht(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return(0,me.jsxs)("div",{className:"urun-doc-patch",children:[(0,me.jsx)("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),(0,me.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,me.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?(0,me.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function In({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=rt(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return(0,me.jsxs)("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[(0,me.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,me.jsx)("code",{children:t}),(0,me.jsx)("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),(0,me.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?(0,me.jsx)(xt,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}var jt=require("react");var Ae=require("react/jsx-runtime");function Ln(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function On({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=(0,jt.useState)([]);return(0,jt.useEffect)(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>Te(u,{at:Date.now(),direction:"in",text:Ln(nt(a))},r))}):void 0),[e,t,r]),(0,Ae.jsxs)("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[(0,Ae.jsx)(xt,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>Te(u,{at:Date.now(),direction:"out",text:Ln(a)},r))}}),(0,Ae.jsx)("div",{className:"urun-control-sender-log",children:n.length===0?(0,Ae.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>(0,Ae.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,Ae.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,Ae.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}var Kt=require("react");var We=require("react/jsx-runtime");function Dn({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=(0,Kt.useState)([]),a=t.join(","),u=r.join(",");return(0,Kt.useEffect)(()=>{if(i([]),!e)return;let c=(l,v)=>i(P=>Te(P,{at:Date.now(),kind:l,text:v},o)),f=[];f.push(e.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of t){let v=e.stream(l);f.push(v.on("track",P=>c("track",`${l}: ${P?"track arrived":"track ended"}`)))}for(let l of r){let v=e.doc(l);f.push(v.on("change",()=>c("doc",`${l} changed`)))}return()=>f.forEach(l=>l())},[e,a,u,o]),(0,We.jsx)("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?(0,We.jsx)("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,f)=>(0,We.jsxs)("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[(0,We.jsx)("span",{className:"urun-event-spine-kind",children:c.kind})," ",(0,We.jsx)("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${f}`))})}var Zt=require("@urun-sh/core");var $t=require("react");function Se(e){let[t,r]=(0,$t.useState)(e?.phase??null);return(0,$t.useEffect)(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}var Fn=require("@urun-sh/core");var ot=require("react"),Vn=require("@urun-sh/core");function zt(e){let t=Se(e),r=(0,Vn.isWakingPhase)(t?.name),o=(0,ot.useRef)(void 0);r?o.current??=Date.now():o.current=void 0;let n=r?t?.wakingSince??o.current:void 0,s=()=>n!==void 0?Math.max(0,Math.floor((Date.now()-n)/1e3)):0,[i,a]=(0,ot.useState)(s);return(0,ot.useEffect)(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let u=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(u)},[n]),{waking:r,phase:t,state:r?t?.runtime?.state:void 0,reason:r?t?.runtime?.reason:void 0,since:n,seconds:r?i:0}}var Ne=require("react/jsx-runtime");function Jt({session:e,render:t,className:r}){let o=zt(e);return!o.waking||!o.phase?null:(0,Ne.jsx)("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):(0,Ne.jsxs)(Ne.Fragment,{children:[(0,Ne.jsx)("span",{className:"urun-session-waking-label",children:(0,Fn.describeSessionPhase)(o.phase)})," ",(0,Ne.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}var Gt=require("react");var Ie=require("react"),Eo={event:null,elapsedMs:0};function Xt(e,t){let[r,o]=(0,Ie.useState)(null),n=(0,Ie.useRef)(0);(0,Ie.useEffect)(()=>{if(o(null),!!e?.onActivation)return e.onActivation(a=>{t!==void 0&&a.stream!==t||(n.current=Date.now(),o(a))})},[e,t]);let[s,i]=(0,Ie.useState)(0);return(0,Ie.useEffect)(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,u=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(u());let c=setInterval(()=>i(u()),1e3);return()=>clearInterval(c)},[r]),r?{event:r,elapsedMs:s}:Eo}var st=require("react/jsx-runtime"),wo={activating:"starting stream\u2026","still-activating":"model warming up \u2014 this can take a minute","cold-boot":"cold boot \u2014 compiling/loading the model, hang tight",degraded:"taking longer than usual \u2014 still trying"};function To(e){let[t,r]=(0,Gt.useState)(!1);return(0,Gt.useEffect)(()=>{if(r(!1),!e)return;let o=e;if(typeof o.requestVideoFrameCallback=="function"){let s=o.requestVideoFrameCallback(()=>r(!0));return()=>o.cancelVideoFrameCallback?.(s)}let n=()=>{let s=o.getVideoPlaybackQuality?.();(s?s.totalVideoFrames>0:o.readyState>=2)&&r(!0)};return n(),o.addEventListener("loadeddata",n),o.addEventListener("timeupdate",n),()=>{o.removeEventListener("loadeddata",n),o.removeEventListener("timeupdate",n)}},[e]),t}function Yt({session:e,stream:t,videoElement:r,render:o,className:n}){let s=Xt(e,t),i=To(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return(0,st.jsx)("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):(0,st.jsxs)("div",{className:"urun-activation-overlay-card",children:[(0,st.jsx)("span",{className:"urun-activation-overlay-copy",children:a.hint??wo[u]})," ",(0,st.jsxs)("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}var ve=require("react/jsx-runtime"),Ao={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function qn({session:e,className:t}){let r=Se(e),o=r?.name??"idle",n=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return(0,ve.jsxs)("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[(0,ve.jsx)("span",{className:"urun-session-status-dot","data-phase":o}),(0,ve.jsx)("span",{className:"urun-session-status-label",children:Ao[o]}),n?(0,ve.jsx)("span",{className:"urun-session-status-detail",children:n}):null]})}function Hn({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=Se(e);if(s?.name==="live")return(0,ve.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,(0,ve.jsx)(Yt,{session:e})]});let i=r?r(s):(0,ve.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,Zt.isWakingPhase)(s.name)?(0,ve.jsx)(Jt,{session:e}):s&&s.name!=="idle"?(0,Zt.describeSessionPhase)(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,ve.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?(0,ve.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}var Qt=require("react");var Bn=require("react/jsx-runtime");function Cr(e){return Se(e)?.endsAt??null}function Uo(e){let t=Math.max(0,Math.floor(e/1e3)),r=Math.floor(t/60),o=t%60;return`${String(r).padStart(2,"0")}:${String(o).padStart(2,"0")}`}function Wn({session:e,urgentMs:t=6e4,className:r}){let n=Cr(e)?.getTime()??null,[s,i]=(0,Qt.useState)(()=>n===null?null:Math.max(0,n-Date.now()));if((0,Qt.useEffect)(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),s===null)return null;let a=Uo(s);return(0,Bn.jsx)("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<t?"":void 0,"data-expired":s<=0?"":void 0,children:a})}var Et=require("react/jsx-runtime"),Mo=new Set(["expired","ended","error"]);function jn({session:e,onNewSession:t,children:r,className:o}){let n=Se(e);if(!n||!Mo.has(n.name))return null;let s=r?r(n):(0,Et.jsx)("span",{className:"urun-session-ended-copy",children:n.name==="expired"?"Session ended \u2014 start a new session":n.name==="error"?`Session failed${n.error?.reason?` \u2014 ${n.error.reason}`:""}.`:"Session ended."});return(0,Et.jsxs)("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?(0,Et.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}var Le=require("react"),Be=require("react/jsx-runtime");function Pr(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;return t.warning!==!0?null:{warning:!0,deadlineEpochS:typeof t.deadline_epoch_s=="number"?t.deadline_epoch_s:null,idleSinceEpochS:typeof t.idle_since_epoch_s=="number"?t.idle_since_epoch_s:null}}function xr(e){let t=(0,Le.useMemo)(()=>e?e.doc("control"):null,[e]),[r,o]=(0,Le.useState)(()=>t?Pr(t.get("idle")):null);return(0,Le.useEffect)(()=>{if(!t){o(null);return}return o(Pr(t.get("idle"))),t.on("change",()=>o(Pr(t.get("idle"))))},[t]),r}function _o(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function Kn({session:e,onStillHere:t,className:r}){let o=xr(e),n=o?.deadlineEpochS??null,[s,i]=(0,Le.useState)(null);if((0,Le.useEffect)(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()/1e3));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return(0,Be.jsx)("div",{className:["urun-idle-warning",r].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:(0,Be.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,Be.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,Be.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${_o(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,Be.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}var it=require("react"),$n=require("@urun-sh/core");function zn(e){let t=(0,it.useContext)(ze),[r,o]=(0,it.useState)(null),n=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,u=t?.orgId,c=t?.jwt,f=t?.getAccessToken,l=t?.authProvider;return(0,it.useEffect)(()=>{if(!a||!u||!n||!s)return;let v=!1,P=()=>{(0,$n.prewake)({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:f,authProvider:l}).then(p=>{v||o(p)}).catch(()=>{})};P();let g=setInterval(P,Math.max(1,i)*1e3);return()=>{v=!0,clearInterval(g)}},[n,s,i,a,u,c,f,l]),r}var er=require("@urun-sh/core");0&&(module.exports={Audio,Camera,ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,Image,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,Mic,OPERATOR_CHORD_LABEL,OPERATOR_TOKEN_STORAGE_KEY,ProgressCard,ProgressCardSchema,ReprojectedVideo,Session,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunActivationOverlay,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunIdleWarning,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,Video,Voice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,readOperatorToken,registerComponent,resumeUrunAudioContext,urunPublicEnv,useActivation,useApp,useChat,useCompletion,useConfirmOnLeave,useDocStore,useImageFrame,useInputPresence,useMetricsPanel,useOperatorOverride,useProgressCard,useReferenceImage,useRequest,useSession,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
|
|
2
|
+
"use strict";var nr=Object.defineProperty;var eo=Object.getOwnPropertyDescriptor;var to=Object.getOwnPropertyNames;var ro=Object.prototype.hasOwnProperty;var no=(e,t)=>{for(var r in t)nr(e,r,{get:t[r],enumerable:!0})},oo=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of to(t))!ro.call(e,n)&&n!==r&&nr(e,n,{get:()=>t[n],enumerable:!(o=eo(t,n))||o.enumerable});return e};var so=e=>oo(nr({},"__esModule",{value:!0}),e);var Oo={};no(Oo,{Audio:()=>Ct,Camera:()=>Rr,ComponentRenderer:()=>cn,DEFAULT_CAMERA_CONSTRAINTS:()=>br,DEFAULT_LOG_CAP:()=>Ie,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:()=>Ue,readOperatorToken:()=>sr,registerComponent:()=>an,resumeUrunAudioContext:()=>Rt,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:()=>Cr,useSessionIdle:()=>xr,useSessionPhase:()=>ge,useSessionTrack:()=>_n,useSessionWake:()=>Jt,useStatusBadge:()=>mr,useStreamMessages:()=>jt,useTextStream:()=>fr,useUrunAudioLevel:()=>Vt,useUrunAuth:()=>At,useUrunPrewake:()=>Yn,usesWorkOSAuth:()=>Ar});module.exports=so(Oo);var ae=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 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:f=!1,fallback:l,errorFallback:v,children:C}){let g=n===void 0&&t===void 0;if(!g&&(typeof t!="string"||t.trim().length===0))throw new Error("[urun] <UrunProvider> requires a non-empty orgId \u2014 set your org id deployment env var (e.g. NEXT_PUBLIC_SESSION_TENANT_ID) and pass it through the provider (or pass NEITHER orgId NOR jwt to let the provider mint from its tokenEndpoint).");if(!g&&(typeof e!="string"||e.trim().length===0))throw new Error("[urun] <UrunProvider> requires baseUrl when orgId/jwt are passed explicitly (self-mint mode reads it from the token endpoint instead).");let p=r??o;if(g&&(typeof p!="string"||p.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);_t(f);let[h,m]=(0,ae.useState)(),[k,b]=(0,ae.useState)(),[U,S]=(0,ae.useState)(null),y=(0,ae.useRef)(void 0),E=(0,ae.useRef)(null),[T,O]=(0,ae.useState)(null);Mt(X=>O({jwt:X}));let d=At(),x=Te("NEXT_PUBLIC_SESSION_TOKEN")??Te("NEXT_PUBLIC_URUN_JWT"),R=pt(),_=T!==null,D=R==="workos"&&!n&&!_&&!g,G=n??(R==="jwt"?x:void 0)??h??k?.token,I=_?T.jwt:G,N=s??Te("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),H=D&&!I,$=t??k?.orgId,W=e??k?.gatewayUrl,j=g&&k===void 0,se=g&&k!==void 0&&!W?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,le=U??se,Z=u??uo,B=(0,ae.useCallback)(async X=>{if(!X?.forceRefresh){let z=y.current;if(!z)return z;let de=lo(z);if(de===null||de-Date.now()>co)return z}return(await(E.current??(E.current=(async()=>{try{let z=await Fr(Z);return y.current=z.token,b(z),z}finally{E.current=null}})()))).token},[Z]),ee=(0,ae.useMemo)(()=>({appId:p,baseUrl:W??"",orgId:$??"",jwt:I,getAccessToken:D?d?.getAccessToken:g&&!_?B:void 0,authProvider:N,eventsUrl:i,sessionKey:a,releaseOnLeave:c,priority:_?"preempt":void 0}),[p,d,W,N,I,i,$,a,c,D,_,g,B]);return(0,ae.useEffect)(()=>{if(!g)return;let X=new AbortController;return S(null),(async()=>{try{let ue=await Fr(Z,X.signal);y.current=ue.token,b(ue)}catch(ue){if(X.signal.aborted)return;S(ue instanceof Error?ue:new Error(String(ue)))}})(),()=>X.abort()},[g,Z]),(0,ae.useEffect)(()=>{if(!D||!d)return;let X=!1,ue=d;async function z(){try{let P=await ue.getAccessToken();X||m(P??void 0)}catch{X||m(void 0)}}z();let de=window.setInterval(()=>{z()},6e4);return()=>{X=!0,window.clearInterval(de)}},[d,D]),(0,Ne.jsx)(ze,{fallback:l,children:le?po(v,le):H||j?(0,Ne.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,Ne.jsx)(Je.Provider,{value:ee,children:C})})}var pe=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,pe.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,pe.useReducer)(i=>i+1,0),r=(0,pe.useRef)(new Map),o=(0,pe.useRef)(new Map),n=(0,pe.useRef)(null),s=(0,pe.useMemo)(()=>(0,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,pe.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 f=Fe.get(u);f===c&&(f.handle.removeNotifier(t),f.refCount=Math.max(0,f.refCount-1),a.set(u,f),f.refCount===0&&(f.disposeTimer=setTimeout(()=>{let l=Fe.get(u);!l||l.refCount!==0||(Fe.delete(u),l.handle.disconnect())},0)))}n.current=a}},[]),(0,pe.useMemo)(()=>{let i=new Map;return new Proxy({},{get(a,u){if(typeof u!="string")return;let c=i.get(u);if(c)return c;let f=l=>{let v=mo(u,l),C=r.current.get(v);if(C&&!C.disposed)return C;let g=fo(e,u,l),p=Fe.get(g);return p?.handle.disposed&&(p.disposeTimer&&clearTimeout(p.disposeTimer),Fe.delete(g),o.current.get(g)===p&&o.current.delete(g),p=void 0),p?p.disposeTimer&&(clearTimeout(p.disposeTimer),p.disposeTimer=null):(p={handle:new ur(s[u](l),t,e.eventsUrl),refCount:0,disposeTimer:null},Fe.set(g,p)),o.current.get(g)!==p&&(o.current.set(g,p),p.handle.addNotifier(t),p.refCount+=1),r.current.set(v,p.handle),p.handle};return i.set(u,f),f}})},[e,s])}var 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 f=(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 C=(0,oe.useCallback)(async h=>{l.current?.abort();let m=new AbortController;l.current=m;let k=++f.current,b=()=>v.current&&f.current===k;b()&&(u(!0),i(null));try{let U=await r.request(h,{...c.current,signal:m.signal});return b()&&(n(U),u(!1),c.current?.onSuccess?.(U)),U}catch(U){let S=go(U);throw b()&&(i(S),u(!1),c.current?.onError?.(S)),S}},[r]),g=(0,oe.useCallback)(h=>{C(h).catch(()=>{})},[C]),p=(0,oe.useCallback)(()=>{f.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:g,mutateAsync:C,data:o,error:s,isPending:a,reset:p}}var ie=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,ie.useMemo)(()=>Ge(e),[e]),[o,n]=(0,ie.useState)(""),[s,i]=(0,ie.useState)(!1),[a,u]=(0,ie.useState)(null),c=(0,ie.useRef)(t);c.current=t;let f=(0,ie.useRef)(0),l=(0,ie.useRef)(null),v=(0,ie.useRef)(!0);(0,ie.useEffect)(()=>(v.current=!0,()=>{v.current=!1,l.current?.cancel(),l.current=null}),[]);let C=(0,ie.useCallback)(()=>{f.current++,l.current?.cancel(),l.current=null,v.current&&i(!1)},[]),g=(0,ie.useCallback)(async p=>{l.current?.cancel();let h=++f.current,m=()=>v.current&&f.current===h,k=c.current,b=k?.parseChunk??ho,U=k?.buildPayload??(R=>({prompt:R}));m()&&(n(""),u(null),i(!0));let{parseChunk:S,buildPayload:y,onFinish:E,onError:T,...O}=k??{},d="",x;try{x=r.requestStream(U(p),O),l.current=x}catch(R){let _=jr(R);m()&&(u(_),i(!1),k?.onError?.(_));return}try{for await(let R of x){if(f.current!==h)break;d+=b(R),m()&&n(d)}m()&&(i(!1),k?.onFinish?.(d))}catch(R){let _=jr(R);m()&&(u(_),i(!1),k?.onError?.(_))}finally{l.current===x&&(l.current=null)}},[r]);return{completion:o,complete:g,stop:C,isStreaming:s,error:a}}var Q=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,Q.useMemo)(()=>Ge(e),[e]),[o,n]=(0,Q.useState)(()=>(t?.initialMessages??[]).map(b=>({id:b.id??cr("msg"),role:b.role,content:b.content}))),[s,i]=(0,Q.useState)(""),[a,u]=(0,Q.useState)(!1),[c,f]=(0,Q.useState)(null),l=(0,Q.useRef)(t);l.current=t;let v=(0,Q.useRef)(o);v.current=o;let C=(0,Q.useRef)(s);C.current=s;let g=(0,Q.useRef)(0),p=(0,Q.useRef)(null),h=(0,Q.useRef)(!0);(0,Q.useEffect)(()=>(h.current=!0,()=>{h.current=!1,p.current?.cancel(),p.current=null}),[]);let m=(0,Q.useCallback)(()=>{g.current++,p.current?.cancel(),p.current=null,h.current&&u(!1)},[]),k=(0,Q.useCallback)(async b=>{let U=b===void 0,S=(U?C.current:b)??"";if(!S.trim())return;p.current?.cancel();let E=++g.current,T=()=>h.current&&g.current===E,O=l.current,d=O?.parseChunk??So,x={id:cr("msg"),role:"user",content:S},R={id:cr("msg"),role:"assistant",content:""},_=[...v.current,x].map(B=>({role:B.role,content:B.content})),D=[...v.current,x,R];v.current=D,n(D),U&&i(""),f(null),u(!0);let G=O?.buildPayload??(B=>({messages:B})),{initialMessages:I,parseChunk:N,buildPayload:H,onFinish:$,onError:W,...j}=O??{},se=B=>{n(ee=>ee.map(X=>X.id===R.id?{...X,content:B}:X))},le="",Z;try{Z=r.requestStream(G(_),j),p.current=Z}catch(B){let ee=$r(B);T()&&(f(ee),u(!1),O?.onError?.(ee));return}try{for await(let B of Z){if(g.current!==E)break;le+=d(B),T()&&se(le)}T()&&(u(!1),O?.onFinish?.({...R,content:le}))}catch(B){let ee=$r(B);T()&&(f(ee),u(!1),O?.onError?.(ee))}finally{p.current===Z&&(p.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:k,stop:m,isStreaming:a,error:c}}var Y=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,Y.useMemo)(()=>s?(0,Ye.createInputPresencePublisher)({awareness:{setLocalStateField:(S,y)=>s.setField(S,y)},field:r,hz:o}):null,[s,r,o]),a=(0,Y.useRef)(null);a.current=i;let[u,c]=(0,Y.useState)(!1),[f,l]=(0,Y.useState)(lr),v=(0,Y.useRef)(!1);(0,Y.useEffect)(()=>{if(i)return()=>i.dispose()},[i]);let C=(0,Y.useCallback)(()=>{let S=a.current;l(S?S.heldKeys():lr)},[]),g=(0,Y.useCallback)(()=>{a.current?.clear(),l(lr)},[]);(0,Y.useEffect)(()=>{if(!n)return;let S=()=>!!n.pointerLockElement,y=()=>{if(S()){v.current=!1,c(!0);return}v.current||(c(!1),g())},E=R=>{S()&&(a.current?.keyDown(R.key),C())},T=R=>{a.current?.keyUp(R.key),C()},O=R=>{S()&&a.current?.movePointer(R.movementX,R.movementY)},d=R=>{S()&&a.current?.setButtons(R.buttons)},x=()=>{g()};return n.addEventListener("pointerlockchange",y),n.addEventListener("keydown",E),n.addEventListener("keyup",T),n.addEventListener("mousemove",O),n.addEventListener("mousedown",d),n.addEventListener("mouseup",d),n.defaultView?.addEventListener("blur",x),()=>{n.removeEventListener("pointerlockchange",y),n.removeEventListener("keydown",E),n.removeEventListener("keyup",T),n.removeEventListener("mousemove",O),n.removeEventListener("mousedown",d),n.removeEventListener("mouseup",d),n.defaultView?.removeEventListener("blur",x)}},[n,g,C]);let p=(0,Y.useCallback)(S=>{S.requestPointerLock?.()},[]),h=(0,Y.useCallback)(()=>{v.current=!0,c(!0)},[]),m=(0,Y.useCallback)(()=>{v.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),g()},[n,g]),k=(0,Y.useCallback)(S=>{a.current?.keyDown(S),C()},[C]),b=(0,Y.useCallback)(S=>{a.current?.keyUp(S),C()},[C]),U=(0,Y.useCallback)((S,y)=>{a.current?.movePointer(S,y)},[]);return{engage:p,engageTouch:h,release:m,engaged:u,heldKeys:f,pressKey:k,releaseKey:b,movePointer:U}}var ce=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 Pe(){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:f,style:l,videoClassName:v,placeholder:C,poster:g,children:p,onTrack:h,onFirstFrame:m,frameMarker:k,onFrameMarkerReached:b,onFrameMarkerUnsupported:U}=t,S=Pe(),y=o??S,E=(0,L.useRef)(null),T=(0,L.useRef)(null),[O,d]=(0,L.useState)(!1),[x,R]=(0,L.useState)(!1),_=(0,L.useRef)(!1),D=(0,L.useRef)(h);D.current=h;let G=(0,L.useRef)(m);G.current=m;let I=(0,L.useRef)(b);I.current=b;let N=(0,L.useRef)(U);N.current=U;let H=(0,L.useRef)(k??null);H.current=k??null;let $=(0,L.useRef)(null),W=(0,L.useRef)(null),j=(0,L.useCallback)((P,q=!1)=>{if(!q&&P===$.current||($.current=P,W.current?.(),W.current=null,_.current=!1,R(!1),!P))return;let w=E.current;if(!w)return;let te=H.current,ne=te?.rtpTimestamp??null,be=!1,A=()=>{be||(be=!0,N.current?.())};te&&ne==null&&A();let xe=te!=null&&ne!=null,Ee=Re=>{W.current?.(),W.current=null,_.current=!0,R(!0),G.current?.(),Re&&I.current?.()};if(typeof w.requestVideoFrameCallback=="function"){let Re=!1,Ke=0,ut=(Er,rr)=>{if(!Re){if(xe){let wt=rr?.rtpTimestamp;if(typeof wt!="number"){A(),Ee(!1);return}if(!vo(wt,ne)){Ke=w.requestVideoFrameCallback(ut);return}Ee(!0);return}Ee(!1)}};Ke=w.requestVideoFrameCallback(ut),W.current=()=>{Re=!0,w.cancelVideoFrameCallback?.(Ke)};return}xe&&A();let Se=()=>{let Re=w.getVideoPlaybackQuality?.();(Re?Re.totalVideoFrames>0:w.readyState>=2&&w.videoWidth>0)&&Ee(!1)};w.addEventListener("loadeddata",Se),w.addEventListener("timeupdate",Se),w.addEventListener("playing",Se),W.current=()=>{w.removeEventListener("loadeddata",Se),w.removeEventListener("timeupdate",Se),w.removeEventListener("playing",Se)},Se()},[]);(0,L.useEffect)(()=>()=>{W.current?.(),W.current=null},[]);let se=k==null?null:`${k.rtpTimestamp??""}|${k.ptsMs??""}`,le=(0,L.useRef)(se);(0,L.useEffect)(()=>{if(le.current===se||(le.current=se,se==null))return;let P=$.current;P&&j(P,!0)},[se,j]);let Z=(0,L.useCallback)(()=>{if(typeof MediaStream>"u")return null;T.current||(T.current=new MediaStream);let P=E.current;return P&&P.srcObject!==T.current&&(P.srcObject=T.current),T.current},[]),B=(0,L.useCallback)(P=>{let q=E.current;if(!q)return;let w=q.play();!w||typeof w.catch!="function"||w.catch(te=>yo(`play() failed (${P})`,te))},[]),ee=(0,L.useCallback)(P=>{let q=Z();if(q){for(let w of q.getVideoTracks())w!==P&&q.removeTrack(w);if(P&&!q.getVideoTracks().includes(P)){q.addTrack(P);let w=E.current;w&&(w.srcObject=q)}P&&B("track-attach"),d(P!==null),j(P),D.current?.(P)}},[Z,B,j]),X=(0,L.useCallback)(P=>{let q=Z();if(q){for(let w of q.getAudioTracks())w!==P&&q.removeTrack(w);P&&!q.getAudioTracks().includes(P)&&q.addTrack(P),P&&B("audio-attach")}},[Z,B]),ue=(0,L.useCallback)(P=>{E.current=P,P&&(a&&(P.muted=!0,P.defaultMuted=!0,P.setAttribute("muted","")),P.setAttribute("playsinline",""),P.setAttribute("webkit-playsinline",""),Z())},[Z,a]);(0,L.useImperativeHandle)(r,()=>({get element(){return E.current},get live(){return T.current?T.current.getVideoTracks().length>0:!1},get framed(){return _.current}}),[]);let z=(0,rn.derivedLegRole)(n)!==void 0;(0,L.useEffect)(()=>{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 de=i!==void 0;return(0,L.useEffect)(()=>{if(de){ee(i??null);return}if(z){ee(null);return}if(!y)return;let P=en(y,tn(n,"video")),q=()=>{let A=T.current;return A?A.getVideoTracks()[0]??null:null},w=A=>{if(A!==q()&&(ee(A),A)){let xe=()=>{q()===A&&ee(null)};A.addEventListener("ended",xe)}},te=P.track;te&&te.readyState==="live"&&w(te);let ne=P.on("track",A=>{A&&A.readyState!=="live"||w(A)}),be=setInterval(()=>{let A=P.track;A&&A.readyState==="live"&&w(A)},Qr);return()=>{ne(),clearInterval(be)}},[y,n,z,de,i,ee]),(0,L.useEffect)(()=>{if(de||!y||s===!1||z)return;let P=en(y,tn(n,"audio",s)),q=()=>{let A=T.current;return A?A.getAudioTracks()[0]??null:null},w=A=>{if(A!==q()&&(X(A),A)){let xe=()=>{q()===A&&X(null)};A.addEventListener("ended",xe)}},te=P.track;te&&te.readyState==="live"&&w(te);let ne=P.on("track",A=>{A&&A.readyState!=="live"||w(A)}),be=setInterval(()=>{let A=P.track;A&&A.readyState==="live"&&w(A)},Qr);return()=>{ne(),clearInterval(be)}},[y,n,z,s,de,X]),(0,ft.jsxs)("div",{className:f,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":O?"true":"false","data-urun-video-framed":x?"true":"false",children:[(0,ft.jsx)("video",{ref:ue,className:v,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),O?null:C,g===void 0?null:(0,ft.jsx)("div",{"data-urun-video-poster":"","aria-hidden":x||void 0,style:{position:"absolute",inset:0,...x?{opacity:0,pointerEvents:"none"}:null},children:g}),p]})});var gt=require("react/jsx-runtime"),ko={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},on=(0,ce.forwardRef)(function(t,r){let{warp:o,children:n,...s}=t,{enabled:i=!0,overscan:a=.08,captureInput:u=!0,documentTarget:c,...f}=o??{},l=c!==void 0?c:typeof document<"u"?document:null,v=(0,ce.useRef)(null),C=(0,ce.useRef)(null),g=(0,ce.useRef)(0),p=(0,ce.useRef)(f);p.current=f;let h=(0,ce.useMemo)(()=>(0,nn.createCameraWarp)(p.current),[]);return(0,ce.useImperativeHandle)(r,()=>({get video(){return v.current},get canvas(){return C.current},warp:h,get lastDrawTs(){return g.current}}),[h]),(0,ce.useEffect)(()=>{if(!i)return;let m=0,k=0,b=null,U=y=>{typeof y.requestVideoFrameCallback=="function"&&(b=y,k=y.requestVideoFrameCallback(function E(){h.frameArrived(),k=y.requestVideoFrameCallback(E)}))},S=y=>{m=requestAnimationFrame(S);let E=C.current,T=v.current?.element??null;if(!E||!T||(T!==b&&(b&&k&&b.cancelVideoFrameCallback?.(k),U(T)),T.readyState<2))return;h.tick(y);let O=typeof devicePixelRatio=="number"?devicePixelRatio:1,d=Math.max(1,Math.round(E.clientWidth*O)),x=Math.max(1,Math.round(E.clientHeight*O));(E.width!==d||E.height!==x)&&(E.width=d,E.height=x);let R=E.getContext("2d");if(!R)return;let _=h.transform(),D=T.videoWidth||d,G=T.videoHeight||x,N=Math.max(d/D,x/G)*(1+a)*_.scale;R.setTransform(N,0,0,N,d/2+_.translateX*d,x/2+_.translateY*x),R.drawImage(T,-D/2,-G/2),g.current=y};return m=requestAnimationFrame(S),()=>{cancelAnimationFrame(m),b&&k&&b.cancelVideoFrameCallback?.(k)}},[i,a,h]),(0,ce.useEffect)(()=>{if(!i||!u||!l)return;let m=()=>!!l.pointerLockElement,k=E=>{m()&&h.keyDown(E.key)},b=E=>h.keyUp(E.key),U=E=>{m()&&h.pointerDelta(E.movementX,E.movementY)},S=()=>{m()||h.clearKeys()},y=()=>h.clearKeys();return l.addEventListener("keydown",k),l.addEventListener("keyup",b),l.addEventListener("mousemove",U),l.addEventListener("pointerlockchange",S),l.defaultView?.addEventListener("blur",y),()=>{l.removeEventListener("keydown",k),l.removeEventListener("keyup",b),l.removeEventListener("mousemove",U),l.removeEventListener("pointerlockchange",S),l.defaultView?.removeEventListener("blur",y)}},[i,u,l,h]),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 we=require("zod"),Qe=require("react/jsx-runtime"),vn=we.z.object({metrics:we.z.array(we.z.object({label:we.z.string(),value:we.z.union([we.z.string(),we.z.number()]),unit:we.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:f}=t,l=Pe(),v=o??l,C=(0,J.useRef)(null),g=(0,J.useRef)(null),p=(0,J.useRef)(null),h=(0,J.useRef)(null),m=(0,J.useRef)(u);m.current=u;let k=(0,J.useRef)(c);k.current=c;let b=(0,J.useCallback)(d=>{p.current!==d&&(p.current=d,k.current?.(d))},[]),U=(0,J.useCallback)(()=>{if(typeof MediaStream>"u")return null;g.current||(g.current=new MediaStream);let d=C.current;return d&&d.srcObject!==g.current&&(d.srcObject=g.current),g.current},[]),S=(0,J.useCallback)(d=>{let x=C.current;if(!x)return;let R=x.play();!R||typeof R.then!="function"||R.then(()=>{x.muted||b(!0)}).catch(_=>{let D=_ instanceof Error?_.name:String(_);if(D==="AbortError"){Sr(`play() aborted (${d}); retrying in ${Cn}ms`),h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{h.current=null,S(`${d}:retry`)},Cn);return}if(D==="NotAllowedError"){Sr(`play() blocked pending a user gesture (${d})`),b(!1);return}Sr(`play() failed (${d})`,_)})},[b]),y=(0,J.useCallback)(d=>{let x=U();if(x){for(let R of x.getAudioTracks())R!==d&&x.removeTrack(R);d&&!x.getAudioTracks().includes(d)&&x.addTrack(d),d&&S("track-attach"),m.current?.(d)}},[U,S]),E=(0,J.useCallback)(()=>{let d=C.current;d&&(U(),d.muted=!1,S("gesture"),Rt(),b(!0))},[U,S,b]);(0,J.useImperativeHandle)(r,()=>({unlock:E,get unlocked(){return p.current===!0},get element(){return C.current}}),[E]);let T=(0,J.useCallback)(d=>{C.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),U()),f?.(d)},[U,f]),O=s!==void 0;return(0,J.useEffect)(()=>{if(O){y(s??null);return}if(!v)return;let d=v.stream(n),x=()=>{let I=g.current;return I?I.getAudioTracks()[0]??null:null},R=I=>{if(I!==x()&&(y(I),I)){let N=()=>{x()===I&&y(null)};I.addEventListener("ended",N)}},_=d.track;_&&_.readyState==="live"&&R(_);let D=d.on("track",I=>{I&&I.readyState!=="live"||R(I)}),G=setInterval(()=>{let I=d.track;I&&I.readyState==="live"&&R(I)},Co);return()=>{D(),clearInterval(G)}},[v,n,O,s,y]),(0,J.useEffect)(()=>(0,Pn.observePageLifecycle)(()=>{Rt(),p.current===!0&&S("foreground")}),[S]),(0,J.useEffect)(()=>()=>{h.current&&clearTimeout(h.current)},[]),(0,En.jsx)("audio",{ref:T,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:f,onError:l,onMicStream:v,onTrack:C,onUnlockChange:g,capture:p}=t,h=Pe(),m=o??h,k=(0,K.useRef)(null),b=(0,K.useRef)(null),U=(0,K.useRef)(null),S=(0,K.useRef)([]),y=(0,K.useRef)(!1),E=(0,K.useRef)(f);E.current=f;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,E.current?.(N))},[]),x=(0,K.useCallback)(()=>{for(let N of S.current)N();S.current=[],U.current?.release(),U.current=null,b.current&&(b.current=null,O.current?.(null))},[]),R=(0,K.useCallback)(async()=>{let N=U.current;if(N){let j=await N.update(i);return b.current=N.stream,O.current?.(N.stream),j}let $=await(p??(0,et.sharedCaptureController)()).claim("audio",i);U.current=$,S.current=[$.onTrack((j,se)=>{b.current=se,O.current?.(se),y.current&&m?.stream(n).attach(j).catch(le=>Ot("mic re-attach after one-capture re-acquire failed",le))}),$.onLost(j=>{U.current=null,S.current=[],b.current=null,O.current?.(null),d(!1),T.current?.(j)})],b.current=$.stream,O.current?.($.stream);let W=$.track;if(!W)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return W},[p,i,m,n,d]),_=(0,K.useCallback)(async()=>{x(),d(!1),await m?.stream(n).detach().catch(()=>{})},[m,n,x,d]),D=(0,K.useCallback)(async()=>{if(!m)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");k.current?.unlock();let N;try{N=await R()}catch(W){x();let j=(0,et.sessionFailureFromMediaError)(W,m.status);throw T.current?.(j),j}m.connect?.();let H;for(let W=1;W<=u;W++)try{await m.whenLive(a!==void 0?{timeout:a}:void 0),await m.stream(n).attach(N),d(!0);return}catch(j){H=j,Ot(`start attempt ${W}/${u} failed`,j),W<u&&await new Promise(se=>setTimeout(se,c))}x(),d(!1);let $=H instanceof Error?H:new Error(String(H??"voice start failed"));throw T.current?.($),$},[m,n,a,u,c,R,x,d]);(0,K.useImperativeHandle)(r,()=>({start:D,stop:_,unlock:()=>k.current?.unlock(),get active(){return y.current},get micStream(){return b.current},get audio(){return k.current}}),[D,_]);let G=(0,K.useRef)(!1),I=(0,K.useCallback)(async()=>{if(!m||!y.current||G.current)return;let N=b.current?.getAudioTracks()[0]??null;if(N&&N.readyState==="live"){try{await m.stream(n).attach(N)}catch(H){Ot("foreground mic re-assert failed (will retry on next pass)",H)}return}G.current=!0;try{let H=await R();await m.stream(n).attach(H)}catch(H){let $=H instanceof Error?H:new Error(String(H));Ot("foreground mic re-acquire failed",$),T.current?.($)}finally{G.current=!1}},[m,n,R]);return(0,K.useEffect)(()=>{let N=()=>{I()};return m&&typeof m.onRecovery=="function"?m.onRecovery(N):(0,et.observePageLifecycle)(N)},[m,I]),(0,K.useEffect)(()=>x,[x]),s?(0,wn.jsx)(Ct,{ref:k,session:m,stream:n,onTrack:C,onUnlockChange:g}):null}),Tn=Pt;var ye=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,f;try{c=a.createMediaStreamSource(u),f=a.createAnalyser(),f.fftSize=r,c.connect(f)}catch{return}let l=new Uint8Array(f.fftSize),C=setInterval(()=>{f.getByteTimeDomainData(l);let g=0;for(let h=0;h<l.length;h++){let m=(l[h]-128)/128;g+=m*m}let p=Math.sqrt(g/l.length);i(h=>{let m=p>n;return Math.abs(h.level-p)<.005&&h.speaking===m?h:{level:p,speaking:m}})},o);return()=>{clearInterval(C),c.disconnect(),i(yr)}},[e,r,o,n]),s}var Ae=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,ye.forwardRef)(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:u,onActiveChange:c,onError:f,onMicStream:l,capture:v}=t,C=Pe(),g=o??C,p=(0,ye.useRef)(null),[h,m]=(0,ye.useState)(null),k=(0,ye.useRef)(l);k.current=l;let{level:b,speaking:U}=Vt(a?h:null);return(0,ye.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,ye.useEffect)(()=>{!i||!g||p.current?.start().catch(()=>{})},[i,g]),(0,Ae.jsxs)(Ae.Fragment,{children:[(0,Ae.jsx)(Pt,{ref:p,session:g,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...v!==void 0?{capture:v}:{},onActiveChange:c,onError:f,onMicStream:S=>{m(S),k.current?.(S)}}),a?(0,Ae.jsx)("span",{className:u,style:Po,"data-urun-mic":"","data-urun-mic-active":h?"true":"false","data-urun-mic-speaking":U?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(b*100)/100,children:(0,Ae.jsx)("span",{style:xo,children:(0,Ae.jsx)("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(b*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});var tt=require("@urun-sh/core"),M=require("react");var fe=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:f="auto",connectTimeoutMs:l,visible:v=!1,className:C,videoClassName:g,onActiveChange:p,onError:h,onStream:m,onTrack:k,children:b,capture:U,flipControl:S="auto",flipControlClassName:y,onDevices:E}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let T=i?"user":a?"environment":u??"environment",O=Pe(),d=o??O,x=(0,M.useRef)(null),R=(0,M.useRef)(null),_=(0,M.useRef)(null),D=(0,M.useRef)([]),G=(0,M.useRef)(null),I=(0,M.useRef)(!1),N=(0,M.useRef)(!1),H=(0,M.useRef)(T),[$,W]=(0,M.useState)(T),[j,se]=(0,M.useState)(!1),[le,Z]=(0,M.useState)(null),[B,ee]=(0,M.useState)(!1),[X]=(0,M.useState)(Eo),ue=(0,M.useRef)(p);ue.current=p;let z=(0,M.useRef)(h);z.current=h;let de=(0,M.useRef)(m);de.current=m;let P=(0,M.useRef)(k);P.current=k;let q=(0,M.useRef)(E);q.current=E;let w=(0,M.useCallback)(V=>{I.current!==V&&(I.current=V,se(V),ue.current?.(V))},[]);(0,M.useEffect)(()=>{if(!j){Z(null);return}let V=!1,F=()=>{To().then(Ce=>{V||(Z(Ce),Ce&&q.current?.(Ce))})};F();let ve=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof ve?.addEventListener=="function"?(ve.addEventListener("devicechange",F),()=>{V=!0,ve.removeEventListener?.("devicechange",F)}):()=>{V=!0}},[j]);let te=(0,M.useCallback)(V=>{let F=x.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?.(ve=>kr("preview play() failed",ve)))},[]),ne=(0,M.useCallback)(()=>{N.current=!1,G.current?.(),G.current=null;for(let V of D.current)V();D.current=[],_.current?.release(),_.current=null,R.current&&(R.current=null,de.current?.(null),P.current?.(null)),te(null)},[te]),be=(0,M.useCallback)((V,F)=>{G.current?.(),R.current=F,te(F),de.current?.(F);let ve=()=>{R.current===F&&(kr("camera track ended (device removed or permission revoked)"),ne(),w(!1))};V.addEventListener("ended",ve),G.current=()=>V.removeEventListener("ended",ve)},[te,ne,w]),A=(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 ve={...br,...s,facingMode:V},Ce;try{let _e=_.current;if(_e)Ce=await _e.update(ve);else{let ct=await(U??(0,tt.sharedCaptureController)()).claim("video",ve);if(_.current=ct,D.current=[ct.onTrack((lt,Zn)=>{be(lt,Zn),I.current&&(!F||!d||d.stream(n).attachVideo(lt).then(()=>P.current?.(lt)).catch(Qn=>kr("camera re-publish after one-capture re-acquire failed",Qn)))}),ct.onLost(lt=>{_.current=null,D.current=[],ne(),w(!1),z.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 z.current?.($e),$e}H.current=V,W(V),be(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(),w(!1);let $e=_e instanceof Error?_e:new Error(String(_e));throw z.current?.($e),$e}P.current?.(Ce),w(!0)},[d,n,s,l,U,be,ne,w]),xe=(0,M.useCallback)(V=>A(V?.facingMode??H.current),[A]),Ee=(0,M.useCallback)(async V=>{let F=N.current===n;I.current&&H.current===V&&F||await A(V)},[A,n]),Se=(0,M.useCallback)(()=>A(H.current==="environment"?"user":"environment"),[A]),Re=(0,M.useCallback)(async()=>{ne(),w(!1),n!==!1&&await d?.stream(n).detachVideo().catch(()=>{})},[d,n,ne,w]),Ke=(0,M.useCallback)(async V=>{let F=x.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:xe,stop:Re,flip:Se,setFacingMode:Ee,capturePhoto:Ke,get active(){return I.current},get facingMode(){return H.current},get stream(){return R.current},get element(){return x.current}}),[xe,Re,Se,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 Er=f==="auto"?$==="user":f,rr=j&&(S===!0||S==="auto"&&X&&(le?.length??0)>1),wt=()=>{B||(ee(!0),Se().catch(()=>{}).finally(()=>ee(!1)))};return(0,fe.jsxs)("div",{className:C,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":$,children:[(0,fe.jsx)("video",{ref:x,className:g,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Er?{transform:"scaleX(-1)"}:{}}}),rr?(0,fe.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,fe.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,fe.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,fe.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,fe.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,fe.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,fe.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,b]})}),Un=(0,M.forwardRef)(function({preview:t=!0,...r},o){return(0,fe.jsx)(Rr,{ref:o,...r,visible:t,autoStart:!1})});var rt=require("@urun-sh/core"),re=require("react");function Mn(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=(0,re.useState)(null),[a,u]=(0,re.useState)(null),[c,f]=(0,re.useState)(!1),[l,v]=(0,re.useState)(null),[C]=(0,re.useState)(rt.cameraCaptureAvailable),g=(0,re.useRef)(n);g.current=n;let p=(0,re.useRef)(null),h=(0,re.useRef)(0),m=(0,re.useCallback)(y=>{p.current&&URL.revokeObjectURL(p.current),p.current=y?URL.createObjectURL(new Blob([y.bytes],{type:y.type})):null,u(p.current),i(y),g.current?.(y)},[]);(0,re.useEffect)(()=>()=>{h.current++,p.current&&URL.revokeObjectURL(p.current),p.current=null},[]);let k=(0,re.useCallback)(async y=>{let E=++h.current;f(!0),v(null);try{let T=await y();if(h.current!==E)return;m(T)}catch(T){if(h.current!==E)return;v((0,rt.referenceImageErrorMessage)(T))}finally{h.current===E&&f(!1)}},[m]),b=(0,re.useCallback)(y=>k(()=>(0,rt.normalizeReferenceImage)(y,{maxSize:t,type:r,quality:o,source:"file"})),[k,t,r,o]),U=(0,re.useCallback)(y=>k(()=>y.capturePhoto({maxSize:t,type:r,quality:o})),[k,t,r,o]),S=(0,re.useCallback)(()=>{h.current++,v(null),f(!1),m(null)},[m]);return{reference:s,previewUrl:a,pick:b,capture:U,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 Ie=200;function Ue(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=>Ue(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}var ke=require("react/jsx-runtime");function Dn({session:e,name:t,cap:r,className:o}){let n=jt(e,t,{cap:r});return(0,ke.jsxs)("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[(0,ke.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,ke.jsx)("code",{children:t}),(0,ke.jsxs)("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),(0,ke.jsx)("div",{className:"urun-stream-tail-log",children:n.length===0?(0,ke.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,ke.jsx)("code",{children:t})," messages\u2026"]}):n.map((s,i)=>(0,ke.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,ke.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",ot(s.payload)]},`${s.at}-${i}`))})]})}var xt=require("react");var me=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,me.jsxs)("div",{className:"urun-doc-patch",children:[(0,me.jsx)("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),(0,me.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,me.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?(0,me.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function 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,me.jsxs)("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[(0,me.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,me.jsx)("code",{children:t}),(0,me.jsx)("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),(0,me.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?(0,me.jsx)(Et,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}var Kt=require("react");var Me=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=>Ue(u,{at:Date.now(),direction:"in",text:Fn(ot(a))},r))}):void 0),[e,t,r]),(0,Me.jsxs)("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[(0,Me.jsx)(Et,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>Ue(u,{at:Date.now(),direction:"out",text:Fn(a)},r))}}),(0,Me.jsx)("div",{className:"urun-control-sender-log",children:n.length===0?(0,Me.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>(0,Me.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,Me.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,Me.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=>Ue(C,{at:Date.now(),kind:l,text:v},o)),f=[];f.push(e.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of t){let v=e.stream(l);f.push(v.on("track",C=>c("track",`${l}: ${C?"track arrived":"track ended"}`)))}for(let l of r){let v=e.doc(l);f.push(v.on("change",()=>c("doc",`${l} changed`)))}return()=>f.forEach(l=>l())},[e,a,u,o]),(0,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,f)=>(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}-${f}`))})}var Qt=require("@urun-sh/core");var zt=require("react");function ge(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=ge(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 he=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=ge(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,he.jsxs)("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[(0,he.jsx)("span",{className:"urun-session-status-dot","data-phase":o}),(0,he.jsx)("span",{className:"urun-session-status-label",children:_o[o]}),n?(0,he.jsx)("span",{className:"urun-session-status-detail",children:n}):null]})}function Kn({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=ge(e);if(s?.name==="live")return(0,he.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,(0,he.jsx)(Zt,{session:e})]});let i=r?r(s):(0,he.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,he.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,he.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?(0,he.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 ge(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=ge(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 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 xr(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=xr(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,f=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:f,authProvider:l}).then(p=>{v||o(p)}).catch(()=>{})};C();let g=setInterval(C,Math.max(1,i)*1e3);return()=>{v=!0,clearInterval(g)}},[n,s,i,a,u,c,f,l]),r}var tr=require("@urun-sh/core");0&&(module.exports={Audio,Camera,ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,Image,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,Mic,OPERATOR_CHORD_LABEL,OPERATOR_TOKEN_STORAGE_KEY,ProgressCard,ProgressCardSchema,ReprojectedVideo,Session,StatusBadge,StatusBadgeSchema,TextStream,TextStreamSchema,UrunActivationOverlay,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,UrunDocPanel,UrunErrorBoundary,UrunEventSpine,UrunIdleWarning,UrunJwtProvider,UrunProvider,UrunSessionClock,UrunSessionEnded,UrunSessionGate,UrunSessionStatus,UrunSessionWaking,UrunStreamTail,UrunVoice,Video,Voice,authMode,createDocStore,describeSessionPhase,formatPayload,getUrunAudioContext,isWakingPhase,parseJsonObject,pushCapped,readOperatorToken,registerComponent,resumeUrunAudioContext,urunPublicEnv,useActivation,useApp,useChat,useCompletion,useConfirmOnLeave,useDocStore,useImageFrame,useInputPresence,useMetricsPanel,useOperatorOverride,useProgressCard,useReferenceImage,useRequest,useSession,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"use client"
|
|
2
|
-
import{a as rn,b as nn,c as St}from"./chunk-WF2OBDSX.mjs";import{useCallback as hn,useEffect as tr,useMemo as Sn,useRef as rr,useState as Xe}from"react";import{Component as on}from"react";import{jsx as Gt,jsxs as sn}from"react/jsx-runtime";var De=class extends on{constructor(t){super(t),this.state={error:null}}static getDerivedStateFromError(t){return{error:t}}componentDidCatch(t,r){console.error("[urun] Error caught by UrunErrorBoundary:",t,r)}render(){if(this.state.error){let{fallback:t}=this.props;return typeof t=="function"?t(this.state.error):t||sn("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[Gt("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),Gt("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as an}from"react";var we=an(null);function ye(e){return e&&e.trim()?e.trim():void 0}function me(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"VERCEL_ENV":return ye(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return ye(typeof process<"u"?process.env?.[e]:void 0)}}function Je(){let e=me("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||me("VERCEL_ENV")==="production"?"workos":me("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function un(){return Je()==="workos"}import{useEffect as cn,useRef as ln}from"react";var dn="urun.operator_token",Zt=null,Yt="op",pn="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function Qt(){return typeof window<"u"}function er(){return Zt}function mn(){if(!Qt())return null;let e=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash;if(!e)return null;let t=new URLSearchParams(e),r=t.get(Yt);if(!r)return null;Zt=r,t.delete(Yt);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function fn(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function vt(e){let t=ln(e);t.current=e,cn(()=>{if(!Qt())return;mn();let r=o=>{if(!fn(o))return;let n=er();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}import{useEffect as gn}from"react";function yt(e=!0){gn(()=>{if(!e||typeof window>"u"||typeof window.addEventListener!="function")return;let t=r=>(r.preventDefault(),r.returnValue="","");return window.addEventListener("beforeunload",t),()=>window.removeEventListener("beforeunload",t)},[e])}import{jsx as Ve,jsxs as Cn}from"react/jsx-runtime";var vn="/api/urun-token",yn=1e4;function kn(e){let t=e.split(".")[1];if(!t)return null;try{let r=t.replace(/-/g,"+").replace(/_/g,"/"),o=r.padEnd(r.length+(4-r.length%4)%4,"="),s=JSON.parse(atob(o)).exp;return typeof s=="number"&&Number.isFinite(s)?s*1e3:null}catch{return null}}async function nr(e,t){let r=await fetch(e,{method:"POST",signal:t});if(!r.ok)throw new Error(`[urun] token endpoint ${e} answered ${r.status}`);let o=await r.json(),n=typeof o.token=="string"?o.token:"",s=typeof o.orgId=="string"?o.orgId:"";if(!n||!s)throw new Error(`[urun] token endpoint ${e} returned no { token, orgId } \u2014 is it createTokenRoute() from @urun-sh/next?`);return{token:n,orgId:s,gatewayUrl:typeof o.gatewayUrl=="string"?o.gatewayUrl:void 0}}function bn(e,t){return typeof e=="function"?e(t):e!==void 0?e:Cn("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[Ve("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),Ve("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function Rn({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,confirmOnLeave:f=!1,fallback:l,errorFallback:v,children:P}){let g=n===void 0&&t===void 0;if(!g&&(typeof t!="string"||t.trim().length===0))throw new Error("[urun] <UrunProvider> requires a non-empty orgId \u2014 set your org id deployment env var (e.g. NEXT_PUBLIC_SESSION_TENANT_ID) and pass it through the provider (or pass NEITHER orgId NOR jwt to let the provider mint from its tokenEndpoint).");if(!g&&(typeof e!="string"||e.trim().length===0))throw new Error("[urun] <UrunProvider> requires baseUrl when orgId/jwt are passed explicitly (self-mint mode reads it from the token endpoint instead).");let p=r??o;if(g&&(typeof p!="string"||p.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);yt(f);let[h,m]=Xe(),[k,b]=Xe(),[x,S]=Xe(null),y=rr(void 0),w=rr(null),[T,I]=Xe(null);vt(K=>I({jwt:K}));let d=St(),E=me("NEXT_PUBLIC_SESSION_TOKEN")??me("NEXT_PUBLIC_URUN_JWT"),R=Je(),U=T!==null,O=R==="workos"&&!n&&!U&&!g,z=n??(R==="jwt"?E:void 0)??h??k?.token,N=U?T.jwt:z,_=s??me("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),F=O&&!N,B=t??k?.orgId,q=e??k?.gatewayUrl,W=g&&k===void 0,G=g&&k!==void 0&&!q?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,ee=x??G,J=u??vn,H=hn(async K=>{if(!K?.forceRefresh){let $=y.current;if(!$)return $;let C=kn($);if(C===null||C-Date.now()>yn)return $}return(await(w.current??(w.current=(async()=>{try{let $=await nr(J);return y.current=$.token,b($),$}finally{w.current=null}})()))).token},[J]),X=Sn(()=>({appId:p,baseUrl:q??"",orgId:B??"",jwt:N,getAccessToken:O?d?.getAccessToken:g&&!U?H:void 0,authProvider:_,eventsUrl:i,sessionKey:a,releaseOnLeave:c,priority:U?"preempt":void 0}),[p,d,q,_,N,i,B,a,c,O,U,g,H]);return tr(()=>{if(!g)return;let K=new AbortController;return S(null),(async()=>{try{let Z=await nr(J,K.signal);y.current=Z.token,b(Z)}catch(Z){if(K.signal.aborted)return;S(Z instanceof Error?Z:new Error(String(Z)))}})(),()=>K.abort()},[g,J]),tr(()=>{if(!O||!d)return;let K=!1,Z=d;async function $(){try{let L=await Z.getAccessToken();K||m(L??void 0)}catch{K||m(void 0)}}$();let C=window.setInterval(()=>{$()},6e4);return()=>{K=!0,window.clearInterval(C)}},[d,O]),Ve(De,{fallback:l,children:ee?bn(v,ee):F||W?Ve("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Ve(we.Provider,{value:X,children:P})})}import{useContext as Pn,useEffect as En,useMemo as or,useReducer as wn,useRef as kt}from"react";import{App as Tn}from"@urun-sh/core";function xn(e,t){return`${e}:${JSON.stringify(t??{})}`}function An(e,t,r){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,fnName:t,args:r??{}})}var ke=new Map;var bt=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},Rt=class{constructor(t,r){this._stream=t;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(t){return this._stream.attach(t)}attachVideo(t){return this._stream.attachVideo(t)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(t){return this._stream.seek(t)}chunks(t){return this._stream.chunks(t)}onSeeked(t){return this._stream.onSeeked(t)}on(t,r){return this._stream.on(t,r)}messages(){return this._stream.messages()}emit(t,r){return this._stream.emit(t,r)}dispose(){this._unsubscribeTrack()}},Ct=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||a.name==="expired"){let u=a.error,c=u?.reason??(a.name==="expired"?`session ${this._session.id} expired`:`session ${this._session.id} entered the error phase`);n({level:"error",kind:"phase-error",message:c,detail:{sessionId:this._session.id,code:u?.code,kind:u?.kind,httpStatus:u?.httpStatus}})}else a.name==="live"&&!r&&(r=!0,n({level:"info",kind:"session-live",message:`session ${this._session.id} live`}))}),i=this._unsubscribeReporterDiagnostic;this._unsubscribeReporterDiagnostic=()=>{i(),s()}}addNotifier(t){this._notifiers.add(t)}removeNotifier(t){this._notifiers.delete(t)}_notifyAll(){for(let t of this._notifiers)t()}get id(){return this._session.id}get mediaTransport(){return this._session.mediaTransport}get phase(){return this._session.phase}get status(){return this._session.status}get endsAt(){return this._session.endsAt}onPhase(t){return this._session.onPhase(t)}onDiagnostic(t){return this._session.onDiagnostic(t)}whenLive(t){return this._session.whenLive(t)}recover(){this._session.recover()}onRecovery(t){return this._session.onRecovery(t)}request(t,r){return this._session.request(t,r)}requestStream(t,r){return this._session.requestStream(t,r)}complete(t,r){return this._session.complete(t,r)}get recordings(){return this._session.recordings}get artifacts(){return this._session.artifacts}get presence(){return this._session.presence}touch(){this._session.touch()}doc(t){let r=this._docs.get(t);return r||(r=new bt(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new Rt(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}disconnect(){this._disposeHandle(),this._session.disconnect()}_disposeHandle(){this._disposed=!0;for(let t of this._docs.values())t.dispose();for(let t of this._streams.values())t.dispose();this._docs.clear(),this._streams.clear(),this._unsubscribePhase(),this._unsubscribeReporterDiagnostic?.(),this._notifyAll(),this._notifiers.clear()}};function Un(){let e=Pn(we);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=wn(i=>i+1,0),r=kt(new Map),o=kt(new Map),n=kt(null),s=or(()=>Tn(e.appId,{baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,getAccessToken:e.getAccessToken,authProvider:e.authProvider,sessionKey:e.sessionKey,releaseOnLeave:e.releaseOnLeave,priority:e.priority}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority]);return En(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=ke.get(a);c===u&&o.current.get(a)===u&&(c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null),c.handle.addNotifier(t),c.refCount+=1)}}return()=>{let a=new Map;for(let[u,c]of o.current){let f=ke.get(u);f===c&&(f.handle.removeNotifier(t),f.refCount=Math.max(0,f.refCount-1),a.set(u,f),f.refCount===0&&(f.disposeTimer=setTimeout(()=>{let l=ke.get(u);!l||l.refCount!==0||(ke.delete(u),l.handle.disconnect())},0)))}n.current=a}},[]),or(()=>{let i=new Map;return new Proxy({},{get(a,u){if(typeof u!="string")return;let c=i.get(u);if(c)return c;let f=l=>{let v=xn(u,l),P=r.current.get(v);if(P&&!P.disposed)return P;let g=An(e,u,l),p=ke.get(g);return p?.handle.disposed&&(p.disposeTimer&&clearTimeout(p.disposeTimer),ke.delete(g),o.current.get(g)===p&&o.current.delete(g),p=void 0),p?p.disposeTimer&&(clearTimeout(p.disposeTimer),p.disposeTimer=null):(p={handle:new Ct(s[u](l),t,e.eventsUrl),refCount:0,disposeTimer:null},ke.set(g,p)),o.current.get(g)!==p&&(o.current.set(g,p),p.handle.addNotifier(t),p.refCount+=1),r.current.set(v,p.handle),p.handle};return i.set(u,f),f}})},[e,s])}import{useCallback as Pt,useEffect as Mn,useMemo as _n,useRef as Ge,useState as Et}from"react";function Te(e){let t=e;if(!t||typeof t.request!="function"||typeof t.requestStream!="function")throw new Error("This session does not support request/requestStream. Upgrade @urun-sh/core to a version that ships the request/response primitive.");return t}function Nn(e){return e instanceof Error?e:new Error(String(e))}function In(e,t){let r=_n(()=>Te(e),[e]),[o,n]=Et(void 0),[s,i]=Et(null),[a,u]=Et(!1),c=Ge(t);c.current=t;let f=Ge(0),l=Ge(null),v=Ge(!0);Mn(()=>(v.current=!0,()=>{v.current=!1,l.current?.abort()}),[]);let P=Pt(async h=>{l.current?.abort();let m=new AbortController;l.current=m;let k=++f.current,b=()=>v.current&&f.current===k;b()&&(u(!0),i(null));try{let x=await r.request(h,{...c.current,signal:m.signal});return b()&&(n(x),u(!1),c.current?.onSuccess?.(x)),x}catch(x){let S=Nn(x);throw b()&&(i(S),u(!1),c.current?.onError?.(S)),S}},[r]),g=Pt(h=>{P(h).catch(()=>{})},[P]),p=Pt(()=>{f.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:g,mutateAsync:P,data:o,error:s,isPending:a,reset:p}}import{useCallback as sr,useEffect as Ln,useMemo as On,useRef as Ye,useState as wt}from"react";function ir(e){return e instanceof Error?e:new Error(String(e))}var Dn=e=>typeof e=="string"?e:String(e);function Vn(e,t){let r=On(()=>Te(e),[e]),[o,n]=wt(""),[s,i]=wt(!1),[a,u]=wt(null),c=Ye(t);c.current=t;let f=Ye(0),l=Ye(null),v=Ye(!0);Ln(()=>(v.current=!0,()=>{v.current=!1,l.current?.cancel(),l.current=null}),[]);let P=sr(()=>{f.current++,l.current?.cancel(),l.current=null,v.current&&i(!1)},[]),g=sr(async p=>{l.current?.cancel();let h=++f.current,m=()=>v.current&&f.current===h,k=c.current,b=k?.parseChunk??Dn,x=k?.buildPayload??(R=>({prompt:R}));m()&&(n(""),u(null),i(!0));let{parseChunk:S,buildPayload:y,onFinish:w,onError:T,...I}=k??{},d="",E;try{E=r.requestStream(x(p),I),l.current=E}catch(R){let U=ir(R);m()&&(u(U),i(!1),k?.onError?.(U));return}try{for await(let R of E){if(f.current!==h)break;d+=b(R),m()&&n(d)}m()&&(i(!1),k?.onFinish?.(d))}catch(R){let U=ir(R);m()&&(u(U),i(!1),k?.onError?.(U))}finally{l.current===E&&(l.current=null)}},[r]);return{completion:o,complete:g,stop:P,isStreaming:s,error:a}}import{useCallback as ar,useEffect as Fn,useMemo as qn,useRef as xe,useState as Ze}from"react";function ur(e){return e instanceof Error?e:new Error(String(e))}var Hn=e=>typeof e=="string"?e:String(e),cr=0;function Tt(e){return cr+=1,`${e}-${cr}`}function Wn(e,t){let r=qn(()=>Te(e),[e]),[o,n]=Ze(()=>(t?.initialMessages??[]).map(b=>({id:b.id??Tt("msg"),role:b.role,content:b.content}))),[s,i]=Ze(""),[a,u]=Ze(!1),[c,f]=Ze(null),l=xe(t);l.current=t;let v=xe(o);v.current=o;let P=xe(s);P.current=s;let g=xe(0),p=xe(null),h=xe(!0);Fn(()=>(h.current=!0,()=>{h.current=!1,p.current?.cancel(),p.current=null}),[]);let m=ar(()=>{g.current++,p.current?.cancel(),p.current=null,h.current&&u(!1)},[]),k=ar(async b=>{let x=b===void 0,S=(x?P.current:b)??"";if(!S.trim())return;p.current?.cancel();let w=++g.current,T=()=>h.current&&g.current===w,I=l.current,d=I?.parseChunk??Hn,E={id:Tt("msg"),role:"user",content:S},R={id:Tt("msg"),role:"assistant",content:""},U=[...v.current,E].map(H=>({role:H.role,content:H.content})),O=[...v.current,E,R];v.current=O,n(O),x&&i(""),f(null),u(!0);let z=I?.buildPayload??(H=>({messages:H})),{initialMessages:N,parseChunk:_,buildPayload:F,onFinish:B,onError:q,...W}=I??{},G=H=>{n(X=>X.map(K=>K.id===R.id?{...K,content:H}:K))},ee="",J;try{J=r.requestStream(z(U),W),p.current=J}catch(H){let X=ur(H);T()&&(f(X),u(!1),I?.onError?.(X));return}try{for await(let H of J){if(g.current!==w)break;ee+=d(H),T()&&G(ee)}T()&&(u(!1),I?.onFinish?.({...R,content:ee}))}catch(H){let X=ur(H);T()&&(f(X),u(!1),I?.onError?.(X))}finally{p.current===J&&(p.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:k,stop:m,isStreaming:a,error:c}}import{useCallback as fe,useEffect as lr,useMemo as Bn,useRef as dr,useState as pr}from"react";import{createInputPresencePublisher as jn,INPUT_PRESENCE_DEFAULT_HZ as Kn,INPUT_PRESENCE_FIELD as $n}from"@urun-sh/core";var xt=[];function zn(e,t={}){let{field:r=$n,hz:o=Kn}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=Bn(()=>s?jn({awareness:{setLocalStateField:(S,y)=>s.setField(S,y)},field:r,hz:o}):null,[s,r,o]),a=dr(null);a.current=i;let[u,c]=pr(!1),[f,l]=pr(xt),v=dr(!1);lr(()=>{if(i)return()=>i.dispose()},[i]);let P=fe(()=>{let S=a.current;l(S?S.heldKeys():xt)},[]),g=fe(()=>{a.current?.clear(),l(xt)},[]);lr(()=>{if(!n)return;let S=()=>!!n.pointerLockElement,y=()=>{if(S()){v.current=!1,c(!0);return}v.current||(c(!1),g())},w=R=>{S()&&(a.current?.keyDown(R.key),P())},T=R=>{a.current?.keyUp(R.key),P()},I=R=>{S()&&a.current?.movePointer(R.movementX,R.movementY)},d=R=>{S()&&a.current?.setButtons(R.buttons)},E=()=>{g()};return n.addEventListener("pointerlockchange",y),n.addEventListener("keydown",w),n.addEventListener("keyup",T),n.addEventListener("mousemove",I),n.addEventListener("mousedown",d),n.addEventListener("mouseup",d),n.defaultView?.addEventListener("blur",E),()=>{n.removeEventListener("pointerlockchange",y),n.removeEventListener("keydown",w),n.removeEventListener("keyup",T),n.removeEventListener("mousemove",I),n.removeEventListener("mousedown",d),n.removeEventListener("mouseup",d),n.defaultView?.removeEventListener("blur",E)}},[n,g,P]);let p=fe(S=>{S.requestPointerLock?.()},[]),h=fe(()=>{v.current=!0,c(!0)},[]),m=fe(()=>{v.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),g()},[n,g]),k=fe(S=>{a.current?.keyDown(S),P()},[P]),b=fe(S=>{a.current?.keyUp(S),P()},[P]),x=fe((S,y)=>{a.current?.movePointer(S,y)},[]);return{engage:p,engageTouch:h,release:m,engaged:u,heldKeys:f,pressKey:k,releaseKey:b,movePointer:x}}import{forwardRef as no,useEffect as Sr,useImperativeHandle as oo,useMemo as so,useRef as et}from"react";import{createCameraWarp as io}from"@urun-sh/core";import{forwardRef as Zn,useCallback as Ae,useEffect as Qe,useImperativeHandle as Qn,useRef as ie,useState as fr}from"react";import{createContext as Jn,useContext as mr}from"react";import{jsx as Yn}from"react/jsx-runtime";var At=Jn(null);function Xn({session:e,children:t}){return Yn(At.Provider,{value:e,children:t})}function ce(){return mr(At)}function Gn(){let e=mr(At);if(!e)throw new Error("[urun] useSession() needs a mounted <Session session={...}> ancestor with a non-null session \u2014 create one with useApp() (e.g. app.generate({...})) and pass it to the scope.");return e}import{jsx as hr,jsxs as ro}from"react/jsx-runtime";function eo(e,t){return e-t>>>0<2147483648}var gr=1e3;function to(...e){console.debug("[video]",...e)}var Ue=Zn(function(t,r){let{session:o,stream:n="video",audioStream:s="audio",track:i,muted:a=!0,mirror:u=!1,objectFit:c="contain",className:f,style:l,videoClassName:v,placeholder:P,poster:g,children:p,onTrack:h,onFirstFrame:m,frameMarker:k,onFrameMarkerReached:b,onFrameMarkerUnsupported:x}=t,S=ce(),y=o??S,w=ie(null),T=ie(null),[I,d]=fr(!1),[E,R]=fr(!1),U=ie(!1),O=ie(h);O.current=h;let z=ie(m);z.current=m;let N=ie(b);N.current=b;let _=ie(x);_.current=x;let F=ie(k??null);F.current=k??null;let B=ie(null),q=ie(null),W=Ae((C,L=!1)=>{if(!L&&C===B.current||(B.current=C,q.current?.(),q.current=null,U.current=!1,R(!1),!C))return;let M=w.current;if(!M)return;let j=F.current,re=j?.rtpTimestamp??null,Y=!1,A=()=>{Y||(Y=!0,_.current?.())};j&&re==null&&A();let te=j!=null&&re!=null,ve=oe=>{q.current?.(),q.current=null,U.current=!0,R(!0),z.current?.(),oe&&N.current?.()};if(typeof M.requestVideoFrameCallback=="function"){let oe=!1,Pe=0,Ie=(gt,ht)=>{if(!oe){if(te){let ze=ht?.rtpTimestamp;if(typeof ze!="number"){A(),ve(!1);return}if(!eo(ze,re)){Pe=M.requestVideoFrameCallback(Ie);return}ve(!0);return}ve(!1)}};Pe=M.requestVideoFrameCallback(Ie),q.current=()=>{oe=!0,M.cancelVideoFrameCallback?.(Pe)};return}te&&A();let ne=()=>{let oe=M.getVideoPlaybackQuality?.();(oe?oe.totalVideoFrames>0:M.readyState>=2&&M.videoWidth>0)&&ve(!1)};M.addEventListener("loadeddata",ne),M.addEventListener("timeupdate",ne),M.addEventListener("playing",ne),q.current=()=>{M.removeEventListener("loadeddata",ne),M.removeEventListener("timeupdate",ne),M.removeEventListener("playing",ne)},ne()},[]);Qe(()=>()=>{q.current?.(),q.current=null},[]);let G=k==null?null:`${k.rtpTimestamp??""}|${k.ptsMs??""}`,ee=ie(G);Qe(()=>{if(ee.current===G||(ee.current=G,G==null))return;let C=B.current;C&&W(C,!0)},[G,W]);let J=Ae(()=>{if(typeof MediaStream>"u")return null;T.current||(T.current=new MediaStream);let C=w.current;return C&&C.srcObject!==T.current&&(C.srcObject=T.current),T.current},[]),H=Ae(C=>{let L=w.current;if(!L)return;let M=L.play();!M||typeof M.catch!="function"||M.catch(j=>to(`play() failed (${C})`,j))},[]),X=Ae(C=>{let L=J();if(L){for(let M of L.getVideoTracks())M!==C&&L.removeTrack(M);if(C&&!L.getVideoTracks().includes(C)){L.addTrack(C);let M=w.current;M&&(M.srcObject=L)}C&&H("track-attach"),d(C!==null),W(C),O.current?.(C)}},[J,H,W]),K=Ae(C=>{let L=J();if(L){for(let M of L.getAudioTracks())M!==C&&L.removeTrack(M);C&&!L.getAudioTracks().includes(C)&&L.addTrack(C),C&&H("audio-attach")}},[J,H]),Z=Ae(C=>{w.current=C,C&&(a&&(C.muted=!0,C.defaultMuted=!0,C.setAttribute("muted","")),C.setAttribute("playsinline",""),C.setAttribute("webkit-playsinline",""),J())},[J,a]);Qn(r,()=>({get element(){return w.current},get live(){return T.current?T.current.getVideoTracks().length>0:!1},get framed(){return U.current}}),[]);let $=i!==void 0;return Qe(()=>{if($){X(i??null);return}if(!y)return;let C=y.stream(n),L=()=>{let A=T.current;return A?A.getVideoTracks()[0]??null:null},M=A=>{if(A!==L()&&(X(A),A)){let te=()=>{L()===A&&X(null)};A.addEventListener("ended",te)}},j=C.track;j&&j.readyState==="live"&&M(j);let re=C.on("track",A=>{A&&A.readyState!=="live"||M(A)}),Y=setInterval(()=>{let A=C.track;A&&A.readyState==="live"&&M(A)},gr);return()=>{re(),clearInterval(Y)}},[y,n,$,i,X]),Qe(()=>{if($||!y||s===!1)return;let C=y.stream(s),L=()=>{let A=T.current;return A?A.getAudioTracks()[0]??null:null},M=A=>{if(A!==L()&&(K(A),A)){let te=()=>{L()===A&&K(null)};A.addEventListener("ended",te)}},j=C.track;j&&j.readyState==="live"&&M(j);let re=C.on("track",A=>{A&&A.readyState!=="live"||M(A)}),Y=setInterval(()=>{let A=C.track;A&&A.readyState==="live"&&M(A)},gr);return()=>{re(),clearInterval(Y)}},[y,s,$,K]),ro("div",{className:f,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":I?"true":"false","data-urun-video-framed":E?"true":"false",children:[hr("video",{ref:Z,className:v,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),I?null:P,g===void 0?null:hr("div",{"data-urun-video-poster":"","aria-hidden":E||void 0,style:{position:"absolute",inset:0,...E?{opacity:0,pointerEvents:"none"}:null},children:g}),p]})});import{jsx as vr,jsxs as co}from"react/jsx-runtime";var ao={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},uo=no(function(t,r){let{warp:o,children:n,...s}=t,{enabled:i=!0,overscan:a=.08,captureInput:u=!0,documentTarget:c,...f}=o??{},l=c!==void 0?c:typeof document<"u"?document:null,v=et(null),P=et(null),g=et(0),p=et(f);p.current=f;let h=so(()=>io(p.current),[]);return oo(r,()=>({get video(){return v.current},get canvas(){return P.current},warp:h,get lastDrawTs(){return g.current}}),[h]),Sr(()=>{if(!i)return;let m=0,k=0,b=null,x=y=>{typeof y.requestVideoFrameCallback=="function"&&(b=y,k=y.requestVideoFrameCallback(function w(){h.frameArrived(),k=y.requestVideoFrameCallback(w)}))},S=y=>{m=requestAnimationFrame(S);let w=P.current,T=v.current?.element??null;if(!w||!T||(T!==b&&(b&&k&&b.cancelVideoFrameCallback?.(k),x(T)),T.readyState<2))return;h.tick(y);let I=typeof devicePixelRatio=="number"?devicePixelRatio:1,d=Math.max(1,Math.round(w.clientWidth*I)),E=Math.max(1,Math.round(w.clientHeight*I));(w.width!==d||w.height!==E)&&(w.width=d,w.height=E);let R=w.getContext("2d");if(!R)return;let U=h.transform(),O=T.videoWidth||d,z=T.videoHeight||E,_=Math.max(d/O,E/z)*(1+a)*U.scale;R.setTransform(_,0,0,_,d/2+U.translateX*d,E/2+U.translateY*E),R.drawImage(T,-O/2,-z/2),g.current=y};return m=requestAnimationFrame(S),()=>{cancelAnimationFrame(m),b&&k&&b.cancelVideoFrameCallback?.(k)}},[i,a,h]),Sr(()=>{if(!i||!u||!l)return;let m=()=>!!l.pointerLockElement,k=w=>{m()&&h.keyDown(w.key)},b=w=>h.keyUp(w.key),x=w=>{m()&&h.pointerDelta(w.movementX,w.movementY)},S=()=>{m()||h.clearKeys()},y=()=>h.clearKeys();return l.addEventListener("keydown",k),l.addEventListener("keyup",b),l.addEventListener("mousemove",x),l.addEventListener("pointerlockchange",S),l.defaultView?.addEventListener("blur",y),()=>{l.removeEventListener("keydown",k),l.removeEventListener("keyup",b),l.removeEventListener("mousemove",x),l.removeEventListener("pointerlockchange",S),l.defaultView?.removeEventListener("blur",y)}},[i,u,l,h]),i?co(Ue,{ref:v,...s,videoClassName:s.videoClassName,style:{...s.style},children:[vr("canvas",{ref:P,style:ao,"data-urun-warp":""}),n]}):vr(Ue,{ref:v,...s,children:n})});var yr=new Map;function lo(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);yr.set(e,{component:t,schema:r})}function kr(e,t){let r=yr.get(e);if(!r)return{error:`Unknown component: "${e}"`};let o=r.schema.safeParse(t);return o.success?{Component:r.component,validatedProps:o.data}:{error:`Validation failed for "${e}": ${o.error.message}`}}import{Fragment as mo,jsx as tt}from"react/jsx-runtime";function po({name:e,props:t,fallback:r}){let o=kr(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?tt(mo,{children:r}):tt("div",{className:"urun-component-error",role:"alert",children:tt("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return tt(n,{...o.validatedProps})}import{z as Fe}from"zod";import{jsx as Ut,jsxs as br}from"react/jsx-runtime";var fo=Fe.object({step:Fe.number().min(0),total:Fe.number().min(1),label:Fe.string().optional(),variant:Fe.enum(["default","success","error"]).default("default")});function Rr(e){let{step:t,total:r,label:o,variant:n="default"}=e,s=Math.min(t/r*100,100),i=t>=r;return{step:t,total:r,label:o,variant:n,percentage:s,isComplete:i}}function go(e){let{step:t,total:r,label:o,variant:n,percentage:s}=Rr(e);return br("div",{className:"urun-progress-card","data-variant":n,children:[o&&Ut("div",{className:"urun-progress-label",children:o}),Ut("div",{className:"urun-progress-bar",children:Ut("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),br("div",{className:"urun-progress-text",children:[t,"/",r]})]})}import{z as Mt}from"zod";import{jsx as Cr,jsxs as yo}from"react/jsx-runtime";var ho=Mt.object({state:Mt.enum(["thinking","generating","idle","error"]),message:Mt.string().optional()}),So={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Pr(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??So[t]??t;return{state:t,message:n,isActive:o}}function vo(e){let{state:t,message:r,isActive:o}=Pr(e);return yo("span",{className:"urun-status-badge","data-state":t,children:[Cr("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),Cr("span",{className:"urun-status-message",children:r})]})}import{useRef as Er,useEffect as ko}from"react";import{z as _t}from"zod";import{jsx as wr,jsxs as Co}from"react/jsx-runtime";var bo=_t.object({text:_t.string(),streaming:_t.boolean().default(!1)});function Tr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function Ro(e){let{text:t,streaming:r}=Tr(e),o=Er(null),n=Er(0);return ko(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),Co("div",{className:"urun-text-stream",children:[wr("span",{ref:o,className:"urun-text-content"}),r&&wr("span",{className:"urun-text-cursor"})]})}import{z as rt}from"zod";import{jsx as xr,jsxs as wo}from"react/jsx-runtime";var Po=rt.object({src:rt.string().url(),alt:rt.string().optional(),caption:rt.string().optional()});function Ar(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function Eo(e){let{src:t,alt:r,caption:o}=Ar(e);return wo("figure",{className:"urun-image-frame",children:[xr("img",{className:"urun-image",src:t,alt:r}),o&&xr("figcaption",{className:"urun-image-caption",children:o})]})}import{z as ge}from"zod";import{jsx as Nt,jsxs as Ao}from"react/jsx-runtime";var To=ge.object({metrics:ge.array(ge.object({label:ge.string(),value:ge.union([ge.string(),ge.number()]),unit:ge.string().optional()}))});function Ur(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function xo(e){let{metrics:t}=Ur(e);return Nt("div",{className:"urun-metrics-panel",children:t.map((r,o)=>Ao("div",{className:"urun-metric-card",children:[Nt("div",{className:"urun-metric-label",children:r.label}),Nt("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}import{forwardRef as Uo}from"react";import{jsx as _o}from"react/jsx-runtime";var Mo=Uo(function(t,r){let{stream:o="image",...n}=t;return _o(Ue,{ref:r,stream:o,...n})});import{forwardRef as Io,useCallback as Me,useEffect as It,useImperativeHandle as Lo,useRef as _e}from"react";import{observePageLifecycle as Oo}from"@urun-sh/core";var nt=null;function No(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function ot(){if(nt)return nt;let e=No();return e?(nt=new e,nt):null}function st(){let e=ot();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{jsx as Fo}from"react/jsx-runtime";var Do=1e3,Mr=200;function Lt(...e){console.debug("[audio]",...e)}var it=Io(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:f}=t,l=ce(),v=o??l,P=_e(null),g=_e(null),p=_e(null),h=_e(null),m=_e(u);m.current=u;let k=_e(c);k.current=c;let b=Me(d=>{p.current!==d&&(p.current=d,k.current?.(d))},[]),x=Me(()=>{if(typeof MediaStream>"u")return null;g.current||(g.current=new MediaStream);let d=P.current;return d&&d.srcObject!==g.current&&(d.srcObject=g.current),g.current},[]),S=Me(d=>{let E=P.current;if(!E)return;let R=E.play();!R||typeof R.then!="function"||R.then(()=>{E.muted||b(!0)}).catch(U=>{let O=U instanceof Error?U.name:String(U);if(O==="AbortError"){Lt(`play() aborted (${d}); retrying in ${Mr}ms`),h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{h.current=null,S(`${d}:retry`)},Mr);return}if(O==="NotAllowedError"){Lt(`play() blocked pending a user gesture (${d})`),b(!1);return}Lt(`play() failed (${d})`,U)})},[b]),y=Me(d=>{let E=x();if(E){for(let R of E.getAudioTracks())R!==d&&E.removeTrack(R);d&&!E.getAudioTracks().includes(d)&&E.addTrack(d),d&&S("track-attach"),m.current?.(d)}},[x,S]),w=Me(()=>{let d=P.current;d&&(x(),d.muted=!1,S("gesture"),st(),b(!0))},[x,S,b]);Lo(r,()=>({unlock:w,get unlocked(){return p.current===!0},get element(){return P.current}}),[w]);let T=Me(d=>{P.current=d,d&&(d.setAttribute("playsinline",""),d.setAttribute("webkit-playsinline",""),x()),f?.(d)},[x,f]),I=s!==void 0;return It(()=>{if(I){y(s??null);return}if(!v)return;let d=v.stream(n),E=()=>{let N=g.current;return N?N.getAudioTracks()[0]??null:null},R=N=>{if(N!==E()&&(y(N),N)){let _=()=>{E()===N&&y(null)};N.addEventListener("ended",_)}},U=d.track;U&&U.readyState==="live"&&R(U);let O=d.on("track",N=>{N&&N.readyState!=="live"||R(N)}),z=setInterval(()=>{let N=d.track;N&&N.readyState==="live"&&R(N)},Do);return()=>{O(),clearInterval(z)}},[v,n,I,s,y]),It(()=>Oo(()=>{st(),p.current===!0&&S("foreground")}),[S]),It(()=>()=>{h.current&&clearTimeout(h.current)},[]),Fo("audio",{ref:T,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),Vo=it;import{forwardRef as qo,useCallback as Ne,useEffect as _r,useImperativeHandle as Ho,useRef as de}from"react";import{observePageLifecycle as Wo,sessionFailureFromMediaError as Bo,sharedCaptureController as jo}from"@urun-sh/core";import{jsx as $o}from"react/jsx-runtime";var Nr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function at(...e){console.debug("[voice]",...e)}var ut=qo(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=Nr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:f,onError:l,onMicStream:v,onTrack:P,onUnlockChange:g,capture:p}=t,h=ce(),m=o??h,k=de(null),b=de(null),x=de(null),S=de([]),y=de(!1),w=de(f);w.current=f;let T=de(l);T.current=l;let I=de(v);I.current=v;let d=Ne(_=>{y.current!==_&&(y.current=_,w.current?.(_))},[]),E=Ne(()=>{for(let _ of S.current)_();S.current=[],x.current?.release(),x.current=null,b.current&&(b.current=null,I.current?.(null))},[]),R=Ne(async()=>{let _=x.current;if(_){let W=await _.update(i);return b.current=_.stream,I.current?.(_.stream),W}let B=await(p??jo()).claim("audio",i);x.current=B,S.current=[B.onTrack((W,G)=>{b.current=G,I.current?.(G),y.current&&m?.stream(n).attach(W).catch(ee=>at("mic re-attach after one-capture re-acquire failed",ee))}),B.onLost(W=>{x.current=null,S.current=[],b.current=null,I.current?.(null),d(!1),T.current?.(W)})],b.current=B.stream,I.current?.(B.stream);let q=B.track;if(!q)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return q},[p,i,m,n,d]),U=Ne(async()=>{E(),d(!1),await m?.stream(n).detach().catch(()=>{})},[m,n,E,d]),O=Ne(async()=>{if(!m)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");k.current?.unlock();let _;try{_=await R()}catch(q){E();let W=Bo(q,m.status);throw T.current?.(W),W}m.connect?.();let F;for(let q=1;q<=u;q++)try{await m.whenLive(a!==void 0?{timeout:a}:void 0),await m.stream(n).attach(_),d(!0);return}catch(W){F=W,at(`start attempt ${q}/${u} failed`,W),q<u&&await new Promise(G=>setTimeout(G,c))}E(),d(!1);let B=F instanceof Error?F:new Error(String(F??"voice start failed"));throw T.current?.(B),B},[m,n,a,u,c,R,E,d]);Ho(r,()=>({start:O,stop:U,unlock:()=>k.current?.unlock(),get active(){return y.current},get micStream(){return b.current},get audio(){return k.current}}),[O,U]);let z=de(!1),N=Ne(async()=>{if(!m||!y.current||z.current)return;let _=b.current?.getAudioTracks()[0]??null;if(_&&_.readyState==="live"){try{await m.stream(n).attach(_)}catch(F){at("foreground mic re-assert failed (will retry on next pass)",F)}return}z.current=!0;try{let F=await R();await m.stream(n).attach(F)}catch(F){let B=F instanceof Error?F:new Error(String(F));at("foreground mic re-acquire failed",B),T.current?.(B)}finally{z.current=!1}},[m,n,R]);return _r(()=>{let _=()=>{N()};return m&&typeof m.onRecovery=="function"?m.onRecovery(_):Wo(_)},[m,N]),_r(()=>E,[E]),s?$o(it,{ref:k,session:m,stream:n,onTrack:P,onUnlockChange:g}):null}),Ko=ut;import{forwardRef as Xo,useEffect as Go,useImperativeHandle as Yo,useRef as Ir,useState as Zo}from"react";import{useEffect as zo,useState as Jo}from"react";var Ot={level:0,speaking:!1};function Dt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=Jo(Ot);return zo(()=>{if(!e){i(Ot);return}let a=ot();if(!a||typeof MediaStream>"u")return;let u;e instanceof MediaStream?u=e:(u=new MediaStream,u.addTrack(e));let c,f;try{c=a.createMediaStreamSource(u),f=a.createAnalyser(),f.fftSize=r,c.connect(f)}catch{return}let l=new Uint8Array(f.fftSize),P=setInterval(()=>{f.getByteTimeDomainData(l);let g=0;for(let h=0;h<l.length;h++){let m=(l[h]-128)/128;g+=m*m}let p=Math.sqrt(g/l.length);i(h=>{let m=p>n;return Math.abs(h.level-p)<.005&&h.speaking===m?h:{level:p,speaking:m}})},o);return()=>{clearInterval(P),c.disconnect(),i(Ot)}},[e,r,o,n]),s}import{Fragment as rs,jsx as ct,jsxs as ns}from"react/jsx-runtime";var Qo={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},es={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},ts=Xo(function(t,r){let{session:o,stream:n="audio",constraints:s,autoStart:i=!0,visible:a=!1,className:u,onActiveChange:c,onError:f,onMicStream:l,capture:v}=t,P=ce(),g=o??P,p=Ir(null),[h,m]=Zo(null),k=Ir(l);k.current=l;let{level:b,speaking:x}=Dt(a?h:null);return Yo(r,()=>({start:()=>{let S=p.current;return S?S.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>p.current?.stop()??Promise.resolve(),get active(){return p.current?.active??!1},get micStream(){return p.current?.micStream??null}}),[]),Go(()=>{!i||!g||p.current?.start().catch(()=>{})},[i,g]),ns(rs,{children:[ct(ut,{ref:p,session:g,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...v!==void 0?{capture:v}:{},onActiveChange:c,onError:f,onMicStream:S=>{m(S),k.current?.(S)}}),a?ct("span",{className:u,style:Qo,"data-urun-mic":"","data-urun-mic-active":h?"true":"false","data-urun-mic-speaking":x?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(b*100)/100,children:ct("span",{style:es,children:ct("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(b*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});import{captureStillFromVideo as os,sessionFailureFromMediaError as ss,sharedCaptureController as is}from"@urun-sh/core";import{forwardRef as Or,useCallback as le,useEffect as Vt,useImperativeHandle as as,useRef as Q,useState as qe}from"react";import{jsx as he,jsxs as Lr}from"react/jsx-runtime";var Dr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Ft(...e){console.debug("[camera]",...e)}function us(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function cs(){let e=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof e?.enumerateDevices!="function")return null;try{return(await e.enumerateDevices()).filter(r=>r.kind==="videoinput")}catch{return null}}var Vr=Or(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:u,autoStart:c=!0,mirror:f="auto",connectTimeoutMs:l,visible:v=!1,className:P,videoClassName:g,onActiveChange:p,onError:h,onStream:m,onTrack:k,children:b,capture:x,flipControl:S="auto",flipControlClassName:y,onDevices:w}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let T=i?"user":a?"environment":u??"environment",I=ce(),d=o??I,E=Q(null),R=Q(null),U=Q(null),O=Q([]),z=Q(null),N=Q(!1),_=Q(!1),F=Q(T),[B,q]=qe(T),[W,G]=qe(!1),[ee,J]=qe(null),[H,X]=qe(!1),[K]=qe(us),Z=Q(p);Z.current=p;let $=Q(h);$.current=h;let C=Q(m);C.current=m;let L=Q(k);L.current=k;let M=Q(w);M.current=w;let j=le(D=>{N.current!==D&&(N.current=D,G(D),Z.current?.(D))},[]);Vt(()=>{if(!W){J(null);return}let D=!1,V=()=>{cs().then(ue=>{D||(J(ue),ue&&M.current?.(ue))})};V();let se=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof se?.addEventListener=="function"?(se.addEventListener("devicechange",V),()=>{D=!0,se.removeEventListener?.("devicechange",V)}):()=>{D=!0}},[W]);let re=le(D=>{let V=E.current;V&&(V.muted=!0,V.defaultMuted=!0,V.setAttribute("muted",""),V.setAttribute("playsinline",""),V.setAttribute("webkit-playsinline",""),V.srcObject=D,D&&V.play()?.catch?.(se=>Ft("preview play() failed",se)))},[]),Y=le(()=>{_.current=!1,z.current?.(),z.current=null;for(let D of O.current)D();O.current=[],U.current?.release(),U.current=null,R.current&&(R.current=null,C.current?.(null),L.current?.(null)),re(null)},[re]),A=le((D,V)=>{z.current?.(),R.current=V,re(V),C.current?.(V);let se=()=>{R.current===V&&(Ft("camera track ended (device removed or permission revoked)"),Y(),j(!1))};D.addEventListener("ended",se),z.current=()=>D.removeEventListener("ended",se)},[re,Y,j]),te=le(async D=>{let V=n!==!1;if(V&&!d)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let se={...Dr,...s,facingMode:D},ue;try{let pe=U.current;if(pe)ue=await pe.update(se);else{let Le=await(x??is()).claim("video",se);if(U.current=Le,O.current=[Le.onTrack((Oe,en)=>{A(Oe,en),N.current&&(!V||!d||d.stream(n).attachVideo(Oe).then(()=>L.current?.(Oe)).catch(tn=>Ft("camera re-publish after one-capture re-acquire failed",tn)))}),Le.onLost(Oe=>{U.current=null,O.current=[],Y(),j(!1),$.current?.(Oe)})],!Le.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});ue=Le.track}}catch(pe){let Ee=ss(pe,d?.status);throw $.current?.(Ee),Ee}F.current=D,q(D),A(ue,U.current?.stream??new MediaStream([ue]));try{V&&d&&(d.connect?.(),await d.whenLive(l!==void 0?{timeout:l}:void 0),await d.stream(n).attachVideo(ue)),_.current=V?n:!1}catch(pe){Y(),j(!1);let Ee=pe instanceof Error?pe:new Error(String(pe));throw $.current?.(Ee),Ee}L.current?.(ue),j(!0)},[d,n,s,l,x,A,Y,j]),ve=le(D=>te(D?.facingMode??F.current),[te]),ne=le(async D=>{let V=_.current===n;N.current&&F.current===D&&V||await te(D)},[te,n]),oe=le(()=>te(F.current==="environment"?"user":"environment"),[te]),Pe=le(async()=>{Y(),j(!1),n!==!1&&await d?.stream(n).detachVideo().catch(()=>{})},[d,n,Y,j]),Ie=le(async D=>{let V=E.current;if(!V)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await os(V,D)},[]);as(r,()=>({start:ve,stop:Pe,flip:oe,setFacingMode:ne,capturePhoto:Ie,get active(){return N.current},get facingMode(){return F.current},get stream(){return R.current},get element(){return E.current}}),[ve,Pe,oe,ne,Ie]);let gt=Q(ne);if(gt.current=ne,Vt(()=>{c&&(n!==!1&&!d||gt.current(T).catch(()=>{}))},[c,d,T,n]),Vt(()=>Y,[Y]),!v)return null;let ht=f==="auto"?B==="user":f,ze=W&&(S===!0||S==="auto"&&K&&(ee?.length??0)>1),Qr=()=>{H||(X(!0),oe().catch(()=>{}).finally(()=>X(!1)))};return Lr("div",{className:P,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":B,children:[he("video",{ref:E,className:g,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...ht?{transform:"scaleX(-1)"}:{}}}),ze?he("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:Qr,disabled:H,className:y,style:y?{opacity:H?.6:void 0}:{position:"absolute",right:16,bottom:"calc(env(safe-area-inset-bottom, 0px) + 16px)",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",width:44,height:44,borderRadius:9999,border:"1px solid rgba(255,255,255,0.25)",background:"rgba(0,0,0,0.5)",color:"#fff",cursor:"pointer",opacity:H?.6:1},children:Lr("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",style:{width:20,height:20},"aria-hidden":!0,children:[he("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),he("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),he("path",{d:"M14.5 10.5v1.6h-1.6"}),he("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),he("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,b]})}),ls=Or(function({preview:t=!0,...r},o){return he(Vr,{ref:o,...r,visible:t,autoStart:!1})});import{cameraCaptureAvailable as ds,normalizeReferenceImage as ps,referenceImageErrorMessage as ms}from"@urun-sh/core";import{useCallback as He,useEffect as fs,useRef as qt,useState as We}from"react";function gs(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=We(null),[a,u]=We(null),[c,f]=We(!1),[l,v]=We(null),[P]=We(ds),g=qt(n);g.current=n;let p=qt(null),h=qt(0),m=He(y=>{p.current&&URL.revokeObjectURL(p.current),p.current=y?URL.createObjectURL(new Blob([y.bytes],{type:y.type})):null,u(p.current),i(y),g.current?.(y)},[]);fs(()=>()=>{h.current++,p.current&&URL.revokeObjectURL(p.current),p.current=null},[]);let k=He(async y=>{let w=++h.current;f(!0),v(null);try{let T=await y();if(h.current!==w)return;m(T)}catch(T){if(h.current!==w)return;v(ms(T))}finally{h.current===w&&f(!1)}},[m]),b=He(y=>k(()=>ps(y,{maxSize:t,type:r,quality:o,source:"file"})),[k,t,r,o]),x=He(y=>k(()=>y.capturePhoto({maxSize:t,type:r,quality:o})),[k,t,r,o]),S=He(()=>{h.current++,v(null),f(!1),m(null)},[m]);return{reference:s,previewUrl:a,pick:b,capture:x,clear:S,busy:c,error:l,cameraAvailable:P}}import{useEffect as hs,useState as Ss}from"react";function vs(e,t){let[r,o]=Ss(null);return hs(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}import{useCallback as Ps}from"react";import{useEffect as Rs,useMemo as Cs}from"react";import{createStore as ys}from"zustand/vanilla";import{useStore as ks}from"zustand";var bs=()=>{};function Ht(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=ys(()=>({doc:o(),synced:e?e.synced:!1,set:r})),s=null,i=()=>{if(s){for(let c of s)c();s=null}},a=()=>e?(s||(n.setState({doc:o(),synced:e.synced}),s=[e.on("change",c=>n.setState({doc:c})),e.onSynced(()=>n.setState({synced:!0}))]),i):bs,u=(c=>ks(n,c));return Object.assign(u,{getState:n.getState,getInitialState:n.getInitialState,subscribe:n.subscribe,set:r,bind:a,unbind:i}),t.bind!==!1&&a(),u}function Be(e,t){let r=Cs(()=>Ht(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return Rs(()=>r.bind(),[r]),r}function Es(e,t,r){let n=Be(e,t)(r??(a=>a)),s=Ps(a=>{e&&t&&e.doc(t).set(a)},[e,t]);if(r)return n;let i=n;return{snapshot:e&&t?i.doc:null,synced:i.synced,set:s}}import{useEffect as ws,useState as Ts}from"react";var be=200;function Se(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function je(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Wt(e){let t=e.trim();if(!t)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(t)}catch(o){return{ok:!1,error:o instanceof Error?o.message:"Invalid JSON."}}return r===null||typeof r!="object"||Array.isArray(r)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:r}}function Bt(e,t,r={}){let o=r.cap??200,[n,s]=Ts([]);return ws(()=>{if(s([]),!e||!t)return;let i=!0,a=e.stream(t).messages()[Symbol.asyncIterator]();return(async()=>{for(;;){let u=await a.next();if(!i||u.done)break;s(c=>Se(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}import{jsx as lt,jsxs as Ke}from"react/jsx-runtime";function xs({session:e,name:t,cap:r,className:o}){let n=Bt(e,t,{cap:r});return Ke("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[Ke("div",{className:"urun-stream-tail-meta",children:[lt("code",{children:t}),Ke("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),lt("div",{className:"urun-stream-tail-log",children:n.length===0?Ke("span",{className:"urun-stream-tail-empty",children:["Waiting for ",lt("code",{children:t})," messages\u2026"]}):n.map((s,i)=>Ke("div",{className:"urun-stream-tail-line",children:[lt("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",je(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as As,useState as Fr}from"react";import{jsx as Re,jsxs as dt}from"react/jsx-runtime";function pt({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=Fr(""),[i,a]=Fr(null),u=As(()=>{let c=Wt(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return dt("div",{className:"urun-doc-patch",children:[Re("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),dt("div",{className:"urun-doc-patch-actions",children:[Re("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?Re("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Us({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=Be(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return dt("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[dt("div",{className:"urun-doc-panel-meta",children:[Re("code",{children:t}),Re("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),Re("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?Re(pt,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}import{useEffect as Ms,useState as _s}from"react";import{jsx as $e,jsxs as Hr}from"react/jsx-runtime";function qr(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function Ns({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=_s([]);return Ms(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>Se(u,{at:Date.now(),direction:"in",text:qr(je(a))},r))}):void 0),[e,t,r]),Hr("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[$e(pt,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>Se(u,{at:Date.now(),direction:"out",text:qr(a)},r))}}),$e("div",{className:"urun-control-sender-log",children:n.length===0?$e("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>Hr("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[$e("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",$e("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}import{useEffect as Is,useState as Ls}from"react";import{jsx as mt,jsxs as Ds}from"react/jsx-runtime";function Os({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=Ls([]),a=t.join(","),u=r.join(",");return Is(()=>{if(i([]),!e)return;let c=(l,v)=>i(P=>Se(P,{at:Date.now(),kind:l,text:v},o)),f=[];f.push(e.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of t){let v=e.stream(l);f.push(v.on("track",P=>c("track",`${l}: ${P?"track arrived":"track ended"}`)))}for(let l of r){let v=e.doc(l);f.push(v.on("change",()=>c("doc",`${l} changed`)))}return()=>f.forEach(l=>l())},[e,a,u,o]),mt("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?mt("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,f)=>Ds("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[mt("span",{className:"urun-event-spine-kind",children:c.kind})," ",mt("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${f}`))})}import{describeSessionPhase as Zs,isWakingPhase as Qs}from"@urun-sh/core";import{useEffect as Vs,useState as Fs}from"react";function ae(e){let[t,r]=Fs(e?.phase??null);return Vs(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}import{describeSessionPhase as js}from"@urun-sh/core";import{useEffect as qs,useRef as Hs,useState as Ws}from"react";import{isWakingPhase as Bs}from"@urun-sh/core";function jt(e){let t=ae(e),r=Bs(t?.name),o=Hs(void 0);r?o.current??=Date.now():o.current=void 0;let n=r?t?.wakingSince??o.current:void 0,s=()=>n!==void 0?Math.max(0,Math.floor((Date.now()-n)/1e3)):0,[i,a]=Ws(s);return qs(()=>{if(n===void 0){a(0);return}a(Math.max(0,Math.floor((Date.now()-n)/1e3)));let u=setInterval(()=>{a(Math.max(0,Math.floor((Date.now()-n)/1e3)))},1e3);return()=>clearInterval(u)},[n]),{waking:r,phase:t,state:r?t?.runtime?.state:void 0,reason:r?t?.runtime?.reason:void 0,since:n,seconds:r?i:0}}import{Fragment as Ks,jsx as Wr,jsxs as Br}from"react/jsx-runtime";function Kt({session:e,render:t,className:r}){let o=jt(e);return!o.waking||!o.phase?null:Wr("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):Br(Ks,{children:[Wr("span",{className:"urun-session-waking-label",children:js(o.phase)})," ",Br("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}import{useEffect as Js,useState as Xs}from"react";import{useEffect as jr,useRef as $s,useState as Kr}from"react";var zs={event:null,elapsedMs:0};function $t(e,t){let[r,o]=Kr(null),n=$s(0);jr(()=>{if(o(null),!!e?.onActivation)return e.onActivation(a=>{t!==void 0&&a.stream!==t||(n.current=Date.now(),o(a))})},[e,t]);let[s,i]=Kr(0);return jr(()=>{if(!r){i(0);return}if(r.state==="first-media"){i(r.elapsedMs);return}let a=n.current,u=()=>r.elapsedMs+Math.max(0,Date.now()-a);i(u());let c=setInterval(()=>i(u()),1e3);return()=>clearInterval(c)},[r]),r?{event:r,elapsedMs:s}:zs}import{jsx as $r,jsxs as zr}from"react/jsx-runtime";var Gs={activating:"starting stream\u2026","still-activating":"model warming up \u2014 this can take a minute","cold-boot":"cold boot \u2014 compiling/loading the model, hang tight",degraded:"taking longer than usual \u2014 still trying"};function Ys(e){let[t,r]=Xs(!1);return Js(()=>{if(r(!1),!e)return;let o=e;if(typeof o.requestVideoFrameCallback=="function"){let s=o.requestVideoFrameCallback(()=>r(!0));return()=>o.cancelVideoFrameCallback?.(s)}let n=()=>{let s=o.getVideoPlaybackQuality?.();(s?s.totalVideoFrames>0:o.readyState>=2)&&r(!0)};return n(),o.addEventListener("loadeddata",n),o.addEventListener("timeupdate",n),()=>{o.removeEventListener("loadeddata",n),o.removeEventListener("timeupdate",n)}},[e]),t}function zt({session:e,stream:t,videoElement:r,render:o,className:n}){let s=$t(e,t),i=Ys(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return $r("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):zr("div",{className:"urun-activation-overlay-card",children:[$r("span",{className:"urun-activation-overlay-copy",children:a.hint??Gs[u]})," ",zr("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}import{jsx as Ce,jsxs as Jt}from"react/jsx-runtime";var ei={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function ti({session:e,className:t}){let r=ae(e),o=r?.name??"idle",n=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return Jt("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[Ce("span",{className:"urun-session-status-dot","data-phase":o}),Ce("span",{className:"urun-session-status-label",children:ei[o]}),n?Ce("span",{className:"urun-session-status-detail",children:n}):null]})}function ri({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=ae(e);if(s?.name==="live")return Jt("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,Ce(zt,{session:e})]});let i=r?r(s):Ce("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&Qs(s.name)?Ce(Kt,{session:e}):s&&s.name!=="idle"?Zs(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return Jt("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?Ce("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}import{useEffect as ni,useState as oi}from"react";import{jsx as ai}from"react/jsx-runtime";function Jr(e){return ae(e)?.endsAt??null}function si(e){let t=Math.max(0,Math.floor(e/1e3)),r=Math.floor(t/60),o=t%60;return`${String(r).padStart(2,"0")}:${String(o).padStart(2,"0")}`}function ii({session:e,urgentMs:t=6e4,className:r}){let n=Jr(e)?.getTime()??null,[s,i]=oi(()=>n===null?null:Math.max(0,n-Date.now()));if(ni(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),s===null)return null;let a=si(s);return ai("span",{className:["urun-session-clock",r].filter(Boolean).join(" "),role:"timer","aria-label":`Session time remaining ${a}`,"data-urgent":s<t?"":void 0,"data-expired":s<=0?"":void 0,children:a})}import{jsx as Xr,jsxs as li}from"react/jsx-runtime";var ui=new Set(["expired","ended","error"]);function ci({session:e,onNewSession:t,children:r,className:o}){let n=ae(e);if(!n||!ui.has(n.name))return null;let s=r?r(n):Xr("span",{className:"urun-session-ended-copy",children:n.name==="expired"?"Session ended \u2014 start a new session":n.name==="error"?`Session failed${n.error?.reason?` \u2014 ${n.error.reason}`:""}.`:"Session ended."});return li("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?Xr("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}import{useEffect as Gr,useMemo as di,useState as Yr}from"react";import{jsx as ft,jsxs as fi}from"react/jsx-runtime";function Xt(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;return t.warning!==!0?null:{warning:!0,deadlineEpochS:typeof t.deadline_epoch_s=="number"?t.deadline_epoch_s:null,idleSinceEpochS:typeof t.idle_since_epoch_s=="number"?t.idle_since_epoch_s:null}}function Zr(e){let t=di(()=>e?e.doc("control"):null,[e]),[r,o]=Yr(()=>t?Xt(t.get("idle")):null);return Gr(()=>{if(!t){o(null);return}return o(Xt(t.get("idle"))),t.on("change",()=>o(Xt(t.get("idle"))))},[t]),r}function pi(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function mi({session:e,onStillHere:t,className:r}){let o=Zr(e),n=o?.deadlineEpochS??null,[s,i]=Yr(null);if(Gr(()=>{if(n===null){i(null);return}let u=()=>i(Math.max(0,n-Date.now()/1e3));u();let c=setInterval(u,1e3);return()=>clearInterval(c)},[n]),!o||!e)return null;let a=()=>{e.touch?.(),t?.()};return ft("div",{className:["urun-idle-warning",r].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:fi("div",{className:"urun-idle-warning-card",children:[ft("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),ft("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${pi(s)} due to inactivity.`:"This session will end soon due to inactivity."}),ft("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}import{useContext as gi,useEffect as hi,useState as Si}from"react";import{prewake as vi}from"@urun-sh/core";function yi(e){let t=gi(we),[r,o]=Si(null),n=e.app??t?.appId,s=e.function,i=e.intervalS??60,a=t?.baseUrl,u=t?.orgId,c=t?.jwt,f=t?.getAccessToken,l=t?.authProvider;return hi(()=>{if(!a||!u||!n||!s)return;let v=!1,P=()=>{vi({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:f,authProvider:l}).then(p=>{v||o(p)}).catch(()=>{})};P();let g=setInterval(P,Math.max(1,i)*1e3);return()=>{v=!0,clearInterval(g)}},[n,s,i,a,u,c,f,l]),r}import{describeSessionPhase as Al,isWakingPhase as Ul}from"@urun-sh/core";export{it as Audio,Vr as Camera,po as ComponentRenderer,Dr as DEFAULT_CAMERA_CONSTRAINTS,be as DEFAULT_LOG_CAP,Nr as DEFAULT_VOICE_CONSTRAINTS,pt as DocPatchForm,Mo as Image,Eo as ImageFrame,Po as ImageFrameSchema,xo as MetricsPanel,To as MetricsPanelSchema,ts as Mic,pn as OPERATOR_CHORD_LABEL,dn as OPERATOR_TOKEN_STORAGE_KEY,go as ProgressCard,fo as ProgressCardSchema,uo as ReprojectedVideo,Xn as Session,vo as StatusBadge,ho as StatusBadgeSchema,Ro as TextStream,bo as TextStreamSchema,zt as UrunActivationOverlay,Vo as UrunAudio,rn as UrunAuthProvider,ls as UrunCamera,Ns as UrunControlSender,Us as UrunDocPanel,De as UrunErrorBoundary,Os as UrunEventSpine,mi as UrunIdleWarning,nn as UrunJwtProvider,Rn as UrunProvider,ii as UrunSessionClock,ci as UrunSessionEnded,ri as UrunSessionGate,ti as UrunSessionStatus,Kt as UrunSessionWaking,xs as UrunStreamTail,Ko as UrunVoice,Ue as Video,ut as Voice,Je as authMode,Ht as createDocStore,Al as describeSessionPhase,je as formatPayload,ot as getUrunAudioContext,Ul as isWakingPhase,Wt as parseJsonObject,Se as pushCapped,er as readOperatorToken,lo as registerComponent,st as resumeUrunAudioContext,me as urunPublicEnv,$t as useActivation,Un as useApp,Wn as useChat,Vn as useCompletion,yt as useConfirmOnLeave,Be as useDocStore,Ar as useImageFrame,zn as useInputPresence,Ur as useMetricsPanel,vt as useOperatorOverride,Rr as useProgressCard,gs as useReferenceImage,In as useRequest,Gn as useSession,Es as useSessionDoc,Jr as useSessionEndsAt,Zr as useSessionIdle,ae as useSessionPhase,vs as useSessionTrack,jt as useSessionWake,Pr as useStatusBadge,Bt as useStreamMessages,Tr as useTextStream,Dt as useUrunAudioLevel,St as useUrunAuth,yi as useUrunPrewake,un as usesWorkOSAuth};
|
|
2
|
+
import{a as on,b as sn,c as St}from"./chunk-WF2OBDSX.mjs";import{useCallback as vn,useEffect as rr,useMemo as yn,useRef as nr,useState as Ye}from"react";import{Component as an}from"react";import{jsx as Yt,jsxs as un}from"react/jsx-runtime";var Ve=class extends an{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||un("div",{role:"status","aria-live":"polite",style:{padding:"16px",border:"1px solid rgba(17, 24, 39, 0.12)",borderRadius:"8px",background:"#ffffff",color:"#111827",fontFamily:'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',maxWidth:"360px"},children:[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 cn}from"react";var Te=cn(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 ln(){return Ge()==="workos"}import{useEffect as dn,useRef as pn}from"react";var mn="urun.operator_token",Qt=null,Zt="op",fn="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function er(){return typeof window<"u"}function tr(){return Qt}function gn(){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 hn(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function vt(e){let t=pn(e);t.current=e,dn(()=>{if(!er())return;gn();let r=o=>{if(!hn(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 yt(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 or(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:f=!1,fallback:l,errorFallback:v,children:C}){let g=n===void 0&&t===void 0;if(!g&&(typeof t!="string"||t.trim().length===0))throw new Error("[urun] <UrunProvider> requires a non-empty orgId \u2014 set your org id deployment env var (e.g. NEXT_PUBLIC_SESSION_TENANT_ID) and pass it through the provider (or pass NEITHER orgId NOR jwt to let the provider mint from its tokenEndpoint).");if(!g&&(typeof e!="string"||e.trim().length===0))throw new Error("[urun] <UrunProvider> requires baseUrl when orgId/jwt are passed explicitly (self-mint mode reads it from the token endpoint instead).");let p=r??o;if(g&&(typeof p!="string"||p.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);yt(f);let[h,m]=Ye(),[k,b]=Ye(),[U,S]=Ye(null),y=nr(void 0),w=nr(null),[T,I]=Ye(null);vt(K=>I({jwt:K}));let d=St(),E=ge("NEXT_PUBLIC_SESSION_TOKEN")??ge("NEXT_PUBLIC_URUN_JWT"),R=Ge(),M=T!==null,L=R==="workos"&&!n&&!M&&!g,$=n??(R==="jwt"?E:void 0)??h??k?.token,N=M?T.jwt:$,_=s??ge("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),F=L&&!N,B=t??k?.orgId,q=e??k?.gatewayUrl,W=g&&k===void 0,Y=g&&k!==void 0&&!q?new Error("[urun] the token endpoint returned no gatewayUrl and no baseUrl prop was passed \u2014 upgrade the route to createTokenRoute() from @urun-sh/next (which introspects it from URUN_API_KEY) or pass baseUrl explicitly."):null,ee=U??Y,z=u??kn,H=vn(async K=>{if(!K?.forceRefresh){let j=y.current;if(!j)return j;let te=Rn(j);if(te===null||te-Date.now()>bn)return j}return(await(w.current??(w.current=(async()=>{try{let j=await or(z);return y.current=j.token,b(j),j}finally{w.current=null}})()))).token},[z]),J=yn(()=>({appId:p,baseUrl:q??"",orgId:B??"",jwt:N,getAccessToken:L?d?.getAccessToken:g&&!M?H:void 0,authProvider:_,eventsUrl:i,sessionKey:a,releaseOnLeave:c,priority:M?"preempt":void 0}),[p,d,q,_,N,i,B,a,c,L,M,g,H]);return rr(()=>{if(!g)return;let K=new AbortController;return S(null),(async()=>{try{let Z=await or(z,K.signal);y.current=Z.token,b(Z)}catch(Z){if(K.signal.aborted)return;S(Z instanceof Error?Z:new Error(String(Z)))}})(),()=>K.abort()},[g,z]),rr(()=>{if(!L||!d)return;let K=!1,Z=d;async function j(){try{let P=await Z.getAccessToken();K||m(P??void 0)}catch{K||m(void 0)}}j();let te=window.setInterval(()=>{j()},6e4);return()=>{K=!0,window.clearInterval(te)}},[d,L]),Fe(Ve,{fallback:l,children:ee?Cn(v,ee):F||W?Fe("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Fe(Te.Provider,{value:J,children:C})})}import{useContext as wn,useEffect as Tn,useMemo as sr,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=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=sr(()=>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 f=be.get(u);f===c&&(f.handle.removeNotifier(t),f.refCount=Math.max(0,f.refCount-1),a.set(u,f),f.refCount===0&&(f.disposeTimer=setTimeout(()=>{let l=be.get(u);!l||l.refCount!==0||(be.delete(u),l.handle.disconnect())},0)))}n.current=a}},[]),sr(()=>{let i=new Map;return new Proxy({},{get(a,u){if(typeof u!="string")return;let c=i.get(u);if(c)return c;let f=l=>{let v=Un(u,l),C=r.current.get(v);if(C&&!C.disposed)return C;let g=Mn(e,u,l),p=be.get(g);return p?.handle.disposed&&(p.disposeTimer&&clearTimeout(p.disposeTimer),be.delete(g),o.current.get(g)===p&&o.current.delete(g),p=void 0),p?p.disposeTimer&&(clearTimeout(p.disposeTimer),p.disposeTimer=null):(p={handle:new Ct(s[u](l),t,e.eventsUrl),refCount:0,disposeTimer:null},be.set(g,p)),o.current.get(g)!==p&&(o.current.set(g,p),p.handle.addNotifier(t),p.refCount+=1),r.current.set(v,p.handle),p.handle};return i.set(u,f),f}})},[e,s])}import{useCallback as Pt,useEffect as Nn,useMemo as In,useRef as Ze,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=Ze(t);c.current=t;let f=Ze(0),l=Ze(null),v=Ze(!0);Nn(()=>(v.current=!0,()=>{v.current=!1,l.current?.abort()}),[]);let C=Pt(async h=>{l.current?.abort();let m=new AbortController;l.current=m;let k=++f.current,b=()=>v.current&&f.current===k;b()&&(u(!0),i(null));try{let U=await r.request(h,{...c.current,signal:m.signal});return b()&&(n(U),u(!1),c.current?.onSuccess?.(U)),U}catch(U){let S=Ln(U);throw b()&&(i(S),u(!1),c.current?.onError?.(S)),S}},[r]),g=Pt(h=>{C(h).catch(()=>{})},[C]),p=Pt(()=>{f.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:g,mutateAsync:C,data:o,error:s,isPending:a,reset:p}}import{useCallback as ir,useEffect as Dn,useMemo as Vn,useRef as Qe,useState as wt}from"react";function ar(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=Qe(t);c.current=t;let f=Qe(0),l=Qe(null),v=Qe(!0);Dn(()=>(v.current=!0,()=>{v.current=!1,l.current?.cancel(),l.current=null}),[]);let C=ir(()=>{f.current++,l.current?.cancel(),l.current=null,v.current&&i(!1)},[]),g=ir(async p=>{l.current?.cancel();let h=++f.current,m=()=>v.current&&f.current===h,k=c.current,b=k?.parseChunk??Fn,U=k?.buildPayload??(R=>({prompt:R}));m()&&(n(""),u(null),i(!0));let{parseChunk:S,buildPayload:y,onFinish:w,onError:T,...I}=k??{},d="",E;try{E=r.requestStream(U(p),I),l.current=E}catch(R){let M=ar(R);m()&&(u(M),i(!1),k?.onError?.(M));return}try{for await(let R of E){if(f.current!==h)break;d+=b(R),m()&&n(d)}m()&&(i(!1),k?.onFinish?.(d))}catch(R){let M=ar(R);m()&&(u(M),i(!1),k?.onError?.(M))}finally{l.current===E&&(l.current=null)}},[r]);return{completion:o,complete:g,stop:C,isStreaming:s,error:a}}import{useCallback as ur,useEffect as Hn,useMemo as Wn,useRef as Ae,useState as et}from"react";function cr(e){return e instanceof Error?e:new Error(String(e))}var Bn=e=>typeof e=="string"?e:String(e),lr=0;function Tt(e){return lr+=1,`${e}-${lr}`}function jn(e,t){let r=Wn(()=>xe(e),[e]),[o,n]=et(()=>(t?.initialMessages??[]).map(b=>({id:b.id??Tt("msg"),role:b.role,content:b.content}))),[s,i]=et(""),[a,u]=et(!1),[c,f]=et(null),l=Ae(t);l.current=t;let v=Ae(o);v.current=o;let C=Ae(s);C.current=s;let g=Ae(0),p=Ae(null),h=Ae(!0);Hn(()=>(h.current=!0,()=>{h.current=!1,p.current?.cancel(),p.current=null}),[]);let m=ur(()=>{g.current++,p.current?.cancel(),p.current=null,h.current&&u(!1)},[]),k=ur(async b=>{let U=b===void 0,S=(U?C.current:b)??"";if(!S.trim())return;p.current?.cancel();let w=++g.current,T=()=>h.current&&g.current===w,I=l.current,d=I?.parseChunk??Bn,E={id:Tt("msg"),role:"user",content:S},R={id:Tt("msg"),role:"assistant",content:""},M=[...v.current,E].map(H=>({role:H.role,content:H.content})),L=[...v.current,E,R];v.current=L,n(L),U&&i(""),f(null),u(!0);let $=I?.buildPayload??(H=>({messages:H})),{initialMessages:N,parseChunk:_,buildPayload:F,onFinish:B,onError:q,...W}=I??{},Y=H=>{n(J=>J.map(K=>K.id===R.id?{...K,content:H}:K))},ee="",z;try{z=r.requestStream($(M),W),p.current=z}catch(H){let J=cr(H);T()&&(f(J),u(!1),I?.onError?.(J));return}try{for await(let H of z){if(g.current!==w)break;ee+=d(H),T()&&Y(ee)}T()&&(u(!1),I?.onFinish?.({...R,content:ee}))}catch(H){let J=cr(H);T()&&(f(J),u(!1),I?.onError?.(J))}finally{p.current===z&&(p.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:k,stop:m,isStreaming:a,error:c}}import{useCallback as he,useEffect as dr,useMemo as Kn,useRef as pr,useState as mr}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=pr(null);a.current=i;let[u,c]=mr(!1),[f,l]=mr(xt),v=pr(!1);dr(()=>{if(i)return()=>i.dispose()},[i]);let C=he(()=>{let S=a.current;l(S?S.heldKeys():xt)},[]),g=he(()=>{a.current?.clear(),l(xt)},[]);dr(()=>{if(!n)return;let S=()=>!!n.pointerLockElement,y=()=>{if(S()){v.current=!1,c(!0);return}v.current||(c(!1),g())},w=R=>{S()&&(a.current?.keyDown(R.key),C())},T=R=>{a.current?.keyUp(R.key),C()},I=R=>{S()&&a.current?.movePointer(R.movementX,R.movementY)},d=R=>{S()&&a.current?.setButtons(R.buttons)},E=()=>{g()};return n.addEventListener("pointerlockchange",y),n.addEventListener("keydown",w),n.addEventListener("keyup",T),n.addEventListener("mousemove",I),n.addEventListener("mousedown",d),n.addEventListener("mouseup",d),n.defaultView?.addEventListener("blur",E),()=>{n.removeEventListener("pointerlockchange",y),n.removeEventListener("keydown",w),n.removeEventListener("keyup",T),n.removeEventListener("mousemove",I),n.removeEventListener("mousedown",d),n.removeEventListener("mouseup",d),n.defaultView?.removeEventListener("blur",E)}},[n,g,C]);let p=he(S=>{S.requestPointerLock?.()},[]),h=he(()=>{v.current=!0,c(!0)},[]),m=he(()=>{v.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),g()},[n,g]),k=he(S=>{a.current?.keyDown(S),C()},[C]),b=he(S=>{a.current?.keyUp(S),C()},[C]),U=he((S,y)=>{a.current?.movePointer(S,y)},[]);return{engage:p,engageTouch:h,release:m,engaged:u,heldKeys:f,pressKey:k,releaseKey:b,movePointer:U}}import{forwardRef as io,useEffect as kr,useImperativeHandle as ao,useMemo as uo,useRef as tt}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 oe,useState as gr}from"react";import{derivedLegRole as ro}from"@urun-sh/core";import{createContext as Gn,useContext as fr}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 ce(){return fr(At)}function Zn(){let e=fr(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 yr,jsxs as so}from"react/jsx-runtime";function no(e,t){return e-t>>>0<2147483648}var hr=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 vr(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:f,style:l,videoClassName:v,placeholder:C,poster:g,children:p,onTrack:h,onFirstFrame:m,frameMarker:k,onFrameMarkerReached:b,onFrameMarkerUnsupported:U}=t,S=ce(),y=o??S,w=oe(null),T=oe(null),[I,d]=gr(!1),[E,R]=gr(!1),M=oe(!1),L=oe(h);L.current=h;let $=oe(m);$.current=m;let N=oe(b);N.current=b;let _=oe(U);_.current=U;let F=oe(k??null);F.current=k??null;let B=oe(null),q=oe(null),W=Ue((P,V=!1)=>{if(!V&&P===B.current||(B.current=P,q.current?.(),q.current=null,M.current=!1,R(!1),!P))return;let x=w.current;if(!x)return;let X=F.current,G=X?.rtpTimestamp??null,ie=!1,A=()=>{ie||(ie=!0,_.current?.())};X&&G==null&&A();let de=X!=null&&G!=null,pe=ae=>{q.current?.(),q.current=null,M.current=!0,R(!0),$.current?.(),ae&&N.current?.()};if(typeof x.requestVideoFrameCallback=="function"){let ae=!1,Ee=0,Le=(Gt,ht)=>{if(!ae){if(de){let Xe=ht?.rtpTimestamp;if(typeof Xe!="number"){A(),pe(!1);return}if(!no(Xe,G)){Ee=x.requestVideoFrameCallback(Le);return}pe(!0);return}pe(!1)}};Ee=x.requestVideoFrameCallback(Le),q.current=()=>{ae=!0,x.cancelVideoFrameCallback?.(Ee)};return}de&&A();let re=()=>{let ae=x.getVideoPlaybackQuality?.();(ae?ae.totalVideoFrames>0:x.readyState>=2&&x.videoWidth>0)&&pe(!1)};x.addEventListener("loadeddata",re),x.addEventListener("timeupdate",re),x.addEventListener("playing",re),q.current=()=>{x.removeEventListener("loadeddata",re),x.removeEventListener("timeupdate",re),x.removeEventListener("playing",re)},re()},[]);qe(()=>()=>{q.current?.(),q.current=null},[]);let Y=k==null?null:`${k.rtpTimestamp??""}|${k.ptsMs??""}`,ee=oe(Y);qe(()=>{if(ee.current===Y||(ee.current=Y,Y==null))return;let P=B.current;P&&W(P,!0)},[Y,W]);let z=Ue(()=>{if(typeof MediaStream>"u")return null;T.current||(T.current=new MediaStream);let P=w.current;return P&&P.srcObject!==T.current&&(P.srcObject=T.current),T.current},[]),H=Ue(P=>{let V=w.current;if(!V)return;let x=V.play();!x||typeof x.catch!="function"||x.catch(X=>oo(`play() failed (${P})`,X))},[]),J=Ue(P=>{let V=z();if(V){for(let x of V.getVideoTracks())x!==P&&V.removeTrack(x);if(P&&!V.getVideoTracks().includes(P)){V.addTrack(P);let x=w.current;x&&(x.srcObject=V)}P&&H("track-attach"),d(P!==null),W(P),L.current?.(P)}},[z,H,W]),K=Ue(P=>{let V=z();if(V){for(let x of V.getAudioTracks())x!==P&&V.removeTrack(x);P&&!V.getAudioTracks().includes(P)&&V.addTrack(P),P&&H("audio-attach")}},[z,H]),Z=Ue(P=>{w.current=P,P&&(a&&(P.muted=!0,P.defaultMuted=!0,P.setAttribute("muted","")),P.setAttribute("playsinline",""),P.setAttribute("webkit-playsinline",""),z())},[z,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 j=ro(n)!==void 0;qe(()=>{j&&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.`)},[j,n]);let te=i!==void 0;return qe(()=>{if(te){J(i??null);return}if(j){J(null);return}if(!y)return;let P=Sr(y,vr(n,"video")),V=()=>{let A=T.current;return A?A.getVideoTracks()[0]??null:null},x=A=>{if(A!==V()&&(J(A),A)){let de=()=>{V()===A&&J(null)};A.addEventListener("ended",de)}},X=P.track;X&&X.readyState==="live"&&x(X);let G=P.on("track",A=>{A&&A.readyState!=="live"||x(A)}),ie=setInterval(()=>{let A=P.track;A&&A.readyState==="live"&&x(A)},hr);return()=>{G(),clearInterval(ie)}},[y,n,j,te,i,J]),qe(()=>{if(te||!y||s===!1||j)return;let P=Sr(y,vr(n,"audio",s)),V=()=>{let A=T.current;return A?A.getAudioTracks()[0]??null:null},x=A=>{if(A!==V()&&(K(A),A)){let de=()=>{V()===A&&K(null)};A.addEventListener("ended",de)}},X=P.track;X&&X.readyState==="live"&&x(X);let G=P.on("track",A=>{A&&A.readyState!=="live"||x(A)}),ie=setInterval(()=>{let A=P.track;A&&A.readyState==="live"&&x(A)},hr);return()=>{G(),clearInterval(ie)}},[y,n,j,s,te,K]),so("div",{className:f,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":I?"true":"false","data-urun-video-framed":E?"true":"false",children:[yr("video",{ref:Z,className:v,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),I?null:C,g===void 0?null:yr("div",{"data-urun-video-poster":"","aria-hidden":E||void 0,style:{position:"absolute",inset:0,...E?{opacity:0,pointerEvents:"none"}:null},children:g}),p]})});import{jsx as br,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,...f}=o??{},l=c!==void 0?c:typeof document<"u"?document:null,v=tt(null),C=tt(null),g=tt(0),p=tt(f);p.current=f;let h=uo(()=>co(p.current),[]);return ao(r,()=>({get video(){return v.current},get canvas(){return C.current},warp:h,get lastDrawTs(){return g.current}}),[h]),kr(()=>{if(!i)return;let m=0,k=0,b=null,U=y=>{typeof y.requestVideoFrameCallback=="function"&&(b=y,k=y.requestVideoFrameCallback(function w(){h.frameArrived(),k=y.requestVideoFrameCallback(w)}))},S=y=>{m=requestAnimationFrame(S);let w=C.current,T=v.current?.element??null;if(!w||!T||(T!==b&&(b&&k&&b.cancelVideoFrameCallback?.(k),U(T)),T.readyState<2))return;h.tick(y);let I=typeof devicePixelRatio=="number"?devicePixelRatio:1,d=Math.max(1,Math.round(w.clientWidth*I)),E=Math.max(1,Math.round(w.clientHeight*I));(w.width!==d||w.height!==E)&&(w.width=d,w.height=E);let R=w.getContext("2d");if(!R)return;let M=h.transform(),L=T.videoWidth||d,$=T.videoHeight||E,_=Math.max(d/L,E/$)*(1+a)*M.scale;R.setTransform(_,0,0,_,d/2+M.translateX*d,E/2+M.translateY*E),R.drawImage(T,-L/2,-$/2),g.current=y};return m=requestAnimationFrame(S),()=>{cancelAnimationFrame(m),b&&k&&b.cancelVideoFrameCallback?.(k)}},[i,a,h]),kr(()=>{if(!i||!u||!l)return;let m=()=>!!l.pointerLockElement,k=w=>{m()&&h.keyDown(w.key)},b=w=>h.keyUp(w.key),U=w=>{m()&&h.pointerDelta(w.movementX,w.movementY)},S=()=>{m()||h.clearKeys()},y=()=>h.clearKeys();return l.addEventListener("keydown",k),l.addEventListener("keyup",b),l.addEventListener("mousemove",U),l.addEventListener("pointerlockchange",S),l.defaultView?.addEventListener("blur",y),()=>{l.removeEventListener("keydown",k),l.removeEventListener("keyup",b),l.removeEventListener("mousemove",U),l.removeEventListener("pointerlockchange",S),l.defaultView?.removeEventListener("blur",y)}},[i,u,l,h]),i?mo(Me,{ref:v,...s,videoClassName:s.videoClassName,style:{...s.style},children:[br("canvas",{ref:C,style:lo,"data-urun-warp":""}),n]}):br(Me,{ref:v,...s,children:n})});var Rr=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`);Rr.set(e,{component:t,schema:r})}function Cr(e,t){let r=Rr.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 rt}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?rt(ho,{children:r}):rt("div",{className:"urun-component-error",role:"alert",children:rt("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return rt(n,{...o.validatedProps})}import{z as He}from"zod";import{jsx as Ut,jsxs as Pr}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 Pr("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}%`}})}),Pr("div",{className:"urun-progress-text",children:[t,"/",r]})]})}import{z as Mt}from"zod";import{jsx as wr,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:[wr("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),wr("span",{className:"urun-status-message",children:r})]})}import{useRef as xr,useEffect as Co}from"react";import{z as _t}from"zod";import{jsx as Ar,jsxs as wo}from"react/jsx-runtime";var Po=_t.object({text:_t.string(),streaming:_t.boolean().default(!1)});function Ur(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}=Ur(e),o=xr(null),n=xr(0);return Co(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),wo("div",{className:"urun-text-stream",children:[Ar("span",{ref:o,className:"urun-text-content"}),r&&Ar("span",{className:"urun-text-cursor"})]})}import{z as nt}from"zod";import{jsx as Mr,jsxs as Ao}from"react/jsx-runtime";var To=nt.object({src:nt.string().url(),alt:nt.string().optional(),caption:nt.string().optional()});function _r(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}=_r(e);return Ao("figure",{className:"urun-image-frame",children:[Mr("img",{className:"urun-image",src:t,alt:r}),o&&Mr("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 Nr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function Mo(e){let{metrics:t}=Nr(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 ot=null;function Oo(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function st(){if(ot)return ot;let e=Oo();return e?(ot=new e,ot):null}function it(){let e=st();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{jsx as Wo}from"react/jsx-runtime";var qo=1e3,Ir=200;function Lt(...e){console.debug("[audio]",...e)}var at=Do(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:f}=t,l=ce(),v=o??l,C=Ne(null),g=Ne(null),p=Ne(null),h=Ne(null),m=Ne(u);m.current=u;let k=Ne(c);k.current=c;let b=_e(d=>{p.current!==d&&(p.current=d,k.current?.(d))},[]),U=_e(()=>{if(typeof MediaStream>"u")return null;g.current||(g.current=new MediaStream);let d=C.current;return d&&d.srcObject!==g.current&&(d.srcObject=g.current),g.current},[]),S=_e(d=>{let E=C.current;if(!E)return;let R=E.play();!R||typeof R.then!="function"||R.then(()=>{E.muted||b(!0)}).catch(M=>{let L=M instanceof Error?M.name:String(M);if(L==="AbortError"){Lt(`play() aborted (${d}); retrying in ${Ir}ms`),h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{h.current=null,S(`${d}:retry`)},Ir);return}if(L==="NotAllowedError"){Lt(`play() blocked pending a user gesture (${d})`),b(!1);return}Lt(`play() failed (${d})`,M)})},[b]),y=_e(d=>{let E=U();if(E){for(let R of E.getAudioTracks())R!==d&&E.removeTrack(R);d&&!E.getAudioTracks().includes(d)&&E.addTrack(d),d&&S("track-attach"),m.current?.(d)}},[U,S]),w=_e(()=>{let d=C.current;d&&(U(),d.muted=!1,S("gesture"),it(),b(!0))},[U,S,b]);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",""),U()),f?.(d)},[U,f]),I=s!==void 0;return It(()=>{if(I){y(s??null);return}if(!v)return;let d=v.stream(n),E=()=>{let N=g.current;return N?N.getAudioTracks()[0]??null:null},R=N=>{if(N!==E()&&(y(N),N)){let _=()=>{E()===N&&y(null)};N.addEventListener("ended",_)}},M=d.track;M&&M.readyState==="live"&&R(M);let L=d.on("track",N=>{N&&N.readyState!=="live"||R(N)}),$=setInterval(()=>{let N=d.track;N&&N.readyState==="live"&&R(N)},qo);return()=>{L(),clearInterval($)}},[v,n,I,s,y]),It(()=>Fo(()=>{it(),p.current===!0&&S("foreground")}),[S]),It(()=>()=>{h.current&&clearTimeout(h.current)},[]),Wo("audio",{ref:T,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),Ho=at;import{forwardRef as Bo,useCallback as Ie,useEffect as Lr,useImperativeHandle as jo,useRef as me}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 Or={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function ut(...e){console.debug("[voice]",...e)}var ct=Bo(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=Or,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:f,onError:l,onMicStream:v,onTrack:C,onUnlockChange:g,capture:p}=t,h=ce(),m=o??h,k=me(null),b=me(null),U=me(null),S=me([]),y=me(!1),w=me(f);w.current=f;let T=me(l);T.current=l;let I=me(v);I.current=v;let d=Ie(_=>{y.current!==_&&(y.current=_,w.current?.(_))},[]),E=Ie(()=>{for(let _ of S.current)_();S.current=[],U.current?.release(),U.current=null,b.current&&(b.current=null,I.current?.(null))},[]),R=Ie(async()=>{let _=U.current;if(_){let W=await _.update(i);return b.current=_.stream,I.current?.(_.stream),W}let B=await(p??zo()).claim("audio",i);U.current=B,S.current=[B.onTrack((W,Y)=>{b.current=Y,I.current?.(Y),y.current&&m?.stream(n).attach(W).catch(ee=>ut("mic re-attach after one-capture re-acquire failed",ee))}),B.onLost(W=>{U.current=null,S.current=[],b.current=null,I.current?.(null),d(!1),T.current?.(W)})],b.current=B.stream,I.current?.(B.stream);let q=B.track;if(!q)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return q},[p,i,m,n,d]),M=Ie(async()=>{E(),d(!1),await m?.stream(n).detach().catch(()=>{})},[m,n,E,d]),L=Ie(async()=>{if(!m)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");k.current?.unlock();let _;try{_=await R()}catch(q){E();let W=$o(q,m.status);throw T.current?.(W),W}m.connect?.();let F;for(let q=1;q<=u;q++)try{await m.whenLive(a!==void 0?{timeout:a}:void 0),await m.stream(n).attach(_),d(!0);return}catch(W){F=W,ut(`start attempt ${q}/${u} failed`,W),q<u&&await new Promise(Y=>setTimeout(Y,c))}E(),d(!1);let B=F instanceof Error?F:new Error(String(F??"voice start failed"));throw T.current?.(B),B},[m,n,a,u,c,R,E,d]);jo(r,()=>({start:L,stop:M,unlock:()=>k.current?.unlock(),get active(){return y.current},get micStream(){return b.current},get audio(){return k.current}}),[L,M]);let $=me(!1),N=Ie(async()=>{if(!m||!y.current||$.current)return;let _=b.current?.getAudioTracks()[0]??null;if(_&&_.readyState==="live"){try{await m.stream(n).attach(_)}catch(F){ut("foreground mic re-assert failed (will retry on next pass)",F)}return}$.current=!0;try{let F=await R();await m.stream(n).attach(F)}catch(F){let B=F instanceof Error?F:new Error(String(F));ut("foreground mic re-acquire failed",B),T.current?.(B)}finally{$.current=!1}},[m,n,R]);return Lr(()=>{let _=()=>{N()};return m&&typeof m.onRecovery=="function"?m.onRecovery(_):Ko(_)},[m,N]),Lr(()=>E,[E]),s?Xo(at,{ref:k,session:m,stream:n,onTrack:C,onUnlockChange:g}):null}),Jo=ct;import{forwardRef as Zo,useEffect as Qo,useImperativeHandle as es,useRef as Dr,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=st();if(!a||typeof MediaStream>"u")return;let u;e instanceof MediaStream?u=e:(u=new MediaStream,u.addTrack(e));let c,f;try{c=a.createMediaStreamSource(u),f=a.createAnalyser(),f.fftSize=r,c.connect(f)}catch{return}let l=new Uint8Array(f.fftSize),C=setInterval(()=>{f.getByteTimeDomainData(l);let g=0;for(let h=0;h<l.length;h++){let m=(l[h]-128)/128;g+=m*m}let p=Math.sqrt(g/l.length);i(h=>{let m=p>n;return Math.abs(h.level-p)<.005&&h.speaking===m?h:{level:p,speaking:m}})},o);return()=>{clearInterval(C),c.disconnect(),i(Ot)}},[e,r,o,n]),s}import{Fragment as ss,jsx as lt,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:f,onMicStream:l,capture:v}=t,C=ce(),g=o??C,p=Dr(null),[h,m]=ts(null),k=Dr(l);k.current=l;let{level:b,speaking:U}=Dt(a?h: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||!g||p.current?.start().catch(()=>{})},[i,g]),is(ss,{children:[lt(ct,{ref:p,session:g,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...v!==void 0?{capture:v}:{},onActiveChange:c,onError:f,onMicStream:S=>{m(S),k.current?.(S)}}),a?lt("span",{className:u,style:rs,"data-urun-mic":"","data-urun-mic-active":h?"true":"false","data-urun-mic-speaking":U?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(b*100)/100,children:lt("span",{style:ns,children:lt("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(b*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});import{captureStillFromVideo as as,sessionFailureFromMediaError as us,sharedCaptureController as cs}from"@urun-sh/core";import{forwardRef as Fr,useCallback as le,useEffect as Vt,useImperativeHandle as ls,useRef as Q,useState as We}from"react";import{jsx as ve,jsxs as Vr}from"react/jsx-runtime";var qr={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 Hr=Fr(function(t,r){let{session:o,stream:n="video",constraints:s,front:i=!1,back:a=!1,facingMode:u,autoStart:c=!0,mirror:f="auto",connectTimeoutMs:l,visible:v=!1,className:C,videoClassName:g,onActiveChange:p,onError:h,onStream:m,onTrack:k,children:b,capture:U,flipControl:S="auto",flipControlClassName:y,onDevices:w}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let T=i?"user":a?"environment":u??"environment",I=ce(),d=o??I,E=Q(null),R=Q(null),M=Q(null),L=Q([]),$=Q(null),N=Q(!1),_=Q(!1),F=Q(T),[B,q]=We(T),[W,Y]=We(!1),[ee,z]=We(null),[H,J]=We(!1),[K]=We(ds),Z=Q(p);Z.current=p;let j=Q(h);j.current=h;let te=Q(m);te.current=m;let P=Q(k);P.current=k;let V=Q(w);V.current=w;let x=le(O=>{N.current!==O&&(N.current=O,Y(O),Z.current?.(O))},[]);Vt(()=>{if(!W){z(null);return}let O=!1,D=()=>{ps().then(ue=>{O||(z(ue),ue&&V.current?.(ue))})};D();let ne=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof ne?.addEventListener=="function"?(ne.addEventListener("devicechange",D),()=>{O=!0,ne.removeEventListener?.("devicechange",D)}):()=>{O=!0}},[W]);let X=le(O=>{let D=E.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?.(ne=>Ft("preview play() failed",ne)))},[]),G=le(()=>{_.current=!1,$.current?.(),$.current=null;for(let O of L.current)O();L.current=[],M.current?.release(),M.current=null,R.current&&(R.current=null,te.current?.(null),P.current?.(null)),X(null)},[X]),ie=le((O,D)=>{$.current?.(),R.current=D,X(D),te.current?.(D);let ne=()=>{R.current===D&&(Ft("camera track ended (device removed or permission revoked)"),G(),x(!1))};O.addEventListener("ended",ne),$.current=()=>O.removeEventListener("ended",ne)},[X,G,x]),A=le(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 ne={...qr,...s,facingMode:O},ue;try{let fe=M.current;if(fe)ue=await fe.update(ne);else{let Oe=await(U??cs()).claim("video",ne);if(M.current=Oe,L.current=[Oe.onTrack((De,rn)=>{ie(De,rn),N.current&&(!D||!d||d.stream(n).attachVideo(De).then(()=>P.current?.(De)).catch(nn=>Ft("camera re-publish after one-capture re-acquire failed",nn)))}),Oe.onLost(De=>{M.current=null,L.current=[],G(),x(!1),j.current?.(De)})],!Oe.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});ue=Oe.track}}catch(fe){let we=us(fe,d?.status);throw j.current?.(we),we}F.current=O,q(O),ie(ue,M.current?.stream??new MediaStream([ue]));try{D&&d&&(d.connect?.(),await d.whenLive(l!==void 0?{timeout:l}:void 0),await d.stream(n).attachVideo(ue)),_.current=D?n:!1}catch(fe){G(),x(!1);let we=fe instanceof Error?fe:new Error(String(fe));throw j.current?.(we),we}P.current?.(ue),x(!0)},[d,n,s,l,U,ie,G,x]),de=le(O=>A(O?.facingMode??F.current),[A]),pe=le(async O=>{let D=_.current===n;N.current&&F.current===O&&D||await A(O)},[A,n]),re=le(()=>A(F.current==="environment"?"user":"environment"),[A]),ae=le(async()=>{G(),x(!1),n!==!1&&await d?.stream(n).detachVideo().catch(()=>{})},[d,n,G,x]),Ee=le(async O=>{let D=E.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:de,stop:ae,flip:re,setFacingMode:pe,capturePhoto:Ee,get active(){return N.current},get facingMode(){return F.current},get stream(){return R.current},get element(){return E.current}}),[de,ae,re,pe,Ee]);let Le=Q(pe);if(Le.current=pe,Vt(()=>{c&&(n!==!1&&!d||Le.current(T).catch(()=>{}))},[c,d,T,n]),Vt(()=>G,[G]),!v)return null;let Gt=f==="auto"?B==="user":f,ht=W&&(S===!0||S==="auto"&&K&&(ee?.length??0)>1),Xe=()=>{H||(J(!0),re().catch(()=>{}).finally(()=>J(!1)))};return Vr("div",{className:C,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":B,children:[ve("video",{ref:E,className:g,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Gt?{transform:"scaleX(-1)"}:{}}}),ht?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:Vr("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round",style:{width:20,height:20},"aria-hidden":!0,children:[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,b]})}),ms=Fr(function({preview:t=!0,...r},o){return ve(Hr,{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,f]=je(!1),[l,v]=je(null),[C]=je(fs),g=qt(n);g.current=n;let p=qt(null),h=qt(0),m=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),g.current?.(y)},[]);Ss(()=>()=>{h.current++,p.current&&URL.revokeObjectURL(p.current),p.current=null},[]);let k=Be(async y=>{let w=++h.current;f(!0),v(null);try{let T=await y();if(h.current!==w)return;m(T)}catch(T){if(h.current!==w)return;v(hs(T))}finally{h.current===w&&f(!1)}},[m]),b=Be(y=>k(()=>gs(y,{maxSize:t,type:r,quality:o,source:"file"})),[k,t,r,o]),U=Be(y=>k(()=>y.capturePhoto({maxSize:t,type:r,quality:o})),[k,t,r,o]),S=Be(()=>{h.current++,v(null),f(!1),m(null)},[m]);return{reference:s,previewUrl:a,pick:b,capture:U,clear:S,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 Ts}from"react";import{useEffect as Es,useMemo as ws}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=ws(()=>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=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 Re=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 dt,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:[dt("code",{children:t}),ze("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),dt("div",{className:"urun-stream-tail-log",children:n.length===0?ze("span",{className:"urun-stream-tail-empty",children:["Waiting for ",dt("code",{children:t})," messages\u2026"]}):n.map((s,i)=>ze("div",{className:"urun-stream-tail-line",children:[dt("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",$e(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as _s,useState as Wr}from"react";import{jsx as Ce,jsxs as pt}from"react/jsx-runtime";function mt({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=Wr(""),[i,a]=Wr(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 pt("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}),pt("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 pt("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[pt("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(mt,{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 jr}from"react/jsx-runtime";function Br(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:Br($e(a))},r))}):void 0),[e,t,r]),jr("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[Je(mt,{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:Br(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)=>jr("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 ft,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=>ye(C,{at:Date.now(),kind:l,text:v},o)),f=[];f.push(e.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of t){let v=e.stream(l);f.push(v.on("track",C=>c("track",`${l}: ${C?"track arrived":"track ended"}`)))}for(let l of r){let v=e.doc(l);f.push(v.on("change",()=>c("doc",`${l} changed`)))}return()=>f.forEach(l=>l())},[e,a,u,o]),ft("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?ft("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,f)=>qs("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[ft("span",{className:"urun-event-spine-kind",children:c.kind})," ",ft("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${f}`))})}import{describeSessionPhase as ti,isWakingPhase as ri}from"@urun-sh/core";import{useEffect as Hs,useState as Ws}from"react";function se(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=se(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 Kr,jsxs as $r}from"react/jsx-runtime";function Kt({session:e,render:t,className:r}){let o=jt(e);return!o.waking||!o.phase?null:Kr("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):$r(Js,{children:[Kr("span",{className:"urun-session-waking-label",children:zs(o.phase)})," ",$r("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}import{useEffect as Ys,useState as Zs}from"react";import{useEffect as zr,useRef as Xs,useState as Jr}from"react";var Gs={event:null,elapsedMs:0};function $t(e,t){let[r,o]=Jr(null),n=Xs(0);zr(()=>{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]=Jr(0);return zr(()=>{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 Xr,jsxs as Gr}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 Xr("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):Gr("div",{className:"urun-activation-overlay-card",children:[Xr("span",{className:"urun-activation-overlay-copy",children:a.hint??Qs[u]})," ",Gr("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=se(e),o=r?.name??"idle",n=r?.name==="queued"&&r.queue?`pos ${r.queue.position} / depth ${r.queue.depth}`:(r?.name==="error"||r?.name==="expired")&&r.error?r.error.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return 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=se(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 Yr(e){return se(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=Yr(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 Zr,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=se(e);if(!n||!di.has(n.name))return null;let s=r?r(n):Zr("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?Zr("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}import{useEffect as Qr,useMemo as fi,useState as en}from"react";import{jsx as gt,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 tn(e){let t=fi(()=>e?e.doc("control"):null,[e]),[r,o]=en(()=>t?Xt(t.get("idle")):null);return Qr(()=>{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=tn(e),n=o?.deadlineEpochS??null,[s,i]=en(null);if(Qr(()=>{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 gt("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:[gt("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),gt("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."}),gt("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(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,f=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:f,authProvider:l}).then(p=>{v||o(p)}).catch(()=>{})};C();let g=setInterval(C,Math.max(1,i)*1e3);return()=>{v=!0,clearInterval(g)}},[n,s,i,a,u,c,f,l]),r}import{describeSessionPhase as Nl,isWakingPhase as Il}from"@urun-sh/core";export{at as Audio,Hr as Camera,go as ComponentRenderer,qr as DEFAULT_CAMERA_CONSTRAINTS,Re as DEFAULT_LOG_CAP,Or as DEFAULT_VOICE_CONSTRAINTS,mt as DocPatchForm,Io as Image,xo as ImageFrame,To as ImageFrameSchema,Mo as MetricsPanel,Uo as MetricsPanelSchema,os as Mic,fn as OPERATOR_CHORD_LABEL,mn as OPERATOR_TOKEN_STORAGE_KEY,vo as ProgressCard,So 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,on as UrunAuthProvider,ms as UrunCamera,Os as UrunControlSender,Ns as UrunDocPanel,Ve as UrunErrorBoundary,Fs as UrunEventSpine,hi as UrunIdleWarning,sn 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,ct as Voice,Ge as authMode,Ht as createDocStore,Nl as describeSessionPhase,$e as formatPayload,st as getUrunAudioContext,Il as isWakingPhase,Wt as parseJsonObject,ye as pushCapped,tr as readOperatorToken,fo as registerComponent,it as resumeUrunAudioContext,ge as urunPublicEnv,$t as useActivation,_n as useApp,jn as useChat,qn as useCompletion,yt as useConfirmOnLeave,Ke as useDocStore,_r as useImageFrame,Xn as useInputPresence,Nr as useMetricsPanel,vt as useOperatorOverride,Er as useProgressCard,vs as useReferenceImage,On as useRequest,Zn as useSession,xs as useSessionDoc,Yr as useSessionEndsAt,tn as useSessionIdle,se as useSessionPhase,bs as useSessionTrack,jt as useSessionWake,Tr as useStatusBadge,Bt as useStreamMessages,Ur as useTextStream,Dt as useUrunAudioLevel,St as useUrunAuth,Ri as useUrunPrewake,ln as usesWorkOSAuth};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@urun-sh/react",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.42",
|
|
4
4
|
"description": "React bindings for the urun TypeScript SDK",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"dev": "tsup --watch"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|
|
56
|
-
"@urun-sh/core": "^0.2.
|
|
56
|
+
"@urun-sh/core": "^0.2.42",
|
|
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",
|