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