@urun-sh/react 0.2.60 → 0.3.0

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/CHANGELOG.md CHANGED
@@ -1,6 +1,11 @@
1
1
  # Changelog
2
2
 
3
- ## Unreleased
3
+ ## 0.3.0
4
+
5
+ - **Lockstep with `@urun-sh/core@0.3.0`** (peer dependency bumped to `^0.3.0`).
6
+ The session-status component renders the two new `SessionPhaseName` members:
7
+ `waiting_for_capacity` ("Waiting for GPU capacity") and `unknown` (names the
8
+ literal unrecognized server word).
4
9
 
5
10
  - **Single-element muxed playout is now the canonical way to consume an `"av"`
6
11
  parent.** `<Video stream="av" muted={false} />` puts BOTH tracks into ONE
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client"
2
- "use strict";var cr=Object.defineProperty;var ho=Object.getOwnPropertyDescriptor;var vo=Object.getOwnPropertyNames;var yo=Object.prototype.hasOwnProperty;var ko=(e,t)=>{for(var r in t)cr(e,r,{get:t[r],enumerable:!0})},bo=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of vo(t))!yo.call(e,n)&&n!==r&&cr(e,n,{get:()=>t[n],enumerable:!(o=ho(t,n))||o.enumerable});return e};var To=e=>bo(cr({},"__esModule",{value:!0}),e);var rs={};ko(rs,{Audio:()=>At,Camera:()=>_r,ComponentRenderer:()=>kn,DEFAULT_CAMERA_CONSTRAINTS:()=>Mr,DEFAULT_LOG_CAP:()=>qe,DEFAULT_SMOOTH_CHARS_PER_FRAME:()=>Pr,DEFAULT_SMOOTH_THRESHOLD:()=>xr,DEFAULT_VOICE_CONSTRAINTS:()=>wr,DocPatchForm:()=>Nt,Image:()=>In,ImageFrame:()=>wn,ImageFrameSchema:()=>Cn,MetricsPanel:()=>An,MetricsPanelSchema:()=>Un,Mic:()=>jn,OPERATOR_CHORD_LABEL:()=>Kr,OPERATOR_TOKEN_STORAGE_KEY:()=>Br,ProgressCard:()=>Tn,ProgressCardSchema:()=>bn,ReprojectedVideo:()=>Sn,Session:()=>an,StatusBadge:()=>Pn,StatusBadgeSchema:()=>Rn,Text:()=>Nn,TextStream:()=>En,TextStreamError:()=>at,TextStreamSchema:()=>xn,UrunActivationOverlay:()=>or,UrunAudio:()=>Hn,UrunAuthProvider:()=>kt,UrunCamera:()=>Kn,UrunControlSender:()=>to,UrunDocPanel:()=>Qn,UrunErrorBoundary:()=>et,UrunEventSpine:()=>ro,UrunIdleWarning:()=>lo,UrunJwtProvider:()=>Hr,UrunProvider:()=>Gr,UrunSessionClock:()=>ao,UrunSessionEnded:()=>co,UrunSessionGate:()=>io,UrunSessionStatus:()=>so,UrunSessionWaking:()=>tr,UrunStreamTail:()=>Zn,UrunVoice:()=>Wn,Video:()=>Xe,Voice:()=>Mt,authMode:()=>yt,createDocStore:()=>$t,describeSessionPhase:()=>ur.describeSessionPhase,formatPayload:()=>pt,getUrunAudioContext:()=>bt,isWakingPhase:()=>ur.isWakingPhase,parseJsonObject:()=>Jt,pushCapped:()=>De,readOperatorToken:()=>lr,registerComponent:()=>vn,resumeUrunAudioContext:()=>$e,textDelta:()=>Rr,urunPublicEnv:()=>Pe,useActivation:()=>rr,useApp:()=>Zr,useChat:()=>on,useCompletion:()=>tn,useConfirmOnLeave:()=>Vt,useDocStore:()=>dt,useImageFrame:()=>br,useInputPresence:()=>sn,useMetricsPanel:()=>Tr,useOperatorOverride:()=>Dt,useProgressCard:()=>vr,useReferenceImage:()=>$n,useRequest:()=>Qr,useSession:()=>un,useSessionDoc:()=>Yn,useSessionEndsAt:()=>Nr,useSessionIdle:()=>Or,useSessionPhase:()=>ke,useSessionStats:()=>fo,useSessionTrack:()=>Xn,useSessionWake:()=>er,useStatusBadge:()=>yr,useStreamMessages:()=>Gt,useText:()=>Er,useTextMeter:()=>_n,useTextStream:()=>kr,useUrunAudioLevel:()=>jt,useUrunAuth:()=>Ot,useUrunPrewake:()=>mo,usesWorkOSAuth:()=>Vr});module.exports=To(rs);var ae=require("react");var Ir=require("react"),vt=require("react/jsx-runtime"),et=class extends Ir.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,vt.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,vt.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,vt.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var Dr=require("react"),tt=(0,Dr.createContext)(null);function Ne(e){return e&&e.trim()?e.trim():void 0}function Pe(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"NEXT_PUBLIC_URUN_TOKEN_URL":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_TOKEN_URL:void 0);case"NEXT_PUBLIC_URUN_EVENTS_URL":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_EVENTS_URL:void 0);case"VERCEL_ENV":return Ne(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return Ne(typeof process<"u"?process.env?.[e]:void 0)}}function yt(){let e=Pe("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||Pe("VERCEL_ENV")==="production"?"workos":Pe("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Vr(){return yt()==="workos"}var rt=require("react"),qr=require("react/jsx-runtime"),Fr=(0,rt.createContext)(null);function kt({getAccessToken:e,children:t}){let r=(0,rt.useMemo)(()=>({getAccessToken:e}),[e]);return(0,qr.jsx)(Fr.Provider,{value:r,children:t})}var Hr=kt;function Ot(){return(0,rt.useContext)(Fr)}var It=require("react"),Br="urun.operator_token",jr=null,Wr="op",Kr="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function $r(){return typeof window<"u"}function lr(){return jr}function Ro(){if(!$r())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(Wr);if(!r)return null;jr=r,t.delete(Wr);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function Po(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function Dt(e){let t=(0,It.useRef)(e);t.current=e,(0,It.useEffect)(()=>{if(!$r())return;Ro();let r=o=>{if(!Po(o))return;let n=lr();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}var Xr=require("react");function Vt(e=!0){(0,Xr.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 Le=require("react/jsx-runtime"),xo="/api/urun-token",Eo=1e4;function Co(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 Jr(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 zr(e,t){if(t===void 0)return;let r;try{r=new URL(t).hostname}catch{throw new Error(`[urun] ${e} is not a valid URL: ${t}`)}if(!(r==="127.0.0.1"||r==="localhost"||r==="::1"||r==="[::1]"))throw new Error(`[urun] ${e} must point at a loopback endpoint \u2014 the CLI launcher (urun dev/demo) is this variable's only legitimate producer and it must never be set on a deployed site. Refusing ${t}.`);return t}function dr(e){let t=e===void 0?void 0:JSON.stringify(e);return(0,ae.useMemo)(()=>e,[t])}function wo(e,t){return typeof e=="function"?e(t):e!==void 0?e:(0,Le.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,Le.jsx)("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),(0,Le.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function Gr({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,audioPlayout:g,videoPlayout:l,sessionStats:y,confirmOnLeave:b=!1,fallback:T,errorFallback:f,children:v}){let d=n===void 0&&t===void 0;if(!d&&(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(!d&&(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 E=r??o;if(d&&(typeof E!="string"||E.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(b);let[S,k]=(0,ae.useState)(),[m,R]=(0,ae.useState)(null),P=(0,ae.useRef)(void 0),C=(0,ae.useRef)(null),[A,p]=(0,ae.useState)(null);Dt(h=>p({jwt:h}));let w=Ot(),x=Pe("NEXT_PUBLIC_SESSION_TOKEN")??Pe("NEXT_PUBLIC_URUN_JWT"),O=yt(),H=A!==null,W=O==="workos"&&!n&&!H&&!d,D=n??(O==="jwt"?x:void 0)??S?.token,M=H?A.jwt:D,q=s??Pe("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),z=W&&!M&&!w?.getAccessToken,Q=t??S?.orgId,j=e??S?.gatewayUrl,ne=d&&S===void 0,le=d&&S!==void 0&&!j?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=z?new Error('[urun] <UrunProvider> resolved authMode()="workos" but no auth context is mounted: there is no <UrunWorkOSProvider> (or <UrunAuthProvider>) ancestor supplying getAccessToken, and no jwt prop was passed, so no session token can be obtained. Note NEXT_PUBLIC_SESSION_TOKEN and NEXT_PUBLIC_URUN_JWT are IGNORED in workos mode, so setting them will not help. Either mount UrunWorkOSProvider from @urun-sh/react/next-workos, or select jwt mode with NEXT_PUBLIC_AUTH_MODE=jwt (or NEXT_PUBLIC_AUTH_ENABLED=false) and supply a token.'):null,B=m??le??ee,G=zr("NEXT_PUBLIC_URUN_TOKEN_URL",Pe("NEXT_PUBLIC_URUN_TOKEN_URL"))??u??xo,Te=zr("NEXT_PUBLIC_URUN_EVENTS_URL",Pe("NEXT_PUBLIC_URUN_EVENTS_URL"))??i,ie=(0,ae.useCallback)(async h=>{if(!h?.forceRefresh){let U=P.current;if(!U)return U;let K=Co(U);if(K===null||K-Date.now()>Eo)return U}return(await(C.current??(C.current=(async()=>{try{let U=await Jr(G);return P.current=U.token,k(U),U}finally{C.current=null}})()))).token},[G]),de=(0,ae.useCallback)(async()=>M,[M]),Fe=typeof M=="string"&&M.trim().length>0,pe=W?w?.getAccessToken:d&&!H?ie:Fe?de:void 0,we=dr(g),me=dr(l),ue=dr(y),oe=(0,ae.useMemo)(()=>({appId:E,baseUrl:j??"",orgId:Q??"",jwt:M,getAccessToken:W?w?.getAccessToken:d&&!H?ie:void 0,authProvider:q,eventsUrl:Te,sessionKey:a,releaseOnLeave:c,audioPlayout:we,videoPlayout:me,sessionStats:ue,priority:H?"preempt":void 0}),[E,w,j,q,M,Te,Q,a,c,we,me,ue,W,H,d,ie]);return(0,ae.useEffect)(()=>{if(!d)return;let h=new AbortController;return R(null),(async()=>{try{let N=await Jr(G,h.signal);P.current=N.token,k(N)}catch(N){if(h.signal.aborted)return;R(N instanceof Error?N:new Error(String(N)))}})(),()=>h.abort()},[d,G]),(0,Le.jsx)(et,{fallback:T,children:B?wo(f,B):ne?(0,Le.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,Le.jsx)(tt.Provider,{value:oe,children:pe?(0,Le.jsx)(kt,{getAccessToken:pe,children:v}):v})})}var fe=require("react"),Yr=require("@urun-sh/core");function Uo(e,t){return`${e}:${JSON.stringify(t??{})}`}function Ao(e,t,r){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,fnName:t,args:r??{}})}var Ke=new Map;var pr=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}onConnectionState(t){return this._doc.onConnectionState?this._doc.onConnectionState(r=>{t(r),this._notify()}):(t({connected:!0,consecutiveFailures:0,lastCloseCode:null,lastCloseReason:null}),()=>{})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},mr=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()}},fr=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)}onStats(t){return this._session.onStats?this._session.onStats(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 pr(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new mr(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 Zr(){let e=(0,fe.useContext)(tt);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=(0,fe.useReducer)(i=>i+1,0),r=(0,fe.useRef)(new Map),o=(0,fe.useRef)(new Map),n=(0,fe.useRef)(null),s=(0,fe.useMemo)(()=>(0,Yr.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,audioPlayout:e.audioPlayout,videoPlayout:e.videoPlayout,sessionStats:e.sessionStats}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority,e.audioPlayout,e.videoPlayout,e.sessionStats]);return(0,fe.useEffect)(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=Ke.get(a);c===u&&o.current.get(a)===u&&(c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null),c.handle.addNotifier(t),c.refCount+=1)}}return()=>{let a=new Map;for(let[u,c]of o.current){let g=Ke.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=Ke.get(u);!l||l.refCount!==0||(Ke.delete(u),l.handle.disconnect())},0)))}n.current=a}},[]),(0,fe.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 y=Uo(u,l),b=r.current.get(y);if(b&&!b.disposed)return b;let T=Ao(e,u,l),f=Ke.get(T);return f?.handle.disposed&&(f.disposeTimer&&clearTimeout(f.disposeTimer),Ke.delete(T),o.current.get(T)===f&&o.current.delete(T),f=void 0),f?f.disposeTimer&&(clearTimeout(f.disposeTimer),f.disposeTimer=null):(f={handle:new fr(s[u](l),t,e.eventsUrl),refCount:0,disposeTimer:null},Ke.set(T,f)),o.current.get(T)!==f&&(o.current.set(T,f),f.handle.addNotifier(t),f.refCount+=1),r.current.set(y,f.handle),f.handle};return i.set(u,g),g}})},[e,s])}var re=require("react");function nt(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 Mo(e){return e instanceof Error?e:new Error(String(e))}function Qr(e,t){let r=(0,re.useMemo)(()=>nt(e),[e]),[o,n]=(0,re.useState)(void 0),[s,i]=(0,re.useState)(null),[a,u]=(0,re.useState)(!1),c=(0,re.useRef)(t);c.current=t;let g=(0,re.useRef)(0),l=(0,re.useRef)(null),y=(0,re.useRef)(!0);(0,re.useEffect)(()=>(y.current=!0,()=>{y.current=!1,l.current?.abort()}),[]);let b=(0,re.useCallback)(async v=>{l.current?.abort();let d=new AbortController;l.current=d;let E=++g.current,S=()=>y.current&&g.current===E;S()&&(u(!0),i(null));try{let k=await r.request(v,{...c.current,signal:d.signal});return S()&&(n(k),u(!1),c.current?.onSuccess?.(k)),k}catch(k){let m=Mo(k);throw S()&&(i(m),u(!1),c.current?.onError?.(m)),m}},[r]),T=(0,re.useCallback)(v=>{b(v).catch(()=>{})},[b]),f=(0,re.useCallback)(()=>{g.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:T,mutateAsync:b,data:o,error:s,isPending:a,reset:f}}var se=require("react");function en(e){return e instanceof Error?e:new Error(String(e))}var _o=e=>typeof e=="string"?e:String(e);function tn(e,t){let r=(0,se.useMemo)(()=>nt(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),y=(0,se.useRef)(!0);(0,se.useEffect)(()=>(y.current=!0,()=>{y.current=!1,l.current?.cancel(),l.current=null}),[]);let b=(0,se.useCallback)(()=>{g.current++,l.current?.cancel(),l.current=null,y.current&&i(!1)},[]),T=(0,se.useCallback)(async f=>{l.current?.cancel();let v=++g.current,d=()=>y.current&&g.current===v,E=c.current,S=E?.parseChunk??_o,k=E?.buildPayload??(x=>({prompt:x}));d()&&(n(""),u(null),i(!0));let{parseChunk:m,buildPayload:R,onFinish:P,onError:C,...A}=E??{},p="",w;try{w=r.requestStream(k(f),A),l.current=w}catch(x){let O=en(x);d()&&(u(O),i(!1),E?.onError?.(O));return}try{for await(let x of w){if(g.current!==v)break;p+=S(x),d()&&n(p)}d()&&(i(!1),E?.onFinish?.(p))}catch(x){let O=en(x);d()&&(u(O),i(!1),E?.onError?.(O))}finally{l.current===w&&(l.current=null)}},[r]);return{completion:o,complete:T,stop:b,isStreaming:s,error:a}}var Z=require("react");function rn(e){return e instanceof Error?e:new Error(String(e))}var No=e=>typeof e=="string"?e:String(e),nn=0;function gr(e){return nn+=1,`${e}-${nn}`}function on(e,t){let r=(0,Z.useMemo)(()=>nt(e),[e]),[o,n]=(0,Z.useState)(()=>(t?.initialMessages??[]).map(S=>({id:S.id??gr("msg"),role:S.role,content:S.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 y=(0,Z.useRef)(o);y.current=o;let b=(0,Z.useRef)(s);b.current=s;let T=(0,Z.useRef)(0),f=(0,Z.useRef)(null),v=(0,Z.useRef)(!0);(0,Z.useEffect)(()=>(v.current=!0,()=>{v.current=!1,f.current?.cancel(),f.current=null}),[]);let d=(0,Z.useCallback)(()=>{T.current++,f.current?.cancel(),f.current=null,v.current&&u(!1)},[]),E=(0,Z.useCallback)(async S=>{let k=S===void 0,m=(k?b.current:S)??"";if(!m.trim())return;f.current?.cancel();let P=++T.current,C=()=>v.current&&T.current===P,A=l.current,p=A?.parseChunk??No,w={id:gr("msg"),role:"user",content:m},x={id:gr("msg"),role:"assistant",content:""},O=[...y.current,w].map(B=>({role:B.role,content:B.content})),H=[...y.current,w,x];y.current=H,n(H),k&&i(""),g(null),u(!0);let W=A?.buildPayload??(B=>({messages:B})),{initialMessages:D,parseChunk:M,buildPayload:q,onFinish:z,onError:Q,...j}=A??{},ne=B=>{n(G=>G.map(Te=>Te.id===x.id?{...Te,content:B}:Te))},le="",ee;try{ee=r.requestStream(W(O),j),f.current=ee}catch(B){let G=rn(B);C()&&(g(G),u(!1),A?.onError?.(G));return}try{for await(let B of ee){if(T.current!==P)break;le+=p(B),C()&&ne(le)}C()&&(u(!1),A?.onFinish?.({...x,content:le}))}catch(B){let G=rn(B);C()&&(g(G),u(!1),A?.onError?.(G))}finally{f.current===ee&&(f.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:E,stop:d,isStreaming:a,error:c}}var Y=require("react"),ot=require("@urun-sh/core"),Sr=[];function sn(e,t={}){let{field:r=ot.INPUT_PRESENCE_FIELD,hz:o=ot.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,ot.createInputPresencePublisher)({awareness:{setLocalStateField:(m,R)=>s.setField(m,R)},field:r,hz:o}):null,[s,r,o]),a=(0,Y.useRef)(null);a.current=i;let[u,c]=(0,Y.useState)(!1),[g,l]=(0,Y.useState)(Sr),y=(0,Y.useRef)(!1);(0,Y.useEffect)(()=>{if(i)return()=>i.dispose()},[i]);let b=(0,Y.useCallback)(()=>{let m=a.current;l(m?m.heldKeys():Sr)},[]),T=(0,Y.useCallback)(()=>{a.current?.clear(),l(Sr)},[]);(0,Y.useEffect)(()=>{if(!n)return;let m=()=>!!n.pointerLockElement,R=()=>{if(m()){y.current=!1,c(!0);return}y.current||(c(!1),T())},P=x=>{m()&&(a.current?.keyDown(x.key),b())},C=x=>{a.current?.keyUp(x.key),b()},A=x=>{m()&&a.current?.movePointer(x.movementX,x.movementY)},p=x=>{m()&&a.current?.setButtons(x.buttons)},w=()=>{T()};return n.addEventListener("pointerlockchange",R),n.addEventListener("keydown",P),n.addEventListener("keyup",C),n.addEventListener("mousemove",A),n.addEventListener("mousedown",p),n.addEventListener("mouseup",p),n.defaultView?.addEventListener("blur",w),()=>{n.removeEventListener("pointerlockchange",R),n.removeEventListener("keydown",P),n.removeEventListener("keyup",C),n.removeEventListener("mousemove",A),n.removeEventListener("mousedown",p),n.removeEventListener("mouseup",p),n.defaultView?.removeEventListener("blur",w)}},[n,T,b]);let f=(0,Y.useCallback)(m=>{m.requestPointerLock?.()},[]),v=(0,Y.useCallback)(()=>{y.current=!0,c(!0)},[]),d=(0,Y.useCallback)(()=>{y.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),T()},[n,T]),E=(0,Y.useCallback)(m=>{a.current?.keyDown(m),b()},[b]),S=(0,Y.useCallback)(m=>{a.current?.keyUp(m),b()},[b]),k=(0,Y.useCallback)((m,R)=>{a.current?.movePointer(m,R)},[]);return{engage:f,engageTouch:v,release:d,engaged:u,heldKeys:g,pressKey:E,releaseKey:S,movePointer:k}}var ce=require("react"),gn=require("@urun-sh/core");var I=require("react"),fn=require("@urun-sh/core");var Ft=null;function Lo(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function bt(){if(Ft)return Ft;let e=Lo();return e?(Ft=new e,Ft):null}function $e(){let e=bt();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var Tt=require("react"),cn=require("react/jsx-runtime"),hr=(0,Tt.createContext)(null);function an({session:e,children:t}){return(0,cn.jsx)(hr.Provider,{value:e,children:t})}function Ce(){return(0,Tt.useContext)(hr)}function un(){let e=(0,Tt.useContext)(hr);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 Rt=require("react/jsx-runtime");function Oo(e,t){return e-t>>>0<2147483648}var ln=1e3;function dn(...e){console.debug("[video]",...e)}function pn(e,t){let r=new Set,o=t.filter(s=>r.has(s)?!1:(r.add(s),!0)).map(s=>e.stream(s)),n=()=>{for(let s of o){let i=s.track;if(i&&i.readyState==="live")return i}return null};return{get track(){return n()},on(s,i){let a=o.map(u=>u.on("track",()=>i(n())));return()=>{for(let u of a)u()}}}}function mn(e,t,r){return r?[r,t]:[e,t]}var Xe=(0,I.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:y,placeholder:b,poster:T,children:f,onTrack:v,onFirstFrame:d,frameMarker:E,onFrameMarkerReached:S,onFrameMarkerUnsupported:k,onUnlockChange:m}=t,R=Ce(),P=o??R,C=(0,I.useRef)(null),A=(0,I.useRef)(null),[p,w]=(0,I.useState)(!1),[x,O]=(0,I.useState)(!1),H=(0,I.useRef)(!1),W=(0,I.useRef)(null),D=(0,I.useRef)(v);D.current=v;let M=(0,I.useRef)(m);M.current=m;let q=(0,I.useRef)(d);q.current=d;let z=(0,I.useRef)(S);z.current=S;let Q=(0,I.useRef)(k);Q.current=k;let j=(0,I.useRef)(E??null);j.current=E??null;let ne=(0,I.useCallback)(h=>{W.current!==h&&(W.current=h,M.current?.(h))},[]),le=(0,I.useRef)(null),ee=(0,I.useRef)(null),B=(0,I.useCallback)((h,N=!1)=>{if(!N&&h===le.current||(le.current=h,ee.current?.(),ee.current=null,H.current=!1,O(!1),!h))return;let U=C.current;if(!U)return;let K=j.current,Se=K?.rtpTimestamp??null,Ue=!1,L=()=>{Ue||(Ue=!0,Q.current?.())};K&&Se==null&&L();let Ae=K!=null&&Se!=null,Ze=_e=>{ee.current?.(),ee.current=null,H.current=!0,O(!0),q.current?.(),_e&&z.current?.()};if(typeof U.requestVideoFrameCallback=="function"){let _e=!1,V=0,F=(he,ve)=>{if(!_e){if(Ae){let Re=ve?.rtpTimestamp;if(typeof Re!="number"){L(),Ze(!1);return}if(!Oo(Re,Se)){V=U.requestVideoFrameCallback(F);return}Ze(!0);return}Ze(!1)}};V=U.requestVideoFrameCallback(F),ee.current=()=>{_e=!0,U.cancelVideoFrameCallback?.(V)};return}Ae&&L();let Me=()=>{let _e=U.getVideoPlaybackQuality?.();(_e?_e.totalVideoFrames>0:U.readyState>=2&&U.videoWidth>0)&&Ze(!1)};U.addEventListener("loadeddata",Me),U.addEventListener("timeupdate",Me),U.addEventListener("playing",Me),ee.current=()=>{U.removeEventListener("loadeddata",Me),U.removeEventListener("timeupdate",Me),U.removeEventListener("playing",Me)},Me()},[]);(0,I.useEffect)(()=>()=>{ee.current?.(),ee.current=null},[]);let G=E==null?null:`${E.rtpTimestamp??""}|${E.ptsMs??""}`,Te=(0,I.useRef)(G);(0,I.useEffect)(()=>{if(Te.current===G||(Te.current=G,G==null))return;let h=le.current;h&&B(h,!0)},[G,B]);let ie=(0,I.useCallback)(()=>{if(typeof MediaStream>"u")return null;A.current||(A.current=new MediaStream);let h=C.current;return h&&h.srcObject!==A.current&&(h.srcObject=A.current),A.current},[]),de=(0,I.useCallback)(h=>{let N=C.current;if(!N)return;let U=N.play();!U||typeof U.then!="function"||U.then(()=>{N.muted||ne(!0)}).catch(K=>{if((K instanceof Error?K.name:String(K))==="NotAllowedError"&&!N.muted){dn(`play() blocked pending a user gesture (${h})`),ne(!1);return}dn(`play() failed (${h})`,K)})},[ne]),Fe=(0,I.useCallback)(()=>{let h=C.current;h&&(ie(),!h.muted&&(de("gesture"),$e(),ne(!0)))},[ie,de,ne]),pe=(0,I.useCallback)(h=>{let N=ie();if(N){for(let U of N.getVideoTracks())U!==h&&N.removeTrack(U);if(h&&!N.getVideoTracks().includes(h)){N.addTrack(h);let U=C.current;U&&(U.srcObject=N)}h&&de("track-attach"),w(h!==null),B(h),D.current?.(h)}},[ie,de,B]),we=(0,I.useCallback)(h=>{let N=ie();if(N){for(let U of N.getAudioTracks())U!==h&&N.removeTrack(U);h&&!N.getAudioTracks().includes(h)&&N.addTrack(h),h&&de("audio-attach")}},[ie,de]),me=(0,I.useCallback)(h=>{C.current=h,h&&(a?(h.muted=!0,h.defaultMuted=!0,h.setAttribute("muted",""),W.current=null):(h.muted=!1,h.defaultMuted=!1,h.removeAttribute("muted")),h.setAttribute("playsinline",""),h.setAttribute("webkit-playsinline",""),ie())},[ie,a]);(0,I.useImperativeHandle)(r,()=>({get element(){return C.current},get live(){return A.current?A.current.getVideoTracks().length>0:!1},get framed(){return H.current},unlock:Fe,get unlocked(){return W.current===!0}}),[Fe]);let ue=(0,fn.derivedLegRole)(n)!==void 0;(0,I.useEffect)(()=>{ue&&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.`)},[ue,n]);let oe=i!==void 0;return(0,I.useEffect)(()=>{if(oe){pe(i??null);return}if(ue){pe(null);return}if(!P)return;let h=pn(P,mn(n,"video")),N=()=>{let L=A.current;return L?L.getVideoTracks()[0]??null:null},U=L=>{if(L!==N()&&(pe(L),L)){let Ae=()=>{N()===L&&pe(null)};L.addEventListener("ended",Ae)}},K=h.track;K&&K.readyState==="live"&&U(K);let Se=h.on("track",L=>{L&&L.readyState!=="live"||U(L)}),Ue=setInterval(()=>{let L=h.track;L&&L.readyState==="live"&&U(L)},ln);return()=>{Se(),clearInterval(Ue)}},[P,n,ue,oe,i,pe]),(0,I.useEffect)(()=>{if(oe||!P||s===!1||ue)return;let h=pn(P,mn(n,"audio",s)),N=()=>{let L=A.current;return L?L.getAudioTracks()[0]??null:null},U=L=>{if(L!==N()&&(we(L),L)){let Ae=()=>{N()===L&&we(null)};L.addEventListener("ended",Ae)}},K=h.track;K&&K.readyState==="live"&&U(K);let Se=h.on("track",L=>{L&&L.readyState!=="live"||U(L)}),Ue=setInterval(()=>{let L=h.track;L&&L.readyState==="live"&&U(L)},ln);return()=>{Se(),clearInterval(Ue)}},[P,n,ue,s,oe,we]),(0,Rt.jsxs)("div",{className:g,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":p?"true":"false","data-urun-video-framed":x?"true":"false",children:[(0,Rt.jsx)("video",{ref:me,className:y,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),p?null:b,T===void 0?null:(0,Rt.jsx)("div",{"data-urun-video-poster":"","aria-hidden":x||void 0,style:{position:"absolute",inset:0,...x?{opacity:0,pointerEvents:"none"}:null},children:T}),f]})});var Pt=require("react/jsx-runtime"),Io={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},Sn=(0,ce.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,y=(0,ce.useRef)(null),b=(0,ce.useRef)(null),T=(0,ce.useRef)(0),f=(0,ce.useRef)(g);f.current=g;let v=(0,ce.useMemo)(()=>(0,gn.createCameraWarp)(f.current),[]);return(0,ce.useImperativeHandle)(r,()=>({get video(){return y.current},get canvas(){return b.current},warp:v,get lastDrawTs(){return T.current}}),[v]),(0,ce.useEffect)(()=>{if(!i)return;let d=0,E=0,S=null,k=R=>{typeof R.requestVideoFrameCallback=="function"&&(S=R,E=R.requestVideoFrameCallback(function P(){v.frameArrived(),E=R.requestVideoFrameCallback(P)}))},m=R=>{d=requestAnimationFrame(m);let P=b.current,C=y.current?.element??null;if(!P||!C||(C!==S&&(S&&E&&S.cancelVideoFrameCallback?.(E),k(C)),C.readyState<2))return;v.tick(R);let A=typeof devicePixelRatio=="number"?devicePixelRatio:1,p=Math.max(1,Math.round(P.clientWidth*A)),w=Math.max(1,Math.round(P.clientHeight*A));(P.width!==p||P.height!==w)&&(P.width=p,P.height=w);let x=P.getContext("2d");if(!x)return;let O=v.transform(),H=C.videoWidth||p,W=C.videoHeight||w,M=Math.max(p/H,w/W)*(1+a)*O.scale;x.setTransform(M,0,0,M,p/2+O.translateX*p,w/2+O.translateY*w),x.drawImage(C,-H/2,-W/2),T.current=R};return d=requestAnimationFrame(m),()=>{cancelAnimationFrame(d),S&&E&&S.cancelVideoFrameCallback?.(E)}},[i,a,v]),(0,ce.useEffect)(()=>{if(!i||!u||!l)return;let d=()=>!!l.pointerLockElement,E=P=>{d()&&v.keyDown(P.key)},S=P=>v.keyUp(P.key),k=P=>{d()&&v.pointerDelta(P.movementX,P.movementY)},m=()=>{d()||v.clearKeys()},R=()=>v.clearKeys();return l.addEventListener("keydown",E),l.addEventListener("keyup",S),l.addEventListener("mousemove",k),l.addEventListener("pointerlockchange",m),l.defaultView?.addEventListener("blur",R),()=>{l.removeEventListener("keydown",E),l.removeEventListener("keyup",S),l.removeEventListener("mousemove",k),l.removeEventListener("pointerlockchange",m),l.defaultView?.removeEventListener("blur",R)}},[i,u,l,v]),i?(0,Pt.jsxs)(Xe,{ref:y,...s,videoClassName:s.videoClassName,style:{...s.style},children:[(0,Pt.jsx)("canvas",{ref:b,style:Io,"data-urun-warp":""}),n]}):(0,Pt.jsx)(Xe,{ref:y,...s,children:n})});var hn=new Map;function vn(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);hn.set(e,{component:t,schema:r})}function yn(e,t){let r=hn.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 Je=require("react/jsx-runtime");function kn({name:e,props:t,fallback:r}){let o=yn(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?(0,Je.jsx)(Je.Fragment,{children:r}):(0,Je.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,Je.jsx)("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return(0,Je.jsx)(n,{...o.validatedProps})}var st=require("zod"),ze=require("react/jsx-runtime"),bn=st.z.object({step:st.z.number().min(0),total:st.z.number().min(1),label:st.z.string().optional(),variant:st.z.enum(["default","success","error"]).default("default")});function vr(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 Tn(e){let{step:t,total:r,label:o,variant:n,percentage:s}=vr(e);return(0,ze.jsxs)("div",{className:"urun-progress-card","data-variant":n,children:[o&&(0,ze.jsx)("div",{className:"urun-progress-label",children:o}),(0,ze.jsx)("div",{className:"urun-progress-bar",children:(0,ze.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,ze.jsxs)("div",{className:"urun-progress-text",children:[t,"/",r]})]})}var Ht=require("zod"),xt=require("react/jsx-runtime"),Rn=Ht.z.object({state:Ht.z.enum(["thinking","generating","idle","error"]),message:Ht.z.string().optional()}),Do={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function yr(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??Do[t]??t;return{state:t,message:n,isActive:o}}function Pn(e){let{state:t,message:r,isActive:o}=yr(e);return(0,xt.jsxs)("span",{className:"urun-status-badge","data-state":t,children:[(0,xt.jsx)("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),(0,xt.jsx)("span",{className:"urun-status-message",children:r})]})}var Et=require("react"),qt=require("zod"),Ct=require("react/jsx-runtime"),xn=qt.z.object({text:qt.z.string(),streaming:qt.z.boolean().default(!1)});function kr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function En(e){let{text:t,streaming:r}=kr(e),o=(0,Et.useRef)(null),n=(0,Et.useRef)(0);return(0,Et.useEffect)(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),(0,Ct.jsxs)("div",{className:"urun-text-stream",children:[(0,Ct.jsx)("span",{ref:o,className:"urun-text-content"}),r&&(0,Ct.jsx)("span",{className:"urun-text-cursor"})]})}var wt=require("zod"),Ut=require("react/jsx-runtime"),Cn=wt.z.object({src:wt.z.string().url(),alt:wt.z.string().optional(),caption:wt.z.string().optional()});function br(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function wn(e){let{src:t,alt:r,caption:o}=br(e);return(0,Ut.jsxs)("figure",{className:"urun-image-frame",children:[(0,Ut.jsx)("img",{className:"urun-image",src:t,alt:r}),o&&(0,Ut.jsx)("figcaption",{className:"urun-image-caption",children:o})]})}var Oe=require("zod"),it=require("react/jsx-runtime"),Un=Oe.z.object({metrics:Oe.z.array(Oe.z.object({label:Oe.z.string(),value:Oe.z.union([Oe.z.string(),Oe.z.number()]),unit:Oe.z.string().optional()}))});function Tr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function An(e){let{metrics:t}=Tr(e);return(0,it.jsx)("div",{className:"urun-metrics-panel",children:t.map((r,o)=>(0,it.jsxs)("div",{className:"urun-metric-card",children:[(0,it.jsx)("div",{className:"urun-metric-label",children:r.label}),(0,it.jsx)("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}var $=require("react"),Ln=require("react/jsx-runtime");function He(e){return e&&typeof e=="object"?e:null}function Rr(e){if(typeof e=="string")return e;let t=He(e);return t&&t.t==="delta"&&typeof t.delta=="string"?t.delta:""}function Vo(e){if(typeof e=="string")return"delta";let t=He(e);return t?t.t==="delta"?"delta":t.t==="response"?"done":t.t==="error"?"error":"ignore":"ignore"}function Fo(...e){for(let t of e)if(typeof t=="string"&&t)return t;return""}function Ho(e){let t=He(e),r=t?.body;return Fo(r,He(He(r)?.error)?.message,He(r)?.error,He(r)?.message,He(t?.error)?.message,t?.error,t?.message)||"stream reported an error"}var at=class extends Error{name="TextStreamError"},qo=4,Pr=3,xr=240;function Mn(){return{chars:0,tokens:0,tokensPerSecond:0,elapsedMs:0,done:!1}}function Wo(e){e.chars=0,e.tokens=0,e.tokensPerSecond=0,e.elapsedMs=0,e.done=!1}function Er(e){let{session:t,stream:r}=e,o=(0,$.useRef)(e);(0,$.useEffect)(()=>{o.current=e});let n=(0,$.useRef)(null),s=(0,$.useRef)(()=>{}),i=(0,$.useRef)(null),a=(0,$.useRef)(""),u=(0,$.useRef)(""),c=(0,$.useRef)(null),g=(0,$.useRef)(!1),l=(0,$.useRef)(!1),y=(0,$.useRef)(!1),b=(0,$.useRef)(0),T=(0,$.useRef)(Mn()),f=(0,$.useCallback)(S=>{if(n.current=S,!S){i.current=null;return}let k=i.current;if(k&&k.parentNode===S)return;let m=S.ownerDocument.createTextNode(u.current);S.appendChild(m),i.current=m,a.current.length>0&&s.current()},[]),v=(0,$.useCallback)(()=>{c.current=null;let S=i.current,k=a.current;if(k.length>0){let A=o.current,p=A.smoothCharsPerFrame??Pr,w=A.smoothThreshold??xr,x=A.smooth&&k.length<=w?k.slice(0,p):k;a.current=k.slice(x.length),u.current+=x,S?.appendData(x)}let m=T.current,R=u.current.length,P=b.current===0?0:Date.now()-b.current,C=Math.round(R/qo);if(m.chars=R,m.tokens=C,m.elapsedMs=P,m.tokensPerSecond=P>0?C*1e3/P:0,a.current.length>0){d(),o.current.onMeter?.(m);return}if(!g.current&&!y.current){y.current=!0,m.done=!0,o.current.onMeter?.(m),l.current||o.current.onDone?.(u.current);return}o.current.onMeter?.(m)},[]),d=(0,$.useCallback)(()=>{c.current===null&&(c.current=globalThis.requestAnimationFrame(()=>v()))},[v]);s.current=d,(0,$.useEffect)(()=>{if(!t)return;if(typeof globalThis.requestAnimationFrame!="function")throw new Error("[urun] Text requires requestAnimationFrame. Render it in a browser (or a DOM test environment).");a.current="",u.current="",l.current=!1,y.current=!1,b.current=0,g.current=!0,Wo(T.current),i.current&&(i.current.data="");let S=!1,k=null;return(async()=>{try{for(k=t.stream(r).messages()[Symbol.asyncIterator]();;){let R=await k.next();if(S)return;if(R.done)break;let P=R.value,C=Vo(P);if(C==="error")throw new at(Ho(P));if(C==="done")break;if(C==="ignore")continue;let A=Rr(P);A&&(b.current===0&&(b.current=Date.now()),a.current+=A,d())}if(S)return;k.return?.(void 0),g.current=!1,d()}catch(m){if(S)return;k?.return?.(void 0),l.current=!0,g.current=!1,o.current.onError?.(m instanceof Error?m:new at(String(m))),d()}})(),()=>{S=!0,g.current=!1,k?.return?.(void 0),c.current!==null&&(globalThis.cancelAnimationFrame?.(c.current),c.current=null)}},[t,r,d]);let E=(0,$.useCallback)(()=>u.current,[]);return{ref:f,meterRef:T,getText:E}}function _n(e,t=250){let[r,o]=(0,$.useState)(Mn);return(0,$.useEffect)(()=>{let n=setInterval(()=>{let s=e.current;o(i=>i.chars===s.chars&&i.done===s.done?i:{...s})},t);return()=>clearInterval(n)},[e,t]),r}function Nn(e){let{className:t,style:r,...o}=e,{ref:n}=Er(o);return(0,Ln.jsx)("span",{ref:n,className:t,style:r})}var On=require("react");var Dn=require("react/jsx-runtime"),In=(0,On.forwardRef)(function(t,r){let{stream:o="image",...n}=t;return(0,Dn.jsx)(Xe,{ref:r,stream:o,...n})});var J=require("react"),Fn=require("@urun-sh/core");var qn=require("react/jsx-runtime"),Bo=1e3,Vn=200;function Cr(...e){console.debug("[audio]",...e)}var At=(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=Ce(),y=o??l,b=(0,J.useRef)(null),T=(0,J.useRef)(null),f=(0,J.useRef)(null),v=(0,J.useRef)(null),d=(0,J.useRef)(u);d.current=u;let E=(0,J.useRef)(c);E.current=c;let S=(0,J.useCallback)(p=>{f.current!==p&&(f.current=p,E.current?.(p))},[]),k=(0,J.useCallback)(()=>{if(typeof MediaStream>"u")return null;T.current||(T.current=new MediaStream);let p=b.current;return p&&p.srcObject!==T.current&&(p.srcObject=T.current),T.current},[]),m=(0,J.useCallback)(p=>{let w=b.current;if(!w)return;let x=w.play();!x||typeof x.then!="function"||x.then(()=>{w.muted||S(!0)}).catch(O=>{let H=O instanceof Error?O.name:String(O);if(H==="AbortError"){Cr(`play() aborted (${p}); retrying in ${Vn}ms`),v.current&&clearTimeout(v.current),v.current=setTimeout(()=>{v.current=null,m(`${p}:retry`)},Vn);return}if(H==="NotAllowedError"){Cr(`play() blocked pending a user gesture (${p})`),S(!1);return}Cr(`play() failed (${p})`,O)})},[S]),R=(0,J.useCallback)(p=>{let w=k();if(w){for(let x of w.getAudioTracks())x!==p&&w.removeTrack(x);p&&!w.getAudioTracks().includes(p)&&w.addTrack(p),p&&m("track-attach"),d.current?.(p)}},[k,m]),P=(0,J.useCallback)(()=>{let p=b.current;p&&(k(),p.muted=!1,m("gesture"),$e(),S(!0))},[k,m,S]);(0,J.useImperativeHandle)(r,()=>({unlock:P,get unlocked(){return f.current===!0},get element(){return b.current}}),[P]);let C=(0,J.useCallback)(p=>{b.current=p,p&&(p.setAttribute("playsinline",""),p.setAttribute("webkit-playsinline",""),k()),g?.(p)},[k,g]),A=s!==void 0;return(0,J.useEffect)(()=>{if(A){R(s??null);return}if(!y)return;let p=y.stream(n),w=()=>{let D=T.current;return D?D.getAudioTracks()[0]??null:null},x=D=>{if(D!==w()&&(R(D),D)){let M=()=>{w()===D&&R(null)};D.addEventListener("ended",M)}},O=p.track;O&&O.readyState==="live"&&x(O);let H=p.on("track",D=>{D&&D.readyState!=="live"||x(D)}),W=setInterval(()=>{let D=p.track;D&&D.readyState==="live"&&x(D)},Bo);return()=>{H(),clearInterval(W)}},[y,n,A,s,R]),(0,J.useEffect)(()=>(0,Fn.observePageLifecycle)(()=>{$e(),f.current===!0&&m("foreground")}),[m]),(0,J.useEffect)(()=>()=>{v.current&&clearTimeout(v.current)},[]),(0,qn.jsx)("audio",{ref:C,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),Hn=At;var X=require("react"),ut=require("@urun-sh/core");var Bn=require("react/jsx-runtime"),wr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Wt(...e){console.debug("[voice]",...e)}var Mt=(0,X.forwardRef)(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=wr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:g,onError:l,onMicStream:y,onTrack:b,onUnlockChange:T,capture:f}=t,v=Ce(),d=o??v,E=(0,X.useRef)(null),S=(0,X.useRef)(null),k=(0,X.useRef)(null),m=(0,X.useRef)([]),R=(0,X.useRef)(!1),P=(0,X.useRef)(g);P.current=g;let C=(0,X.useRef)(l);C.current=l;let A=(0,X.useRef)(y);A.current=y;let p=(0,X.useCallback)(M=>{R.current!==M&&(R.current=M,P.current?.(M))},[]),w=(0,X.useCallback)(()=>{for(let M of m.current)M();m.current=[],k.current?.release(),k.current=null,S.current&&(S.current=null,A.current?.(null))},[]),x=(0,X.useCallback)(async()=>{let M=k.current;if(M){let j=await M.update(i);return S.current=M.stream,A.current?.(M.stream),j}let z=await(f??(0,ut.sharedCaptureController)()).claim("audio",i);k.current=z,m.current=[z.onTrack((j,ne)=>{S.current=ne,A.current?.(ne),R.current&&d?.stream(n).attach(j).catch(le=>Wt("mic re-attach after one-capture re-acquire failed",le))}),z.onLost(j=>{k.current=null,m.current=[],S.current=null,A.current?.(null),p(!1),C.current?.(j)})],S.current=z.stream,A.current?.(z.stream);let Q=z.track;if(!Q)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return Q},[f,i,d,n,p]),O=(0,X.useCallback)(async()=>{w(),p(!1),await d?.stream(n).detach().catch(()=>{})},[d,n,w,p]),H=(0,X.useCallback)(async()=>{if(!d)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");E.current?.unlock();let M;try{M=await x()}catch(Q){w();let j=(0,ut.sessionFailureFromMediaError)(Q,d.status);throw C.current?.(j),j}d.connect?.();let q;for(let Q=1;Q<=u;Q++)try{await d.whenLive(a!==void 0?{timeout:a}:void 0),await d.stream(n).attach(M),p(!0);return}catch(j){q=j,Wt(`start attempt ${Q}/${u} failed`,j),Q<u&&await new Promise(ne=>setTimeout(ne,c))}w(),p(!1);let z=q instanceof Error?q:new Error(String(q??"voice start failed"));throw C.current?.(z),z},[d,n,a,u,c,x,w,p]);(0,X.useImperativeHandle)(r,()=>({start:H,stop:O,unlock:()=>E.current?.unlock(),get active(){return R.current},get micStream(){return S.current},get audio(){return E.current}}),[H,O]);let W=(0,X.useRef)(!1),D=(0,X.useCallback)(async()=>{if(!d||!R.current||W.current)return;let M=S.current?.getAudioTracks()[0]??null;if(M&&M.readyState==="live"){try{await d.stream(n).attach(M)}catch(q){Wt("foreground mic re-assert failed (will retry on next pass)",q)}return}W.current=!0;try{let q=await x();await d.stream(n).attach(q)}catch(q){let z=q instanceof Error?q:new Error(String(q));Wt("foreground mic re-acquire failed",z),C.current?.(z)}finally{W.current=!1}},[d,n,x]);return(0,X.useEffect)(()=>{let M=()=>{D()};return d&&typeof d.onRecovery=="function"?d.onRecovery(M):(0,ut.observePageLifecycle)(M)},[d,D]),(0,X.useEffect)(()=>w,[w]),s?(0,Bn.jsx)(At,{ref:E,session:d,stream:n,onTrack:b,onUnlockChange:T}):null}),Wn=Mt;var xe=require("react");var Bt=require("react");var Ur={level:0,speaking:!1};function jt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=(0,Bt.useState)(Ur);return(0,Bt.useEffect)(()=>{if(!e){i(Ur);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),b=setInterval(()=>{g.getByteTimeDomainData(l);let T=0;for(let v=0;v<l.length;v++){let d=(l[v]-128)/128;T+=d*d}let f=Math.sqrt(T/l.length);i(v=>{let d=f>n;return Math.abs(v.level-f)<.005&&v.speaking===d?v:{level:f,speaking:d}})},o);return()=>{clearInterval(b),c.disconnect(),i(Ur)}},[e,r,o,n]),s}var Ie=require("react/jsx-runtime"),jo={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},Ko={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},jn=(0,xe.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:y}=t,b=Ce(),T=o??b,f=(0,xe.useRef)(null),[v,d]=(0,xe.useState)(null),E=(0,xe.useRef)(l);E.current=l;let{level:S,speaking:k}=jt(a?v:null);return(0,xe.useImperativeHandle)(r,()=>({start:()=>{let m=f.current;return m?m.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>f.current?.stop()??Promise.resolve(),get active(){return f.current?.active??!1},get micStream(){return f.current?.micStream??null}}),[]),(0,xe.useEffect)(()=>{!i||!T||f.current?.start().catch(()=>{})},[i,T]),(0,Ie.jsxs)(Ie.Fragment,{children:[(0,Ie.jsx)(Mt,{ref:f,session:T,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...y!==void 0?{capture:y}:{},onActiveChange:c,onError:g,onMicStream:m=>{d(m),E.current?.(m)}}),a?(0,Ie.jsx)("span",{className:u,style:jo,"data-urun-mic":"","data-urun-mic-active":v?"true":"false","data-urun-mic-speaking":k?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(S*100)/100,children:(0,Ie.jsx)("span",{style:Ko,children:(0,Ie.jsx)("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(S*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});var ct=require("@urun-sh/core"),_=require("react");var ye=require("react/jsx-runtime"),Mr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Ar(...e){console.debug("[camera]",...e)}function $o(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function Xo(){let e=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof e?.enumerateDevices!="function")return null;try{return(await e.enumerateDevices()).filter(r=>r.kind==="videoinput")}catch{return null}}var _r=(0,_.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:y=!1,className:b,videoClassName:T,onActiveChange:f,onError:v,onStream:d,onTrack:E,children:S,capture:k,flipControl:m="auto",flipControlClassName:R,onDevices:P}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let C=i?"user":a?"environment":u??"environment",A=Ce(),p=o??A,w=(0,_.useRef)(null),x=(0,_.useRef)(null),O=(0,_.useRef)(null),H=(0,_.useRef)([]),W=(0,_.useRef)(null),D=(0,_.useRef)(!1),M=(0,_.useRef)(!1),q=(0,_.useRef)(C),[z,Q]=(0,_.useState)(C),[j,ne]=(0,_.useState)(!1),[le,ee]=(0,_.useState)(null),[B,G]=(0,_.useState)(!1),[Te]=(0,_.useState)($o),ie=(0,_.useRef)(f);ie.current=f;let de=(0,_.useRef)(v);de.current=v;let Fe=(0,_.useRef)(d);Fe.current=d;let pe=(0,_.useRef)(E);pe.current=E;let we=(0,_.useRef)(P);we.current=P;let me=(0,_.useCallback)(V=>{D.current!==V&&(D.current=V,ne(V),ie.current?.(V))},[]);(0,_.useEffect)(()=>{if(!j){ee(null);return}let V=!1,F=()=>{Xo().then(ve=>{V||(ee(ve),ve&&we.current?.(ve))})};F();let he=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof he?.addEventListener=="function"?(he.addEventListener("devicechange",F),()=>{V=!0,he.removeEventListener?.("devicechange",F)}):()=>{V=!0}},[j]);let ue=(0,_.useCallback)(V=>{let F=w.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?.(he=>Ar("preview play() failed",he)))},[]),oe=(0,_.useCallback)(()=>{M.current=!1,W.current?.(),W.current=null;for(let V of H.current)V();H.current=[],O.current?.release(),O.current=null,x.current&&(x.current=null,Fe.current?.(null),pe.current?.(null)),ue(null)},[ue]),h=(0,_.useCallback)((V,F)=>{W.current?.(),x.current=F,ue(F),Fe.current?.(F);let he=()=>{x.current===F&&(Ar("camera track ended (device removed or permission revoked)"),oe(),me(!1))};V.addEventListener("ended",he),W.current=()=>V.removeEventListener("ended",he)},[ue,oe,me]),N=(0,_.useCallback)(async V=>{let F=n!==!1;if(F&&!p)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let he={...Mr,...s,facingMode:V},ve;try{let Re=O.current;if(Re)ve=await Re.update(he);else{let St=await(k??(0,ct.sharedCaptureController)()).claim("video",he);if(O.current=St,H.current=[St.onTrack((ht,go)=>{h(ht,go),D.current&&(!F||!p||p.stream(n).attachVideo(ht).then(()=>pe.current?.(ht)).catch(So=>Ar("camera re-publish after one-capture re-acquire failed",So)))}),St.onLost(ht=>{O.current=null,H.current=[],oe(),me(!1),de.current?.(ht)})],!St.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});ve=St.track}}catch(Re){let Qe=(0,ct.sessionFailureFromMediaError)(Re,p?.status);throw de.current?.(Qe),Qe}q.current=V,Q(V),h(ve,O.current?.stream??new MediaStream([ve]));try{F&&p&&(p.connect?.(),await p.whenLive(l!==void 0?{timeout:l}:void 0),await p.stream(n).attachVideo(ve)),M.current=F?n:!1}catch(Re){oe(),me(!1);let Qe=Re instanceof Error?Re:new Error(String(Re));throw de.current?.(Qe),Qe}pe.current?.(ve),me(!0)},[p,n,s,l,k,h,oe,me]),U=(0,_.useCallback)(V=>N(V?.facingMode??q.current),[N]),K=(0,_.useCallback)(async V=>{let F=M.current===n;D.current&&q.current===V&&F||await N(V)},[N,n]),Se=(0,_.useCallback)(()=>N(q.current==="environment"?"user":"environment"),[N]),Ue=(0,_.useCallback)(async()=>{oe(),me(!1),n!==!1&&await p?.stream(n).detachVideo().catch(()=>{})},[p,n,oe,me]),L=(0,_.useCallback)(async V=>{let F=w.current;if(!F)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await(0,ct.captureStillFromVideo)(F,V)},[]);(0,_.useImperativeHandle)(r,()=>({start:U,stop:Ue,flip:Se,setFacingMode:K,capturePhoto:L,get active(){return D.current},get facingMode(){return q.current},get stream(){return x.current},get element(){return w.current}}),[U,Ue,Se,K,L]);let Ae=(0,_.useRef)(K);if(Ae.current=K,(0,_.useEffect)(()=>{c&&(n!==!1&&!p||Ae.current(C).catch(()=>{}))},[c,p,C,n]),(0,_.useEffect)(()=>oe,[oe]),!y)return null;let Ze=g==="auto"?z==="user":g,Me=j&&(m===!0||m==="auto"&&Te&&(le?.length??0)>1),_e=()=>{B||(G(!0),Se().catch(()=>{}).finally(()=>G(!1)))};return(0,ye.jsxs)("div",{className:b,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":z,children:[(0,ye.jsx)("video",{ref:w,className:T,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Ze?{transform:"scaleX(-1)"}:{}}}),Me?(0,ye.jsx)("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:_e,disabled:B,className:R,style:R?{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,ye.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,ye.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,ye.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,ye.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,ye.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,ye.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,S]})}),Kn=(0,_.forwardRef)(function({preview:t=!0,...r},o){return(0,ye.jsx)(_r,{ref:o,...r,visible:t,autoStart:!1})});var lt=require("@urun-sh/core"),te=require("react");function $n(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,y]=(0,te.useState)(null),[b]=(0,te.useState)(lt.cameraCaptureAvailable),T=(0,te.useRef)(n);T.current=n;let f=(0,te.useRef)(null),v=(0,te.useRef)(0),d=(0,te.useCallback)(R=>{f.current&&URL.revokeObjectURL(f.current),f.current=R?URL.createObjectURL(new Blob([R.bytes],{type:R.type})):null,u(f.current),i(R),T.current?.(R)},[]);(0,te.useEffect)(()=>()=>{v.current++,f.current&&URL.revokeObjectURL(f.current),f.current=null},[]);let E=(0,te.useCallback)(async R=>{let P=++v.current;g(!0),y(null);try{let C=await R();if(v.current!==P)return;d(C)}catch(C){if(v.current!==P)return;y((0,lt.referenceImageErrorMessage)(C))}finally{v.current===P&&g(!1)}},[d]),S=(0,te.useCallback)(R=>E(()=>(0,lt.normalizeReferenceImage)(R,{maxSize:t,type:r,quality:o,source:"file"})),[E,t,r,o]),k=(0,te.useCallback)(R=>E(()=>R.capturePhoto({maxSize:t,type:r,quality:o})),[E,t,r,o]),m=(0,te.useCallback)(()=>{v.current++,y(null),g(!1),d(null)},[d]);return{reference:s,previewUrl:a,pick:S,capture:k,clear:m,busy:c,error:l,cameraAvailable:b}}var Kt=require("react");function Xn(e,t){let[r,o]=(0,Kt.useState)(null);return(0,Kt.useEffect)(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}var Gn=require("react");var Xt=require("react");var Jn=require("zustand/vanilla"),zn=require("zustand"),Jo=()=>{};function $t(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=(0,Jn.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):Jo,u=(c=>(0,zn.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 dt(e,t){let r=(0,Xt.useMemo)(()=>$t(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return(0,Xt.useEffect)(()=>r.bind(),[r]),r}function Yn(e,t,r){let n=dt(e,t)(r??(a=>a)),s=(0,Gn.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 zt=require("react");var qe=200;function De(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function pt(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Jt(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 Gt(e,t,r={}){let o=r.cap??200,[n,s]=(0,zt.useState)([]);return(0,zt.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=>De(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}var Ee=require("react/jsx-runtime");function Zn({session:e,name:t,cap:r,className:o}){let n=Gt(e,t,{cap:r});return(0,Ee.jsxs)("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[(0,Ee.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,Ee.jsx)("code",{children:t}),(0,Ee.jsxs)("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),(0,Ee.jsx)("div",{className:"urun-stream-tail-log",children:n.length===0?(0,Ee.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,Ee.jsx)("code",{children:t})," messages\u2026"]}):n.map((s,i)=>(0,Ee.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,Ee.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",pt(s.payload)]},`${s.at}-${i}`))})]})}var _t=require("react");var ge=require("react/jsx-runtime");function Nt({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=(0,_t.useState)(""),[i,a]=(0,_t.useState)(null),u=(0,_t.useCallback)(()=>{let c=Jt(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return(0,ge.jsxs)("div",{className:"urun-doc-patch",children:[(0,ge.jsx)("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),(0,ge.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,ge.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?(0,ge.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Qn({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=dt(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return(0,ge.jsxs)("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[(0,ge.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,ge.jsx)("code",{children:t}),(0,ge.jsx)("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),(0,ge.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?(0,ge.jsx)(Nt,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}var Yt=require("react");var Ve=require("react/jsx-runtime");function eo(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function to({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=(0,Yt.useState)([]);return(0,Yt.useEffect)(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>De(u,{at:Date.now(),direction:"in",text:eo(pt(a))},r))}):void 0),[e,t,r]),(0,Ve.jsxs)("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[(0,Ve.jsx)(Nt,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>De(u,{at:Date.now(),direction:"out",text:eo(a)},r))}}),(0,Ve.jsx)("div",{className:"urun-control-sender-log",children:n.length===0?(0,Ve.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>(0,Ve.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,Ve.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,Ve.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}var Zt=require("react");var Ge=require("react/jsx-runtime");function ro({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=(0,Zt.useState)([]),a=t.join(","),u=r.join(",");return(0,Zt.useEffect)(()=>{if(i([]),!e)return;let c=(l,y)=>i(b=>De(b,{at:Date.now(),kind:l,text:y},o)),g=[];g.push(e.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of t){let y=e.stream(l);g.push(y.on("track",b=>c("track",`${l}: ${b?"track arrived":"track ended"}`)))}for(let l of r){let y=e.doc(l);g.push(y.on("change",()=>c("doc",`${l} changed`)))}return()=>g.forEach(l=>l())},[e,a,u,o]),(0,Ge.jsx)("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?(0,Ge.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,Ge.jsxs)("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[(0,Ge.jsx)("span",{className:"urun-event-spine-kind",children:c.kind})," ",(0,Ge.jsx)("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${g}`))})}var sr=require("@urun-sh/core");var Qt=require("react");function ke(e){let[t,r]=(0,Qt.useState)(e?.phase??null);return(0,Qt.useEffect)(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}var oo=require("@urun-sh/core");var mt=require("react"),no=require("@urun-sh/core");function er(e){let t=ke(e),r=(0,no.isWakingPhase)(t?.name),o=(0,mt.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,mt.useState)(s);return(0,mt.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 We=require("react/jsx-runtime");function tr({session:e,render:t,className:r}){let o=er(e);return!o.waking||!o.phase?null:(0,We.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,We.jsxs)(We.Fragment,{children:[(0,We.jsx)("span",{className:"urun-session-waking-label",children:(0,oo.describeSessionPhase)(o.phase)})," ",(0,We.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}var nr=require("react");var Be=require("react"),zo={event:null,elapsedMs:0};function rr(e,t){let[r,o]=(0,Be.useState)(null),n=(0,Be.useRef)(0);(0,Be.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,Be.useState)(0);return(0,Be.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}:zo}var ft=require("react/jsx-runtime"),Go={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 Yo(e){let[t,r]=(0,nr.useState)(!1);return(0,nr.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 or({session:e,stream:t,videoElement:r,render:o,className:n}){let s=rr(e,t),i=Yo(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return(0,ft.jsx)("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):(0,ft.jsxs)("div",{className:"urun-activation-overlay-card",children:[(0,ft.jsx)("span",{className:"urun-activation-overlay-copy",children:a.hint??Go[u]})," ",(0,ft.jsxs)("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}var be=require("react/jsx-runtime"),Zo={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function so({session:e,className:t}){let r=ke(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,be.jsxs)("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[(0,be.jsx)("span",{className:"urun-session-status-dot","data-phase":o}),(0,be.jsx)("span",{className:"urun-session-status-label",children:Zo[o]}),n?(0,be.jsx)("span",{className:"urun-session-status-detail",children:n}):null]})}function io({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=ke(e);if(s?.name==="live")return(0,be.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,(0,be.jsx)(or,{session:e})]});let i=r?r(s):(0,be.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,sr.isWakingPhase)(s.name)?(0,be.jsx)(tr,{session:e}):s&&s.name!=="idle"?(0,sr.describeSessionPhase)(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,be.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?(0,be.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}var ir=require("react");var uo=require("react/jsx-runtime");function Nr(e){return ke(e)?.endsAt??null}function Qo(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 ao({session:e,urgentMs:t=6e4,className:r}){let n=Nr(e)?.getTime()??null,[s,i]=(0,ir.useState)(()=>n===null?null:Math.max(0,n-Date.now()));if((0,ir.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=Qo(s);return(0,uo.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 Lt=require("react/jsx-runtime"),es=new Set(["expired","ended","error"]);function co({session:e,onNewSession:t,children:r,className:o}){let n=ke(e);if(!n||!es.has(n.name))return null;let s=r?r(n):(0,Lt.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,Lt.jsxs)("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?(0,Lt.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}var je=require("react"),Ye=require("react/jsx-runtime");function Lr(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 Or(e){let t=(0,je.useMemo)(()=>e?e.doc("control"):null,[e]),[r,o]=(0,je.useState)(()=>t?Lr(t.get("idle")):null);return(0,je.useEffect)(()=>{if(!t){o(null);return}return o(Lr(t.get("idle"))),t.on("change",()=>o(Lr(t.get("idle"))))},[t]),r}function ts(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function lo({session:e,onStillHere:t,className:r}){let o=Or(e),n=o?.deadlineEpochS??null,[s,i]=(0,je.useState)(null);if((0,je.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,Ye.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,Ye.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,Ye.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,Ye.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${ts(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,Ye.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}var gt=require("react"),po=require("@urun-sh/core");function mo(e){let t=(0,gt.useContext)(tt),[r,o]=(0,gt.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,gt.useEffect)(()=>{if(!a||!u||!n||!s)return;let y=!1,b=()=>{(0,po.prewake)({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:g,authProvider:l}).then(f=>{y||o(f)}).catch(()=>{})};b();let T=setInterval(b,Math.max(1,i)*1e3);return()=>{y=!0,clearInterval(T)}},[n,s,i,a,u,c,g,l]),r}var ar=require("react");function fo(e){let[t,r]=(0,ar.useState)(null);return(0,ar.useEffect)(()=>{if(r(null),!!e?.onStats)return e.onStats(r)},[e]),t}var ur=require("@urun-sh/core");0&&(module.exports={Audio,Camera,ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_SMOOTH_CHARS_PER_FRAME,DEFAULT_SMOOTH_THRESHOLD,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,Image,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,Mic,OPERATOR_CHORD_LABEL,OPERATOR_TOKEN_STORAGE_KEY,ProgressCard,ProgressCardSchema,ReprojectedVideo,Session,StatusBadge,StatusBadgeSchema,Text,TextStream,TextStreamError,TextStreamSchema,UrunActivationOverlay,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,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,textDelta,urunPublicEnv,useActivation,useApp,useChat,useCompletion,useConfirmOnLeave,useDocStore,useImageFrame,useInputPresence,useMetricsPanel,useOperatorOverride,useProgressCard,useReferenceImage,useRequest,useSession,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionStats,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useText,useTextMeter,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
2
+ "use strict";var cr=Object.defineProperty;var ho=Object.getOwnPropertyDescriptor;var vo=Object.getOwnPropertyNames;var yo=Object.prototype.hasOwnProperty;var ko=(e,t)=>{for(var r in t)cr(e,r,{get:t[r],enumerable:!0})},bo=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of vo(t))!yo.call(e,n)&&n!==r&&cr(e,n,{get:()=>t[n],enumerable:!(o=ho(t,n))||o.enumerable});return e};var To=e=>bo(cr({},"__esModule",{value:!0}),e);var rs={};ko(rs,{Audio:()=>At,Camera:()=>_r,ComponentRenderer:()=>kn,DEFAULT_CAMERA_CONSTRAINTS:()=>Mr,DEFAULT_LOG_CAP:()=>qe,DEFAULT_SMOOTH_CHARS_PER_FRAME:()=>Pr,DEFAULT_SMOOTH_THRESHOLD:()=>xr,DEFAULT_VOICE_CONSTRAINTS:()=>wr,DocPatchForm:()=>Nt,Image:()=>In,ImageFrame:()=>wn,ImageFrameSchema:()=>Cn,MetricsPanel:()=>An,MetricsPanelSchema:()=>Un,Mic:()=>jn,OPERATOR_CHORD_LABEL:()=>Kr,OPERATOR_TOKEN_STORAGE_KEY:()=>Br,ProgressCard:()=>Tn,ProgressCardSchema:()=>bn,ReprojectedVideo:()=>Sn,Session:()=>an,StatusBadge:()=>Pn,StatusBadgeSchema:()=>Rn,Text:()=>Nn,TextStream:()=>En,TextStreamError:()=>at,TextStreamSchema:()=>xn,UrunActivationOverlay:()=>or,UrunAudio:()=>Hn,UrunAuthProvider:()=>kt,UrunCamera:()=>Kn,UrunControlSender:()=>to,UrunDocPanel:()=>Qn,UrunErrorBoundary:()=>et,UrunEventSpine:()=>ro,UrunIdleWarning:()=>lo,UrunJwtProvider:()=>Hr,UrunProvider:()=>Gr,UrunSessionClock:()=>ao,UrunSessionEnded:()=>co,UrunSessionGate:()=>io,UrunSessionStatus:()=>so,UrunSessionWaking:()=>tr,UrunStreamTail:()=>Zn,UrunVoice:()=>Wn,Video:()=>Xe,Voice:()=>Mt,authMode:()=>yt,createDocStore:()=>$t,describeSessionPhase:()=>ur.describeSessionPhase,formatPayload:()=>pt,getUrunAudioContext:()=>bt,isWakingPhase:()=>ur.isWakingPhase,parseJsonObject:()=>zt,pushCapped:()=>De,readOperatorToken:()=>lr,registerComponent:()=>vn,resumeUrunAudioContext:()=>$e,textDelta:()=>Rr,urunPublicEnv:()=>Pe,useActivation:()=>rr,useApp:()=>Zr,useChat:()=>on,useCompletion:()=>tn,useConfirmOnLeave:()=>Vt,useDocStore:()=>dt,useImageFrame:()=>br,useInputPresence:()=>sn,useMetricsPanel:()=>Tr,useOperatorOverride:()=>Dt,useProgressCard:()=>vr,useReferenceImage:()=>$n,useRequest:()=>Qr,useSession:()=>un,useSessionDoc:()=>Yn,useSessionEndsAt:()=>Nr,useSessionIdle:()=>Or,useSessionPhase:()=>ke,useSessionStats:()=>fo,useSessionTrack:()=>Xn,useSessionWake:()=>er,useStatusBadge:()=>yr,useStreamMessages:()=>Gt,useText:()=>Er,useTextMeter:()=>_n,useTextStream:()=>kr,useUrunAudioLevel:()=>jt,useUrunAuth:()=>Ot,useUrunPrewake:()=>mo,usesWorkOSAuth:()=>Vr});module.exports=To(rs);var ae=require("react");var Ir=require("react"),vt=require("react/jsx-runtime"),et=class extends Ir.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,vt.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,vt.jsx)("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),(0,vt.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};var Dr=require("react"),tt=(0,Dr.createContext)(null);function Ne(e){return e&&e.trim()?e.trim():void 0}function Pe(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"NEXT_PUBLIC_URUN_TOKEN_URL":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_TOKEN_URL:void 0);case"NEXT_PUBLIC_URUN_EVENTS_URL":return Ne(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_EVENTS_URL:void 0);case"VERCEL_ENV":return Ne(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return Ne(typeof process<"u"?process.env?.[e]:void 0)}}function yt(){let e=Pe("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||Pe("VERCEL_ENV")==="production"?"workos":Pe("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Vr(){return yt()==="workos"}var rt=require("react"),qr=require("react/jsx-runtime"),Fr=(0,rt.createContext)(null);function kt({getAccessToken:e,children:t}){let r=(0,rt.useMemo)(()=>({getAccessToken:e}),[e]);return(0,qr.jsx)(Fr.Provider,{value:r,children:t})}var Hr=kt;function Ot(){return(0,rt.useContext)(Fr)}var It=require("react"),Br="urun.operator_token",jr=null,Wr="op",Kr="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function $r(){return typeof window<"u"}function lr(){return jr}function Ro(){if(!$r())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(Wr);if(!r)return null;jr=r,t.delete(Wr);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function Po(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function Dt(e){let t=(0,It.useRef)(e);t.current=e,(0,It.useEffect)(()=>{if(!$r())return;Ro();let r=o=>{if(!Po(o))return;let n=lr();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}var Xr=require("react");function Vt(e=!0){(0,Xr.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 Le=require("react/jsx-runtime"),xo="/api/urun-token",Eo=1e4;function Co(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 zr(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 Jr(e,t){if(t===void 0)return;let r;try{r=new URL(t).hostname}catch{throw new Error(`[urun] ${e} is not a valid URL: ${t}`)}if(!(r==="127.0.0.1"||r==="localhost"||r==="::1"||r==="[::1]"))throw new Error(`[urun] ${e} must point at a loopback endpoint \u2014 the CLI launcher (urun dev/demo) is this variable's only legitimate producer and it must never be set on a deployed site. Refusing ${t}.`);return t}function dr(e){let t=e===void 0?void 0:JSON.stringify(e);return(0,ae.useMemo)(()=>e,[t])}function wo(e,t){return typeof e=="function"?e(t):e!==void 0?e:(0,Le.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,Le.jsx)("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),(0,Le.jsx)("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function Gr({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,audioPlayout:g,videoPlayout:l,sessionStats:y,confirmOnLeave:b=!1,fallback:T,errorFallback:f,children:v}){let d=n===void 0&&t===void 0;if(!d&&(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(!d&&(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 E=r??o;if(d&&(typeof E!="string"||E.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(b);let[S,k]=(0,ae.useState)(),[m,R]=(0,ae.useState)(null),P=(0,ae.useRef)(void 0),C=(0,ae.useRef)(null),[A,p]=(0,ae.useState)(null);Dt(h=>p({jwt:h}));let w=Ot(),x=Pe("NEXT_PUBLIC_SESSION_TOKEN")??Pe("NEXT_PUBLIC_URUN_JWT"),O=yt(),H=A!==null,W=O==="workos"&&!n&&!H&&!d,D=n??(O==="jwt"?x:void 0)??S?.token,M=H?A.jwt:D,q=s??Pe("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),J=W&&!M&&!w?.getAccessToken,Q=t??S?.orgId,j=e??S?.gatewayUrl,ne=d&&S===void 0,le=d&&S!==void 0&&!j?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=J?new Error('[urun] <UrunProvider> resolved authMode()="workos" but no auth context is mounted: there is no <UrunWorkOSProvider> (or <UrunAuthProvider>) ancestor supplying getAccessToken, and no jwt prop was passed, so no session token can be obtained. Note NEXT_PUBLIC_SESSION_TOKEN and NEXT_PUBLIC_URUN_JWT are IGNORED in workos mode, so setting them will not help. Either mount UrunWorkOSProvider from @urun-sh/react/next-workos, or select jwt mode with NEXT_PUBLIC_AUTH_MODE=jwt (or NEXT_PUBLIC_AUTH_ENABLED=false) and supply a token.'):null,B=m??le??ee,G=Jr("NEXT_PUBLIC_URUN_TOKEN_URL",Pe("NEXT_PUBLIC_URUN_TOKEN_URL"))??u??xo,Te=Jr("NEXT_PUBLIC_URUN_EVENTS_URL",Pe("NEXT_PUBLIC_URUN_EVENTS_URL"))??i,ie=(0,ae.useCallback)(async h=>{if(!h?.forceRefresh){let U=P.current;if(!U)return U;let K=Co(U);if(K===null||K-Date.now()>Eo)return U}return(await(C.current??(C.current=(async()=>{try{let U=await zr(G);return P.current=U.token,k(U),U}finally{C.current=null}})()))).token},[G]),de=(0,ae.useCallback)(async()=>M,[M]),Fe=typeof M=="string"&&M.trim().length>0,pe=W?w?.getAccessToken:d&&!H?ie:Fe?de:void 0,we=dr(g),me=dr(l),ue=dr(y),oe=(0,ae.useMemo)(()=>({appId:E,baseUrl:j??"",orgId:Q??"",jwt:M,getAccessToken:W?w?.getAccessToken:d&&!H?ie:void 0,authProvider:q,eventsUrl:Te,sessionKey:a,releaseOnLeave:c,audioPlayout:we,videoPlayout:me,sessionStats:ue,priority:H?"preempt":void 0}),[E,w,j,q,M,Te,Q,a,c,we,me,ue,W,H,d,ie]);return(0,ae.useEffect)(()=>{if(!d)return;let h=new AbortController;return R(null),(async()=>{try{let N=await zr(G,h.signal);P.current=N.token,k(N)}catch(N){if(h.signal.aborted)return;R(N instanceof Error?N:new Error(String(N)))}})(),()=>h.abort()},[d,G]),(0,Le.jsx)(et,{fallback:T,children:B?wo(f,B):ne?(0,Le.jsx)("div",{role:"status","aria-live":"polite",children:"Signing in..."}):(0,Le.jsx)(tt.Provider,{value:oe,children:pe?(0,Le.jsx)(kt,{getAccessToken:pe,children:v}):v})})}var fe=require("react"),Yr=require("@urun-sh/core");function Uo(e,t){return`${e}:${JSON.stringify(t??{})}`}function Ao(e,t,r){return JSON.stringify({appId:e.appId,baseUrl:e.baseUrl,orgId:e.orgId,jwt:e.jwt,authProvider:e.authProvider,sessionKey:e.sessionKey,priority:e.priority,fnName:t,args:r??{}})}var Ke=new Map;var pr=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}onConnectionState(t){return this._doc.onConnectionState?this._doc.onConnectionState(r=>{t(r),this._notify()}):(t({connected:!0,consecutiveFailures:0,lastCloseCode:null,lastCloseReason:null}),()=>{})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},mr=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()}},fr=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)}onStats(t){return this._session.onStats?this._session.onStats(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 pr(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new mr(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 Zr(){let e=(0,fe.useContext)(tt);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=(0,fe.useReducer)(i=>i+1,0),r=(0,fe.useRef)(new Map),o=(0,fe.useRef)(new Map),n=(0,fe.useRef)(null),s=(0,fe.useMemo)(()=>(0,Yr.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,audioPlayout:e.audioPlayout,videoPlayout:e.videoPlayout,sessionStats:e.sessionStats}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority,e.audioPlayout,e.videoPlayout,e.sessionStats]);return(0,fe.useEffect)(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=Ke.get(a);c===u&&o.current.get(a)===u&&(c.disposeTimer&&(clearTimeout(c.disposeTimer),c.disposeTimer=null),c.handle.addNotifier(t),c.refCount+=1)}}return()=>{let a=new Map;for(let[u,c]of o.current){let g=Ke.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=Ke.get(u);!l||l.refCount!==0||(Ke.delete(u),l.handle.disconnect())},0)))}n.current=a}},[]),(0,fe.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 y=Uo(u,l),b=r.current.get(y);if(b&&!b.disposed)return b;let T=Ao(e,u,l),f=Ke.get(T);return f?.handle.disposed&&(f.disposeTimer&&clearTimeout(f.disposeTimer),Ke.delete(T),o.current.get(T)===f&&o.current.delete(T),f=void 0),f?f.disposeTimer&&(clearTimeout(f.disposeTimer),f.disposeTimer=null):(f={handle:new fr(s[u](l),t,e.eventsUrl),refCount:0,disposeTimer:null},Ke.set(T,f)),o.current.get(T)!==f&&(o.current.set(T,f),f.handle.addNotifier(t),f.refCount+=1),r.current.set(y,f.handle),f.handle};return i.set(u,g),g}})},[e,s])}var re=require("react");function nt(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 Mo(e){return e instanceof Error?e:new Error(String(e))}function Qr(e,t){let r=(0,re.useMemo)(()=>nt(e),[e]),[o,n]=(0,re.useState)(void 0),[s,i]=(0,re.useState)(null),[a,u]=(0,re.useState)(!1),c=(0,re.useRef)(t);c.current=t;let g=(0,re.useRef)(0),l=(0,re.useRef)(null),y=(0,re.useRef)(!0);(0,re.useEffect)(()=>(y.current=!0,()=>{y.current=!1,l.current?.abort()}),[]);let b=(0,re.useCallback)(async v=>{l.current?.abort();let d=new AbortController;l.current=d;let E=++g.current,S=()=>y.current&&g.current===E;S()&&(u(!0),i(null));try{let k=await r.request(v,{...c.current,signal:d.signal});return S()&&(n(k),u(!1),c.current?.onSuccess?.(k)),k}catch(k){let m=Mo(k);throw S()&&(i(m),u(!1),c.current?.onError?.(m)),m}},[r]),T=(0,re.useCallback)(v=>{b(v).catch(()=>{})},[b]),f=(0,re.useCallback)(()=>{g.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:T,mutateAsync:b,data:o,error:s,isPending:a,reset:f}}var se=require("react");function en(e){return e instanceof Error?e:new Error(String(e))}var _o=e=>typeof e=="string"?e:String(e);function tn(e,t){let r=(0,se.useMemo)(()=>nt(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),y=(0,se.useRef)(!0);(0,se.useEffect)(()=>(y.current=!0,()=>{y.current=!1,l.current?.cancel(),l.current=null}),[]);let b=(0,se.useCallback)(()=>{g.current++,l.current?.cancel(),l.current=null,y.current&&i(!1)},[]),T=(0,se.useCallback)(async f=>{l.current?.cancel();let v=++g.current,d=()=>y.current&&g.current===v,E=c.current,S=E?.parseChunk??_o,k=E?.buildPayload??(x=>({prompt:x}));d()&&(n(""),u(null),i(!0));let{parseChunk:m,buildPayload:R,onFinish:P,onError:C,...A}=E??{},p="",w;try{w=r.requestStream(k(f),A),l.current=w}catch(x){let O=en(x);d()&&(u(O),i(!1),E?.onError?.(O));return}try{for await(let x of w){if(g.current!==v)break;p+=S(x),d()&&n(p)}d()&&(i(!1),E?.onFinish?.(p))}catch(x){let O=en(x);d()&&(u(O),i(!1),E?.onError?.(O))}finally{l.current===w&&(l.current=null)}},[r]);return{completion:o,complete:T,stop:b,isStreaming:s,error:a}}var Z=require("react");function rn(e){return e instanceof Error?e:new Error(String(e))}var No=e=>typeof e=="string"?e:String(e),nn=0;function gr(e){return nn+=1,`${e}-${nn}`}function on(e,t){let r=(0,Z.useMemo)(()=>nt(e),[e]),[o,n]=(0,Z.useState)(()=>(t?.initialMessages??[]).map(S=>({id:S.id??gr("msg"),role:S.role,content:S.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 y=(0,Z.useRef)(o);y.current=o;let b=(0,Z.useRef)(s);b.current=s;let T=(0,Z.useRef)(0),f=(0,Z.useRef)(null),v=(0,Z.useRef)(!0);(0,Z.useEffect)(()=>(v.current=!0,()=>{v.current=!1,f.current?.cancel(),f.current=null}),[]);let d=(0,Z.useCallback)(()=>{T.current++,f.current?.cancel(),f.current=null,v.current&&u(!1)},[]),E=(0,Z.useCallback)(async S=>{let k=S===void 0,m=(k?b.current:S)??"";if(!m.trim())return;f.current?.cancel();let P=++T.current,C=()=>v.current&&T.current===P,A=l.current,p=A?.parseChunk??No,w={id:gr("msg"),role:"user",content:m},x={id:gr("msg"),role:"assistant",content:""},O=[...y.current,w].map(B=>({role:B.role,content:B.content})),H=[...y.current,w,x];y.current=H,n(H),k&&i(""),g(null),u(!0);let W=A?.buildPayload??(B=>({messages:B})),{initialMessages:D,parseChunk:M,buildPayload:q,onFinish:J,onError:Q,...j}=A??{},ne=B=>{n(G=>G.map(Te=>Te.id===x.id?{...Te,content:B}:Te))},le="",ee;try{ee=r.requestStream(W(O),j),f.current=ee}catch(B){let G=rn(B);C()&&(g(G),u(!1),A?.onError?.(G));return}try{for await(let B of ee){if(T.current!==P)break;le+=p(B),C()&&ne(le)}C()&&(u(!1),A?.onFinish?.({...x,content:le}))}catch(B){let G=rn(B);C()&&(g(G),u(!1),A?.onError?.(G))}finally{f.current===ee&&(f.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:E,stop:d,isStreaming:a,error:c}}var Y=require("react"),ot=require("@urun-sh/core"),Sr=[];function sn(e,t={}){let{field:r=ot.INPUT_PRESENCE_FIELD,hz:o=ot.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,ot.createInputPresencePublisher)({awareness:{setLocalStateField:(m,R)=>s.setField(m,R)},field:r,hz:o}):null,[s,r,o]),a=(0,Y.useRef)(null);a.current=i;let[u,c]=(0,Y.useState)(!1),[g,l]=(0,Y.useState)(Sr),y=(0,Y.useRef)(!1);(0,Y.useEffect)(()=>{if(i)return()=>i.dispose()},[i]);let b=(0,Y.useCallback)(()=>{let m=a.current;l(m?m.heldKeys():Sr)},[]),T=(0,Y.useCallback)(()=>{a.current?.clear(),l(Sr)},[]);(0,Y.useEffect)(()=>{if(!n)return;let m=()=>!!n.pointerLockElement,R=()=>{if(m()){y.current=!1,c(!0);return}y.current||(c(!1),T())},P=x=>{m()&&(a.current?.keyDown(x.key),b())},C=x=>{a.current?.keyUp(x.key),b()},A=x=>{m()&&a.current?.movePointer(x.movementX,x.movementY)},p=x=>{m()&&a.current?.setButtons(x.buttons)},w=()=>{T()};return n.addEventListener("pointerlockchange",R),n.addEventListener("keydown",P),n.addEventListener("keyup",C),n.addEventListener("mousemove",A),n.addEventListener("mousedown",p),n.addEventListener("mouseup",p),n.defaultView?.addEventListener("blur",w),()=>{n.removeEventListener("pointerlockchange",R),n.removeEventListener("keydown",P),n.removeEventListener("keyup",C),n.removeEventListener("mousemove",A),n.removeEventListener("mousedown",p),n.removeEventListener("mouseup",p),n.defaultView?.removeEventListener("blur",w)}},[n,T,b]);let f=(0,Y.useCallback)(m=>{m.requestPointerLock?.()},[]),v=(0,Y.useCallback)(()=>{y.current=!0,c(!0)},[]),d=(0,Y.useCallback)(()=>{y.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),T()},[n,T]),E=(0,Y.useCallback)(m=>{a.current?.keyDown(m),b()},[b]),S=(0,Y.useCallback)(m=>{a.current?.keyUp(m),b()},[b]),k=(0,Y.useCallback)((m,R)=>{a.current?.movePointer(m,R)},[]);return{engage:f,engageTouch:v,release:d,engaged:u,heldKeys:g,pressKey:E,releaseKey:S,movePointer:k}}var ce=require("react"),gn=require("@urun-sh/core");var I=require("react"),fn=require("@urun-sh/core");var Ft=null;function Lo(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function bt(){if(Ft)return Ft;let e=Lo();return e?(Ft=new e,Ft):null}function $e(){let e=bt();e&&e.state==="suspended"&&e.resume().catch(()=>{})}var Tt=require("react"),cn=require("react/jsx-runtime"),hr=(0,Tt.createContext)(null);function an({session:e,children:t}){return(0,cn.jsx)(hr.Provider,{value:e,children:t})}function Ce(){return(0,Tt.useContext)(hr)}function un(){let e=(0,Tt.useContext)(hr);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 Rt=require("react/jsx-runtime");function Oo(e,t){return e-t>>>0<2147483648}var ln=1e3;function dn(...e){console.debug("[video]",...e)}function pn(e,t){let r=new Set,o=t.filter(s=>r.has(s)?!1:(r.add(s),!0)).map(s=>e.stream(s)),n=()=>{for(let s of o){let i=s.track;if(i&&i.readyState==="live")return i}return null};return{get track(){return n()},on(s,i){let a=o.map(u=>u.on("track",()=>i(n())));return()=>{for(let u of a)u()}}}}function mn(e,t,r){return r?[r,t]:[e,t]}var Xe=(0,I.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:y,placeholder:b,poster:T,children:f,onTrack:v,onFirstFrame:d,frameMarker:E,onFrameMarkerReached:S,onFrameMarkerUnsupported:k,onUnlockChange:m}=t,R=Ce(),P=o??R,C=(0,I.useRef)(null),A=(0,I.useRef)(null),[p,w]=(0,I.useState)(!1),[x,O]=(0,I.useState)(!1),H=(0,I.useRef)(!1),W=(0,I.useRef)(null),D=(0,I.useRef)(v);D.current=v;let M=(0,I.useRef)(m);M.current=m;let q=(0,I.useRef)(d);q.current=d;let J=(0,I.useRef)(S);J.current=S;let Q=(0,I.useRef)(k);Q.current=k;let j=(0,I.useRef)(E??null);j.current=E??null;let ne=(0,I.useCallback)(h=>{W.current!==h&&(W.current=h,M.current?.(h))},[]),le=(0,I.useRef)(null),ee=(0,I.useRef)(null),B=(0,I.useCallback)((h,N=!1)=>{if(!N&&h===le.current||(le.current=h,ee.current?.(),ee.current=null,H.current=!1,O(!1),!h))return;let U=C.current;if(!U)return;let K=j.current,Se=K?.rtpTimestamp??null,Ue=!1,L=()=>{Ue||(Ue=!0,Q.current?.())};K&&Se==null&&L();let Ae=K!=null&&Se!=null,Ze=_e=>{ee.current?.(),ee.current=null,H.current=!0,O(!0),q.current?.(),_e&&J.current?.()};if(typeof U.requestVideoFrameCallback=="function"){let _e=!1,V=0,F=(he,ve)=>{if(!_e){if(Ae){let Re=ve?.rtpTimestamp;if(typeof Re!="number"){L(),Ze(!1);return}if(!Oo(Re,Se)){V=U.requestVideoFrameCallback(F);return}Ze(!0);return}Ze(!1)}};V=U.requestVideoFrameCallback(F),ee.current=()=>{_e=!0,U.cancelVideoFrameCallback?.(V)};return}Ae&&L();let Me=()=>{let _e=U.getVideoPlaybackQuality?.();(_e?_e.totalVideoFrames>0:U.readyState>=2&&U.videoWidth>0)&&Ze(!1)};U.addEventListener("loadeddata",Me),U.addEventListener("timeupdate",Me),U.addEventListener("playing",Me),ee.current=()=>{U.removeEventListener("loadeddata",Me),U.removeEventListener("timeupdate",Me),U.removeEventListener("playing",Me)},Me()},[]);(0,I.useEffect)(()=>()=>{ee.current?.(),ee.current=null},[]);let G=E==null?null:`${E.rtpTimestamp??""}|${E.ptsMs??""}`,Te=(0,I.useRef)(G);(0,I.useEffect)(()=>{if(Te.current===G||(Te.current=G,G==null))return;let h=le.current;h&&B(h,!0)},[G,B]);let ie=(0,I.useCallback)(()=>{if(typeof MediaStream>"u")return null;A.current||(A.current=new MediaStream);let h=C.current;return h&&h.srcObject!==A.current&&(h.srcObject=A.current),A.current},[]),de=(0,I.useCallback)(h=>{let N=C.current;if(!N)return;let U=N.play();!U||typeof U.then!="function"||U.then(()=>{N.muted||ne(!0)}).catch(K=>{if((K instanceof Error?K.name:String(K))==="NotAllowedError"&&!N.muted){dn(`play() blocked pending a user gesture (${h})`),ne(!1);return}dn(`play() failed (${h})`,K)})},[ne]),Fe=(0,I.useCallback)(()=>{let h=C.current;h&&(ie(),!h.muted&&(de("gesture"),$e(),ne(!0)))},[ie,de,ne]),pe=(0,I.useCallback)(h=>{let N=ie();if(N){for(let U of N.getVideoTracks())U!==h&&N.removeTrack(U);if(h&&!N.getVideoTracks().includes(h)){N.addTrack(h);let U=C.current;U&&(U.srcObject=N)}h&&de("track-attach"),w(h!==null),B(h),D.current?.(h)}},[ie,de,B]),we=(0,I.useCallback)(h=>{let N=ie();if(N){for(let U of N.getAudioTracks())U!==h&&N.removeTrack(U);h&&!N.getAudioTracks().includes(h)&&N.addTrack(h),h&&de("audio-attach")}},[ie,de]),me=(0,I.useCallback)(h=>{C.current=h,h&&(a?(h.muted=!0,h.defaultMuted=!0,h.setAttribute("muted",""),W.current=null):(h.muted=!1,h.defaultMuted=!1,h.removeAttribute("muted")),h.setAttribute("playsinline",""),h.setAttribute("webkit-playsinline",""),ie())},[ie,a]);(0,I.useImperativeHandle)(r,()=>({get element(){return C.current},get live(){return A.current?A.current.getVideoTracks().length>0:!1},get framed(){return H.current},unlock:Fe,get unlocked(){return W.current===!0}}),[Fe]);let ue=(0,fn.derivedLegRole)(n)!==void 0;(0,I.useEffect)(()=>{ue&&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.`)},[ue,n]);let oe=i!==void 0;return(0,I.useEffect)(()=>{if(oe){pe(i??null);return}if(ue){pe(null);return}if(!P)return;let h=pn(P,mn(n,"video")),N=()=>{let L=A.current;return L?L.getVideoTracks()[0]??null:null},U=L=>{if(L!==N()&&(pe(L),L)){let Ae=()=>{N()===L&&pe(null)};L.addEventListener("ended",Ae)}},K=h.track;K&&K.readyState==="live"&&U(K);let Se=h.on("track",L=>{L&&L.readyState!=="live"||U(L)}),Ue=setInterval(()=>{let L=h.track;L&&L.readyState==="live"&&U(L)},ln);return()=>{Se(),clearInterval(Ue)}},[P,n,ue,oe,i,pe]),(0,I.useEffect)(()=>{if(oe||!P||s===!1||ue)return;let h=pn(P,mn(n,"audio",s)),N=()=>{let L=A.current;return L?L.getAudioTracks()[0]??null:null},U=L=>{if(L!==N()&&(we(L),L)){let Ae=()=>{N()===L&&we(null)};L.addEventListener("ended",Ae)}},K=h.track;K&&K.readyState==="live"&&U(K);let Se=h.on("track",L=>{L&&L.readyState!=="live"||U(L)}),Ue=setInterval(()=>{let L=h.track;L&&L.readyState==="live"&&U(L)},ln);return()=>{Se(),clearInterval(Ue)}},[P,n,ue,s,oe,we]),(0,Rt.jsxs)("div",{className:g,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":p?"true":"false","data-urun-video-framed":x?"true":"false",children:[(0,Rt.jsx)("video",{ref:me,className:y,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),p?null:b,T===void 0?null:(0,Rt.jsx)("div",{"data-urun-video-poster":"","aria-hidden":x||void 0,style:{position:"absolute",inset:0,...x?{opacity:0,pointerEvents:"none"}:null},children:T}),f]})});var Pt=require("react/jsx-runtime"),Io={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},Sn=(0,ce.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,y=(0,ce.useRef)(null),b=(0,ce.useRef)(null),T=(0,ce.useRef)(0),f=(0,ce.useRef)(g);f.current=g;let v=(0,ce.useMemo)(()=>(0,gn.createCameraWarp)(f.current),[]);return(0,ce.useImperativeHandle)(r,()=>({get video(){return y.current},get canvas(){return b.current},warp:v,get lastDrawTs(){return T.current}}),[v]),(0,ce.useEffect)(()=>{if(!i)return;let d=0,E=0,S=null,k=R=>{typeof R.requestVideoFrameCallback=="function"&&(S=R,E=R.requestVideoFrameCallback(function P(){v.frameArrived(),E=R.requestVideoFrameCallback(P)}))},m=R=>{d=requestAnimationFrame(m);let P=b.current,C=y.current?.element??null;if(!P||!C||(C!==S&&(S&&E&&S.cancelVideoFrameCallback?.(E),k(C)),C.readyState<2))return;v.tick(R);let A=typeof devicePixelRatio=="number"?devicePixelRatio:1,p=Math.max(1,Math.round(P.clientWidth*A)),w=Math.max(1,Math.round(P.clientHeight*A));(P.width!==p||P.height!==w)&&(P.width=p,P.height=w);let x=P.getContext("2d");if(!x)return;let O=v.transform(),H=C.videoWidth||p,W=C.videoHeight||w,M=Math.max(p/H,w/W)*(1+a)*O.scale;x.setTransform(M,0,0,M,p/2+O.translateX*p,w/2+O.translateY*w),x.drawImage(C,-H/2,-W/2),T.current=R};return d=requestAnimationFrame(m),()=>{cancelAnimationFrame(d),S&&E&&S.cancelVideoFrameCallback?.(E)}},[i,a,v]),(0,ce.useEffect)(()=>{if(!i||!u||!l)return;let d=()=>!!l.pointerLockElement,E=P=>{d()&&v.keyDown(P.key)},S=P=>v.keyUp(P.key),k=P=>{d()&&v.pointerDelta(P.movementX,P.movementY)},m=()=>{d()||v.clearKeys()},R=()=>v.clearKeys();return l.addEventListener("keydown",E),l.addEventListener("keyup",S),l.addEventListener("mousemove",k),l.addEventListener("pointerlockchange",m),l.defaultView?.addEventListener("blur",R),()=>{l.removeEventListener("keydown",E),l.removeEventListener("keyup",S),l.removeEventListener("mousemove",k),l.removeEventListener("pointerlockchange",m),l.defaultView?.removeEventListener("blur",R)}},[i,u,l,v]),i?(0,Pt.jsxs)(Xe,{ref:y,...s,videoClassName:s.videoClassName,style:{...s.style},children:[(0,Pt.jsx)("canvas",{ref:b,style:Io,"data-urun-warp":""}),n]}):(0,Pt.jsx)(Xe,{ref:y,...s,children:n})});var hn=new Map;function vn(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);hn.set(e,{component:t,schema:r})}function yn(e,t){let r=hn.get(e);if(!r)return{error:`Unknown component: "${e}"`};let o=r.schema.safeParse(t);return o.success?{Component:r.component,validatedProps:o.data}:{error:`Validation failed for "${e}": ${o.error.message}`}}var ze=require("react/jsx-runtime");function kn({name:e,props:t,fallback:r}){let o=yn(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?(0,ze.jsx)(ze.Fragment,{children:r}):(0,ze.jsx)("div",{className:"urun-component-error",role:"alert",children:(0,ze.jsx)("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return(0,ze.jsx)(n,{...o.validatedProps})}var st=require("zod"),Je=require("react/jsx-runtime"),bn=st.z.object({step:st.z.number().min(0),total:st.z.number().min(1),label:st.z.string().optional(),variant:st.z.enum(["default","success","error"]).default("default")});function vr(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 Tn(e){let{step:t,total:r,label:o,variant:n,percentage:s}=vr(e);return(0,Je.jsxs)("div",{className:"urun-progress-card","data-variant":n,children:[o&&(0,Je.jsx)("div",{className:"urun-progress-label",children:o}),(0,Je.jsx)("div",{className:"urun-progress-bar",children:(0,Je.jsx)("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),(0,Je.jsxs)("div",{className:"urun-progress-text",children:[t,"/",r]})]})}var Ht=require("zod"),xt=require("react/jsx-runtime"),Rn=Ht.z.object({state:Ht.z.enum(["thinking","generating","idle","error"]),message:Ht.z.string().optional()}),Do={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function yr(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??Do[t]??t;return{state:t,message:n,isActive:o}}function Pn(e){let{state:t,message:r,isActive:o}=yr(e);return(0,xt.jsxs)("span",{className:"urun-status-badge","data-state":t,children:[(0,xt.jsx)("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),(0,xt.jsx)("span",{className:"urun-status-message",children:r})]})}var Et=require("react"),qt=require("zod"),Ct=require("react/jsx-runtime"),xn=qt.z.object({text:qt.z.string(),streaming:qt.z.boolean().default(!1)});function kr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function En(e){let{text:t,streaming:r}=kr(e),o=(0,Et.useRef)(null),n=(0,Et.useRef)(0);return(0,Et.useEffect)(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),(0,Ct.jsxs)("div",{className:"urun-text-stream",children:[(0,Ct.jsx)("span",{ref:o,className:"urun-text-content"}),r&&(0,Ct.jsx)("span",{className:"urun-text-cursor"})]})}var wt=require("zod"),Ut=require("react/jsx-runtime"),Cn=wt.z.object({src:wt.z.string().url(),alt:wt.z.string().optional(),caption:wt.z.string().optional()});function br(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function wn(e){let{src:t,alt:r,caption:o}=br(e);return(0,Ut.jsxs)("figure",{className:"urun-image-frame",children:[(0,Ut.jsx)("img",{className:"urun-image",src:t,alt:r}),o&&(0,Ut.jsx)("figcaption",{className:"urun-image-caption",children:o})]})}var Oe=require("zod"),it=require("react/jsx-runtime"),Un=Oe.z.object({metrics:Oe.z.array(Oe.z.object({label:Oe.z.string(),value:Oe.z.union([Oe.z.string(),Oe.z.number()]),unit:Oe.z.string().optional()}))});function Tr(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function An(e){let{metrics:t}=Tr(e);return(0,it.jsx)("div",{className:"urun-metrics-panel",children:t.map((r,o)=>(0,it.jsxs)("div",{className:"urun-metric-card",children:[(0,it.jsx)("div",{className:"urun-metric-label",children:r.label}),(0,it.jsx)("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}var $=require("react"),Ln=require("react/jsx-runtime");function He(e){return e&&typeof e=="object"?e:null}function Rr(e){if(typeof e=="string")return e;let t=He(e);return t&&t.t==="delta"&&typeof t.delta=="string"?t.delta:""}function Vo(e){if(typeof e=="string")return"delta";let t=He(e);return t?t.t==="delta"?"delta":t.t==="response"?"done":t.t==="error"?"error":"ignore":"ignore"}function Fo(...e){for(let t of e)if(typeof t=="string"&&t)return t;return""}function Ho(e){let t=He(e),r=t?.body;return Fo(r,He(He(r)?.error)?.message,He(r)?.error,He(r)?.message,He(t?.error)?.message,t?.error,t?.message)||"stream reported an error"}var at=class extends Error{name="TextStreamError"},qo=4,Pr=3,xr=240;function Mn(){return{chars:0,tokens:0,tokensPerSecond:0,elapsedMs:0,done:!1}}function Wo(e){e.chars=0,e.tokens=0,e.tokensPerSecond=0,e.elapsedMs=0,e.done=!1}function Er(e){let{session:t,stream:r}=e,o=(0,$.useRef)(e);(0,$.useEffect)(()=>{o.current=e});let n=(0,$.useRef)(null),s=(0,$.useRef)(()=>{}),i=(0,$.useRef)(null),a=(0,$.useRef)(""),u=(0,$.useRef)(""),c=(0,$.useRef)(null),g=(0,$.useRef)(!1),l=(0,$.useRef)(!1),y=(0,$.useRef)(!1),b=(0,$.useRef)(0),T=(0,$.useRef)(Mn()),f=(0,$.useCallback)(S=>{if(n.current=S,!S){i.current=null;return}let k=i.current;if(k&&k.parentNode===S)return;let m=S.ownerDocument.createTextNode(u.current);S.appendChild(m),i.current=m,a.current.length>0&&s.current()},[]),v=(0,$.useCallback)(()=>{c.current=null;let S=i.current,k=a.current;if(k.length>0){let A=o.current,p=A.smoothCharsPerFrame??Pr,w=A.smoothThreshold??xr,x=A.smooth&&k.length<=w?k.slice(0,p):k;a.current=k.slice(x.length),u.current+=x,S?.appendData(x)}let m=T.current,R=u.current.length,P=b.current===0?0:Date.now()-b.current,C=Math.round(R/qo);if(m.chars=R,m.tokens=C,m.elapsedMs=P,m.tokensPerSecond=P>0?C*1e3/P:0,a.current.length>0){d(),o.current.onMeter?.(m);return}if(!g.current&&!y.current){y.current=!0,m.done=!0,o.current.onMeter?.(m),l.current||o.current.onDone?.(u.current);return}o.current.onMeter?.(m)},[]),d=(0,$.useCallback)(()=>{c.current===null&&(c.current=globalThis.requestAnimationFrame(()=>v()))},[v]);s.current=d,(0,$.useEffect)(()=>{if(!t)return;if(typeof globalThis.requestAnimationFrame!="function")throw new Error("[urun] Text requires requestAnimationFrame. Render it in a browser (or a DOM test environment).");a.current="",u.current="",l.current=!1,y.current=!1,b.current=0,g.current=!0,Wo(T.current),i.current&&(i.current.data="");let S=!1,k=null;return(async()=>{try{for(k=t.stream(r).messages()[Symbol.asyncIterator]();;){let R=await k.next();if(S)return;if(R.done)break;let P=R.value,C=Vo(P);if(C==="error")throw new at(Ho(P));if(C==="done")break;if(C==="ignore")continue;let A=Rr(P);A&&(b.current===0&&(b.current=Date.now()),a.current+=A,d())}if(S)return;k.return?.(void 0),g.current=!1,d()}catch(m){if(S)return;k?.return?.(void 0),l.current=!0,g.current=!1,o.current.onError?.(m instanceof Error?m:new at(String(m))),d()}})(),()=>{S=!0,g.current=!1,k?.return?.(void 0),c.current!==null&&(globalThis.cancelAnimationFrame?.(c.current),c.current=null)}},[t,r,d]);let E=(0,$.useCallback)(()=>u.current,[]);return{ref:f,meterRef:T,getText:E}}function _n(e,t=250){let[r,o]=(0,$.useState)(Mn);return(0,$.useEffect)(()=>{let n=setInterval(()=>{let s=e.current;o(i=>i.chars===s.chars&&i.done===s.done?i:{...s})},t);return()=>clearInterval(n)},[e,t]),r}function Nn(e){let{className:t,style:r,...o}=e,{ref:n}=Er(o);return(0,Ln.jsx)("span",{ref:n,className:t,style:r})}var On=require("react");var Dn=require("react/jsx-runtime"),In=(0,On.forwardRef)(function(t,r){let{stream:o="image",...n}=t;return(0,Dn.jsx)(Xe,{ref:r,stream:o,...n})});var z=require("react"),Fn=require("@urun-sh/core");var qn=require("react/jsx-runtime"),Bo=1e3,Vn=200;function Cr(...e){console.debug("[audio]",...e)}var At=(0,z.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=Ce(),y=o??l,b=(0,z.useRef)(null),T=(0,z.useRef)(null),f=(0,z.useRef)(null),v=(0,z.useRef)(null),d=(0,z.useRef)(u);d.current=u;let E=(0,z.useRef)(c);E.current=c;let S=(0,z.useCallback)(p=>{f.current!==p&&(f.current=p,E.current?.(p))},[]),k=(0,z.useCallback)(()=>{if(typeof MediaStream>"u")return null;T.current||(T.current=new MediaStream);let p=b.current;return p&&p.srcObject!==T.current&&(p.srcObject=T.current),T.current},[]),m=(0,z.useCallback)(p=>{let w=b.current;if(!w)return;let x=w.play();!x||typeof x.then!="function"||x.then(()=>{w.muted||S(!0)}).catch(O=>{let H=O instanceof Error?O.name:String(O);if(H==="AbortError"){Cr(`play() aborted (${p}); retrying in ${Vn}ms`),v.current&&clearTimeout(v.current),v.current=setTimeout(()=>{v.current=null,m(`${p}:retry`)},Vn);return}if(H==="NotAllowedError"){Cr(`play() blocked pending a user gesture (${p})`),S(!1);return}Cr(`play() failed (${p})`,O)})},[S]),R=(0,z.useCallback)(p=>{let w=k();if(w){for(let x of w.getAudioTracks())x!==p&&w.removeTrack(x);p&&!w.getAudioTracks().includes(p)&&w.addTrack(p),p&&m("track-attach"),d.current?.(p)}},[k,m]),P=(0,z.useCallback)(()=>{let p=b.current;p&&(k(),p.muted=!1,m("gesture"),$e(),S(!0))},[k,m,S]);(0,z.useImperativeHandle)(r,()=>({unlock:P,get unlocked(){return f.current===!0},get element(){return b.current}}),[P]);let C=(0,z.useCallback)(p=>{b.current=p,p&&(p.setAttribute("playsinline",""),p.setAttribute("webkit-playsinline",""),k()),g?.(p)},[k,g]),A=s!==void 0;return(0,z.useEffect)(()=>{if(A){R(s??null);return}if(!y)return;let p=y.stream(n),w=()=>{let D=T.current;return D?D.getAudioTracks()[0]??null:null},x=D=>{if(D!==w()&&(R(D),D)){let M=()=>{w()===D&&R(null)};D.addEventListener("ended",M)}},O=p.track;O&&O.readyState==="live"&&x(O);let H=p.on("track",D=>{D&&D.readyState!=="live"||x(D)}),W=setInterval(()=>{let D=p.track;D&&D.readyState==="live"&&x(D)},Bo);return()=>{H(),clearInterval(W)}},[y,n,A,s,R]),(0,z.useEffect)(()=>(0,Fn.observePageLifecycle)(()=>{$e(),f.current===!0&&m("foreground")}),[m]),(0,z.useEffect)(()=>()=>{v.current&&clearTimeout(v.current)},[]),(0,qn.jsx)("audio",{ref:C,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),Hn=At;var X=require("react"),ut=require("@urun-sh/core");var Bn=require("react/jsx-runtime"),wr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function Wt(...e){console.debug("[voice]",...e)}var Mt=(0,X.forwardRef)(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=wr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:g,onError:l,onMicStream:y,onTrack:b,onUnlockChange:T,capture:f}=t,v=Ce(),d=o??v,E=(0,X.useRef)(null),S=(0,X.useRef)(null),k=(0,X.useRef)(null),m=(0,X.useRef)([]),R=(0,X.useRef)(!1),P=(0,X.useRef)(g);P.current=g;let C=(0,X.useRef)(l);C.current=l;let A=(0,X.useRef)(y);A.current=y;let p=(0,X.useCallback)(M=>{R.current!==M&&(R.current=M,P.current?.(M))},[]),w=(0,X.useCallback)(()=>{for(let M of m.current)M();m.current=[],k.current?.release(),k.current=null,S.current&&(S.current=null,A.current?.(null))},[]),x=(0,X.useCallback)(async()=>{let M=k.current;if(M){let j=await M.update(i);return S.current=M.stream,A.current?.(M.stream),j}let J=await(f??(0,ut.sharedCaptureController)()).claim("audio",i);k.current=J,m.current=[J.onTrack((j,ne)=>{S.current=ne,A.current?.(ne),R.current&&d?.stream(n).attach(j).catch(le=>Wt("mic re-attach after one-capture re-acquire failed",le))}),J.onLost(j=>{k.current=null,m.current=[],S.current=null,A.current?.(null),p(!1),C.current?.(j)})],S.current=J.stream,A.current?.(J.stream);let Q=J.track;if(!Q)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return Q},[f,i,d,n,p]),O=(0,X.useCallback)(async()=>{w(),p(!1),await d?.stream(n).detach().catch(()=>{})},[d,n,w,p]),H=(0,X.useCallback)(async()=>{if(!d)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");E.current?.unlock();let M;try{M=await x()}catch(Q){w();let j=(0,ut.sessionFailureFromMediaError)(Q,d.status);throw C.current?.(j),j}d.connect?.();let q;for(let Q=1;Q<=u;Q++)try{await d.whenLive(a!==void 0?{timeout:a}:void 0),await d.stream(n).attach(M),p(!0);return}catch(j){q=j,Wt(`start attempt ${Q}/${u} failed`,j),Q<u&&await new Promise(ne=>setTimeout(ne,c))}w(),p(!1);let J=q instanceof Error?q:new Error(String(q??"voice start failed"));throw C.current?.(J),J},[d,n,a,u,c,x,w,p]);(0,X.useImperativeHandle)(r,()=>({start:H,stop:O,unlock:()=>E.current?.unlock(),get active(){return R.current},get micStream(){return S.current},get audio(){return E.current}}),[H,O]);let W=(0,X.useRef)(!1),D=(0,X.useCallback)(async()=>{if(!d||!R.current||W.current)return;let M=S.current?.getAudioTracks()[0]??null;if(M&&M.readyState==="live"){try{await d.stream(n).attach(M)}catch(q){Wt("foreground mic re-assert failed (will retry on next pass)",q)}return}W.current=!0;try{let q=await x();await d.stream(n).attach(q)}catch(q){let J=q instanceof Error?q:new Error(String(q));Wt("foreground mic re-acquire failed",J),C.current?.(J)}finally{W.current=!1}},[d,n,x]);return(0,X.useEffect)(()=>{let M=()=>{D()};return d&&typeof d.onRecovery=="function"?d.onRecovery(M):(0,ut.observePageLifecycle)(M)},[d,D]),(0,X.useEffect)(()=>w,[w]),s?(0,Bn.jsx)(At,{ref:E,session:d,stream:n,onTrack:b,onUnlockChange:T}):null}),Wn=Mt;var xe=require("react");var Bt=require("react");var Ur={level:0,speaking:!1};function jt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=(0,Bt.useState)(Ur);return(0,Bt.useEffect)(()=>{if(!e){i(Ur);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),b=setInterval(()=>{g.getByteTimeDomainData(l);let T=0;for(let v=0;v<l.length;v++){let d=(l[v]-128)/128;T+=d*d}let f=Math.sqrt(T/l.length);i(v=>{let d=f>n;return Math.abs(v.level-f)<.005&&v.speaking===d?v:{level:f,speaking:d}})},o);return()=>{clearInterval(b),c.disconnect(),i(Ur)}},[e,r,o,n]),s}var Ie=require("react/jsx-runtime"),jo={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},Ko={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},jn=(0,xe.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:y}=t,b=Ce(),T=o??b,f=(0,xe.useRef)(null),[v,d]=(0,xe.useState)(null),E=(0,xe.useRef)(l);E.current=l;let{level:S,speaking:k}=jt(a?v:null);return(0,xe.useImperativeHandle)(r,()=>({start:()=>{let m=f.current;return m?m.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>f.current?.stop()??Promise.resolve(),get active(){return f.current?.active??!1},get micStream(){return f.current?.micStream??null}}),[]),(0,xe.useEffect)(()=>{!i||!T||f.current?.start().catch(()=>{})},[i,T]),(0,Ie.jsxs)(Ie.Fragment,{children:[(0,Ie.jsx)(Mt,{ref:f,session:T,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...y!==void 0?{capture:y}:{},onActiveChange:c,onError:g,onMicStream:m=>{d(m),E.current?.(m)}}),a?(0,Ie.jsx)("span",{className:u,style:jo,"data-urun-mic":"","data-urun-mic-active":v?"true":"false","data-urun-mic-speaking":k?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(S*100)/100,children:(0,Ie.jsx)("span",{style:Ko,children:(0,Ie.jsx)("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(S*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});var ct=require("@urun-sh/core"),_=require("react");var ye=require("react/jsx-runtime"),Mr={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Ar(...e){console.debug("[camera]",...e)}function $o(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function Xo(){let e=typeof navigator<"u"?navigator.mediaDevices:void 0;if(typeof e?.enumerateDevices!="function")return null;try{return(await e.enumerateDevices()).filter(r=>r.kind==="videoinput")}catch{return null}}var _r=(0,_.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:y=!1,className:b,videoClassName:T,onActiveChange:f,onError:v,onStream:d,onTrack:E,children:S,capture:k,flipControl:m="auto",flipControlClassName:R,onDevices:P}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let C=i?"user":a?"environment":u??"environment",A=Ce(),p=o??A,w=(0,_.useRef)(null),x=(0,_.useRef)(null),O=(0,_.useRef)(null),H=(0,_.useRef)([]),W=(0,_.useRef)(null),D=(0,_.useRef)(!1),M=(0,_.useRef)(!1),q=(0,_.useRef)(C),[J,Q]=(0,_.useState)(C),[j,ne]=(0,_.useState)(!1),[le,ee]=(0,_.useState)(null),[B,G]=(0,_.useState)(!1),[Te]=(0,_.useState)($o),ie=(0,_.useRef)(f);ie.current=f;let de=(0,_.useRef)(v);de.current=v;let Fe=(0,_.useRef)(d);Fe.current=d;let pe=(0,_.useRef)(E);pe.current=E;let we=(0,_.useRef)(P);we.current=P;let me=(0,_.useCallback)(V=>{D.current!==V&&(D.current=V,ne(V),ie.current?.(V))},[]);(0,_.useEffect)(()=>{if(!j){ee(null);return}let V=!1,F=()=>{Xo().then(ve=>{V||(ee(ve),ve&&we.current?.(ve))})};F();let he=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof he?.addEventListener=="function"?(he.addEventListener("devicechange",F),()=>{V=!0,he.removeEventListener?.("devicechange",F)}):()=>{V=!0}},[j]);let ue=(0,_.useCallback)(V=>{let F=w.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?.(he=>Ar("preview play() failed",he)))},[]),oe=(0,_.useCallback)(()=>{M.current=!1,W.current?.(),W.current=null;for(let V of H.current)V();H.current=[],O.current?.release(),O.current=null,x.current&&(x.current=null,Fe.current?.(null),pe.current?.(null)),ue(null)},[ue]),h=(0,_.useCallback)((V,F)=>{W.current?.(),x.current=F,ue(F),Fe.current?.(F);let he=()=>{x.current===F&&(Ar("camera track ended (device removed or permission revoked)"),oe(),me(!1))};V.addEventListener("ended",he),W.current=()=>V.removeEventListener("ended",he)},[ue,oe,me]),N=(0,_.useCallback)(async V=>{let F=n!==!1;if(F&&!p)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let he={...Mr,...s,facingMode:V},ve;try{let Re=O.current;if(Re)ve=await Re.update(he);else{let St=await(k??(0,ct.sharedCaptureController)()).claim("video",he);if(O.current=St,H.current=[St.onTrack((ht,go)=>{h(ht,go),D.current&&(!F||!p||p.stream(n).attachVideo(ht).then(()=>pe.current?.(ht)).catch(So=>Ar("camera re-publish after one-capture re-acquire failed",So)))}),St.onLost(ht=>{O.current=null,H.current=[],oe(),me(!1),de.current?.(ht)})],!St.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});ve=St.track}}catch(Re){let Qe=(0,ct.sessionFailureFromMediaError)(Re,p?.status);throw de.current?.(Qe),Qe}q.current=V,Q(V),h(ve,O.current?.stream??new MediaStream([ve]));try{F&&p&&(p.connect?.(),await p.whenLive(l!==void 0?{timeout:l}:void 0),await p.stream(n).attachVideo(ve)),M.current=F?n:!1}catch(Re){oe(),me(!1);let Qe=Re instanceof Error?Re:new Error(String(Re));throw de.current?.(Qe),Qe}pe.current?.(ve),me(!0)},[p,n,s,l,k,h,oe,me]),U=(0,_.useCallback)(V=>N(V?.facingMode??q.current),[N]),K=(0,_.useCallback)(async V=>{let F=M.current===n;D.current&&q.current===V&&F||await N(V)},[N,n]),Se=(0,_.useCallback)(()=>N(q.current==="environment"?"user":"environment"),[N]),Ue=(0,_.useCallback)(async()=>{oe(),me(!1),n!==!1&&await p?.stream(n).detachVideo().catch(()=>{})},[p,n,oe,me]),L=(0,_.useCallback)(async V=>{let F=w.current;if(!F)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await(0,ct.captureStillFromVideo)(F,V)},[]);(0,_.useImperativeHandle)(r,()=>({start:U,stop:Ue,flip:Se,setFacingMode:K,capturePhoto:L,get active(){return D.current},get facingMode(){return q.current},get stream(){return x.current},get element(){return w.current}}),[U,Ue,Se,K,L]);let Ae=(0,_.useRef)(K);if(Ae.current=K,(0,_.useEffect)(()=>{c&&(n!==!1&&!p||Ae.current(C).catch(()=>{}))},[c,p,C,n]),(0,_.useEffect)(()=>oe,[oe]),!y)return null;let Ze=g==="auto"?J==="user":g,Me=j&&(m===!0||m==="auto"&&Te&&(le?.length??0)>1),_e=()=>{B||(G(!0),Se().catch(()=>{}).finally(()=>G(!1)))};return(0,ye.jsxs)("div",{className:b,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":J,children:[(0,ye.jsx)("video",{ref:w,className:T,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",...Ze?{transform:"scaleX(-1)"}:{}}}),Me?(0,ye.jsx)("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:_e,disabled:B,className:R,style:R?{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,ye.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,ye.jsx)("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),(0,ye.jsx)("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),(0,ye.jsx)("path",{d:"M14.5 10.5v1.6h-1.6"}),(0,ye.jsx)("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),(0,ye.jsx)("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,S]})}),Kn=(0,_.forwardRef)(function({preview:t=!0,...r},o){return(0,ye.jsx)(_r,{ref:o,...r,visible:t,autoStart:!1})});var lt=require("@urun-sh/core"),te=require("react");function $n(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,y]=(0,te.useState)(null),[b]=(0,te.useState)(lt.cameraCaptureAvailable),T=(0,te.useRef)(n);T.current=n;let f=(0,te.useRef)(null),v=(0,te.useRef)(0),d=(0,te.useCallback)(R=>{f.current&&URL.revokeObjectURL(f.current),f.current=R?URL.createObjectURL(new Blob([R.bytes],{type:R.type})):null,u(f.current),i(R),T.current?.(R)},[]);(0,te.useEffect)(()=>()=>{v.current++,f.current&&URL.revokeObjectURL(f.current),f.current=null},[]);let E=(0,te.useCallback)(async R=>{let P=++v.current;g(!0),y(null);try{let C=await R();if(v.current!==P)return;d(C)}catch(C){if(v.current!==P)return;y((0,lt.referenceImageErrorMessage)(C))}finally{v.current===P&&g(!1)}},[d]),S=(0,te.useCallback)(R=>E(()=>(0,lt.normalizeReferenceImage)(R,{maxSize:t,type:r,quality:o,source:"file"})),[E,t,r,o]),k=(0,te.useCallback)(R=>E(()=>R.capturePhoto({maxSize:t,type:r,quality:o})),[E,t,r,o]),m=(0,te.useCallback)(()=>{v.current++,y(null),g(!1),d(null)},[d]);return{reference:s,previewUrl:a,pick:S,capture:k,clear:m,busy:c,error:l,cameraAvailable:b}}var Kt=require("react");function Xn(e,t){let[r,o]=(0,Kt.useState)(null);return(0,Kt.useEffect)(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}var Gn=require("react");var Xt=require("react");var zn=require("zustand/vanilla"),Jn=require("zustand"),zo=()=>{};function $t(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=(0,zn.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):zo,u=(c=>(0,Jn.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 dt(e,t){let r=(0,Xt.useMemo)(()=>$t(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return(0,Xt.useEffect)(()=>r.bind(),[r]),r}function Yn(e,t,r){let n=dt(e,t)(r??(a=>a)),s=(0,Gn.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 Jt=require("react");var qe=200;function De(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function pt(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function zt(e){let t=e.trim();if(!t)return{ok:!1,error:"Enter a JSON object."};let r;try{r=JSON.parse(t)}catch(o){return{ok:!1,error:o instanceof Error?o.message:"Invalid JSON."}}return r===null||typeof r!="object"||Array.isArray(r)?{ok:!1,error:"The payload must be a JSON object."}:{ok:!0,value:r}}function Gt(e,t,r={}){let o=r.cap??200,[n,s]=(0,Jt.useState)([]);return(0,Jt.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=>De(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}var Ee=require("react/jsx-runtime");function Zn({session:e,name:t,cap:r,className:o}){let n=Gt(e,t,{cap:r});return(0,Ee.jsxs)("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[(0,Ee.jsxs)("div",{className:"urun-stream-tail-meta",children:[(0,Ee.jsx)("code",{children:t}),(0,Ee.jsxs)("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),(0,Ee.jsx)("div",{className:"urun-stream-tail-log",children:n.length===0?(0,Ee.jsxs)("span",{className:"urun-stream-tail-empty",children:["Waiting for ",(0,Ee.jsx)("code",{children:t})," messages\u2026"]}):n.map((s,i)=>(0,Ee.jsxs)("div",{className:"urun-stream-tail-line",children:[(0,Ee.jsx)("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",pt(s.payload)]},`${s.at}-${i}`))})]})}var _t=require("react");var ge=require("react/jsx-runtime");function Nt({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=(0,_t.useState)(""),[i,a]=(0,_t.useState)(null),u=(0,_t.useCallback)(()=>{let c=zt(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return(0,ge.jsxs)("div",{className:"urun-doc-patch",children:[(0,ge.jsx)("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),(0,ge.jsxs)("div",{className:"urun-doc-patch-actions",children:[(0,ge.jsx)("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?(0,ge.jsx)("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function Qn({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=dt(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return(0,ge.jsxs)("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[(0,ge.jsxs)("div",{className:"urun-doc-panel-meta",children:[(0,ge.jsx)("code",{children:t}),(0,ge.jsx)("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),(0,ge.jsx)("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?(0,ge.jsx)(Nt,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}var Yt=require("react");var Ve=require("react/jsx-runtime");function eo(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function to({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=(0,Yt.useState)([]);return(0,Yt.useEffect)(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>De(u,{at:Date.now(),direction:"in",text:eo(pt(a))},r))}):void 0),[e,t,r]),(0,Ve.jsxs)("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[(0,Ve.jsx)(Nt,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>De(u,{at:Date.now(),direction:"out",text:eo(a)},r))}}),(0,Ve.jsx)("div",{className:"urun-control-sender-log",children:n.length===0?(0,Ve.jsx)("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>(0,Ve.jsxs)("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[(0,Ve.jsx)("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",(0,Ve.jsx)("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}var Zt=require("react");var Ge=require("react/jsx-runtime");function ro({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=(0,Zt.useState)([]),a=t.join(","),u=r.join(",");return(0,Zt.useEffect)(()=>{if(i([]),!e)return;let c=(l,y)=>i(b=>De(b,{at:Date.now(),kind:l,text:y},o)),g=[];g.push(e.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of t){let y=e.stream(l);g.push(y.on("track",b=>c("track",`${l}: ${b?"track arrived":"track ended"}`)))}for(let l of r){let y=e.doc(l);g.push(y.on("change",()=>c("doc",`${l} changed`)))}return()=>g.forEach(l=>l())},[e,a,u,o]),(0,Ge.jsx)("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?(0,Ge.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,Ge.jsxs)("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[(0,Ge.jsx)("span",{className:"urun-event-spine-kind",children:c.kind})," ",(0,Ge.jsx)("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${g}`))})}var sr=require("@urun-sh/core");var Qt=require("react");function ke(e){let[t,r]=(0,Qt.useState)(e?.phase??null);return(0,Qt.useEffect)(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}var oo=require("@urun-sh/core");var mt=require("react"),no=require("@urun-sh/core");function er(e){let t=ke(e),r=(0,no.isWakingPhase)(t?.name),o=(0,mt.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,mt.useState)(s);return(0,mt.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 We=require("react/jsx-runtime");function tr({session:e,render:t,className:r}){let o=er(e);return!o.waking||!o.phase?null:(0,We.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,We.jsxs)(We.Fragment,{children:[(0,We.jsx)("span",{className:"urun-session-waking-label",children:(0,oo.describeSessionPhase)(o.phase)})," ",(0,We.jsxs)("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}var nr=require("react");var Be=require("react"),Jo={event:null,elapsedMs:0};function rr(e,t){let[r,o]=(0,Be.useState)(null),n=(0,Be.useRef)(0);(0,Be.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,Be.useState)(0);return(0,Be.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}:Jo}var ft=require("react/jsx-runtime"),Go={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 Yo(e){let[t,r]=(0,nr.useState)(!1);return(0,nr.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 or({session:e,stream:t,videoElement:r,render:o,className:n}){let s=rr(e,t),i=Yo(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return(0,ft.jsx)("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):(0,ft.jsxs)("div",{className:"urun-activation-overlay-card",children:[(0,ft.jsx)("span",{className:"urun-activation-overlay-copy",children:a.hint??Go[u]})," ",(0,ft.jsxs)("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}var be=require("react/jsx-runtime"),Zo={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",waiting_for_capacity:"waiting for GPU capacity",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired",unknown:"unrecognized state"};function so({session:e,className:t}){let r=ke(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?.reason?r.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return(0,be.jsxs)("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[(0,be.jsx)("span",{className:"urun-session-status-dot","data-phase":o}),(0,be.jsx)("span",{className:"urun-session-status-label",children:Zo[o]}),n?(0,be.jsx)("span",{className:"urun-session-status-detail",children:n}):null]})}function io({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=ke(e);if(s?.name==="live")return(0,be.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,(0,be.jsx)(or,{session:e})]});let i=r?r(s):(0,be.jsx)("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&(0,sr.isWakingPhase)(s.name)?(0,be.jsx)(tr,{session:e}):s&&s.name!=="idle"?(0,sr.describeSessionPhase)(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return(0,be.jsxs)("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?(0,be.jsx)("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}var ir=require("react");var uo=require("react/jsx-runtime");function Nr(e){return ke(e)?.endsAt??null}function Qo(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 ao({session:e,urgentMs:t=6e4,className:r}){let n=Nr(e)?.getTime()??null,[s,i]=(0,ir.useState)(()=>n===null?null:Math.max(0,n-Date.now()));if((0,ir.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=Qo(s);return(0,uo.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 Lt=require("react/jsx-runtime"),es=new Set(["expired","ended","error"]);function co({session:e,onNewSession:t,children:r,className:o}){let n=ke(e);if(!n||!es.has(n.name))return null;let s=r?r(n):(0,Lt.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,Lt.jsxs)("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?(0,Lt.jsx)("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}var je=require("react"),Ye=require("react/jsx-runtime");function Lr(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 Or(e){let t=(0,je.useMemo)(()=>e?e.doc("control"):null,[e]),[r,o]=(0,je.useState)(()=>t?Lr(t.get("idle")):null);return(0,je.useEffect)(()=>{if(!t){o(null);return}return o(Lr(t.get("idle"))),t.on("change",()=>o(Lr(t.get("idle"))))},[t]),r}function ts(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function lo({session:e,onStillHere:t,className:r}){let o=Or(e),n=o?.deadlineEpochS??null,[s,i]=(0,je.useState)(null);if((0,je.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,Ye.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,Ye.jsxs)("div",{className:"urun-idle-warning-card",children:[(0,Ye.jsx)("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),(0,Ye.jsx)("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${ts(s)} due to inactivity.`:"This session will end soon due to inactivity."}),(0,Ye.jsx)("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}var gt=require("react"),po=require("@urun-sh/core");function mo(e){let t=(0,gt.useContext)(tt),[r,o]=(0,gt.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,gt.useEffect)(()=>{if(!a||!u||!n||!s)return;let y=!1,b=()=>{(0,po.prewake)({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:g,authProvider:l}).then(f=>{y||o(f)}).catch(()=>{})};b();let T=setInterval(b,Math.max(1,i)*1e3);return()=>{y=!0,clearInterval(T)}},[n,s,i,a,u,c,g,l]),r}var ar=require("react");function fo(e){let[t,r]=(0,ar.useState)(null);return(0,ar.useEffect)(()=>{if(r(null),!!e?.onStats)return e.onStats(r)},[e]),t}var ur=require("@urun-sh/core");0&&(module.exports={Audio,Camera,ComponentRenderer,DEFAULT_CAMERA_CONSTRAINTS,DEFAULT_LOG_CAP,DEFAULT_SMOOTH_CHARS_PER_FRAME,DEFAULT_SMOOTH_THRESHOLD,DEFAULT_VOICE_CONSTRAINTS,DocPatchForm,Image,ImageFrame,ImageFrameSchema,MetricsPanel,MetricsPanelSchema,Mic,OPERATOR_CHORD_LABEL,OPERATOR_TOKEN_STORAGE_KEY,ProgressCard,ProgressCardSchema,ReprojectedVideo,Session,StatusBadge,StatusBadgeSchema,Text,TextStream,TextStreamError,TextStreamSchema,UrunActivationOverlay,UrunAudio,UrunAuthProvider,UrunCamera,UrunControlSender,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,textDelta,urunPublicEnv,useActivation,useApp,useChat,useCompletion,useConfirmOnLeave,useDocStore,useImageFrame,useInputPresence,useMetricsPanel,useOperatorOverride,useProgressCard,useReferenceImage,useRequest,useSession,useSessionDoc,useSessionEndsAt,useSessionIdle,useSessionPhase,useSessionStats,useSessionTrack,useSessionWake,useStatusBadge,useStreamMessages,useText,useTextMeter,useTextStream,useUrunAudioLevel,useUrunAuth,useUrunPrewake,usesWorkOSAuth});
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
  "use client"
2
- import{a as bt,b as kn,c as Rt}from"./chunk-WF2OBDSX.mjs";import{useCallback as cr,useEffect as _n,useMemo as mr,useRef as lr,useState as Et}from"react";import{Component as bn}from"react";import{jsx as or,jsxs as Rn}from"react/jsx-runtime";var Ke=class extends bn{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||Rn("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:[or("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),or("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as Tn}from"react";var Le=Tn(null);function ye(e){return e&&e.trim()?e.trim():void 0}function de(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"NEXT_PUBLIC_URUN_TOKEN_URL":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_TOKEN_URL:void 0);case"NEXT_PUBLIC_URUN_EVENTS_URL":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_EVENTS_URL:void 0);case"VERCEL_ENV":return ye(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return ye(typeof process<"u"?process.env?.[e]:void 0)}}function rt(){let e=de("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||de("VERCEL_ENV")==="production"?"workos":de("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Pn(){return rt()==="workos"}import{useEffect as En,useRef as xn}from"react";var Cn="urun.operator_token",ir=null,sr="op",wn="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function ar(){return typeof window<"u"}function ur(){return ir}function Un(){if(!ar())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(sr);if(!r)return null;ir=r,t.delete(sr);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function An(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function Tt(e){let t=xn(e);t.current=e,En(()=>{if(!ar())return;Un();let r=o=>{if(!An(o))return;let n=ur();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}import{useEffect as Mn}from"react";function Pt(e=!0){Mn(()=>{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 Ie,jsxs as Vn}from"react/jsx-runtime";var Nn="/api/urun-token",Ln=1e4;function In(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 dr(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 pr(e,t){if(t===void 0)return;let r;try{r=new URL(t).hostname}catch{throw new Error(`[urun] ${e} is not a valid URL: ${t}`)}if(!(r==="127.0.0.1"||r==="localhost"||r==="::1"||r==="[::1]"))throw new Error(`[urun] ${e} must point at a loopback endpoint \u2014 the CLI launcher (urun dev/demo) is this variable's only legitimate producer and it must never be set on a deployed site. Refusing ${t}.`);return t}function xt(e){let t=e===void 0?void 0:JSON.stringify(e);return mr(()=>e,[t])}function On(e,t){return typeof e=="function"?e(t):e!==void 0?e:Vn("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:[Ie("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),Ie("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function Dn({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,audioPlayout:g,videoPlayout:l,sessionStats:y,confirmOnLeave:b=!1,fallback:R,errorFallback:f,children:v}){let d=n===void 0&&t===void 0;if(!d&&(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(!d&&(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 x=r??o;if(d&&(typeof x!="string"||x.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);Pt(b);let[S,k]=Et(),[m,T]=Et(null),P=lr(void 0),C=lr(null),[A,p]=Et(null);Tt(h=>p({jwt:h}));let w=Rt(),E=de("NEXT_PUBLIC_SESSION_TOKEN")??de("NEXT_PUBLIC_URUN_JWT"),L=rt(),V=A!==null,H=L==="workos"&&!n&&!V&&!d,I=n??(L==="jwt"?E:void 0)??S?.token,M=V?A.jwt:I,F=s??de("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),j=H&&!M&&!w?.getAccessToken,$=t??S?.orgId,W=e??S?.gatewayUrl,J=d&&S===void 0,Q=d&&S!==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,X=j?new Error('[urun] <UrunProvider> resolved authMode()="workos" but no auth context is mounted: there is no <UrunWorkOSProvider> (or <UrunAuthProvider>) ancestor supplying getAccessToken, and no jwt prop was passed, so no session token can be obtained. Note NEXT_PUBLIC_SESSION_TOKEN and NEXT_PUBLIC_URUN_JWT are IGNORED in workos mode, so setting them will not help. Either mount UrunWorkOSProvider from @urun-sh/react/next-workos, or select jwt mode with NEXT_PUBLIC_AUTH_MODE=jwt (or NEXT_PUBLIC_AUTH_ENABLED=false) and supply a token.'):null,q=m??Q??X,K=pr("NEXT_PUBLIC_URUN_TOKEN_URL",de("NEXT_PUBLIC_URUN_TOKEN_URL"))??u??Nn,ue=pr("NEXT_PUBLIC_URUN_EVENTS_URL",de("NEXT_PUBLIC_URUN_EVENTS_URL"))??i,G=cr(async h=>{if(!h?.forceRefresh){let U=P.current;if(!U)return U;let B=In(U);if(B===null||B-Date.now()>Ln)return U}return(await(C.current??(C.current=(async()=>{try{let U=await dr(K);return P.current=U.token,k(U),U}finally{C.current=null}})()))).token},[K]),ee=cr(async()=>M,[M]),be=typeof M=="string"&&M.trim().length>0,te=H?w?.getAccessToken:d&&!V?G:be?ee:void 0,fe=xt(g),re=xt(l),Y=xt(y),z=mr(()=>({appId:x,baseUrl:W??"",orgId:$??"",jwt:M,getAccessToken:H?w?.getAccessToken:d&&!V?G:void 0,authProvider:F,eventsUrl:ue,sessionKey:a,releaseOnLeave:c,audioPlayout:fe,videoPlayout:re,sessionStats:Y,priority:V?"preempt":void 0}),[x,w,W,F,M,ue,$,a,c,fe,re,Y,H,V,d,G]);return _n(()=>{if(!d)return;let h=new AbortController;return T(null),(async()=>{try{let _=await dr(K,h.signal);P.current=_.token,k(_)}catch(_){if(h.signal.aborted)return;T(_ instanceof Error?_:new Error(String(_)))}})(),()=>h.abort()},[d,K]),Ie(Ke,{fallback:R,children:q?On(f,q):J?Ie("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Ie(Le.Provider,{value:z,children:te?Ie(bt,{getAccessToken:te,children:v}):v})})}import{useContext as Fn,useEffect as Hn,useMemo as fr,useReducer as qn,useRef as Ct}from"react";import{App as Wn}from"@urun-sh/core";function Bn(e,t){return`${e}:${JSON.stringify(t??{})}`}function jn(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 we=new Map;var wt=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}onConnectionState(t){return this._doc.onConnectionState?this._doc.onConnectionState(r=>{t(r),this._notify()}):(t({connected:!0,consecutiveFailures:0,lastCloseCode:null,lastCloseReason:null}),()=>{})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},Ut=class{constructor(t,r){this._stream=t;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(t){return this._stream.attach(t)}attachVideo(t){return this._stream.attachVideo(t)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(t){return this._stream.seek(t)}chunks(t){return this._stream.chunks(t)}onSeeked(t){return this._stream.onSeeked(t)}on(t,r){return this._stream.on(t,r)}messages(){return this._stream.messages()}emit(t,r){return this._stream.emit(t,r)}dispose(){this._unsubscribeTrack()}},At=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||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)}onStats(t){return this._session.onStats?this._session.onStats(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 wt(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new Ut(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}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 Kn(){let e=Fn(Le);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=qn(i=>i+1,0),r=Ct(new Map),o=Ct(new Map),n=Ct(null),s=fr(()=>Wn(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,audioPlayout:e.audioPlayout,videoPlayout:e.videoPlayout,sessionStats:e.sessionStats}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority,e.audioPlayout,e.videoPlayout,e.sessionStats]);return Hn(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=we.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=we.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=we.get(u);!l||l.refCount!==0||(we.delete(u),l.handle.disconnect())},0)))}n.current=a}},[]),fr(()=>{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 y=Bn(u,l),b=r.current.get(y);if(b&&!b.disposed)return b;let R=jn(e,u,l),f=we.get(R);return f?.handle.disposed&&(f.disposeTimer&&clearTimeout(f.disposeTimer),we.delete(R),o.current.get(R)===f&&o.current.delete(R),f=void 0),f?f.disposeTimer&&(clearTimeout(f.disposeTimer),f.disposeTimer=null):(f={handle:new At(s[u](l),t,e.eventsUrl),refCount:0,disposeTimer:null},we.set(R,f)),o.current.get(R)!==f&&(o.current.set(R,f),f.handle.addNotifier(t),f.refCount+=1),r.current.set(y,f.handle),f.handle};return i.set(u,g),g}})},[e,s])}import{useCallback as Mt,useEffect as $n,useMemo as Xn,useRef as nt,useState as _t}from"react";function Oe(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 Jn(e){return e instanceof Error?e:new Error(String(e))}function zn(e,t){let r=Xn(()=>Oe(e),[e]),[o,n]=_t(void 0),[s,i]=_t(null),[a,u]=_t(!1),c=nt(t);c.current=t;let g=nt(0),l=nt(null),y=nt(!0);$n(()=>(y.current=!0,()=>{y.current=!1,l.current?.abort()}),[]);let b=Mt(async v=>{l.current?.abort();let d=new AbortController;l.current=d;let x=++g.current,S=()=>y.current&&g.current===x;S()&&(u(!0),i(null));try{let k=await r.request(v,{...c.current,signal:d.signal});return S()&&(n(k),u(!1),c.current?.onSuccess?.(k)),k}catch(k){let m=Jn(k);throw S()&&(i(m),u(!1),c.current?.onError?.(m)),m}},[r]),R=Mt(v=>{b(v).catch(()=>{})},[b]),f=Mt(()=>{g.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:R,mutateAsync:b,data:o,error:s,isPending:a,reset:f}}import{useCallback as gr,useEffect as Gn,useMemo as Yn,useRef as ot,useState as Nt}from"react";function Sr(e){return e instanceof Error?e:new Error(String(e))}var Zn=e=>typeof e=="string"?e:String(e);function Qn(e,t){let r=Yn(()=>Oe(e),[e]),[o,n]=Nt(""),[s,i]=Nt(!1),[a,u]=Nt(null),c=ot(t);c.current=t;let g=ot(0),l=ot(null),y=ot(!0);Gn(()=>(y.current=!0,()=>{y.current=!1,l.current?.cancel(),l.current=null}),[]);let b=gr(()=>{g.current++,l.current?.cancel(),l.current=null,y.current&&i(!1)},[]),R=gr(async f=>{l.current?.cancel();let v=++g.current,d=()=>y.current&&g.current===v,x=c.current,S=x?.parseChunk??Zn,k=x?.buildPayload??(E=>({prompt:E}));d()&&(n(""),u(null),i(!0));let{parseChunk:m,buildPayload:T,onFinish:P,onError:C,...A}=x??{},p="",w;try{w=r.requestStream(k(f),A),l.current=w}catch(E){let L=Sr(E);d()&&(u(L),i(!1),x?.onError?.(L));return}try{for await(let E of w){if(g.current!==v)break;p+=S(E),d()&&n(p)}d()&&(i(!1),x?.onFinish?.(p))}catch(E){let L=Sr(E);d()&&(u(L),i(!1),x?.onError?.(L))}finally{l.current===w&&(l.current=null)}},[r]);return{completion:o,complete:R,stop:b,isStreaming:s,error:a}}import{useCallback as hr,useEffect as eo,useMemo as to,useRef as De,useState as st}from"react";function vr(e){return e instanceof Error?e:new Error(String(e))}var ro=e=>typeof e=="string"?e:String(e),yr=0;function Lt(e){return yr+=1,`${e}-${yr}`}function no(e,t){let r=to(()=>Oe(e),[e]),[o,n]=st(()=>(t?.initialMessages??[]).map(S=>({id:S.id??Lt("msg"),role:S.role,content:S.content}))),[s,i]=st(""),[a,u]=st(!1),[c,g]=st(null),l=De(t);l.current=t;let y=De(o);y.current=o;let b=De(s);b.current=s;let R=De(0),f=De(null),v=De(!0);eo(()=>(v.current=!0,()=>{v.current=!1,f.current?.cancel(),f.current=null}),[]);let d=hr(()=>{R.current++,f.current?.cancel(),f.current=null,v.current&&u(!1)},[]),x=hr(async S=>{let k=S===void 0,m=(k?b.current:S)??"";if(!m.trim())return;f.current?.cancel();let P=++R.current,C=()=>v.current&&R.current===P,A=l.current,p=A?.parseChunk??ro,w={id:Lt("msg"),role:"user",content:m},E={id:Lt("msg"),role:"assistant",content:""},L=[...y.current,w].map(q=>({role:q.role,content:q.content})),V=[...y.current,w,E];y.current=V,n(V),k&&i(""),g(null),u(!0);let H=A?.buildPayload??(q=>({messages:q})),{initialMessages:I,parseChunk:M,buildPayload:F,onFinish:j,onError:$,...W}=A??{},J=q=>{n(K=>K.map(ue=>ue.id===E.id?{...ue,content:q}:ue))},Q="",X;try{X=r.requestStream(H(L),W),f.current=X}catch(q){let K=vr(q);C()&&(g(K),u(!1),A?.onError?.(K));return}try{for await(let q of X){if(R.current!==P)break;Q+=p(q),C()&&J(Q)}C()&&(u(!1),A?.onFinish?.({...E,content:Q}))}catch(q){let K=vr(q);C()&&(g(K),u(!1),A?.onError?.(K))}finally{f.current===X&&(f.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:x,stop:d,isStreaming:a,error:c}}import{useCallback as Re,useEffect as kr,useMemo as oo,useRef as br,useState as Rr}from"react";import{createInputPresencePublisher as so,INPUT_PRESENCE_DEFAULT_HZ as io,INPUT_PRESENCE_FIELD as ao}from"@urun-sh/core";var It=[];function uo(e,t={}){let{field:r=ao,hz:o=io}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=oo(()=>s?so({awareness:{setLocalStateField:(m,T)=>s.setField(m,T)},field:r,hz:o}):null,[s,r,o]),a=br(null);a.current=i;let[u,c]=Rr(!1),[g,l]=Rr(It),y=br(!1);kr(()=>{if(i)return()=>i.dispose()},[i]);let b=Re(()=>{let m=a.current;l(m?m.heldKeys():It)},[]),R=Re(()=>{a.current?.clear(),l(It)},[]);kr(()=>{if(!n)return;let m=()=>!!n.pointerLockElement,T=()=>{if(m()){y.current=!1,c(!0);return}y.current||(c(!1),R())},P=E=>{m()&&(a.current?.keyDown(E.key),b())},C=E=>{a.current?.keyUp(E.key),b()},A=E=>{m()&&a.current?.movePointer(E.movementX,E.movementY)},p=E=>{m()&&a.current?.setButtons(E.buttons)},w=()=>{R()};return n.addEventListener("pointerlockchange",T),n.addEventListener("keydown",P),n.addEventListener("keyup",C),n.addEventListener("mousemove",A),n.addEventListener("mousedown",p),n.addEventListener("mouseup",p),n.defaultView?.addEventListener("blur",w),()=>{n.removeEventListener("pointerlockchange",T),n.removeEventListener("keydown",P),n.removeEventListener("keyup",C),n.removeEventListener("mousemove",A),n.removeEventListener("mousedown",p),n.removeEventListener("mouseup",p),n.defaultView?.removeEventListener("blur",w)}},[n,R,b]);let f=Re(m=>{m.requestPointerLock?.()},[]),v=Re(()=>{y.current=!0,c(!0)},[]),d=Re(()=>{y.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),R()},[n,R]),x=Re(m=>{a.current?.keyDown(m),b()},[b]),S=Re(m=>{a.current?.keyUp(m),b()},[b]),k=Re((m,T)=>{a.current?.movePointer(m,T)},[]);return{engage:f,engageTouch:v,release:d,engaged:u,heldKeys:g,pressKey:x,releaseKey:S,movePointer:k}}import{forwardRef as ko,useEffect as Ar,useImperativeHandle as bo,useMemo as Ro,useRef as ut}from"react";import{createCameraWarp as To}from"@urun-sh/core";import{forwardRef as go,useCallback as Te,useEffect as $e,useImperativeHandle as So,useRef as ne,useState as Pr}from"react";import{derivedLegRole as ho}from"@urun-sh/core";var it=null;function co(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function at(){if(it)return it;let e=co();return e?(it=new e,it):null}function Ve(){let e=at();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{createContext as lo,useContext as Tr}from"react";import{jsx as fo}from"react/jsx-runtime";var Ot=lo(null);function po({session:e,children:t}){return fo(Ot.Provider,{value:e,children:t})}function pe(){return Tr(Ot)}function mo(){let e=Tr(Ot);if(!e)throw new Error("[urun] useSession() needs a mounted <Session session={...}> ancestor with a non-null session \u2014 create one with useApp() (e.g. app.generate({...})) and pass it to the scope.");return e}import{jsx as Ur,jsxs as yo}from"react/jsx-runtime";function vo(e,t){return e-t>>>0<2147483648}var Er=1e3;function xr(...e){console.debug("[video]",...e)}function Cr(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 wr(e,t,r){return r?[r,t]:[e,t]}var Fe=go(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:y,placeholder:b,poster:R,children:f,onTrack:v,onFirstFrame:d,frameMarker:x,onFrameMarkerReached:S,onFrameMarkerUnsupported:k,onUnlockChange:m}=t,T=pe(),P=o??T,C=ne(null),A=ne(null),[p,w]=Pr(!1),[E,L]=Pr(!1),V=ne(!1),H=ne(null),I=ne(v);I.current=v;let M=ne(m);M.current=m;let F=ne(d);F.current=d;let j=ne(S);j.current=S;let $=ne(k);$.current=k;let W=ne(x??null);W.current=x??null;let J=Te(h=>{H.current!==h&&(H.current=h,M.current?.(h))},[]),Q=ne(null),X=ne(null),q=Te((h,_=!1)=>{if(!_&&h===Q.current||(Q.current=h,X.current?.(),X.current=null,V.current=!1,L(!1),!h))return;let U=C.current;if(!U)return;let B=W.current,oe=B?.rtpTimestamp??null,ge=!1,N=()=>{ge||(ge=!0,$.current?.())};B&&oe==null&&N();let Se=B!=null&&oe!=null,_e=ve=>{X.current?.(),X.current=null,V.current=!0,L(!0),F.current?.(),ve&&j.current?.()};if(typeof U.requestVideoFrameCallback=="function"){let ve=!1,O=0,D=(se,ie)=>{if(!ve){if(Se){let ce=ie?.rtpTimestamp;if(typeof ce!="number"){N(),_e(!1);return}if(!vo(ce,oe)){O=U.requestVideoFrameCallback(D);return}_e(!0);return}_e(!1)}};O=U.requestVideoFrameCallback(D),X.current=()=>{ve=!0,U.cancelVideoFrameCallback?.(O)};return}Se&&N();let he=()=>{let ve=U.getVideoPlaybackQuality?.();(ve?ve.totalVideoFrames>0:U.readyState>=2&&U.videoWidth>0)&&_e(!1)};U.addEventListener("loadeddata",he),U.addEventListener("timeupdate",he),U.addEventListener("playing",he),X.current=()=>{U.removeEventListener("loadeddata",he),U.removeEventListener("timeupdate",he),U.removeEventListener("playing",he)},he()},[]);$e(()=>()=>{X.current?.(),X.current=null},[]);let K=x==null?null:`${x.rtpTimestamp??""}|${x.ptsMs??""}`,ue=ne(K);$e(()=>{if(ue.current===K||(ue.current=K,K==null))return;let h=Q.current;h&&q(h,!0)},[K,q]);let G=Te(()=>{if(typeof MediaStream>"u")return null;A.current||(A.current=new MediaStream);let h=C.current;return h&&h.srcObject!==A.current&&(h.srcObject=A.current),A.current},[]),ee=Te(h=>{let _=C.current;if(!_)return;let U=_.play();!U||typeof U.then!="function"||U.then(()=>{_.muted||J(!0)}).catch(B=>{if((B instanceof Error?B.name:String(B))==="NotAllowedError"&&!_.muted){xr(`play() blocked pending a user gesture (${h})`),J(!1);return}xr(`play() failed (${h})`,B)})},[J]),be=Te(()=>{let h=C.current;h&&(G(),!h.muted&&(ee("gesture"),Ve(),J(!0)))},[G,ee,J]),te=Te(h=>{let _=G();if(_){for(let U of _.getVideoTracks())U!==h&&_.removeTrack(U);if(h&&!_.getVideoTracks().includes(h)){_.addTrack(h);let U=C.current;U&&(U.srcObject=_)}h&&ee("track-attach"),w(h!==null),q(h),I.current?.(h)}},[G,ee,q]),fe=Te(h=>{let _=G();if(_){for(let U of _.getAudioTracks())U!==h&&_.removeTrack(U);h&&!_.getAudioTracks().includes(h)&&_.addTrack(h),h&&ee("audio-attach")}},[G,ee]),re=Te(h=>{C.current=h,h&&(a?(h.muted=!0,h.defaultMuted=!0,h.setAttribute("muted",""),H.current=null):(h.muted=!1,h.defaultMuted=!1,h.removeAttribute("muted")),h.setAttribute("playsinline",""),h.setAttribute("webkit-playsinline",""),G())},[G,a]);So(r,()=>({get element(){return C.current},get live(){return A.current?A.current.getVideoTracks().length>0:!1},get framed(){return V.current},unlock:be,get unlocked(){return H.current===!0}}),[be]);let Y=ho(n)!==void 0;$e(()=>{Y&&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.`)},[Y,n]);let z=i!==void 0;return $e(()=>{if(z){te(i??null);return}if(Y){te(null);return}if(!P)return;let h=Cr(P,wr(n,"video")),_=()=>{let N=A.current;return N?N.getVideoTracks()[0]??null:null},U=N=>{if(N!==_()&&(te(N),N)){let Se=()=>{_()===N&&te(null)};N.addEventListener("ended",Se)}},B=h.track;B&&B.readyState==="live"&&U(B);let oe=h.on("track",N=>{N&&N.readyState!=="live"||U(N)}),ge=setInterval(()=>{let N=h.track;N&&N.readyState==="live"&&U(N)},Er);return()=>{oe(),clearInterval(ge)}},[P,n,Y,z,i,te]),$e(()=>{if(z||!P||s===!1||Y)return;let h=Cr(P,wr(n,"audio",s)),_=()=>{let N=A.current;return N?N.getAudioTracks()[0]??null:null},U=N=>{if(N!==_()&&(fe(N),N)){let Se=()=>{_()===N&&fe(null)};N.addEventListener("ended",Se)}},B=h.track;B&&B.readyState==="live"&&U(B);let oe=h.on("track",N=>{N&&N.readyState!=="live"||U(N)}),ge=setInterval(()=>{let N=h.track;N&&N.readyState==="live"&&U(N)},Er);return()=>{oe(),clearInterval(ge)}},[P,n,Y,s,z,fe]),yo("div",{className:g,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":p?"true":"false","data-urun-video-framed":E?"true":"false",children:[Ur("video",{ref:re,className:y,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),p?null:b,R===void 0?null:Ur("div",{"data-urun-video-poster":"","aria-hidden":E||void 0,style:{position:"absolute",inset:0,...E?{opacity:0,pointerEvents:"none"}:null},children:R}),f]})});import{jsx as Mr,jsxs as xo}from"react/jsx-runtime";var Po={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},Eo=ko(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,y=ut(null),b=ut(null),R=ut(0),f=ut(g);f.current=g;let v=Ro(()=>To(f.current),[]);return bo(r,()=>({get video(){return y.current},get canvas(){return b.current},warp:v,get lastDrawTs(){return R.current}}),[v]),Ar(()=>{if(!i)return;let d=0,x=0,S=null,k=T=>{typeof T.requestVideoFrameCallback=="function"&&(S=T,x=T.requestVideoFrameCallback(function P(){v.frameArrived(),x=T.requestVideoFrameCallback(P)}))},m=T=>{d=requestAnimationFrame(m);let P=b.current,C=y.current?.element??null;if(!P||!C||(C!==S&&(S&&x&&S.cancelVideoFrameCallback?.(x),k(C)),C.readyState<2))return;v.tick(T);let A=typeof devicePixelRatio=="number"?devicePixelRatio:1,p=Math.max(1,Math.round(P.clientWidth*A)),w=Math.max(1,Math.round(P.clientHeight*A));(P.width!==p||P.height!==w)&&(P.width=p,P.height=w);let E=P.getContext("2d");if(!E)return;let L=v.transform(),V=C.videoWidth||p,H=C.videoHeight||w,M=Math.max(p/V,w/H)*(1+a)*L.scale;E.setTransform(M,0,0,M,p/2+L.translateX*p,w/2+L.translateY*w),E.drawImage(C,-V/2,-H/2),R.current=T};return d=requestAnimationFrame(m),()=>{cancelAnimationFrame(d),S&&x&&S.cancelVideoFrameCallback?.(x)}},[i,a,v]),Ar(()=>{if(!i||!u||!l)return;let d=()=>!!l.pointerLockElement,x=P=>{d()&&v.keyDown(P.key)},S=P=>v.keyUp(P.key),k=P=>{d()&&v.pointerDelta(P.movementX,P.movementY)},m=()=>{d()||v.clearKeys()},T=()=>v.clearKeys();return l.addEventListener("keydown",x),l.addEventListener("keyup",S),l.addEventListener("mousemove",k),l.addEventListener("pointerlockchange",m),l.defaultView?.addEventListener("blur",T),()=>{l.removeEventListener("keydown",x),l.removeEventListener("keyup",S),l.removeEventListener("mousemove",k),l.removeEventListener("pointerlockchange",m),l.defaultView?.removeEventListener("blur",T)}},[i,u,l,v]),i?xo(Fe,{ref:y,...s,videoClassName:s.videoClassName,style:{...s.style},children:[Mr("canvas",{ref:b,style:Po,"data-urun-warp":""}),n]}):Mr(Fe,{ref:y,...s,children:n})});var _r=new Map;function Co(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);_r.set(e,{component:t,schema:r})}function Nr(e,t){let r=_r.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 Uo,jsx as ct}from"react/jsx-runtime";function wo({name:e,props:t,fallback:r}){let o=Nr(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?ct(Uo,{children:r}):ct("div",{className:"urun-component-error",role:"alert",children:ct("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return ct(n,{...o.validatedProps})}import{z as Xe}from"zod";import{jsx as Dt,jsxs as Lr}from"react/jsx-runtime";var Ao=Xe.object({step:Xe.number().min(0),total:Xe.number().min(1),label:Xe.string().optional(),variant:Xe.enum(["default","success","error"]).default("default")});function Ir(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 Mo(e){let{step:t,total:r,label:o,variant:n,percentage:s}=Ir(e);return Lr("div",{className:"urun-progress-card","data-variant":n,children:[o&&Dt("div",{className:"urun-progress-label",children:o}),Dt("div",{className:"urun-progress-bar",children:Dt("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),Lr("div",{className:"urun-progress-text",children:[t,"/",r]})]})}import{z as Vt}from"zod";import{jsx as Or,jsxs as Io}from"react/jsx-runtime";var _o=Vt.object({state:Vt.enum(["thinking","generating","idle","error"]),message:Vt.string().optional()}),No={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Dr(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??No[t]??t;return{state:t,message:n,isActive:o}}function Lo(e){let{state:t,message:r,isActive:o}=Dr(e);return Io("span",{className:"urun-status-badge","data-state":t,children:[Or("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),Or("span",{className:"urun-status-message",children:r})]})}import{useRef as Vr,useEffect as Oo}from"react";import{z as Ft}from"zod";import{jsx as Fr,jsxs as Fo}from"react/jsx-runtime";var Do=Ft.object({text:Ft.string(),streaming:Ft.boolean().default(!1)});function Hr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function Vo(e){let{text:t,streaming:r}=Hr(e),o=Vr(null),n=Vr(0);return Oo(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),Fo("div",{className:"urun-text-stream",children:[Fr("span",{ref:o,className:"urun-text-content"}),r&&Fr("span",{className:"urun-text-cursor"})]})}import{z as lt}from"zod";import{jsx as qr,jsxs as Wo}from"react/jsx-runtime";var Ho=lt.object({src:lt.string().url(),alt:lt.string().optional(),caption:lt.string().optional()});function Wr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function qo(e){let{src:t,alt:r,caption:o}=Wr(e);return Wo("figure",{className:"urun-image-frame",children:[qr("img",{className:"urun-image",src:t,alt:r}),o&&qr("figcaption",{className:"urun-image-caption",children:o})]})}import{z as Pe}from"zod";import{jsx as Ht,jsxs as Ko}from"react/jsx-runtime";var Bo=Pe.object({metrics:Pe.array(Pe.object({label:Pe.string(),value:Pe.union([Pe.string(),Pe.number()]),unit:Pe.string().optional()}))});function Br(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function jo(e){let{metrics:t}=Br(e);return Ht("div",{className:"urun-metrics-panel",children:t.map((r,o)=>Ko("div",{className:"urun-metric-card",children:[Ht("div",{className:"urun-metric-label",children:r.label}),Ht("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}import{useCallback as dt,useEffect as qt,useRef as ae,useState as $o}from"react";import{jsx as es}from"react/jsx-runtime";function Ee(e){return e&&typeof e=="object"?e:null}function jr(e){if(typeof e=="string")return e;let t=Ee(e);return t&&t.t==="delta"&&typeof t.delta=="string"?t.delta:""}function Xo(e){if(typeof e=="string")return"delta";let t=Ee(e);return t?t.t==="delta"?"delta":t.t==="response"?"done":t.t==="error"?"error":"ignore":"ignore"}function Jo(...e){for(let t of e)if(typeof t=="string"&&t)return t;return""}function zo(e){let t=Ee(e),r=t?.body;return Jo(r,Ee(Ee(r)?.error)?.message,Ee(r)?.error,Ee(r)?.message,Ee(t?.error)?.message,t?.error,t?.message)||"stream reported an error"}var Je=class extends Error{name="TextStreamError"},Go=4,Kr=3,$r=240;function Xr(){return{chars:0,tokens:0,tokensPerSecond:0,elapsedMs:0,done:!1}}function Yo(e){e.chars=0,e.tokens=0,e.tokensPerSecond=0,e.elapsedMs=0,e.done=!1}function Jr(e){let{session:t,stream:r}=e,o=ae(e);qt(()=>{o.current=e});let n=ae(null),s=ae(()=>{}),i=ae(null),a=ae(""),u=ae(""),c=ae(null),g=ae(!1),l=ae(!1),y=ae(!1),b=ae(0),R=ae(Xr()),f=dt(S=>{if(n.current=S,!S){i.current=null;return}let k=i.current;if(k&&k.parentNode===S)return;let m=S.ownerDocument.createTextNode(u.current);S.appendChild(m),i.current=m,a.current.length>0&&s.current()},[]),v=dt(()=>{c.current=null;let S=i.current,k=a.current;if(k.length>0){let A=o.current,p=A.smoothCharsPerFrame??Kr,w=A.smoothThreshold??$r,E=A.smooth&&k.length<=w?k.slice(0,p):k;a.current=k.slice(E.length),u.current+=E,S?.appendData(E)}let m=R.current,T=u.current.length,P=b.current===0?0:Date.now()-b.current,C=Math.round(T/Go);if(m.chars=T,m.tokens=C,m.elapsedMs=P,m.tokensPerSecond=P>0?C*1e3/P:0,a.current.length>0){d(),o.current.onMeter?.(m);return}if(!g.current&&!y.current){y.current=!0,m.done=!0,o.current.onMeter?.(m),l.current||o.current.onDone?.(u.current);return}o.current.onMeter?.(m)},[]),d=dt(()=>{c.current===null&&(c.current=globalThis.requestAnimationFrame(()=>v()))},[v]);s.current=d,qt(()=>{if(!t)return;if(typeof globalThis.requestAnimationFrame!="function")throw new Error("[urun] Text requires requestAnimationFrame. Render it in a browser (or a DOM test environment).");a.current="",u.current="",l.current=!1,y.current=!1,b.current=0,g.current=!0,Yo(R.current),i.current&&(i.current.data="");let S=!1,k=null;return(async()=>{try{for(k=t.stream(r).messages()[Symbol.asyncIterator]();;){let T=await k.next();if(S)return;if(T.done)break;let P=T.value,C=Xo(P);if(C==="error")throw new Je(zo(P));if(C==="done")break;if(C==="ignore")continue;let A=jr(P);A&&(b.current===0&&(b.current=Date.now()),a.current+=A,d())}if(S)return;k.return?.(void 0),g.current=!1,d()}catch(m){if(S)return;k?.return?.(void 0),l.current=!0,g.current=!1,o.current.onError?.(m instanceof Error?m:new Je(String(m))),d()}})(),()=>{S=!0,g.current=!1,k?.return?.(void 0),c.current!==null&&(globalThis.cancelAnimationFrame?.(c.current),c.current=null)}},[t,r,d]);let x=dt(()=>u.current,[]);return{ref:f,meterRef:R,getText:x}}function Zo(e,t=250){let[r,o]=$o(Xr);return qt(()=>{let n=setInterval(()=>{let s=e.current;o(i=>i.chars===s.chars&&i.done===s.done?i:{...s})},t);return()=>clearInterval(n)},[e,t]),r}function Qo(e){let{className:t,style:r,...o}=e,{ref:n}=Jr(o);return es("span",{ref:n,className:t,style:r})}import{forwardRef as ts}from"react";import{jsx as ns}from"react/jsx-runtime";var rs=ts(function(t,r){let{stream:o="image",...n}=t;return ns(Fe,{ref:r,stream:o,...n})});import{forwardRef as os,useCallback as He,useEffect as Wt,useImperativeHandle as ss,useRef as qe}from"react";import{observePageLifecycle as is}from"@urun-sh/core";import{jsx as cs}from"react/jsx-runtime";var as=1e3,zr=200;function Bt(...e){console.debug("[audio]",...e)}var pt=os(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:g}=t,l=pe(),y=o??l,b=qe(null),R=qe(null),f=qe(null),v=qe(null),d=qe(u);d.current=u;let x=qe(c);x.current=c;let S=He(p=>{f.current!==p&&(f.current=p,x.current?.(p))},[]),k=He(()=>{if(typeof MediaStream>"u")return null;R.current||(R.current=new MediaStream);let p=b.current;return p&&p.srcObject!==R.current&&(p.srcObject=R.current),R.current},[]),m=He(p=>{let w=b.current;if(!w)return;let E=w.play();!E||typeof E.then!="function"||E.then(()=>{w.muted||S(!0)}).catch(L=>{let V=L instanceof Error?L.name:String(L);if(V==="AbortError"){Bt(`play() aborted (${p}); retrying in ${zr}ms`),v.current&&clearTimeout(v.current),v.current=setTimeout(()=>{v.current=null,m(`${p}:retry`)},zr);return}if(V==="NotAllowedError"){Bt(`play() blocked pending a user gesture (${p})`),S(!1);return}Bt(`play() failed (${p})`,L)})},[S]),T=He(p=>{let w=k();if(w){for(let E of w.getAudioTracks())E!==p&&w.removeTrack(E);p&&!w.getAudioTracks().includes(p)&&w.addTrack(p),p&&m("track-attach"),d.current?.(p)}},[k,m]),P=He(()=>{let p=b.current;p&&(k(),p.muted=!1,m("gesture"),Ve(),S(!0))},[k,m,S]);ss(r,()=>({unlock:P,get unlocked(){return f.current===!0},get element(){return b.current}}),[P]);let C=He(p=>{b.current=p,p&&(p.setAttribute("playsinline",""),p.setAttribute("webkit-playsinline",""),k()),g?.(p)},[k,g]),A=s!==void 0;return Wt(()=>{if(A){T(s??null);return}if(!y)return;let p=y.stream(n),w=()=>{let I=R.current;return I?I.getAudioTracks()[0]??null:null},E=I=>{if(I!==w()&&(T(I),I)){let M=()=>{w()===I&&T(null)};I.addEventListener("ended",M)}},L=p.track;L&&L.readyState==="live"&&E(L);let V=p.on("track",I=>{I&&I.readyState!=="live"||E(I)}),H=setInterval(()=>{let I=p.track;I&&I.readyState==="live"&&E(I)},as);return()=>{V(),clearInterval(H)}},[y,n,A,s,T]),Wt(()=>is(()=>{Ve(),f.current===!0&&m("foreground")}),[m]),Wt(()=>()=>{v.current&&clearTimeout(v.current)},[]),cs("audio",{ref:C,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),us=pt;import{forwardRef as ls,useCallback as We,useEffect as Gr,useImperativeHandle as ds,useRef as ke}from"react";import{observePageLifecycle as ps,sessionFailureFromMediaError as ms,sharedCaptureController as fs}from"@urun-sh/core";import{jsx as Ss}from"react/jsx-runtime";var Yr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function mt(...e){console.debug("[voice]",...e)}var ft=ls(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=Yr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:g,onError:l,onMicStream:y,onTrack:b,onUnlockChange:R,capture:f}=t,v=pe(),d=o??v,x=ke(null),S=ke(null),k=ke(null),m=ke([]),T=ke(!1),P=ke(g);P.current=g;let C=ke(l);C.current=l;let A=ke(y);A.current=y;let p=We(M=>{T.current!==M&&(T.current=M,P.current?.(M))},[]),w=We(()=>{for(let M of m.current)M();m.current=[],k.current?.release(),k.current=null,S.current&&(S.current=null,A.current?.(null))},[]),E=We(async()=>{let M=k.current;if(M){let W=await M.update(i);return S.current=M.stream,A.current?.(M.stream),W}let j=await(f??fs()).claim("audio",i);k.current=j,m.current=[j.onTrack((W,J)=>{S.current=J,A.current?.(J),T.current&&d?.stream(n).attach(W).catch(Q=>mt("mic re-attach after one-capture re-acquire failed",Q))}),j.onLost(W=>{k.current=null,m.current=[],S.current=null,A.current?.(null),p(!1),C.current?.(W)})],S.current=j.stream,A.current?.(j.stream);let $=j.track;if(!$)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return $},[f,i,d,n,p]),L=We(async()=>{w(),p(!1),await d?.stream(n).detach().catch(()=>{})},[d,n,w,p]),V=We(async()=>{if(!d)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");x.current?.unlock();let M;try{M=await E()}catch($){w();let W=ms($,d.status);throw C.current?.(W),W}d.connect?.();let F;for(let $=1;$<=u;$++)try{await d.whenLive(a!==void 0?{timeout:a}:void 0),await d.stream(n).attach(M),p(!0);return}catch(W){F=W,mt(`start attempt ${$}/${u} failed`,W),$<u&&await new Promise(J=>setTimeout(J,c))}w(),p(!1);let j=F instanceof Error?F:new Error(String(F??"voice start failed"));throw C.current?.(j),j},[d,n,a,u,c,E,w,p]);ds(r,()=>({start:V,stop:L,unlock:()=>x.current?.unlock(),get active(){return T.current},get micStream(){return S.current},get audio(){return x.current}}),[V,L]);let H=ke(!1),I=We(async()=>{if(!d||!T.current||H.current)return;let M=S.current?.getAudioTracks()[0]??null;if(M&&M.readyState==="live"){try{await d.stream(n).attach(M)}catch(F){mt("foreground mic re-assert failed (will retry on next pass)",F)}return}H.current=!0;try{let F=await E();await d.stream(n).attach(F)}catch(F){let j=F instanceof Error?F:new Error(String(F));mt("foreground mic re-acquire failed",j),C.current?.(j)}finally{H.current=!1}},[d,n,E]);return Gr(()=>{let M=()=>{I()};return d&&typeof d.onRecovery=="function"?d.onRecovery(M):ps(M)},[d,I]),Gr(()=>w,[w]),s?Ss(pt,{ref:x,session:d,stream:n,onTrack:b,onUnlockChange:R}):null}),gs=ft;import{forwardRef as ys,useEffect as ks,useImperativeHandle as bs,useRef as Zr,useState as Rs}from"react";import{useEffect as hs,useState as vs}from"react";var jt={level:0,speaking:!1};function Kt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=vs(jt);return hs(()=>{if(!e){i(jt);return}let a=at();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),b=setInterval(()=>{g.getByteTimeDomainData(l);let R=0;for(let v=0;v<l.length;v++){let d=(l[v]-128)/128;R+=d*d}let f=Math.sqrt(R/l.length);i(v=>{let d=f>n;return Math.abs(v.level-f)<.005&&v.speaking===d?v:{level:f,speaking:d}})},o);return()=>{clearInterval(b),c.disconnect(),i(jt)}},[e,r,o,n]),s}import{Fragment as xs,jsx as gt,jsxs as Cs}from"react/jsx-runtime";var Ts={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},Ps={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},Es=ys(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:y}=t,b=pe(),R=o??b,f=Zr(null),[v,d]=Rs(null),x=Zr(l);x.current=l;let{level:S,speaking:k}=Kt(a?v:null);return bs(r,()=>({start:()=>{let m=f.current;return m?m.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>f.current?.stop()??Promise.resolve(),get active(){return f.current?.active??!1},get micStream(){return f.current?.micStream??null}}),[]),ks(()=>{!i||!R||f.current?.start().catch(()=>{})},[i,R]),Cs(xs,{children:[gt(ft,{ref:f,session:R,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...y!==void 0?{capture:y}:{},onActiveChange:c,onError:g,onMicStream:m=>{d(m),x.current?.(m)}}),a?gt("span",{className:u,style:Ts,"data-urun-mic":"","data-urun-mic-active":v?"true":"false","data-urun-mic-speaking":k?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(S*100)/100,children:gt("span",{style:Ps,children:gt("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(S*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});import{captureStillFromVideo as ws,sessionFailureFromMediaError as Us,sharedCaptureController as As}from"@urun-sh/core";import{forwardRef as en,useCallback as me,useEffect as $t,useImperativeHandle as Ms,useRef as Z,useState as ze}from"react";import{jsx as xe,jsxs as Qr}from"react/jsx-runtime";var tn={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Xt(...e){console.debug("[camera]",...e)}function _s(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function Ns(){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 rn=en(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:y=!1,className:b,videoClassName:R,onActiveChange:f,onError:v,onStream:d,onTrack:x,children:S,capture:k,flipControl:m="auto",flipControlClassName:T,onDevices:P}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let C=i?"user":a?"environment":u??"environment",A=pe(),p=o??A,w=Z(null),E=Z(null),L=Z(null),V=Z([]),H=Z(null),I=Z(!1),M=Z(!1),F=Z(C),[j,$]=ze(C),[W,J]=ze(!1),[Q,X]=ze(null),[q,K]=ze(!1),[ue]=ze(_s),G=Z(f);G.current=f;let ee=Z(v);ee.current=v;let be=Z(d);be.current=d;let te=Z(x);te.current=x;let fe=Z(P);fe.current=P;let re=me(O=>{I.current!==O&&(I.current=O,J(O),G.current?.(O))},[]);$t(()=>{if(!W){X(null);return}let O=!1,D=()=>{Ns().then(ie=>{O||(X(ie),ie&&fe.current?.(ie))})};D();let se=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof se?.addEventListener=="function"?(se.addEventListener("devicechange",D),()=>{O=!0,se.removeEventListener?.("devicechange",D)}):()=>{O=!0}},[W]);let Y=me(O=>{let D=w.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?.(se=>Xt("preview play() failed",se)))},[]),z=me(()=>{M.current=!1,H.current?.(),H.current=null;for(let O of V.current)O();V.current=[],L.current?.release(),L.current=null,E.current&&(E.current=null,be.current?.(null),te.current?.(null)),Y(null)},[Y]),h=me((O,D)=>{H.current?.(),E.current=D,Y(D),be.current?.(D);let se=()=>{E.current===D&&(Xt("camera track ended (device removed or permission revoked)"),z(),re(!1))};O.addEventListener("ended",se),H.current=()=>O.removeEventListener("ended",se)},[Y,z,re]),_=me(async O=>{let D=n!==!1;if(D&&!p)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let se={...tn,...s,facingMode:O},ie;try{let ce=L.current;if(ce)ie=await ce.update(se);else{let Be=await(k??As()).claim("video",se);if(L.current=Be,V.current=[Be.onTrack((je,vn)=>{h(je,vn),I.current&&(!D||!p||p.stream(n).attachVideo(je).then(()=>te.current?.(je)).catch(yn=>Xt("camera re-publish after one-capture re-acquire failed",yn)))}),Be.onLost(je=>{L.current=null,V.current=[],z(),re(!1),ee.current?.(je)})],!Be.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});ie=Be.track}}catch(ce){let Ne=Us(ce,p?.status);throw ee.current?.(Ne),Ne}F.current=O,$(O),h(ie,L.current?.stream??new MediaStream([ie]));try{D&&p&&(p.connect?.(),await p.whenLive(l!==void 0?{timeout:l}:void 0),await p.stream(n).attachVideo(ie)),M.current=D?n:!1}catch(ce){z(),re(!1);let Ne=ce instanceof Error?ce:new Error(String(ce));throw ee.current?.(Ne),Ne}te.current?.(ie),re(!0)},[p,n,s,l,k,h,z,re]),U=me(O=>_(O?.facingMode??F.current),[_]),B=me(async O=>{let D=M.current===n;I.current&&F.current===O&&D||await _(O)},[_,n]),oe=me(()=>_(F.current==="environment"?"user":"environment"),[_]),ge=me(async()=>{z(),re(!1),n!==!1&&await p?.stream(n).detachVideo().catch(()=>{})},[p,n,z,re]),N=me(async O=>{let D=w.current;if(!D)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await ws(D,O)},[]);Ms(r,()=>({start:U,stop:ge,flip:oe,setFacingMode:B,capturePhoto:N,get active(){return I.current},get facingMode(){return F.current},get stream(){return E.current},get element(){return w.current}}),[U,ge,oe,B,N]);let Se=Z(B);if(Se.current=B,$t(()=>{c&&(n!==!1&&!p||Se.current(C).catch(()=>{}))},[c,p,C,n]),$t(()=>z,[z]),!y)return null;let _e=g==="auto"?j==="user":g,he=W&&(m===!0||m==="auto"&&ue&&(Q?.length??0)>1),ve=()=>{q||(K(!0),oe().catch(()=>{}).finally(()=>K(!1)))};return Qr("div",{className:b,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":j,children:[xe("video",{ref:w,className:R,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",..._e?{transform:"scaleX(-1)"}:{}}}),he?xe("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:ve,disabled:q,className:T,style:T?{opacity:q?.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:q?.6:1},children:Qr("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:[xe("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),xe("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),xe("path",{d:"M14.5 10.5v1.6h-1.6"}),xe("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),xe("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,S]})}),Ls=en(function({preview:t=!0,...r},o){return xe(rn,{ref:o,...r,visible:t,autoStart:!1})});import{cameraCaptureAvailable as Is,normalizeReferenceImage as Os,referenceImageErrorMessage as Ds}from"@urun-sh/core";import{useCallback as Ge,useEffect as Vs,useRef as Jt,useState as Ye}from"react";function Fs(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=Ye(null),[a,u]=Ye(null),[c,g]=Ye(!1),[l,y]=Ye(null),[b]=Ye(Is),R=Jt(n);R.current=n;let f=Jt(null),v=Jt(0),d=Ge(T=>{f.current&&URL.revokeObjectURL(f.current),f.current=T?URL.createObjectURL(new Blob([T.bytes],{type:T.type})):null,u(f.current),i(T),R.current?.(T)},[]);Vs(()=>()=>{v.current++,f.current&&URL.revokeObjectURL(f.current),f.current=null},[]);let x=Ge(async T=>{let P=++v.current;g(!0),y(null);try{let C=await T();if(v.current!==P)return;d(C)}catch(C){if(v.current!==P)return;y(Ds(C))}finally{v.current===P&&g(!1)}},[d]),S=Ge(T=>x(()=>Os(T,{maxSize:t,type:r,quality:o,source:"file"})),[x,t,r,o]),k=Ge(T=>x(()=>T.capturePhoto({maxSize:t,type:r,quality:o})),[x,t,r,o]),m=Ge(()=>{v.current++,y(null),g(!1),d(null)},[d]);return{reference:s,previewUrl:a,pick:S,capture:k,clear:m,busy:c,error:l,cameraAvailable:b}}import{useEffect as Hs,useState as qs}from"react";function Ws(e,t){let[r,o]=qs(null);return Hs(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}import{useCallback as Js}from"react";import{useEffect as $s,useMemo as Xs}from"react";import{createStore as Bs}from"zustand/vanilla";import{useStore as js}from"zustand";var Ks=()=>{};function zt(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=Bs(()=>({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):Ks,u=(c=>js(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 Ze(e,t){let r=Xs(()=>zt(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return $s(()=>r.bind(),[r]),r}function zs(e,t,r){let n=Ze(e,t)(r??(a=>a)),s=Js(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 Gs,useState as Ys}from"react";var Ue=200;function Ce(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function Qe(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Gt(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 Yt(e,t,r={}){let o=r.cap??200,[n,s]=Ys([]);return Gs(()=>{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=>Ce(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}import{jsx as St,jsxs as et}from"react/jsx-runtime";function Zs({session:e,name:t,cap:r,className:o}){let n=Yt(e,t,{cap:r});return et("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[et("div",{className:"urun-stream-tail-meta",children:[St("code",{children:t}),et("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),St("div",{className:"urun-stream-tail-log",children:n.length===0?et("span",{className:"urun-stream-tail-empty",children:["Waiting for ",St("code",{children:t})," messages\u2026"]}):n.map((s,i)=>et("div",{className:"urun-stream-tail-line",children:[St("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",Qe(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as Qs,useState as nn}from"react";import{jsx as Ae,jsxs as ht}from"react/jsx-runtime";function vt({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=nn(""),[i,a]=nn(null),u=Qs(()=>{let c=Gt(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return ht("div",{className:"urun-doc-patch",children:[Ae("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),ht("div",{className:"urun-doc-patch-actions",children:[Ae("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?Ae("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function ei({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=Ze(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return ht("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[ht("div",{className:"urun-doc-panel-meta",children:[Ae("code",{children:t}),Ae("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),Ae("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?Ae(vt,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}import{useEffect as ti,useState as ri}from"react";import{jsx as tt,jsxs as sn}from"react/jsx-runtime";function on(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function ni({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=ri([]);return ti(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>Ce(u,{at:Date.now(),direction:"in",text:on(Qe(a))},r))}):void 0),[e,t,r]),sn("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[tt(vt,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>Ce(u,{at:Date.now(),direction:"out",text:on(a)},r))}}),tt("div",{className:"urun-control-sender-log",children:n.length===0?tt("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>sn("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[tt("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",tt("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}import{useEffect as oi,useState as si}from"react";import{jsx as yt,jsxs as ai}from"react/jsx-runtime";function ii({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=si([]),a=t.join(","),u=r.join(",");return oi(()=>{if(i([]),!e)return;let c=(l,y)=>i(b=>Ce(b,{at:Date.now(),kind:l,text:y},o)),g=[];g.push(e.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of t){let y=e.stream(l);g.push(y.on("track",b=>c("track",`${l}: ${b?"track arrived":"track ended"}`)))}for(let l of r){let y=e.doc(l);g.push(y.on("change",()=>c("doc",`${l} changed`)))}return()=>g.forEach(l=>l())},[e,a,u,o]),yt("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?yt("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,g)=>ai("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[yt("span",{className:"urun-event-spine-kind",children:c.kind})," ",yt("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${g}`))})}import{describeSessionPhase as Ri,isWakingPhase as Ti}from"@urun-sh/core";import{useEffect as ui,useState as ci}from"react";function le(e){let[t,r]=ci(e?.phase??null);return ui(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}import{describeSessionPhase as fi}from"@urun-sh/core";import{useEffect as li,useRef as di,useState as pi}from"react";import{isWakingPhase as mi}from"@urun-sh/core";function Zt(e){let t=le(e),r=mi(t?.name),o=di(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]=pi(s);return li(()=>{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 gi,jsx as an,jsxs as un}from"react/jsx-runtime";function Qt({session:e,render:t,className:r}){let o=Zt(e);return!o.waking||!o.phase?null:an("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):un(gi,{children:[an("span",{className:"urun-session-waking-label",children:fi(o.phase)})," ",un("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}import{useEffect as vi,useState as yi}from"react";import{useEffect as cn,useRef as Si,useState as ln}from"react";var hi={event:null,elapsedMs:0};function er(e,t){let[r,o]=ln(null),n=Si(0);cn(()=>{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]=ln(0);return cn(()=>{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}:hi}import{jsx as dn,jsxs as pn}from"react/jsx-runtime";var ki={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 bi(e){let[t,r]=yi(!1);return vi(()=>{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 tr({session:e,stream:t,videoElement:r,render:o,className:n}){let s=er(e,t),i=bi(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return dn("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):pn("div",{className:"urun-activation-overlay-card",children:[dn("span",{className:"urun-activation-overlay-copy",children:a.hint??ki[u]})," ",pn("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}import{jsx as Me,jsxs as rr}from"react/jsx-runtime";var Pi={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired"};function Ei({session:e,className:t}){let r=le(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 rr("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[Me("span",{className:"urun-session-status-dot","data-phase":o}),Me("span",{className:"urun-session-status-label",children:Pi[o]}),n?Me("span",{className:"urun-session-status-detail",children:n}):null]})}function xi({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=le(e);if(s?.name==="live")return rr("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,Me(tr,{session:e})]});let i=r?r(s):Me("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&Ti(s.name)?Me(Qt,{session:e}):s&&s.name!=="idle"?Ri(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return rr("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?Me("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}import{useEffect as Ci,useState as wi}from"react";import{jsx as Mi}from"react/jsx-runtime";function mn(e){return le(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 Ai({session:e,urgentMs:t=6e4,className:r}){let n=mn(e)?.getTime()??null,[s,i]=wi(()=>n===null?null:Math.max(0,n-Date.now()));if(Ci(()=>{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 Mi("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 fn,jsxs as Li}from"react/jsx-runtime";var _i=new Set(["expired","ended","error"]);function Ni({session:e,onNewSession:t,children:r,className:o}){let n=le(e);if(!n||!_i.has(n.name))return null;let s=r?r(n):fn("span",{className:"urun-session-ended-copy",children:n.name==="expired"?"Session ended \u2014 start a new session":n.name==="error"?`Session failed${n.error?.reason?` \u2014 ${n.error.reason}`:""}.`:"Session ended."});return Li("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?fn("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}import{useEffect as gn,useMemo as Ii,useState as Sn}from"react";import{jsx as kt,jsxs as Vi}from"react/jsx-runtime";function nr(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 hn(e){let t=Ii(()=>e?e.doc("control"):null,[e]),[r,o]=Sn(()=>t?nr(t.get("idle")):null);return gn(()=>{if(!t){o(null);return}return o(nr(t.get("idle"))),t.on("change",()=>o(nr(t.get("idle"))))},[t]),r}function Oi(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function Di({session:e,onStillHere:t,className:r}){let o=hn(e),n=o?.deadlineEpochS??null,[s,i]=Sn(null);if(gn(()=>{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 kt("div",{className:["urun-idle-warning",r].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:Vi("div",{className:"urun-idle-warning-card",children:[kt("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),kt("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${Oi(s)} due to inactivity.`:"This session will end soon due to inactivity."}),kt("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}import{useContext as Fi,useEffect as Hi,useState as qi}from"react";import{prewake as Wi}from"@urun-sh/core";function Bi(e){let t=Fi(Le),[r,o]=qi(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 Hi(()=>{if(!a||!u||!n||!s)return;let y=!1,b=()=>{Wi({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:g,authProvider:l}).then(f=>{y||o(f)}).catch(()=>{})};b();let R=setInterval(b,Math.max(1,i)*1e3);return()=>{y=!0,clearInterval(R)}},[n,s,i,a,u,c,g,l]),r}import{useEffect as ji,useState as Ki}from"react";function $i(e){let[t,r]=Ki(null);return ji(()=>{if(r(null),!!e?.onStats)return e.onStats(r)},[e]),t}import{describeSessionPhase as dd,isWakingPhase as pd}from"@urun-sh/core";export{pt as Audio,rn as Camera,wo as ComponentRenderer,tn as DEFAULT_CAMERA_CONSTRAINTS,Ue as DEFAULT_LOG_CAP,Kr as DEFAULT_SMOOTH_CHARS_PER_FRAME,$r as DEFAULT_SMOOTH_THRESHOLD,Yr as DEFAULT_VOICE_CONSTRAINTS,vt as DocPatchForm,rs as Image,qo as ImageFrame,Ho as ImageFrameSchema,jo as MetricsPanel,Bo as MetricsPanelSchema,Es as Mic,wn as OPERATOR_CHORD_LABEL,Cn as OPERATOR_TOKEN_STORAGE_KEY,Mo as ProgressCard,Ao as ProgressCardSchema,Eo as ReprojectedVideo,po as Session,Lo as StatusBadge,_o as StatusBadgeSchema,Qo as Text,Vo as TextStream,Je as TextStreamError,Do as TextStreamSchema,tr as UrunActivationOverlay,us as UrunAudio,bt as UrunAuthProvider,Ls as UrunCamera,ni as UrunControlSender,ei as UrunDocPanel,Ke as UrunErrorBoundary,ii as UrunEventSpine,Di as UrunIdleWarning,kn as UrunJwtProvider,Dn as UrunProvider,Ai as UrunSessionClock,Ni as UrunSessionEnded,xi as UrunSessionGate,Ei as UrunSessionStatus,Qt as UrunSessionWaking,Zs as UrunStreamTail,gs as UrunVoice,Fe as Video,ft as Voice,rt as authMode,zt as createDocStore,dd as describeSessionPhase,Qe as formatPayload,at as getUrunAudioContext,pd as isWakingPhase,Gt as parseJsonObject,Ce as pushCapped,ur as readOperatorToken,Co as registerComponent,Ve as resumeUrunAudioContext,jr as textDelta,de as urunPublicEnv,er as useActivation,Kn as useApp,no as useChat,Qn as useCompletion,Pt as useConfirmOnLeave,Ze as useDocStore,Wr as useImageFrame,uo as useInputPresence,Br as useMetricsPanel,Tt as useOperatorOverride,Ir as useProgressCard,Fs as useReferenceImage,zn as useRequest,mo as useSession,zs as useSessionDoc,mn as useSessionEndsAt,hn as useSessionIdle,le as useSessionPhase,$i as useSessionStats,Ws as useSessionTrack,Zt as useSessionWake,Dr as useStatusBadge,Yt as useStreamMessages,Jr as useText,Zo as useTextMeter,Hr as useTextStream,Kt as useUrunAudioLevel,Rt as useUrunAuth,Bi as useUrunPrewake,Pn as usesWorkOSAuth};
2
+ import{a as bt,b as kn,c as Rt}from"./chunk-WF2OBDSX.mjs";import{useCallback as cr,useEffect as _n,useMemo as mr,useRef as lr,useState as Et}from"react";import{Component as bn}from"react";import{jsx as or,jsxs as Rn}from"react/jsx-runtime";var Ke=class extends bn{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||Rn("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:[or("p",{style:{margin:0,fontWeight:600},children:"Connection interrupted"}),or("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:"Reconnecting automatically."})]})}return this.props.children}};import{createContext as Tn}from"react";var Le=Tn(null);function ye(e){return e&&e.trim()?e.trim():void 0}function de(e){switch(e){case"NEXT_PUBLIC_AUTH_MODE":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_MODE:void 0);case"NEXT_PUBLIC_AUTH_ENABLED":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_AUTH_ENABLED:void 0);case"NEXT_PUBLIC_SESSION_AUTH_PROVIDER":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_AUTH_PROVIDER:void 0);case"NEXT_PUBLIC_SESSION_TOKEN":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_SESSION_TOKEN:void 0);case"NEXT_PUBLIC_URUN_JWT":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_JWT:void 0);case"NEXT_PUBLIC_URUN_TOKEN_URL":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_TOKEN_URL:void 0);case"NEXT_PUBLIC_URUN_EVENTS_URL":return ye(typeof process<"u"?process.env?.NEXT_PUBLIC_URUN_EVENTS_URL:void 0);case"VERCEL_ENV":return ye(typeof process<"u"?process.env?.VERCEL_ENV:void 0);default:return ye(typeof process<"u"?process.env?.[e]:void 0)}}function rt(){let e=de("NEXT_PUBLIC_AUTH_MODE")?.toLowerCase();return e==="jwt"||e==="customer-jwt"||e==="test-jwt"?"jwt":e==="workos"||de("VERCEL_ENV")==="production"?"workos":de("NEXT_PUBLIC_AUTH_ENABLED")==="false"?"jwt":"workos"}function Pn(){return rt()==="workos"}import{useEffect as En,useRef as xn}from"react";var Cn="urun.operator_token",ir=null,sr="op",wn="\u2318\u21E7\u23CE (Ctrl+Shift+Enter)";function ar(){return typeof window<"u"}function ur(){return ir}function Un(){if(!ar())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(sr);if(!r)return null;ir=r,t.delete(sr);let o=t.toString(),n=window.location.pathname+window.location.search+(o?`#${o}`:"");try{window.history.replaceState(null,"",n)}catch{}return r}function An(e){return(e.metaKey||e.ctrlKey)&&e.shiftKey&&!e.altKey&&e.key==="Enter"}function Tt(e){let t=xn(e);t.current=e,En(()=>{if(!ar())return;Un();let r=o=>{if(!An(o))return;let n=ur();n&&(o.preventDefault(),o.stopPropagation(),t.current(n))};return window.addEventListener("keydown",r),()=>window.removeEventListener("keydown",r)},[])}import{useEffect as Mn}from"react";function Pt(e=!0){Mn(()=>{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 Ie,jsxs as Vn}from"react/jsx-runtime";var Nn="/api/urun-token",Ln=1e4;function In(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 dr(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 pr(e,t){if(t===void 0)return;let r;try{r=new URL(t).hostname}catch{throw new Error(`[urun] ${e} is not a valid URL: ${t}`)}if(!(r==="127.0.0.1"||r==="localhost"||r==="::1"||r==="[::1]"))throw new Error(`[urun] ${e} must point at a loopback endpoint \u2014 the CLI launcher (urun dev/demo) is this variable's only legitimate producer and it must never be set on a deployed site. Refusing ${t}.`);return t}function xt(e){let t=e===void 0?void 0:JSON.stringify(e);return mr(()=>e,[t])}function On(e,t){return typeof e=="function"?e(t):e!==void 0?e:Vn("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:[Ie("p",{style:{margin:0,fontWeight:600},children:"Sign-in failed"}),Ie("p",{style:{margin:"6px 0 0",color:"#4b5563"},children:t.message})]})}function Dn({baseUrl:e,orgId:t,app:r,appId:o,jwt:n,authProvider:s,eventsUrl:i,sessionKey:a,tokenEndpoint:u,releaseOnLeave:c,audioPlayout:g,videoPlayout:l,sessionStats:y,confirmOnLeave:b=!1,fallback:R,errorFallback:f,children:v}){let d=n===void 0&&t===void 0;if(!d&&(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(!d&&(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 x=r??o;if(d&&(typeof x!="string"||x.trim().length===0))throw new Error(`[urun] <UrunProvider> requires app \u2014 hardcode your app name, mirroring the backend's App("..."): <UrunProvider app="rolling-sink">.`);Pt(b);let[S,k]=Et(),[m,T]=Et(null),P=lr(void 0),C=lr(null),[A,p]=Et(null);Tt(h=>p({jwt:h}));let w=Rt(),E=de("NEXT_PUBLIC_SESSION_TOKEN")??de("NEXT_PUBLIC_URUN_JWT"),L=rt(),V=A!==null,H=L==="workos"&&!n&&!V&&!d,I=n??(L==="jwt"?E:void 0)??S?.token,M=V?A.jwt:I,F=s??de("NEXT_PUBLIC_SESSION_AUTH_PROVIDER"),j=H&&!M&&!w?.getAccessToken,$=t??S?.orgId,W=e??S?.gatewayUrl,z=d&&S===void 0,Q=d&&S!==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,X=j?new Error('[urun] <UrunProvider> resolved authMode()="workos" but no auth context is mounted: there is no <UrunWorkOSProvider> (or <UrunAuthProvider>) ancestor supplying getAccessToken, and no jwt prop was passed, so no session token can be obtained. Note NEXT_PUBLIC_SESSION_TOKEN and NEXT_PUBLIC_URUN_JWT are IGNORED in workos mode, so setting them will not help. Either mount UrunWorkOSProvider from @urun-sh/react/next-workos, or select jwt mode with NEXT_PUBLIC_AUTH_MODE=jwt (or NEXT_PUBLIC_AUTH_ENABLED=false) and supply a token.'):null,q=m??Q??X,K=pr("NEXT_PUBLIC_URUN_TOKEN_URL",de("NEXT_PUBLIC_URUN_TOKEN_URL"))??u??Nn,ue=pr("NEXT_PUBLIC_URUN_EVENTS_URL",de("NEXT_PUBLIC_URUN_EVENTS_URL"))??i,G=cr(async h=>{if(!h?.forceRefresh){let U=P.current;if(!U)return U;let B=In(U);if(B===null||B-Date.now()>Ln)return U}return(await(C.current??(C.current=(async()=>{try{let U=await dr(K);return P.current=U.token,k(U),U}finally{C.current=null}})()))).token},[K]),ee=cr(async()=>M,[M]),be=typeof M=="string"&&M.trim().length>0,te=H?w?.getAccessToken:d&&!V?G:be?ee:void 0,fe=xt(g),re=xt(l),Y=xt(y),J=mr(()=>({appId:x,baseUrl:W??"",orgId:$??"",jwt:M,getAccessToken:H?w?.getAccessToken:d&&!V?G:void 0,authProvider:F,eventsUrl:ue,sessionKey:a,releaseOnLeave:c,audioPlayout:fe,videoPlayout:re,sessionStats:Y,priority:V?"preempt":void 0}),[x,w,W,F,M,ue,$,a,c,fe,re,Y,H,V,d,G]);return _n(()=>{if(!d)return;let h=new AbortController;return T(null),(async()=>{try{let _=await dr(K,h.signal);P.current=_.token,k(_)}catch(_){if(h.signal.aborted)return;T(_ instanceof Error?_:new Error(String(_)))}})(),()=>h.abort()},[d,K]),Ie(Ke,{fallback:R,children:q?On(f,q):z?Ie("div",{role:"status","aria-live":"polite",children:"Signing in..."}):Ie(Le.Provider,{value:J,children:te?Ie(bt,{getAccessToken:te,children:v}):v})})}import{useContext as Fn,useEffect as Hn,useMemo as fr,useReducer as qn,useRef as Ct}from"react";import{App as Wn}from"@urun-sh/core";function Bn(e,t){return`${e}:${JSON.stringify(t??{})}`}function jn(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 we=new Map;var wt=class{constructor(t,r){this._doc=t;this._notify=r;this._unsubscribeChange=this._doc.on("change",()=>this._notify())}_doc;_notify;_unsubscribeChange;get(t,r){return this._doc.get(t,r)}set(t){this._doc.set(t),this._notify()}on(t,r){return this._doc.on(t,o=>r(o))}get synced(){return this._doc.synced}onSynced(t){return this._doc.onSynced(()=>{t(),this._notify()})}onConnectionState(t){return this._doc.onConnectionState?this._doc.onConnectionState(r=>{t(r),this._notify()}):(t({connected:!0,consecutiveFailures:0,lastCloseCode:null,lastCloseReason:null}),()=>{})}text(t){let r=this._doc.text(t),o=this._notify;return{append(n){r.append(n),o()},toString:()=>r.toString(),get length(){return r.length},on:(n,s)=>r.on(n,i=>{s(i),o()})}}dispose(){this._unsubscribeChange()}},Ut=class{constructor(t,r){this._stream=t;this._notify=r;this._unsubscribeTrack=this._stream.on("track",()=>this._notify())}_stream;_notify;_unsubscribeTrack;get track(){return this._stream.track}attach(t){return this._stream.attach(t)}attachVideo(t){return this._stream.attachVideo(t)}detach(){return this._stream.detach()}detachVideo(){return this._stream.detachVideo()}seek(t){return this._stream.seek(t)}chunks(t){return this._stream.chunks(t)}onSeeked(t){return this._stream.onSeeked(t)}on(t,r){return this._stream.on(t,r)}messages(){return this._stream.messages()}emit(t,r){return this._stream.emit(t,r)}dispose(){this._unsubscribeTrack()}},At=class{constructor(t,r,o){this._session=t;this._notifiers.add(r),this._unsubscribePhase=this._session.onPhase(()=>this._notifyAll()),o&&this._attachReporter(o)}_session;_docs=new Map;_streams=new Map;_unsubscribePhase;_unsubscribeReporterDiagnostic=null;_notifiers=new Set;_disposed=!1;get disposed(){return this._disposed}_attachReporter(t){let r=!1,o=!1,n=a=>{fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a),keepalive:!0}).catch(()=>{o||(o=!0,console.debug("[urun] unable to forward session events"))})};this._unsubscribeReporterDiagnostic=this._session.onDiagnostic(n);let s=this._session.onPhase(a=>{if(a.name==="error"||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)}onStats(t){return this._session.onStats?this._session.onStats(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 wt(this._session.doc(t),()=>this._notifyAll()),this._docs.set(t,r)),r}stream(t){let r=this._streams.get(t);return r||(r=new Ut(this._session.stream(t),()=>this._notifyAll()),this._streams.set(t,r)),r}async end(){let t=await this._session.end();return this._disposeHandle(),t}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 Kn(){let e=Fn(Le);if(!e)throw new Error("useApp must be used within <UrunProvider>");if(!e.appId)throw new Error('useApp requires <UrunProvider appId="...">');let[,t]=qn(i=>i+1,0),r=Ct(new Map),o=Ct(new Map),n=Ct(null),s=fr(()=>Wn(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,audioPlayout:e.audioPlayout,videoPlayout:e.videoPlayout,sessionStats:e.sessionStats}),[e.appId,e.baseUrl,e.orgId,e.jwt,e.getAccessToken,e.authProvider,e.sessionKey,e.releaseOnLeave,e.priority,e.audioPlayout,e.videoPlayout,e.sessionStats]);return Hn(()=>{let i=n.current;if(i){n.current=null;for(let[a,u]of i){let c=we.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=we.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=we.get(u);!l||l.refCount!==0||(we.delete(u),l.handle.disconnect())},0)))}n.current=a}},[]),fr(()=>{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 y=Bn(u,l),b=r.current.get(y);if(b&&!b.disposed)return b;let R=jn(e,u,l),f=we.get(R);return f?.handle.disposed&&(f.disposeTimer&&clearTimeout(f.disposeTimer),we.delete(R),o.current.get(R)===f&&o.current.delete(R),f=void 0),f?f.disposeTimer&&(clearTimeout(f.disposeTimer),f.disposeTimer=null):(f={handle:new At(s[u](l),t,e.eventsUrl),refCount:0,disposeTimer:null},we.set(R,f)),o.current.get(R)!==f&&(o.current.set(R,f),f.handle.addNotifier(t),f.refCount+=1),r.current.set(y,f.handle),f.handle};return i.set(u,g),g}})},[e,s])}import{useCallback as Mt,useEffect as $n,useMemo as Xn,useRef as nt,useState as _t}from"react";function Oe(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 zn(e){return e instanceof Error?e:new Error(String(e))}function Jn(e,t){let r=Xn(()=>Oe(e),[e]),[o,n]=_t(void 0),[s,i]=_t(null),[a,u]=_t(!1),c=nt(t);c.current=t;let g=nt(0),l=nt(null),y=nt(!0);$n(()=>(y.current=!0,()=>{y.current=!1,l.current?.abort()}),[]);let b=Mt(async v=>{l.current?.abort();let d=new AbortController;l.current=d;let x=++g.current,S=()=>y.current&&g.current===x;S()&&(u(!0),i(null));try{let k=await r.request(v,{...c.current,signal:d.signal});return S()&&(n(k),u(!1),c.current?.onSuccess?.(k)),k}catch(k){let m=zn(k);throw S()&&(i(m),u(!1),c.current?.onError?.(m)),m}},[r]),R=Mt(v=>{b(v).catch(()=>{})},[b]),f=Mt(()=>{g.current++,l.current?.abort(),l.current=null,n(void 0),i(null),u(!1)},[]);return{mutate:R,mutateAsync:b,data:o,error:s,isPending:a,reset:f}}import{useCallback as gr,useEffect as Gn,useMemo as Yn,useRef as ot,useState as Nt}from"react";function Sr(e){return e instanceof Error?e:new Error(String(e))}var Zn=e=>typeof e=="string"?e:String(e);function Qn(e,t){let r=Yn(()=>Oe(e),[e]),[o,n]=Nt(""),[s,i]=Nt(!1),[a,u]=Nt(null),c=ot(t);c.current=t;let g=ot(0),l=ot(null),y=ot(!0);Gn(()=>(y.current=!0,()=>{y.current=!1,l.current?.cancel(),l.current=null}),[]);let b=gr(()=>{g.current++,l.current?.cancel(),l.current=null,y.current&&i(!1)},[]),R=gr(async f=>{l.current?.cancel();let v=++g.current,d=()=>y.current&&g.current===v,x=c.current,S=x?.parseChunk??Zn,k=x?.buildPayload??(E=>({prompt:E}));d()&&(n(""),u(null),i(!0));let{parseChunk:m,buildPayload:T,onFinish:P,onError:C,...A}=x??{},p="",w;try{w=r.requestStream(k(f),A),l.current=w}catch(E){let L=Sr(E);d()&&(u(L),i(!1),x?.onError?.(L));return}try{for await(let E of w){if(g.current!==v)break;p+=S(E),d()&&n(p)}d()&&(i(!1),x?.onFinish?.(p))}catch(E){let L=Sr(E);d()&&(u(L),i(!1),x?.onError?.(L))}finally{l.current===w&&(l.current=null)}},[r]);return{completion:o,complete:R,stop:b,isStreaming:s,error:a}}import{useCallback as hr,useEffect as eo,useMemo as to,useRef as De,useState as st}from"react";function vr(e){return e instanceof Error?e:new Error(String(e))}var ro=e=>typeof e=="string"?e:String(e),yr=0;function Lt(e){return yr+=1,`${e}-${yr}`}function no(e,t){let r=to(()=>Oe(e),[e]),[o,n]=st(()=>(t?.initialMessages??[]).map(S=>({id:S.id??Lt("msg"),role:S.role,content:S.content}))),[s,i]=st(""),[a,u]=st(!1),[c,g]=st(null),l=De(t);l.current=t;let y=De(o);y.current=o;let b=De(s);b.current=s;let R=De(0),f=De(null),v=De(!0);eo(()=>(v.current=!0,()=>{v.current=!1,f.current?.cancel(),f.current=null}),[]);let d=hr(()=>{R.current++,f.current?.cancel(),f.current=null,v.current&&u(!1)},[]),x=hr(async S=>{let k=S===void 0,m=(k?b.current:S)??"";if(!m.trim())return;f.current?.cancel();let P=++R.current,C=()=>v.current&&R.current===P,A=l.current,p=A?.parseChunk??ro,w={id:Lt("msg"),role:"user",content:m},E={id:Lt("msg"),role:"assistant",content:""},L=[...y.current,w].map(q=>({role:q.role,content:q.content})),V=[...y.current,w,E];y.current=V,n(V),k&&i(""),g(null),u(!0);let H=A?.buildPayload??(q=>({messages:q})),{initialMessages:I,parseChunk:M,buildPayload:F,onFinish:j,onError:$,...W}=A??{},z=q=>{n(K=>K.map(ue=>ue.id===E.id?{...ue,content:q}:ue))},Q="",X;try{X=r.requestStream(H(L),W),f.current=X}catch(q){let K=vr(q);C()&&(g(K),u(!1),A?.onError?.(K));return}try{for await(let q of X){if(R.current!==P)break;Q+=p(q),C()&&z(Q)}C()&&(u(!1),A?.onFinish?.({...E,content:Q}))}catch(q){let K=vr(q);C()&&(g(K),u(!1),A?.onError?.(K))}finally{f.current===X&&(f.current=null)}},[r]);return{messages:o,input:s,setInput:i,sendMessage:x,stop:d,isStreaming:a,error:c}}import{useCallback as Re,useEffect as kr,useMemo as oo,useRef as br,useState as Rr}from"react";import{createInputPresencePublisher as so,INPUT_PRESENCE_DEFAULT_HZ as io,INPUT_PRESENCE_FIELD as ao}from"@urun-sh/core";var It=[];function uo(e,t={}){let{field:r=ao,hz:o=io}=t,n=t.documentTarget!==void 0?t.documentTarget:typeof document<"u"?document:null,s=e?.presence??null,i=oo(()=>s?so({awareness:{setLocalStateField:(m,T)=>s.setField(m,T)},field:r,hz:o}):null,[s,r,o]),a=br(null);a.current=i;let[u,c]=Rr(!1),[g,l]=Rr(It),y=br(!1);kr(()=>{if(i)return()=>i.dispose()},[i]);let b=Re(()=>{let m=a.current;l(m?m.heldKeys():It)},[]),R=Re(()=>{a.current?.clear(),l(It)},[]);kr(()=>{if(!n)return;let m=()=>!!n.pointerLockElement,T=()=>{if(m()){y.current=!1,c(!0);return}y.current||(c(!1),R())},P=E=>{m()&&(a.current?.keyDown(E.key),b())},C=E=>{a.current?.keyUp(E.key),b()},A=E=>{m()&&a.current?.movePointer(E.movementX,E.movementY)},p=E=>{m()&&a.current?.setButtons(E.buttons)},w=()=>{R()};return n.addEventListener("pointerlockchange",T),n.addEventListener("keydown",P),n.addEventListener("keyup",C),n.addEventListener("mousemove",A),n.addEventListener("mousedown",p),n.addEventListener("mouseup",p),n.defaultView?.addEventListener("blur",w),()=>{n.removeEventListener("pointerlockchange",T),n.removeEventListener("keydown",P),n.removeEventListener("keyup",C),n.removeEventListener("mousemove",A),n.removeEventListener("mousedown",p),n.removeEventListener("mouseup",p),n.defaultView?.removeEventListener("blur",w)}},[n,R,b]);let f=Re(m=>{m.requestPointerLock?.()},[]),v=Re(()=>{y.current=!0,c(!0)},[]),d=Re(()=>{y.current=!1,n?.pointerLockElement&&n.exitPointerLock?.(),c(!1),R()},[n,R]),x=Re(m=>{a.current?.keyDown(m),b()},[b]),S=Re(m=>{a.current?.keyUp(m),b()},[b]),k=Re((m,T)=>{a.current?.movePointer(m,T)},[]);return{engage:f,engageTouch:v,release:d,engaged:u,heldKeys:g,pressKey:x,releaseKey:S,movePointer:k}}import{forwardRef as ko,useEffect as Ar,useImperativeHandle as bo,useMemo as Ro,useRef as ut}from"react";import{createCameraWarp as To}from"@urun-sh/core";import{forwardRef as go,useCallback as Te,useEffect as $e,useImperativeHandle as So,useRef as ne,useState as Pr}from"react";import{derivedLegRole as ho}from"@urun-sh/core";var it=null;function co(){if(typeof window>"u")return null;let e=window;return e.AudioContext??e.webkitAudioContext??null}function at(){if(it)return it;let e=co();return e?(it=new e,it):null}function Ve(){let e=at();e&&e.state==="suspended"&&e.resume().catch(()=>{})}import{createContext as lo,useContext as Tr}from"react";import{jsx as fo}from"react/jsx-runtime";var Ot=lo(null);function po({session:e,children:t}){return fo(Ot.Provider,{value:e,children:t})}function pe(){return Tr(Ot)}function mo(){let e=Tr(Ot);if(!e)throw new Error("[urun] useSession() needs a mounted <Session session={...}> ancestor with a non-null session \u2014 create one with useApp() (e.g. app.generate({...})) and pass it to the scope.");return e}import{jsx as Ur,jsxs as yo}from"react/jsx-runtime";function vo(e,t){return e-t>>>0<2147483648}var Er=1e3;function xr(...e){console.debug("[video]",...e)}function Cr(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 wr(e,t,r){return r?[r,t]:[e,t]}var Fe=go(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:y,placeholder:b,poster:R,children:f,onTrack:v,onFirstFrame:d,frameMarker:x,onFrameMarkerReached:S,onFrameMarkerUnsupported:k,onUnlockChange:m}=t,T=pe(),P=o??T,C=ne(null),A=ne(null),[p,w]=Pr(!1),[E,L]=Pr(!1),V=ne(!1),H=ne(null),I=ne(v);I.current=v;let M=ne(m);M.current=m;let F=ne(d);F.current=d;let j=ne(S);j.current=S;let $=ne(k);$.current=k;let W=ne(x??null);W.current=x??null;let z=Te(h=>{H.current!==h&&(H.current=h,M.current?.(h))},[]),Q=ne(null),X=ne(null),q=Te((h,_=!1)=>{if(!_&&h===Q.current||(Q.current=h,X.current?.(),X.current=null,V.current=!1,L(!1),!h))return;let U=C.current;if(!U)return;let B=W.current,oe=B?.rtpTimestamp??null,ge=!1,N=()=>{ge||(ge=!0,$.current?.())};B&&oe==null&&N();let Se=B!=null&&oe!=null,_e=ve=>{X.current?.(),X.current=null,V.current=!0,L(!0),F.current?.(),ve&&j.current?.()};if(typeof U.requestVideoFrameCallback=="function"){let ve=!1,O=0,D=(se,ie)=>{if(!ve){if(Se){let ce=ie?.rtpTimestamp;if(typeof ce!="number"){N(),_e(!1);return}if(!vo(ce,oe)){O=U.requestVideoFrameCallback(D);return}_e(!0);return}_e(!1)}};O=U.requestVideoFrameCallback(D),X.current=()=>{ve=!0,U.cancelVideoFrameCallback?.(O)};return}Se&&N();let he=()=>{let ve=U.getVideoPlaybackQuality?.();(ve?ve.totalVideoFrames>0:U.readyState>=2&&U.videoWidth>0)&&_e(!1)};U.addEventListener("loadeddata",he),U.addEventListener("timeupdate",he),U.addEventListener("playing",he),X.current=()=>{U.removeEventListener("loadeddata",he),U.removeEventListener("timeupdate",he),U.removeEventListener("playing",he)},he()},[]);$e(()=>()=>{X.current?.(),X.current=null},[]);let K=x==null?null:`${x.rtpTimestamp??""}|${x.ptsMs??""}`,ue=ne(K);$e(()=>{if(ue.current===K||(ue.current=K,K==null))return;let h=Q.current;h&&q(h,!0)},[K,q]);let G=Te(()=>{if(typeof MediaStream>"u")return null;A.current||(A.current=new MediaStream);let h=C.current;return h&&h.srcObject!==A.current&&(h.srcObject=A.current),A.current},[]),ee=Te(h=>{let _=C.current;if(!_)return;let U=_.play();!U||typeof U.then!="function"||U.then(()=>{_.muted||z(!0)}).catch(B=>{if((B instanceof Error?B.name:String(B))==="NotAllowedError"&&!_.muted){xr(`play() blocked pending a user gesture (${h})`),z(!1);return}xr(`play() failed (${h})`,B)})},[z]),be=Te(()=>{let h=C.current;h&&(G(),!h.muted&&(ee("gesture"),Ve(),z(!0)))},[G,ee,z]),te=Te(h=>{let _=G();if(_){for(let U of _.getVideoTracks())U!==h&&_.removeTrack(U);if(h&&!_.getVideoTracks().includes(h)){_.addTrack(h);let U=C.current;U&&(U.srcObject=_)}h&&ee("track-attach"),w(h!==null),q(h),I.current?.(h)}},[G,ee,q]),fe=Te(h=>{let _=G();if(_){for(let U of _.getAudioTracks())U!==h&&_.removeTrack(U);h&&!_.getAudioTracks().includes(h)&&_.addTrack(h),h&&ee("audio-attach")}},[G,ee]),re=Te(h=>{C.current=h,h&&(a?(h.muted=!0,h.defaultMuted=!0,h.setAttribute("muted",""),H.current=null):(h.muted=!1,h.defaultMuted=!1,h.removeAttribute("muted")),h.setAttribute("playsinline",""),h.setAttribute("webkit-playsinline",""),G())},[G,a]);So(r,()=>({get element(){return C.current},get live(){return A.current?A.current.getVideoTracks().length>0:!1},get framed(){return V.current},unlock:be,get unlocked(){return H.current===!0}}),[be]);let Y=ho(n)!==void 0;$e(()=>{Y&&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.`)},[Y,n]);let J=i!==void 0;return $e(()=>{if(J){te(i??null);return}if(Y){te(null);return}if(!P)return;let h=Cr(P,wr(n,"video")),_=()=>{let N=A.current;return N?N.getVideoTracks()[0]??null:null},U=N=>{if(N!==_()&&(te(N),N)){let Se=()=>{_()===N&&te(null)};N.addEventListener("ended",Se)}},B=h.track;B&&B.readyState==="live"&&U(B);let oe=h.on("track",N=>{N&&N.readyState!=="live"||U(N)}),ge=setInterval(()=>{let N=h.track;N&&N.readyState==="live"&&U(N)},Er);return()=>{oe(),clearInterval(ge)}},[P,n,Y,J,i,te]),$e(()=>{if(J||!P||s===!1||Y)return;let h=Cr(P,wr(n,"audio",s)),_=()=>{let N=A.current;return N?N.getAudioTracks()[0]??null:null},U=N=>{if(N!==_()&&(fe(N),N)){let Se=()=>{_()===N&&fe(null)};N.addEventListener("ended",Se)}},B=h.track;B&&B.readyState==="live"&&U(B);let oe=h.on("track",N=>{N&&N.readyState!=="live"||U(N)}),ge=setInterval(()=>{let N=h.track;N&&N.readyState==="live"&&U(N)},Er);return()=>{oe(),clearInterval(ge)}},[P,n,Y,s,J,fe]),yo("div",{className:g,style:{position:"relative",width:"100%",height:"100%",...l},"data-urun-video":"","data-urun-video-live":p?"true":"false","data-urun-video-framed":E?"true":"false",children:[Ur("video",{ref:re,className:y,autoPlay:!0,muted:a,playsInline:!0,style:{width:"100%",height:"100%",objectFit:c,...u?{transform:"scaleX(-1)"}:{}}}),p?null:b,R===void 0?null:Ur("div",{"data-urun-video-poster":"","aria-hidden":E||void 0,style:{position:"absolute",inset:0,...E?{opacity:0,pointerEvents:"none"}:null},children:R}),f]})});import{jsx as Mr,jsxs as xo}from"react/jsx-runtime";var Po={position:"absolute",inset:0,width:"100%",height:"100%",pointerEvents:"none"},Eo=ko(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,y=ut(null),b=ut(null),R=ut(0),f=ut(g);f.current=g;let v=Ro(()=>To(f.current),[]);return bo(r,()=>({get video(){return y.current},get canvas(){return b.current},warp:v,get lastDrawTs(){return R.current}}),[v]),Ar(()=>{if(!i)return;let d=0,x=0,S=null,k=T=>{typeof T.requestVideoFrameCallback=="function"&&(S=T,x=T.requestVideoFrameCallback(function P(){v.frameArrived(),x=T.requestVideoFrameCallback(P)}))},m=T=>{d=requestAnimationFrame(m);let P=b.current,C=y.current?.element??null;if(!P||!C||(C!==S&&(S&&x&&S.cancelVideoFrameCallback?.(x),k(C)),C.readyState<2))return;v.tick(T);let A=typeof devicePixelRatio=="number"?devicePixelRatio:1,p=Math.max(1,Math.round(P.clientWidth*A)),w=Math.max(1,Math.round(P.clientHeight*A));(P.width!==p||P.height!==w)&&(P.width=p,P.height=w);let E=P.getContext("2d");if(!E)return;let L=v.transform(),V=C.videoWidth||p,H=C.videoHeight||w,M=Math.max(p/V,w/H)*(1+a)*L.scale;E.setTransform(M,0,0,M,p/2+L.translateX*p,w/2+L.translateY*w),E.drawImage(C,-V/2,-H/2),R.current=T};return d=requestAnimationFrame(m),()=>{cancelAnimationFrame(d),S&&x&&S.cancelVideoFrameCallback?.(x)}},[i,a,v]),Ar(()=>{if(!i||!u||!l)return;let d=()=>!!l.pointerLockElement,x=P=>{d()&&v.keyDown(P.key)},S=P=>v.keyUp(P.key),k=P=>{d()&&v.pointerDelta(P.movementX,P.movementY)},m=()=>{d()||v.clearKeys()},T=()=>v.clearKeys();return l.addEventListener("keydown",x),l.addEventListener("keyup",S),l.addEventListener("mousemove",k),l.addEventListener("pointerlockchange",m),l.defaultView?.addEventListener("blur",T),()=>{l.removeEventListener("keydown",x),l.removeEventListener("keyup",S),l.removeEventListener("mousemove",k),l.removeEventListener("pointerlockchange",m),l.defaultView?.removeEventListener("blur",T)}},[i,u,l,v]),i?xo(Fe,{ref:y,...s,videoClassName:s.videoClassName,style:{...s.style},children:[Mr("canvas",{ref:b,style:Po,"data-urun-warp":""}),n]}):Mr(Fe,{ref:y,...s,children:n})});var _r=new Map;function Co(e,t,r){if(!r||typeof r.safeParse!="function")throw new Error(`registerComponent("${e}"): schema must be a valid Zod schema`);_r.set(e,{component:t,schema:r})}function Nr(e,t){let r=_r.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 Uo,jsx as ct}from"react/jsx-runtime";function wo({name:e,props:t,fallback:r}){let o=Nr(e,t);if(o.error)return console.warn(`[urun] ComponentRenderer: ${o.error}`),r?ct(Uo,{children:r}):ct("div",{className:"urun-component-error",role:"alert",children:ct("span",{className:"urun-component-error-text",children:o.error})});let n=o.Component;return ct(n,{...o.validatedProps})}import{z as Xe}from"zod";import{jsx as Dt,jsxs as Lr}from"react/jsx-runtime";var Ao=Xe.object({step:Xe.number().min(0),total:Xe.number().min(1),label:Xe.string().optional(),variant:Xe.enum(["default","success","error"]).default("default")});function Ir(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 Mo(e){let{step:t,total:r,label:o,variant:n,percentage:s}=Ir(e);return Lr("div",{className:"urun-progress-card","data-variant":n,children:[o&&Dt("div",{className:"urun-progress-label",children:o}),Dt("div",{className:"urun-progress-bar",children:Dt("div",{className:"urun-progress-fill",style:{width:`${s}%`}})}),Lr("div",{className:"urun-progress-text",children:[t,"/",r]})]})}import{z as Vt}from"zod";import{jsx as Or,jsxs as Io}from"react/jsx-runtime";var _o=Vt.object({state:Vt.enum(["thinking","generating","idle","error"]),message:Vt.string().optional()}),No={thinking:"Thinking...",generating:"Generating...",idle:"Idle",error:"Error"};function Dr(e){let{state:t,message:r}=e,o=t==="thinking"||t==="generating",n=r??No[t]??t;return{state:t,message:n,isActive:o}}function Lo(e){let{state:t,message:r,isActive:o}=Dr(e);return Io("span",{className:"urun-status-badge","data-state":t,children:[Or("span",{className:`urun-status-indicator${o?" urun-status-pulse":""}`}),Or("span",{className:"urun-status-message",children:r})]})}import{useRef as Vr,useEffect as Oo}from"react";import{z as Ft}from"zod";import{jsx as Fr,jsxs as Fo}from"react/jsx-runtime";var Do=Ft.object({text:Ft.string(),streaming:Ft.boolean().default(!1)});function Hr(e){let{text:t,streaming:r=!1}=e,o=t.length===0;return{text:t,streaming:r,isEmpty:o}}function Vo(e){let{text:t,streaming:r}=Hr(e),o=Vr(null),n=Vr(0);return Oo(()=>{let s=o.current;s&&t.length!==n.current&&(s.textContent=t,n.current=t.length)},[t]),Fo("div",{className:"urun-text-stream",children:[Fr("span",{ref:o,className:"urun-text-content"}),r&&Fr("span",{className:"urun-text-cursor"})]})}import{z as lt}from"zod";import{jsx as qr,jsxs as Wo}from"react/jsx-runtime";var Ho=lt.object({src:lt.string().url(),alt:lt.string().optional(),caption:lt.string().optional()});function Wr(e){let{src:t,alt:r,caption:o}=e;return{src:t,alt:r??"",caption:o}}function qo(e){let{src:t,alt:r,caption:o}=Wr(e);return Wo("figure",{className:"urun-image-frame",children:[qr("img",{className:"urun-image",src:t,alt:r}),o&&qr("figcaption",{className:"urun-image-caption",children:o})]})}import{z as Pe}from"zod";import{jsx as Ht,jsxs as Ko}from"react/jsx-runtime";var Bo=Pe.object({metrics:Pe.array(Pe.object({label:Pe.string(),value:Pe.union([Pe.string(),Pe.number()]),unit:Pe.string().optional()}))});function Br(e){return{metrics:e.metrics.map(r=>({...r,displayValue:r.unit?`${r.value} ${r.unit}`:String(r.value)}))}}function jo(e){let{metrics:t}=Br(e);return Ht("div",{className:"urun-metrics-panel",children:t.map((r,o)=>Ko("div",{className:"urun-metric-card",children:[Ht("div",{className:"urun-metric-label",children:r.label}),Ht("div",{className:"urun-metric-value",children:r.displayValue})]},o))})}import{useCallback as dt,useEffect as qt,useRef as ae,useState as $o}from"react";import{jsx as es}from"react/jsx-runtime";function Ee(e){return e&&typeof e=="object"?e:null}function jr(e){if(typeof e=="string")return e;let t=Ee(e);return t&&t.t==="delta"&&typeof t.delta=="string"?t.delta:""}function Xo(e){if(typeof e=="string")return"delta";let t=Ee(e);return t?t.t==="delta"?"delta":t.t==="response"?"done":t.t==="error"?"error":"ignore":"ignore"}function zo(...e){for(let t of e)if(typeof t=="string"&&t)return t;return""}function Jo(e){let t=Ee(e),r=t?.body;return zo(r,Ee(Ee(r)?.error)?.message,Ee(r)?.error,Ee(r)?.message,Ee(t?.error)?.message,t?.error,t?.message)||"stream reported an error"}var ze=class extends Error{name="TextStreamError"},Go=4,Kr=3,$r=240;function Xr(){return{chars:0,tokens:0,tokensPerSecond:0,elapsedMs:0,done:!1}}function Yo(e){e.chars=0,e.tokens=0,e.tokensPerSecond=0,e.elapsedMs=0,e.done=!1}function zr(e){let{session:t,stream:r}=e,o=ae(e);qt(()=>{o.current=e});let n=ae(null),s=ae(()=>{}),i=ae(null),a=ae(""),u=ae(""),c=ae(null),g=ae(!1),l=ae(!1),y=ae(!1),b=ae(0),R=ae(Xr()),f=dt(S=>{if(n.current=S,!S){i.current=null;return}let k=i.current;if(k&&k.parentNode===S)return;let m=S.ownerDocument.createTextNode(u.current);S.appendChild(m),i.current=m,a.current.length>0&&s.current()},[]),v=dt(()=>{c.current=null;let S=i.current,k=a.current;if(k.length>0){let A=o.current,p=A.smoothCharsPerFrame??Kr,w=A.smoothThreshold??$r,E=A.smooth&&k.length<=w?k.slice(0,p):k;a.current=k.slice(E.length),u.current+=E,S?.appendData(E)}let m=R.current,T=u.current.length,P=b.current===0?0:Date.now()-b.current,C=Math.round(T/Go);if(m.chars=T,m.tokens=C,m.elapsedMs=P,m.tokensPerSecond=P>0?C*1e3/P:0,a.current.length>0){d(),o.current.onMeter?.(m);return}if(!g.current&&!y.current){y.current=!0,m.done=!0,o.current.onMeter?.(m),l.current||o.current.onDone?.(u.current);return}o.current.onMeter?.(m)},[]),d=dt(()=>{c.current===null&&(c.current=globalThis.requestAnimationFrame(()=>v()))},[v]);s.current=d,qt(()=>{if(!t)return;if(typeof globalThis.requestAnimationFrame!="function")throw new Error("[urun] Text requires requestAnimationFrame. Render it in a browser (or a DOM test environment).");a.current="",u.current="",l.current=!1,y.current=!1,b.current=0,g.current=!0,Yo(R.current),i.current&&(i.current.data="");let S=!1,k=null;return(async()=>{try{for(k=t.stream(r).messages()[Symbol.asyncIterator]();;){let T=await k.next();if(S)return;if(T.done)break;let P=T.value,C=Xo(P);if(C==="error")throw new ze(Jo(P));if(C==="done")break;if(C==="ignore")continue;let A=jr(P);A&&(b.current===0&&(b.current=Date.now()),a.current+=A,d())}if(S)return;k.return?.(void 0),g.current=!1,d()}catch(m){if(S)return;k?.return?.(void 0),l.current=!0,g.current=!1,o.current.onError?.(m instanceof Error?m:new ze(String(m))),d()}})(),()=>{S=!0,g.current=!1,k?.return?.(void 0),c.current!==null&&(globalThis.cancelAnimationFrame?.(c.current),c.current=null)}},[t,r,d]);let x=dt(()=>u.current,[]);return{ref:f,meterRef:R,getText:x}}function Zo(e,t=250){let[r,o]=$o(Xr);return qt(()=>{let n=setInterval(()=>{let s=e.current;o(i=>i.chars===s.chars&&i.done===s.done?i:{...s})},t);return()=>clearInterval(n)},[e,t]),r}function Qo(e){let{className:t,style:r,...o}=e,{ref:n}=zr(o);return es("span",{ref:n,className:t,style:r})}import{forwardRef as ts}from"react";import{jsx as ns}from"react/jsx-runtime";var rs=ts(function(t,r){let{stream:o="image",...n}=t;return ns(Fe,{ref:r,stream:o,...n})});import{forwardRef as os,useCallback as He,useEffect as Wt,useImperativeHandle as ss,useRef as qe}from"react";import{observePageLifecycle as is}from"@urun-sh/core";import{jsx as cs}from"react/jsx-runtime";var as=1e3,Jr=200;function Bt(...e){console.debug("[audio]",...e)}var pt=os(function(t,r){let{session:o,stream:n="audio",track:s,controls:i=!1,className:a,onTrack:u,onUnlockChange:c,onAudioElement:g}=t,l=pe(),y=o??l,b=qe(null),R=qe(null),f=qe(null),v=qe(null),d=qe(u);d.current=u;let x=qe(c);x.current=c;let S=He(p=>{f.current!==p&&(f.current=p,x.current?.(p))},[]),k=He(()=>{if(typeof MediaStream>"u")return null;R.current||(R.current=new MediaStream);let p=b.current;return p&&p.srcObject!==R.current&&(p.srcObject=R.current),R.current},[]),m=He(p=>{let w=b.current;if(!w)return;let E=w.play();!E||typeof E.then!="function"||E.then(()=>{w.muted||S(!0)}).catch(L=>{let V=L instanceof Error?L.name:String(L);if(V==="AbortError"){Bt(`play() aborted (${p}); retrying in ${Jr}ms`),v.current&&clearTimeout(v.current),v.current=setTimeout(()=>{v.current=null,m(`${p}:retry`)},Jr);return}if(V==="NotAllowedError"){Bt(`play() blocked pending a user gesture (${p})`),S(!1);return}Bt(`play() failed (${p})`,L)})},[S]),T=He(p=>{let w=k();if(w){for(let E of w.getAudioTracks())E!==p&&w.removeTrack(E);p&&!w.getAudioTracks().includes(p)&&w.addTrack(p),p&&m("track-attach"),d.current?.(p)}},[k,m]),P=He(()=>{let p=b.current;p&&(k(),p.muted=!1,m("gesture"),Ve(),S(!0))},[k,m,S]);ss(r,()=>({unlock:P,get unlocked(){return f.current===!0},get element(){return b.current}}),[P]);let C=He(p=>{b.current=p,p&&(p.setAttribute("playsinline",""),p.setAttribute("webkit-playsinline",""),k()),g?.(p)},[k,g]),A=s!==void 0;return Wt(()=>{if(A){T(s??null);return}if(!y)return;let p=y.stream(n),w=()=>{let I=R.current;return I?I.getAudioTracks()[0]??null:null},E=I=>{if(I!==w()&&(T(I),I)){let M=()=>{w()===I&&T(null)};I.addEventListener("ended",M)}},L=p.track;L&&L.readyState==="live"&&E(L);let V=p.on("track",I=>{I&&I.readyState!=="live"||E(I)}),H=setInterval(()=>{let I=p.track;I&&I.readyState==="live"&&E(I)},as);return()=>{V(),clearInterval(H)}},[y,n,A,s,T]),Wt(()=>is(()=>{Ve(),f.current===!0&&m("foreground")}),[m]),Wt(()=>()=>{v.current&&clearTimeout(v.current)},[]),cs("audio",{ref:C,className:a,autoPlay:!0,playsInline:!0,controls:i,"data-urun-audio":""})}),us=pt;import{forwardRef as ls,useCallback as We,useEffect as Gr,useImperativeHandle as ds,useRef as ke}from"react";import{observePageLifecycle as ps,sessionFailureFromMediaError as ms,sharedCaptureController as fs}from"@urun-sh/core";import{jsx as Ss}from"react/jsx-runtime";var Yr={channelCount:1,echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};function mt(...e){console.debug("[voice]",...e)}var ft=ls(function(t,r){let{session:o,stream:n="audio",playback:s=!0,constraints:i=Yr,connectTimeoutMs:a,attempts:u=3,retryDelayMs:c=1500,onActiveChange:g,onError:l,onMicStream:y,onTrack:b,onUnlockChange:R,capture:f}=t,v=pe(),d=o??v,x=ke(null),S=ke(null),k=ke(null),m=ke([]),T=ke(!1),P=ke(g);P.current=g;let C=ke(l);C.current=l;let A=ke(y);A.current=y;let p=We(M=>{T.current!==M&&(T.current=M,P.current?.(M))},[]),w=We(()=>{for(let M of m.current)M();m.current=[],k.current?.release(),k.current=null,S.current&&(S.current=null,A.current?.(null))},[]),E=We(async()=>{let M=k.current;if(M){let W=await M.update(i);return S.current=M.stream,A.current?.(M.stream),W}let j=await(f??fs()).claim("audio",i);k.current=j,m.current=[j.onTrack((W,z)=>{S.current=z,A.current?.(z),T.current&&d?.stream(n).attach(W).catch(Q=>mt("mic re-attach after one-capture re-acquire failed",Q))}),j.onLost(W=>{k.current=null,m.current=[],S.current=null,A.current?.(null),p(!1),C.current?.(W)})],S.current=j.stream,A.current?.(j.stream);let $=j.track;if(!$)throw Object.assign(new Error("no microphone audio track"),{name:"NotFoundError"});return $},[f,i,d,n,p]),L=We(async()=>{w(),p(!1),await d?.stream(n).detach().catch(()=>{})},[d,n,w,p]),V=We(async()=>{if(!d)throw new Error("<Voice> needs a session: pass the `session` prop or mount inside <Session>");x.current?.unlock();let M;try{M=await E()}catch($){w();let W=ms($,d.status);throw C.current?.(W),W}d.connect?.();let F;for(let $=1;$<=u;$++)try{await d.whenLive(a!==void 0?{timeout:a}:void 0),await d.stream(n).attach(M),p(!0);return}catch(W){F=W,mt(`start attempt ${$}/${u} failed`,W),$<u&&await new Promise(z=>setTimeout(z,c))}w(),p(!1);let j=F instanceof Error?F:new Error(String(F??"voice start failed"));throw C.current?.(j),j},[d,n,a,u,c,E,w,p]);ds(r,()=>({start:V,stop:L,unlock:()=>x.current?.unlock(),get active(){return T.current},get micStream(){return S.current},get audio(){return x.current}}),[V,L]);let H=ke(!1),I=We(async()=>{if(!d||!T.current||H.current)return;let M=S.current?.getAudioTracks()[0]??null;if(M&&M.readyState==="live"){try{await d.stream(n).attach(M)}catch(F){mt("foreground mic re-assert failed (will retry on next pass)",F)}return}H.current=!0;try{let F=await E();await d.stream(n).attach(F)}catch(F){let j=F instanceof Error?F:new Error(String(F));mt("foreground mic re-acquire failed",j),C.current?.(j)}finally{H.current=!1}},[d,n,E]);return Gr(()=>{let M=()=>{I()};return d&&typeof d.onRecovery=="function"?d.onRecovery(M):ps(M)},[d,I]),Gr(()=>w,[w]),s?Ss(pt,{ref:x,session:d,stream:n,onTrack:b,onUnlockChange:R}):null}),gs=ft;import{forwardRef as ys,useEffect as ks,useImperativeHandle as bs,useRef as Zr,useState as Rs}from"react";import{useEffect as hs,useState as vs}from"react";var jt={level:0,speaking:!1};function Kt(e,t={}){let{fftSize:r=512,intervalMs:o=100,speakingThreshold:n=.02}=t,[s,i]=vs(jt);return hs(()=>{if(!e){i(jt);return}let a=at();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),b=setInterval(()=>{g.getByteTimeDomainData(l);let R=0;for(let v=0;v<l.length;v++){let d=(l[v]-128)/128;R+=d*d}let f=Math.sqrt(R/l.length);i(v=>{let d=f>n;return Math.abs(v.level-f)<.005&&v.speaking===d?v:{level:f,speaking:d}})},o);return()=>{clearInterval(b),c.disconnect(),i(jt)}},[e,r,o,n]),s}import{Fragment as xs,jsx as gt,jsxs as Cs}from"react/jsx-runtime";var Ts={display:"inline-flex",alignItems:"center",gap:6,minWidth:48,height:12},Ps={flex:1,height:4,borderRadius:9999,background:"rgba(128,128,128,0.35)",overflow:"hidden"},Es=ys(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:y}=t,b=pe(),R=o??b,f=Zr(null),[v,d]=Rs(null),x=Zr(l);x.current=l;let{level:S,speaking:k}=Kt(a?v:null);return bs(r,()=>({start:()=>{let m=f.current;return m?m.start():Promise.reject(new Error("<Mic> is not mounted"))},stop:()=>f.current?.stop()??Promise.resolve(),get active(){return f.current?.active??!1},get micStream(){return f.current?.micStream??null}}),[]),ks(()=>{!i||!R||f.current?.start().catch(()=>{})},[i,R]),Cs(xs,{children:[gt(ft,{ref:f,session:R,stream:n,playback:!1,...s!==void 0?{constraints:s}:{},...y!==void 0?{capture:y}:{},onActiveChange:c,onError:g,onMicStream:m=>{d(m),x.current?.(m)}}),a?gt("span",{className:u,style:Ts,"data-urun-mic":"","data-urun-mic-active":v?"true":"false","data-urun-mic-speaking":k?"true":"false",role:"meter","aria-label":"Microphone level","aria-valuemin":0,"aria-valuemax":1,"aria-valuenow":Math.round(S*100)/100,children:gt("span",{style:Ps,children:gt("span",{"data-urun-mic-level":"",style:{display:"block",height:"100%",width:`${Math.min(100,Math.round(S*300))}%`,borderRadius:9999,background:"currentColor",transition:"width 100ms linear"}})})}):null]})});import{captureStillFromVideo as ws,sessionFailureFromMediaError as Us,sharedCaptureController as As}from"@urun-sh/core";import{forwardRef as en,useCallback as me,useEffect as $t,useImperativeHandle as Ms,useRef as Z,useState as Je}from"react";import{jsx as xe,jsxs as Qr}from"react/jsx-runtime";var tn={width:{ideal:960},height:{ideal:720},frameRate:{ideal:8}};function Xt(...e){console.debug("[camera]",...e)}function _s(){if(typeof window>"u"||typeof window.matchMedia!="function")return!1;try{return window.matchMedia("(pointer: coarse)").matches}catch{return!1}}async function Ns(){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 rn=en(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:y=!1,className:b,videoClassName:R,onActiveChange:f,onError:v,onStream:d,onTrack:x,children:S,capture:k,flipControl:m="auto",flipControlClassName:T,onDevices:P}=t;if(i&&a)throw new Error("<Camera> takes `front` OR `back`, not both");let C=i?"user":a?"environment":u??"environment",A=pe(),p=o??A,w=Z(null),E=Z(null),L=Z(null),V=Z([]),H=Z(null),I=Z(!1),M=Z(!1),F=Z(C),[j,$]=Je(C),[W,z]=Je(!1),[Q,X]=Je(null),[q,K]=Je(!1),[ue]=Je(_s),G=Z(f);G.current=f;let ee=Z(v);ee.current=v;let be=Z(d);be.current=d;let te=Z(x);te.current=x;let fe=Z(P);fe.current=P;let re=me(O=>{I.current!==O&&(I.current=O,z(O),G.current?.(O))},[]);$t(()=>{if(!W){X(null);return}let O=!1,D=()=>{Ns().then(ie=>{O||(X(ie),ie&&fe.current?.(ie))})};D();let se=typeof navigator<"u"?navigator.mediaDevices:void 0;return typeof se?.addEventListener=="function"?(se.addEventListener("devicechange",D),()=>{O=!0,se.removeEventListener?.("devicechange",D)}):()=>{O=!0}},[W]);let Y=me(O=>{let D=w.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?.(se=>Xt("preview play() failed",se)))},[]),J=me(()=>{M.current=!1,H.current?.(),H.current=null;for(let O of V.current)O();V.current=[],L.current?.release(),L.current=null,E.current&&(E.current=null,be.current?.(null),te.current?.(null)),Y(null)},[Y]),h=me((O,D)=>{H.current?.(),E.current=D,Y(D),be.current?.(D);let se=()=>{E.current===D&&(Xt("camera track ended (device removed or permission revoked)"),J(),re(!1))};O.addEventListener("ended",se),H.current=()=>O.removeEventListener("ended",se)},[Y,J,re]),_=me(async O=>{let D=n!==!1;if(D&&!p)throw new Error("<Camera> needs a session: pass the `session` prop or mount inside <Session>");let se={...tn,...s,facingMode:O},ie;try{let ce=L.current;if(ce)ie=await ce.update(se);else{let Be=await(k??As()).claim("video",se);if(L.current=Be,V.current=[Be.onTrack((je,vn)=>{h(je,vn),I.current&&(!D||!p||p.stream(n).attachVideo(je).then(()=>te.current?.(je)).catch(yn=>Xt("camera re-publish after one-capture re-acquire failed",yn)))}),Be.onLost(je=>{L.current=null,V.current=[],J(),re(!1),ee.current?.(je)})],!Be.track)throw Object.assign(new Error("no camera video track"),{name:"NotFoundError"});ie=Be.track}}catch(ce){let Ne=Us(ce,p?.status);throw ee.current?.(Ne),Ne}F.current=O,$(O),h(ie,L.current?.stream??new MediaStream([ie]));try{D&&p&&(p.connect?.(),await p.whenLive(l!==void 0?{timeout:l}:void 0),await p.stream(n).attachVideo(ie)),M.current=D?n:!1}catch(ce){J(),re(!1);let Ne=ce instanceof Error?ce:new Error(String(ce));throw ee.current?.(Ne),Ne}te.current?.(ie),re(!0)},[p,n,s,l,k,h,J,re]),U=me(O=>_(O?.facingMode??F.current),[_]),B=me(async O=>{let D=M.current===n;I.current&&F.current===O&&D||await _(O)},[_,n]),oe=me(()=>_(F.current==="environment"?"user":"environment"),[_]),ge=me(async()=>{J(),re(!1),n!==!1&&await p?.stream(n).detachVideo().catch(()=>{})},[p,n,J,re]),N=me(async O=>{let D=w.current;if(!D)throw new Error("<Camera> needs `visible` to capture a photo (no preview to read a frame from)");return await ws(D,O)},[]);Ms(r,()=>({start:U,stop:ge,flip:oe,setFacingMode:B,capturePhoto:N,get active(){return I.current},get facingMode(){return F.current},get stream(){return E.current},get element(){return w.current}}),[U,ge,oe,B,N]);let Se=Z(B);if(Se.current=B,$t(()=>{c&&(n!==!1&&!p||Se.current(C).catch(()=>{}))},[c,p,C,n]),$t(()=>J,[J]),!y)return null;let _e=g==="auto"?j==="user":g,he=W&&(m===!0||m==="auto"&&ue&&(Q?.length??0)>1),ve=()=>{q||(K(!0),oe().catch(()=>{}).finally(()=>K(!1)))};return Qr("div",{className:b,style:{position:"relative",width:"100%",height:"100%"},"data-urun-camera":"","data-urun-camera-facing":j,children:[xe("video",{ref:w,className:R,autoPlay:!0,muted:!0,playsInline:!0,style:{width:"100%",height:"100%",objectFit:"contain",..._e?{transform:"scaleX(-1)"}:{}}}),he?xe("button",{type:"button","data-urun-camera-flip":"","aria-label":"Switch camera",title:"Switch camera",onClick:ve,disabled:q,className:T,style:T?{opacity:q?.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:q?.6:1},children:Qr("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:[xe("path",{d:"M4 8h3l2-2h6l2 2h3v11H4z"}),xe("path",{d:"M9.5 13.5a2.8 2.8 0 0 1 5-1.4"}),xe("path",{d:"M14.5 10.5v1.6h-1.6"}),xe("path",{d:"M14.5 14.5a2.8 2.8 0 0 1-5 1.4"}),xe("path",{d:"M9.5 17.5v-1.6h1.6"})]})}):null,S]})}),Ls=en(function({preview:t=!0,...r},o){return xe(rn,{ref:o,...r,visible:t,autoStart:!1})});import{cameraCaptureAvailable as Is,normalizeReferenceImage as Os,referenceImageErrorMessage as Ds}from"@urun-sh/core";import{useCallback as Ge,useEffect as Vs,useRef as zt,useState as Ye}from"react";function Fs(e){let{maxSize:t,type:r,quality:o,onChange:n}=e??{},[s,i]=Ye(null),[a,u]=Ye(null),[c,g]=Ye(!1),[l,y]=Ye(null),[b]=Ye(Is),R=zt(n);R.current=n;let f=zt(null),v=zt(0),d=Ge(T=>{f.current&&URL.revokeObjectURL(f.current),f.current=T?URL.createObjectURL(new Blob([T.bytes],{type:T.type})):null,u(f.current),i(T),R.current?.(T)},[]);Vs(()=>()=>{v.current++,f.current&&URL.revokeObjectURL(f.current),f.current=null},[]);let x=Ge(async T=>{let P=++v.current;g(!0),y(null);try{let C=await T();if(v.current!==P)return;d(C)}catch(C){if(v.current!==P)return;y(Ds(C))}finally{v.current===P&&g(!1)}},[d]),S=Ge(T=>x(()=>Os(T,{maxSize:t,type:r,quality:o,source:"file"})),[x,t,r,o]),k=Ge(T=>x(()=>T.capturePhoto({maxSize:t,type:r,quality:o})),[x,t,r,o]),m=Ge(()=>{v.current++,y(null),g(!1),d(null)},[d]);return{reference:s,previewUrl:a,pick:S,capture:k,clear:m,busy:c,error:l,cameraAvailable:b}}import{useEffect as Hs,useState as qs}from"react";function Ws(e,t){let[r,o]=qs(null);return Hs(()=>{if(!e||!t){o(null);return}let n=e.stream(t);return o(n.track),n.on("track",o)},[e,t]),r}import{useCallback as zs}from"react";import{useEffect as $s,useMemo as Xs}from"react";import{createStore as Bs}from"zustand/vanilla";import{useStore as js}from"zustand";var Ks=()=>{};function Jt(e,t={}){let r=c=>{e?.set(c)},o=()=>e?e.get()??{}:{},n=Bs(()=>({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):Ks,u=(c=>js(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 Ze(e,t){let r=Xs(()=>Jt(e&&t?e.doc(t):null,{bind:!1}),[e,t]);return $s(()=>r.bind(),[r]),r}function Js(e,t,r){let n=Ze(e,t)(r??(a=>a)),s=zs(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 Gs,useState as Ys}from"react";var Ue=200;function Ce(e,t,r=200){let o=[...e,t];return o.length>r?o.slice(o.length-r):o}function Qe(e){if(typeof e=="string")return e;try{return JSON.stringify(e)}catch{return String(e)}}function Gt(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 Yt(e,t,r={}){let o=r.cap??200,[n,s]=Ys([]);return Gs(()=>{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=>Ce(c,{at:Date.now(),payload:u.value},o))}})(),()=>{i=!1,a.return?.()}},[e,t,o]),n}import{jsx as St,jsxs as et}from"react/jsx-runtime";function Zs({session:e,name:t,cap:r,className:o}){let n=Yt(e,t,{cap:r});return et("div",{className:["urun-stream-tail",o].filter(Boolean).join(" "),children:[et("div",{className:"urun-stream-tail-meta",children:[St("code",{children:t}),et("span",{className:"urun-stream-tail-count",children:[n.length," messages"]})]}),St("div",{className:"urun-stream-tail-log",children:n.length===0?et("span",{className:"urun-stream-tail-empty",children:["Waiting for ",St("code",{children:t})," messages\u2026"]}):n.map((s,i)=>et("div",{className:"urun-stream-tail-line",children:[St("span",{className:"urun-stream-tail-time",children:new Date(s.at).toLocaleTimeString()})," ",Qe(s.payload)]},`${s.at}-${i}`))})]})}import{useCallback as Qs,useState as nn}from"react";import{jsx as Ae,jsxs as ht}from"react/jsx-runtime";function vt({placeholder:e,buttonLabel:t,disabled:r,onApply:o}){let[n,s]=nn(""),[i,a]=nn(null),u=Qs(()=>{let c=Gt(n);if(!c.ok){a(c.error);return}a(null),o(c.value,n.trim()),s("")},[n,o]);return ht("div",{className:"urun-doc-patch",children:[Ae("textarea",{className:"urun-doc-patch-input",value:n,onChange:c=>s(c.target.value),placeholder:e,rows:3}),ht("div",{className:"urun-doc-patch-actions",children:[Ae("button",{type:"button",className:"urun-doc-patch-button",disabled:r||!n.trim(),onClick:u,children:t}),i?Ae("span",{className:"urun-doc-patch-error",role:"alert",children:i}):null]})]})}function ei({session:e,docKey:t,editable:r=!0,patchPlaceholder:o='{"desired": {"prompt": {"text": "a sunset"}}}',className:n}){let s=Ze(e,t),i=s(c=>c.doc),a=s(c=>c.synced),u=s(c=>c.set);return ht("div",{className:["urun-doc-panel",n].filter(Boolean).join(" "),children:[ht("div",{className:"urun-doc-panel-meta",children:[Ae("code",{children:t}),Ae("span",{className:"urun-doc-panel-synced","data-synced":a?"true":"false",children:a?"synced":"syncing\u2026"})]}),Ae("pre",{className:"urun-doc-panel-snapshot",children:JSON.stringify(i??{},null,2)}),r?Ae(vt,{placeholder:o,buttonLabel:"Apply patch",disabled:!e,onApply:c=>u(c)}):null]})}import{useEffect as ti,useState as ri}from"react";import{jsx as tt,jsxs as sn}from"react/jsx-runtime";function on(e,t=600){return e.length>t?`${e.slice(0,t)}\u2026`:e}function ni({session:e,docKey:t="control",cap:r=200,className:o}){let[n,s]=ri([]);return ti(()=>(s([]),e?e.doc(t).on("change",a=>{s(u=>Ce(u,{at:Date.now(),direction:"in",text:on(Qe(a))},r))}):void 0),[e,t,r]),sn("div",{className:["urun-control-sender",o].filter(Boolean).join(" "),children:[tt(vt,{placeholder:'{"desired": {"settings": {"values": {}}}}',buttonLabel:`Send to ${t}`,disabled:!e,onApply:(i,a)=>{e?.doc(t).set(i),s(u=>Ce(u,{at:Date.now(),direction:"out",text:on(a)},r))}}),tt("div",{className:"urun-control-sender-log",children:n.length===0?tt("span",{className:"urun-control-sender-empty",children:"Nothing yet."}):[...n].reverse().map((i,a)=>sn("div",{className:"urun-control-sender-line","data-direction":i.direction,children:[tt("span",{className:"urun-control-sender-dir",children:i.direction==="out"?"sent":"change"})," ",tt("span",{className:"urun-control-sender-time",children:new Date(i.at).toLocaleTimeString()})," ",i.text]},`${i.at}-${a}`))})]})}import{useEffect as oi,useState as si}from"react";import{jsx as yt,jsxs as ai}from"react/jsx-runtime";function ii({session:e,trackNames:t=["video","audio"],docKeys:r=["control"],cap:o=200,className:n}){let[s,i]=si([]),a=t.join(","),u=r.join(",");return oi(()=>{if(i([]),!e)return;let c=(l,y)=>i(b=>Ce(b,{at:Date.now(),kind:l,text:y},o)),g=[];g.push(e.onPhase(l=>c("phase",`phase \u2192 ${l.name}`)));for(let l of t){let y=e.stream(l);g.push(y.on("track",b=>c("track",`${l}: ${b?"track arrived":"track ended"}`)))}for(let l of r){let y=e.doc(l);g.push(y.on("change",()=>c("doc",`${l} changed`)))}return()=>g.forEach(l=>l())},[e,a,u,o]),yt("div",{className:["urun-event-spine",n].filter(Boolean).join(" "),children:s.length===0?yt("span",{className:"urun-event-spine-empty",children:"No activity yet \u2014 the spine fills as the session moves through its lifecycle."}):[...s].reverse().map((c,g)=>ai("div",{className:"urun-event-spine-line","data-kind":c.kind,children:[yt("span",{className:"urun-event-spine-kind",children:c.kind})," ",yt("span",{className:"urun-event-spine-time",children:new Date(c.at).toLocaleTimeString()})," ",c.text]},`${c.at}-${g}`))})}import{describeSessionPhase as Ri,isWakingPhase as Ti}from"@urun-sh/core";import{useEffect as ui,useState as ci}from"react";function le(e){let[t,r]=ci(e?.phase??null);return ui(()=>{if(!e){r(null);return}return e.onPhase(r)},[e]),t}import{describeSessionPhase as fi}from"@urun-sh/core";import{useEffect as li,useRef as di,useState as pi}from"react";import{isWakingPhase as mi}from"@urun-sh/core";function Zt(e){let t=le(e),r=mi(t?.name),o=di(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]=pi(s);return li(()=>{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 gi,jsx as an,jsxs as un}from"react/jsx-runtime";function Qt({session:e,render:t,className:r}){let o=Zt(e);return!o.waking||!o.phase?null:an("span",{className:["urun-session-waking",r].filter(Boolean).join(" "),"data-phase":o.phase.name,"data-runtime-state":o.state,children:t?t(o):un(gi,{children:[an("span",{className:"urun-session-waking-label",children:fi(o.phase)})," ",un("span",{className:"urun-session-waking-elapsed",children:["(",o.seconds,"s)"]})]})})}import{useEffect as vi,useState as yi}from"react";import{useEffect as cn,useRef as Si,useState as ln}from"react";var hi={event:null,elapsedMs:0};function er(e,t){let[r,o]=ln(null),n=Si(0);cn(()=>{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]=ln(0);return cn(()=>{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}:hi}import{jsx as dn,jsxs as pn}from"react/jsx-runtime";var ki={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 bi(e){let[t,r]=yi(!1);return vi(()=>{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 tr({session:e,stream:t,videoElement:r,render:o,className:n}){let s=er(e,t),i=bi(r),a=s.event;if(!a||a.state==="first-media"||i)return null;let u=a.state;return dn("div",{className:["urun-activation-overlay",n].filter(Boolean).join(" "),"data-state":u,role:"status","aria-live":"polite",children:o?o(s):pn("div",{className:"urun-activation-overlay-card",children:[dn("span",{className:"urun-activation-overlay-copy",children:a.hint??ki[u]})," ",pn("span",{className:"urun-activation-overlay-elapsed",children:["(",Math.floor(s.elapsedMs/1e3),"s)"]})]})})}import{jsx as Me,jsxs as rr}from"react/jsx-runtime";var Pi={idle:"idle",queued:"queued",unavailable:"starting",provisioning:"provisioning",waiting_for_capacity:"waiting for GPU capacity",connecting:"connecting",live:"live",error:"error",ended:"ended",expired:"expired",unknown:"unrecognized state"};function Ei({session:e,className:t}){let r=le(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?.reason?r.reason:r?.runtime&&r.runtime.state!=="unavailable"?r.runtime.reason??null:null;return rr("span",{className:["urun-session-status",t].filter(Boolean).join(" "),"data-phase":o,children:[Me("span",{className:"urun-session-status-dot","data-phase":o}),Me("span",{className:"urun-session-status-label",children:Pi[o]}),n?Me("span",{className:"urun-session-status-detail",children:n}):null]})}function xi({session:e,children:t,fallback:r,onStartOver:o,className:n}){let s=le(e);if(s?.name==="live")return rr("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[t,Me(tr,{session:e})]});let i=r?r(s):Me("span",{className:"urun-session-gate-fallback",children:s?.name==="error"?`Session ${s.error?.reason??"failed"}.`:s?.name==="ended"?"Session ended.":s&&Ti(s.name)?Me(Qt,{session:e}):s&&s.name!=="idle"?Ri(s):"Waiting for a live session\u2026"}),a=o!==void 0&&(s?.name==="error"||s?.name==="ended"||s?.name==="expired");return rr("div",{className:["urun-session-gate",n].filter(Boolean).join(" "),children:[i,a?Me("button",{type:"button",className:"urun-session-gate-start-over",onClick:o,children:"Start over"}):null]})}import{useEffect as Ci,useState as wi}from"react";import{jsx as Mi}from"react/jsx-runtime";function mn(e){return le(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 Ai({session:e,urgentMs:t=6e4,className:r}){let n=mn(e)?.getTime()??null,[s,i]=wi(()=>n===null?null:Math.max(0,n-Date.now()));if(Ci(()=>{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 Mi("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 fn,jsxs as Li}from"react/jsx-runtime";var _i=new Set(["expired","ended","error"]);function Ni({session:e,onNewSession:t,children:r,className:o}){let n=le(e);if(!n||!_i.has(n.name))return null;let s=r?r(n):fn("span",{className:"urun-session-ended-copy",children:n.name==="expired"?"Session ended \u2014 start a new session":n.name==="error"?`Session failed${n.error?.reason?` \u2014 ${n.error.reason}`:""}.`:"Session ended."});return Li("div",{className:["urun-session-ended",o].filter(Boolean).join(" "),"data-phase":n.name,children:[s,t?fn("button",{type:"button",className:"urun-session-ended-new",onClick:t,children:"New session"}):null]})}import{useEffect as gn,useMemo as Ii,useState as Sn}from"react";import{jsx as kt,jsxs as Vi}from"react/jsx-runtime";function nr(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 hn(e){let t=Ii(()=>e?e.doc("control"):null,[e]),[r,o]=Sn(()=>t?nr(t.get("idle")):null);return gn(()=>{if(!t){o(null);return}return o(nr(t.get("idle"))),t.on("change",()=>o(nr(t.get("idle"))))},[t]),r}function Oi(e){let t=Math.max(0,Math.floor(e));return`${Math.floor(t/60)}:${String(t%60).padStart(2,"0")}`}function Di({session:e,onStillHere:t,className:r}){let o=hn(e),n=o?.deadlineEpochS??null,[s,i]=Sn(null);if(gn(()=>{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 kt("div",{className:["urun-idle-warning",r].filter(Boolean).join(" "),role:"alertdialog","aria-live":"assertive","aria-label":"Inactivity warning","data-urgent":s!==null&&s<30?"":void 0,children:Vi("div",{className:"urun-idle-warning-card",children:[kt("span",{className:"urun-idle-warning-title",children:"Are you still there?"}),kt("span",{className:"urun-idle-warning-copy",children:s!==null?`This session will end in ${Oi(s)} due to inactivity.`:"This session will end soon due to inactivity."}),kt("button",{type:"button",className:"urun-idle-warning-confirm",onClick:a,children:"I'm still here"})]})})}import{useContext as Fi,useEffect as Hi,useState as qi}from"react";import{prewake as Wi}from"@urun-sh/core";function Bi(e){let t=Fi(Le),[r,o]=qi(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 Hi(()=>{if(!a||!u||!n||!s)return;let y=!1,b=()=>{Wi({baseUrl:a,app:n,functionName:s,orgId:u,jwt:c,getAccessToken:g,authProvider:l}).then(f=>{y||o(f)}).catch(()=>{})};b();let R=setInterval(b,Math.max(1,i)*1e3);return()=>{y=!0,clearInterval(R)}},[n,s,i,a,u,c,g,l]),r}import{useEffect as ji,useState as Ki}from"react";function $i(e){let[t,r]=Ki(null);return ji(()=>{if(r(null),!!e?.onStats)return e.onStats(r)},[e]),t}import{describeSessionPhase as dd,isWakingPhase as pd}from"@urun-sh/core";export{pt as Audio,rn as Camera,wo as ComponentRenderer,tn as DEFAULT_CAMERA_CONSTRAINTS,Ue as DEFAULT_LOG_CAP,Kr as DEFAULT_SMOOTH_CHARS_PER_FRAME,$r as DEFAULT_SMOOTH_THRESHOLD,Yr as DEFAULT_VOICE_CONSTRAINTS,vt as DocPatchForm,rs as Image,qo as ImageFrame,Ho as ImageFrameSchema,jo as MetricsPanel,Bo as MetricsPanelSchema,Es as Mic,wn as OPERATOR_CHORD_LABEL,Cn as OPERATOR_TOKEN_STORAGE_KEY,Mo as ProgressCard,Ao as ProgressCardSchema,Eo as ReprojectedVideo,po as Session,Lo as StatusBadge,_o as StatusBadgeSchema,Qo as Text,Vo as TextStream,ze as TextStreamError,Do as TextStreamSchema,tr as UrunActivationOverlay,us as UrunAudio,bt as UrunAuthProvider,Ls as UrunCamera,ni as UrunControlSender,ei as UrunDocPanel,Ke as UrunErrorBoundary,ii as UrunEventSpine,Di as UrunIdleWarning,kn as UrunJwtProvider,Dn as UrunProvider,Ai as UrunSessionClock,Ni as UrunSessionEnded,xi as UrunSessionGate,Ei as UrunSessionStatus,Qt as UrunSessionWaking,Zs as UrunStreamTail,gs as UrunVoice,Fe as Video,ft as Voice,rt as authMode,Jt as createDocStore,dd as describeSessionPhase,Qe as formatPayload,at as getUrunAudioContext,pd as isWakingPhase,Gt as parseJsonObject,Ce as pushCapped,ur as readOperatorToken,Co as registerComponent,Ve as resumeUrunAudioContext,jr as textDelta,de as urunPublicEnv,er as useActivation,Kn as useApp,no as useChat,Qn as useCompletion,Pt as useConfirmOnLeave,Ze as useDocStore,Wr as useImageFrame,uo as useInputPresence,Br as useMetricsPanel,Tt as useOperatorOverride,Ir as useProgressCard,Fs as useReferenceImage,Jn as useRequest,mo as useSession,Js as useSessionDoc,mn as useSessionEndsAt,hn as useSessionIdle,le as useSessionPhase,$i as useSessionStats,Ws as useSessionTrack,Zt as useSessionWake,Dr as useStatusBadge,Yt as useStreamMessages,zr as useText,Zo as useTextMeter,Hr as useTextStream,Kt as useUrunAudioLevel,Rt as useUrunAuth,Bi as useUrunPrewake,Pn as usesWorkOSAuth};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@urun-sh/react",
3
- "version": "0.2.60",
3
+ "version": "0.3.0",
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.60",
56
+ "@urun-sh/core": "^0.3.0",
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",